Skip to content

Commit a874b13

Browse files
committed
update apigen
1 parent 9d7a82c commit a874b13

2 files changed

Lines changed: 56 additions & 99 deletions

File tree

.tools/apigen.go

Lines changed: 55 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -56,44 +56,66 @@ func generateService(featureDir, featureName string) error {
5656
template := fmt.Sprintf(`package %s
5757
5858
import (
59+
"context"
60+
5961
"github.com/afteracademy/goserve-example-api-server-postgres/api/%s/dto"
6062
"github.com/afteracademy/goserve-example-api-server-postgres/api/%s/model"
61-
"github.com/afteracademy/goserve/v2/mongo"
6263
"github.com/afteracademy/goserve/v2/network"
6364
"github.com/afteracademy/goserve/v2/redis"
64-
"go.mongodb.org/mongo-driver/bson"
65-
"go.mongodb.org/mongo-driver/bson/primitive"
65+
"github.com/jackc/pgx/v5/pgxpool"
66+
"github.com/google/uuid"
6667
)
6768
6869
type Service interface {
69-
Find%s(id primitive.ObjectID) (*model.%s, error)
70+
Find%s(id uuid.UUID) (*model.%s, error)
7071
}
7172
7273
type service struct {
7374
network.BaseService
74-
%sQueryBuilder mongo.QueryBuilder[model.%s]
75-
info%sCache redis.Cache[dto.Info%s]
75+
db *pgxpool.Pool
76+
info%sCache redis.Cache[dto.Info%s]
7677
}
7778
78-
func NewService(db mongo.Database, store redis.Store) Service {
79+
func NewService(db *pgxpool.Pool, store redis.Store) Service {
7980
return &service{
80-
BaseService: network.NewBaseService(),
81-
%sQueryBuilder: mongo.NewQueryBuilder[model.%s](db, model.CollectionName),
82-
info%sCache: redis.NewCache[dto.Info%s](store),
81+
BaseService: network.NewBaseService(),
82+
db: db,
83+
info%sCache: redis.NewCache[dto.Info%s](store),
8384
}
8485
}
8586
86-
func (s *service) Find%s(id primitive.ObjectID) (*model.%s, error) {
87-
filter := bson.M{"_id": id}
87+
func (s *service) Find%s(id uuid.UUID) (*model.%s, error) {
88+
ctx := context.Background()
89+
90+
query := `+"`"+`
91+
SELECT
92+
id,
93+
field,
94+
status,
95+
created_at,
96+
updated_at
97+
FROM %ss
98+
WHERE id = $1
99+
`+"`"+`
100+
101+
var m model.%s
102+
103+
err := s.db.QueryRow(ctx, query, id).
104+
Scan(
105+
&m.ID,
106+
&m.Field,
107+
&m.Status,
108+
&m.CreatedAt,
109+
&m.UpdatedAt,
110+
)
88111
89-
msg, err := s.%sQueryBuilder.SingleQuery().FindOne(filter, nil)
90112
if err != nil {
91113
return nil, err
92114
}
93115
94-
return msg, nil
116+
return &m, nil
95117
}
96-
`, featureLower, featureLower, featureLower, featureCaps, featureCaps, featureLower, featureCaps, featureCaps, featureCaps, featureLower, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureLower)
118+
`, featureLower, featureLower, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureLower, featureCaps)
97119

98120
return os.WriteFile(servicePath, []byte(template), os.ModePerm)
99121
}
@@ -106,12 +128,12 @@ func generateController(featureDir, featureName string) error {
106128
template := fmt.Sprintf(`package %s
107129
108130
import (
109-
"github.com/gin-gonic/gin"
110131
"github.com/afteracademy/goserve-example-api-server-postgres/api/%s/dto"
111132
"github.com/afteracademy/goserve-example-api-server-postgres/common"
112133
coredto "github.com/afteracademy/goserve/v2/dto"
113134
"github.com/afteracademy/goserve/v2/network"
114-
"github.com/afteracademy/goserve-example-api-server-postgres/utils"
135+
"github.com/afteracademy/goserve/v2/utility"
136+
"github.com/gin-gonic/gin"
115137
)
116138
117139
type controller struct {
@@ -137,19 +159,19 @@ func (c *controller) MountRoutes(group *gin.RouterGroup) {
137159
}
138160
139161
func (c *controller) get%sHandler(ctx *gin.Context) {
140-
mongoId, err := network.ReqParams(ctx, coredto.EmptyMongoId())
162+
uuidParam, err := network.ReqParams(ctx, coredto.EmptyUUID())
141163
if err != nil {
142164
c.Send(ctx).BadRequestError(err.Error(), err)
143165
return
144166
}
145167
146-
%s, err := c.service.Find%s(mongoId.ID)
168+
%s, err := c.service.Find%s(uuidParam.ID)
147169
if err != nil {
148170
c.Send(ctx).NotFoundError("%s not found", err)
149171
return
150172
}
151173
152-
data, err := utils.MapTo[dto.Info%s](%s)
174+
data, err := utility.MapTo[dto.Info%s](%s)
153175
if err != nil {
154176
c.Send(ctx).InternalServerError("something went wrong", err)
155177
return
@@ -175,64 +197,20 @@ func generateModel(featureDir, featureName string) error {
175197
tStr := `package model
176198
177199
import (
178-
"context"
179200
"time"
180201
181-
"github.com/go-playground/validator/v10"
182-
"github.com/afteracademy/goserve/v2/mongo"
183-
"go.mongodb.org/mongo-driver/bson"
184-
"go.mongodb.org/mongo-driver/bson/primitive"
185-
mongod "go.mongodb.org/mongo-driver/mongo"
202+
"github.com/google/uuid"
186203
)
187204
188-
const CollectionName = "%ss"
189-
190205
type %s struct {
191-
ID primitive.ObjectID ` + "`" + `bson:"_id,omitempty" validate:"-"` + "`" + `
192-
Field string ` + "`" + `bson:"field" validate:"required"` + "`" + `
193-
Status bool ` + "`" + `bson:"status" validate:"required"` + "`" + `
194-
CreatedAt time.Time ` + "`" + `bson:"createdAt" validate:"required"` + "`" + `
195-
UpdatedAt time.Time ` + "`" + `bson:"updatedAt" validate:"required"` + "`" + `
196-
}` + `
197-
198-
func New%s(field string) (*%s, error) {
199-
time := time.Now()
200-
doc := %s{
201-
Field: field,
202-
Status: true,
203-
CreatedAt: time,
204-
UpdatedAt: time,
205-
}
206-
if err := doc.Validate(); err != nil {
207-
return nil, err
208-
}
209-
return &doc, nil
206+
ID uuid.UUID // id
207+
Field string // field
208+
Status bool // status
209+
CreatedAt time.Time // created_at
210+
UpdatedAt time.Time // updated_at
210211
}
211-
212-
func (doc *%s) GetValue() *%s {
213-
return doc
214-
}
215-
216-
func (doc *%s) Validate() error {
217-
validate := validator.New()
218-
return validate.Struct(doc)
219-
}
220-
221-
func (*%s) EnsureIndexes(db mongo.Database) {
222-
indexes := []mongod.IndexModel{
223-
{
224-
Keys: bson.D{
225-
{Key: "_id", Value: 1},
226-
{Key: "status", Value: 1},
227-
},
228-
},
229-
}
230-
231-
mongo.NewQueryBuilder[%s](db, CollectionName).Query(context.Background()).CreateIndexes(indexes)
232-
}
233-
234212
`
235-
template := fmt.Sprintf(tStr, featureLower, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps)
213+
template := fmt.Sprintf(tStr, featureCaps)
236214

237215
return os.WriteFile(modelPath, []byte(template), os.ModePerm)
238216
}
@@ -250,17 +228,17 @@ func generateDto(featureDir, featureName string) error {
250228
tStr := `package dto
251229
252230
import (
253-
"fmt"
254231
"time"
255232
256233
"github.com/go-playground/validator/v10"
257-
"go.mongodb.org/mongo-driver/bson/primitive"
234+
"github.com/google/uuid"
235+
"github.com/afteracademy/goserve/v2/utility"
258236
)
259237
260238
type Info%s struct {
261-
ID primitive.ObjectID ` + "`" + `json:"_id" binding:"required"` + "`" + `
262-
Field string ` + "`" + `json:"field" binding:"required"` + "`" + `
263-
CreatedAt time.Time ` + "`" + `json:"createdAt" binding:"required"` + "`" + `
239+
ID uuid.UUID ` + "`" + `json:"_id" binding:"required"` + "`" + `
240+
Field string ` + "`" + `json:"field" binding:"required"` + "`" + `
241+
CreatedAt time.Time ` + "`" + `json:"createdAt" binding:"required"` + "`" + `
264242
}
265243
266244
func EmptyInfo%s() *Info%s {
@@ -272,20 +250,7 @@ func (d *Info%s) GetValue() *Info%s {
272250
}
273251
274252
func (d *Info%s) ValidateErrors(errs validator.ValidationErrors) ([]string, error) {
275-
var msgs []string
276-
for _, err := range errs {
277-
switch err.Tag() {
278-
case "required":
279-
msgs = append(msgs, fmt.Sprintf("%%s is required", err.Field()))
280-
case "min":
281-
msgs = append(msgs, fmt.Sprintf("%%s must be min %%s", err.Field(), err.Param()))
282-
case "max":
283-
msgs = append(msgs, fmt.Sprintf("%%s must be max %%s", err.Field(), err.Param()))
284-
default:
285-
msgs = append(msgs, fmt.Sprintf("%%s is invalid", err.Field()))
286-
}
287-
}
288-
return msgs, nil
253+
return utility.FormatValidationErrors(errs), nil
289254
}
290255
`
291256
template := fmt.Sprintf(tStr, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps, featureCaps)

Makefile

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,4 @@ setup:
2222
# make apigen ARGS="sample"
2323
apigen:
2424
go run .tools/apigen.go $(ARGS)
25-
26-
test-docker:
27-
@set -e; \
28-
docker compose --env-file .test.env -f docker-compose.test.yml build postgres-test redis-test; \
29-
docker compose --env-file .test.env -f docker-compose.test.yml up -d postgres-test redis-test; \
30-
docker compose --env-file .test.env -f docker-compose.test.yml run --rm migrate-test; \
31-
docker compose --env-file .test.env -f docker-compose.test.yml build goserver-test; \
32-
docker compose --env-file .test.env -f docker-compose.test.yml run --rm goserver-test; \
33-
docker compose --env-file .test.env -f docker-compose.test.yml down -v
25+

0 commit comments

Comments
 (0)