Skip to content

Commit

Permalink
feat(server): support group fields in integration api (#903)
Browse files Browse the repository at this point in the history
* get group fields

* support groups in integration

* Merge branch 'main' of https://github.com/reearth/reearth-cms into group/integration-webhook

# Conflicts:
#	server/internal/adapter/integration/item.go
#	server/internal/adapter/integration/server.gen.go
#	server/pkg/integrationapi/convert.go
#	server/pkg/integrationapi/item.go
#	server/pkg/integrationapi/schema.go
  • Loading branch information
mimoham24 authored Oct 27, 2023
1 parent 971e96b commit df04dd1
Show file tree
Hide file tree
Showing 9 changed files with 184 additions and 99 deletions.
9 changes: 5 additions & 4 deletions server/internal/adapter/integration/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
}
128 changes: 98 additions & 30 deletions server/internal/adapter/integration/item.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)),
Expand Down Expand Up @@ -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)),
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
Expand All @@ -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 {
Expand Down Expand Up @@ -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)
Expand Down
78 changes: 39 additions & 39 deletions server/internal/adapter/integration/server.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion server/pkg/integrationapi/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
44 changes: 25 additions & 19 deletions server/pkg/integrationapi/item.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
})
Expand All @@ -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,
Expand All @@ -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(),
Expand Down
4 changes: 2 additions & 2 deletions server/pkg/integrationapi/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
Loading

0 comments on commit df04dd1

Please sign in to comment.