2026-03-13 17:33:39 +00:00
|
|
|
package event
|
|
|
|
|
|
|
|
|
|
import (
|
2026-03-19 16:55:49 +00:00
|
|
|
"encoding/json"
|
2026-03-13 17:33:39 +00:00
|
|
|
"time"
|
2026-03-13 18:21:20 +00:00
|
|
|
|
|
|
|
|
"github.com/Gleipnir-Technology/nidus-sync/config"
|
2026-03-13 17:33:39 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var chanEvents chan<- Envelope
|
|
|
|
|
|
|
|
|
|
type Event struct {
|
|
|
|
|
Resource string `json:"resource"`
|
|
|
|
|
Time time.Time `json:"time"`
|
|
|
|
|
Type EventType `json:"type"`
|
|
|
|
|
URI string `json:"uri"`
|
|
|
|
|
}
|
2026-03-19 16:55:49 +00:00
|
|
|
|
|
|
|
|
func (e Event) MarshalJSON() ([]byte, error) {
|
|
|
|
|
to_marshal := make(map[string]any, 0)
|
|
|
|
|
to_marshal["resource"] = e.Resource
|
|
|
|
|
to_marshal["time"] = e.Time
|
|
|
|
|
to_marshal["type"] = e.Type.String()
|
|
|
|
|
to_marshal["uri"] = e.URI
|
|
|
|
|
return json.Marshal(to_marshal)
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-13 17:33:39 +00:00
|
|
|
type Envelope struct {
|
|
|
|
|
Event Event
|
2026-04-02 21:31:31 +00:00
|
|
|
OrganizationID int32
|
|
|
|
|
UserID int32
|
2026-03-13 17:33:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func SetEventChannel(chan_events chan<- Envelope) {
|
|
|
|
|
chanEvents = chan_events
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type EventType int
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
EventTypeCreated EventType = iota
|
|
|
|
|
EventTypeDeleted
|
|
|
|
|
EventTypeHeartbeat
|
2026-04-20 22:33:20 +00:00
|
|
|
EventTypeShutdown
|
2026-03-13 17:33:39 +00:00
|
|
|
EventTypeSudo
|
2026-03-13 18:31:43 +00:00
|
|
|
EventTypeUnknown
|
2026-03-13 18:21:20 +00:00
|
|
|
EventTypeUpdated
|
2026-03-13 17:33:39 +00:00
|
|
|
)
|
|
|
|
|
|
2026-03-13 18:21:20 +00:00
|
|
|
func (et EventType) String() string {
|
|
|
|
|
switch et {
|
|
|
|
|
case EventTypeCreated:
|
|
|
|
|
return "created"
|
|
|
|
|
case EventTypeDeleted:
|
|
|
|
|
return "deleted"
|
|
|
|
|
case EventTypeHeartbeat:
|
|
|
|
|
return "heartbeat"
|
2026-04-20 22:33:20 +00:00
|
|
|
case EventTypeShutdown:
|
|
|
|
|
return "shutdown"
|
2026-03-13 18:21:20 +00:00
|
|
|
case EventTypeSudo:
|
|
|
|
|
return "sudo"
|
2026-03-13 18:31:43 +00:00
|
|
|
case EventTypeUnknown:
|
|
|
|
|
return "unknown"
|
2026-03-13 18:21:20 +00:00
|
|
|
case EventTypeUpdated:
|
|
|
|
|
return "updated"
|
|
|
|
|
}
|
|
|
|
|
return "unknown"
|
|
|
|
|
}
|
2026-03-13 18:31:43 +00:00
|
|
|
func EventTypeFromString(s string) EventType {
|
|
|
|
|
switch s {
|
|
|
|
|
case "created":
|
|
|
|
|
return EventTypeCreated
|
|
|
|
|
case "deleted":
|
|
|
|
|
return EventTypeDeleted
|
|
|
|
|
case "heartbeat":
|
|
|
|
|
return EventTypeHeartbeat
|
2026-04-20 22:33:20 +00:00
|
|
|
case "shutdown":
|
|
|
|
|
return EventTypeShutdown
|
2026-03-13 18:31:43 +00:00
|
|
|
case "sudo":
|
|
|
|
|
return EventTypeSudo
|
|
|
|
|
case "updated":
|
|
|
|
|
return EventTypeUpdated
|
|
|
|
|
default:
|
|
|
|
|
return EventTypeUnknown
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-03-13 18:21:20 +00:00
|
|
|
|
2026-03-13 17:33:39 +00:00
|
|
|
type ResourceType int
|
|
|
|
|
|
|
|
|
|
const (
|
2026-03-14 18:14:30 +00:00
|
|
|
TypeUnknown = iota
|
2026-03-19 15:31:04 +00:00
|
|
|
TypeFileCSV
|
2026-03-19 21:25:24 +00:00
|
|
|
TypeNoteAudio
|
|
|
|
|
TypeNoteImage
|
2026-03-19 16:55:49 +00:00
|
|
|
TypeReviewTask
|
2026-04-13 16:43:15 +00:00
|
|
|
TypeRMOCompliance
|
2026-03-14 18:14:30 +00:00
|
|
|
TypeRMONuisance
|
2026-04-13 16:43:15 +00:00
|
|
|
TypeRMOPublicReport
|
2026-03-13 17:33:39 +00:00
|
|
|
TypeRMOWater
|
2026-04-02 21:31:31 +00:00
|
|
|
TypeSession
|
2026-03-19 19:17:00 +00:00
|
|
|
TypeSignal
|
2026-04-17 15:20:17 +00:00
|
|
|
TypeSite
|
2026-03-13 17:33:39 +00:00
|
|
|
)
|
|
|
|
|
|
2026-03-14 18:14:30 +00:00
|
|
|
func Created(t ResourceType, organization_id int32, uri_id string) {
|
2026-03-13 17:33:39 +00:00
|
|
|
go Send(Envelope{
|
|
|
|
|
Event: Event{
|
2026-03-14 18:14:30 +00:00
|
|
|
Resource: resourceString(t),
|
2026-03-13 17:33:39 +00:00
|
|
|
Time: time.Now(),
|
|
|
|
|
Type: EventTypeCreated,
|
2026-03-14 18:14:30 +00:00
|
|
|
URI: makeURI(t, uri_id),
|
|
|
|
|
},
|
|
|
|
|
OrganizationID: organization_id,
|
|
|
|
|
})
|
|
|
|
|
}
|
2026-04-20 22:33:20 +00:00
|
|
|
func Shutdown() {
|
|
|
|
|
go Send(Envelope{
|
|
|
|
|
Event: Event{
|
|
|
|
|
Resource: "system",
|
|
|
|
|
Time: time.Now(),
|
|
|
|
|
Type: EventTypeShutdown,
|
|
|
|
|
URI: config.MakeURLNidus("/"),
|
|
|
|
|
},
|
|
|
|
|
OrganizationID: 0,
|
|
|
|
|
})
|
|
|
|
|
}
|
2026-03-14 18:14:30 +00:00
|
|
|
func Updated(t ResourceType, organization_id int32, uri_id string) {
|
|
|
|
|
go Send(Envelope{
|
|
|
|
|
Event: Event{
|
|
|
|
|
Resource: resourceString(t),
|
|
|
|
|
Time: time.Now(),
|
|
|
|
|
Type: EventTypeUpdated,
|
|
|
|
|
URI: makeURI(t, uri_id),
|
2026-03-13 17:33:39 +00:00
|
|
|
},
|
|
|
|
|
OrganizationID: organization_id,
|
|
|
|
|
})
|
|
|
|
|
}
|
2026-04-02 21:31:31 +00:00
|
|
|
func UpdatedUser(t ResourceType, user_id int32, uri_id string) {
|
|
|
|
|
go Send(Envelope{
|
|
|
|
|
Event: Event{
|
|
|
|
|
Resource: resourceString(t),
|
|
|
|
|
Time: time.Now(),
|
|
|
|
|
Type: EventTypeUpdated,
|
|
|
|
|
URI: makeURI(t, uri_id),
|
|
|
|
|
},
|
|
|
|
|
UserID: user_id,
|
|
|
|
|
})
|
|
|
|
|
}
|
2026-03-13 17:33:39 +00:00
|
|
|
func Send(env Envelope) {
|
|
|
|
|
chanEvents <- env
|
2026-03-14 18:14:30 +00:00
|
|
|
}
|
|
|
|
|
func resourceString(t ResourceType) string {
|
|
|
|
|
switch t {
|
2026-03-19 15:31:04 +00:00
|
|
|
case TypeFileCSV:
|
|
|
|
|
return "sync:filecsv"
|
2026-03-19 21:25:24 +00:00
|
|
|
case TypeNoteAudio:
|
|
|
|
|
return "sync:note:audio"
|
|
|
|
|
case TypeNoteImage:
|
|
|
|
|
return "sync:note:image"
|
2026-03-19 16:55:49 +00:00
|
|
|
case TypeReviewTask:
|
2026-04-02 21:31:31 +00:00
|
|
|
return "sync:review-task"
|
2026-04-13 16:43:15 +00:00
|
|
|
case TypeRMOCompliance:
|
|
|
|
|
return "rmo:publicreport.compliance"
|
2026-03-14 18:14:30 +00:00
|
|
|
case TypeRMONuisance:
|
2026-04-13 16:43:15 +00:00
|
|
|
return "rmo:publicreport.nuisance"
|
|
|
|
|
case TypeRMOPublicReport:
|
|
|
|
|
return "rmo:publicreport"
|
2026-03-14 18:14:30 +00:00
|
|
|
case TypeRMOWater:
|
2026-04-13 16:43:15 +00:00
|
|
|
return "rmo:publicreport.water"
|
2026-04-02 21:31:31 +00:00
|
|
|
case TypeSession:
|
|
|
|
|
return "sync:session"
|
2026-03-19 19:17:00 +00:00
|
|
|
case TypeSignal:
|
|
|
|
|
return "sync:signal"
|
2026-04-17 15:20:17 +00:00
|
|
|
case TypeSite:
|
|
|
|
|
return "sync:site"
|
2026-03-14 18:14:30 +00:00
|
|
|
default:
|
|
|
|
|
return "unknown"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
func makeURI(t ResourceType, id string) string {
|
|
|
|
|
switch t {
|
2026-03-19 15:31:04 +00:00
|
|
|
case TypeFileCSV:
|
2026-04-02 21:31:31 +00:00
|
|
|
return config.MakeURLNidus("/api/upload/%s", id)
|
2026-03-19 21:25:24 +00:00
|
|
|
case TypeNoteAudio:
|
2026-04-02 21:31:31 +00:00
|
|
|
return config.MakeURLNidus("/api/note/%s", id)
|
2026-03-19 21:25:24 +00:00
|
|
|
case TypeNoteImage:
|
2026-04-02 21:31:31 +00:00
|
|
|
return config.MakeURLNidus("/api/note/%s", id)
|
2026-03-19 16:55:49 +00:00
|
|
|
case TypeReviewTask:
|
2026-04-02 21:31:31 +00:00
|
|
|
return config.MakeURLNidus("/api/review/%s", id)
|
2026-04-13 16:43:15 +00:00
|
|
|
case TypeRMOCompliance:
|
|
|
|
|
return config.MakeURLReport("/api/publicreport/compliance/%s", id)
|
2026-03-14 18:14:30 +00:00
|
|
|
case TypeRMONuisance:
|
2026-04-13 16:43:15 +00:00
|
|
|
return config.MakeURLReport("/api/publicreport/nuisance/%s", id)
|
|
|
|
|
case TypeRMOPublicReport:
|
|
|
|
|
return config.MakeURLReport("/api/publicreport/%s", id)
|
2026-03-14 18:14:30 +00:00
|
|
|
case TypeRMOWater:
|
2026-04-13 16:43:15 +00:00
|
|
|
return config.MakeURLReport("/api/publicrreport/water/%s", id)
|
2026-04-02 21:31:31 +00:00
|
|
|
case TypeSession:
|
|
|
|
|
return config.MakeURLReport("/api/session")
|
2026-03-19 19:17:00 +00:00
|
|
|
case TypeSignal:
|
2026-04-02 21:31:31 +00:00
|
|
|
return config.MakeURLReport("/api/signal/%s", id)
|
2026-04-17 15:20:17 +00:00
|
|
|
case TypeSite:
|
|
|
|
|
return config.MakeURLReport("/api/site/%s", id)
|
2026-03-14 18:14:30 +00:00
|
|
|
default:
|
|
|
|
|
return config.MakeURLReport("/unknown")
|
|
|
|
|
}
|
2026-03-13 17:33:39 +00:00
|
|
|
}
|