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.
113 lines
3.0 KiB
113 lines
3.0 KiB
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.CharacterID,
|
|
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(),
|
|
CharacterName: comment.ChapterID,
|
|
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
|
|
}
|