From 1e00ca7c0d1d98e522a3cc9cd48855920515d67c Mon Sep 17 00:00:00 2001 From: mimoham24 <69579255+mimoham24@users.noreply.github.com> Date: Wed, 8 Feb 2023 07:23:50 +0400 Subject: [PATCH] fix(server): make widget area gap optional (#383) Co-authored-by: rot1024 --- server/internal/adapter/gql/generated.go | 39 ++++++------------- .../gql/gqldataloader/workspaceloader_gen.go | 18 ++++----- .../gql/gqlmodel/convert_scene_align.go | 2 +- .../adapter/gql/gqlmodel/models_gen.go | 2 +- .../mongo/mongodoc/scene_align.go | 2 +- server/internal/usecase/interactor/scene.go | 2 +- server/pkg/scene/builder/encoder.go | 2 +- server/pkg/scene/builder/scene_test.go | 2 +- server/pkg/scene/widget_area.go | 18 ++++----- server/pkg/scene/widget_area_test.go | 30 +++++++------- server/pkg/scene/widget_section.go | 6 +-- server/schema.graphql | 4 +- 12 files changed, 57 insertions(+), 70 deletions(-) diff --git a/server/internal/adapter/gql/generated.go b/server/internal/adapter/gql/generated.go index ee10155c44..bc7907f53e 100644 --- a/server/internal/adapter/gql/generated.go +++ b/server/internal/adapter/gql/generated.go @@ -6845,8 +6845,8 @@ type WidgetSection { type WidgetArea { widgetIds: [ID!]! align: WidgetAreaAlign! - padding: WidgetAreaPadding! - gap: Int! + padding: WidgetAreaPadding + gap: Int centered: Boolean! background: String } @@ -42385,14 +42385,11 @@ func (ec *executionContext) _WidgetArea_padding(ctx context.Context, field graph return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } res := resTmp.(*gqlmodel.WidgetAreaPadding) fc.Result = res - return ec.marshalNWidgetAreaPadding2ᚖgithubᚗcomᚋreearthᚋreearthᚋserverᚋinternalᚋadapterᚋgqlᚋgqlmodelᚐWidgetAreaPadding(ctx, field.Selections, res) + return ec.marshalOWidgetAreaPadding2ᚖgithubᚗcomᚋreearthᚋreearthᚋserverᚋinternalᚋadapterᚋgqlᚋgqlmodelᚐWidgetAreaPadding(ctx, field.Selections, res) } func (ec *executionContext) fieldContext_WidgetArea_padding(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { @@ -42439,14 +42436,11 @@ func (ec *executionContext) _WidgetArea_gap(ctx context.Context, field graphql.C return graphql.Null } if resTmp == nil { - if !graphql.HasFieldError(ctx, fc) { - ec.Errorf(ctx, "must not be null") - } return graphql.Null } - res := resTmp.(int) + res := resTmp.(*int) fc.Result = res - return ec.marshalNInt2int(ctx, field.Selections, res) + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) } func (ec *executionContext) fieldContext_WidgetArea_gap(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { @@ -56435,16 +56429,10 @@ func (ec *executionContext) _WidgetArea(ctx context.Context, sel ast.SelectionSe out.Values[i] = ec._WidgetArea_padding(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } case "gap": out.Values[i] = ec._WidgetArea_gap(ctx, field, obj) - if out.Values[i] == graphql.Null { - invalids++ - } case "centered": out.Values[i] = ec._WidgetArea_centered(ctx, field, obj) @@ -59746,16 +59734,6 @@ func (ec *executionContext) marshalNWidgetAreaAlign2githubᚗcomᚋreearthᚋree return v } -func (ec *executionContext) marshalNWidgetAreaPadding2ᚖgithubᚗcomᚋreearthᚋreearthᚋserverᚋinternalᚋadapterᚋgqlᚋgqlmodelᚐWidgetAreaPadding(ctx context.Context, sel ast.SelectionSet, v *gqlmodel.WidgetAreaPadding) graphql.Marshaler { - if v == nil { - if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { - ec.Errorf(ctx, "the requested element is null which the schema does not allow") - } - return graphql.Null - } - return ec._WidgetAreaPadding(ctx, sel, v) -} - func (ec *executionContext) unmarshalNWidgetAreaType2githubᚗcomᚋreearthᚋreearthᚋserverᚋinternalᚋadapterᚋgqlᚋgqlmodelᚐWidgetAreaType(ctx context.Context, v interface{}) (gqlmodel.WidgetAreaType, error) { var res gqlmodel.WidgetAreaType err := res.UnmarshalGQL(v) @@ -61186,6 +61164,13 @@ func (ec *executionContext) marshalOWidgetAreaAlign2ᚖgithubᚗcomᚋreearthᚋ return v } +func (ec *executionContext) marshalOWidgetAreaPadding2ᚖgithubᚗcomᚋreearthᚋreearthᚋserverᚋinternalᚋadapterᚋgqlᚋgqlmodelᚐWidgetAreaPadding(ctx context.Context, sel ast.SelectionSet, v *gqlmodel.WidgetAreaPadding) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._WidgetAreaPadding(ctx, sel, v) +} + func (ec *executionContext) unmarshalOWidgetAreaPaddingInput2ᚖgithubᚗcomᚋreearthᚋreearthᚋserverᚋinternalᚋadapterᚋgqlᚋgqlmodelᚐWidgetAreaPaddingInput(ctx context.Context, v interface{}) (*gqlmodel.WidgetAreaPaddingInput, error) { if v == nil { return nil, nil diff --git a/server/internal/adapter/gql/gqldataloader/workspaceloader_gen.go b/server/internal/adapter/gql/gqldataloader/workspaceloader_gen.go index 43d9774672..9b1e7a2cdf 100644 --- a/server/internal/adapter/gql/gqldataloader/workspaceloader_gen.go +++ b/server/internal/adapter/gql/gqldataloader/workspaceloader_gen.go @@ -48,13 +48,13 @@ type WorkspaceLoader struct { // the current batch. keys will continue to be collected until timeout is hit, // then everything will be sent to the fetch method and out to the listeners - batch *teamLoaderBatch + batch *workspaceLoaderBatch // mutex to prevent races mu sync.Mutex } -type teamLoaderBatch struct { +type workspaceLoaderBatch struct { keys []gqlmodel.ID data []*gqlmodel.Team error []error @@ -62,12 +62,12 @@ type teamLoaderBatch struct { done chan struct{} } -// Load a Workspace by key, batching and caching will be applied automatically +// Load a Team by key, batching and caching will be applied automatically func (l *WorkspaceLoader) Load(key gqlmodel.ID) (*gqlmodel.Team, error) { return l.LoadThunk(key)() } -// LoadThunk returns a function that when called will block waiting for a Workspace. +// LoadThunk returns a function that when called will block waiting for a Team. // This method should be used if you want one goroutine to make requests to many // different data loaders without blocking until the thunk is called. func (l *WorkspaceLoader) LoadThunk(key gqlmodel.ID) func() (*gqlmodel.Team, error) { @@ -79,7 +79,7 @@ func (l *WorkspaceLoader) LoadThunk(key gqlmodel.ID) func() (*gqlmodel.Team, err } } if l.batch == nil { - l.batch = &teamLoaderBatch{done: make(chan struct{})} + l.batch = &workspaceLoaderBatch{done: make(chan struct{})} } batch := l.batch pos := batch.keyIndex(l, key) @@ -128,7 +128,7 @@ func (l *WorkspaceLoader) LoadAll(keys []gqlmodel.ID) ([]*gqlmodel.Team, []error return teams, errors } -// LoadAllThunk returns a function that when called will block waiting for a Workspaces. +// LoadAllThunk returns a function that when called will block waiting for a Teams. // This method should be used if you want one goroutine to make requests to many // different data loaders without blocking until the thunk is called. func (l *WorkspaceLoader) LoadAllThunk(keys []gqlmodel.ID) func() ([]*gqlmodel.Team, []error) { @@ -178,7 +178,7 @@ func (l *WorkspaceLoader) unsafeSet(key gqlmodel.ID, value *gqlmodel.Team) { // keyIndex will return the location of the key in the batch, if its not found // it will add the key to the batch -func (b *teamLoaderBatch) keyIndex(l *WorkspaceLoader, key gqlmodel.ID) int { +func (b *workspaceLoaderBatch) keyIndex(l *WorkspaceLoader, key gqlmodel.ID) int { for i, existingKey := range b.keys { if key == existingKey { return i @@ -202,7 +202,7 @@ func (b *teamLoaderBatch) keyIndex(l *WorkspaceLoader, key gqlmodel.ID) int { return pos } -func (b *teamLoaderBatch) startTimer(l *WorkspaceLoader) { +func (b *workspaceLoaderBatch) startTimer(l *WorkspaceLoader) { time.Sleep(l.wait) l.mu.Lock() @@ -218,7 +218,7 @@ func (b *teamLoaderBatch) startTimer(l *WorkspaceLoader) { b.end(l) } -func (b *teamLoaderBatch) end(l *WorkspaceLoader) { +func (b *workspaceLoaderBatch) end(l *WorkspaceLoader) { b.data, b.error = l.fetch(b.keys) close(b.done) } diff --git a/server/internal/adapter/gql/gqlmodel/convert_scene_align.go b/server/internal/adapter/gql/gqlmodel/convert_scene_align.go index 7d079d9aed..cb5a66ee87 100644 --- a/server/internal/adapter/gql/gqlmodel/convert_scene_align.go +++ b/server/internal/adapter/gql/gqlmodel/convert_scene_align.go @@ -39,7 +39,7 @@ func ToWidgetSection(s *scene.WidgetSection) *WidgetSection { } func ToWidgetAreaPadding(p *scene.WidgetAreaPadding) *WidgetAreaPadding { if p == nil { - return &WidgetAreaPadding{} + return nil } return &WidgetAreaPadding{ diff --git a/server/internal/adapter/gql/gqlmodel/models_gen.go b/server/internal/adapter/gql/gqlmodel/models_gen.go index 4e90610a47..f54567f56e 100644 --- a/server/internal/adapter/gql/gqlmodel/models_gen.go +++ b/server/internal/adapter/gql/gqlmodel/models_gen.go @@ -1353,7 +1353,7 @@ type WidgetArea struct { WidgetIds []ID `json:"widgetIds"` Align WidgetAreaAlign `json:"align"` Padding *WidgetAreaPadding `json:"padding"` - Gap int `json:"gap"` + Gap *int `json:"gap"` Centered bool `json:"centered"` Background *string `json:"background"` } diff --git a/server/internal/infrastructure/mongo/mongodoc/scene_align.go b/server/internal/infrastructure/mongo/mongodoc/scene_align.go index 3a1c7555cf..42600f4f25 100644 --- a/server/internal/infrastructure/mongo/mongodoc/scene_align.go +++ b/server/internal/infrastructure/mongo/mongodoc/scene_align.go @@ -25,7 +25,7 @@ type WidgetAreaDocument struct { WidgetIDs []string Align string Padding *WidgetAreaPaddingDocument - Gap int + Gap *int Centered bool Background *string } diff --git a/server/internal/usecase/interactor/scene.go b/server/internal/usecase/interactor/scene.go index 48a4894ac5..e58e1f22cc 100644 --- a/server/internal/usecase/interactor/scene.go +++ b/server/internal/usecase/interactor/scene.go @@ -353,7 +353,7 @@ func (i *Scene) UpdateWidgetAlignSystem(ctx context.Context, param interfaces.Up area.SetPadding(param.Padding) } if param.Gap != nil { - area.SetGap(*param.Gap) + area.SetGap(param.Gap) } if param.Centered != nil { area.SetCentered(*param.Centered) diff --git a/server/pkg/scene/builder/encoder.go b/server/pkg/scene/builder/encoder.go index 50610ded6b..dbee9b3a6e 100644 --- a/server/pkg/scene/builder/encoder.go +++ b/server/pkg/scene/builder/encoder.go @@ -166,7 +166,7 @@ type widgetAreaJSON struct { WidgetIDs []string `json:"widgetIds"` Align string `json:"align"` Padding *widgetAreaPaddingJSON `json:"padding"` - Gap int `json:"gap"` + Gap *int `json:"gap"` Centered bool `json:"centered"` Background *string `json:"background"` } diff --git a/server/pkg/scene/builder/scene_test.go b/server/pkg/scene/builder/scene_test.go index a27e2c1c5b..11e7b52ff4 100644 --- a/server/pkg/scene/builder/scene_test.go +++ b/server/pkg/scene/builder/scene_test.go @@ -113,7 +113,7 @@ func TestBuildWidgetAlignSystem(t *testing.T) { Left: 0, Right: 0, }, - Gap: 0, + Gap: nil, Centered: false, Background: nil, }, diff --git a/server/pkg/scene/widget_area.go b/server/pkg/scene/widget_area.go index b1c6b9b93e..2f016fc321 100644 --- a/server/pkg/scene/widget_area.go +++ b/server/pkg/scene/widget_area.go @@ -10,7 +10,7 @@ type WidgetArea struct { widgetIds WidgetIDList align WidgetAlignType padding *WidgetAreaPadding - gap int + gap *int centered bool background *string } @@ -23,7 +23,7 @@ const ( WidgetAlignEnd WidgetAlignType = "end" ) -func NewWidgetArea(widgetIds []WidgetID, align WidgetAlignType, padding *WidgetAreaPadding, gap int, centered bool, background *string) *WidgetArea { +func NewWidgetArea(widgetIds []WidgetID, align WidgetAlignType, padding *WidgetAreaPadding, gap *int, centered bool, background *string) *WidgetArea { wa := &WidgetArea{} wa.AddAll(widgetIds) wa.SetAlignment(align) @@ -58,15 +58,15 @@ func (a *WidgetArea) Padding() *WidgetAreaPadding { return nil } - return a.padding + return util.CloneRef(a.padding) } -func (a *WidgetArea) Gap() int { +func (a *WidgetArea) Gap() *int { if a == nil { - return 0 + return nil } - return a.gap + return util.CloneRef(a.gap) } func (a *WidgetArea) Centered() bool { @@ -131,11 +131,11 @@ func (a *WidgetArea) SetPadding(ap *WidgetAreaPadding) { return } - a.padding = ap + a.padding = util.CloneRef(ap) } -func (a *WidgetArea) SetGap(g int) { - a.gap = g +func (a *WidgetArea) SetGap(g *int) { + a.gap = util.CloneRef(g) } func (a *WidgetArea) SetCentered(c bool) { diff --git a/server/pkg/scene/widget_area_test.go b/server/pkg/scene/widget_area_test.go index afa178a84b..db54fe029e 100644 --- a/server/pkg/scene/widget_area_test.go +++ b/server/pkg/scene/widget_area_test.go @@ -14,7 +14,7 @@ func TestWidgetArea(t *testing.T) { WidgetIds WidgetIDList Align WidgetAlignType Padding *WidgetAreaPadding - Gap int + Gap *int Centered bool Background *string } @@ -50,7 +50,7 @@ func TestWidgetArea(t *testing.T) { left: 5, right: 5, }, - Gap: 40, + Gap: lo.ToPtr(40), Centered: true, Background: lo.ToPtr("#ffffff"), }, @@ -63,7 +63,7 @@ func TestWidgetArea(t *testing.T) { left: 5, right: 5, }, - gap: 40, + gap: lo.ToPtr(40), centered: true, background: lo.ToPtr("#ffffff"), }, @@ -90,13 +90,13 @@ func TestWidgetArea(t *testing.T) { func TestWidgetArea_WidgetIDs(t *testing.T) { wid := NewWidgetID() - wa := NewWidgetArea(WidgetIDList{wid}, WidgetAlignStart, nil, 0, false, nil) + wa := NewWidgetArea(WidgetIDList{wid}, WidgetAlignStart, nil, nil, false, nil) assert.Equal(t, wa.widgetIds, wa.WidgetIDs()) assert.Nil(t, (*WidgetArea)(nil).WidgetIDs()) } func TestWidgetArea_Alignment(t *testing.T) { - wa := NewWidgetArea(nil, WidgetAlignEnd, nil, 0, false, nil) + wa := NewWidgetArea(nil, WidgetAlignEnd, nil, nil, false, nil) assert.Equal(t, WidgetAlignEnd, wa.Alignment()) assert.Equal(t, WidgetAlignType(""), (*WidgetArea)(nil).Alignment()) } @@ -135,7 +135,7 @@ func TestWidgetArea_Find(t *testing.T) { var wa *WidgetArea if !tc.Nil { - wa = NewWidgetArea(WidgetIDList{wid}, WidgetAlignStart, nil, 0, false, nil) + wa = NewWidgetArea(WidgetIDList{wid}, WidgetAlignStart, nil, nil, false, nil) } assert.Equal(t, tc.Expected, wa.Find(tc.Input)) }) @@ -188,7 +188,7 @@ func TestWidgetArea_Add(t *testing.T) { return } - wa := NewWidgetArea(WidgetIDList{wid1, wid2}, WidgetAlignStart, nil, 0, false, nil) + wa := NewWidgetArea(WidgetIDList{wid1, wid2}, WidgetAlignStart, nil, nil, false, nil) wa.Add(tc.Input, tc.Input2) assert.Equal(t, tc.Expected, wa.WidgetIDs()) }) @@ -231,7 +231,7 @@ func TestWidgetArea_AddAll(t *testing.T) { return } - wa := NewWidgetArea(nil, WidgetAlignStart, nil, 0, false, nil) + wa := NewWidgetArea(nil, WidgetAlignStart, nil, nil, false, nil) wa.AddAll(tc.Input) assert.Equal(t, tc.Expected, wa.WidgetIDs()) }) @@ -269,7 +269,7 @@ func TestWidgetArea_SetAlignment(t *testing.T) { var wa *WidgetArea if !tc.Nil { - wa = NewWidgetArea(nil, WidgetAlignStart, nil, 0, false, nil) + wa = NewWidgetArea(nil, WidgetAlignStart, nil, nil, false, nil) } wa.SetAlignment(tc.Input) if !tc.Nil { @@ -312,7 +312,7 @@ func TestWidgetArea_Remove(t *testing.T) { var wa *WidgetArea if !tc.Nil { - wa = NewWidgetArea(WidgetIDList{wid}, "", nil, 0, false, nil) + wa = NewWidgetArea(WidgetIDList{wid}, "", nil, nil, false, nil) } wa.Remove(tc.Input) if !tc.Nil { @@ -358,7 +358,7 @@ func TestWidgetArea_Move(t *testing.T) { var wa *WidgetArea if !tc.Nil { - wa = NewWidgetArea(WidgetIDList{wid, wid2, wid3}, "", nil, 0, false, nil) + wa = NewWidgetArea(WidgetIDList{wid, wid2, wid3}, "", nil, nil, false, nil) } wa.Move(tc.Input1, tc.Input2) if !tc.Nil { @@ -379,10 +379,12 @@ func TestWidgetArea_Background(t *testing.T) { func TestWidgetArea_Gap(t *testing.T) { var wa *WidgetArea - assert.Equal(t, 0, wa.Gap()) + var v *int + assert.Equal(t, v, wa.Gap()) wa = &WidgetArea{} - wa.SetGap(39) - assert.Equal(t, 39, wa.Gap()) + v = lo.ToPtr(39) + wa.SetGap(v) + assert.Equal(t, v, wa.Gap()) } func TestWidgetArea_Centered(t *testing.T) { diff --git a/server/pkg/scene/widget_section.go b/server/pkg/scene/widget_section.go index dba12ffece..c0f93ab25d 100644 --- a/server/pkg/scene/widget_section.go +++ b/server/pkg/scene/widget_section.go @@ -27,17 +27,17 @@ func (s *WidgetSection) Area(t WidgetAreaType) *WidgetArea { switch t { case WidgetAreaTop: if s.top == nil { - s.top = NewWidgetArea(nil, WidgetAlignStart, nil, 0, false, nil) + s.top = NewWidgetArea(nil, WidgetAlignStart, nil, nil, false, nil) } return s.top case WidgetAreaMiddle: if s.middle == nil { - s.middle = NewWidgetArea(nil, WidgetAlignStart, nil, 0, false, nil) + s.middle = NewWidgetArea(nil, WidgetAlignStart, nil, nil, false, nil) } return s.middle case WidgetAreaBottom: if s.bottom == nil { - s.bottom = NewWidgetArea(nil, WidgetAlignStart, nil, 0, false, nil) + s.bottom = NewWidgetArea(nil, WidgetAlignStart, nil, nil, false, nil) } return s.bottom } diff --git a/server/schema.graphql b/server/schema.graphql index 4d854cbd09..eb5a3fac33 100644 --- a/server/schema.graphql +++ b/server/schema.graphql @@ -419,8 +419,8 @@ type WidgetSection { type WidgetArea { widgetIds: [ID!]! align: WidgetAreaAlign! - padding: WidgetAreaPadding! - gap: Int! + padding: WidgetAreaPadding + gap: Int centered: Boolean! background: String }