delete Item.

This commit is contained in:
2020-10-05 18:28:16 +02:00
parent d0ffe1677e
commit 00e27abc5a
11 changed files with 0 additions and 533 deletions
-9
View File
@@ -85,15 +85,6 @@ func (r *issueResolver) Tasks(ctx context.Context, obj *models.Issue, filter *mo
return r.Database.IssueTasks().List(ctx, *filter)
}
func (r *issueResolver) Items(ctx context.Context, obj *models.Issue, filter *models.IssueItemFilter) ([]*models.IssueItem, error) {
if filter == nil {
filter = &models.IssueItemFilter{}
}
filter.IssueIDs = []string{obj.ID}
return r.Database.IssueItems().List(ctx, *filter)
}
func (r *issueResolver) Logs(ctx context.Context, obj *models.Issue) ([]*models.Log, error) {
loader := loaders.LogsByIssueLoaderFromContext(ctx)
-46
View File
@@ -1,46 +0,0 @@
package resolvers
// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.
import (
"context"
"git.aiterp.net/stufflog/server/graph/graphcore"
"git.aiterp.net/stufflog/server/graph/loaders"
"git.aiterp.net/stufflog/server/models"
)
func (r *issueItemResolver) Issue(ctx context.Context, obj *models.IssueItem) (*models.Issue, error) {
return loaders.IssueLoaderFromContext(ctx).Load(obj.IssueID)
}
func (r *issueItemResolver) Item(ctx context.Context, obj *models.IssueItem) (*models.Item, error) {
return r.Database.Items().Find(ctx, obj.ItemID)
}
func (r *issueItemResolver) Remaining(ctx context.Context, obj *models.IssueItem) (int, error) {
if obj.Acquired {
return 0, nil
}
loader := loaders.LogsByIssueLoaderFromContext(ctx)
logs, err := loader.Load(obj.IssueID)
if err != nil {
return 0, err
}
remaining := obj.Quantity
for _, log := range logs {
if item := log.Item(obj.ID); item != nil {
remaining -= item.Amount
}
}
return remaining, nil
}
// IssueItem returns graphcore.IssueItemResolver implementation.
func (r *Resolver) IssueItem() graphcore.IssueItemResolver { return &issueItemResolver{r} }
type issueItemResolver struct{ *Resolver }
-12
View File
@@ -15,14 +15,6 @@ func (r *logResolver) User(ctx context.Context, obj *models.Log) (*models.User,
return r.Database.Users().Find(ctx, obj.UserID)
}
func (r *logItemResolver) Issue(ctx context.Context, obj *models.LogItem) (*models.Issue, error) {
return loaders.IssueLoaderFromContext(ctx).Load(obj.IssueID)
}
func (r *logItemResolver) Item(ctx context.Context, obj *models.LogItem) (*models.IssueItem, error) {
return r.Database.IssueItems().Find(ctx, obj.IssueItemID)
}
func (r *logTaskResolver) Issue(ctx context.Context, obj *models.LogTask) (*models.Issue, error) {
return loaders.IssueLoaderFromContext(ctx).Load(obj.IssueID)
}
@@ -34,12 +26,8 @@ func (r *logTaskResolver) Task(ctx context.Context, obj *models.LogTask) (*model
// Log returns graphcore.LogResolver implementation.
func (r *Resolver) Log() graphcore.LogResolver { return &logResolver{r} }
// LogItem returns graphcore.LogItemResolver implementation.
func (r *Resolver) LogItem() graphcore.LogItemResolver { return &logItemResolver{r} }
// LogTask returns graphcore.LogTaskResolver implementation.
func (r *Resolver) LogTask() graphcore.LogTaskResolver { return &logTaskResolver{r} }
type logResolver struct{ *Resolver }
type logItemResolver struct{ *Resolver }
type logTaskResolver struct{ *Resolver }
-191
View File
@@ -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 {
-101
View File
@@ -65,107 +65,6 @@ func (r *queryResolver) Issues(ctx context.Context, filter *models.IssueFilter)
return issues, nil
}
func (r *queryResolver) Item(ctx context.Context, id string) (*models.Item, error) {
user := r.Auth.UserFromContext(ctx)
if user == nil {
return nil, slerrors.PermissionDenied
}
return r.Database.Items().Find(ctx, id)
}
func (r *queryResolver) Items(ctx context.Context, filter *models.ItemFilter) ([]*models.Item, error) {
user := r.Auth.UserFromContext(ctx)
if user == nil {
return nil, slerrors.PermissionDenied
}
if filter == nil {
filter = &models.ItemFilter{}
}
return r.Database.Items().List(ctx, *filter)
}
func (r *queryResolver) ItemTags(ctx context.Context) ([]string, error) {
user := r.Auth.UserFromContext(ctx)
if user == nil {
return nil, slerrors.PermissionDenied
}
return r.Database.Items().GetTags(ctx)
}
func (r *queryResolver) IssueItem(ctx context.Context, id string) (*models.IssueItem, error) {
user := r.Auth.UserFromContext(ctx)
if user == nil {
return nil, slerrors.PermissionDenied
}
item, err := r.Database.IssueItems().Find(ctx, id)
if err != nil {
return nil, err
}
issue, err := loaders.IssueLoaderFromContext(ctx).Load(id)
if err != nil {
return nil, err
}
_, err = r.Auth.IssuePermission(ctx, *issue)
if err != nil {
return nil, err
}
return item, nil
}
func (r *queryResolver) IssueItems(ctx context.Context, filter *models.IssueItemFilter) ([]*models.IssueItem, error) {
user := r.Auth.UserFromContext(ctx)
if user == nil {
return nil, slerrors.PermissionDenied
}
if filter == nil {
filter = &models.IssueItemFilter{}
}
items, err := r.Database.IssueItems().List(ctx, *filter)
if err != nil {
return nil, err
}
accessMap := make(map[string]bool)
deleteList := make([]int, 0, len(items))
for i, item := range items {
if access, ok := accessMap[item.IssueID]; ok && access {
continue
} else if ok && !access {
deleteList = append(deleteList, i-len(deleteList))
continue
}
issue, err := loaders.IssueLoaderFromContext(ctx).Load(item.IssueID)
if err != nil {
deleteList = append(deleteList, i-len(deleteList))
accessMap[item.IssueID] = true
continue
}
_, err = r.Auth.IssuePermission(ctx, *issue)
if err != nil {
deleteList = append(deleteList, i-len(deleteList))
}
accessMap[issue.ID] = err != nil
}
for _, index := range deleteList {
items = append(items[:index], items[index+1:]...)
}
return items, nil
}
func (r *queryResolver) Project(ctx context.Context, id string) (*models.Project, error) {
user := r.Auth.UserFromContext(ctx)
if user == nil {