Added mergeLog mutation.
the build was successful

This commit is contained in:
2019-08-16 12:32:50 +02:00
parent 2a0e6534ff
commit 8fbaea2078
4 changed files with 104 additions and 13 deletions
+80 -12
View File
@@ -280,12 +280,78 @@ func (s *LogService) SplitLog(ctx context.Context, logId string, startPostId str
s.changeService.Submit(ctx, models.ChangeModelPost, "add", true, changekeys.Many(newLog, newPosts), newPosts)
// Refresh character lists.
_ = s.refreshLogCharacters(ctx, *l, nil)
_ = s.refreshLogCharacters(ctx, *newLog, nil)
_, _ = s.refreshLogCharacters(ctx, *l, nil)
newLog2, err := s.refreshLogCharacters(ctx, *newLog, nil)
if err == nil {
newLog = newLog2
}
return newLog, nil
}
func (s *LogService) MergeLogs(ctx context.Context, targetID string, sourceID string, removeAfter bool) (*models.Log, error) {
// Check permissions
if err := auth.CheckPermission(ctx, "edit", &models.Log{}); err != nil {
return nil, err
}
if removeAfter {
if err := auth.CheckPermission(ctx, "remove", &models.Log{}); err != nil {
return nil, err
}
}
// Merge log posts into log.
source, err := s.logs.Find(ctx, sourceID)
if err != nil {
return nil, errors.New("could not find source log: " + err.Error())
}
target, err := s.logs.Find(ctx, targetID)
if err != nil {
return nil, errors.New("could not find target log: " + err.Error())
}
// Get the source posts.
posts, err := s.posts.List(ctx, models.PostFilter{LogID: &source.ShortID})
if err != nil {
return nil, errors.New("could not fetch source posts: " + err.Error())
}
// Associate the posts with the target logs
for _, post := range posts {
post.ID = ""
post.LogID = target.ShortID
}
// Insert them
posts, err = s.posts.InsertMany(ctx, posts...)
if err != nil {
return nil, errors.New("could not insert posts into target: " + err.Error())
}
// Remove other log
if removeAfter {
err = s.logs.Delete(ctx, *source)
if err != nil {
return nil, errors.New("posts have been inserted, but could not remove source: " + err.Error())
}
s.changeService.Submit(ctx, models.ChangeModelLog, "remove", true, changekeys.Listed(source), source)
}
// Refresh characters
target2, err := s.refreshLogCharacters(ctx, *target, nil)
if err != nil {
log.Printf("Failed to update characters in log %s: %s", target.ID, err)
} else {
target = target2
}
// Submit changes after the target
s.changeService.Submit(ctx, models.ChangeModelPost, "add", true, changekeys.Many(target, posts), target, posts)
return target, nil
}
func (s *LogService) AddPost(ctx context.Context, logId string, time time.Time, kind, nick, text string) (*models.Post, error) {
if kind == "" || nick == "" || time.IsZero() {
return nil, errors.New("kind, nick and time must be non-empty")
@@ -313,9 +379,11 @@ func (s *LogService) AddPost(ctx context.Context, logId string, time time.Time,
return nil, err
}
err = s.refreshLogCharacters(ctx, *l, nil)
l2, err := s.refreshLogCharacters(ctx, *l, nil)
if err != nil {
log.Printf("Failed to update characters in log %s: %s", l.ID, err)
} else {
l = l2
}
s.changeService.Submit(ctx, models.ChangeModelPost, "add", true, changekeys.Many(l, post), post)
@@ -348,7 +416,7 @@ func (s *LogService) EditPost(ctx context.Context, id string, update models.Post
return
}
err = s.refreshLogCharacters(ctx, *l, nil)
_, err = s.refreshLogCharacters(ctx, *l, nil)
if err != nil {
log.Printf("Failed to update characters in log %s: %s", l.ID, err)
}
@@ -415,7 +483,7 @@ func (s *LogService) DeletePost(ctx context.Context, id string) (*models.Post, e
return
}
err = s.refreshLogCharacters(ctx, *l, nil)
_, err = s.refreshLogCharacters(ctx, *l, nil)
if err != nil {
log.Printf("Failed to update characters in log %s: %s", l.ID, err)
}
@@ -575,7 +643,8 @@ func (s *LogService) RefreshAllLogCharacters(ctx context.Context) error {
l := logs[i]
eg.Go(func() error {
return s.refreshLogCharacters(ctx, *l, characterMap)
_, err := s.refreshLogCharacters(ctx, *l, characterMap)
return err
})
}
err = eg.Wait()
@@ -588,14 +657,14 @@ func (s *LogService) RefreshAllLogCharacters(ctx context.Context) error {
return nil
}
func (s *LogService) RefreshLogCharacters(ctx context.Context, log models.Log) error {
func (s *LogService) RefreshLogCharacters(ctx context.Context, log models.Log) (*models.Log, error) {
return s.refreshLogCharacters(ctx, log, nil)
}
func (s *LogService) refreshLogCharacters(ctx context.Context, log models.Log, characterMap map[string]*models.Character) error {
func (s *LogService) refreshLogCharacters(ctx context.Context, log models.Log, characterMap map[string]*models.Character) (*models.Log, error) {
posts, err := s.ListPosts(ctx, &models.PostFilter{LogID: &log.ShortID})
if err != nil {
return nil
return &log, nil
}
counts := make(map[string]int)
@@ -639,7 +708,7 @@ func (s *LogService) refreshLogCharacters(ctx context.Context, log models.Log, c
if characterMap == nil {
characters, err := s.characterService.List(ctx, models.CharacterFilter{Nicks: nicks})
if err != nil {
return err
return nil, err
}
characterMap = s.makeCharacterMap(characters)
@@ -659,8 +728,7 @@ func (s *LogService) refreshLogCharacters(ctx context.Context, log models.Log, c
log.CharacterIDs = append(log.CharacterIDs, character.ID)
}
_, err = s.logs.Update(ctx, log, models.LogUpdate{CharacterIDs: log.CharacterIDs})
return err
return s.logs.Update(ctx, log, models.LogUpdate{CharacterIDs: log.CharacterIDs})
}
func (s *LogService) makeCharacterMap(characters []*models.Character) map[string]*models.Character {