graph2: Added logging changes for Channel, Log, Post and Character.
the build failed

This commit is contained in:
2018-10-09 20:25:55 +02:00
parent 8a85313762
commit 34f86d5037
7 changed files with 225 additions and 14 deletions
+33
View File
@@ -0,0 +1,33 @@
package models
import "time"
// Change represents a change in the rpdata history through the API.
type Change struct {
ID string `bson:"_id"`
Model string `bson:"model"`
Op string `bson:"op"`
Author string `bson:"author"`
Date time.Time `bson:"date"`
Logs []Log `bson:"logs"`
Characters []Character `bson:"characters"`
Posts []Post `bson:"posts"`
}
// Data makes a combined, mixed array of all the models stored in this change.
func (change *Change) Data() []interface{} {
data := make([]interface{}, 0, len(change.Logs)+len(change.Characters)+len(change.Posts))
for _, log := range change.Logs {
data = append(data, log)
}
for _, character := range change.Characters {
data = append(data, character)
}
for _, post := range change.Posts {
data = append(data, post)
}
return data
}
+31
View File
@@ -0,0 +1,31 @@
package changes
import (
"log"
"sync"
"time"
"git.aiterp.net/rpdata/api/internal/store"
"github.com/globalsign/mgo"
)
var collection *mgo.Collection
var submitMutex sync.Mutex
func init() {
store.HandleInit(func(db *mgo.Database) {
collection = db.C("common.changes")
collection.EnsureIndexKey("date")
collection.EnsureIndexKey("author")
err := collection.EnsureIndex(mgo.Index{
Name: "expiry",
Key: []string{"date"},
ExpireAfter: time.Hour * 2400, // 100 days
})
if err != nil {
log.Fatalln(err)
}
})
}
+48
View File
@@ -0,0 +1,48 @@
package changes
import (
"strconv"
"time"
"git.aiterp.net/rpdata/api/internal/counter"
"git.aiterp.net/rpdata/api/models"
)
// Submit a change to the database
func Submit(model, op, author string, objects ...interface{}) (models.Change, error) {
submitMutex.Lock()
defer submitMutex.Unlock()
id, err := counter.Next("auto_increment", "Change")
if err != nil {
return models.Change{}, err
}
change := models.Change{
ID: "Change_" + strconv.Itoa(id),
Model: model,
Date: time.Now(),
Op: op,
Author: author,
}
for _, object := range objects {
switch object := object.(type) {
case models.Log:
change.Logs = append(change.Logs, object)
case models.Character:
change.Characters = append(change.Characters, object)
case models.Post:
change.Posts = append(change.Posts, object)
}
}
// TODO: Push to subscribers
err = collection.Insert(&change)
if err != nil {
return models.Change{}, err
}
return change, nil
}