forked from mirrors/homebox
add support for custom text fields
This commit is contained in:
parent
57f9372e49
commit
434f1fa411
11 changed files with 384 additions and 38 deletions
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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"
|
||||
},
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue