package postgres import ( "context" "errors" otterError "git.anthrove.art/anthrove/otter-space-sdk/v2/pkg/error" "git.anthrove.art/anthrove/otter-space-sdk/v2/pkg/models" log "github.com/sirupsen/logrus" "gorm.io/gorm" ) func CreatePost(ctx context.Context, db *gorm.DB, anthrovePost *models.Post) error { if anthrovePost == nil { return &otterError.EntityValidationFailed{Reason: "anthrovePost is nil"} } result := db.WithContext(ctx).Create(&anthrovePost) if result.Error != nil { if errors.Is(result.Error, gorm.ErrDuplicatedKey) { return &otterError.EntityAlreadyExists{} } return result.Error } if result.RowsAffected == 0 { return &otterError.NoDataWritten{} } log.WithFields(log.Fields{ "anthrove_post_id": anthrovePost.ID, "anthrove_post_rating": anthrovePost.Rating, }).Trace("database: created anthrove post") return nil } func CreatePostInBatch(ctx context.Context, db *gorm.DB, anthrovePost []models.Post, batchSize int) error { if anthrovePost == nil { return &otterError.EntityValidationFailed{Reason: "anthrovePost cannot be nil"} } if len(anthrovePost) == 0 { return &otterError.EntityValidationFailed{Reason: "anthrovePost cannot be empty"} } if batchSize == 0 { return &otterError.EntityValidationFailed{Reason: "batch size cannot be zero"} } result := db.WithContext(ctx).CreateInBatches(anthrovePost, batchSize) if result.Error != nil { if errors.Is(result.Error, gorm.ErrDuplicatedKey) { return &otterError.EntityAlreadyExists{} } return result.Error } if result.RowsAffected == 0 { return &otterError.NoDataWritten{} } log.WithFields(log.Fields{ "tag_size": len(anthrovePost), "batch_size": batchSize, }).Trace("database: created tag node") return nil } func GetPostByAnthroveID(ctx context.Context, db *gorm.DB, anthrovePostID models.AnthrovePostID) (*models.Post, error) { if anthrovePostID == "" { return nil, &otterError.EntityValidationFailed{Reason: "anthrovePostID is not set"} } if len(anthrovePostID) != 25 { return nil, &otterError.EntityValidationFailed{Reason: "anthrovePostID needs to be 25 characters long"} } var post models.Post result := db.WithContext(ctx).First(&post, "id = ?", anthrovePostID) if result.Error != nil { if errors.Is(result.Error, gorm.ErrRecordNotFound) { return nil, &otterError.NoDataFound{} } return nil, result.Error } return &post, nil } func GetPostBySourceURL(ctx context.Context, db *gorm.DB, sourceURL string) (*models.Post, error) { if sourceURL == "" { return nil, &otterError.EntityValidationFailed{Reason: "sourceURL is not set"} } var post models.Post result := db.WithContext(ctx).Raw(`SELECT p.id AS id, p.rating as rating FROM "Post" AS p INNER JOIN "PostReference" AS pr ON p.id = pr.post_id AND pr.url = $1 LIMIT 1`, sourceURL).First(&post) if result.Error != nil { if errors.Is(result.Error, gorm.ErrRecordNotFound) { return nil, &otterError.NoDataFound{} } return nil, result.Error } return &post, nil } func GetPostBySourceID(ctx context.Context, db *gorm.DB, sourceID models.AnthroveSourceID) (*models.Post, error) { if sourceID == "" { return nil, &otterError.EntityValidationFailed{Reason: "sourceID is not set"} } var post models.Post result := db.WithContext(ctx).Raw(`SELECT p.id AS id, p.rating as rating FROM "Post" AS p INNER JOIN "PostReference" AS pr ON p.id = pr.post_id AND pr.source_id = $1 LIMIT 1`, sourceID).First(&post) if result.Error != nil { if errors.Is(result.Error, gorm.ErrRecordNotFound) { return nil, &otterError.NoDataFound{} } return nil, result.Error } return &post, nil }