diff --git a/server/internal/adapter/integration/convert.go b/server/internal/adapter/integration/convert.go index 93ec48d0e0..08de30037c 100644 --- a/server/internal/adapter/integration/convert.go +++ b/server/internal/adapter/integration/convert.go @@ -45,9 +45,10 @@ func fromItemFieldParam(f integrationapi.Field) interfaces.ItemFieldParam { } return interfaces.ItemFieldParam{ - Field: f.Id, - Key: k, - Type: integrationapi.FromValueType(f.Type), - Value: v, + Field: f.Id, + Key: k, + Type: integrationapi.FromValueType(f.Type), + Value: v, + ItemGroup: f.ItemGroup, } } diff --git a/server/internal/adapter/integration/item.go b/server/internal/adapter/integration/item.go index d57b0c5b65..e5a655caa5 100644 --- a/server/internal/adapter/integration/item.go +++ b/server/internal/adapter/integration/item.go @@ -3,6 +3,7 @@ package integration import ( "context" "errors" + "github.com/reearth/reearth-cms/server/pkg/group" "github.com/reearth/reearth-cms/server/pkg/schema" "github.com/reearth/reearth-cms/server/internal/adapter" @@ -53,20 +54,27 @@ func (s Server) ItemFilter(ctx context.Context, request ItemFilterRequestObject) return ItemFilter400Response{}, err } - return ItemFilter200JSONResponse{ - Items: lo.ToPtr(util.Map(items, func(i item.Versioned) integrationapi.VersionedItem { - metaItem, _ := lo.Find(metaItems, func(itm item.Versioned) bool { - return itm.Value().ID() == lo.FromPtr(i.Value().MetadataItem()) + resItms, err := util.TryMap(items, func(i item.Versioned) (integrationapi.VersionedItem, error) { + sgl, err := getGroupSchemas(ctx, i.Value(), ss) + if err != nil { + return integrationapi.VersionedItem{}, err + } + metaItem, _ := lo.Find(metaItems, func(itm item.Versioned) bool { + return itm.Value().ID() == lo.FromPtr(i.Value().MetadataItem()) + }) + var metaSchema *schema.Schema + if metaItem != nil { + metaSchema, _ = lo.Find(metaSchemas, func(s *schema.Schema) bool { + return metaItem.Value().Schema() == s.ID() }) - var metaSchema *schema.Schema - if metaItem != nil { - metaSchema, _ = lo.Find(metaSchemas, func(s *schema.Schema) bool { - return metaItem.Value().Schema() == s.ID() - }) - } - - return integrationapi.NewVersionedItem(i, ss, assetContext(ctx, assets, request.Params.Asset), getReferencedItems(ctx, i), metaSchema, metaItem) - })), + } + return integrationapi.NewVersionedItem(i, ss, assetContext(ctx, assets, request.Params.Asset), getReferencedItems(ctx, i), metaSchema, metaItem, sgl), nil + }) + if err != nil { + return ItemFilter400Response{}, err + } + return ItemFilter200JSONResponse{ + Items: &resItms, Page: request.Params.Page, PerPage: request.Params.PerPage, TotalCount: lo.ToPtr(int(pi.TotalCount)), @@ -118,20 +126,29 @@ func (s Server) ItemFilterWithProject(ctx context.Context, request ItemFilterWit return ItemFilterWithProject400Response{}, err } - return ItemFilterWithProject200JSONResponse{ - Items: lo.ToPtr(util.Map(items, func(i item.Versioned) integrationapi.VersionedItem { - metaItem, _ := lo.Find(metaItems, func(itm item.Versioned) bool { - return itm.Value().ID() == lo.FromPtr(i.Value().MetadataItem()) + resItms, err := util.TryMap(items, func(i item.Versioned) (integrationapi.VersionedItem, error) { + sgl, err := getGroupSchemas(ctx, i.Value(), ss) + if err != nil { + return integrationapi.VersionedItem{}, err + } + + metaItem, _ := lo.Find(metaItems, func(itm item.Versioned) bool { + return itm.Value().ID() == lo.FromPtr(i.Value().MetadataItem()) + }) + var metaSchema *schema.Schema + if metaItem != nil { + metaSchema, _ = lo.Find(metaSchemas, func(s *schema.Schema) bool { + return metaItem.Value().Schema() == s.ID() }) - var metaSchema *schema.Schema - if metaItem != nil { - metaSchema, _ = lo.Find(metaSchemas, func(s *schema.Schema) bool { - return metaItem.Value().Schema() == s.ID() - }) - } + } - return integrationapi.NewVersionedItem(i, ss, assetContext(ctx, assets, request.Params.Asset), getReferencedItems(ctx, i), metaSchema, metaItem) - })), + return integrationapi.NewVersionedItem(i, ss, assetContext(ctx, assets, request.Params.Asset), getReferencedItems(ctx, i), metaSchema, metaItem, sgl), nil + }) + if err != nil { + return ItemFilterWithProject400Response{}, err + } + return ItemFilterWithProject200JSONResponse{ + Items: &resItms, Page: request.Params.Page, PerPage: request.Params.PerPage, TotalCount: lo.ToPtr(int(pi.TotalCount)), @@ -201,7 +218,12 @@ func (s Server) ItemCreate(ctx context.Context, request ItemCreateRequestObject) return ItemCreate400Response{}, err } - return ItemCreate200JSONResponse(integrationapi.NewVersionedItem(i, ss, nil, getReferencedItems(ctx, i), metaSchema, metaItem)), nil + sgl, err := getGroupSchemas(ctx, i.Value(), ss) + if err != nil { + return nil, err + } + + return ItemCreate200JSONResponse(integrationapi.NewVersionedItem(i, ss, nil, getReferencedItems(ctx, i), metaSchema, metaItem, sgl)), nil } func (s Server) ItemCreateWithProject(ctx context.Context, request ItemCreateWithProjectRequestObject) (ItemCreateWithProjectResponseObject, error) { @@ -275,7 +297,12 @@ func (s Server) ItemCreateWithProject(ctx context.Context, request ItemCreateWit return ItemCreateWithProject400Response{}, err } - return ItemCreateWithProject200JSONResponse(integrationapi.NewVersionedItem(i, ss, nil, getReferencedItems(ctx, i), metaSchema, metaItem)), nil + sgl, err := getGroupSchemas(ctx, i.Value(), ss) + if err != nil { + return nil, err + } + + return ItemCreateWithProject200JSONResponse(integrationapi.NewVersionedItem(i, ss, nil, getReferencedItems(ctx, i), metaSchema, metaItem, sgl)), nil } func (s Server) ItemUpdate(ctx context.Context, request ItemUpdateRequestObject) (ItemUpdateResponseObject, error) { @@ -371,7 +398,12 @@ func (s Server) ItemUpdate(ctx context.Context, request ItemUpdateRequestObject) return ItemUpdate500Response{}, err } - return ItemUpdate200JSONResponse(integrationapi.NewVersionedItem(i, ss, assetContext(ctx, assets, request.Body.Asset), getReferencedItems(ctx, i), metaSchema, metaItem)), nil + sgl, err := getGroupSchemas(ctx, i.Value(), ss) + if err != nil { + return ItemUpdate400Response{}, err + } + + return ItemUpdate200JSONResponse(integrationapi.NewVersionedItem(i, ss, assetContext(ctx, assets, request.Body.Asset), getReferencedItems(ctx, i), metaSchema, metaItem, sgl)), nil } func (s Server) ItemDelete(ctx context.Context, request ItemDeleteRequestObject) (ItemDeleteResponseObject, error) { @@ -412,6 +444,11 @@ func (s Server) ItemGet(ctx context.Context, request ItemGetRequestObject) (Item return ItemGet500Response{}, err } + sgl, err := getGroupSchemas(ctx, i.Value(), ss) + if err != nil { + return ItemGet500Response{}, err + } + msList, miList := getMetaSchemasAndItems(ctx, item.VersionedList{i}) if err != nil { return ItemGet400Response{}, err @@ -426,7 +463,7 @@ func (s Server) ItemGet(ctx context.Context, request ItemGetRequestObject) (Item ms = msList[0] } - return ItemGet200JSONResponse(integrationapi.NewVersionedItem(i, ss, assetContext(ctx, assets, request.Params.Asset), getReferencedItems(ctx, i), ms, mi)), nil + return ItemGet200JSONResponse(integrationapi.NewVersionedItem(i, ss, assetContext(ctx, assets, request.Params.Asset), getReferencedItems(ctx, i), ms, mi, sgl)), nil } func assetContext(ctx context.Context, m asset.Map, asset *integrationapi.AssetEmbedding) *integrationapi.AssetContext { @@ -477,12 +514,43 @@ func getReferencedItems(ctx context.Context, i *version.Value[*item.Item]) *[]in if err != nil { continue } - vi = append(vi, integrationapi.NewVersionedItem(ii, nil, nil, nil, nil, nil)) + vi = append(vi, integrationapi.NewVersionedItem(ii, nil, nil, nil, nil, nil, nil)) } } return &vi } +func getGroupSchemas(ctx context.Context, i *item.Item, ss *schema.Schema) (schema.List, error) { + op := adapter.Operator(ctx) + uc := adapter.Usecases(ctx) + gf := i.Fields().FieldsByType(value.TypeGroup) + + var gIds id.GroupIDList + for _, field := range gf { + gsf := ss.Field(field.FieldID()) + + if gsf != nil { + var gid id.GroupID + gsf.TypeProperty().Match(schema.TypePropertyMatch{ + Group: func(f *schema.FieldGroup) { + gid = f.Group() + }, + }) + gIds = gIds.Add(gid) + + } + } + gl, err := uc.Group.FindByIDs(ctx, gIds, op) + if err != nil { + return nil, err + } + + sgIds := util.Map(gl, func(g *group.Group) id.SchemaID { + return g.Schema() + }) + + return uc.Schema.FindByIDs(ctx, sgIds, op) +} func getMetaSchemasAndItems(ctx context.Context, itemList item.VersionedList) (schema.List, item.VersionedList) { op := adapter.Operator(ctx) diff --git a/server/internal/adapter/integration/server.gen.go b/server/internal/adapter/integration/server.gen.go index a7e0331be1..c5812fe894 100644 --- a/server/internal/adapter/integration/server.gen.go +++ b/server/internal/adapter/integration/server.gen.go @@ -2308,45 +2308,45 @@ func (sh *strictHandler) AssetCreate(ctx echo.Context, projectId ProjectIdParam) // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "EqqUcMh+vwKRY7tfbfdfA/waZQh6mzW7/VbuoZe6drbJX+5uK8VIR+vozzY3a3c6SfGdXyj5wyNtdSf7", - "5/WvvzCqSJhesMyCYUokYP+03d3OTwUAyEOP4aW9U+/+TVYdN7OyhhxAD9Z+6CEaT8eT2ULGDpA0mFCR", - "P40q1bK9O/xAYyfvT+wOxI7g1b0TwiPG787cjxlcPRs/Yvxz7azUioDDHsig8/7zTe9p/fIawfBAOux5", - "rjOvVzn2tPUKwGBxcuSSJpfsRe0hNoxqlNLb/hy27znu7DxuZ+eHioopKPYn9no2yzGf5ccq7WxTv8uz", - "rec6ug12gELpv9KtrspbRcea6XXVTO03zUYk8ea9SF9xTUbo/7ck20fzsTo7VmfH6uzHqM7Kq6vPTGLD", - "NV49Ix7LvWO5NzIsuhDfkTm3+VG7CdkxP7M8KT3SAZtXtmXxnKkrP1D+wlLWSzjt/oSs49U7aZ4rO0De", - "aeaOfSXO896OKXjIz+5hRBoSku6z5/e1/I8dEXrgHQZ7J9MLQM0M2OJOUHlFnu7uBlxlcSxuYyj+zwrN", - "S3mdN46bl4eSLHYyFcbNFtokbzBP9edEf7+0vKd0K5WgC/7Nm51jdKnL3hYU2+M9kydG3nm5j1GCvTfo", - "ttvt/wIAAP//9I9cQANKAAA=", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/server/pkg/integrationapi/convert.go b/server/pkg/integrationapi/convert.go index 200ea4dd49..9d754b1d95 100644 --- a/server/pkg/integrationapi/convert.go +++ b/server/pkg/integrationapi/convert.go @@ -26,7 +26,7 @@ func New(obj any, v string, urlResolver asset.URLResolver) (res any, err error) case *item.Item: res = NewItem(o, nil, nil) case item.Versioned: - res = NewVersionedItem(o, nil, nil, nil, nil, nil) + res = NewVersionedItem(o, nil, nil, nil, nil, nil, nil) case item.ItemModelSchema: res = NewItemModelSchema(o, nil) // TODO: add later diff --git a/server/pkg/integrationapi/item.go b/server/pkg/integrationapi/item.go index d6e7ecdff5..b7dce2e81a 100644 --- a/server/pkg/integrationapi/item.go +++ b/server/pkg/integrationapi/item.go @@ -9,7 +9,7 @@ import ( "github.com/samber/lo" ) -func NewVersionedItem(ver item.Versioned, s *schema.Schema, assets *AssetContext, f *[]VersionedItem, ms *schema.Schema, mi item.Versioned) VersionedItem { +func NewVersionedItem(ver item.Versioned, s *schema.Schema, assets *AssetContext, f *[]VersionedItem, ms *schema.Schema, mi item.Versioned, sgl schema.List) VersionedItem { ps := lo.Map(ver.Parents().Values(), func(v version.Version, _ int) types.UUID { return types.UUID(v) }) @@ -18,9 +18,10 @@ func NewVersionedItem(ver item.Versioned, s *schema.Schema, assets *AssetContext }) var metaFields *[]Field if mi != nil && ms != nil { - metaFields = NewItem(mi.Value(), ms, nil).Fields + metaFields = NewItem(mi.Value(), schema.List{ms}, nil).Fields } - ii := NewItem(ver.Value(), s, assets) + + ii := NewItem(ver.Value(), append(sgl, s), assets) return VersionedItem{ Id: ii.Id, CreatedAt: ii.CreatedAt, @@ -35,23 +36,28 @@ func NewVersionedItem(ver item.Versioned, s *schema.Schema, assets *AssetContext } } -func NewItem(i *item.Item, s *schema.Schema, assets *AssetContext) Item { - fs := lo.FilterMap(i.Fields(), func(f *item.Field, _ int) (Field, bool) { - if s == nil { - return Field{}, false - } - sf := s.Field(f.FieldID()) - if sf == nil { - return Field{}, false - } +func NewItem(i *item.Item, ss schema.List, assets *AssetContext) Item { + var fs []Field + for _, s := range ss { + t := lo.FilterMap(i.Fields(), func(f *item.Field, _ int) (Field, bool) { + if s == nil { + return Field{}, false + } + sf := s.Field(f.FieldID()) + if sf == nil { + return Field{}, false + } - return Field{ - Id: f.FieldID().Ref(), - Type: lo.ToPtr(ToValueType(f.Type())), - Value: lo.ToPtr(ToValues(f.Value(), sf.Multiple(), assets)), - Key: util.ToPtrIfNotEmpty(sf.Key().String()), - }, true - }) + return Field{ + Id: f.FieldID().Ref(), + Type: lo.ToPtr(ToValueType(f.Type())), + Value: lo.ToPtr(ToValues(f.Value(), sf.Multiple(), assets)), + Key: util.ToPtrIfNotEmpty(sf.Key().String()), + ItemGroup: f.ItemGroup(), + }, true + }) + fs = append(fs, t...) + } return Item{ Id: i.ID().Ref(), diff --git a/server/pkg/integrationapi/schema.go b/server/pkg/integrationapi/schema.go index 2c74be2b12..106fccc008 100644 --- a/server/pkg/integrationapi/schema.go +++ b/server/pkg/integrationapi/schema.go @@ -36,9 +36,9 @@ type ItemModelSchemaItemChange struct { func NewItemModelSchema(i item.ItemModelSchema, assets *AssetContext) ItemModelSchema { return ItemModelSchema{ - Item: NewItem(i.Item, i.Schema, assets), + Item: NewItem(i.Item, schema.List{i.Schema}, assets), ReferencedItems: lo.Map(i.ReferencedItems, func(itm *version.Value[*item.Item], _ int) *VersionedItem { - return lo.ToPtr(NewVersionedItem(itm, nil, nil, nil, nil, nil)) + return lo.ToPtr(NewVersionedItem(itm, nil, nil, nil, nil, nil, nil)) }), Model: NewModel(i.Model, time.Time{}), Schema: NewSchema(i.Schema), diff --git a/server/pkg/integrationapi/types.gen.go b/server/pkg/integrationapi/types.gen.go index 3a71649ab0..fc93107513 100644 --- a/server/pkg/integrationapi/types.gen.go +++ b/server/pkg/integrationapi/types.gen.go @@ -59,6 +59,7 @@ const ( ValueTypeAsset ValueType = "asset" ValueTypeBool ValueType = "bool" ValueTypeDate ValueType = "date" + ValueTypeGroup ValueType = "group" ValueTypeInteger ValueType = "integer" ValueTypeMarkdown ValueType = "markdown" ValueTypeReference ValueType = "reference" @@ -180,10 +181,11 @@ type CommentAuthorType string // Field defines model for field. type Field struct { - Id *id.FieldID `json:"id,omitempty"` - Key *string `json:"key,omitempty"` - Type *ValueType `json:"type,omitempty"` - Value *interface{} `json:"value,omitempty"` + Id *id.FieldID `json:"id,omitempty"` + ItemGroup *id.ItemGroupID `json:"itemGroup,omitempty"` + Key *string `json:"key,omitempty"` + Type *ValueType `json:"type,omitempty"` + Value *interface{} `json:"value,omitempty"` } // File defines model for file. diff --git a/server/pkg/integrationapi/value.go b/server/pkg/integrationapi/value.go index 636ae719b8..c896f7f79f 100644 --- a/server/pkg/integrationapi/value.go +++ b/server/pkg/integrationapi/value.go @@ -33,6 +33,8 @@ func FromValueType(t *ValueType) value.Type { return value.TypeReference case ValueTypeUrl: return value.TypeURL + case ValueTypeGroup: + return value.TypeGroup default: return value.TypeUnknown } @@ -62,6 +64,8 @@ func ToValueType(t value.Type) ValueType { return ValueTypeReference case value.TypeURL: return ValueTypeUrl + case value.TypeGroup: + return ValueTypeGroup default: return "" } diff --git a/server/schemas/integration.yml b/server/schemas/integration.yml index 2a48d9260c..aadfb2701d 100644 --- a/server/schemas/integration.yml +++ b/server/schemas/integration.yml @@ -871,6 +871,7 @@ components: - integer - reference - url + - group schemaField: type: object properties: @@ -966,6 +967,9 @@ components: value: {} key: type: string + itemGroup: + x-go-type: id.ItemGroupID + type: string refOrVersion: type: object properties: