|
|
@ -6,13 +6,10 @@ package resolvers |
|
|
|
import ( |
|
|
|
"context" |
|
|
|
"errors" |
|
|
|
"log" |
|
|
|
"sort" |
|
|
|
"time" |
|
|
|
|
|
|
|
"git.aiterp.net/stufflog/server/graph/graphcore" |
|
|
|
"git.aiterp.net/stufflog/server/graph/loaders" |
|
|
|
"git.aiterp.net/stufflog/server/internal/generate" |
|
|
|
"git.aiterp.net/stufflog/server/internal/slerrors" |
|
|
|
"git.aiterp.net/stufflog/server/models" |
|
|
|
) |
|
|
@ -127,131 +124,6 @@ func (r *mutationResolver) EditActivity(ctx context.Context, input graphcore.Act |
|
|
|
return activity, nil |
|
|
|
} |
|
|
|
|
|
|
|
func (r *mutationResolver) CreateItem(ctx context.Context, input *graphcore.ItemCreateInput) (*models.Item, error) { |
|
|
|
user := r.Auth.UserFromContext(ctx) |
|
|
|
if user == nil { |
|
|
|
return nil, slerrors.PermissionDenied |
|
|
|
} |
|
|
|
|
|
|
|
if input.Name == "" { |
|
|
|
return nil, errors.New("name cannot be blank") |
|
|
|
} |
|
|
|
if input.Description == "" { |
|
|
|
return nil, errors.New("name cannot be blank") |
|
|
|
} |
|
|
|
if len(input.Tags) == 0 { |
|
|
|
return nil, errors.New("at least one tag is required") |
|
|
|
} |
|
|
|
|
|
|
|
item := models.Item{ |
|
|
|
Name: input.Name, |
|
|
|
Description: input.Description, |
|
|
|
Tags: input.Tags, |
|
|
|
QuantityUnit: input.QuantityUnit, |
|
|
|
ImageURL: nil, |
|
|
|
} |
|
|
|
|
|
|
|
if input.Image != nil { |
|
|
|
url, err := r.Upload.UploadImage( |
|
|
|
ctx, |
|
|
|
"item-image/"+generate.Generate(16, "I"), |
|
|
|
input.Image.ContentType, |
|
|
|
input.Image.Size, |
|
|
|
input.Image.File, |
|
|
|
) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
item.ImageURL = &url |
|
|
|
} |
|
|
|
|
|
|
|
return r.Database.Items().Insert(ctx, item) |
|
|
|
} |
|
|
|
|
|
|
|
func (r *mutationResolver) EditItem(ctx context.Context, input *graphcore.ItemEditInput) (*models.Item, error) { |
|
|
|
user := r.Auth.UserFromContext(ctx) |
|
|
|
if user == nil { |
|
|
|
return nil, slerrors.PermissionDenied |
|
|
|
} |
|
|
|
|
|
|
|
item, err := r.Database.Items().Find(ctx, input.ItemID) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
deleteList := make([]int, 0, len(input.RemoveTags)) |
|
|
|
for _, tag := range input.RemoveTags { |
|
|
|
for i, tag2 := range item.Tags { |
|
|
|
if tag == tag2 { |
|
|
|
deleteList = append(deleteList, i-len(deleteList)) |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
for _, index := range deleteList { |
|
|
|
item.Tags = append(item.Tags[:index], item.Tags[index+1:]...) |
|
|
|
} |
|
|
|
for _, tag := range input.AddTags { |
|
|
|
found := false |
|
|
|
for _, tag2 := range item.Tags { |
|
|
|
if tag == tag2 { |
|
|
|
found = true |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
if !found { |
|
|
|
item.Tags = append(item.Tags, tag) |
|
|
|
} |
|
|
|
} |
|
|
|
sort.Strings(item.Tags) |
|
|
|
|
|
|
|
if input.SetQuantityUnit != nil { |
|
|
|
item.QuantityUnit = input.SetQuantityUnit |
|
|
|
} |
|
|
|
if input.ClearQuantityUnit != nil && *input.ClearQuantityUnit { |
|
|
|
item.QuantityUnit = nil |
|
|
|
} |
|
|
|
|
|
|
|
if input.SetName != nil { |
|
|
|
item.Name = *input.SetName |
|
|
|
} |
|
|
|
if input.SetDescription != nil { |
|
|
|
item.Description = *input.SetDescription |
|
|
|
} |
|
|
|
|
|
|
|
var prevFile *string |
|
|
|
if input.UpdateImage != nil { |
|
|
|
url, err := r.Upload.UploadImage( |
|
|
|
ctx, |
|
|
|
"item-image/"+generate.Generate(16, "U"), |
|
|
|
input.UpdateImage.ContentType, |
|
|
|
input.UpdateImage.Size, |
|
|
|
input.UpdateImage.File, |
|
|
|
) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
prevFile = item.ImageURL |
|
|
|
item.ImageURL = &url |
|
|
|
} |
|
|
|
|
|
|
|
err = r.Database.Items().Save(ctx, *item) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
if prevFile != nil { |
|
|
|
err := r.Upload.Delete(ctx, *prevFile) |
|
|
|
if err != nil { |
|
|
|
log.Printf("Failed to delete %s: %s", *prevFile, err) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return item, nil |
|
|
|
} |
|
|
|
|
|
|
|
func (r *mutationResolver) CreateIssue(ctx context.Context, input graphcore.IssueCreateInput) (*models.Issue, error) { |
|
|
|
user := r.Auth.UserFromContext(ctx) |
|
|
|
if user == nil { |
|
|
@ -473,69 +345,6 @@ func (r *mutationResolver) EditIssueTask(ctx context.Context, input graphcore.Is |
|
|
|
return task, nil |
|
|
|
} |
|
|
|
|
|
|
|
func (r *mutationResolver) CreateIssueItem(ctx context.Context, input graphcore.IssueItemCreateInput) (*models.IssueItem, error) { |
|
|
|
user := r.Auth.UserFromContext(ctx) |
|
|
|
if user == nil { |
|
|
|
return nil, slerrors.PermissionDenied |
|
|
|
} |
|
|
|
|
|
|
|
issue, err := loaders.IssueLoaderFromContext(ctx).Load(input.IssueID) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
if perm, err := r.Auth.IssuePermission(ctx, *issue); err != nil || !perm.CanManageOwnIssue() { |
|
|
|
return nil, slerrors.PermissionDenied |
|
|
|
} |
|
|
|
|
|
|
|
item, err := r.Database.Items().Find(ctx, input.ItemID) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
issueItem := &models.IssueItem{ |
|
|
|
IssueID: issue.ID, |
|
|
|
ItemID: item.ID, |
|
|
|
Quantity: input.Quanitty, |
|
|
|
Acquired: input.Acquired != nil && *input.Acquired, |
|
|
|
} |
|
|
|
|
|
|
|
return r.Database.IssueItems().Insert(ctx, *issueItem) |
|
|
|
} |
|
|
|
|
|
|
|
func (r *mutationResolver) EditIssueItem(ctx context.Context, input graphcore.IssueItemEditInput) (*models.IssueItem, error) { |
|
|
|
user := r.Auth.UserFromContext(ctx) |
|
|
|
if user == nil { |
|
|
|
return nil, slerrors.PermissionDenied |
|
|
|
} |
|
|
|
|
|
|
|
item, err := r.Database.IssueItems().Find(ctx, input.IssueItemID) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
issue, err := loaders.IssueLoaderFromContext(ctx).Load(item.IssueID) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
if perm, err := r.Auth.IssuePermission(ctx, *issue); err != nil || !perm.CanManageOwnIssue() { |
|
|
|
return nil, slerrors.PermissionDenied |
|
|
|
} |
|
|
|
|
|
|
|
if input.SetAcquired != nil { |
|
|
|
item.Acquired = *input.SetAcquired |
|
|
|
} |
|
|
|
if input.SetQuanitty != nil { |
|
|
|
item.Quantity = *input.SetQuanitty |
|
|
|
} |
|
|
|
|
|
|
|
err = r.Database.IssueItems().Save(ctx, *item) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
return item, nil |
|
|
|
} |
|
|
|
|
|
|
|
func (r *mutationResolver) CreateLog(ctx context.Context, input graphcore.LogCreateInput) (*models.Log, error) { |
|
|
|
user := r.Auth.UserFromContext(ctx) |
|
|
|
if user == nil { |
|
|
|
xxxxxxxxxx