go-scopes/storage/message/message.go

73 lines
1.5 KiB
Go

package message
import (
lib "git.sr.ht/~cco/go-scopes"
sql "git.sr.ht/~cco/go-scopes/storage"
"git.sr.ht/~cco/go-scopes/storage/tracking"
)
type message struct {
tracking.Track
}
func Message(tr tracking.Track) *message {
return &message{tr}
}
func MakeMessage(t *tracking.TrackTemplate, c *tracking.Container) tracking.Track {
if t.Head["domain"] == "" {
t.Head["domain"] = "scopes"
}
return tracking.MakeTrack(t, c)
}
func (msg *message) Domain() string {
return msg.Head()["domain"]
}
// message container
func Messages(db *sql.Storage) *tracking.Container {
return &tracking.Container{container_definition, db}
}
func New(cont *tracking.Container, headValues lib.StrSlice, data lib.Map) *message {
return Message(cont.NewTrack(headValues, data))
}
// message store action handler
func Store(act lib.Action) bool {
db := lib.GetState[*sql.Storage](act.Context())
StoreDB(db, act.Message())
return true
}
func StoreDB(db *sql.Storage, msg lib.Message) {
cont := Messages(db)
t := tracking.TrackTemplate{
Head: lib.StrMap{
"Domain": msg.Domain(),
"Action": msg.Action(),
"Class": msg.Class(),
"Item": msg.Item(),
},
}
cont.Save(&t)
}
// container definition
var container_definition *tracking.ContDef
func init() {
container_definition = &tracking.ContDef{
ItemFactory: MakeMessage,
TableName: "messages",
HeadFields: []string{"domain", "action", "class", "item"},
Indexes: [][]string{
[]string{"domain", "action", "class", "item"},
[]string{"domain", "class", "item"},
},
}
}