Logs and posts are now on the new architecture.
the build was successful

This commit is contained in:
2019-06-18 20:34:58 +02:00
parent e194b6536e
commit 73a1c79903
37 changed files with 1575 additions and 922 deletions
+26 -26
View File
@@ -15,54 +15,54 @@ type Change struct {
Keys []ChangeKey `bson:"keys"`
Date time.Time `bson:"date"`
Logs []Log `bson:"logs"`
Characters []Character `bson:"characters"`
Channels []Channel `bson:"channels"`
Posts []Post `bson:"posts"`
Stories []Story `bson:"stories"`
Tags []Tag `bson:"tags"`
Chapters []Chapter `bson:"chapters"`
Comments []Comment `bson:"comments"`
Logs []*Log `bson:"logs"`
Characters []*Character `bson:"characters"`
Channels []*Channel `bson:"channels"`
Posts []*Post `bson:"posts"`
Stories []*Story `bson:"stories"`
Tags []*Tag `bson:"tags"`
Chapters []*Chapter `bson:"chapters"`
Comments []*Comment `bson:"comments"`
}
// AddObject adds the model into the appropriate array.
func (change *Change) AddObject(object interface{}) bool {
if v := reflect.ValueOf(object); v.Kind() == reflect.Ptr {
return change.AddObject(v.Elem().Interface())
if v := reflect.ValueOf(object); v.Kind() != reflect.Ptr && v.Kind() != reflect.Slice {
return change.AddObject(v.Addr().Interface())
}
switch object := object.(type) {
case Log:
case *Log:
change.Logs = append(change.Logs, object)
case []Log:
case []*Log:
change.Logs = append(change.Logs, object...)
case Character:
case *Character:
change.Characters = append(change.Characters, object)
case []Character:
case []*Character:
change.Characters = append(change.Characters, object...)
case Channel:
case *Channel:
change.Channels = append(change.Channels, object)
case []Channel:
case []*Channel:
change.Channels = append(change.Channels, object...)
case Post:
case *Post:
change.Posts = append(change.Posts, object)
case []Post:
case []*Post:
change.Posts = append(change.Posts, object...)
case Story:
case *Story:
change.Stories = append(change.Stories, object)
case []Story:
case []*Story:
change.Stories = append(change.Stories, object...)
case Tag:
case *Tag:
change.Tags = append(change.Tags, object)
case []Tag:
case []*Tag:
change.Tags = append(change.Tags, object...)
case Chapter:
case *Chapter:
change.Chapters = append(change.Chapters, object)
case []Chapter:
case []*Chapter:
change.Chapters = append(change.Chapters, object...)
case Comment:
case *Comment:
change.Comments = append(change.Comments, object)
case []Comment:
case []*Comment:
change.Comments = append(change.Comments, object...)
default:
return false
+1 -1
View File
@@ -2,7 +2,7 @@ package changekeys
import "git.aiterp.net/rpdata/api/models"
// Listed is a helper for cases like []models.ChangeKey{changekeys.All("Logs"), changekeys.One(log)}
// Listed is a helper for cases like []models.ChangeKey{All("Log"), One(log), One(post)}
func Listed(objects ...interface{}) []models.ChangeKey {
keys := Many(objects)
if len(keys) == 0 {
+6
View File
@@ -11,10 +11,16 @@ func One(object interface{}) models.ChangeKey {
switch v := object.(type) {
case models.Post:
return models.ChangeKey{Model: "Post", ID: v.ID}
case *models.Post:
return models.ChangeKey{Model: "Post", ID: v.ID}
case models.Character:
return models.ChangeKey{Model: "Character", ID: v.ID}
case *models.Character:
return models.ChangeKey{Model: "Character", ID: v.ID}
case models.Channel:
return models.ChangeKey{Model: "Channel", ID: v.Name}
case *models.Channel:
return models.ChangeKey{Model: "Channel", ID: v.Name}
}
model := ""
+35 -27
View File
@@ -54,53 +54,61 @@ func Submit(model, op, author string, listed bool, keys []models.ChangeKey, obje
for _, object := range objects {
switch object := object.(type) {
case models.Log:
change.Logs = append(change.Logs, object)
change.Logs = append(change.Logs, &object)
case *models.Log:
change.Logs = append(change.Logs, *object)
change.Logs = append(change.Logs, object)
case []models.Log:
change.Logs = append(change.Logs, object...)
for _, obj := range object {
change.Logs = append(change.Logs, &obj)
}
case models.Character:
change.Characters = append(change.Characters, object)
change.Characters = append(change.Characters, &object)
case *models.Character:
change.Characters = append(change.Characters, *object)
change.Characters = append(change.Characters, object)
case []models.Character:
change.Characters = append(change.Characters, object...)
for _, obj := range object {
change.Characters = append(change.Characters, &obj)
}
case models.Channel:
change.Channels = append(change.Channels, object)
change.Channels = append(change.Channels, &object)
case *models.Channel:
change.Channels = append(change.Channels, *object)
change.Channels = append(change.Channels, object)
case []models.Channel:
change.Channels = append(change.Channels, object...)
for _, obj := range object {
change.Channels = append(change.Channels, &obj)
}
case models.Post:
change.Posts = append(change.Posts, object)
change.Posts = append(change.Posts, &object)
case *models.Post:
change.Posts = append(change.Posts, *object)
change.Posts = append(change.Posts, object)
case []models.Post:
change.Posts = append(change.Posts, object...)
for _, obj := range object {
change.Posts = append(change.Posts, &obj)
}
case models.Story:
change.Stories = append(change.Stories, object)
change.Stories = append(change.Stories, &object)
case *models.Story:
change.Stories = append(change.Stories, *object)
change.Stories = append(change.Stories, object)
case []models.Story:
change.Stories = append(change.Stories, object...)
case models.Tag:
change.Tags = append(change.Tags, object)
case *models.Tag:
change.Tags = append(change.Tags, *object)
case []models.Tag:
change.Tags = append(change.Tags, object...)
for _, obj := range object {
change.Stories = append(change.Stories, &obj)
}
case models.Chapter:
change.Chapters = append(change.Chapters, object)
change.Chapters = append(change.Chapters, &object)
case *models.Chapter:
change.Chapters = append(change.Chapters, *object)
change.Chapters = append(change.Chapters, object)
case []models.Chapter:
change.Chapters = append(change.Chapters, object...)
for _, obj := range object {
change.Chapters = append(change.Chapters, &obj)
}
case models.Comment:
change.Comments = append(change.Comments, object)
change.Comments = append(change.Comments, &object)
case *models.Comment:
change.Comments = append(change.Comments, *object)
change.Comments = append(change.Comments, object)
case []models.Comment:
change.Comments = append(change.Comments, object...)
for _, obj := range object {
change.Comments = append(change.Comments, &obj)
}
default:
log.Printf("Warning: unrecognized object in change: %#+v", object)
}
+18 -1
View File
@@ -19,4 +19,21 @@ type Log struct {
// ChangeObject in GQL.
func (*Log) IsChangeObject() {
panic("this method is a dummy, and so is its caller")
}
}
// A LogFilter is a filter that can be used to list logs.
type LogFilter struct {
Search *string
Open *bool
Characters []string
Channels []string
Events []string
Limit int
}
type LogUpdate struct {
Title *string
EventName *string
Description *string
Open *bool
}
-17
View File
@@ -2,7 +2,6 @@ package logs
import (
"fmt"
"log"
"time"
"git.aiterp.net/rpdata/api/internal/store"
@@ -45,21 +44,5 @@ func init() {
store.HandleInit(func(db *mgo.Database) {
collection = db.C("logbot3.logs")
postCollection = db.C("logbot3.posts")
collection.EnsureIndexKey("date")
collection.EnsureIndexKey("channel")
collection.EnsureIndexKey("characterIds")
collection.EnsureIndexKey("event")
collection.EnsureIndex(mgo.Index{
Key: []string{"channel", "open"},
})
err := collection.EnsureIndex(mgo.Index{
Key: []string{"shortId"},
Unique: true,
DropDups: true,
})
if err != nil {
log.Fatalln("init logbot3.logs:", err)
}
})
}
-93
View File
@@ -1,93 +0,0 @@
package logs
import (
"errors"
"time"
"git.aiterp.net/rpdata/api/internal/importers/mirclike"
"git.aiterp.net/rpdata/api/models/posts"
"git.aiterp.net/rpdata/api/models/channels"
"git.aiterp.net/rpdata/api/internal/importers/forumlog"
"git.aiterp.net/rpdata/api/models"
)
// An ImportedLog contains data about an imported log.
type ImportedLog struct {
Log models.Log
Posts []models.Post
}
// Import makes a log and posts object from different formats.
func Import(importer models.LogImporter, date time.Time, tz *time.Location, channelName string, data string) ([]ImportedLog, error) {
results := make([]ImportedLog, 0, 8)
eventName := ""
if channel, err := channels.FindName(channelName); err != nil {
eventName = channel.EventName
}
date = date.In(tz)
switch importer {
case models.LogImporterMircLike:
{
if date.IsZero() {
return nil, errors.New("Date is not optional for mirc-like logs")
}
parsedLog, parsedPosts, err := mirclike.ParseLog(data, date, true)
if err != nil {
return nil, err
}
log, err := Add(parsedLog.Date, channelName, "", eventName, "", false)
if err != nil {
return nil, err
}
posts, err := posts.AddMany(log, parsedPosts)
if err != nil {
return nil, err
}
results = append(results, ImportedLog{
Log: log,
Posts: posts,
})
}
case models.LogImporterForumLog:
{
parseResults, err := forumlog.ParseLogs(data, tz)
if err != nil {
return nil, err
}
for _, result := range parseResults {
log, err := Add(result.Log.Date, channelName, "", eventName, "", false)
if err != nil {
return nil, err
}
posts, err := posts.AddMany(log, result.Posts)
if err != nil {
return nil, err
}
results = append(results, ImportedLog{
Log: log,
Posts: posts,
})
}
}
default:
{
return nil, errors.New("Invalid importer: " + importer.String())
}
}
return results, nil
}
+17 -1
View File
@@ -17,4 +17,20 @@ type Post struct {
// ChangeObject in GQL.
func (*Post) IsChangeObject() {
panic("this method is a dummy, and so is its caller")
}
}
// PostFilter is used to generate a query to the database.
type PostFilter struct {
IDs []string
Kinds []string
LogID *string
Search *string
Limit int
}
type PostUpdate struct {
Time *time.Time
Kind *string
Nick *string
Text *string
}