Skip to content

Commit c488de4

Browse files
committed
discriminator and mapping updates
1 parent a5f2b14 commit c488de4

File tree

4 files changed

+71
-13
lines changed

4 files changed

+71
-13
lines changed

bin/project

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,14 +1250,19 @@ x.lint.go() {
12501250
# golangci-lint run --config=.golangci.yml --allow-parallel-runners --fast --fix &>/dev/null || true
12511251
}
12521252

1253-
exhaustruct_lint() {
1253+
exhaustive_lint() {
12541254
local lint_config=$(
12551255
cat <<EOF
12561256
linters:
12571257
disable-all: true
12581258
enable:
12591259
- exhaustruct
1260+
- exhaustive
12601261
linters-settings:
1262+
exhaustive:
1263+
explicit-exhaustive-switch: true
1264+
explicit-exhaustive-map: true
1265+
default-case-required: true
12611266
exhaustruct:
12621267
# lint struct usage in all packages that use them
12631268
include:
@@ -1359,7 +1364,7 @@ x.test.backend.setup() {
13591364
x.test.backend() {
13601365
xsetup.backup
13611366
{ { {
1362-
exhaustruct_lint
1367+
exhaustive_lint
13631368

13641369
x.test.xo
13651370

internal/rest/api_work_item.go

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,12 @@ func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRe
4343
span.SetAttributes(tracing.MetadataAttribute(jsonBody))
4444
c.Request.Body = io.NopCloser(bytes.NewBuffer(jsonBody))
4545

46-
// body := &models.CreateWorkItemRequest{}
47-
// if err := json.Unmarshal(jsonBody, body); err != nil {
48-
// return nil, nil
49-
// }
46+
project, err := projectByDiscriminator(request.Body)
47+
if err != nil {
48+
renderErrorResponse(c, "Failed to get project", err)
49+
50+
return nil, nil
51+
}
5052

5153
var res any // depends on project
5254
b, err := request.Body.ValueByDiscriminator()
@@ -56,16 +58,18 @@ func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRe
5658
return nil, nil
5759
}
5860

59-
switch body := b.(type) {
60-
case models.CreateDemoWorkItemRequest:
61+
//exhaustive:enforce
62+
switch project {
63+
case models.ProjectNameDemo:
64+
body, _ := b.(models.CreateDemoWorkItemRequest)
6165
workItem, err := h.svc.DemoWorkItem.Create(ctx, tx, caller, services.DemoWorkItemCreateParams{
6266
DemoWorkItemCreateParams: repos.DemoWorkItemCreateParams{
6367
DemoProject: body.DemoProject,
6468
Base: body.Base,
6569
},
6670
WorkItemCreateParams: services.WorkItemCreateParams{
67-
// TagIDs: body.TagIDs,
68-
// Members: body.Members,
71+
TagIDs: body.TagIDs,
72+
Members: restMembersToServices(body.Members),
6973
},
7074
})
7175
if err != nil {
@@ -78,8 +82,18 @@ func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRe
7882
WorkItemBase: fillBaseWorkItemResponse(workItem),
7983
DemoWorkItem: *workItem.DemoWorkItemJoin,
8084
}
81-
case models.CreateDemoTwoWorkItemRequest:
82-
workItem, err := h.svc.DemoTwoWorkItem.Create(ctx, tx, caller, services.DemoTwoWorkItemCreateParams{})
85+
case models.ProjectNameDemoTwo:
86+
body, _ := b.(models.CreateDemoTwoWorkItemRequest)
87+
workItem, err := h.svc.DemoTwoWorkItem.Create(ctx, tx, caller, services.DemoTwoWorkItemCreateParams{
88+
DemoTwoWorkItemCreateParams: repos.DemoTwoWorkItemCreateParams{
89+
DemoTwoProject: body.DemoTwoProject,
90+
Base: body.Base,
91+
},
92+
WorkItemCreateParams: services.WorkItemCreateParams{
93+
TagIDs: body.TagIDs,
94+
Members: restMembersToServices(body.Members),
95+
},
96+
})
8397
if err != nil {
8498
renderErrorResponse(c, "Could not create work item", err)
8599

@@ -91,7 +105,7 @@ func (h *StrictHandlers) CreateWorkitem(c *gin.Context, request CreateWorkitemRe
91105
DemoTwoWorkItem: *workItem.DemoTwoWorkItemJoin,
92106
}
93107
default:
94-
renderErrorResponse(c, "Unknown body", internal.NewErrorf(models.ErrorCodeUnknown, "%+v", b))
108+
renderErrorResponse(c, "Unknown discriminator", internal.NewErrorf(models.ErrorCodeUnknown, "%+v", b))
95109

96110
return nil, nil
97111
}

internal/rest/discriminator.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package rest
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/danicc097/openapi-go-gin-postgres-sqlc/internal/repos/postgresql/gen/models"
7+
)
8+
9+
type PolymorphicBody interface {
10+
Discriminator() (string, error)
11+
}
12+
13+
func projectByDiscriminator(b PolymorphicBody) (models.ProjectName, error) {
14+
d, err := b.Discriminator()
15+
if err != nil {
16+
return "", fmt.Errorf("could not get project discriminator: %w", err)
17+
}
18+
19+
return models.ProjectName(d), nil
20+
}

internal/rest/service_mappings.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package rest
2+
3+
import (
4+
"github.com/danicc097/openapi-go-gin-postgres-sqlc/internal/repos/postgresql/gen/models"
5+
"github.com/danicc097/openapi-go-gin-postgres-sqlc/internal/services"
6+
)
7+
8+
// TODO: cannot use body.Members (variable of type []models.ServicesMember) as []services.Member
9+
// how should mapping be handled for equivalent structs from oapi-codegen, ideally automagically?
10+
func restMembersToServices(mm []models.ServicesMember) []services.Member {
11+
members := make([]services.Member, 0, len(mm))
12+
for i, member := range mm {
13+
members[i] = services.Member{
14+
UserID: member.UserID,
15+
Role: member.Role,
16+
}
17+
}
18+
return members
19+
}

0 commit comments

Comments
 (0)