// Save updates the given space in the db. Version must be the same as the one in the stored version // returns NotFoundError, BadParameterError, VersionConflictError or InternalError func (r *GormRepository) Save(ctx context.Context, p *Space) (*Space, error) { pr := Space{} tx := r.db.Where("id=?", p.ID).First(&pr) oldVersion := p.Version p.Version++ if tx.RecordNotFound() { // treating this as a not found error: the fact that we're using number internal is implementation detail return nil, errors.NewNotFoundError("space", p.ID.String()) } if err := tx.Error; err != nil { return nil, errors.NewInternalError(err.Error()) } tx = tx.Where("Version = ?", oldVersion).Save(p) if err := tx.Error; err != nil { if gormsupport.IsCheckViolation(tx.Error, "spaces_name_check") { return nil, errors.NewBadParameterError("Name", p.Name).Expected("not empty") } if gormsupport.IsUniqueViolation(tx.Error, "spaces_name_idx") { return nil, errors.NewBadParameterError("Name", p.Name).Expected("unique") } return nil, errors.NewInternalError(err.Error()) } if tx.RowsAffected == 0 { return nil, errors.NewVersionConflictError("version conflict") } log.Info(ctx, map[string]interface{}{ "pkg": "space", "spaceID": p.ID, }, "space updated successfully") return p, nil }
// Create creates a new Space in the db // returns BadParameterError or InternalError func (r *GormRepository) Create(ctx context.Context, space *Space) (*Space, error) { space.ID = satoriuuid.NewV4() tx := r.db.Create(space) if err := tx.Error; err != nil { if gormsupport.IsCheckViolation(tx.Error, "spaces_name_check") { return nil, errors.NewBadParameterError("Name", space.Name).Expected("not empty") } if gormsupport.IsUniqueViolation(tx.Error, "spaces_name_idx") { return nil, errors.NewBadParameterError("Name", space.Name).Expected("unique") } return nil, errors.NewInternalError(err.Error()) } log.Info(ctx, map[string]interface{}{ "pkg": "space", "spaceID": space.ID, }, "Space created successfully") return space, nil }
// Create creates a new work item link in the repository. // Returns BadParameterError, ConversionError or InternalError func (r *GormWorkItemLinkRepository) Create(ctx context.Context, sourceID, targetID uint64, linkTypeID satoriuuid.UUID) (*app.WorkItemLinkSingle, error) { link := &WorkItemLink{ SourceID: sourceID, TargetID: targetID, LinkTypeID: linkTypeID, } if err := link.CheckValidForCreation(); err != nil { return nil, errs.WithStack(err) } if err := r.ValidateCorrectSourceAndTargetType(ctx, sourceID, targetID, linkTypeID); err != nil { return nil, errs.WithStack(err) } db := r.db.Create(link) if db.Error != nil { if gormsupport.IsUniqueViolation(db.Error, "work_item_links_unique_idx") { // TODO(kwk): Make NewBadParameterError a variadic function to avoid this ugliness ;) return nil, errors.NewBadParameterError("data.relationships.source_id + data.relationships.target_id + data.relationships.link_type_id", sourceID).Expected("unique") } return nil, errors.NewInternalError(db.Error.Error()) } // Convert the created link type entry into a JSONAPI response result := ConvertLinkFromModel(*link) return &result, nil }