Skip to content

Commit 7afadcc

Browse files
feat: Add PreResourceResolver to accommodate list/detail pattern (#46)
* feat: Add PreResourceResolver to accomdate list/detail pattern * fix: Fix some codegen related to preresourceresolver * Update schema/table.go Co-authored-by: Herman Schaaf <[email protected]> Co-authored-by: Herman Schaaf <[email protected]>
1 parent 733c942 commit 7afadcc

File tree

5 files changed

+32
-11
lines changed

5 files changed

+32
-11
lines changed

codegen/golang.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ func NewTableFromStruct(name string, obj interface{}, opts ...TableOptions) (*Ta
159159
}
160160
t.Columns = append(t.Columns, column)
161161
}
162+
162163
return &t, nil
163164
}
164165

codegen/table.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ type ResourceDefinition struct {
1212
type TableDefinition struct {
1313
Name string
1414
Description string
15-
Columns []ColumnDefinition
16-
Relations []*TableDefinition
15+
Columns ColumnDefinitions
16+
Relations []string
1717

1818
Resolver string
1919
IgnoreError string
2020
Multiplex string
2121
PostResourceResolver string
22+
PreResourceResolver string
2223
Options schema.TableCreationOptions
2324
nameTransformer func(string) string
2425
skipFields []string

codegen/templates/table.go.tpl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
{{- end}}
66
{{- if .Resolver}}
77
Resolver: {{.Resolver}},
8+
{{- end}}
9+
{{- if .PreResourceResolver}}
10+
PreResourceResolver: {{.PreResourceResolver}},
811
{{- end}}
912
{{- if .Multiplex}}
1013
Multiplex: {{.Multiplex}},
@@ -17,7 +20,7 @@
1720
},
1821
{{with .Relations}}
1922
Relations: []*schema.Table{
20-
{{range .}}{{template "table.go.tpl" .}}{{end}}
23+
{{range .}}{{.}}{{end}},
2124
},
2225
{{end}}
2326
}

schema/resource.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ func (r *Resource) Set(key string, value interface{}) error {
7272
return nil
7373
}
7474

75+
// Override original item (this is useful for apis that follow list/details pattern)
76+
func (r *Resource) SetItem(item interface{}) {
77+
r.Item = item
78+
}
79+
7580
func (r *Resource) Id() uuid.UUID {
7681
if r.Data[CqIdColumn.Name] == nil {
7782
return uuid.UUID{}

schema/table.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,12 @@ type Table struct {
4343
IgnoreError IgnoreErrorFunc `json:"-"`
4444
// Multiplex returns re-purposed meta clients. The sdk will execute the table with each of them
4545
Multiplex func(meta ClientMeta) []ClientMeta `json:"-"`
46-
// Post resource resolver is called after all columns have been resolved, and before resource is inserted to database.
46+
// PostResourceResolver is called after all columns have been resolved, but before the Resource is sent to be inserted. The ordering of resolvers is:
47+
// (Table) Resolver → PreResourceResolver → ColumnResolvers → PostResourceResolver
4748
PostResourceResolver RowResolver `json:"-"`
49+
// PreResourceResolver is called before all columns are resolved but after Resource is created. The ordering of resolvers is:
50+
// (Table) Resolver → PreResourceResolver → ColumnResolvers → PostResourceResolver
51+
PreResourceResolver RowResolver `json:"-"`
4852
// Options allow modification of how the table is defined when created
4953
Options TableCreationOptions `json:"options"`
5054

@@ -200,6 +204,13 @@ func (t Table) Resolve(ctx context.Context, meta ClientMeta, syncTime time.Time,
200204
totalResources += len(objects)
201205
for i := range objects {
202206
resource := NewResourceData(&t, parent, syncTime, objects[i])
207+
if t.PreResourceResolver != nil {
208+
if err := t.PreResourceResolver(ctx, meta, resource); err != nil {
209+
meta.Logger().Error().Str("table_name", t.Name).Err(err).Msg("pre resource resolver failed")
210+
} else {
211+
meta.Logger().Trace().Str("table_name", t.Name).Msg("pre resource resolver finished successfully")
212+
}
213+
}
203214
t.resolveColumns(ctx, meta, resource)
204215
if t.PostResourceResolver != nil {
205216
meta.Logger().Trace().Str("table_name", t.Name).Msg("post resource resolver started")
@@ -226,22 +237,22 @@ func (t Table) Resolve(ctx context.Context, meta ClientMeta, syncTime time.Time,
226237
func (t Table) resolveColumns(ctx context.Context, meta ClientMeta, resource *Resource) {
227238
for _, c := range t.Columns {
228239
if c.Resolver != nil {
229-
meta.Logger().Trace().Str("colum_name", c.Name).Str("table_name", t.Name).Msg("column resolver custom started")
240+
meta.Logger().Trace().Str("column_name", c.Name).Str("table_name", t.Name).Msg("column resolver custom started")
230241
if err := c.Resolver(ctx, meta, resource, c); err != nil {
231-
meta.Logger().Error().Str("colum_name", c.Name).Str("table_name", t.Name).Err(err).Msg("column resolver finished with error")
242+
meta.Logger().Error().Str("column_name", c.Name).Str("table_name", t.Name).Err(err).Msg("column resolver finished with error")
232243
}
233-
meta.Logger().Trace().Str("colum_name", c.Name).Str("table_name", t.Name).Msg("column resolver finished successfully")
244+
meta.Logger().Trace().Str("column_name", c.Name).Str("table_name", t.Name).Msg("column resolver finished successfully")
234245
} else {
235-
meta.Logger().Trace().Str("colum_name", c.Name).Str("table_name", t.Name).Msg("column resolver default started")
246+
meta.Logger().Trace().Str("column_name", c.Name).Str("table_name", t.Name).Msg("column resolver default started")
236247
// base use case: try to get column with CamelCase name
237248
v := funk.Get(resource.Item, strcase.ToCamel(c.Name), funk.WithAllowZero())
238249
if v != nil {
239250
if err := resource.Set(c.Name, v); err != nil {
240-
meta.Logger().Error().Str("colum_name", c.Name).Str("table_name", t.Name).Err(err).Msg("column resolver default finished with error")
251+
meta.Logger().Error().Str("column_name", c.Name).Str("table_name", t.Name).Err(err).Msg("column resolver default finished with error")
241252
}
242-
meta.Logger().Trace().Str("colum_name", c.Name).Str("table_name", t.Name).Msg("column resolver default finished successfully")
253+
meta.Logger().Trace().Str("column_name", c.Name).Str("table_name", t.Name).Msg("column resolver default finished successfully")
243254
} else {
244-
meta.Logger().Trace().Str("colum_name", c.Name).Str("table_name", t.Name).Msg("column resolver default finished successfully with nil")
255+
meta.Logger().Trace().Str("column_name", c.Name).Str("table_name", t.Name).Msg("column resolver default finished successfully with nil")
245256
}
246257
}
247258
}

0 commit comments

Comments
 (0)