@@ -56,44 +56,66 @@ func generateService(featureDir, featureName string) error {
5656 template := fmt .Sprintf (`package %s
5757
5858import (
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
6869type Service interface {
69- Find%s(id primitive.ObjectID ) (*model.%s, error)
70+ Find%s(id uuid.UUID ) (*model.%s, error)
7071}
7172
7273type 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
108130import (
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
117139type controller struct {
@@ -137,19 +159,19 @@ func (c *controller) MountRoutes(group *gin.RouterGroup) {
137159}
138160
139161func (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
177199import (
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-
190205type %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
252230import (
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
260238type 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
266244func EmptyInfo%s() *Info%s {
@@ -272,20 +250,7 @@ func (d *Info%s) GetValue() *Info%s {
272250}
273251
274252func (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 )
0 commit comments