Browse Source

add item (missing upload)

master
Gisle Aune 5 years ago
parent
commit
14c9425ee7
  1. 36
      graph/resolvers/mutation.resolvers.go
  2. 32
      graph/resolvers/query.resolvers.go
  3. 57
      graph/schema/item.gql
  4. 4
      graph/schema/mutation.gql
  5. 17
      graph/schema/query.gql
  6. 5
      graph/schema/scalars.gql
  7. 3
      migrations/mysql/20200406110301_create_table_item.sql
  8. 1
      models/issueitem.go

36
graph/resolvers/mutation.resolvers.go

@ -6,6 +6,7 @@ package resolvers
import ( import (
"context" "context"
"errors" "errors"
"fmt"
"time" "time"
"git.aiterp.net/stufflog/server/graph/graphcore" "git.aiterp.net/stufflog/server/graph/graphcore"
@ -123,6 +124,41 @@ func (r *mutationResolver) EditActivity(ctx context.Context, input graphcore.Act
return activity, nil 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, xlerrors.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")
}
if input.Image != nil {
panic("todo: implement image upload")
}
item := models.Item{
Name: input.Name,
Description: input.Description,
Tags: input.Tags,
QuantityUnit: input.QuantityUnit,
ImageURL: nil,
}
return r.Database.Items().Insert(ctx, item)
}
func (r *mutationResolver) EditItem(ctx context.Context, input *graphcore.ItemEditInput) (*models.Item, error) {
panic(fmt.Errorf("not implemented"))
}
func (r *mutationResolver) CreateIssue(ctx context.Context, input graphcore.IssueCreateInput) (*models.Issue, error) { func (r *mutationResolver) CreateIssue(ctx context.Context, input graphcore.IssueCreateInput) (*models.Issue, error) {
user := r.Auth.UserFromContext(ctx) user := r.Auth.UserFromContext(ctx)
if user == nil { if user == nil {

32
graph/resolvers/query.resolvers.go

@ -6,7 +6,6 @@ package resolvers
import ( import (
"context" "context"
"errors" "errors"
"git.aiterp.net/stufflog/server/graph/graphcore" "git.aiterp.net/stufflog/server/graph/graphcore"
"git.aiterp.net/stufflog/server/internal/xlerrors" "git.aiterp.net/stufflog/server/internal/xlerrors"
"git.aiterp.net/stufflog/server/models" "git.aiterp.net/stufflog/server/models"
@ -58,6 +57,37 @@ func (r *queryResolver) Issues(ctx context.Context, filter *models.IssueFilter)
return issues, nil 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, xlerrors.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, xlerrors.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, xlerrors.PermissionDenied
}
return r.Database.Items().GetTags(ctx)
}
func (r *queryResolver) Project(ctx context.Context, id string) (*models.Project, error) { func (r *queryResolver) Project(ctx context.Context, id string) (*models.Project, error) {
user := r.Auth.UserFromContext(ctx) user := r.Auth.UserFromContext(ctx)
if user == nil { if user == nil {

57
graph/schema/item.gql

@ -0,0 +1,57 @@
"""
An item that can be required for an issue.
"""
type Item {
"The item's unique ID."
id: String!
"Name of the item."
name: String!
"A description of the item."
description: String!
"Item tags."
tags: [String!]!
"Quantity unit. Usually absent, but otherwise most often 'g' or 'ml'"
quantityUnit: String
"URL for the image, if available."
imageUrl: String
}
"Filter for the items query."
input ItemFilter {
"Get these item IDs. Mostly used internally."
itemIds: [String!]
"Limit to items with any of the following tags."
tags: [String!]
}
"Input for the createItem mutation."
input ItemCreateInput {
"Put a name on it."
name: String!
"Describe it for me."
description: String!
"Add a tag or a few"
tags: [String!]!
"Optional: Quanity unit."
quantityUnit: String
"Optional: Upload an image."
image: Upload
}
"Input for the editItem mutation."
input ItemEditInput {
"Update the name."
setName: String
"Update the description."
setDescription: String
"Add new tags. The tags are added after removeTag tags are removed."
addTags: [String]
"Remove existing tags. If a tag exists both here and in addTags, it will not be removed."
removeTags: [String]
"Update quantity unit."
setQuantityUnit: String
"Clear quantity unit."
clearQuantityUnit: Boolean
"Update the image URL with a new image."
updateImage: Upload
}

4
graph/schema/mutation.gql

@ -10,6 +10,10 @@ type Mutation {
editActivity(input: ActivityEditInput!): Activity! editActivity(input: ActivityEditInput!): Activity!
# ITEM # ITEM
"Create an item."
createItem(input: ItemCreateInput): Item!
"Edit an item."
editItem(input: ItemEditInput): Item!
# ISSUE # ISSUE
"Create a new issue." "Create a new issue."

17
graph/schema/query.gql

@ -1,14 +1,21 @@
type Query { type Query {
"Find issue"
"Find issue."
issue(id: String!): Issue! issue(id: String!): Issue!
"List issues"
"List issues."
issues(filter: IssueFilter): [Issue!]! issues(filter: IssueFilter): [Issue!]!
"Find project"
"Find item."
item(id: String!): Item!
"List items."
items(filter: ItemFilter): [Item!]!
"List item tags."
itemTags: [String!]!
"Find project."
project(id: String!): Project! project(id: String!): Project!
"List projects"
"List projects."
projects(filter: ProjectFilter): [Project!]! projects(filter: ProjectFilter): [Project!]!
"Session checks the user session."
"Check the user session."
session: User session: User
} }

5
graph/schema/scalars.gql

@ -8,3 +8,8 @@ Duration in milliseconds. It will output as an integer, but can be supplied as a
or a string accepted by the Go time.Duration parser. or a string accepted by the Go time.Duration parser.
""" """
scalar Duration scalar Duration
"""
A file upload.
"""
scalar Upload

3
migrations/mysql/20200406110301_create_table_item.sql

@ -7,7 +7,8 @@ CREATE TABLE item (
quantity_unit VARCHAR(255), quantity_unit VARCHAR(255),
image_url VARCHAR(255), image_url VARCHAR(255),
FULLTEXT(name, description)
FULLTEXT(name, description),
INDEX(name)
); );
-- +goose StatementEnd -- +goose StatementEnd

1
models/issueitem.go

@ -6,4 +6,5 @@ type IssueItem struct {
IssueID string `db:"issue_id"` IssueID string `db:"issue_id"`
ItemID string `db:"item_id"` ItemID string `db:"item_id"`
Quantity int `db:"quantity"` Quantity int `db:"quantity"`
Acquired bool `db:"resolved"`
} }
Loading…
Cancel
Save