package postgres import ( "context" "database/sql" "git.aiterp.net/rpdata/api/database/postgres/psqlcore" "git.aiterp.net/rpdata/api/internal/generate" "git.aiterp.net/rpdata/api/models" ) type commentRepository struct { insertWithIDs bool db *sql.DB } func (r *commentRepository) Find(ctx context.Context, id string) (*models.Comment, error) { comment, err := psqlcore.New(r.db).SelectComment(ctx, id) if err != nil { return nil, err } return r.comment(comment), nil } func (r *commentRepository) List(ctx context.Context, filter models.CommentFilter) ([]*models.Comment, error) { params := psqlcore.SelectCommentsParams{ ChapterID: "", LimitSize: 0, } if filter.ChapterID != nil { params.ChapterID = *filter.ChapterID } if filter.Limit > 0 { params.LimitSize = int32(filter.Limit) } comments, err := psqlcore.New(r.db).SelectComments(ctx, params) if err != nil { return nil, err } return r.comments(comments), nil } func (r *commentRepository) Insert(ctx context.Context, comment models.Comment) (*models.Comment, error) { if !r.insertWithIDs || len(comment.ID) < 8 { comment.ID = generate.CommentID() } err := psqlcore.New(r.db).InsertComment(ctx, psqlcore.InsertCommentParams{ ID: comment.ID, ChapterID: comment.ChapterID, CharacterID: comment.CharacterID, Subject: comment.Subject, Author: comment.Author, CharacterName: comment.CharacterName, Source: comment.Source, CreatedDate: comment.CreatedDate.UTC(), FictionalDate: comment.FictionalDate.UTC(), EditedDate: comment.EditedDate.UTC(), }) if err != nil { return nil, err } return &comment, nil } func (r *commentRepository) Update(ctx context.Context, comment models.Comment, update models.CommentUpdate) (*models.Comment, error) { comment.ApplyUpdate(update) err := psqlcore.New(r.db).UpdateComment(ctx, psqlcore.UpdateCommentParams{ Subject: comment.Subject, Source: comment.Source, FictionalDate: comment.FictionalDate.UTC(), EditedDate: comment.EditedDate.UTC(), CharacterName: comment.CharacterName, CharacterID: comment.CharacterID, ID: comment.ID, }) if err != nil { return nil, err } return &comment, nil } func (r *commentRepository) Delete(ctx context.Context, comment models.Comment) error { return psqlcore.New(r.db).DeleteComment(ctx, comment.ID) } func (r *commentRepository) comment(comment psqlcore.StoryComment) *models.Comment { return &models.Comment{ ID: comment.ID, ChapterID: comment.ChapterID, Subject: comment.Subject, Author: comment.Author, CharacterName: comment.CharacterName, CharacterID: comment.CharacterID, FictionalDate: comment.FictionalDate, CreatedDate: comment.CreatedDate, EditedDate: comment.EditedDate, Source: comment.Source, } } func (r *commentRepository) comments(comments []psqlcore.StoryComment) []*models.Comment { results := make([]*models.Comment, 0, len(comments)) for _, comment := range comments { results = append(results, r.comment(comment)) } return results }