add support for custom text fields

This commit is contained in:
Hayden 2022-10-15 21:41:27 -08:00
parent 57f9372e49
commit 434f1fa411
11 changed files with 384 additions and 38 deletions

View file

@ -352,7 +352,7 @@ const docTemplate = `{
"application/json"
],
"tags": [
"Items"
"Items Attachments"
],
"summary": "imports items into the database",
"parameters": [
@ -415,7 +415,7 @@ const docTemplate = `{
"application/octet-stream"
],
"tags": [
"Items"
"Items Attachments"
],
"summary": "retrieves an attachment for an item",
"parameters": [
@ -452,7 +452,7 @@ const docTemplate = `{
"application/octet-stream"
],
"tags": [
"Items"
"Items Attachments"
],
"summary": "retrieves an attachment for an item",
"parameters": [
@ -487,7 +487,7 @@ const docTemplate = `{
}
],
"tags": [
"Items"
"Items Attachments"
],
"summary": "retrieves an attachment for an item",
"parameters": [
@ -531,7 +531,7 @@ const docTemplate = `{
}
],
"tags": [
"Items"
"Items Attachments"
],
"summary": "retrieves an attachment for an item",
"parameters": [
@ -1256,6 +1256,32 @@ const docTemplate = `{
}
}
},
"repo.ItemField": {
"type": "object",
"properties": {
"booleanValue": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"numberValue": {
"type": "integer"
},
"textValue": {
"type": "string"
},
"timeValue": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"repo.ItemOut": {
"type": "object",
"properties": {
@ -1271,6 +1297,13 @@ const docTemplate = `{
"description": {
"type": "string"
},
"fields": {
"description": "Future",
"type": "array",
"items": {
"$ref": "#/definitions/repo.ItemField"
}
},
"id": {
"type": "string"
},
@ -1388,6 +1421,12 @@ const docTemplate = `{
"description": {
"type": "string"
},
"fields": {
"type": "array",
"items": {
"$ref": "#/definitions/repo.ItemField"
}
},
"id": {
"type": "string"
},

View file

@ -344,7 +344,7 @@
"application/json"
],
"tags": [
"Items"
"Items Attachments"
],
"summary": "imports items into the database",
"parameters": [
@ -407,7 +407,7 @@
"application/octet-stream"
],
"tags": [
"Items"
"Items Attachments"
],
"summary": "retrieves an attachment for an item",
"parameters": [
@ -444,7 +444,7 @@
"application/octet-stream"
],
"tags": [
"Items"
"Items Attachments"
],
"summary": "retrieves an attachment for an item",
"parameters": [
@ -479,7 +479,7 @@
}
],
"tags": [
"Items"
"Items Attachments"
],
"summary": "retrieves an attachment for an item",
"parameters": [
@ -523,7 +523,7 @@
}
],
"tags": [
"Items"
"Items Attachments"
],
"summary": "retrieves an attachment for an item",
"parameters": [
@ -1248,6 +1248,32 @@
}
}
},
"repo.ItemField": {
"type": "object",
"properties": {
"booleanValue": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"numberValue": {
"type": "integer"
},
"textValue": {
"type": "string"
},
"timeValue": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"repo.ItemOut": {
"type": "object",
"properties": {
@ -1263,6 +1289,13 @@
"description": {
"type": "string"
},
"fields": {
"description": "Future",
"type": "array",
"items": {
"$ref": "#/definitions/repo.ItemField"
}
},
"id": {
"type": "string"
},
@ -1380,6 +1413,12 @@
"description": {
"type": "string"
},
"fields": {
"type": "array",
"items": {
"$ref": "#/definitions/repo.ItemField"
}
},
"id": {
"type": "string"
},

View file

@ -63,6 +63,23 @@ definitions:
name:
type: string
type: object
repo.ItemField:
properties:
booleanValue:
type: boolean
id:
type: string
name:
type: string
numberValue:
type: integer
textValue:
type: string
timeValue:
type: string
type:
type: string
type: object
repo.ItemOut:
properties:
attachments:
@ -73,6 +90,11 @@ definitions:
type: string
description:
type: string
fields:
description: Future
items:
$ref: '#/definitions/repo.ItemField'
type: array
id:
type: string
insured:
@ -153,6 +175,10 @@ definitions:
properties:
description:
type: string
fields:
items:
$ref: '#/definitions/repo.ItemField'
type: array
id:
type: string
insured:
@ -653,7 +679,7 @@ paths:
- Bearer: []
summary: imports items into the database
tags:
- Items
- Items Attachments
/v1/items/{id}/attachments/{attachment_id}:
delete:
parameters:
@ -674,7 +700,7 @@ paths:
- Bearer: []
summary: retrieves an attachment for an item
tags:
- Items
- Items Attachments
get:
parameters:
- description: Item ID
@ -698,7 +724,7 @@ paths:
- Bearer: []
summary: retrieves an attachment for an item
tags:
- Items
- Items Attachments
put:
parameters:
- description: Item ID
@ -726,7 +752,7 @@ paths:
- Bearer: []
summary: retrieves an attachment for an item
tags:
- Items
- Items Attachments
/v1/items/{id}/attachments/download:
get:
parameters:
@ -749,7 +775,7 @@ paths:
- Bearer: []
summary: retrieves an attachment for an item
tags:
- Items
- Items Attachments
/v1/items/import:
post:
parameters:

View file

@ -22,7 +22,7 @@ type (
// HandleItemsImport godocs
// @Summary imports items into the database
// @Tags Items
// @Tags Items Attachments
// @Produce json
// @Param id path string true "Item ID"
// @Param file formData file true "File attachment"
@ -99,7 +99,7 @@ func (ctrl *V1Controller) HandleItemAttachmentCreate() http.HandlerFunc {
// HandleItemAttachmentGet godocs
// @Summary retrieves an attachment for an item
// @Tags Items
// @Tags Items Attachments
// @Produce application/octet-stream
// @Param id path string true "Item ID"
// @Param token query string true "Attachment token"
@ -126,7 +126,7 @@ func (ctrl *V1Controller) HandleItemAttachmentDownload() http.HandlerFunc {
// HandleItemAttachmentToken godocs
// @Summary retrieves an attachment for an item
// @Tags Items
// @Tags Items Attachments
// @Produce application/octet-stream
// @Param id path string true "Item ID"
// @Param attachment_id path string true "Attachment ID"
@ -139,7 +139,7 @@ func (ctrl *V1Controller) HandleItemAttachmentToken() http.HandlerFunc {
// HandleItemAttachmentDelete godocs
// @Summary retrieves an attachment for an item
// @Tags Items
// @Tags Items Attachments
// @Param id path string true "Item ID"
// @Param attachment_id path string true "Attachment ID"
// @Success 204
@ -151,7 +151,7 @@ func (ctrl *V1Controller) HandleItemAttachmentDelete() http.HandlerFunc {
// HandleItemAttachmentUpdate godocs
// @Summary retrieves an attachment for an item
// @Tags Items
// @Tags Items Attachments
// @Param id path string true "Item ID"
// @Param attachment_id path string true "Attachment ID"
// @Param payload body repo.ItemAttachmentUpdate true "Attachment Update"

View file

@ -8,6 +8,7 @@ import (
"github.com/hay-kot/homebox/backend/ent"
"github.com/hay-kot/homebox/backend/ent/group"
"github.com/hay-kot/homebox/backend/ent/item"
"github.com/hay-kot/homebox/backend/ent/itemfield"
"github.com/hay-kot/homebox/backend/ent/label"
"github.com/hay-kot/homebox/backend/ent/location"
"github.com/hay-kot/homebox/backend/ent/predicate"
@ -27,6 +28,16 @@ type (
SortBy string `json:"sortBy"`
}
ItemField struct {
ID uuid.UUID `json:"id,omitempty"`
Type string `json:"type"`
Name string `json:"name"`
TextValue string `json:"textValue"`
NumberValue int `json:"numberValue"`
BooleanValue bool `json:"booleanValue"`
TimeValue time.Time `json:"timeValue,omitempty"`
}
ItemCreate struct {
ImportRef string `json:"-"`
Name string `json:"name"`
@ -69,8 +80,8 @@ type (
SoldNotes string `json:"soldNotes"`
// Extras
Notes string `json:"notes"`
// Fields []*FieldSummary `json:"fields"`
Notes string `json:"notes"`
Fields []ItemField `json:"fields"`
}
ItemSummary struct {
@ -116,7 +127,7 @@ type (
Attachments []ItemAttachment `json:"attachments"`
// Future
// Fields []*FieldSummary `json:"fields"`
Fields []ItemField `json:"fields"`
}
)
@ -156,12 +167,33 @@ var (
mapItemOutErr = mapTErrFunc(mapItemOut)
)
func mapFields(fields []*ent.ItemField) []ItemField {
result := make([]ItemField, len(fields))
for i, f := range fields {
result[i] = ItemField{
ID: f.ID,
Type: f.Type.String(),
Name: f.Name,
TextValue: f.TextValue,
NumberValue: f.NumberValue,
BooleanValue: f.BooleanValue,
TimeValue: f.TimeValue,
}
}
return result
}
func mapItemOut(item *ent.Item) ItemOut {
var attachments []ItemAttachment
if item.Edges.Attachments != nil {
attachments = mapEach(item.Edges.Attachments, ToItemAttachment)
}
var fields []ItemField
if item.Edges.Fields != nil {
fields = mapFields(item.Edges.Fields)
}
return ItemOut{
ItemSummary: mapItemSummary(item),
LifetimeWarranty: item.LifetimeWarranty,
@ -187,6 +219,7 @@ func mapItemOut(item *ent.Item) ItemOut {
// Extras
Notes: item.Notes,
Attachments: attachments,
Fields: fields,
}
}
@ -370,5 +403,63 @@ func (e *ItemsRepository) UpdateByGroup(ctx context.Context, gid uuid.UUID, data
return ItemOut{}, err
}
fields, err := e.db.ItemField.Query().Where(itemfield.HasItemWith(item.ID(data.ID))).All(ctx)
if err != nil {
return ItemOut{}, err
}
fieldIds := newIDSet(fields)
// Update Existing Fields
for _, f := range data.Fields {
if f.ID == uuid.Nil {
// Create New Field
_, err = e.db.ItemField.Create().
SetItemID(data.ID).
SetType(itemfield.Type(f.Type)).
SetName(f.Name).
SetTextValue(f.TextValue).
SetNumberValue(f.NumberValue).
SetBooleanValue(f.BooleanValue).
SetTimeValue(f.TimeValue).
Save(ctx)
if err != nil {
return ItemOut{}, err
}
}
opt := e.db.ItemField.Update().
Where(
itemfield.ID(f.ID),
itemfield.HasItemWith(item.ID(data.ID)),
).
SetType(itemfield.Type(f.Type)).
SetName(f.Name).
SetTextValue(f.TextValue).
SetNumberValue(f.NumberValue).
SetBooleanValue(f.BooleanValue).
SetTimeValue(f.TimeValue)
_, err = opt.Save(ctx)
if err != nil {
return ItemOut{}, err
}
fieldIds.Remove(f.ID)
continue
}
// Delete Fields that are no longer present
if fieldIds.Len() > 0 {
_, err = e.db.ItemField.Delete().
Where(
itemfield.IDIn(fieldIds.Slice()...),
itemfield.HasItemWith(item.ID(data.ID)),
).Exec(ctx)
if err != nil {
return ItemOut{}, err
}
}
return e.GetOne(ctx, data.ID)
}