Skip to content

Commit a96d532

Browse files
authored
Dev (#283)
* update oapi codegen and notes for simpler rest server types gen * ignoring db struct gen in rest server gen * use db models in oapi server code * user fixture with joins and update test * notes * update project config * api key expiration check * update gen and notes for query parameters in pagination
1 parent 56d634d commit a96d532

File tree

109 files changed

+1769
-7527
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+1769
-7527
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ cp openapi-go.code-workspace.example openapi-go.code-workspace # edit as desired
105105
project bootstrap # dependency and tools interactive installation
106106
project gen
107107
project recreate-shared-services
108-
project run-dev
108+
project run.all
109109
```
110110

111111
For first test run:

bin/project

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ x.gen.pregen() {
340340
# NOTE: swaggest won't generate for arrays of structs. use a struct with array fields instead.
341341
generate_structs_map # structs might have been removed in the meantime
342342

343-
go build -o $BUILD_DIR/codegen cmd/codegen/main.go || touch "$failed_tool_build_marker" # xo gen may create/update models.
343+
go build -o $BUILD_DIR/codegen cmd/codegen/main.go || mark_failed_tool_build # xo gen may create/update models.
344344

345345
local rest_structs=() refs=() spec_schemas=()
346346
declare -A rest_schema_lookup spec_schema_lookup
@@ -849,18 +849,21 @@ x.gen.client-server() {
849849
sed "s/\$ref: '\#\//\$ref: '$SPEC_PATH\#\//g" $SPEC_PATH >"$paths_file"
850850

851851
# yq e 'del(.components)' -i "$paths_file" # dont delete since recent oapi-codegen does some checks even if we are not generating types
852-
go build -o $BUILD_DIR/oapi-codegen cmd/oapi-codegen/main.go || touch "$failed_tool_build_marker" # templates are embedded, required rebuild
852+
go build -o $BUILD_DIR/oapi-codegen cmd/oapi-codegen/main.go || mark_failed_tool_build # templates are embedded, required rebuild
853853

854-
# Generated types in models pkg will be used in services, repos, db, but rest package must use original
855-
# models from rest/models.go (source of generated spec schemas)
856-
# and not the generated ones to avoid (a lot of) unnecessary conversions.
857854
oapi-codegen --config internal/models/oapi-codegen-types.yaml "$SPEC_PATH" || err "Failed types generation" &
858855
oapi-codegen --config internal/rest/oapi-codegen-server.yaml --models-pkg models --server-types "$server_types_list" --types "$types_list" "$paths_file" || err "Failed server generation" &
859856
oapi-codegen --config internal/rest/oapi-codegen-test-client.yaml "$SPEC_PATH" || err "Failed client generation" &
860-
oapi-codegen --config internal/client/oapi-codegen-client.yaml "$SPEC_PATH" || err "Failed client generation" &
857+
# not used now. may be useful for a cli at some point
858+
# oapi-codegen --config internal/client/oapi-codegen-client.yaml "$SPEC_PATH" || err "Failed client generation" &
861859

862860
wait_without_error
863861

862+
sed -i 's/ \*Db\([A-Z]\)/ \*db\.\1/g; s/\[\]Db\([A-Z]\)/\[\]db\.\1/g; s/ Db\([A-Z]\)/ db\.\1/g; s/ \(\(externalRef0\.\)\?Db\)\([A-Z]\)/ db\.\3/g' internal/rest/openapi_server.gen.go
863+
sed -i 's/ \*Db\([A-Z]\)/ \*db\.\1/g; s/\[\]Db\([A-Z]\)/\[\]db\.\1/g; s/ Db\([A-Z]\)/ db\.\1/g; s/ \(\(externalRef0\.\)\?Db\)\([A-Z]\)/ db\.\3/g' internal/rest/openapi_client_gen_test.go
864+
# db already imports models pkg
865+
# sed -i 's/ \*Db\([A-Z]\)/ \*db\.\1/g; s/\[\]Db\([A-Z]\)/\[\]db\.\1/g; s/ Db\([A-Z]\)/ db\.\1/g; s/ \(\(externalRef0\.\)\?Db\)\([A-Z]\)/ db\.\3/g' internal/models/openapi_types.gen.go
866+
864867
# local configs=(
865868
# "internal/models/oapi-codegen-types.yaml"
866869
# "internal/rest/oapi-codegen-server.yaml"
@@ -1048,7 +1051,7 @@ x.gen() {
10481051
{ retry 5 go generate ./...; } &
10491052
{ retry 5 x.gen.xo; } &
10501053
{ retry 5 x.gen.sqlc; } &
1051-
x.gen.jet &
1054+
x.gen.jet >/dev/null &
10521055
generate_repo_constructor &
10531056

10541057
wait_without_error || err Failed jobs
@@ -1087,11 +1090,11 @@ x.gen.build-tools() {
10871090
mkdir -p $out_dir
10881091
for cmd in jet oapi-codegen codegen ast-parser; do
10891092
echo "Building $cmd..."
1090-
{ go build -o $out_dir/$cmd cmd/$cmd/main.go || touch "$failed_tool_build_marker"; } &
1093+
{ go build -o $out_dir/$cmd cmd/$cmd/main.go || mark_failed_tool_build; } &
10911094
done
10921095

10931096
wait_without_error --no-kill || {
1094-
touch "$failed_tool_build_marker"
1097+
mark_failed_tool_build
10951098
}
10961099
} 2>&4 | xlog >&3; } 4>&1 | xerr >&3; } 3>&1
10971100
}
@@ -2250,6 +2253,10 @@ $formatted_string
22502253
" "$SPEC_PATH"
22512254
}
22522255

2256+
mark_failed_tool_build() {
2257+
touch "$failed_tool_build_marker"
2258+
}
2259+
22532260
# generate db structs for use with swaggest/openapi-go.
22542261
generate_structs_map() {
22552262
# cached most of the time. building here since it must be called before tools build
@@ -2440,7 +2447,7 @@ $(join_by $'\n' "${invalid_schemas[@]}")"
24402447
# always compile and run since we need new PublicStructs that were just changed
24412448
codegen gen-schema --struct-names $struct_names_arg --existing-structs $existing_structs_arg | yq '
24422449
with_entries(select(.key == "components"))' \
2443-
>$gen_schema_spec_path || touch "$failed_tool_build_marker"
2450+
>$gen_schema_spec_path || mark_failed_tool_build
24442451

24452452
local clashes=()
24462453
for custom_schema in $(yq ".components.schemas[] | select((.x-is-generated == true) | not) | key" $SPEC_PATH); do

cmd/oapi-codegen/main.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"slices"
1313
"strings"
1414
"text/template"
15+
"unicode"
1516

1617
"github.com/deepmap/oapi-codegen/v2/pkg/codegen"
1718
"github.com/deepmap/oapi-codegen/v2/pkg/util"
@@ -27,7 +28,9 @@ type configuration struct {
2728
OutputFile string `yaml:"output,omitempty"`
2829
ExcludeRestTypes bool `yaml:"exclude-rest-types,omitempty"`
2930
// TestClient defines whether the generated code is a client for testing purposes.
30-
TestClient bool `yaml:"test-client,omitempty"`
31+
TestClient bool `yaml:"test-client,omitempty"`
32+
SkipDiscriminatorUtils bool `yaml:"skip-discriminator-utils,omitempty"`
33+
IsRestServerGen bool `yaml:"is-rest-server-gen,omitempty"`
3134
}
3235

3336
//go:embed oapi-templates
@@ -119,6 +122,12 @@ func generate(spec *openapi3.T, config configuration, templates embed.FS, models
119122

120123
return false
121124
},
125+
"is_rest_server_gen": func() bool {
126+
return config.IsRestServerGen
127+
},
128+
"skip_discriminator_utils": func() bool {
129+
return config.SkipDiscriminatorUtils
130+
},
122131
"is_test_client": func() bool {
123132
return config.TestClient
124133
},
@@ -128,6 +137,9 @@ func generate(spec *openapi3.T, config configuration, templates embed.FS, models
128137
"models_pkg": func() string {
129138
return modelsPkg + "."
130139
},
140+
"is_db_struct": func(t string) bool {
141+
return strings.HasPrefix(t, "Db") && unicode.IsUpper([]rune(t)[2])
142+
},
131143
"should_exclude_type": func(t string) bool {
132144
stName := strings.TrimPrefix(t, "externalRef0.")
133145
if slices.Contains(serverTypes, stName) {

cmd/oapi-codegen/oapi-templates/request-bodies.tmpl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
{{$contentType := .ContentType -}}
55
{{with .TypeDef $opid}}
66

7-
// {{.TypeName}} defines body for {{$opid}} for {{$contentType}} ContentType.
87
{{- /* cannot import rest in types gen package, circ. {{if is_rest_type .Schema.TypeDecl}}rest.{{end}} */}}
9-
8+
// {{.TypeName}} defines body for {{$opid}} for {{$contentType}} ContentType.
109
type {{.TypeName}} {{if .IsAlias}}={{end}}{{if (exclude_rest_types)}}{{rest_type .Schema.TypeDecl}}{{else}}{{.Schema.TypeDecl}}{{end}}
1110
{{end}}
1211
{{end}}
Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
{{range .Types}}
2-
{{/* IMPORTANT: changed */}}
3-
{{if and ((should_exclude_type .TypeName)) (exclude_rest_types)}}/* Ignoring existing rest struct{{end}}
2+
{{ if and ((should_exclude_type .TypeName)) (exclude_rest_types) -}}
3+
/* Ignoring existing struct (rest/models.go) {{.TypeName}} */
4+
{{ else if and (is_rest_server_gen) (is_db_struct .TypeName) -}}
5+
/* Skipping definition of db struct {{.TypeName}} */
6+
{{ else -}}
47
{{ if .Schema.Description }}{{ toGoComment .Schema.Description .TypeName }}{{ else }}// {{.TypeName}} defines the model for {{.JsonName}}.{{ end }}
58
type {{.TypeName}} {{if .IsAlias }}={{end}} {{.Schema.TypeDecl}}
6-
{{if and ((should_exclude_type .TypeName)) (exclude_rest_types)}}*/{{end}}
7-
{{end}}
9+
{{ end }}
10+
{{ end }}
811

cmd/oapi-codegen/oapi-templates/union.tmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
*/}}
6666
{{end}}
6767

68-
{{if $discriminator}}
68+
{{if and ($discriminator) (not skip_discriminator_utils) }}
6969
func (t {{.TypeName}}) Discriminator() (string, error) {
7070
var discriminator struct {
7171
Discriminator string {{$discriminator.JSONTag}}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* Generated by orval v6.23.0 🍺
3+
* Do not edit manually.
4+
* OpenAPI openapi-go-gin-postgres-sqlc
5+
* openapi-go-gin-postgres-sqlc
6+
* OpenAPI spec version: 2.0.0
7+
*/
8+
9+
export interface DbCacheDemoWorkItemJoins {
10+
assignees: boolean
11+
kanbanStep: boolean
12+
team: boolean
13+
timeEntries: boolean
14+
workItemComments: boolean
15+
workItemTags: boolean
16+
workItemType: boolean
17+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* Generated by orval v6.23.0 🍺
3+
* Do not edit manually.
4+
* OpenAPI openapi-go-gin-postgres-sqlc
5+
* openapi-go-gin-postgres-sqlc
6+
* OpenAPI spec version: 2.0.0
7+
*/
8+
9+
export interface DbUserJoins {
10+
assigneeWorkItems: boolean
11+
memberProjects: boolean
12+
memberTeams: boolean
13+
receiverNotifications: boolean
14+
senderNotifications: boolean
15+
timeEntries: boolean
16+
userAPIKey: boolean
17+
userNotifications: boolean
18+
workItemComments: boolean
19+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Generated by orval v6.23.0 🍺
3+
* Do not edit manually.
4+
* OpenAPI openapi-go-gin-postgres-sqlc
5+
* openapi-go-gin-postgres-sqlc
6+
* OpenAPI spec version: 2.0.0
7+
*/
8+
import type { DbCacheDemoWorkItemJoins } from './dbCacheDemoWorkItemJoins'
9+
10+
export interface GetCacheDemoWorkItemQueryParameters {
11+
joins?: DbCacheDemoWorkItemJoins
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Generated by orval v6.23.0 🍺
3+
* Do not edit manually.
4+
* OpenAPI openapi-go-gin-postgres-sqlc
5+
* openapi-go-gin-postgres-sqlc
6+
* OpenAPI spec version: 2.0.0
7+
*/
8+
import type { DbUserJoins } from './dbUserJoins'
9+
10+
export interface GetCurrentUserQueryParameters {
11+
joins?: DbUserJoins
12+
}

0 commit comments

Comments
 (0)