+80
-12
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user