You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.2 KiB
105 lines
2.2 KiB
package change
|
|
|
|
import (
|
|
"log"
|
|
"sync"
|
|
"time"
|
|
|
|
"git.aiterp.net/rpdata/api/model/counter"
|
|
|
|
"git.aiterp.net/rpdata/api/internal/store"
|
|
"github.com/globalsign/mgo"
|
|
)
|
|
|
|
var collection *mgo.Collection
|
|
|
|
// A Change represents a change in any other model
|
|
type Change struct {
|
|
ID int `bson:"_id" json:"id"`
|
|
Time time.Time `bson:"time" json:"time"`
|
|
Model string `bson:"model" json:"model"`
|
|
Op string `bson:"op" json:"op"`
|
|
Author string `bson:"author,omitempty" json:"author,omitempty"`
|
|
ObjectID string `bson:"objectId,omitempty" json:"objectId,omitempty"`
|
|
Data interface{} `bson:"data,omitempty" json:"data,omitempty"`
|
|
}
|
|
|
|
// PublicModels lists which models can be listed in bulk by anyone.
|
|
var PublicModels = []string{
|
|
"Character",
|
|
"Log",
|
|
"Post",
|
|
}
|
|
|
|
var submitMutex sync.Mutex
|
|
|
|
// Submit submits a change to the history.
|
|
func Submit(model, op, author, objectID string, data interface{}) (Change, error) {
|
|
submitMutex.Lock()
|
|
defer submitMutex.Unlock()
|
|
|
|
index, err := counter.Next("auto_increment", "Change")
|
|
if err != nil {
|
|
return Change{}, err
|
|
}
|
|
|
|
change := Change{
|
|
ID: index,
|
|
Time: time.Now(),
|
|
Model: model,
|
|
Op: op,
|
|
Author: author,
|
|
ObjectID: objectID,
|
|
Data: data,
|
|
}
|
|
|
|
Timeline.push(change)
|
|
|
|
err = collection.Insert(&change)
|
|
if err != nil {
|
|
return Change{}, err
|
|
}
|
|
|
|
return change, err
|
|
}
|
|
|
|
// FindID gets a change by ID
|
|
func FindID(id int) (Change, error) {
|
|
change := Change{}
|
|
err := collection.FindId(id).One(&change)
|
|
if err != nil {
|
|
return Change{}, err
|
|
}
|
|
|
|
return change, nil
|
|
}
|
|
|
|
// List gets all changes in ascending order
|
|
func List() ([]Change, error) {
|
|
changes := make([]Change, 0, 64)
|
|
err := collection.Find(nil).Sort("_id").All(&changes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return changes, nil
|
|
}
|
|
|
|
func init() {
|
|
store.HandleInit(func(db *mgo.Database) {
|
|
collection = db.C("common.history")
|
|
|
|
collection.EnsureIndexKey("model")
|
|
collection.EnsureIndexKey("author")
|
|
collection.EnsureIndexKey("objectId")
|
|
|
|
err := collection.EnsureIndex(mgo.Index{
|
|
Name: "expiry",
|
|
Key: []string{"time"},
|
|
ExpireAfter: time.Hour * 336,
|
|
})
|
|
if err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
})
|
|
}
|