package postgres import ( "context" "errors" otterError "git.dragse.it/anthrove/otter-space-sdk/pkg/error" "git.dragse.it/anthrove/otter-space-sdk/pkg/models" log "github.com/sirupsen/logrus" "gorm.io/gorm" ) func CreateTag(ctx context.Context, db *gorm.DB, tag *models.Tag) error { if tag == nil { return &otterError.EntityValidationFailed{Reason: "Tag is nil"} } result := db.WithContext(ctx).Create(tag) 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_name": tag.Name, "tag_type": tag.Type, }).Trace("database: created tag node") return nil } func CreateTagAndReferenceToPost(ctx context.Context, db *gorm.DB, anthrovePostID models.AnthrovePostID, tag *models.Tag) error { if anthrovePostID == "" { return &otterError.EntityValidationFailed{Reason: "anthrovePostID cannot be empty"} } if len(anthrovePostID) != 25 { return &otterError.EntityValidationFailed{Reason: "anthrovePostID needs to be 25 characters long"} } if tag == nil { return &otterError.EntityValidationFailed{Reason: "Tag is nil"} } pgPost := models.Post{ BaseModel: models.BaseModel[models.AnthrovePostID]{ ID: anthrovePostID, }, } err := db.WithContext(ctx).Model(&pgPost).Association("Tags").Append(tag) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return &otterError.NoDataFound{} } return errors.Join(err, &otterError.NoRelationCreated{}) } log.WithFields(log.Fields{ "anthrove_post_id": anthrovePostID, "tag_name": tag.Name, "tag_type": tag.Type, }).Trace("database: created tag node") return nil } func GetTags(ctx context.Context, db *gorm.DB) ([]models.Tag, error) { var tags []models.Tag result := db.WithContext(ctx).Find(&tags) if result.Error != nil { if errors.Is(result.Error, gorm.ErrRecordNotFound) { return nil, &otterError.NoDataFound{} } return nil, result.Error } log.WithFields(log.Fields{ "tag_amount": len(tags), }).Trace("database: got tags") return tags, nil }