From 7ef1074c7dec17b7c2cfd29b7d5f52e14b97cd8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Roos?= Date: Tue, 6 Dec 2022 11:31:27 +0100 Subject: [PATCH 001/467] wip --- .gitignore | 4 +- CRUD copy.http | 121 +++++++++ CRUD.http | 121 +++++++++ commands/rootCmd.go | 120 +++++++++ controllers/ModuleFx.go | 1 + controllers/eav.go | 254 +++++++++++++++++++ go.mod | 3 + go.sum | 4 + httperrors/httperrors.go | 5 + httperrors/httperrors_test.go | 12 + mocks/controllers/EAVController.go | 155 ++++++++++++ mocks/services/eavservice/EAVService.go | 141 +++++++++++ persistence/models/Attribut.go | 82 ++++++ persistence/models/Entity.go | 90 +++++++ persistence/models/EntityType.go | 10 + persistence/models/Entity_test.go | 48 ++++ persistence/models/Tabler.go | 4 + persistence/models/Value.go | 320 ++++++++++++++++++++++++ router/router.go | 20 +- router/router_test.go | 1 + scripts/e2e/db/init.sh | 1 + scripts/e2e/docker-compose.yml | 24 +- services/eavservice/eavservice.go | 273 ++++++++++++++++++++ services/eavservice/utils/json.go | 27 ++ services/eavservice/utils/json_test.go | 58 +++++ services/eavservice/utils/math.go | 8 + services/eavservice/utils/math_test.go | 23 ++ 27 files changed, 1916 insertions(+), 14 deletions(-) create mode 100644 CRUD copy.http create mode 100644 CRUD.http create mode 100644 controllers/eav.go create mode 100644 mocks/controllers/EAVController.go create mode 100644 mocks/services/eavservice/EAVService.go create mode 100644 persistence/models/Attribut.go create mode 100644 persistence/models/Entity.go create mode 100644 persistence/models/EntityType.go create mode 100644 persistence/models/Entity_test.go create mode 100644 persistence/models/Value.go create mode 100644 services/eavservice/eavservice.go create mode 100644 services/eavservice/utils/json.go create mode 100644 services/eavservice/utils/json_test.go create mode 100644 services/eavservice/utils/math.go create mode 100644 services/eavservice/utils/math_test.go diff --git a/.gitignore b/.gitignore index d477eb47..67097f02 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,6 @@ node* badaas # temporary directories -_temp \ No newline at end of file +_temp + +vendor/ \ No newline at end of file diff --git a/CRUD copy.http b/CRUD copy.http new file mode 100644 index 00000000..46aafab7 --- /dev/null +++ b/CRUD copy.http @@ -0,0 +1,121 @@ +@hostname = localhost +@port = 8002 +@host = {{hostname}}:{{port}} + +@URI = http://{{hostname}}:{{port}}/v1 + +@birdid = a6515f18-aa94-46d9-8709-29de2a36ea79 + + +# GET all birds +GET {{URI}}/objects/post/ HTTP/1.1 +content-type: application/json + +### + +# GET all birds that are blue +GET {{URI}}/objects/post/?ownerID=23764cb8-80f2-4a03-8060-2f3f4c95b978 HTTP/1.1 +content-type: application/json + +### + +# GET a bird +GET {{URI}}/objects/post/{{birdid}} HTTP/1.1 +content-type: application/json + +### + +# => SHOULD FAIl +# DELETE all bird +DELETE {{URI}}/objects/post/ HTTP/1.1 +content-type: application/json + +### + +# DELETE a bird +DELETE {{URI}}/objects/post/{{birdid}} HTTP/1.1 +content-type: application/json + +### + +# CREATE a bird +POST {{URI}}/objects/bird HTTP/1.1 +content-type: application/json + +{ +"attrs": { + "color": "red", + "specie": "aigle", + "height": 106, + "owner": 1 +} +} + +### + +# CREATE => with null field +POST {{URI}}/objects/bird HTTP/1.1 +content-type: application/json + +{ +"attrs": { + "color": "orange", + "specie": "bird with null field (field absent of the request)" +} +} + +### + +# CREATE => with field of null value +POST {{URI}}/objects/bird HTTP/1.1 +content-type: application/json + +{ +"attrs": { + "color": "orange", + "specie": "bird with null field", + "height": 50, + "weight": null +} +} + +### + +# SHOULD FAIl +# CREATE => missing an non nullable field +POST {{URI}}/objects/bird HTTP/1.1 +content-type: application/json + +{ + "attrs": { + "specie": "Should not endup in database" + } +} + +### + +# SHOULD FAIl +# CREATE => sending a null value non a non nullable field +POST {{URI}}/objects/bird HTTP/1.1 +content-type: application/json + +{ + "attrs": { + "color": null, + "specie": "Should not endup in database" + } +} + +### + +# UPDATE a bird +PUT {{URI}}/objects/post/{{birdid}} HTTP/1.1 +content-type: application/json + +{ + "attrs": { + "color": "red", + "specie": "rouge gorge", + "height": null + } +} \ No newline at end of file diff --git a/CRUD.http b/CRUD.http new file mode 100644 index 00000000..f5f7b0a1 --- /dev/null +++ b/CRUD.http @@ -0,0 +1,121 @@ +@hostname = localhost +@port = 8002 +@host = {{hostname}}:{{port}} + +@URI = http://{{hostname}}:{{port}}/v1 + +@birdid = a6515f18-aa94-46d9-8709-29de2a36ea79 + + +# GET all birds +GET {{URI}}/objects/bird/ HTTP/1.1 +content-type: application/json + +### + +# GET all birds that are blue +GET {{URI}}/objects/bird/?color=red HTTP/1.1 +content-type: application/json + +### + +# GET a bird +GET {{URI}}/objects/bird/{{birdid}} HTTP/1.1 +content-type: application/json + +### + +# => SHOULD FAIl +# DELETE all bird +DELETE {{URI}}/objects/bird/ HTTP/1.1 +content-type: application/json + +### + +# DELETE a bird +DELETE {{URI}}/objects/bird/{{birdid}} HTTP/1.1 +content-type: application/json + +### + +# CREATE a bird +POST {{URI}}/objects/bird HTTP/1.1 +content-type: application/json + +{ +"attrs": { + "color": "red", + "specie": "aigle", + "height": 106, + "owner": 1 +} +} + +### + +# CREATE => with null field +POST {{URI}}/objects/bird HTTP/1.1 +content-type: application/json + +{ +"attrs": { + "color": "orange", + "specie": "bird with null field (field absent of the request)" +} +} + +### + +# CREATE => with field of null value +POST {{URI}}/objects/bird HTTP/1.1 +content-type: application/json + +{ +"attrs": { + "color": "orange", + "specie": "bird with null field", + "height": 50, + "weight": null +} +} + +### + +# SHOULD FAIl +# CREATE => missing an non nullable field +POST {{URI}}/objects/bird HTTP/1.1 +content-type: application/json + +{ + "attrs": { + "specie": "Should not endup in database" + } +} + +### + +# SHOULD FAIl +# CREATE => sending a null value non a non nullable field +POST {{URI}}/objects/bird HTTP/1.1 +content-type: application/json + +{ + "attrs": { + "color": null, + "specie": "Should not endup in database" + } +} + +### + +# UPDATE a bird +PUT {{URI}}/objects/bird/{{birdid}} HTTP/1.1 +content-type: application/json + +{ + "attrs": { + "color": "red", + "specie": "rouge gorge", + "height": null + } +} \ No newline at end of file diff --git a/commands/rootCmd.go b/commands/rootCmd.go index 65722ce7..e568a636 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -1,12 +1,14 @@ package commands import ( + "fmt" "net/http" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/logger" "github.com/ditrit/badaas/persistence" + "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/router" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" @@ -14,6 +16,7 @@ import ( "go.uber.org/fx" "go.uber.org/fx/fxevent" "go.uber.org/zap" + "gorm.io/gorm" ) // Run the http server for badaas @@ -38,6 +41,7 @@ func runHTTPServer(cfg *verdeter.VerdeterCommand, args []string) error { // Finally: we invoke the newly created server fx.Invoke(func(*http.Server) { /* we need this function to be empty*/ }), fx.Invoke(createSuperUser), + fx.Invoke(PopulateDatabase2), ).Run() return nil } @@ -66,3 +70,119 @@ func init() { initInitialisationCommands(rootCfg) initSessionCommands(rootCfg) } + +func PopulateDatabase(db *gorm.DB) error { + //defining + HumanType := &models.EntityType{ + Name: "human", + } + nameAttr := &models.Attribut{Name: "name", ValueType: "string", Required: true} + HumanType.Attributs = append( + HumanType.Attributs, nameAttr, + ) + bobName, err := models.NewStringValue(nameAttr, "bob") + if err != nil { + panic(err) + } + bob := &models.Entity{EntityType: HumanType} + bob.Fields = append(bob.Fields, bobName) + db.Create(bob) + + jeanName, err := models.NewStringValue(nameAttr, "jean") + if err != nil { + panic(err) + } + jean := &models.Entity{EntityType: HumanType} + jean.Fields = append(jean.Fields, jeanName) + + db.Create(jean) + + // Defining a bird + colorAttr := &models.Attribut{Name: "color", ValueType: "string", Required: true} + specieAttr := &models.Attribut{Name: "specie", ValueType: "string", Required: true} + heightAttr := &models.Attribut{Name: "height", ValueType: "int", Default: true, DefaultInt: 12, Required: false} + weightAttr := &models.Attribut{Name: "weight", ValueType: "float", Default: true, DefaultFloat: 12.500, Required: false} + ownerAttr := &models.Attribut{Name: "owner", ValueType: "relation", Required: false, TargetEntityTypeId: HumanType.ID} + + BirdType := &models.EntityType{ + Name: "bird", + } + BirdType.Attributs = append( + BirdType.Attributs, colorAttr, specieAttr, heightAttr, weightAttr, ownerAttr, + ) + + val1, err := models.NewStringValue(colorAttr, "blue") + if err != nil { + panic(err) + } + val2, err := models.NewStringValue(specieAttr, "mésange") + if err != nil { + panic(err) + } + val3, err := models.NewIntValue(heightAttr, 8) + if err != nil { + panic(err) + } + val4, err := models.NewNullValue(weightAttr) + if err != nil { + panic(err) + } + + val5, err := models.NewRelationValue(ownerAttr, bob) + if err != nil { + panic(err) + } + + mesange := &models.Entity{EntityType: BirdType} + mesange.Fields = append(mesange.Fields, val1, val2, val3, val4, val5) + + db.Create(mesange) + fmt.Println("Finished populating the database") + + return nil +} + +func PopulateDatabase2(db *gorm.DB) error { + PostType := &models.EntityType{ + Name: "post", + } + titleAttr := &models.Attribut{Name: "title", ValueType: "string", Required: true} + bodyAttr := &models.Attribut{Name: "body", ValueType: "string", Default: false, DefaultString: "empty"} + ownerAttr := &models.Attribut{Name: "ownerID", ValueType: "string", Required: true} + + PostType.Attributs = append( + PostType.Attributs, titleAttr, bodyAttr, ownerAttr, + ) + + whycatslikemices := &models.Entity{EntityTypeId: PostType.ID, EntityType: PostType} + titleVal := &models.Value{Attribut: titleAttr, StringVal: "Why cats like mices ? "} + bodyVal, err := models.NewStringValue(bodyAttr, + `Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. In erat mi, pharetra ut lacinia at, facilisis vitae nunc. Fusce rhoncus id justo vitae gravida. In nisi mi, rutrum et arcu ac, gravida venenatis arcu. Nulla leo metus, molestie eu sagittis non, ultricies eu ex. Fusce a lorem eu urna porttitor molestie. Aliquam nec sapien quam. Suspendisse aliquet elementum arcu vitae interdum. Maecenas nec turpis et nulla volutpat accumsan. Pellentesque non ullamcorper leo, eu fringilla odio. + + Cras eu felis mauris. Pellentesque varius imperdiet suscipit. Nam tellus odio, faucibus at mattis quis, cursus at tortor. Curabitur vitae mi eu lorem feugiat pretium sed sit amet purus. Proin efficitur, magna eu malesuada fermentum, tortor tortor maximus neque, vel mattis tortor orci a ligula. Nunc nec justo ipsum. Sed fermentum, nisl eget efficitur accumsan, augue nisl sollicitudin massa, vel suscipit enim turpis nec nisi. + + Nam dictum risus sed leo malesuada varius. Pellentesque gravida interdum risus id vulputate. Mauris feugiat vulputate leo ut euismod. Fusce auctor at lacus eget sollicitudin. Suspendisse potenti. Aliquam dui felis, mollis quis porta a, sodales in ligula. In ac elit ornare, facilisis ex eget, tincidunt orci. Nullam eu mattis turpis, non finibus dolor. + + Ut aliquet laoreet risus, in ultrices purus placerat ut. Aenean eget massa et augue tristique vestibulum eu nec urna. Curabitur id scelerisque felis, ac rutrum massa. In ullamcorper ex ac turpis mattis porttitor. Nunc vitae congue ex, quis porttitor massa. Fusce ut bibendum sem. Phasellus massa dui, venenatis non erat vel, auctor fermentum dolor. Cras aliquet venenatis mauris, eu consectetur massa sodales et. Phasellus lacinia massa vel arcu suscipit congue. Vestibulum mollis tellus nisi. Phasellus at dui eget dolor sagittis vulputate. Nulla vitae est commodo, aliquam urna non, pretium neque. + + Maecenas sodales augue ac neque efficitur pharetra. Maecenas commodo quam magna, vel pulvinar metus condimentum eget. Phasellus malesuada ante quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu justo vel nisl fringilla scelerisque eget ut ex. Duis malesuada, risus sit amet auctor euismod, felis nisl ultrices nulla, eu porttitor arcu elit fermentum velit. Praesent ut sagittis leo. Suspendisse non condimentum nunc, eget rhoncus velit. Praesent tincidunt, arcu mattis faucibus finibus, ligula lectus sodales sapien, sed porta diam nisi vitae ex. Nullam tristique justo at laoreet varius. Ut suscipit, lacus ac ultrices ornare, nisi massa varius felis, quis condimentum dolor tellus at ante. + `) + if err != nil { + return nil + } + + var admin models.User + err = db.First(&admin, "username = ?", "admin").Error + if err != nil { + return err + } + ownerVal := &models.Value{Attribut: ownerAttr, StringVal: admin.ID.String()} + + whycatslikemices.Fields = append(whycatslikemices.Fields, + titleVal, bodyVal, ownerVal) + + db.Create(whycatslikemices) + fmt.Println("Finished populating the database") + + return nil +} diff --git a/controllers/ModuleFx.go b/controllers/ModuleFx.go index ccab54eb..520332cf 100644 --- a/controllers/ModuleFx.go +++ b/controllers/ModuleFx.go @@ -7,4 +7,5 @@ var ControllerModule = fx.Module( "controllers", fx.Provide(NewInfoController), fx.Provide(NewBasicAuthentificationController), + fx.Provide(NewEAVController), ) diff --git a/controllers/eav.go b/controllers/eav.go new file mode 100644 index 00000000..08b19057 --- /dev/null +++ b/controllers/eav.go @@ -0,0 +1,254 @@ +package controllers + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/httperrors" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services/eavservice" + "github.com/google/uuid" + "github.com/gorilla/mux" + "go.uber.org/zap" + "gorm.io/gorm" +) + +var ( + ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid entity id") + ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists in the schema") + ErrIdNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") + ErrEntityTypeDontMatchEntity = httperrors.NewBadRequestError("types don't match", "the entity you are targeting don't match the entity type name provided") + ErrDBQueryFailed = func(err error) httperrors.HTTPError { + return httperrors.NewInternalServerError("db error", "database query failed", err) + } +) + +// The EAV controller +type EAVController interface { + // Return the badaas server informations + GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + ModifyObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) +} + +// check interface compliance +var _ EAVController = (*eavControllerImpl)(nil) + +// The InformationController constructor +func NewEAVController( + logger *zap.Logger, + paginationConfiguration configuration.PaginationConfiguration, + db *gorm.DB, + eavService eavservice.EAVService, +) EAVController { + return &eavControllerImpl{ + logger: logger, + paginationConfiguration: paginationConfiguration, + db: db, + eavService: eavService, + } +} + +// The concrete implementation of the InformationController +type eavControllerImpl struct { + logger *zap.Logger + paginationConfiguration configuration.PaginationConfiguration + db *gorm.DB + eavService eavservice.EAVService +} + +func (controller *eavControllerImpl) GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName := getEntityTypeNameFromRequest(r) + + ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityTypeNotFound + } + + } + queryparams := r.URL.Query() + var qp map[string]string = make(map[string]string) + for k, v := range queryparams { + qp[k] = v[0] + } + fmt.Println(qp) + var collection []*models.Entity = controller.eavService.GetEntitiesWithParams(ett, qp) + + return collection, nil +} + +// The handler reponsible for the retreival of une entity +func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + + entityTypeName := getEntityTypeNameFromRequest(r) + controller.logger.Sugar().Debugf("query for %s", entityTypeName) + ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } + http.Error(w, GetErrMsg(err.Error()), http.StatusInternalServerError) + return nil, httperrors.NewInternalServerError("db error", "db query failed", err) + } + id, idErr := getEntityIDFromRequest(r) + + if idErr != nil { + return nil, idErr + } + + obj, err := controller.eavService.GetEntity(ett, id) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } else if errors.Is(err, eavservice.ErrIdDontMatchEntityType) { + http.Error(w, GetErrMsg(err.Error()), http.StatusBadRequest) + return nil, ErrEntityTypeDontMatchEntity + } else { + return nil, ErrDBQueryFailed(err) + } + } + return obj, nil +} + +// Extract the "id" parameter from url +func getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { + vars := mux.Vars(r) + id, ok := vars["id"] + if !ok { + return uuid.Nil, ErrEntityNotFound + } + uid, err := uuid.Parse(id) + if err != nil { + return uuid.Nil, ErrIdNotAnUUID + } + return uid, nil +} + +// Extract the "type" parameter from url +func getEntityTypeNameFromRequest(r *http.Request) string { + vars := mux.Vars(r) + entityType := vars["type"] + return entityType +} + +// The handler reponsible for the deletion of entities and their associated value +func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName := getEntityTypeNameFromRequest(r) + ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityTypeNotFound + } + http.Error(w, GetErrMsg(err.Error()), http.StatusInternalServerError) + return nil, httperrors.NewInternalServerError("db error", "search for entity type", err) + } + id, idErr := getEntityIDFromRequest(r) + + if idErr != nil { + return nil, idErr + } + entity, err := controller.eavService.GetEntity(ett, id) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } else if errors.Is(err, eavservice.ErrIdDontMatchEntityType) { + return nil, ErrEntityTypeDontMatchEntity + } else { + return nil, ErrDBQueryFailed(err) + } + } + err = controller.eavService.DeleteEntity(entity) + if err != nil { + return nil, httperrors.NewInternalServerError("deletion failed", "", err) + } + return nil, nil +} + +// The handler reponsible for the creation of entities +func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName := getEntityTypeNameFromRequest(r) + ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityTypeNotFound + } + return nil, ErrDBQueryFailed(err) + } + var cr createReq + err = json.NewDecoder(r.Body).Decode(&cr) + r.Body.Close() + if err != nil { + return nil, httperrors.NewBadRequestError("json decoding failed", "please use a correct json payload for entity creation") + } + + fmt.Println(cr) + et, err := controller.eavService.CreateEntity(ett, cr.Attrs) + if err != nil { + return nil, httperrors.NewInternalServerError("creation failed", "", err) + } + w.Header().Add("Location", buildLocationString(et)) + return et, nil +} + +func buildLocationString(et *models.Entity) string { + return fmt.Sprintf("/v1/objects/%s/%d", et.EntityType.Name, et.ID) +} + +type createReq struct { + Attrs map[string]interface{} +} + +// The handler reponsible for the updates of entities +func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName := getEntityTypeNameFromRequest(r) + ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityTypeNotFound + } + return nil, ErrDBQueryFailed(err) + + } + + id, err := getEntityIDFromRequest(r) + if err != nil { + return nil, ErrIdNotAnUUID + } + entity, err := controller.eavService.GetEntity(ett, id) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } else if errors.Is(err, eavservice.ErrIdDontMatchEntityType) { + return nil, ErrEntityTypeDontMatchEntity + } else { + return nil, ErrDBQueryFailed(err) + } + } + + var mr modifyReq + err = json.NewDecoder(r.Body).Decode(&mr) + if err != nil { + return nil, ErrDBQueryFailed(err) + } + fmt.Println(mr.Attrs) + controller.eavService.UpdateEntity(entity, mr.Attrs) + return entity, nil +} + +// return json formated string to be consumed by frontend or client +func GetErrMsg(msg string) string { + return fmt.Sprintf( + `{"error": %q}`, + msg, + ) +} + +type modifyReq struct { + Attrs map[string]interface{} +} diff --git a/go.mod b/go.mod index d3073b31..d06f993b 100644 --- a/go.mod +++ b/go.mod @@ -21,6 +21,8 @@ require ( gorm.io/gorm v1.24.1 ) +require github.com/felixge/httpsnoop v1.0.1 // indirect + require ( github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect github.com/cucumber/messages-go/v16 v16.0.1 // indirect @@ -28,6 +30,7 @@ require ( github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/goph/emperror v0.17.2 // indirect + github.com/gorilla/handlers v1.5.1 github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-memdb v1.3.3 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect diff --git a/go.sum b/go.sum index a37b6266..a2037c7f 100644 --- a/go.sum +++ b/go.sum @@ -102,6 +102,8 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= @@ -187,6 +189,8 @@ github.com/goph/emperror v0.17.2 h1:yLapQcmEsO0ipe9p5TaN22djm3OFV/TfM/fcYP0/J18= github.com/goph/emperror v0.17.2/go.mod h1:+ZbQ+fUNO/6FNiUo0ujtMjhgad9Xa6fQL9KhH4LNHic= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/httperrors/httperrors.go b/httperrors/httperrors.go index c5a02ecf..3de71aff 100644 --- a/httperrors/httperrors.go +++ b/httperrors/httperrors.go @@ -125,3 +125,8 @@ func NewUnauthorizedError(errorName string, msg string) HTTPError { true, ) } + +// A contructor for an HTTPError "Bad Request" +func NewBadRequestError(err string, msg string) HTTPError { + return NewHTTPError(http.StatusBadRequest, err, msg, nil, false) +} diff --git a/httperrors/httperrors_test.go b/httperrors/httperrors_test.go index b98b9c77..4f0c8357 100644 --- a/httperrors/httperrors_test.go +++ b/httperrors/httperrors_test.go @@ -117,3 +117,15 @@ func TestNewUnauthorizedError(t *testing.T) { assert.NoError(t, err) assert.Equal(t, http.StatusText(http.StatusUnauthorized), dto.Status) } + +func TestNewBadRequestError(t *testing.T) { + error := httperrors.NewBadRequestError("id must be an unsigned integer", "please use a valid id") + assert.NotNil(t, error) + assert.False(t, error.Log()) + dto := new(dto.DTOHTTPError) + err := json.Unmarshal([]byte(error.ToJSON()), &dto) + assert.NoError(t, err) + assert.Equal(t, http.StatusText(http.StatusBadRequest), dto.Status) + assert.Equal(t, "id must be an unsigned integer", dto.Error) + assert.Equal(t, "please use a valid id", dto.Message) +} diff --git a/mocks/controllers/EAVController.go b/mocks/controllers/EAVController.go new file mode 100644 index 00000000..6d46e199 --- /dev/null +++ b/mocks/controllers/EAVController.go @@ -0,0 +1,155 @@ +// Code generated by mockery v2.14.0. DO NOT EDIT. + +package mocks + +import ( + http "net/http" + + httperrors "github.com/ditrit/badaas/httperrors" + mock "github.com/stretchr/testify/mock" +) + +// EAVController is an autogenerated mock type for the EAVController type +type EAVController struct { + mock.Mock +} + +// CreateObject provides a mock function with given fields: w, r +func (_m *EAVController) CreateObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + var r1 httperrors.HTTPError + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// DeleteObject provides a mock function with given fields: w, r +func (_m *EAVController) DeleteObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + var r1 httperrors.HTTPError + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// GetAll provides a mock function with given fields: w, r +func (_m *EAVController) GetAll(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + var r1 httperrors.HTTPError + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// GetObject provides a mock function with given fields: w, r +func (_m *EAVController) GetObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + var r1 httperrors.HTTPError + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// ModifyObject provides a mock function with given fields: w, r +func (_m *EAVController) ModifyObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + var r1 httperrors.HTTPError + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +type mockConstructorTestingTNewEAVController interface { + mock.TestingT + Cleanup(func()) +} + +// NewEAVController creates a new instance of EAVController. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewEAVController(t mockConstructorTestingTNewEAVController) *EAVController { + mock := &EAVController{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/services/eavservice/EAVService.go b/mocks/services/eavservice/EAVService.go new file mode 100644 index 00000000..6381a309 --- /dev/null +++ b/mocks/services/eavservice/EAVService.go @@ -0,0 +1,141 @@ +// Code generated by mockery v2.14.0. DO NOT EDIT. + +package mocks + +import ( + models "github.com/ditrit/badaas/persistence/models" + mock "github.com/stretchr/testify/mock" +) + +// EAVService is an autogenerated mock type for the EAVService type +type EAVService struct { + mock.Mock +} + +// CreateEntity provides a mock function with given fields: ett, attrs +func (_m *EAVService) CreateEntity(ett *models.EntityType, attrs map[string]interface{}) (*models.Entity, error) { + ret := _m.Called(ett, attrs) + + var r0 *models.Entity + if rf, ok := ret.Get(0).(func(*models.EntityType, map[string]interface{}) *models.Entity); ok { + r0 = rf(ett, attrs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*models.Entity) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*models.EntityType, map[string]interface{}) error); ok { + r1 = rf(ett, attrs) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteEntity provides a mock function with given fields: et +func (_m *EAVService) DeleteEntity(et *models.Entity) error { + ret := _m.Called(et) + + var r0 error + if rf, ok := ret.Get(0).(func(*models.Entity) error); ok { + r0 = rf(et) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetEntitiesWithParams provides a mock function with given fields: ett, params +func (_m *EAVService) GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity { + ret := _m.Called(ett, params) + + var r0 []*models.Entity + if rf, ok := ret.Get(0).(func(*models.EntityType, map[string]string) []*models.Entity); ok { + r0 = rf(ett, params) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*models.Entity) + } + } + + return r0 +} + +// GetEntity provides a mock function with given fields: ett, id +func (_m *EAVService) GetEntity(ett *models.EntityType, id uint) (*models.Entity, error) { + ret := _m.Called(ett, id) + + var r0 *models.Entity + if rf, ok := ret.Get(0).(func(*models.EntityType, uint) *models.Entity); ok { + r0 = rf(ett, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*models.Entity) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(*models.EntityType, uint) error); ok { + r1 = rf(ett, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetEntityTypeByName provides a mock function with given fields: name +func (_m *EAVService) GetEntityTypeByName(name string) (*models.EntityType, error) { + ret := _m.Called(name) + + var r0 *models.EntityType + if rf, ok := ret.Get(0).(func(string) *models.EntityType); ok { + r0 = rf(name) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*models.EntityType) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(name) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UpdateEntity provides a mock function with given fields: et, attrs +func (_m *EAVService) UpdateEntity(et *models.Entity, attrs map[string]interface{}) error { + ret := _m.Called(et, attrs) + + var r0 error + if rf, ok := ret.Get(0).(func(*models.Entity, map[string]interface{}) error); ok { + r0 = rf(et, attrs) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type mockConstructorTestingTNewEAVService interface { + mock.TestingT + Cleanup(func()) +} + +// NewEAVService creates a new instance of EAVService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewEAVService(t mockConstructorTestingTNewEAVService) *EAVService { + mock := &EAVService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/persistence/models/Attribut.go b/persistence/models/Attribut.go new file mode 100644 index 00000000..87dd002f --- /dev/null +++ b/persistence/models/Attribut.go @@ -0,0 +1,82 @@ +package models + +import ( + "errors" + "fmt" + + "github.com/google/uuid" +) + +const ( + RelationValueType ValueTypeT = "relation" + BooleanValueType ValueTypeT = "bool" + StringValueType ValueTypeT = "string" + IntValueType ValueTypeT = "int" + FloatValueType ValueTypeT = "float" +) + +// Describe the type of an attribut +type ValueTypeT string + +// Describe the attribut of a en EntityType +type Attribut struct { + BaseModel + Name string + Unique bool + Required bool + + // there is a default value + Default bool + + // Default values + DefaultInt int + DefaultBool bool + DefaultString string + DefaultFloat float64 + + // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" + ValueType ValueTypeT + TargetEntityTypeId uuid.UUID // name of the EntityType + + // GORM relations + EntityTypeId uuid.UUID +} + +var ErrNoDefaultValueSet = errors.New("no default value found") + +// Get a new value with the default value associated with the attribut +func (a *Attribut) GetNewDefaultValue() (*Value, error) { + if !a.Default { + return nil, ErrNoDefaultValueSet + } + switch a.ValueType { + case StringValueType: + v, err := NewStringValue(a, a.DefaultString) + if err != nil { + return nil, err + } + return v, nil + case IntValueType: + v, err := NewIntValue(a, a.DefaultInt) + if err != nil { + return nil, err + } + return v, nil + case FloatValueType: + v, err := NewFloatValue(a, a.DefaultFloat) + if err != nil { + return nil, err + } + return v, nil + case BooleanValueType: + v, err := NewBoolValue(a, a.DefaultBool) + if err != nil { + return nil, err + } + return v, nil + case RelationValueType: + return nil, fmt.Errorf("can't provide default value for relations") + default: + panic("hmmm we are not supposed to be here") + } +} diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go new file mode 100644 index 00000000..b3730d27 --- /dev/null +++ b/persistence/models/Entity.go @@ -0,0 +1,90 @@ +package models + +import ( + "encoding/json" + "fmt" + + "github.com/ditrit/badaas/services/eavservice/utils" + "github.com/google/uuid" +) + +// Describe an instance of an EntityType +type Entity struct { + BaseModel + Fields []*Value + + // GORM relations + EntityTypeId uuid.UUID + EntityType *EntityType +} + +// Encode the entity to json +// use the [encoding/json.Marshaler] interface +func (entity *Entity) MarshalJSON() ([]byte, error) { + dto := make(map[string]any) + dto["id"] = entity.ID + dto["type"] = entity.EntityType.Name + dto["createdAt"] = entity.CreatedAt + dto["updatedAt"] = entity.UpdatedAt + dto["attrs"] = entity.encodeAttributes() + return json.Marshal(dto) +} + +// return the attribut in a json encoded string +func (e *Entity) encodeAttributes() map[string]any { + pairs := make(map[string]any, len(e.Fields)) + for _, field := range e.Fields { + if field.IsNull { + continue + } + pairs[field.Attribut.Name] = field.Value() + } + return pairs +} + +func (e *Entity) GetValue(attrName string) (interface{}, error) { + var attrId uuid.UUID + for _, a := range e.EntityType.Attributs { + if a.Name == attrName { + attrId = a.ID + break + } + } + if uuid.Nil == attrId { + return nil, fmt.Errorf("attr not found: got=%s", attrName) + } + for _, v := range e.Fields { + if v.AttributId == attrId { + return v.Value(), nil + } + } + return nil, fmt.Errorf("value not found") +} + +// Encode the Entity to json +func (e *Entity) EncodeToJson() []byte { + var pairs []string + pairs = append(pairs, + fmt.Sprintf("%q: %d", "id", e.ID), + ) + pairs = append(pairs, + fmt.Sprintf("%q: %q", "type", e.EntityType.Name), + ) + pairs = append(pairs, + fmt.Sprintf("%q: %s", "attrs", e.encodeAttributesold()), + ) + return []byte(utils.BuildJsonFromStrings(pairs)) +} + +// return the attribut in a json encoded string +func (e *Entity) encodeAttributesold() string { + var pairs []string + for _, f := range e.Fields { + if f.IsNull { + continue + } + pair, _ := f.BuildJsonKVPair() + pairs = append(pairs, pair) + } + return utils.BuildJsonFromStrings(pairs) +} diff --git a/persistence/models/EntityType.go b/persistence/models/EntityType.go new file mode 100644 index 00000000..4787dd92 --- /dev/null +++ b/persistence/models/EntityType.go @@ -0,0 +1,10 @@ +package models + +// Describe an object type +type EntityType struct { + BaseModel + Name string `gorm:"unique;not null"` + + // GORM relations + Attributs []*Attribut +} diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go new file mode 100644 index 00000000..26ec4a6a --- /dev/null +++ b/persistence/models/Entity_test.go @@ -0,0 +1,48 @@ +package models + +import ( + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +func TestMarshall(t *testing.T) { + id := uuid.MustParse("11e1d4b8-701d-47cc-852f-6d36922bcc75") + ett := &EntityType{ + BaseModel: BaseModel{ID: id}, + Name: "bird", + Attributs: []*Attribut{ + &Attribut{ + BaseModel: BaseModel{ + ID: id, + }, + Name: "color", + DefaultString: "red", + ValueType: StringValueType, + EntityTypeId: id, + }}, + } + + et := &Entity{ + BaseModel: BaseModel{ + ID: id, + }, + Fields: []*Value{&Value{ + BaseModel: BaseModel{ + ID: id, + }, + + IsNull: false, + StringVal: "blue", + EntityId: id, + AttributId: id, + Attribut: ett.Attributs[0], + }}, + EntityTypeId: id, + EntityType: ett, + } + + p, _ := et.MarshalJSON() + assert.JSONEq(t, `{"attrs":{"color":"blue"},"id":"11e1d4b8-701d-47cc-852f-6d36922bcc75","type":"bird", "createdAt":"0001-01-01T00:00:00Z", "updatedAt":"0001-01-01T00:00:00Z"}`, string(p)) +} diff --git a/persistence/models/Tabler.go b/persistence/models/Tabler.go index eac89ab8..45f34256 100644 --- a/persistence/models/Tabler.go +++ b/persistence/models/Tabler.go @@ -3,6 +3,10 @@ package models var ListOfTables = []any{ User{}, Session{}, + Entity{}, + EntityType{}, + Value{}, + Attribut{}, } // The interface "type" need to implement to be considered models diff --git a/persistence/models/Value.go b/persistence/models/Value.go new file mode 100644 index 00000000..a4533d64 --- /dev/null +++ b/persistence/models/Value.go @@ -0,0 +1,320 @@ +package models + +import ( + "encoding/json" + "errors" + "fmt" + + "github.com/google/uuid" + "gorm.io/gorm" +) + +// Describe the attribut value of an Entity +type Value struct { + BaseModel + IsNull bool + StringVal string + FloatVal float64 + IntVal int + BoolVal bool + RelationVal uuid.UUID + + StringifiedValue string + + // GORM relations + EntityId uuid.UUID + AttributId uuid.UUID + Attribut *Attribut +} + +var ( + ErrValueIsNull = errors.New("you can't get the value from a null Value") + ErrAskingForWrongType = errors.New("you can't get this type of value, the attribut type doesn't match") +) + +// Create a new null value +func NewNullValue(attr *Attribut) (*Value, error) { + val := new(Value) + if attr.Required { + return nil, fmt.Errorf("can't create new null value for a required attribut") + } + val.IsNull = true + val.Attribut = attr + return val, nil +} + +// Create a new int value +func NewIntValue(attr *Attribut, i int) (*Value, error) { + val := new(Value) + if attr.ValueType != IntValueType { + return nil, fmt.Errorf("can't create a new int value with a %s attribut", attr.ValueType) + } + val.IsNull = false + val.IntVal = i + val.Attribut = attr + return val, nil +} + +// Create a new bool value +func NewBoolValue(attr *Attribut, b bool) (*Value, error) { + val := new(Value) + if attr.ValueType != BooleanValueType { + return nil, fmt.Errorf("can't create a new bool value with a %s attribut", attr.ValueType) + } + val.IsNull = false + val.BoolVal = b + val.Attribut = attr + return val, nil +} + +// Create a new float value +func NewFloatValue(attr *Attribut, f float64) (*Value, error) { + val := new(Value) + if attr.ValueType != FloatValueType { + return nil, fmt.Errorf("can't create a new float value with a %s attribut", attr.ValueType) + } + val.IsNull = false + val.FloatVal = f + val.Attribut = attr + return val, nil +} + +// Create a new string value +func NewStringValue(attr *Attribut, s string) (*Value, error) { + val := new(Value) + if attr.ValueType != StringValueType { + return nil, fmt.Errorf("can't create a new string value with a %s attribut", attr.ValueType) + } + val.IsNull = false + val.StringVal = s + val.Attribut = attr + return val, nil +} + +// Create a new relation value. +// If et is nil, then the function return an error +// If et is of the wrong types +func NewRelationValue(attr *Attribut, et *Entity) (*Value, error) { + val := new(Value) + if attr.ValueType != RelationValueType { + return nil, fmt.Errorf("can't create a new relation value with a %s attribut", attr.ValueType) + } + if et == nil { + return nil, fmt.Errorf("can't create a new relation with a nill entity pointer") + } + if et.EntityType.ID != attr.TargetEntityTypeId { + return nil, fmt.Errorf("can't create a relation with an entity of wrong EntityType. (got the entityid=%d, expected=%d)", et.EntityType.ID, attr.TargetEntityTypeId) + } + val.IsNull = false + val.RelationVal = et.ID + val.Attribut = attr + return val, nil +} + +// Check if the Value is whole. eg, no fields are nil +func (v *Value) CheckWhole() error { + if v.Attribut == nil { + return fmt.Errorf("the Attribut pointer is nil in Value at %v", v) + } + return nil +} + +// Return the string value +// If the Value is null, it return ErrValueIsNull +// If the Value not of the requested type, it return ErrAskingForWrongType +// If the Value.Attribut == nil, it panic +func (v *Value) GetStringVal() (string, error) { + err := v.CheckWhole() + if err != nil { + panic(err) + } + + if v.IsNull { + if v.Attribut.Default { + return v.Attribut.DefaultString, nil + } + return "", ErrValueIsNull + } + if v.Attribut.ValueType != StringValueType { + return "", ErrAskingForWrongType + } + return v.StringVal, nil +} + +// Return the float value +// If the Value is null, it return ErrValueIsNull +// If the Value not of the requested type, it return ErrAskingForWrongType +// If the Value.Attribut == nil, it panic +func (v *Value) GetFloatVal() (float64, error) { + err := v.CheckWhole() + if err != nil { + panic(err) + } + + if v.IsNull { + if v.Attribut.Default { + return v.Attribut.DefaultFloat, nil + } + return 0.0, ErrValueIsNull + } + if v.Attribut.ValueType != FloatValueType { + return 0.0, ErrAskingForWrongType + } + return v.FloatVal, nil +} + +// Return the int value +// If the Value is null, it return ErrValueIsNull +// If the Value not of the requested type, it return ErrAskingForWrongType +// If the Value.Attribut == nil, it panic +func (v *Value) GetIntVal() (int, error) { + err := v.CheckWhole() + if err != nil { + panic(err) + } + + if v.IsNull { + if v.Attribut.Default { + return v.Attribut.DefaultInt, nil + } + return 0, ErrValueIsNull + } + if v.Attribut.ValueType != IntValueType { + return 0, ErrAskingForWrongType + } + return v.IntVal, nil +} + +// Return the bool value +// If the Value is null, it return ErrValueIsNull +// If the Value not of the requested type, it return ErrAskingForWrongType +// If the Value.Attribut == nil, it panic +func (v *Value) GetBoolVal() (bool, error) { + err := v.CheckWhole() + if err != nil { + panic(err) + } + + if v.IsNull { + if v.Attribut.Default { + return v.Attribut.DefaultBool, nil + } + return false, ErrValueIsNull + } + if v.Attribut.ValueType != BooleanValueType { + return false, ErrAskingForWrongType + } + return v.BoolVal, nil +} + +// Return the Relation value as a *Entity +// If the Value is null, it return nil +// If the Value not of the requested type, it return ErrAskingForWrongType +// If the Value.Attribut == nil, it panic +func (v *Value) GetComputedRelationVal(db *gorm.DB) (*Entity, error) { + err := v.CheckWhole() + if err != nil { + panic(err) + } + if v.Attribut.ValueType != RelationValueType { + return nil, ErrAskingForWrongType + } + + if v.IsNull { + return nil, nil + } + var et Entity + err = db.Preload("Fields").Preload("Fields.Attribut").Preload("EntityType.Attributs").Preload("EntityType").First(&et, v.RelationVal).Error + if err != nil { + return nil, err + } + return &et, nil +} + +// Return the Relation value as an uint (returns the ID) +// If the Value is null, it return nil +// If the Value not of the requested type, it return ErrAskingForWrongType +// If the Value.Attribut == nil, it panic +func (v *Value) GetRelationVal() (uuid.UUID, error) { + err := v.CheckWhole() + if err != nil { + panic(err) + } + if v.Attribut.ValueType != RelationValueType { + return uuid.Nil, ErrAskingForWrongType + } + + if v.IsNull { + return uuid.Nil, fmt.Errorf("the relation is null") + } + return v.RelationVal, nil +} + +// Return the underlying value as an interface +func (v *Value) Value() any { + err := v.CheckWhole() + if err != nil { + panic(err) + } + switch v.Attribut.ValueType { + case StringValueType: + if v.IsNull { + if v.Attribut.Default { + return v.Attribut.DefaultString + } + return nil + } + return v.StringVal + case IntValueType: + if v.IsNull { + if v.Attribut.Default { + return v.Attribut.DefaultInt + } + return nil + } + return v.IntVal + case FloatValueType: + if v.IsNull { + if v.Attribut.Default { + return v.Attribut.DefaultFloat + } + return nil + } + return v.FloatVal + case BooleanValueType: + if v.IsNull { + if v.Attribut.Default { + return v.Attribut.DefaultBool + } + return nil + } + return v.BoolVal + case RelationValueType: + if v.IsNull { + return nil + } + return v.RelationVal + default: + panic(fmt.Errorf( + "this Attribut.ValueType does not exists (got=%s)", + v.Attribut.ValueType, + )) + } +} + +// When Value isNull, it is impossible to build a Key/Value pair +var ErrCantBuildKVPairForNullValue = errors.New("can't build key/value pair from null value") + +// Build a key/value pair to be included in a JSON +// If the value hold an int=8 with an attribut named "voila" then the string returned will be `"voila":8` +func (v *Value) BuildJsonKVPair() (string, error) { + err := v.CheckWhole() + if err != nil { + panic(err) + } + bytes, err := json.Marshal(v.Value()) + if err != nil { + return "", fmt.Errorf("an error happened while trying to marshall the %q attr: (%w)", v.Attribut.Name, err) + } + return fmt.Sprintf("%q:%s", v.Attribut.Name, bytes), nil +} diff --git a/router/router.go b/router/router.go index 8a3088cc..02a23875 100644 --- a/router/router.go +++ b/router/router.go @@ -5,6 +5,7 @@ import ( "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/router/middlewares" + "github.com/gorilla/handlers" "github.com/gorilla/mux" ) @@ -18,6 +19,7 @@ func SetupRouter( // controllers basicAuthentificationController controllers.BasicAuthentificationController, informationController controllers.InformationController, + eavController controllers.EAVController, ) http.Handler { router := mux.NewRouter() router.Use(middlewareLogger.Handle) @@ -38,5 +40,21 @@ func SetupRouter( protected.HandleFunc("/logout", jsonController.Wrap(basicAuthentificationController.Logout)).Methods("GET") - return router + //CRUD + router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.GetObject)).Methods("GET") + // Get whole collection + router.HandleFunc("/v1/objects/{type}/", jsonController.Wrap(eavController.GetAll)).Methods("GET") + router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.DeleteObject)).Methods("DELETE") + router.HandleFunc("/v1/objects/{type}", jsonController.Wrap(eavController.CreateObject)).Methods("POST") + router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.ModifyObject)).Methods("PUT") + + cors := handlers.CORS( + handlers.AllowedMethods([]string{"GET", "POST", "DELETE", "PUT", "OPTIONS"}), + handlers.AllowedHeaders([]string{"Accept", "Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization", "Access-Control-Request-Headers", "Access-Control-Request-Method", "Connection", "Host", "Origin", "User-Agent", "Referer", "Cache-Control", "X-header"}), + handlers.AllowedOrigins([]string{"*"}), + handlers.AllowCredentials(), + handlers.MaxAge(0), + )(router) + + return cors } diff --git a/router/router_test.go b/router/router_test.go index da2f247a..6785d73a 100644 --- a/router/router_test.go +++ b/router/router_test.go @@ -17,6 +17,7 @@ func TestSetupRouter(t *testing.T) { basicController := controllersMocks.NewBasicAuthentificationController(t) informationController := controllersMocks.NewInformationController(t) + eavController := controllersMocks.NewEAVController(t) jsonController.On("Wrap", mock.Anything).Return(func(response http.ResponseWriter, request *http.Request) {}) router := SetupRouter(jsonController, middlewareLogger, authenticationMiddleware, basicController, informationController) assert.NotNil(t, router) diff --git a/scripts/e2e/db/init.sh b/scripts/e2e/db/init.sh index 7231f8bf..a5d76fb0 100644 --- a/scripts/e2e/db/init.sh +++ b/scripts/e2e/db/init.sh @@ -20,6 +20,7 @@ CREATE DATABASE IF NOT EXISTS ${COCKROACH_DB} ; GRANT CONNECT ON DATABASE ${COCKROACH_DB} TO ${COCKROACH_USER}; GRANT USAGE ON SCHEMA public TO ${COCKROACH_USER}; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ${COCKROACH_USER}; +CREATE EXTENSION "uuid-ossp"; EOF cat init.sql diff --git a/scripts/e2e/docker-compose.yml b/scripts/e2e/docker-compose.yml index a6b936a3..ccaaf291 100644 --- a/scripts/e2e/docker-compose.yml +++ b/scripts/e2e/docker-compose.yml @@ -11,15 +11,15 @@ services: - COCKROACH_USER=root - COCKROACH_DB=badaas_db - api: - build: - context: ./../.. - dockerfile: ./scripts/e2e/api/Dockerfile - ports: - - "8000:8000" - restart: always - # environment: - # - BADAAS_PORT=8000 - # - BADAAS_MAX_TIMOUT= 15 # in seconds - depends_on: - - db + # api: + # build: + # context: ./../.. + # dockerfile: ./scripts/e2e/api/Dockerfile + # ports: + # - "8000:8000" + # restart: always + # # environment: + # # - BADAAS_PORT=8000 + # # - BADAAS_MAX_TIMOUT= 15 # in seconds + # depends_on: + # - db diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go new file mode 100644 index 00000000..a54634f9 --- /dev/null +++ b/services/eavservice/eavservice.go @@ -0,0 +1,273 @@ +package eavservice + +import ( + "errors" + "fmt" + "strconv" + + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services/eavservice/utils" + "github.com/google/uuid" + "go.uber.org/zap" + "gorm.io/gorm" +) + +var ( + ErrIdDontMatchEntityType = errors.New("this object doesn't belong to this type") + ErrCantParseUUID = errors.New("can't parse uuid") +) + +// EAV service provide handle EAV objets +type EAVService interface { + GetEntityTypeByName(name string) (*models.EntityType, error) + GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity + DeleteEntity(et *models.Entity) error + GetEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, error) + CreateEntity(ett *models.EntityType, attrs map[string]interface{}) (*models.Entity, error) + UpdateEntity(et *models.Entity, attrs map[string]interface{}) error +} + +type eavServiceImpl struct { + logger *zap.Logger + db *gorm.DB +} + +func NewEAVService( + logger *zap.Logger, + db *gorm.DB, +) EAVService { + return &eavServiceImpl{ + logger: logger, + db: db, + } +} + +// Get EntityType by name (string) +func (eavService *eavServiceImpl) GetEntityTypeByName(name string) (*models.EntityType, error) { + var ett models.EntityType + err := eavService.db.Preload("Attributs").First(&ett, "name = ?", name).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, fmt.Errorf(" EntityType named %q not found", name) + } + } + return &ett, nil +} + +func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity { + var ets []*models.Entity + eavService.db.Where("entity_type_id = ?", ett.ID).Preload("Fields").Preload("Fields.Attribut").Preload("EntityType.Attributs").Preload("EntityType").Find(&ets) + resultSet := make([]*models.Entity, 0, len(ets)) + var keep bool + for _, et := range ets { + keep = true + + for _, value := range et.Fields { + for k, v := range params { + if k == value.Attribut.Name { + switch value.Attribut.ValueType { + case models.StringValueType: + if v != value.StringVal { + keep = false + } + case models.IntValueType: + intVal, err := strconv.Atoi(v) + if err != nil { + break + } + if intVal != value.IntVal { + keep = false + } + case models.FloatValueType: + floatVal, err := strconv.ParseFloat(v, 64) + if err != nil { + break + } + if floatVal != value.FloatVal { + keep = false + } + case models.RelationValueType: + uuidVal, err := uuid.Parse(v) + if err != nil { + keep = false + } + if uuidVal != value.RelationVal { + keep = false + } + case models.BooleanValueType: + boolVal, err := strconv.ParseBool(v) + if err != nil { + break + } + if boolVal != value.BoolVal { + keep = false + } + } + } + } + } + if keep { + resultSet = append(resultSet, et) + } + } + return resultSet +} + +// Delete an entity +func (eavService *eavServiceImpl) DeleteEntity(et *models.Entity) error { + for _, v := range et.Fields { + err := eavService.db.Delete(v).Error + if err != nil { + return err + } + } + return eavService.db.Delete(et).Error +} +func (eavService *eavServiceImpl) GetEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, error) { + var et models.Entity + err := eavService.db.Preload("Fields").Preload("Fields.Attribut").Preload("EntityType.Attributs").Preload("EntityType").First(&et, id).Error + if err != nil { + return nil, err + } + if ett.ID != et.EntityTypeId { + return nil, ErrIdDontMatchEntityType + } + return &et, nil +} + +// Create a brand new entity +func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map[string]interface{}) (*models.Entity, error) { + var et models.Entity + for _, a := range ett.Attributs { + present := false + var value models.Value + for k, v := range attrs { + if k == a.Name { + present = true + switch t := v.(type) { + case string: + if a.ValueType == models.RelationValueType { + uuidVal, err := uuid.Parse(v.(string)) + if err != nil { + return nil, ErrCantParseUUID + } + value = models.Value{RelationVal: uuidVal} + } else if a.ValueType != models.StringValueType { + return nil, fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) + } + value = models.Value{StringVal: v.(string)} + + case float64: + if a.ValueType != models.IntValueType && + a.ValueType != models.FloatValueType && + a.ValueType != models.RelationValueType { + return nil, fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) + } + if utils.IsAnInt(v.(float64)) { + value = models.Value{IntVal: int(v.(float64))} + } else { + // is a float + value = models.Value{FloatVal: v.(float64)} + } + + case bool: + if a.ValueType != models.BooleanValueType { + return nil, fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) + } + value = models.Value{BoolVal: v.(bool)} + + case nil: + if a.Required { + return nil, fmt.Errorf("can't have a null field with a required attribut") + } + value = models.Value{IsNull: true} + + default: + panic("mmmh you just discovered a new json type (https://go.dev/blog/json#generic-json-with-interface)") + } + } + } + if a.Required && !present { + return nil, fmt.Errorf("field %q is missing and is required", a.Name) + } + if !present { + if a.Default { + v, err := a.GetNewDefaultValue() + if err != nil { + return nil, err + } else { + value = *v + } + } else { + value = models.Value{IsNull: true} + } + } + value.Attribut = a + et.Fields = append(et.Fields, &value) + } + et.EntityType = ett + return &et, eavService.db.Create(&et).Error +} + +func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[string]interface{}) error { + for _, a := range et.EntityType.Attributs { + for _, value := range et.Fields { + if a.ID == value.AttributId { + for k, v := range attrs { + if k == a.Name { + switch t := v.(type) { + case string: + if a.ValueType == models.RelationValueType { + uuidVal, err := uuid.Parse(v.(string)) + if err != nil { + return ErrCantParseUUID + } + value.RelationVal = uuidVal + } else if a.ValueType != models.StringValueType { + return fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) + } + value.StringVal = v.(string) + case float64: + if a.ValueType != models.IntValueType && + a.ValueType != models.FloatValueType && + a.ValueType != models.RelationValueType { + return fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) + } + if utils.IsAnInt(v.(float64)) { + // is an int + + value.IntVal = int(v.(float64)) + } else { + // is a float + value.FloatVal = v.(float64) + } + + case bool: + if a.ValueType != models.BooleanValueType { + return fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) + } + value.BoolVal = v.(bool) + + case nil: + if a.Required { + return fmt.Errorf("can't set a required variable to null (expected=%v got=%T)", a.ValueType, t) + } + value.IsNull = true + value.IntVal = 0 + value.FloatVal = 0.0 + value.StringVal = "" + value.BoolVal = false + value.RelationVal = uuid.Nil + + default: + panic("mmmh you just discovered a new json type (https://go.dev/blog/json#generic-json-with-interface)") + } + } + } + value.Attribut = a + eavService.db.Save(value) + } + } + } + return nil +} diff --git a/services/eavservice/utils/json.go b/services/eavservice/utils/json.go new file mode 100644 index 00000000..04d72e54 --- /dev/null +++ b/services/eavservice/utils/json.go @@ -0,0 +1,27 @@ +package utils + +import "strings" + +// build a json from a string slices +// turn []string {`"a",1`, `"b",1`} to `{"a":1,"b":2}` +func BuildJsonFromStrings(pairs []string) string { + var b strings.Builder + // starting the json string + b.WriteString("{") + b.WriteString(strings.Join(pairs, ",")) + //ending the json string + b.WriteString("}") + return b.String() +} + +// build a json list from a string slices +// turn []string {`{"a",1}`, `{"b",1}`} to `["{a":1},{"b":2}]` +func BuildJsonListFromStrings(pairs []string) string { + var b strings.Builder + // starting the json list + b.WriteString("[") + b.WriteString(strings.Join(pairs, ",")) + //ending the json list + b.WriteString("]") + return b.String() +} diff --git a/services/eavservice/utils/json_test.go b/services/eavservice/utils/json_test.go new file mode 100644 index 00000000..9270a8d8 --- /dev/null +++ b/services/eavservice/utils/json_test.go @@ -0,0 +1,58 @@ +package utils_test + +import ( + "testing" + + "github.com/ditrit/badaas/services/eavservice/utils" +) + +type jsonTest struct { + input []string + output string +} + +func TestBuildJsonFromString(t *testing.T) { + testData := []jsonTest{ + { + input: []string{"\"voila\":1"}, + output: "{\"voila\":1}", + }, + { + input: []string{ + "\"voila\":1", + "\"45\":\"231115421 351635 6351sd6351 354qsd35 4qs\"", + }, + output: "{\"voila\":1,\"45\":\"231115421 351635 6351sd6351 354qsd35 4qs\"}", + }, + } + for _, td := range testData { + result := utils.BuildJsonFromStrings(td.input) + if result != td.output { + t.Errorf("Expected %s, got %s", td.output, result) + } + } + +} + +func TestBuildJsonListFromString(t *testing.T) { + testData := []jsonTest{ + { + input: []string{"{\"voila\":1}"}, + output: "[{\"voila\":1}]", + }, + { + input: []string{ + "{\"voila\":1}", + "{\"45\":\"231115421 351635 6351sd6351 354qsd35 4qs\"}", + }, + output: "[{\"voila\":1},{\"45\":\"231115421 351635 6351sd6351 354qsd35 4qs\"}]", + }, + } + for _, td := range testData { + result := utils.BuildJsonListFromStrings(td.input) + if result != td.output { + t.Errorf("Expected %s, got %s", td.output, result) + } + } + +} diff --git a/services/eavservice/utils/math.go b/services/eavservice/utils/math.go new file mode 100644 index 00000000..3a8f49a1 --- /dev/null +++ b/services/eavservice/utils/math.go @@ -0,0 +1,8 @@ +package utils + +import "math" + +//if v=6.36 return false if v=6.000 return true +func IsAnInt(v float64) bool { + return math.Mod(v, 1) == 0 +} diff --git a/services/eavservice/utils/math_test.go b/services/eavservice/utils/math_test.go new file mode 100644 index 00000000..6bab6fb5 --- /dev/null +++ b/services/eavservice/utils/math_test.go @@ -0,0 +1,23 @@ +package utils_test + +import ( + "testing" + + "github.com/ditrit/badaas/services/eavservice/utils" +) + +func TestIsAnINT(t *testing.T) { + data := map[float64]bool{ + 6.32: false, + -45.3: false, + -45.0: true, + 0.0: true, + 1.0000001: false, + } + for k, v := range data { + res := utils.IsAnInt(k) + if res != v { + t.Errorf("expected %v got %v for %f", v, res, k) + } + } +} From 0df569c31f04cc7f421e055a4ada50c041492c0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Roos?= Date: Wed, 11 Jan 2023 11:56:22 +0100 Subject: [PATCH 002/467] wipsdqsdqsd --- commands/rootCmd.go | 107 +++++++++-- demo.md | 232 ++++++++++++++++++++++++ persistence/models/dto/LoginResponse.go | 8 + persistence/models/dto/UserDTO.go | 7 + router/middlewares/JSONHandler.go | 2 +- services/eavservice/eavservice.go | 1 - shell.nix | 20 ++ test.http | 30 +++ 8 files changed, 388 insertions(+), 19 deletions(-) create mode 100644 demo.md create mode 100644 persistence/models/dto/LoginResponse.go create mode 100644 persistence/models/dto/UserDTO.go create mode 100644 shell.nix create mode 100644 test.http diff --git a/commands/rootCmd.go b/commands/rootCmd.go index e568a636..2bf46a99 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -10,6 +10,7 @@ import ( "github.com/ditrit/badaas/persistence" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/router" + "github.com/ditrit/badaas/services/eavservice" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" "github.com/ditrit/verdeter" @@ -31,6 +32,7 @@ func runHTTPServer(cfg *verdeter.VerdeterCommand, args []string) error { fx.Provide(userservice.NewUserService), fx.Provide(sessionservice.NewSessionService), + fx.Provide(eavservice.NewEAVService), // logger for fx fx.WithLogger(func(logger *zap.Logger) fxevent.Logger { return &fxevent.ZapLogger{Logger: logger} @@ -143,45 +145,116 @@ func PopulateDatabase(db *gorm.DB) error { } func PopulateDatabase2(db *gorm.DB) error { + // GETTING THE SUSER ADMIN FOR REFERENCE + USERID := "wowasupercooluserID" + + // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES + ProfileType := &models.EntityType{ + Name: "profile", + } + displayNameAttr := &models.Attribut{ + EntityTypeId: ProfileType.ID, + Name: "displayName", + ValueType: "string", + Required: true, + } + urlPicAttr := &models.Attribut{ + EntityTypeId: ProfileType.ID, + Name: "urlPic", + ValueType: "string", + Required: false, + Default: true, + DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", + } + userIdAttr := &models.Attribut{ + EntityTypeId: ProfileType.ID, + Name: "userId", + ValueType: "string", + Required: true, + } + ProfileType.Attributs = append(ProfileType.Attributs, + displayNameAttr, + urlPicAttr, + userIdAttr, + ) + + // INSTANCIATION OF A Profile + adminProfile := &models.Entity{ + EntityTypeId: ProfileType.ID, + EntityType: ProfileType, + } + displayNameVal := &models.Value{Attribut: urlPicAttr, StringVal: "The Super Admin"} + userPicVal := &models.Value{Attribut: urlPicAttr, IsNull: true} + userIdVal := &models.Value{Attribut: userIdAttr, StringVal: USERID} + adminProfile.Fields = append(adminProfile.Fields, + displayNameVal, + userPicVal, + userIdVal, + ) + + // CREATION OF THE POST TYPE AND ASSOCIATED ATTRIBUTES PostType := &models.EntityType{ Name: "post", } - titleAttr := &models.Attribut{Name: "title", ValueType: "string", Required: true} - bodyAttr := &models.Attribut{Name: "body", ValueType: "string", Default: false, DefaultString: "empty"} - ownerAttr := &models.Attribut{Name: "ownerID", ValueType: "string", Required: true} + titleAttr := &models.Attribut{ + EntityTypeId: PostType.ID, + Name: "title", + ValueType: "string", + Required: true, + } + bodyAttr := &models.Attribut{ + Name: "body", + ValueType: "string", + Default: false, + DefaultString: "empty", + } + ownerAttr := &models.Attribut{ + Name: "ownerID", + ValueType: "string", + Required: true, + } PostType.Attributs = append( PostType.Attributs, titleAttr, bodyAttr, ownerAttr, ) - - whycatslikemices := &models.Entity{EntityTypeId: PostType.ID, EntityType: PostType} - titleVal := &models.Value{Attribut: titleAttr, StringVal: "Why cats like mices ? "} + // INSTANCIATION OF A POST + whycatslikemices := &models.Entity{ + EntityTypeId: PostType.ID, + EntityType: PostType, + } + titleVal := &models.Value{ + Attribut: titleAttr, + StringVal: "Why cats like mices ?", + } bodyVal, err := models.NewStringValue(bodyAttr, `Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. In erat mi, pharetra ut lacinia at, facilisis vitae nunc. Fusce rhoncus id justo vitae gravida. In nisi mi, rutrum et arcu ac, gravida venenatis arcu. Nulla leo metus, molestie eu sagittis non, ultricies eu ex. Fusce a lorem eu urna porttitor molestie. Aliquam nec sapien quam. Suspendisse aliquet elementum arcu vitae interdum. Maecenas nec turpis et nulla volutpat accumsan. Pellentesque non ullamcorper leo, eu fringilla odio. Cras eu felis mauris. Pellentesque varius imperdiet suscipit. Nam tellus odio, faucibus at mattis quis, cursus at tortor. Curabitur vitae mi eu lorem feugiat pretium sed sit amet purus. Proin efficitur, magna eu malesuada fermentum, tortor tortor maximus neque, vel mattis tortor orci a ligula. Nunc nec justo ipsum. Sed fermentum, nisl eget efficitur accumsan, augue nisl sollicitudin massa, vel suscipit enim turpis nec nisi. Nam dictum risus sed leo malesuada varius. Pellentesque gravida interdum risus id vulputate. Mauris feugiat vulputate leo ut euismod. Fusce auctor at lacus eget sollicitudin. Suspendisse potenti. Aliquam dui felis, mollis quis porta a, sodales in ligula. In ac elit ornare, facilisis ex eget, tincidunt orci. Nullam eu mattis turpis, non finibus dolor. - - Ut aliquet laoreet risus, in ultrices purus placerat ut. Aenean eget massa et augue tristique vestibulum eu nec urna. Curabitur id scelerisque felis, ac rutrum massa. In ullamcorper ex ac turpis mattis porttitor. Nunc vitae congue ex, quis porttitor massa. Fusce ut bibendum sem. Phasellus massa dui, venenatis non erat vel, auctor fermentum dolor. Cras aliquet venenatis mauris, eu consectetur massa sodales et. Phasellus lacinia massa vel arcu suscipit congue. Vestibulum mollis tellus nisi. Phasellus at dui eget dolor sagittis vulputate. Nulla vitae est commodo, aliquam urna non, pretium neque. - - Maecenas sodales augue ac neque efficitur pharetra. Maecenas commodo quam magna, vel pulvinar metus condimentum eget. Phasellus malesuada ante quam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque eu justo vel nisl fringilla scelerisque eget ut ex. Duis malesuada, risus sit amet auctor euismod, felis nisl ultrices nulla, eu porttitor arcu elit fermentum velit. Praesent ut sagittis leo. Suspendisse non condimentum nunc, eget rhoncus velit. Praesent tincidunt, arcu mattis faucibus finibus, ligula lectus sodales sapien, sed porta diam nisi vitae ex. Nullam tristique justo at laoreet varius. Ut suscipit, lacus ac ultrices ornare, nisi massa varius felis, quis condimentum dolor tellus at ante. `) if err != nil { - return nil + return err + } + ownerVal := &models.Value{ + Attribut: ownerAttr, + StringVal: USERID, } - var admin models.User - err = db.First(&admin, "username = ?", "admin").Error + whycatslikemices.Fields = append(whycatslikemices.Fields, + titleVal, bodyVal, ownerVal, + ) + + err = db.Create(whycatslikemices).Error if err != nil { return err } - ownerVal := &models.Value{Attribut: ownerAttr, StringVal: admin.ID.String()} - whycatslikemices.Fields = append(whycatslikemices.Fields, - titleVal, bodyVal, ownerVal) + err = db.Create(adminProfile).Error + if err != nil { + return err + } - db.Create(whycatslikemices) fmt.Println("Finished populating the database") return nil diff --git a/demo.md b/demo.md new file mode 100644 index 00000000..aec12950 --- /dev/null +++ b/demo.md @@ -0,0 +1,232 @@ +# Demoing badaas authentication and object storage + +## Setting up + +First we need to setup the database connection. (Please head to the `configuration.md` page to learn more.) +The minimal configuration for the database looks like this: + +```yml +# The settings for the database. +database: + # The host of the database server. + # (mandatory) + host: + + # The port of the database server. + # (mandatory) + port: + + # The sslmode of the connection to the database server. + # (mandatory) + sslmode: + + # The username of the account on the database server. + # (mandatory) + username: + + # The password of the account on the database server. + # (mandatory) + password: +``` + +Then we need to declare our models for the objects. +As an exemple we will use some UML to modelize the objects for this demo. + +```mermaid +classDiagram + class Post{ + title String + body String + ownerID String + } + class Profile { + displayName String + urlPic String + userId String + } +``` + +The users are stored on a classic sql table outside of the object storage engine. +So we will store their IDs as a value. We will use the profile object to store infos about the users. + +For now we need to setup the schema manually using a invoke function that will run at the initializationof the programm. +Make sure that the database you are gonna use is empty. + +```go +func PopulateDatabase2(db *gorm.DB) error { + // GETTING THE USER ADMIN FOR REFERENCE + var admin models.User + err := db.First(&admin, "username = ?", "admin").Error + if err != nil { + return err + } + + // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES + ProfileType := &models.EntityType{ + Name: "profile", + } + displayNameAttr := &models.Attribut{ + EntityTypeId: ProfileType.ID, + Name: "displayName", + ValueType: "string", + Required: true, + } + urlPicAttr := &models.Attribut{ + EntityTypeId: ProfileType.ID, + Name: "urlPic", + ValueType: "string", + Required: false, + Default: true, + DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", + } + userIdAttr := &models.Attribut{ + EntityTypeId: ProfileType.ID, + Name: "userId", + ValueType: "string", + Required: true, + } + ProfileType.Attributs = append(ProfileType.Attributs, + displayNameAttr, + urlPicAttr, + userIdAttr, + ) + + // INSTANCIATION OF A Profile + adminProfile := &models.Entity{ + EntityTypeId: ProfileType.ID, + EntityType: ProfileType, + } + displayNameVal := &models.Value{Attribut: urlPicAttr, StringVal: "The Super Admin"} + userPicVal := &models.Value{Attribut: urlPicAttr, IsNull: true} + userIdVal := &models.Value{Attribut: userIdAttr, StringVal: admin.ID.String()} + adminProfile.Fields = append(adminProfile.Fields, + displayNameVal, + userPicVal, + userIdVal, + ) + + // CREATION OF THE POST TYPE AND ASSOCIATED ATTRIBUTES + PostType := &models.EntityType{ + Name: "post", + } + titleAttr := &models.Attribut{ + EntityTypeId: PostType.ID, + Name: "title", + ValueType: "string", + Required: true, + } + bodyAttr := &models.Attribut{ + Name: "body", + ValueType: "string", + Default: false, + DefaultString: "empty", + } + ownerAttr := &models.Attribut{ + Name: "ownerID", + ValueType: "string", + Required: true, + } + + PostType.Attributs = append( + PostType.Attributs, titleAttr, bodyAttr, ownerAttr, + ) + // INSTANCIATION OF A POST + whycatslikemices := &models.Entity{ + EntityTypeId: PostType.ID, + EntityType: PostType, + } + titleVal := &models.Value{ + Attribut: titleAttr, + StringVal: "Why cats like mices ?", + } + bodyVal, err := models.NewStringValue(bodyAttr, + `Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. In erat mi, pharetra ut lacinia at, facilisis vitae nunc. Fusce rhoncus id justo vitae gravida. In nisi mi, rutrum et arcu ac, gravida venenatis arcu. Nulla leo metus, molestie eu sagittis non, ultricies eu ex. Fusce a lorem eu urna porttitor molestie. Aliquam nec sapien quam. Suspendisse aliquet elementum arcu vitae interdum. Maecenas nec turpis et nulla volutpat accumsan. Pellentesque non ullamcorper leo, eu fringilla odio. + + Cras eu felis mauris. Pellentesque varius imperdiet suscipit. Nam tellus odio, faucibus at mattis quis, cursus at tortor. Curabitur vitae mi eu lorem feugiat pretium sed sit amet purus. Proin efficitur, magna eu malesuada fermentum, tortor tortor maximus neque, vel mattis tortor orci a ligula. Nunc nec justo ipsum. Sed fermentum, nisl eget efficitur accumsan, augue nisl sollicitudin massa, vel suscipit enim turpis nec nisi. + + Nam dictum risus sed leo malesuada varius. Pellentesque gravida interdum risus id vulputate. Mauris feugiat vulputate leo ut euismod. Fusce auctor at lacus eget sollicitudin. Suspendisse potenti. Aliquam dui felis, mollis quis porta a, sodales in ligula. In ac elit ornare, facilisis ex eget, tincidunt orci. Nullam eu mattis turpis, non finibus dolor. + `) + if err != nil { + return err + } + ownerVal := &models.Value{ + Attribut: ownerAttr, + StringVal: admin.ID.String(), + } + + whycatslikemices.Fields = append(whycatslikemices.Fields, + titleVal, bodyVal, ownerVal, + ) + + err = db.Create(whycatslikemices).Error + if err != nil { + return err + } + + err = db.Create(adminProfile).Error + if err != nil { + return err + } + + fmt.Println("Finished populating the database") + + return nil +} +``` + +### Authentication + +Currently we only support a basic authentication using an email and a password. +The default credentials for the user are ̀`admin-no-reply@badaas.com` and `admin` (The admin password can be changed on the first run through the config, please see [configuration.md](configuration.md)). + +### Querying the object storage engine + +I will the httpie utils in the examples below, but it works with curl or any similar tools. + +Let's first start by get all the profiles: `http localhost:8000/v1/objects/profile/` + + +```json +HTTP/1.1 200 OK +Content-Length: 226 +Content-Type: application/json +Date: Thu, 05 Jan 2023 11:53:35 GMT + +[ + { + "attrs": { + "urlPic": "The Super Admin", + "userId": "wowasupercooluserID" + }, + "createdAt": "2023-01-05T12:47:41.166796+01:00", + "id": "67c5c6dc-b82d-4c2a-9ab8-f7847a732086", + "type": "profile", + "updatedAt": "2023-01-05T12:47:41.166796+01:00" + } +] +``` + +Let's all the posts posted by this user: `http localhost:8000/v1/objects/post/?ownerID=wowasupercooluserID` + + +```json +HTTP/1.1 200 OK +Content-Length: 1626 +Content-Type: application/json +Date: Fri, 06 Jan 2023 08:20:33 GMT + +[ + { + "attrs": { + "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. In erat mi, pharetra ut lacinia at, facilisis vitae nunc. Fusce rhoncus id justo vitae gravida. In nisi mi, rutrum et arcu ac, gravida venenatis arcu. Nulla leo metus, molestie eu sagittis non, ultricies eu ex. Fusce a lorem eu urna porttitor molestie. Aliquam nec sapien quam. Suspendisse aliquet elementum arcu vitae interdum. Maecenas nec turpis et nulla volutpat accumsan. Pellentesque non ullamcorper leo, eu fringilla odio.\n\t\n\tCras eu felis mauris. Pellentesque varius imperdiet suscipit. Nam tellus odio, faucibus at mattis quis, cursus at tortor. Curabitur vitae mi eu lorem feugiat pretium sed sit amet purus. Proin efficitur, magna eu malesuada fermentum, tortor tortor maximus neque, vel mattis tortor orci a ligula. Nunc nec justo ipsum. Sed fermentum, nisl eget efficitur accumsan, augue nisl sollicitudin massa, vel suscipit enim turpis nec nisi.\n\t\n\tNam dictum risus sed leo malesuada varius. Pellentesque gravida interdum risus id vulputate. Mauris feugiat vulputate leo ut euismod. Fusce auctor at lacus eget sollicitudin. Suspendisse potenti. Aliquam dui felis, mollis quis porta a, sodales in ligula. In ac elit ornare, facilisis ex eget, tincidunt orci. Nullam eu mattis turpis, non finibus dolor.\n\t", + "ownerID": "wowasupercooluserID", + "title": "Why cats like mices ?" + }, + "createdAt": "2023-01-06T09:18:53.313565+01:00", + "id": "68facfa6-fe77-479b-a64e-f26344393a31", + "type": "post", + "updatedAt": "2023-01-06T09:18:53.313565+01:00" + } +] +``` + diff --git a/persistence/models/dto/LoginResponse.go b/persistence/models/dto/LoginResponse.go new file mode 100644 index 00000000..675c670b --- /dev/null +++ b/persistence/models/dto/LoginResponse.go @@ -0,0 +1,8 @@ +package dto + +// DTOLoginSuccess is a dto returned to the client when the authentication is successful. +type DTOLoginSuccess struct { + Email string `json:"email"` + ID string `json:"id"` + Username string `json:"username"` +} diff --git a/persistence/models/dto/UserDTO.go b/persistence/models/dto/UserDTO.go new file mode 100644 index 00000000..f808d676 --- /dev/null +++ b/persistence/models/dto/UserDTO.go @@ -0,0 +1,7 @@ +package dto + +type DTOUserInfo struct { + Username string `json:"username"` + Email string `json:"email` + +} diff --git a/router/middlewares/JSONHandler.go b/router/middlewares/JSONHandler.go index 729b8400..30ecf9c1 100644 --- a/router/middlewares/JSONHandler.go +++ b/router/middlewares/JSONHandler.go @@ -6,5 +6,5 @@ import ( "github.com/ditrit/badaas/httperrors" ) -// This handler return a Marshable object and/or an [github.com/ditrit/badaas/services/httperrors.HTTPError] +// This handler return a Marshable object and/or an [github.com/ditrit/badaas/httperrors.HTTPError] type JSONHandler func(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index a54634f9..0ef339c1 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -61,7 +61,6 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, var keep bool for _, et := range ets { keep = true - for _, value := range et.Fields { for k, v := range params { if k == value.Attribut.Name { diff --git a/shell.nix b/shell.nix new file mode 100644 index 00000000..5c0c010d --- /dev/null +++ b/shell.nix @@ -0,0 +1,20 @@ +{ pkgs ? import { } }: + +with pkgs; + +mkShell { + name = "badaas-shell"; + + buildInputs = [ + go + gotools + gopls + go-outline + gocode + gopkgs + gocode-gomod + godef + golint + golangci-lint + ]; +} diff --git a/test.http b/test.http new file mode 100644 index 00000000..75212e6e --- /dev/null +++ b/test.http @@ -0,0 +1,30 @@ +@hostname = localhost +@port = 8000 +@host = {{hostname}}:{{port}} + +@URI = http://{{hostname}}:{{port}} + +GET {{URI}}/info HTTP/1.1 + +### + +POST {{URI}}/login HTTP/1.1 +content-type: application/json + +{ + "email": "superadmin@badaas.test", + "password": "1234" +} + +### + +GET {{URI}}/logout HTTP/1.1 + +### + +GET {{URI}}/protected HTTP/1.1 + +### + + +GET {{URI}}/auth/oidc/redirect-url HTTP/1.1 \ No newline at end of file From ae878fb4f892cf40e089d935ba3b9394f5cc97f1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Apr 2023 11:23:27 +0200 Subject: [PATCH 003/467] fix compilation errors --- persistence/models/dto/LoginResponse.go | 8 -------- router/router_test.go | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 persistence/models/dto/LoginResponse.go diff --git a/persistence/models/dto/LoginResponse.go b/persistence/models/dto/LoginResponse.go deleted file mode 100644 index 675c670b..00000000 --- a/persistence/models/dto/LoginResponse.go +++ /dev/null @@ -1,8 +0,0 @@ -package dto - -// DTOLoginSuccess is a dto returned to the client when the authentication is successful. -type DTOLoginSuccess struct { - Email string `json:"email"` - ID string `json:"id"` - Username string `json:"username"` -} diff --git a/router/router_test.go b/router/router_test.go index 6785d73a..3b52a035 100644 --- a/router/router_test.go +++ b/router/router_test.go @@ -19,6 +19,6 @@ func TestSetupRouter(t *testing.T) { informationController := controllersMocks.NewInformationController(t) eavController := controllersMocks.NewEAVController(t) jsonController.On("Wrap", mock.Anything).Return(func(response http.ResponseWriter, request *http.Request) {}) - router := SetupRouter(jsonController, middlewareLogger, authenticationMiddleware, basicController, informationController) + router := SetupRouter(jsonController, middlewareLogger, authenticationMiddleware, basicController, informationController, eavController) assert.NotNil(t, router) } From f542ba5986eac1539a997c46738f49016ecb223d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Apr 2023 11:23:49 +0200 Subject: [PATCH 004/467] delete inecesary spaces --- scripts/e2e/api/Dockerfile | 2 +- scripts/e2e/api/badaas.yml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/e2e/api/Dockerfile b/scripts/e2e/api/Dockerfile index 49bdc272..68d01b3d 100644 --- a/scripts/e2e/api/Dockerfile +++ b/scripts/e2e/api/Dockerfile @@ -8,5 +8,5 @@ RUN CGO_ENABLED=1 go build --race -a -o badaas . FROM alpine:3.16.2 ENV BADAAS_PORT=8000 COPY --from=builder /app/badaas . -COPY ./scripts/e2e/api/badaas.yml . +COPY ./scripts/e2e/api/badaas.yml . ENTRYPOINT [ "./badaas" ] diff --git a/scripts/e2e/api/badaas.yml b/scripts/e2e/api/badaas.yml index 831b12d8..081fad8f 100644 --- a/scripts/e2e/api/badaas.yml +++ b/scripts/e2e/api/badaas.yml @@ -3,10 +3,9 @@ server: host: "0.0.0.0" # listening on all interfaces timeout: 15 # in seconds pagination: - page: + page: max: 10 - database: host: e2e-db-1 port: 26257 From 7b7c0ea37a7a4bc9144d30b9b6f8c098d28f4b12 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Apr 2023 11:29:26 +0200 Subject: [PATCH 005/467] fix structtag warning --- persistence/models/dto/UserDTO.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/persistence/models/dto/UserDTO.go b/persistence/models/dto/UserDTO.go index f808d676..05720624 100644 --- a/persistence/models/dto/UserDTO.go +++ b/persistence/models/dto/UserDTO.go @@ -2,6 +2,5 @@ package dto type DTOUserInfo struct { Username string `json:"username"` - Email string `json:"email` - + Email string `json:"email"` } From 08dd6361fb774d48464ea156580e9fadf8324035 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Apr 2023 11:48:54 +0200 Subject: [PATCH 006/467] fix some code style --- commands/rootCmd.go | 4 ++-- persistence/models/Entity.go | 4 ---- persistence/models/Value.go | 5 ++++- persistence/models/dto/LoginSuccess.go | 2 +- router/router.go | 8 +++++++- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/commands/rootCmd.go b/commands/rootCmd.go index f4a93b9a..db5aa595 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -166,7 +166,7 @@ func PopulateDatabase2(db *gorm.DB) error { ValueType: "string", Required: false, Default: true, - DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", + DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", //nolint:lll } userIdAttr := &models.Attribut{ EntityTypeId: ProfileType.ID, @@ -234,7 +234,7 @@ func PopulateDatabase2(db *gorm.DB) error { Cras eu felis mauris. Pellentesque varius imperdiet suscipit. Nam tellus odio, faucibus at mattis quis, cursus at tortor. Curabitur vitae mi eu lorem feugiat pretium sed sit amet purus. Proin efficitur, magna eu malesuada fermentum, tortor tortor maximus neque, vel mattis tortor orci a ligula. Nunc nec justo ipsum. Sed fermentum, nisl eget efficitur accumsan, augue nisl sollicitudin massa, vel suscipit enim turpis nec nisi. Nam dictum risus sed leo malesuada varius. Pellentesque gravida interdum risus id vulputate. Mauris feugiat vulputate leo ut euismod. Fusce auctor at lacus eget sollicitudin. Suspendisse potenti. Aliquam dui felis, mollis quis porta a, sodales in ligula. In ac elit ornare, facilisis ex eget, tincidunt orci. Nullam eu mattis turpis, non finibus dolor. - `) + `) //nolint:lll if err != nil { return err } diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index b3730d27..6db9e9be 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -66,11 +66,7 @@ func (e *Entity) EncodeToJson() []byte { var pairs []string pairs = append(pairs, fmt.Sprintf("%q: %d", "id", e.ID), - ) - pairs = append(pairs, fmt.Sprintf("%q: %q", "type", e.EntityType.Name), - ) - pairs = append(pairs, fmt.Sprintf("%q: %s", "attrs", e.encodeAttributesold()), ) return []byte(utils.BuildJsonFromStrings(pairs)) diff --git a/persistence/models/Value.go b/persistence/models/Value.go index a4533d64..8ebbc941 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -103,7 +103,10 @@ func NewRelationValue(attr *Attribut, et *Entity) (*Value, error) { return nil, fmt.Errorf("can't create a new relation with a nill entity pointer") } if et.EntityType.ID != attr.TargetEntityTypeId { - return nil, fmt.Errorf("can't create a relation with an entity of wrong EntityType. (got the entityid=%d, expected=%d)", et.EntityType.ID, attr.TargetEntityTypeId) + return nil, fmt.Errorf( + "can't create a relation with an entity of wrong EntityType. (got the entityid=%d, expected=%d)", + et.EntityType.ID, attr.TargetEntityTypeId, + ) } val.IsNull = false val.RelationVal = et.ID diff --git a/persistence/models/dto/LoginSuccess.go b/persistence/models/dto/LoginSuccess.go index 3601e975..675c670b 100644 --- a/persistence/models/dto/LoginSuccess.go +++ b/persistence/models/dto/LoginSuccess.go @@ -5,4 +5,4 @@ type DTOLoginSuccess struct { Email string `json:"email"` ID string `json:"id"` Username string `json:"username"` -} \ No newline at end of file +} diff --git a/router/router.go b/router/router.go index 02a23875..224861ac 100644 --- a/router/router.go +++ b/router/router.go @@ -50,7 +50,13 @@ func SetupRouter( cors := handlers.CORS( handlers.AllowedMethods([]string{"GET", "POST", "DELETE", "PUT", "OPTIONS"}), - handlers.AllowedHeaders([]string{"Accept", "Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization", "Access-Control-Request-Headers", "Access-Control-Request-Method", "Connection", "Host", "Origin", "User-Agent", "Referer", "Cache-Control", "X-header"}), + handlers.AllowedHeaders([]string{ + "Accept", "Content-Type", "Content-Length", + "Accept-Encoding", "X-CSRF-Token", "Authorization", + "Access-Control-Request-Headers", "Access-Control-Request-Method", + "Connection", "Host", "Origin", "User-Agent", "Referer", + "Cache-Control", "X-header", + }), handlers.AllowedOrigins([]string{"*"}), handlers.AllowCredentials(), handlers.MaxAge(0), From b3bbb9679311ed8fab7cb8a30ee136a0d455de2c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Apr 2023 12:04:07 +0200 Subject: [PATCH 007/467] fix typo in attribute --- commands/rootCmd.go | 48 +++---- demo.md | 49 ++++--- .../models/{Attribut.go => Attribute.go} | 4 +- persistence/models/Entity.go | 6 +- persistence/models/EntityType.go | 2 +- persistence/models/Entity_test.go | 14 +- persistence/models/Tabler.go | 2 +- persistence/models/Value.go | 120 +++++++++--------- services/eavservice/eavservice.go | 22 ++-- 9 files changed, 132 insertions(+), 135 deletions(-) rename persistence/models/{Attribut.go => Attribute.go} (95%) diff --git a/commands/rootCmd.go b/commands/rootCmd.go index db5aa595..85b9f762 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -80,9 +80,9 @@ func PopulateDatabase(db *gorm.DB) error { HumanType := &models.EntityType{ Name: "human", } - nameAttr := &models.Attribut{Name: "name", ValueType: "string", Required: true} - HumanType.Attributs = append( - HumanType.Attributs, nameAttr, + nameAttr := &models.Attribute{Name: "name", ValueType: "string", Required: true} + HumanType.Attributes = append( + HumanType.Attributes, nameAttr, ) bobName, err := models.NewStringValue(nameAttr, "bob") if err != nil { @@ -102,17 +102,17 @@ func PopulateDatabase(db *gorm.DB) error { db.Create(jean) // Defining a bird - colorAttr := &models.Attribut{Name: "color", ValueType: "string", Required: true} - specieAttr := &models.Attribut{Name: "specie", ValueType: "string", Required: true} - heightAttr := &models.Attribut{Name: "height", ValueType: "int", Default: true, DefaultInt: 12, Required: false} - weightAttr := &models.Attribut{Name: "weight", ValueType: "float", Default: true, DefaultFloat: 12.500, Required: false} - ownerAttr := &models.Attribut{Name: "owner", ValueType: "relation", Required: false, TargetEntityTypeId: HumanType.ID} + colorAttr := &models.Attribute{Name: "color", ValueType: "string", Required: true} + specieAttr := &models.Attribute{Name: "specie", ValueType: "string", Required: true} + heightAttr := &models.Attribute{Name: "height", ValueType: "int", Default: true, DefaultInt: 12, Required: false} + weightAttr := &models.Attribute{Name: "weight", ValueType: "float", Default: true, DefaultFloat: 12.500, Required: false} + ownerAttr := &models.Attribute{Name: "owner", ValueType: "relation", Required: false, TargetEntityTypeId: HumanType.ID} BirdType := &models.EntityType{ Name: "bird", } - BirdType.Attributs = append( - BirdType.Attributs, colorAttr, specieAttr, heightAttr, weightAttr, ownerAttr, + BirdType.Attributes = append( + BirdType.Attributes, colorAttr, specieAttr, heightAttr, weightAttr, ownerAttr, ) val1, err := models.NewStringValue(colorAttr, "blue") @@ -154,13 +154,13 @@ func PopulateDatabase2(db *gorm.DB) error { ProfileType := &models.EntityType{ Name: "profile", } - displayNameAttr := &models.Attribut{ + displayNameAttr := &models.Attribute{ EntityTypeId: ProfileType.ID, Name: "displayName", ValueType: "string", Required: true, } - urlPicAttr := &models.Attribut{ + urlPicAttr := &models.Attribute{ EntityTypeId: ProfileType.ID, Name: "urlPic", ValueType: "string", @@ -168,13 +168,13 @@ func PopulateDatabase2(db *gorm.DB) error { Default: true, DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", //nolint:lll } - userIdAttr := &models.Attribut{ + userIdAttr := &models.Attribute{ EntityTypeId: ProfileType.ID, Name: "userId", ValueType: "string", Required: true, } - ProfileType.Attributs = append(ProfileType.Attributs, + ProfileType.Attributes = append(ProfileType.Attributes, displayNameAttr, urlPicAttr, userIdAttr, @@ -185,9 +185,9 @@ func PopulateDatabase2(db *gorm.DB) error { EntityTypeId: ProfileType.ID, EntityType: ProfileType, } - displayNameVal := &models.Value{Attribut: urlPicAttr, StringVal: "The Super Admin"} - userPicVal := &models.Value{Attribut: urlPicAttr, IsNull: true} - userIdVal := &models.Value{Attribut: userIdAttr, StringVal: USERID} + displayNameVal := &models.Value{Attribute: urlPicAttr, StringVal: "The Super Admin"} + userPicVal := &models.Value{Attribute: urlPicAttr, IsNull: true} + userIdVal := &models.Value{Attribute: userIdAttr, StringVal: USERID} adminProfile.Fields = append(adminProfile.Fields, displayNameVal, userPicVal, @@ -198,26 +198,26 @@ func PopulateDatabase2(db *gorm.DB) error { PostType := &models.EntityType{ Name: "post", } - titleAttr := &models.Attribut{ + titleAttr := &models.Attribute{ EntityTypeId: PostType.ID, Name: "title", ValueType: "string", Required: true, } - bodyAttr := &models.Attribut{ + bodyAttr := &models.Attribute{ Name: "body", ValueType: "string", Default: false, DefaultString: "empty", } - ownerAttr := &models.Attribut{ + ownerAttr := &models.Attribute{ Name: "ownerID", ValueType: "string", Required: true, } - PostType.Attributs = append( - PostType.Attributs, titleAttr, bodyAttr, ownerAttr, + PostType.Attributes = append( + PostType.Attributes, titleAttr, bodyAttr, ownerAttr, ) // INSTANCIATION OF A POST whycatslikemices := &models.Entity{ @@ -225,7 +225,7 @@ func PopulateDatabase2(db *gorm.DB) error { EntityType: PostType, } titleVal := &models.Value{ - Attribut: titleAttr, + Attribute: titleAttr, StringVal: "Why cats like mices ?", } bodyVal, err := models.NewStringValue(bodyAttr, @@ -239,7 +239,7 @@ func PopulateDatabase2(db *gorm.DB) error { return err } ownerVal := &models.Value{ - Attribut: ownerAttr, + Attribute: ownerAttr, StringVal: USERID, } diff --git a/demo.md b/demo.md index aec12950..cd4c7431 100644 --- a/demo.md +++ b/demo.md @@ -30,7 +30,7 @@ database: ``` Then we need to declare our models for the objects. -As an exemple we will use some UML to modelize the objects for this demo. +As an example we will use some UML to model the objects for this demo. ```mermaid classDiagram @@ -49,7 +49,7 @@ classDiagram The users are stored on a classic sql table outside of the object storage engine. So we will store their IDs as a value. We will use the profile object to store infos about the users. -For now we need to setup the schema manually using a invoke function that will run at the initializationof the programm. +For now we need to setup the schema manually using a invoke function that will run at the initialization of the programme. Make sure that the database you are gonna use is empty. ```go @@ -65,13 +65,13 @@ func PopulateDatabase2(db *gorm.DB) error { ProfileType := &models.EntityType{ Name: "profile", } - displayNameAttr := &models.Attribut{ + displayNameAttr := &models.Attribute{ EntityTypeId: ProfileType.ID, Name: "displayName", ValueType: "string", Required: true, } - urlPicAttr := &models.Attribut{ + urlPicAttr := &models.Attribute{ EntityTypeId: ProfileType.ID, Name: "urlPic", ValueType: "string", @@ -79,26 +79,26 @@ func PopulateDatabase2(db *gorm.DB) error { Default: true, DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", } - userIdAttr := &models.Attribut{ + userIdAttr := &models.Attribute{ EntityTypeId: ProfileType.ID, Name: "userId", ValueType: "string", Required: true, } - ProfileType.Attributs = append(ProfileType.Attributs, + ProfileType.Attributes = append(ProfileType.Attributes, displayNameAttr, urlPicAttr, userIdAttr, ) - // INSTANCIATION OF A Profile + // INSTANTIATION OF A Profile adminProfile := &models.Entity{ EntityTypeId: ProfileType.ID, EntityType: ProfileType, } - displayNameVal := &models.Value{Attribut: urlPicAttr, StringVal: "The Super Admin"} - userPicVal := &models.Value{Attribut: urlPicAttr, IsNull: true} - userIdVal := &models.Value{Attribut: userIdAttr, StringVal: admin.ID.String()} + displayNameVal := &models.Value{Attribute: urlPicAttr, StringVal: "The Super Admin"} + userPicVal := &models.Value{Attribute: urlPicAttr, IsNull: true} + userIdVal := &models.Value{Attribute: userIdAttr, StringVal: admin.ID.String()} adminProfile.Fields = append(adminProfile.Fields, displayNameVal, userPicVal, @@ -109,35 +109,35 @@ func PopulateDatabase2(db *gorm.DB) error { PostType := &models.EntityType{ Name: "post", } - titleAttr := &models.Attribut{ + titleAttr := &models.Attribute{ EntityTypeId: PostType.ID, Name: "title", ValueType: "string", Required: true, } - bodyAttr := &models.Attribut{ + bodyAttr := &models.Attribute{ Name: "body", ValueType: "string", Default: false, DefaultString: "empty", } - ownerAttr := &models.Attribut{ + ownerAttr := &models.Attribute{ Name: "ownerID", ValueType: "string", Required: true, } - PostType.Attributs = append( - PostType.Attributs, titleAttr, bodyAttr, ownerAttr, + PostType.Attributes = append( + PostType.Attributes, titleAttr, bodyAttr, ownerAttr, ) - // INSTANCIATION OF A POST - whycatslikemices := &models.Entity{ + // INSTANTIATION OF A POST + whycatslikemice := &models.Entity{ EntityTypeId: PostType.ID, EntityType: PostType, } titleVal := &models.Value{ - Attribut: titleAttr, - StringVal: "Why cats like mices ?", + Attribute: titleAttr, + StringVal: "Why cats like mice ?", } bodyVal, err := models.NewStringValue(bodyAttr, `Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. In erat mi, pharetra ut lacinia at, facilisis vitae nunc. Fusce rhoncus id justo vitae gravida. In nisi mi, rutrum et arcu ac, gravida venenatis arcu. Nulla leo metus, molestie eu sagittis non, ultricies eu ex. Fusce a lorem eu urna porttitor molestie. Aliquam nec sapien quam. Suspendisse aliquet elementum arcu vitae interdum. Maecenas nec turpis et nulla volutpat accumsan. Pellentesque non ullamcorper leo, eu fringilla odio. @@ -150,15 +150,15 @@ func PopulateDatabase2(db *gorm.DB) error { return err } ownerVal := &models.Value{ - Attribut: ownerAttr, + Attribute: ownerAttr, StringVal: admin.ID.String(), } - whycatslikemices.Fields = append(whycatslikemices.Fields, + whycatslikemice.Fields = append(whycatslikemice.Fields, titleVal, bodyVal, ownerVal, ) - err = db.Create(whycatslikemices).Error + err = db.Create(whycatslikemice).Error if err != nil { return err } @@ -185,7 +185,6 @@ I will the httpie utils in the examples below, but it works with curl or any sim Let's first start by get all the profiles: `http localhost:8000/v1/objects/profile/` - ```json HTTP/1.1 200 OK Content-Length: 226 @@ -208,7 +207,6 @@ Date: Thu, 05 Jan 2023 11:53:35 GMT Let's all the posts posted by this user: `http localhost:8000/v1/objects/post/?ownerID=wowasupercooluserID` - ```json HTTP/1.1 200 OK Content-Length: 1626 @@ -220,7 +218,7 @@ Date: Fri, 06 Jan 2023 08:20:33 GMT "attrs": { "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. In erat mi, pharetra ut lacinia at, facilisis vitae nunc. Fusce rhoncus id justo vitae gravida. In nisi mi, rutrum et arcu ac, gravida venenatis arcu. Nulla leo metus, molestie eu sagittis non, ultricies eu ex. Fusce a lorem eu urna porttitor molestie. Aliquam nec sapien quam. Suspendisse aliquet elementum arcu vitae interdum. Maecenas nec turpis et nulla volutpat accumsan. Pellentesque non ullamcorper leo, eu fringilla odio.\n\t\n\tCras eu felis mauris. Pellentesque varius imperdiet suscipit. Nam tellus odio, faucibus at mattis quis, cursus at tortor. Curabitur vitae mi eu lorem feugiat pretium sed sit amet purus. Proin efficitur, magna eu malesuada fermentum, tortor tortor maximus neque, vel mattis tortor orci a ligula. Nunc nec justo ipsum. Sed fermentum, nisl eget efficitur accumsan, augue nisl sollicitudin massa, vel suscipit enim turpis nec nisi.\n\t\n\tNam dictum risus sed leo malesuada varius. Pellentesque gravida interdum risus id vulputate. Mauris feugiat vulputate leo ut euismod. Fusce auctor at lacus eget sollicitudin. Suspendisse potenti. Aliquam dui felis, mollis quis porta a, sodales in ligula. In ac elit ornare, facilisis ex eget, tincidunt orci. Nullam eu mattis turpis, non finibus dolor.\n\t", "ownerID": "wowasupercooluserID", - "title": "Why cats like mices ?" + "title": "Why cats like mice ?" }, "createdAt": "2023-01-06T09:18:53.313565+01:00", "id": "68facfa6-fe77-479b-a64e-f26344393a31", @@ -229,4 +227,3 @@ Date: Fri, 06 Jan 2023 08:20:33 GMT } ] ``` - diff --git a/persistence/models/Attribut.go b/persistence/models/Attribute.go similarity index 95% rename from persistence/models/Attribut.go rename to persistence/models/Attribute.go index 87dd002f..bbb2002a 100644 --- a/persistence/models/Attribut.go +++ b/persistence/models/Attribute.go @@ -19,7 +19,7 @@ const ( type ValueTypeT string // Describe the attribut of a en EntityType -type Attribut struct { +type Attribute struct { BaseModel Name string Unique bool @@ -45,7 +45,7 @@ type Attribut struct { var ErrNoDefaultValueSet = errors.New("no default value found") // Get a new value with the default value associated with the attribut -func (a *Attribut) GetNewDefaultValue() (*Value, error) { +func (a *Attribute) GetNewDefaultValue() (*Value, error) { if !a.Default { return nil, ErrNoDefaultValueSet } diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 6db9e9be..9ab02723 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -37,14 +37,14 @@ func (e *Entity) encodeAttributes() map[string]any { if field.IsNull { continue } - pairs[field.Attribut.Name] = field.Value() + pairs[field.Attribute.Name] = field.Value() } return pairs } func (e *Entity) GetValue(attrName string) (interface{}, error) { var attrId uuid.UUID - for _, a := range e.EntityType.Attributs { + for _, a := range e.EntityType.Attributes { if a.Name == attrName { attrId = a.ID break @@ -54,7 +54,7 @@ func (e *Entity) GetValue(attrName string) (interface{}, error) { return nil, fmt.Errorf("attr not found: got=%s", attrName) } for _, v := range e.Fields { - if v.AttributId == attrId { + if v.AttributeId == attrId { return v.Value(), nil } } diff --git a/persistence/models/EntityType.go b/persistence/models/EntityType.go index 4787dd92..c862ec5f 100644 --- a/persistence/models/EntityType.go +++ b/persistence/models/EntityType.go @@ -6,5 +6,5 @@ type EntityType struct { Name string `gorm:"unique;not null"` // GORM relations - Attributs []*Attribut + Attributes []*Attribute } diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go index 26ec4a6a..4402e05f 100644 --- a/persistence/models/Entity_test.go +++ b/persistence/models/Entity_test.go @@ -12,8 +12,8 @@ func TestMarshall(t *testing.T) { ett := &EntityType{ BaseModel: BaseModel{ID: id}, Name: "bird", - Attributs: []*Attribut{ - &Attribut{ + Attributes: []*Attribute{ + &Attribute{ BaseModel: BaseModel{ ID: id, }, @@ -33,11 +33,11 @@ func TestMarshall(t *testing.T) { ID: id, }, - IsNull: false, - StringVal: "blue", - EntityId: id, - AttributId: id, - Attribut: ett.Attributs[0], + IsNull: false, + StringVal: "blue", + EntityId: id, + AttributeId: id, + Attribute: ett.Attributes[0], }}, EntityTypeId: id, EntityType: ett, diff --git a/persistence/models/Tabler.go b/persistence/models/Tabler.go index 45f34256..7b8eef6a 100644 --- a/persistence/models/Tabler.go +++ b/persistence/models/Tabler.go @@ -6,7 +6,7 @@ var ListOfTables = []any{ Entity{}, EntityType{}, Value{}, - Attribut{}, + Attribute{}, } // The interface "type" need to implement to be considered models diff --git a/persistence/models/Value.go b/persistence/models/Value.go index 8ebbc941..09e02af6 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -9,7 +9,7 @@ import ( "gorm.io/gorm" ) -// Describe the attribut value of an Entity +// Describe the attribute value of an Entity type Value struct { BaseModel IsNull bool @@ -22,82 +22,82 @@ type Value struct { StringifiedValue string // GORM relations - EntityId uuid.UUID - AttributId uuid.UUID - Attribut *Attribut + EntityId uuid.UUID + AttributeId uuid.UUID + Attribute *Attribute } var ( ErrValueIsNull = errors.New("you can't get the value from a null Value") - ErrAskingForWrongType = errors.New("you can't get this type of value, the attribut type doesn't match") + ErrAskingForWrongType = errors.New("you can't get this type of value, the attribute type doesn't match") ) // Create a new null value -func NewNullValue(attr *Attribut) (*Value, error) { +func NewNullValue(attr *Attribute) (*Value, error) { val := new(Value) if attr.Required { - return nil, fmt.Errorf("can't create new null value for a required attribut") + return nil, fmt.Errorf("can't create new null value for a required attribute") } val.IsNull = true - val.Attribut = attr + val.Attribute = attr return val, nil } // Create a new int value -func NewIntValue(attr *Attribut, i int) (*Value, error) { +func NewIntValue(attr *Attribute, i int) (*Value, error) { val := new(Value) if attr.ValueType != IntValueType { - return nil, fmt.Errorf("can't create a new int value with a %s attribut", attr.ValueType) + return nil, fmt.Errorf("can't create a new int value with a %s attribute", attr.ValueType) } val.IsNull = false val.IntVal = i - val.Attribut = attr + val.Attribute = attr return val, nil } // Create a new bool value -func NewBoolValue(attr *Attribut, b bool) (*Value, error) { +func NewBoolValue(attr *Attribute, b bool) (*Value, error) { val := new(Value) if attr.ValueType != BooleanValueType { - return nil, fmt.Errorf("can't create a new bool value with a %s attribut", attr.ValueType) + return nil, fmt.Errorf("can't create a new bool value with a %s attribute", attr.ValueType) } val.IsNull = false val.BoolVal = b - val.Attribut = attr + val.Attribute = attr return val, nil } // Create a new float value -func NewFloatValue(attr *Attribut, f float64) (*Value, error) { +func NewFloatValue(attr *Attribute, f float64) (*Value, error) { val := new(Value) if attr.ValueType != FloatValueType { - return nil, fmt.Errorf("can't create a new float value with a %s attribut", attr.ValueType) + return nil, fmt.Errorf("can't create a new float value with a %s attribute", attr.ValueType) } val.IsNull = false val.FloatVal = f - val.Attribut = attr + val.Attribute = attr return val, nil } // Create a new string value -func NewStringValue(attr *Attribut, s string) (*Value, error) { +func NewStringValue(attr *Attribute, s string) (*Value, error) { val := new(Value) if attr.ValueType != StringValueType { - return nil, fmt.Errorf("can't create a new string value with a %s attribut", attr.ValueType) + return nil, fmt.Errorf("can't create a new string value with a %s attribute", attr.ValueType) } val.IsNull = false val.StringVal = s - val.Attribut = attr + val.Attribute = attr return val, nil } // Create a new relation value. // If et is nil, then the function return an error // If et is of the wrong types -func NewRelationValue(attr *Attribut, et *Entity) (*Value, error) { +func NewRelationValue(attr *Attribute, et *Entity) (*Value, error) { val := new(Value) if attr.ValueType != RelationValueType { - return nil, fmt.Errorf("can't create a new relation value with a %s attribut", attr.ValueType) + return nil, fmt.Errorf("can't create a new relation value with a %s attribute", attr.ValueType) } if et == nil { return nil, fmt.Errorf("can't create a new relation with a nill entity pointer") @@ -110,14 +110,14 @@ func NewRelationValue(attr *Attribut, et *Entity) (*Value, error) { } val.IsNull = false val.RelationVal = et.ID - val.Attribut = attr + val.Attribute = attr return val, nil } // Check if the Value is whole. eg, no fields are nil func (v *Value) CheckWhole() error { - if v.Attribut == nil { - return fmt.Errorf("the Attribut pointer is nil in Value at %v", v) + if v.Attribute == nil { + return fmt.Errorf("the Attribute pointer is nil in Value at %v", v) } return nil } @@ -125,7 +125,7 @@ func (v *Value) CheckWhole() error { // Return the string value // If the Value is null, it return ErrValueIsNull // If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribut == nil, it panic +// If the Value.Attribute == nil, it panic func (v *Value) GetStringVal() (string, error) { err := v.CheckWhole() if err != nil { @@ -133,12 +133,12 @@ func (v *Value) GetStringVal() (string, error) { } if v.IsNull { - if v.Attribut.Default { - return v.Attribut.DefaultString, nil + if v.Attribute.Default { + return v.Attribute.DefaultString, nil } return "", ErrValueIsNull } - if v.Attribut.ValueType != StringValueType { + if v.Attribute.ValueType != StringValueType { return "", ErrAskingForWrongType } return v.StringVal, nil @@ -147,7 +147,7 @@ func (v *Value) GetStringVal() (string, error) { // Return the float value // If the Value is null, it return ErrValueIsNull // If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribut == nil, it panic +// If the Value.Attribute == nil, it panic func (v *Value) GetFloatVal() (float64, error) { err := v.CheckWhole() if err != nil { @@ -155,12 +155,12 @@ func (v *Value) GetFloatVal() (float64, error) { } if v.IsNull { - if v.Attribut.Default { - return v.Attribut.DefaultFloat, nil + if v.Attribute.Default { + return v.Attribute.DefaultFloat, nil } return 0.0, ErrValueIsNull } - if v.Attribut.ValueType != FloatValueType { + if v.Attribute.ValueType != FloatValueType { return 0.0, ErrAskingForWrongType } return v.FloatVal, nil @@ -169,7 +169,7 @@ func (v *Value) GetFloatVal() (float64, error) { // Return the int value // If the Value is null, it return ErrValueIsNull // If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribut == nil, it panic +// If the Value.Attribute == nil, it panic func (v *Value) GetIntVal() (int, error) { err := v.CheckWhole() if err != nil { @@ -177,12 +177,12 @@ func (v *Value) GetIntVal() (int, error) { } if v.IsNull { - if v.Attribut.Default { - return v.Attribut.DefaultInt, nil + if v.Attribute.Default { + return v.Attribute.DefaultInt, nil } return 0, ErrValueIsNull } - if v.Attribut.ValueType != IntValueType { + if v.Attribute.ValueType != IntValueType { return 0, ErrAskingForWrongType } return v.IntVal, nil @@ -191,7 +191,7 @@ func (v *Value) GetIntVal() (int, error) { // Return the bool value // If the Value is null, it return ErrValueIsNull // If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribut == nil, it panic +// If the Value.Attribute == nil, it panic func (v *Value) GetBoolVal() (bool, error) { err := v.CheckWhole() if err != nil { @@ -199,12 +199,12 @@ func (v *Value) GetBoolVal() (bool, error) { } if v.IsNull { - if v.Attribut.Default { - return v.Attribut.DefaultBool, nil + if v.Attribute.Default { + return v.Attribute.DefaultBool, nil } return false, ErrValueIsNull } - if v.Attribut.ValueType != BooleanValueType { + if v.Attribute.ValueType != BooleanValueType { return false, ErrAskingForWrongType } return v.BoolVal, nil @@ -213,13 +213,13 @@ func (v *Value) GetBoolVal() (bool, error) { // Return the Relation value as a *Entity // If the Value is null, it return nil // If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribut == nil, it panic +// If the Value.Attribute == nil, it panic func (v *Value) GetComputedRelationVal(db *gorm.DB) (*Entity, error) { err := v.CheckWhole() if err != nil { panic(err) } - if v.Attribut.ValueType != RelationValueType { + if v.Attribute.ValueType != RelationValueType { return nil, ErrAskingForWrongType } @@ -227,7 +227,7 @@ func (v *Value) GetComputedRelationVal(db *gorm.DB) (*Entity, error) { return nil, nil } var et Entity - err = db.Preload("Fields").Preload("Fields.Attribut").Preload("EntityType.Attributs").Preload("EntityType").First(&et, v.RelationVal).Error + err = db.Preload("Fields").Preload("Fields.attribute").Preload("EntityType.Attributes").Preload("EntityType").First(&et, v.RelationVal).Error if err != nil { return nil, err } @@ -237,13 +237,13 @@ func (v *Value) GetComputedRelationVal(db *gorm.DB) (*Entity, error) { // Return the Relation value as an uint (returns the ID) // If the Value is null, it return nil // If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribut == nil, it panic +// If the Value.Attribute == nil, it panic func (v *Value) GetRelationVal() (uuid.UUID, error) { err := v.CheckWhole() if err != nil { panic(err) } - if v.Attribut.ValueType != RelationValueType { + if v.Attribute.ValueType != RelationValueType { return uuid.Nil, ErrAskingForWrongType } @@ -259,35 +259,35 @@ func (v *Value) Value() any { if err != nil { panic(err) } - switch v.Attribut.ValueType { + switch v.Attribute.ValueType { case StringValueType: if v.IsNull { - if v.Attribut.Default { - return v.Attribut.DefaultString + if v.Attribute.Default { + return v.Attribute.DefaultString } return nil } return v.StringVal case IntValueType: if v.IsNull { - if v.Attribut.Default { - return v.Attribut.DefaultInt + if v.Attribute.Default { + return v.Attribute.DefaultInt } return nil } return v.IntVal case FloatValueType: if v.IsNull { - if v.Attribut.Default { - return v.Attribut.DefaultFloat + if v.Attribute.Default { + return v.Attribute.DefaultFloat } return nil } return v.FloatVal case BooleanValueType: if v.IsNull { - if v.Attribut.Default { - return v.Attribut.DefaultBool + if v.Attribute.Default { + return v.Attribute.DefaultBool } return nil } @@ -299,8 +299,8 @@ func (v *Value) Value() any { return v.RelationVal default: panic(fmt.Errorf( - "this Attribut.ValueType does not exists (got=%s)", - v.Attribut.ValueType, + "this Attribute.ValueType does not exists (got=%s)", + v.Attribute.ValueType, )) } } @@ -309,7 +309,7 @@ func (v *Value) Value() any { var ErrCantBuildKVPairForNullValue = errors.New("can't build key/value pair from null value") // Build a key/value pair to be included in a JSON -// If the value hold an int=8 with an attribut named "voila" then the string returned will be `"voila":8` +// If the value hold an int=8 with an attribute named "voila" then the string returned will be `"voila":8` func (v *Value) BuildJsonKVPair() (string, error) { err := v.CheckWhole() if err != nil { @@ -317,7 +317,7 @@ func (v *Value) BuildJsonKVPair() (string, error) { } bytes, err := json.Marshal(v.Value()) if err != nil { - return "", fmt.Errorf("an error happened while trying to marshall the %q attr: (%w)", v.Attribut.Name, err) + return "", fmt.Errorf("an error happened while trying to marshall the %q attr: (%w)", v.Attribute.Name, err) } - return fmt.Sprintf("%q:%s", v.Attribut.Name, bytes), nil + return fmt.Sprintf("%q:%s", v.Attribute.Name, bytes), nil } diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 0ef339c1..aa61a136 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -45,7 +45,7 @@ func NewEAVService( // Get EntityType by name (string) func (eavService *eavServiceImpl) GetEntityTypeByName(name string) (*models.EntityType, error) { var ett models.EntityType - err := eavService.db.Preload("Attributs").First(&ett, "name = ?", name).Error + err := eavService.db.Preload("Attributes").First(&ett, "name = ?", name).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, fmt.Errorf(" EntityType named %q not found", name) @@ -56,15 +56,15 @@ func (eavService *eavServiceImpl) GetEntityTypeByName(name string) (*models.Enti func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity { var ets []*models.Entity - eavService.db.Where("entity_type_id = ?", ett.ID).Preload("Fields").Preload("Fields.Attribut").Preload("EntityType.Attributs").Preload("EntityType").Find(&ets) + eavService.db.Where("entity_type_id = ?", ett.ID).Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").Find(&ets) resultSet := make([]*models.Entity, 0, len(ets)) var keep bool for _, et := range ets { keep = true for _, value := range et.Fields { for k, v := range params { - if k == value.Attribut.Name { - switch value.Attribut.ValueType { + if k == value.Attribute.Name { + switch value.Attribute.ValueType { case models.StringValueType: if v != value.StringVal { keep = false @@ -124,7 +124,7 @@ func (eavService *eavServiceImpl) DeleteEntity(et *models.Entity) error { } func (eavService *eavServiceImpl) GetEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, error) { var et models.Entity - err := eavService.db.Preload("Fields").Preload("Fields.Attribut").Preload("EntityType.Attributs").Preload("EntityType").First(&et, id).Error + err := eavService.db.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").First(&et, id).Error if err != nil { return nil, err } @@ -137,7 +137,7 @@ func (eavService *eavServiceImpl) GetEntity(ett *models.EntityType, id uuid.UUID // Create a brand new entity func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map[string]interface{}) (*models.Entity, error) { var et models.Entity - for _, a := range ett.Attributs { + for _, a := range ett.Attributes { present := false var value models.Value for k, v := range attrs { @@ -177,7 +177,7 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map case nil: if a.Required { - return nil, fmt.Errorf("can't have a null field with a required attribut") + return nil, fmt.Errorf("can't have a null field with a required attribute") } value = models.Value{IsNull: true} @@ -201,7 +201,7 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map value = models.Value{IsNull: true} } } - value.Attribut = a + value.Attribute = a et.Fields = append(et.Fields, &value) } et.EntityType = ett @@ -209,9 +209,9 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map } func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[string]interface{}) error { - for _, a := range et.EntityType.Attributs { + for _, a := range et.EntityType.Attributes { for _, value := range et.Fields { - if a.ID == value.AttributId { + if a.ID == value.AttributeId { for k, v := range attrs { if k == a.Name { switch t := v.(type) { @@ -263,7 +263,7 @@ func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[stri } } } - value.Attribut = a + value.Attribute = a eavService.db.Save(value) } } From 642532741918328cf070999b6d4ef244b586f62e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Apr 2023 12:11:19 +0200 Subject: [PATCH 008/467] fix more typos and stylecheck --- controllers/eav.go | 16 ++++++++-------- persistence/models/Entity.go | 16 ++++++++-------- services/eavservice/eavservice.go | 4 ++-- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/controllers/eav.go b/controllers/eav.go index 08b19057..ef5b9a4c 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -28,7 +28,7 @@ var ( // The EAV controller type EAVController interface { - // Return the badaas server informations + // Return the badaas server information GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) @@ -73,17 +73,17 @@ func (controller *eavControllerImpl) GetAll(w http.ResponseWriter, r *http.Reque } queryparams := r.URL.Query() - var qp map[string]string = make(map[string]string) + var qp = make(map[string]string) for k, v := range queryparams { qp[k] = v[0] } fmt.Println(qp) - var collection []*models.Entity = controller.eavService.GetEntitiesWithParams(ett, qp) + var collection = controller.eavService.GetEntitiesWithParams(ett, qp) return collection, nil } -// The handler reponsible for the retreival of une entity +// The handler responsible for the retrieval of une entity func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName := getEntityTypeNameFromRequest(r) @@ -137,7 +137,7 @@ func getEntityTypeNameFromRequest(r *http.Request) string { return entityType } -// The handler reponsible for the deletion of entities and their associated value +// The handler responsible for the deletion of entities and their associated value func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName := getEntityTypeNameFromRequest(r) ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) @@ -170,7 +170,7 @@ func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http return nil, nil } -// The handler reponsible for the creation of entities +// The handler responsible for the creation of entities func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName := getEntityTypeNameFromRequest(r) ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) @@ -204,7 +204,7 @@ type createReq struct { Attrs map[string]interface{} } -// The handler reponsible for the updates of entities +// The handler responsible for the updates of entities func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName := getEntityTypeNameFromRequest(r) ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) @@ -241,7 +241,7 @@ func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http return entity, nil } -// return json formated string to be consumed by frontend or client +// return json formatted string to be consumed by frontend or client func GetErrMsg(msg string) string { return fmt.Sprintf( `{"error": %q}`, diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 9ab02723..739a442c 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -20,17 +20,17 @@ type Entity struct { // Encode the entity to json // use the [encoding/json.Marshaler] interface -func (entity *Entity) MarshalJSON() ([]byte, error) { +func (e *Entity) MarshalJSON() ([]byte, error) { dto := make(map[string]any) - dto["id"] = entity.ID - dto["type"] = entity.EntityType.Name - dto["createdAt"] = entity.CreatedAt - dto["updatedAt"] = entity.UpdatedAt - dto["attrs"] = entity.encodeAttributes() + dto["id"] = e.ID + dto["type"] = e.EntityType.Name + dto["createdAt"] = e.CreatedAt + dto["updatedAt"] = e.UpdatedAt + dto["attrs"] = e.encodeAttributes() return json.Marshal(dto) } -// return the attribut in a json encoded string +// return the attribute in a json encoded string func (e *Entity) encodeAttributes() map[string]any { pairs := make(map[string]any, len(e.Fields)) for _, field := range e.Fields { @@ -72,7 +72,7 @@ func (e *Entity) EncodeToJson() []byte { return []byte(utils.BuildJsonFromStrings(pairs)) } -// return the attribut in a json encoded string +// return the attribute in a json encoded string func (e *Entity) encodeAttributesold() string { var pairs []string for _, f := range e.Fields { diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index aa61a136..38b1e466 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -194,9 +194,9 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map v, err := a.GetNewDefaultValue() if err != nil { return nil, err - } else { - value = *v } + + value = *v } else { value = models.Value{IsNull: true} } From 0722c5e1b94e2362814c1e435400f59d2a82f80f Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Apr 2023 12:14:52 +0200 Subject: [PATCH 009/467] fix typos --- commands/rootCmd.go | 2 +- persistence/models/Attribute.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/commands/rootCmd.go b/commands/rootCmd.go index 85b9f762..4196df25 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -147,7 +147,7 @@ func PopulateDatabase(db *gorm.DB) error { } func PopulateDatabase2(db *gorm.DB) error { - // GETTING THE SUSER ADMIN FOR REFERENCE + // GETTING THE USER ADMIN FOR REFERENCE USERID := "wowasupercooluserID" // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index bbb2002a..20e6a11d 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -15,10 +15,10 @@ const ( FloatValueType ValueTypeT = "float" ) -// Describe the type of an attribut +// Describe the type of an attribute type ValueTypeT string -// Describe the attribut of a en EntityType +// Describe the attribute of a en EntityType type Attribute struct { BaseModel Name string @@ -44,7 +44,7 @@ type Attribute struct { var ErrNoDefaultValueSet = errors.New("no default value found") -// Get a new value with the default value associated with the attribut +// Get a new value with the default value associated with the attribute func (a *Attribute) GetNewDefaultValue() (*Value, error) { if !a.Default { return nil, ErrNoDefaultValueSet From a3985ceb4530dbf2c7b0ea8f8474c1ddb6ddbef8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Apr 2023 09:54:37 +0200 Subject: [PATCH 010/467] fix some lint --- commands/rootCmd.go | 26 +++++++++++++------------- controllers/eav.go | 12 ++++++------ demo.md | 2 +- persistence/models/Attribute.go | 4 ++-- persistence/models/Entity.go | 18 +++++++++--------- persistence/models/Entity_test.go | 8 ++++---- persistence/models/Value.go | 13 ++++++------- router/router.go | 2 +- services/eavservice/eavservice.go | 8 ++++---- services/eavservice/utils/json.go | 4 ++-- services/eavservice/utils/json_test.go | 4 ++-- 11 files changed, 50 insertions(+), 51 deletions(-) diff --git a/commands/rootCmd.go b/commands/rootCmd.go index 4196df25..3a77b111 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -106,7 +106,7 @@ func PopulateDatabase(db *gorm.DB) error { specieAttr := &models.Attribute{Name: "specie", ValueType: "string", Required: true} heightAttr := &models.Attribute{Name: "height", ValueType: "int", Default: true, DefaultInt: 12, Required: false} weightAttr := &models.Attribute{Name: "weight", ValueType: "float", Default: true, DefaultFloat: 12.500, Required: false} - ownerAttr := &models.Attribute{Name: "owner", ValueType: "relation", Required: false, TargetEntityTypeId: HumanType.ID} + ownerAttr := &models.Attribute{Name: "owner", ValueType: "relation", Required: false, TargetEntityTypeID: HumanType.ID} BirdType := &models.EntityType{ Name: "bird", @@ -155,21 +155,21 @@ func PopulateDatabase2(db *gorm.DB) error { Name: "profile", } displayNameAttr := &models.Attribute{ - EntityTypeId: ProfileType.ID, + EntityTypeID: ProfileType.ID, Name: "displayName", ValueType: "string", Required: true, } urlPicAttr := &models.Attribute{ - EntityTypeId: ProfileType.ID, + EntityTypeID: ProfileType.ID, Name: "urlPic", ValueType: "string", Required: false, Default: true, DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", //nolint:lll } - userIdAttr := &models.Attribute{ - EntityTypeId: ProfileType.ID, + userIDAttr := &models.Attribute{ + EntityTypeID: ProfileType.ID, Name: "userId", ValueType: "string", Required: true, @@ -177,21 +177,21 @@ func PopulateDatabase2(db *gorm.DB) error { ProfileType.Attributes = append(ProfileType.Attributes, displayNameAttr, urlPicAttr, - userIdAttr, + userIDAttr, ) - // INSTANCIATION OF A Profile + // INSTANTIATION OF A Profile adminProfile := &models.Entity{ - EntityTypeId: ProfileType.ID, + EntityTypeID: ProfileType.ID, EntityType: ProfileType, } displayNameVal := &models.Value{Attribute: urlPicAttr, StringVal: "The Super Admin"} userPicVal := &models.Value{Attribute: urlPicAttr, IsNull: true} - userIdVal := &models.Value{Attribute: userIdAttr, StringVal: USERID} + userIDVal := &models.Value{Attribute: userIDAttr, StringVal: USERID} adminProfile.Fields = append(adminProfile.Fields, displayNameVal, userPicVal, - userIdVal, + userIDVal, ) // CREATION OF THE POST TYPE AND ASSOCIATED ATTRIBUTES @@ -199,7 +199,7 @@ func PopulateDatabase2(db *gorm.DB) error { Name: "post", } titleAttr := &models.Attribute{ - EntityTypeId: PostType.ID, + EntityTypeID: PostType.ID, Name: "title", ValueType: "string", Required: true, @@ -219,9 +219,9 @@ func PopulateDatabase2(db *gorm.DB) error { PostType.Attributes = append( PostType.Attributes, titleAttr, bodyAttr, ownerAttr, ) - // INSTANCIATION OF A POST + // INSTANTIATION OF A POST whycatslikemices := &models.Entity{ - EntityTypeId: PostType.ID, + EntityTypeID: PostType.ID, EntityType: PostType, } titleVal := &models.Value{ diff --git a/controllers/eav.go b/controllers/eav.go index ef5b9a4c..d8b46a6d 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -19,7 +19,7 @@ import ( var ( ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid entity id") ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists in the schema") - ErrIdNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") + ErrIDNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") ErrEntityTypeDontMatchEntity = httperrors.NewBadRequestError("types don't match", "the entity you are targeting don't match the entity type name provided") ErrDBQueryFailed = func(err error) httperrors.HTTPError { return httperrors.NewInternalServerError("db error", "database query failed", err) @@ -106,7 +106,7 @@ func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Re if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound - } else if errors.Is(err, eavservice.ErrIdDontMatchEntityType) { + } else if errors.Is(err, eavservice.ErrIDDontMatchEntityType) { http.Error(w, GetErrMsg(err.Error()), http.StatusBadRequest) return nil, ErrEntityTypeDontMatchEntity } else { @@ -125,7 +125,7 @@ func getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { } uid, err := uuid.Parse(id) if err != nil { - return uuid.Nil, ErrIdNotAnUUID + return uuid.Nil, ErrIDNotAnUUID } return uid, nil } @@ -157,7 +157,7 @@ func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound - } else if errors.Is(err, eavservice.ErrIdDontMatchEntityType) { + } else if errors.Is(err, eavservice.ErrIDDontMatchEntityType) { return nil, ErrEntityTypeDontMatchEntity } else { return nil, ErrDBQueryFailed(err) @@ -218,13 +218,13 @@ func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http id, err := getEntityIDFromRequest(r) if err != nil { - return nil, ErrIdNotAnUUID + return nil, ErrIDNotAnUUID } entity, err := controller.eavService.GetEntity(ett, id) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound - } else if errors.Is(err, eavservice.ErrIdDontMatchEntityType) { + } else if errors.Is(err, eavservice.ErrIDDontMatchEntityType) { return nil, ErrEntityTypeDontMatchEntity } else { return nil, ErrDBQueryFailed(err) diff --git a/demo.md b/demo.md index cd4c7431..cda4347d 100644 --- a/demo.md +++ b/demo.md @@ -181,7 +181,7 @@ The default credentials for the user are ̀`admin-no-reply@badaas.com` and `admi ### Querying the object storage engine -I will the httpie utils in the examples below, but it works with curl or any similar tools. +I will use the httpie util in the examples below, but it works with curl or any similar tools. Let's first start by get all the profiles: `http localhost:8000/v1/objects/profile/` diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index 20e6a11d..d27c96a7 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -36,10 +36,10 @@ type Attribute struct { // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" ValueType ValueTypeT - TargetEntityTypeId uuid.UUID // name of the EntityType + TargetEntityTypeID uuid.UUID // name of the EntityType // GORM relations - EntityTypeId uuid.UUID + EntityTypeID uuid.UUID } var ErrNoDefaultValueSet = errors.New("no default value found") diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 739a442c..c3e4920b 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -14,7 +14,7 @@ type Entity struct { Fields []*Value // GORM relations - EntityTypeId uuid.UUID + EntityTypeID uuid.UUID EntityType *EntityType } @@ -43,18 +43,18 @@ func (e *Entity) encodeAttributes() map[string]any { } func (e *Entity) GetValue(attrName string) (interface{}, error) { - var attrId uuid.UUID + var attrID uuid.UUID for _, a := range e.EntityType.Attributes { if a.Name == attrName { - attrId = a.ID + attrID = a.ID break } } - if uuid.Nil == attrId { + if uuid.Nil == attrID { return nil, fmt.Errorf("attr not found: got=%s", attrName) } for _, v := range e.Fields { - if v.AttributeId == attrId { + if v.AttributeID == attrID { return v.Value(), nil } } @@ -62,14 +62,14 @@ func (e *Entity) GetValue(attrName string) (interface{}, error) { } // Encode the Entity to json -func (e *Entity) EncodeToJson() []byte { +func (e *Entity) EncodeToJSON() []byte { var pairs []string pairs = append(pairs, fmt.Sprintf("%q: %d", "id", e.ID), fmt.Sprintf("%q: %q", "type", e.EntityType.Name), fmt.Sprintf("%q: %s", "attrs", e.encodeAttributesold()), ) - return []byte(utils.BuildJsonFromStrings(pairs)) + return []byte(utils.BuildJSONFromStrings(pairs)) } // return the attribute in a json encoded string @@ -79,8 +79,8 @@ func (e *Entity) encodeAttributesold() string { if f.IsNull { continue } - pair, _ := f.BuildJsonKVPair() + pair, _ := f.BuildJSONKVPair() pairs = append(pairs, pair) } - return utils.BuildJsonFromStrings(pairs) + return utils.BuildJSONFromStrings(pairs) } diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go index 4402e05f..3921bd3b 100644 --- a/persistence/models/Entity_test.go +++ b/persistence/models/Entity_test.go @@ -20,7 +20,7 @@ func TestMarshall(t *testing.T) { Name: "color", DefaultString: "red", ValueType: StringValueType, - EntityTypeId: id, + EntityTypeID: id, }}, } @@ -35,11 +35,11 @@ func TestMarshall(t *testing.T) { IsNull: false, StringVal: "blue", - EntityId: id, - AttributeId: id, + EntityID: id, + AttributeID: id, Attribute: ett.Attributes[0], }}, - EntityTypeId: id, + EntityTypeID: id, EntityType: ett, } diff --git a/persistence/models/Value.go b/persistence/models/Value.go index 09e02af6..1df10584 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -22,8 +22,8 @@ type Value struct { StringifiedValue string // GORM relations - EntityId uuid.UUID - AttributeId uuid.UUID + EntityID uuid.UUID + AttributeID uuid.UUID Attribute *Attribute } @@ -102,10 +102,10 @@ func NewRelationValue(attr *Attribute, et *Entity) (*Value, error) { if et == nil { return nil, fmt.Errorf("can't create a new relation with a nill entity pointer") } - if et.EntityType.ID != attr.TargetEntityTypeId { + if et.EntityType.ID != attr.TargetEntityTypeID { return nil, fmt.Errorf( "can't create a relation with an entity of wrong EntityType. (got the entityid=%d, expected=%d)", - et.EntityType.ID, attr.TargetEntityTypeId, + et.EntityType.ID, attr.TargetEntityTypeID, ) } val.IsNull = false @@ -305,12 +305,11 @@ func (v *Value) Value() any { } } -// When Value isNull, it is impossible to build a Key/Value pair -var ErrCantBuildKVPairForNullValue = errors.New("can't build key/value pair from null value") +var ErrCantBuildKVPairForNullValue = errors.New("can't build key/value pair from null value") // When Value isNull, it is impossible to build a Key/Value pair // Build a key/value pair to be included in a JSON // If the value hold an int=8 with an attribute named "voila" then the string returned will be `"voila":8` -func (v *Value) BuildJsonKVPair() (string, error) { +func (v *Value) BuildJSONKVPair() (string, error) { err := v.CheckWhole() if err != nil { panic(err) diff --git a/router/router.go b/router/router.go index 224861ac..706ee75b 100644 --- a/router/router.go +++ b/router/router.go @@ -40,7 +40,7 @@ func SetupRouter( protected.HandleFunc("/logout", jsonController.Wrap(basicAuthentificationController.Logout)).Methods("GET") - //CRUD + // CRUD router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.GetObject)).Methods("GET") // Get whole collection router.HandleFunc("/v1/objects/{type}/", jsonController.Wrap(eavController.GetAll)).Methods("GET") diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 38b1e466..bc057546 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -13,7 +13,7 @@ import ( ) var ( - ErrIdDontMatchEntityType = errors.New("this object doesn't belong to this type") + ErrIDDontMatchEntityType = errors.New("this object doesn't belong to this type") ErrCantParseUUID = errors.New("can't parse uuid") ) @@ -128,8 +128,8 @@ func (eavService *eavServiceImpl) GetEntity(ett *models.EntityType, id uuid.UUID if err != nil { return nil, err } - if ett.ID != et.EntityTypeId { - return nil, ErrIdDontMatchEntityType + if ett.ID != et.EntityTypeID { + return nil, ErrIDDontMatchEntityType } return &et, nil } @@ -211,7 +211,7 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[string]interface{}) error { for _, a := range et.EntityType.Attributes { for _, value := range et.Fields { - if a.ID == value.AttributeId { + if a.ID == value.AttributeID { for k, v := range attrs { if k == a.Name { switch t := v.(type) { diff --git a/services/eavservice/utils/json.go b/services/eavservice/utils/json.go index 04d72e54..460c1122 100644 --- a/services/eavservice/utils/json.go +++ b/services/eavservice/utils/json.go @@ -4,7 +4,7 @@ import "strings" // build a json from a string slices // turn []string {`"a",1`, `"b",1`} to `{"a":1,"b":2}` -func BuildJsonFromStrings(pairs []string) string { +func BuildJSONFromStrings(pairs []string) string { var b strings.Builder // starting the json string b.WriteString("{") @@ -16,7 +16,7 @@ func BuildJsonFromStrings(pairs []string) string { // build a json list from a string slices // turn []string {`{"a",1}`, `{"b",1}`} to `["{a":1},{"b":2}]` -func BuildJsonListFromStrings(pairs []string) string { +func BuildJSONListFromStrings(pairs []string) string { var b strings.Builder // starting the json list b.WriteString("[") diff --git a/services/eavservice/utils/json_test.go b/services/eavservice/utils/json_test.go index 9270a8d8..ec58f879 100644 --- a/services/eavservice/utils/json_test.go +++ b/services/eavservice/utils/json_test.go @@ -26,7 +26,7 @@ func TestBuildJsonFromString(t *testing.T) { }, } for _, td := range testData { - result := utils.BuildJsonFromStrings(td.input) + result := utils.BuildJSONFromStrings(td.input) if result != td.output { t.Errorf("Expected %s, got %s", td.output, result) } @@ -49,7 +49,7 @@ func TestBuildJsonListFromString(t *testing.T) { }, } for _, td := range testData { - result := utils.BuildJsonListFromStrings(td.input) + result := utils.BuildJSONListFromStrings(td.input) if result != td.output { t.Errorf("Expected %s, got %s", td.output, result) } From 58e88a3c8a6585eb7c8265e760e002f79a1ddab1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Apr 2023 10:06:57 +0200 Subject: [PATCH 011/467] fix more lint --- commands/rootCmd.go | 72 +++++++++++++++---------------- demo.md | 18 ++++---- services/eavservice/eavservice.go | 4 +- 3 files changed, 48 insertions(+), 46 deletions(-) diff --git a/commands/rootCmd.go b/commands/rootCmd.go index 3a77b111..96aeacd9 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -77,18 +77,18 @@ func init() { func PopulateDatabase(db *gorm.DB) error { //defining - HumanType := &models.EntityType{ + humanType := &models.EntityType{ Name: "human", } nameAttr := &models.Attribute{Name: "name", ValueType: "string", Required: true} - HumanType.Attributes = append( - HumanType.Attributes, nameAttr, + humanType.Attributes = append( + humanType.Attributes, nameAttr, ) bobName, err := models.NewStringValue(nameAttr, "bob") if err != nil { panic(err) } - bob := &models.Entity{EntityType: HumanType} + bob := &models.Entity{EntityType: humanType} bob.Fields = append(bob.Fields, bobName) db.Create(bob) @@ -96,7 +96,7 @@ func PopulateDatabase(db *gorm.DB) error { if err != nil { panic(err) } - jean := &models.Entity{EntityType: HumanType} + jean := &models.Entity{EntityType: humanType} jean.Fields = append(jean.Fields, jeanName) db.Create(jean) @@ -106,7 +106,7 @@ func PopulateDatabase(db *gorm.DB) error { specieAttr := &models.Attribute{Name: "specie", ValueType: "string", Required: true} heightAttr := &models.Attribute{Name: "height", ValueType: "int", Default: true, DefaultInt: 12, Required: false} weightAttr := &models.Attribute{Name: "weight", ValueType: "float", Default: true, DefaultFloat: 12.500, Required: false} - ownerAttr := &models.Attribute{Name: "owner", ValueType: "relation", Required: false, TargetEntityTypeID: HumanType.ID} + ownerAttr := &models.Attribute{Name: "owner", ValueType: "relation", Required: false, TargetEntityTypeID: humanType.ID} BirdType := &models.EntityType{ Name: "bird", @@ -119,7 +119,7 @@ func PopulateDatabase(db *gorm.DB) error { if err != nil { panic(err) } - val2, err := models.NewStringValue(specieAttr, "mésange") + val2, err := models.NewStringValue(specieAttr, "chickadee") if err != nil { panic(err) } @@ -137,10 +137,10 @@ func PopulateDatabase(db *gorm.DB) error { panic(err) } - mesange := &models.Entity{EntityType: BirdType} - mesange.Fields = append(mesange.Fields, val1, val2, val3, val4, val5) + chickadee := &models.Entity{EntityType: BirdType} + chickadee.Fields = append(chickadee.Fields, val1, val2, val3, val4, val5) - db.Create(mesange) + db.Create(chickadee) fmt.Println("Finished populating the database") return nil @@ -148,20 +148,20 @@ func PopulateDatabase(db *gorm.DB) error { func PopulateDatabase2(db *gorm.DB) error { // GETTING THE USER ADMIN FOR REFERENCE - USERID := "wowasupercooluserID" + userID := "wowASuperCoolUserID" // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES - ProfileType := &models.EntityType{ + profileType := &models.EntityType{ Name: "profile", } displayNameAttr := &models.Attribute{ - EntityTypeID: ProfileType.ID, + EntityTypeID: profileType.ID, Name: "displayName", ValueType: "string", Required: true, } urlPicAttr := &models.Attribute{ - EntityTypeID: ProfileType.ID, + EntityTypeID: profileType.ID, Name: "urlPic", ValueType: "string", Required: false, @@ -169,12 +169,12 @@ func PopulateDatabase2(db *gorm.DB) error { DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", //nolint:lll } userIDAttr := &models.Attribute{ - EntityTypeID: ProfileType.ID, + EntityTypeID: profileType.ID, Name: "userId", ValueType: "string", Required: true, } - ProfileType.Attributes = append(ProfileType.Attributes, + profileType.Attributes = append(profileType.Attributes, displayNameAttr, urlPicAttr, userIDAttr, @@ -182,12 +182,12 @@ func PopulateDatabase2(db *gorm.DB) error { // INSTANTIATION OF A Profile adminProfile := &models.Entity{ - EntityTypeID: ProfileType.ID, - EntityType: ProfileType, + EntityTypeID: profileType.ID, + EntityType: profileType, } displayNameVal := &models.Value{Attribute: urlPicAttr, StringVal: "The Super Admin"} userPicVal := &models.Value{Attribute: urlPicAttr, IsNull: true} - userIDVal := &models.Value{Attribute: userIDAttr, StringVal: USERID} + userIDVal := &models.Value{Attribute: userIDAttr, StringVal: userID} adminProfile.Fields = append(adminProfile.Fields, displayNameVal, userPicVal, @@ -195,11 +195,11 @@ func PopulateDatabase2(db *gorm.DB) error { ) // CREATION OF THE POST TYPE AND ASSOCIATED ATTRIBUTES - PostType := &models.EntityType{ + postType := &models.EntityType{ Name: "post", } titleAttr := &models.Attribute{ - EntityTypeID: PostType.ID, + EntityTypeID: postType.ID, Name: "title", ValueType: "string", Required: true, @@ -216,38 +216,38 @@ func PopulateDatabase2(db *gorm.DB) error { Required: true, } - PostType.Attributes = append( - PostType.Attributes, titleAttr, bodyAttr, ownerAttr, + postType.Attributes = append( + postType.Attributes, titleAttr, bodyAttr, ownerAttr, ) // INSTANTIATION OF A POST - whycatslikemices := &models.Entity{ - EntityTypeID: PostType.ID, - EntityType: PostType, + whyCatsLikeMice := &models.Entity{ + EntityTypeID: postType.ID, + EntityType: postType, } titleVal := &models.Value{ Attribute: titleAttr, - StringVal: "Why cats like mices ?", + StringVal: "Why cats like mice ?", } bodyVal, err := models.NewStringValue(bodyAttr, - `Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. In erat mi, pharetra ut lacinia at, facilisis vitae nunc. Fusce rhoncus id justo vitae gravida. In nisi mi, rutrum et arcu ac, gravida venenatis arcu. Nulla leo metus, molestie eu sagittis non, ultricies eu ex. Fusce a lorem eu urna porttitor molestie. Aliquam nec sapien quam. Suspendisse aliquet elementum arcu vitae interdum. Maecenas nec turpis et nulla volutpat accumsan. Pellentesque non ullamcorper leo, eu fringilla odio. - - Cras eu felis mauris. Pellentesque varius imperdiet suscipit. Nam tellus odio, faucibus at mattis quis, cursus at tortor. Curabitur vitae mi eu lorem feugiat pretium sed sit amet purus. Proin efficitur, magna eu malesuada fermentum, tortor tortor maximus neque, vel mattis tortor orci a ligula. Nunc nec justo ipsum. Sed fermentum, nisl eget efficitur accumsan, augue nisl sollicitudin massa, vel suscipit enim turpis nec nisi. - - Nam dictum risus sed leo malesuada varius. Pellentesque gravida interdum risus id vulputate. Mauris feugiat vulputate leo ut euismod. Fusce auctor at lacus eget sollicitudin. Suspendisse potenti. Aliquam dui felis, mollis quis porta a, sodales in ligula. In ac elit ornare, facilisis ex eget, tincidunt orci. Nullam eu mattis turpis, non finibus dolor. - `) //nolint:lll + `Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. + + In erat mi, pharetra ut lacinia at, facilisis vitae nunc. + `) if err != nil { return err } ownerVal := &models.Value{ Attribute: ownerAttr, - StringVal: USERID, + StringVal: userID, } - whycatslikemices.Fields = append(whycatslikemices.Fields, + whyCatsLikeMice.Fields = append(whyCatsLikeMice.Fields, titleVal, bodyVal, ownerVal, ) - err = db.Create(whycatslikemices).Error + err = db.Create(whyCatsLikeMice).Error if err != nil { return err } diff --git a/demo.md b/demo.md index cda4347d..10d57618 100644 --- a/demo.md +++ b/demo.md @@ -66,13 +66,13 @@ func PopulateDatabase2(db *gorm.DB) error { Name: "profile", } displayNameAttr := &models.Attribute{ - EntityTypeId: ProfileType.ID, + EntityTypeID: ProfileType.ID, Name: "displayName", ValueType: "string", Required: true, } urlPicAttr := &models.Attribute{ - EntityTypeId: ProfileType.ID, + EntityTypeID: ProfileType.ID, Name: "urlPic", ValueType: "string", Required: false, @@ -80,7 +80,7 @@ func PopulateDatabase2(db *gorm.DB) error { DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", } userIdAttr := &models.Attribute{ - EntityTypeId: ProfileType.ID, + EntityTypeID: ProfileType.ID, Name: "userId", ValueType: "string", Required: true, @@ -93,7 +93,7 @@ func PopulateDatabase2(db *gorm.DB) error { // INSTANTIATION OF A Profile adminProfile := &models.Entity{ - EntityTypeId: ProfileType.ID, + EntityTypeID: ProfileType.ID, EntityType: ProfileType, } displayNameVal := &models.Value{Attribute: urlPicAttr, StringVal: "The Super Admin"} @@ -110,7 +110,7 @@ func PopulateDatabase2(db *gorm.DB) error { Name: "post", } titleAttr := &models.Attribute{ - EntityTypeId: PostType.ID, + EntityTypeID: PostType.ID, Name: "title", ValueType: "string", Required: true, @@ -131,8 +131,8 @@ func PopulateDatabase2(db *gorm.DB) error { PostType.Attributes, titleAttr, bodyAttr, ownerAttr, ) // INSTANTIATION OF A POST - whycatslikemice := &models.Entity{ - EntityTypeId: PostType.ID, + whyCatsLikeMice := &models.Entity{ + EntityTypeID: PostType.ID, EntityType: PostType, } titleVal := &models.Value{ @@ -154,11 +154,11 @@ func PopulateDatabase2(db *gorm.DB) error { StringVal: admin.ID.String(), } - whycatslikemice.Fields = append(whycatslikemice.Fields, + whyCatsLikeMice.Fields = append(whyCatsLikeMice.Fields, titleVal, bodyVal, ownerVal, ) - err = db.Create(whycatslikemice).Error + err = db.Create(whyCatsLikeMice).Error if err != nil { return err } diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index bc057546..73e5ea68 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -56,7 +56,9 @@ func (eavService *eavServiceImpl) GetEntityTypeByName(name string) (*models.Enti func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity { var ets []*models.Entity - eavService.db.Where("entity_type_id = ?", ett.ID).Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").Find(&ets) + eavService.db.Where( + "entity_type_id = ?", ett.ID, + ).Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").Find(&ets) resultSet := make([]*models.Entity, 0, len(ets)) var keep bool for _, et := range ets { From 671366dad8bfae01cb9b72f3d88d77dd2e7e4a91 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Apr 2023 10:10:17 +0200 Subject: [PATCH 012/467] activate api in e2e tests --- scripts/e2e/docker-compose.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/scripts/e2e/docker-compose.yml b/scripts/e2e/docker-compose.yml index ccaaf291..a6b936a3 100644 --- a/scripts/e2e/docker-compose.yml +++ b/scripts/e2e/docker-compose.yml @@ -11,15 +11,15 @@ services: - COCKROACH_USER=root - COCKROACH_DB=badaas_db - # api: - # build: - # context: ./../.. - # dockerfile: ./scripts/e2e/api/Dockerfile - # ports: - # - "8000:8000" - # restart: always - # # environment: - # # - BADAAS_PORT=8000 - # # - BADAAS_MAX_TIMOUT= 15 # in seconds - # depends_on: - # - db + api: + build: + context: ./../.. + dockerfile: ./scripts/e2e/api/Dockerfile + ports: + - "8000:8000" + restart: always + # environment: + # - BADAAS_PORT=8000 + # - BADAAS_MAX_TIMOUT= 15 # in seconds + depends_on: + - db From 051a618e66f1bd8c3160553e6cc569481d574e22 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Apr 2023 10:22:11 +0200 Subject: [PATCH 013/467] fix crud files --- CRUD copy.http | 121 ----------------------------------- CRUD.http => CRUD_birds.http | 10 +-- CRUD_posts.http | 37 +++++++++++ 3 files changed, 42 insertions(+), 126 deletions(-) delete mode 100644 CRUD copy.http rename CRUD.http => CRUD_birds.http (90%) create mode 100644 CRUD_posts.http diff --git a/CRUD copy.http b/CRUD copy.http deleted file mode 100644 index 46aafab7..00000000 --- a/CRUD copy.http +++ /dev/null @@ -1,121 +0,0 @@ -@hostname = localhost -@port = 8002 -@host = {{hostname}}:{{port}} - -@URI = http://{{hostname}}:{{port}}/v1 - -@birdid = a6515f18-aa94-46d9-8709-29de2a36ea79 - - -# GET all birds -GET {{URI}}/objects/post/ HTTP/1.1 -content-type: application/json - -### - -# GET all birds that are blue -GET {{URI}}/objects/post/?ownerID=23764cb8-80f2-4a03-8060-2f3f4c95b978 HTTP/1.1 -content-type: application/json - -### - -# GET a bird -GET {{URI}}/objects/post/{{birdid}} HTTP/1.1 -content-type: application/json - -### - -# => SHOULD FAIl -# DELETE all bird -DELETE {{URI}}/objects/post/ HTTP/1.1 -content-type: application/json - -### - -# DELETE a bird -DELETE {{URI}}/objects/post/{{birdid}} HTTP/1.1 -content-type: application/json - -### - -# CREATE a bird -POST {{URI}}/objects/bird HTTP/1.1 -content-type: application/json - -{ -"attrs": { - "color": "red", - "specie": "aigle", - "height": 106, - "owner": 1 -} -} - -### - -# CREATE => with null field -POST {{URI}}/objects/bird HTTP/1.1 -content-type: application/json - -{ -"attrs": { - "color": "orange", - "specie": "bird with null field (field absent of the request)" -} -} - -### - -# CREATE => with field of null value -POST {{URI}}/objects/bird HTTP/1.1 -content-type: application/json - -{ -"attrs": { - "color": "orange", - "specie": "bird with null field", - "height": 50, - "weight": null -} -} - -### - -# SHOULD FAIl -# CREATE => missing an non nullable field -POST {{URI}}/objects/bird HTTP/1.1 -content-type: application/json - -{ - "attrs": { - "specie": "Should not endup in database" - } -} - -### - -# SHOULD FAIl -# CREATE => sending a null value non a non nullable field -POST {{URI}}/objects/bird HTTP/1.1 -content-type: application/json - -{ - "attrs": { - "color": null, - "specie": "Should not endup in database" - } -} - -### - -# UPDATE a bird -PUT {{URI}}/objects/post/{{birdid}} HTTP/1.1 -content-type: application/json - -{ - "attrs": { - "color": "red", - "specie": "rouge gorge", - "height": null - } -} \ No newline at end of file diff --git a/CRUD.http b/CRUD_birds.http similarity index 90% rename from CRUD.http rename to CRUD_birds.http index f5f7b0a1..b27125ba 100644 --- a/CRUD.http +++ b/CRUD_birds.http @@ -14,7 +14,7 @@ content-type: application/json ### # GET all birds that are blue -GET {{URI}}/objects/bird/?color=red HTTP/1.1 +GET {{URI}}/objects/bird/?color=blue HTTP/1.1 content-type: application/json ### @@ -25,8 +25,8 @@ content-type: application/json ### -# => SHOULD FAIl -# DELETE all bird +# => SHOULD FAIL +# DELETE all birds DELETE {{URI}}/objects/bird/ HTTP/1.1 content-type: application/json @@ -88,7 +88,7 @@ content-type: application/json { "attrs": { - "specie": "Should not endup in database" + "specie": "Should not end up in database" } } @@ -102,7 +102,7 @@ content-type: application/json { "attrs": { "color": null, - "specie": "Should not endup in database" + "specie": "Should not end up in database" } } diff --git a/CRUD_posts.http b/CRUD_posts.http new file mode 100644 index 00000000..e7410b72 --- /dev/null +++ b/CRUD_posts.http @@ -0,0 +1,37 @@ +@hostname = localhost +@port = 8002 +@host = {{hostname}}:{{port}} + +@URI = http://{{hostname}}:{{port}}/v1 + +@postid = a6515f18-aa94-46d9-8709-29de2a36ea79 + + +# GET all posts +GET {{URI}}/objects/post/ HTTP/1.1 +content-type: application/json + +### + +# GET all post owned by a user +GET {{URI}}/objects/post/?ownerID=23764cb8-80f2-4a03-8060-2f3f4c95b978 HTTP/1.1 +content-type: application/json + +### + +# GET a post +GET {{URI}}/objects/post/{{postid}} HTTP/1.1 +content-type: application/json + +### + +# => SHOULD FAIl +# DELETE all posts +DELETE {{URI}}/objects/post/ HTTP/1.1 +content-type: application/json + +### + +# DELETE a post +DELETE {{URI}}/objects/post/{{postid}} HTTP/1.1 +content-type: application/json From 5b1e54e694136131c4934e2880b4d51e72eb3179 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Apr 2023 10:30:26 +0200 Subject: [PATCH 014/467] remove unused depencies --- controllers/eav.go | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/controllers/eav.go b/controllers/eav.go index d8b46a6d..75bed6ae 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -6,7 +6,6 @@ import ( "fmt" "net/http" - "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/services/eavservice" @@ -26,9 +25,7 @@ var ( } ) -// The EAV controller type EAVController interface { - // Return the badaas server information GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) @@ -42,24 +39,18 @@ var _ EAVController = (*eavControllerImpl)(nil) // The InformationController constructor func NewEAVController( logger *zap.Logger, - paginationConfiguration configuration.PaginationConfiguration, - db *gorm.DB, eavService eavservice.EAVService, ) EAVController { return &eavControllerImpl{ - logger: logger, - paginationConfiguration: paginationConfiguration, - db: db, - eavService: eavService, + logger: logger, + eavService: eavService, } } // The concrete implementation of the InformationController type eavControllerImpl struct { - logger *zap.Logger - paginationConfiguration configuration.PaginationConfiguration - db *gorm.DB - eavService eavservice.EAVService + logger *zap.Logger + eavService eavservice.EAVService } func (controller *eavControllerImpl) GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { From 4ddb9a2f892af073dc426a97da80be37ee7b582d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Apr 2023 10:33:16 +0200 Subject: [PATCH 015/467] add spaces to increce readability --- controllers/eav.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/controllers/eav.go b/controllers/eav.go index 75bed6ae..e8306455 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -61,11 +61,11 @@ func (controller *eavControllerImpl) GetAll(w http.ResponseWriter, r *http.Reque if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityTypeNotFound } - } - queryparams := r.URL.Query() + + queryParams := r.URL.Query() var qp = make(map[string]string) - for k, v := range queryparams { + for k, v := range queryParams { qp[k] = v[0] } fmt.Println(qp) @@ -87,8 +87,8 @@ func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Re http.Error(w, GetErrMsg(err.Error()), http.StatusInternalServerError) return nil, httperrors.NewInternalServerError("db error", "db query failed", err) } - id, idErr := getEntityIDFromRequest(r) + id, idErr := getEntityIDFromRequest(r) if idErr != nil { return nil, idErr } @@ -104,6 +104,7 @@ func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Re return nil, ErrDBQueryFailed(err) } } + return obj, nil } @@ -114,10 +115,12 @@ func getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { if !ok { return uuid.Nil, ErrEntityNotFound } + uid, err := uuid.Parse(id) if err != nil { return uuid.Nil, ErrIDNotAnUUID } + return uid, nil } @@ -139,11 +142,12 @@ func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http http.Error(w, GetErrMsg(err.Error()), http.StatusInternalServerError) return nil, httperrors.NewInternalServerError("db error", "search for entity type", err) } - id, idErr := getEntityIDFromRequest(r) + id, idErr := getEntityIDFromRequest(r) if idErr != nil { return nil, idErr } + entity, err := controller.eavService.GetEntity(ett, id) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { @@ -154,10 +158,12 @@ func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http return nil, ErrDBQueryFailed(err) } } + err = controller.eavService.DeleteEntity(entity) if err != nil { return nil, httperrors.NewInternalServerError("deletion failed", "", err) } + return nil, nil } @@ -171,6 +177,7 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http } return nil, ErrDBQueryFailed(err) } + var cr createReq err = json.NewDecoder(r.Body).Decode(&cr) r.Body.Close() @@ -183,7 +190,9 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http if err != nil { return nil, httperrors.NewInternalServerError("creation failed", "", err) } + w.Header().Add("Location", buildLocationString(et)) + return et, nil } @@ -211,6 +220,7 @@ func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http if err != nil { return nil, ErrIDNotAnUUID } + entity, err := controller.eavService.GetEntity(ett, id) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { @@ -227,8 +237,10 @@ func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http if err != nil { return nil, ErrDBQueryFailed(err) } + fmt.Println(mr.Attrs) controller.eavService.UpdateEntity(entity, mr.Attrs) + return entity, nil } From 8e20b521e2de67b86430b77b14a04fd5d0d80084 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Apr 2023 11:08:42 +0200 Subject: [PATCH 016/467] use constants in place of strings --- commands/rootCmd.go | 24 ++++++++++++------------ controllers/eav.go | 2 +- persistence/models/Attribute.go | 5 ++--- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/commands/rootCmd.go b/commands/rootCmd.go index 96aeacd9..c03d0747 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -80,7 +80,7 @@ func PopulateDatabase(db *gorm.DB) error { humanType := &models.EntityType{ Name: "human", } - nameAttr := &models.Attribute{Name: "name", ValueType: "string", Required: true} + nameAttr := &models.Attribute{Name: "name", ValueType: models.StringValueType, Required: true} humanType.Attributes = append( humanType.Attributes, nameAttr, ) @@ -102,11 +102,11 @@ func PopulateDatabase(db *gorm.DB) error { db.Create(jean) // Defining a bird - colorAttr := &models.Attribute{Name: "color", ValueType: "string", Required: true} - specieAttr := &models.Attribute{Name: "specie", ValueType: "string", Required: true} - heightAttr := &models.Attribute{Name: "height", ValueType: "int", Default: true, DefaultInt: 12, Required: false} - weightAttr := &models.Attribute{Name: "weight", ValueType: "float", Default: true, DefaultFloat: 12.500, Required: false} - ownerAttr := &models.Attribute{Name: "owner", ValueType: "relation", Required: false, TargetEntityTypeID: humanType.ID} + colorAttr := &models.Attribute{Name: "color", ValueType: models.StringValueType, Required: true} + specieAttr := &models.Attribute{Name: "specie", ValueType: models.StringValueType, Required: true} + heightAttr := &models.Attribute{Name: "height", ValueType: models.IntValueType, Default: true, DefaultInt: 12, Required: false} + weightAttr := &models.Attribute{Name: "weight", ValueType: models.FloatValueType, Default: true, DefaultFloat: 12.500, Required: false} + ownerAttr := &models.Attribute{Name: "owner", ValueType: models.RelationValueType, Required: false, TargetEntityTypeID: humanType.ID} BirdType := &models.EntityType{ Name: "bird", @@ -157,13 +157,13 @@ func PopulateDatabase2(db *gorm.DB) error { displayNameAttr := &models.Attribute{ EntityTypeID: profileType.ID, Name: "displayName", - ValueType: "string", + ValueType: models.StringValueType, Required: true, } urlPicAttr := &models.Attribute{ EntityTypeID: profileType.ID, Name: "urlPic", - ValueType: "string", + ValueType: models.StringValueType, Required: false, Default: true, DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", //nolint:lll @@ -171,7 +171,7 @@ func PopulateDatabase2(db *gorm.DB) error { userIDAttr := &models.Attribute{ EntityTypeID: profileType.ID, Name: "userId", - ValueType: "string", + ValueType: models.StringValueType, Required: true, } profileType.Attributes = append(profileType.Attributes, @@ -201,18 +201,18 @@ func PopulateDatabase2(db *gorm.DB) error { titleAttr := &models.Attribute{ EntityTypeID: postType.ID, Name: "title", - ValueType: "string", + ValueType: models.StringValueType, Required: true, } bodyAttr := &models.Attribute{ Name: "body", - ValueType: "string", + ValueType: models.StringValueType, Default: false, DefaultString: "empty", } ownerAttr := &models.Attribute{ Name: "ownerID", - ValueType: "string", + ValueType: models.StringValueType, Required: true, } diff --git a/controllers/eav.go b/controllers/eav.go index e8306455..56431395 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -68,7 +68,7 @@ func (controller *eavControllerImpl) GetAll(w http.ResponseWriter, r *http.Reque for k, v := range queryParams { qp[k] = v[0] } - fmt.Println(qp) + var collection = controller.eavService.GetEntitiesWithParams(ett, qp) return collection, nil diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index d27c96a7..115853d9 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -34,9 +34,8 @@ type Attribute struct { DefaultString string DefaultFloat float64 - // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" - ValueType ValueTypeT - TargetEntityTypeID uuid.UUID // name of the EntityType + ValueType ValueTypeT // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" + TargetEntityTypeID uuid.UUID // name of the EntityType // GORM relations EntityTypeID uuid.UUID From 25c4bffaa9043d3aa8c55dd11e299838eebb1b6c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 11 Apr 2023 16:07:02 +0200 Subject: [PATCH 017/467] docker for testing with volume --- scripts/e2e/api/Dockerfile | 23 +++++++++++------------ scripts/e2e/api/badaas.yml | 2 +- scripts/e2e/db/init.sh | 4 ++-- scripts/e2e/docker-compose.yml | 6 +++--- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/scripts/e2e/api/Dockerfile b/scripts/e2e/api/Dockerfile index 68d01b3d..da8b5c02 100644 --- a/scripts/e2e/api/Dockerfile +++ b/scripts/e2e/api/Dockerfile @@ -1,12 +1,11 @@ -# builder image -FROM golang:1.19-alpine as builder -RUN apk add build-base -WORKDIR /app -COPY . . -RUN CGO_ENABLED=1 go build --race -a -o badaas . - -FROM alpine:3.16.2 -ENV BADAAS_PORT=8000 -COPY --from=builder /app/badaas . -COPY ./scripts/e2e/api/badaas.yml . -ENTRYPOINT [ "./badaas" ] +# DEVELOPMENT ONLY, DO NOT USE FOR PRODUCTION +FROM golang:1.19-alpine +RUN mkdir /badaas +WORKDIR /badaas +COPY go.mod . +COPY go.sum . +RUN go mod download +ENV CGO_ENABLED=0 +ENV GOOS=linux +ENV GOARCH=amd64 +ENV GOFLAGS=-buildvcs=false \ No newline at end of file diff --git a/scripts/e2e/api/badaas.yml b/scripts/e2e/api/badaas.yml index 081fad8f..b830cc06 100644 --- a/scripts/e2e/api/badaas.yml +++ b/scripts/e2e/api/badaas.yml @@ -11,7 +11,7 @@ database: port: 26257 sslmode: disable username: root - password: postres + password: postgres name: badaas_db init: retry: 10 diff --git a/scripts/e2e/db/init.sh b/scripts/e2e/db/init.sh index a5d76fb0..f33a2781 100644 --- a/scripts/e2e/db/init.sh +++ b/scripts/e2e/db/init.sh @@ -1,12 +1,12 @@ #!/bin/sh echo "******************************* Listing Env Variables..." printenv -echo "******************************* starting single cockroach node..." +echo "******************************* Starting single cockroach node..." ./cockroach start-single-node --insecure --log-config-file=logs.yaml --background -echo "******************************* Creating user" +# echo "******************************* Creating user" # cockroach user set ${COCKROACH_USER} --password 1234 --echo-sql # cockroach user ls diff --git a/scripts/e2e/docker-compose.yml b/scripts/e2e/docker-compose.yml index a6b936a3..1dbcdec3 100644 --- a/scripts/e2e/docker-compose.yml +++ b/scripts/e2e/docker-compose.yml @@ -15,11 +15,11 @@ services: build: context: ./../.. dockerfile: ./scripts/e2e/api/Dockerfile + volumes: + - ../..:/badaas:ro + entrypoint: go run /badaas/badaas.go --config_path /badaas/scripts/e2e/api/badaas.yml ports: - "8000:8000" restart: always - # environment: - # - BADAAS_PORT=8000 - # - BADAAS_MAX_TIMOUT= 15 # in seconds depends_on: - db From 05456dd617781fe2160aac66450b25c5adaeb10a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 11 Apr 2023 16:10:56 +0200 Subject: [PATCH 018/467] add makefile for commands and put e2e files in a folder --- CONTRIBUTING.md | 43 ++++++++----------- Makefile | 9 ++++ .../badaas_e2e_test.go | 3 ++ .../features}/api_info.feature | 0 .../features}/basic_auth.feature | 0 .../http_support_test.go | 3 ++ 6 files changed, 34 insertions(+), 24 deletions(-) create mode 100644 Makefile rename badaas_e2e_test.go => test_e2e/badaas_e2e_test.go (97%) rename {features => test_e2e/features}/api_info.feature (100%) rename {features => test_e2e/features}/basic_auth.feature (100%) rename http_support_test.go => test_e2e/http_support_test.go (99%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7d252da0..e048a8cc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,15 @@ # Contribute to the development of badaas -- [Tests](#tests) - - [Unit tests](#unit-tests) - - [Feature tests (of end to end tests)](#feature-tests-of-end-to-end-tests) -- [Logger](#logger) -- [Directory structure](#directory-structure) -- [Git](#git) - - [Branch naming policy](#branch-naming-policy) - - [Default branch](#default-branch) - - [How to release](#how-to-release) +- [Contribute to the development of badaas](#contribute-to-the-development-of-badaas) + - [Tests](#tests) + - [Unit tests](#unit-tests) + - [Feature tests (of end to end tests)](#feature-tests-of-end-to-end-tests) + - [Logger](#logger) + - [Directory structure](#directory-structure) + - [Git](#git) + - [Branch naming policy](#branch-naming-policy) + - [Default branch](#default-branch) + - [How to release](#how-to-release) ## Tests @@ -19,7 +20,7 @@ We use the standard test suite in combination with [github.com/stretchr/testify] To run them, please run: ```sh -go test $(go list ./... | sed 1d) -v +make test_unit ``` ### Feature tests (of end to end tests) @@ -29,16 +30,10 @@ We use docker to run a Badaas instance in combination with one node of Cockroach Run: ```sh -docker compose -f "scripts/e2e/docker-compose.yml" up -d --build +make test_e2e ``` -Then in an another shell: - -```sh -go test -v -``` - -The feature files can be found in the `feature` folder. +The feature files can be found in the `test_e2e/features` folder. ## Logger @@ -52,9 +47,9 @@ This is the directory structure we use for the project: - `configuration/` *(Go code)*: Contains all the configuration holders. Please only use the interfaces, they are all mocked for easy testing - `controllers/` *(Go code)*: Contains all the http controllers, they handle http requests and consume services. - `docs/`: Contains the documentation. -- `features/`: Contains all the feature tests (or end to end tests). +- `test_e2e/`: Contains all the feature tests (or end to end tests). - `logger/` *(Go code)*: Contains the logger creation logic. Please don't call it from your own services and code, use the dependency injection system. -- `persistance/` *(Go code)*: +- `persistance/` *(Go code)*: - `/gormdatabase/` *(Go code)*: Contains the logic to create a database. Also contains a go package named `gormzap`: it is a compatibility layer between *gorm.io/gorm* and *github.com/uber-go/zap*. - `/models/` *(Go code)*: Contains the models. (For a structure to me considered a valid model, it has to embed `models.BaseModel` and satisfy the `models.Tabler` interface. This interface returns the name of the sql table.) - `/dto/` *(Go code)*: Contains the Data Transfert Objects. They are used mainly to decode json payloads. @@ -67,7 +62,7 @@ This is the directory structure we use for the project: - `/api/` : Contains the Dockerfile to build badaas with a dedicated config file. - `/db/` : Contains the Dockerfile to build a developpement version of CockroachDB. - `services/` *(Go code)*: Contains the Dockerfile to build a developpement version of CockroachDB. - - `/auth/protocols/`: Contains the implementations of authentication clients for differents protocols. + - `/auth/protocols/`: Contains the implementations of authentication clients for differents protocols. - `/basicauth/` *(Go code)*: Handle the authentification using email/password. - `/oidc/` *(Go code)*: Handle the authentication via Open-ID Connect. - `/sessionservice/` *(Go code)*: Handle sessions and their lifecycle. @@ -79,7 +74,7 @@ At the root of the project, you will find: - The README. - The changelog. - The files for the E2E test http support. -- The LICENCE file. +- The LICENSE file. ## Git @@ -87,7 +82,7 @@ At the root of the project, you will find: `[BRANCH_TYPE]/[BRANCH_NAME]` -- `BRANCH_TYPE` is a prefix to describe the purpose of the branch. +- `BRANCH_TYPE` is a prefix to describe the purpose of the branch. Accepted prefixes are: - `feature`, used for feature development @@ -97,7 +92,7 @@ At the root of the project, you will find: - `prerelease`, used for preparing the branch for the release - `release`, used for releasing project - `hotfix`, used for applying a hotfix on main - - `poc`, used for proof of concept + - `poc`, used for proof of concept - `BRANCH_NAME` is managed by this regex: `[a-z0-9._-]` (`_` is used as space character). ### Default branch diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..0bd30a88 --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +test_unit: + go test ./... -v + +test_enviroment: + docker compose -f "scripts/e2e/docker-compose.yml" up -d + +test_e2e: test_enviroment + go test -tags=e2e ./test_e2e -v + diff --git a/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go similarity index 97% rename from badaas_e2e_test.go rename to test_e2e/badaas_e2e_test.go index 8b5e2072..d7064d63 100644 --- a/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -1,3 +1,6 @@ +//go:build e2e +// +build e2e + package main import ( diff --git a/features/api_info.feature b/test_e2e/features/api_info.feature similarity index 100% rename from features/api_info.feature rename to test_e2e/features/api_info.feature diff --git a/features/basic_auth.feature b/test_e2e/features/basic_auth.feature similarity index 100% rename from features/basic_auth.feature rename to test_e2e/features/basic_auth.feature diff --git a/http_support_test.go b/test_e2e/http_support_test.go similarity index 99% rename from http_support_test.go rename to test_e2e/http_support_test.go index b1f5ec7c..38c3d795 100644 --- a/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -1,3 +1,6 @@ +//go:build e2e +// +build e2e + package main import ( From 9b5d99cbbc389a99a39b0bc8d771a8fac02a50b1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 11 Apr 2023 18:22:38 +0200 Subject: [PATCH 019/467] add integration tests --- .github/workflows/CI.yml | 33 ++++++++++++++----- Makefile | 11 +++++-- .../e2e/api => docker/test_api}/Dockerfile | 0 .../e2e/api => docker/test_api}/badaas.yml | 2 +- docker/test_api/docker-compose.yml | 18 ++++++++++ {scripts/e2e/db => docker/test_db}/Dockerfile | 0 docker/test_db/docker-compose.yml | 14 ++++++++ {scripts/e2e/db => docker/test_db}/init.sh | 1 + {scripts/e2e/db => docker/test_db}/logs.yaml | 0 docker/wait_for_api.sh | 6 ++++ scripts/e2e/docker-compose.yml | 25 -------------- test_integration/eavservice.go | 9 +++++ test_integration/integration_test.go | 20 +++++++++++ test_integration/integration_test_suite.go | 25 ++++++++++++++ 14 files changed, 127 insertions(+), 37 deletions(-) rename {scripts/e2e/api => docker/test_api}/Dockerfile (100%) rename {scripts/e2e/api => docker/test_api}/badaas.yml (93%) create mode 100644 docker/test_api/docker-compose.yml rename {scripts/e2e/db => docker/test_db}/Dockerfile (100%) create mode 100644 docker/test_db/docker-compose.yml rename {scripts/e2e/db => docker/test_db}/init.sh (96%) rename {scripts/e2e/db => docker/test_db}/logs.yaml (100%) create mode 100755 docker/wait_for_api.sh delete mode 100644 scripts/e2e/docker-compose.yml create mode 100644 test_integration/eavservice.go create mode 100644 test_integration/integration_test.go create mode 100644 test_integration/integration_test_suite.go diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index e382df70..5bba46b9 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -31,7 +31,7 @@ jobs: go-version: '^1.18' cache: true - name: Run test - run: go test $(go list ./... | sed 1d) -coverprofile=coverage.out -v + run: go test ./... -coverprofile=coverage.out -v - uses: actions/upload-artifact@v3 with: name: coverage @@ -49,7 +49,6 @@ jobs: with: go-version: '^1.18' cache: true - - name: golangci-lint uses: golangci/golangci-lint-action@v3 with: @@ -58,9 +57,27 @@ jobs: skip-pkg-cache: true skip-build-cache: true + integration-tests: + name: Integration tests + needs: [unit-tests, check-style] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - uses: actions/setup-go@v3 + with: + go-version: '^1.18' + cache: true + - name: Run test + run: make test_integration + - name: Stop containers + if: always() + run: docker compose -f "docker/test_db/docker-compose.yml" down + e2e-tests: name: E2E Tests - needs: [unit-tests, check-style] + needs: [integration-tests] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -71,25 +88,25 @@ jobs: go-version: '^1.18' cache: true - name: Start containers - run: docker compose -f "scripts/e2e/docker-compose.yml" up -d --build + run: docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" up -d --build - name: Wait for API server to be up uses: mydea/action-wait-for-api@v1 with: url: "http://localhost:8000/info" timeout: 20 - name: Run test - run: go test -v + run: go test -tags=e2e ./test_e2e -v - name: Get logs if: always() - run: docker compose -f "scripts/e2e/docker-compose.yml" logs --no-color 2>&1 | tee app.log & + run: docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" logs --no-color 2>&1 | tee app.log & - name: Stop containers if: always() - run: docker compose -f "scripts/e2e/docker-compose.yml" down + run: docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" down - uses: actions/upload-artifact@v3 with: name: docker-compose-e2e-logs path: app.log - + sonarcloud: name: SonarCloud needs: [unit-tests, check-style] diff --git a/Makefile b/Makefile index 0bd30a88..3a270622 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,14 @@ test_unit: go test ./... -v -test_enviroment: - docker compose -f "scripts/e2e/docker-compose.yml" up -d +test_integration: + docker compose -f "docker/test_db/docker-compose.yml" up -d + go test -tags=integration ./test_integration -v -test_e2e: test_enviroment +test_e2e: + docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" up -d + ./docker/wait_for_api.sh 8000/info go test -tags=e2e ./test_e2e -v +.PHONY: test_unit test_integration test_e2e + diff --git a/scripts/e2e/api/Dockerfile b/docker/test_api/Dockerfile similarity index 100% rename from scripts/e2e/api/Dockerfile rename to docker/test_api/Dockerfile diff --git a/scripts/e2e/api/badaas.yml b/docker/test_api/badaas.yml similarity index 93% rename from scripts/e2e/api/badaas.yml rename to docker/test_api/badaas.yml index b830cc06..71c3ab7e 100644 --- a/scripts/e2e/api/badaas.yml +++ b/docker/test_api/badaas.yml @@ -7,7 +7,7 @@ server: max: 10 database: - host: e2e-db-1 + host: badaas-test-db port: 26257 sslmode: disable username: root diff --git a/docker/test_api/docker-compose.yml b/docker/test_api/docker-compose.yml new file mode 100644 index 00000000..7d6605ae --- /dev/null +++ b/docker/test_api/docker-compose.yml @@ -0,0 +1,18 @@ +# DEVELOPMENT ONLY, DO NOT USE FOR PRODUCTION +version: '3.5' + +services: + api: + container_name: "badaas-test-api" + build: + context: ../.. + dockerfile: ./docker/test_api/Dockerfile + image: badaas-test-api + volumes: + - ../..:/badaas:ro + entrypoint: go run /badaas/badaas.go --config_path /badaas/docker/test_api/badaas.yml + ports: + - "8000:8000" + restart: always + depends_on: + - db diff --git a/scripts/e2e/db/Dockerfile b/docker/test_db/Dockerfile similarity index 100% rename from scripts/e2e/db/Dockerfile rename to docker/test_db/Dockerfile diff --git a/docker/test_db/docker-compose.yml b/docker/test_db/docker-compose.yml new file mode 100644 index 00000000..1d0718b4 --- /dev/null +++ b/docker/test_db/docker-compose.yml @@ -0,0 +1,14 @@ +# DEVELOPMENT ONLY, DO NOT USE FOR PRODUCTION +version: '3.5' + +services: + db: + container_name: "badaas-test-db" + build: . + image: badaas-test-db + ports: + - "26257:26257" + - "8080:8080" # Web based dashboard + environment: + - COCKROACH_USER=root + - COCKROACH_DB=badaas_db diff --git a/scripts/e2e/db/init.sh b/docker/test_db/init.sh similarity index 96% rename from scripts/e2e/db/init.sh rename to docker/test_db/init.sh index f33a2781..23cc75b5 100644 --- a/scripts/e2e/db/init.sh +++ b/docker/test_db/init.sh @@ -13,6 +13,7 @@ echo "******************************* Starting single cockroach node..." echo "******************************* Init database" echo "******************************* |=> Creating init.sql" +# TODO ERROR: at or near "-": syntax error cat > init.sql < Date: Wed, 12 Apr 2023 10:36:59 +0200 Subject: [PATCH 020/467] add dependency injection yo integration tests --- commands/rootCmd.go | 8 ++--- persistence/ModuleFx.go | 2 +- persistence/gormdatabase/db.go | 1 + services/ModuleFx.go | 15 ++++++++ test_integration/eavservice.go | 15 +++++++- test_integration/integration_test.go | 42 +++++++++++++++++++--- test_integration/integration_test_suite.go | 19 +++++----- 7 files changed, 79 insertions(+), 23 deletions(-) create mode 100644 services/ModuleFx.go diff --git a/commands/rootCmd.go b/commands/rootCmd.go index c03d0747..24158e57 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -11,9 +11,7 @@ import ( "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/resources" "github.com/ditrit/badaas/router" - "github.com/ditrit/badaas/services/eavservice" - "github.com/ditrit/badaas/services/sessionservice" - "github.com/ditrit/badaas/services/userservice" + "github.com/ditrit/badaas/services" "github.com/ditrit/verdeter" "github.com/spf13/cobra" "go.uber.org/fx" @@ -31,10 +29,8 @@ func runHTTPServer(cmd *cobra.Command, args []string) { controllers.ControllerModule, logger.LoggerModule, persistence.PersistanceModule, + services.ServicesModule, - fx.Provide(userservice.NewUserService), - fx.Provide(sessionservice.NewSessionService), - fx.Provide(eavservice.NewEAVService), // logger for fx fx.WithLogger(func(logger *zap.Logger) fxevent.Logger { return &fxevent.ZapLogger{Logger: logger} diff --git a/persistence/ModuleFx.go b/persistence/ModuleFx.go index d99d1c02..a371bf7f 100644 --- a/persistence/ModuleFx.go +++ b/persistence/ModuleFx.go @@ -20,7 +20,7 @@ var PersistanceModule = fx.Module( // Database connection fx.Provide(gormdatabase.CreateDatabaseConnectionFromConfiguration), - //repositories + // repositories fx.Provide(repository.NewCRUDRepository[models.Session, uuid.UUID]), fx.Provide(repository.NewCRUDRepository[models.User, uuid.UUID]), ) diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index ddd5a22b..d1621f1e 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -54,6 +54,7 @@ func CreateDatabaseConnectionFromConfiguration(logger *zap.Logger, databaseConfi numberRetry+1, databaseConfiguration.GetRetry(), databaseConfiguration.GetRetryTime().String()) time.Sleep(databaseConfiguration.GetRetryTime()) } + return nil, err } diff --git a/services/ModuleFx.go b/services/ModuleFx.go new file mode 100644 index 00000000..aa55e571 --- /dev/null +++ b/services/ModuleFx.go @@ -0,0 +1,15 @@ +package services + +import ( + "github.com/ditrit/badaas/services/eavservice" + "github.com/ditrit/badaas/services/sessionservice" + "github.com/ditrit/badaas/services/userservice" + "go.uber.org/fx" +) + +var ServicesModule = fx.Module( + "services", + fx.Provide(userservice.NewUserService), + fx.Provide(sessionservice.NewSessionService), + fx.Provide(eavservice.NewEAVService), +) diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index bacfec20..1fe04c83 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -1,9 +1,22 @@ package integration_test +import "github.com/ditrit/badaas/services/eavservice" + type EAVServiceIntTestSuite struct { IntegrationTestSuite + eavService eavservice.EAVService +} + +func NewEAVServiceIntTestSuite( + ts *IntegrationTestSuite, + eavService eavservice.EAVService, +) *EAVServiceIntTestSuite { + return &EAVServiceIntTestSuite{ + IntegrationTestSuite: *ts, + eavService: eavService, + } } func (ts *EAVServiceIntTestSuite) TestSomething() { - ts.Assert().Equal(1, 2) + ts.Assert().Equal(1, 1) } diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index daac3cd3..b457e168 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -6,15 +6,49 @@ package integration_test import ( "testing" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/controllers" + "github.com/ditrit/badaas/logger" + "github.com/ditrit/badaas/persistence" + "github.com/ditrit/badaas/router" + "github.com/ditrit/badaas/services" "github.com/stretchr/testify/suite" + "go.uber.org/fx" + "go.uber.org/fx/fxevent" + "go.uber.org/zap" ) +var tGlobal *testing.T + // In order for 'go test' to run this suite, we need to create // a normal test function and pass our suite to suite.Run func TestAll(t *testing.T) { - integrationTestSuite := IntegrationTestSuite{} + tGlobal = t + fx.New( + // Modules + configuration.ConfigurationModule, + router.RouterModule, + controllers.ControllerModule, + logger.LoggerModule, + persistence.PersistanceModule, + services.ServicesModule, + + // logger for fx + fx.WithLogger(func(logger *zap.Logger) fxevent.Logger { + return &fxevent.ZapLogger{Logger: logger} + }), + + fx.Provide(NewIntegrationTestSuite), + fx.Provide(NewEAVServiceIntTestSuite), + + fx.Invoke(runTestSuites), + ).Run() +} - suite.Run(t, &EAVServiceIntTestSuite{ - IntegrationTestSuite: integrationTestSuite, - }) +func runTestSuites( + ts1 *EAVServiceIntTestSuite, + shutdowner fx.Shutdowner +) { + suite.Run(tGlobal, ts1) + shutdowner.Shutdown() } diff --git a/test_integration/integration_test_suite.go b/test_integration/integration_test_suite.go index 354748f5..fcf4d854 100644 --- a/test_integration/integration_test_suite.go +++ b/test_integration/integration_test_suite.go @@ -1,10 +1,7 @@ package integration_test import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/stretchr/testify/suite" - "go.uber.org/zap" "gorm.io/gorm" ) @@ -13,13 +10,13 @@ type IntegrationTestSuite struct { gormDB *gorm.DB } -func (ts *IntegrationTestSuite) SetupSuite() { - // TODO use dependency injection - logger, _ := zap.NewProduction() - gormDB, err := gormdatabase.CreateDatabaseConnectionFromConfiguration(logger, configuration.NewDatabaseConfiguration()) - if err != nil { - panic(err) +func NewIntegrationTestSuite( + db *gorm.DB, +) *IntegrationTestSuite { + return &IntegrationTestSuite{ + gormDB: db, } - - ts.gormDB = gormDB } + +// func (ts *IntegrationTestSuite) SetupSuite() { +// } From 88bc1037191c0c60da448a8f4c9d45470306665d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 12 Apr 2023 15:52:26 +0200 Subject: [PATCH 021/467] delete unsed file --- commands/r.md | 86 --------------------------------------------------- 1 file changed, 86 deletions(-) delete mode 100644 commands/r.md diff --git a/commands/r.md b/commands/r.md deleted file mode 100644 index c32746b4..00000000 --- a/commands/r.md +++ /dev/null @@ -1,86 +0,0 @@ -package commands - -import ( - "log" - - "github.com/ditrit/badaas/logger" - "github.com/ditrit/badaas/persistence/registry" - "github.com/ditrit/badaas/persistence/repository" - "github.com/ditrit/badaas/router" - "github.com/ditrit/badaas/services/session" - "github.com/ditrit/badaas/services/userservice" - "github.com/ditrit/verdeter" - "go.uber.org/zap" -) - -// Create a super admin user and exit with code 1 on error -func createSuperAdminUser() { - logg := zap.L().Sugar() - _, err := userservice.NewUser("superadmin", "superadmin@badaas.test", "1234") - if err != nil { - if repository.ErrAlreadyExists == err { - logg.Debugf("The superadmin user already exists in database") - } else { - logg.Fatalf("failed to save the super admin %w", err) - } - } - -} - -// Run the http server for badaas -func runHTTPServer(cfg *verdeter.VerdeterCommand, args []string) error { - err := logger.InitLoggerFromConf() - if err != nil { - log.Fatalf("An error happened while initializing logger (ERROR=%s)", err.Error()) - } - - zap.L().Info("The logger is initialiazed") - - // create router - router := router.SetupRouter() - - registryInstance, err := registry.FactoryRegistry(registry.GormDataStore) - if err != nil { - zap.L().Sugar().Fatalf("An error happened while initializing datastorage layer (ERROR=%s)", err.Error()) - } - registry.ReplaceGlobals(registryInstance) - zap.L().Info("The datastorage layer is initialized") - - createSuperAdminUser() - - err = session.Init() - if err != nil { - zap.L().Sugar().Fatalf("An error happened while initializing the session service (ERROR=%s)", err.Error()) - } - zap.L().Info("The session service is initialized") - - // create server - srv := createServerFromConfiguration(router) - - zap.L().Sugar().Infof("Ready to serve at %s\n", srv.Addr) - return srv.ListenAndServe() -} - -var rootCfg = verdeter.NewVerdeterCommand( - "badaas", - "Backend and Distribution as a Service", - `Badaas stands for Backend and Distribution as a Service.`, - runHTTPServer, -) - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - rootCfg.Execute() -} - -func init() { - rootCfg.Initialize() - - rootCfg.GKey("config_path", verdeter.IsStr, "", "Path to the config file/directory") - rootCfg.SetDefault("config_path", ".") - - initServerCommands(rootCfg) - initLoggerCommands(rootCfg) - initDatabaseCommands(rootCfg) -} From a1455dde5c65ade2f024a3ffd2b4f9fc23b1ef38 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 12 Apr 2023 15:55:22 +0200 Subject: [PATCH 022/467] make integration tests able to connect to db --- commands/rootCmd.go | 18 ++++++++-------- test_integration/int_test_config.yml | 15 ++++++++++++++ test_integration/integration_test.go | 24 +++++++++++++++++++++- test_integration/integration_test_suite.go | 8 ++++++-- 4 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 test_integration/int_test_config.yml diff --git a/commands/rootCmd.go b/commands/rootCmd.go index 24158e57..fad6fde3 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -57,18 +57,20 @@ var rootCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ // Execute adds all child commands to the root command and sets flags appropriately. // This is called by main.main(). It only needs to happen once to the rootCmd. func Execute() { + InitCommands(rootCfg) + rootCfg.Execute() } -func init() { - rootCfg.GKey("config_path", verdeter.IsStr, "", "Path to the config file/directory") - rootCfg.SetDefault("config_path", ".") +func InitCommands(config *verdeter.VerdeterCommand) { + config.GKey("config_path", verdeter.IsStr, "", "Path to the config file/directory") + config.SetDefault("config_path", ".") - initServerCommands(rootCfg) - initLoggerCommands(rootCfg) - initDatabaseCommands(rootCfg) - initInitialisationCommands(rootCfg) - initSessionCommands(rootCfg) + initServerCommands(config) + initLoggerCommands(config) + initDatabaseCommands(config) + initInitialisationCommands(config) + initSessionCommands(config) } func PopulateDatabase(db *gorm.DB) error { diff --git a/test_integration/int_test_config.yml b/test_integration/int_test_config.yml new file mode 100644 index 00000000..8e0754df --- /dev/null +++ b/test_integration/int_test_config.yml @@ -0,0 +1,15 @@ +database: + host: localhost + port: 26257 + sslmode: disable + username: root + password: postgres + name: badaas_db + init: + retry: 10 + retryTime: 5 + +logger: + mode: dev + request: + template: "Receive {{method}} request on {{url}}" \ No newline at end of file diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index b457e168..a9223b7a 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -4,14 +4,21 @@ package integration_test import ( + "path" + "path/filepath" + "runtime" "testing" + "github.com/ditrit/badaas/commands" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/logger" "github.com/ditrit/badaas/persistence" "github.com/ditrit/badaas/router" "github.com/ditrit/badaas/services" + "github.com/ditrit/verdeter" + "github.com/spf13/cobra" + "github.com/spf13/viper" "github.com/stretchr/testify/suite" "go.uber.org/fx" "go.uber.org/fx/fxevent" @@ -20,10 +27,24 @@ import ( var tGlobal *testing.T +var testsCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Run: injectDependencies, +}) + // In order for 'go test' to run this suite, we need to create // a normal test function and pass our suite to suite.Run func TestAll(t *testing.T) { + _, b, _, _ := runtime.Caller(0) + basePath := filepath.Dir(b) + viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) + commands.InitCommands(testsCfg) + tGlobal = t + + testsCfg.Execute() +} + +func injectDependencies(cmd *cobra.Command, args []string) { fx.New( // Modules configuration.ConfigurationModule, @@ -41,13 +62,14 @@ func TestAll(t *testing.T) { fx.Provide(NewIntegrationTestSuite), fx.Provide(NewEAVServiceIntTestSuite), + // fx.Invoke(commands.PopulateDatabase), fx.Invoke(runTestSuites), ).Run() } func runTestSuites( ts1 *EAVServiceIntTestSuite, - shutdowner fx.Shutdowner + shutdowner fx.Shutdowner, ) { suite.Run(tGlobal, ts1) shutdowner.Shutdown() diff --git a/test_integration/integration_test_suite.go b/test_integration/integration_test_suite.go index fcf4d854..65ec6b3f 100644 --- a/test_integration/integration_test_suite.go +++ b/test_integration/integration_test_suite.go @@ -2,19 +2,23 @@ package integration_test import ( "github.com/stretchr/testify/suite" + "go.uber.org/zap" "gorm.io/gorm" ) type IntegrationTestSuite struct { suite.Suite - gormDB *gorm.DB + logger *zap.Logger + db *gorm.DB } func NewIntegrationTestSuite( + logger *zap.Logger, db *gorm.DB, ) *IntegrationTestSuite { return &IntegrationTestSuite{ - gormDB: db, + logger: logger, + db: db, } } From 20f22cee9b18f9e3ff64974c55198a53bbc08e55 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 13 Apr 2023 16:52:33 +0200 Subject: [PATCH 023/467] refactor + fixes in models + fix in getEntityWithParams + int tests --- commands/rootCmd.go | 25 +- go.mod | 8 +- go.sum | 8 + persistence/models/Attribute.go | 37 +- persistence/models/BaseModel.go | 2 +- persistence/models/Entity.go | 43 +- persistence/models/Entity_test.go | 4 +- persistence/models/Tabler.go | 6 +- persistence/models/Value.go | 246 +++++++---- services/eavservice/eavservice.go | 403 +++++++++++------- test_integration/eavservice.go | 129 +++++- test_integration/integration_test_suite.go | 61 ++- {services/eavservice/utils => utils}/json.go | 0 .../eavservice/utils => utils}/json_test.go | 2 +- {services/eavservice/utils => utils}/math.go | 0 .../eavservice/utils => utils}/math_test.go | 2 +- utils/slice.go | 15 + utils/slice_test.go | 56 +++ 18 files changed, 738 insertions(+), 309 deletions(-) rename {services/eavservice/utils => utils}/json.go (100%) rename {services/eavservice/utils => utils}/json_test.go (95%) rename {services/eavservice/utils => utils}/math.go (100%) rename {services/eavservice/utils => utils}/math_test.go (86%) create mode 100644 utils/slice.go create mode 100644 utils/slice_test.go diff --git a/commands/rootCmd.go b/commands/rootCmd.go index fad6fde3..4cec7369 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -104,7 +104,7 @@ func PopulateDatabase(db *gorm.DB) error { specieAttr := &models.Attribute{Name: "specie", ValueType: models.StringValueType, Required: true} heightAttr := &models.Attribute{Name: "height", ValueType: models.IntValueType, Default: true, DefaultInt: 12, Required: false} weightAttr := &models.Attribute{Name: "weight", ValueType: models.FloatValueType, Default: true, DefaultFloat: 12.500, Required: false} - ownerAttr := &models.Attribute{Name: "owner", ValueType: models.RelationValueType, Required: false, TargetEntityTypeID: humanType.ID} + ownerAttr := &models.Attribute{Name: "owner", ValueType: models.RelationValueType, Required: false, RelationTargetEntityTypeID: humanType.ID} BirdType := &models.EntityType{ Name: "bird", @@ -183,9 +183,9 @@ func PopulateDatabase2(db *gorm.DB) error { EntityTypeID: profileType.ID, EntityType: profileType, } - displayNameVal := &models.Value{Attribute: urlPicAttr, StringVal: "The Super Admin"} - userPicVal := &models.Value{Attribute: urlPicAttr, IsNull: true} - userIDVal := &models.Value{Attribute: userIDAttr, StringVal: userID} + displayNameVal, _ := models.NewStringValue(displayNameAttr, "The Super Admin") + userPicVal, _ := models.NewNullValue(urlPicAttr) + userIDVal, _ := models.NewStringValue(userIDAttr, userID) adminProfile.Fields = append(adminProfile.Fields, displayNameVal, userPicVal, @@ -222,30 +222,21 @@ func PopulateDatabase2(db *gorm.DB) error { EntityTypeID: postType.ID, EntityType: postType, } - titleVal := &models.Value{ - Attribute: titleAttr, - StringVal: "Why cats like mice ?", - } - bodyVal, err := models.NewStringValue(bodyAttr, + titleVal, _ := models.NewStringValue(titleAttr, "Why cats like mice ?") + bodyVal, _ := models.NewStringValue(bodyAttr, `Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. In erat mi, pharetra ut lacinia at, facilisis vitae nunc. `) - if err != nil { - return err - } - ownerVal := &models.Value{ - Attribute: ownerAttr, - StringVal: userID, - } + ownerVal, _ := models.NewStringValue(ownerAttr, userID) whyCatsLikeMice.Fields = append(whyCatsLikeMice.Fields, titleVal, bodyVal, ownerVal, ) - err = db.Create(whyCatsLikeMice).Error + err := db.Create(whyCatsLikeMice).Error if err != nil { return err } diff --git a/go.mod b/go.mod index cc08c08c..0ee7fcec 100644 --- a/go.mod +++ b/go.mod @@ -22,14 +22,19 @@ require ( gorm.io/gorm v1.24.1 ) -require github.com/felixge/httpsnoop v1.0.1 // indirect +require ( + github.com/felixge/httpsnoop v1.0.1 // indirect + golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect +) require ( github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect github.com/cucumber/messages-go/v16 v16.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/elliotchance/pie/v2 v2.5.2 github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/gofrs/uuid v4.0.0+incompatible // indirect + github.com/google/go-cmp v0.5.9 github.com/goph/emperror v0.17.2 // indirect github.com/gorilla/handlers v1.5.1 github.com/hashicorp/go-immutable-radix v1.3.1 // indirect @@ -68,4 +73,5 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gotest.tools v2.2.0+incompatible ) diff --git a/go.sum b/go.sum index b394cea0..022bd4c9 100644 --- a/go.sum +++ b/go.sum @@ -97,6 +97,8 @@ github.com/ditrit/verdeter v0.3.2-0.20230118160022-0caba70148cd h1:r2NABj0IHkzEt github.com/ditrit/verdeter v0.3.2-0.20230118160022-0caba70148cd/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= github.com/ditrit/verdeter v0.4.0 h1:DzEOFauuXEGNQYP6OgYtHwEyb3w9riem99u0xE/l7+o= github.com/ditrit/verdeter v0.4.0/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= +github.com/elliotchance/pie/v2 v2.5.2 h1:jRENMmysCljhUmyT8ITKV0Atp6Lukm3XpeqaI87POsM= +github.com/elliotchance/pie/v2 v2.5.2/go.mod h1:18t0dgGFH006g4eVdDtWfgFZPQEgl10IoEO8YWEq3Og= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -166,6 +168,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -510,6 +514,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 h1:ba9YlqfDGTTQ5aZ2fwOoQ1hf32QySyQkR6ODGDzHlnE= +golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -836,6 +842,8 @@ gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnY gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= gorm.io/gorm v1.24.1 h1:CgvzRniUdG67hBAzsxDGOAuq4Te1osVMYsa1eQbd4fs= gorm.io/gorm v1.24.1/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index 115853d9..6dbc135f 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -7,6 +7,9 @@ import ( "github.com/google/uuid" ) +// Describe the type of an attribute +type ValueTypeT string + const ( RelationValueType ValueTypeT = "relation" BooleanValueType ValueTypeT = "bool" @@ -15,9 +18,6 @@ const ( FloatValueType ValueTypeT = "float" ) -// Describe the type of an attribute -type ValueTypeT string - // Describe the attribute of a en EntityType type Attribute struct { BaseModel @@ -34,8 +34,8 @@ type Attribute struct { DefaultString string DefaultFloat float64 - ValueType ValueTypeT // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" - TargetEntityTypeID uuid.UUID // name of the EntityType + ValueType ValueTypeT // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" + RelationTargetEntityTypeID uuid.UUID // id of the EntityType to which a RelationValueType points to // GORM relations EntityTypeID uuid.UUID @@ -48,34 +48,19 @@ func (a *Attribute) GetNewDefaultValue() (*Value, error) { if !a.Default { return nil, ErrNoDefaultValueSet } + switch a.ValueType { case StringValueType: - v, err := NewStringValue(a, a.DefaultString) - if err != nil { - return nil, err - } - return v, nil + return NewStringValue(a, a.DefaultString) case IntValueType: - v, err := NewIntValue(a, a.DefaultInt) - if err != nil { - return nil, err - } - return v, nil + return NewIntValue(a, a.DefaultInt) case FloatValueType: - v, err := NewFloatValue(a, a.DefaultFloat) - if err != nil { - return nil, err - } - return v, nil + return NewFloatValue(a, a.DefaultFloat) case BooleanValueType: - v, err := NewBoolValue(a, a.DefaultBool) - if err != nil { - return nil, err - } - return v, nil + return NewBoolValue(a, a.DefaultBool) case RelationValueType: return nil, fmt.Errorf("can't provide default value for relations") default: - panic("hmmm we are not supposed to be here") + return nil, fmt.Errorf("unsupported ValueType") } } diff --git a/persistence/models/BaseModel.go b/persistence/models/BaseModel.go index acf3c2e0..9cfa2aae 100644 --- a/persistence/models/BaseModel.go +++ b/persistence/models/BaseModel.go @@ -12,7 +12,7 @@ import ( // Every model intended to be saved in the database must embed this BaseModel // reference: https://gorm.io/docs/models.html#gorm-Model type BaseModel struct { - ID uuid.UUID `gorm:"type:uuid;default:uuid_generate_v4()"` + ID uuid.UUID `gorm:"primarykey;type:uuid;default:uuid_generate_v4()"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index c3e4920b..46243958 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" - "github.com/ditrit/badaas/services/eavservice/utils" + "github.com/ditrit/badaas/utils" "github.com/google/uuid" ) @@ -27,6 +27,7 @@ func (e *Entity) MarshalJSON() ([]byte, error) { dto["createdAt"] = e.CreatedAt dto["updatedAt"] = e.UpdatedAt dto["attrs"] = e.encodeAttributes() + return json.Marshal(dto) } @@ -39,26 +40,21 @@ func (e *Entity) encodeAttributes() map[string]any { } pairs[field.Attribute.Name] = field.Value() } + return pairs } func (e *Entity) GetValue(attrName string) (interface{}, error) { - var attrID uuid.UUID - for _, a := range e.EntityType.Attributes { - if a.Name == attrName { - attrID = a.ID - break - } - } - if uuid.Nil == attrID { - return nil, fmt.Errorf("attr not found: got=%s", attrName) - } - for _, v := range e.Fields { - if v.AttributeID == attrID { - return v.Value(), nil - } + value := utils.FindFirst(e.Fields, + func(v *Value) bool { + return v.Attribute.Name == attrName + }, + ) + if value == nil { + return nil, fmt.Errorf("value for attribute %s not found", attrName) } - return nil, fmt.Errorf("value not found") + + return (*value).Value(), nil } // Encode the Entity to json @@ -67,13 +63,14 @@ func (e *Entity) EncodeToJSON() []byte { pairs = append(pairs, fmt.Sprintf("%q: %d", "id", e.ID), fmt.Sprintf("%q: %q", "type", e.EntityType.Name), - fmt.Sprintf("%q: %s", "attrs", e.encodeAttributesold()), + fmt.Sprintf("%q: %s", "attrs", e.encodeAttributesToJSON()), ) + return []byte(utils.BuildJSONFromStrings(pairs)) } // return the attribute in a json encoded string -func (e *Entity) encodeAttributesold() string { +func (e *Entity) encodeAttributesToJSON() string { var pairs []string for _, f := range e.Fields { if f.IsNull { @@ -82,5 +79,15 @@ func (e *Entity) encodeAttributesold() string { pair, _ := f.BuildJSONKVPair() pairs = append(pairs, pair) } + return utils.BuildJSONFromStrings(pairs) } + +func (Entity) TableName() string { + return "entities" +} + +func (e Entity) Equal(other Entity) bool { + return e.ID == other.ID && + e.EntityTypeID == other.EntityTypeID +} diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go index 3921bd3b..941f7ad6 100644 --- a/persistence/models/Entity_test.go +++ b/persistence/models/Entity_test.go @@ -13,7 +13,7 @@ func TestMarshall(t *testing.T) { BaseModel: BaseModel{ID: id}, Name: "bird", Attributes: []*Attribute{ - &Attribute{ + { BaseModel: BaseModel{ ID: id, }, @@ -28,7 +28,7 @@ func TestMarshall(t *testing.T) { BaseModel: BaseModel{ ID: id, }, - Fields: []*Value{&Value{ + Fields: []*Value{{ BaseModel: BaseModel{ ID: id, }, diff --git a/persistence/models/Tabler.go b/persistence/models/Tabler.go index 7b8eef6a..f8b5f468 100644 --- a/persistence/models/Tabler.go +++ b/persistence/models/Tabler.go @@ -1,12 +1,12 @@ package models var ListOfTables = []any{ - User{}, Session{}, - Entity{}, - EntityType{}, + User{}, Value{}, + Entity{}, Attribute{}, + EntityType{}, } // The interface "type" need to implement to be considered models diff --git a/persistence/models/Value.go b/persistence/models/Value.go index 1df10584..bc0daeb2 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -19,8 +19,6 @@ type Value struct { BoolVal bool RelationVal uuid.UUID - StringifiedValue string - // GORM relations EntityID uuid.UUID AttributeID uuid.UUID @@ -34,84 +32,75 @@ var ( // Create a new null value func NewNullValue(attr *Attribute) (*Value, error) { - val := new(Value) if attr.Required { return nil, fmt.Errorf("can't create new null value for a required attribute") } - val.IsNull = true - val.Attribute = attr - return val, nil + + return &Value{IsNull: true, Attribute: attr}, nil } // Create a new int value func NewIntValue(attr *Attribute, i int) (*Value, error) { - val := new(Value) if attr.ValueType != IntValueType { return nil, fmt.Errorf("can't create a new int value with a %s attribute", attr.ValueType) } - val.IsNull = false - val.IntVal = i - val.Attribute = attr - return val, nil + + return &Value{IntVal: i, Attribute: attr}, nil } // Create a new bool value func NewBoolValue(attr *Attribute, b bool) (*Value, error) { - val := new(Value) if attr.ValueType != BooleanValueType { return nil, fmt.Errorf("can't create a new bool value with a %s attribute", attr.ValueType) } - val.IsNull = false - val.BoolVal = b - val.Attribute = attr - return val, nil + + return &Value{BoolVal: b, Attribute: attr}, nil } // Create a new float value func NewFloatValue(attr *Attribute, f float64) (*Value, error) { - val := new(Value) if attr.ValueType != FloatValueType { return nil, fmt.Errorf("can't create a new float value with a %s attribute", attr.ValueType) } - val.IsNull = false - val.FloatVal = f - val.Attribute = attr - return val, nil + + return &Value{FloatVal: f, Attribute: attr}, nil } // Create a new string value func NewStringValue(attr *Attribute, s string) (*Value, error) { - val := new(Value) if attr.ValueType != StringValueType { return nil, fmt.Errorf("can't create a new string value with a %s attribute", attr.ValueType) } - val.IsNull = false - val.StringVal = s - val.Attribute = attr - return val, nil + + return &Value{StringVal: s, Attribute: attr}, nil } // Create a new relation value. -// If et is nil, then the function return an error -// If et is of the wrong types +// If et is nil, then the function returns an error +// If et is of the wrong types, then the function returns an error func NewRelationValue(attr *Attribute, et *Entity) (*Value, error) { - val := new(Value) - if attr.ValueType != RelationValueType { - return nil, fmt.Errorf("can't create a new relation value with a %s attribute", attr.ValueType) - } if et == nil { return nil, fmt.Errorf("can't create a new relation with a nill entity pointer") } - if et.EntityType.ID != attr.TargetEntityTypeID { + if et.EntityType.ID != attr.RelationTargetEntityTypeID { return nil, fmt.Errorf( "can't create a relation with an entity of wrong EntityType. (got the entityid=%d, expected=%d)", - et.EntityType.ID, attr.TargetEntityTypeID, + et.EntityType.ID, attr.RelationTargetEntityTypeID, ) } - val.IsNull = false - val.RelationVal = et.ID - val.Attribute = attr - return val, nil + + return NewRelationIDValue(attr, et.ID) +} + +// Create a new relation value. +// If et is nil, then the function returns an error +// If et is of the wrong types, then the function returns an error +func NewRelationIDValue(attr *Attribute, uuidVal uuid.UUID) (*Value, error) { + if attr.ValueType != RelationValueType { + return nil, fmt.Errorf("can't create a new relation value with a %s attribute", attr.ValueType) + } + + return &Value{RelationVal: uuidVal, Attribute: attr}, nil } // Check if the Value is whole. eg, no fields are nil @@ -119,6 +108,7 @@ func (v *Value) CheckWhole() error { if v.Attribute == nil { return fmt.Errorf("the Attribute pointer is nil in Value at %v", v) } + return nil } @@ -129,7 +119,11 @@ func (v *Value) CheckWhole() error { func (v *Value) GetStringVal() (string, error) { err := v.CheckWhole() if err != nil { - panic(err) + return "", err + } + + if v.Attribute.ValueType != StringValueType { + return "", ErrAskingForWrongType } if v.IsNull { @@ -138,9 +132,7 @@ func (v *Value) GetStringVal() (string, error) { } return "", ErrValueIsNull } - if v.Attribute.ValueType != StringValueType { - return "", ErrAskingForWrongType - } + return v.StringVal, nil } @@ -151,7 +143,11 @@ func (v *Value) GetStringVal() (string, error) { func (v *Value) GetFloatVal() (float64, error) { err := v.CheckWhole() if err != nil { - panic(err) + return 0.0, err + } + + if v.Attribute.ValueType != FloatValueType { + return 0.0, ErrAskingForWrongType } if v.IsNull { @@ -160,9 +156,7 @@ func (v *Value) GetFloatVal() (float64, error) { } return 0.0, ErrValueIsNull } - if v.Attribute.ValueType != FloatValueType { - return 0.0, ErrAskingForWrongType - } + return v.FloatVal, nil } @@ -173,7 +167,11 @@ func (v *Value) GetFloatVal() (float64, error) { func (v *Value) GetIntVal() (int, error) { err := v.CheckWhole() if err != nil { - panic(err) + return 0, err + } + + if v.Attribute.ValueType != IntValueType { + return 0, ErrAskingForWrongType } if v.IsNull { @@ -182,9 +180,7 @@ func (v *Value) GetIntVal() (int, error) { } return 0, ErrValueIsNull } - if v.Attribute.ValueType != IntValueType { - return 0, ErrAskingForWrongType - } + return v.IntVal, nil } @@ -195,7 +191,11 @@ func (v *Value) GetIntVal() (int, error) { func (v *Value) GetBoolVal() (bool, error) { err := v.CheckWhole() if err != nil { - panic(err) + return false, err + } + + if v.Attribute.ValueType != BooleanValueType { + return false, ErrAskingForWrongType } if v.IsNull { @@ -204,9 +204,7 @@ func (v *Value) GetBoolVal() (bool, error) { } return false, ErrValueIsNull } - if v.Attribute.ValueType != BooleanValueType { - return false, ErrAskingForWrongType - } + return v.BoolVal, nil } @@ -217,8 +215,9 @@ func (v *Value) GetBoolVal() (bool, error) { func (v *Value) GetComputedRelationVal(db *gorm.DB) (*Entity, error) { err := v.CheckWhole() if err != nil { - panic(err) + return nil, err } + if v.Attribute.ValueType != RelationValueType { return nil, ErrAskingForWrongType } @@ -241,8 +240,9 @@ func (v *Value) GetComputedRelationVal(db *gorm.DB) (*Entity, error) { func (v *Value) GetRelationVal() (uuid.UUID, error) { err := v.CheckWhole() if err != nil { - panic(err) + return uuid.Nil, err } + if v.Attribute.ValueType != RelationValueType { return uuid.Nil, ErrAskingForWrongType } @@ -250,52 +250,26 @@ func (v *Value) GetRelationVal() (uuid.UUID, error) { if v.IsNull { return uuid.Nil, fmt.Errorf("the relation is null") } + return v.RelationVal, nil } // Return the underlying value as an interface func (v *Value) Value() any { - err := v.CheckWhole() - if err != nil { - panic(err) + if v.IsNull { + return nil } + switch v.Attribute.ValueType { case StringValueType: - if v.IsNull { - if v.Attribute.Default { - return v.Attribute.DefaultString - } - return nil - } return v.StringVal case IntValueType: - if v.IsNull { - if v.Attribute.Default { - return v.Attribute.DefaultInt - } - return nil - } return v.IntVal case FloatValueType: - if v.IsNull { - if v.Attribute.Default { - return v.Attribute.DefaultFloat - } - return nil - } return v.FloatVal case BooleanValueType: - if v.IsNull { - if v.Attribute.Default { - return v.Attribute.DefaultBool - } - return nil - } return v.BoolVal case RelationValueType: - if v.IsNull { - return nil - } return v.RelationVal default: panic(fmt.Errorf( @@ -305,6 +279,95 @@ func (v *Value) Value() any { } } +func (v *Value) SetNull() { + v.IsNull = true + v.IntVal = 0 + v.FloatVal = 0.0 + v.StringVal = "" + v.BoolVal = false + v.RelationVal = uuid.Nil +} + +func (v *Value) SetStringVal(stringVal string) error { + err := v.CheckWhole() + if err != nil { + return err + } + + if v.Attribute.ValueType != StringValueType { + return ErrAskingForWrongType + } + + v.IsNull = false + v.StringVal = stringVal + + return nil +} + +func (v *Value) SetIntVal(intVal int) error { + err := v.CheckWhole() + if err != nil { + return err + } + + if v.Attribute.ValueType != IntValueType { + return ErrAskingForWrongType + } + + v.IsNull = false + v.IntVal = intVal + + return nil +} + +func (v *Value) SetFloatVal(floatVal float64) error { + err := v.CheckWhole() + if err != nil { + return err + } + + if v.Attribute.ValueType != FloatValueType { + return ErrAskingForWrongType + } + + v.IsNull = false + v.FloatVal = floatVal + + return nil +} + +func (v *Value) SetBooleanVal(boolVal bool) error { + err := v.CheckWhole() + if err != nil { + return err + } + + if v.Attribute.ValueType != BooleanValueType { + return ErrAskingForWrongType + } + + v.IsNull = false + v.BoolVal = boolVal + + return nil +} + +func (v *Value) SetRelationVal(relationVal uuid.UUID) error { + err := v.CheckWhole() + if err != nil { + return err + } + + if v.Attribute.ValueType != RelationValueType { + return ErrAskingForWrongType + } + + v.IsNull = false + v.RelationVal = relationVal + + return nil +} + var ErrCantBuildKVPairForNullValue = errors.New("can't build key/value pair from null value") // When Value isNull, it is impossible to build a Key/Value pair // Build a key/value pair to be included in a JSON @@ -312,11 +375,20 @@ var ErrCantBuildKVPairForNullValue = errors.New("can't build key/value pair from func (v *Value) BuildJSONKVPair() (string, error) { err := v.CheckWhole() if err != nil { - panic(err) + return "", err } + bytes, err := json.Marshal(v.Value()) if err != nil { return "", fmt.Errorf("an error happened while trying to marshall the %q attr: (%w)", v.Attribute.Name, err) } + return fmt.Sprintf("%q:%s", v.Attribute.Name, bytes), nil } + +func (v Value) Equal(other Value) bool { + return v.ID == other.ID && + v.AttributeID == other.AttributeID && + v.EntityID == other.EntityID && + v.Value() == other.Value() +} diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 73e5ea68..2900d610 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -3,10 +3,9 @@ package eavservice import ( "errors" "fmt" - "strconv" "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/services/eavservice/utils" + "github.com/ditrit/badaas/utils" "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" @@ -17,7 +16,7 @@ var ( ErrCantParseUUID = errors.New("can't parse uuid") ) -// EAV service provide handle EAV objets +// EAV service provide handle EAV objects type EAVService interface { GetEntityTypeByName(name string) (*models.EntityType, error) GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity @@ -48,70 +47,166 @@ func (eavService *eavServiceImpl) GetEntityTypeByName(name string) (*models.Enti err := eavService.db.Preload("Attributes").First(&ett, "name = ?", name).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, fmt.Errorf(" EntityType named %q not found", name) + return nil, fmt.Errorf("EntityType named %q not found", name) } } return &ett, nil } func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity { - var ets []*models.Entity - eavService.db.Where( - "entity_type_id = ?", ett.ID, - ).Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").Find(&ets) - resultSet := make([]*models.Entity, 0, len(ets)) - var keep bool - for _, et := range ets { - keep = true - for _, value := range et.Fields { - for k, v := range params { - if k == value.Attribute.Name { - switch value.Attribute.ValueType { - case models.StringValueType: - if v != value.StringVal { - keep = false - } - case models.IntValueType: - intVal, err := strconv.Atoi(v) - if err != nil { - break - } - if intVal != value.IntVal { - keep = false - } - case models.FloatValueType: - floatVal, err := strconv.ParseFloat(v, 64) - if err != nil { - break - } - if floatVal != value.FloatVal { - keep = false - } - case models.RelationValueType: - uuidVal, err := uuid.Parse(v) - if err != nil { - keep = false - } - if uuidVal != value.RelationVal { - keep = false - } - case models.BooleanValueType: - boolVal, err := strconv.ParseBool(v) - if err != nil { - break - } - if boolVal != value.BoolVal { - keep = false - } - } - } + var entities []*models.Entity + + // TODO check pivot and cross join + // TODO distinct + // query := eavService.db.Select("entities.id").Joins( + // "JOIN attributes ON attributes.entity_type_id = ?", + // ett.ID, + // ).Joins( + // `JOIN values ON + // values.entity_id = entities.id + // AND values.attribute_id = attributes.id`, + // ) + + // eavService.db.Raw( + // `SELECT entities.* + // FROM entities + // JOIN attributes + // ON attributes.entity_type_id = entities.entity_type_id + // JOIN values ON + // values.entity_id = entities.id AND + // values.attribute_id = attributes.id + // // TODO pivot table + // WHERE + // entities.entity_type_id = ?`, + // ett.ID, + // ).Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").Find(&entities) + // TODO hacer version sin gorm para no tener que hacer todas estas queries al pedo. + // TODO tambien hacer una version que no usa gorm para evitar las queries multiples hechas para buscar el resto de objetos. + + // multiple joins version + // TODO filter by null + // TODO relations + // TODO deleted_at + + query := eavService.db.Select("entities.*") + + for _, attr := range ett.Attributes { + v, present := params[attr.Name] + if present { + var valToUse string + + // TODO check that v is a valid value for that type to avoid error in db + switch attr.ValueType { + case models.StringValueType: + valToUse = "string_val" + case models.IntValueType: + valToUse = "int_val" + case models.FloatValueType: + valToUse = "float_val" + case models.BooleanValueType: + valToUse = "bool_val" } - } - if keep { - resultSet = append(resultSet, et) + + query = query.Joins( + fmt.Sprintf(` + JOIN attributes ON + attributes.entity_type_id = entities.entity_type_id + AND attributes.name = ? + JOIN values ON + values.attribute_id = attributes.id + AND values.entity_id = entities.id + AND values.%s = ?`, + valToUse, + ), + attr.Name, valToUse, v, + ) } } - return resultSet + + query = query.Where( + "entities.entity_type_id = ?", + ett.ID, + ) + query = query.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType") + query.Find(&entities) + + return entities + + // version con un solo join + // eavService.db.Joins( + // "JOIN values ON values.entity_id = entities.id", + // ).Joins( + // `JOIN attributes ON + // values.attribute_id = attributes.id + // AND attributes.name IN ?`, + // maps.Keys(params), + // ).Where( + // `entities.entity_type_id = ? + // AND values.value = ?`, + // ett.ID, + // params["no se que poner aca"], + // ).Find(&entities) + + // version all in memory + // eavService.db.Where( + // "entity_type_id = ?", + // ett.ID, + // ).Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").Find(&entities) + + // // TODO ultra ineficiente, se traen todas las entidades de ese tipo y se hace la query a mano + // resultSet := make([]*models.Entity, 0, len(entities)) + // var keep bool + // for _, et := range entities { + // keep = true + // for _, value := range et.Fields { + // for k, v := range params { + // if k == value.Attribute.Name { + // switch value.Attribute.ValueType { + // case models.StringValueType: + // if v != value.StringVal { + // keep = false + // } + // case models.IntValueType: + // intVal, err := strconv.Atoi(v) + // if err != nil { + // break + // } + // if intVal != value.IntVal { + // keep = false + // } + // case models.FloatValueType: + // floatVal, err := strconv.ParseFloat(v, 64) + // if err != nil { + // break + // } + // if floatVal != value.FloatVal { + // keep = false + // } + // case models.RelationValueType: + // uuidVal, err := uuid.Parse(v) + // if err != nil { + // keep = false + // } + // if uuidVal != value.RelationVal { + // keep = false + // } + // case models.BooleanValueType: + // boolVal, err := strconv.ParseBool(v) + // if err != nil { + // break + // } + // if boolVal != value.BoolVal { + // keep = false + // } + // } + // } + // } + // } + // if keep { + // resultSet = append(resultSet, et) + // } + // } + // return resultSet } // Delete an entity @@ -141,134 +236,150 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map var et models.Entity for _, a := range ett.Attributes { present := false - var value models.Value + + var value *models.Value + var err error + for k, v := range attrs { if k == a.Name { present = true + switch t := v.(type) { case string: if a.ValueType == models.RelationValueType { - uuidVal, err := uuid.Parse(v.(string)) + uuidVal, err := uuid.Parse(t) if err != nil { return nil, ErrCantParseUUID } - value = models.Value{RelationVal: uuidVal} - } else if a.ValueType != models.StringValueType { - return nil, fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) + value, err = models.NewRelationIDValue(a, uuidVal) + if err != nil { + return nil, err + } + } else { + value, err = models.NewStringValue(a, t) + if err != nil { + return nil, err + } } - value = models.Value{StringVal: v.(string)} - - case float64: - if a.ValueType != models.IntValueType && - a.ValueType != models.FloatValueType && - a.ValueType != models.RelationValueType { - return nil, fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) + case int: + value, err = models.NewIntValue(a, t) + if err != nil { + return nil, err } - if utils.IsAnInt(v.(float64)) { - value = models.Value{IntVal: int(v.(float64))} + case float64: + if utils.IsAnInt(t) && a.ValueType == models.IntValueType { + value, err = models.NewIntValue(a, int(t)) + if err != nil { + return nil, err + } } else { - // is a float - value = models.Value{FloatVal: v.(float64)} + value, err = models.NewFloatValue(a, t) + if err != nil { + return nil, err + } } - case bool: - if a.ValueType != models.BooleanValueType { - return nil, fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) + value, err = models.NewBoolValue(a, t) + if err != nil { + return nil, err } - value = models.Value{BoolVal: v.(bool)} - + // TODO is this really necessary? case nil: - if a.Required { - return nil, fmt.Errorf("can't have a null field with a required attribute") + value, err = models.NewNullValue(a) + if err != nil { + return nil, err } - value = models.Value{IsNull: true} - default: - panic("mmmh you just discovered a new json type (https://go.dev/blog/json#generic-json-with-interface)") + return nil, fmt.Errorf("unsupported type") } } } - if a.Required && !present { - return nil, fmt.Errorf("field %q is missing and is required", a.Name) - } + if !present { + if a.Required { + return nil, fmt.Errorf("field %q is missing and is required", a.Name) + } + if a.Default { - v, err := a.GetNewDefaultValue() + value, err = a.GetNewDefaultValue() if err != nil { return nil, err } - - value = *v } else { - value = models.Value{IsNull: true} + // TODO is this really necessary? + value, err = models.NewNullValue(a) + if err != nil { + return nil, err + } } } - value.Attribute = a - et.Fields = append(et.Fields, &value) + + et.Fields = append(et.Fields, value) } + et.EntityType = ett return &et, eavService.db.Create(&et).Error } func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[string]interface{}) error { - for _, a := range et.EntityType.Attributes { - for _, value := range et.Fields { - if a.ID == value.AttributeID { - for k, v := range attrs { - if k == a.Name { - switch t := v.(type) { - case string: - if a.ValueType == models.RelationValueType { - uuidVal, err := uuid.Parse(v.(string)) - if err != nil { - return ErrCantParseUUID - } - value.RelationVal = uuidVal - } else if a.ValueType != models.StringValueType { - return fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) - } - value.StringVal = v.(string) - case float64: - if a.ValueType != models.IntValueType && - a.ValueType != models.FloatValueType && - a.ValueType != models.RelationValueType { - return fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) - } - if utils.IsAnInt(v.(float64)) { - // is an int - - value.IntVal = int(v.(float64)) - } else { - // is a float - value.FloatVal = v.(float64) - } - - case bool: - if a.ValueType != models.BooleanValueType { - return fmt.Errorf("types dont match (expected=%v got=%T)", a.ValueType, t) - } - value.BoolVal = v.(bool) - - case nil: - if a.Required { - return fmt.Errorf("can't set a required variable to null (expected=%v got=%T)", a.ValueType, t) - } - value.IsNull = true - value.IntVal = 0 - value.FloatVal = 0.0 - value.StringVal = "" - value.BoolVal = false - value.RelationVal = uuid.Nil - - default: - panic("mmmh you just discovered a new json type (https://go.dev/blog/json#generic-json-with-interface)") + for _, value := range et.Fields { + attribute := value.Attribute + for k, v := range attrs { + if k == attribute.Name { + switch t := v.(type) { + case string: + if attribute.ValueType == models.RelationValueType { + uuidVal, err := uuid.Parse(t) + if err != nil { + return ErrCantParseUUID + } + + err = value.SetRelationVal(uuidVal) + if err != nil { + return err + } + } else { + err := value.SetStringVal(t) + if err != nil { + return err + } + } + case int: + err := value.SetIntVal(t) + if err != nil { + return err + } + case float64: + if utils.IsAnInt(t) && attribute.ValueType == models.IntValueType { + err := value.SetIntVal(int(t)) + if err != nil { + return err } + } else { + err := value.SetFloatVal(t) + if err != nil { + return err + } + } + case bool: + err := value.SetBooleanVal(t) + if err != nil { + return err } + // TODO is this really necessary? + case nil: + if attribute.Required { + return fmt.Errorf("can't set a required variable to null") + } + value.SetNull() + + default: + return fmt.Errorf("unsupported type") } - value.Attribute = a - eavService.db.Save(value) } } + eavService.db.Save(value) } + return nil } diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 1fe04c83..99cb3241 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -1,10 +1,18 @@ package integration_test -import "github.com/ditrit/badaas/services/eavservice" +import ( + "log" + + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services/eavservice" +) type EAVServiceIntTestSuite struct { IntegrationTestSuite - eavService eavservice.EAVService + eavService eavservice.EAVService + profileType *models.EntityType + displayNameAttr *models.Attribute + descriptionAttr *models.Attribute } func NewEAVServiceIntTestSuite( @@ -17,6 +25,119 @@ func NewEAVServiceIntTestSuite( } } -func (ts *EAVServiceIntTestSuite) TestSomething() { - ts.Assert().Equal(1, 1) +func (ts *EAVServiceIntTestSuite) SetupTest() { + ts.IntegrationTestSuite.SetupTest() + + // TODO duplicated code + // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES + ts.profileType = &models.EntityType{ + Name: "profile", + } + ts.displayNameAttr = &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "displayName", + ValueType: models.StringValueType, + Required: true, + } + ts.descriptionAttr = &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "description", + ValueType: models.StringValueType, + Required: false, + } + ts.profileType.Attributes = append(ts.profileType.Attributes, + ts.displayNameAttr, + ts.descriptionAttr, + ) + + // err := ts.db.Create(ts.profileType).Error + // if err != nil { + // ts.Fail("Unable to create entity type: ", err) + // } + + log.Println(ts.displayNameAttr.ID) + log.Println(ts.descriptionAttr.ID) +} + +// ------------------------- GetEntitiesWithParams -------------------------------- + +func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsEmptyIfNotEntitiesCreated() { + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, make(map[string]string)) + + ts.equalEntityList([]*models.Entity{}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsTheOnlyOneIfOneEntityCreated() { + profile := ts.createProfile(ts.profileType, "profile") + + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, make(map[string]string)) + + ts.equalEntityList([]*models.Entity{profile}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsTheListWhenMultipleCreated() { + profile1 := ts.createProfile(ts.profileType, "profile1") + profile2 := ts.createProfile(ts.profileType, "profile2") + profile3 := ts.createProfile(ts.profileType, "profile3") + + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, make(map[string]string)) + + ts.equalEntityList([]*models.Entity{profile1, profile2, profile3}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsEmptyIfNotEntitiesCreated() { + params := map[string]string{ + "displayName": "not_created", + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + ts.equalEntityList([]*models.Entity{}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsEmptyIfNothingMatch() { + ts.createProfile(ts.profileType, "profile") + + params := map[string]string{ + "displayName": "not_match", + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + ts.equalEntityList([]*models.Entity{}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsOneIfOnlyOneMatch() { + matchProfile := ts.createProfile(ts.profileType, "match") + ts.createProfile(ts.profileType, "something_else") + + params := map[string]string{ + "displayName": "match", + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + ts.equalEntityList([]*models.Entity{matchProfile}, entities) +} + +// TODO verificar cuando el atributo nisiquiera existe +// TODO verificar con otros tipos de atributos +// TODO verificar cuando hay otros entityTypes + +func (ts *EAVServiceIntTestSuite) createProfile(entityType *models.EntityType, displayName string) *models.Entity { + entity := &models.Entity{ + EntityTypeID: entityType.ID, + EntityType: entityType, + } + + displayNameVal, _ := models.NewStringValue(ts.displayNameAttr, displayName) + // descriptionVal, _ := models.NewNullValue(ts.descriptionAttr) + entity.Fields = append(entity.Fields, + displayNameVal, + // descriptionVal, + ) + + err := ts.db.Create(entity).Error + if err != nil { + ts.Fail("Unable to create entity: ", err) + } + + return entity } diff --git a/test_integration/integration_test_suite.go b/test_integration/integration_test_suite.go index 65ec6b3f..26825b38 100644 --- a/test_integration/integration_test_suite.go +++ b/test_integration/integration_test_suite.go @@ -1,9 +1,16 @@ package integration_test import ( + "log" + "reflect" + "sort" + + "github.com/ditrit/badaas/persistence/models" "github.com/stretchr/testify/suite" "go.uber.org/zap" "gorm.io/gorm" + "gotest.tools/assert" + is "gotest.tools/assert/cmp" ) type IntegrationTestSuite struct { @@ -22,5 +29,55 @@ func NewIntegrationTestSuite( } } -// func (ts *IntegrationTestSuite) SetupSuite() { -// } +func (ts *IntegrationTestSuite) SetupTest() { + // clean database to ensure independency between tests + for _, table := range models.ListOfTables { + err := ts.db.Unscoped().Where("1 = 1").Delete(table).Error + if err != nil { + log.Fatalln("could not clean database: ", err) + } + } +} + +func (ts *IntegrationTestSuite) equalList(expected, actual any) { + v := reflect.ValueOf(expected) + v2 := reflect.ValueOf(actual) + + ts.Len(actual, v.Len()) + + for i := 0; i < v.Len(); i++ { + j := 0 + for ; j < v.Len(); j++ { + if is.DeepEqual(v2.Index(j).Interface(), v.Index(i).Interface())().Success() { + break + } + } + if j == v.Len() { + ts.Fail("element %v not in list %v", v.Index(i).Interface(), actual) + } + } +} + +func (ts *IntegrationTestSuite) equalEntityList(expected, actual []*models.Entity) { + ts.Len(actual, len(expected)) + + sort.SliceStable(expected, func(i, j int) bool { + return expected[i].ID.ID() < expected[j].ID.ID() + }) + + sort.SliceStable(actual, func(i, j int) bool { + return actual[i].ID.ID() < actual[j].ID.ID() + }) + + for i := range actual { + ts.equalEntity(expected[i], actual[i]) + } +} + +func (ts *IntegrationTestSuite) equalEntity(expected, actual *models.Entity) { + assert.DeepEqual(ts.T(), expected, actual) + ts.equalList( + expected.Fields, + actual.Fields, + ) +} diff --git a/services/eavservice/utils/json.go b/utils/json.go similarity index 100% rename from services/eavservice/utils/json.go rename to utils/json.go diff --git a/services/eavservice/utils/json_test.go b/utils/json_test.go similarity index 95% rename from services/eavservice/utils/json_test.go rename to utils/json_test.go index ec58f879..9e85658c 100644 --- a/services/eavservice/utils/json_test.go +++ b/utils/json_test.go @@ -3,7 +3,7 @@ package utils_test import ( "testing" - "github.com/ditrit/badaas/services/eavservice/utils" + "github.com/ditrit/badaas/utils" ) type jsonTest struct { diff --git a/services/eavservice/utils/math.go b/utils/math.go similarity index 100% rename from services/eavservice/utils/math.go rename to utils/math.go diff --git a/services/eavservice/utils/math_test.go b/utils/math_test.go similarity index 86% rename from services/eavservice/utils/math_test.go rename to utils/math_test.go index 6bab6fb5..08a7e9c6 100644 --- a/services/eavservice/utils/math_test.go +++ b/utils/math_test.go @@ -3,7 +3,7 @@ package utils_test import ( "testing" - "github.com/ditrit/badaas/services/eavservice/utils" + "github.com/ditrit/badaas/utils" ) func TestIsAnINT(t *testing.T) { diff --git a/utils/slice.go b/utils/slice.go new file mode 100644 index 00000000..2b370951 --- /dev/null +++ b/utils/slice.go @@ -0,0 +1,15 @@ +package utils + +import ( + "github.com/elliotchance/pie/v2" +) + +func FindFirst[T any](ss []T, fn func(value T) bool) *T { + index := pie.FindFirstUsing(ss, fn) + + if index == -1 { + return nil + } + + return &ss[index] +} diff --git a/utils/slice_test.go b/utils/slice_test.go new file mode 100644 index 00000000..977defcb --- /dev/null +++ b/utils/slice_test.go @@ -0,0 +1,56 @@ +package utils_test + +import ( + "testing" + + "github.com/ditrit/badaas/utils" + "github.com/stretchr/testify/assert" +) + +var test_result_3 = 33.04 +var test_result_4 = 0.11 + +var findFirstTests = []struct { + ss []float64 + expression func(value float64) bool + expected *float64 +}{ + { + nil, + func(value float64) bool { return value == 1.5 }, + nil, + }, + { + []float64{}, + func(value float64) bool { return value == 0.1 }, + nil, + }, + { + []float64{0.0, 1.5, 3.2}, + func(value float64) bool { return value == 9.99 }, + nil, + }, + { + []float64{5.4, 6.98, 4.987, 33.04}, + func(value float64) bool { return value == 33.04 }, + &test_result_3, + }, + { + []float64{9.0, 0.11, 150.44, 33.04}, + func(value float64) bool { return value == 0.11 }, + &test_result_4, + }, +} + +func TestFindFirst(t *testing.T) { + for _, test := range findFirstTests { + t.Run("", func(t *testing.T) { + result := utils.FindFirst(test.ss, test.expression) + if result == nil { + assert.Nil(t, test.expected) + } else { + assert.Equal(t, *test.expected, *result) + } + }) + } +} From 8e072d943f82df4b5ec556ede7e758549779198f Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 17 Apr 2023 11:06:27 +0200 Subject: [PATCH 024/467] add entity and value repository to avoid bug with gorm --- controllers/basicAuth_test.go | 3 +- controllers/eav.go | 3 +- docker/postgresql/docker-compose.yml | 16 +++++ docker/postgresql/init.sql | 1 + docker/test_db/Dockerfile | 15 ----- docker/test_db/docker-compose.yml | 7 +- docker/test_db/init.sh | 17 ++--- docker/test_db/logs.yaml | 11 ++-- persistence/ModuleFx.go | 6 +- persistence/models/Attribute.go | 2 +- persistence/models/BaseModel.go | 3 +- persistence/models/Entity.go | 3 +- persistence/models/Entity_test.go | 3 +- persistence/models/Session.go | 2 +- persistence/models/Tabler.go | 6 +- persistence/models/Value.go | 15 +++-- persistence/repository/CRUDRepositoryImpl.go | 2 +- persistence/repository/EntityRepository.go | 66 +++++++++++++++++++ persistence/repository/ValueRepository.go | 64 ++++++++++++++++++ .../middlewares/middlewareAuthentification.go | 3 +- services/eavservice/eavservice.go | 7 +- services/sessionservice/session.go | 3 +- services/sessionservice/session_test.go | 3 +- services/sessionservice/sessionctx.go | 3 +- services/sessionservice/sessionctx_test.go | 3 +- services/userservice/userservice.go | 3 +- services/userservice/userservice_test.go | 3 +- test_integration/eavservice.go | 64 ++++++++++++++---- test_integration/int_test_config.yml | 10 +-- test_integration/integration_test.go | 1 - test_integration/integration_test_suite.go | 15 ++++- 31 files changed, 284 insertions(+), 79 deletions(-) create mode 100644 docker/postgresql/docker-compose.yml create mode 100644 docker/postgresql/init.sql delete mode 100644 docker/test_db/Dockerfile mode change 100644 => 100755 docker/test_db/init.sh create mode 100644 persistence/repository/EntityRepository.go create mode 100644 persistence/repository/ValueRepository.go diff --git a/controllers/basicAuth_test.go b/controllers/basicAuth_test.go index 2fecf795..eff7568e 100644 --- a/controllers/basicAuth_test.go +++ b/controllers/basicAuth_test.go @@ -5,13 +5,14 @@ import ( "strings" "testing" + uuid "github.com/google/uuid" + "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/httperrors" mocksSessionService "github.com/ditrit/badaas/mocks/services/sessionservice" mocksUserService "github.com/ditrit/badaas/mocks/services/userservice" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" - "github.com/google/uuid" "github.com/stretchr/testify/assert" "go.uber.org/zap" "go.uber.org/zap/zaptest/observer" diff --git a/controllers/eav.go b/controllers/eav.go index 56431395..bd9f1717 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -6,10 +6,11 @@ import ( "fmt" "net/http" + uuid "github.com/google/uuid" + "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/services/eavservice" - "github.com/google/uuid" "github.com/gorilla/mux" "go.uber.org/zap" "gorm.io/gorm" diff --git a/docker/postgresql/docker-compose.yml b/docker/postgresql/docker-compose.yml new file mode 100644 index 00000000..768a1195 --- /dev/null +++ b/docker/postgresql/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3.5' + +services: + postgres: + container_name: postgres_db + image: postgres:latest + environment: + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + POSTGRES_DB: badaas_db + PGDATA: /data/postgres + volumes: + - .:/docker-entrypoint-initdb.d/ + ports: + - "5432:5432" + restart: unless-stopped \ No newline at end of file diff --git a/docker/postgresql/init.sql b/docker/postgresql/init.sql new file mode 100644 index 00000000..982ad984 --- /dev/null +++ b/docker/postgresql/init.sql @@ -0,0 +1 @@ +CREATE EXTENSION "uuid-ossp"; \ No newline at end of file diff --git a/docker/test_db/Dockerfile b/docker/test_db/Dockerfile deleted file mode 100644 index 6f892635..00000000 --- a/docker/test_db/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM cockroachdb/cockroach:latest - -LABEL maintainer="tjveil@gmail.com" - -ADD init.sh /cockroach/ -RUN chmod a+x /cockroach/init.sh - -ADD logs.yaml /cockroach/ - -WORKDIR /cockroach/ - -EXPOSE 8080 -EXPOSE 26257 - -ENTRYPOINT ["/cockroach/init.sh"] \ No newline at end of file diff --git a/docker/test_db/docker-compose.yml b/docker/test_db/docker-compose.yml index 1d0718b4..6c36f7c5 100644 --- a/docker/test_db/docker-compose.yml +++ b/docker/test_db/docker-compose.yml @@ -4,8 +4,11 @@ version: '3.5' services: db: container_name: "badaas-test-db" - build: . - image: badaas-test-db + image: cockroachdb/cockroach:latest + volumes: + - .:/cockroach/files + working_dir: /cockroach + entrypoint: ./files/init.sh ports: - "26257:26257" - "8080:8080" # Web based dashboard diff --git a/docker/test_db/init.sh b/docker/test_db/init.sh old mode 100644 new mode 100755 index 23cc75b5..c02ba317 --- a/docker/test_db/init.sh +++ b/docker/test_db/init.sh @@ -1,35 +1,36 @@ #!/bin/sh + +set -e + echo "******************************* Listing Env Variables..." printenv echo "******************************* Starting single cockroach node..." -./cockroach start-single-node --insecure --log-config-file=logs.yaml --background - +./cockroach start-single-node --insecure --log-config-file=files/logs.yaml --background # echo "******************************* Creating user" # cockroach user set ${COCKROACH_USER} --password 1234 --echo-sql # cockroach user ls echo "******************************* Init database" -echo "******************************* |=> Creating init.sql" -# TODO ERROR: at or near "-": syntax error cat > init.sql < Applying init.sql" ./cockroach sql --insecure --file init.sql echo "******************************* To the moon" -cd /cockroach/cockroach-data/logs -tail -f cockroach.log \ No newline at end of file +# tail logs to make them accesible with docker logs +tail -f cockroach-data/logs/cockroach.log \ No newline at end of file diff --git a/docker/test_db/logs.yaml b/docker/test_db/logs.yaml index 4cdfbb24..3beb51b1 100644 --- a/docker/test_db/logs.yaml +++ b/docker/test_db/logs.yaml @@ -3,7 +3,7 @@ file-defaults: max-group-size: 100MiB file-permissions: 644 buffered-writes: true - filter: WARNING + filter: INFO format: crdb-v2 redact: false redactable: true @@ -11,7 +11,7 @@ file-defaults: auditable: false dir: cockroach-data/logs fluent-defaults: - filter: WARNING + filter: INFO format: json-fluent-compact redact: false redactable: true @@ -22,7 +22,7 @@ http-defaults: unsafe-tls: false timeout: 0s disable-keep-alives: false - filter: WARNING + filter: INFO format: json-compact redact: false redactable: true @@ -32,7 +32,8 @@ sinks: file-groups: default: channels: - WARNING: all + INFO: [DEV, OPS] + WARNING: all except [DEV, OPS] health: channels: [HEALTH] pebble: @@ -48,6 +49,8 @@ sinks: auditable: true sql-exec: channels: [SQL_EXEC] + sql-schema: + channels: [SQL_SCHEMA] sql-slow: channels: [SQL_PERF] sql-slow-internal-only: diff --git a/persistence/ModuleFx.go b/persistence/ModuleFx.go index a371bf7f..a480f4a1 100644 --- a/persistence/ModuleFx.go +++ b/persistence/ModuleFx.go @@ -1,10 +1,11 @@ package persistence import ( + uuid "github.com/google/uuid" + "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" - "github.com/google/uuid" "go.uber.org/fx" ) @@ -23,4 +24,7 @@ var PersistanceModule = fx.Module( // repositories fx.Provide(repository.NewCRUDRepository[models.Session, uuid.UUID]), fx.Provide(repository.NewCRUDRepository[models.User, uuid.UUID]), + + fx.Provide(repository.NewValueRepository), + fx.Provide(repository.NewEntityRepository), ) diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index 6dbc135f..d9c4b49a 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" - "github.com/google/uuid" + uuid "github.com/google/uuid" ) // Describe the type of an attribute diff --git a/persistence/models/BaseModel.go b/persistence/models/BaseModel.go index 9cfa2aae..7b758815 100644 --- a/persistence/models/BaseModel.go +++ b/persistence/models/BaseModel.go @@ -3,7 +3,8 @@ package models import ( "time" - "github.com/google/uuid" + uuid "github.com/google/uuid" + "gorm.io/gorm" ) diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 46243958..483262f9 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -4,8 +4,9 @@ import ( "encoding/json" "fmt" + uuid "github.com/google/uuid" + "github.com/ditrit/badaas/utils" - "github.com/google/uuid" ) // Describe an instance of an EntityType diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go index 941f7ad6..019bdd6b 100644 --- a/persistence/models/Entity_test.go +++ b/persistence/models/Entity_test.go @@ -3,7 +3,8 @@ package models import ( "testing" - "github.com/google/uuid" + uuid "github.com/google/uuid" + "github.com/stretchr/testify/assert" ) diff --git a/persistence/models/Session.go b/persistence/models/Session.go index 89bdb1b7..b5f591aa 100644 --- a/persistence/models/Session.go +++ b/persistence/models/Session.go @@ -3,7 +3,7 @@ package models import ( "time" - "github.com/google/uuid" + uuid "github.com/google/uuid" ) // Represent a user session diff --git a/persistence/models/Tabler.go b/persistence/models/Tabler.go index f8b5f468..6dfe07fd 100644 --- a/persistence/models/Tabler.go +++ b/persistence/models/Tabler.go @@ -1,12 +1,12 @@ package models var ListOfTables = []any{ - Session{}, User{}, - Value{}, + Session{}, + EntityType{}, Entity{}, + Value{}, Attribute{}, - EntityType{}, } // The interface "type" need to implement to be considered models diff --git a/persistence/models/Value.go b/persistence/models/Value.go index bc0daeb2..bc5756b4 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -5,7 +5,8 @@ import ( "errors" "fmt" - "github.com/google/uuid" + uuid "github.com/google/uuid" + "gorm.io/gorm" ) @@ -36,7 +37,7 @@ func NewNullValue(attr *Attribute) (*Value, error) { return nil, fmt.Errorf("can't create new null value for a required attribute") } - return &Value{IsNull: true, Attribute: attr}, nil + return &Value{IsNull: true, Attribute: attr, AttributeID: attr.ID}, nil } // Create a new int value @@ -45,7 +46,7 @@ func NewIntValue(attr *Attribute, i int) (*Value, error) { return nil, fmt.Errorf("can't create a new int value with a %s attribute", attr.ValueType) } - return &Value{IntVal: i, Attribute: attr}, nil + return &Value{IntVal: i, Attribute: attr, AttributeID: attr.ID}, nil } // Create a new bool value @@ -54,7 +55,7 @@ func NewBoolValue(attr *Attribute, b bool) (*Value, error) { return nil, fmt.Errorf("can't create a new bool value with a %s attribute", attr.ValueType) } - return &Value{BoolVal: b, Attribute: attr}, nil + return &Value{BoolVal: b, Attribute: attr, AttributeID: attr.ID}, nil } // Create a new float value @@ -63,7 +64,7 @@ func NewFloatValue(attr *Attribute, f float64) (*Value, error) { return nil, fmt.Errorf("can't create a new float value with a %s attribute", attr.ValueType) } - return &Value{FloatVal: f, Attribute: attr}, nil + return &Value{FloatVal: f, Attribute: attr, AttributeID: attr.ID}, nil } // Create a new string value @@ -72,7 +73,7 @@ func NewStringValue(attr *Attribute, s string) (*Value, error) { return nil, fmt.Errorf("can't create a new string value with a %s attribute", attr.ValueType) } - return &Value{StringVal: s, Attribute: attr}, nil + return &Value{StringVal: s, Attribute: attr, AttributeID: attr.ID}, nil } // Create a new relation value. @@ -100,7 +101,7 @@ func NewRelationIDValue(attr *Attribute, uuidVal uuid.UUID) (*Value, error) { return nil, fmt.Errorf("can't create a new relation value with a %s attribute", attr.ValueType) } - return &Value{RelationVal: uuidVal, Attribute: attr}, nil + return &Value{RelationVal: uuidVal, Attribute: attr, AttributeID: attr.ID}, nil } // Check if the Value is whole. eg, no fields are nil diff --git a/persistence/repository/CRUDRepositoryImpl.go b/persistence/repository/CRUDRepositoryImpl.go index eca2365f..a0586ec9 100644 --- a/persistence/repository/CRUDRepositoryImpl.go +++ b/persistence/repository/CRUDRepositoryImpl.go @@ -32,7 +32,7 @@ type CRUDRepositoryImpl[T models.Tabler, ID any] struct { paginationConfiguration configuration.PaginationConfiguration } -// Contructor of the Generic CRUD Repository +// Constructor of the Generic CRUD Repository func NewCRUDRepository[T models.Tabler, ID any]( database *gorm.DB, logger *zap.Logger, diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go new file mode 100644 index 00000000..36766704 --- /dev/null +++ b/persistence/repository/EntityRepository.go @@ -0,0 +1,66 @@ +package repository + +import ( + "time" + + sq "github.com/Masterminds/squirrel" + "github.com/ditrit/badaas/persistence/models" + "github.com/elliotchance/pie/v2" + "github.com/google/uuid" + "go.uber.org/zap" + "gorm.io/gorm" +) + +type EntityRepository struct { + logger *zap.Logger + db *gorm.DB + valueRepository *ValueRepository +} + +func NewEntityRepository( + logger *zap.Logger, + db *gorm.DB, + valueRepository *ValueRepository, +) *EntityRepository { + return &EntityRepository{ + logger: logger, + db: db, + valueRepository: valueRepository, + } +} + +func (r *EntityRepository) Save(entity *models.Entity) error { + return r.db.Transaction(func(tx *gorm.DB) error { + now := time.Now() + + query, values, err := sq.Insert("entities"). + Columns("created_at", "updated_at", "entity_type_id"). + Values(now, now, entity.EntityType.ID). + Suffix("RETURNING \"id\""). + PlaceholderFormat(sq.Dollar).ToSql() + + if err != nil { + return err + } + + var result string + err = tx.Raw(query, values...).Scan(&result).Error + if err != nil { + return err + } + + uuid, err := uuid.Parse(result) + if err != nil { + return err + } + + pie.Each(entity.Fields, func(value *models.Value) { + value.EntityID = uuid + }) + + r.valueRepository.Save(tx, entity.Fields) + + entity.ID = uuid + return nil + }) +} diff --git a/persistence/repository/ValueRepository.go b/persistence/repository/ValueRepository.go new file mode 100644 index 00000000..dd8105af --- /dev/null +++ b/persistence/repository/ValueRepository.go @@ -0,0 +1,64 @@ +package repository + +import ( + "time" + + sq "github.com/Masterminds/squirrel" + "github.com/ditrit/badaas/persistence/models" + "github.com/google/uuid" + "go.uber.org/zap" + "gorm.io/gorm" +) + +type ValueRepository struct { + logger *zap.Logger + db *gorm.DB +} + +func NewValueRepository( + logger *zap.Logger, + db *gorm.DB, +) *ValueRepository { + return &ValueRepository{ + logger: logger, + db: db, + } +} + +func (r *ValueRepository) Save(tx *gorm.DB, values []*models.Value) error { + now := time.Now() + + query := sq.Insert("values"). + Columns("created_at", "updated_at", "is_null", "string_val", "float_val", "int_val", + "bool_val", "relation_val", "entity_id", "attribute_id") + + for _, value := range values { + query = query.Values(now, now, value.IsNull, value.StringVal, + value.FloatVal, value.IntVal, value.BoolVal, + value.RelationVal, value.EntityID, value.Attribute.ID) + } + + queryString, queryValues, err := query.Suffix("RETURNING \"id\""). + PlaceholderFormat(sq.Dollar). + ToSql() + if err != nil { + return err + } + + var results []string + err = tx.Raw(queryString, queryValues...).Scan(&results).Error + if err != nil { + return err + } + + for i, result := range results { + uuid, err := uuid.Parse(result) + if err != nil { + return err + } + + values[i].ID = uuid + } + + return nil +} diff --git a/router/middlewares/middlewareAuthentification.go b/router/middlewares/middlewareAuthentification.go index aaf8d4b1..f0e94c1b 100644 --- a/router/middlewares/middlewareAuthentification.go +++ b/router/middlewares/middlewareAuthentification.go @@ -3,9 +3,10 @@ package middlewares import ( "net/http" + uuid "github.com/google/uuid" + "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/services/sessionservice" - "github.com/google/uuid" "go.uber.org/zap" ) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 2900d610..3e99a3a0 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -4,9 +4,10 @@ import ( "errors" "fmt" + uuid "github.com/google/uuid" + "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/utils" - "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" ) @@ -86,7 +87,6 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, // multiple joins version // TODO filter by null // TODO relations - // TODO deleted_at query := eavService.db.Select("entities.*") @@ -118,7 +118,7 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, AND values.%s = ?`, valToUse, ), - attr.Name, valToUse, v, + attr.Name, v, ) } } @@ -153,7 +153,6 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, // ett.ID, // ).Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").Find(&entities) - // // TODO ultra ineficiente, se traen todas las entidades de ese tipo y se hace la query a mano // resultSet := make([]*models.Entity, 0, len(entities)) // var keep bool // for _, et := range entities { diff --git a/services/sessionservice/session.go b/services/sessionservice/session.go index d4368319..62852f68 100644 --- a/services/sessionservice/session.go +++ b/services/sessionservice/session.go @@ -6,12 +6,13 @@ import ( "sync" "time" + uuid "github.com/google/uuid" + "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" - "github.com/google/uuid" "go.uber.org/zap" ) diff --git a/services/sessionservice/session_test.go b/services/sessionservice/session_test.go index 422b831f..cb928aeb 100644 --- a/services/sessionservice/session_test.go +++ b/services/sessionservice/session_test.go @@ -5,13 +5,14 @@ import ( "testing" "time" + uuid "github.com/google/uuid" + "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/httperrors" configurationmocks "github.com/ditrit/badaas/mocks/configuration" repositorymocks "github.com/ditrit/badaas/mocks/persistence/repository" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/pagination" - "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/services/sessionservice/sessionctx.go b/services/sessionservice/sessionctx.go index 6710766a..df363ba8 100644 --- a/services/sessionservice/sessionctx.go +++ b/services/sessionservice/sessionctx.go @@ -3,8 +3,9 @@ package sessionservice import ( "context" + uuid "github.com/google/uuid" + "github.com/ditrit/badaas/persistence/models" - "github.com/google/uuid" ) // The session claims passed in the request context diff --git a/services/sessionservice/sessionctx_test.go b/services/sessionservice/sessionctx_test.go index 88b3f954..3ffbfc3b 100644 --- a/services/sessionservice/sessionctx_test.go +++ b/services/sessionservice/sessionctx_test.go @@ -4,7 +4,8 @@ import ( "context" "testing" - "github.com/google/uuid" + uuid "github.com/google/uuid" + "github.com/stretchr/testify/assert" ) diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index 3f3da399..75546dec 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -3,6 +3,8 @@ package userservice import ( "fmt" + uuid "github.com/google/uuid" + "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" @@ -10,7 +12,6 @@ import ( "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/auth/protocols/basicauth" validator "github.com/ditrit/badaas/validators" - "github.com/google/uuid" "go.uber.org/zap" ) diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index df435ed8..81831c13 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -3,13 +3,14 @@ package userservice_test import ( "testing" + uuid "github.com/google/uuid" + "github.com/ditrit/badaas/httperrors" repositorymocks "github.com/ditrit/badaas/mocks/persistence/repository" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" "github.com/ditrit/badaas/persistence/pagination" "github.com/ditrit/badaas/services/userservice" - "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 99cb3241..baf3a630 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -4,24 +4,28 @@ import ( "log" "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/eavservice" ) type EAVServiceIntTestSuite struct { IntegrationTestSuite - eavService eavservice.EAVService - profileType *models.EntityType - displayNameAttr *models.Attribute - descriptionAttr *models.Attribute + eavService eavservice.EAVService + entityRepository *repository.EntityRepository + profileType *models.EntityType + displayNameAttr *models.Attribute + descriptionAttr *models.Attribute } func NewEAVServiceIntTestSuite( ts *IntegrationTestSuite, eavService eavservice.EAVService, + entityRepository *repository.EntityRepository, ) *EAVServiceIntTestSuite { return &EAVServiceIntTestSuite{ IntegrationTestSuite: *ts, eavService: eavService, + entityRepository: entityRepository, } } @@ -50,12 +54,24 @@ func (ts *EAVServiceIntTestSuite) SetupTest() { ts.descriptionAttr, ) - // err := ts.db.Create(ts.profileType).Error - // if err != nil { - // ts.Fail("Unable to create entity type: ", err) - // } + log.Println(ts.displayNameAttr.Name) + log.Println(ts.displayNameAttr.ID) + log.Println(ts.descriptionAttr.Name) + log.Println(ts.descriptionAttr.ID) + + err := ts.db.Create(&ts.profileType).Error + if err != nil { + ts.Fail("Unable to create entity type: ", err) + } + log.Println(ts.profileType.ID) + for _, attr := range ts.profileType.Attributes { + log.Println(attr.Name) + log.Println(attr.ID) + } + log.Println(ts.displayNameAttr.Name) log.Println(ts.displayNameAttr.ID) + log.Println(ts.descriptionAttr.Name) log.Println(ts.descriptionAttr.ID) } @@ -117,6 +133,19 @@ func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsOneIfOnlyOneMatch() { ts.equalEntityList([]*models.Entity{matchProfile}, entities) } +func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsMultipleIfMultipleMatch() { + match1 := ts.createProfile(ts.profileType, "match") + match2 := ts.createProfile(ts.profileType, "match") + ts.createProfile(ts.profileType, "something_else") + + params := map[string]string{ + "displayName": "match", + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + ts.equalEntityList([]*models.Entity{match1, match2}, entities) +} + // TODO verificar cuando el atributo nisiquiera existe // TODO verificar con otros tipos de atributos // TODO verificar cuando hay otros entityTypes @@ -128,16 +157,29 @@ func (ts *EAVServiceIntTestSuite) createProfile(entityType *models.EntityType, d } displayNameVal, _ := models.NewStringValue(ts.displayNameAttr, displayName) - // descriptionVal, _ := models.NewNullValue(ts.descriptionAttr) + descriptionVal, _ := models.NewStringValue(ts.descriptionAttr, "something in description") + entity.Fields = append(entity.Fields, displayNameVal, - // descriptionVal, + descriptionVal, ) - err := ts.db.Create(entity).Error + log.Println("Before create") + log.Println(displayNameVal.Attribute.Name) + log.Println(displayNameVal.AttributeID) + log.Println(descriptionVal.Attribute.Name) + log.Println(descriptionVal.AttributeID) + + err := ts.entityRepository.Save(entity) if err != nil { ts.Fail("Unable to create entity: ", err) } + log.Println("After create") + for _, field := range entity.Fields { + log.Println(field.Attribute.Name) + log.Println(field.AttributeID) + } + return entity } diff --git a/test_integration/int_test_config.yml b/test_integration/int_test_config.yml index 8e0754df..8336400d 100644 --- a/test_integration/int_test_config.yml +++ b/test_integration/int_test_config.yml @@ -1,8 +1,10 @@ database: host: localhost - port: 26257 + port: 26257 # cockroach + # port: 5432 # postgree sslmode: disable - username: root + username: root # cockroach + # username: postgres # postgree password: postgres name: badaas_db init: @@ -10,6 +12,4 @@ database: retryTime: 5 logger: - mode: dev - request: - template: "Receive {{method}} request on {{url}}" \ No newline at end of file + mode: dev \ No newline at end of file diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index a9223b7a..22b3b8f0 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -62,7 +62,6 @@ func injectDependencies(cmd *cobra.Command, args []string) { fx.Provide(NewIntegrationTestSuite), fx.Provide(NewEAVServiceIntTestSuite), - // fx.Invoke(commands.PopulateDatabase), fx.Invoke(runTestSuites), ).Run() } diff --git a/test_integration/integration_test_suite.go b/test_integration/integration_test_suite.go index 26825b38..d770be6f 100644 --- a/test_integration/integration_test_suite.go +++ b/test_integration/integration_test_suite.go @@ -29,9 +29,18 @@ func NewIntegrationTestSuite( } } +var ListOfTables = []any{ + models.Session{}, + models.User{}, + models.Value{}, + models.Entity{}, + models.Attribute{}, + models.EntityType{}, +} + func (ts *IntegrationTestSuite) SetupTest() { // clean database to ensure independency between tests - for _, table := range models.ListOfTables { + for _, table := range ListOfTables { err := ts.db.Unscoped().Where("1 = 1").Delete(table).Error if err != nil { log.Fatalln("could not clean database: ", err) @@ -62,11 +71,11 @@ func (ts *IntegrationTestSuite) equalEntityList(expected, actual []*models.Entit ts.Len(actual, len(expected)) sort.SliceStable(expected, func(i, j int) bool { - return expected[i].ID.ID() < expected[j].ID.ID() + return expected[i].ID.String() < expected[j].ID.String() }) sort.SliceStable(actual, func(i, j int) bool { - return actual[i].ID.ID() < actual[j].ID.ID() + return actual[i].ID.String() < actual[j].ID.String() }) for i := range actual { From 3c6ff0296c62154f6652f45c8f91906ba4ad1f90 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 17 Apr 2023 11:37:23 +0200 Subject: [PATCH 025/467] use entityrepository in eav service to avoid gorm bug in create entity --- services/eavservice/eavservice.go | 14 +++--- test_integration/eavservice.go | 72 +++++++++++++++++++++++++++---- 2 files changed, 72 insertions(+), 14 deletions(-) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 3e99a3a0..61e7ffdf 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -7,6 +7,7 @@ import ( uuid "github.com/google/uuid" "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/utils" "go.uber.org/zap" "gorm.io/gorm" @@ -28,17 +29,20 @@ type EAVService interface { } type eavServiceImpl struct { - logger *zap.Logger - db *gorm.DB + logger *zap.Logger + db *gorm.DB + entityRepository *repository.EntityRepository } func NewEAVService( logger *zap.Logger, db *gorm.DB, + entityRepository *repository.EntityRepository, ) EAVService { return &eavServiceImpl{ - logger: logger, - db: db, + logger: logger, + db: db, + entityRepository: entityRepository, } } @@ -317,7 +321,7 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map } et.EntityType = ett - return &et, eavService.db.Create(&et).Error + return &et, eavService.entityRepository.Save(&et) } func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[string]interface{}) error { diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index baf3a630..0bcfd883 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -1,6 +1,7 @@ package integration_test import ( + "fmt" "log" "github.com/ditrit/badaas/persistence/models" @@ -54,21 +55,12 @@ func (ts *EAVServiceIntTestSuite) SetupTest() { ts.descriptionAttr, ) - log.Println(ts.displayNameAttr.Name) - log.Println(ts.displayNameAttr.ID) - log.Println(ts.descriptionAttr.Name) - log.Println(ts.descriptionAttr.ID) - err := ts.db.Create(&ts.profileType).Error if err != nil { ts.Fail("Unable to create entity type: ", err) } log.Println(ts.profileType.ID) - for _, attr := range ts.profileType.Attributes { - log.Println(attr.Name) - log.Println(attr.ID) - } log.Println(ts.displayNameAttr.Name) log.Println(ts.displayNameAttr.ID) log.Println(ts.descriptionAttr.Name) @@ -150,6 +142,68 @@ func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsMultipleIfMultipleMatch() // TODO verificar con otros tipos de atributos // TODO verificar cuando hay otros entityTypes +// ------------------------- CreateEntity -------------------------------- + +func (ts *EAVServiceIntTestSuite) TestCreateMultipleEntitiesDoesNotGenerateGormBug() { + initialDisplayNameID := ts.displayNameAttr.ID + initialDescriptionID := ts.descriptionAttr.ID + + for i := 0; i < 10; i++ { + params := map[string]any{ + "displayName": fmt.Sprintf("displayName%d", i), + "description": fmt.Sprintf("description%d", i), + } + entity, err := ts.eavService.CreateEntity(ts.profileType, params) + ts.Nil(err) + + for _, value := range entity.Fields { + if value.Attribute.Name == "displayName" { + ts.Equal(initialDisplayNameID, value.AttributeID) + } else { + ts.Equal(initialDescriptionID, value.AttributeID) + } + } + } +} + +// ------------------------- UpdateEntity -------------------------------- + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGormBug() { + initialDisplayNameID := ts.displayNameAttr.ID + initialDescriptionID := ts.descriptionAttr.ID + + params := map[string]any{ + "displayName": "displayName", + "description": "description", + } + entity, err := ts.eavService.CreateEntity(ts.profileType, params) + ts.Nil(err) + + params2 := map[string]any{ + "displayName": "other", + "description": "other", + } + _, err = ts.eavService.CreateEntity(ts.profileType, params2) + ts.Nil(err) + + for i := 0; i < 10; i++ { + params := map[string]any{ + "displayName": fmt.Sprintf("displayName%d", i), + "description": fmt.Sprintf("description%d", i), + } + err := ts.eavService.UpdateEntity(entity, params) + ts.Nil(err) + + for _, value := range entity.Fields { + if value.Attribute.Name == "displayName" { + ts.Equal(initialDisplayNameID, value.AttributeID) + } else { + ts.Equal(initialDescriptionID, value.AttributeID) + } + } + } +} + func (ts *EAVServiceIntTestSuite) createProfile(entityType *models.EntityType, displayName string) *models.Entity { entity := &models.Entity{ EntityTypeID: entityType.ID, From c1683412bd77733e85694ad3e699af7622697f2d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 17 Apr 2023 15:29:52 +0200 Subject: [PATCH 026/467] add tests for other types --- persistence/models/Attribute.go | 13 +++ persistence/models/Entity.go | 2 +- services/eavservice/eavservice.go | 6 +- test_integration/eavservice.go | 181 ++++++++++++++++++++++++++++-- 4 files changed, 189 insertions(+), 13 deletions(-) diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index d9c4b49a..c8ff786c 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -43,6 +43,19 @@ type Attribute struct { var ErrNoDefaultValueSet = errors.New("no default value found") +func NewRelationAttribute(entityType *EntityType, name string, + unique bool, required bool, + relationTargetEntityType *EntityType) *Attribute { + return &Attribute{ + EntityTypeID: entityType.ID, + Name: name, + ValueType: RelationValueType, + Required: required, + Unique: unique, + RelationTargetEntityTypeID: relationTargetEntityType.ID, + } +} + // Get a new value with the default value associated with the attribute func (a *Attribute) GetNewDefaultValue() (*Value, error) { if !a.Default { diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 483262f9..d1fbedfc 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -90,5 +90,5 @@ func (Entity) TableName() string { func (e Entity) Equal(other Entity) bool { return e.ID == other.ID && - e.EntityTypeID == other.EntityTypeID + e.EntityType.ID == other.EntityType.ID } diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 61e7ffdf..7440f7ab 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -90,7 +90,7 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, // multiple joins version // TODO filter by null - // TODO relations + // TODO relations join query := eavService.db.Select("entities.*") @@ -109,6 +109,8 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, valToUse = "float_val" case models.BooleanValueType: valToUse = "bool_val" + case models.RelationValueType: + valToUse = "relation_val" } query = query.Joins( @@ -222,6 +224,7 @@ func (eavService *eavServiceImpl) DeleteEntity(et *models.Entity) error { } return eavService.db.Delete(et).Error } + func (eavService *eavServiceImpl) GetEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, error) { var et models.Entity err := eavService.db.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").First(&et, id).Error @@ -321,6 +324,7 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map } et.EntityType = ett + et.EntityTypeID = ett.ID return &et, eavService.entityRepository.Save(&et) } diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 0bcfd883..699aa640 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -33,7 +33,6 @@ func NewEAVServiceIntTestSuite( func (ts *EAVServiceIntTestSuite) SetupTest() { ts.IntegrationTestSuite.SetupTest() - // TODO duplicated code // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES ts.profileType = &models.EntityType{ Name: "profile", @@ -42,7 +41,7 @@ func (ts *EAVServiceIntTestSuite) SetupTest() { EntityTypeID: ts.profileType.ID, Name: "displayName", ValueType: models.StringValueType, - Required: true, + Required: false, } ts.descriptionAttr = &models.Attribute{ EntityTypeID: ts.profileType.ID, @@ -56,9 +55,7 @@ func (ts *EAVServiceIntTestSuite) SetupTest() { ) err := ts.db.Create(&ts.profileType).Error - if err != nil { - ts.Fail("Unable to create entity type: ", err) - } + ts.Nil(err) log.Println(ts.profileType.ID) log.Println(ts.displayNameAttr.Name) @@ -138,9 +135,173 @@ func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsMultipleIfMultipleMatch() ts.equalEntityList([]*models.Entity{match1, match2}, entities) } -// TODO verificar cuando el atributo nisiquiera existe -// TODO verificar con otros tipos de atributos -// TODO verificar cuando hay otros entityTypes +func (ts *EAVServiceIntTestSuite) TestWithParamThatDoesNotExistReturnsAllEntities() { + match1 := ts.createProfile(ts.profileType, "match") + match2 := ts.createProfile(ts.profileType, "match") + match3 := ts.createProfile(ts.profileType, "match") + + params := map[string]string{ + "not_exists": "not_exists", + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + ts.equalEntityList([]*models.Entity{match1, match2, match3}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestWithParamOfIntType() { + intAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "int", + ValueType: models.IntValueType, + Required: false, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + intAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + if err != nil { + ts.Fail("Unable to create entity type: ", err) + } + + match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "match", + "int": 1, + }) + ts.Nil(err) + + _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "not_match", + "int": 2, + }) + ts.Nil(err) + + params := map[string]string{ + "int": "1", + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + ts.equalEntityList([]*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestWithParamOfFloatType() { + floatAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "float", + ValueType: models.FloatValueType, + Required: false, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + floatAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + if err != nil { + ts.Fail("Unable to create entity type: ", err) + } + + match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "match", + "float": 1.1, + }) + ts.Nil(err) + + _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "not_match", + "float": 2.0, + }) + ts.Nil(err) + + params := map[string]string{ + "float": "1.1", + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + ts.equalEntityList([]*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestWithParamOfBoolType() { + boolAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "bool", + ValueType: models.BooleanValueType, + Required: false, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + boolAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "match", + "bool": true, + }) + ts.Nil(err) + + _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "not_match", + "bool": false, + }) + ts.Nil(err) + + params := map[string]string{ + "bool": "true", + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + ts.equalEntityList([]*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestWithParamOfRelationType() { + otherEntityType := &models.EntityType{ + Name: "other", + } + + err := ts.db.Create(otherEntityType).Error + ts.Nil(err) + + otherEntity1, err := ts.eavService.CreateEntity(otherEntityType, map[string]any{}) + ts.Nil(err) + + otherEntity2, err := ts.eavService.CreateEntity(otherEntityType, map[string]any{}) + ts.Nil(err) + + relationAttr := models.NewRelationAttribute( + ts.profileType, "relation", + false, false, otherEntityType, + ) + + ts.profileType.Attributes = append(ts.profileType.Attributes, + relationAttr, + ) + + err = ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "match", + "relation": otherEntity1.ID.String(), + }) + ts.Nil(err) + + _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "not_match", + "relation": otherEntity2.ID.String(), + }) + ts.Nil(err) + + params := map[string]string{ + "relation": otherEntity1.ID.String(), + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + ts.equalEntityList([]*models.Entity{match}, entities) +} // ------------------------- CreateEntity -------------------------------- @@ -225,9 +386,7 @@ func (ts *EAVServiceIntTestSuite) createProfile(entityType *models.EntityType, d log.Println(descriptionVal.AttributeID) err := ts.entityRepository.Save(entity) - if err != nil { - ts.Fail("Unable to create entity: ", err) - } + ts.Nil(err) log.Println("After create") for _, field := range entity.Fields { From 68576e82002eaf08c3c74c5b19a4e93bd4896456 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 17 Apr 2023 15:40:12 +0200 Subject: [PATCH 027/467] add test of params types --- services/eavservice/eavservice.go | 1 - test_integration/eavservice.go | 43 ++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 7440f7ab..0c568dce 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -99,7 +99,6 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, if present { var valToUse string - // TODO check that v is a valid value for that type to avoid error in db switch attr.ValueType { case models.StringValueType: valToUse = "string_val" diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 699aa640..fa55d86f 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -161,9 +161,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfIntType() { ) err := ts.db.Save(&ts.profileType).Error - if err != nil { - ts.Fail("Unable to create entity type: ", err) - } + ts.Nil(err) match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ "displayName": "match", @@ -185,6 +183,41 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfIntType() { ts.equalEntityList([]*models.Entity{match}, entities) } +func (ts *EAVServiceIntTestSuite) TestWithParamOfIntTypeThatIsNotAnIntReturnEmpty() { + intAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "int", + ValueType: models.IntValueType, + Required: false, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + intAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "match", + "int": 1, + }) + ts.Nil(err) + + _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "not_match", + "int": 2, + }) + ts.Nil(err) + + params := map[string]string{ + "int": "not_an_int", + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + ts.equalEntityList([]*models.Entity{}, entities) +} + func (ts *EAVServiceIntTestSuite) TestWithParamOfFloatType() { floatAttr := &models.Attribute{ EntityTypeID: ts.profileType.ID, @@ -198,9 +231,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfFloatType() { ) err := ts.db.Save(&ts.profileType).Error - if err != nil { - ts.Fail("Unable to create entity type: ", err) - } + ts.Nil(err) match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ "displayName": "match", From 4ca1e28cf8fab08729fb8fbf493a6a7e3158c461 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 17 Apr 2023 15:50:27 +0200 Subject: [PATCH 028/467] fix copy of lock --- test_integration/eavservice.go | 45 +++++++++++++--------- test_integration/integration_test.go | 1 - test_integration/integration_test_suite.go | 32 ++++----------- 3 files changed, 34 insertions(+), 44 deletions(-) diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index fa55d86f..390c5121 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -7,10 +7,15 @@ import ( "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/eavservice" + "github.com/stretchr/testify/suite" + "go.uber.org/zap" + "gorm.io/gorm" ) type EAVServiceIntTestSuite struct { - IntegrationTestSuite + suite.Suite + logger *zap.Logger + db *gorm.DB eavService eavservice.EAVService entityRepository *repository.EntityRepository profileType *models.EntityType @@ -19,19 +24,21 @@ type EAVServiceIntTestSuite struct { } func NewEAVServiceIntTestSuite( - ts *IntegrationTestSuite, + logger *zap.Logger, + db *gorm.DB, eavService eavservice.EAVService, entityRepository *repository.EntityRepository, ) *EAVServiceIntTestSuite { return &EAVServiceIntTestSuite{ - IntegrationTestSuite: *ts, - eavService: eavService, - entityRepository: entityRepository, + logger: logger, + db: db, + eavService: eavService, + entityRepository: entityRepository, } } func (ts *EAVServiceIntTestSuite) SetupTest() { - ts.IntegrationTestSuite.SetupTest() + SetupDB(ts.db) // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES ts.profileType = &models.EntityType{ @@ -69,7 +76,7 @@ func (ts *EAVServiceIntTestSuite) SetupTest() { func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsEmptyIfNotEntitiesCreated() { entities := ts.eavService.GetEntitiesWithParams(ts.profileType, make(map[string]string)) - ts.equalEntityList([]*models.Entity{}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsTheOnlyOneIfOneEntityCreated() { @@ -77,7 +84,7 @@ func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsTheOnlyOneIfOneEntityC entities := ts.eavService.GetEntitiesWithParams(ts.profileType, make(map[string]string)) - ts.equalEntityList([]*models.Entity{profile}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{profile}, entities) } func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsTheListWhenMultipleCreated() { @@ -87,7 +94,7 @@ func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsTheListWhenMultipleCre entities := ts.eavService.GetEntitiesWithParams(ts.profileType, make(map[string]string)) - ts.equalEntityList([]*models.Entity{profile1, profile2, profile3}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{profile1, profile2, profile3}, entities) } func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsEmptyIfNotEntitiesCreated() { @@ -96,7 +103,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsEmptyIfNotEntitiesCreated } entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - ts.equalEntityList([]*models.Entity{}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsEmptyIfNothingMatch() { @@ -107,7 +114,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsEmptyIfNothingMatch() { } entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - ts.equalEntityList([]*models.Entity{}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsOneIfOnlyOneMatch() { @@ -119,7 +126,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsOneIfOnlyOneMatch() { } entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - ts.equalEntityList([]*models.Entity{matchProfile}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{matchProfile}, entities) } func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsMultipleIfMultipleMatch() { @@ -132,7 +139,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsMultipleIfMultipleMatch() } entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - ts.equalEntityList([]*models.Entity{match1, match2}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match1, match2}, entities) } func (ts *EAVServiceIntTestSuite) TestWithParamThatDoesNotExistReturnsAllEntities() { @@ -145,7 +152,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamThatDoesNotExistReturnsAllEntitie } entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - ts.equalEntityList([]*models.Entity{match1, match2, match3}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match1, match2, match3}, entities) } func (ts *EAVServiceIntTestSuite) TestWithParamOfIntType() { @@ -180,7 +187,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfIntType() { } entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - ts.equalEntityList([]*models.Entity{match}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } func (ts *EAVServiceIntTestSuite) TestWithParamOfIntTypeThatIsNotAnIntReturnEmpty() { @@ -215,7 +222,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfIntTypeThatIsNotAnIntReturnEmpt } entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - ts.equalEntityList([]*models.Entity{}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } func (ts *EAVServiceIntTestSuite) TestWithParamOfFloatType() { @@ -250,7 +257,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfFloatType() { } entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - ts.equalEntityList([]*models.Entity{match}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } func (ts *EAVServiceIntTestSuite) TestWithParamOfBoolType() { @@ -285,7 +292,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfBoolType() { } entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - ts.equalEntityList([]*models.Entity{match}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } func (ts *EAVServiceIntTestSuite) TestWithParamOfRelationType() { @@ -331,7 +338,7 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfRelationType() { } entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - ts.equalEntityList([]*models.Entity{match}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } // ------------------------- CreateEntity -------------------------------- diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index 22b3b8f0..008b4a8d 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -59,7 +59,6 @@ func injectDependencies(cmd *cobra.Command, args []string) { return &fxevent.ZapLogger{Logger: logger} }), - fx.Provide(NewIntegrationTestSuite), fx.Provide(NewEAVServiceIntTestSuite), fx.Invoke(runTestSuites), diff --git a/test_integration/integration_test_suite.go b/test_integration/integration_test_suite.go index d770be6f..4de2b29a 100644 --- a/test_integration/integration_test_suite.go +++ b/test_integration/integration_test_suite.go @@ -7,28 +7,11 @@ import ( "github.com/ditrit/badaas/persistence/models" "github.com/stretchr/testify/suite" - "go.uber.org/zap" "gorm.io/gorm" "gotest.tools/assert" is "gotest.tools/assert/cmp" ) -type IntegrationTestSuite struct { - suite.Suite - logger *zap.Logger - db *gorm.DB -} - -func NewIntegrationTestSuite( - logger *zap.Logger, - db *gorm.DB, -) *IntegrationTestSuite { - return &IntegrationTestSuite{ - logger: logger, - db: db, - } -} - var ListOfTables = []any{ models.Session{}, models.User{}, @@ -38,17 +21,17 @@ var ListOfTables = []any{ models.EntityType{}, } -func (ts *IntegrationTestSuite) SetupTest() { +func SetupDB(db *gorm.DB) { // clean database to ensure independency between tests for _, table := range ListOfTables { - err := ts.db.Unscoped().Where("1 = 1").Delete(table).Error + err := db.Unscoped().Where("1 = 1").Delete(table).Error if err != nil { log.Fatalln("could not clean database: ", err) } } } -func (ts *IntegrationTestSuite) equalList(expected, actual any) { +func EqualList(ts *suite.Suite, expected, actual any) { v := reflect.ValueOf(expected) v2 := reflect.ValueOf(actual) @@ -67,7 +50,7 @@ func (ts *IntegrationTestSuite) equalList(expected, actual any) { } } -func (ts *IntegrationTestSuite) equalEntityList(expected, actual []*models.Entity) { +func EqualEntityList(ts *suite.Suite, expected, actual []*models.Entity) { ts.Len(actual, len(expected)) sort.SliceStable(expected, func(i, j int) bool { @@ -79,13 +62,14 @@ func (ts *IntegrationTestSuite) equalEntityList(expected, actual []*models.Entit }) for i := range actual { - ts.equalEntity(expected[i], actual[i]) + EqualEntity(ts, expected[i], actual[i]) } } -func (ts *IntegrationTestSuite) equalEntity(expected, actual *models.Entity) { +func EqualEntity(ts *suite.Suite, expected, actual *models.Entity) { assert.DeepEqual(ts.T(), expected, actual) - ts.equalList( + EqualList( + ts, expected.Fields, actual.Fields, ) From ef4d1fe04c0820ea6e5588752f612a489a3427aa Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 17 Apr 2023 16:19:24 +0200 Subject: [PATCH 029/467] add foreign keys --- persistence/models/Attribute.go | 10 +++++----- persistence/models/Value.go | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index c8ff786c..12a21aa5 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -25,17 +25,17 @@ type Attribute struct { Unique bool Required bool - // there is a default value - Default bool + Default bool // if there is a default value - // Default values + // Default values, only if Default == true DefaultInt int DefaultBool bool DefaultString string DefaultFloat float64 - ValueType ValueTypeT // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" - RelationTargetEntityTypeID uuid.UUID // id of the EntityType to which a RelationValueType points to + ValueType ValueTypeT // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" + // id of the EntityType to which a RelationValueType points to. Only if ValueType == RelationValueType + RelationTargetEntityTypeID uuid.UUID `gorm:"foreignKey:EntityType"` // GORM relations EntityTypeID uuid.UUID diff --git a/persistence/models/Value.go b/persistence/models/Value.go index bc5756b4..7c964a10 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -18,7 +18,7 @@ type Value struct { FloatVal float64 IntVal int BoolVal bool - RelationVal uuid.UUID + RelationVal uuid.UUID `gorm:"foreignKey:Entity"` // GORM relations EntityID uuid.UUID @@ -81,7 +81,7 @@ func NewStringValue(attr *Attribute, s string) (*Value, error) { // If et is of the wrong types, then the function returns an error func NewRelationValue(attr *Attribute, et *Entity) (*Value, error) { if et == nil { - return nil, fmt.Errorf("can't create a new relation with a nill entity pointer") + return nil, fmt.Errorf("can't create a new relation with a nil entity pointer") } if et.EntityType.ID != attr.RelationTargetEntityTypeID { return nil, fmt.Errorf( From f12ebfffb16be015a9716b4eb4422af45d5e3d1e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 17 Apr 2023 16:40:31 +0200 Subject: [PATCH 030/467] add possibility to filter by null --- services/eavservice/eavservice.go | 32 +++++++++++++++---------------- test_integration/eavservice.go | 19 ++++++++++++++++++ 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 0c568dce..42b60c08 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -89,7 +89,6 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, // TODO tambien hacer una version que no usa gorm para evitar las queries multiples hechas para buscar el resto de objetos. // multiple joins version - // TODO filter by null // TODO relations join query := eavService.db.Select("entities.*") @@ -98,18 +97,22 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, v, present := params[attr.Name] if present { var valToUse string - - switch attr.ValueType { - case models.StringValueType: - valToUse = "string_val" - case models.IntValueType: - valToUse = "int_val" - case models.FloatValueType: - valToUse = "float_val" - case models.BooleanValueType: - valToUse = "bool_val" - case models.RelationValueType: - valToUse = "relation_val" + if v != "null" { // TODO should be changed to be able to use nil + switch attr.ValueType { + case models.StringValueType: + valToUse = "string_val" + case models.IntValueType: + valToUse = "int_val" + case models.FloatValueType: + valToUse = "float_val" + case models.BooleanValueType: + valToUse = "bool_val" + case models.RelationValueType: + valToUse = "relation_val" + } + } else { + valToUse = "is_null" + v = "true" } query = query.Joins( @@ -288,7 +291,6 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map if err != nil { return nil, err } - // TODO is this really necessary? case nil: value, err = models.NewNullValue(a) if err != nil { @@ -311,7 +313,6 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map return nil, err } } else { - // TODO is this really necessary? value, err = models.NewNullValue(a) if err != nil { return nil, err @@ -372,7 +373,6 @@ func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[stri if err != nil { return err } - // TODO is this really necessary? case nil: if attribute.Required { return fmt.Errorf("can't set a required variable to null") diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 390c5121..0af623f3 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -341,6 +341,25 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfRelationType() { EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } +func (ts *EAVServiceIntTestSuite) TestWithParamFilterByNull() { + match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": nil, + }) + ts.Nil(err) + + _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "something", + }) + ts.Nil(err) + + params := map[string]string{ + "displayName": "null", + } + entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + // ------------------------- CreateEntity -------------------------------- func (ts *EAVServiceIntTestSuite) TestCreateMultipleEntitiesDoesNotGenerateGormBug() { From 74bc72983bacc63e6705da8cda96ac01016a89f7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 17 Apr 2023 16:53:22 +0200 Subject: [PATCH 031/467] add unique to attribute name --- persistence/models/Attribute.go | 10 +++++----- persistence/models/Value.go | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index 12a21aa5..94fa784c 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -21,9 +21,9 @@ const ( // Describe the attribute of a en EntityType type Attribute struct { BaseModel - Name string - Unique bool - Required bool + Name string `gorm:"uniqueIndex:unique_name_entity_type"` + Unique bool // TODO validate this + Required bool // TODO validate this Default bool // if there is a default value @@ -35,10 +35,10 @@ type Attribute struct { ValueType ValueTypeT // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" // id of the EntityType to which a RelationValueType points to. Only if ValueType == RelationValueType - RelationTargetEntityTypeID uuid.UUID `gorm:"foreignKey:EntityType"` + RelationTargetEntityTypeID uuid.UUID `gorm:"type:uuid;foreignKey:EntityType"` // GORM relations - EntityTypeID uuid.UUID + EntityTypeID uuid.UUID `gorm:"uniqueIndex:unique_name_entity_type"` } var ErrNoDefaultValueSet = errors.New("no default value found") diff --git a/persistence/models/Value.go b/persistence/models/Value.go index 7c964a10..5556ebeb 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -18,7 +18,7 @@ type Value struct { FloatVal float64 IntVal int BoolVal bool - RelationVal uuid.UUID `gorm:"foreignKey:Entity"` + RelationVal uuid.UUID `gorm:"type:uuid;foreignKey:Entity"` // GORM relations EntityID uuid.UUID From aa45f6124a02de94090eb649d965268b440ce51b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 17 Apr 2023 16:53:40 +0200 Subject: [PATCH 032/467] remove query possibilities --- services/eavservice/eavservice.go | 106 +----------------------------- 1 file changed, 1 insertion(+), 105 deletions(-) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 42b60c08..c6de936d 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -59,37 +59,8 @@ func (eavService *eavServiceImpl) GetEntityTypeByName(name string) (*models.Enti } func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity { - var entities []*models.Entity - - // TODO check pivot and cross join - // TODO distinct - // query := eavService.db.Select("entities.id").Joins( - // "JOIN attributes ON attributes.entity_type_id = ?", - // ett.ID, - // ).Joins( - // `JOIN values ON - // values.entity_id = entities.id - // AND values.attribute_id = attributes.id`, - // ) - - // eavService.db.Raw( - // `SELECT entities.* - // FROM entities - // JOIN attributes - // ON attributes.entity_type_id = entities.entity_type_id - // JOIN values ON - // values.entity_id = entities.id AND - // values.attribute_id = attributes.id - // // TODO pivot table - // WHERE - // entities.entity_type_id = ?`, - // ett.ID, - // ).Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").Find(&entities) - // TODO hacer version sin gorm para no tener que hacer todas estas queries al pedo. - // TODO tambien hacer una version que no usa gorm para evitar las queries multiples hechas para buscar el resto de objetos. - - // multiple joins version // TODO relations join + var entities []*models.Entity query := eavService.db.Select("entities.*") @@ -139,81 +110,6 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, query.Find(&entities) return entities - - // version con un solo join - // eavService.db.Joins( - // "JOIN values ON values.entity_id = entities.id", - // ).Joins( - // `JOIN attributes ON - // values.attribute_id = attributes.id - // AND attributes.name IN ?`, - // maps.Keys(params), - // ).Where( - // `entities.entity_type_id = ? - // AND values.value = ?`, - // ett.ID, - // params["no se que poner aca"], - // ).Find(&entities) - - // version all in memory - // eavService.db.Where( - // "entity_type_id = ?", - // ett.ID, - // ).Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").Find(&entities) - - // resultSet := make([]*models.Entity, 0, len(entities)) - // var keep bool - // for _, et := range entities { - // keep = true - // for _, value := range et.Fields { - // for k, v := range params { - // if k == value.Attribute.Name { - // switch value.Attribute.ValueType { - // case models.StringValueType: - // if v != value.StringVal { - // keep = false - // } - // case models.IntValueType: - // intVal, err := strconv.Atoi(v) - // if err != nil { - // break - // } - // if intVal != value.IntVal { - // keep = false - // } - // case models.FloatValueType: - // floatVal, err := strconv.ParseFloat(v, 64) - // if err != nil { - // break - // } - // if floatVal != value.FloatVal { - // keep = false - // } - // case models.RelationValueType: - // uuidVal, err := uuid.Parse(v) - // if err != nil { - // keep = false - // } - // if uuidVal != value.RelationVal { - // keep = false - // } - // case models.BooleanValueType: - // boolVal, err := strconv.ParseBool(v) - // if err != nil { - // break - // } - // if boolVal != value.BoolVal { - // keep = false - // } - // } - // } - // } - // } - // if keep { - // resultSet = append(resultSet, et) - // } - // } - // return resultSet } // Delete an entity From 42acfd08dc27ff233ebf17996a1867fe488493fc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 10:05:20 +0200 Subject: [PATCH 033/467] force creation of fk indexes --- persistence/models/Attribute.go | 2 +- persistence/models/Value.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index 94fa784c..4dcc4096 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -35,7 +35,7 @@ type Attribute struct { ValueType ValueTypeT // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" // id of the EntityType to which a RelationValueType points to. Only if ValueType == RelationValueType - RelationTargetEntityTypeID uuid.UUID `gorm:"type:uuid;foreignKey:EntityType"` + RelationTargetEntityTypeID uuid.UUID `gorm:"type:uuid;foreignKey:EntityType;index:fk_relation_target_entity_type"` // GORM relations EntityTypeID uuid.UUID `gorm:"uniqueIndex:unique_name_entity_type"` diff --git a/persistence/models/Value.go b/persistence/models/Value.go index 5556ebeb..e779411f 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -18,7 +18,7 @@ type Value struct { FloatVal float64 IntVal int BoolVal bool - RelationVal uuid.UUID `gorm:"type:uuid;foreignKey:Entity"` + RelationVal uuid.UUID `gorm:"type:uuid;foreignKey:Entity;index:fk_relation_val_entity"` // GORM relations EntityID uuid.UUID From 4d2dda802ece96316b7fad0d1758c52a82d4c2f4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 14:52:55 +0200 Subject: [PATCH 034/467] make examples easier to use and add doc --- Makefile | 11 +- README.md | 42 ++-- badaas.example.yml | 8 +- commands/initServerCommands.go | 2 + commands/rootCmd.go | 184 +--------------- configuration/HttpServerConfiguration.go | 1 + demo.md | 229 -------------------- docker-compose.yml | 19 -- Dockerfile => docker/api/Dockerfile | 5 +- docker/api/badaas.yml | 7 + docker/api/docker-compose.yml | 28 +++ docker/test_db/docker-compose.yml | 2 +- docker/test_db/init.sh | 4 +- CRUD_birds.http => examples/CRUD_birds.http | 0 CRUD_posts.http => examples/CRUD_posts.http | 1 - examples/README.md | 102 +++++++++ examples/examples.go | 210 ++++++++++++++++++ test.http | 30 --- 18 files changed, 396 insertions(+), 489 deletions(-) delete mode 100644 demo.md delete mode 100644 docker-compose.yml rename Dockerfile => docker/api/Dockerfile (69%) create mode 100644 docker/api/badaas.yml create mode 100644 docker/api/docker-compose.yml rename CRUD_birds.http => examples/CRUD_birds.http (100%) rename CRUD_posts.http => examples/CRUD_posts.http (97%) create mode 100644 examples/README.md create mode 100644 examples/examples.go delete mode 100644 test.http diff --git a/Makefile b/Makefile index 3a270622..ca0845a0 100644 --- a/Makefile +++ b/Makefile @@ -10,5 +10,14 @@ test_e2e: ./docker/wait_for_api.sh 8000/info go test -tags=e2e ./test_e2e -v -.PHONY: test_unit test_integration test_e2e +example_birds: + EXAMPLE=birds docker compose -f "docker/api/docker-compose.yml" up + +example_posts: + EXAMPLE=posts docker compose -f "docker/api/docker-compose.yml" up + +badaas: + docker compose -f "docker/api/docker-compose.yml" up + +.PHONY: test_unit test_integration test_e2e example_birds example_posts badaas diff --git a/README.md b/README.md index 15ade58d..6727eee7 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,42 @@ # BADAAS: Backend And Distribution As A Service -Badaas enables the effortless construction of ***distributed, resilient, highly available and secure applications by design***, while ensuring very simple deployment and management (NoOps). +Badaas enables the effortless construction of ***distributed, resilient, highly available and secure applications by design***, while ensuring very simple deployment and management (NoOps). Badaas provides several key features: -- **Authentification**: Badaas can authentify users using its internal authentification scheme or externally by using protocols such as OIDC, SAML, Oauth2... -- **Habilitation**: On a resource access, Badaas will check if the user is authorized using a RBAC model. +- **Authentication**: Badaas can authenticate users using its internal authentication scheme or externally by using protocols such as OIDC, SAML, Oauth2... +- **Authorization**: On a resource access, Badaas will check if the user is authorized using a RBAC model. - **Distribution**: Badaas is built to run in clusters by default. Communications between nodes are TLS encrypted using [shoset](https://github.com/ditrit/shoset). - **Persistence**: Applicative objects are persisted as well as user files. Those resources are shared accross the clusters to increase resiliency. - **Querying Resources**: Resources are accessible via a REST API. - **Posix complient**: Badaas strives towards being a good unix citizen and respecting commonly accepted norms. (see [Configuration](#configuration)) -- **Advanced logs management**: Badaas provides an interface to interact with the logs produced by the clusters. Logs are formated in json by default. +- **Advanced logs management**: Badaas provides an interface to interact with the logs produced by the clusters. Logs are formatted in json by default. To quickly get badaas up and running, please head to the [miniblog tutorial]() -- [Quickstart](#quickstart) -- [Docker install](#docker-install) -- [Install from sources](#install-from-sources) - - [Prerequisites](#prerequisites) - - [Configuration](#configuration) -- [Contributing](#contributing) -- [Licence](#licence) +- [BADAAS: Backend And Distribution As A Service](#badaas-backend-and-distribution-as-a-service) + - [Quickstart](#quickstart) + - [Docker install](#docker-install) + - [Examples](#examples) + - [Build from sources](#build-from-sources) + - [Prerequisites](#prerequisites) + - [Configuration](#configuration) + - [Contributing](#contributing) + - [License](#license) ## Quickstart -You can either use the [Docker Install](#docker-install) or build it from source . +You can either use the [Docker Install](#docker-install) (recommended) or [Build from sources](#build-from-sources). ## Docker install -You can build the image using `docker build -t badaas .` since we don't have an official docker image yet. +You can build the image, run a CockroachDB and the api using `make badaas`. The api will be available at . -## Install from sources +## Examples + +Some example apps are available, visit [Examples](./examples/README.md) for details. + +## Build from sources ### Prerequisites @@ -67,12 +73,12 @@ export BADAAS_DATABASE_PASSWORD= ### Configuration -Badaas use [verdeter](https://github.com/ditrit/verdeter) to manage it's configuration. So Badaas is POSIX complient by default. +Badaas use [verdeter](https://github.com/ditrit/verdeter) to manage it's configuration. So Badaas is POSIX compliant by default. Badaas can be configured using environment variables, configuration files or CLI flags. CLI flags take priority on the environment variables and the environment variables take priority on the content of the configuration file. -As an exemple we will define the `database.port` configuration key using the 3 methods: +As an example we will define the `database.port` configuration key using the 3 methods: - Using a CLI flag: `--database.port=1222` - Using an environment variable: `export BADAAS_DATABASE_PORT=1222` (*dots are replaced by underscores*) @@ -94,6 +100,6 @@ If needed, the location can be overridden using the config key `config_path`. See [this section](./CONTRIBUTING.md). -## Licence +## License -Badaas is Licenced under the [Mozilla Public License Version 2.0](./LICENSE). +Badaas is Licensed under the [Mozilla Public License Version 2.0](./LICENSE). diff --git a/badaas.example.yml b/badaas.example.yml index 44313081..a845cc51 100644 --- a/badaas.example.yml +++ b/badaas.example.yml @@ -51,6 +51,9 @@ server: # default (100) max: 100 + # Example server to exec (birds | posts) + example: "" + # The settings for the logger. logger: # Either `dev` or `prod` @@ -61,7 +64,7 @@ logger: template: "Receive {{method}} request on {{url}}" # The settings for session service -# This section contains some good defaults, don't change thoses value unless you need to. +# This section contains some good defaults, don't change those value unless you need to. session: # The duration of a user session, in seconds # Default (14400) equal to 4 hours @@ -78,5 +81,4 @@ default: # The admin settings for the first run admin: # The admin password for the first run. Won't change is the admin user already exists. - password: admin - \ No newline at end of file + password: admin \ No newline at end of file diff --git a/commands/initServerCommands.go b/commands/initServerCommands.go index 7323524b..ebfe0ef8 100644 --- a/commands/initServerCommands.go +++ b/commands/initServerCommands.go @@ -20,4 +20,6 @@ func initServerCommands(cfg *verdeter.VerdeterCommand) { cfg.GKey(configuration.ServerPaginationMaxElemPerPage, verdeter.IsUint, "", "The max number of records returned per page") cfg.SetDefault(configuration.ServerPaginationMaxElemPerPage, 100) + cfg.GKey(configuration.ServerExampleKey, verdeter.IsStr, "", "Example server to exec (birds | posts)") + cfg.SetDefault(configuration.ServerExampleKey, "") } diff --git a/commands/rootCmd.go b/commands/rootCmd.go index 4cec7369..70dfbb21 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -1,14 +1,13 @@ package commands import ( - "fmt" "net/http" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/controllers" + "github.com/ditrit/badaas/examples" "github.com/ditrit/badaas/logger" "github.com/ditrit/badaas/persistence" - "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/resources" "github.com/ditrit/badaas/router" "github.com/ditrit/badaas/services" @@ -17,7 +16,6 @@ import ( "go.uber.org/fx" "go.uber.org/fx/fxevent" "go.uber.org/zap" - "gorm.io/gorm" ) // Run the http server for badaas @@ -41,7 +39,7 @@ func runHTTPServer(cmd *cobra.Command, args []string) { // Finally: we invoke the newly created server fx.Invoke(func(*http.Server) { /* we need this function to be empty*/ }), fx.Invoke(createSuperUser), - fx.Invoke(PopulateDatabase2), + fx.Invoke(examples.StartExample), ).Run() } @@ -72,181 +70,3 @@ func InitCommands(config *verdeter.VerdeterCommand) { initInitialisationCommands(config) initSessionCommands(config) } - -func PopulateDatabase(db *gorm.DB) error { - //defining - humanType := &models.EntityType{ - Name: "human", - } - nameAttr := &models.Attribute{Name: "name", ValueType: models.StringValueType, Required: true} - humanType.Attributes = append( - humanType.Attributes, nameAttr, - ) - bobName, err := models.NewStringValue(nameAttr, "bob") - if err != nil { - panic(err) - } - bob := &models.Entity{EntityType: humanType} - bob.Fields = append(bob.Fields, bobName) - db.Create(bob) - - jeanName, err := models.NewStringValue(nameAttr, "jean") - if err != nil { - panic(err) - } - jean := &models.Entity{EntityType: humanType} - jean.Fields = append(jean.Fields, jeanName) - - db.Create(jean) - - // Defining a bird - colorAttr := &models.Attribute{Name: "color", ValueType: models.StringValueType, Required: true} - specieAttr := &models.Attribute{Name: "specie", ValueType: models.StringValueType, Required: true} - heightAttr := &models.Attribute{Name: "height", ValueType: models.IntValueType, Default: true, DefaultInt: 12, Required: false} - weightAttr := &models.Attribute{Name: "weight", ValueType: models.FloatValueType, Default: true, DefaultFloat: 12.500, Required: false} - ownerAttr := &models.Attribute{Name: "owner", ValueType: models.RelationValueType, Required: false, RelationTargetEntityTypeID: humanType.ID} - - BirdType := &models.EntityType{ - Name: "bird", - } - BirdType.Attributes = append( - BirdType.Attributes, colorAttr, specieAttr, heightAttr, weightAttr, ownerAttr, - ) - - val1, err := models.NewStringValue(colorAttr, "blue") - if err != nil { - panic(err) - } - val2, err := models.NewStringValue(specieAttr, "chickadee") - if err != nil { - panic(err) - } - val3, err := models.NewIntValue(heightAttr, 8) - if err != nil { - panic(err) - } - val4, err := models.NewNullValue(weightAttr) - if err != nil { - panic(err) - } - - val5, err := models.NewRelationValue(ownerAttr, bob) - if err != nil { - panic(err) - } - - chickadee := &models.Entity{EntityType: BirdType} - chickadee.Fields = append(chickadee.Fields, val1, val2, val3, val4, val5) - - db.Create(chickadee) - fmt.Println("Finished populating the database") - - return nil -} - -func PopulateDatabase2(db *gorm.DB) error { - // GETTING THE USER ADMIN FOR REFERENCE - userID := "wowASuperCoolUserID" - - // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES - profileType := &models.EntityType{ - Name: "profile", - } - displayNameAttr := &models.Attribute{ - EntityTypeID: profileType.ID, - Name: "displayName", - ValueType: models.StringValueType, - Required: true, - } - urlPicAttr := &models.Attribute{ - EntityTypeID: profileType.ID, - Name: "urlPic", - ValueType: models.StringValueType, - Required: false, - Default: true, - DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", //nolint:lll - } - userIDAttr := &models.Attribute{ - EntityTypeID: profileType.ID, - Name: "userId", - ValueType: models.StringValueType, - Required: true, - } - profileType.Attributes = append(profileType.Attributes, - displayNameAttr, - urlPicAttr, - userIDAttr, - ) - - // INSTANTIATION OF A Profile - adminProfile := &models.Entity{ - EntityTypeID: profileType.ID, - EntityType: profileType, - } - displayNameVal, _ := models.NewStringValue(displayNameAttr, "The Super Admin") - userPicVal, _ := models.NewNullValue(urlPicAttr) - userIDVal, _ := models.NewStringValue(userIDAttr, userID) - adminProfile.Fields = append(adminProfile.Fields, - displayNameVal, - userPicVal, - userIDVal, - ) - - // CREATION OF THE POST TYPE AND ASSOCIATED ATTRIBUTES - postType := &models.EntityType{ - Name: "post", - } - titleAttr := &models.Attribute{ - EntityTypeID: postType.ID, - Name: "title", - ValueType: models.StringValueType, - Required: true, - } - bodyAttr := &models.Attribute{ - Name: "body", - ValueType: models.StringValueType, - Default: false, - DefaultString: "empty", - } - ownerAttr := &models.Attribute{ - Name: "ownerID", - ValueType: models.StringValueType, - Required: true, - } - - postType.Attributes = append( - postType.Attributes, titleAttr, bodyAttr, ownerAttr, - ) - // INSTANTIATION OF A POST - whyCatsLikeMice := &models.Entity{ - EntityTypeID: postType.ID, - EntityType: postType, - } - titleVal, _ := models.NewStringValue(titleAttr, "Why cats like mice ?") - bodyVal, _ := models.NewStringValue(bodyAttr, - `Lorem ipsum dolor sit amet, consectetur adipiscing elit. - - In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. - - In erat mi, pharetra ut lacinia at, facilisis vitae nunc. - `) - ownerVal, _ := models.NewStringValue(ownerAttr, userID) - - whyCatsLikeMice.Fields = append(whyCatsLikeMice.Fields, - titleVal, bodyVal, ownerVal, - ) - - err := db.Create(whyCatsLikeMice).Error - if err != nil { - return err - } - - err = db.Create(adminProfile).Error - if err != nil { - return err - } - - fmt.Println("Finished populating the database") - - return nil -} diff --git a/configuration/HttpServerConfiguration.go b/configuration/HttpServerConfiguration.go index 0a00f5f3..ae9384c1 100644 --- a/configuration/HttpServerConfiguration.go +++ b/configuration/HttpServerConfiguration.go @@ -13,6 +13,7 @@ const ( ServerHostKey string = "server.host" ServerPortKey string = "server.port" ServerPaginationMaxElemPerPage string = "server.pagination.page.max" + ServerExampleKey string = "server.example" ) // Hold the configuration values for the http server diff --git a/demo.md b/demo.md deleted file mode 100644 index 10d57618..00000000 --- a/demo.md +++ /dev/null @@ -1,229 +0,0 @@ -# Demoing badaas authentication and object storage - -## Setting up - -First we need to setup the database connection. (Please head to the `configuration.md` page to learn more.) -The minimal configuration for the database looks like this: - -```yml -# The settings for the database. -database: - # The host of the database server. - # (mandatory) - host: - - # The port of the database server. - # (mandatory) - port: - - # The sslmode of the connection to the database server. - # (mandatory) - sslmode: - - # The username of the account on the database server. - # (mandatory) - username: - - # The password of the account on the database server. - # (mandatory) - password: -``` - -Then we need to declare our models for the objects. -As an example we will use some UML to model the objects for this demo. - -```mermaid -classDiagram - class Post{ - title String - body String - ownerID String - } - class Profile { - displayName String - urlPic String - userId String - } -``` - -The users are stored on a classic sql table outside of the object storage engine. -So we will store their IDs as a value. We will use the profile object to store infos about the users. - -For now we need to setup the schema manually using a invoke function that will run at the initialization of the programme. -Make sure that the database you are gonna use is empty. - -```go -func PopulateDatabase2(db *gorm.DB) error { - // GETTING THE USER ADMIN FOR REFERENCE - var admin models.User - err := db.First(&admin, "username = ?", "admin").Error - if err != nil { - return err - } - - // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES - ProfileType := &models.EntityType{ - Name: "profile", - } - displayNameAttr := &models.Attribute{ - EntityTypeID: ProfileType.ID, - Name: "displayName", - ValueType: "string", - Required: true, - } - urlPicAttr := &models.Attribute{ - EntityTypeID: ProfileType.ID, - Name: "urlPic", - ValueType: "string", - Required: false, - Default: true, - DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", - } - userIdAttr := &models.Attribute{ - EntityTypeID: ProfileType.ID, - Name: "userId", - ValueType: "string", - Required: true, - } - ProfileType.Attributes = append(ProfileType.Attributes, - displayNameAttr, - urlPicAttr, - userIdAttr, - ) - - // INSTANTIATION OF A Profile - adminProfile := &models.Entity{ - EntityTypeID: ProfileType.ID, - EntityType: ProfileType, - } - displayNameVal := &models.Value{Attribute: urlPicAttr, StringVal: "The Super Admin"} - userPicVal := &models.Value{Attribute: urlPicAttr, IsNull: true} - userIdVal := &models.Value{Attribute: userIdAttr, StringVal: admin.ID.String()} - adminProfile.Fields = append(adminProfile.Fields, - displayNameVal, - userPicVal, - userIdVal, - ) - - // CREATION OF THE POST TYPE AND ASSOCIATED ATTRIBUTES - PostType := &models.EntityType{ - Name: "post", - } - titleAttr := &models.Attribute{ - EntityTypeID: PostType.ID, - Name: "title", - ValueType: "string", - Required: true, - } - bodyAttr := &models.Attribute{ - Name: "body", - ValueType: "string", - Default: false, - DefaultString: "empty", - } - ownerAttr := &models.Attribute{ - Name: "ownerID", - ValueType: "string", - Required: true, - } - - PostType.Attributes = append( - PostType.Attributes, titleAttr, bodyAttr, ownerAttr, - ) - // INSTANTIATION OF A POST - whyCatsLikeMice := &models.Entity{ - EntityTypeID: PostType.ID, - EntityType: PostType, - } - titleVal := &models.Value{ - Attribute: titleAttr, - StringVal: "Why cats like mice ?", - } - bodyVal, err := models.NewStringValue(bodyAttr, - `Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. In erat mi, pharetra ut lacinia at, facilisis vitae nunc. Fusce rhoncus id justo vitae gravida. In nisi mi, rutrum et arcu ac, gravida venenatis arcu. Nulla leo metus, molestie eu sagittis non, ultricies eu ex. Fusce a lorem eu urna porttitor molestie. Aliquam nec sapien quam. Suspendisse aliquet elementum arcu vitae interdum. Maecenas nec turpis et nulla volutpat accumsan. Pellentesque non ullamcorper leo, eu fringilla odio. - - Cras eu felis mauris. Pellentesque varius imperdiet suscipit. Nam tellus odio, faucibus at mattis quis, cursus at tortor. Curabitur vitae mi eu lorem feugiat pretium sed sit amet purus. Proin efficitur, magna eu malesuada fermentum, tortor tortor maximus neque, vel mattis tortor orci a ligula. Nunc nec justo ipsum. Sed fermentum, nisl eget efficitur accumsan, augue nisl sollicitudin massa, vel suscipit enim turpis nec nisi. - - Nam dictum risus sed leo malesuada varius. Pellentesque gravida interdum risus id vulputate. Mauris feugiat vulputate leo ut euismod. Fusce auctor at lacus eget sollicitudin. Suspendisse potenti. Aliquam dui felis, mollis quis porta a, sodales in ligula. In ac elit ornare, facilisis ex eget, tincidunt orci. Nullam eu mattis turpis, non finibus dolor. - `) - if err != nil { - return err - } - ownerVal := &models.Value{ - Attribute: ownerAttr, - StringVal: admin.ID.String(), - } - - whyCatsLikeMice.Fields = append(whyCatsLikeMice.Fields, - titleVal, bodyVal, ownerVal, - ) - - err = db.Create(whyCatsLikeMice).Error - if err != nil { - return err - } - - err = db.Create(adminProfile).Error - if err != nil { - return err - } - - fmt.Println("Finished populating the database") - - return nil -} -``` - -### Authentication - -Currently we only support a basic authentication using an email and a password. -The default credentials for the user are ̀`admin-no-reply@badaas.com` and `admin` (The admin password can be changed on the first run through the config, please see [configuration.md](configuration.md)). - -### Querying the object storage engine - -I will use the httpie util in the examples below, but it works with curl or any similar tools. - -Let's first start by get all the profiles: `http localhost:8000/v1/objects/profile/` - -```json -HTTP/1.1 200 OK -Content-Length: 226 -Content-Type: application/json -Date: Thu, 05 Jan 2023 11:53:35 GMT - -[ - { - "attrs": { - "urlPic": "The Super Admin", - "userId": "wowasupercooluserID" - }, - "createdAt": "2023-01-05T12:47:41.166796+01:00", - "id": "67c5c6dc-b82d-4c2a-9ab8-f7847a732086", - "type": "profile", - "updatedAt": "2023-01-05T12:47:41.166796+01:00" - } -] -``` - -Let's all the posts posted by this user: `http localhost:8000/v1/objects/post/?ownerID=wowasupercooluserID` - -```json -HTTP/1.1 200 OK -Content-Length: 1626 -Content-Type: application/json -Date: Fri, 06 Jan 2023 08:20:33 GMT - -[ - { - "attrs": { - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. In erat mi, pharetra ut lacinia at, facilisis vitae nunc. Fusce rhoncus id justo vitae gravida. In nisi mi, rutrum et arcu ac, gravida venenatis arcu. Nulla leo metus, molestie eu sagittis non, ultricies eu ex. Fusce a lorem eu urna porttitor molestie. Aliquam nec sapien quam. Suspendisse aliquet elementum arcu vitae interdum. Maecenas nec turpis et nulla volutpat accumsan. Pellentesque non ullamcorper leo, eu fringilla odio.\n\t\n\tCras eu felis mauris. Pellentesque varius imperdiet suscipit. Nam tellus odio, faucibus at mattis quis, cursus at tortor. Curabitur vitae mi eu lorem feugiat pretium sed sit amet purus. Proin efficitur, magna eu malesuada fermentum, tortor tortor maximus neque, vel mattis tortor orci a ligula. Nunc nec justo ipsum. Sed fermentum, nisl eget efficitur accumsan, augue nisl sollicitudin massa, vel suscipit enim turpis nec nisi.\n\t\n\tNam dictum risus sed leo malesuada varius. Pellentesque gravida interdum risus id vulputate. Mauris feugiat vulputate leo ut euismod. Fusce auctor at lacus eget sollicitudin. Suspendisse potenti. Aliquam dui felis, mollis quis porta a, sodales in ligula. In ac elit ornare, facilisis ex eget, tincidunt orci. Nullam eu mattis turpis, non finibus dolor.\n\t", - "ownerID": "wowasupercooluserID", - "title": "Why cats like mice ?" - }, - "createdAt": "2023-01-06T09:18:53.313565+01:00", - "id": "68facfa6-fe77-479b-a64e-f26344393a31", - "type": "post", - "updatedAt": "2023-01-06T09:18:53.313565+01:00" - } -] -``` diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index e616ca88..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,19 +0,0 @@ -version: '3.5' - -services: - db: - image: cockroachdb/cockroach:latest - ports: - - "26257:26257" - - "8080:8080" # Web based dashboard - command: start-single-node --insecure - volumes: - - "${PWD}/_temp/cockroach-data/crdb:/cockroach/cockroach-data" - - - api: - build: ditrit/badaas:latest # local image - ports: - - "8000:8000" - depends_on: - - db diff --git a/Dockerfile b/docker/api/Dockerfile similarity index 69% rename from Dockerfile rename to docker/api/Dockerfile index 96dc2afe..95a68ed4 100644 --- a/Dockerfile +++ b/docker/api/Dockerfile @@ -1,13 +1,14 @@ # builder image FROM golang:1.19-alpine as builder WORKDIR /app -COPY . . RUN apk add build-base +COPY . . RUN CGO_ENABLED=1 go build -a -o badaas . # final image for end users FROM alpine:3.16.2 COPY --from=builder /app/badaas . +COPY --from=builder /app/docker/api/badaas.yml . EXPOSE 8000 -ENTRYPOINT [ "./badaas" ] \ No newline at end of file +ENTRYPOINT ["./badaas", "--config_path", "badaas.yml"] \ No newline at end of file diff --git a/docker/api/badaas.yml b/docker/api/badaas.yml new file mode 100644 index 00000000..0b7ddda0 --- /dev/null +++ b/docker/api/badaas.yml @@ -0,0 +1,7 @@ +database: + host: badaas-db + port: 26257 + sslmode: disable + username: root + password: postgres + name: badaas_db \ No newline at end of file diff --git a/docker/api/docker-compose.yml b/docker/api/docker-compose.yml new file mode 100644 index 00000000..cc467400 --- /dev/null +++ b/docker/api/docker-compose.yml @@ -0,0 +1,28 @@ +version: '3.5' + +services: + db: + image: cockroachdb/cockroach:latest + container_name: "badaas-db" + ports: + - "26257:26257" + - "8080:8080" # Web based dashboard + command: start-single-node --insecure + volumes: + - "${PWD}/_temp/cockroach-data:/cockroach/cockroach-data" + environment: + - COCKROACH_USER=root + - COCKROACH_DATABASE=badaas_db + + api: + build: + context: ../.. + dockerfile: ./docker/api/Dockerfile + container_name: "badaas-api" + entrypoint: ./badaas --config_path badaas.yml + ports: + - "8000:8000" + environment: + BADAAS_SERVER_EXAMPLE: ${EXAMPLE} + depends_on: + - db diff --git a/docker/test_db/docker-compose.yml b/docker/test_db/docker-compose.yml index 6c36f7c5..b937793b 100644 --- a/docker/test_db/docker-compose.yml +++ b/docker/test_db/docker-compose.yml @@ -14,4 +14,4 @@ services: - "8080:8080" # Web based dashboard environment: - COCKROACH_USER=root - - COCKROACH_DB=badaas_db + - COCKROACH_DATABASE=badaas_db diff --git a/docker/test_db/init.sh b/docker/test_db/init.sh index c02ba317..0f65cd8e 100755 --- a/docker/test_db/init.sh +++ b/docker/test_db/init.sh @@ -16,9 +16,7 @@ echo "******************************* Init database" cat > init.sql < SHOULD FAIl # DELETE all posts DELETE {{URI}}/objects/post/ HTTP/1.1 content-type: application/json diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..0fc2190a --- /dev/null +++ b/examples/README.md @@ -0,0 +1,102 @@ +# Examples of BadAas authentication and object storage + +## Options + +There are two demos: `birds` ands `posts`. To run them exec `make example_birds` and `make example_posts` respectively. + +## Set up + +First we need to setup the database connection, the used configuration file is [here](../docker/api/badaas.yml). Please head to the [configuration doc](../configuration.md) page to learn more. +The minimal configuration for the database looks like this: + +```yml +database: + host: + port: + sslmode: + username: + password: + name: +``` + +## Model definition + +We need to declare our models for the objects. +As an example we will use some UML to model the objects for this demo. + +```mermaid +classDiagram + class Post { + title String + body String + ownerID String + } + class Profile { + displayName String + urlPic String + userID String + } + class User { + } + Profile "1" <--> "*" Post + Profile "1" <--> "1" User +``` + +The Users are stored on a classic sql table outside of the object storage engine (EAV), so the userID will be a value. We will use the Profile object to store info about the users. + +For now we need to setup the schema manually using a invoke function that will run at the initialization of the programme. The definition can be found [here](examples.go#104) +Make sure that the database you are gonna use is empty. + +## Authentication + +Currently we only support a basic authentication using an email and a password. +The default credentials for the user are ̀`admin-no-reply@badaas.com` and `admin` (The admin password can be changed on the first run through the config, please see [configuration.md](configuration.md)). + +## Test it + +httpie util will be used in the examples below, but it works with curl or any similar tools. + +Let's first start by getting all the profiles: `http localhost:8000/v1/objects/profile/` + +```json +HTTP/1.1 200 OK +Content-Length: 226 +Content-Type: application/json +Date: Thu, 05 Jan 2023 11:53:35 GMT + +[ + { + "attrs": { + "urlPic": "The Super Admin", + "userId": "wowASuperCoolUserID" + }, + "createdAt": "2023-01-05T12:47:41.166796+01:00", + "id": "67c5c6dc-b82d-4c2a-9ab8-f7847a732086", + "type": "profile", + "updatedAt": "2023-01-05T12:47:41.166796+01:00" + } +] +``` + +Let's get all the posts posted by this user: `http localhost:8000/v1/objects/post/?ownerID=wowASuperCoolUserID` + +```json +HTTP/1.1 200 OK +Content-Length: 1626 +Content-Type: application/json +Date: Fri, 06 Jan 2023 08:20:33 GMT + +[ + { + "attrs": { + "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\tIn consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi.\n\tIn erat mi, pharetra ut lacinia at, facilisis vitae nunc.\n\t", + "ownerID": "wowasupercooluserID", + "title": "Why cats like mice ?" + }, + "createdAt": "2023-01-06T09:18:53.313565+01:00", + "id": "68facfa6-fe77-479b-a64e-f26344393a31", + "type": "post", + "updatedAt": "2023-01-06T09:18:53.313565+01:00" + } +] +``` diff --git a/examples/examples.go b/examples/examples.go new file mode 100644 index 00000000..158c6bda --- /dev/null +++ b/examples/examples.go @@ -0,0 +1,210 @@ +package examples + +import ( + "fmt" + + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/persistence/models" + "github.com/spf13/viper" + "go.uber.org/zap" + "gorm.io/gorm" +) + +const ( + BirdsExample string = "birds" + PostsExample string = "posts" +) + +func StartExample(logger *zap.Logger, db *gorm.DB) error { + example := viper.GetString(configuration.ServerExampleKey) + switch example { + case "": + return nil + case BirdsExample: + return startBirdsExample(logger, db) + case PostsExample: + return startPostsExample(logger, db) + default: + return fmt.Errorf("unknown example %s", example) + } +} + +func startBirdsExample(logger *zap.Logger, db *gorm.DB) error { + logger.Sugar().Info("Setting up Birds example") + //defining + humanType := &models.EntityType{ + Name: "human", + } + nameAttr := &models.Attribute{Name: "name", ValueType: models.StringValueType, Required: true} + humanType.Attributes = append( + humanType.Attributes, nameAttr, + ) + bobName, err := models.NewStringValue(nameAttr, "bob") + if err != nil { + return err + } + bob := &models.Entity{EntityType: humanType} + bob.Fields = append(bob.Fields, bobName) + db.Create(bob) + + jeanName, err := models.NewStringValue(nameAttr, "jean") + if err != nil { + return err + } + jean := &models.Entity{EntityType: humanType} + jean.Fields = append(jean.Fields, jeanName) + + db.Create(jean) + + // Defining a bird + colorAttr := &models.Attribute{Name: "color", ValueType: models.StringValueType, Required: true} + specieAttr := &models.Attribute{Name: "specie", ValueType: models.StringValueType, Required: true} + heightAttr := &models.Attribute{Name: "height", ValueType: models.IntValueType, Default: true, DefaultInt: 12, Required: false} + weightAttr := &models.Attribute{Name: "weight", ValueType: models.FloatValueType, Default: true, DefaultFloat: 12.500, Required: false} + ownerAttr := &models.Attribute{Name: "owner", ValueType: models.RelationValueType, Required: false, RelationTargetEntityTypeID: humanType.ID} + + BirdType := &models.EntityType{ + Name: "bird", + } + BirdType.Attributes = append( + BirdType.Attributes, colorAttr, specieAttr, heightAttr, weightAttr, ownerAttr, + ) + + val1, err := models.NewStringValue(colorAttr, "blue") + if err != nil { + return err + } + val2, err := models.NewStringValue(specieAttr, "chickadee") + if err != nil { + return err + } + val3, err := models.NewIntValue(heightAttr, 8) + if err != nil { + return err + } + val4, err := models.NewNullValue(weightAttr) + if err != nil { + return err + } + + val5, err := models.NewRelationValue(ownerAttr, bob) + if err != nil { + return err + } + + chickadee := &models.Entity{EntityType: BirdType} + chickadee.Fields = append(chickadee.Fields, val1, val2, val3, val4, val5) + + db.Create(chickadee) + logger.Sugar().Info("Finished populating the database") + + return nil +} + +func startPostsExample(logger *zap.Logger, db *gorm.DB) error { + logger.Sugar().Info("Setting up Posts example") + // GETTING THE USER ADMIN FOR REFERENCE + userID := "wowASuperCoolUserID" + + // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES + profileType := &models.EntityType{ + Name: "profile", + } + displayNameAttr := &models.Attribute{ + EntityTypeID: profileType.ID, + Name: "displayName", + ValueType: models.StringValueType, + Required: true, + } + urlPicAttr := &models.Attribute{ + EntityTypeID: profileType.ID, + Name: "urlPic", + ValueType: models.StringValueType, + Required: false, + Default: true, + DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", //nolint:lll + } + userIDAttr := &models.Attribute{ + EntityTypeID: profileType.ID, + Name: "userId", + ValueType: models.StringValueType, + Required: true, + } + profileType.Attributes = append(profileType.Attributes, + displayNameAttr, + urlPicAttr, + userIDAttr, + ) + + // INSTANTIATION OF A Profile + adminProfile := &models.Entity{ + EntityTypeID: profileType.ID, + EntityType: profileType, + } + displayNameVal, _ := models.NewStringValue(displayNameAttr, "The Super Admin") + userPicVal, _ := models.NewNullValue(urlPicAttr) + userIDVal, _ := models.NewStringValue(userIDAttr, userID) + adminProfile.Fields = append(adminProfile.Fields, + displayNameVal, + userPicVal, + userIDVal, + ) + + // CREATION OF THE POST TYPE AND ASSOCIATED ATTRIBUTES + postType := &models.EntityType{ + Name: "post", + } + titleAttr := &models.Attribute{ + EntityTypeID: postType.ID, + Name: "title", + ValueType: models.StringValueType, + Required: true, + } + bodyAttr := &models.Attribute{ + Name: "body", + ValueType: models.StringValueType, + Default: false, + DefaultString: "empty", + } + ownerAttr := &models.Attribute{ + Name: "ownerID", + ValueType: models.StringValueType, + Required: true, + } + + postType.Attributes = append( + postType.Attributes, titleAttr, bodyAttr, ownerAttr, + ) + // INSTANTIATION OF A POST + whyCatsLikeMice := &models.Entity{ + EntityTypeID: postType.ID, + EntityType: postType, + } + titleVal, _ := models.NewStringValue(titleAttr, "Why cats like mice ?") + bodyVal, _ := models.NewStringValue(bodyAttr, + `Lorem ipsum dolor sit amet, consectetur adipiscing elit. + + In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. + + In erat mi, pharetra ut lacinia at, facilisis vitae nunc. + `) + ownerVal, _ := models.NewStringValue(ownerAttr, userID) + + whyCatsLikeMice.Fields = append(whyCatsLikeMice.Fields, + titleVal, bodyVal, ownerVal, + ) + + err := db.Create(whyCatsLikeMice).Error + if err != nil { + return err + } + + err = db.Create(adminProfile).Error + if err != nil { + return err + } + + logger.Sugar().Info("Finished populating the database") + + return nil +} diff --git a/test.http b/test.http deleted file mode 100644 index 75212e6e..00000000 --- a/test.http +++ /dev/null @@ -1,30 +0,0 @@ -@hostname = localhost -@port = 8000 -@host = {{hostname}}:{{port}} - -@URI = http://{{hostname}}:{{port}} - -GET {{URI}}/info HTTP/1.1 - -### - -POST {{URI}}/login HTTP/1.1 -content-type: application/json - -{ - "email": "superadmin@badaas.test", - "password": "1234" -} - -### - -GET {{URI}}/logout HTTP/1.1 - -### - -GET {{URI}}/protected HTTP/1.1 - -### - - -GET {{URI}}/auth/oidc/redirect-url HTTP/1.1 \ No newline at end of file From 28bb79070b1177df40cee432886acfe31d8016d0 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 15:04:05 +0200 Subject: [PATCH 035/467] fix int tests --- docker/test_db/init.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/test_db/init.sh b/docker/test_db/init.sh index 0f65cd8e..ce99e4ae 100755 --- a/docker/test_db/init.sh +++ b/docker/test_db/init.sh @@ -16,6 +16,7 @@ echo "******************************* Init database" cat > init.sql < Date: Tue, 18 Apr 2023 15:21:27 +0200 Subject: [PATCH 036/467] add user to dockerfile --- docker/api/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index 95a68ed4..3cc8bc49 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -8,6 +8,9 @@ RUN CGO_ENABLED=1 go build -a -o badaas . # final image for end users FROM alpine:3.16.2 +RUN addgroup -S badaas \ + && adduser -S badaas -G badaas +USER badaas COPY --from=builder /app/badaas . COPY --from=builder /app/docker/api/badaas.yml . EXPOSE 8000 From 272958d4607c560c72b446dc4aa24833a272af7c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 15:32:37 +0200 Subject: [PATCH 037/467] add timeout to e2e tests --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 5bba46b9..d105f567 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -93,7 +93,7 @@ jobs: uses: mydea/action-wait-for-api@v1 with: url: "http://localhost:8000/info" - timeout: 20 + timeout: 30 - name: Run test run: go test -tags=e2e ./test_e2e -v - name: Get logs From 904900ce12b155087d8d110a1d6cca9b4c82c035 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 15:41:32 +0200 Subject: [PATCH 038/467] add timeout to e2e tests --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index d105f567..88cace38 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -93,7 +93,7 @@ jobs: uses: mydea/action-wait-for-api@v1 with: url: "http://localhost:8000/info" - timeout: 30 + timeout: 60 - name: Run test run: go test -tags=e2e ./test_e2e -v - name: Get logs From a79ba3713a68bb3013bd55a0fc063218c4cb2687 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 16:04:26 +0200 Subject: [PATCH 039/467] try to fix recursive copy sonarcloud --- docker/api/Dockerfile | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index 3cc8bc49..66355b50 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -2,7 +2,21 @@ FROM golang:1.19-alpine as builder WORKDIR /app RUN apk add build-base -COPY . . +COPY commands/ ./commands +COPY configuration/ ./configuration +COPY controllers/ ./controllers +COPY examples/ ./examples +COPY httperrors/ ./httperrors +COPY logger/ ./logger +COPY persistence/ ./persistence +COPY resources/ ./resources +COPY router/ ./router +COPY services/ ./services +COPY utils/ ./utils +COPY validators/ ./validators +COPY badaas.go . +COPY go.mod . +COPY go.sum . RUN CGO_ENABLED=1 go build -a -o badaas . @@ -12,6 +26,6 @@ RUN addgroup -S badaas \ && adduser -S badaas -G badaas USER badaas COPY --from=builder /app/badaas . -COPY --from=builder /app/docker/api/badaas.yml . +COPY docker/api/badaas.yml . EXPOSE 8000 ENTRYPOINT ["./badaas", "--config_path", "badaas.yml"] \ No newline at end of file From c2319dd0db94c262e192b859c9f3d454ed067806 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 16:09:07 +0200 Subject: [PATCH 040/467] try to fix sonarcloud non root --- docker/api/Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index 66355b50..4485f80b 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -18,12 +18,13 @@ COPY badaas.go . COPY go.mod . COPY go.sum . RUN CGO_ENABLED=1 go build -a -o badaas . +RUN addgroup -S nonroot \ + && adduser -S nonroot -G nonroot # final image for end users FROM alpine:3.16.2 -RUN addgroup -S badaas \ - && adduser -S badaas -G badaas +COPY --from=builder /etc/passwd /etc/passwd USER badaas COPY --from=builder /app/badaas . COPY docker/api/badaas.yml . From ef4914df2b33892d1a3a5a63c5d15d73887f15dc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 16:15:22 +0200 Subject: [PATCH 041/467] try to fix sonarcloud non root --- docker/api/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index 4485f80b..de8967f5 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -18,9 +18,9 @@ COPY badaas.go . COPY go.mod . COPY go.sum . RUN CGO_ENABLED=1 go build -a -o badaas . -RUN addgroup -S nonroot \ - && adduser -S nonroot -G nonroot - +RUN addgroup -S badaas \ + && adduser -S badaas -G badaas +USER badaas # final image for end users FROM alpine:3.16.2 From 8761772313cd37364f6f7fdcd057285b41442061 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 16:17:54 +0200 Subject: [PATCH 042/467] try to fix sonarcloud non root 2 --- docker/api/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index de8967f5..bc70384f 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -22,6 +22,7 @@ RUN addgroup -S badaas \ && adduser -S badaas -G badaas USER badaas + # final image for end users FROM alpine:3.16.2 COPY --from=builder /etc/passwd /etc/passwd From a8631d3efdfc1f74fa2ac64d04db37b6569b770e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 16:44:43 +0200 Subject: [PATCH 043/467] try to fix sonarcloud non root 3 --- docker/api/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index bc70384f..dc400408 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -1,7 +1,10 @@ # builder image FROM golang:1.19-alpine as builder -WORKDIR /app RUN apk add build-base +RUN addgroup -S badaas \ + && adduser -S badaas -G badaas +USER badaas +WORKDIR /app COPY commands/ ./commands COPY configuration/ ./configuration COPY controllers/ ./controllers @@ -18,9 +21,6 @@ COPY badaas.go . COPY go.mod . COPY go.sum . RUN CGO_ENABLED=1 go build -a -o badaas . -RUN addgroup -S badaas \ - && adduser -S badaas -G badaas -USER badaas # final image for end users From 1c55a9ecccd8a22f327aaa4b13512e16afb48363 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 17:50:12 +0200 Subject: [PATCH 044/467] try to fix sonarcloud non root 4 --- docker/api/Dockerfile | 6 ++---- docker/test_api/Dockerfile | 4 +++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index dc400408..be1b0bf5 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -1,9 +1,6 @@ # builder image FROM golang:1.19-alpine as builder RUN apk add build-base -RUN addgroup -S badaas \ - && adduser -S badaas -G badaas -USER badaas WORKDIR /app COPY commands/ ./commands COPY configuration/ ./configuration @@ -25,7 +22,8 @@ RUN CGO_ENABLED=1 go build -a -o badaas . # final image for end users FROM alpine:3.16.2 -COPY --from=builder /etc/passwd /etc/passwd +RUN addgroup -S badaas \ + && adduser -S badaas -G badaas USER badaas COPY --from=builder /app/badaas . COPY docker/api/badaas.yml . diff --git a/docker/test_api/Dockerfile b/docker/test_api/Dockerfile index da8b5c02..e505e744 100644 --- a/docker/test_api/Dockerfile +++ b/docker/test_api/Dockerfile @@ -1,6 +1,8 @@ # DEVELOPMENT ONLY, DO NOT USE FOR PRODUCTION FROM golang:1.19-alpine -RUN mkdir /badaas +RUN addgroup -S badaas \ + && adduser -S badaas -G badaas +USER badaas WORKDIR /badaas COPY go.mod . COPY go.sum . From a4a27c8373dd289c5c8fb3ad1940e542b600a4f3 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 17:50:44 +0200 Subject: [PATCH 045/467] check if integration tests can affect to coverage --- test_integration/integration_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index 008b4a8d..2bcbafe8 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -1,6 +1,3 @@ -//go:build integration -// +build integration - package integration_test import ( From 110acd91e8557bd958b2b440485249d6ba472e41 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 18:40:29 +0200 Subject: [PATCH 046/467] add int tests to coverage report --- .github/workflows/CI.yml | 21 ++++++++++----- Makefile | 8 +++--- sonar-project.properties | 4 +-- test_e2e/badaas_e2e_test.go | 3 --- test_e2e/http_support_test.go | 3 --- .../{integration_test_suite.go => asserts.go} | 23 +--------------- test_integration/eavservice.go | 2 +- test_integration/integration_test.go | 2 +- test_integration/setup.go | 27 +++++++++++++++++++ 9 files changed, 52 insertions(+), 41 deletions(-) rename test_integration/{integration_test_suite.go => asserts.go} (72%) create mode 100644 test_integration/setup.go diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 88cace38..59fa1ea7 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -31,11 +31,11 @@ jobs: go-version: '^1.18' cache: true - name: Run test - run: go test ./... -coverprofile=coverage.out -v + run: make test_unit - uses: actions/upload-artifact@v3 with: - name: coverage - path: coverage.out + name: coverage_unit + path: coverage_unit.out check-style: name: Code style @@ -71,6 +71,10 @@ jobs: cache: true - name: Run test run: make test_integration + - uses: actions/upload-artifact@v3 + with: + name: coverage_int + path: coverage_int.out - name: Stop containers if: always() run: docker compose -f "docker/test_db/docker-compose.yml" down @@ -115,11 +119,16 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Download line coverage report + - name: Download unit tests line coverage report + uses: actions/download-artifact@v3 + with: + name: coverage_unit + path: coverage_unit.out + - name: Download int tests line coverage report uses: actions/download-artifact@v3 with: - name: coverage - path: coverage.out + name: coverage_int + path: coverage_int.out - name: SonarCloud Scan uses: sonarsource/sonarcloud-github-action@master env: diff --git a/Makefile b/Makefile index ca0845a0..f64523b6 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,16 @@ +PATHS = $(shell go list ./... | tail -n +2 | grep -v test_integration | grep -v test_e2e) + test_unit: - go test ./... -v + go test $(PATHS) -coverpkg=./... -coverprofile=coverage_unit.out -v test_integration: docker compose -f "docker/test_db/docker-compose.yml" up -d - go test -tags=integration ./test_integration -v + go test ./test_integration -coverpkg=./... -coverprofile=coverage_int.out -v test_e2e: docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" up -d ./docker/wait_for_api.sh 8000/info - go test -tags=e2e ./test_e2e -v + go test ./test_e2e -v example_birds: EXAMPLE=birds docker compose -f "docker/api/docker-compose.yml" up diff --git a/sonar-project.properties b/sonar-project.properties index f0158b76..c3e40ebb 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.organization=ditrit sonar.projectName=badaas sonar.host.url=https://sonarcloud.io sonar.sources=. -sonar.exclusions=**/*_test.go,mocks/***,vendor/*** +sonar.exclusions=**/*_test.go,mocks/***,vendor/***,test_integration/***,test_e2e/***,examples/*** sonar.tests=. sonar.test.inclusions=**/*_test.go -sonar.go.coverage.reportPaths=./coverage.out/coverage.out +sonar.go.coverage.reportPaths=coverage_unit.out,coverage_int.out diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index d7064d63..8b5e2072 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -1,6 +1,3 @@ -//go:build e2e -// +build e2e - package main import ( diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 38c3d795..b1f5ec7c 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -1,6 +1,3 @@ -//go:build e2e -// +build e2e - package main import ( diff --git a/test_integration/integration_test_suite.go b/test_integration/asserts.go similarity index 72% rename from test_integration/integration_test_suite.go rename to test_integration/asserts.go index 4de2b29a..b4bffec2 100644 --- a/test_integration/integration_test_suite.go +++ b/test_integration/asserts.go @@ -1,36 +1,15 @@ -package integration_test +package integrationtests import ( - "log" "reflect" "sort" "github.com/ditrit/badaas/persistence/models" "github.com/stretchr/testify/suite" - "gorm.io/gorm" "gotest.tools/assert" is "gotest.tools/assert/cmp" ) -var ListOfTables = []any{ - models.Session{}, - models.User{}, - models.Value{}, - models.Entity{}, - models.Attribute{}, - models.EntityType{}, -} - -func SetupDB(db *gorm.DB) { - // clean database to ensure independency between tests - for _, table := range ListOfTables { - err := db.Unscoped().Where("1 = 1").Delete(table).Error - if err != nil { - log.Fatalln("could not clean database: ", err) - } - } -} - func EqualList(ts *suite.Suite, expected, actual any) { v := reflect.ValueOf(expected) v2 := reflect.ValueOf(actual) diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 0af623f3..54cdd87f 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -1,4 +1,4 @@ -package integration_test +package integrationtests import ( "fmt" diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index 2bcbafe8..a37cf27b 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -1,4 +1,4 @@ -package integration_test +package integrationtests import ( "path" diff --git a/test_integration/setup.go b/test_integration/setup.go new file mode 100644 index 00000000..f025629b --- /dev/null +++ b/test_integration/setup.go @@ -0,0 +1,27 @@ +package integrationtests + +import ( + "log" + + "github.com/ditrit/badaas/persistence/models" + "gorm.io/gorm" +) + +var ListOfTables = []any{ + models.Session{}, + models.User{}, + models.Value{}, + models.Entity{}, + models.Attribute{}, + models.EntityType{}, +} + +func SetupDB(db *gorm.DB) { + // clean database to ensure independency between tests + for _, table := range ListOfTables { + err := db.Unscoped().Where("1 = 1").Delete(table).Error + if err != nil { + log.Fatalln("could not clean database: ", err) + } + } +} From d11a2710e46e1ea9586c30fc0ab24b880eea4291 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 18:45:26 +0200 Subject: [PATCH 047/467] fix dependencies in ci --- .github/workflows/CI.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 59fa1ea7..fac8c94a 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -59,7 +59,7 @@ jobs: integration-tests: name: Integration tests - needs: [unit-tests, check-style] + needs: [branch-naming-rules] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -113,7 +113,7 @@ jobs: sonarcloud: name: SonarCloud - needs: [unit-tests, check-style] + needs: [unit-tests, check-style, integration-tests] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From 9d6d00b6551a0fc1995bc3d3adde91b9f5bef7dc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Apr 2023 18:54:55 +0200 Subject: [PATCH 048/467] fix coverage files path --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index c3e40ebb..3c34734d 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -6,4 +6,4 @@ sonar.sources=. sonar.exclusions=**/*_test.go,mocks/***,vendor/***,test_integration/***,test_e2e/***,examples/*** sonar.tests=. sonar.test.inclusions=**/*_test.go -sonar.go.coverage.reportPaths=coverage_unit.out,coverage_int.out +sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_int.out/coverage_int.out From ef3adbdd8993934b7d59c98344bc922d967e369c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 19 Apr 2023 09:48:37 +0200 Subject: [PATCH 049/467] add doc + fix typos --- CONTRIBUTING.md | 25 ++++++++++++++++++------- configuration.md | 13 ++++++------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e048a8cc..5af8e1c9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,6 +3,7 @@ - [Contribute to the development of badaas](#contribute-to-the-development-of-badaas) - [Tests](#tests) - [Unit tests](#unit-tests) + - [Integration tests](#integration-tests) - [Feature tests (of end to end tests)](#feature-tests-of-end-to-end-tests) - [Logger](#logger) - [Directory structure](#directory-structure) @@ -23,6 +24,16 @@ To run them, please run: make test_unit ``` +### Integration tests + +Integration tests have an available CockroachDB node and the dependency injection system. + +Run: + +```sh +make test_integration +``` + ### Feature tests (of end to end tests) We use docker to run a Badaas instance in combination with one node of CockroachDB. @@ -37,7 +48,7 @@ The feature files can be found in the `test_e2e/features` folder. ## Logger -We use ubber's [zap](https://pkg.go.dev/go.uber.org/zap) to log stuff, please take `zap.Logger` as an argument for your services constructors. [fx](https://github.com/uber-go/fx) will provide your service with an instance. +We use uber's [zap](https://pkg.go.dev/go.uber.org/zap) to log stuff, please take `zap.Logger` as an argument for your services constructors. [fx](https://github.com/uber-go/fx) will provide your service with an instance. ## Directory structure @@ -52,7 +63,7 @@ This is the directory structure we use for the project: - `persistance/` *(Go code)*: - `/gormdatabase/` *(Go code)*: Contains the logic to create a database. Also contains a go package named `gormzap`: it is a compatibility layer between *gorm.io/gorm* and *github.com/uber-go/zap*. - `/models/` *(Go code)*: Contains the models. (For a structure to me considered a valid model, it has to embed `models.BaseModel` and satisfy the `models.Tabler` interface. This interface returns the name of the sql table.) - - `/dto/` *(Go code)*: Contains the Data Transfert Objects. They are used mainly to decode json payloads. + - `/dto/` *(Go code)*: Contains the Data Transfer Objects. They are used mainly to decode json payloads. - `/pagination/` *(Go code)*: Contains the pagination logic. - `/repository/` *(Go code)*: Contains the repository interface and implementation. Use uint as ID when using gorm models. - `resources/` *(Go code)*: Contains the resources shared with the rest of the codebase (ex: API version). @@ -60,10 +71,10 @@ This is the directory structure we use for the project: - `/middlewares/` *(Go code)*: Contains the various http middlewares that we use. - `scripts/e2e/` : Contains the docker-compose file for end-to-end test. - `/api/` : Contains the Dockerfile to build badaas with a dedicated config file. - - `/db/` : Contains the Dockerfile to build a developpement version of CockroachDB. -- `services/` *(Go code)*: Contains the Dockerfile to build a developpement version of CockroachDB. - - `/auth/protocols/`: Contains the implementations of authentication clients for differents protocols. - - `/basicauth/` *(Go code)*: Handle the authentification using email/password. + - `/db/` : Contains the Dockerfile to build a development version of CockroachDB. +- `services/` *(Go code)*: Contains the Dockerfile to build a development version of CockroachDB. + - `/auth/protocols/`: Contains the implementations of authentication clients for different protocols. + - `/basicauth/` *(Go code)*: Handle the authentication using email/password. - `/oidc/` *(Go code)*: Handle the authentication via Open-ID Connect. - `/sessionservice/` *(Go code)*: Handle sessions and their lifecycle. - `/userservice/` *(Go code)*: Handle users. @@ -87,7 +98,7 @@ At the root of the project, you will find: Accepted prefixes are: - `feature`, used for feature development - `bugfix`, used for bug fix - - `improvement`, used for refacto + - `improvement`, used for refactor - `library`, used for updating library - `prerelease`, used for preparing the branch for the release - `release`, used for releasing project diff --git a/configuration.md b/configuration.md index 06383628..189a55c1 100644 --- a/configuration.md +++ b/configuration.md @@ -7,9 +7,9 @@ As said in the README: > Badaas can be configured using environment variables, CLI flags or a configuration file. > CLI flags take priority on the environment variables and the environment variables take priority on the content of the configuration file. -In this documentation file, we will mainly focus our attention on config files but we won't forget that we can use environement variables and CLI flags to change Badaas' config. +In this documentation file, we will mainly focus our attention on config files but we won't forget that we can use environment variables and CLI flags to change Badaas' config. -The config file can be formated in any syntax that [github.com/spf13/viper](https://github.com/spf13/viper) supports but we will only use YAML syntax in our docs. +The config file can be formatted in any syntax that [github.com/spf13/viper](https://github.com/spf13/viper) supports but we will only use YAML syntax in our docs. - [Configuration](#configuration) - [Database](#database) @@ -56,13 +56,13 @@ database: retryTime: 5 ``` -Please note that the init section `init:` is not mandatory. Badaas is suited with a simple but effective retry mecanism that will retry `database.init.retry` time to establish a connection with the database. Badaas will wait `database.init.retryTime` seconds between each retry. +Please note that the init section `init:` is not mandatory. Badaas is suited with a simple but effective retry mechanism that will retry `database.init.retry` time to establish a connection with the database. Badaas will wait `database.init.retryTime` seconds between each retry. ## Logger Badaas use a structured logger that can output json logs in production and user adapted logs for debug using the `logger.mode` key. -Badaas offers the possibility to change the log message of the Middleware Logger but provides a sane default. It is formated using the Jinja syntax. The values available are `method`, `url` and `protocol`. +Badaas offers the possibility to change the log message of the Middleware Logger but provides a sane default. It is formatted using the Jinja syntax. The values available are `method`, `url` and `protocol`. ```yml # The settings for the logger. @@ -79,7 +79,7 @@ logger: You can change the host Badaas will bind to, the port and the timeout in seconds. -Additionaly you can change the number of elements returned by default for a paginated response. +Additionally you can change the number of elements returned by default for a paginated response. ```yml # The settings for the http server. @@ -124,7 +124,6 @@ Session are extended if the user made a request to badaas in the "roll duration" Please see the diagram below to see what is the roll duration relative to the session duration. - ```txt | session duration | |<----------------------------------------->| @@ -136,7 +135,7 @@ Please see the diagram below to see what is the roll duration relative to the se ```yml # The settings for session service -# This section contains some good defaults, don't change thoses value unless you need to. +# This section contains some good defaults, don't change those value unless you need to. session: # The duration of a user session, in seconds # Default (14400) equal to 4 hours From 6713f274da59836ab3cc4f83e40a466abdc9f586 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 19 Apr 2023 09:49:59 +0200 Subject: [PATCH 050/467] fix typos --- changelog.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/changelog.md b/changelog.md index 866b2573..f1fa60e3 100644 --- a/changelog.md +++ b/changelog.md @@ -14,7 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Setup Docker based build system. - Add default api endpoint `info` - Setup command based pattern using verdeter -- Add an http error handling mecanism +- Add an http error handling mechanism - Add a json controller - Add a dto package - The tasks in the CI are ran in parallel. @@ -22,14 +22,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add a configuration structure containing all the configuration holder. - Refactor codebase to use the DI framework uber-go/fx. Now all services and controllers relies on interfaces. - Add an generic ID to the repository interface -- Add a retry mecanism for the database connection +- Add a retry mechanism for the database connection - Add `init` flag to migrate database and create admin user. - Add a CONTRIBUTING.md and a documentation file for configuration (configuration.md) - Add a session services. -- Add a basic authentification controller. +- Add a basic authentication controller. - Now config keys are only declared once with constants in the `configuration/` package. - Add a dto that is returned on a successful login. - Update verdeter to version v0.4.0 - -[unreleased]: https://github.com/ditrit/badaas/blob/main/changelog.md#unreleased \ No newline at end of file +[unreleased]: https://github.com/ditrit/badaas/blob/main/changelog.md#unreleased From 9da1ea4764f53714b31a6f49caae9a3da0b6a9b2 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 19 Apr 2023 10:28:55 +0200 Subject: [PATCH 051/467] remove unused code --- docker/api/docker-compose.yml | 1 - examples/CRUD_birds.http | 2 +- examples/CRUD_posts.http | 2 +- examples/README.md | 2 +- persistence/models/Entity.go | 26 -------------------------- 5 files changed, 3 insertions(+), 30 deletions(-) diff --git a/docker/api/docker-compose.yml b/docker/api/docker-compose.yml index cc467400..c3774206 100644 --- a/docker/api/docker-compose.yml +++ b/docker/api/docker-compose.yml @@ -19,7 +19,6 @@ services: context: ../.. dockerfile: ./docker/api/Dockerfile container_name: "badaas-api" - entrypoint: ./badaas --config_path badaas.yml ports: - "8000:8000" environment: diff --git a/examples/CRUD_birds.http b/examples/CRUD_birds.http index b27125ba..da921ace 100644 --- a/examples/CRUD_birds.http +++ b/examples/CRUD_birds.http @@ -1,5 +1,5 @@ @hostname = localhost -@port = 8002 +@port = 8000 @host = {{hostname}}:{{port}} @URI = http://{{hostname}}:{{port}}/v1 diff --git a/examples/CRUD_posts.http b/examples/CRUD_posts.http index e96e38bb..d313e3ef 100644 --- a/examples/CRUD_posts.http +++ b/examples/CRUD_posts.http @@ -1,5 +1,5 @@ @hostname = localhost -@port = 8002 +@port = 8000 @host = {{hostname}}:{{port}} @URI = http://{{hostname}}:{{port}}/v1 diff --git a/examples/README.md b/examples/README.md index 0fc2190a..23860af7 100644 --- a/examples/README.md +++ b/examples/README.md @@ -44,7 +44,7 @@ classDiagram The Users are stored on a classic sql table outside of the object storage engine (EAV), so the userID will be a value. We will use the Profile object to store info about the users. -For now we need to setup the schema manually using a invoke function that will run at the initialization of the programme. The definition can be found [here](examples.go#104) +For now we need to setup the schema manually using a invoke function that will run at the initialization of the programme. The definition can be found [here](examples.go#L104). Make sure that the database you are gonna use is empty. ## Authentication diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index d1fbedfc..79e50ea1 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -58,32 +58,6 @@ func (e *Entity) GetValue(attrName string) (interface{}, error) { return (*value).Value(), nil } -// Encode the Entity to json -func (e *Entity) EncodeToJSON() []byte { - var pairs []string - pairs = append(pairs, - fmt.Sprintf("%q: %d", "id", e.ID), - fmt.Sprintf("%q: %q", "type", e.EntityType.Name), - fmt.Sprintf("%q: %s", "attrs", e.encodeAttributesToJSON()), - ) - - return []byte(utils.BuildJSONFromStrings(pairs)) -} - -// return the attribute in a json encoded string -func (e *Entity) encodeAttributesToJSON() string { - var pairs []string - for _, f := range e.Fields { - if f.IsNull { - continue - } - pair, _ := f.BuildJSONKVPair() - pairs = append(pairs, pair) - } - - return utils.BuildJSONFromStrings(pairs) -} - func (Entity) TableName() string { return "entities" } From cb963407d843900373b5d926b3cce223f1dfb43b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 19 Apr 2023 10:59:27 +0200 Subject: [PATCH 052/467] fix problems in e2e tests --- controllers/basicAuth.go | 11 +++++++---- httperrors/httperrors.go | 12 ++++++------ services/sessionservice/session.go | 6 +++--- test_e2e/badaas_e2e_test.go | 2 +- test_e2e/features/basic_auth.feature | 9 +++++---- test_e2e/http_support_test.go | 23 +++++++++++++++++++---- 6 files changed, 41 insertions(+), 22 deletions(-) diff --git a/controllers/basicAuth.go b/controllers/basicAuth.go index d98c4de5..798d3db7 100644 --- a/controllers/basicAuth.go +++ b/controllers/basicAuth.go @@ -18,7 +18,8 @@ var ( "Request malformed", "The schema of the received data is not correct", nil, - false) + false, + ) ) // Basic Authentification Controller @@ -37,7 +38,7 @@ type basicAuthentificationController struct { sessionService sessionservice.SessionService } -// BasicAuthentificationController contructor +// BasicAuthentificationController constructor func NewBasicAuthentificationController( logger *zap.Logger, userService userservice.UserService, @@ -78,6 +79,8 @@ func (basicAuthController *basicAuthentificationController) BasicLoginHandler(w // Log Out the user func (basicAuthController *basicAuthentificationController) Logout(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - basicAuthController.sessionService.LogUserOut(sessionservice.GetSessionClaimsFromContext(r.Context()), w) - return nil, nil + return nil, basicAuthController.sessionService.LogUserOut( + sessionservice.GetSessionClaimsFromContext(r.Context()), + w, + ) } diff --git a/httperrors/httperrors.go b/httperrors/httperrors.go index 3de71aff..ad3b563c 100644 --- a/httperrors/httperrors.go +++ b/httperrors/httperrors.go @@ -93,18 +93,18 @@ func NewHTTPError(status int, err string, message string, golangError error, toL } } -// A contructor for an HttpError "Not Found" -func NewErrorNotFound(ressourceName string, msg string) HTTPError { +// A constructor for an HttpError "Not Found" +func NewErrorNotFound(resourceName string, msg string) HTTPError { return NewHTTPError( http.StatusNotFound, - fmt.Sprintf("%s not found", ressourceName), + fmt.Sprintf("%s not found", resourceName), msg, nil, false, ) } -// A contructor for an HttpError "Internal Server Error" +// A constructor for an HttpError "Internal Server Error" func NewInternalServerError(errorName string, msg string, err error) HTTPError { return NewHTTPError( http.StatusInternalServerError, @@ -115,7 +115,7 @@ func NewInternalServerError(errorName string, msg string, err error) HTTPError { ) } -// A contructor for an HttpError "Unauthorized Error" +// A constructor for an HttpError "Unauthorized Error" func NewUnauthorizedError(errorName string, msg string) HTTPError { return NewHTTPError( http.StatusUnauthorized, @@ -126,7 +126,7 @@ func NewUnauthorizedError(errorName string, msg string) HTTPError { ) } -// A contructor for an HTTPError "Bad Request" +// A constructor for an HTTPError "Bad Request" func NewBadRequestError(err string, msg string) HTTPError { return NewHTTPError(http.StatusBadRequest, err, msg, nil, false) } diff --git a/services/sessionservice/session.go b/services/sessionservice/session.go index 62852f68..3ee63735 100644 --- a/services/sessionservice/session.go +++ b/services/sessionservice/session.go @@ -229,7 +229,7 @@ func (sessionService *sessionServiceImpl) LogUserIn(user *models.User, response func (sessionService *sessionServiceImpl) LogUserOut(sessionClaims *SessionClaims, response http.ResponseWriter) httperrors.HTTPError { session := sessionService.get(sessionClaims.SessionUUID) if session == nil { - return httperrors.NewUnauthorizedError("Authentification Error", "not authenticated") + return httperrors.NewUnauthorizedError("Authentication Error", "not authenticated") } err := sessionService.delete(session) if err != nil { @@ -246,8 +246,8 @@ func CreateAndSetAccessTokenCookie(w http.ResponseWriter, sessionUUID string) { Path: "/", Value: sessionUUID, HttpOnly: true, - SameSite: http.SameSiteNoneMode, // change to http.SameSiteStrictMode in prod - Secure: false, // change to true in prod + SameSite: http.SameSiteNoneMode, // TODO change to http.SameSiteStrictMode in prod + Secure: false, // TODO change to true in prod Expires: time.Now().Add(48 * time.Hour), } err := accessToken.Valid() diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index 8b5e2072..39e253dc 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -14,7 +14,7 @@ import ( type TestContext struct { statusCode int - json map[string]interface{} + json map[string]any httpClient *http.Client } diff --git a/test_e2e/features/basic_auth.feature b/test_e2e/features/basic_auth.feature index ab06d86a..dd82b667 100644 --- a/test_e2e/features/basic_auth.feature +++ b/test_e2e/features/basic_auth.feature @@ -1,14 +1,16 @@ Feature: Login as superadmin using the basic authentification Scenario: Should be a success on valid credentials - Given I request "/login" with method "POST" with json + When I request "/login" with method "POST" with json | key | value | type | | email | admin-no-reply@badaas.com | string | | password | admin | string | Then I expect status code is "200" + And I expect response field "username" is "admin" + And I expect response field "email" is "admin-no-reply@badaas.com" Scenario: Should be an error on invalid credentials - Given I request "/login" with method "POST" with json + When I request "/login" with method "POST" with json | key | value | type | | email | admin-no-reply@badaas.com | string | | password | wrongpassword | string | @@ -22,9 +24,8 @@ Feature: Login as superadmin using the basic authentification | key | value | type | | email | admin-no-reply@badaas.com | string | | password | admin | string | + When I request "/logout" Then I expect status code is "200" - And I expect response field "username" is "admin" - And I expect response field "email" is "admin-no-reply@badaas.com" Scenario: Should be an error if we try to logout without login first When I request "/logout" diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index b1f5ec7c..7c33e110 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -33,7 +33,15 @@ func (t *TestContext) storeResponseInContext(response *http.Response) { log.Panic(err) } response.Body.Close() - json.Unmarshal(buffer, &t.json) + + if len(buffer) > 0 { + err = json.Unmarshal(buffer, &t.json) + if err != nil { + log.Panic(err) + } + } else { + t.json = map[string]any{} + } } func (t *TestContext) assertStatusCode(_ context.Context, expectedStatusCode int) error { @@ -42,11 +50,18 @@ func (t *TestContext) assertStatusCode(_ context.Context, expectedStatusCode int } return nil } + func (t *TestContext) assertResponseFieldIsEquals(field string, expectedValue string) error { - value := t.json[field].(string) - if !assertValue(value, expectedValue) { - return fmt.Errorf("expect response field %s is %s but is %s", field, expectedValue, value) + value, present := t.json[field] + if !present { + return fmt.Errorf("expected response field %s to be %s but it is not present", field, expectedValue) } + + valueString := value.(string) + if !assertValue(valueString, expectedValue) { + return fmt.Errorf("expected response field %s to be %s but is %s", field, expectedValue, valueString) + } + return nil } From 6b35a9a23275d5372396bb6f48917fff77b8386e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 19 Apr 2023 16:32:03 +0200 Subject: [PATCH 053/467] add first e2e test for eav model --- controllers/eav.go | 11 +-- examples/CRUD_birds.http | 16 +---- persistence/models/Entity.go | 7 ++ persistence/repository/EntityRepository.go | 7 +- services/eavservice/eavservice.go | 11 +-- test_e2e/badaas_e2e_test.go | 78 +++++++++++++++++++++- test_e2e/features/object_storage.feature | 16 +++++ test_e2e/http_support_test.go | 54 +++++++++++---- 8 files changed, 159 insertions(+), 41 deletions(-) create mode 100644 test_e2e/features/object_storage.feature diff --git a/controllers/eav.go b/controllers/eav.go index bd9f1717..7bbbec86 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -179,15 +179,14 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http return nil, ErrDBQueryFailed(err) } - var cr createReq - err = json.NewDecoder(r.Body).Decode(&cr) + var attrs map[string]any + err = json.NewDecoder(r.Body).Decode(&attrs) r.Body.Close() if err != nil { return nil, httperrors.NewBadRequestError("json decoding failed", "please use a correct json payload for entity creation") } - fmt.Println(cr) - et, err := controller.eavService.CreateEntity(ett, cr.Attrs) + et, err := controller.eavService.CreateEntity(ett, attrs) if err != nil { return nil, httperrors.NewInternalServerError("creation failed", "", err) } @@ -201,10 +200,6 @@ func buildLocationString(et *models.Entity) string { return fmt.Sprintf("/v1/objects/%s/%d", et.EntityType.Name, et.ID) } -type createReq struct { - Attrs map[string]interface{} -} - // The handler responsible for the updates of entities func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName := getEntityTypeNameFromRequest(r) diff --git a/examples/CRUD_birds.http b/examples/CRUD_birds.http index da921ace..9c027796 100644 --- a/examples/CRUD_birds.http +++ b/examples/CRUD_birds.http @@ -43,13 +43,11 @@ POST {{URI}}/objects/bird HTTP/1.1 content-type: application/json { -"attrs": { "color": "red", "specie": "aigle", "height": 106, "owner": 1 } -} ### @@ -58,11 +56,9 @@ POST {{URI}}/objects/bird HTTP/1.1 content-type: application/json { -"attrs": { "color": "orange", "specie": "bird with null field (field absent of the request)" } -} ### @@ -71,13 +67,11 @@ POST {{URI}}/objects/bird HTTP/1.1 content-type: application/json { -"attrs": { "color": "orange", "specie": "bird with null field", "height": 50, "weight": null } -} ### @@ -87,9 +81,7 @@ POST {{URI}}/objects/bird HTTP/1.1 content-type: application/json { - "attrs": { - "specie": "Should not end up in database" - } + "specie": "Should not end up in database" } ### @@ -100,10 +92,8 @@ POST {{URI}}/objects/bird HTTP/1.1 content-type: application/json { - "attrs": { - "color": null, - "specie": "Should not end up in database" - } + "color": null, + "specie": "Should not end up in database" } ### diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 79e50ea1..a397b181 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -19,6 +19,13 @@ type Entity struct { EntityType *EntityType } +func NewEntity(entityType *EntityType) *Entity { + return &Entity{ + EntityType: entityType, + EntityTypeID: entityType.ID, + } +} + // Encode the entity to json // use the [encoding/json.Marshaler] interface func (e *Entity) MarshalJSON() ([]byte, error) { diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index 36766704..37788034 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -58,7 +58,12 @@ func (r *EntityRepository) Save(entity *models.Entity) error { value.EntityID = uuid }) - r.valueRepository.Save(tx, entity.Fields) + if len(entity.Fields) > 0 { + err = r.valueRepository.Save(tx, entity.Fields) + if err != nil { + return err + } + } entity.ID = uuid return nil diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index c6de936d..07e2d1f4 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -3,6 +3,7 @@ package eavservice import ( "errors" "fmt" + "log" uuid "github.com/google/uuid" @@ -136,8 +137,10 @@ func (eavService *eavServiceImpl) GetEntity(ett *models.EntityType, id uuid.UUID } // Create a brand new entity -func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map[string]interface{}) (*models.Entity, error) { - var et models.Entity +func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map[string]any) (*models.Entity, error) { + log.Println(attrs) + // TODO si attr esta vacio da un error raro + et := models.NewEntity(ett) for _, a := range ett.Attributes { present := false @@ -219,9 +222,7 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map et.Fields = append(et.Fields, value) } - et.EntityType = ett - et.EntityTypeID = ett.ID - return &et, eavService.entityRepository.Save(&et) + return et, eavService.entityRepository.Save(et) } func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[string]interface{}) error { diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index 39e253dc..457f6293 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -1,6 +1,7 @@ package main import ( + "log" "net/http" "net/http/cookiejar" "os" @@ -9,7 +10,15 @@ import ( "github.com/cucumber/godog" "github.com/cucumber/godog/colors" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/persistence/gormdatabase" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services/auth/protocols/basicauth" + integrationtests "github.com/ditrit/badaas/test_integration" "github.com/spf13/pflag" + "github.com/spf13/viper" + "go.uber.org/zap" + "gorm.io/gorm" ) type TestContext struct { @@ -20,14 +29,81 @@ type TestContext struct { var opts = godog.Options{Output: colors.Colored(os.Stdout)} +// var testsCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ +// Run: injectDependencies, +// }) + +var db *gorm.DB + func init() { godog.BindCommandLineFlags("godog.", &opts) } -func TestMain(m *testing.M) { +func TestMain(_ *testing.M) { pflag.Parse() opts.Paths = pflag.Args() + // _, b, _, _ := runtime.Caller(0) + // basePath := filepath.Dir(b) + // viper.Set("config_path", path.Join(basePath, "e2e_test_config.yml")) + // commands.InitCommands(testsCfg) + + logger, _ := zap.NewDevelopment() + var err error + + viper.Set(configuration.DatabasePortKey, 26257) + viper.Set(configuration.DatabaseHostKey, "localhost") + viper.Set(configuration.DatabaseNameKey, "badaas_db") + viper.Set(configuration.DatabaseUsernameKey, "root") + viper.Set(configuration.DatabasePasswordKey, "postgres") + viper.Set(configuration.DatabaseSslmodeKey, "disable") + viper.Set(configuration.DatabaseRetryKey, 10) + viper.Set(configuration.DatabaseRetryDurationKey, 5) + db, err = gormdatabase.CreateDatabaseConnectionFromConfiguration( + logger, + configuration.NewDatabaseConfiguration(), + ) + if err != nil { + log.Fatalln("Unable to connect to database : ", err) + } + + integrationtests.SetupDB(db) + + adminUser := &models.User{ + Username: "admin", + Email: "admin-no-reply@badaas.com", + Password: basicauth.SaltAndHashPassword("admin"), + } + err = db.Create(&adminUser).Error + if err != nil { + log.Fatalln(err) + } + + profileType := &models.EntityType{ + Name: "profile", + } + displayNameAttr := &models.Attribute{ + EntityTypeID: profileType.ID, + Name: "displayName", + ValueType: models.StringValueType, + Required: false, + } + yearOfBirthAttr := &models.Attribute{ + EntityTypeID: profileType.ID, + Name: "yearOfBirth", + ValueType: models.IntValueType, + Required: false, + } + profileType.Attributes = append(profileType.Attributes, + displayNameAttr, + yearOfBirthAttr, + ) + + err = db.Create(&profileType).Error + if err != nil { + log.Fatalln(err) + } + status := godog.TestSuite{ Name: "godogs", ScenarioInitializer: InitializeScenario, diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature new file mode 100644 index 00000000..d15944b9 --- /dev/null +++ b/test_e2e/features/object_storage.feature @@ -0,0 +1,16 @@ +Feature: Saving and querying objects in the database using the EAV Model + Scenario: Objects can be created with CreateObject + When I request "/v1/objects/profile" with method "POST" with json + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + Then I expect status code is "200" + And I expect response field "type" is "profile" + And I expect response field "attrs.displayName" is "Jean Dupont" + And I expect response field "attrs.yearOfBirth" is "1997" + + # Scenario: Created objects can be obtained with GetAll + # When I request "/login" with method "POST" with json + # Then I expect status code is "200" + # And I expect response field "username" is "admin" + # And I expect response field "email" is "admin-no-reply@badaas.com" \ No newline at end of file diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 7c33e110..14ceb287 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -11,6 +11,7 @@ import ( "strings" "github.com/cucumber/godog" + "github.com/elliotchance/pie/v2" ) const BaseUrl = "http://localhost:8000" @@ -28,16 +29,16 @@ func (t *TestContext) requestGET(url string) error { func (t *TestContext) storeResponseInContext(response *http.Response) { t.statusCode = response.StatusCode - buffer, err := io.ReadAll(response.Body) - if err != nil { - log.Panic(err) - } - response.Body.Close() + if t.statusCode != 404 { + buffer, err := io.ReadAll(response.Body) + if err != nil { + log.Panic(err) + } + response.Body.Close() - if len(buffer) > 0 { err = json.Unmarshal(buffer, &t.json) if err != nil { - log.Panic(err) + t.json = map[string]any{} } } else { t.json = map[string]any{} @@ -52,21 +53,48 @@ func (t *TestContext) assertStatusCode(_ context.Context, expectedStatusCode int } func (t *TestContext) assertResponseFieldIsEquals(field string, expectedValue string) error { - value, present := t.json[field] + fields := strings.Split(field, ".") + jsonMap := t.json + + for _, field := range fields[:len(fields)-1] { + intValue, present := jsonMap[field] + if !present { + return fmt.Errorf("expected response field %s to be %s but it is not present", field, expectedValue) + } + jsonMap = intValue.(map[string]any) + } + + lastValue, present := jsonMap[pie.Last(fields)] if !present { return fmt.Errorf("expected response field %s to be %s but it is not present", field, expectedValue) } - valueString := value.(string) - if !assertValue(valueString, expectedValue) { - return fmt.Errorf("expected response field %s to be %s but is %s", field, expectedValue, valueString) + if !assertValue(lastValue, expectedValue) { + return fmt.Errorf("expected response field %s to be %s but is %v", field, expectedValue, lastValue) } return nil } -func assertValue(value string, expectedValue string) bool { - return expectedValue == value +func assertValue(value any, expectedValue string) bool { + switch value.(type) { + case string: + return expectedValue == value + case int: + expectedValueInt, err := strconv.Atoi(expectedValue) + if err != nil { + panic(err) + } + return expectedValueInt == value + case float64: + expectedValueFloat, err := strconv.ParseFloat(expectedValue, 64) + if err != nil { + panic(err) + } + return expectedValueFloat == value + default: + panic("unsupported format") + } } func (t *TestContext) requestWithJson(url, method string, jsonTable *godog.Table) error { From 9db014ac96153cbbbaa8cd48af7d70150a782c43 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 19 Apr 2023 17:05:04 +0200 Subject: [PATCH 054/467] add e2e test to query object --- controllers/eav.go | 1 + test_e2e/badaas_e2e_test.go | 12 +---- test_e2e/features/object_storage.feature | 16 ++++--- test_e2e/http_support_test.go | 60 +++++++++++++++++++----- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/controllers/eav.go b/controllers/eav.go index 7bbbec86..57aaedac 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -192,6 +192,7 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http } w.Header().Add("Location", buildLocationString(et)) + w.WriteHeader(http.StatusCreated) return et, nil } diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index 457f6293..ba939600 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -28,11 +28,6 @@ type TestContext struct { } var opts = godog.Options{Output: colors.Colored(os.Stdout)} - -// var testsCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ -// Run: injectDependencies, -// }) - var db *gorm.DB func init() { @@ -43,11 +38,6 @@ func TestMain(_ *testing.M) { pflag.Parse() opts.Paths = pflag.Args() - // _, b, _, _ := runtime.Caller(0) - // basePath := filepath.Dir(b) - // viper.Set("config_path", path.Join(basePath, "e2e_test_config.yml")) - // commands.InitCommands(testsCfg) - logger, _ := zap.NewDevelopment() var err error @@ -129,4 +119,6 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^I expect status code is "(\d+)"$`, t.assertStatusCode) ctx.Step(`^I expect response field "(.+)" is "(.+)"$`, t.assertResponseFieldIsEquals) ctx.Step(`^I request "(.+)" with method "(.+)" with json$`, t.requestWithJson) + ctx.Step(`^a "(.+)" object exists with properties$`, t.objectExists) + ctx.Step(`^I query a "(.+)" with the object id$`, t.queryWithObjectID) } diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature index d15944b9..466bcd88 100644 --- a/test_e2e/features/object_storage.feature +++ b/test_e2e/features/object_storage.feature @@ -4,13 +4,17 @@ Feature: Saving and querying objects in the database using the EAV Model | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | - Then I expect status code is "200" + Then I expect status code is "201" And I expect response field "type" is "profile" And I expect response field "attrs.displayName" is "Jean Dupont" And I expect response field "attrs.yearOfBirth" is "1997" - # Scenario: Created objects can be obtained with GetAll - # When I request "/login" with method "POST" with json - # Then I expect status code is "200" - # And I expect response field "username" is "admin" - # And I expect response field "email" is "admin-no-reply@badaas.com" \ No newline at end of file + Scenario: Created object can be queried + Given a "profile" object exists with properties + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + When I query a "profile" with the object id + Then I expect response field "type" is "profile" + And I expect response field "attrs.displayName" is "Jean Dupont" + And I expect response field "attrs.yearOfBirth" is "1997" \ No newline at end of file diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 14ceb287..9c805545 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -1,7 +1,6 @@ package main import ( - "context" "encoding/json" "fmt" "io" @@ -29,23 +28,19 @@ func (t *TestContext) requestGET(url string) error { func (t *TestContext) storeResponseInContext(response *http.Response) { t.statusCode = response.StatusCode - if t.statusCode != 404 { - buffer, err := io.ReadAll(response.Body) - if err != nil { - log.Panic(err) - } - response.Body.Close() + buffer, err := io.ReadAll(response.Body) + if err != nil { + log.Panic(err) + } + response.Body.Close() - err = json.Unmarshal(buffer, &t.json) - if err != nil { - t.json = map[string]any{} - } - } else { + err = json.Unmarshal(buffer, &t.json) + if err != nil { t.json = map[string]any{} } } -func (t *TestContext) assertStatusCode(_ context.Context, expectedStatusCode int) error { +func (t *TestContext) assertStatusCode(expectedStatusCode int) error { if t.statusCode != expectedStatusCode { return fmt.Errorf("expect status code %d but is %d", expectedStatusCode, t.statusCode) } @@ -209,3 +204,42 @@ func contains[T comparable](set []T, target T) bool { } return false } + +func (t *TestContext) objectExists(entityType string, jsonTable *godog.Table) error { + err := t.requestWithJson( + "/v1/objects/"+entityType, + "POST", + jsonTable, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(http.StatusCreated) + if err != nil { + return err + } + + return nil +} + +func (t *TestContext) queryWithObjectID(entityType string) error { + id, present := t.json["id"] + if !present { + panic("object id not available") + } + + err := t.requestGET( + "/v1/objects/" + entityType + "/" + id.(string), + ) + if err != nil { + return err + } + + err = t.assertStatusCode(200) + if err != nil { + return err + } + + return nil +} From 18a67352e5b64562e635312f9ade4cc1af37dba6 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 11:11:52 +0200 Subject: [PATCH 055/467] add e2e test to getAll --- persistence/ModuleFx.go | 2 +- persistence/gormdatabase/db.go | 26 ++++++-- router/router.go | 2 +- test_e2e/badaas_e2e_test.go | 85 +++++++++++++----------- test_e2e/features/object_storage.feature | 24 ++++++- test_e2e/http_support_test.go | 70 ++++++++++++++++--- 6 files changed, 149 insertions(+), 60 deletions(-) diff --git a/persistence/ModuleFx.go b/persistence/ModuleFx.go index a480f4a1..21cdf01a 100644 --- a/persistence/ModuleFx.go +++ b/persistence/ModuleFx.go @@ -19,7 +19,7 @@ import ( var PersistanceModule = fx.Module( "persistence", // Database connection - fx.Provide(gormdatabase.CreateDatabaseConnectionFromConfiguration), + fx.Provide(gormdatabase.SetupDatabaseConnection), // repositories fx.Provide(repository.NewCRUDRepository[models.Session, uuid.UUID]), diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index d1621f1e..c342a065 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -32,7 +32,25 @@ func createDsn(host, username, password, sslmode, dbname string, port int) strin ) } -// Initialize the database with using the database configuration +// Creates the database object with using the database configuration and exec the setup +func SetupDatabaseConnection(logger *zap.Logger, databaseConfiguration configuration.DatabaseConfiguration) (*gorm.DB, error) { + db, err := CreateDatabaseConnectionFromConfiguration(logger, databaseConfiguration) + if err != nil { + return nil, err + } + + err = AutoMigrate(logger, db) + if err != nil { + logger.Error("migration failed") + return nil, err + } + logger.Info("AutoMigration was executed successfully") + + return db, nil +} + +// Creates the database object with using the database configuration +// Should not be using directly func CreateDatabaseConnectionFromConfiguration(logger *zap.Logger, databaseConfiguration configuration.DatabaseConfiguration) (*gorm.DB, error) { dsn := createDsnFromConf(databaseConfiguration) var err error @@ -41,12 +59,6 @@ func CreateDatabaseConnectionFromConfiguration(logger *zap.Logger, databaseConfi database, err = initializeDBFromDsn(dsn, logger) if err == nil { logger.Sugar().Debugf("Database connection is active") - err = AutoMigrate(logger, database) - if err != nil { - logger.Error("migration failed") - return nil, err - } - logger.Info("AutoMigration was executed successfully") return database, err } logger.Sugar().Debugf("Database connection failed with error %q", err.Error()) diff --git a/router/router.go b/router/router.go index 706ee75b..62ea68f3 100644 --- a/router/router.go +++ b/router/router.go @@ -43,7 +43,7 @@ func SetupRouter( // CRUD router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.GetObject)).Methods("GET") // Get whole collection - router.HandleFunc("/v1/objects/{type}/", jsonController.Wrap(eavController.GetAll)).Methods("GET") + router.HandleFunc("/v1/objects/{type}", jsonController.Wrap(eavController.GetAll)).Methods("GET") router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.DeleteObject)).Methods("DELETE") router.HandleFunc("/v1/objects/{type}", jsonController.Wrap(eavController.CreateObject)).Methods("POST") router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.ModifyObject)).Methods("PUT") diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index ba939600..08ebe239 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -1,6 +1,7 @@ package main import ( + "context" "log" "net/http" "net/http/cookiejar" @@ -23,7 +24,7 @@ import ( type TestContext struct { statusCode int - json map[string]any + json any httpClient *http.Client } @@ -57,43 +58,6 @@ func TestMain(_ *testing.M) { log.Fatalln("Unable to connect to database : ", err) } - integrationtests.SetupDB(db) - - adminUser := &models.User{ - Username: "admin", - Email: "admin-no-reply@badaas.com", - Password: basicauth.SaltAndHashPassword("admin"), - } - err = db.Create(&adminUser).Error - if err != nil { - log.Fatalln(err) - } - - profileType := &models.EntityType{ - Name: "profile", - } - displayNameAttr := &models.Attribute{ - EntityTypeID: profileType.ID, - Name: "displayName", - ValueType: models.StringValueType, - Required: false, - } - yearOfBirthAttr := &models.Attribute{ - EntityTypeID: profileType.ID, - Name: "yearOfBirth", - ValueType: models.IntValueType, - Required: false, - } - profileType.Attributes = append(profileType.Attributes, - displayNameAttr, - yearOfBirthAttr, - ) - - err = db.Create(&profileType).Error - if err != nil { - log.Fatalln(err) - } - status := godog.TestSuite{ Name: "godogs", ScenarioInitializer: InitializeScenario, @@ -115,10 +79,55 @@ func InitializeScenario(ctx *godog.ScenarioContext) { Jar: jar, } + ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { + // clean db before each scenario + integrationtests.SetupDB(db) + + adminUser := &models.User{ + Username: "admin", + Email: "admin-no-reply@badaas.com", + Password: basicauth.SaltAndHashPassword("admin"), + } + err = db.Create(&adminUser).Error + if err != nil { + log.Fatalln(err) + } + + profileType := &models.EntityType{ + Name: "profile", + } + displayNameAttr := &models.Attribute{ + EntityTypeID: profileType.ID, + Name: "displayName", + ValueType: models.StringValueType, + Required: false, + } + yearOfBirthAttr := &models.Attribute{ + EntityTypeID: profileType.ID, + Name: "yearOfBirth", + ValueType: models.IntValueType, + Required: false, + } + profileType.Attributes = append(profileType.Attributes, + displayNameAttr, + yearOfBirthAttr, + ) + + err = db.Create(&profileType).Error + if err != nil { + log.Fatalln(err) + } + + return ctx, nil + }) + ctx.Step(`^I request "(.+)"$`, t.requestGET) ctx.Step(`^I expect status code is "(\d+)"$`, t.assertStatusCode) ctx.Step(`^I expect response field "(.+)" is "(.+)"$`, t.assertResponseFieldIsEquals) ctx.Step(`^I request "(.+)" with method "(.+)" with json$`, t.requestWithJson) ctx.Step(`^a "(.+)" object exists with properties$`, t.objectExists) ctx.Step(`^I query a "(.+)" with the object id$`, t.queryWithObjectID) + ctx.Step(`^I query all "(.+)" objects$`, t.queryAllObjects) + ctx.Step(`^there are "(\d+)" "(.+)" objects$`, t.thereAreObjects) + ctx.Step(`^there is a "(.+)" object with properties$`, t.thereIsObjectWithProperties) } diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature index 466bcd88..6ef5adac 100644 --- a/test_e2e/features/object_storage.feature +++ b/test_e2e/features/object_storage.feature @@ -9,7 +9,7 @@ Feature: Saving and querying objects in the database using the EAV Model And I expect response field "attrs.displayName" is "Jean Dupont" And I expect response field "attrs.yearOfBirth" is "1997" - Scenario: Created object can be queried + Scenario: Created object can be queried individually Given a "profile" object exists with properties | key | value | type | | displayName | Jean Dupont | string | @@ -17,4 +17,24 @@ Feature: Saving and querying objects in the database using the EAV Model When I query a "profile" with the object id Then I expect response field "type" is "profile" And I expect response field "attrs.displayName" is "Jean Dupont" - And I expect response field "attrs.yearOfBirth" is "1997" \ No newline at end of file + And I expect response field "attrs.yearOfBirth" is "1997" + + Scenario: Created objects can be queried together + Given a "profile" object exists with properties + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + And a "profile" object exists with properties + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | integer | + When I query all "profile" objects + Then there are "2" "profile" objects + And there is a "profile" object with properties + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | float | + And there is a "profile" object with properties + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | float | \ No newline at end of file diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 9c805545..e9df162f 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -6,6 +6,7 @@ import ( "io" "log" "net/http" + "reflect" "strconv" "strings" @@ -28,13 +29,7 @@ func (t *TestContext) requestGET(url string) error { func (t *TestContext) storeResponseInContext(response *http.Response) { t.statusCode = response.StatusCode - buffer, err := io.ReadAll(response.Body) - if err != nil { - log.Panic(err) - } - response.Body.Close() - - err = json.Unmarshal(buffer, &t.json) + err := json.NewDecoder(response.Body).Decode(&t.json) if err != nil { t.json = map[string]any{} } @@ -49,7 +44,7 @@ func (t *TestContext) assertStatusCode(expectedStatusCode int) error { func (t *TestContext) assertResponseFieldIsEquals(field string, expectedValue string) error { fields := strings.Split(field, ".") - jsonMap := t.json + jsonMap := t.json.(map[string]any) for _, field := range fields[:len(fields)-1] { intValue, present := jsonMap[field] @@ -114,8 +109,8 @@ func (t *TestContext) requestWithJson(url, method string, jsonTable *godog.Table return nil } -// build a json payload in the form of a reader from a godog.Table -func buildJSONFromTable(table *godog.Table) (io.Reader, error) { +// build a map from a godog.Table +func buildMapFromTable(table *godog.Table) (map[string]any, error) { data := make(map[string]any, 0) for indexRow, row := range table.Rows { if indexRow == 0 { @@ -158,6 +153,17 @@ func buildJSONFromTable(table *godog.Table) (io.Reader, error) { } } + + return data, nil +} + +// build a json payload in the form of a reader from a godog.Table +func buildJSONFromTable(table *godog.Table) (io.Reader, error) { + data, err := buildMapFromTable(table) + if err != nil { + panic("should not return an error") + } + bytes, err := json.Marshal(data) if err != nil { panic("should not return an error") @@ -224,7 +230,7 @@ func (t *TestContext) objectExists(entityType string, jsonTable *godog.Table) er } func (t *TestContext) queryWithObjectID(entityType string) error { - id, present := t.json["id"] + id, present := t.json.(map[string]any)["id"] if !present { panic("object id not available") } @@ -243,3 +249,45 @@ func (t *TestContext) queryWithObjectID(entityType string) error { return nil } + +func (t *TestContext) queryAllObjects(entityType string) error { + err := t.requestGET( + "/v1/objects/" + entityType, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(200) + if err != nil { + return err + } + + return nil +} + +func (t *TestContext) thereAreObjects(expectedAmount int, entityType string) error { + amount := len(t.json.([]any)) + if amount != expectedAmount { + return fmt.Errorf("expect amount %d, but there are %d objects of type %s", expectedAmount, amount, entityType) + } + + return nil +} + +func (t *TestContext) thereIsObjectWithProperties(entityType string, jsonTable *godog.Table) error { + listJson := t.json.([]any) + properties, err := buildMapFromTable(jsonTable) + if err != nil { + log.Fatalln(err) + } + + for _, object := range listJson { + objectMap := object.(map[string]any) + if objectMap["type"] == entityType && reflect.DeepEqual(objectMap["attrs"], properties) { + return nil + } + } + + return fmt.Errorf("object with properties %v not found in %v", properties, listJson) +} From 64df93fcbce85dec9cdfa8476c5b6c6acca46c82 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 11:57:28 +0200 Subject: [PATCH 056/467] add e2e test to query with params --- test_e2e/badaas_e2e_test.go | 3 +- test_e2e/features/object_storage.feature | 18 ++++++++ test_e2e/http_support_test.go | 53 +++++++++++++++++++++--- 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index 08ebe239..c21592bf 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -121,7 +121,7 @@ func InitializeScenario(ctx *godog.ScenarioContext) { return ctx, nil }) - ctx.Step(`^I request "(.+)"$`, t.requestGET) + ctx.Step(`^I request "(.+)"$`, t.requestGet) ctx.Step(`^I expect status code is "(\d+)"$`, t.assertStatusCode) ctx.Step(`^I expect response field "(.+)" is "(.+)"$`, t.assertResponseFieldIsEquals) ctx.Step(`^I request "(.+)" with method "(.+)" with json$`, t.requestWithJson) @@ -130,4 +130,5 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^I query all "(.+)" objects$`, t.queryAllObjects) ctx.Step(`^there are "(\d+)" "(.+)" objects$`, t.thereAreObjects) ctx.Step(`^there is a "(.+)" object with properties$`, t.thereIsObjectWithProperties) + ctx.Step(`^I query all "(.+)" objects with parameters$`, t.queryObjectsWithParameters) } diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature index 6ef5adac..e4921321 100644 --- a/test_e2e/features/object_storage.feature +++ b/test_e2e/features/object_storage.feature @@ -34,6 +34,24 @@ Feature: Saving and querying objects in the database using the EAV Model | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | float | + And there is a "profile" object with properties + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | float | + + Scenario: Created objects can be queried with parameters + Given a "profile" object exists with properties + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + And a "profile" object exists with properties + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | integer | + When I query all "profile" objects with parameters + | key | value | type | + | yearOfBirth | 2001 | string | + Then there are "1" "profile" objects And there is a "profile" object with properties | key | value | type | | displayName | Pierre Martin | string | diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index e9df162f..8a617295 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -16,10 +16,25 @@ import ( const BaseUrl = "http://localhost:8000" -func (t *TestContext) requestGET(url string) error { - response, err := t.httpClient.Get(fmt.Sprintf("%s%s", BaseUrl, url)) +func (t *TestContext) requestGet(url string) error { + return t.requestGetWithParams(url, nil) +} + +func (t *TestContext) requestGetWithParams(url string, query map[string]string) error { + request, err := http.NewRequest("GET", BaseUrl+url, nil) if err != nil { - return err + return fmt.Errorf("failed to build request ERROR=%s", err.Error()) + } + + q := request.URL.Query() + for k, v := range query { + q.Add(k, v) + } + request.URL.RawQuery = q.Encode() + + response, err := t.httpClient.Do(request) + if err != nil { + return fmt.Errorf("failed to run request ERROR=%s", err.Error()) } t.storeResponseInContext(response) @@ -101,6 +116,7 @@ func (t *TestContext) requestWithJson(url, method string, jsonTable *godog.Table if err != nil { return fmt.Errorf("failed to build request ERROR=%s", err.Error()) } + response, err := t.httpClient.Do(request) if err != nil { return fmt.Errorf("failed to run request ERROR=%s", err.Error()) @@ -235,7 +251,7 @@ func (t *TestContext) queryWithObjectID(entityType string) error { panic("object id not available") } - err := t.requestGET( + err := t.requestGet( "/v1/objects/" + entityType + "/" + id.(string), ) if err != nil { @@ -250,8 +266,35 @@ func (t *TestContext) queryWithObjectID(entityType string) error { return nil } +func (t *TestContext) queryObjectsWithParameters(entityType string, jsonTable *godog.Table) error { + jsonMap, err := buildMapFromTable(jsonTable) + if err != nil { + return err + } + + jsonMapString := map[string]string{} + for k, v := range jsonMap { + jsonMapString[k] = v.(string) + } + + err = t.requestGetWithParams( + "/v1/objects/"+entityType, + jsonMapString, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(200) + if err != nil { + return err + } + + return nil +} + func (t *TestContext) queryAllObjects(entityType string) error { - err := t.requestGET( + err := t.requestGet( "/v1/objects/" + entityType, ) if err != nil { From 97605594a9a457ebe3c588b02e2af004bb0cb69a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 11:59:28 +0200 Subject: [PATCH 057/467] refacto test e2e --- test_e2e/badaas_e2e_test.go | 4 ++-- test_e2e/features/api_info.feature | 6 +++--- test_e2e/features/basic_auth.feature | 24 ++++++++++++------------ test_e2e/features/object_storage.feature | 14 +++++++------- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index c21592bf..aea9a81d 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -122,8 +122,8 @@ func InitializeScenario(ctx *godog.ScenarioContext) { }) ctx.Step(`^I request "(.+)"$`, t.requestGet) - ctx.Step(`^I expect status code is "(\d+)"$`, t.assertStatusCode) - ctx.Step(`^I expect response field "(.+)" is "(.+)"$`, t.assertResponseFieldIsEquals) + ctx.Step(`^status code is "(\d+)"$`, t.assertStatusCode) + ctx.Step(`^response field "(.+)" is "(.+)"$`, t.assertResponseFieldIsEquals) ctx.Step(`^I request "(.+)" with method "(.+)" with json$`, t.requestWithJson) ctx.Step(`^a "(.+)" object exists with properties$`, t.objectExists) ctx.Step(`^I query a "(.+)" with the object id$`, t.queryWithObjectID) diff --git a/test_e2e/features/api_info.feature b/test_e2e/features/api_info.feature index f7b6790f..d992db54 100644 --- a/test_e2e/features/api_info.feature +++ b/test_e2e/features/api_info.feature @@ -2,6 +2,6 @@ Feature: Test info controller Scenario: Server should return ok and current project version When I request "/info" - Then I expect status code is "200" - And I expect response field "status" is "OK" - And I expect response field "version" is "UNRELEASED" + Then status code is "200" + And response field "status" is "OK" + And response field "version" is "UNRELEASED" diff --git a/test_e2e/features/basic_auth.feature b/test_e2e/features/basic_auth.feature index dd82b667..4900885e 100644 --- a/test_e2e/features/basic_auth.feature +++ b/test_e2e/features/basic_auth.feature @@ -5,19 +5,19 @@ Feature: Login as superadmin using the basic authentification | key | value | type | | email | admin-no-reply@badaas.com | string | | password | admin | string | - Then I expect status code is "200" - And I expect response field "username" is "admin" - And I expect response field "email" is "admin-no-reply@badaas.com" + Then status code is "200" + And response field "username" is "admin" + And response field "email" is "admin-no-reply@badaas.com" Scenario: Should be an error on invalid credentials When I request "/login" with method "POST" with json | key | value | type | | email | admin-no-reply@badaas.com | string | | password | wrongpassword | string | - Then I expect status code is "401" - And I expect response field "err" is "wrong password" - And I expect response field "msg" is "the provided password is incorrect" - And I expect response field "status" is "Unauthorized" + Then status code is "401" + And response field "err" is "wrong password" + And response field "msg" is "the provided password is incorrect" + And response field "status" is "Unauthorized" Scenario: Should be a success if we logout after a successful login Given I request "/login" with method "POST" with json @@ -25,11 +25,11 @@ Feature: Login as superadmin using the basic authentification | email | admin-no-reply@badaas.com | string | | password | admin | string | When I request "/logout" - Then I expect status code is "200" + Then status code is "200" Scenario: Should be an error if we try to logout without login first When I request "/logout" - Then I expect status code is "401" - And I expect response field "err" is "Authentification Error" - And I expect response field "msg" is "not authenticated" - And I expect response field "status" is "Unauthorized" + Then status code is "401" + And response field "err" is "Authentification Error" + And response field "msg" is "not authenticated" + And response field "status" is "Unauthorized" diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature index e4921321..ec52030d 100644 --- a/test_e2e/features/object_storage.feature +++ b/test_e2e/features/object_storage.feature @@ -4,10 +4,10 @@ Feature: Saving and querying objects in the database using the EAV Model | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | - Then I expect status code is "201" - And I expect response field "type" is "profile" - And I expect response field "attrs.displayName" is "Jean Dupont" - And I expect response field "attrs.yearOfBirth" is "1997" + Then status code is "201" + And response field "type" is "profile" + And response field "attrs.displayName" is "Jean Dupont" + And response field "attrs.yearOfBirth" is "1997" Scenario: Created object can be queried individually Given a "profile" object exists with properties @@ -15,9 +15,9 @@ Feature: Saving and querying objects in the database using the EAV Model | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | When I query a "profile" with the object id - Then I expect response field "type" is "profile" - And I expect response field "attrs.displayName" is "Jean Dupont" - And I expect response field "attrs.yearOfBirth" is "1997" + Then response field "type" is "profile" + And response field "attrs.displayName" is "Jean Dupont" + And response field "attrs.yearOfBirth" is "1997" Scenario: Created objects can be queried together Given a "profile" object exists with properties From 20495ae74cf596164f5e5a24a5aeba2a46280df0 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 12:22:38 +0200 Subject: [PATCH 058/467] add e2e test for object deletion --- test_e2e/badaas_e2e_test.go | 1 + test_e2e/features/object_storage.feature | 11 ++- test_e2e/http_support_test.go | 100 +++++++++++++---------- 3 files changed, 66 insertions(+), 46 deletions(-) diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index aea9a81d..fb7f6b2e 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -131,4 +131,5 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^there are "(\d+)" "(.+)" objects$`, t.thereAreObjects) ctx.Step(`^there is a "(.+)" object with properties$`, t.thereIsObjectWithProperties) ctx.Step(`^I query all "(.+)" objects with parameters$`, t.queryObjectsWithParameters) + ctx.Step(`^I delete a "(.+)" with the object id$`, t.deleteWithObjectID) } diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature index ec52030d..7e4b0317 100644 --- a/test_e2e/features/object_storage.feature +++ b/test_e2e/features/object_storage.feature @@ -55,4 +55,13 @@ Feature: Saving and querying objects in the database using the EAV Model And there is a "profile" object with properties | key | value | type | | displayName | Pierre Martin | string | - | yearOfBirth | 2001 | float | \ No newline at end of file + | yearOfBirth | 2001 | float | + + Scenario: Created objects can be deleted + Given a "profile" object exists with properties + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + When I delete a "profile" with the object id + And I query all "profile" objects + Then there are "0" "profile" objects \ No newline at end of file diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 8a617295..e5504277 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -17,11 +17,28 @@ import ( const BaseUrl = "http://localhost:8000" func (t *TestContext) requestGet(url string) error { - return t.requestGetWithParams(url, nil) + return t.request(url, http.MethodGet, nil, nil) } -func (t *TestContext) requestGetWithParams(url string, query map[string]string) error { - request, err := http.NewRequest("GET", BaseUrl+url, nil) +func (t *TestContext) requestWithJson(url, method string, jsonTable *godog.Table) error { + return t.request(url, method, nil, jsonTable) +} + +func (t *TestContext) request(url, method string, query map[string]string, jsonTable *godog.Table) error { + var payload io.Reader + var err error + if jsonTable != nil { + payload, err = buildJSONFromTable(jsonTable) + if err != nil { + return err + } + } + + method, err = checkMethod(method) + if err != nil { + return err + } + request, err := http.NewRequest(method, BaseUrl+url, payload) if err != nil { return fmt.Errorf("failed to build request ERROR=%s", err.Error()) } @@ -36,7 +53,6 @@ func (t *TestContext) requestGetWithParams(url string, query map[string]string) if err != nil { return fmt.Errorf("failed to run request ERROR=%s", err.Error()) } - t.storeResponseInContext(response) return nil } @@ -102,29 +118,6 @@ func assertValue(value any, expectedValue string) bool { } } -func (t *TestContext) requestWithJson(url, method string, jsonTable *godog.Table) error { - payload, err := buildJSONFromTable(jsonTable) - if err != nil { - return err - } - - method, err = checkMethod(method) - if err != nil { - return err - } - request, err := http.NewRequest(method, BaseUrl+url, payload) - if err != nil { - return fmt.Errorf("failed to build request ERROR=%s", err.Error()) - } - - response, err := t.httpClient.Do(request) - if err != nil { - return fmt.Errorf("failed to run request ERROR=%s", err.Error()) - } - t.storeResponseInContext(response) - return nil -} - // build a map from a godog.Table func buildMapFromTable(table *godog.Table) (map[string]any, error) { data := make(map[string]any, 0) @@ -207,30 +200,21 @@ func checkMethod(method string) (string, error) { http.MethodOptions, http.MethodTrace} sanitizedMethod := strings.TrimSpace(strings.ToUpper(method)) - if !contains( + if !pie.Contains( allowedMethods, sanitizedMethod, ) { return "", fmt.Errorf("%q is not a valid HTTP method (please choose between %v)", method, allowedMethods) } - return sanitizedMethod, nil - -} -// return true if the set contains the target -func contains[T comparable](set []T, target T) bool { - for _, elem := range set { - if target == elem { - return true - } - } - return false + return sanitizedMethod, nil } func (t *TestContext) objectExists(entityType string, jsonTable *godog.Table) error { - err := t.requestWithJson( + err := t.request( "/v1/objects/"+entityType, - "POST", + http.MethodPost, + nil, jsonTable, ) if err != nil { @@ -258,7 +242,7 @@ func (t *TestContext) queryWithObjectID(entityType string) error { return err } - err = t.assertStatusCode(200) + err = t.assertStatusCode(http.StatusOK) if err != nil { return err } @@ -277,15 +261,17 @@ func (t *TestContext) queryObjectsWithParameters(entityType string, jsonTable *g jsonMapString[k] = v.(string) } - err = t.requestGetWithParams( + err = t.request( "/v1/objects/"+entityType, + http.MethodGet, jsonMapString, + nil, ) if err != nil { return err } - err = t.assertStatusCode(200) + err = t.assertStatusCode(http.StatusOK) if err != nil { return err } @@ -301,7 +287,7 @@ func (t *TestContext) queryAllObjects(entityType string) error { return err } - err = t.assertStatusCode(200) + err = t.assertStatusCode(http.StatusOK) if err != nil { return err } @@ -334,3 +320,27 @@ func (t *TestContext) thereIsObjectWithProperties(entityType string, jsonTable * return fmt.Errorf("object with properties %v not found in %v", properties, listJson) } + +func (t *TestContext) deleteWithObjectID(entityType string) error { + id, present := t.json.(map[string]any)["id"] + if !present { + panic("object id not available") + } + + err := t.request( + "/v1/objects/"+entityType+"/"+id.(string), + http.MethodDelete, + nil, + nil, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(http.StatusOK) + if err != nil { + return err + } + + return nil +} From c89ca26877e526daabc17ecdffc01eff09780bb6 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 12:36:11 +0200 Subject: [PATCH 059/467] add e2e test for modify objects --- controllers/eav.go | 11 +++-------- test_e2e/badaas_e2e_test.go | 1 + test_e2e/features/object_storage.feature | 15 ++++++++++++++- test_e2e/http_support_test.go | 24 ++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 9 deletions(-) diff --git a/controllers/eav.go b/controllers/eav.go index 57aaedac..06629030 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -229,14 +229,13 @@ func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http } } - var mr modifyReq - err = json.NewDecoder(r.Body).Decode(&mr) + var attrs map[string]any + err = json.NewDecoder(r.Body).Decode(&attrs) if err != nil { return nil, ErrDBQueryFailed(err) } - fmt.Println(mr.Attrs) - controller.eavService.UpdateEntity(entity, mr.Attrs) + controller.eavService.UpdateEntity(entity, attrs) return entity, nil } @@ -248,7 +247,3 @@ func GetErrMsg(msg string) string { msg, ) } - -type modifyReq struct { - Attrs map[string]interface{} -} diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index fb7f6b2e..d4305877 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -132,4 +132,5 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^there is a "(.+)" object with properties$`, t.thereIsObjectWithProperties) ctx.Step(`^I query all "(.+)" objects with parameters$`, t.queryObjectsWithParameters) ctx.Step(`^I delete a "(.+)" with the object id$`, t.deleteWithObjectID) + ctx.Step(`^I modify a "(.+)" with properties$`, t.modifyWithProperties) } diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature index 7e4b0317..09ec7367 100644 --- a/test_e2e/features/object_storage.feature +++ b/test_e2e/features/object_storage.feature @@ -64,4 +64,17 @@ Feature: Saving and querying objects in the database using the EAV Model | yearOfBirth | 1997 | integer | When I delete a "profile" with the object id And I query all "profile" objects - Then there are "0" "profile" objects \ No newline at end of file + Then there are "0" "profile" objects + + Scenario: Created objects can be modified + Given a "profile" object exists with properties + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + When I modify a "profile" with properties + | key | value | type | + | yearOfBirth | 1998 | integer | + And I query a "profile" with the object id + Then response field "type" is "profile" + And response field "attrs.displayName" is "Jean Dupont" + And response field "attrs.yearOfBirth" is "1998" \ No newline at end of file diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index e5504277..4467abf7 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -344,3 +344,27 @@ func (t *TestContext) deleteWithObjectID(entityType string) error { return nil } + +func (t *TestContext) modifyWithProperties(entityType string, jsonTable *godog.Table) error { + id, present := t.json.(map[string]any)["id"] + if !present { + panic("object id not available") + } + + err := t.request( + "/v1/objects/"+entityType+"/"+id.(string), + http.MethodPut, + nil, + jsonTable, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(http.StatusOK) + if err != nil { + return err + } + + return nil +} From c4fa0d3c1742435c7718390b9ee0b285165e3006 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 15:52:36 +0200 Subject: [PATCH 060/467] do not show cover always --- .github/workflows/CI.yml | 4 ++-- Makefile | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index fac8c94a..89ad3b2f 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -31,7 +31,7 @@ jobs: go-version: '^1.18' cache: true - name: Run test - run: make test_unit + run: make test_unit_and_cover - uses: actions/upload-artifact@v3 with: name: coverage_unit @@ -70,7 +70,7 @@ jobs: go-version: '^1.18' cache: true - name: Run test - run: make test_integration + run: make test_integration_and_cover - uses: actions/upload-artifact@v3 with: name: coverage_int diff --git a/Makefile b/Makefile index f64523b6..fb99e947 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,16 @@ PATHS = $(shell go list ./... | tail -n +2 | grep -v test_integration | grep -v test_e2e) test_unit: + go test $(PATHS) -v + +test_unit_and_cover: go test $(PATHS) -coverpkg=./... -coverprofile=coverage_unit.out -v test_integration: + docker compose -f "docker/test_db/docker-compose.yml" up -d + go test ./test_integration -v + +test_integration_and_cover: docker compose -f "docker/test_db/docker-compose.yml" up -d go test ./test_integration -coverpkg=./... -coverprofile=coverage_int.out -v From f23c328b789bc5699db4e3a78ce7a17d8d03e65c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 15:53:32 +0200 Subject: [PATCH 061/467] add value unit tests + refactor --- persistence/models/Session_test.go | 9 +- persistence/models/Value.go | 227 ++++------------------------- persistence/models/Value_test.go | 222 ++++++++++++++++++++++++++++ services/eavservice/eavservice.go | 6 +- 4 files changed, 256 insertions(+), 208 deletions(-) create mode 100644 persistence/models/Value_test.go diff --git a/persistence/models/Session_test.go b/persistence/models/Session_test.go index a1fdd240..85e2e878 100644 --- a/persistence/models/Session_test.go +++ b/persistence/models/Session_test.go @@ -1,15 +1,14 @@ -package models_test +package models import ( "testing" "time" - "github.com/ditrit/badaas/persistence/models" "github.com/stretchr/testify/assert" ) func TestExpired(t *testing.T) { - sessionInstance := &models.Session{ + sessionInstance := &Session{ ExpiresAt: time.Now().Add(time.Second), } assert.False(t, sessionInstance.IsExpired()) @@ -19,7 +18,7 @@ func TestExpired(t *testing.T) { func TestCanBeRolled(t *testing.T) { sessionDuration := 500 * time.Millisecond - sessionInstance := &models.Session{ + sessionInstance := &Session{ ExpiresAt: time.Now().Add(sessionDuration), } assert.False(t, sessionInstance.CanBeRolled(sessionDuration/4)) @@ -28,5 +27,5 @@ func TestCanBeRolled(t *testing.T) { } func TestTableName(t *testing.T) { - assert.Equal(t, "sessions", models.Session{}.TableName()) + assert.Equal(t, "sessions", Session{}.TableName()) } diff --git a/persistence/models/Value.go b/persistence/models/Value.go index e779411f..11b9f98a 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -1,13 +1,10 @@ package models import ( - "encoding/json" "errors" "fmt" uuid "github.com/google/uuid" - - "gorm.io/gorm" ) // Describe the attribute value of an Entity @@ -26,54 +23,36 @@ type Value struct { Attribute *Attribute } -var ( - ErrValueIsNull = errors.New("you can't get the value from a null Value") - ErrAskingForWrongType = errors.New("you can't get this type of value, the attribute type doesn't match") -) +var ErrAskingForWrongType = errors.New("attribute type doesn't match") // Create a new null value func NewNullValue(attr *Attribute) (*Value, error) { - if attr.Required { - return nil, fmt.Errorf("can't create new null value for a required attribute") - } - - return &Value{IsNull: true, Attribute: attr, AttributeID: attr.ID}, nil + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetNull() } // Create a new int value func NewIntValue(attr *Attribute, i int) (*Value, error) { - if attr.ValueType != IntValueType { - return nil, fmt.Errorf("can't create a new int value with a %s attribute", attr.ValueType) - } - - return &Value{IntVal: i, Attribute: attr, AttributeID: attr.ID}, nil + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetIntVal(i) } // Create a new bool value func NewBoolValue(attr *Attribute, b bool) (*Value, error) { - if attr.ValueType != BooleanValueType { - return nil, fmt.Errorf("can't create a new bool value with a %s attribute", attr.ValueType) - } - - return &Value{BoolVal: b, Attribute: attr, AttributeID: attr.ID}, nil + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetBooleanVal(b) } // Create a new float value func NewFloatValue(attr *Attribute, f float64) (*Value, error) { - if attr.ValueType != FloatValueType { - return nil, fmt.Errorf("can't create a new float value with a %s attribute", attr.ValueType) - } - - return &Value{FloatVal: f, Attribute: attr, AttributeID: attr.ID}, nil + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetFloatVal(f) } // Create a new string value func NewStringValue(attr *Attribute, s string) (*Value, error) { - if attr.ValueType != StringValueType { - return nil, fmt.Errorf("can't create a new string value with a %s attribute", attr.ValueType) - } - - return &Value{StringVal: s, Attribute: attr, AttributeID: attr.ID}, nil + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetStringVal(s) } // Create a new relation value. @@ -85,8 +64,8 @@ func NewRelationValue(attr *Attribute, et *Entity) (*Value, error) { } if et.EntityType.ID != attr.RelationTargetEntityTypeID { return nil, fmt.Errorf( - "can't create a relation with an entity of wrong EntityType. (got the entityid=%d, expected=%d)", - et.EntityType.ID, attr.RelationTargetEntityTypeID, + "can't create a relation with an entity of wrong EntityType (got the entityTypeID=%s, expected=%s)", + et.EntityType.ID.String(), attr.RelationTargetEntityTypeID.String(), ) } @@ -97,11 +76,8 @@ func NewRelationValue(attr *Attribute, et *Entity) (*Value, error) { // If et is nil, then the function returns an error // If et is of the wrong types, then the function returns an error func NewRelationIDValue(attr *Attribute, uuidVal uuid.UUID) (*Value, error) { - if attr.ValueType != RelationValueType { - return nil, fmt.Errorf("can't create a new relation value with a %s attribute", attr.ValueType) - } - - return &Value{RelationVal: uuidVal, Attribute: attr, AttributeID: attr.ID}, nil + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetRelationVal(uuidVal) } // Check if the Value is whole. eg, no fields are nil @@ -113,148 +89,6 @@ func (v *Value) CheckWhole() error { return nil } -// Return the string value -// If the Value is null, it return ErrValueIsNull -// If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribute == nil, it panic -func (v *Value) GetStringVal() (string, error) { - err := v.CheckWhole() - if err != nil { - return "", err - } - - if v.Attribute.ValueType != StringValueType { - return "", ErrAskingForWrongType - } - - if v.IsNull { - if v.Attribute.Default { - return v.Attribute.DefaultString, nil - } - return "", ErrValueIsNull - } - - return v.StringVal, nil -} - -// Return the float value -// If the Value is null, it return ErrValueIsNull -// If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribute == nil, it panic -func (v *Value) GetFloatVal() (float64, error) { - err := v.CheckWhole() - if err != nil { - return 0.0, err - } - - if v.Attribute.ValueType != FloatValueType { - return 0.0, ErrAskingForWrongType - } - - if v.IsNull { - if v.Attribute.Default { - return v.Attribute.DefaultFloat, nil - } - return 0.0, ErrValueIsNull - } - - return v.FloatVal, nil -} - -// Return the int value -// If the Value is null, it return ErrValueIsNull -// If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribute == nil, it panic -func (v *Value) GetIntVal() (int, error) { - err := v.CheckWhole() - if err != nil { - return 0, err - } - - if v.Attribute.ValueType != IntValueType { - return 0, ErrAskingForWrongType - } - - if v.IsNull { - if v.Attribute.Default { - return v.Attribute.DefaultInt, nil - } - return 0, ErrValueIsNull - } - - return v.IntVal, nil -} - -// Return the bool value -// If the Value is null, it return ErrValueIsNull -// If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribute == nil, it panic -func (v *Value) GetBoolVal() (bool, error) { - err := v.CheckWhole() - if err != nil { - return false, err - } - - if v.Attribute.ValueType != BooleanValueType { - return false, ErrAskingForWrongType - } - - if v.IsNull { - if v.Attribute.Default { - return v.Attribute.DefaultBool, nil - } - return false, ErrValueIsNull - } - - return v.BoolVal, nil -} - -// Return the Relation value as a *Entity -// If the Value is null, it return nil -// If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribute == nil, it panic -func (v *Value) GetComputedRelationVal(db *gorm.DB) (*Entity, error) { - err := v.CheckWhole() - if err != nil { - return nil, err - } - - if v.Attribute.ValueType != RelationValueType { - return nil, ErrAskingForWrongType - } - - if v.IsNull { - return nil, nil - } - var et Entity - err = db.Preload("Fields").Preload("Fields.attribute").Preload("EntityType.Attributes").Preload("EntityType").First(&et, v.RelationVal).Error - if err != nil { - return nil, err - } - return &et, nil -} - -// Return the Relation value as an uint (returns the ID) -// If the Value is null, it return nil -// If the Value not of the requested type, it return ErrAskingForWrongType -// If the Value.Attribute == nil, it panic -func (v *Value) GetRelationVal() (uuid.UUID, error) { - err := v.CheckWhole() - if err != nil { - return uuid.Nil, err - } - - if v.Attribute.ValueType != RelationValueType { - return uuid.Nil, ErrAskingForWrongType - } - - if v.IsNull { - return uuid.Nil, fmt.Errorf("the relation is null") - } - - return v.RelationVal, nil -} - // Return the underlying value as an interface func (v *Value) Value() any { if v.IsNull { @@ -280,13 +114,24 @@ func (v *Value) Value() any { } } -func (v *Value) SetNull() { +func (v *Value) SetNull() error { + err := v.CheckWhole() + if err != nil { + return err + } + + if v.Attribute.Required { + return fmt.Errorf("can't set null value for a required attribute") + } + v.IsNull = true v.IntVal = 0 v.FloatVal = 0.0 v.StringVal = "" v.BoolVal = false v.RelationVal = uuid.Nil + + return nil } func (v *Value) SetStringVal(stringVal string) error { @@ -369,24 +214,6 @@ func (v *Value) SetRelationVal(relationVal uuid.UUID) error { return nil } -var ErrCantBuildKVPairForNullValue = errors.New("can't build key/value pair from null value") // When Value isNull, it is impossible to build a Key/Value pair - -// Build a key/value pair to be included in a JSON -// If the value hold an int=8 with an attribute named "voila" then the string returned will be `"voila":8` -func (v *Value) BuildJSONKVPair() (string, error) { - err := v.CheckWhole() - if err != nil { - return "", err - } - - bytes, err := json.Marshal(v.Value()) - if err != nil { - return "", fmt.Errorf("an error happened while trying to marshall the %q attr: (%w)", v.Attribute.Name, err) - } - - return fmt.Sprintf("%q:%s", v.Attribute.Name, bytes), nil -} - func (v Value) Equal(other Value) bool { return v.ID == other.ID && v.AttributeID == other.AttributeID && diff --git a/persistence/models/Value_test.go b/persistence/models/Value_test.go new file mode 100644 index 00000000..b79aa326 --- /dev/null +++ b/persistence/models/Value_test.go @@ -0,0 +1,222 @@ +package models + +import ( + "fmt" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +func TestRelationValueNeedsEntity(t *testing.T) { + brandEtt := &EntityType{ + Name: "brand", + } + + carEtt := &EntityType{ + Name: "car", + } + brandAttr := NewRelationAttribute(carEtt, "brand", false, true, brandEtt) + carEtt.Attributes = []*Attribute{brandAttr} + + _, err := NewRelationValue(brandAttr, nil) + assert.Error(t, err, "can't create a new relation with a nil entity pointer") +} + +func TestRelationValueEntityHasToBeTheTargetOfTheAttribute(t *testing.T) { + brandEttID := uuid.New() + carEttID := uuid.New() + + brandEtt := &EntityType{ + BaseModel: BaseModel{ + ID: brandEttID, + }, + Name: "brand", + } + + carEtt := &EntityType{ + BaseModel: BaseModel{ + ID: carEttID, + }, + Name: "car", + } + brandAttr := NewRelationAttribute(carEtt, "brand", false, true, brandEtt) + carEtt.Attributes = []*Attribute{brandAttr} + + car := &Entity{ + EntityType: carEtt, + } + + _, err := NewRelationValue(brandAttr, car) + assert.Error( + t, err, + fmt.Sprintf( + "can't create a relation with an entity of wrong EntityType (got the entityTypeID=%s, expected=%s)", + carEttID.String(), + brandEttID.String(), + ), + ) +} + +func TestRelationValueWithCorrespondingEntity(t *testing.T) { + brandEtt := &EntityType{ + BaseModel: BaseModel{ + ID: uuid.New(), + }, + Name: "brand", + } + + carEtt := &EntityType{ + BaseModel: BaseModel{ + ID: uuid.New(), + }, + Name: "car", + } + brandAttr := NewRelationAttribute(carEtt, "brand", false, true, brandEtt) + carEtt.Attributes = []*Attribute{brandAttr} + + brand := &Entity{ + EntityType: brandEtt, + } + + value, err := NewRelationValue(brandAttr, brand) + assert.Nil(t, err) + + assert.Equal(t, value.Value(), brand.ID) +} + +func TestNewNullValueRespondErrorIfAttributeIsRequired(t *testing.T) { + requiredAttr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + Required: true, + } + + _, err := NewNullValue(requiredAttr) + assert.Error(t, err, "can't create new null value for a required attribute") +} + +func TestNewNullValueWorksIfAttributeIsNotRequired(t *testing.T) { + notRequiredAttr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + Required: false, + } + + value, err := NewNullValue(notRequiredAttr) + assert.Nil(t, err) + assert.Nil(t, value.Value()) +} + +func TestNewIntValueRespondErrorIsAttributeIfNotIntType(t *testing.T) { + stringAttr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + } + + _, err := NewIntValue(stringAttr, 5) + assert.ErrorIs(t, err, ErrAskingForWrongType) +} + +func TestNewIntValueWorks(t *testing.T) { + intAttr := &Attribute{ + Name: "attr", + ValueType: IntValueType, + } + + value, err := NewIntValue(intAttr, 5) + assert.Nil(t, err) + assert.Equal(t, value.Value(), 5) +} + +func TestNewFloatValueRespondErrorIsAttributeIfNotFloatType(t *testing.T) { + stringAttr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + } + + _, err := NewFloatValue(stringAttr, 5.5) + assert.ErrorIs(t, err, ErrAskingForWrongType) +} + +func TestNewFloatValueWorks(t *testing.T) { + attr := &Attribute{ + Name: "attr", + ValueType: FloatValueType, + } + + value, err := NewFloatValue(attr, 5.5) + assert.Nil(t, err) + assert.Equal(t, value.Value(), 5.5) +} + +func TestNewBoolValueRespondErrorIsAttributeIfNotBoolType(t *testing.T) { + stringAttr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + } + + _, err := NewBoolValue(stringAttr, true) + assert.ErrorIs(t, err, ErrAskingForWrongType) +} + +func TestNewBoolValueWorks(t *testing.T) { + attr := &Attribute{ + Name: "attr", + ValueType: BooleanValueType, + } + + value, err := NewBoolValue(attr, true) + assert.Nil(t, err) + assert.Equal(t, value.Value(), true) +} + +func TestNewStringValueRespondErrorIsAttributeIfNotStringType(t *testing.T) { + boolAttr := &Attribute{ + Name: "attr", + ValueType: BooleanValueType, + } + + _, err := NewStringValue(boolAttr, "salut") + assert.ErrorIs(t, err, ErrAskingForWrongType) +} + +func TestNewStringValueWorks(t *testing.T) { + attr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + } + + value, err := NewStringValue(attr, "salut") + assert.Nil(t, err) + assert.Equal(t, value.Value(), "salut") +} + +func TestNewRelationValueRespondErrorIsAttributeIfNotRelationType(t *testing.T) { + brandEtt := &EntityType{ + Name: "brand", + } + brand := &Entity{ + EntityType: brandEtt, + } + + boolAttr := &Attribute{ + Name: "attr", + ValueType: BooleanValueType, + } + + _, err := NewRelationValue(boolAttr, brand) + assert.ErrorIs(t, err, ErrAskingForWrongType) +} + +func TestSetNullWorks(t *testing.T) { + attr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + } + + value, err := NewStringValue(attr, "salut") + assert.Nil(t, err) + value.SetNull() + assert.Nil(t, value.Value()) +} diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 07e2d1f4..8febd8b1 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -271,10 +271,10 @@ func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[stri return err } case nil: - if attribute.Required { - return fmt.Errorf("can't set a required variable to null") + err := value.SetNull() + if err != nil { + return err } - value.SetNull() default: return fmt.Errorf("unsupported type") From 9ce9840c28c070d8417557d2b55acedde163163e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 16:08:24 +0200 Subject: [PATCH 062/467] fix typo --- controllers/ModuleFx.go | 2 +- controllers/basicAuth.go | 20 +++++++++----------- controllers/basicAuth_test.go | 8 ++++---- router/router.go | 2 +- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/controllers/ModuleFx.go b/controllers/ModuleFx.go index 520332cf..ed5af211 100644 --- a/controllers/ModuleFx.go +++ b/controllers/ModuleFx.go @@ -6,6 +6,6 @@ import "go.uber.org/fx" var ControllerModule = fx.Module( "controllers", fx.Provide(NewInfoController), - fx.Provide(NewBasicAuthentificationController), + fx.Provide(NewBasicAuthenticationController), fx.Provide(NewEAVController), ) diff --git a/controllers/basicAuth.go b/controllers/basicAuth.go index 798d3db7..5b786486 100644 --- a/controllers/basicAuth.go +++ b/controllers/basicAuth.go @@ -22,29 +22,27 @@ var ( ) ) -// Basic Authentification Controller -type BasicAuthentificationController interface { +type BasicAuthenticationController interface { BasicLoginHandler(http.ResponseWriter, *http.Request) (any, httperrors.HTTPError) Logout(http.ResponseWriter, *http.Request) (any, httperrors.HTTPError) } // Check interface compliance -var _ BasicAuthentificationController = (*basicAuthentificationController)(nil) +var _ BasicAuthenticationController = (*basicAuthenticationController)(nil) -// BasicAuthentificationController implementation -type basicAuthentificationController struct { +type basicAuthenticationController struct { logger *zap.Logger userService userservice.UserService sessionService sessionservice.SessionService } -// BasicAuthentificationController constructor -func NewBasicAuthentificationController( +// BasicAuthenticationController constructor +func NewBasicAuthenticationController( logger *zap.Logger, userService userservice.UserService, sessionService sessionservice.SessionService, -) BasicAuthentificationController { - return &basicAuthentificationController{ +) BasicAuthenticationController { + return &basicAuthenticationController{ logger: logger, userService: userService, sessionService: sessionService, @@ -52,7 +50,7 @@ func NewBasicAuthentificationController( } // Log In with username and password -func (basicAuthController *basicAuthentificationController) BasicLoginHandler(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +func (basicAuthController *basicAuthenticationController) BasicLoginHandler(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { var loginJSONStruct dto.UserLoginDTO err := json.NewDecoder(r.Body).Decode(&loginJSONStruct) if err != nil { @@ -78,7 +76,7 @@ func (basicAuthController *basicAuthentificationController) BasicLoginHandler(w } // Log Out the user -func (basicAuthController *basicAuthentificationController) Logout(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +func (basicAuthController *basicAuthenticationController) Logout(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { return nil, basicAuthController.sessionService.LogUserOut( sessionservice.GetSessionClaimsFromContext(r.Context()), w, diff --git a/controllers/basicAuth_test.go b/controllers/basicAuth_test.go index eff7568e..ff3ad317 100644 --- a/controllers/basicAuth_test.go +++ b/controllers/basicAuth_test.go @@ -25,7 +25,7 @@ func Test_BasicLoginHandler_MalformedRequest(t *testing.T) { userService := mocksUserService.NewUserService(t) sessionService := mocksSessionService.NewSessionService(t) - controller := controllers.NewBasicAuthentificationController( + controller := controllers.NewBasicAuthenticationController( logger, userService, sessionService, @@ -56,7 +56,7 @@ func Test_BasicLoginHandler_UserNotFound(t *testing.T) { Return(nil, httperrors.AnError) sessionService := mocksSessionService.NewSessionService(t) - controller := controllers.NewBasicAuthentificationController( + controller := controllers.NewBasicAuthenticationController( logger, userService, sessionService, @@ -108,7 +108,7 @@ func Test_BasicLoginHandler_LoginFailed(t *testing.T) { On("LogUserIn", user, response). Return(httperrors.AnError) - controller := controllers.NewBasicAuthentificationController( + controller := controllers.NewBasicAuthenticationController( logger, userService, sessionService, @@ -153,7 +153,7 @@ func Test_BasicLoginHandler_LoginSuccess(t *testing.T) { On("LogUserIn", user, response). Return(nil) - controller := controllers.NewBasicAuthentificationController( + controller := controllers.NewBasicAuthenticationController( logger, userService, sessionService, diff --git a/router/router.go b/router/router.go index 62ea68f3..b401a1f5 100644 --- a/router/router.go +++ b/router/router.go @@ -17,7 +17,7 @@ func SetupRouter( authenticationMiddleware middlewares.AuthenticationMiddleware, // controllers - basicAuthentificationController controllers.BasicAuthentificationController, + basicAuthentificationController controllers.BasicAuthenticationController, informationController controllers.InformationController, eavController controllers.EAVController, ) http.Handler { From 05b97dd3ac38c7f23db658c54d782cc8d32d400c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 16:17:51 +0200 Subject: [PATCH 063/467] regenerate mocks --- mocks/configuration/ConfigurationHolder.go | 2 +- mocks/configuration/DatabaseConfiguration.go | 2 +- .../configuration/HTTPServerConfiguration.go | 2 +- .../InitializationConfiguration.go | 2 +- mocks/configuration/LoggerConfiguration.go | 2 +- .../configuration/PaginationConfiguration.go | 2 +- mocks/configuration/SessionConfiguration.go | 2 +- .../BasicAuthenticationController.go | 86 +++++++++++++++++++ mocks/controllers/EAVController.go | 27 ++++-- mocks/controllers/InformationController.go | 7 +- mocks/httperrors/HTTPError.go | 2 +- mocks/persistence/models/Tabler.go | 2 +- mocks/persistence/pagination/Paginator.go | 2 +- .../persistence/repository/CRUDRepository.go | 27 ++++-- mocks/persistence/repository/SortOption.go | 2 +- .../middlewares/AuthenticationMiddleware.go | 2 +- mocks/router/middlewares/JSONController.go | 2 +- mocks/router/middlewares/JSONHandler.go | 7 +- mocks/router/middlewares/MiddlewareLogger.go | 2 +- mocks/services/eavservice/EAVService.go | 25 ++++-- .../services/sessionservice/SessionService.go | 7 +- mocks/services/userservice/UserService.go | 12 ++- 22 files changed, 184 insertions(+), 42 deletions(-) create mode 100644 mocks/controllers/BasicAuthenticationController.go diff --git a/mocks/configuration/ConfigurationHolder.go b/mocks/configuration/ConfigurationHolder.go index f6475bb1..4a047153 100644 --- a/mocks/configuration/ConfigurationHolder.go +++ b/mocks/configuration/ConfigurationHolder.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/configuration/DatabaseConfiguration.go b/mocks/configuration/DatabaseConfiguration.go index a210f186..51f0f487 100644 --- a/mocks/configuration/DatabaseConfiguration.go +++ b/mocks/configuration/DatabaseConfiguration.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/configuration/HTTPServerConfiguration.go b/mocks/configuration/HTTPServerConfiguration.go index 77cb41e5..f70cf767 100644 --- a/mocks/configuration/HTTPServerConfiguration.go +++ b/mocks/configuration/HTTPServerConfiguration.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/configuration/InitializationConfiguration.go b/mocks/configuration/InitializationConfiguration.go index 58bdec3b..303c62b7 100644 --- a/mocks/configuration/InitializationConfiguration.go +++ b/mocks/configuration/InitializationConfiguration.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/configuration/LoggerConfiguration.go b/mocks/configuration/LoggerConfiguration.go index 2115ec7e..88682c1c 100644 --- a/mocks/configuration/LoggerConfiguration.go +++ b/mocks/configuration/LoggerConfiguration.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/configuration/PaginationConfiguration.go b/mocks/configuration/PaginationConfiguration.go index 9146b875..7db54091 100644 --- a/mocks/configuration/PaginationConfiguration.go +++ b/mocks/configuration/PaginationConfiguration.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/configuration/SessionConfiguration.go b/mocks/configuration/SessionConfiguration.go index 2d5e9ee7..e107947d 100644 --- a/mocks/configuration/SessionConfiguration.go +++ b/mocks/configuration/SessionConfiguration.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/controllers/BasicAuthenticationController.go b/mocks/controllers/BasicAuthenticationController.go new file mode 100644 index 00000000..5bf3c0b9 --- /dev/null +++ b/mocks/controllers/BasicAuthenticationController.go @@ -0,0 +1,86 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + http "net/http" + + httperrors "github.com/ditrit/badaas/httperrors" + mock "github.com/stretchr/testify/mock" +) + +// BasicAuthenticationController is an autogenerated mock type for the BasicAuthenticationController type +type BasicAuthenticationController struct { + mock.Mock +} + +// BasicLoginHandler provides a mock function with given fields: _a0, _a1 +func (_m *BasicAuthenticationController) BasicLoginHandler(_a0 http.ResponseWriter, _a1 *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(_a0, _a1) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(_a0, _a1) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// Logout provides a mock function with given fields: _a0, _a1 +func (_m *BasicAuthenticationController) Logout(_a0 http.ResponseWriter, _a1 *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(_a0, _a1) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(_a0, _a1) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +type mockConstructorTestingTNewBasicAuthenticationController interface { + mock.TestingT + Cleanup(func()) +} + +// NewBasicAuthenticationController creates a new instance of BasicAuthenticationController. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewBasicAuthenticationController(t mockConstructorTestingTNewBasicAuthenticationController) *BasicAuthenticationController { + mock := &BasicAuthenticationController{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/controllers/EAVController.go b/mocks/controllers/EAVController.go index 6d46e199..a001c00a 100644 --- a/mocks/controllers/EAVController.go +++ b/mocks/controllers/EAVController.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks @@ -19,6 +19,10 @@ func (_m *EAVController) CreateObject(w http.ResponseWriter, r *http.Request) (i ret := _m.Called(w, r) var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { r0 = rf(w, r) } else { @@ -27,7 +31,6 @@ func (_m *EAVController) CreateObject(w http.ResponseWriter, r *http.Request) (i } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { r1 = rf(w, r) } else { @@ -44,6 +47,10 @@ func (_m *EAVController) DeleteObject(w http.ResponseWriter, r *http.Request) (i ret := _m.Called(w, r) var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { r0 = rf(w, r) } else { @@ -52,7 +59,6 @@ func (_m *EAVController) DeleteObject(w http.ResponseWriter, r *http.Request) (i } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { r1 = rf(w, r) } else { @@ -69,6 +75,10 @@ func (_m *EAVController) GetAll(w http.ResponseWriter, r *http.Request) (interfa ret := _m.Called(w, r) var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { r0 = rf(w, r) } else { @@ -77,7 +87,6 @@ func (_m *EAVController) GetAll(w http.ResponseWriter, r *http.Request) (interfa } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { r1 = rf(w, r) } else { @@ -94,6 +103,10 @@ func (_m *EAVController) GetObject(w http.ResponseWriter, r *http.Request) (inte ret := _m.Called(w, r) var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { r0 = rf(w, r) } else { @@ -102,7 +115,6 @@ func (_m *EAVController) GetObject(w http.ResponseWriter, r *http.Request) (inte } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { r1 = rf(w, r) } else { @@ -119,6 +131,10 @@ func (_m *EAVController) ModifyObject(w http.ResponseWriter, r *http.Request) (i ret := _m.Called(w, r) var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { r0 = rf(w, r) } else { @@ -127,7 +143,6 @@ func (_m *EAVController) ModifyObject(w http.ResponseWriter, r *http.Request) (i } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { r1 = rf(w, r) } else { diff --git a/mocks/controllers/InformationController.go b/mocks/controllers/InformationController.go index 51eeffef..4a82f694 100644 --- a/mocks/controllers/InformationController.go +++ b/mocks/controllers/InformationController.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks @@ -19,6 +19,10 @@ func (_m *InformationController) Info(response http.ResponseWriter, r *http.Requ ret := _m.Called(response, r) var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(response, r) + } if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { r0 = rf(response, r) } else { @@ -27,7 +31,6 @@ func (_m *InformationController) Info(response http.ResponseWriter, r *http.Requ } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { r1 = rf(response, r) } else { diff --git a/mocks/httperrors/HTTPError.go b/mocks/httperrors/HTTPError.go index cbe71e52..3bae2ab3 100644 --- a/mocks/httperrors/HTTPError.go +++ b/mocks/httperrors/HTTPError.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/persistence/models/Tabler.go b/mocks/persistence/models/Tabler.go index cbc8e129..6a50e56e 100644 --- a/mocks/persistence/models/Tabler.go +++ b/mocks/persistence/models/Tabler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/persistence/pagination/Paginator.go b/mocks/persistence/pagination/Paginator.go index dabbbf23..ef2c6359 100644 --- a/mocks/persistence/pagination/Paginator.go +++ b/mocks/persistence/pagination/Paginator.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/persistence/repository/CRUDRepository.go b/mocks/persistence/repository/CRUDRepository.go index 31f127b1..eeaecbbb 100644 --- a/mocks/persistence/repository/CRUDRepository.go +++ b/mocks/persistence/repository/CRUDRepository.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks @@ -25,13 +25,16 @@ func (_m *CRUDRepository[T, ID]) Count(_a0 squirrel.Sqlizer) (uint, httperrors.H ret := _m.Called(_a0) var r0 uint + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(squirrel.Sqlizer) (uint, httperrors.HTTPError)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(squirrel.Sqlizer) uint); ok { r0 = rf(_a0) } else { r0 = ret.Get(0).(uint) } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(squirrel.Sqlizer) httperrors.HTTPError); ok { r1 = rf(_a0) } else { @@ -80,6 +83,10 @@ func (_m *CRUDRepository[T, ID]) Find(_a0 squirrel.Sqlizer, _a1 pagination.Pagin ret := _m.Called(_a0, _a1, _a2) var r0 *pagination.Page[T] + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(squirrel.Sqlizer, pagination.Paginator, repository.SortOption) (*pagination.Page[T], httperrors.HTTPError)); ok { + return rf(_a0, _a1, _a2) + } if rf, ok := ret.Get(0).(func(squirrel.Sqlizer, pagination.Paginator, repository.SortOption) *pagination.Page[T]); ok { r0 = rf(_a0, _a1, _a2) } else { @@ -88,7 +95,6 @@ func (_m *CRUDRepository[T, ID]) Find(_a0 squirrel.Sqlizer, _a1 pagination.Pagin } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(squirrel.Sqlizer, pagination.Paginator, repository.SortOption) httperrors.HTTPError); ok { r1 = rf(_a0, _a1, _a2) } else { @@ -105,6 +111,10 @@ func (_m *CRUDRepository[T, ID]) GetAll(_a0 repository.SortOption) ([]*T, httper ret := _m.Called(_a0) var r0 []*T + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(repository.SortOption) ([]*T, httperrors.HTTPError)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(repository.SortOption) []*T); ok { r0 = rf(_a0) } else { @@ -113,7 +123,6 @@ func (_m *CRUDRepository[T, ID]) GetAll(_a0 repository.SortOption) ([]*T, httper } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(repository.SortOption) httperrors.HTTPError); ok { r1 = rf(_a0) } else { @@ -130,6 +139,10 @@ func (_m *CRUDRepository[T, ID]) GetByID(_a0 ID) (*T, httperrors.HTTPError) { ret := _m.Called(_a0) var r0 *T + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(ID) (*T, httperrors.HTTPError)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(ID) *T); ok { r0 = rf(_a0) } else { @@ -138,7 +151,6 @@ func (_m *CRUDRepository[T, ID]) GetByID(_a0 ID) (*T, httperrors.HTTPError) { } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(ID) httperrors.HTTPError); ok { r1 = rf(_a0) } else { @@ -171,6 +183,10 @@ func (_m *CRUDRepository[T, ID]) Transaction(fn func(repository.CRUDRepository[T ret := _m.Called(fn) var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(func(repository.CRUDRepository[T, ID]) (interface{}, error)) (interface{}, httperrors.HTTPError)); ok { + return rf(fn) + } if rf, ok := ret.Get(0).(func(func(repository.CRUDRepository[T, ID]) (interface{}, error)) interface{}); ok { r0 = rf(fn) } else { @@ -179,7 +195,6 @@ func (_m *CRUDRepository[T, ID]) Transaction(fn func(repository.CRUDRepository[T } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(func(repository.CRUDRepository[T, ID]) (interface{}, error)) httperrors.HTTPError); ok { r1 = rf(fn) } else { diff --git a/mocks/persistence/repository/SortOption.go b/mocks/persistence/repository/SortOption.go index d2e10e83..807bd26c 100644 --- a/mocks/persistence/repository/SortOption.go +++ b/mocks/persistence/repository/SortOption.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/router/middlewares/AuthenticationMiddleware.go b/mocks/router/middlewares/AuthenticationMiddleware.go index a0a4053f..77b8fe2d 100644 --- a/mocks/router/middlewares/AuthenticationMiddleware.go +++ b/mocks/router/middlewares/AuthenticationMiddleware.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/router/middlewares/JSONController.go b/mocks/router/middlewares/JSONController.go index b1ad06cb..5fe7aa5a 100644 --- a/mocks/router/middlewares/JSONController.go +++ b/mocks/router/middlewares/JSONController.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/router/middlewares/JSONHandler.go b/mocks/router/middlewares/JSONHandler.go index 98dd567b..37a072cb 100644 --- a/mocks/router/middlewares/JSONHandler.go +++ b/mocks/router/middlewares/JSONHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks @@ -20,6 +20,10 @@ func (_m *JSONHandler) Execute(w http.ResponseWriter, r *http.Request) (interfac ret := _m.Called(w, r) var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { r0 = rf(w, r) } else { @@ -28,7 +32,6 @@ func (_m *JSONHandler) Execute(w http.ResponseWriter, r *http.Request) (interfac } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { r1 = rf(w, r) } else { diff --git a/mocks/router/middlewares/MiddlewareLogger.go b/mocks/router/middlewares/MiddlewareLogger.go index 671b8ca8..f18920a8 100644 --- a/mocks/router/middlewares/MiddlewareLogger.go +++ b/mocks/router/middlewares/MiddlewareLogger.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks diff --git a/mocks/services/eavservice/EAVService.go b/mocks/services/eavservice/EAVService.go index 6381a309..d27f1946 100644 --- a/mocks/services/eavservice/EAVService.go +++ b/mocks/services/eavservice/EAVService.go @@ -1,10 +1,12 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks import ( models "github.com/ditrit/badaas/persistence/models" mock "github.com/stretchr/testify/mock" + + uuid "github.com/google/uuid" ) // EAVService is an autogenerated mock type for the EAVService type @@ -17,6 +19,10 @@ func (_m *EAVService) CreateEntity(ett *models.EntityType, attrs map[string]inte ret := _m.Called(ett, attrs) var r0 *models.Entity + var r1 error + if rf, ok := ret.Get(0).(func(*models.EntityType, map[string]interface{}) (*models.Entity, error)); ok { + return rf(ett, attrs) + } if rf, ok := ret.Get(0).(func(*models.EntityType, map[string]interface{}) *models.Entity); ok { r0 = rf(ett, attrs) } else { @@ -25,7 +31,6 @@ func (_m *EAVService) CreateEntity(ett *models.EntityType, attrs map[string]inte } } - var r1 error if rf, ok := ret.Get(1).(func(*models.EntityType, map[string]interface{}) error); ok { r1 = rf(ett, attrs) } else { @@ -66,11 +71,15 @@ func (_m *EAVService) GetEntitiesWithParams(ett *models.EntityType, params map[s } // GetEntity provides a mock function with given fields: ett, id -func (_m *EAVService) GetEntity(ett *models.EntityType, id uint) (*models.Entity, error) { +func (_m *EAVService) GetEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, error) { ret := _m.Called(ett, id) var r0 *models.Entity - if rf, ok := ret.Get(0).(func(*models.EntityType, uint) *models.Entity); ok { + var r1 error + if rf, ok := ret.Get(0).(func(*models.EntityType, uuid.UUID) (*models.Entity, error)); ok { + return rf(ett, id) + } + if rf, ok := ret.Get(0).(func(*models.EntityType, uuid.UUID) *models.Entity); ok { r0 = rf(ett, id) } else { if ret.Get(0) != nil { @@ -78,8 +87,7 @@ func (_m *EAVService) GetEntity(ett *models.EntityType, id uint) (*models.Entity } } - var r1 error - if rf, ok := ret.Get(1).(func(*models.EntityType, uint) error); ok { + if rf, ok := ret.Get(1).(func(*models.EntityType, uuid.UUID) error); ok { r1 = rf(ett, id) } else { r1 = ret.Error(1) @@ -93,6 +101,10 @@ func (_m *EAVService) GetEntityTypeByName(name string) (*models.EntityType, erro ret := _m.Called(name) var r0 *models.EntityType + var r1 error + if rf, ok := ret.Get(0).(func(string) (*models.EntityType, error)); ok { + return rf(name) + } if rf, ok := ret.Get(0).(func(string) *models.EntityType); ok { r0 = rf(name) } else { @@ -101,7 +113,6 @@ func (_m *EAVService) GetEntityTypeByName(name string) (*models.EntityType, erro } } - var r1 error if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(name) } else { diff --git a/mocks/services/sessionservice/SessionService.go b/mocks/services/sessionservice/SessionService.go index 22b49694..101cfba9 100644 --- a/mocks/services/sessionservice/SessionService.go +++ b/mocks/services/sessionservice/SessionService.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks @@ -25,13 +25,16 @@ func (_m *SessionService) IsValid(sessionUUID uuid.UUID) (bool, *sessionservice. ret := _m.Called(sessionUUID) var r0 bool + var r1 *sessionservice.SessionClaims + if rf, ok := ret.Get(0).(func(uuid.UUID) (bool, *sessionservice.SessionClaims)); ok { + return rf(sessionUUID) + } if rf, ok := ret.Get(0).(func(uuid.UUID) bool); ok { r0 = rf(sessionUUID) } else { r0 = ret.Get(0).(bool) } - var r1 *sessionservice.SessionClaims if rf, ok := ret.Get(1).(func(uuid.UUID) *sessionservice.SessionClaims); ok { r1 = rf(sessionUUID) } else { diff --git a/mocks/services/userservice/UserService.go b/mocks/services/userservice/UserService.go index 6ce9b7fa..bd6bb257 100644 --- a/mocks/services/userservice/UserService.go +++ b/mocks/services/userservice/UserService.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. +// Code generated by mockery v2.20.0. DO NOT EDIT. package mocks @@ -21,6 +21,10 @@ func (_m *UserService) GetUser(_a0 dto.UserLoginDTO) (*models.User, httperrors.H ret := _m.Called(_a0) var r0 *models.User + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(dto.UserLoginDTO) (*models.User, httperrors.HTTPError)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(dto.UserLoginDTO) *models.User); ok { r0 = rf(_a0) } else { @@ -29,7 +33,6 @@ func (_m *UserService) GetUser(_a0 dto.UserLoginDTO) (*models.User, httperrors.H } } - var r1 httperrors.HTTPError if rf, ok := ret.Get(1).(func(dto.UserLoginDTO) httperrors.HTTPError); ok { r1 = rf(_a0) } else { @@ -46,6 +49,10 @@ func (_m *UserService) NewUser(username string, email string, password string) ( ret := _m.Called(username, email, password) var r0 *models.User + var r1 error + if rf, ok := ret.Get(0).(func(string, string, string) (*models.User, error)); ok { + return rf(username, email, password) + } if rf, ok := ret.Get(0).(func(string, string, string) *models.User); ok { r0 = rf(username, email, password) } else { @@ -54,7 +61,6 @@ func (_m *UserService) NewUser(username string, email string, password string) ( } } - var r1 error if rf, ok := ret.Get(1).(func(string, string, string) error); ok { r1 = rf(username, email, password) } else { From 9bc043cab8770ceecb0c4d51273c763445d0271d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 16:18:47 +0200 Subject: [PATCH 064/467] remove old mock --- .../BasicAuthentificationController.go | 80 ------------------- 1 file changed, 80 deletions(-) delete mode 100644 mocks/controllers/BasicAuthentificationController.go diff --git a/mocks/controllers/BasicAuthentificationController.go b/mocks/controllers/BasicAuthentificationController.go deleted file mode 100644 index 19092bfa..00000000 --- a/mocks/controllers/BasicAuthentificationController.go +++ /dev/null @@ -1,80 +0,0 @@ -// Code generated by mockery v2.14.0. DO NOT EDIT. - -package mocks - -import ( - http "net/http" - - httperrors "github.com/ditrit/badaas/httperrors" - mock "github.com/stretchr/testify/mock" -) - -// BasicAuthentificationController is an autogenerated mock type for the BasicAuthentificationController type -type BasicAuthentificationController struct { - mock.Mock -} - -// BasicLoginHandler provides a mock function with given fields: _a0, _a1 -func (_m *BasicAuthentificationController) BasicLoginHandler(_a0 http.ResponseWriter, _a1 *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(_a0, _a1) - - var r0 interface{} - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - var r1 httperrors.HTTPError - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(_a0, _a1) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - -// Logout provides a mock function with given fields: _a0, _a1 -func (_m *BasicAuthentificationController) Logout(_a0 http.ResponseWriter, _a1 *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(_a0, _a1) - - var r0 interface{} - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(_a0, _a1) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - var r1 httperrors.HTTPError - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(_a0, _a1) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - -type mockConstructorTestingTNewBasicAuthentificationController interface { - mock.TestingT - Cleanup(func()) -} - -// NewBasicAuthentificationController creates a new instance of BasicAuthentificationController. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewBasicAuthentificationController(t mockConstructorTestingTNewBasicAuthentificationController) *BasicAuthentificationController { - mock := &BasicAuthentificationController{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} From fb40c909a2d271558d97b9c32e71174461f4d958 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 16:47:04 +0200 Subject: [PATCH 065/467] fix fix typo --- router/router_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/router_test.go b/router/router_test.go index 3b52a035..36430ab5 100644 --- a/router/router_test.go +++ b/router/router_test.go @@ -15,7 +15,7 @@ func TestSetupRouter(t *testing.T) { middlewareLogger := middlewaresMocks.NewMiddlewareLogger(t) authenticationMiddleware := middlewaresMocks.NewAuthenticationMiddleware(t) - basicController := controllersMocks.NewBasicAuthentificationController(t) + basicController := controllersMocks.NewBasicAuthenticationController(t) informationController := controllersMocks.NewInformationController(t) eavController := controllersMocks.NewEAVController(t) jsonController.On("Wrap", mock.Anything).Return(func(response http.ResponseWriter, request *http.Request) {}) From b447d8e57c1abff1c89496be7d94710fe4a833a1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 17:47:49 +0200 Subject: [PATCH 066/467] add more int test to eav service --- services/eavservice/eavservice.go | 15 ++--- test_integration/eavservice.go | 101 ++++++++++++++++++++++-------- 2 files changed, 80 insertions(+), 36 deletions(-) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 8febd8b1..e8e0f7b7 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -174,16 +174,9 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map return nil, err } case float64: - if utils.IsAnInt(t) && a.ValueType == models.IntValueType { - value, err = models.NewIntValue(a, int(t)) - if err != nil { - return nil, err - } - } else { - value, err = models.NewFloatValue(a, t) - if err != nil { - return nil, err - } + value, err = models.NewFloatValue(a, t) + if err != nil { + return nil, err } case bool: value, err = models.NewBoolValue(a, t) @@ -203,7 +196,7 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map if !present { if a.Required { - return nil, fmt.Errorf("field %q is missing and is required", a.Name) + return nil, fmt.Errorf("field %s is missing and is required", a.Name) } if a.Default { diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 54cdd87f..48a9491a 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -2,11 +2,11 @@ package integrationtests import ( "fmt" - "log" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/eavservice" + "github.com/elliotchance/pie/v2" "github.com/stretchr/testify/suite" "go.uber.org/zap" "gorm.io/gorm" @@ -56,6 +56,7 @@ func (ts *EAVServiceIntTestSuite) SetupTest() { ValueType: models.StringValueType, Required: false, } + ts.profileType.Attributes = append(ts.profileType.Attributes, ts.displayNameAttr, ts.descriptionAttr, @@ -63,12 +64,6 @@ func (ts *EAVServiceIntTestSuite) SetupTest() { err := ts.db.Create(&ts.profileType).Error ts.Nil(err) - - log.Println(ts.profileType.ID) - log.Println(ts.displayNameAttr.Name) - log.Println(ts.displayNameAttr.ID) - log.Println(ts.descriptionAttr.Name) - log.Println(ts.descriptionAttr.ID) } // ------------------------- GetEntitiesWithParams -------------------------------- @@ -322,14 +317,12 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfRelationType() { ts.Nil(err) match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ - "displayName": "match", - "relation": otherEntity1.ID.String(), + "relation": otherEntity1.ID.String(), }) ts.Nil(err) _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ - "displayName": "not_match", - "relation": otherEntity2.ID.String(), + "relation": otherEntity2.ID.String(), }) ts.Nil(err) @@ -377,13 +370,83 @@ func (ts *EAVServiceIntTestSuite) TestCreateMultipleEntitiesDoesNotGenerateGormB for _, value := range entity.Fields { if value.Attribute.Name == "displayName" { ts.Equal(initialDisplayNameID, value.AttributeID) - } else { + } else if value.Attribute.Name == "description" { ts.Equal(initialDescriptionID, value.AttributeID) } } } } +func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfUUIDCantBeParsed() { + otherType := &models.EntityType{ + Name: "other", + } + err := ts.db.Create(&otherType).Error + ts.Nil(err) + + relationAttr := models.NewRelationAttribute(ts.profileType, "relation", false, false, otherType) + ts.profileType.Attributes = append(ts.profileType.Attributes, + relationAttr, + ) + + err = ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + params := map[string]any{ + "displayName": "displayName", + "relation": "not-a-uuid", + } + entity, err := ts.eavService.CreateEntity(ts.profileType, params) + ts.Nil(entity) + ts.ErrorIs(err, eavservice.ErrCantParseUUID) +} + +func (ts *EAVServiceIntTestSuite) TestCreatesDefaultAttributes() { + intAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "int", + ValueType: models.IntValueType, + Required: false, + Default: true, + DefaultInt: 1, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + intAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + ts.Nil(err) + ts.Len(entity.Fields, 3) + notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { + return !value.IsNull + }) + ts.Len(notNull, 1) + ts.Equal(1, notNull[0].Value()) +} + +func (ts *EAVServiceIntTestSuite) TestCreatesWithoutRequiredValueRespondsError() { + requiredAttr := &models.Attribute{ + Name: "required", + Required: true, + ValueType: models.StringValueType, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + requiredAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + ts.Nil(entity) + ts.ErrorContains(err, "field required is missing and is required") +} + // ------------------------- UpdateEntity -------------------------------- func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGormBug() { @@ -415,7 +478,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGo for _, value := range entity.Fields { if value.Attribute.Name == "displayName" { ts.Equal(initialDisplayNameID, value.AttributeID) - } else { + } else if value.Attribute.Name == "description" { ts.Equal(initialDescriptionID, value.AttributeID) } } @@ -436,20 +499,8 @@ func (ts *EAVServiceIntTestSuite) createProfile(entityType *models.EntityType, d descriptionVal, ) - log.Println("Before create") - log.Println(displayNameVal.Attribute.Name) - log.Println(displayNameVal.AttributeID) - log.Println(descriptionVal.Attribute.Name) - log.Println(descriptionVal.AttributeID) - err := ts.entityRepository.Save(entity) ts.Nil(err) - log.Println("After create") - for _, field := range entity.Fields { - log.Println(field.Attribute.Name) - log.Println(field.AttributeID) - } - return entity } From 4d686ba825da89c312d5540fdbe9342ce9bc96cf Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Apr 2023 18:04:14 +0200 Subject: [PATCH 067/467] fix e2e tests --- services/eavservice/eavservice.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index e8e0f7b7..e45b5bb9 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -174,9 +174,16 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map return nil, err } case float64: - value, err = models.NewFloatValue(a, t) - if err != nil { - return nil, err + if utils.IsAnInt(t) && a.ValueType == models.IntValueType { + value, err = models.NewIntValue(a, int(t)) + if err != nil { + return nil, err + } + } else { + value, err = models.NewFloatValue(a, t) + if err != nil { + return nil, err + } } case bool: value, err = models.NewBoolValue(a, t) From d7c2afb707ce72377c9c164cd3fb775d746242fc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 11:43:56 +0200 Subject: [PATCH 068/467] add more tests for eav service --- persistence/models/Entity.go | 8 +- persistence/models/EntityType.go | 5 + persistence/repository/EntityRepository.go | 4 +- persistence/repository/ValueRepository.go | 5 +- services/eavservice/eavservice.go | 18 +- test_integration/eavservice.go | 308 ++++++++++++++++++++- 6 files changed, 331 insertions(+), 17 deletions(-) diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index a397b181..d6b0621f 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -65,11 +65,11 @@ func (e *Entity) GetValue(attrName string) (interface{}, error) { return (*value).Value(), nil } -func (Entity) TableName() string { - return "entities" -} - func (e Entity) Equal(other Entity) bool { return e.ID == other.ID && e.EntityType.ID == other.EntityType.ID } + +func (Entity) TableName() string { + return "entities" +} diff --git a/persistence/models/EntityType.go b/persistence/models/EntityType.go index c862ec5f..327b8e35 100644 --- a/persistence/models/EntityType.go +++ b/persistence/models/EntityType.go @@ -8,3 +8,8 @@ type EntityType struct { // GORM relations Attributes []*Attribute } + +func (et EntityType) Equal(other EntityType) bool { + return et.ID == other.ID && + et.Name == other.Name +} diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index 37788034..fb6c8373 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -29,7 +29,7 @@ func NewEntityRepository( } } -func (r *EntityRepository) Save(entity *models.Entity) error { +func (r *EntityRepository) Create(entity *models.Entity) error { return r.db.Transaction(func(tx *gorm.DB) error { now := time.Now() @@ -59,7 +59,7 @@ func (r *EntityRepository) Save(entity *models.Entity) error { }) if len(entity.Fields) > 0 { - err = r.valueRepository.Save(tx, entity.Fields) + err = r.valueRepository.Create(tx, entity.Fields) if err != nil { return err } diff --git a/persistence/repository/ValueRepository.go b/persistence/repository/ValueRepository.go index dd8105af..34884671 100644 --- a/persistence/repository/ValueRepository.go +++ b/persistence/repository/ValueRepository.go @@ -25,7 +25,7 @@ func NewValueRepository( } } -func (r *ValueRepository) Save(tx *gorm.DB, values []*models.Value) error { +func (r *ValueRepository) Create(tx *gorm.DB, values []*models.Value) error { now := time.Now() query := sq.Insert("values"). @@ -38,7 +38,8 @@ func (r *ValueRepository) Save(tx *gorm.DB, values []*models.Value) error { value.RelationVal, value.EntityID, value.Attribute.ID) } - queryString, queryValues, err := query.Suffix("RETURNING \"id\""). + queryString, queryValues, err := query. + Suffix("RETURNING \"id\""). PlaceholderFormat(sq.Dollar). ToSql() if err != nil { diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index e45b5bb9..7a9c62d2 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -113,15 +113,16 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, return entities } -// Delete an entity +// Delete an entity and its values func (eavService *eavServiceImpl) DeleteEntity(et *models.Entity) error { - for _, v := range et.Fields { - err := eavService.db.Delete(v).Error + return eavService.db.Transaction(func(tx *gorm.DB) error { + err := tx.Where("entity_id = ?", et.ID.String()).Delete(&models.Value{}).Error if err != nil { return err } - } - return eavService.db.Delete(et).Error + + return eavService.db.Delete(et).Error + }) } func (eavService *eavServiceImpl) GetEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, error) { @@ -158,6 +159,7 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map if err != nil { return nil, ErrCantParseUUID } + // TODO verify that exists value, err = models.NewRelationIDValue(a, uuidVal) if err != nil { return nil, err @@ -222,7 +224,7 @@ func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map et.Fields = append(et.Fields, value) } - return et, eavService.entityRepository.Save(et) + return et, eavService.entityRepository.Create(et) } func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[string]interface{}) error { @@ -238,6 +240,7 @@ func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[stri return ErrCantParseUUID } + // TODO verify that exists err = value.SetRelationVal(uuidVal) if err != nil { return err @@ -281,8 +284,7 @@ func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[stri } } } - eavService.db.Save(value) } - return nil + return eavService.db.Save(et.Fields).Error } diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 48a9491a..4006b97a 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -7,9 +7,11 @@ import ( "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/eavservice" "github.com/elliotchance/pie/v2" + "github.com/google/uuid" "github.com/stretchr/testify/suite" "go.uber.org/zap" "gorm.io/gorm" + "gotest.tools/assert" ) type EAVServiceIntTestSuite struct { @@ -66,6 +68,37 @@ func (ts *EAVServiceIntTestSuite) SetupTest() { ts.Nil(err) } +// ------------------------- GetEntity -------------------------------- + +func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityDoesNotExist() { + _, err := ts.eavService.GetEntity(ts.profileType, uuid.New()) + ts.ErrorContains(err, "record not found") +} + +func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityTypeDoesNotMatch() { + otherEntityType := &models.EntityType{ + Name: "other", + } + + err := ts.db.Create(otherEntityType).Error + ts.Nil(err) + + otherEntity1, err := ts.eavService.CreateEntity(otherEntityType, map[string]any{}) + ts.Nil(err) + + _, err = ts.eavService.GetEntity(ts.profileType, otherEntity1.ID) + ts.ErrorIs(err, eavservice.ErrIDDontMatchEntityType) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntityWorksIfEntityTypeMatch() { + entity1, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + ts.Nil(err) + + entityReturned, err := ts.eavService.GetEntity(ts.profileType, entity1.ID) + ts.Nil(err) + EqualEntity(&ts.Suite, entity1, entityReturned) +} + // ------------------------- GetEntitiesWithParams -------------------------------- func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsEmptyIfNotEntitiesCreated() { @@ -447,6 +480,33 @@ func (ts *EAVServiceIntTestSuite) TestCreatesWithoutRequiredValueRespondsError() ts.ErrorContains(err, "field required is missing and is required") } +func (ts *EAVServiceIntTestSuite) TestCreatesIntAttributeEvenIfItIsInFloatFormat() { + intAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "int", + ValueType: models.IntValueType, + Required: false, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + intAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "int": 2.0, + }) + ts.Nil(err) + ts.Len(entity.Fields, 3) + notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { + return !value.IsNull + }) + ts.Len(notNull, 1) + ts.Equal(2, notNull[0].Value()) +} + // ------------------------- UpdateEntity -------------------------------- func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGormBug() { @@ -485,6 +545,252 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGo } } +func (ts *EAVServiceIntTestSuite) TestUpdateEntityWorksForAllTheTypes() { + intAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "int", + ValueType: models.IntValueType, + Required: false, + } + + floatAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "float", + ValueType: models.FloatValueType, + Required: false, + } + + boolAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "bool", + ValueType: models.BooleanValueType, + Required: false, + } + + otherEntityType := &models.EntityType{ + Name: "other", + } + + err := ts.db.Create(otherEntityType).Error + ts.Nil(err) + + otherEntity1, err := ts.eavService.CreateEntity(otherEntityType, map[string]any{}) + ts.Nil(err) + + relationAttr := models.NewRelationAttribute( + ts.profileType, "relation", + false, false, otherEntityType, + ) + + ts.profileType.Attributes = append(ts.profileType.Attributes, + intAttr, + floatAttr, + boolAttr, + relationAttr, + ) + + err = ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + params := map[string]any{ + "displayName": "displayName", + } + entity, err := ts.eavService.CreateEntity(ts.profileType, params) + ts.Nil(err) + + paramsUpdate := map[string]any{ + "displayName": nil, + "int": 1, + "float": 1.0, + "bool": true, + "relation": otherEntity1.ID.String(), + } + err = ts.eavService.UpdateEntity(entity, paramsUpdate) + ts.Nil(err) + ts.Len(entity.Fields, 6) + notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { + return !value.IsNull + }) + ts.Len(notNull, 4) + values := pie.Map(notNull, func(v *models.Value) any { + return v.Value() + }) + ts.Contains(values, 1) + ts.Contains(values, 1.0) + ts.Contains(values, true) + ts.Contains(values, otherEntity1.ID) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForIntType() { + intAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "int", + ValueType: models.IntValueType, + Required: false, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + intAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + ts.Nil(err) + + paramsUpdate := map[string]any{ + "int": "1", + } + err = ts.eavService.UpdateEntity(entity, paramsUpdate) + ts.ErrorIs(err, models.ErrAskingForWrongType) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForFloatType() { + floatAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "float", + ValueType: models.FloatValueType, + Required: false, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + floatAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + ts.Nil(err) + + paramsUpdate := map[string]any{ + "float": "1", + } + err = ts.eavService.UpdateEntity(entity, paramsUpdate) + ts.ErrorIs(err, models.ErrAskingForWrongType) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForBoolType() { + boolAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "bool", + ValueType: models.BooleanValueType, + Required: false, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + boolAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + ts.Nil(err) + + paramsUpdate := map[string]any{ + "bool": "1", + } + err = ts.eavService.UpdateEntity(entity, paramsUpdate) + ts.ErrorIs(err, models.ErrAskingForWrongType) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfIntForStringType() { + entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + ts.Nil(err) + + paramsUpdate := map[string]any{ + "displayName": 1, + } + err = ts.eavService.UpdateEntity(entity, paramsUpdate) + ts.ErrorIs(err, models.ErrAskingForWrongType) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDCantBeParsedForRelationType() { + otherEntityType := &models.EntityType{ + Name: "other", + } + + err := ts.db.Create(otherEntityType).Error + ts.Nil(err) + + relationAttr := models.NewRelationAttribute( + ts.profileType, "relation", + false, false, otherEntityType, + ) + + ts.profileType.Attributes = append(ts.profileType.Attributes, + relationAttr, + ) + + err = ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + ts.Nil(err) + + paramsUpdate := map[string]any{ + "relation": "not-uuid", + } + err = ts.eavService.UpdateEntity(entity, paramsUpdate) + ts.ErrorIs(err, eavservice.ErrCantParseUUID) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFails() { + entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + ts.Nil(err) + + paramsUpdate := map[string]any{ + "displayName": "something", + "description": 1, + } + err = ts.eavService.UpdateEntity(entity, paramsUpdate) + ts.ErrorIs(err, models.ErrAskingForWrongType) + + entityReturned, err := ts.eavService.GetEntity(ts.profileType, entity.ID) + ts.Nil(err) + notNull := pie.Filter(entityReturned.Fields, func(value *models.Value) bool { + return !value.IsNull + }) + ts.Len(notNull, 0) +} + +// ------------------------- GetEntityTypeByName ------------------------- + +func (ts *EAVServiceIntTestSuite) TestGetEntityTypeReturnsErrorIfItDoesNotExist() { + _, err := ts.eavService.GetEntityTypeByName("not_exists") + ts.ErrorContains(err, "EntityType named \"not_exists\" not found") +} + +func (ts *EAVServiceIntTestSuite) TestGetEntityTypeWorksIfItExists() { + ett, err := ts.eavService.GetEntityTypeByName("profile") + ts.Nil(err) + assert.DeepEqual(ts.T(), ts.profileType, ett) +} + +// ------------------------- DeleteEntity ------------------------- + +func (ts *EAVServiceIntTestSuite) TestDeleteWorks() { + profile1, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + "displayName": "displayName", + }) + ts.Nil(err) + + err = ts.eavService.DeleteEntity(profile1) + ts.Nil(err) + + var profiles []models.Entity + err = ts.db.Find(&profiles).Error + ts.Nil(err) + ts.Len(profiles, 0) + + var values []models.Value + err = ts.db.Find(&values).Error + ts.Nil(err) + ts.Len(values, 0) +} + func (ts *EAVServiceIntTestSuite) createProfile(entityType *models.EntityType, displayName string) *models.Entity { entity := &models.Entity{ EntityTypeID: entityType.ID, @@ -499,7 +805,7 @@ func (ts *EAVServiceIntTestSuite) createProfile(entityType *models.EntityType, d descriptionVal, ) - err := ts.entityRepository.Save(entity) + err := ts.entityRepository.Create(entity) ts.Nil(err) return entity From adb7cb30a8b074e4d4139e01a9a3b1161329f4d9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 11:50:29 +0200 Subject: [PATCH 069/467] fix use tx as it should --- services/eavservice/eavservice.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 7a9c62d2..84cdfbc1 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -121,7 +121,7 @@ func (eavService *eavServiceImpl) DeleteEntity(et *models.Entity) error { return err } - return eavService.db.Delete(et).Error + return tx.Delete(et).Error }) } From 0a6164f177a1c3cda06205f7e4966b27bc8e9078 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 12:02:16 +0200 Subject: [PATCH 070/467] add unit tests for attribute --- persistence/models/Attribute_test.go | 84 ++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 persistence/models/Attribute_test.go diff --git a/persistence/models/Attribute_test.go b/persistence/models/Attribute_test.go new file mode 100644 index 00000000..e9120baf --- /dev/null +++ b/persistence/models/Attribute_test.go @@ -0,0 +1,84 @@ +package models + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewDefaultValueReturnsErrorIfNotDefault(t *testing.T) { + attr := &Attribute{ + Default: false, + } + + _, err := attr.GetNewDefaultValue() + assert.ErrorIs(t, err, ErrNoDefaultValueSet) +} + +func TestNewDefaultValueReturnsDefaultIntForInt(t *testing.T) { + attr := &Attribute{ + ValueType: IntValueType, + Default: true, + DefaultInt: 1, + } + + value, err := attr.GetNewDefaultValue() + assert.Nil(t, err) + assert.Equal(t, 1, value.Value()) +} + +func TestNewDefaultValueReturnsDefaultFloatForFloat(t *testing.T) { + attr := &Attribute{ + ValueType: FloatValueType, + Default: true, + DefaultFloat: 1.0, + } + + value, err := attr.GetNewDefaultValue() + assert.Nil(t, err) + assert.Equal(t, 1.0, value.Value()) +} + +func TestNewDefaultValueReturnsDefaultStringForString(t *testing.T) { + attr := &Attribute{ + ValueType: StringValueType, + Default: true, + DefaultString: "salut", + } + + value, err := attr.GetNewDefaultValue() + assert.Nil(t, err) + assert.Equal(t, "salut", value.Value()) +} + +func TestNewDefaultValueReturnsDefaultBoolForBool(t *testing.T) { + attr := &Attribute{ + ValueType: BooleanValueType, + Default: true, + DefaultBool: true, + } + + value, err := attr.GetNewDefaultValue() + assert.Nil(t, err) + assert.Equal(t, true, value.Value()) +} + +func TestNewDefaultValueReturnsErrorForRelation(t *testing.T) { + attr := &Attribute{ + Default: true, + ValueType: RelationValueType, + } + + _, err := attr.GetNewDefaultValue() + assert.Error(t, err, "can't provide default value for relations") +} + +func TestNewDefaultValueReturnsErrorForUnsupportedType(t *testing.T) { + attr := &Attribute{ + Default: true, + ValueType: "something else", + } + + _, err := attr.GetNewDefaultValue() + assert.Error(t, err, "unsupported ValueType") +} From 805c49a26384d57a4756b2fc232cd884c70fe9dc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 15:57:50 +0200 Subject: [PATCH 071/467] add unit tests for eav controller --- controllers/eav.go | 210 +++--- controllers/eav_test.go | 624 ++++++++++++++++++ ...ication.go => middlewareAuthentication.go} | 2 +- router/middlewares/middlewareJson.go | 2 + router/router.go | 6 +- test_e2e/features/basic_auth.feature | 4 +- 6 files changed, 720 insertions(+), 128 deletions(-) create mode 100644 controllers/eav_test.go rename router/middlewares/{middlewareAuthentification.go => middlewareAuthentication.go} (95%) diff --git a/controllers/eav.go b/controllers/eav.go index 06629030..6a7bae77 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -55,114 +55,34 @@ type eavControllerImpl struct { } func (controller *eavControllerImpl) GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityTypeName := getEntityTypeNameFromRequest(r) - - ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityTypeNotFound - } + ett, herr := controller.getEntityTypeFromRequest(r) + if herr != nil { + return nil, herr } - queryParams := r.URL.Query() var qp = make(map[string]string) - for k, v := range queryParams { + for k, v := range r.URL.Query() { qp[k] = v[0] } - var collection = controller.eavService.GetEntitiesWithParams(ett, qp) - - return collection, nil + return controller.eavService.GetEntitiesWithParams(ett, qp), nil } // The handler responsible for the retrieval of une entity func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - - entityTypeName := getEntityTypeNameFromRequest(r) - controller.logger.Sugar().Debugf("query for %s", entityTypeName) - ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound - } - http.Error(w, GetErrMsg(err.Error()), http.StatusInternalServerError) - return nil, httperrors.NewInternalServerError("db error", "db query failed", err) - } - - id, idErr := getEntityIDFromRequest(r) - if idErr != nil { - return nil, idErr - } - - obj, err := controller.eavService.GetEntity(ett, id) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound - } else if errors.Is(err, eavservice.ErrIDDontMatchEntityType) { - http.Error(w, GetErrMsg(err.Error()), http.StatusBadRequest) - return nil, ErrEntityTypeDontMatchEntity - } else { - return nil, ErrDBQueryFailed(err) - } - } - - return obj, nil -} - -// Extract the "id" parameter from url -func getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { - vars := mux.Vars(r) - id, ok := vars["id"] - if !ok { - return uuid.Nil, ErrEntityNotFound - } - - uid, err := uuid.Parse(id) - if err != nil { - return uuid.Nil, ErrIDNotAnUUID - } - - return uid, nil -} - -// Extract the "type" parameter from url -func getEntityTypeNameFromRequest(r *http.Request) string { - vars := mux.Vars(r) - entityType := vars["type"] - return entityType + return controller.getEntityFromRequest(r) } // The handler responsible for the deletion of entities and their associated value func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityTypeName := getEntityTypeNameFromRequest(r) - ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityTypeNotFound - } - http.Error(w, GetErrMsg(err.Error()), http.StatusInternalServerError) - return nil, httperrors.NewInternalServerError("db error", "search for entity type", err) + entity, herr := controller.getEntityFromRequest(r) + if herr != nil { + return nil, herr } - id, idErr := getEntityIDFromRequest(r) - if idErr != nil { - return nil, idErr - } - - entity, err := controller.eavService.GetEntity(ett, id) + err := controller.eavService.DeleteEntity(entity) if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound - } else if errors.Is(err, eavservice.ErrIDDontMatchEntityType) { - return nil, ErrEntityTypeDontMatchEntity - } else { - return nil, ErrDBQueryFailed(err) - } - } - - err = controller.eavService.DeleteEntity(entity) - if err != nil { - return nil, httperrors.NewInternalServerError("deletion failed", "", err) + return nil, ErrDBQueryFailed(err) } return nil, nil @@ -170,25 +90,19 @@ func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http // The handler responsible for the creation of entities func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityTypeName := getEntityTypeNameFromRequest(r) - ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityTypeNotFound - } - return nil, ErrDBQueryFailed(err) + ett, herr := controller.getEntityTypeFromRequest(r) + if herr != nil { + return nil, herr } - var attrs map[string]any - err = json.NewDecoder(r.Body).Decode(&attrs) - r.Body.Close() - if err != nil { - return nil, httperrors.NewBadRequestError("json decoding failed", "please use a correct json payload for entity creation") + attrs, herr := controller.decodeJSON(r) + if herr != nil { + return nil, herr } et, err := controller.eavService.CreateEntity(ett, attrs) if err != nil { - return nil, httperrors.NewInternalServerError("creation failed", "", err) + return nil, ErrDBQueryFailed(err) } w.Header().Add("Location", buildLocationString(et)) @@ -198,26 +112,49 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http } func buildLocationString(et *models.Entity) string { - return fmt.Sprintf("/v1/objects/%s/%d", et.EntityType.Name, et.ID) + return fmt.Sprintf("/v1/objects/%s/%s", et.EntityType.Name, et.ID.String()) } // The handler responsible for the updates of entities func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityTypeName := getEntityTypeNameFromRequest(r) + entity, herr := controller.getEntityFromRequest(r) + if herr != nil { + return nil, herr + } + + attrs, herr := controller.decodeJSON(r) + if herr != nil { + return nil, herr + } + + err := controller.eavService.UpdateEntity(entity, attrs) + if err != nil { + return nil, ErrDBQueryFailed(err) + } + + return entity, nil +} + +// Extract the "type" parameter from url and get the entity type from the db +func (controller *eavControllerImpl) getEntityTypeFromRequest(r *http.Request) (*models.EntityType, httperrors.HTTPError) { + entityTypeName, present := mux.Vars(r)["type"] + if !present { + return nil, ErrEntityTypeNotFound + } + ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityTypeNotFound } return nil, ErrDBQueryFailed(err) - } - id, err := getEntityIDFromRequest(r) - if err != nil { - return nil, ErrIDNotAnUUID - } + return ett, nil +} +// Gets the Entity object for the given ett and id or returns the appropriate http errors +func (controller *eavControllerImpl) getEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, httperrors.HTTPError) { entity, err := controller.eavService.GetEntity(ett, id) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { @@ -229,21 +166,50 @@ func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http } } - var attrs map[string]any - err = json.NewDecoder(r.Body).Decode(&attrs) - if err != nil { - return nil, ErrDBQueryFailed(err) + return entity, nil +} + +// Gets the Entity object for the given ett and id or returns the appropriate http errors +func (controller *eavControllerImpl) getEntityFromRequest(r *http.Request) (*models.Entity, httperrors.HTTPError) { + ett, herr := controller.getEntityTypeFromRequest(r) + if herr != nil { + return nil, herr + } + + id, herr := controller.getEntityIDFromRequest(r) + if herr != nil { + return nil, herr } - controller.eavService.UpdateEntity(entity, attrs) + entity, herr := controller.getEntity(ett, id) + if herr != nil { + return nil, herr + } return entity, nil } -// return json formatted string to be consumed by frontend or client -func GetErrMsg(msg string) string { - return fmt.Sprintf( - `{"error": %q}`, - msg, - ) +// Extract the "id" parameter from url +func (controller *eavControllerImpl) getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { + id, present := mux.Vars(r)["id"] + if !present { + return uuid.Nil, ErrEntityNotFound + } + + uid, err := uuid.Parse(id) + if err != nil { + return uuid.Nil, ErrIDNotAnUUID + } + + return uid, nil +} + +func (controller *eavControllerImpl) decodeJSON(r *http.Request) (map[string]any, httperrors.HTTPError) { + var attrs map[string]any + err := json.NewDecoder(r.Body).Decode(&attrs) + if err != nil { + return nil, httperrors.NewBadRequestError("json decoding failed", "please use a correct json payload") + } + + return attrs, nil } diff --git a/controllers/eav_test.go b/controllers/eav_test.go new file mode 100644 index 00000000..1b3a54ac --- /dev/null +++ b/controllers/eav_test.go @@ -0,0 +1,624 @@ +package controllers_test + +import ( + "errors" + "net/http/httptest" + "strings" + "testing" + + "github.com/ditrit/badaas/controllers" + mocksEAVService "github.com/ditrit/badaas/mocks/services/eavservice" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services/eavservice" + uuid "github.com/google/uuid" + "github.com/gorilla/mux" + "github.com/stretchr/testify/assert" + "go.uber.org/zap" + "gorm.io/gorm" +) + +var logger, _ = zap.NewDevelopment() + +// ----------------------- GetObject ----------------------- + +func TestGetWithoutTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/", + strings.NewReader(""), + ) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestGetOfNotExistentTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + eavService. + On("GetEntityTypeByName", "no-exists"). + Return(nil, gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/no-exists/id", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestGetWithoutEntityIDReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/exists/", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + +func TestGetWithEntityIDNotUUIDReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/exists/not-uuid", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": "not-uuid"}) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrIDNotAnUUID) +} + +func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := uuid.New() + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("GetEntity", entityType, uuid). + Return(nil, gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + +func TestGetWithEntityIDThatDoesNotMatchEntityTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := uuid.New() + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("GetEntity", entityType, uuid). + Return(nil, eavservice.ErrIDDontMatchEntityType) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeDontMatchEntity) +} + +func TestGetWithErrorInDBReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := uuid.New() + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("GetEntity", entityType, uuid). + Return(nil, errors.New("db error")) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + + _, err := controller.GetObject(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestGetWithCorrectIDReturnsObject(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + entity := &models.Entity{ + EntityType: entityType, + } + + uuid := uuid.New() + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("GetEntity", entityType, uuid). + Return(entity, nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + + entityReturned, err := controller.GetObject(response, request) + assert.Nil(t, err) + assert.Equal(t, entity, entityReturned) +} + +// ----------------------- GetAll ----------------------- + +func TestGetAllOfNotExistentTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + eavService. + On("GetEntityTypeByName", "no-exists"). + Return(nil, gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/no-exists", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) + + _, err := controller.GetAll(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestGetAllWithoutParams(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + entity1 := &models.Entity{ + EntityType: entityType, + } + entity2 := &models.Entity{ + EntityType: entityType, + } + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("GetEntitiesWithParams", entityType, map[string]string{}). + Return([]*models.Entity{entity1, entity2}) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/exists/", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + + entitiesReturned, err := controller.GetAll(response, request) + assert.Nil(t, err) + assert.Len(t, entitiesReturned, 2) + assert.Contains(t, entitiesReturned, entity1) + assert.Contains(t, entitiesReturned, entity2) +} + +func TestGetAllWithParams(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + entity1 := &models.Entity{ + EntityType: entityType, + } + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("GetEntitiesWithParams", entityType, map[string]string{"param1": "something"}). + Return([]*models.Entity{entity1}) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/v1/objects/exists/", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + q := request.URL.Query() + q.Add("param1", "something") + request.URL.RawQuery = q.Encode() + + entitiesReturned, err := controller.GetAll(response, request) + assert.Nil(t, err) + assert.Len(t, entitiesReturned, 1) + assert.Contains(t, entitiesReturned, entity1) +} + +// ----------------------- DeleteObject ----------------------- + +func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + entity := &models.Entity{ + EntityType: entityType, + } + + uuid := uuid.New() + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("GetEntity", entityType, uuid). + Return(entity, nil) + + eavService. + On("DeleteEntity", entity). + Return(errors.New("db error")) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "DELETE", + "/v1/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + + _, err := controller.DeleteObject(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestDeleteObjectReturnsNil(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + entity := &models.Entity{ + EntityType: entityType, + } + + uuid := uuid.New() + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("GetEntity", entityType, uuid). + Return(entity, nil) + + eavService. + On("DeleteEntity", entity). + Return(nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "DELETE", + "/v1/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + + returned, err := controller.DeleteObject(response, request) + assert.Nil(t, err) + assert.Nil(t, returned) +} + +// ----------------------- CreateObject ----------------------- + +func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "POST", + "/v1/objects/exists", + strings.NewReader("bad json"), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + + _, err := controller.CreateObject(response, request) + assert.ErrorContains(t, err, "json decoding failed") +} + +func TestCreteObjectWithErrorInDBReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("CreateEntity", entityType, map[string]any{"1": "1"}). + Return(nil, errors.New("db error")) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "POST", + "/v1/objects/exists", + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + + _, err := controller.CreateObject(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestCreteObjectReturnsObject(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + entity := &models.Entity{ + EntityType: entityType, + } + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("CreateEntity", entityType, map[string]any{"1": "1"}). + Return(entity, nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "POST", + "/v1/objects/exists", + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + + responded, err := controller.CreateObject(response, request) + assert.Nil(t, err) + assert.Equal(t, entity, responded) +} + +// ----------------------- ModifyObject ----------------------- + +func TestModifyObjectWithErrorInDBReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := uuid.New() + entity := &models.Entity{ + EntityType: entityType, + } + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("GetEntity", entityType, uuid). + Return(entity, nil) + + eavService. + On("UpdateEntity", entity, map[string]any{"1": "1"}). + Return(errors.New("db error")) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "PUT", + "/v1/objects/exists/"+uuid.String(), + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + + _, err := controller.ModifyObject(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestModifyObjectReturnsObject(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := uuid.New() + entity := &models.Entity{ + EntityType: entityType, + } + + eavService. + On("GetEntityTypeByName", "exists"). + Return(entityType, nil) + + eavService. + On("GetEntity", entityType, uuid). + Return(entity, nil) + + eavService. + On("UpdateEntity", entity, map[string]any{"1": "1"}). + Return(nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "PUT", + "/v1/objects/exists/"+uuid.String(), + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + + responded, err := controller.ModifyObject(response, request) + assert.Nil(t, err) + assert.Equal(t, entity, responded) +} diff --git a/router/middlewares/middlewareAuthentification.go b/router/middlewares/middlewareAuthentication.go similarity index 95% rename from router/middlewares/middlewareAuthentification.go rename to router/middlewares/middlewareAuthentication.go index f0e94c1b..08c309d8 100644 --- a/router/middlewares/middlewareAuthentification.go +++ b/router/middlewares/middlewareAuthentication.go @@ -11,7 +11,7 @@ import ( ) var ( - NotAuthenticated = httperrors.NewUnauthorizedError("Authentification Error", "not authenticated") + NotAuthenticated = httperrors.NewUnauthorizedError("Authentication Error", "not authenticated") ) // The authentication middleware diff --git a/router/middlewares/middlewareJson.go b/router/middlewares/middlewareJson.go index 1abe0343..d4eaaf9d 100644 --- a/router/middlewares/middlewareJson.go +++ b/router/middlewares/middlewareJson.go @@ -30,6 +30,8 @@ func NewJSONController(logger *zap.Logger) JSONController { // Marshall the response from the JSONHandler and handle HTTPError if needed func (controller *jsonControllerImpl) Wrap(handler JSONHandler) func(response http.ResponseWriter, request *http.Request) { return func(response http.ResponseWriter, request *http.Request) { + defer request.Body.Close() + object, herr := handler(response, request) if herr != nil { herr.Write(response, controller.logger) diff --git a/router/router.go b/router/router.go index b401a1f5..eda453b9 100644 --- a/router/router.go +++ b/router/router.go @@ -17,7 +17,7 @@ func SetupRouter( authenticationMiddleware middlewares.AuthenticationMiddleware, // controllers - basicAuthentificationController controllers.BasicAuthenticationController, + basicAuthenticationController controllers.BasicAuthenticationController, informationController controllers.InformationController, eavController controllers.EAVController, ) http.Handler { @@ -31,14 +31,14 @@ func SetupRouter( router.HandleFunc( "/login", jsonController.Wrap( - basicAuthentificationController.BasicLoginHandler, + basicAuthenticationController.BasicLoginHandler, ), ).Methods("POST") protected := router.PathPrefix("").Subrouter() protected.Use(authenticationMiddleware.Handle) - protected.HandleFunc("/logout", jsonController.Wrap(basicAuthentificationController.Logout)).Methods("GET") + protected.HandleFunc("/logout", jsonController.Wrap(basicAuthenticationController.Logout)).Methods("GET") // CRUD router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.GetObject)).Methods("GET") diff --git a/test_e2e/features/basic_auth.feature b/test_e2e/features/basic_auth.feature index 4900885e..d2d89dc9 100644 --- a/test_e2e/features/basic_auth.feature +++ b/test_e2e/features/basic_auth.feature @@ -1,4 +1,4 @@ -Feature: Login as superadmin using the basic authentification +Feature: Login as superadmin using the basic authentication Scenario: Should be a success on valid credentials When I request "/login" with method "POST" with json @@ -30,6 +30,6 @@ Feature: Login as superadmin using the basic authentification Scenario: Should be an error if we try to logout without login first When I request "/logout" Then status code is "401" - And response field "err" is "Authentification Error" + And response field "err" is "Authentication Error" And response field "msg" is "not authenticated" And response field "status" is "Unauthorized" From 76f3bd6083a83e74b0096c7dcefc496ef8a9af65 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 16:06:30 +0200 Subject: [PATCH 072/467] fix some code smells and remove unused code --- docker/api/Dockerfile | 2 +- persistence/models/Entity.go | 16 ---------------- services/eavservice/eavservice.go | 3 --- 3 files changed, 1 insertion(+), 20 deletions(-) diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile index be1b0bf5..f7d19f53 100644 --- a/docker/api/Dockerfile +++ b/docker/api/Dockerfile @@ -1,5 +1,5 @@ # builder image -FROM golang:1.19-alpine as builder +FROM golang:1.19-alpine AS builder RUN apk add build-base WORKDIR /app COPY commands/ ./commands diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index d6b0621f..5b8398d6 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -2,11 +2,8 @@ package models import ( "encoding/json" - "fmt" uuid "github.com/google/uuid" - - "github.com/ditrit/badaas/utils" ) // Describe an instance of an EntityType @@ -52,19 +49,6 @@ func (e *Entity) encodeAttributes() map[string]any { return pairs } -func (e *Entity) GetValue(attrName string) (interface{}, error) { - value := utils.FindFirst(e.Fields, - func(v *Value) bool { - return v.Attribute.Name == attrName - }, - ) - if value == nil { - return nil, fmt.Errorf("value for attribute %s not found", attrName) - } - - return (*value).Value(), nil -} - func (e Entity) Equal(other Entity) bool { return e.ID == other.ID && e.EntityType.ID == other.EntityType.ID diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 84cdfbc1..fa839f6d 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -3,7 +3,6 @@ package eavservice import ( "errors" "fmt" - "log" uuid "github.com/google/uuid" @@ -139,8 +138,6 @@ func (eavService *eavServiceImpl) GetEntity(ett *models.EntityType, id uuid.UUID // Create a brand new entity func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map[string]any) (*models.Entity, error) { - log.Println(attrs) - // TODO si attr esta vacio da un error raro et := models.NewEntity(ett) for _, a := range ett.Attributes { present := false From efb0e1607f410cf15964ff0abadd748ebe70b4ab Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 16:07:58 +0200 Subject: [PATCH 073/467] change name in int tests --- test_e2e/badaas_e2e_test.go | 2 +- test_integration/eavservice.go | 2 +- test_integration/setup.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index d4305877..d5533743 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -81,7 +81,7 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { // clean db before each scenario - integrationtests.SetupDB(db) + integrationtests.CleanDB(db) adminUser := &models.User{ Username: "admin", diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 4006b97a..a602d9d2 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -40,7 +40,7 @@ func NewEAVServiceIntTestSuite( } func (ts *EAVServiceIntTestSuite) SetupTest() { - SetupDB(ts.db) + CleanDB(ts.db) // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES ts.profileType = &models.EntityType{ diff --git a/test_integration/setup.go b/test_integration/setup.go index f025629b..b4aee8bc 100644 --- a/test_integration/setup.go +++ b/test_integration/setup.go @@ -16,7 +16,7 @@ var ListOfTables = []any{ models.EntityType{}, } -func SetupDB(db *gorm.DB) { +func CleanDB(db *gorm.DB) { // clean database to ensure independency between tests for _, table := range ListOfTables { err := db.Unscoped().Where("1 = 1").Delete(table).Error From 3bd40ea815c9f867c23faa1df7a1ecd6962a8804 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 16:28:42 +0200 Subject: [PATCH 074/467] remove unnecesarry tag from e2e tests --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 89ad3b2f..c4f2f6a9 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -99,7 +99,7 @@ jobs: url: "http://localhost:8000/info" timeout: 60 - name: Run test - run: go test -tags=e2e ./test_e2e -v + run: go test ./test_e2e -v - name: Get logs if: always() run: docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" logs --no-color 2>&1 | tee app.log & From 8a6cf1da6e192da21b5c95925240b4a4de32c70e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 16:28:57 +0200 Subject: [PATCH 075/467] fix typo in readme int tests --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5af8e1c9..dfc36c16 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,7 +26,7 @@ make test_unit ### Integration tests -Integration tests have an available CockroachDB node and the dependency injection system. +Integration tests have available a CockroachDB node and the dependency injection system. Run: From 4a254eeef4e71c443689aaccfcc529bd836134f4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 16:36:27 +0200 Subject: [PATCH 076/467] update change log --- changelog.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/changelog.md b/changelog.md index f1fa60e3..a10e00f3 100644 --- a/changelog.md +++ b/changelog.md @@ -9,26 +9,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Setup project (ci and sonar) +- Setup project (ci and sonar). - Setup e2e test solution (cucumber + docker). - Setup Docker based build system. -- Add default api endpoint `info` -- Setup command based pattern using verdeter -- Add an http error handling mechanism -- Add a json controller -- Add a dto package +- Add default api endpoint `info`. +- Setup command based pattern using verdeter. +- Add an http error handling mechanism. +- Add a json controller. +- Add a dto package. - The tasks in the CI are ran in parallel. -- Add a Generic CRUD Repository +- Add a Generic CRUD Repository. - Add a configuration structure containing all the configuration holder. - Refactor codebase to use the DI framework uber-go/fx. Now all services and controllers relies on interfaces. -- Add an generic ID to the repository interface -- Add a retry mechanism for the database connection +- Add an generic ID to the repository interface. +- Add a retry mechanism for the database connection. - Add `init` flag to migrate database and create admin user. - Add a CONTRIBUTING.md and a documentation file for configuration (configuration.md) - Add a session services. - Add a basic authentication controller. - Now config keys are only declared once with constants in the `configuration/` package. - Add a dto that is returned on a successful login. -- Update verdeter to version v0.4.0 +- Update verdeter to version v0.4.0. +- Add integration tests. +- Add a eav controller to store objects in EAV format. +- Add some examples of data models. [unreleased]: https://github.com/ditrit/badaas/blob/main/changelog.md#unreleased From e325a0558f1d40dbc00b0fe336e21117cb17a73c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 16:41:40 +0200 Subject: [PATCH 077/467] remove unused code in init.sh --- docker/test_db/init.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docker/test_db/init.sh b/docker/test_db/init.sh index ce99e4ae..3f65962b 100755 --- a/docker/test_db/init.sh +++ b/docker/test_db/init.sh @@ -8,11 +8,8 @@ echo "******************************* Starting single cockroach node..." ./cockroach start-single-node --insecure --log-config-file=files/logs.yaml --background -# echo "******************************* Creating user" -# cockroach user set ${COCKROACH_USER} --password 1234 --echo-sql -# cockroach user ls - echo "******************************* Init database" +echo "******************************* |=> Creating init.sql" cat > init.sql < Date: Fri, 21 Apr 2023 16:43:49 +0200 Subject: [PATCH 078/467] go back to only warning logs in db --- docker/test_db/logs.yaml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docker/test_db/logs.yaml b/docker/test_db/logs.yaml index 3beb51b1..87058924 100644 --- a/docker/test_db/logs.yaml +++ b/docker/test_db/logs.yaml @@ -3,7 +3,7 @@ file-defaults: max-group-size: 100MiB file-permissions: 644 buffered-writes: true - filter: INFO + filter: WARNING format: crdb-v2 redact: false redactable: true @@ -11,7 +11,7 @@ file-defaults: auditable: false dir: cockroach-data/logs fluent-defaults: - filter: INFO + filter: WARNING format: json-fluent-compact redact: false redactable: true @@ -22,7 +22,7 @@ http-defaults: unsafe-tls: false timeout: 0s disable-keep-alives: false - filter: INFO + filter: WARNING format: json-compact redact: false redactable: true @@ -32,8 +32,7 @@ sinks: file-groups: default: channels: - INFO: [DEV, OPS] - WARNING: all except [DEV, OPS] + WARNING: all health: channels: [HEALTH] pebble: From 4c65bd9122fb1140ba2492e99c54383d5ed1c10f Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 16:45:06 +0200 Subject: [PATCH 079/467] remove unused http files from examples --- examples/CRUD_birds.http | 111 --------------------------------------- examples/CRUD_posts.http | 36 ------------- 2 files changed, 147 deletions(-) delete mode 100644 examples/CRUD_birds.http delete mode 100644 examples/CRUD_posts.http diff --git a/examples/CRUD_birds.http b/examples/CRUD_birds.http deleted file mode 100644 index 9c027796..00000000 --- a/examples/CRUD_birds.http +++ /dev/null @@ -1,111 +0,0 @@ -@hostname = localhost -@port = 8000 -@host = {{hostname}}:{{port}} - -@URI = http://{{hostname}}:{{port}}/v1 - -@birdid = a6515f18-aa94-46d9-8709-29de2a36ea79 - - -# GET all birds -GET {{URI}}/objects/bird/ HTTP/1.1 -content-type: application/json - -### - -# GET all birds that are blue -GET {{URI}}/objects/bird/?color=blue HTTP/1.1 -content-type: application/json - -### - -# GET a bird -GET {{URI}}/objects/bird/{{birdid}} HTTP/1.1 -content-type: application/json - -### - -# => SHOULD FAIL -# DELETE all birds -DELETE {{URI}}/objects/bird/ HTTP/1.1 -content-type: application/json - -### - -# DELETE a bird -DELETE {{URI}}/objects/bird/{{birdid}} HTTP/1.1 -content-type: application/json - -### - -# CREATE a bird -POST {{URI}}/objects/bird HTTP/1.1 -content-type: application/json - -{ - "color": "red", - "specie": "aigle", - "height": 106, - "owner": 1 -} - -### - -# CREATE => with null field -POST {{URI}}/objects/bird HTTP/1.1 -content-type: application/json - -{ - "color": "orange", - "specie": "bird with null field (field absent of the request)" -} - -### - -# CREATE => with field of null value -POST {{URI}}/objects/bird HTTP/1.1 -content-type: application/json - -{ - "color": "orange", - "specie": "bird with null field", - "height": 50, - "weight": null -} - -### - -# SHOULD FAIl -# CREATE => missing an non nullable field -POST {{URI}}/objects/bird HTTP/1.1 -content-type: application/json - -{ - "specie": "Should not end up in database" -} - -### - -# SHOULD FAIl -# CREATE => sending a null value non a non nullable field -POST {{URI}}/objects/bird HTTP/1.1 -content-type: application/json - -{ - "color": null, - "specie": "Should not end up in database" -} - -### - -# UPDATE a bird -PUT {{URI}}/objects/bird/{{birdid}} HTTP/1.1 -content-type: application/json - -{ - "attrs": { - "color": "red", - "specie": "rouge gorge", - "height": null - } -} \ No newline at end of file diff --git a/examples/CRUD_posts.http b/examples/CRUD_posts.http deleted file mode 100644 index d313e3ef..00000000 --- a/examples/CRUD_posts.http +++ /dev/null @@ -1,36 +0,0 @@ -@hostname = localhost -@port = 8000 -@host = {{hostname}}:{{port}} - -@URI = http://{{hostname}}:{{port}}/v1 - -@postid = a6515f18-aa94-46d9-8709-29de2a36ea79 - - -# GET all posts -GET {{URI}}/objects/post/ HTTP/1.1 -content-type: application/json - -### - -# GET all post owned by a user -GET {{URI}}/objects/post/?ownerID=23764cb8-80f2-4a03-8060-2f3f4c95b978 HTTP/1.1 -content-type: application/json - -### - -# GET a post -GET {{URI}}/objects/post/{{postid}} HTTP/1.1 -content-type: application/json - -### - -# DELETE all posts -DELETE {{URI}}/objects/post/ HTTP/1.1 -content-type: application/json - -### - -# DELETE a post -DELETE {{URI}}/objects/post/{{postid}} HTTP/1.1 -content-type: application/json From 72844ced84e14c8ee813ab330aeca4d174f341a5 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 16:52:53 +0200 Subject: [PATCH 080/467] do not modify session_test in unit tests --- persistence/models/Session_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/persistence/models/Session_test.go b/persistence/models/Session_test.go index 85e2e878..a1fdd240 100644 --- a/persistence/models/Session_test.go +++ b/persistence/models/Session_test.go @@ -1,14 +1,15 @@ -package models +package models_test import ( "testing" "time" + "github.com/ditrit/badaas/persistence/models" "github.com/stretchr/testify/assert" ) func TestExpired(t *testing.T) { - sessionInstance := &Session{ + sessionInstance := &models.Session{ ExpiresAt: time.Now().Add(time.Second), } assert.False(t, sessionInstance.IsExpired()) @@ -18,7 +19,7 @@ func TestExpired(t *testing.T) { func TestCanBeRolled(t *testing.T) { sessionDuration := 500 * time.Millisecond - sessionInstance := &Session{ + sessionInstance := &models.Session{ ExpiresAt: time.Now().Add(sessionDuration), } assert.False(t, sessionInstance.CanBeRolled(sessionDuration/4)) @@ -27,5 +28,5 @@ func TestCanBeRolled(t *testing.T) { } func TestTableName(t *testing.T) { - assert.Equal(t, "sessions", Session{}.TableName()) + assert.Equal(t, "sessions", models.Session{}.TableName()) } From 2cc8ee18b666c426bff6096cf242c1e6611a1e2d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 16:57:24 +0200 Subject: [PATCH 081/467] add comments on repositories --- persistence/repository/EntityRepository.go | 4 ++++ persistence/repository/ValueRepository.go | 1 + 2 files changed, 5 insertions(+) diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index fb6c8373..7ab4061a 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -29,6 +29,10 @@ func NewEntityRepository( } } +// Creates an entity and its values in the database +// must be used in place of gorm's db.Save(entity) because of the bug +// when using gorm with cockroachDB. For more info refer to: +// https://github.com/FrancoLiberali/cockroachdb_gorm_bug func (r *EntityRepository) Create(entity *models.Entity) error { return r.db.Transaction(func(tx *gorm.DB) error { now := time.Now() diff --git a/persistence/repository/ValueRepository.go b/persistence/repository/ValueRepository.go index 34884671..416900bd 100644 --- a/persistence/repository/ValueRepository.go +++ b/persistence/repository/ValueRepository.go @@ -25,6 +25,7 @@ func NewValueRepository( } } +// Creates multiples values in the database func (r *ValueRepository) Create(tx *gorm.DB, values []*models.Value) error { now := time.Now() From 37c37ad90e26808b0dc0ef7b785ae2bc5641f3fa Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 17:02:29 +0200 Subject: [PATCH 082/467] remove unused nix file --- shell.nix | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 shell.nix diff --git a/shell.nix b/shell.nix deleted file mode 100644 index 5c0c010d..00000000 --- a/shell.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ pkgs ? import { } }: - -with pkgs; - -mkShell { - name = "badaas-shell"; - - buildInputs = [ - go - gotools - gopls - go-outline - gocode - gopkgs - gocode-gomod - godef - golint - golangci-lint - ]; -} From e817cedd7cc5adbad8d4ae87e80756ed36d8dcbd Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 21 Apr 2023 17:03:28 +0200 Subject: [PATCH 083/467] remove unused json files --- utils/json.go | 27 --------------------- utils/json_test.go | 58 ---------------------------------------------- 2 files changed, 85 deletions(-) delete mode 100644 utils/json.go delete mode 100644 utils/json_test.go diff --git a/utils/json.go b/utils/json.go deleted file mode 100644 index 460c1122..00000000 --- a/utils/json.go +++ /dev/null @@ -1,27 +0,0 @@ -package utils - -import "strings" - -// build a json from a string slices -// turn []string {`"a",1`, `"b",1`} to `{"a":1,"b":2}` -func BuildJSONFromStrings(pairs []string) string { - var b strings.Builder - // starting the json string - b.WriteString("{") - b.WriteString(strings.Join(pairs, ",")) - //ending the json string - b.WriteString("}") - return b.String() -} - -// build a json list from a string slices -// turn []string {`{"a",1}`, `{"b",1}`} to `["{a":1},{"b":2}]` -func BuildJSONListFromStrings(pairs []string) string { - var b strings.Builder - // starting the json list - b.WriteString("[") - b.WriteString(strings.Join(pairs, ",")) - //ending the json list - b.WriteString("]") - return b.String() -} diff --git a/utils/json_test.go b/utils/json_test.go deleted file mode 100644 index 9e85658c..00000000 --- a/utils/json_test.go +++ /dev/null @@ -1,58 +0,0 @@ -package utils_test - -import ( - "testing" - - "github.com/ditrit/badaas/utils" -) - -type jsonTest struct { - input []string - output string -} - -func TestBuildJsonFromString(t *testing.T) { - testData := []jsonTest{ - { - input: []string{"\"voila\":1"}, - output: "{\"voila\":1}", - }, - { - input: []string{ - "\"voila\":1", - "\"45\":\"231115421 351635 6351sd6351 354qsd35 4qs\"", - }, - output: "{\"voila\":1,\"45\":\"231115421 351635 6351sd6351 354qsd35 4qs\"}", - }, - } - for _, td := range testData { - result := utils.BuildJSONFromStrings(td.input) - if result != td.output { - t.Errorf("Expected %s, got %s", td.output, result) - } - } - -} - -func TestBuildJsonListFromString(t *testing.T) { - testData := []jsonTest{ - { - input: []string{"{\"voila\":1}"}, - output: "[{\"voila\":1}]", - }, - { - input: []string{ - "{\"voila\":1}", - "{\"45\":\"231115421 351635 6351sd6351 354qsd35 4qs\"}", - }, - output: "[{\"voila\":1},{\"45\":\"231115421 351635 6351sd6351 354qsd35 4qs\"}]", - }, - } - for _, td := range testData { - result := utils.BuildJSONListFromStrings(td.input) - if result != td.output { - t.Errorf("Expected %s, got %s", td.output, result) - } - } - -} From 503773ad6de365f11ed2aa79c79f8093208061ee Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Apr 2023 09:45:42 +0200 Subject: [PATCH 084/467] update file tree in contributing --- CONTRIBUTING.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dfc36c16..712304db 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -59,6 +59,7 @@ This is the directory structure we use for the project: - `controllers/` *(Go code)*: Contains all the http controllers, they handle http requests and consume services. - `docs/`: Contains the documentation. - `test_e2e/`: Contains all the feature tests (or end to end tests). +- `test_integration/`: Contains all the integration tests. - `logger/` *(Go code)*: Contains the logger creation logic. Please don't call it from your own services and code, use the dependency injection system. - `persistance/` *(Go code)*: - `/gormdatabase/` *(Go code)*: Contains the logic to create a database. Also contains a go package named `gormzap`: it is a compatibility layer between *gorm.io/gorm* and *github.com/uber-go/zap*. @@ -69,9 +70,10 @@ This is the directory structure we use for the project: - `resources/` *(Go code)*: Contains the resources shared with the rest of the codebase (ex: API version). - `router/` *(Go code)*: Contains http router of badaas. - `/middlewares/` *(Go code)*: Contains the various http middlewares that we use. -- `scripts/e2e/` : Contains the docker-compose file for end-to-end test. +- `docker/` : Contains the docker, docker-compose file and configuration files for different environments. - `/api/` : Contains the Dockerfile to build badaas with a dedicated config file. - - `/db/` : Contains the Dockerfile to build a development version of CockroachDB. + - `/test_db/` : Contains the Dockerfile to build a development/test version of CockroachDB. + - `/test_api/` : Contains files to build a development/test version of the api. - `services/` *(Go code)*: Contains the Dockerfile to build a development version of CockroachDB. - `/auth/protocols/`: Contains the implementations of authentication clients for different protocols. - `/basicauth/` *(Go code)*: Handle the authentication using email/password. From 89ff1811c0e1bf14dd1a7d1be2e3363c99a8a845 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Apr 2023 09:47:47 +0200 Subject: [PATCH 085/467] update file tree in contributing 2 --- CONTRIBUTING.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 712304db..a1319e6b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -86,7 +86,6 @@ At the root of the project, you will find: - The README. - The changelog. -- The files for the E2E test http support. - The LICENSE file. ## Git From 95c168d33a34c262a793704a2b06bd535bf49fe2 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Apr 2023 15:25:41 +0200 Subject: [PATCH 086/467] refactor value --- persistence/models/Value.go | 46 ++----------------------------------- 1 file changed, 2 insertions(+), 44 deletions(-) diff --git a/persistence/models/Value.go b/persistence/models/Value.go index 11b9f98a..aad4dbac 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -80,15 +80,6 @@ func NewRelationIDValue(attr *Attribute, uuidVal uuid.UUID) (*Value, error) { return value, value.SetRelationVal(uuidVal) } -// Check if the Value is whole. eg, no fields are nil -func (v *Value) CheckWhole() error { - if v.Attribute == nil { - return fmt.Errorf("the Attribute pointer is nil in Value at %v", v) - } - - return nil -} - // Return the underlying value as an interface func (v *Value) Value() any { if v.IsNull { @@ -106,20 +97,12 @@ func (v *Value) Value() any { return v.BoolVal case RelationValueType: return v.RelationVal - default: - panic(fmt.Errorf( - "this Attribute.ValueType does not exists (got=%s)", - v.Attribute.ValueType, - )) } + + return nil } func (v *Value) SetNull() error { - err := v.CheckWhole() - if err != nil { - return err - } - if v.Attribute.Required { return fmt.Errorf("can't set null value for a required attribute") } @@ -135,11 +118,6 @@ func (v *Value) SetNull() error { } func (v *Value) SetStringVal(stringVal string) error { - err := v.CheckWhole() - if err != nil { - return err - } - if v.Attribute.ValueType != StringValueType { return ErrAskingForWrongType } @@ -151,11 +129,6 @@ func (v *Value) SetStringVal(stringVal string) error { } func (v *Value) SetIntVal(intVal int) error { - err := v.CheckWhole() - if err != nil { - return err - } - if v.Attribute.ValueType != IntValueType { return ErrAskingForWrongType } @@ -167,11 +140,6 @@ func (v *Value) SetIntVal(intVal int) error { } func (v *Value) SetFloatVal(floatVal float64) error { - err := v.CheckWhole() - if err != nil { - return err - } - if v.Attribute.ValueType != FloatValueType { return ErrAskingForWrongType } @@ -183,11 +151,6 @@ func (v *Value) SetFloatVal(floatVal float64) error { } func (v *Value) SetBooleanVal(boolVal bool) error { - err := v.CheckWhole() - if err != nil { - return err - } - if v.Attribute.ValueType != BooleanValueType { return ErrAskingForWrongType } @@ -199,11 +162,6 @@ func (v *Value) SetBooleanVal(boolVal bool) error { } func (v *Value) SetRelationVal(relationVal uuid.UUID) error { - err := v.CheckWhole() - if err != nil { - return err - } - if v.Attribute.ValueType != RelationValueType { return ErrAskingForWrongType } From 2c0804a59b254963d3e7283016d8c9f3d269b3cc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Apr 2023 15:26:04 +0200 Subject: [PATCH 087/467] refactor create entity --- services/eavservice/eavservice.go | 123 +++++++++++------------------- 1 file changed, 43 insertions(+), 80 deletions(-) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index fa839f6d..25cd6ebf 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -24,8 +24,8 @@ type EAVService interface { GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity DeleteEntity(et *models.Entity) error GetEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, error) - CreateEntity(ett *models.EntityType, attrs map[string]interface{}) (*models.Entity, error) - UpdateEntity(et *models.Entity, attrs map[string]interface{}) error + CreateEntity(ett *models.EntityType, attrs map[string]any) (*models.Entity, error) + UpdateEntity(et *models.Entity, attrs map[string]any) error } type eavServiceImpl struct { @@ -137,94 +137,57 @@ func (eavService *eavServiceImpl) GetEntity(ett *models.EntityType, id uuid.UUID } // Create a brand new entity -func (eavService *eavServiceImpl) CreateEntity(ett *models.EntityType, attrs map[string]any) (*models.Entity, error) { - et := models.NewEntity(ett) - for _, a := range ett.Attributes { - present := false - - var value *models.Value - var err error - - for k, v := range attrs { - if k == a.Name { - present = true - - switch t := v.(type) { - case string: - if a.ValueType == models.RelationValueType { - uuidVal, err := uuid.Parse(t) - if err != nil { - return nil, ErrCantParseUUID - } - // TODO verify that exists - value, err = models.NewRelationIDValue(a, uuidVal) - if err != nil { - return nil, err - } - } else { - value, err = models.NewStringValue(a, t) - if err != nil { - return nil, err - } - } - case int: - value, err = models.NewIntValue(a, t) - if err != nil { - return nil, err - } - case float64: - if utils.IsAnInt(t) && a.ValueType == models.IntValueType { - value, err = models.NewIntValue(a, int(t)) - if err != nil { - return nil, err - } - } else { - value, err = models.NewFloatValue(a, t) - if err != nil { - return nil, err - } - } - case bool: - value, err = models.NewBoolValue(a, t) - if err != nil { - return nil, err - } - case nil: - value, err = models.NewNullValue(a) - if err != nil { - return nil, err - } - default: - return nil, fmt.Errorf("unsupported type") - } - } +func (eavService *eavServiceImpl) CreateEntity(entityType *models.EntityType, params map[string]any) (*models.Entity, error) { + entity := models.NewEntity(entityType) + for _, attribute := range entityType.Attributes { + value, err := eavService.createValueFromParams(attribute, params) + if err != nil { + return nil, err } + entity.Fields = append(entity.Fields, value) + } - if !present { - if a.Required { - return nil, fmt.Errorf("field %s is missing and is required", a.Name) - } + return entity, eavService.entityRepository.Create(entity) +} - if a.Default { - value, err = a.GetNewDefaultValue() +func (eavService *eavServiceImpl) createValueFromParams(attribute *models.Attribute, params map[string]any) (*models.Value, error) { + attributeValue, isPresent := params[attribute.Name] + if isPresent { + switch attributeValueTyped := attributeValue.(type) { + case string: + if attribute.ValueType == models.RelationValueType { + uuidVal, err := uuid.Parse(attributeValueTyped) if err != nil { - return nil, err - } - } else { - value, err = models.NewNullValue(a) - if err != nil { - return nil, err + return nil, ErrCantParseUUID } + // TODO verify that exists + return models.NewRelationIDValue(attribute, uuidVal) + } + return models.NewStringValue(attribute, attributeValueTyped) + case int: + return models.NewIntValue(attribute, attributeValueTyped) + case float64: + if utils.IsAnInt(attributeValueTyped) && attribute.ValueType == models.IntValueType { + return models.NewIntValue(attribute, int(attributeValueTyped)) } + return models.NewFloatValue(attribute, attributeValueTyped) + case bool: + return models.NewBoolValue(attribute, attributeValueTyped) + case nil: + return models.NewNullValue(attribute) + default: + return nil, fmt.Errorf("unsupported type") } - - et.Fields = append(et.Fields, value) } - return et, eavService.entityRepository.Create(et) + if attribute.Default { + return attribute.GetNewDefaultValue() + } else if attribute.Required { + return nil, fmt.Errorf("field %s is missing and is required", attribute.Name) + } + return models.NewNullValue(attribute) } - -func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[string]interface{}) error { +func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[string]any) error { for _, value := range et.Fields { attribute := value.Attribute for k, v := range attrs { From 44bf517a002232703d34f30a71f323d89a572b40 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Apr 2023 15:40:18 +0200 Subject: [PATCH 088/467] get entities with params --- services/eavservice/eavservice.go | 90 +++++++++++++++++-------------- 1 file changed, 50 insertions(+), 40 deletions(-) diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index 25cd6ebf..f1a76fa7 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -58,60 +58,70 @@ func (eavService *eavServiceImpl) GetEntityTypeByName(name string) (*models.Enti return &ett, nil } -func (eavService *eavServiceImpl) GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity { - // TODO relations join - var entities []*models.Entity - +// Get entities of type entityType that match all conditions given in params +// params are in {"attributeName": expectedValue} format +// TODO relations join +func (eavService *eavServiceImpl) GetEntitiesWithParams(entityType *models.EntityType, params map[string]string) []*models.Entity { query := eavService.db.Select("entities.*") - for _, attr := range ett.Attributes { - v, present := params[attr.Name] - if present { - var valToUse string - if v != "null" { // TODO should be changed to be able to use nil - switch attr.ValueType { - case models.StringValueType: - valToUse = "string_val" - case models.IntValueType: - valToUse = "int_val" - case models.FloatValueType: - valToUse = "float_val" - case models.BooleanValueType: - valToUse = "bool_val" - case models.RelationValueType: - valToUse = "relation_val" - } - } else { - valToUse = "is_null" - v = "true" - } - - query = query.Joins( - fmt.Sprintf(` - JOIN attributes ON - attributes.entity_type_id = entities.entity_type_id - AND attributes.name = ? - JOIN values ON - values.attribute_id = attributes.id - AND values.entity_id = entities.id - AND values.%s = ?`, - valToUse, - ), - attr.Name, v, - ) + // only entities that match the conditions in params + for _, attribute := range entityType.Attributes { + expectedValue, isPresent := params[attribute.Name] + if isPresent { + query = eavService.addValueCheckToQuery(query, attribute, expectedValue) } } + // only entities of type entityType query = query.Where( "entities.entity_type_id = ?", - ett.ID, + entityType.ID, ) + + // execute query + var entities []*models.Entity query = query.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType") query.Find(&entities) return entities } +// Adds to the query the verification that the value for the attribute is expectedValue +func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attribute *models.Attribute, expectedValue string) *gorm.DB { + var valToUseInQuery string + if expectedValue != "null" { // TODO should be changed to be able to use nil + switch attribute.ValueType { + case models.StringValueType: + valToUseInQuery = "string_val" + case models.IntValueType: + valToUseInQuery = "int_val" + case models.FloatValueType: + valToUseInQuery = "float_val" + case models.BooleanValueType: + valToUseInQuery = "bool_val" + case models.RelationValueType: + valToUseInQuery = "relation_val" + } + } else { + valToUseInQuery = "is_null" + expectedValue = "true" + } + + return query.Joins( + fmt.Sprintf( + `JOIN attributes ON + attributes.entity_type_id = entities.entity_type_id + AND attributes.name = ? + JOIN values ON + values.attribute_id = attributes.id + AND values.entity_id = entities.id + AND values.%s = ?`, + valToUseInQuery, + ), + attribute.Name, expectedValue, + ) +} + // Delete an entity and its values func (eavService *eavServiceImpl) DeleteEntity(et *models.Entity) error { return eavService.db.Transaction(func(tx *gorm.DB) error { From 4b8f2f68234657b3d981d4789955384cd04a4106 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 11:44:29 +0200 Subject: [PATCH 089/467] refactor eav controller and eav service --- Makefile | 3 + controllers/eav.go | 136 ++++++------ controllers/eav_test.go | 191 ++++------------ mocks/services/eavservice/EAVService.go | 104 +++++---- persistence/models/Entity.go | 6 +- services/eavservice/eavservice.go | 284 ++++++++++++------------ test_integration/eavservice.go | 227 ++++++++++++------- 7 files changed, 442 insertions(+), 509 deletions(-) diff --git a/Makefile b/Makefile index fb99e947..25b538bf 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,9 @@ test_e2e: ./docker/wait_for_api.sh 8000/info go test ./test_e2e -v +test_generate_mocks: + mockery --all --keeptree + example_birds: EXAMPLE=birds docker compose -f "docker/api/docker-compose.yml" up diff --git a/controllers/eav.go b/controllers/eav.go index 6a7bae77..28924540 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -17,21 +17,20 @@ import ( ) var ( - ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid entity id") - ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists in the schema") - ErrIDNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") - ErrEntityTypeDontMatchEntity = httperrors.NewBadRequestError("types don't match", "the entity you are targeting don't match the entity type name provided") - ErrDBQueryFailed = func(err error) httperrors.HTTPError { + ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid entity id") + ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists in the schema") + ErrIDNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") + ErrDBQueryFailed = func(err error) httperrors.HTTPError { return httperrors.NewInternalServerError("db error", "database query failed", err) } ) type EAVController interface { - GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) ModifyObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) } // check interface compliance @@ -54,43 +53,49 @@ type eavControllerImpl struct { eavService eavservice.EAVService } -func (controller *eavControllerImpl) GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - ett, herr := controller.getEntityTypeFromRequest(r) +// The handler responsible for the retrieval of une entity +func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) if herr != nil { return nil, herr } - var qp = make(map[string]string) - for k, v := range r.URL.Query() { - qp[k] = v[0] + entity, err := controller.eavService.GetEntity(entityTypeName, entityID) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } + return nil, ErrDBQueryFailed(err) } - return controller.eavService.GetEntitiesWithParams(ett, qp), nil -} - -// The handler responsible for the retrieval of une entity -func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - return controller.getEntityFromRequest(r) + return entity, nil } -// The handler responsible for the deletion of entities and their associated value -func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entity, herr := controller.getEntityFromRequest(r) +func (controller *eavControllerImpl) GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) if herr != nil { return nil, herr } - err := controller.eavService.DeleteEntity(entity) + var qp = make(map[string]string) + for k, v := range r.URL.Query() { + qp[k] = v[0] + } + + entities, err := controller.eavService.GetEntities(entityTypeName, qp) if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityTypeNotFound + } return nil, ErrDBQueryFailed(err) } - return nil, nil + return entities, nil } // The handler responsible for the creation of entities func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - ett, herr := controller.getEntityTypeFromRequest(r) + entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) if herr != nil { return nil, herr } @@ -100,15 +105,18 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http return nil, herr } - et, err := controller.eavService.CreateEntity(ett, attrs) + entity, err := controller.eavService.CreateEntity(entityTypeName, attrs) if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityTypeNotFound + } return nil, ErrDBQueryFailed(err) } - w.Header().Add("Location", buildLocationString(et)) + w.Header().Add("Location", buildLocationString(entity)) w.WriteHeader(http.StatusCreated) - return et, nil + return entity, nil } func buildLocationString(et *models.Entity) string { @@ -117,7 +125,7 @@ func buildLocationString(et *models.Entity) string { // The handler responsible for the updates of entities func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entity, herr := controller.getEntityFromRequest(r) + entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) if herr != nil { return nil, herr } @@ -127,66 +135,42 @@ func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http return nil, herr } - err := controller.eavService.UpdateEntity(entity, attrs) + entity, err := controller.eavService.UpdateEntity(entityTypeName, entityID, attrs) if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } return nil, ErrDBQueryFailed(err) } return entity, nil } -// Extract the "type" parameter from url and get the entity type from the db -func (controller *eavControllerImpl) getEntityTypeFromRequest(r *http.Request) (*models.EntityType, httperrors.HTTPError) { - entityTypeName, present := mux.Vars(r)["type"] - if !present { - return nil, ErrEntityTypeNotFound - } - - ett, err := controller.eavService.GetEntityTypeByName(entityTypeName) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityTypeNotFound - } - return nil, ErrDBQueryFailed(err) +// The handler responsible for the deletion of entities and their associated value +func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) + if herr != nil { + return nil, herr } - return ett, nil -} - -// Gets the Entity object for the given ett and id or returns the appropriate http errors -func (controller *eavControllerImpl) getEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, httperrors.HTTPError) { - entity, err := controller.eavService.GetEntity(ett, id) + err := controller.eavService.DeleteEntity(entityTypeName, entityID) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound - } else if errors.Is(err, eavservice.ErrIDDontMatchEntityType) { - return nil, ErrEntityTypeDontMatchEntity - } else { - return nil, ErrDBQueryFailed(err) } + return nil, ErrDBQueryFailed(err) } - return entity, nil + return nil, nil } -// Gets the Entity object for the given ett and id or returns the appropriate http errors -func (controller *eavControllerImpl) getEntityFromRequest(r *http.Request) (*models.Entity, httperrors.HTTPError) { - ett, herr := controller.getEntityTypeFromRequest(r) - if herr != nil { - return nil, herr - } - - id, herr := controller.getEntityIDFromRequest(r) - if herr != nil { - return nil, herr - } - - entity, herr := controller.getEntity(ett, id) - if herr != nil { - return nil, herr +func (controller *eavControllerImpl) getEntityTypeNameFromRequest(r *http.Request) (string, httperrors.HTTPError) { + entityTypeName, present := mux.Vars(r)["type"] + if !present { + return "", ErrEntityTypeNotFound } - return entity, nil + return entityTypeName, nil } // Extract the "id" parameter from url @@ -204,6 +188,20 @@ func (controller *eavControllerImpl) getEntityIDFromRequest(r *http.Request) (uu return uid, nil } +func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Request) (string, uuid.UUID, httperrors.HTTPError) { + entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) + if herr != nil { + return "", uuid.Nil, herr + } + + entityID, herr := controller.getEntityIDFromRequest(r) + if herr != nil { + return "", uuid.Nil, herr + } + + return entityTypeName, entityID, nil +} + func (controller *eavControllerImpl) decodeJSON(r *http.Request) (map[string]any, httperrors.HTTPError) { var attrs map[string]any err := json.NewDecoder(r.Body).Decode(&attrs) diff --git a/controllers/eav_test.go b/controllers/eav_test.go index 1b3a54ac..3a3b3b12 100644 --- a/controllers/eav_test.go +++ b/controllers/eav_test.go @@ -9,7 +9,6 @@ import ( "github.com/ditrit/badaas/controllers" mocksEAVService "github.com/ditrit/badaas/mocks/services/eavservice" "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/services/eavservice" uuid "github.com/google/uuid" "github.com/gorilla/mux" "github.com/stretchr/testify/assert" @@ -42,8 +41,9 @@ func TestGetWithoutTypeReturnsError(t *testing.T) { func TestGetOfNotExistentTypeReturnsError(t *testing.T) { eavService := mocksEAVService.NewEAVService(t) + uuid := uuid.New() eavService. - On("GetEntityTypeByName", "no-exists"). + On("GetEntity", "no-exists", uuid). Return(nil, gorm.ErrRecordNotFound) controller := controllers.NewEAVController( @@ -56,10 +56,10 @@ func TestGetOfNotExistentTypeReturnsError(t *testing.T) { "/v1/objects/no-exists/id", strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) _, err := controller.GetObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) } func TestGetWithoutEntityIDReturnsError(t *testing.T) { @@ -69,10 +69,6 @@ func TestGetWithoutEntityIDReturnsError(t *testing.T) { Name: "entityType", } - eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - controller := controllers.NewEAVController( logger, eavService, @@ -83,7 +79,7 @@ func TestGetWithoutEntityIDReturnsError(t *testing.T) { "/v1/objects/exists/", strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) _, err := controller.GetObject(response, request) assert.ErrorIs(t, err, controllers.ErrEntityNotFound) @@ -96,10 +92,6 @@ func TestGetWithEntityIDNotUUIDReturnsError(t *testing.T) { Name: "entityType", } - eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - controller := controllers.NewEAVController( logger, eavService, @@ -110,7 +102,7 @@ func TestGetWithEntityIDNotUUIDReturnsError(t *testing.T) { "/v1/objects/exists/not-uuid", strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": "not-uuid"}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": "not-uuid"}) _, err := controller.GetObject(response, request) assert.ErrorIs(t, err, controllers.ErrIDNotAnUUID) @@ -126,11 +118,7 @@ func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { uuid := uuid.New() eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("GetEntity", entityType, uuid). + On("GetEntity", entityType.Name, uuid). Return(nil, gorm.ErrRecordNotFound) controller := controllers.NewEAVController( @@ -143,45 +131,12 @@ func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { "/v1/objects/exists/"+uuid.String(), strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) _, err := controller.GetObject(response, request) assert.ErrorIs(t, err, controllers.ErrEntityNotFound) } -func TestGetWithEntityIDThatDoesNotMatchEntityTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - uuid := uuid.New() - - eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("GetEntity", entityType, uuid). - Return(nil, eavservice.ErrIDDontMatchEntityType) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - "GET", - "/v1/objects/exists/"+uuid.String(), - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) - - _, err := controller.GetObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityTypeDontMatchEntity) -} - func TestGetWithErrorInDBReturnsError(t *testing.T) { eavService := mocksEAVService.NewEAVService(t) @@ -192,11 +147,7 @@ func TestGetWithErrorInDBReturnsError(t *testing.T) { uuid := uuid.New() eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("GetEntity", entityType, uuid). + On("GetEntity", entityType.Name, uuid). Return(nil, errors.New("db error")) controller := controllers.NewEAVController( @@ -209,7 +160,7 @@ func TestGetWithErrorInDBReturnsError(t *testing.T) { "/v1/objects/exists/"+uuid.String(), strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) _, err := controller.GetObject(response, request) assert.ErrorContains(t, err, "db error") @@ -229,11 +180,7 @@ func TestGetWithCorrectIDReturnsObject(t *testing.T) { uuid := uuid.New() eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("GetEntity", entityType, uuid). + On("GetEntity", entityType.Name, uuid). Return(entity, nil) controller := controllers.NewEAVController( @@ -246,7 +193,7 @@ func TestGetWithCorrectIDReturnsObject(t *testing.T) { "/v1/objects/exists/"+uuid.String(), strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) entityReturned, err := controller.GetObject(response, request) assert.Nil(t, err) @@ -255,12 +202,12 @@ func TestGetWithCorrectIDReturnsObject(t *testing.T) { // ----------------------- GetAll ----------------------- -func TestGetAllOfNotExistentTypeReturnsError(t *testing.T) { +func TestGetAllOfNotExistentTypeReturnsEmpty(t *testing.T) { eavService := mocksEAVService.NewEAVService(t) eavService. - On("GetEntityTypeByName", "no-exists"). - Return(nil, gorm.ErrRecordNotFound) + On("GetEntities", "no-exists", map[string]string{}). + Return([]*models.Entity{}, nil) controller := controllers.NewEAVController( logger, @@ -274,8 +221,9 @@ func TestGetAllOfNotExistentTypeReturnsError(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) - _, err := controller.GetAll(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) + entities, err := controller.GetAll(response, request) + assert.Nil(t, err) + assert.Len(t, entities, 0) } func TestGetAllWithoutParams(t *testing.T) { @@ -293,12 +241,8 @@ func TestGetAllWithoutParams(t *testing.T) { } eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("GetEntitiesWithParams", entityType, map[string]string{}). - Return([]*models.Entity{entity1, entity2}) + On("GetEntities", entityType.Name, map[string]string{}). + Return([]*models.Entity{entity1, entity2}, nil) controller := controllers.NewEAVController( logger, @@ -310,7 +254,7 @@ func TestGetAllWithoutParams(t *testing.T) { "/v1/objects/exists/", strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) entitiesReturned, err := controller.GetAll(response, request) assert.Nil(t, err) @@ -331,12 +275,8 @@ func TestGetAllWithParams(t *testing.T) { } eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("GetEntitiesWithParams", entityType, map[string]string{"param1": "something"}). - Return([]*models.Entity{entity1}) + On("GetEntities", entityType.Name, map[string]string{"param1": "something"}). + Return([]*models.Entity{entity1}, nil) controller := controllers.NewEAVController( logger, @@ -348,7 +288,7 @@ func TestGetAllWithParams(t *testing.T) { "/v1/objects/exists/", strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) q := request.URL.Query() q.Add("param1", "something") request.URL.RawQuery = q.Encode() @@ -368,22 +308,10 @@ func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { Name: "entityType", } - entity := &models.Entity{ - EntityType: entityType, - } - uuid := uuid.New() eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("GetEntity", entityType, uuid). - Return(entity, nil) - - eavService. - On("DeleteEntity", entity). + On("DeleteEntity", entityType.Name, uuid). Return(errors.New("db error")) controller := controllers.NewEAVController( @@ -396,7 +324,7 @@ func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { "/v1/objects/exists/"+uuid.String(), strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) _, err := controller.DeleteObject(response, request) assert.ErrorContains(t, err, "db error") @@ -409,22 +337,10 @@ func TestDeleteObjectReturnsNil(t *testing.T) { Name: "entityType", } - entity := &models.Entity{ - EntityType: entityType, - } - uuid := uuid.New() eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("GetEntity", entityType, uuid). - Return(entity, nil) - - eavService. - On("DeleteEntity", entity). + On("DeleteEntity", entityType.Name, uuid). Return(nil) controller := controllers.NewEAVController( @@ -437,7 +353,7 @@ func TestDeleteObjectReturnsNil(t *testing.T) { "/v1/objects/exists/"+uuid.String(), strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) returned, err := controller.DeleteObject(response, request) assert.Nil(t, err) @@ -453,10 +369,6 @@ func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { Name: "entityType", } - eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - controller := controllers.NewEAVController( logger, eavService, @@ -467,7 +379,7 @@ func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { "/v1/objects/exists", strings.NewReader("bad json"), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) _, err := controller.CreateObject(response, request) assert.ErrorContains(t, err, "json decoding failed") @@ -481,11 +393,7 @@ func TestCreteObjectWithErrorInDBReturnsError(t *testing.T) { } eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("CreateEntity", entityType, map[string]any{"1": "1"}). + On("CreateEntity", entityType.Name, map[string]any{"1": "1"}). Return(nil, errors.New("db error")) controller := controllers.NewEAVController( @@ -498,7 +406,7 @@ func TestCreteObjectWithErrorInDBReturnsError(t *testing.T) { "/v1/objects/exists", strings.NewReader("{\"1\": \"1\"}"), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) _, err := controller.CreateObject(response, request) assert.ErrorContains(t, err, "db error") @@ -516,11 +424,7 @@ func TestCreteObjectReturnsObject(t *testing.T) { } eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("CreateEntity", entityType, map[string]any{"1": "1"}). + On("CreateEntity", entityType.Name, map[string]any{"1": "1"}). Return(entity, nil) controller := controllers.NewEAVController( @@ -533,7 +437,7 @@ func TestCreteObjectReturnsObject(t *testing.T) { "/v1/objects/exists", strings.NewReader("{\"1\": \"1\"}"), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists"}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) responded, err := controller.CreateObject(response, request) assert.Nil(t, err) @@ -550,21 +454,10 @@ func TestModifyObjectWithErrorInDBReturnsError(t *testing.T) { } uuid := uuid.New() - entity := &models.Entity{ - EntityType: entityType, - } - - eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) eavService. - On("GetEntity", entityType, uuid). - Return(entity, nil) - - eavService. - On("UpdateEntity", entity, map[string]any{"1": "1"}). - Return(errors.New("db error")) + On("UpdateEntity", entityType.Name, uuid, map[string]any{"1": "1"}). + Return(nil, errors.New("db error")) controller := controllers.NewEAVController( logger, @@ -576,7 +469,7 @@ func TestModifyObjectWithErrorInDBReturnsError(t *testing.T) { "/v1/objects/exists/"+uuid.String(), strings.NewReader("{\"1\": \"1\"}"), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) _, err := controller.ModifyObject(response, request) assert.ErrorContains(t, err, "db error") @@ -595,17 +488,9 @@ func TestModifyObjectReturnsObject(t *testing.T) { } eavService. - On("GetEntityTypeByName", "exists"). - Return(entityType, nil) - - eavService. - On("GetEntity", entityType, uuid). + On("UpdateEntity", entityType.Name, uuid, map[string]any{"1": "1"}). Return(entity, nil) - eavService. - On("UpdateEntity", entity, map[string]any{"1": "1"}). - Return(nil) - controller := controllers.NewEAVController( logger, eavService, @@ -616,7 +501,7 @@ func TestModifyObjectReturnsObject(t *testing.T) { "/v1/objects/exists/"+uuid.String(), strings.NewReader("{\"1\": \"1\"}"), ) - request = mux.SetURLVars(request, map[string]string{"type": "exists", "id": uuid.String()}) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) responded, err := controller.ModifyObject(response, request) assert.Nil(t, err) diff --git a/mocks/services/eavservice/EAVService.go b/mocks/services/eavservice/EAVService.go index d27f1946..16c6f570 100644 --- a/mocks/services/eavservice/EAVService.go +++ b/mocks/services/eavservice/EAVService.go @@ -14,25 +14,25 @@ type EAVService struct { mock.Mock } -// CreateEntity provides a mock function with given fields: ett, attrs -func (_m *EAVService) CreateEntity(ett *models.EntityType, attrs map[string]interface{}) (*models.Entity, error) { - ret := _m.Called(ett, attrs) +// CreateEntity provides a mock function with given fields: entityTypeName, attrs +func (_m *EAVService) CreateEntity(entityTypeName string, attrs map[string]interface{}) (*models.Entity, error) { + ret := _m.Called(entityTypeName, attrs) var r0 *models.Entity var r1 error - if rf, ok := ret.Get(0).(func(*models.EntityType, map[string]interface{}) (*models.Entity, error)); ok { - return rf(ett, attrs) + if rf, ok := ret.Get(0).(func(string, map[string]interface{}) (*models.Entity, error)); ok { + return rf(entityTypeName, attrs) } - if rf, ok := ret.Get(0).(func(*models.EntityType, map[string]interface{}) *models.Entity); ok { - r0 = rf(ett, attrs) + if rf, ok := ret.Get(0).(func(string, map[string]interface{}) *models.Entity); ok { + r0 = rf(entityTypeName, attrs) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*models.Entity) } } - if rf, ok := ret.Get(1).(func(*models.EntityType, map[string]interface{}) error); ok { - r1 = rf(ett, attrs) + if rf, ok := ret.Get(1).(func(string, map[string]interface{}) error); ok { + r1 = rf(entityTypeName, attrs) } else { r1 = ret.Error(1) } @@ -40,13 +40,13 @@ func (_m *EAVService) CreateEntity(ett *models.EntityType, attrs map[string]inte return r0, r1 } -// DeleteEntity provides a mock function with given fields: et -func (_m *EAVService) DeleteEntity(et *models.Entity) error { - ret := _m.Called(et) +// DeleteEntity provides a mock function with given fields: entityTypeName, entityID +func (_m *EAVService) DeleteEntity(entityTypeName string, entityID uuid.UUID) error { + ret := _m.Called(entityTypeName, entityID) var r0 error - if rf, ok := ret.Get(0).(func(*models.Entity) error); ok { - r0 = rf(et) + if rf, ok := ret.Get(0).(func(string, uuid.UUID) error); ok { + r0 = rf(entityTypeName, entityID) } else { r0 = ret.Error(0) } @@ -54,41 +54,51 @@ func (_m *EAVService) DeleteEntity(et *models.Entity) error { return r0 } -// GetEntitiesWithParams provides a mock function with given fields: ett, params -func (_m *EAVService) GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity { - ret := _m.Called(ett, params) +// GetEntities provides a mock function with given fields: entityTypeName, conditions +func (_m *EAVService) GetEntities(entityTypeName string, conditions map[string]string) ([]*models.Entity, error) { + ret := _m.Called(entityTypeName, conditions) var r0 []*models.Entity - if rf, ok := ret.Get(0).(func(*models.EntityType, map[string]string) []*models.Entity); ok { - r0 = rf(ett, params) + var r1 error + if rf, ok := ret.Get(0).(func(string, map[string]string) ([]*models.Entity, error)); ok { + return rf(entityTypeName, conditions) + } + if rf, ok := ret.Get(0).(func(string, map[string]string) []*models.Entity); ok { + r0 = rf(entityTypeName, conditions) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*models.Entity) } } - return r0 + if rf, ok := ret.Get(1).(func(string, map[string]string) error); ok { + r1 = rf(entityTypeName, conditions) + } else { + r1 = ret.Error(1) + } + + return r0, r1 } -// GetEntity provides a mock function with given fields: ett, id -func (_m *EAVService) GetEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, error) { - ret := _m.Called(ett, id) +// GetEntity provides a mock function with given fields: entityTypeName, id +func (_m *EAVService) GetEntity(entityTypeName string, id uuid.UUID) (*models.Entity, error) { + ret := _m.Called(entityTypeName, id) var r0 *models.Entity var r1 error - if rf, ok := ret.Get(0).(func(*models.EntityType, uuid.UUID) (*models.Entity, error)); ok { - return rf(ett, id) + if rf, ok := ret.Get(0).(func(string, uuid.UUID) (*models.Entity, error)); ok { + return rf(entityTypeName, id) } - if rf, ok := ret.Get(0).(func(*models.EntityType, uuid.UUID) *models.Entity); ok { - r0 = rf(ett, id) + if rf, ok := ret.Get(0).(func(string, uuid.UUID) *models.Entity); ok { + r0 = rf(entityTypeName, id) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*models.Entity) } } - if rf, ok := ret.Get(1).(func(*models.EntityType, uuid.UUID) error); ok { - r1 = rf(ett, id) + if rf, ok := ret.Get(1).(func(string, uuid.UUID) error); ok { + r1 = rf(entityTypeName, id) } else { r1 = ret.Error(1) } @@ -96,25 +106,25 @@ func (_m *EAVService) GetEntity(ett *models.EntityType, id uuid.UUID) (*models.E return r0, r1 } -// GetEntityTypeByName provides a mock function with given fields: name -func (_m *EAVService) GetEntityTypeByName(name string) (*models.EntityType, error) { - ret := _m.Called(name) +// UpdateEntity provides a mock function with given fields: entityTypeName, entityID, newValues +func (_m *EAVService) UpdateEntity(entityTypeName string, entityID uuid.UUID, newValues map[string]interface{}) (*models.Entity, error) { + ret := _m.Called(entityTypeName, entityID, newValues) - var r0 *models.EntityType + var r0 *models.Entity var r1 error - if rf, ok := ret.Get(0).(func(string) (*models.EntityType, error)); ok { - return rf(name) + if rf, ok := ret.Get(0).(func(string, uuid.UUID, map[string]interface{}) (*models.Entity, error)); ok { + return rf(entityTypeName, entityID, newValues) } - if rf, ok := ret.Get(0).(func(string) *models.EntityType); ok { - r0 = rf(name) + if rf, ok := ret.Get(0).(func(string, uuid.UUID, map[string]interface{}) *models.Entity); ok { + r0 = rf(entityTypeName, entityID, newValues) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*models.EntityType) + r0 = ret.Get(0).(*models.Entity) } } - if rf, ok := ret.Get(1).(func(string) error); ok { - r1 = rf(name) + if rf, ok := ret.Get(1).(func(string, uuid.UUID, map[string]interface{}) error); ok { + r1 = rf(entityTypeName, entityID, newValues) } else { r1 = ret.Error(1) } @@ -122,20 +132,6 @@ func (_m *EAVService) GetEntityTypeByName(name string) (*models.EntityType, erro return r0, r1 } -// UpdateEntity provides a mock function with given fields: et, attrs -func (_m *EAVService) UpdateEntity(et *models.Entity, attrs map[string]interface{}) error { - ret := _m.Called(et, attrs) - - var r0 error - if rf, ok := ret.Get(0).(func(*models.Entity, map[string]interface{}) error); ok { - r0 = rf(et, attrs) - } else { - r0 = ret.Error(0) - } - - return r0 -} - type mockConstructorTestingTNewEAVService interface { mock.TestingT Cleanup(func()) diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 5b8398d6..0a2b67e6 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -31,13 +31,13 @@ func (e *Entity) MarshalJSON() ([]byte, error) { dto["type"] = e.EntityType.Name dto["createdAt"] = e.CreatedAt dto["updatedAt"] = e.UpdatedAt - dto["attrs"] = e.encodeAttributes() + dto["attrs"] = e.encodeValues() return json.Marshal(dto) } -// return the attribute in a json encoded string -func (e *Entity) encodeAttributes() map[string]any { +// return the values in a json encoded string +func (e *Entity) encodeValues() map[string]any { pairs := make(map[string]any, len(e.Fields)) for _, field := range e.Fields { if field.IsNull { diff --git a/services/eavservice/eavservice.go b/services/eavservice/eavservice.go index f1a76fa7..631efc25 100644 --- a/services/eavservice/eavservice.go +++ b/services/eavservice/eavservice.go @@ -14,18 +14,16 @@ import ( ) var ( - ErrIDDontMatchEntityType = errors.New("this object doesn't belong to this type") - ErrCantParseUUID = errors.New("can't parse uuid") + ErrCantParseUUID = errors.New("can't parse uuid") ) // EAV service provide handle EAV objects type EAVService interface { - GetEntityTypeByName(name string) (*models.EntityType, error) - GetEntitiesWithParams(ett *models.EntityType, params map[string]string) []*models.Entity - DeleteEntity(et *models.Entity) error - GetEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, error) - CreateEntity(ett *models.EntityType, attrs map[string]any) (*models.Entity, error) - UpdateEntity(et *models.Entity, attrs map[string]any) error + GetEntity(entityTypeName string, id uuid.UUID) (*models.Entity, error) + GetEntities(entityTypeName string, conditions map[string]string) ([]*models.Entity, error) + CreateEntity(entityTypeName string, attributeValues map[string]any) (*models.Entity, error) + UpdateEntity(entityTypeName string, entityID uuid.UUID, newValues map[string]any) (*models.Entity, error) + DeleteEntity(entityTypeName string, entityID uuid.UUID) error } type eavServiceImpl struct { @@ -46,27 +44,41 @@ func NewEAVService( } } -// Get EntityType by name (string) -func (eavService *eavServiceImpl) GetEntityTypeByName(name string) (*models.EntityType, error) { - var ett models.EntityType - err := eavService.db.Preload("Attributes").First(&ett, "name = ?", name).Error +// Get the Entity of type with name "entityTypeName" that has the "id" +func (eavService *eavServiceImpl) GetEntity(entityTypeName string, id uuid.UUID) (*models.Entity, error) { + var entity models.Entity + + query := eavService.db.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType") + query = query.Joins( + `JOIN entity_types ON + entity_types.id = entities.entity_type_id`, + ) + err := query.Where( + map[string]any{"entities.id": id, "entity_types.name": entityTypeName}, + ).First(&entity).Error if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, fmt.Errorf("EntityType named %q not found", name) - } + return nil, err } - return &ett, nil + + return &entity, nil } -// Get entities of type entityType that match all conditions given in params -// params are in {"attributeName": expectedValue} format +// Get entities of type with name "entityTypeName" that match all "conditions" +// entries in "conditions" that do not correspond to any attribute of "entityTypeName" are ignored +// +// "conditions" are in {"attributeName": expectedValue} format // TODO relations join -func (eavService *eavServiceImpl) GetEntitiesWithParams(entityType *models.EntityType, params map[string]string) []*models.Entity { +func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions map[string]string) ([]*models.Entity, error) { + entityType, err := eavService.getEntityTypeByName(entityTypeName) + if err != nil { + return nil, err + } + query := eavService.db.Select("entities.*") - // only entities that match the conditions in params + // only entities that match the conditions for _, attribute := range entityType.Attributes { - expectedValue, isPresent := params[attribute.Name] + expectedValue, isPresent := conditions[attribute.Name] if isPresent { query = eavService.addValueCheckToQuery(query, attribute, expectedValue) } @@ -81,28 +93,15 @@ func (eavService *eavServiceImpl) GetEntitiesWithParams(entityType *models.Entit // execute query var entities []*models.Entity query = query.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType") - query.Find(&entities) + err = query.Find(&entities).Error - return entities + return entities, err } -// Adds to the query the verification that the value for the attribute is expectedValue +// Adds to the "query" the verification that the value for "attribute" is "expectedValue" func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attribute *models.Attribute, expectedValue string) *gorm.DB { - var valToUseInQuery string - if expectedValue != "null" { // TODO should be changed to be able to use nil - switch attribute.ValueType { - case models.StringValueType: - valToUseInQuery = "string_val" - case models.IntValueType: - valToUseInQuery = "int_val" - case models.FloatValueType: - valToUseInQuery = "float_val" - case models.BooleanValueType: - valToUseInQuery = "bool_val" - case models.RelationValueType: - valToUseInQuery = "relation_val" - } - } else { + var valToUseInQuery = string(attribute.ValueType) + "_val" + if expectedValue == "null" { // TODO should be changed to be able to use nil valToUseInQuery = "is_null" expectedValue = "true" } @@ -122,35 +121,20 @@ func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attribute ) } -// Delete an entity and its values -func (eavService *eavServiceImpl) DeleteEntity(et *models.Entity) error { - return eavService.db.Transaction(func(tx *gorm.DB) error { - err := tx.Where("entity_id = ?", et.ID.String()).Delete(&models.Value{}).Error - if err != nil { - return err - } - - return tx.Delete(et).Error - }) -} - -func (eavService *eavServiceImpl) GetEntity(ett *models.EntityType, id uuid.UUID) (*models.Entity, error) { - var et models.Entity - err := eavService.db.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType").First(&et, id).Error +// Creates a Entity of type "entityType" and its Values from the information provided in "attributeValues" +// not specified values are set with the default value (if exists) or a null value. +// entries in "attributeValues" that do not correspond to any attribute of "entityType" are ignored +// +// "attributeValues" are in {"attributeName": value} format +func (eavService *eavServiceImpl) CreateEntity(entityTypeName string, attributeValues map[string]any) (*models.Entity, error) { + entityType, err := eavService.getEntityTypeByName(entityTypeName) if err != nil { return nil, err } - if ett.ID != et.EntityTypeID { - return nil, ErrIDDontMatchEntityType - } - return &et, nil -} -// Create a brand new entity -func (eavService *eavServiceImpl) CreateEntity(entityType *models.EntityType, params map[string]any) (*models.Entity, error) { entity := models.NewEntity(entityType) for _, attribute := range entityType.Attributes { - value, err := eavService.createValueFromParams(attribute, params) + value, err := eavService.createValue(attribute, attributeValues) if err != nil { return nil, err } @@ -160,36 +144,27 @@ func (eavService *eavServiceImpl) CreateEntity(entityType *models.EntityType, pa return entity, eavService.entityRepository.Create(entity) } -func (eavService *eavServiceImpl) createValueFromParams(attribute *models.Attribute, params map[string]any) (*models.Value, error) { - attributeValue, isPresent := params[attribute.Name] +// Creates a new Value for the "attribute" with the information provided in "attributesValues" +// or with the default value (if exists) +// or a null value if the value for "attribute" is not specified in "attributesValues" +// +// "attributesValues" is in {"attributeName": value} format +// +// returns error is the type of the value provided for "attribute" +// does not correspond with its ValueType +func (eavService *eavServiceImpl) createValue(attribute *models.Attribute, attributesValues map[string]any) (*models.Value, error) { + attributeValue, isPresent := attributesValues[attribute.Name] if isPresent { - switch attributeValueTyped := attributeValue.(type) { - case string: - if attribute.ValueType == models.RelationValueType { - uuidVal, err := uuid.Parse(attributeValueTyped) - if err != nil { - return nil, ErrCantParseUUID - } - // TODO verify that exists - return models.NewRelationIDValue(attribute, uuidVal) - } - return models.NewStringValue(attribute, attributeValueTyped) - case int: - return models.NewIntValue(attribute, attributeValueTyped) - case float64: - if utils.IsAnInt(attributeValueTyped) && attribute.ValueType == models.IntValueType { - return models.NewIntValue(attribute, int(attributeValueTyped)) - } - return models.NewFloatValue(attribute, attributeValueTyped) - case bool: - return models.NewBoolValue(attribute, attributeValueTyped) - case nil: - return models.NewNullValue(attribute) - default: - return nil, fmt.Errorf("unsupported type") + value := &models.Value{Attribute: attribute, AttributeID: attribute.ID} + err := eavService.updateValue(value, attributeValue) + if err != nil { + return nil, err } + + return value, nil } + // attribute not present in params, set the default value (if exists) or a null value if attribute.Default { return attribute.GetNewDefaultValue() } else if attribute.Required { @@ -197,64 +172,85 @@ func (eavService *eavServiceImpl) createValueFromParams(attribute *models.Attrib } return models.NewNullValue(attribute) } -func (eavService *eavServiceImpl) UpdateEntity(et *models.Entity, attrs map[string]any) error { - for _, value := range et.Fields { - attribute := value.Attribute - for k, v := range attrs { - if k == attribute.Name { - switch t := v.(type) { - case string: - if attribute.ValueType == models.RelationValueType { - uuidVal, err := uuid.Parse(t) - if err != nil { - return ErrCantParseUUID - } - - // TODO verify that exists - err = value.SetRelationVal(uuidVal) - if err != nil { - return err - } - } else { - err := value.SetStringVal(t) - if err != nil { - return err - } - } - case int: - err := value.SetIntVal(t) - if err != nil { - return err - } - case float64: - if utils.IsAnInt(t) && attribute.ValueType == models.IntValueType { - err := value.SetIntVal(int(t)) - if err != nil { - return err - } - } else { - err := value.SetFloatVal(t) - if err != nil { - return err - } - } - case bool: - err := value.SetBooleanVal(t) - if err != nil { - return err - } - case nil: - err := value.SetNull() - if err != nil { - return err - } - - default: - return fmt.Errorf("unsupported type") - } + +// Updates entity with type "entityTypeName" and "id" Values to the new values provided in "newValues" +// entries in "newValues" that do not correspond to any attribute of the EntityType are ignored +// +// "newValues" are in {"attributeName": newValue} format +func (eavService *eavServiceImpl) UpdateEntity(entityTypeName string, entityID uuid.UUID, newValues map[string]any) (*models.Entity, error) { + entity, err := eavService.GetEntity(entityTypeName, entityID) + if err != nil { + return nil, err + } + + for _, value := range entity.Fields { + newValue, isPresent := newValues[value.Attribute.Name] + if isPresent { + err := eavService.updateValue(value, newValue) + if err != nil { + return nil, err + } + } + } + + return entity, eavService.db.Save(entity.Fields).Error +} + +// Updates Value "value" to have the value "newValue" +// +// returns error is the type of the "newValue" does not correspond +// with the type expected for the "value"'s attribute +func (eavService *eavServiceImpl) updateValue(value *models.Value, newValue any) error { + switch newValueTyped := newValue.(type) { + case string: + if value.Attribute.ValueType == models.RelationValueType { + uuidVal, err := uuid.Parse(newValueTyped) + if err != nil { + return ErrCantParseUUID } + + // TODO verify that exists + return value.SetRelationVal(uuidVal) } + return value.SetStringVal(newValueTyped) + case int: + return value.SetIntVal(newValueTyped) + case float64: + if utils.IsAnInt(newValueTyped) && value.Attribute.ValueType == models.IntValueType { + return value.SetIntVal(int(newValueTyped)) + } + return value.SetFloatVal(newValueTyped) + case bool: + return value.SetBooleanVal(newValueTyped) + case nil: + return value.SetNull() + default: + return fmt.Errorf("unsupported type") } +} - return eavService.db.Save(et.Fields).Error +// Deletes Entity with type "entityTypeName" and id "entityID" and its values +func (eavService *eavServiceImpl) DeleteEntity(entityTypeName string, entityID uuid.UUID) error { + entity, err := eavService.GetEntity(entityTypeName, entityID) + if err != nil { + return err + } + + return eavService.db.Transaction(func(tx *gorm.DB) error { + err := tx.Where("entity_id = ?", entityID.String()).Delete(&models.Value{}).Error + if err != nil { + return err + } + + return tx.Delete(entity).Error + }) +} + +func (eavService *eavServiceImpl) getEntityTypeByName(name string) (*models.EntityType, error) { + var entityType models.EntityType + err := eavService.db.Preload("Attributes").First(&entityType, "name = ?", name).Error + if err != nil { + return nil, err + } + return &entityType, nil } diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index a602d9d2..cd178848 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -11,7 +11,6 @@ import ( "github.com/stretchr/testify/suite" "go.uber.org/zap" "gorm.io/gorm" - "gotest.tools/assert" ) type EAVServiceIntTestSuite struct { @@ -71,7 +70,7 @@ func (ts *EAVServiceIntTestSuite) SetupTest() { // ------------------------- GetEntity -------------------------------- func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityDoesNotExist() { - _, err := ts.eavService.GetEntity(ts.profileType, uuid.New()) + _, err := ts.eavService.GetEntity(ts.profileType.Name, uuid.New()) ts.ErrorContains(err, "record not found") } @@ -83,81 +82,92 @@ func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityTypeDoesNotMa err := ts.db.Create(otherEntityType).Error ts.Nil(err) - otherEntity1, err := ts.eavService.CreateEntity(otherEntityType, map[string]any{}) + otherEntity1, err := ts.eavService.CreateEntity(otherEntityType.Name, map[string]any{}) ts.Nil(err) - _, err = ts.eavService.GetEntity(ts.profileType, otherEntity1.ID) - ts.ErrorIs(err, eavservice.ErrIDDontMatchEntityType) + _, err = ts.eavService.GetEntity(ts.profileType.Name, otherEntity1.ID) + ts.ErrorContains(err, "record not found") } func (ts *EAVServiceIntTestSuite) TestGetEntityWorksIfEntityTypeMatch() { - entity1, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + entity1, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) ts.Nil(err) - entityReturned, err := ts.eavService.GetEntity(ts.profileType, entity1.ID) + entityReturned, err := ts.eavService.GetEntity(ts.profileType.Name, entity1.ID) ts.Nil(err) EqualEntity(&ts.Suite, entity1, entityReturned) } -// ------------------------- GetEntitiesWithParams -------------------------------- +// ------------------------- GetEntities -------------------------------- + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesOfNotExistentTypeReturnsError() { + _, err := ts.eavService.GetEntities("not-exists", map[string]string{}) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} -func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsEmptyIfNotEntitiesCreated() { - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, make(map[string]string)) +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { + entities, err := ts.eavService.GetEntities(ts.profileType.Name, map[string]string{}) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsTheOnlyOneIfOneEntityCreated() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { profile := ts.createProfile(ts.profileType, "profile") - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, make(map[string]string)) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, make(map[string]string)) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{profile}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithoutParamsReturnsTheListWhenMultipleCreated() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { profile1 := ts.createProfile(ts.profileType, "profile1") profile2 := ts.createProfile(ts.profileType, "profile2") profile3 := ts.createProfile(ts.profileType, "profile3") - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, make(map[string]string)) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, make(map[string]string)) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{profile1, profile2, profile3}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsEmptyIfNotEntitiesCreated() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { params := map[string]string{ "displayName": "not_created", } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsEmptyIfNothingMatch() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { ts.createProfile(ts.profileType, "profile") params := map[string]string{ "displayName": "not_match", } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsOneIfOnlyOneMatch() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { matchProfile := ts.createProfile(ts.profileType, "match") ts.createProfile(ts.profileType, "something_else") params := map[string]string{ "displayName": "match", } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{matchProfile}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsMultipleIfMultipleMatch() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { match1 := ts.createProfile(ts.profileType, "match") match2 := ts.createProfile(ts.profileType, "match") ts.createProfile(ts.profileType, "something_else") @@ -165,12 +175,13 @@ func (ts *EAVServiceIntTestSuite) TestWithParamsReturnsMultipleIfMultipleMatch() params := map[string]string{ "displayName": "match", } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match1, match2}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithParamThatDoesNotExistReturnsAllEntities() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsAllEntities() { match1 := ts.createProfile(ts.profileType, "match") match2 := ts.createProfile(ts.profileType, "match") match3 := ts.createProfile(ts.profileType, "match") @@ -178,12 +189,13 @@ func (ts *EAVServiceIntTestSuite) TestWithParamThatDoesNotExistReturnsAllEntitie params := map[string]string{ "not_exists": "not_exists", } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match1, match2, match3}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithParamOfIntType() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { intAttr := &models.Attribute{ EntityTypeID: ts.profileType.ID, Name: "int", @@ -198,13 +210,13 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfIntType() { err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "match", "int": 1, }) ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "not_match", "int": 2, }) @@ -213,12 +225,13 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfIntType() { params := map[string]string{ "int": "1", } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithParamOfIntTypeThatIsNotAnIntReturnEmpty() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeThatIsNotAnIntReturnsError() { intAttr := &models.Attribute{ EntityTypeID: ts.profileType.ID, Name: "int", @@ -233,13 +246,13 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfIntTypeThatIsNotAnIntReturnEmpt err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "match", "int": 1, }) ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "not_match", "int": 2, }) @@ -248,12 +261,11 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfIntTypeThatIsNotAnIntReturnEmpt params := map[string]string{ "int": "not_an_int", } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) - - EqualEntityList(&ts.Suite, []*models.Entity{}, entities) + _, err = ts.eavService.GetEntities(ts.profileType.Name, params) + ts.NotNil(err) } -func (ts *EAVServiceIntTestSuite) TestWithParamOfFloatType() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { floatAttr := &models.Attribute{ EntityTypeID: ts.profileType.ID, Name: "float", @@ -268,13 +280,13 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfFloatType() { err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "match", "float": 1.1, }) ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "not_match", "float": 2.0, }) @@ -283,12 +295,13 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfFloatType() { params := map[string]string{ "float": "1.1", } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithParamOfBoolType() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { boolAttr := &models.Attribute{ EntityTypeID: ts.profileType.ID, Name: "bool", @@ -303,13 +316,13 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfBoolType() { err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "match", "bool": true, }) ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "not_match", "bool": false, }) @@ -318,12 +331,13 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfBoolType() { params := map[string]string{ "bool": "true", } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithParamOfRelationType() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { otherEntityType := &models.EntityType{ Name: "other", } @@ -331,10 +345,10 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfRelationType() { err := ts.db.Create(otherEntityType).Error ts.Nil(err) - otherEntity1, err := ts.eavService.CreateEntity(otherEntityType, map[string]any{}) + otherEntity1, err := ts.eavService.CreateEntity(otherEntityType.Name, map[string]any{}) ts.Nil(err) - otherEntity2, err := ts.eavService.CreateEntity(otherEntityType, map[string]any{}) + otherEntity2, err := ts.eavService.CreateEntity(otherEntityType.Name, map[string]any{}) ts.Nil(err) relationAttr := models.NewRelationAttribute( @@ -349,12 +363,12 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfRelationType() { err = ts.db.Save(&ts.profileType).Error ts.Nil(err) - match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "relation": otherEntity1.ID.String(), }) ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "relation": otherEntity2.ID.String(), }) ts.Nil(err) @@ -362,18 +376,19 @@ func (ts *EAVServiceIntTestSuite) TestWithParamOfRelationType() { params := map[string]string{ "relation": otherEntity1.ID.String(), } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } -func (ts *EAVServiceIntTestSuite) TestWithParamFilterByNull() { - match, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionFilterByNull() { + match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": nil, }) ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType, map[string]any{ + _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "something", }) ts.Nil(err) @@ -381,7 +396,8 @@ func (ts *EAVServiceIntTestSuite) TestWithParamFilterByNull() { params := map[string]string{ "displayName": "null", } - entities := ts.eavService.GetEntitiesWithParams(ts.profileType, params) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } @@ -397,7 +413,7 @@ func (ts *EAVServiceIntTestSuite) TestCreateMultipleEntitiesDoesNotGenerateGormB "displayName": fmt.Sprintf("displayName%d", i), "description": fmt.Sprintf("description%d", i), } - entity, err := ts.eavService.CreateEntity(ts.profileType, params) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) ts.Nil(err) for _, value := range entity.Fields { @@ -410,6 +426,11 @@ func (ts *EAVServiceIntTestSuite) TestCreateMultipleEntitiesDoesNotGenerateGormB } } +func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfEntityTypeDoesNotExist() { + _, err := ts.eavService.CreateEntity("not-exists", map[string]any{}) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfUUIDCantBeParsed() { otherType := &models.EntityType{ Name: "other", @@ -429,7 +450,7 @@ func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfUUIDCantBeParsed() { "displayName": "displayName", "relation": "not-a-uuid", } - entity, err := ts.eavService.CreateEntity(ts.profileType, params) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) ts.Nil(entity) ts.ErrorIs(err, eavservice.ErrCantParseUUID) } @@ -451,7 +472,7 @@ func (ts *EAVServiceIntTestSuite) TestCreatesDefaultAttributes() { err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) ts.Nil(err) ts.Len(entity.Fields, 3) notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { @@ -475,7 +496,7 @@ func (ts *EAVServiceIntTestSuite) TestCreatesWithoutRequiredValueRespondsError() err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) ts.Nil(entity) ts.ErrorContains(err, "field required is missing and is required") } @@ -495,7 +516,7 @@ func (ts *EAVServiceIntTestSuite) TestCreatesIntAttributeEvenIfItIsInFloatFormat err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "int": 2.0, }) ts.Nil(err) @@ -517,14 +538,14 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGo "displayName": "displayName", "description": "description", } - entity, err := ts.eavService.CreateEntity(ts.profileType, params) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) ts.Nil(err) params2 := map[string]any{ "displayName": "other", "description": "other", } - _, err = ts.eavService.CreateEntity(ts.profileType, params2) + _, err = ts.eavService.CreateEntity(ts.profileType.Name, params2) ts.Nil(err) for i := 0; i < 10; i++ { @@ -532,7 +553,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGo "displayName": fmt.Sprintf("displayName%d", i), "description": fmt.Sprintf("description%d", i), } - err := ts.eavService.UpdateEntity(entity, params) + entity, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, params) ts.Nil(err) for _, value := range entity.Fields { @@ -545,6 +566,11 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGo } } +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfEntityDoesNotExist() { + _, err := ts.eavService.UpdateEntity(ts.profileType.Name, uuid.New(), map[string]any{}) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + func (ts *EAVServiceIntTestSuite) TestUpdateEntityWorksForAllTheTypes() { intAttr := &models.Attribute{ EntityTypeID: ts.profileType.ID, @@ -574,7 +600,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityWorksForAllTheTypes() { err := ts.db.Create(otherEntityType).Error ts.Nil(err) - otherEntity1, err := ts.eavService.CreateEntity(otherEntityType, map[string]any{}) + otherEntity1, err := ts.eavService.CreateEntity(otherEntityType.Name, map[string]any{}) ts.Nil(err) relationAttr := models.NewRelationAttribute( @@ -595,7 +621,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityWorksForAllTheTypes() { params := map[string]any{ "displayName": "displayName", } - entity, err := ts.eavService.CreateEntity(ts.profileType, params) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) ts.Nil(err) paramsUpdate := map[string]any{ @@ -605,7 +631,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityWorksForAllTheTypes() { "bool": true, "relation": otherEntity1.ID.String(), } - err = ts.eavService.UpdateEntity(entity, paramsUpdate) + entity, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.Nil(err) ts.Len(entity.Fields, 6) notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { @@ -636,13 +662,13 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForIntType err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) ts.Nil(err) paramsUpdate := map[string]any{ "int": "1", } - err = ts.eavService.UpdateEntity(entity, paramsUpdate) + _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, models.ErrAskingForWrongType) } @@ -661,13 +687,13 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForFloatTy err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) ts.Nil(err) paramsUpdate := map[string]any{ "float": "1", } - err = ts.eavService.UpdateEntity(entity, paramsUpdate) + _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, models.ErrAskingForWrongType) } @@ -686,24 +712,24 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForBoolTyp err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) ts.Nil(err) paramsUpdate := map[string]any{ "bool": "1", } - err = ts.eavService.UpdateEntity(entity, paramsUpdate) + _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, models.ErrAskingForWrongType) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfIntForStringType() { - entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) ts.Nil(err) paramsUpdate := map[string]any{ "displayName": 1, } - err = ts.eavService.UpdateEntity(entity, paramsUpdate) + _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, models.ErrAskingForWrongType) } @@ -727,28 +753,28 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDCantBeParsed err = ts.db.Save(&ts.profileType).Error ts.Nil(err) - entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) ts.Nil(err) paramsUpdate := map[string]any{ "relation": "not-uuid", } - err = ts.eavService.UpdateEntity(entity, paramsUpdate) + _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, eavservice.ErrCantParseUUID) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFails() { - entity, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{}) + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) ts.Nil(err) paramsUpdate := map[string]any{ "displayName": "something", "description": 1, } - err = ts.eavService.UpdateEntity(entity, paramsUpdate) + _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, models.ErrAskingForWrongType) - entityReturned, err := ts.eavService.GetEntity(ts.profileType, entity.ID) + entityReturned, err := ts.eavService.GetEntity(ts.profileType.Name, entity.ID) ts.Nil(err) notNull := pie.Filter(entityReturned.Fields, func(value *models.Value) bool { return !value.IsNull @@ -758,26 +784,53 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFail // ------------------------- GetEntityTypeByName ------------------------- -func (ts *EAVServiceIntTestSuite) TestGetEntityTypeReturnsErrorIfItDoesNotExist() { - _, err := ts.eavService.GetEntityTypeByName("not_exists") - ts.ErrorContains(err, "EntityType named \"not_exists\" not found") +// func (ts *EAVServiceIntTestSuite) TestGetEntityTypeReturnsErrorIfItDoesNotExist() { +// _, err := ts.eavService.getEntityTypeByName("not_exists") +// ts.ErrorContains(err, "EntityType named \"not_exists\" not found") +// } + +// func (ts *EAVServiceIntTestSuite) TestGetEntityTypeWorksIfItExists() { +// ett, err := ts.eavService.getEntityTypeByName("profile") +// ts.Nil(err) +// assert.DeepEqual(ts.T(), ts.profileType, ett) +// } + +// ------------------------- DeleteEntity ------------------------- + +func (ts *EAVServiceIntTestSuite) TestDeleteEntityReturnsErrorIfEntityDoesNotExist() { + err := ts.eavService.DeleteEntity(ts.profileType.Name, uuid.New()) + ts.ErrorIs(err, gorm.ErrRecordNotFound) } -func (ts *EAVServiceIntTestSuite) TestGetEntityTypeWorksIfItExists() { - ett, err := ts.eavService.GetEntityTypeByName("profile") +func (ts *EAVServiceIntTestSuite) TestDeleteEntityReturnsErrorIfEntityTypeDoesNotMatch() { + otherEntityType := &models.EntityType{ + Name: "other", + } + + err := ts.db.Create(otherEntityType).Error ts.Nil(err) - assert.DeepEqual(ts.T(), ts.profileType, ett) -} -// ------------------------- DeleteEntity ------------------------- + profile1, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ + "displayName": "displayName", + }) + ts.Nil(err) + + err = ts.eavService.DeleteEntity(otherEntityType.Name, profile1.ID) + ts.ErrorIs(err, gorm.ErrRecordNotFound) + + var values []models.Value + err = ts.db.Find(&values).Error + ts.Nil(err) + ts.Len(values, 2) +} func (ts *EAVServiceIntTestSuite) TestDeleteWorks() { - profile1, err := ts.eavService.CreateEntity(ts.profileType, map[string]any{ + profile1, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "displayName", }) ts.Nil(err) - err = ts.eavService.DeleteEntity(profile1) + err = ts.eavService.DeleteEntity(profile1.EntityType.Name, profile1.ID) ts.Nil(err) var profiles []models.Entity @@ -791,6 +844,8 @@ func (ts *EAVServiceIntTestSuite) TestDeleteWorks() { ts.Len(values, 0) } +// ------------------------- utils ------------------------- + func (ts *EAVServiceIntTestSuite) createProfile(entityType *models.EntityType, displayName string) *models.Entity { entity := &models.Entity{ EntityTypeID: entityType.ID, From 4bf5d8798ff62e7d595d3d1ad750e4b969af614d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 11:48:45 +0200 Subject: [PATCH 090/467] remove todo --- persistence/models/Attribute.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index 4dcc4096..160293b1 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -23,7 +23,7 @@ type Attribute struct { BaseModel Name string `gorm:"uniqueIndex:unique_name_entity_type"` Unique bool // TODO validate this - Required bool // TODO validate this + Required bool Default bool // if there is a default value From 2292654c042db9df7a495ffc7f38413a00f8827e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 11:55:55 +0200 Subject: [PATCH 091/467] define constant for duplicate route --- controllers/basicAuth_test.go | 8 +++--- controllers/eav.go | 2 +- controllers/eav_test.go | 34 ++++++++++++------------ examples/README.md | 4 +-- router/router.go | 15 ++++++----- test_e2e/features/object_storage.feature | 2 +- test_e2e/http_support_test.go | 12 ++++----- 7 files changed, 39 insertions(+), 38 deletions(-) diff --git a/controllers/basicAuth_test.go b/controllers/basicAuth_test.go index ff3ad317..c082d99f 100644 --- a/controllers/basicAuth_test.go +++ b/controllers/basicAuth_test.go @@ -33,7 +33,7 @@ func Test_BasicLoginHandler_MalformedRequest(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "POST", - "/v1/auth/basic/login", + "/login", strings.NewReader("qsdqsdqsd"), ) @@ -64,7 +64,7 @@ func Test_BasicLoginHandler_UserNotFound(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "POST", - "/v1/auth/basic/login", + "/login", strings.NewReader(`{ "email": "bob@email.com", "password":"1234" @@ -87,7 +87,7 @@ func Test_BasicLoginHandler_LoginFailed(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "POST", - "/v1/auth/basic/login", + "/login", strings.NewReader(`{ "email": "bob@email.com", "password":"1234" @@ -130,7 +130,7 @@ func Test_BasicLoginHandler_LoginSuccess(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "POST", - "/v1/auth/basic/login", + "/login", strings.NewReader(`{ "email": "bob@email.com", "password":"1234" diff --git a/controllers/eav.go b/controllers/eav.go index 28924540..d26facfe 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -120,7 +120,7 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http } func buildLocationString(et *models.Entity) string { - return fmt.Sprintf("/v1/objects/%s/%s", et.EntityType.Name, et.ID.String()) + return fmt.Sprintf("/objects/%s/%s", et.EntityType.Name, et.ID.String()) } // The handler responsible for the updates of entities diff --git a/controllers/eav_test.go b/controllers/eav_test.go index 3a3b3b12..d675bfd8 100644 --- a/controllers/eav_test.go +++ b/controllers/eav_test.go @@ -30,7 +30,7 @@ func TestGetWithoutTypeReturnsError(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/v1/objects/", + "/objects/", strings.NewReader(""), ) @@ -53,7 +53,7 @@ func TestGetOfNotExistentTypeReturnsError(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/v1/objects/no-exists/id", + "/objects/no-exists/id", strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) @@ -76,7 +76,7 @@ func TestGetWithoutEntityIDReturnsError(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/v1/objects/exists/", + "/objects/exists/", strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) @@ -99,7 +99,7 @@ func TestGetWithEntityIDNotUUIDReturnsError(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/v1/objects/exists/not-uuid", + "/objects/exists/not-uuid", strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": "not-uuid"}) @@ -128,7 +128,7 @@ func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/v1/objects/exists/"+uuid.String(), + "/objects/exists/"+uuid.String(), strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) @@ -157,7 +157,7 @@ func TestGetWithErrorInDBReturnsError(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/v1/objects/exists/"+uuid.String(), + "/objects/exists/"+uuid.String(), strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) @@ -190,7 +190,7 @@ func TestGetWithCorrectIDReturnsObject(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/v1/objects/exists/"+uuid.String(), + "/objects/exists/"+uuid.String(), strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) @@ -216,7 +216,7 @@ func TestGetAllOfNotExistentTypeReturnsEmpty(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/v1/objects/no-exists", + "/objects/no-exists", strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) @@ -251,7 +251,7 @@ func TestGetAllWithoutParams(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/v1/objects/exists/", + "/objects/exists/", strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) @@ -285,7 +285,7 @@ func TestGetAllWithParams(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/v1/objects/exists/", + "/objects/exists/", strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) @@ -321,7 +321,7 @@ func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "DELETE", - "/v1/objects/exists/"+uuid.String(), + "/objects/exists/"+uuid.String(), strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) @@ -350,7 +350,7 @@ func TestDeleteObjectReturnsNil(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "DELETE", - "/v1/objects/exists/"+uuid.String(), + "/objects/exists/"+uuid.String(), strings.NewReader(""), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) @@ -376,7 +376,7 @@ func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "POST", - "/v1/objects/exists", + "/objects/exists", strings.NewReader("bad json"), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) @@ -403,7 +403,7 @@ func TestCreteObjectWithErrorInDBReturnsError(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "POST", - "/v1/objects/exists", + "/objects/exists", strings.NewReader("{\"1\": \"1\"}"), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) @@ -434,7 +434,7 @@ func TestCreteObjectReturnsObject(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "POST", - "/v1/objects/exists", + "/objects/exists", strings.NewReader("{\"1\": \"1\"}"), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) @@ -466,7 +466,7 @@ func TestModifyObjectWithErrorInDBReturnsError(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "PUT", - "/v1/objects/exists/"+uuid.String(), + "/objects/exists/"+uuid.String(), strings.NewReader("{\"1\": \"1\"}"), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) @@ -498,7 +498,7 @@ func TestModifyObjectReturnsObject(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "PUT", - "/v1/objects/exists/"+uuid.String(), + "/objects/exists/"+uuid.String(), strings.NewReader("{\"1\": \"1\"}"), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) diff --git a/examples/README.md b/examples/README.md index 23860af7..aa9f0c65 100644 --- a/examples/README.md +++ b/examples/README.md @@ -56,7 +56,7 @@ The default credentials for the user are ̀`admin-no-reply@badaas.com` and `admi httpie util will be used in the examples below, but it works with curl or any similar tools. -Let's first start by getting all the profiles: `http localhost:8000/v1/objects/profile/` +Let's first start by getting all the profiles: `http localhost:8000/objects/profile/` ```json HTTP/1.1 200 OK @@ -78,7 +78,7 @@ Date: Thu, 05 Jan 2023 11:53:35 GMT ] ``` -Let's get all the posts posted by this user: `http localhost:8000/v1/objects/post/?ownerID=wowASuperCoolUserID` +Let's get all the posts posted by this user: `http localhost:8000/objects/post/?ownerID=wowASuperCoolUserID` ```json HTTP/1.1 200 OK diff --git a/router/router.go b/router/router.go index eda453b9..e4bea43a 100644 --- a/router/router.go +++ b/router/router.go @@ -40,13 +40,14 @@ func SetupRouter( protected.HandleFunc("/logout", jsonController.Wrap(basicAuthenticationController.Logout)).Methods("GET") - // CRUD - router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.GetObject)).Methods("GET") - // Get whole collection - router.HandleFunc("/v1/objects/{type}", jsonController.Wrap(eavController.GetAll)).Methods("GET") - router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.DeleteObject)).Methods("DELETE") - router.HandleFunc("/v1/objects/{type}", jsonController.Wrap(eavController.CreateObject)).Methods("POST") - router.HandleFunc("/v1/objects/{type}/{id}", jsonController.Wrap(eavController.ModifyObject)).Methods("PUT") + // Objects CRUD + objectsBase := "/objects/{type}" + objectsWithID := objectsBase + "/{id}" + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.GetObject)).Methods("GET") + router.HandleFunc(objectsBase, jsonController.Wrap(eavController.GetAll)).Methods("GET") + router.HandleFunc(objectsBase, jsonController.Wrap(eavController.CreateObject)).Methods("POST") + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.ModifyObject)).Methods("PUT") + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.DeleteObject)).Methods("DELETE") cors := handlers.CORS( handlers.AllowedMethods([]string{"GET", "POST", "DELETE", "PUT", "OPTIONS"}), diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature index 09ec7367..473b5dc3 100644 --- a/test_e2e/features/object_storage.feature +++ b/test_e2e/features/object_storage.feature @@ -1,6 +1,6 @@ Feature: Saving and querying objects in the database using the EAV Model Scenario: Objects can be created with CreateObject - When I request "/v1/objects/profile" with method "POST" with json + When I request "/objects/profile" with method "POST" with json | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 4467abf7..797c0e0a 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -212,7 +212,7 @@ func checkMethod(method string) (string, error) { func (t *TestContext) objectExists(entityType string, jsonTable *godog.Table) error { err := t.request( - "/v1/objects/"+entityType, + "/objects/"+entityType, http.MethodPost, nil, jsonTable, @@ -236,7 +236,7 @@ func (t *TestContext) queryWithObjectID(entityType string) error { } err := t.requestGet( - "/v1/objects/" + entityType + "/" + id.(string), + "/objects/" + entityType + "/" + id.(string), ) if err != nil { return err @@ -262,7 +262,7 @@ func (t *TestContext) queryObjectsWithParameters(entityType string, jsonTable *g } err = t.request( - "/v1/objects/"+entityType, + "/objects/"+entityType, http.MethodGet, jsonMapString, nil, @@ -281,7 +281,7 @@ func (t *TestContext) queryObjectsWithParameters(entityType string, jsonTable *g func (t *TestContext) queryAllObjects(entityType string) error { err := t.requestGet( - "/v1/objects/" + entityType, + "/objects/" + entityType, ) if err != nil { return err @@ -328,7 +328,7 @@ func (t *TestContext) deleteWithObjectID(entityType string) error { } err := t.request( - "/v1/objects/"+entityType+"/"+id.(string), + "/objects/"+entityType+"/"+id.(string), http.MethodDelete, nil, nil, @@ -352,7 +352,7 @@ func (t *TestContext) modifyWithProperties(entityType string, jsonTable *godog.T } err := t.request( - "/v1/objects/"+entityType+"/"+id.(string), + "/objects/"+entityType+"/"+id.(string), http.MethodPut, nil, jsonTable, From c91e9a3bf0607568ebe0f0ac7b53b3a211298a5f Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 12:26:32 +0200 Subject: [PATCH 092/467] add more unit tests --- controllers/eav_test.go | 202 +++++++++++++++++++++++++++++- persistence/models/Entity_test.go | 47 +++++-- 2 files changed, 233 insertions(+), 16 deletions(-) diff --git a/controllers/eav_test.go b/controllers/eav_test.go index d675bfd8..8baf3999 100644 --- a/controllers/eav_test.go +++ b/controllers/eav_test.go @@ -202,12 +202,30 @@ func TestGetWithCorrectIDReturnsObject(t *testing.T) { // ----------------------- GetAll ----------------------- -func TestGetAllOfNotExistentTypeReturnsEmpty(t *testing.T) { +func TestGetAllWithoutTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/", + strings.NewReader(""), + ) + + _, err := controller.GetAll(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestGetAllOfNotExistentTypeReturnsError(t *testing.T) { eavService := mocksEAVService.NewEAVService(t) eavService. On("GetEntities", "no-exists", map[string]string{}). - Return([]*models.Entity{}, nil) + Return(nil, gorm.ErrRecordNotFound) controller := controllers.NewEAVController( logger, @@ -221,9 +239,31 @@ func TestGetAllOfNotExistentTypeReturnsEmpty(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) - entities, err := controller.GetAll(response, request) - assert.Nil(t, err) - assert.Len(t, entities, 0) + _, err := controller.GetAll(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestGetAllWithErrorInDBReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + eavService. + On("GetEntities", "no-exists", map[string]string{}). + Return(nil, errors.New("db error")) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/no-exists", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) + + _, err := controller.GetAll(response, request) + assert.ErrorContains(t, err, "db error") } func TestGetAllWithoutParams(t *testing.T) { @@ -301,6 +341,49 @@ func TestGetAllWithParams(t *testing.T) { // ----------------------- DeleteObject ----------------------- +func TestDeleteWithoutTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "DELETE", + "/objects/", + strings.NewReader(""), + ) + + _, err := controller.DeleteObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestDeleteOfNotExistentTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + uuid := uuid.New() + + eavService. + On("DeleteEntity", "no-exists", uuid). + Return(gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "DELETE", + "/objects/no-exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) + + _, err := controller.DeleteObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { eavService := mocksEAVService.NewEAVService(t) @@ -362,6 +445,24 @@ func TestDeleteObjectReturnsNil(t *testing.T) { // ----------------------- CreateObject ----------------------- +func TestCreateWithoutTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "POST", + "/objects/", + strings.NewReader(""), + ) + + _, err := controller.CreateObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { eavService := mocksEAVService.NewEAVService(t) @@ -385,6 +486,29 @@ func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { assert.ErrorContains(t, err, "json decoding failed") } +func TestCreateOfNotExistentTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + eavService. + On("CreateEntity", "no-exists", map[string]any{"1": "1"}). + Return(nil, gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "POST", + "/objects/no-exists", + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) + + _, err := controller.CreateObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + func TestCreteObjectWithErrorInDBReturnsError(t *testing.T) { eavService := mocksEAVService.NewEAVService(t) @@ -446,6 +570,74 @@ func TestCreteObjectReturnsObject(t *testing.T) { // ----------------------- ModifyObject ----------------------- +func TestModifyWithoutTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "PUT", + "/objects/", + strings.NewReader(""), + ) + + _, err := controller.ModifyObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestModifyObjectWithBadJSONReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := uuid.New() + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "PUT", + "/objects/exists", + strings.NewReader("bad json"), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) + + _, err := controller.ModifyObject(response, request) + assert.ErrorContains(t, err, "json decoding failed") +} + +func TestModifyOfNotExistentTypeReturnsError(t *testing.T) { + eavService := mocksEAVService.NewEAVService(t) + + uuid := uuid.New() + + eavService. + On("UpdateEntity", "no-exists", uuid, map[string]any{"1": "1"}). + Return(nil, gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "POST", + "/objects/no-exists", + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) + + _, err := controller.ModifyObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + func TestModifyObjectWithErrorInDBReturnsError(t *testing.T) { eavService := mocksEAVService.NewEAVService(t) diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go index 019bdd6b..173a0295 100644 --- a/persistence/models/Entity_test.go +++ b/persistence/models/Entity_test.go @@ -22,28 +22,53 @@ func TestMarshall(t *testing.T) { DefaultString: "red", ValueType: StringValueType, EntityTypeID: id, - }}, + }, + { + BaseModel: BaseModel{ + ID: id, + }, + Name: "heigh", + ValueType: IntValueType, + EntityTypeID: id, + }, + }, } et := &Entity{ BaseModel: BaseModel{ ID: id, }, - Fields: []*Value{{ - BaseModel: BaseModel{ - ID: id, + Fields: []*Value{ + { + BaseModel: BaseModel{ + ID: id, + }, + + IsNull: false, + StringVal: "blue", + EntityID: id, + AttributeID: id, + Attribute: ett.Attributes[0], }, + { + BaseModel: BaseModel{ + ID: id, + }, - IsNull: false, - StringVal: "blue", - EntityID: id, - AttributeID: id, - Attribute: ett.Attributes[0], - }}, + IsNull: true, + EntityID: id, + AttributeID: id, + Attribute: ett.Attributes[1], + }, + }, EntityTypeID: id, EntityType: ett, } p, _ := et.MarshalJSON() - assert.JSONEq(t, `{"attrs":{"color":"blue"},"id":"11e1d4b8-701d-47cc-852f-6d36922bcc75","type":"bird", "createdAt":"0001-01-01T00:00:00Z", "updatedAt":"0001-01-01T00:00:00Z"}`, string(p)) + assert.JSONEq( + t, + `{"attrs":{"color":"blue"},"id":"11e1d4b8-701d-47cc-852f-6d36922bcc75","type":"bird", "createdAt":"0001-01-01T00:00:00Z", "updatedAt":"0001-01-01T00:00:00Z"}`, + string(p), + ) } From 6ce40d8aa0549fdf20302e7070915b6c2717c2c3 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 15:08:52 +0200 Subject: [PATCH 093/467] add transaction system and use it in services/eav --- controllers/eav.go | 6 +- persistence/ModuleFx.go | 1 + persistence/repository/EntityRepository.go | 82 ++++---- .../repository/EntityTypeRepository.go | 28 +++ services/ModuleFx.go | 3 +- services/{eavservice/eavservice.go => eav.go} | 176 +++++++++--------- services/transaction_executor.go | 68 +++++++ test_integration/eavservice.go | 12 +- 8 files changed, 242 insertions(+), 134 deletions(-) create mode 100644 persistence/repository/EntityTypeRepository.go rename services/{eavservice/eavservice.go => eav.go} (67%) create mode 100644 services/transaction_executor.go diff --git a/controllers/eav.go b/controllers/eav.go index d26facfe..8c01505e 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -10,7 +10,7 @@ import ( "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/services/eavservice" + "github.com/ditrit/badaas/services" "github.com/gorilla/mux" "go.uber.org/zap" "gorm.io/gorm" @@ -39,7 +39,7 @@ var _ EAVController = (*eavControllerImpl)(nil) // The InformationController constructor func NewEAVController( logger *zap.Logger, - eavService eavservice.EAVService, + eavService services.EAVService, ) EAVController { return &eavControllerImpl{ logger: logger, @@ -50,7 +50,7 @@ func NewEAVController( // The concrete implementation of the InformationController type eavControllerImpl struct { logger *zap.Logger - eavService eavservice.EAVService + eavService services.EAVService } // The handler responsible for the retrieval of une entity diff --git a/persistence/ModuleFx.go b/persistence/ModuleFx.go index 21cdf01a..89114787 100644 --- a/persistence/ModuleFx.go +++ b/persistence/ModuleFx.go @@ -27,4 +27,5 @@ var PersistanceModule = fx.Module( fx.Provide(repository.NewValueRepository), fx.Provide(repository.NewEntityRepository), + fx.Provide(repository.NewEntityTypeRepository), ) diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index 7ab4061a..f93d0498 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -13,63 +13,77 @@ import ( type EntityRepository struct { logger *zap.Logger - db *gorm.DB valueRepository *ValueRepository } func NewEntityRepository( logger *zap.Logger, - db *gorm.DB, valueRepository *ValueRepository, ) *EntityRepository { return &EntityRepository{ logger: logger, - db: db, valueRepository: valueRepository, } } +// Get the Entity of type with name "entityTypeName" that has the "id" +func (r *EntityRepository) Get(tx *gorm.DB, entityTypeName string, id uuid.UUID) (*models.Entity, error) { + var entity models.Entity + + query := tx.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType") + query = query.Joins( + `JOIN entity_types ON + entity_types.id = entities.entity_type_id`, + ) + err := query.Where( + map[string]any{"entities.id": id, "entity_types.name": entityTypeName}, + ).First(&entity).Error + if err != nil { + return nil, err + } + + return &entity, nil +} + // Creates an entity and its values in the database // must be used in place of gorm's db.Save(entity) because of the bug // when using gorm with cockroachDB. For more info refer to: // https://github.com/FrancoLiberali/cockroachdb_gorm_bug -func (r *EntityRepository) Create(entity *models.Entity) error { - return r.db.Transaction(func(tx *gorm.DB) error { - now := time.Now() +func (r *EntityRepository) Create(tx *gorm.DB, entity *models.Entity) error { + now := time.Now() - query, values, err := sq.Insert("entities"). - Columns("created_at", "updated_at", "entity_type_id"). - Values(now, now, entity.EntityType.ID). - Suffix("RETURNING \"id\""). - PlaceholderFormat(sq.Dollar).ToSql() + query, values, err := sq.Insert("entities"). + Columns("created_at", "updated_at", "entity_type_id"). + Values(now, now, entity.EntityType.ID). + Suffix("RETURNING \"id\""). + PlaceholderFormat(sq.Dollar).ToSql() - if err != nil { - return err - } + if err != nil { + return err + } - var result string - err = tx.Raw(query, values...).Scan(&result).Error - if err != nil { - return err - } + var result string + err = tx.Raw(query, values...).Scan(&result).Error + if err != nil { + return err + } - uuid, err := uuid.Parse(result) - if err != nil { - return err - } + uuid, err := uuid.Parse(result) + if err != nil { + return err + } - pie.Each(entity.Fields, func(value *models.Value) { - value.EntityID = uuid - }) + pie.Each(entity.Fields, func(value *models.Value) { + value.EntityID = uuid + }) - if len(entity.Fields) > 0 { - err = r.valueRepository.Create(tx, entity.Fields) - if err != nil { - return err - } + if len(entity.Fields) > 0 { + err = r.valueRepository.Create(tx, entity.Fields) + if err != nil { + return err } + } - entity.ID = uuid - return nil - }) + entity.ID = uuid + return nil } diff --git a/persistence/repository/EntityTypeRepository.go b/persistence/repository/EntityTypeRepository.go new file mode 100644 index 00000000..f1d36774 --- /dev/null +++ b/persistence/repository/EntityTypeRepository.go @@ -0,0 +1,28 @@ +package repository + +import ( + "github.com/ditrit/badaas/persistence/models" + "go.uber.org/zap" + "gorm.io/gorm" +) + +type EntityTypeRepository struct { + logger *zap.Logger +} + +func NewEntityTypeRepository( + logger *zap.Logger, +) *EntityTypeRepository { + return &EntityTypeRepository{ + logger: logger, + } +} + +func (r *EntityTypeRepository) GetByName(tx *gorm.DB, name string) (*models.EntityType, error) { + var entityType models.EntityType + err := tx.Preload("Attributes").First(&entityType, "name = ?", name).Error + if err != nil { + return nil, err + } + return &entityType, nil +} diff --git a/services/ModuleFx.go b/services/ModuleFx.go index aa55e571..59d997aa 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -1,7 +1,6 @@ package services import ( - "github.com/ditrit/badaas/services/eavservice" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" "go.uber.org/fx" @@ -11,5 +10,5 @@ var ServicesModule = fx.Module( "services", fx.Provide(userservice.NewUserService), fx.Provide(sessionservice.NewSessionService), - fx.Provide(eavservice.NewEAVService), + fx.Provide(NewEAVService), ) diff --git a/services/eavservice/eavservice.go b/services/eav.go similarity index 67% rename from services/eavservice/eavservice.go rename to services/eav.go index 631efc25..88c6c7d1 100644 --- a/services/eavservice/eavservice.go +++ b/services/eav.go @@ -1,4 +1,4 @@ -package eavservice +package services import ( "errors" @@ -27,40 +27,29 @@ type EAVService interface { } type eavServiceImpl struct { - logger *zap.Logger - db *gorm.DB - entityRepository *repository.EntityRepository + logger *zap.Logger + db *gorm.DB + entityTypeRepository *repository.EntityTypeRepository + entityRepository *repository.EntityRepository } func NewEAVService( logger *zap.Logger, db *gorm.DB, + entityTypeRepository *repository.EntityTypeRepository, entityRepository *repository.EntityRepository, ) EAVService { return &eavServiceImpl{ - logger: logger, - db: db, - entityRepository: entityRepository, + logger: logger, + db: db, + entityTypeRepository: entityTypeRepository, + entityRepository: entityRepository, } } // Get the Entity of type with name "entityTypeName" that has the "id" func (eavService *eavServiceImpl) GetEntity(entityTypeName string, id uuid.UUID) (*models.Entity, error) { - var entity models.Entity - - query := eavService.db.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType") - query = query.Joins( - `JOIN entity_types ON - entity_types.id = entities.entity_type_id`, - ) - err := query.Where( - map[string]any{"entities.id": id, "entity_types.name": entityTypeName}, - ).First(&entity).Error - if err != nil { - return nil, err - } - - return &entity, nil + return eavService.entityRepository.Get(eavService.db, entityTypeName, id) } // Get entities of type with name "entityTypeName" that match all "conditions" @@ -69,33 +58,38 @@ func (eavService *eavServiceImpl) GetEntity(entityTypeName string, id uuid.UUID) // "conditions" are in {"attributeName": expectedValue} format // TODO relations join func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions map[string]string) ([]*models.Entity, error) { - entityType, err := eavService.getEntityTypeByName(entityTypeName) - if err != nil { - return nil, err - } + return ExecWithTransaction( + eavService.db, + func(tx *gorm.DB) ([]*models.Entity, error) { + entityType, err := eavService.entityTypeRepository.GetByName(tx, entityTypeName) + if err != nil { + return nil, err + } - query := eavService.db.Select("entities.*") + query := tx.Select("entities.*") - // only entities that match the conditions - for _, attribute := range entityType.Attributes { - expectedValue, isPresent := conditions[attribute.Name] - if isPresent { - query = eavService.addValueCheckToQuery(query, attribute, expectedValue) - } - } + // only entities that match the conditions + for _, attribute := range entityType.Attributes { + expectedValue, isPresent := conditions[attribute.Name] + if isPresent { + query = eavService.addValueCheckToQuery(query, attribute, expectedValue) + } + } - // only entities of type entityType - query = query.Where( - "entities.entity_type_id = ?", - entityType.ID, - ) + // only entities of type entityType + query = query.Where( + "entities.entity_type_id = ?", + entityType.ID, + ) - // execute query - var entities []*models.Entity - query = query.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType") - err = query.Find(&entities).Error + // execute query + var entities []*models.Entity + query = query.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType") + err = query.Find(&entities).Error - return entities, err + return entities, err + }, + ) } // Adds to the "query" the verification that the value for "attribute" is "expectedValue" @@ -127,21 +121,26 @@ func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attribute // // "attributeValues" are in {"attributeName": value} format func (eavService *eavServiceImpl) CreateEntity(entityTypeName string, attributeValues map[string]any) (*models.Entity, error) { - entityType, err := eavService.getEntityTypeByName(entityTypeName) - if err != nil { - return nil, err - } + return ExecWithTransaction( + eavService.db, + func(tx *gorm.DB) (*models.Entity, error) { + entityType, err := eavService.entityTypeRepository.GetByName(tx, entityTypeName) + if err != nil { + return nil, err + } - entity := models.NewEntity(entityType) - for _, attribute := range entityType.Attributes { - value, err := eavService.createValue(attribute, attributeValues) - if err != nil { - return nil, err - } - entity.Fields = append(entity.Fields, value) - } + entity := models.NewEntity(entityType) + for _, attribute := range entityType.Attributes { + value, err := eavService.createValue(attribute, attributeValues) + if err != nil { + return nil, err + } + entity.Fields = append(entity.Fields, value) + } - return entity, eavService.entityRepository.Create(entity) + return entity, eavService.entityRepository.Create(tx, entity) + }, + ) } // Creates a new Value for the "attribute" with the information provided in "attributesValues" @@ -178,22 +177,27 @@ func (eavService *eavServiceImpl) createValue(attribute *models.Attribute, attri // // "newValues" are in {"attributeName": newValue} format func (eavService *eavServiceImpl) UpdateEntity(entityTypeName string, entityID uuid.UUID, newValues map[string]any) (*models.Entity, error) { - entity, err := eavService.GetEntity(entityTypeName, entityID) - if err != nil { - return nil, err - } - - for _, value := range entity.Fields { - newValue, isPresent := newValues[value.Attribute.Name] - if isPresent { - err := eavService.updateValue(value, newValue) + return ExecWithTransaction( + eavService.db, + func(tx *gorm.DB) (*models.Entity, error) { + entity, err := eavService.entityRepository.Get(tx, entityTypeName, entityID) if err != nil { return nil, err } - } - } - return entity, eavService.db.Save(entity.Fields).Error + for _, value := range entity.Fields { + newValue, isPresent := newValues[value.Attribute.Name] + if isPresent { + err := eavService.updateValue(value, newValue) + if err != nil { + return nil, err + } + } + } + + return entity, tx.Save(entity.Fields).Error + }, + ) } // Updates Value "value" to have the value "newValue" @@ -231,26 +235,20 @@ func (eavService *eavServiceImpl) updateValue(value *models.Value, newValue any) // Deletes Entity with type "entityTypeName" and id "entityID" and its values func (eavService *eavServiceImpl) DeleteEntity(entityTypeName string, entityID uuid.UUID) error { - entity, err := eavService.GetEntity(entityTypeName, entityID) - if err != nil { - return err - } - - return eavService.db.Transaction(func(tx *gorm.DB) error { - err := tx.Where("entity_id = ?", entityID.String()).Delete(&models.Value{}).Error - if err != nil { - return err - } + return ExecWithTransactionNoResponse( + eavService.db, + func(tx *gorm.DB) error { + entity, err := eavService.entityRepository.Get(tx, entityTypeName, entityID) + if err != nil { + return err + } - return tx.Delete(entity).Error - }) -} + err = tx.Where("entity_id = ?", entityID.String()).Delete(&models.Value{}).Error + if err != nil { + return err + } -func (eavService *eavServiceImpl) getEntityTypeByName(name string) (*models.EntityType, error) { - var entityType models.EntityType - err := eavService.db.Preload("Attributes").First(&entityType, "name = ?", name).Error - if err != nil { - return nil, err - } - return &entityType, nil + return tx.Delete(entity).Error + }, + ) } diff --git a/services/transaction_executor.go b/services/transaction_executor.go new file mode 100644 index 00000000..263f53e8 --- /dev/null +++ b/services/transaction_executor.go @@ -0,0 +1,68 @@ +package services + +import ( + "database/sql" + + "gorm.io/gorm" +) + +// Executes the function "toExec" inside a transaction +// The transaction is automatically rolled back in case "toExec" returns an error +// opts can be used to pass arguments to the transaction +func ExecWithTransaction[RT any]( + db *gorm.DB, + toExec func(*gorm.DB) (RT, error), + opts ...*sql.TxOptions, +) (RT, error) { + nilValue := *new(RT) + tx := db.Begin(opts...) + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + if err := tx.Error; err != nil { + return nilValue, err + } + + returnValue, err := toExec(tx) + if err != nil { + tx.Rollback() + return nilValue, err + } + + err = tx.Commit().Error + if err != nil { + return nilValue, err + } + + return returnValue, nil +} + +// Executes the function "toExec" inside a transaction ("toExec" does not return any value) +// The transaction is automatically rolled back in case "toExec" returns an error +// opts can be used to pass arguments to the transaction +func ExecWithTransactionNoResponse( + db *gorm.DB, + toExec func(*gorm.DB) error, + opts ...*sql.TxOptions, +) error { + tx := db.Begin(opts...) + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + if err := tx.Error; err != nil { + return err + } + + if err := toExec(tx); err != nil { + tx.Rollback() + return err + } + + return tx.Commit().Error +} diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index cd178848..2fcc3a08 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -5,7 +5,7 @@ import ( "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" - "github.com/ditrit/badaas/services/eavservice" + "github.com/ditrit/badaas/services" "github.com/elliotchance/pie/v2" "github.com/google/uuid" "github.com/stretchr/testify/suite" @@ -17,7 +17,7 @@ type EAVServiceIntTestSuite struct { suite.Suite logger *zap.Logger db *gorm.DB - eavService eavservice.EAVService + eavService services.EAVService entityRepository *repository.EntityRepository profileType *models.EntityType displayNameAttr *models.Attribute @@ -27,7 +27,7 @@ type EAVServiceIntTestSuite struct { func NewEAVServiceIntTestSuite( logger *zap.Logger, db *gorm.DB, - eavService eavservice.EAVService, + eavService services.EAVService, entityRepository *repository.EntityRepository, ) *EAVServiceIntTestSuite { return &EAVServiceIntTestSuite{ @@ -452,7 +452,7 @@ func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfUUIDCantBeParsed() { } entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) ts.Nil(entity) - ts.ErrorIs(err, eavservice.ErrCantParseUUID) + ts.ErrorIs(err, services.ErrCantParseUUID) } func (ts *EAVServiceIntTestSuite) TestCreatesDefaultAttributes() { @@ -760,7 +760,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDCantBeParsed "relation": "not-uuid", } _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) - ts.ErrorIs(err, eavservice.ErrCantParseUUID) + ts.ErrorIs(err, services.ErrCantParseUUID) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFails() { @@ -860,7 +860,7 @@ func (ts *EAVServiceIntTestSuite) createProfile(entityType *models.EntityType, d descriptionVal, ) - err := ts.entityRepository.Create(entity) + err := ts.entityRepository.Create(ts.db, entity) ts.Nil(err) return entity From 3ac5fb891fda8c0110d6dfa8c5a4e72551b991b8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 15:20:12 +0200 Subject: [PATCH 094/467] fix contributing.md --- CONTRIBUTING.md | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a1319e6b..9959373d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -55,32 +55,32 @@ We use uber's [zap](https://pkg.go.dev/go.uber.org/zap) to log stuff, please tak This is the directory structure we use for the project: - `commands/` *(Go code)*: Contains all the CLI commands. This package relies heavily on github.com/ditrit/verdeter. -- `configuration/` *(Go code)*: Contains all the configuration holders. Please only use the interfaces, they are all mocked for easy testing +- `configuration/` *(Go code)*: Contains all the configuration holders. Please only use the interfaces, they are all mocked for easy testing. - `controllers/` *(Go code)*: Contains all the http controllers, they handle http requests and consume services. - `docs/`: Contains the documentation. -- `test_e2e/`: Contains all the feature tests (or end to end tests). +- `test_e2e/`: Contains all the feature and steps for e2e tests. - `test_integration/`: Contains all the integration tests. - `logger/` *(Go code)*: Contains the logger creation logic. Please don't call it from your own services and code, use the dependency injection system. - `persistance/` *(Go code)*: - - `/gormdatabase/` *(Go code)*: Contains the logic to create a database. Also contains a go package named `gormzap`: it is a compatibility layer between *gorm.io/gorm* and *github.com/uber-go/zap*. - - `/models/` *(Go code)*: Contains the models. (For a structure to me considered a valid model, it has to embed `models.BaseModel` and satisfy the `models.Tabler` interface. This interface returns the name of the sql table.) - - `/dto/` *(Go code)*: Contains the Data Transfer Objects. They are used mainly to decode json payloads. - - `/pagination/` *(Go code)*: Contains the pagination logic. - - `/repository/` *(Go code)*: Contains the repository interface and implementation. Use uint as ID when using gorm models. + - `gormdatabase/` *(Go code)*: Contains the logic to create a database. Also contains a go package named `gormzap`: it is a compatibility layer between *gorm.io/gorm* and *github.com/uber-go/zap*. + - `models/` *(Go code)*: Contains the models. (For a structure to me considered a valid model, it has to embed `models.BaseModel` and satisfy the `models.Tabler` interface. This interface returns the name of the sql table.). + - `dto/` *(Go code)*: Contains the Data Transfer Objects. They are used mainly to decode json payloads. + - `pagination/` *(Go code)*: Contains the pagination logic. + - `repository/` *(Go code)*: Contains the repository interfaces and implementations to manage queries to the database. - `resources/` *(Go code)*: Contains the resources shared with the rest of the codebase (ex: API version). - `router/` *(Go code)*: Contains http router of badaas. - - `/middlewares/` *(Go code)*: Contains the various http middlewares that we use. + - `middlewares/` *(Go code)*: Contains the various http middlewares that we use. - `docker/` : Contains the docker, docker-compose file and configuration files for different environments. - - `/api/` : Contains the Dockerfile to build badaas with a dedicated config file. - - `/test_db/` : Contains the Dockerfile to build a development/test version of CockroachDB. - - `/test_api/` : Contains files to build a development/test version of the api. -- `services/` *(Go code)*: Contains the Dockerfile to build a development version of CockroachDB. - - `/auth/protocols/`: Contains the implementations of authentication clients for different protocols. - - `/basicauth/` *(Go code)*: Handle the authentication using email/password. - - `/oidc/` *(Go code)*: Handle the authentication via Open-ID Connect. - - `/sessionservice/` *(Go code)*: Handle sessions and their lifecycle. - - `/userservice/` *(Go code)*: Handle users. - - `validators/` *(Go code)*: Contains validators such as an email validator. + - `api/` : Contains the Dockerfile to build badaas with a dedicated config file. + - `test_db/` : Contains the Dockerfile to build a development/test version of CockroachDB. + - `test_api/` : Contains files to build a development/test version of the api. +- `services/` *(Go code)*: Contains services. + - `auth/protocols/`: Contains the implementations of authentication clients for different protocols. + - `basicauth/` *(Go code)*: Handle the authentication using email/password. + - `oidc/` *(Go code)*: Handle the authentication via Open-ID Connect. + - `sessionservice/` *(Go code)*: Handle sessions and their lifecycle. + - `userservice/` *(Go code)*: Handle users. +- `validators/` *(Go code)*: Contains validators such as an email validator. At the root of the project, you will find: @@ -95,7 +95,6 @@ At the root of the project, you will find: `[BRANCH_TYPE]/[BRANCH_NAME]` - `BRANCH_TYPE` is a prefix to describe the purpose of the branch. - Accepted prefixes are: - `feature`, used for feature development - `bugfix`, used for bug fix @@ -124,5 +123,5 @@ Steps to release: - Verify the content of the `changelog.md`. - Commit the modifications with the label `Release version X.Y.Z`. - Create a pull request on github for this branch into `main`. -- Once the pull request validated and merged, tag the `main` branch with `vX.Y.Z` -- After the tag is pushed, make the release on the tag in GitHub +- Once the pull request validated and merged, tag the `main` branch with `vX.Y.Z`. +- After the tag is pushed, make the release on the tag in GitHub. From 7455c89e18ad6cc6bdbd141be2c20db5f51e570a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 15:23:42 +0200 Subject: [PATCH 095/467] add more changelog --- changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog.md b/changelog.md index a10e00f3..e61c5f4f 100644 --- a/changelog.md +++ b/changelog.md @@ -33,5 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add integration tests. - Add a eav controller to store objects in EAV format. - Add some examples of data models. +- Add transaction executor to run services that lead to multiples queries. +- Add repositories to manage querying to the database. [unreleased]: https://github.com/ditrit/badaas/blob/main/changelog.md#unreleased From a3c141fd3cab6b227eed0dc133c888cfeb99b8d4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 15:25:50 +0200 Subject: [PATCH 096/467] go back to one line format in auth controller --- controllers/basicAuth.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/controllers/basicAuth.go b/controllers/basicAuth.go index 5b786486..3a65cfb5 100644 --- a/controllers/basicAuth.go +++ b/controllers/basicAuth.go @@ -77,8 +77,5 @@ func (basicAuthController *basicAuthenticationController) BasicLoginHandler(w ht // Log Out the user func (basicAuthController *basicAuthenticationController) Logout(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - return nil, basicAuthController.sessionService.LogUserOut( - sessionservice.GetSessionClaimsFromContext(r.Context()), - w, - ) + return nil, basicAuthController.sessionService.LogUserOut(sessionservice.GetSessionClaimsFromContext(r.Context()), w) } From b8a945c75db9034c27edc2ac61c33a2ebfeaae1a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 15:56:11 +0200 Subject: [PATCH 097/467] fix method names in eav controller --- controllers/eav.go | 27 +++--- controllers/eav_test.go | 82 +++++++++---------- mocks/controllers/EAVController.go | 12 +-- mocks/services/{eavservice => }/EAVService.go | 12 +-- router/router.go | 4 +- 5 files changed, 70 insertions(+), 67 deletions(-) rename mocks/services/{eavservice => }/EAVService.go (92%) diff --git a/controllers/eav.go b/controllers/eav.go index 8c01505e..7bb72833 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -17,8 +17,8 @@ import ( ) var ( - ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid entity id") - ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists in the schema") + ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid object id") + ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists") ErrIDNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") ErrDBQueryFailed = func(err error) httperrors.HTTPError { return httperrors.NewInternalServerError("db error", "database query failed", err) @@ -27,16 +27,15 @@ var ( type EAVController interface { GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - ModifyObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) } // check interface compliance var _ EAVController = (*eavControllerImpl)(nil) -// The InformationController constructor func NewEAVController( logger *zap.Logger, eavService services.EAVService, @@ -47,13 +46,13 @@ func NewEAVController( } } -// The concrete implementation of the InformationController +// The concrete implementation of the EAVController type eavControllerImpl struct { logger *zap.Logger eavService services.EAVService } -// The handler responsible for the retrieval of une entity +// The handler responsible of the retrieval of one objects func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) if herr != nil { @@ -71,7 +70,8 @@ func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Re return entity, nil } -func (controller *eavControllerImpl) GetAll(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +// The handler responsible of the retrieval of multiple objects +func (controller *eavControllerImpl) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) if herr != nil { return nil, herr @@ -93,7 +93,7 @@ func (controller *eavControllerImpl) GetAll(w http.ResponseWriter, r *http.Reque return entities, nil } -// The handler responsible for the creation of entities +// The handler responsible of the creation of a object func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) if herr != nil { @@ -123,8 +123,8 @@ func buildLocationString(et *models.Entity) string { return fmt.Sprintf("/objects/%s/%s", et.EntityType.Name, et.ID.String()) } -// The handler responsible for the updates of entities -func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +// The handler responsible for the updates of one object +func (controller *eavControllerImpl) UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) if herr != nil { return nil, herr @@ -146,7 +146,7 @@ func (controller *eavControllerImpl) ModifyObject(w http.ResponseWriter, r *http return entity, nil } -// The handler responsible for the deletion of entities and their associated value +// The handler responsible for the deletion of a object func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) if herr != nil { @@ -164,6 +164,7 @@ func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http return nil, nil } +// Extract the "type" parameter from url func (controller *eavControllerImpl) getEntityTypeNameFromRequest(r *http.Request) (string, httperrors.HTTPError) { entityTypeName, present := mux.Vars(r)["type"] if !present { @@ -188,6 +189,7 @@ func (controller *eavControllerImpl) getEntityIDFromRequest(r *http.Request) (uu return uid, nil } +// Extract the "type" and "id" parameters from url func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Request) (string, uuid.UUID, httperrors.HTTPError) { entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) if herr != nil { @@ -202,6 +204,7 @@ func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Reques return entityTypeName, entityID, nil } +// Decode json present in request body func (controller *eavControllerImpl) decodeJSON(r *http.Request) (map[string]any, httperrors.HTTPError) { var attrs map[string]any err := json.NewDecoder(r.Body).Decode(&attrs) diff --git a/controllers/eav_test.go b/controllers/eav_test.go index 8baf3999..89a0ac5e 100644 --- a/controllers/eav_test.go +++ b/controllers/eav_test.go @@ -7,7 +7,7 @@ import ( "testing" "github.com/ditrit/badaas/controllers" - mocksEAVService "github.com/ditrit/badaas/mocks/services/eavservice" + mockServices "github.com/ditrit/badaas/mocks/services" "github.com/ditrit/badaas/persistence/models" uuid "github.com/google/uuid" "github.com/gorilla/mux" @@ -21,7 +21,7 @@ var logger, _ = zap.NewDevelopment() // ----------------------- GetObject ----------------------- func TestGetWithoutTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) controller := controllers.NewEAVController( logger, @@ -39,7 +39,7 @@ func TestGetWithoutTypeReturnsError(t *testing.T) { } func TestGetOfNotExistentTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) uuid := uuid.New() eavService. @@ -63,7 +63,7 @@ func TestGetOfNotExistentTypeReturnsError(t *testing.T) { } func TestGetWithoutEntityIDReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -86,7 +86,7 @@ func TestGetWithoutEntityIDReturnsError(t *testing.T) { } func TestGetWithEntityIDNotUUIDReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -109,7 +109,7 @@ func TestGetWithEntityIDNotUUIDReturnsError(t *testing.T) { } func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -138,7 +138,7 @@ func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { } func TestGetWithErrorInDBReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -167,7 +167,7 @@ func TestGetWithErrorInDBReturnsError(t *testing.T) { } func TestGetWithCorrectIDReturnsObject(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -203,7 +203,7 @@ func TestGetWithCorrectIDReturnsObject(t *testing.T) { // ----------------------- GetAll ----------------------- func TestGetAllWithoutTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) controller := controllers.NewEAVController( logger, @@ -216,12 +216,12 @@ func TestGetAllWithoutTypeReturnsError(t *testing.T) { strings.NewReader(""), ) - _, err := controller.GetAll(response, request) + _, err := controller.GetObjects(response, request) assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) } func TestGetAllOfNotExistentTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) eavService. On("GetEntities", "no-exists", map[string]string{}). @@ -239,12 +239,12 @@ func TestGetAllOfNotExistentTypeReturnsError(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) - _, err := controller.GetAll(response, request) + _, err := controller.GetObjects(response, request) assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) } func TestGetAllWithErrorInDBReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) eavService. On("GetEntities", "no-exists", map[string]string{}). @@ -262,12 +262,12 @@ func TestGetAllWithErrorInDBReturnsError(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) - _, err := controller.GetAll(response, request) + _, err := controller.GetObjects(response, request) assert.ErrorContains(t, err, "db error") } func TestGetAllWithoutParams(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -296,7 +296,7 @@ func TestGetAllWithoutParams(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) - entitiesReturned, err := controller.GetAll(response, request) + entitiesReturned, err := controller.GetObjects(response, request) assert.Nil(t, err) assert.Len(t, entitiesReturned, 2) assert.Contains(t, entitiesReturned, entity1) @@ -304,7 +304,7 @@ func TestGetAllWithoutParams(t *testing.T) { } func TestGetAllWithParams(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -333,7 +333,7 @@ func TestGetAllWithParams(t *testing.T) { q.Add("param1", "something") request.URL.RawQuery = q.Encode() - entitiesReturned, err := controller.GetAll(response, request) + entitiesReturned, err := controller.GetObjects(response, request) assert.Nil(t, err) assert.Len(t, entitiesReturned, 1) assert.Contains(t, entitiesReturned, entity1) @@ -342,7 +342,7 @@ func TestGetAllWithParams(t *testing.T) { // ----------------------- DeleteObject ----------------------- func TestDeleteWithoutTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) controller := controllers.NewEAVController( logger, @@ -360,7 +360,7 @@ func TestDeleteWithoutTypeReturnsError(t *testing.T) { } func TestDeleteOfNotExistentTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) uuid := uuid.New() @@ -385,7 +385,7 @@ func TestDeleteOfNotExistentTypeReturnsError(t *testing.T) { } func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -414,7 +414,7 @@ func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { } func TestDeleteObjectReturnsNil(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -446,7 +446,7 @@ func TestDeleteObjectReturnsNil(t *testing.T) { // ----------------------- CreateObject ----------------------- func TestCreateWithoutTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) controller := controllers.NewEAVController( logger, @@ -464,7 +464,7 @@ func TestCreateWithoutTypeReturnsError(t *testing.T) { } func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -487,7 +487,7 @@ func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { } func TestCreateOfNotExistentTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) eavService. On("CreateEntity", "no-exists", map[string]any{"1": "1"}). @@ -510,7 +510,7 @@ func TestCreateOfNotExistentTypeReturnsError(t *testing.T) { } func TestCreteObjectWithErrorInDBReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -537,7 +537,7 @@ func TestCreteObjectWithErrorInDBReturnsError(t *testing.T) { } func TestCreteObjectReturnsObject(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -568,10 +568,10 @@ func TestCreteObjectReturnsObject(t *testing.T) { assert.Equal(t, entity, responded) } -// ----------------------- ModifyObject ----------------------- +// ----------------------- UpdateObject ----------------------- func TestModifyWithoutTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) controller := controllers.NewEAVController( logger, @@ -584,12 +584,12 @@ func TestModifyWithoutTypeReturnsError(t *testing.T) { strings.NewReader(""), ) - _, err := controller.ModifyObject(response, request) + _, err := controller.UpdateObject(response, request) assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) } -func TestModifyObjectWithBadJSONReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) +func TestUpdateObjectWithBadJSONReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -609,12 +609,12 @@ func TestModifyObjectWithBadJSONReturnsError(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - _, err := controller.ModifyObject(response, request) + _, err := controller.UpdateObject(response, request) assert.ErrorContains(t, err, "json decoding failed") } func TestModifyOfNotExistentTypeReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) + eavService := mockServices.NewEAVService(t) uuid := uuid.New() @@ -634,12 +634,12 @@ func TestModifyOfNotExistentTypeReturnsError(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) - _, err := controller.ModifyObject(response, request) + _, err := controller.UpdateObject(response, request) assert.ErrorIs(t, err, controllers.ErrEntityNotFound) } -func TestModifyObjectWithErrorInDBReturnsError(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) +func TestUpdateObjectWithErrorInDBReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -663,12 +663,12 @@ func TestModifyObjectWithErrorInDBReturnsError(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - _, err := controller.ModifyObject(response, request) + _, err := controller.UpdateObject(response, request) assert.ErrorContains(t, err, "db error") } -func TestModifyObjectReturnsObject(t *testing.T) { - eavService := mocksEAVService.NewEAVService(t) +func TestUpdateObjectReturnsObject(t *testing.T) { + eavService := mockServices.NewEAVService(t) entityType := &models.EntityType{ Name: "entityType", @@ -695,7 +695,7 @@ func TestModifyObjectReturnsObject(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - responded, err := controller.ModifyObject(response, request) + responded, err := controller.UpdateObject(response, request) assert.Nil(t, err) assert.Equal(t, entity, responded) } diff --git a/mocks/controllers/EAVController.go b/mocks/controllers/EAVController.go index a001c00a..d9c4a47b 100644 --- a/mocks/controllers/EAVController.go +++ b/mocks/controllers/EAVController.go @@ -70,8 +70,8 @@ func (_m *EAVController) DeleteObject(w http.ResponseWriter, r *http.Request) (i return r0, r1 } -// GetAll provides a mock function with given fields: w, r -func (_m *EAVController) GetAll(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { +// GetObject provides a mock function with given fields: w, r +func (_m *EAVController) GetObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { ret := _m.Called(w, r) var r0 interface{} @@ -98,8 +98,8 @@ func (_m *EAVController) GetAll(w http.ResponseWriter, r *http.Request) (interfa return r0, r1 } -// GetObject provides a mock function with given fields: w, r -func (_m *EAVController) GetObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { +// GetObjects provides a mock function with given fields: w, r +func (_m *EAVController) GetObjects(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { ret := _m.Called(w, r) var r0 interface{} @@ -126,8 +126,8 @@ func (_m *EAVController) GetObject(w http.ResponseWriter, r *http.Request) (inte return r0, r1 } -// ModifyObject provides a mock function with given fields: w, r -func (_m *EAVController) ModifyObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { +// UpdateObject provides a mock function with given fields: w, r +func (_m *EAVController) UpdateObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { ret := _m.Called(w, r) var r0 interface{} diff --git a/mocks/services/eavservice/EAVService.go b/mocks/services/EAVService.go similarity index 92% rename from mocks/services/eavservice/EAVService.go rename to mocks/services/EAVService.go index 16c6f570..2953123c 100644 --- a/mocks/services/eavservice/EAVService.go +++ b/mocks/services/EAVService.go @@ -14,17 +14,17 @@ type EAVService struct { mock.Mock } -// CreateEntity provides a mock function with given fields: entityTypeName, attrs -func (_m *EAVService) CreateEntity(entityTypeName string, attrs map[string]interface{}) (*models.Entity, error) { - ret := _m.Called(entityTypeName, attrs) +// CreateEntity provides a mock function with given fields: entityTypeName, attributeValues +func (_m *EAVService) CreateEntity(entityTypeName string, attributeValues map[string]interface{}) (*models.Entity, error) { + ret := _m.Called(entityTypeName, attributeValues) var r0 *models.Entity var r1 error if rf, ok := ret.Get(0).(func(string, map[string]interface{}) (*models.Entity, error)); ok { - return rf(entityTypeName, attrs) + return rf(entityTypeName, attributeValues) } if rf, ok := ret.Get(0).(func(string, map[string]interface{}) *models.Entity); ok { - r0 = rf(entityTypeName, attrs) + r0 = rf(entityTypeName, attributeValues) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*models.Entity) @@ -32,7 +32,7 @@ func (_m *EAVService) CreateEntity(entityTypeName string, attrs map[string]inter } if rf, ok := ret.Get(1).(func(string, map[string]interface{}) error); ok { - r1 = rf(entityTypeName, attrs) + r1 = rf(entityTypeName, attributeValues) } else { r1 = ret.Error(1) } diff --git a/router/router.go b/router/router.go index e4bea43a..d6164ad8 100644 --- a/router/router.go +++ b/router/router.go @@ -44,9 +44,9 @@ func SetupRouter( objectsBase := "/objects/{type}" objectsWithID := objectsBase + "/{id}" router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.GetObject)).Methods("GET") - router.HandleFunc(objectsBase, jsonController.Wrap(eavController.GetAll)).Methods("GET") + router.HandleFunc(objectsBase, jsonController.Wrap(eavController.GetObjects)).Methods("GET") router.HandleFunc(objectsBase, jsonController.Wrap(eavController.CreateObject)).Methods("POST") - router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.ModifyObject)).Methods("PUT") + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.UpdateObject)).Methods("PUT") router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.DeleteObject)).Methods("DELETE") cors := handlers.CORS( From b4604c7470b78603c8df930594eb79e2eac39465 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 16:30:18 +0200 Subject: [PATCH 098/467] verify that relation value exists on creation and update --- persistence/models/Value.go | 34 +++--- .../repository/EntityTypeRepository.go | 10 ++ services/eav.go | 41 ++++--- test_integration/eavservice.go | 102 ++++++++++++++++++ 4 files changed, 155 insertions(+), 32 deletions(-) diff --git a/persistence/models/Value.go b/persistence/models/Value.go index aad4dbac..71cb9ec3 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -59,25 +59,8 @@ func NewStringValue(attr *Attribute, s string) (*Value, error) { // If et is nil, then the function returns an error // If et is of the wrong types, then the function returns an error func NewRelationValue(attr *Attribute, et *Entity) (*Value, error) { - if et == nil { - return nil, fmt.Errorf("can't create a new relation with a nil entity pointer") - } - if et.EntityType.ID != attr.RelationTargetEntityTypeID { - return nil, fmt.Errorf( - "can't create a relation with an entity of wrong EntityType (got the entityTypeID=%s, expected=%s)", - et.EntityType.ID.String(), attr.RelationTargetEntityTypeID.String(), - ) - } - - return NewRelationIDValue(attr, et.ID) -} - -// Create a new relation value. -// If et is nil, then the function returns an error -// If et is of the wrong types, then the function returns an error -func NewRelationIDValue(attr *Attribute, uuidVal uuid.UUID) (*Value, error) { value := &Value{Attribute: attr, AttributeID: attr.ID} - return value, value.SetRelationVal(uuidVal) + return value, value.SetRelationVal(et) } // Return the underlying value as an interface @@ -161,13 +144,24 @@ func (v *Value) SetBooleanVal(boolVal bool) error { return nil } -func (v *Value) SetRelationVal(relationVal uuid.UUID) error { +func (v *Value) SetRelationVal(entity *Entity) error { + if entity == nil { + return fmt.Errorf("can't create a new relation with a nil entity pointer") + } + if v.Attribute.ValueType != RelationValueType { return ErrAskingForWrongType } + if entity.EntityType.ID != v.Attribute.RelationTargetEntityTypeID { + return fmt.Errorf( + "can't create a relation with an entity of wrong EntityType (got the entityTypeID=%s, expected=%s)", + entity.EntityType.ID.String(), v.Attribute.RelationTargetEntityTypeID.String(), + ) + } + v.IsNull = false - v.RelationVal = relationVal + v.RelationVal = entity.ID return nil } diff --git a/persistence/repository/EntityTypeRepository.go b/persistence/repository/EntityTypeRepository.go index f1d36774..545efdbf 100644 --- a/persistence/repository/EntityTypeRepository.go +++ b/persistence/repository/EntityTypeRepository.go @@ -2,6 +2,7 @@ package repository import ( "github.com/ditrit/badaas/persistence/models" + "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" ) @@ -18,6 +19,15 @@ func NewEntityTypeRepository( } } +func (r *EntityTypeRepository) Get(tx *gorm.DB, id uuid.UUID) (*models.EntityType, error) { + var entityType models.EntityType + err := tx.Preload("Attributes").First(&entityType, id).Error + if err != nil { + return nil, err + } + return &entityType, nil +} + func (r *EntityTypeRepository) GetByName(tx *gorm.DB, name string) (*models.EntityType, error) { var entityType models.EntityType err := tx.Preload("Attributes").First(&entityType, "name = ?", name).Error diff --git a/services/eav.go b/services/eav.go index 88c6c7d1..66cef4a5 100644 --- a/services/eav.go +++ b/services/eav.go @@ -131,7 +131,7 @@ func (eavService *eavServiceImpl) CreateEntity(entityTypeName string, attributeV entity := models.NewEntity(entityType) for _, attribute := range entityType.Attributes { - value, err := eavService.createValue(attribute, attributeValues) + value, err := eavService.createValue(tx, attribute, attributeValues) if err != nil { return nil, err } @@ -151,11 +151,11 @@ func (eavService *eavServiceImpl) CreateEntity(entityTypeName string, attributeV // // returns error is the type of the value provided for "attribute" // does not correspond with its ValueType -func (eavService *eavServiceImpl) createValue(attribute *models.Attribute, attributesValues map[string]any) (*models.Value, error) { +func (eavService *eavServiceImpl) createValue(tx *gorm.DB, attribute *models.Attribute, attributesValues map[string]any) (*models.Value, error) { attributeValue, isPresent := attributesValues[attribute.Name] if isPresent { value := &models.Value{Attribute: attribute, AttributeID: attribute.ID} - err := eavService.updateValue(value, attributeValue) + err := eavService.updateValue(tx, value, attributeValue) if err != nil { return nil, err } @@ -188,7 +188,7 @@ func (eavService *eavServiceImpl) UpdateEntity(entityTypeName string, entityID u for _, value := range entity.Fields { newValue, isPresent := newValues[value.Attribute.Name] if isPresent { - err := eavService.updateValue(value, newValue) + err := eavService.updateValue(tx, value, newValue) if err != nil { return nil, err } @@ -204,17 +204,11 @@ func (eavService *eavServiceImpl) UpdateEntity(entityTypeName string, entityID u // // returns error is the type of the "newValue" does not correspond // with the type expected for the "value"'s attribute -func (eavService *eavServiceImpl) updateValue(value *models.Value, newValue any) error { +func (eavService *eavServiceImpl) updateValue(tx *gorm.DB, value *models.Value, newValue any) error { switch newValueTyped := newValue.(type) { case string: if value.Attribute.ValueType == models.RelationValueType { - uuidVal, err := uuid.Parse(newValueTyped) - if err != nil { - return ErrCantParseUUID - } - - // TODO verify that exists - return value.SetRelationVal(uuidVal) + return eavService.updateRelationValue(tx, value, newValueTyped) } return value.SetStringVal(newValueTyped) case int: @@ -233,6 +227,29 @@ func (eavService *eavServiceImpl) updateValue(value *models.Value, newValue any) } } +// Updates Value "value" to point to "newID" +// +// returns error if entity with "newID" does not exist +// or its type is not the same as the one pointed by the attribute's RelationTargetEntityTypeID +func (eavService *eavServiceImpl) updateRelationValue(tx *gorm.DB, value *models.Value, newID string) error { + uuidVal, err := uuid.Parse(newID) + if err != nil { + return ErrCantParseUUID + } + + relationEntityType, err := eavService.entityTypeRepository.Get(tx, value.Attribute.RelationTargetEntityTypeID) + if err != nil { + return err + } + + relationEntity, err := eavService.entityRepository.Get(tx, relationEntityType.Name, uuidVal) + if err != nil { + return err + } + + return value.SetRelationVal(relationEntity) +} + // Deletes Entity with type "entityTypeName" and id "entityID" and its values func (eavService *eavServiceImpl) DeleteEntity(entityTypeName string, entityID uuid.UUID) error { return ExecWithTransactionNoResponse( diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 2fcc3a08..f291ecfe 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -431,6 +431,15 @@ func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfEntityTypeDoesNotExist ts.ErrorIs(err, gorm.ErrRecordNotFound) } +func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfTheTypeOfAValueIsUnsupported() { + params := map[string]any{ + "displayName": []string{"salut", "bonjour"}, + } + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) + ts.Nil(entity) + ts.ErrorContains(err, "unsupported type") +} + func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfUUIDCantBeParsed() { otherType := &models.EntityType{ Name: "other", @@ -455,6 +464,29 @@ func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfUUIDCantBeParsed() { ts.ErrorIs(err, services.ErrCantParseUUID) } +func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfRelationAttributePointsToNotExistentType() { + relationAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "relation", + ValueType: models.RelationValueType, + RelationTargetEntityTypeID: uuid.New(), + } + ts.profileType.Attributes = append(ts.profileType.Attributes, + relationAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + params := map[string]any{ + "displayName": "displayName", + "relation": uuid.New().String(), + } + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) + ts.Nil(entity) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + func (ts *EAVServiceIntTestSuite) TestCreatesDefaultAttributes() { intAttr := &models.Attribute{ EntityTypeID: ts.profileType.ID, @@ -763,6 +795,76 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDCantBeParsed ts.ErrorIs(err, services.ErrCantParseUUID) } +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotExists() { + otherEntityType := &models.EntityType{ + Name: "other", + } + + err := ts.db.Create(otherEntityType).Error + ts.Nil(err) + + relationAttr := models.NewRelationAttribute( + ts.profileType, "relation", + false, false, otherEntityType, + ) + + ts.profileType.Attributes = append(ts.profileType.Attributes, + relationAttr, + ) + + err = ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) + ts.Nil(err) + + paramsUpdate := map[string]any{ + "relation": uuid.New().String(), + } + _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotCorrespondsToTheRelationEntityType() { + otherEntityType := &models.EntityType{ + Name: "other", + } + + otherEntityType2 := &models.EntityType{ + Name: "other2", + } + + err := ts.db.Create(otherEntityType).Error + ts.Nil(err) + + err = ts.db.Create(otherEntityType2).Error + ts.Nil(err) + + relationAttr := models.NewRelationAttribute( + ts.profileType, "relation", + false, false, otherEntityType, + ) + + ts.profileType.Attributes = append(ts.profileType.Attributes, + relationAttr, + ) + + err = ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) + ts.Nil(err) + + entityOther2, err := ts.eavService.CreateEntity(otherEntityType2.Name, map[string]any{}) + ts.Nil(err) + + paramsUpdate := map[string]any{ + "relation": entityOther2.ID.String(), + } + _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFails() { entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) ts.Nil(err) From 8b24cbc4db09831e867e48f42f6f8e603405c7ed Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 17:00:21 +0200 Subject: [PATCH 099/467] remove unused file --- persistence/models/dto/UserDTO.go | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 persistence/models/dto/UserDTO.go diff --git a/persistence/models/dto/UserDTO.go b/persistence/models/dto/UserDTO.go deleted file mode 100644 index 05720624..00000000 --- a/persistence/models/dto/UserDTO.go +++ /dev/null @@ -1,6 +0,0 @@ -package dto - -type DTOUserInfo struct { - Username string `json:"username"` - Email string `json:"email"` -} From 120f77244853f2199ed1a51108f3850602a76c72 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 25 Apr 2023 17:09:47 +0200 Subject: [PATCH 100/467] go back to previus way to import uuid --- controllers/basicAuth_test.go | 3 +-- controllers/eav.go | 3 +-- controllers/eav_test.go | 2 +- mocks/services/EAVService.go | 2 +- mocks/services/sessionservice/SessionService.go | 2 +- persistence/ModuleFx.go | 2 +- persistence/models/Attribute.go | 2 +- persistence/models/BaseModel.go | 2 +- persistence/models/Entity.go | 2 +- persistence/models/Entity_test.go | 3 +-- persistence/models/Session.go | 2 +- persistence/models/Value.go | 2 +- router/middlewares/middlewareAuthentication.go | 3 +-- services/eav.go | 3 +-- services/sessionservice/session.go | 3 +-- services/sessionservice/session_test.go | 3 +-- services/sessionservice/sessionctx.go | 3 +-- services/sessionservice/sessionctx_test.go | 3 +-- services/userservice/userservice.go | 3 +-- services/userservice/userservice_test.go | 3 +-- 20 files changed, 20 insertions(+), 31 deletions(-) diff --git a/controllers/basicAuth_test.go b/controllers/basicAuth_test.go index c082d99f..d388a421 100644 --- a/controllers/basicAuth_test.go +++ b/controllers/basicAuth_test.go @@ -5,14 +5,13 @@ import ( "strings" "testing" - uuid "github.com/google/uuid" - "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/httperrors" mocksSessionService "github.com/ditrit/badaas/mocks/services/sessionservice" mocksUserService "github.com/ditrit/badaas/mocks/services/userservice" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" + "github.com/google/uuid" "github.com/stretchr/testify/assert" "go.uber.org/zap" "go.uber.org/zap/zaptest/observer" diff --git a/controllers/eav.go b/controllers/eav.go index 7bb72833..6e86289b 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -6,11 +6,10 @@ import ( "fmt" "net/http" - uuid "github.com/google/uuid" - "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/services" + "github.com/google/uuid" "github.com/gorilla/mux" "go.uber.org/zap" "gorm.io/gorm" diff --git a/controllers/eav_test.go b/controllers/eav_test.go index 89a0ac5e..a7c58ea1 100644 --- a/controllers/eav_test.go +++ b/controllers/eav_test.go @@ -9,7 +9,7 @@ import ( "github.com/ditrit/badaas/controllers" mockServices "github.com/ditrit/badaas/mocks/services" "github.com/ditrit/badaas/persistence/models" - uuid "github.com/google/uuid" + "github.com/google/uuid" "github.com/gorilla/mux" "github.com/stretchr/testify/assert" "go.uber.org/zap" diff --git a/mocks/services/EAVService.go b/mocks/services/EAVService.go index 2953123c..38b0d714 100644 --- a/mocks/services/EAVService.go +++ b/mocks/services/EAVService.go @@ -6,7 +6,7 @@ import ( models "github.com/ditrit/badaas/persistence/models" mock "github.com/stretchr/testify/mock" - uuid "github.com/google/uuid" + "github.com/google/uuid" ) // EAVService is an autogenerated mock type for the EAVService type diff --git a/mocks/services/sessionservice/SessionService.go b/mocks/services/sessionservice/SessionService.go index 101cfba9..cd232637 100644 --- a/mocks/services/sessionservice/SessionService.go +++ b/mocks/services/sessionservice/SessionService.go @@ -12,7 +12,7 @@ import ( sessionservice "github.com/ditrit/badaas/services/sessionservice" - uuid "github.com/google/uuid" + "github.com/google/uuid" ) // SessionService is an autogenerated mock type for the SessionService type diff --git a/persistence/ModuleFx.go b/persistence/ModuleFx.go index 89114787..4496fe2d 100644 --- a/persistence/ModuleFx.go +++ b/persistence/ModuleFx.go @@ -1,7 +1,7 @@ package persistence import ( - uuid "github.com/google/uuid" + "github.com/google/uuid" "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/ditrit/badaas/persistence/models" diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index 160293b1..6aa01898 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" - uuid "github.com/google/uuid" + "github.com/google/uuid" ) // Describe the type of an attribute diff --git a/persistence/models/BaseModel.go b/persistence/models/BaseModel.go index 7b758815..cf2beb2c 100644 --- a/persistence/models/BaseModel.go +++ b/persistence/models/BaseModel.go @@ -3,7 +3,7 @@ package models import ( "time" - uuid "github.com/google/uuid" + "github.com/google/uuid" "gorm.io/gorm" ) diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 0a2b67e6..61078097 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -3,7 +3,7 @@ package models import ( "encoding/json" - uuid "github.com/google/uuid" + "github.com/google/uuid" ) // Describe an instance of an EntityType diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go index 173a0295..4e2d2005 100644 --- a/persistence/models/Entity_test.go +++ b/persistence/models/Entity_test.go @@ -3,8 +3,7 @@ package models import ( "testing" - uuid "github.com/google/uuid" - + "github.com/google/uuid" "github.com/stretchr/testify/assert" ) diff --git a/persistence/models/Session.go b/persistence/models/Session.go index b5f591aa..89bdb1b7 100644 --- a/persistence/models/Session.go +++ b/persistence/models/Session.go @@ -3,7 +3,7 @@ package models import ( "time" - uuid "github.com/google/uuid" + "github.com/google/uuid" ) // Represent a user session diff --git a/persistence/models/Value.go b/persistence/models/Value.go index 71cb9ec3..e14724fc 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" - uuid "github.com/google/uuid" + "github.com/google/uuid" ) // Describe the attribute value of an Entity diff --git a/router/middlewares/middlewareAuthentication.go b/router/middlewares/middlewareAuthentication.go index 08c309d8..b1560dd5 100644 --- a/router/middlewares/middlewareAuthentication.go +++ b/router/middlewares/middlewareAuthentication.go @@ -3,10 +3,9 @@ package middlewares import ( "net/http" - uuid "github.com/google/uuid" - "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/services/sessionservice" + "github.com/google/uuid" "go.uber.org/zap" ) diff --git a/services/eav.go b/services/eav.go index 66cef4a5..1a27a825 100644 --- a/services/eav.go +++ b/services/eav.go @@ -4,11 +4,10 @@ import ( "errors" "fmt" - uuid "github.com/google/uuid" - "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/utils" + "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" ) diff --git a/services/sessionservice/session.go b/services/sessionservice/session.go index 3ee63735..b87f73cb 100644 --- a/services/sessionservice/session.go +++ b/services/sessionservice/session.go @@ -6,13 +6,12 @@ import ( "sync" "time" - uuid "github.com/google/uuid" - "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" + "github.com/google/uuid" "go.uber.org/zap" ) diff --git a/services/sessionservice/session_test.go b/services/sessionservice/session_test.go index cb928aeb..422b831f 100644 --- a/services/sessionservice/session_test.go +++ b/services/sessionservice/session_test.go @@ -5,14 +5,13 @@ import ( "testing" "time" - uuid "github.com/google/uuid" - "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/httperrors" configurationmocks "github.com/ditrit/badaas/mocks/configuration" repositorymocks "github.com/ditrit/badaas/mocks/persistence/repository" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/pagination" + "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" diff --git a/services/sessionservice/sessionctx.go b/services/sessionservice/sessionctx.go index df363ba8..6710766a 100644 --- a/services/sessionservice/sessionctx.go +++ b/services/sessionservice/sessionctx.go @@ -3,9 +3,8 @@ package sessionservice import ( "context" - uuid "github.com/google/uuid" - "github.com/ditrit/badaas/persistence/models" + "github.com/google/uuid" ) // The session claims passed in the request context diff --git a/services/sessionservice/sessionctx_test.go b/services/sessionservice/sessionctx_test.go index 3ffbfc3b..88b3f954 100644 --- a/services/sessionservice/sessionctx_test.go +++ b/services/sessionservice/sessionctx_test.go @@ -4,8 +4,7 @@ import ( "context" "testing" - uuid "github.com/google/uuid" - + "github.com/google/uuid" "github.com/stretchr/testify/assert" ) diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index 75546dec..3f3da399 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -3,8 +3,6 @@ package userservice import ( "fmt" - uuid "github.com/google/uuid" - "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" @@ -12,6 +10,7 @@ import ( "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/auth/protocols/basicauth" validator "github.com/ditrit/badaas/validators" + "github.com/google/uuid" "go.uber.org/zap" ) diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index 81831c13..df435ed8 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -3,14 +3,13 @@ package userservice_test import ( "testing" - uuid "github.com/google/uuid" - "github.com/ditrit/badaas/httperrors" repositorymocks "github.com/ditrit/badaas/mocks/persistence/repository" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" "github.com/ditrit/badaas/persistence/pagination" "github.com/ditrit/badaas/services/userservice" + "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" From 2a980afd7c0ef0f7b1ef44d2482d11bc9dfb2b73 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 26 Apr 2023 09:52:37 +0200 Subject: [PATCH 101/467] do not repeat commands in makefile --- Makefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 25b538bf..85d35935 100644 --- a/Makefile +++ b/Makefile @@ -6,12 +6,13 @@ test_unit: test_unit_and_cover: go test $(PATHS) -coverpkg=./... -coverprofile=coverage_unit.out -v -test_integration: +test_db: docker compose -f "docker/test_db/docker-compose.yml" up -d + +test_integration: test_db go test ./test_integration -v -test_integration_and_cover: - docker compose -f "docker/test_db/docker-compose.yml" up -d +test_integration_and_cover: test_db go test ./test_integration -coverpkg=./... -coverprofile=coverage_int.out -v test_e2e: From 972f3561eadc9f4a6d2e978c671460d98956c0e0 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 26 Apr 2023 09:54:59 +0200 Subject: [PATCH 102/467] remove unnecessary exec with trans no response --- services/eav.go | 25 +++++++++++-------------- services/transaction_executor.go | 27 --------------------------- 2 files changed, 11 insertions(+), 41 deletions(-) diff --git a/services/eav.go b/services/eav.go index 1a27a825..de564619 100644 --- a/services/eav.go +++ b/services/eav.go @@ -251,20 +251,17 @@ func (eavService *eavServiceImpl) updateRelationValue(tx *gorm.DB, value *models // Deletes Entity with type "entityTypeName" and id "entityID" and its values func (eavService *eavServiceImpl) DeleteEntity(entityTypeName string, entityID uuid.UUID) error { - return ExecWithTransactionNoResponse( - eavService.db, - func(tx *gorm.DB) error { - entity, err := eavService.entityRepository.Get(tx, entityTypeName, entityID) - if err != nil { - return err - } + return eavService.db.Transaction(func(tx *gorm.DB) error { + entity, err := eavService.entityRepository.Get(tx, entityTypeName, entityID) + if err != nil { + return err + } - err = tx.Where("entity_id = ?", entityID.String()).Delete(&models.Value{}).Error - if err != nil { - return err - } + err = tx.Where("entity_id = ?", entityID.String()).Delete(&models.Value{}).Error + if err != nil { + return err + } - return tx.Delete(entity).Error - }, - ) + return tx.Delete(entity).Error + }) } diff --git a/services/transaction_executor.go b/services/transaction_executor.go index 263f53e8..2c4d3187 100644 --- a/services/transaction_executor.go +++ b/services/transaction_executor.go @@ -39,30 +39,3 @@ func ExecWithTransaction[RT any]( return returnValue, nil } - -// Executes the function "toExec" inside a transaction ("toExec" does not return any value) -// The transaction is automatically rolled back in case "toExec" returns an error -// opts can be used to pass arguments to the transaction -func ExecWithTransactionNoResponse( - db *gorm.DB, - toExec func(*gorm.DB) error, - opts ...*sql.TxOptions, -) error { - tx := db.Begin(opts...) - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - - if err := tx.Error; err != nil { - return err - } - - if err := toExec(tx); err != nil { - tx.Rollback() - return err - } - - return tx.Commit().Error -} From 43ce519c80272f552117cf3b96c2f69a0175eae8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 26 Apr 2023 11:09:37 +0200 Subject: [PATCH 103/467] get entities params from query to body in json --- controllers/eav.go | 15 ++++++--- controllers/eav_test.go | 13 +++----- docker/test_api/docker-compose.yml | 2 ++ examples/README.md | 6 ++-- mocks/services/EAVService.go | 10 +++--- .../services/sessionservice/SessionService.go | 2 +- services/eav.go | 8 ++--- test_e2e/http_support_test.go | 15 ++------- test_integration/eavservice.go | 32 +++++++++---------- 9 files changed, 48 insertions(+), 55 deletions(-) diff --git a/controllers/eav.go b/controllers/eav.go index 6e86289b..1c5983e8 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "net/http" "github.com/ditrit/badaas/httperrors" @@ -76,12 +77,12 @@ func (controller *eavControllerImpl) GetObjects(w http.ResponseWriter, r *http.R return nil, herr } - var qp = make(map[string]string) - for k, v := range r.URL.Query() { - qp[k] = v[0] + params, herr := controller.decodeJSON(r) + if herr != nil { + return nil, herr } - entities, err := controller.eavService.GetEntities(entityTypeName, qp) + entities, err := controller.eavService.GetEntities(entityTypeName, params) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityTypeNotFound @@ -207,7 +208,11 @@ func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Reques func (controller *eavControllerImpl) decodeJSON(r *http.Request) (map[string]any, httperrors.HTTPError) { var attrs map[string]any err := json.NewDecoder(r.Body).Decode(&attrs) - if err != nil { + switch { + case err == io.EOF: + // empty body + return map[string]any{}, nil + case err != nil: return nil, httperrors.NewBadRequestError("json decoding failed", "please use a correct json payload") } diff --git a/controllers/eav_test.go b/controllers/eav_test.go index a7c58ea1..7c0c0923 100644 --- a/controllers/eav_test.go +++ b/controllers/eav_test.go @@ -224,7 +224,7 @@ func TestGetAllOfNotExistentTypeReturnsError(t *testing.T) { eavService := mockServices.NewEAVService(t) eavService. - On("GetEntities", "no-exists", map[string]string{}). + On("GetEntities", "no-exists", map[string]any{}). Return(nil, gorm.ErrRecordNotFound) controller := controllers.NewEAVController( @@ -247,7 +247,7 @@ func TestGetAllWithErrorInDBReturnsError(t *testing.T) { eavService := mockServices.NewEAVService(t) eavService. - On("GetEntities", "no-exists", map[string]string{}). + On("GetEntities", "no-exists", map[string]any{}). Return(nil, errors.New("db error")) controller := controllers.NewEAVController( @@ -281,7 +281,7 @@ func TestGetAllWithoutParams(t *testing.T) { } eavService. - On("GetEntities", entityType.Name, map[string]string{}). + On("GetEntities", entityType.Name, map[string]any{}). Return([]*models.Entity{entity1, entity2}, nil) controller := controllers.NewEAVController( @@ -315,7 +315,7 @@ func TestGetAllWithParams(t *testing.T) { } eavService. - On("GetEntities", entityType.Name, map[string]string{"param1": "something"}). + On("GetEntities", entityType.Name, map[string]any{"param1": "something"}). Return([]*models.Entity{entity1}, nil) controller := controllers.NewEAVController( @@ -326,12 +326,9 @@ func TestGetAllWithParams(t *testing.T) { request := httptest.NewRequest( "GET", "/objects/exists/", - strings.NewReader(""), + strings.NewReader("{\"param1\": \"something\"}"), ) request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) - q := request.URL.Query() - q.Add("param1", "something") - request.URL.RawQuery = q.Encode() entitiesReturned, err := controller.GetObjects(response, request) assert.Nil(t, err) diff --git a/docker/test_api/docker-compose.yml b/docker/test_api/docker-compose.yml index 7d6605ae..bfdf91bd 100644 --- a/docker/test_api/docker-compose.yml +++ b/docker/test_api/docker-compose.yml @@ -14,5 +14,7 @@ services: ports: - "8000:8000" restart: always + environment: + BADAAS_SERVER_EXAMPLE: ${EXAMPLE} depends_on: - db diff --git a/examples/README.md b/examples/README.md index aa9f0c65..a3311bd9 100644 --- a/examples/README.md +++ b/examples/README.md @@ -78,7 +78,7 @@ Date: Thu, 05 Jan 2023 11:53:35 GMT ] ``` -Let's get all the posts posted by this user: `http localhost:8000/objects/post/?ownerID=wowASuperCoolUserID` +Let's get all the posts posted by this user: `http GET localhost:8000/objects/post ownerID=wowASuperCoolUserID` ```json HTTP/1.1 200 OK @@ -89,8 +89,8 @@ Date: Fri, 06 Jan 2023 08:20:33 GMT [ { "attrs": { - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\tIn consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi.\n\tIn erat mi, pharetra ut lacinia at, facilisis vitae nunc.\n\t", - "ownerID": "wowasupercooluserID", + "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\n\t\tIn consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi.\n\n\t\tIn erat mi, pharetra ut lacinia at, facilisis vitae nunc.\n\t", + "ownerID": "wowASuperCoolUserID", "title": "Why cats like mice ?" }, "createdAt": "2023-01-06T09:18:53.313565+01:00", diff --git a/mocks/services/EAVService.go b/mocks/services/EAVService.go index 38b0d714..55589188 100644 --- a/mocks/services/EAVService.go +++ b/mocks/services/EAVService.go @@ -6,7 +6,7 @@ import ( models "github.com/ditrit/badaas/persistence/models" mock "github.com/stretchr/testify/mock" - "github.com/google/uuid" + uuid "github.com/google/uuid" ) // EAVService is an autogenerated mock type for the EAVService type @@ -55,15 +55,15 @@ func (_m *EAVService) DeleteEntity(entityTypeName string, entityID uuid.UUID) er } // GetEntities provides a mock function with given fields: entityTypeName, conditions -func (_m *EAVService) GetEntities(entityTypeName string, conditions map[string]string) ([]*models.Entity, error) { +func (_m *EAVService) GetEntities(entityTypeName string, conditions map[string]interface{}) ([]*models.Entity, error) { ret := _m.Called(entityTypeName, conditions) var r0 []*models.Entity var r1 error - if rf, ok := ret.Get(0).(func(string, map[string]string) ([]*models.Entity, error)); ok { + if rf, ok := ret.Get(0).(func(string, map[string]interface{}) ([]*models.Entity, error)); ok { return rf(entityTypeName, conditions) } - if rf, ok := ret.Get(0).(func(string, map[string]string) []*models.Entity); ok { + if rf, ok := ret.Get(0).(func(string, map[string]interface{}) []*models.Entity); ok { r0 = rf(entityTypeName, conditions) } else { if ret.Get(0) != nil { @@ -71,7 +71,7 @@ func (_m *EAVService) GetEntities(entityTypeName string, conditions map[string]s } } - if rf, ok := ret.Get(1).(func(string, map[string]string) error); ok { + if rf, ok := ret.Get(1).(func(string, map[string]interface{}) error); ok { r1 = rf(entityTypeName, conditions) } else { r1 = ret.Error(1) diff --git a/mocks/services/sessionservice/SessionService.go b/mocks/services/sessionservice/SessionService.go index cd232637..101cfba9 100644 --- a/mocks/services/sessionservice/SessionService.go +++ b/mocks/services/sessionservice/SessionService.go @@ -12,7 +12,7 @@ import ( sessionservice "github.com/ditrit/badaas/services/sessionservice" - "github.com/google/uuid" + uuid "github.com/google/uuid" ) // SessionService is an autogenerated mock type for the SessionService type diff --git a/services/eav.go b/services/eav.go index de564619..0efb695d 100644 --- a/services/eav.go +++ b/services/eav.go @@ -19,7 +19,7 @@ var ( // EAV service provide handle EAV objects type EAVService interface { GetEntity(entityTypeName string, id uuid.UUID) (*models.Entity, error) - GetEntities(entityTypeName string, conditions map[string]string) ([]*models.Entity, error) + GetEntities(entityTypeName string, conditions map[string]any) ([]*models.Entity, error) CreateEntity(entityTypeName string, attributeValues map[string]any) (*models.Entity, error) UpdateEntity(entityTypeName string, entityID uuid.UUID, newValues map[string]any) (*models.Entity, error) DeleteEntity(entityTypeName string, entityID uuid.UUID) error @@ -56,7 +56,7 @@ func (eavService *eavServiceImpl) GetEntity(entityTypeName string, id uuid.UUID) // // "conditions" are in {"attributeName": expectedValue} format // TODO relations join -func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions map[string]string) ([]*models.Entity, error) { +func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions map[string]any) ([]*models.Entity, error) { return ExecWithTransaction( eavService.db, func(tx *gorm.DB) ([]*models.Entity, error) { @@ -92,9 +92,9 @@ func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions } // Adds to the "query" the verification that the value for "attribute" is "expectedValue" -func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attribute *models.Attribute, expectedValue string) *gorm.DB { +func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attribute *models.Attribute, expectedValue any) *gorm.DB { var valToUseInQuery = string(attribute.ValueType) + "_val" - if expectedValue == "null" { // TODO should be changed to be able to use nil + if expectedValue == nil { valToUseInQuery = "is_null" expectedValue = "true" } diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 797c0e0a..7e2778c1 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -251,21 +251,10 @@ func (t *TestContext) queryWithObjectID(entityType string) error { } func (t *TestContext) queryObjectsWithParameters(entityType string, jsonTable *godog.Table) error { - jsonMap, err := buildMapFromTable(jsonTable) - if err != nil { - return err - } - - jsonMapString := map[string]string{} - for k, v := range jsonMap { - jsonMapString[k] = v.(string) - } - - err = t.request( + err := t.requestWithJson( "/objects/"+entityType, http.MethodGet, - jsonMapString, - nil, + jsonTable, ) if err != nil { return err diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index f291ecfe..745e6791 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -101,12 +101,12 @@ func (ts *EAVServiceIntTestSuite) TestGetEntityWorksIfEntityTypeMatch() { // ------------------------- GetEntities -------------------------------- func (ts *EAVServiceIntTestSuite) TestGetEntitiesOfNotExistentTypeReturnsError() { - _, err := ts.eavService.GetEntities("not-exists", map[string]string{}) + _, err := ts.eavService.GetEntities("not-exists", map[string]any{}) ts.ErrorIs(err, gorm.ErrRecordNotFound) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.eavService.GetEntities(ts.profileType.Name, map[string]string{}) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, map[string]any{}) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{}, entities) @@ -115,7 +115,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIf func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { profile := ts.createProfile(ts.profileType, "profile") - entities, err := ts.eavService.GetEntities(ts.profileType.Name, make(map[string]string)) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, make(map[string]any)) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{profile}, entities) @@ -126,14 +126,14 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheList profile2 := ts.createProfile(ts.profileType, "profile2") profile3 := ts.createProfile(ts.profileType, "profile3") - entities, err := ts.eavService.GetEntities(ts.profileType.Name, make(map[string]string)) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, make(map[string]any)) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{profile1, profile2, profile3}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { - params := map[string]string{ + params := map[string]any{ "displayName": "not_created", } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) @@ -145,7 +145,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNot func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { ts.createProfile(ts.profileType, "profile") - params := map[string]string{ + params := map[string]any{ "displayName": "not_match", } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) @@ -158,7 +158,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyO matchProfile := ts.createProfile(ts.profileType, "match") ts.createProfile(ts.profileType, "something_else") - params := map[string]string{ + params := map[string]any{ "displayName": "match", } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) @@ -172,7 +172,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIf match2 := ts.createProfile(ts.profileType, "match") ts.createProfile(ts.profileType, "something_else") - params := map[string]string{ + params := map[string]any{ "displayName": "match", } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) @@ -186,7 +186,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistRe match2 := ts.createProfile(ts.profileType, "match") match3 := ts.createProfile(ts.profileType, "match") - params := map[string]string{ + params := map[string]any{ "not_exists": "not_exists", } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) @@ -222,7 +222,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { }) ts.Nil(err) - params := map[string]string{ + params := map[string]any{ "int": "1", } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) @@ -258,7 +258,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeThatIsNot }) ts.Nil(err) - params := map[string]string{ + params := map[string]any{ "int": "not_an_int", } _, err = ts.eavService.GetEntities(ts.profileType.Name, params) @@ -292,7 +292,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { }) ts.Nil(err) - params := map[string]string{ + params := map[string]any{ "float": "1.1", } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) @@ -328,7 +328,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { }) ts.Nil(err) - params := map[string]string{ + params := map[string]any{ "bool": "true", } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) @@ -373,7 +373,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { }) ts.Nil(err) - params := map[string]string{ + params := map[string]any{ "relation": otherEntity1.ID.String(), } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) @@ -393,8 +393,8 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionFilterByNull() { }) ts.Nil(err) - params := map[string]string{ - "displayName": "null", + params := map[string]any{ + "displayName": nil, } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) ts.Nil(err) From f3ddd73de3b2da93ff23d498e04da7aa8f0a69b5 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 26 Apr 2023 14:30:09 +0200 Subject: [PATCH 104/467] GetEntities add filter by multiple properties --- services/eav.go | 65 ++++++++++---- test_e2e/features/object_storage.feature | 27 +++++- test_integration/eavservice.go | 106 ++++++++++++++++++++--- 3 files changed, 165 insertions(+), 33 deletions(-) diff --git a/services/eav.go b/services/eav.go index 0efb695d..19ff6171 100644 --- a/services/eav.go +++ b/services/eav.go @@ -71,7 +71,10 @@ func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions for _, attribute := range entityType.Attributes { expectedValue, isPresent := conditions[attribute.Name] if isPresent { - query = eavService.addValueCheckToQuery(query, attribute, expectedValue) + query, err = eavService.addValueCheckToQuery(query, attribute.Name, expectedValue) + if err != nil { + return nil, err + } } } @@ -92,25 +95,51 @@ func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions } // Adds to the "query" the verification that the value for "attribute" is "expectedValue" -func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attribute *models.Attribute, expectedValue any) *gorm.DB { - var valToUseInQuery = string(attribute.ValueType) + "_val" - if expectedValue == nil { - valToUseInQuery = "is_null" - expectedValue = "true" +func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attributeName string, expectedValue any) (*gorm.DB, error) { + stringQuery := fmt.Sprintf( + `JOIN attributes attributes_%[1]s ON + attributes_%[1]s.entity_type_id = entities.entity_type_id + AND attributes_%[1]s.name = ? + JOIN values values_%[1]s ON + values_%[1]s.attribute_id = attributes_%[1]s.id + AND values_%[1]s.entity_id = entities.id + `, + attributeName, + ) + switch expectedValueTyped := expectedValue.(type) { + case float64: + stringQuery += fmt.Sprintf( + "AND ((%s) OR (%s))", + getQueryCheckValueOfType(attributeName, models.IntValueType), + getQueryCheckValueOfType(attributeName, models.FloatValueType), + ) + case bool: + stringQuery += "AND " + getQueryCheckValueOfType(attributeName, models.BooleanValueType) + case string: + _, err := uuid.Parse(expectedValueTyped) + if err == nil { + stringQuery += "AND " + getQueryCheckValueOfType(attributeName, models.RelationValueType) + } else { + stringQuery += "AND " + getQueryCheckValueOfType(attributeName, models.StringValueType) + } + case nil: + stringQuery += fmt.Sprintf( + "AND values_%s.is_null = true", + attributeName, + ) + default: + return nil, fmt.Errorf("unsupported type") } - return query.Joins( - fmt.Sprintf( - `JOIN attributes ON - attributes.entity_type_id = entities.entity_type_id - AND attributes.name = ? - JOIN values ON - values.attribute_id = attributes.id - AND values.entity_id = entities.id - AND values.%s = ?`, - valToUseInQuery, - ), - attribute.Name, expectedValue, + query = query.Joins(stringQuery, attributeName, expectedValue, expectedValue) + + return query, nil +} + +func getQueryCheckValueOfType(attributeName string, valueType models.ValueTypeT) string { + return fmt.Sprintf( + "attributes_%[1]s.value_type = '%[2]s' AND values_%[1]s.%[2]s_val = ?", + attributeName, string(valueType), ) } diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature index 473b5dc3..e23d4de9 100644 --- a/test_e2e/features/object_storage.feature +++ b/test_e2e/features/object_storage.feature @@ -39,7 +39,7 @@ Feature: Saving and querying objects in the database using the EAV Model | displayName | Pierre Martin | string | | yearOfBirth | 2001 | float | - Scenario: Created objects can be queried with parameters + Scenario: Created objects can be queried by a property Given a "profile" object exists with properties | key | value | type | | displayName | Jean Dupont | string | @@ -49,8 +49,31 @@ Feature: Saving and querying objects in the database using the EAV Model | displayName | Pierre Martin | string | | yearOfBirth | 2001 | integer | When I query all "profile" objects with parameters + | key | value | type | + | yearOfBirth | 2001 | integer | + Then there are "1" "profile" objects + And there is a "profile" object with properties | key | value | type | - | yearOfBirth | 2001 | string | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | float | + + Scenario: Created objects can be queried by multiple properties + Given a "profile" object exists with properties + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + And a "profile" object exists with properties + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | integer | + And a "profile" object exists with properties + | key | value | type | + | displayName | Gabriel Bernard | string | + | yearOfBirth | 2001 | integer | + When I query all "profile" objects with parameters + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | integer | Then there are "1" "profile" objects And there is a "profile" object with properties | key | value | type | diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 745e6791..53c659c1 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -223,7 +223,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { ts.Nil(err) params := map[string]any{ - "int": "1", + "int": 1.0, } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) ts.Nil(err) @@ -231,7 +231,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeThatIsNotAnIntReturnsError() { +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeReturnsEmptyList() { intAttr := &models.Attribute{ EntityTypeID: ts.profileType.ID, Name: "int", @@ -246,23 +246,18 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeThatIsNot err := ts.db.Save(&ts.profileType).Error ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "match", - "int": 1, - }) - ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ "displayName": "not_match", - "int": 2, + "int": 1, }) ts.Nil(err) params := map[string]any{ "int": "not_an_int", } - _, err = ts.eavService.GetEntities(ts.profileType.Name, params) - ts.NotNil(err) + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) + ts.Len(entities, 0) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { @@ -293,7 +288,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { ts.Nil(err) params := map[string]any{ - "float": "1.1", + "float": 1.1, } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) ts.Nil(err) @@ -329,7 +324,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { ts.Nil(err) params := map[string]any{ - "bool": "true", + "bool": true, } entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) ts.Nil(err) @@ -402,6 +397,91 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionFilterByNull() { EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsReturnsOneIfOnlyOneMatch() { + match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ + "displayName": "match", + "description": "match_description", + }) + ts.Nil(err) + + _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ + "displayName": "not_match", + "description": "not_match", + }) + ts.Nil(err) + + params := map[string]any{ + "displayName": "match", + "description": "match_description", + } + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { + intAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "int", + ValueType: models.IntValueType, + Required: false, + } + + boolAttr := &models.Attribute{ + EntityTypeID: ts.profileType.ID, + Name: "bool", + ValueType: models.BooleanValueType, + Required: false, + } + + ts.profileType.Attributes = append(ts.profileType.Attributes, + intAttr, + boolAttr, + ) + + err := ts.db.Save(&ts.profileType).Error + ts.Nil(err) + + match1, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ + "displayName": "match", + "int": 1, + "bool": true, + }) + ts.Nil(err) + + match2, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ + "displayName": "match", + "int": 1, + "bool": true, + }) + ts.Nil(err) + + _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ + "displayName": "not_match", + "int": 1, + "bool": true, + }) + ts.Nil(err) + + _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ + "displayName": "match", + "int": 2, + "bool": true, + }) + ts.Nil(err) + + params := map[string]any{ + "displayName": "match", + "int": 1.0, + "bool": true, + } + entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match1, match2}, entities) +} + // ------------------------- CreateEntity -------------------------------- func (ts *EAVServiceIntTestSuite) TestCreateMultipleEntitiesDoesNotGenerateGormBug() { From ae652467f108fe6cd775b3333331d31004e5307c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 27 Apr 2023 10:03:30 +0200 Subject: [PATCH 105/467] GetEntities add joins + refactor int tests --- services/eav.go | 92 ++- test_e2e/badaas_e2e_test.go | 29 +- test_e2e/features/object_storage.feature | 59 +- test_e2e/http_support_test.go | 62 +- test_integration/eavservice.go | 969 +++++++++-------------- 5 files changed, 566 insertions(+), 645 deletions(-) diff --git a/services/eav.go b/services/eav.go index 19ff6171..28027261 100644 --- a/services/eav.go +++ b/services/eav.go @@ -52,10 +52,8 @@ func (eavService *eavServiceImpl) GetEntity(entityTypeName string, id uuid.UUID) } // Get entities of type with name "entityTypeName" that match all "conditions" -// entries in "conditions" that do not correspond to any attribute of "entityTypeName" are ignored // // "conditions" are in {"attributeName": expectedValue} format -// TODO relations join func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions map[string]any) ([]*models.Entity, error) { return ExecWithTransaction( eavService.db, @@ -68,25 +66,22 @@ func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions query := tx.Select("entities.*") // only entities that match the conditions - for _, attribute := range entityType.Attributes { - expectedValue, isPresent := conditions[attribute.Name] - if isPresent { - query, err = eavService.addValueCheckToQuery(query, attribute.Name, expectedValue) - if err != nil { - return nil, err - } + for attributeName, expectedValue := range conditions { + err = eavService.addValueCheckToQuery(query, attributeName, expectedValue, "") + if err != nil { + return nil, err } } // only entities of type entityType - query = query.Where( + query.Where( "entities.entity_type_id = ?", entityType.ID, ) // execute query var entities []*models.Entity - query = query.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType") + query.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType") err = query.Find(&entities).Error return entities, err @@ -95,54 +90,87 @@ func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions } // Adds to the "query" the verification that the value for "attribute" is "expectedValue" -func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attributeName string, expectedValue any) (*gorm.DB, error) { +func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attributeName string, expectedValue any, entitiesTableSuffix string) error { + attributesSuffix := entitiesTableSuffix + "_" + attributeName stringQuery := fmt.Sprintf( - `JOIN attributes attributes_%[1]s ON - attributes_%[1]s.entity_type_id = entities.entity_type_id - AND attributes_%[1]s.name = ? - JOIN values values_%[1]s ON - values_%[1]s.attribute_id = attributes_%[1]s.id - AND values_%[1]s.entity_id = entities.id + `JOIN attributes attributes%[1]s ON + attributes%[1]s.entity_type_id = entities%[2]s.entity_type_id + AND attributes%[1]s.name = ? + JOIN values values%[1]s ON + values%[1]s.attribute_id = attributes%[1]s.id + AND values%[1]s.entity_id = entities%[2]s.id `, - attributeName, + attributesSuffix, + entitiesTableSuffix, ) switch expectedValueTyped := expectedValue.(type) { case float64: stringQuery += fmt.Sprintf( "AND ((%s) OR (%s))", - getQueryCheckValueOfType(attributeName, models.IntValueType), - getQueryCheckValueOfType(attributeName, models.FloatValueType), + getQueryCheckValueOfType(attributesSuffix, models.IntValueType), + getQueryCheckValueOfType(attributesSuffix, models.FloatValueType), ) case bool: - stringQuery += "AND " + getQueryCheckValueOfType(attributeName, models.BooleanValueType) + stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.BooleanValueType) case string: _, err := uuid.Parse(expectedValueTyped) if err == nil { - stringQuery += "AND " + getQueryCheckValueOfType(attributeName, models.RelationValueType) + stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.RelationValueType) } else { - stringQuery += "AND " + getQueryCheckValueOfType(attributeName, models.StringValueType) + stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.StringValueType) } case nil: stringQuery += fmt.Sprintf( - "AND values_%s.is_null = true", - attributeName, + "AND values%s.is_null = true", + attributesSuffix, + ) + case map[string]any: + return eavService.addJoinToQuery( + query, attributeName, expectedValueTyped, + attributesSuffix, stringQuery, ) default: - return nil, fmt.Errorf("unsupported type") + return fmt.Errorf("unsupported type") } - query = query.Joins(stringQuery, attributeName, expectedValue, expectedValue) + query.Joins(stringQuery, attributeName, expectedValue, expectedValue) - return query, nil + return nil } -func getQueryCheckValueOfType(attributeName string, valueType models.ValueTypeT) string { +func getQueryCheckValueOfType(attributesSuffix string, valueType models.ValueTypeT) string { return fmt.Sprintf( - "attributes_%[1]s.value_type = '%[2]s' AND values_%[1]s.%[2]s_val = ?", - attributeName, string(valueType), + "attributes%[1]s.value_type = '%[2]s' AND values%[1]s.%[2]s_val = ?", + attributesSuffix, string(valueType), ) } +func (eavService *eavServiceImpl) addJoinToQuery( + query *gorm.DB, attributeName string, expectedValues map[string]any, + attributesSuffix, stringQuery string, +) error { + stringQuery += fmt.Sprintf(` + AND attributes%[1]s.value_type = 'relation' + JOIN entities entities%[1]s ON + entities%[1]s.id = values%[1]s.relation_val + AND entities%[1]s.deleted_at IS NULL + `, + attributesSuffix, + ) + + query.Joins(stringQuery, attributeName) + + var err error + for joinEntityAttribute, joinEntityValue := range expectedValues { + err = eavService.addValueCheckToQuery(query, joinEntityAttribute, joinEntityValue, attributesSuffix) + if err != nil { + return err + } + } + + return nil +} + // Creates a Entity of type "entityType" and its Values from the information provided in "attributeValues" // not specified values are set with the default value (if exists) or a null value. // entries in "attributeValues" that do not correspond to any attribute of "entityType" are ignored diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index d5533743..ffdb22e0 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -93,6 +93,24 @@ func InitializeScenario(ctx *godog.ScenarioContext) { log.Fatalln(err) } + userType := &models.EntityType{ + Name: "user", + } + nameAttr := &models.Attribute{ + EntityTypeID: userType.ID, + Name: "name", + ValueType: models.StringValueType, + Required: false, + } + userType.Attributes = append(userType.Attributes, + nameAttr, + ) + + err = db.Create(&userType).Error + if err != nil { + log.Fatalln(err) + } + profileType := &models.EntityType{ Name: "profile", } @@ -108,9 +126,11 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ValueType: models.IntValueType, Required: false, } + userAttr := models.NewRelationAttribute(profileType, "userID", false, false, userType) profileType.Attributes = append(profileType.Attributes, displayNameAttr, yearOfBirthAttr, + userAttr, ) err = db.Create(&profileType).Error @@ -125,12 +145,13 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^status code is "(\d+)"$`, t.assertStatusCode) ctx.Step(`^response field "(.+)" is "(.+)"$`, t.assertResponseFieldIsEquals) ctx.Step(`^I request "(.+)" with method "(.+)" with json$`, t.requestWithJson) - ctx.Step(`^a "(.+)" object exists with properties$`, t.objectExists) + ctx.Step(`^a "(.+)" object exists with attributes$`, t.objectExists) ctx.Step(`^I query a "(.+)" with the object id$`, t.queryWithObjectID) ctx.Step(`^I query all "(.+)" objects$`, t.queryAllObjects) ctx.Step(`^there are "(\d+)" "(.+)" objects$`, t.thereAreObjects) - ctx.Step(`^there is a "(.+)" object with properties$`, t.thereIsObjectWithProperties) - ctx.Step(`^I query all "(.+)" objects with parameters$`, t.queryObjectsWithParameters) + ctx.Step(`^there is a "(.+)" object with attributes$`, t.thereIsObjectWithAttributes) + ctx.Step(`^I query all "(.+)" objects with conditions$`, t.queryObjectsWithConditions) ctx.Step(`^I delete a "(.+)" with the object id$`, t.deleteWithObjectID) - ctx.Step(`^I modify a "(.+)" with properties$`, t.modifyWithProperties) + ctx.Step(`^I modify a "(.+)" with attributes$`, t.modifyWithAttributes) + ctx.Step(`^a "(.+)" object exists with property "(.+)" related to last object and properties$`, t.objectExistsWithRelation) } diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature index e23d4de9..fac0de2c 100644 --- a/test_e2e/features/object_storage.feature +++ b/test_e2e/features/object_storage.feature @@ -10,7 +10,7 @@ Feature: Saving and querying objects in the database using the EAV Model And response field "attrs.yearOfBirth" is "1997" Scenario: Created object can be queried individually - Given a "profile" object exists with properties + Given a "profile" object exists with attributes | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | @@ -20,68 +20,93 @@ Feature: Saving and querying objects in the database using the EAV Model And response field "attrs.yearOfBirth" is "1997" Scenario: Created objects can be queried together - Given a "profile" object exists with properties + Given a "profile" object exists with attributes | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | - And a "profile" object exists with properties + And a "profile" object exists with attributes | key | value | type | | displayName | Pierre Martin | string | | yearOfBirth | 2001 | integer | When I query all "profile" objects Then there are "2" "profile" objects - And there is a "profile" object with properties + And there is a "profile" object with attributes | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | float | - And there is a "profile" object with properties + And there is a "profile" object with attributes | key | value | type | | displayName | Pierre Martin | string | | yearOfBirth | 2001 | float | Scenario: Created objects can be queried by a property - Given a "profile" object exists with properties + Given a "profile" object exists with attributes | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | - And a "profile" object exists with properties + And a "profile" object exists with attributes | key | value | type | | displayName | Pierre Martin | string | | yearOfBirth | 2001 | integer | - When I query all "profile" objects with parameters + When I query all "profile" objects with conditions | key | value | type | | yearOfBirth | 2001 | integer | Then there are "1" "profile" objects - And there is a "profile" object with properties + And there is a "profile" object with attributes | key | value | type | | displayName | Pierre Martin | string | | yearOfBirth | 2001 | float | Scenario: Created objects can be queried by multiple properties - Given a "profile" object exists with properties + Given a "profile" object exists with attributes | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | - And a "profile" object exists with properties + And a "profile" object exists with attributes | key | value | type | | displayName | Pierre Martin | string | | yearOfBirth | 2001 | integer | - And a "profile" object exists with properties + And a "profile" object exists with attributes | key | value | type | | displayName | Gabriel Bernard | string | | yearOfBirth | 2001 | integer | - When I query all "profile" objects with parameters + When I query all "profile" objects with conditions | key | value | type | | displayName | Pierre Martin | string | | yearOfBirth | 2001 | integer | Then there are "1" "profile" objects - And there is a "profile" object with properties + And there is a "profile" object with attributes | key | value | type | | displayName | Pierre Martin | string | | yearOfBirth | 2001 | float | + Scenario: Created objects can be queried doing joins + Given a "user" object exists with attributes + | key | value | type | + | name | user1 | string | + And a "profile" object exists with property "userID" related to last object and properties + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + And a "user" object exists with attributes + | key | value | type | + | name | user2 | string | + And a "profile" object exists with property "userID" related to last object and properties + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | integer | + When I query all "profile" objects with conditions + | key | value | type | + | displayName | Jean Dupont | string | + | userID | {"name": "user1"} | json | + Then there are "1" "profile" objects + And there is a "profile" object with attributes + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | float | + Scenario: Created objects can be deleted - Given a "profile" object exists with properties + Given a "profile" object exists with attributes | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | @@ -90,11 +115,11 @@ Feature: Saving and querying objects in the database using the EAV Model Then there are "0" "profile" objects Scenario: Created objects can be modified - Given a "profile" object exists with properties + Given a "profile" object exists with attributes | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | - When I modify a "profile" with properties + When I modify a "profile" with attributes | key | value | type | | yearOfBirth | 1998 | integer | And I query a "profile" with the object id diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 7e2778c1..cd1711c1 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -6,11 +6,11 @@ import ( "io" "log" "net/http" - "reflect" "strconv" "strings" "github.com/cucumber/godog" + "github.com/cucumber/messages-go/v16" "github.com/elliotchance/pie/v2" ) @@ -154,6 +154,13 @@ func buildMapFromTable(table *godog.Table) (map[string]any, error) { return nil, fmt.Errorf("can't parse %q as float for key %q", valueAsString, key) } data[key] = floatingNumber + case jsonValueType: + jsonMap := map[string]string{} + err := json.Unmarshal([]byte(valueAsString), &jsonMap) + if err != nil { + return nil, fmt.Errorf("can't parse %q as json for key %q", valueAsString, key) + } + data[key] = jsonMap case nullValueType: data[key] = nil default: @@ -186,6 +193,7 @@ const ( integerValueType = "integer" floatValueType = "float" nullValueType = "null" + jsonValueType = "json" ) // check if the method is allowed and sanitize the string @@ -229,6 +237,28 @@ func (t *TestContext) objectExists(entityType string, jsonTable *godog.Table) er return nil } +func (t *TestContext) objectExistsWithRelation(entityType string, relationAttribute string, jsonTable *godog.Table) error { + id, present := t.json.(map[string]any)["id"] + if !present { + panic("object id not available") + } + + jsonTable.Rows = append(jsonTable.Rows, &messages.PickleTableRow{ + Cells: []*messages.PickleTableCell{ + { + Value: relationAttribute, + }, + { + Value: id.(string), + }, + { + Value: stringValueType, + }, + }, + }) + return t.objectExists(entityType, jsonTable) +} + func (t *TestContext) queryWithObjectID(entityType string) error { id, present := t.json.(map[string]any)["id"] if !present { @@ -250,7 +280,7 @@ func (t *TestContext) queryWithObjectID(entityType string) error { return nil } -func (t *TestContext) queryObjectsWithParameters(entityType string, jsonTable *godog.Table) error { +func (t *TestContext) queryObjectsWithConditions(entityType string, jsonTable *godog.Table) error { err := t.requestWithJson( "/objects/"+entityType, http.MethodGet, @@ -293,21 +323,33 @@ func (t *TestContext) thereAreObjects(expectedAmount int, entityType string) err return nil } -func (t *TestContext) thereIsObjectWithProperties(entityType string, jsonTable *godog.Table) error { - listJson := t.json.([]any) - properties, err := buildMapFromTable(jsonTable) +func (t *TestContext) thereIsObjectWithAttributes(expectedEntityType string, jsonTable *godog.Table) error { + objectList := t.json.([]any) + expectedValues, err := buildMapFromTable(jsonTable) if err != nil { log.Fatalln(err) } - for _, object := range listJson { + for _, object := range objectList { objectMap := object.(map[string]any) - if objectMap["type"] == entityType && reflect.DeepEqual(objectMap["attrs"], properties) { - return nil + objectAttrs := objectMap["attrs"].(map[string]any) + + if objectMap["type"] == expectedEntityType { + allEqual := true + for attributeName, expectedValue := range expectedValues { + actualValue, isPresent := objectAttrs[attributeName] + if !isPresent || actualValue != expectedValue { + allEqual = false + } + } + + if allEqual { + return nil + } } } - return fmt.Errorf("object with properties %v not found in %v", properties, listJson) + return fmt.Errorf("object with attributes %v not found in %v", expectedValues, objectList) } func (t *TestContext) deleteWithObjectID(entityType string) error { @@ -334,7 +376,7 @@ func (t *TestContext) deleteWithObjectID(entityType string) error { return nil } -func (t *TestContext) modifyWithProperties(entityType string, jsonTable *godog.Table) error { +func (t *TestContext) modifyWithAttributes(entityType string, jsonTable *godog.Table) error { id, present := t.json.(map[string]any)["id"] if !present { panic("object id not available") diff --git a/test_integration/eavservice.go b/test_integration/eavservice.go index 53c659c1..8d15f146 100644 --- a/test_integration/eavservice.go +++ b/test_integration/eavservice.go @@ -6,6 +6,7 @@ import ( "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services" + "github.com/ditrit/badaas/utils" "github.com/elliotchance/pie/v2" "github.com/google/uuid" "github.com/stretchr/testify/suite" @@ -19,9 +20,8 @@ type EAVServiceIntTestSuite struct { db *gorm.DB eavService services.EAVService entityRepository *repository.EntityRepository - profileType *models.EntityType - displayNameAttr *models.Attribute - descriptionAttr *models.Attribute + entityType1 *models.EntityType + entityType2 *models.EntityType } func NewEAVServiceIntTestSuite( @@ -41,59 +41,27 @@ func NewEAVServiceIntTestSuite( func (ts *EAVServiceIntTestSuite) SetupTest() { CleanDB(ts.db) - // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES - ts.profileType = &models.EntityType{ - Name: "profile", - } - ts.displayNameAttr = &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "displayName", - ValueType: models.StringValueType, - Required: false, - } - ts.descriptionAttr = &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "description", - ValueType: models.StringValueType, - Required: false, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - ts.displayNameAttr, - ts.descriptionAttr, - ) - - err := ts.db.Create(&ts.profileType).Error - ts.Nil(err) + ts.entityType1 = ts.createEntityType("entityType1", nil) + ts.entityType2 = ts.createEntityType("entityType2", ts.entityType1) } // ------------------------- GetEntity -------------------------------- func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityDoesNotExist() { - _, err := ts.eavService.GetEntity(ts.profileType.Name, uuid.New()) + _, err := ts.eavService.GetEntity(ts.entityType1.Name, uuid.New()) ts.ErrorContains(err, "record not found") } func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityTypeDoesNotMatch() { - otherEntityType := &models.EntityType{ - Name: "other", - } - - err := ts.db.Create(otherEntityType).Error - ts.Nil(err) - - otherEntity1, err := ts.eavService.CreateEntity(otherEntityType.Name, map[string]any{}) - ts.Nil(err) - - _, err = ts.eavService.GetEntity(ts.profileType.Name, otherEntity1.ID) + otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{}) + _, err := ts.eavService.GetEntity(ts.entityType2.Name, otherEntity1.ID) ts.ErrorContains(err, "record not found") } func (ts *EAVServiceIntTestSuite) TestGetEntityWorksIfEntityTypeMatch() { - entity1, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) - ts.Nil(err) + entity1 := ts.createEntity(ts.entityType2, map[string]any{}) - entityReturned, err := ts.eavService.GetEntity(ts.profileType.Name, entity1.ID) + entityReturned, err := ts.eavService.GetEntity(ts.entityType2.Name, entity1.ID) ts.Nil(err) EqualEntity(&ts.Suite, entity1, entityReturned) } @@ -106,400 +74,431 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesOfNotExistentTypeReturnsError() } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.eavService.GetEntities(ts.profileType.Name, map[string]any{}) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, map[string]any{}) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { - profile := ts.createProfile(ts.profileType, "profile") + match := ts.createEntity(ts.entityType2, map[string]any{}) - entities, err := ts.eavService.GetEntities(ts.profileType.Name, make(map[string]any)) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, make(map[string]any)) ts.Nil(err) - EqualEntityList(&ts.Suite, []*models.Entity{profile}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { - profile1 := ts.createProfile(ts.profileType, "profile1") - profile2 := ts.createProfile(ts.profileType, "profile2") - profile3 := ts.createProfile(ts.profileType, "profile3") + match1 := ts.createEntity(ts.entityType2, map[string]any{}) + match2 := ts.createEntity(ts.entityType2, map[string]any{}) + match3 := ts.createEntity(ts.entityType2, map[string]any{}) - entities, err := ts.eavService.GetEntities(ts.profileType.Name, make(map[string]any)) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, make(map[string]any)) ts.Nil(err) - EqualEntityList(&ts.Suite, []*models.Entity{profile1, profile2, profile3}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match1, match2, match3}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { params := map[string]any{ - "displayName": "not_created", + "string": "not_created", } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { - ts.createProfile(ts.profileType, "profile") + ts.createEntity(ts.entityType2, map[string]any{ + "string": "something_else", + }) params := map[string]any{ - "displayName": "not_match", + "string": "not_match", } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { - matchProfile := ts.createProfile(ts.profileType, "match") - ts.createProfile(ts.profileType, "something_else") + match := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + ts.createEntity(ts.entityType2, map[string]any{ + "string": "something_else", + }) params := map[string]any{ - "displayName": "match", + "string": "match", } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) - EqualEntityList(&ts.Suite, []*models.Entity{matchProfile}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { - match1 := ts.createProfile(ts.profileType, "match") - match2 := ts.createProfile(ts.profileType, "match") - ts.createProfile(ts.profileType, "something_else") + match1 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + match2 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + ts.createEntity(ts.entityType2, map[string]any{ + "string": "something_else", + }) params := map[string]any{ - "displayName": "match", + "string": "match", } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match1, match2}, entities) } -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsAllEntities() { - match1 := ts.createProfile(ts.profileType, "match") - match2 := ts.createProfile(ts.profileType, "match") - match3 := ts.createProfile(ts.profileType, "match") +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsEmpty() { + ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) params := map[string]any{ "not_exists": "not_exists", } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) - EqualEntityList(&ts.Suite, []*models.Entity{match1, match2, match3}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { - intAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "int", - ValueType: models.IntValueType, - Required: false, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - intAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "match", - "int": 1, + match := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "int": 1, }) - ts.Nil(err) - - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "not_match", - "int": 2, + ts.createEntity(ts.entityType2, map[string]any{ + "string": "not_match", + "int": 2, }) - ts.Nil(err) params := map[string]any{ "int": 1.0, } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeReturnsEmptyList() { - intAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "int", - ValueType: models.IntValueType, - Required: false, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - intAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "not_match", - "int": 1, + ts.createEntity(ts.entityType2, map[string]any{ + "string": "not_match", + "int": 1, }) - ts.Nil(err) params := map[string]any{ "int": "not_an_int", } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) ts.Len(entities, 0) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { - floatAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "float", - ValueType: models.FloatValueType, - Required: false, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - floatAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "match", - "float": 1.1, + match := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "float": 1.1, }) - ts.Nil(err) - - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "not_match", - "float": 2.0, + ts.createEntity(ts.entityType2, map[string]any{ + "string": "not_match", + "float": 2.0, }) - ts.Nil(err) params := map[string]any{ "float": 1.1, } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { - boolAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "bool", - ValueType: models.BooleanValueType, - Required: false, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - boolAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "match", - "bool": true, + match := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "bool": true, }) - ts.Nil(err) - - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "not_match", - "bool": false, + ts.createEntity(ts.entityType2, map[string]any{ + "string": "not_match", + "bool": false, }) - ts.Nil(err) params := map[string]any{ "bool": true, } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { - otherEntityType := &models.EntityType{ - Name: "other", - } - - err := ts.db.Create(otherEntityType).Error - ts.Nil(err) + otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{}) + otherEntity2 := ts.createEntity(ts.entityType1, map[string]any{}) - otherEntity1, err := ts.eavService.CreateEntity(otherEntityType.Name, map[string]any{}) - ts.Nil(err) + match := ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity1.ID.String(), + }) + ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity2.ID.String(), + }) - otherEntity2, err := ts.eavService.CreateEntity(otherEntityType.Name, map[string]any{}) + params := map[string]any{ + "relation": otherEntity1.ID.String(), + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) - relationAttr := models.NewRelationAttribute( - ts.profileType, "relation", - false, false, otherEntityType, - ) + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} - ts.profileType.Attributes = append(ts.profileType.Attributes, - relationAttr, - ) +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionFilterByNull() { + match := ts.createEntity(ts.entityType2, map[string]any{ + "string": nil, + }) + ts.createEntity(ts.entityType2, map[string]any{ + "string": "something", + }) - err = ts.db.Save(&ts.profileType).Error + params := map[string]any{ + "string": nil, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) - match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "relation": otherEntity1.ID.String(), + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { + match1 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "int": 1, + "bool": true, + }) + match2 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "int": 1, + "bool": true, }) - ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "relation": otherEntity2.ID.String(), + ts.createEntity(ts.entityType2, map[string]any{ + "string": "not_match", + "int": 1, + "bool": true, + }) + ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "int": 2, + "bool": true, }) - ts.Nil(err) params := map[string]any{ - "relation": otherEntity1.ID.String(), + "string": "match", + "int": 1.0, + "bool": true, } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match1, match2}, entities) } -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionFilterByNull() { - match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": nil, +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoins() { + otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 1, + }) + otherEntity2 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 2, }) - ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "something", + match := ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity1.ID.String(), + }) + ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity2.ID.String(), }) - ts.Nil(err) params := map[string]any{ - "displayName": nil, + "relation": map[string]any{ + "int": 1.0, + }, } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsReturnsOneIfOnlyOneMatch() { - match, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "match", - "description": "match_description", +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { + otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 1, + "string": "match", + }) + otherEntity2 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 2, + "string": "match", }) - ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "not_match", - "description": "not_match", + match := ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity1.ID.String(), + }) + ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity2.ID.String(), }) - ts.Nil(err) params := map[string]any{ - "displayName": "match", - "description": "match_description", + "relation": map[string]any{ + "int": 1.0, + "string": "match", + }, } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { - intAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "int", - ValueType: models.IntValueType, - Required: false, - } +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { + entityType3 := ts.createEntityType("entityType3", nil) - boolAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "bool", - ValueType: models.BooleanValueType, - Required: false, - } + otherEntity11 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 1, + }) + otherEntity12 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 2, + }) - ts.profileType.Attributes = append(ts.profileType.Attributes, - intAttr, - boolAttr, + otherEntity31 := ts.createEntity(entityType3, map[string]any{ + "int": 3, + }) + otherEntity32 := ts.createEntity(entityType3, map[string]any{ + "int": 4, + }) + + relation3Attr := models.NewRelationAttribute( + ts.entityType2, "relation2", + false, false, entityType3, ) - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) + ts.addAttributeToEntityType(ts.entityType2, relation3Attr) - match1, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "match", - "int": 1, - "bool": true, + match := ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity11.ID.String(), + "relation2": otherEntity31.ID.String(), + }) + ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity12.ID.String(), + "relation2": otherEntity32.ID.String(), }) + + params := map[string]any{ + "relation": map[string]any{ + "int": 1.0, + }, + "relation2": map[string]any{ + "int": 3.0, + }, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) - match2, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "match", - "int": 1, - "bool": true, + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { + entityType3 := ts.createEntityType("entityType3", nil) + + ts.addAttributeToEntityType(ts.entityType1, models.NewRelationAttribute( + ts.entityType1, "relation", + false, false, entityType3, + )) + + otherEntity31 := ts.createEntity(entityType3, map[string]any{ + "int": 3, + }) + otherEntity32 := ts.createEntity(entityType3, map[string]any{ + "int": 4, }) - ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "not_match", - "int": 1, - "bool": true, + otherEntity11 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 1, + "relation": otherEntity31.ID.String(), + }) + otherEntity12 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 2, + "relation": otherEntity32.ID.String(), }) - ts.Nil(err) - _, err = ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "match", - "int": 2, - "bool": true, + match := ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity11.ID.String(), + }) + ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity12.ID.String(), }) - ts.Nil(err) params := map[string]any{ - "displayName": "match", - "int": 1.0, - "bool": true, + "relation": map[string]any{ + "int": 1.0, + "relation": map[string]any{ + "int": 3.0, + }, + }, } - entities, err := ts.eavService.GetEntities(ts.profileType.Name, params) + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) ts.Nil(err) - EqualEntityList(&ts.Suite, []*models.Entity{match1, match2}, entities) + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) } // ------------------------- CreateEntity -------------------------------- func (ts *EAVServiceIntTestSuite) TestCreateMultipleEntitiesDoesNotGenerateGormBug() { - initialDisplayNameID := ts.displayNameAttr.ID - initialDescriptionID := ts.descriptionAttr.ID + stringAttr := utils.FindFirst(ts.entityType1.Attributes, func(attr *models.Attribute) bool { + return attr.ValueType == models.StringValueType + }) + + initialDisplayNameID := (*stringAttr).ID + + stringAttr2 := &models.Attribute{ + Name: "string2", + ValueType: models.StringValueType, + } + ts.addAttributeToEntityType(ts.entityType1, stringAttr2) + + initialDescriptionID := stringAttr2.ID for i := 0; i < 10; i++ { params := map[string]any{ - "displayName": fmt.Sprintf("displayName%d", i), + "string": fmt.Sprintf("displayName%d", i), "description": fmt.Sprintf("description%d", i), } - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) + entity, err := ts.eavService.CreateEntity(ts.entityType1.Name, params) ts.Nil(err) for _, value := range entity.Fields { - if value.Attribute.Name == "displayName" { + if value.Attribute.Name == "string" { ts.Equal(initialDisplayNameID, value.AttributeID) - } else if value.Attribute.Name == "description" { + } else if value.Attribute.Name == "string2" { ts.Equal(initialDescriptionID, value.AttributeID) } } @@ -513,80 +512,48 @@ func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfEntityTypeDoesNotExist func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfTheTypeOfAValueIsUnsupported() { params := map[string]any{ - "displayName": []string{"salut", "bonjour"}, + "string": []string{"salut", "bonjour"}, } - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) + entity, err := ts.eavService.CreateEntity(ts.entityType1.Name, params) ts.Nil(entity) ts.ErrorContains(err, "unsupported type") } func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfUUIDCantBeParsed() { - otherType := &models.EntityType{ - Name: "other", - } - err := ts.db.Create(&otherType).Error - ts.Nil(err) - - relationAttr := models.NewRelationAttribute(ts.profileType, "relation", false, false, otherType) - ts.profileType.Attributes = append(ts.profileType.Attributes, - relationAttr, - ) - - err = ts.db.Save(&ts.profileType).Error - ts.Nil(err) - params := map[string]any{ - "displayName": "displayName", - "relation": "not-a-uuid", + "relation": "not-a-uuid", } - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) + entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, params) ts.Nil(entity) ts.ErrorIs(err, services.ErrCantParseUUID) } func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfRelationAttributePointsToNotExistentType() { - relationAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "relation", + ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ + Name: "relation2", ValueType: models.RelationValueType, RelationTargetEntityTypeID: uuid.New(), - } - ts.profileType.Attributes = append(ts.profileType.Attributes, - relationAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) + }) params := map[string]any{ - "displayName": "displayName", - "relation": uuid.New().String(), + "relation2": uuid.New().String(), } - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) + entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, params) ts.Nil(entity) ts.ErrorIs(err, gorm.ErrRecordNotFound) } func (ts *EAVServiceIntTestSuite) TestCreatesDefaultAttributes() { - intAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "int", - ValueType: models.IntValueType, - Required: false, - Default: true, - DefaultInt: 1, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - intAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) + ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ + Name: "default", + ValueType: models.IntValueType, + Default: true, + DefaultInt: 1, + }) - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) + entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, map[string]any{}) ts.Nil(err) - ts.Len(entity.Fields, 3) + ts.Len(entity.Fields, 6) notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { return !value.IsNull }) @@ -595,44 +562,23 @@ func (ts *EAVServiceIntTestSuite) TestCreatesDefaultAttributes() { } func (ts *EAVServiceIntTestSuite) TestCreatesWithoutRequiredValueRespondsError() { - requiredAttr := &models.Attribute{ + ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ Name: "required", Required: true, ValueType: models.StringValueType, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - requiredAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) + }) - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) + entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, map[string]any{}) ts.Nil(entity) ts.ErrorContains(err, "field required is missing and is required") } func (ts *EAVServiceIntTestSuite) TestCreatesIntAttributeEvenIfItIsInFloatFormat() { - intAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "int", - ValueType: models.IntValueType, - Required: false, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - intAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ + entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, map[string]any{ "int": 2.0, }) ts.Nil(err) - ts.Len(entity.Fields, 3) + ts.Len(entity.Fields, 5) notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { return !value.IsNull }) @@ -640,38 +586,39 @@ func (ts *EAVServiceIntTestSuite) TestCreatesIntAttributeEvenIfItIsInFloatFormat ts.Equal(2, notNull[0].Value()) } -// ------------------------- UpdateEntity -------------------------------- +// // ------------------------- UpdateEntity -------------------------------- func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGormBug() { - initialDisplayNameID := ts.displayNameAttr.ID - initialDescriptionID := ts.descriptionAttr.ID + stringAttr := utils.FindFirst(ts.entityType1.Attributes, func(attr *models.Attribute) bool { + return attr.ValueType == models.StringValueType + }) - params := map[string]any{ - "displayName": "displayName", - "description": "description", - } - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) - ts.Nil(err) + initialDisplayNameID := (*stringAttr).ID - params2 := map[string]any{ - "displayName": "other", - "description": "other", + stringAttr2 := &models.Attribute{ + Name: "string2", + ValueType: models.StringValueType, } - _, err = ts.eavService.CreateEntity(ts.profileType.Name, params2) - ts.Nil(err) + ts.addAttributeToEntityType(ts.entityType1, stringAttr2) + initialDescriptionID := stringAttr2.ID + + entity := ts.createEntity(ts.entityType1, map[string]any{ + "string": "displayName", + "string2": "description", + }) for i := 0; i < 10; i++ { params := map[string]any{ - "displayName": fmt.Sprintf("displayName%d", i), - "description": fmt.Sprintf("description%d", i), + "string": fmt.Sprintf("displayName%d", i), + "string2": fmt.Sprintf("description%d", i), } entity, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, params) ts.Nil(err) for _, value := range entity.Fields { - if value.Attribute.Name == "displayName" { + if value.Attribute.Name == "string" { ts.Equal(initialDisplayNameID, value.AttributeID) - } else if value.Attribute.Name == "description" { + } else if value.Attribute.Name == "string2" { ts.Equal(initialDescriptionID, value.AttributeID) } } @@ -679,73 +626,26 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGo } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfEntityDoesNotExist() { - _, err := ts.eavService.UpdateEntity(ts.profileType.Name, uuid.New(), map[string]any{}) + _, err := ts.eavService.UpdateEntity(ts.entityType1.Name, uuid.New(), map[string]any{}) ts.ErrorIs(err, gorm.ErrRecordNotFound) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityWorksForAllTheTypes() { - intAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "int", - ValueType: models.IntValueType, - Required: false, - } - - floatAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "float", - ValueType: models.FloatValueType, - Required: false, - } - - boolAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "bool", - ValueType: models.BooleanValueType, - Required: false, - } - - otherEntityType := &models.EntityType{ - Name: "other", - } - - err := ts.db.Create(otherEntityType).Error - ts.Nil(err) - - otherEntity1, err := ts.eavService.CreateEntity(otherEntityType.Name, map[string]any{}) - ts.Nil(err) - - relationAttr := models.NewRelationAttribute( - ts.profileType, "relation", - false, false, otherEntityType, - ) - - ts.profileType.Attributes = append(ts.profileType.Attributes, - intAttr, - floatAttr, - boolAttr, - relationAttr, - ) - - err = ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - params := map[string]any{ - "displayName": "displayName", - } - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, params) - ts.Nil(err) + otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{}) + entity := ts.createEntity(ts.entityType2, map[string]any{ + "string": "displayName", + }) paramsUpdate := map[string]any{ - "displayName": nil, - "int": 1, - "float": 1.0, - "bool": true, - "relation": otherEntity1.ID.String(), + "string": nil, + "int": 1, + "float": 1.1, + "bool": true, + "relation": otherEntity1.ID.String(), } - entity, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + entity, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.Nil(err) - ts.Len(entity.Fields, 6) + ts.Len(entity.Fields, 5) notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { return !value.IsNull }) @@ -754,189 +654,81 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityWorksForAllTheTypes() { return v.Value() }) ts.Contains(values, 1) - ts.Contains(values, 1.0) + ts.Contains(values, 1.1) ts.Contains(values, true) ts.Contains(values, otherEntity1.ID) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForIntType() { - intAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "int", - ValueType: models.IntValueType, - Required: false, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - intAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) - ts.Nil(err) + entity := ts.createEntity(ts.entityType2, map[string]any{}) paramsUpdate := map[string]any{ "int": "1", } - _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, models.ErrAskingForWrongType) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForFloatType() { - floatAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "float", - ValueType: models.FloatValueType, - Required: false, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - floatAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) - ts.Nil(err) + entity := ts.createEntity(ts.entityType2, map[string]any{}) paramsUpdate := map[string]any{ "float": "1", } - _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, models.ErrAskingForWrongType) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForBoolType() { - boolAttr := &models.Attribute{ - EntityTypeID: ts.profileType.ID, - Name: "bool", - ValueType: models.BooleanValueType, - Required: false, - } - - ts.profileType.Attributes = append(ts.profileType.Attributes, - boolAttr, - ) - - err := ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) - ts.Nil(err) + entity := ts.createEntity(ts.entityType2, map[string]any{}) paramsUpdate := map[string]any{ "bool": "1", } - _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, models.ErrAskingForWrongType) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfIntForStringType() { - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) - ts.Nil(err) + entity := ts.createEntity(ts.entityType2, map[string]any{}) paramsUpdate := map[string]any{ - "displayName": 1, + "string": 1, } - _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, models.ErrAskingForWrongType) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDCantBeParsedForRelationType() { - otherEntityType := &models.EntityType{ - Name: "other", - } - - err := ts.db.Create(otherEntityType).Error - ts.Nil(err) - - relationAttr := models.NewRelationAttribute( - ts.profileType, "relation", - false, false, otherEntityType, - ) - - ts.profileType.Attributes = append(ts.profileType.Attributes, - relationAttr, - ) - - err = ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) - ts.Nil(err) + entity := ts.createEntity(ts.entityType2, map[string]any{}) paramsUpdate := map[string]any{ "relation": "not-uuid", } - _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, services.ErrCantParseUUID) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotExists() { - otherEntityType := &models.EntityType{ - Name: "other", - } - - err := ts.db.Create(otherEntityType).Error - ts.Nil(err) - - relationAttr := models.NewRelationAttribute( - ts.profileType, "relation", - false, false, otherEntityType, - ) - - ts.profileType.Attributes = append(ts.profileType.Attributes, - relationAttr, - ) - - err = ts.db.Save(&ts.profileType).Error - ts.Nil(err) - - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) - ts.Nil(err) + entity := ts.createEntity(ts.entityType2, map[string]any{}) paramsUpdate := map[string]any{ "relation": uuid.New().String(), } - _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, gorm.ErrRecordNotFound) } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotCorrespondsToTheRelationEntityType() { - otherEntityType := &models.EntityType{ - Name: "other", - } - otherEntityType2 := &models.EntityType{ Name: "other2", } - err := ts.db.Create(otherEntityType).Error - ts.Nil(err) - - err = ts.db.Create(otherEntityType2).Error - ts.Nil(err) - - relationAttr := models.NewRelationAttribute( - ts.profileType, "relation", - false, false, otherEntityType, - ) - - ts.profileType.Attributes = append(ts.profileType.Attributes, - relationAttr, - ) - - err = ts.db.Save(&ts.profileType).Error + err := ts.db.Create(otherEntityType2).Error ts.Nil(err) - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) - ts.Nil(err) - - entityOther2, err := ts.eavService.CreateEntity(otherEntityType2.Name, map[string]any{}) - ts.Nil(err) + entity := ts.createEntity(ts.entityType2, map[string]any{}) + entityOther2 := ts.createEntity(otherEntityType2, map[string]any{}) paramsUpdate := map[string]any{ "relation": entityOther2.ID.String(), @@ -946,17 +738,16 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotCorre } func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFails() { - entity, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{}) - ts.Nil(err) + entity := ts.createEntity(ts.entityType2, map[string]any{}) paramsUpdate := map[string]any{ - "displayName": "something", - "description": 1, + "string": "something", + "int": "1", } - _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, models.ErrAskingForWrongType) - entityReturned, err := ts.eavService.GetEntity(ts.profileType.Name, entity.ID) + entityReturned, err := ts.eavService.GetEntity(ts.entityType2.Name, entity.ID) ts.Nil(err) notNull := pie.Filter(entityReturned.Fields, func(value *models.Value) bool { return !value.IsNull @@ -964,55 +755,33 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFail ts.Len(notNull, 0) } -// ------------------------- GetEntityTypeByName ------------------------- - -// func (ts *EAVServiceIntTestSuite) TestGetEntityTypeReturnsErrorIfItDoesNotExist() { -// _, err := ts.eavService.getEntityTypeByName("not_exists") -// ts.ErrorContains(err, "EntityType named \"not_exists\" not found") -// } - -// func (ts *EAVServiceIntTestSuite) TestGetEntityTypeWorksIfItExists() { -// ett, err := ts.eavService.getEntityTypeByName("profile") -// ts.Nil(err) -// assert.DeepEqual(ts.T(), ts.profileType, ett) -// } - // ------------------------- DeleteEntity ------------------------- func (ts *EAVServiceIntTestSuite) TestDeleteEntityReturnsErrorIfEntityDoesNotExist() { - err := ts.eavService.DeleteEntity(ts.profileType.Name, uuid.New()) + err := ts.eavService.DeleteEntity(ts.entityType2.Name, uuid.New()) ts.ErrorIs(err, gorm.ErrRecordNotFound) } func (ts *EAVServiceIntTestSuite) TestDeleteEntityReturnsErrorIfEntityTypeDoesNotMatch() { - otherEntityType := &models.EntityType{ - Name: "other", - } - - err := ts.db.Create(otherEntityType).Error - ts.Nil(err) - - profile1, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "displayName", + entity1 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "displayName", }) - ts.Nil(err) - err = ts.eavService.DeleteEntity(otherEntityType.Name, profile1.ID) + err := ts.eavService.DeleteEntity(ts.entityType1.Name, entity1.ID) ts.ErrorIs(err, gorm.ErrRecordNotFound) var values []models.Value err = ts.db.Find(&values).Error ts.Nil(err) - ts.Len(values, 2) + ts.Len(values, 5) } func (ts *EAVServiceIntTestSuite) TestDeleteWorks() { - profile1, err := ts.eavService.CreateEntity(ts.profileType.Name, map[string]any{ - "displayName": "displayName", + entity1 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "displayName", }) - ts.Nil(err) - err = ts.eavService.DeleteEntity(profile1.EntityType.Name, profile1.ID) + err := ts.eavService.DeleteEntity(entity1.EntityType.Name, entity1.ID) ts.Nil(err) var profiles []models.Entity @@ -1028,21 +797,57 @@ func (ts *EAVServiceIntTestSuite) TestDeleteWorks() { // ------------------------- utils ------------------------- -func (ts *EAVServiceIntTestSuite) createProfile(entityType *models.EntityType, displayName string) *models.Entity { - entity := &models.Entity{ - EntityTypeID: entityType.ID, - EntityType: entityType, +func (ts *EAVServiceIntTestSuite) createEntityType(name string, relationEntityType *models.EntityType) *models.EntityType { + entityType := &models.EntityType{ + Name: name, } - displayNameVal, _ := models.NewStringValue(ts.displayNameAttr, displayName) - descriptionVal, _ := models.NewStringValue(ts.descriptionAttr, "something in description") + entityType.Attributes = []*models.Attribute{ + { + EntityTypeID: entityType.ID, + Name: "int", + ValueType: models.IntValueType, + }, + { + EntityTypeID: entityType.ID, + Name: "string", + ValueType: models.StringValueType, + }, + { + EntityTypeID: entityType.ID, + Name: "bool", + ValueType: models.BooleanValueType, + }, + { + EntityTypeID: entityType.ID, + Name: "float", + ValueType: models.FloatValueType, + }, + } - entity.Fields = append(entity.Fields, - displayNameVal, - descriptionVal, - ) + if relationEntityType != nil { + entityType.Attributes = append(entityType.Attributes, models.NewRelationAttribute( + entityType, "relation", + false, false, relationEntityType, + )) + } + + err := ts.db.Create(&entityType).Error + ts.Nil(err) + + return entityType +} + +func (ts *EAVServiceIntTestSuite) addAttributeToEntityType(entityType *models.EntityType, attribute *models.Attribute) { + attribute.EntityTypeID = entityType.ID + entityType.Attributes = append(entityType.Attributes, attribute) + + err := ts.db.Save(&entityType).Error + ts.Nil(err) +} - err := ts.entityRepository.Create(ts.db, entity) +func (ts *EAVServiceIntTestSuite) createEntity(entityType *models.EntityType, values map[string]any) *models.Entity { + entity, err := ts.eavService.CreateEntity(entityType.Name, values) ts.Nil(err) return entity From 5c0bf9b6f16af8bccfd5d5b2f022dee72945b0d6 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 27 Apr 2023 10:21:06 +0200 Subject: [PATCH 106/467] move functions that manage queries to entityRepository --- persistence/repository/EntityRepository.go | 94 ++++++++++++++++++++++ services/eav.go | 89 ++------------------ 2 files changed, 99 insertions(+), 84 deletions(-) diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index f93d0498..40cc5cf0 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -1,6 +1,7 @@ package repository import ( + "fmt" "time" sq "github.com/Masterminds/squirrel" @@ -87,3 +88,96 @@ func (r *EntityRepository) Create(tx *gorm.DB, entity *models.Entity) error { entity.ID = uuid return nil } + +// Adds to the "query" the verification that the value for "attribute" is "expectedValue" +func (r *EntityRepository) AddValueCheckToQuery(query *gorm.DB, attributeName string, expectedValue any) error { + return r.addValueCheckToQueryInternal(query, attributeName, expectedValue, "") +} + +// Adds to the "query" the verification that the value for "attribute" is "expectedValue" +func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attributeName string, expectedValue any, entitiesTableSuffix string) error { + attributesSuffix := entitiesTableSuffix + "_" + attributeName + stringQuery := fmt.Sprintf( + `JOIN attributes attributes%[1]s ON + attributes%[1]s.entity_type_id = entities%[2]s.entity_type_id + AND attributes%[1]s.name = ? + JOIN values values%[1]s ON + values%[1]s.attribute_id = attributes%[1]s.id + AND values%[1]s.entity_id = entities%[2]s.id + `, + attributesSuffix, + entitiesTableSuffix, + ) + switch expectedValueTyped := expectedValue.(type) { + case float64: + stringQuery += fmt.Sprintf( + "AND ((%s) OR (%s))", + getQueryCheckValueOfType(attributesSuffix, models.IntValueType), + getQueryCheckValueOfType(attributesSuffix, models.FloatValueType), + ) + case bool: + stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.BooleanValueType) + case string: + _, err := uuid.Parse(expectedValueTyped) + if err == nil { + stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.RelationValueType) + } else { + stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.StringValueType) + } + case nil: + stringQuery += fmt.Sprintf( + "AND values%s.is_null = true", + attributesSuffix, + ) + case map[string]any: + return r.addJoinToQuery( + query, attributeName, expectedValueTyped, + attributesSuffix, stringQuery, + ) + default: + return fmt.Errorf("unsupported type") + } + + query.Joins(stringQuery, attributeName, expectedValue, expectedValue) + + return nil +} + +// Returns query string to check that the attribute is of type "valueType" and that the related value +// is the expected one +func getQueryCheckValueOfType(attributesSuffix string, valueType models.ValueTypeT) string { + return fmt.Sprintf( + "attributes%[1]s.value_type = '%[2]s' AND values%[1]s.%[2]s_val = ?", + attributesSuffix, string(valueType), + ) +} + +// Adds a join to the "query" by the "attributeName" that must be relation type +// then, adds the verification that the values for the joined entity are "expectedValues" + +// "expectedValues" is in {"attributeName": expectedValue} format +func (r *EntityRepository) addJoinToQuery( + query *gorm.DB, attributeName string, expectedValues map[string]any, + attributesSuffix, stringQuery string, +) error { + stringQuery += fmt.Sprintf(` + AND attributes%[1]s.value_type = 'relation' + JOIN entities entities%[1]s ON + entities%[1]s.id = values%[1]s.relation_val + AND entities%[1]s.deleted_at IS NULL + `, + attributesSuffix, + ) + + query.Joins(stringQuery, attributeName) + + var err error + for joinEntityAttribute, joinEntityValue := range expectedValues { + err = r.addValueCheckToQueryInternal(query, joinEntityAttribute, joinEntityValue, attributesSuffix) + if err != nil { + return err + } + } + + return nil +} diff --git a/services/eav.go b/services/eav.go index 28027261..47551bbf 100644 --- a/services/eav.go +++ b/services/eav.go @@ -53,7 +53,10 @@ func (eavService *eavServiceImpl) GetEntity(entityTypeName string, id uuid.UUID) // Get entities of type with name "entityTypeName" that match all "conditions" // -// "conditions" are in {"attributeName": expectedValue} format +// "conditions" is in {"attributeName": expectedValue} format +// in case of join "conditions" can have the format: +// +// {"relationAttributeName": {"attributeName": expectedValue}} func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions map[string]any) ([]*models.Entity, error) { return ExecWithTransaction( eavService.db, @@ -67,7 +70,7 @@ func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions // only entities that match the conditions for attributeName, expectedValue := range conditions { - err = eavService.addValueCheckToQuery(query, attributeName, expectedValue, "") + err = eavService.entityRepository.AddValueCheckToQuery(query, attributeName, expectedValue) if err != nil { return nil, err } @@ -89,88 +92,6 @@ func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions ) } -// Adds to the "query" the verification that the value for "attribute" is "expectedValue" -func (eavService *eavServiceImpl) addValueCheckToQuery(query *gorm.DB, attributeName string, expectedValue any, entitiesTableSuffix string) error { - attributesSuffix := entitiesTableSuffix + "_" + attributeName - stringQuery := fmt.Sprintf( - `JOIN attributes attributes%[1]s ON - attributes%[1]s.entity_type_id = entities%[2]s.entity_type_id - AND attributes%[1]s.name = ? - JOIN values values%[1]s ON - values%[1]s.attribute_id = attributes%[1]s.id - AND values%[1]s.entity_id = entities%[2]s.id - `, - attributesSuffix, - entitiesTableSuffix, - ) - switch expectedValueTyped := expectedValue.(type) { - case float64: - stringQuery += fmt.Sprintf( - "AND ((%s) OR (%s))", - getQueryCheckValueOfType(attributesSuffix, models.IntValueType), - getQueryCheckValueOfType(attributesSuffix, models.FloatValueType), - ) - case bool: - stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.BooleanValueType) - case string: - _, err := uuid.Parse(expectedValueTyped) - if err == nil { - stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.RelationValueType) - } else { - stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.StringValueType) - } - case nil: - stringQuery += fmt.Sprintf( - "AND values%s.is_null = true", - attributesSuffix, - ) - case map[string]any: - return eavService.addJoinToQuery( - query, attributeName, expectedValueTyped, - attributesSuffix, stringQuery, - ) - default: - return fmt.Errorf("unsupported type") - } - - query.Joins(stringQuery, attributeName, expectedValue, expectedValue) - - return nil -} - -func getQueryCheckValueOfType(attributesSuffix string, valueType models.ValueTypeT) string { - return fmt.Sprintf( - "attributes%[1]s.value_type = '%[2]s' AND values%[1]s.%[2]s_val = ?", - attributesSuffix, string(valueType), - ) -} - -func (eavService *eavServiceImpl) addJoinToQuery( - query *gorm.DB, attributeName string, expectedValues map[string]any, - attributesSuffix, stringQuery string, -) error { - stringQuery += fmt.Sprintf(` - AND attributes%[1]s.value_type = 'relation' - JOIN entities entities%[1]s ON - entities%[1]s.id = values%[1]s.relation_val - AND entities%[1]s.deleted_at IS NULL - `, - attributesSuffix, - ) - - query.Joins(stringQuery, attributeName) - - var err error - for joinEntityAttribute, joinEntityValue := range expectedValues { - err = eavService.addValueCheckToQuery(query, joinEntityAttribute, joinEntityValue, attributesSuffix) - if err != nil { - return err - } - } - - return nil -} - // Creates a Entity of type "entityType" and its Values from the information provided in "attributeValues" // not specified values are set with the default value (if exists) or a null value. // entries in "attributeValues" that do not correspond to any attribute of "entityType" are ignored From 589db201008caaf3cdba48170738e6bbcd29cb34 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 27 Apr 2023 10:55:08 +0200 Subject: [PATCH 107/467] remove incorrect body close --- router/middlewares/middlewareJson.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/router/middlewares/middlewareJson.go b/router/middlewares/middlewareJson.go index d4eaaf9d..1abe0343 100644 --- a/router/middlewares/middlewareJson.go +++ b/router/middlewares/middlewareJson.go @@ -30,8 +30,6 @@ func NewJSONController(logger *zap.Logger) JSONController { // Marshall the response from the JSONHandler and handle HTTPError if needed func (controller *jsonControllerImpl) Wrap(handler JSONHandler) func(response http.ResponseWriter, request *http.Request) { return func(response http.ResponseWriter, request *http.Request) { - defer request.Body.Close() - object, herr := handler(response, request) if herr != nil { herr.Write(response, controller.logger) From df6903bc740104278fc8c12a928f3ac44adf8e31 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 27 Apr 2023 11:34:09 +0200 Subject: [PATCH 108/467] add go-sec and fix the problems --- .github/workflows/CI.yml | 45 +++++++++++++++++--------- commands/initDatabaseCommands.go | 44 +++++++++++++++++++------ commands/initInitialisationCommands.go | 10 ++++-- commands/initLoggerCommands.go | 13 ++++++-- commands/initServerCommands.go | 26 +++++++++++---- commands/initSessionCommands.go | 19 ++++++++--- commands/rootCmd.go | 33 ++++++++++++++----- commands/server.go | 2 +- router/middlewares/middlewareJson.go | 6 +++- services/sessionservice/session.go | 3 +- test_integration/integration_test.go | 5 ++- 11 files changed, 153 insertions(+), 53 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index c4f2f6a9..341f1ccf 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -5,6 +5,8 @@ on: - main pull_request: types: [opened, synchronize, reopened] + branches: + - master jobs: branch-naming-rules: name: Check branch name @@ -18,8 +20,8 @@ jobs: min_length: 5 max_length: 50 - unit-tests: - name: Unit tests + check-style: + name: Code style needs: [branch-naming-rules] runs-on: ubuntu-latest steps: @@ -30,15 +32,29 @@ jobs: with: go-version: '^1.18' cache: true - - name: Run test - run: make test_unit_and_cover - - uses: actions/upload-artifact@v3 + - name: golangci-lint + uses: golangci/golangci-lint-action@v3 with: - name: coverage_unit - path: coverage_unit.out + version: latest + skip-cache: true + skip-pkg-cache: true + skip-build-cache: true - check-style: - name: Code style + go-sec: + runs-on: ubuntu-latest + env: + GO111MODULE: on + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Run Gosec Security Scanner + uses: securego/gosec@master + with: + args: ./... + + unit-tests: + name: Unit tests needs: [branch-naming-rules] runs-on: ubuntu-latest steps: @@ -49,13 +65,12 @@ jobs: with: go-version: '^1.18' cache: true - - name: golangci-lint - uses: golangci/golangci-lint-action@v3 + - name: Run test + run: make test_unit_and_cover + - uses: actions/upload-artifact@v3 with: - version: latest - skip-cache: true - skip-pkg-cache: true - skip-build-cache: true + name: coverage_unit + path: coverage_unit.out integration-tests: name: Integration tests diff --git a/commands/initDatabaseCommands.go b/commands/initDatabaseCommands.go index 022cfb98..e47f3b9e 100644 --- a/commands/initDatabaseCommands.go +++ b/commands/initDatabaseCommands.go @@ -5,28 +5,54 @@ import ( "github.com/ditrit/verdeter" ) -func initDatabaseCommands(cfg *verdeter.VerdeterCommand) { - cfg.GKey(configuration.DatabasePortKey, verdeter.IsInt, "", "The port of the database server") +func initDatabaseCommands(cfg *verdeter.VerdeterCommand) error { + err := cfg.GKey(configuration.DatabasePortKey, verdeter.IsInt, "", "The port of the database server") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabasePortKey) - cfg.GKey(configuration.DatabaseHostKey, verdeter.IsStr, "", "The host of the database server") + err = cfg.GKey(configuration.DatabaseHostKey, verdeter.IsStr, "", "The host of the database server") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabaseHostKey) - cfg.GKey(configuration.DatabaseNameKey, verdeter.IsStr, "", "The name of the database to use") + err = cfg.GKey(configuration.DatabaseNameKey, verdeter.IsStr, "", "The name of the database to use") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabaseNameKey) - cfg.GKey(configuration.DatabaseUsernameKey, verdeter.IsStr, "", "The username of the account on the database server") + err = cfg.GKey(configuration.DatabaseUsernameKey, verdeter.IsStr, "", "The username of the account on the database server") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabaseUsernameKey) - cfg.GKey(configuration.DatabasePasswordKey, verdeter.IsStr, "", "The password of the account one the database server") + err = cfg.GKey(configuration.DatabasePasswordKey, verdeter.IsStr, "", "The password of the account one the database server") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabasePasswordKey) - cfg.GKey(configuration.DatabaseSslmodeKey, verdeter.IsStr, "", "The sslmode to use when connecting to the database server") + err = cfg.GKey(configuration.DatabaseSslmodeKey, verdeter.IsStr, "", "The sslmode to use when connecting to the database server") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabaseSslmodeKey) - cfg.GKey(configuration.DatabaseRetryKey, verdeter.IsUint, "", "The number of times badaas tries to establish a connection with the database") + err = cfg.GKey(configuration.DatabaseRetryKey, verdeter.IsUint, "", "The number of times badaas tries to establish a connection with the database") + if err != nil { + return err + } cfg.SetDefault(configuration.DatabaseRetryKey, uint(10)) - cfg.GKey(configuration.DatabaseRetryDurationKey, verdeter.IsUint, "", "The duration in seconds badaas wait between connection attempts") + err = cfg.GKey(configuration.DatabaseRetryDurationKey, verdeter.IsUint, "", "The duration in seconds badaas wait between connection attempts") + if err != nil { + return err + } cfg.SetDefault(configuration.DatabaseRetryDurationKey, uint(5)) + + return nil } diff --git a/commands/initInitialisationCommands.go b/commands/initInitialisationCommands.go index 130e9778..81f54fc5 100644 --- a/commands/initInitialisationCommands.go +++ b/commands/initInitialisationCommands.go @@ -5,9 +5,13 @@ import ( "github.com/ditrit/verdeter" ) -func initInitialisationCommands(cfg *verdeter.VerdeterCommand) { - - cfg.GKey(configuration.InitializationDefaultAdminPasswordKey, verdeter.IsStr, "", +func initInitialisationCommands(cfg *verdeter.VerdeterCommand) error { + err := cfg.GKey(configuration.InitializationDefaultAdminPasswordKey, verdeter.IsStr, "", "Set the default admin password is the admin user is not created yet.") + if err != nil { + return err + } cfg.SetDefault(configuration.InitializationDefaultAdminPasswordKey, "admin") + + return nil } diff --git a/commands/initLoggerCommands.go b/commands/initLoggerCommands.go index 097ac1d3..d5bc7d26 100644 --- a/commands/initLoggerCommands.go +++ b/commands/initLoggerCommands.go @@ -6,11 +6,18 @@ import ( "github.com/ditrit/verdeter/validators" ) -func initLoggerCommands(cfg *verdeter.VerdeterCommand) { - cfg.GKey(configuration.LoggerModeKey, verdeter.IsStr, "", "The logger mode (default to \"prod\")") +func initLoggerCommands(cfg *verdeter.VerdeterCommand) error { + err := cfg.GKey(configuration.LoggerModeKey, verdeter.IsStr, "", "The logger mode (default to \"prod\")") + if err != nil { + return err + } cfg.SetDefault(configuration.LoggerModeKey, "prod") cfg.AddValidator(configuration.LoggerModeKey, validators.AuthorizedValues("prod", "dev")) - cfg.GKey(configuration.LoggerRequestTemplateKey, verdeter.IsStr, "", "Template message for all request logs") + err = cfg.GKey(configuration.LoggerRequestTemplateKey, verdeter.IsStr, "", "Template message for all request logs") + if err != nil { + return err + } cfg.SetDefault(configuration.LoggerRequestTemplateKey, "Receive {{method}} request on {{url}}") + return nil } diff --git a/commands/initServerCommands.go b/commands/initServerCommands.go index ebfe0ef8..8c40229e 100644 --- a/commands/initServerCommands.go +++ b/commands/initServerCommands.go @@ -6,20 +6,34 @@ import ( "github.com/ditrit/verdeter/validators" ) -func initServerCommands(cfg *verdeter.VerdeterCommand) { - cfg.GKey(configuration.ServerTimeoutKey, verdeter.IsInt, "", "Maximum timeout of the http server in second (default is 15s)") +func initServerCommands(cfg *verdeter.VerdeterCommand) error { + err := cfg.GKey(configuration.ServerTimeoutKey, verdeter.IsInt, "", "Maximum timeout of the http server in second (default is 15s)") + if err != nil { + return err + } cfg.SetDefault(configuration.ServerTimeoutKey, 15) - cfg.GKey(configuration.ServerHostKey, verdeter.IsStr, "", "Address to bind (default is 0.0.0.0)") + err = cfg.GKey(configuration.ServerHostKey, verdeter.IsStr, "", "Address to bind (default is 0.0.0.0)") cfg.SetDefault(configuration.ServerHostKey, "0.0.0.0") - cfg.GKey(configuration.ServerPortKey, verdeter.IsInt, "p", "Port to bind (default is 8000)") + err = cfg.GKey(configuration.ServerPortKey, verdeter.IsInt, "p", "Port to bind (default is 8000)") + if err != nil { + return err + } cfg.AddValidator(configuration.ServerPortKey, validators.CheckTCPHighPort) cfg.SetDefault(configuration.ServerPortKey, 8000) - cfg.GKey(configuration.ServerPaginationMaxElemPerPage, verdeter.IsUint, "", "The max number of records returned per page") + err = cfg.GKey(configuration.ServerPaginationMaxElemPerPage, verdeter.IsUint, "", "The max number of records returned per page") + if err != nil { + return err + } cfg.SetDefault(configuration.ServerPaginationMaxElemPerPage, 100) - cfg.GKey(configuration.ServerExampleKey, verdeter.IsStr, "", "Example server to exec (birds | posts)") + err = cfg.GKey(configuration.ServerExampleKey, verdeter.IsStr, "", "Example server to exec (birds | posts)") + if err != nil { + return err + } cfg.SetDefault(configuration.ServerExampleKey, "") + + return nil } diff --git a/commands/initSessionCommands.go b/commands/initSessionCommands.go index 13f4ad74..c550ef1b 100644 --- a/commands/initSessionCommands.go +++ b/commands/initSessionCommands.go @@ -6,14 +6,25 @@ import ( ) // initialize session related config keys -func initSessionCommands(cfg *verdeter.VerdeterCommand) { - cfg.LKey(configuration.SessionDurationKey, verdeter.IsUint, "", "The duration of a user session in seconds.") +func initSessionCommands(cfg *verdeter.VerdeterCommand) error { + err := cfg.LKey(configuration.SessionDurationKey, verdeter.IsUint, "", "The duration of a user session in seconds.") + if err != nil { + return err + } cfg.SetDefault(configuration.SessionDurationKey, uint(3600*4)) // 4 hours by default - cfg.LKey(configuration.SessionPullIntervalKey, + err = cfg.LKey(configuration.SessionPullIntervalKey, verdeter.IsUint, "", "The refresh interval in seconds. Badaas refresh it's internal session cache periodically.") + if err != nil { + return err + } cfg.SetDefault(configuration.SessionPullIntervalKey, uint(30)) // 30 seconds by default - cfg.LKey(configuration.SessionRollIntervalKey, verdeter.IsUint, "", "The interval in which the user can renew it's session by making a request.") + err = cfg.LKey(configuration.SessionRollIntervalKey, verdeter.IsUint, "", "The interval in which the user can renew it's session by making a request.") + if err != nil { + return err + } cfg.SetDefault(configuration.SessionRollIntervalKey, uint(3600)) // 1 hour by default + + return nil } diff --git a/commands/rootCmd.go b/commands/rootCmd.go index 70dfbb21..0fcf138c 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -55,18 +55,35 @@ var rootCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ // Execute adds all child commands to the root command and sets flags appropriately. // This is called by main.main(). It only needs to happen once to the rootCmd. func Execute() { - InitCommands(rootCfg) + err := InitCommands(rootCfg) + if err != nil { + panic(err) + } rootCfg.Execute() } -func InitCommands(config *verdeter.VerdeterCommand) { - config.GKey("config_path", verdeter.IsStr, "", "Path to the config file/directory") +func InitCommands(config *verdeter.VerdeterCommand) error { + if err := config.GKey("config_path", verdeter.IsStr, "", "Path to the config file/directory"); err != nil { + return err + } config.SetDefault("config_path", ".") - initServerCommands(config) - initLoggerCommands(config) - initDatabaseCommands(config) - initInitialisationCommands(config) - initSessionCommands(config) + if err := initServerCommands(config); err != nil { + return err + } + if err := initLoggerCommands(config); err != nil { + return err + } + if err := initDatabaseCommands(config); err != nil { + return err + } + if err := initInitialisationCommands(config); err != nil { + return err + } + if err := initSessionCommands(config); err != nil { + return err + } + + return nil } diff --git a/commands/server.go b/commands/server.go index 1d023b42..bf244100 100644 --- a/commands/server.go +++ b/commands/server.go @@ -63,7 +63,7 @@ func NewHTTPServer( }, OnStop: func(ctx context.Context) error { // Flush the logger - logger.Sync() + _ = logger.Sync() return srv.Shutdown(ctx) }, }) diff --git a/router/middlewares/middlewareJson.go b/router/middlewares/middlewareJson.go index 1abe0343..b60760f5 100644 --- a/router/middlewares/middlewareJson.go +++ b/router/middlewares/middlewareJson.go @@ -48,6 +48,10 @@ func (controller *jsonControllerImpl) Wrap(handler JSONHandler) func(response ht return } response.Header().Set("Content-Type", "application/json") - response.Write(payload) + _, err = response.Write(payload) + controller.logger.Error( + "Error while writing http response", + zap.String("error", err.Error()), + ) } } diff --git a/services/sessionservice/session.go b/services/sessionservice/session.go index b87f73cb..9c41818f 100644 --- a/services/sessionservice/session.go +++ b/services/sessionservice/session.go @@ -110,7 +110,7 @@ func (sessionService *sessionServiceImpl) add(session *models.Session) httperror } // Initialize the session service -func (sessionService *sessionServiceImpl) init() error { +func (sessionService *sessionServiceImpl) init() { sessionService.cache = make(map[uuid.UUID]*models.Session) go func() { for { @@ -121,7 +121,6 @@ func (sessionService *sessionServiceImpl) init() error { ) } }() - return nil } // Get all sessions and save them in cache diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index a37cf27b..08900db3 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -34,7 +34,10 @@ func TestAll(t *testing.T) { _, b, _, _ := runtime.Caller(0) basePath := filepath.Dir(b) viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) - commands.InitCommands(testsCfg) + err := commands.InitCommands(testsCfg) + if err != nil { + panic(err) + } tGlobal = t From 00020994b941a478d2d250652a84937e5d3625a3 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 27 Apr 2023 16:57:19 +0200 Subject: [PATCH 109/467] GetEntities add unit tests for query creation --- go.mod | 1 + go.sum | 2 + .../repository/EntityRepository_test.go | 352 ++++++++++++++++++ 3 files changed, 355 insertions(+) create mode 100644 persistence/repository/EntityRepository_test.go diff --git a/go.mod b/go.mod index 0ee7fcec..53b995b6 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( ) require ( + github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect github.com/cucumber/messages-go/v16 v16.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect diff --git a/go.sum b/go.sum index 022bd4c9..43e55dcb 100644 --- a/go.sum +++ b/go.sum @@ -39,6 +39,8 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc= diff --git a/persistence/repository/EntityRepository_test.go b/persistence/repository/EntityRepository_test.go new file mode 100644 index 00000000..543b84c2 --- /dev/null +++ b/persistence/repository/EntityRepository_test.go @@ -0,0 +1,352 @@ +package repository + +import ( + "database/sql" + "regexp" + "testing" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/ditrit/badaas/persistence/models" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "gorm.io/driver/postgres" + "gorm.io/gorm" +) + +type EntityRepositorySuite struct { + suite.Suite + DB *gorm.DB + mock sqlmock.Sqlmock + + repository EntityRepository + query *gorm.DB + uuid uuid.UUID +} + +func (s *EntityRepositorySuite) SetupSuite() { + s.repository = EntityRepository{} +} + +func (s *EntityRepositorySuite) SetupTest() { + var ( + db *sql.DB + err error + ) + + db, s.mock, err = sqlmock.New() + require.NoError(s.T(), err) + + dialector := postgres.New(postgres.Config{ + DSN: "sqlmock_db_0", + DriverName: "postgres", + Conn: db, + PreferSimpleProtocol: true, + }) + s.DB, err = gorm.Open(dialector, &gorm.Config{}) + require.NoError(s.T(), err) + + s.query = s.DB.Select("entities.*") + s.uuid = uuid.New() +} + +func Test(t *testing.T) { + suite.Run(t, new(EntityRepositorySuite)) +} + +type AttributeNameAndValue struct { + AttributeName string + AttributeValue any +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForString() { + attributeName := "attrName" + attributeValue := "a string" + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + attributes_attrName.value_type = 'string' AND + values_attrName.string_val = $2 + WHERE entities.entity_type_id = $3 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, attributeValue, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForStringUUID() { + attributeName := "attrName" + attributeValue := uuid.New().String() + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + attributes_attrName.value_type = 'relation' AND + values_attrName.relation_val = $2 + WHERE entities.entity_type_id = $3 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, attributeValue, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForBool() { + attributeName := "attrName" + attributeValue := true + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + attributes_attrName.value_type = 'bool' AND + values_attrName.bool_val = $2 + WHERE entities.entity_type_id = $3 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, attributeValue, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForNil() { + attributeName := "attrName" + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + values_attrName.is_null = true + WHERE entities.entity_type_id = $2 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, nil}) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckIntAndFloatForFloat() { + attributeName := "attrName" + attributeValue := 1.2 + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + ((attributes_attrName.value_type = 'int' AND values_attrName.int_val = $2) OR + (attributes_attrName.value_type = 'float' AND values_attrName.float_val = $3)) + WHERE entities.entity_type_id = $4 AND "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, attributeValue, attributeValue, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) TestAddValueCheck2AddsValueCheckFor2Values() { + attributeName1 := "attrName1" + attributeValue1 := "a string" + attributeName2 := "attrName2" + attributeValue2 := true + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName1 ON + attributes_attrName1.entity_type_id = entities.entity_type_id AND + attributes_attrName1.name = $1 + JOIN values values_attrName1 ON + values_attrName1.attribute_id = attributes_attrName1.id AND + values_attrName1.entity_id = entities.id AND + attributes_attrName1.value_type = 'string' AND + values_attrName1.string_val = $2 + JOIN attributes attributes_attrName2 ON + attributes_attrName2.entity_type_id = entities.entity_type_id AND + attributes_attrName2.name = $3 + JOIN values values_attrName2 ON + values_attrName2.attribute_id = attributes_attrName2.id AND + values_attrName2.entity_id = entities.id AND + attributes_attrName2.value_type = 'bool' AND + values_attrName2.bool_val = $4 + WHERE entities.entity_type_id = $5 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName1, attributeValue1, attributeName2, attributeValue2, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery( + AttributeNameAndValue{attributeName1, attributeValue1}, + AttributeNameAndValue{attributeName2, attributeValue2}, + ) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMap() { + attributeName := "attrName" + innerAttributeName := "innerAttrName" + innerAttributeValue := "a string" + attributeValue := map[string]any{innerAttributeName: innerAttributeValue} + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + attributes_attrName.value_type = 'relation' + JOIN entities entities_attrName ON + entities_attrName.id = values_attrName.relation_val AND + entities_attrName.deleted_at IS NULL + JOIN attributes attributes_attrName_innerAttrName ON + attributes_attrName_innerAttrName.entity_type_id = entities_attrName.entity_type_id AND + attributes_attrName_innerAttrName.name = $2 + JOIN values values_attrName_innerAttrName ON + values_attrName_innerAttrName.attribute_id = attributes_attrName_innerAttrName.id AND + values_attrName_innerAttrName.entity_id = entities_attrName.id AND + attributes_attrName_innerAttrName.value_type = 'string' AND + values_attrName_innerAttrName.string_val = $3 + WHERE entities.entity_type_id = $4 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, innerAttributeName, innerAttributeValue, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMapWith2Values() { + attributeName := "attrName" + innerAttributeName1 := "innerAttrName1" + innerAttributeValue1 := "a string" + innerAttributeName2 := "innerAttrName2" + innerAttributeValue2 := "other string" + attributeValue := map[string]any{ + innerAttributeName1: innerAttributeValue1, + innerAttributeName2: innerAttributeValue2, + } + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + attributes_attrName.value_type = 'relation' + JOIN entities entities_attrName ON + entities_attrName.id = values_attrName.relation_val AND + entities_attrName.deleted_at IS NULL + JOIN attributes attributes_attrName_innerAttrName1 ON + attributes_attrName_innerAttrName1.entity_type_id = entities_attrName.entity_type_id AND + attributes_attrName_innerAttrName1.name = $2 + JOIN values values_attrName_innerAttrName1 ON + values_attrName_innerAttrName1.attribute_id = attributes_attrName_innerAttrName1.id AND + values_attrName_innerAttrName1.entity_id = entities_attrName.id AND + attributes_attrName_innerAttrName1.value_type = 'string' AND + values_attrName_innerAttrName1.string_val = $3 + JOIN attributes attributes_attrName_innerAttrName2 ON + attributes_attrName_innerAttrName2.entity_type_id = entities_attrName.entity_type_id AND + attributes_attrName_innerAttrName2.name = $4 + JOIN values values_attrName_innerAttrName2 ON + values_attrName_innerAttrName2.attribute_id = attributes_attrName_innerAttrName2.id AND + values_attrName_innerAttrName2.entity_id = entities_attrName.id AND + attributes_attrName_innerAttrName2.value_type = 'string' AND + values_attrName_innerAttrName2.string_val = $5 + WHERE entities.entity_type_id = $6 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, innerAttributeName1, innerAttributeValue1, innerAttributeName2, innerAttributeValue2, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckAndJoinWithEntitiesForMapWith2Values() { + attributeName1 := "attrName1" + innerAttributeName1 := "innerAttrName1" + innerAttributeValue1 := "a string" + innerAttributeName2 := "innerAttrName2" + innerAttributeValue2 := "other string" + attributeValue1 := map[string]any{ + innerAttributeName1: innerAttributeValue1, + innerAttributeName2: innerAttributeValue2, + } + attributeName2 := "attrName2" + attributeValue2 := "another string" + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName1 ON + attributes_attrName1.entity_type_id = entities.entity_type_id AND + attributes_attrName1.name = $1 + JOIN values values_attrName1 ON + values_attrName1.attribute_id = attributes_attrName1.id AND + values_attrName1.entity_id = entities.id AND + attributes_attrName1.value_type = 'relation' + JOIN entities entities_attrName1 ON + entities_attrName1.id = values_attrName1.relation_val AND + entities_attrName1.deleted_at IS NULL + JOIN attributes attributes_attrName1_innerAttrName1 ON + attributes_attrName1_innerAttrName1.entity_type_id = entities_attrName1.entity_type_id AND + attributes_attrName1_innerAttrName1.name = $2 + JOIN values values_attrName1_innerAttrName1 ON + values_attrName1_innerAttrName1.attribute_id = attributes_attrName1_innerAttrName1.id AND + values_attrName1_innerAttrName1.entity_id = entities_attrName1.id AND + attributes_attrName1_innerAttrName1.value_type = 'string' AND + values_attrName1_innerAttrName1.string_val = $3 + JOIN attributes attributes_attrName1_innerAttrName2 ON + attributes_attrName1_innerAttrName2.entity_type_id = entities_attrName1.entity_type_id AND + attributes_attrName1_innerAttrName2.name = $4 + JOIN values values_attrName1_innerAttrName2 ON + values_attrName1_innerAttrName2.attribute_id = attributes_attrName1_innerAttrName2.id AND + values_attrName1_innerAttrName2.entity_id = entities_attrName1.id AND + attributes_attrName1_innerAttrName2.value_type = 'string' AND + values_attrName1_innerAttrName2.string_val = $5 + JOIN attributes attributes_attrName2 ON + attributes_attrName2.entity_type_id = entities.entity_type_id AND + attributes_attrName2.name = $6 + JOIN values values_attrName2 ON + values_attrName2.attribute_id = attributes_attrName2.id AND + values_attrName2.entity_id = entities.id AND + attributes_attrName2.value_type = 'string' AND + values_attrName2.string_val = $7 + WHERE entities.entity_type_id = $8 AND + "entities"."deleted_at" IS NULL`)). + WithArgs( + attributeName1, + innerAttributeName1, innerAttributeValue1, + innerAttributeName2, innerAttributeValue2, + attributeName2, attributeValue2, + s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName1, attributeValue1}, AttributeNameAndValue{attributeName2, attributeValue2}) +} + +func (s *EntityRepositorySuite) execQuery(attributes ...AttributeNameAndValue) { + for _, attribute := range attributes { + err := s.repository.AddValueCheckToQuery(s.query, attribute.AttributeName, attribute.AttributeValue) + require.NoError(s.T(), err) + } + + s.query.Where( + "entities.entity_type_id = ?", + s.uuid, + ) + + var entities []*models.Entity + err := s.query.Find(&entities).Error + require.NoError(s.T(), err) +} From 8c5e507d1b01c20b689b8dc588d585031c614751 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 28 Apr 2023 10:01:11 +0200 Subject: [PATCH 110/467] fix typos in readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6727eee7..2a524a53 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ Badaas enables the effortless construction of ***distributed, resilient, highly Badaas provides several key features: - **Authentication**: Badaas can authenticate users using its internal authentication scheme or externally by using protocols such as OIDC, SAML, Oauth2... -- **Authorization**: On a resource access, Badaas will check if the user is authorized using a RBAC model. +- **Authorization**: On resource access, Badaas will check if the user is authorized using a RBAC model. - **Distribution**: Badaas is built to run in clusters by default. Communications between nodes are TLS encrypted using [shoset](https://github.com/ditrit/shoset). -- **Persistence**: Applicative objects are persisted as well as user files. Those resources are shared accross the clusters to increase resiliency. +- **Persistence**: Applicative objects are persisted as well as user files. Those resources are shared across the clusters to increase resiliency. - **Querying Resources**: Resources are accessible via a REST API. -- **Posix complient**: Badaas strives towards being a good unix citizen and respecting commonly accepted norms. (see [Configuration](#configuration)) +- **Posix compliant**: Badaas strives towards being a good unix citizen and respecting commonly accepted norms. (see [Configuration](#configuration)) - **Advanced logs management**: Badaas provides an interface to interact with the logs produced by the clusters. Logs are formatted in json by default. To quickly get badaas up and running, please head to the [miniblog tutorial]() From 77e2289c80bcabf88e6f42f581b41886c9dce54c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 4 May 2023 10:17:38 +0200 Subject: [PATCH 111/467] remove main from badaas and create badgen --- .gitignore | 11 +- Makefile | 11 +- badaas.go | 106 ++- commands/init.go | 27 - commands/initDatabaseCommands.go | 32 - commands/initInitialisationCommands.go | 13 - commands/initLoggerCommands.go | 16 - commands/initServerCommands.go | 25 - commands/initSessionCommands.go | 19 - commands/rootCmd.go | 72 -- commands/server.go | 71 -- commands/server_test.go | 36 - configuration/HttpServerConfiguration.go | 12 +- configuration/HttpServerConfiguration_test.go | 6 + controllers/info.go | 17 +- docker/api/Dockerfile | 31 - docker/api/docker-compose.yml | 27 - docker/test_api/docker-compose.yml | 4 +- examples/README.md | 102 --- examples/examples.go | 210 ----- go.mod | 24 +- go.sum | 153 +--- go.work.sum | 527 +++++++++++ .../configuration/HTTPServerConfiguration.go | 14 + persistence/models/dto/ProductInfo.go | 9 - resources/api.go | 4 - router/ModuleFx.go | 6 +- router/middlewares/JSONHandler.go | 10 - router/middlewares/middlewareJson.go | 6 +- router/middlewares/middlewareLogger.go | 5 + router/router.go | 63 +- router/router_test.go | 24 - router/routes.go | 87 ++ .../init_test.go => router/routes_test.go | 8 +- test_e2e/go.mod | 75 ++ test_e2e/go.sum | 855 ++++++++++++++++++ test_e2e/test_api.go | 109 +++ test_integration/integration_test.go | 8 +- tools/badgen/Makefile | 5 + tools/badgen/README.md | 1 + tools/badgen/badgen | Bin 0 -> 8825495 bytes tools/badgen/cmd/gen.go | 83 ++ tools/badgen/cmd/root.go | 18 + tools/badgen/docker/.dockerignore | 1 + tools/badgen/docker/api/Dockerfile | 19 + .../badgen/docker}/api/badaas.yml | 1 + tools/badgen/docker/api/docker-compose.yml | 13 + .../docker/cockroachdb/docker-compose.yml | 15 + .../docker/postgres}/docker-compose.yml | 4 +- .../badgen/docker/postgres}/init.sql | 0 tools/badgen/go.mod | 28 + tools/badgen/go.sum | 491 ++++++++++ tools/badgen/main.go | 7 + tools/badgen/scripts/run.sh | 3 + 54 files changed, 2517 insertions(+), 1007 deletions(-) delete mode 100644 commands/init.go delete mode 100644 commands/initDatabaseCommands.go delete mode 100644 commands/initInitialisationCommands.go delete mode 100644 commands/initLoggerCommands.go delete mode 100644 commands/initServerCommands.go delete mode 100644 commands/initSessionCommands.go delete mode 100644 commands/rootCmd.go delete mode 100644 commands/server.go delete mode 100644 commands/server_test.go delete mode 100644 docker/api/Dockerfile delete mode 100644 docker/api/docker-compose.yml delete mode 100644 examples/README.md delete mode 100644 examples/examples.go create mode 100644 go.work.sum delete mode 100644 persistence/models/dto/ProductInfo.go delete mode 100644 resources/api.go delete mode 100644 router/middlewares/JSONHandler.go delete mode 100644 router/router_test.go create mode 100644 router/routes.go rename commands/init_test.go => router/routes_test.go (99%) create mode 100644 test_e2e/go.mod create mode 100644 test_e2e/go.sum create mode 100644 test_e2e/test_api.go create mode 100644 tools/badgen/Makefile create mode 100644 tools/badgen/README.md create mode 100755 tools/badgen/badgen create mode 100644 tools/badgen/cmd/gen.go create mode 100644 tools/badgen/cmd/root.go create mode 100644 tools/badgen/docker/.dockerignore create mode 100644 tools/badgen/docker/api/Dockerfile rename {docker => tools/badgen/docker}/api/badaas.yml (67%) create mode 100644 tools/badgen/docker/api/docker-compose.yml create mode 100644 tools/badgen/docker/cockroachdb/docker-compose.yml rename {docker/postgresql => tools/badgen/docker/postgres}/docker-compose.yml (88%) rename {docker/postgresql => tools/badgen/docker/postgres}/init.sql (100%) create mode 100644 tools/badgen/go.mod create mode 100644 tools/badgen/go.sum create mode 100644 tools/badgen/main.go create mode 100755 tools/badgen/scripts/run.sh diff --git a/.gitignore b/.gitignore index 67097f02..c64eca2e 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,7 @@ *.out # Dependency directories (remove the comment below to include it) -# vendor/ +vendor/ # Go workspace file go.work @@ -23,13 +23,8 @@ go.work # cockroach files node* -#Vscode conf +# vscode conf .vscode # binary output -badaas - -# temporary directories -_temp - -vendor/ \ No newline at end of file +badaas \ No newline at end of file diff --git a/Makefile b/Makefile index 85d35935..fef745b1 100644 --- a/Makefile +++ b/Makefile @@ -23,14 +23,5 @@ test_e2e: test_generate_mocks: mockery --all --keeptree -example_birds: - EXAMPLE=birds docker compose -f "docker/api/docker-compose.yml" up - -example_posts: - EXAMPLE=posts docker compose -f "docker/api/docker-compose.yml" up - -badaas: - docker compose -f "docker/api/docker-compose.yml" up - -.PHONY: test_unit test_integration test_e2e example_birds example_posts badaas +.PHONY: test_unit test_integration test_e2e diff --git a/badaas.go b/badaas.go index 05513376..3afd1b0b 100644 --- a/badaas.go +++ b/badaas.go @@ -1,11 +1,105 @@ -// Package main : -package main +package badaas import ( - "github.com/ditrit/badaas/commands" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/controllers" + "github.com/ditrit/badaas/logger" + "github.com/ditrit/badaas/persistence" + "github.com/ditrit/badaas/router" + "github.com/ditrit/badaas/services" + "github.com/ditrit/verdeter" + "github.com/ditrit/verdeter/validators" + "go.uber.org/fx" ) -// Badaas application, run a http-server on 8000. -func main() { - commands.Execute() +var BadaasModule = fx.Module( + "badaas", + configuration.ConfigurationModule, + router.RouterModule, + controllers.ControllerModule, + logger.LoggerModule, + persistence.PersistanceModule, + services.ServicesModule, +) + +func ConfigCommandParameters(command *verdeter.VerdeterCommand) { + command.GKey("config_path", verdeter.IsStr, "", "Path to the config file/directory") + command.SetDefault("config_path", ".") + + configServerParameters(command) + configLoggerParameters(command) + configDatabaseParameters(command) + configInitialisationParameters(command) + configSessionParameters(command) +} + +func configDatabaseParameters(cfg *verdeter.VerdeterCommand) { + cfg.GKey(configuration.DatabasePortKey, verdeter.IsInt, "", "The port of the database server") + cfg.SetRequired(configuration.DatabasePortKey) + + cfg.GKey(configuration.DatabaseHostKey, verdeter.IsStr, "", "The host of the database server") + cfg.SetRequired(configuration.DatabaseHostKey) + + cfg.GKey(configuration.DatabaseNameKey, verdeter.IsStr, "", "The name of the database to use") + cfg.SetRequired(configuration.DatabaseNameKey) + + cfg.GKey(configuration.DatabaseUsernameKey, verdeter.IsStr, "", "The username of the account on the database server") + cfg.SetRequired(configuration.DatabaseUsernameKey) + + cfg.GKey(configuration.DatabasePasswordKey, verdeter.IsStr, "", "The password of the account one the database server") + cfg.SetRequired(configuration.DatabasePasswordKey) + + cfg.GKey(configuration.DatabaseSslmodeKey, verdeter.IsStr, "", "The sslmode to use when connecting to the database server") + cfg.SetRequired(configuration.DatabaseSslmodeKey) + + cfg.GKey(configuration.DatabaseRetryKey, verdeter.IsUint, "", "The number of times badaas tries to establish a connection with the database") + cfg.SetDefault(configuration.DatabaseRetryKey, uint(10)) + + cfg.GKey(configuration.DatabaseRetryDurationKey, verdeter.IsUint, "", "The duration in seconds badaas wait between connection attempts") + cfg.SetDefault(configuration.DatabaseRetryDurationKey, uint(5)) +} + +func configInitialisationParameters(cfg *verdeter.VerdeterCommand) { + cfg.GKey(configuration.InitializationDefaultAdminPasswordKey, verdeter.IsStr, "", + "Set the default admin password is the admin user is not created yet.") + cfg.SetDefault(configuration.InitializationDefaultAdminPasswordKey, "admin") +} + +func configLoggerParameters(cfg *verdeter.VerdeterCommand) { + cfg.GKey(configuration.LoggerModeKey, verdeter.IsStr, "", "The logger mode (default to \"prod\")") + cfg.SetDefault(configuration.LoggerModeKey, "prod") + cfg.AddValidator(configuration.LoggerModeKey, validators.AuthorizedValues("prod", "dev")) + + cfg.GKey(configuration.LoggerRequestTemplateKey, verdeter.IsStr, "", "Template message for all request logs") + cfg.SetDefault(configuration.LoggerRequestTemplateKey, "Receive {{method}} request on {{url}}") +} + +func configServerParameters(cfg *verdeter.VerdeterCommand) { + cfg.GKey(configuration.ServerTimeoutKey, verdeter.IsInt, "", "Maximum timeout of the http server in second (default is 15s)") + cfg.SetDefault(configuration.ServerTimeoutKey, 15) + + cfg.GKey(configuration.ServerHostKey, verdeter.IsStr, "", "Address to bind (default is 0.0.0.0)") + cfg.SetDefault(configuration.ServerHostKey, "0.0.0.0") + + cfg.GKey(configuration.ServerPortKey, verdeter.IsInt, "p", "Port to bind (default is 8000)") + cfg.AddValidator(configuration.ServerPortKey, validators.CheckTCPHighPort) + cfg.SetDefault(configuration.ServerPortKey, 8000) + + cfg.GKey(configuration.ServerPaginationMaxElemPerPage, verdeter.IsUint, "", "The max number of records returned per page") + cfg.SetDefault(configuration.ServerPaginationMaxElemPerPage, 100) + + cfg.GKey(configuration.ServerExampleKey, verdeter.IsStr, "", "Example server to exec (birds | posts)") + cfg.SetDefault(configuration.ServerExampleKey, "") +} + +func configSessionParameters(cfg *verdeter.VerdeterCommand) { + cfg.LKey(configuration.SessionDurationKey, verdeter.IsUint, "", "The duration of a user session in seconds.") + cfg.SetDefault(configuration.SessionDurationKey, uint(3600*4)) // 4 hours by default + + cfg.LKey(configuration.SessionPullIntervalKey, + verdeter.IsUint, "", "The refresh interval in seconds. Badaas refresh it's internal session cache periodically.") + cfg.SetDefault(configuration.SessionPullIntervalKey, uint(30)) // 30 seconds by default + + cfg.LKey(configuration.SessionRollIntervalKey, verdeter.IsUint, "", "The interval in which the user can renew it's session by making a request.") + cfg.SetDefault(configuration.SessionRollIntervalKey, uint(3600)) // 1 hour by default } diff --git a/commands/init.go b/commands/init.go deleted file mode 100644 index 1d9b4f20..00000000 --- a/commands/init.go +++ /dev/null @@ -1,27 +0,0 @@ -package commands - -import ( - "strings" - - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/services/userservice" - "go.uber.org/zap" -) - -// Create a super user -func createSuperUser( - config configuration.InitializationConfiguration, - logger *zap.Logger, - userService userservice.UserService, -) error { - // Create a super admin user and exit with code 1 on error - _, err := userService.NewUser("admin", "admin-no-reply@badaas.com", config.GetAdminPassword()) - if err != nil { - if !strings.Contains(err.Error(), "already exist in database") { - logger.Sugar().Errorf("failed to save the super admin %w", err) - return err - } - logger.Sugar().Infof("The superadmin user already exists in database") - } - return nil -} diff --git a/commands/initDatabaseCommands.go b/commands/initDatabaseCommands.go deleted file mode 100644 index 022cfb98..00000000 --- a/commands/initDatabaseCommands.go +++ /dev/null @@ -1,32 +0,0 @@ -package commands - -import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/verdeter" -) - -func initDatabaseCommands(cfg *verdeter.VerdeterCommand) { - cfg.GKey(configuration.DatabasePortKey, verdeter.IsInt, "", "The port of the database server") - cfg.SetRequired(configuration.DatabasePortKey) - - cfg.GKey(configuration.DatabaseHostKey, verdeter.IsStr, "", "The host of the database server") - cfg.SetRequired(configuration.DatabaseHostKey) - - cfg.GKey(configuration.DatabaseNameKey, verdeter.IsStr, "", "The name of the database to use") - cfg.SetRequired(configuration.DatabaseNameKey) - - cfg.GKey(configuration.DatabaseUsernameKey, verdeter.IsStr, "", "The username of the account on the database server") - cfg.SetRequired(configuration.DatabaseUsernameKey) - - cfg.GKey(configuration.DatabasePasswordKey, verdeter.IsStr, "", "The password of the account one the database server") - cfg.SetRequired(configuration.DatabasePasswordKey) - - cfg.GKey(configuration.DatabaseSslmodeKey, verdeter.IsStr, "", "The sslmode to use when connecting to the database server") - cfg.SetRequired(configuration.DatabaseSslmodeKey) - - cfg.GKey(configuration.DatabaseRetryKey, verdeter.IsUint, "", "The number of times badaas tries to establish a connection with the database") - cfg.SetDefault(configuration.DatabaseRetryKey, uint(10)) - - cfg.GKey(configuration.DatabaseRetryDurationKey, verdeter.IsUint, "", "The duration in seconds badaas wait between connection attempts") - cfg.SetDefault(configuration.DatabaseRetryDurationKey, uint(5)) -} diff --git a/commands/initInitialisationCommands.go b/commands/initInitialisationCommands.go deleted file mode 100644 index 130e9778..00000000 --- a/commands/initInitialisationCommands.go +++ /dev/null @@ -1,13 +0,0 @@ -package commands - -import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/verdeter" -) - -func initInitialisationCommands(cfg *verdeter.VerdeterCommand) { - - cfg.GKey(configuration.InitializationDefaultAdminPasswordKey, verdeter.IsStr, "", - "Set the default admin password is the admin user is not created yet.") - cfg.SetDefault(configuration.InitializationDefaultAdminPasswordKey, "admin") -} diff --git a/commands/initLoggerCommands.go b/commands/initLoggerCommands.go deleted file mode 100644 index 097ac1d3..00000000 --- a/commands/initLoggerCommands.go +++ /dev/null @@ -1,16 +0,0 @@ -package commands - -import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/verdeter" - "github.com/ditrit/verdeter/validators" -) - -func initLoggerCommands(cfg *verdeter.VerdeterCommand) { - cfg.GKey(configuration.LoggerModeKey, verdeter.IsStr, "", "The logger mode (default to \"prod\")") - cfg.SetDefault(configuration.LoggerModeKey, "prod") - cfg.AddValidator(configuration.LoggerModeKey, validators.AuthorizedValues("prod", "dev")) - - cfg.GKey(configuration.LoggerRequestTemplateKey, verdeter.IsStr, "", "Template message for all request logs") - cfg.SetDefault(configuration.LoggerRequestTemplateKey, "Receive {{method}} request on {{url}}") -} diff --git a/commands/initServerCommands.go b/commands/initServerCommands.go deleted file mode 100644 index ebfe0ef8..00000000 --- a/commands/initServerCommands.go +++ /dev/null @@ -1,25 +0,0 @@ -package commands - -import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/verdeter" - "github.com/ditrit/verdeter/validators" -) - -func initServerCommands(cfg *verdeter.VerdeterCommand) { - cfg.GKey(configuration.ServerTimeoutKey, verdeter.IsInt, "", "Maximum timeout of the http server in second (default is 15s)") - cfg.SetDefault(configuration.ServerTimeoutKey, 15) - - cfg.GKey(configuration.ServerHostKey, verdeter.IsStr, "", "Address to bind (default is 0.0.0.0)") - cfg.SetDefault(configuration.ServerHostKey, "0.0.0.0") - - cfg.GKey(configuration.ServerPortKey, verdeter.IsInt, "p", "Port to bind (default is 8000)") - cfg.AddValidator(configuration.ServerPortKey, validators.CheckTCPHighPort) - cfg.SetDefault(configuration.ServerPortKey, 8000) - - cfg.GKey(configuration.ServerPaginationMaxElemPerPage, verdeter.IsUint, "", "The max number of records returned per page") - cfg.SetDefault(configuration.ServerPaginationMaxElemPerPage, 100) - - cfg.GKey(configuration.ServerExampleKey, verdeter.IsStr, "", "Example server to exec (birds | posts)") - cfg.SetDefault(configuration.ServerExampleKey, "") -} diff --git a/commands/initSessionCommands.go b/commands/initSessionCommands.go deleted file mode 100644 index 13f4ad74..00000000 --- a/commands/initSessionCommands.go +++ /dev/null @@ -1,19 +0,0 @@ -package commands - -import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/verdeter" -) - -// initialize session related config keys -func initSessionCommands(cfg *verdeter.VerdeterCommand) { - cfg.LKey(configuration.SessionDurationKey, verdeter.IsUint, "", "The duration of a user session in seconds.") - cfg.SetDefault(configuration.SessionDurationKey, uint(3600*4)) // 4 hours by default - - cfg.LKey(configuration.SessionPullIntervalKey, - verdeter.IsUint, "", "The refresh interval in seconds. Badaas refresh it's internal session cache periodically.") - cfg.SetDefault(configuration.SessionPullIntervalKey, uint(30)) // 30 seconds by default - - cfg.LKey(configuration.SessionRollIntervalKey, verdeter.IsUint, "", "The interval in which the user can renew it's session by making a request.") - cfg.SetDefault(configuration.SessionRollIntervalKey, uint(3600)) // 1 hour by default -} diff --git a/commands/rootCmd.go b/commands/rootCmd.go deleted file mode 100644 index 70dfbb21..00000000 --- a/commands/rootCmd.go +++ /dev/null @@ -1,72 +0,0 @@ -package commands - -import ( - "net/http" - - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/controllers" - "github.com/ditrit/badaas/examples" - "github.com/ditrit/badaas/logger" - "github.com/ditrit/badaas/persistence" - "github.com/ditrit/badaas/resources" - "github.com/ditrit/badaas/router" - "github.com/ditrit/badaas/services" - "github.com/ditrit/verdeter" - "github.com/spf13/cobra" - "go.uber.org/fx" - "go.uber.org/fx/fxevent" - "go.uber.org/zap" -) - -// Run the http server for badaas -func runHTTPServer(cmd *cobra.Command, args []string) { - fx.New( - // Modules - configuration.ConfigurationModule, - router.RouterModule, - controllers.ControllerModule, - logger.LoggerModule, - persistence.PersistanceModule, - services.ServicesModule, - - // logger for fx - fx.WithLogger(func(logger *zap.Logger) fxevent.Logger { - return &fxevent.ZapLogger{Logger: logger} - }), - - fx.Provide(NewHTTPServer), - - // Finally: we invoke the newly created server - fx.Invoke(func(*http.Server) { /* we need this function to be empty*/ }), - fx.Invoke(createSuperUser), - fx.Invoke(examples.StartExample), - ).Run() -} - -// The command badaas -var rootCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ - Use: "badaas", - Short: "Backend and Distribution as a Service", - Long: "Badaas stands for Backend and Distribution as a Service.", - Version: resources.Version, - Run: runHTTPServer, -}) - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - InitCommands(rootCfg) - - rootCfg.Execute() -} - -func InitCommands(config *verdeter.VerdeterCommand) { - config.GKey("config_path", verdeter.IsStr, "", "Path to the config file/directory") - config.SetDefault("config_path", ".") - - initServerCommands(config) - initLoggerCommands(config) - initDatabaseCommands(config) - initInitialisationCommands(config) - initSessionCommands(config) -} diff --git a/commands/server.go b/commands/server.go deleted file mode 100644 index 1d023b42..00000000 --- a/commands/server.go +++ /dev/null @@ -1,71 +0,0 @@ -package commands - -// This file holds functions needed by the badaas rootCommand, thoses functions help in creating the http.Server. - -import ( - "context" - "fmt" - "net" - "net/http" - "time" - - "go.uber.org/fx" - "go.uber.org/zap" - - "github.com/ditrit/badaas/configuration" -) - -// Create the server from the configuration holder and the http handler -func createServerFromConfigurationHolder(router http.Handler, httpServerConfig configuration.HTTPServerConfiguration) *http.Server { - address := addrFromConf(httpServerConfig.GetHost(), httpServerConfig.GetPort()) - timeout := httpServerConfig.GetMaxTimeout() - return createServer(router, address, timeout, timeout) -} - -// Create an http server -func createServer(router http.Handler, address string, writeTimeout, readTimeout time.Duration) *http.Server { - srv := &http.Server{ - Handler: router, - Addr: address, - - WriteTimeout: writeTimeout, - ReadTimeout: readTimeout, - } - return srv -} - -// Create the addr string for the http.Server -// returns ":" -func addrFromConf(host string, port int) string { - address := fmt.Sprintf("%s:%d", - host, - port, - ) - return address -} - -func NewHTTPServer( - lc fx.Lifecycle, - logger *zap.Logger, - router http.Handler, - httpServerConfig configuration.HTTPServerConfiguration, -) *http.Server { - srv := createServerFromConfigurationHolder(router, httpServerConfig) - lc.Append(fx.Hook{ - OnStart: func(ctx context.Context) error { - ln, err := net.Listen("tcp", srv.Addr) - if err != nil { - return err - } - logger.Sugar().Infof("Ready to serve at %s", srv.Addr) - go srv.Serve(ln) - return nil - }, - OnStop: func(ctx context.Context) error { - // Flush the logger - logger.Sync() - return srv.Shutdown(ctx) - }, - }) - return srv -} diff --git a/commands/server_test.go b/commands/server_test.go deleted file mode 100644 index aa949b71..00000000 --- a/commands/server_test.go +++ /dev/null @@ -1,36 +0,0 @@ -package commands - -// This files holds the tests for the commands/server.go file. - -import ( - "net/http" - "testing" - "time" - - "github.com/ditrit/badaas/configuration" - "github.com/stretchr/testify/assert" -) - -func Test_addrFromConf(t *testing.T) { - expected := "192.168.236.222:25100" - addr := addrFromConf("192.168.236.222", 25100) - assert.Equal(t, expected, addr) -} -func Test_createServer(t *testing.T) { - handl := http.NewServeMux() - timeout := time.Duration(time.Second) - srv := createServer( - handl, - "localhost:8000", - timeout, timeout, - ) - assert.NotNil(t, srv) -} - -func TestCreateServerFromConfigurationHolder(t *testing.T) { - handl := http.NewServeMux() - - srv := createServerFromConfigurationHolder(handl, configuration.NewHTTPServerConfiguration()) - assert.NotNil(t, srv) - -} diff --git a/configuration/HttpServerConfiguration.go b/configuration/HttpServerConfiguration.go index ae9384c1..8fd58080 100644 --- a/configuration/HttpServerConfiguration.go +++ b/configuration/HttpServerConfiguration.go @@ -1,6 +1,7 @@ package configuration import ( + "fmt" "time" "github.com/spf13/viper" @@ -19,6 +20,7 @@ const ( // Hold the configuration values for the http server type HTTPServerConfiguration interface { ConfigurationHolder + GetAddr() string GetHost() string GetPort() int GetMaxTimeout() time.Duration @@ -55,7 +57,7 @@ func (httpServerConfiguration *hTTPServerConfigurationImpl) GetPort() int { return httpServerConfiguration.port } -// Return the maximum timout for read and write +// Return the maximum timeout for read and write func (httpServerConfiguration *hTTPServerConfigurationImpl) GetMaxTimeout() time.Duration { return httpServerConfiguration.timeout } @@ -68,3 +70,11 @@ func (httpServerConfiguration *hTTPServerConfigurationImpl) Log(logger *zap.Logg zap.Duration("timeout", httpServerConfiguration.timeout), ) } + +// Create the addr string in format: ":" +func (httpServerConfiguration *hTTPServerConfigurationImpl) GetAddr() string { + return fmt.Sprintf("%s:%d", + httpServerConfiguration.GetHost(), + httpServerConfiguration.GetPort(), + ) +} diff --git a/configuration/HttpServerConfiguration_test.go b/configuration/HttpServerConfiguration_test.go index d50119c5..9460a79e 100644 --- a/configuration/HttpServerConfiguration_test.go +++ b/configuration/HttpServerConfiguration_test.go @@ -33,6 +33,12 @@ func TestHTTPServerConfigurationGetHost(t *testing.T) { assert.Equal(t, "0.0.0.0", HTTPServerConfiguration.GetHost()) } +func TestHTTPServerConfigurationGetAddr(t *testing.T) { + setupViperEnvironment(HTTPServerConfigurationString) + HTTPServerConfiguration := configuration.NewHTTPServerConfiguration() + assert.Equal(t, "0.0.0.0:8000", HTTPServerConfiguration.GetAddr()) +} + func TestHTTPServerConfigurationGetMaxTimeout(t *testing.T) { setupViperEnvironment(HTTPServerConfigurationString) HTTPServerConfiguration := configuration.NewHTTPServerConfiguration() diff --git a/controllers/info.go b/controllers/info.go index f39f30a2..02ebdb65 100644 --- a/controllers/info.go +++ b/controllers/info.go @@ -4,13 +4,13 @@ import ( "net/http" "github.com/ditrit/badaas/httperrors" - "github.com/ditrit/badaas/persistence/models/dto" - "github.com/ditrit/badaas/resources" ) +const Version = "UNRELEASED" + // The information controller type InformationController interface { - // Return the badaas server informations + // Return the badaas server information Info(response http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) } @@ -25,12 +25,17 @@ func NewInfoController() InformationController { // The concrete implementation of the InformationController type infoControllerImpl struct{} -// Return the badaas server informations +// Return the badaas server information func (*infoControllerImpl) Info(response http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - infos := &dto.DTOBadaasServerInfo{ + infos := &BadaasServerInfo{ Status: "OK", - Version: resources.Version, + Version: Version, } return infos, nil } + +type BadaasServerInfo struct { + Status string `json:"status"` + Version string `json:"version"` +} diff --git a/docker/api/Dockerfile b/docker/api/Dockerfile deleted file mode 100644 index f7d19f53..00000000 --- a/docker/api/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -# builder image -FROM golang:1.19-alpine AS builder -RUN apk add build-base -WORKDIR /app -COPY commands/ ./commands -COPY configuration/ ./configuration -COPY controllers/ ./controllers -COPY examples/ ./examples -COPY httperrors/ ./httperrors -COPY logger/ ./logger -COPY persistence/ ./persistence -COPY resources/ ./resources -COPY router/ ./router -COPY services/ ./services -COPY utils/ ./utils -COPY validators/ ./validators -COPY badaas.go . -COPY go.mod . -COPY go.sum . -RUN CGO_ENABLED=1 go build -a -o badaas . - - -# final image for end users -FROM alpine:3.16.2 -RUN addgroup -S badaas \ - && adduser -S badaas -G badaas -USER badaas -COPY --from=builder /app/badaas . -COPY docker/api/badaas.yml . -EXPOSE 8000 -ENTRYPOINT ["./badaas", "--config_path", "badaas.yml"] \ No newline at end of file diff --git a/docker/api/docker-compose.yml b/docker/api/docker-compose.yml deleted file mode 100644 index c3774206..00000000 --- a/docker/api/docker-compose.yml +++ /dev/null @@ -1,27 +0,0 @@ -version: '3.5' - -services: - db: - image: cockroachdb/cockroach:latest - container_name: "badaas-db" - ports: - - "26257:26257" - - "8080:8080" # Web based dashboard - command: start-single-node --insecure - volumes: - - "${PWD}/_temp/cockroach-data:/cockroach/cockroach-data" - environment: - - COCKROACH_USER=root - - COCKROACH_DATABASE=badaas_db - - api: - build: - context: ../.. - dockerfile: ./docker/api/Dockerfile - container_name: "badaas-api" - ports: - - "8000:8000" - environment: - BADAAS_SERVER_EXAMPLE: ${EXAMPLE} - depends_on: - - db diff --git a/docker/test_api/docker-compose.yml b/docker/test_api/docker-compose.yml index bfdf91bd..2a6e0173 100644 --- a/docker/test_api/docker-compose.yml +++ b/docker/test_api/docker-compose.yml @@ -10,11 +10,9 @@ services: image: badaas-test-api volumes: - ../..:/badaas:ro - entrypoint: go run /badaas/badaas.go --config_path /badaas/docker/test_api/badaas.yml + entrypoint: go run /badaas/test_e2e/test_api.go --config_path /badaas/docker/test_api/badaas.yml ports: - "8000:8000" restart: always - environment: - BADAAS_SERVER_EXAMPLE: ${EXAMPLE} depends_on: - db diff --git a/examples/README.md b/examples/README.md deleted file mode 100644 index a3311bd9..00000000 --- a/examples/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# Examples of BadAas authentication and object storage - -## Options - -There are two demos: `birds` ands `posts`. To run them exec `make example_birds` and `make example_posts` respectively. - -## Set up - -First we need to setup the database connection, the used configuration file is [here](../docker/api/badaas.yml). Please head to the [configuration doc](../configuration.md) page to learn more. -The minimal configuration for the database looks like this: - -```yml -database: - host: - port: - sslmode: - username: - password: - name: -``` - -## Model definition - -We need to declare our models for the objects. -As an example we will use some UML to model the objects for this demo. - -```mermaid -classDiagram - class Post { - title String - body String - ownerID String - } - class Profile { - displayName String - urlPic String - userID String - } - class User { - } - Profile "1" <--> "*" Post - Profile "1" <--> "1" User -``` - -The Users are stored on a classic sql table outside of the object storage engine (EAV), so the userID will be a value. We will use the Profile object to store info about the users. - -For now we need to setup the schema manually using a invoke function that will run at the initialization of the programme. The definition can be found [here](examples.go#L104). -Make sure that the database you are gonna use is empty. - -## Authentication - -Currently we only support a basic authentication using an email and a password. -The default credentials for the user are ̀`admin-no-reply@badaas.com` and `admin` (The admin password can be changed on the first run through the config, please see [configuration.md](configuration.md)). - -## Test it - -httpie util will be used in the examples below, but it works with curl or any similar tools. - -Let's first start by getting all the profiles: `http localhost:8000/objects/profile/` - -```json -HTTP/1.1 200 OK -Content-Length: 226 -Content-Type: application/json -Date: Thu, 05 Jan 2023 11:53:35 GMT - -[ - { - "attrs": { - "urlPic": "The Super Admin", - "userId": "wowASuperCoolUserID" - }, - "createdAt": "2023-01-05T12:47:41.166796+01:00", - "id": "67c5c6dc-b82d-4c2a-9ab8-f7847a732086", - "type": "profile", - "updatedAt": "2023-01-05T12:47:41.166796+01:00" - } -] -``` - -Let's get all the posts posted by this user: `http GET localhost:8000/objects/post ownerID=wowASuperCoolUserID` - -```json -HTTP/1.1 200 OK -Content-Length: 1626 -Content-Type: application/json -Date: Fri, 06 Jan 2023 08:20:33 GMT - -[ - { - "attrs": { - "body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n\n\t\tIn consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi.\n\n\t\tIn erat mi, pharetra ut lacinia at, facilisis vitae nunc.\n\t", - "ownerID": "wowASuperCoolUserID", - "title": "Why cats like mice ?" - }, - "createdAt": "2023-01-06T09:18:53.313565+01:00", - "id": "68facfa6-fe77-479b-a64e-f26344393a31", - "type": "post", - "updatedAt": "2023-01-06T09:18:53.313565+01:00" - } -] -``` diff --git a/examples/examples.go b/examples/examples.go deleted file mode 100644 index 158c6bda..00000000 --- a/examples/examples.go +++ /dev/null @@ -1,210 +0,0 @@ -package examples - -import ( - "fmt" - - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/persistence/models" - "github.com/spf13/viper" - "go.uber.org/zap" - "gorm.io/gorm" -) - -const ( - BirdsExample string = "birds" - PostsExample string = "posts" -) - -func StartExample(logger *zap.Logger, db *gorm.DB) error { - example := viper.GetString(configuration.ServerExampleKey) - switch example { - case "": - return nil - case BirdsExample: - return startBirdsExample(logger, db) - case PostsExample: - return startPostsExample(logger, db) - default: - return fmt.Errorf("unknown example %s", example) - } -} - -func startBirdsExample(logger *zap.Logger, db *gorm.DB) error { - logger.Sugar().Info("Setting up Birds example") - //defining - humanType := &models.EntityType{ - Name: "human", - } - nameAttr := &models.Attribute{Name: "name", ValueType: models.StringValueType, Required: true} - humanType.Attributes = append( - humanType.Attributes, nameAttr, - ) - bobName, err := models.NewStringValue(nameAttr, "bob") - if err != nil { - return err - } - bob := &models.Entity{EntityType: humanType} - bob.Fields = append(bob.Fields, bobName) - db.Create(bob) - - jeanName, err := models.NewStringValue(nameAttr, "jean") - if err != nil { - return err - } - jean := &models.Entity{EntityType: humanType} - jean.Fields = append(jean.Fields, jeanName) - - db.Create(jean) - - // Defining a bird - colorAttr := &models.Attribute{Name: "color", ValueType: models.StringValueType, Required: true} - specieAttr := &models.Attribute{Name: "specie", ValueType: models.StringValueType, Required: true} - heightAttr := &models.Attribute{Name: "height", ValueType: models.IntValueType, Default: true, DefaultInt: 12, Required: false} - weightAttr := &models.Attribute{Name: "weight", ValueType: models.FloatValueType, Default: true, DefaultFloat: 12.500, Required: false} - ownerAttr := &models.Attribute{Name: "owner", ValueType: models.RelationValueType, Required: false, RelationTargetEntityTypeID: humanType.ID} - - BirdType := &models.EntityType{ - Name: "bird", - } - BirdType.Attributes = append( - BirdType.Attributes, colorAttr, specieAttr, heightAttr, weightAttr, ownerAttr, - ) - - val1, err := models.NewStringValue(colorAttr, "blue") - if err != nil { - return err - } - val2, err := models.NewStringValue(specieAttr, "chickadee") - if err != nil { - return err - } - val3, err := models.NewIntValue(heightAttr, 8) - if err != nil { - return err - } - val4, err := models.NewNullValue(weightAttr) - if err != nil { - return err - } - - val5, err := models.NewRelationValue(ownerAttr, bob) - if err != nil { - return err - } - - chickadee := &models.Entity{EntityType: BirdType} - chickadee.Fields = append(chickadee.Fields, val1, val2, val3, val4, val5) - - db.Create(chickadee) - logger.Sugar().Info("Finished populating the database") - - return nil -} - -func startPostsExample(logger *zap.Logger, db *gorm.DB) error { - logger.Sugar().Info("Setting up Posts example") - // GETTING THE USER ADMIN FOR REFERENCE - userID := "wowASuperCoolUserID" - - // CREATION OF THE PROFILE TYPE AND ASSOCIATED ATTRIBUTES - profileType := &models.EntityType{ - Name: "profile", - } - displayNameAttr := &models.Attribute{ - EntityTypeID: profileType.ID, - Name: "displayName", - ValueType: models.StringValueType, - Required: true, - } - urlPicAttr := &models.Attribute{ - EntityTypeID: profileType.ID, - Name: "urlPic", - ValueType: models.StringValueType, - Required: false, - Default: true, - DefaultString: "https://www.startpage.com/av/proxy-image?piurl=https%3A%2F%2Fimg.favpng.com%2F17%2F19%2F1%2Fbusiness-google-account-organization-service-png-favpng-sUuKmS4aDNRzxDKx8kJciXdFp.jpg&sp=1672915826Tc106d9b5cab08d9d380ce6fdc9564b199a49e494a069e1923c21aa202ba3ed73", //nolint:lll - } - userIDAttr := &models.Attribute{ - EntityTypeID: profileType.ID, - Name: "userId", - ValueType: models.StringValueType, - Required: true, - } - profileType.Attributes = append(profileType.Attributes, - displayNameAttr, - urlPicAttr, - userIDAttr, - ) - - // INSTANTIATION OF A Profile - adminProfile := &models.Entity{ - EntityTypeID: profileType.ID, - EntityType: profileType, - } - displayNameVal, _ := models.NewStringValue(displayNameAttr, "The Super Admin") - userPicVal, _ := models.NewNullValue(urlPicAttr) - userIDVal, _ := models.NewStringValue(userIDAttr, userID) - adminProfile.Fields = append(adminProfile.Fields, - displayNameVal, - userPicVal, - userIDVal, - ) - - // CREATION OF THE POST TYPE AND ASSOCIATED ATTRIBUTES - postType := &models.EntityType{ - Name: "post", - } - titleAttr := &models.Attribute{ - EntityTypeID: postType.ID, - Name: "title", - ValueType: models.StringValueType, - Required: true, - } - bodyAttr := &models.Attribute{ - Name: "body", - ValueType: models.StringValueType, - Default: false, - DefaultString: "empty", - } - ownerAttr := &models.Attribute{ - Name: "ownerID", - ValueType: models.StringValueType, - Required: true, - } - - postType.Attributes = append( - postType.Attributes, titleAttr, bodyAttr, ownerAttr, - ) - // INSTANTIATION OF A POST - whyCatsLikeMice := &models.Entity{ - EntityTypeID: postType.ID, - EntityType: postType, - } - titleVal, _ := models.NewStringValue(titleAttr, "Why cats like mice ?") - bodyVal, _ := models.NewStringValue(bodyAttr, - `Lorem ipsum dolor sit amet, consectetur adipiscing elit. - - In consectetur, ex at hendrerit lobortis, tellus lorem blandit eros, vel ornare odio lorem eget nisi. - - In erat mi, pharetra ut lacinia at, facilisis vitae nunc. - `) - ownerVal, _ := models.NewStringValue(ownerAttr, userID) - - whyCatsLikeMice.Fields = append(whyCatsLikeMice.Fields, - titleVal, bodyVal, ownerVal, - ) - - err := db.Create(whyCatsLikeMice).Error - if err != nil { - return err - } - - err = db.Create(adminProfile).Error - if err != nil { - return err - } - - logger.Sugar().Info("Finished populating the database") - - return nil -} diff --git a/go.mod b/go.mod index 53b995b6..267ca212 100644 --- a/go.mod +++ b/go.mod @@ -3,16 +3,16 @@ module github.com/ditrit/badaas go 1.18 require ( + github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/Masterminds/squirrel v1.5.3 - github.com/cucumber/godog v0.12.5 github.com/ditrit/verdeter v0.4.0 + github.com/elliotchance/pie/v2 v2.5.2 github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/jackc/pgconn v1.13.0 github.com/magiconair/properties v1.8.6 github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61 github.com/spf13/cobra v1.5.0 - github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.13.0 github.com/stretchr/testify v1.8.1 go.uber.org/fx v1.18.2 @@ -20,27 +20,14 @@ require ( golang.org/x/crypto v0.1.0 gorm.io/driver/postgres v1.4.5 gorm.io/gorm v1.24.1 + gotest.tools v2.2.0+incompatible ) require ( - github.com/felixge/httpsnoop v1.0.1 // indirect - golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect -) - -require ( - github.com/DATA-DOG/go-sqlmock v1.5.0 - github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect - github.com/cucumber/messages-go/v16 v16.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/elliotchance/pie/v2 v2.5.2 github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/gofrs/uuid v4.0.0+incompatible // indirect - github.com/google/go-cmp v0.5.9 + github.com/google/go-cmp v0.5.9 // indirect github.com/goph/emperror v0.17.2 // indirect - github.com/gorilla/handlers v1.5.1 - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-memdb v1.3.3 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect @@ -64,15 +51,16 @@ require ( github.com/spf13/afero v1.9.2 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.4.1 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.15.0 // indirect go.uber.org/multierr v1.8.0 // indirect + golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect golang.org/x/sys v0.1.0 // indirect golang.org/x/text v0.4.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools v2.2.0+incompatible ) diff --git a/go.sum b/go.sum index 43e55dcb..2e8b9d51 100644 --- a/go.sum +++ b/go.sum @@ -25,7 +25,6 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -45,26 +44,15 @@ github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030I github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc= github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/airbrake/gobrake v3.6.1+incompatible/go.mod h1:wM4gu3Cn0W0K7GUuVWnlXZU11AGBXMILnrdOU8Kn00o= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bmuller/arrow v0.0.0-20180318014521-b14bfde8dff2/go.mod h1:+voQMVaya0tr8p3W33Qxj/dKOjZNCepW+k8JJvt91gk= github.com/bugsnag/bugsnag-go v1.4.0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20190105021004-abcd57078448/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -74,29 +62,13 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/cucumber/gherkin-go/v19 v19.0.3 h1:mMSKu1077ffLbTJULUfM5HPokgeBcIGboyeNUof1MdE= -github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw= -github.com/cucumber/godog v0.12.5 h1:FZIy6VCfMbmGHts9qd6UjBMT9abctws/pQYO/ZcwOVs= -github.com/cucumber/godog v0.12.5/go.mod h1:u6SD7IXC49dLpPN35kal0oYEjsXZWee4pW6Tm9t5pIc= -github.com/cucumber/messages-go/v16 v16.0.0/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= -github.com/cucumber/messages-go/v16 v16.0.1 h1:fvkpwsLgnIm0qugftrw2YwNlio+ABe2Iu94Ap8GMYIY= -github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/ditrit/verdeter v0.3.2-0.20230118160022-0caba70148cd h1:r2NABj0IHkzEtp4ZGaKpWNxsWAhjQU4ezxyELvXObrk= -github.com/ditrit/verdeter v0.3.2-0.20230118160022-0caba70148cd/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= github.com/ditrit/verdeter v0.4.0 h1:DzEOFauuXEGNQYP6OgYtHwEyb3w9riem99u0xE/l7+o= github.com/ditrit/verdeter v0.4.0/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= github.com/elliotchance/pie/v2 v2.5.2 h1:jRENMmysCljhUmyT8ITKV0Atp6Lukm3XpeqaI87POsM= @@ -107,33 +79,23 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -169,7 +131,6 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -195,47 +156,12 @@ github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 github.com/goph/emperror v0.17.1/go.mod h1:+ZbQ+fUNO/6FNiUo0ujtMjhgad9Xa6fQL9KhH4LNHic= github.com/goph/emperror v0.17.2 h1:yLapQcmEsO0ipe9p5TaN22djm3OFV/TfM/fcYP0/J18= github.com/goph/emperror v0.17.2/go.mod h1:+ZbQ+fUNO/6FNiUo0ujtMjhgad9Xa6fQL9KhH4LNHic= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= -github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-memdb v1.3.0/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g= -github.com/hashicorp/go-memdb v1.3.3 h1:oGfEWrFuxtIUF3W2q/Jzt6G85TrMk9ey6XfYLvVe1Wo= -github.com/hashicorp/go-memdb v1.3.3/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -294,22 +220,14 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= @@ -324,46 +242,28 @@ github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61 h1:8HaKr2WO2B5XKEFbJE9Z7W8mWC6+dL3jZCw53Dbl0oI= github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61/go.mod h1:WboHq+I9Ck8PwKsVFJNrpiRyngXhquRSTWBGwuSWOrg= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= @@ -375,61 +275,34 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rollbar/rollbar-go v1.0.2/go.mod h1:AcFs5f0I+c71bpHlXNNDbOWJiKwjFDtISeXco0L5PKQ= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -447,19 +320,15 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -490,7 +359,6 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -544,10 +412,6 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -598,13 +462,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -665,14 +525,12 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -686,7 +544,6 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -814,28 +671,20 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 00000000..ea9222b5 --- /dev/null +++ b/go.work.sum @@ -0,0 +1,527 @@ +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= +github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= +github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/api/v3 v3.5.6/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.6/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= +go.etcd.io/etcd/client/v2 v2.305.6/go.mod h1:BHha8XJGe8vCIBfWBpbBLVZ4QjOIlfoouvOwydu63E0= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/etcd/client/v3 v3.5.6/go.mod h1:f6GRinRMCsFVv9Ht42EyY7nfsVGwrNO0WEoS2pRKzQk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/mocks/configuration/HTTPServerConfiguration.go b/mocks/configuration/HTTPServerConfiguration.go index f70cf767..ffb21116 100644 --- a/mocks/configuration/HTTPServerConfiguration.go +++ b/mocks/configuration/HTTPServerConfiguration.go @@ -15,6 +15,20 @@ type HTTPServerConfiguration struct { mock.Mock } +// GetAddr provides a mock function with given fields: +func (_m *HTTPServerConfiguration) GetAddr() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + // GetHost provides a mock function with given fields: func (_m *HTTPServerConfiguration) GetHost() string { ret := _m.Called() diff --git a/persistence/models/dto/ProductInfo.go b/persistence/models/dto/ProductInfo.go deleted file mode 100644 index 988650ea..00000000 --- a/persistence/models/dto/ProductInfo.go +++ /dev/null @@ -1,9 +0,0 @@ -package dto - -// Data Transfert Object Package - -// Describe the Server Info payload -type DTOBadaasServerInfo struct { - Status string `json:"status"` - Version string `json:"version"` -} diff --git a/resources/api.go b/resources/api.go deleted file mode 100644 index ddea375f..00000000 --- a/resources/api.go +++ /dev/null @@ -1,4 +0,0 @@ -package resources - -// Version of Badaas -const Version = "UNRELEASED" diff --git a/router/ModuleFx.go b/router/ModuleFx.go index a9f9d763..e5561dc2 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -8,12 +8,10 @@ import ( // RouterModule for fx var RouterModule = fx.Module( "router", + fx.Provide(NewRouter), // middlewares fx.Provide(middlewares.NewJSONController), fx.Provide(middlewares.NewMiddlewareLogger), - fx.Provide(middlewares.NewAuthenticationMiddleware), - - // create router - fx.Provide(SetupRouter), + fx.Invoke(middlewares.AddLoggerMiddleware), ) diff --git a/router/middlewares/JSONHandler.go b/router/middlewares/JSONHandler.go deleted file mode 100644 index 30ecf9c1..00000000 --- a/router/middlewares/JSONHandler.go +++ /dev/null @@ -1,10 +0,0 @@ -package middlewares - -import ( - "net/http" - - "github.com/ditrit/badaas/httperrors" -) - -// This handler return a Marshable object and/or an [github.com/ditrit/badaas/httperrors.HTTPError] -type JSONHandler func(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) diff --git a/router/middlewares/middlewareJson.go b/router/middlewares/middlewareJson.go index 1abe0343..eb64c03a 100644 --- a/router/middlewares/middlewareJson.go +++ b/router/middlewares/middlewareJson.go @@ -8,6 +8,9 @@ import ( "go.uber.org/zap" ) +// A JSONHandler is a function that returns a Marshable object and/or an [github.com/ditrit/badaas/httperrors.HTTPError] +type JSONHandler func(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + // transform a JSON handler into a standard [http.HandlerFunc] // handle [github.com/ditrit/badaas/httperrors.HTTPError] and JSON marshaling type JSONController interface { @@ -27,7 +30,8 @@ func NewJSONController(logger *zap.Logger) JSONController { return &jsonControllerImpl{logger} } -// Marshall the response from the JSONHandler and handle HTTPError if needed +// Transforms a JSONHandler into a standard [http.HandlerFunc] +// It marshalls the response from the JSONHandler and handles HTTPError if needed func (controller *jsonControllerImpl) Wrap(handler JSONHandler) func(response http.ResponseWriter, request *http.Request) { return func(response http.ResponseWriter, request *http.Request) { object, herr := handler(response, request) diff --git a/router/middlewares/middlewareLogger.go b/router/middlewares/middlewareLogger.go index 00f436ad..5d184b71 100644 --- a/router/middlewares/middlewareLogger.go +++ b/router/middlewares/middlewareLogger.go @@ -5,11 +5,16 @@ import ( "net/http" "github.com/ditrit/badaas/configuration" + "github.com/gorilla/mux" "github.com/noirbizarre/gonja" "github.com/noirbizarre/gonja/exec" "go.uber.org/zap" ) +func AddLoggerMiddleware(router *mux.Router, middlewareLogger MiddlewareLogger) { + router.Use(middlewareLogger.Handle) +} + // Log the requests data type MiddlewareLogger interface { // [github.com/gorilla/mux] compatible middleware function diff --git a/router/router.go b/router/router.go index d6164ad8..24039d72 100644 --- a/router/router.go +++ b/router/router.go @@ -1,67 +1,10 @@ package router import ( - "net/http" - - "github.com/ditrit/badaas/controllers" - "github.com/ditrit/badaas/router/middlewares" - "github.com/gorilla/handlers" "github.com/gorilla/mux" ) -// Default router of badaas, initialize all routes. -func SetupRouter( - //middlewares - jsonController middlewares.JSONController, - middlewareLogger middlewares.MiddlewareLogger, - authenticationMiddleware middlewares.AuthenticationMiddleware, - - // controllers - basicAuthenticationController controllers.BasicAuthenticationController, - informationController controllers.InformationController, - eavController controllers.EAVController, -) http.Handler { - router := mux.NewRouter() - router.Use(middlewareLogger.Handle) - - router.HandleFunc( - "/info", - jsonController.Wrap(informationController.Info), - ).Methods("GET") - router.HandleFunc( - "/login", - jsonController.Wrap( - basicAuthenticationController.BasicLoginHandler, - ), - ).Methods("POST") - - protected := router.PathPrefix("").Subrouter() - protected.Use(authenticationMiddleware.Handle) - - protected.HandleFunc("/logout", jsonController.Wrap(basicAuthenticationController.Logout)).Methods("GET") - - // Objects CRUD - objectsBase := "/objects/{type}" - objectsWithID := objectsBase + "/{id}" - router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.GetObject)).Methods("GET") - router.HandleFunc(objectsBase, jsonController.Wrap(eavController.GetObjects)).Methods("GET") - router.HandleFunc(objectsBase, jsonController.Wrap(eavController.CreateObject)).Methods("POST") - router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.UpdateObject)).Methods("PUT") - router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.DeleteObject)).Methods("DELETE") - - cors := handlers.CORS( - handlers.AllowedMethods([]string{"GET", "POST", "DELETE", "PUT", "OPTIONS"}), - handlers.AllowedHeaders([]string{ - "Accept", "Content-Type", "Content-Length", - "Accept-Encoding", "X-CSRF-Token", "Authorization", - "Access-Control-Request-Headers", "Access-Control-Request-Method", - "Connection", "Host", "Origin", "User-Agent", "Referer", - "Cache-Control", "X-header", - }), - handlers.AllowedOrigins([]string{"*"}), - handlers.AllowCredentials(), - handlers.MaxAge(0), - )(router) - - return cors +// Router to use in Badaas server +func NewRouter() *mux.Router { + return mux.NewRouter() } diff --git a/router/router_test.go b/router/router_test.go deleted file mode 100644 index 36430ab5..00000000 --- a/router/router_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package router - -import ( - "net/http" - "testing" - - controllersMocks "github.com/ditrit/badaas/mocks/controllers" - middlewaresMocks "github.com/ditrit/badaas/mocks/router/middlewares" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" -) - -func TestSetupRouter(t *testing.T) { - jsonController := middlewaresMocks.NewJSONController(t) - middlewareLogger := middlewaresMocks.NewMiddlewareLogger(t) - authenticationMiddleware := middlewaresMocks.NewAuthenticationMiddleware(t) - - basicController := controllersMocks.NewBasicAuthenticationController(t) - informationController := controllersMocks.NewInformationController(t) - eavController := controllersMocks.NewEAVController(t) - jsonController.On("Wrap", mock.Anything).Return(func(response http.ResponseWriter, request *http.Request) {}) - router := SetupRouter(jsonController, middlewareLogger, authenticationMiddleware, basicController, informationController, eavController) - assert.NotNil(t, router) -} diff --git a/router/routes.go b/router/routes.go new file mode 100644 index 00000000..aae67ca1 --- /dev/null +++ b/router/routes.go @@ -0,0 +1,87 @@ +package router + +import ( + "strings" + + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/controllers" + "github.com/ditrit/badaas/router/middlewares" + "github.com/ditrit/badaas/services/userservice" + "github.com/gorilla/mux" + "go.uber.org/zap" +) + +func AddInfoRoutes( + router *mux.Router, + jsonController middlewares.JSONController, + infoController controllers.InformationController, +) *mux.Router { + router.HandleFunc( + "/info", + jsonController.Wrap(infoController.Info), + ).Methods("GET") + + return router +} + +// Adds to the "router" the routes for handling authentication: +// /login +// /logout +// And creates a very first user +func AddLoginRoutes( + logger *zap.Logger, + router *mux.Router, + authenticationMiddleware middlewares.AuthenticationMiddleware, + basicAuthenticationController controllers.BasicAuthenticationController, + jsonController middlewares.JSONController, + config configuration.InitializationConfiguration, + userService userservice.UserService, +) error { + router.HandleFunc( + "/login", + jsonController.Wrap(basicAuthenticationController.BasicLoginHandler), + ).Methods("POST") + + protected := router.PathPrefix("").Subrouter() + protected.Use(authenticationMiddleware.Handle) + + protected.HandleFunc( + "/logout", + jsonController.Wrap(basicAuthenticationController.Logout), + ).Methods("GET") + + return createSuperUser(logger, config, userService) +} + +// Create a super user +func createSuperUser( + logger *zap.Logger, + config configuration.InitializationConfiguration, + userService userservice.UserService, +) error { + _, err := userService.NewUser("admin", "admin-no-reply@badaas.com", config.GetAdminPassword()) + if err != nil { + if !strings.Contains(err.Error(), "already exist in database") { + logger.Sugar().Errorf("failed to save the super admin %w", err) + return err + } + logger.Sugar().Infof("The superadmin user already exists in database") + } + + return nil +} + +func AddCRUDRoutes( + router *mux.Router, + eavController controllers.EAVController, + jsonController middlewares.JSONController, +) { + // Objects CRUD + objectsBase := "/objects/{type}" + objectsWithID := objectsBase + "/{id}" + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.GetObject)).Methods("GET") + router.HandleFunc(objectsBase, jsonController.Wrap(eavController.GetObjects)).Methods("GET") + router.HandleFunc(objectsBase, jsonController.Wrap(eavController.CreateObject)).Methods("POST") + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.UpdateObject)).Methods("PUT") + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.DeleteObject)).Methods("DELETE") +} diff --git a/commands/init_test.go b/router/routes_test.go similarity index 99% rename from commands/init_test.go rename to router/routes_test.go index 1966506d..17cb83b6 100644 --- a/commands/init_test.go +++ b/router/routes_test.go @@ -1,4 +1,4 @@ -package commands +package router import ( "errors" @@ -22,8 +22,8 @@ func TestCreateSuperUser(t *testing.T) { On("NewUser", "admin", "admin-no-reply@badaas.com", "adminpassword"). Return(nil, nil) err := createSuperUser( - initializationConfig, logger, + initializationConfig, userService, ) assert.NoError(t, err) @@ -39,8 +39,8 @@ func TestCreateSuperUser_UserExists(t *testing.T) { On("NewUser", "admin", "admin-no-reply@badaas.com", "adminpassword"). Return(nil, errors.New("user already exist in database")) err := createSuperUser( - initializationConfig, logger, + initializationConfig, userService, ) assert.NoError(t, err) @@ -58,8 +58,8 @@ func TestCreateSuperUser_UserServiceError(t *testing.T) { On("NewUser", "admin", "admin-no-reply@badaas.com", "adminpassword"). Return(nil, errors.New("email not valid")) err := createSuperUser( - initializationConfig, logger, + initializationConfig, userService, ) assert.Error(t, err) diff --git a/test_e2e/go.mod b/test_e2e/go.mod new file mode 100644 index 00000000..7a1b2148 --- /dev/null +++ b/test_e2e/go.mod @@ -0,0 +1,75 @@ +module github.com/ditrit/badaas/test_e2e + +go 1.18 + +require ( + github.com/Masterminds/squirrel v1.5.3 + github.com/cucumber/godog v0.12.5 + github.com/ditrit/verdeter v0.4.0 + github.com/google/uuid v1.3.0 + github.com/gorilla/mux v1.8.0 + github.com/jackc/pgconn v1.13.0 + github.com/magiconair/properties v1.8.6 + github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61 + github.com/spf13/cobra v1.5.0 + github.com/spf13/pflag v1.0.5 + github.com/spf13/viper v1.13.0 + github.com/stretchr/testify v1.8.1 + go.uber.org/fx v1.18.2 + go.uber.org/zap v1.23.0 + golang.org/x/crypto v0.1.0 + gorm.io/driver/postgres v1.4.5 + gorm.io/gorm v1.24.1 + github.com/DATA-DOG/go-sqlmock v1.5.0 + github.com/elliotchance/pie/v2 v2.5.2 + gotest.tools v2.2.0+incompatible + github.com/gorilla/handlers v1.5.1 +) + +require ( + github.com/felixge/httpsnoop v1.0.1 // indirect + golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect + github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect + github.com/cucumber/messages-go/v16 v16.0.1 + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/gofrs/uuid v4.0.0+incompatible // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/goph/emperror v0.17.2 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-memdb v1.3.3 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.1 // indirect + github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect + github.com/jackc/pgtype v1.12.0 // indirect + github.com/jackc/pgx/v4 v4.17.2 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect + github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/stretchr/objx v0.5.0 // indirect + github.com/subosito/gotenv v1.4.1 // indirect + go.uber.org/atomic v1.10.0 // indirect + go.uber.org/dig v1.15.0 // indirect + go.uber.org/multierr v1.8.0 // indirect + golang.org/x/sys v0.1.0 // indirect + golang.org/x/text v0.4.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/test_e2e/go.sum b/test_e2e/go.sum new file mode 100644 index 00000000..2cea577f --- /dev/null +++ b/test_e2e/go.sum @@ -0,0 +1,855 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc= +github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/airbrake/gobrake v3.6.1+incompatible/go.mod h1:wM4gu3Cn0W0K7GUuVWnlXZU11AGBXMILnrdOU8Kn00o= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bmuller/arrow v0.0.0-20180318014521-b14bfde8dff2/go.mod h1:+voQMVaya0tr8p3W33Qxj/dKOjZNCepW+k8JJvt91gk= +github.com/bugsnag/bugsnag-go v1.4.0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20190105021004-abcd57078448/go.mod h1:GJKEexRPVJrBSOjoqN5VNOIKJ5Q3RViH6eu3puDRwx4= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cucumber/gherkin-go/v19 v19.0.3 h1:mMSKu1077ffLbTJULUfM5HPokgeBcIGboyeNUof1MdE= +github.com/cucumber/gherkin-go/v19 v19.0.3/go.mod h1:jY/NP6jUtRSArQQJ5h1FXOUgk5fZK24qtE7vKi776Vw= +github.com/cucumber/godog v0.12.5 h1:FZIy6VCfMbmGHts9qd6UjBMT9abctws/pQYO/ZcwOVs= +github.com/cucumber/godog v0.12.5/go.mod h1:u6SD7IXC49dLpPN35kal0oYEjsXZWee4pW6Tm9t5pIc= +github.com/cucumber/messages-go/v16 v16.0.0/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= +github.com/cucumber/messages-go/v16 v16.0.1 h1:fvkpwsLgnIm0qugftrw2YwNlio+ABe2Iu94Ap8GMYIY= +github.com/cucumber/messages-go/v16 v16.0.1/go.mod h1:EJcyR5Mm5ZuDsKJnT2N9KRnBK30BGjtYotDKpwQ0v6g= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/ditrit/verdeter v0.4.0 h1:DzEOFauuXEGNQYP6OgYtHwEyb3w9riem99u0xE/l7+o= +github.com/ditrit/verdeter v0.4.0/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= +github.com/elliotchance/pie/v2 v2.5.2 h1:jRENMmysCljhUmyT8ITKV0Atp6Lukm3XpeqaI87POsM= +github.com/elliotchance/pie/v2 v2.5.2/go.mod h1:18t0dgGFH006g4eVdDtWfgFZPQEgl10IoEO8YWEq3Og= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/goph/emperror v0.17.1/go.mod h1:+ZbQ+fUNO/6FNiUo0ujtMjhgad9Xa6fQL9KhH4LNHic= +github.com/goph/emperror v0.17.2 h1:yLapQcmEsO0ipe9p5TaN22djm3OFV/TfM/fcYP0/J18= +github.com/goph/emperror v0.17.2/go.mod h1:+ZbQ+fUNO/6FNiUo0ujtMjhgad9Xa6fQL9KhH4LNHic= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= +github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.0/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g= +github.com/hashicorp/go-memdb v1.3.3 h1:oGfEWrFuxtIUF3W2q/Jzt6G85TrMk9ey6XfYLvVe1Wo= +github.com/hashicorp/go-memdb v1.3.3/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= +github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= +github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= +github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= +github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= +github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= +github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61 h1:8HaKr2WO2B5XKEFbJE9Z7W8mWC6+dL3jZCw53Dbl0oI= +github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61/go.mod h1:WboHq+I9Ck8PwKsVFJNrpiRyngXhquRSTWBGwuSWOrg= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rollbar/rollbar-go v1.0.2/go.mod h1:AcFs5f0I+c71bpHlXNNDbOWJiKwjFDtISeXco0L5PKQ= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= +github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/dig v1.15.0 h1:vq3YWr8zRj1eFGC7Gvf907hE0eRjPTZ1d3xHadD6liE= +go.uber.org/dig v1.15.0/go.mod h1:pKHs0wMynzL6brANhB2hLMro+zalv1osARTviTcqHLM= +go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= +go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= +go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 h1:ba9YlqfDGTTQ5aZ2fwOoQ1hf32QySyQkR6ODGDzHlnE= +golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc= +gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg= +gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.24.1 h1:CgvzRniUdG67hBAzsxDGOAuq4Te1osVMYsa1eQbd4fs= +gorm.io/gorm v1.24.1/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go new file mode 100644 index 00000000..c5281a66 --- /dev/null +++ b/test_e2e/test_api.go @@ -0,0 +1,109 @@ +package main + +import ( + "context" + "net" + "net/http" + + "github.com/ditrit/badaas" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/router" + "github.com/ditrit/verdeter" + "github.com/gorilla/handlers" + "github.com/gorilla/mux" + "github.com/spf13/cobra" + "go.uber.org/fx" + "go.uber.org/fx/fxevent" + "go.uber.org/zap" +) + +var rootCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "badaas", + Short: "Backend and Distribution as a Service", + Long: "Badaas stands for Backend and Distribution as a Service.", + Run: runHTTPServer, +}) + +func main() { + badaas.ConfigCommandParameters(rootCfg) + + rootCfg.Execute() +} + +// Run the http server for badaas +func runHTTPServer(cmd *cobra.Command, args []string) { + fx.New( + // Modules + badaas.BadaasModule, + + // logger for fx + fx.WithLogger(func(logger *zap.Logger) fxevent.Logger { + return &fxevent.ZapLogger{Logger: logger} + }), + + // add routes provided by badaas + fx.Invoke(router.AddInfoRoutes), + fx.Invoke(router.AddLoginRoutes), + fx.Invoke(router.AddCRUDRoutes), + + // create httpServer + fx.Provide(NewHTTPServer), + + // Finally: we invoke the newly created server + fx.Invoke(func(*http.Server) { /* we need this function to be empty*/ }), + ).Run() +} + +func NewHTTPServer( + lc fx.Lifecycle, + logger *zap.Logger, + router *mux.Router, + httpServerConfig configuration.HTTPServerConfiguration, +) *http.Server { + handler := handlers.CORS( + handlers.AllowedMethods([]string{"GET", "POST", "DELETE", "PUT", "OPTIONS"}), + handlers.AllowedHeaders([]string{ + "Accept", "Content-Type", "Content-Length", + "Accept-Encoding", "X-CSRF-Token", "Authorization", + "Access-Control-Request-Headers", "Access-Control-Request-Method", + "Connection", "Host", "Origin", "User-Agent", "Referer", + "Cache-Control", "X-header", + }), + handlers.AllowedOrigins([]string{"*"}), + handlers.AllowCredentials(), + handlers.MaxAge(0), + )(router) + + srv := createServer(handler, httpServerConfig) + lc.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + ln, err := net.Listen("tcp", srv.Addr) + if err != nil { + return err + } + logger.Sugar().Infof("Ready to serve at %s", srv.Addr) + go srv.Serve(ln) + return nil + }, + OnStop: func(ctx context.Context) error { + // Flush the logger + logger.Sync() + return srv.Shutdown(ctx) + }, + }) + + return srv +} + +// Create the server from the configuration holder and the http handler +func createServer(handler http.Handler, httpServerConfig configuration.HTTPServerConfiguration) *http.Server { + timeout := httpServerConfig.GetMaxTimeout() + + return &http.Server{ + Handler: handler, + Addr: httpServerConfig.GetAddr(), + + WriteTimeout: timeout, + ReadTimeout: timeout, + } +} diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index a37cf27b..eed237c5 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -6,7 +6,7 @@ import ( "runtime" "testing" - "github.com/ditrit/badaas/commands" + "github.com/ditrit/badaas" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/logger" @@ -24,7 +24,7 @@ import ( var tGlobal *testing.T -var testsCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ +var testsCommand = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Run: injectDependencies, }) @@ -34,11 +34,11 @@ func TestAll(t *testing.T) { _, b, _, _ := runtime.Caller(0) basePath := filepath.Dir(b) viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) - commands.InitCommands(testsCfg) + badaas.ConfigCommandParameters(testsCommand) tGlobal = t - testsCfg.Execute() + testsCommand.Execute() } func injectDependencies(cmd *cobra.Command, args []string) { diff --git a/tools/badgen/Makefile b/tools/badgen/Makefile new file mode 100644 index 00000000..5eab73fe --- /dev/null +++ b/tools/badgen/Makefile @@ -0,0 +1,5 @@ +build: + go build . + +link: + ln -sf /home/user/ditrit/badaas/badaas/tools/badgen/badgen /home/user/go/bin/badgen \ No newline at end of file diff --git a/tools/badgen/README.md b/tools/badgen/README.md new file mode 100644 index 00000000..46409041 --- /dev/null +++ b/tools/badgen/README.md @@ -0,0 +1 @@ +# TODO diff --git a/tools/badgen/badgen b/tools/badgen/badgen new file mode 100755 index 0000000000000000000000000000000000000000..d30b776dd18e9aaa117a1a4e618e64d89816990e GIT binary patch literal 8825495 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

b0g~Lp;-b4w0 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%0A{LJ1 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¾>p2=8nF2{ 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

p*Y$j+AUyN7=X>*v!qk@Mhq6 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

  • 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 w+uoYfA8%7y+)tF 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

    k7nSDMeqND`Z{gZg9CZVN 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–M2ux2Hv&H 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�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

    >pD@rkKXvBtK-JT>*& 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 l6G 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¥nG_K&L4nj=ZvLasA#||%3fVmT*K|rVD_VLCo$@0 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

    =QUA3=UP^5z2Lw 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 _!G_=I)BL@I%LTSsewcbOfR;e_V5v+6{xW}h za=PX050pCF$9gNxp=!QMwm0XeQ#m=-J6$uqBPK zNA@ekx`*M_^kam4ow`WK^&%od?rH%FldMx5t7S3uz2p;yUGl-CNIP(*NS!4HNTSeH z$mMh6S|`c_>`g}#YUZvM9p!eTC)r;Xwl0>(^UD@B_LpNbM46a<)`+Q7E)(V1a#rec zxKncYo_K4!nK>iBe$@;?-`PI$)Hh7$$gd>eK`l4(4Wceea=sqF6Ks0@+g2~#vZ}LY zPR=gP7WBTHVK|Y{nKda8md{F}uVC6O$+s1qC1BhV85*yY%jM|;$Dw{j*fcx^_XcTh z6@G)7RE6Xj;yJynGPSh0`}-O**>QgA#t2u< zV|;NUR6oQbL~JRxJe#Fvwx3h#8-QJYCH+>9zQGV22j;5G*1%TBw)L2?&L9!;zn3kR zR0zmKH38(jOBMm((}*|(^Kxr|?@?qTBDpJaKXItB5(g_x9I(---$#QBx1CM8`1y@h zUbU<$S0ggkO1(~cYbA1q!Tc7iWxDCK2(AJW0rzSoB1bYGpc#bQZo72U@E`Y7PjcG$ zHtwzZ&CrSU25DV7aNz$V*$ayA>QZRa8J+4ku%Kk&g>CS2*2LrveGoqzH;|3μNA{2JGl8PCJLCoy9vj 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%0De16qGEvgIHW!F9-(JTAN%GU2Co}IgTm9C>9EO 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 e_M-pEFGWI%Sad%t&Joa9* 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≧Y7pzE8QQ%V=j{&c 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 z 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­=6=&@?yZO`JsRf& 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

    U+*qpn!Qx; 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

    yB2caaZ#lN_+m~Nufr>^(C_Bq1XI

    rgqhgNA3 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

    kP@>6@vV>` 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
    1`rUgYPTDukbQgPV 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
    3DVL3)`&gD)9(PPuS1_C8zB9!VFWv4F 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 z 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≠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

    ?027Db-EmsqVofd!JzfRV~g3ahPwBTZ!|pHxP; z3{%P7OACEdSX5**O5pa#M~LH7_7hw=6evxLuvVSIKxR^86b%PjjKf!E&w*{Y301|} zl2G-$ip&yyPxi+d*Mw}E_ShVnyhISEew1iv|sXAcuemy3~I9chu67=uAe zs`GGE2bO7QeCEkQefFknPwTM^N#pHgBlVWMmGS#Tk%Pqh$H2~-p?E{9VW5QRyL^g; zOB^VwUHmEVNAg+W4MyDNF#ngZS*Qo3kM`G1)B)V8y7y9%1J~yAI5YC93$vFr?ryxQ zgYy}0%tFa5={{7M@Ya&l<3l7O;}FN)2pvW~ISkEM$xh5WcogubQr4k@Y#+SZ5IXMu zD%_+4<*#s7LI0jk%{kPHHsM75m*Vzi+uA{`So%5~viw-y-<;JCi~G~u6)W;4&JpBE zGWF#D%yQ4=NhW^x=wy`BHjos){(|9sz{Yp;HXy2%>OOD$JjDv366JF_AVGL2KY0rl z;B8E1w`qN3lVP=P%K?0RztAU*RF&z%Kq4%d@BLNIS@)_6E`F$pTs~yCsfPF4-pMso z9iDqWp)-$6U$ptg$8&j{oR|UYU9JC5r%plmU0caOV05+3Anw7o+gIn4iMNMRGquH> zGuT%%Zj<)%RPuZ-V_iE&lUd}WxFJRAA%+c=WW4yfgCVxrXO;r{DzBHH+Q&Zidhw&V zuAv<|F5imv7;@QLXL2{n`GK>{@2&7jQgbQ>;vn1rmvb*%-$GobAlsx;UdD=)%|*to z>rJTb0@V@o4H#rb`$DUWxZ(OB(YAj*1OmT5QMM{XcS!Ls}n@Z#E{1Q96wz)srZQl3Du%6ijf#$R^0UCth_3x@~ z^Sj2%ZUo)>PXRp3>g#0@g>^H8$0|v*<`pKUwqyNT?PmRU_F$$v{E)v?b|&-TPtEQ9 zg|oHnuwm>c*O5m~?X@m#EBvTMXG~u5MWW*Lkm8C)(#za?)8J%A<%tu@)5f`b#RDuV z`e7@4ivJ{G^->dQKD2d~lc40puiplC)!30AAxw{3ip|uCOtn(pt)M*DFi^@?Oc;b| zc!0bk?~`H+ev1rHMOwY-Irv~UQE_jU0Y;EzGSL31-&gb_F~WU?hAGx_H5bRnQRjOQeMk( zl=614W&Xk6PwhxQdn+& zA|(G|8SnWfr1t7HU_E}V9ep6k7bgNW*0(xC=c)9qct@R_#{V{W4vE)kC*%fWa4#RK|Tb4+}-gC)$UOr_{>_2DPVUoCd7t4s1{ zx*$rSSA28)&dG$)zOB7p|9&jP!%Y4?cofXrb`IgHDbM-S+LMn3F4}N{M!&@l;SjH0 zeI^SXdtxwk{*|cG=O>$J^$(a<6@M=cHuve>_y`7F^1)iACznrU9De4XhdpuFI{!;~ z_~{cBTG4wjm|@xHJ{)Vd?5`QIh_`7ja<-NobVfJvV_KaCBtV9Ko~QIP_0JQ3T2~@0 zyvMOOBfZK7;=Kh{ZQm;Io6mTLsiL*EkE%BQ|4oLM3l!=K>M?aj4O1cMAnpaIKVFF+ zt$%q`!F`WbrTaYt@{Gj%m9ZPYQq?wUS+dagM_EyBuO&*3Fxx0nG%tMqL3BK)^rcX< zi%3XEI!)YxPV24CZK5Fnwx@J70fQ)P9L0UoQq4T-QAU!p!>uu~H2oFe_fqL3Li;d> zeRYqOE=Rx0hP!k)4)Jb>ZCUzQdhDB1;tXXJcx{36{it02%56f4B_4r`4wZ^cWUbGL zxZyYK(L}S0V!9T=7tXKcu<C<*>71ofu3M7^J(L=2yvzh%|33@7%M`4v)%R>KO zZM5hI`B8>$;+PRUYPPY*g+HpT5+6J3b9NkMgy?3OAEIkt3j3_+1TMHrt2x%=Gt;;J zcvQH&Xv_E$hoAy-%nr5{J?FPpTUfM7whvzfa35Z-em%O!^=0WAgDHB(I5r2s`ag@3 zE6pBD_>>Ndl2ONDW+glpKHY`75dds?t3Av`{=W7JsQnuKC0-@faQi}VZXeSZnZ%%~R@c~&eE z1a;L$8&%v-LvgZ5xJ8XOER&z4_^END$F9@9cFUxx$GXVAmv-^8-JxY;SOZO% zuhM>MJZDuH5LhHAfB~ zY+Q}lGD-DhX-?jplJv%1Ix@k9`1{%YcWa6zvH7C=0&iEOV zH{yL)Qpd@P0*?d7-@=BUT_mIQo2l{Og8D~Y*4H?M9K46#JZnI=Wz1=SCXG3c29`e9 z$fA`yT};h`AbSFR9Mt;@8Z*9ne;`VS1ayS;gA z9~pca{*fT|BF4*AeF}gQ0QB|C#r^}kX&BfaHsMa zlZ0a*Iz4~*v4K#5|Q`zKOR^%*$lXA54V`pK*VN$X7RGh=C#ijRuUVOAPe zg~Y$wPdiB17oN#NnWguXv~K#Dh*5k{*^2#6;70Y{J{BvLg2Y z(q+0M9+e{+7fRrZm@GO128mSy-tZ^UQg8xTUk(Z0bx%>YM}LOWE0^L=oIo*OZo52! z!lsm*hw(?BuUU%}IIWt4=TOBIFnp`5XVfQ>GDl2zbiLayDVc_Eav`>c4o%e_DrEK! zDh>6l@DlS{KfBIi8*rJiqY29 z3%t&QLQKDWOFs06d3gMqAUuB5EBtouBrU{RKVvsp7P5ww!>gWL{$VvwerJKHv5=|1 zFnpI~QV+t+j~qUs`U{a5qmfD~F=+uH>``7gHAdupG3Q^pnkk6ZN6zPw9xm#5aYOU= zyLC24vR3nVo`&uxwOwPXHG6^}^55iu>_Ab94zvKVhdwr>-Kp}#Kh=w|d_vY$re0=f zeqC$sd<5chHkQ_21ArYFKInhQ6{tp{Nb?c@ouT~H5e^T064IF=q?xqv=uKCteB|3) zXpYz0t(s`ZXa||`qz%N=izo?vo3VOAVhQB!Lj{ul81jOf{fXZCaRd%IugL&P>YW>T zNg@Z|$TJ$o@uAj@il+UL+$qEC0L(EEi^y4x=cL+9t@uw4liBYsA*9x;5 z3Xa{MrOjl)CJNCmfAk(?IoYzZ5)VOd}h%#+lj1I<-% z4il!b9ggWEg@sa)N3uXH!P)S3YprjK*PT_WGTDriLk7 zuDA2x=jIyFWP%wj(6!P9G*3U!`9AOzp!dRx715(;^^pHU5JT{l93y(t$hRL1VAc4@ z2UBM?EX#wriP*7JD}nebf6S}-s1Hht{WG?BJh&P7-7zvE*zkq7Z4aXBG5^Tq*2<2X zU$B_{snw(jQvw7YJGiu)-CzqXcz;-%?}@Y!eE>jFc_#>EvnpbXkKiq~Lxkt|% zZniiY?*a08NJ9+@6WhL06e{u=ca)zAPc#2JfsJwUoabYZrxKl>Yv!wZw8W4=CD%+VFz*B~tAetrBFuS3;c zlr?)okKH3Umv*0zgEZuGGFDe|Br2I`+FE)NJQGrWivRZ%4W#x}h;UN72RGJW#OW9( zOU21u-#zZ%OEl4e@r+UOCa2=WhZ1kbbK~BJ&VLJQ^fwFlTT|En3S!a*vOv)0uIRIP z6KX!xzd9Pa^AX^pO4Ar8XNw{twm+C{H)=p_yD|6q`VatJN6R z`aSHOJIp^n0;IYim_?%<4HQ=`R$dl=K@S;qb?r>?Vb?pW(k;uFqdS|C?#y=)=uqTq%y{*pT zOKKUE`mGXui&8OvfB8T|OJQgeAsRpg?*9slJ#uKa{s1&xR;B&j;ehNEw}ZBSnI*4r zlcGO)rh$@Nrxv+|5tDT|EZX#h0$A$zd>qw7zM1C|j7ovc1dFi*fJfIDn9GLPg5@?A zQqi|0hAkE<$qtTAiXIL%-%=A*90!-^LQ>0Y)lqTegc_ozyL&nRHZ+uxy?==${HI#! z3qOYQ?aDOVIDMi|8t2CV7V) zo&(A`_4(&Nd6dqb1dl|v;*t_WO59g50#}W46|zS|yN>4!I~+(rQDGUSt%Y$32Te0} z1Df(@#$n=XslYAC$mB4EnE8L!U;Y#Hy;U@`|w2~!5Pw}UhKY~>`Gmm3i#qM zNUd*ZKMZnNk9Txw1ueU*8{gA6?>TdfJ1IILj~W8Z)qom&O>`l@}TP)0LD){4}DX)p(TCvvFTnd0)IN9eXr@;lAJV z3c|$yxnM^ox`|pWFULekDW<9LRH&JHjM#2i?xohY0YrSr|GCtm>`+VMNDxra>WQI( zjyxa@s{PV2qHg(hLD8(HQ*4OcVHfw{G_*Yn;3h=+$cP{0=L+Kk@7q~6lp3HPV`5-py0Td+QKj@(O)TspYGJ@bY!RJwff#>H9%7iEb?VZY7AB4` znPii1^}2Fq%GRw)o%F4d-bCSCf26RX14;=l49d7#h``n+q&c5;_q?BM3min3C|$zJ zxDn2uuJ2xpuRbWS`0X9a1nUWQyDzu!0ROEYF5|t>>dIB3#-HSrUtlWU)$EU|7ed%R zZ2A+mrjIubY-R4Uw_F>kBs66=XP^WHw=-e`-7_uPXahhe+6sAu+VuU8+vnh5>ATaY zp8C(R-s9Y1KTj^nK974pg}Tqx1l@Ge%LsoTaKk?|Y7iOt^{s|HlAAFlD7CT1F&WSN zh$L*j;uQ_Q$6!gb(p<2M8cO>XJx`3^%(|2B)#|(p+=|%~xJ|U;Zi(qXk^H^BH849D z0UQ7F6f`!7)H4?HoqwxG^7m_@^wkz&wg?=PF>?%-#0T<^Rqi;bwEyo;As}4bW84S1 z_<^K*0-3-TG4tuhE5EZL6P9_5!6j=)#k*#XfC(`&if2hE+YYivA7N;3EF{=vLM+#W z9c+V~XJTC#4T3?}v_Ls+(-#LiL2Y%uQVY7-Q;Vs>I#R)$XzLi69fnT3WuIETzXI&& z^kzvLCaK7Yn_5^up4{0#*79-A;-d`L+Y3oq)HgmIh1JNIM1_C z$(97;U~j6I+%1?f!&;+#IDZ{enF@v7q6OwAYAjoIksc zTCNzF(<3t)`^sG`svOOZ(CEmYZTTF0B{GG{OEc^@`fqL+^>SCBgZ3B9>(4EM?1YSn zhL_c26@xC}(6ww1mSe|0@$fg|!m3|Eb*gdKxcvR%_R4#*;fV`-zAAB57J!|Sj%3p@ zw(}8cDOxh#PdjxMd=zAw_I*Ed^!s5!>unyy6YNkuDWnzpnQYJnGt6I4xMOtUnAQHc zvfH#YILbUsQ56elkZz(iYXz--ORVbp_-h=eZU&E7w1PinY!n%I6KNOeo76H1OI#lu zAsXjEXn-+HFSTW4^kux|)-kf1FF%&X)G0_(-(f^TypjUt#au4zYnc{k_hn*7VvDECZD>;oZ zuKl?rTtT;;@<{d3@2vHXofjASh5=bBX7;?cSo@3;gOrDIzLgt`o$osJeI(T$!Ofzl zcSZ1k- zd8S1_0CM3!!3?&!^-!Q>yhiBN7>AUo|9qUj#o3Wnu1(IqCn*``*5wN63n2`%*>UZ^ z?RAlZ*LFHDZcA53G+7ut4j-*gXRP{A5f}B=_)oYU%mB)vFzu~)dCh$cuH40<;{pKHe1%X$YbwD2+jM(tKcv%fXhoNYlmi`ArH#8@AFFN#%d= z{CAiV{R}RUS4cidJj&=hQIW=WQculE?UJitFVD1ADt?#XQU51?@~*8WaaP)9ozucU zXhgQ&KKAt+hWFKOyJnC~)K1;ch*lXm)6yGLVvq2kPDKxouX##$rJj!h2qh{;cmu)I z^e$G*GJjU!z4B^0v?1N_bi=qrAy+@F-~C9V|E;vmWoKDW_MgUKyYk{&+C2HWFpo3) ziPfs5=y3#p>H%HHjn!#>LF3ez!RqP zizE{6syFl4l{w*!=cOg-;`RsKe046yMgUqr%yrn zTOulZHC!X@p-k*qo{?-4UO^1+CO`F5gX08J*hE%Y+gX1Xr7RG?_aFS>iYt=2`~{t3 ztc_u9rv5op1YLN6mZa!8le=p0Zt`-mGU1w9b*>#1WJ{H_a&+;mw3`<2N2MtftG#X# z|05PTcO5`_3LZ*d!Psjr+NAk%@i|40ax}6ImajLkvtlmM8qwk_F_m3S8plE!j5ze2 zuY$~U7C}!{aYR?5w6yfx%dG}<&C?3H@?i9*8U;(#*jN0L)$hjMk5$IlAxz74YPAw0 zmI(FJ)-xowmPnKgOua_l8kIX$M5;9?ZW;}P<^D<9St_y4AYe+IJ+CNoew)-){R)B` zJd-Q=MFsP8pR7xaOfM-0@uAA>lS_AGF!u20LmVGe)mt#Z^l)(j@C5MFCzbTQThN;! z6zR=jk9PTkG`XQTpPg`-yf;o0__lyV^j(#LqQu4oxz3f77F9Aa(V>*ZD@X;O{D{G1 zx94fqywaQqJ4cp)JhmjscltAh675q{()MDJw>0=4!h$7G3<%&Q7 z$p`W4Rlb#LYG9^EThl>v#aF4hf&`MCOr&DYxGb(PxR4M2(HDhmXylTi-Ut0QEqJi+ zK@s`iiQruPf2;g~0OO3^aZjHgE$7f&yO>2~|2UXmk)%lXF29lk1^BFLUlGHWXB0BF|ZTAW34>EuHBGXZg;!6VXzYmWRKBp!4UWZS@ z9RA?Y@~(&&IqJ)VEwQ%u}~cqMCfSqH|9Aq zTE?#U)mn3J)qgSn8KMX&dVV&GH|~aWr>y~PbkqoGAo~29OMyjoro=T+(MECh&z?DG z2<#U*1X8C(>Y~xV*XCN;R$FiyQb9{-7Q!6w5Mb8(P_eR%6!mM82;&?C4aYyVwDf)8 zknHt_|A`zT>Xyy928M3=mq%MN_~f*#Lvxuc3JUfD*5Ab;=xcfA6jbhVs$(=BODM@HI^ znlGnMWSFBlMYsrm#vny36c&c}%{~1ZqL}Q;&ZpePXPpSD6e-lkZr?sHarVxjVAv{*=&!Zt8sf$ z(7?8^h992>sy`dLyvXZPW4yLugj2qx<1(S($P2(yjT@s1a}FUCL_^Ep^Khm)uy5P6bo0e2=+g9DG; zuZq8e_c648b!%{ia|?+h6&NbAk*n#*tzE;cRY}gecreKQ9}0vg?n(s6w*dycE*D~i zt-?m8`XE0sn*Q2!{2YMZpWXQ-ZdpF~>?4O)lhELjn z^}^jKrQGyRt-jv=ENc^3U)(%rM8)y!6}dh)j2kbW$%0}o9})lZ`R9Hi{$<)0skkPg zn?390^T~A6eQx?k34;2;hR%O_`eUg6pNo6d)P`?SfGq)RYn&t(4!;f7gB=?llM-KU z;Ac_ObM%odtd4SKH0S(?9R^DHAsw9IV*$j&U{;>wqO?+BB0?L9B6esf^h8^dV4ez; z1VH1n|3mjbpf!SG-hs~L+9LtRCfEtiAt!JM{V54ESpbqkXktc$6Ht@nrqLg24^7;a{TPz(knECzTdy!n<-b6a%DZt;pTUfzOVK`MsSFB`eD z0V83u|9Wtf6IK2VODRPqCF?(Q>0wz{H|&95roR<|s<&hC7@7H>L}sXV>;!I;u=C5a zipvRMuW1(Pxba)HBLSO68%p*OZIyZuOZQIplYNz{KEb9X(W;c}OOL=czepQ@4kk&J zSUXPJ%+W~9B8^2EIa{@UV&>2vTwHW~onrn6Y8C13P$8eb8w|0p z-EI)Z`SmXxQ@SzXq~cTcV<@`*57DjP)qfF52)eQD+Fgr4c61)tz`c_B=I37xd%F1~ zs>GO&WyOBR!Jv2k5a{5C1nV6-3T{g~17L^7P{-hs60OuwozkV$8_se7`X zY!QH8#rD`FhJ@7&4_hT*$0$QTTal+1{Ja>gigm5QwE$t^m85gxV zEK~G$)h#U8h&Hwv+mo+=3-sb|5|lsJY{!DqvpF&tGqK;W+IZbcbvsIL&hVH{7lNZRoKwhc!YXzaTegQ$5^p0C zCSR_7gM(vs@a(uCQ>)=1eiCx@lRaOCOv{TyU;LM(O4 z2mEeZ39oGCGap#jXlheb?2&=i3`$s}{?&kcSTJo8#NUfy@}j5e599M~g`sI?7%+4j zki8`s+>+1hVMfl|38Kyd5&>Z3n8dC0ocLsv3H`Y+F*3k5#=66OJY(glz5DlPj5mEl zHr7gBp1pBuru0L9qc+=i_vL%Kee{&-1jpTi@szklr26X@9l!8b|I4k9IYWBI`Kd8z zrc86A$f0i9jEUZHjXEKXJZ1Rk=%<(C_qSDlC}_#2M=sxIT&KY2xkYr_L~{ff$zLp# zQE_l_ZmvVFQ9{pZiA5XnCvM@Nk4BdZ5~itNB+N>y>-itPI4PYE&>o@~X^*`OYqJvn=K*WFD zr#2)OO27-Nez%7K=6^<9dscQsxemYU6NDlXEz);pSUB4>8SI;PKKA`m(?54GvXi2% zy3Xxc45(lje#);yz)f*)g^USjGz)uA(s+&R7sq=fo`M{~SBjL~Dus=QnYvxmx-9Uz z#8*)~)QJ07cnA4g_enRbC6!4f;#?X@rR0*k{B@N1<>-1O(rRV#dE(@ajB?he~g=C zSa<#1fwTJ^TA{!_S(KZey=k-F`9sR}F|f13*fwGs5#8Y9*Z$P*IKZddYHEXz0)?*e z<;mYaM=%{j_Fkc}f@y`5v75^Ka@1iC89!XvfvI@jlvrRt7=hUfJd$$e=J&>ukWQ1u z9_EHwED~a$ul1hz%tt6dZyWRZfIB&o!X6!H$taBcX+hih#b@Kt&C@*2BKB=a>&EY^ z-45t7mByVGT8B@W;YknMft8W=JD>JEV*w0bITT3bU`{DpdZ>>Pl^n4&Qf;%)Q_D0k zin{FNYw9TwG63L@n;J^nzcSr1#}a6;`U>H}y8j5YbnqFAKIGi#qJcaAJVUZ}e>mm5 zpsjjuu-gfN%??{Fn1!W?I_HM^5}$riYq6XOPL$ggt_80m?g}ZouJZ0%*I)6UOxqb| zkhh#?h)-)F)i$~``K^XMhXS~4pLc>I>r82J$*!pt2+hJ^Q3A8!Qu4KUWs#Bi@duN0 zI>_DoR&ooNKbcy8H(rEtX1HExFrG%#_?z{bPyCB8hE<=|j4Y)uxa6@FNtunWd{@>KhXcW91AE`;+59(2Bvn_@ud?!mj&7pm!_DzUqQJyTE}Bi5L`ml_G7#EWo&{x z|Bmo8?6pm*^G`6hKkW=kw!^dSw;SOq;dsV-t^i_)0u&zIxdTC}eEFROtJgzyi2(V5 zVoP4W!hUM$sB>q^91xeYv67C-FiZkRLSsI@!8f)aA@TxoP&PXxLvFO0Wd=g(Mq5m9L^{w>hgpg8r@%_A@+jn&L>=W(Iu(d}mZ9 z-}r%{vR`5qDXh_9FCt8UK&lTUpKLC;o>(cN@rSB&zxz75*n%58CH|KF2)$yLQUt>N z17Yu@TTy~FRHA3|_yraE&7iTX@x~ne_B*iE+l3Kc8Nz;MX7qr)$1O{NGd8eK(bKir zXY(udc{#Q!Q|Xh5cSmxR&=m0M;s?o zRA$=CAwWy!Xo?NM5V|S@Yu1xkc-TR(JU@XPSZG5N&w*i%zgTUZyau`^LsOMNa=aD9kVyIR$_x1yxraYrFV@;&%= z=)7-T5^05%zKzUD&JSF!8*^h|GyGHP2^o0r6W$l4Zv&=36;0SlYh1vZbRhT-a1~&V zii{;;Df5X+T|AEvP2IB3!TukUuFdd$Y!$lZYlmcx@w;T6V1ze>@YC%Pz6^Vai}Bo> zt|rfK1i@pEOu@|Np5!F7n%?aDb{8izv!5XPP^{x%&(U}bB8n~a_vmqbEiaj}af}v_ z7Yf104_=BY_atJ?*3TFooNtEnzxTo$GBWE9!W$7&8U6dnhj51x(-`gfk+h8P-8uE< zVgOa%P2zp3*LW~|rXDycqA8yAbw-5=Hn(W5PfRc@5hs|X?HfqofjLkxNPvSe%l?UD zQci+t;j5zKZtsaPGrjRMdjX54 z>zq>A5pTR)P%g-(8*^omsdk(qZEgz|qLJB!>xl5L{})10E9>>eukC|KF5TU!4YOCs z{5g$Ogs4O8&7kgCmSS}y^=_%&Sp{rRTndRGGN<(3PhCnLvQ0nP!ZRLC$?*#WuxFx0 z_B=o8^YD@FitB&WD&-(xA%+b4fB)k|fwk8E9d)s08F;se_jO$!7p&cP28q^OKA+Ov z`xUKI-NPhvAdjn@X?-~WXv=REEQJn3Fik$HW2YG!Y>6}2fDGwG$#5J&1zi#!V&ekh zla|**64gR&{5nHfq}ux8rYaaNhieS#h4F5Bl(0r((;6zv55MsPdzn>oh({C9*sl;s zd$muZ!x~B{PHL>vXG(f}+WzWEF^?h}Ej9#WCL#Jg)V}{$ZLS_~x3vfxrNxhaJVIn# zweF9KY2cSq(6JqwV!Xe{-po&5E#0avp{}(N`~3R^@9>fQ#w^(7X1p7<&V2)0!z@2< zSyXg=oDK=qvvj9%Ku-aiCnZV=c`Ug3wA{z)GH6AdD;EBj0yk1=LAJkwh# z@^!krBuB;<-yXRJloDWNB6 zU~q}3Mq=N0er8m65Q27#r=O58lunUZq(1HtsRVqDGa6AXUPaKGN$o3!eiN9QihQr? zGk|G7N@!Fxzag-|0$@&Kck_aKEZ)`m3(O>Ph*yewnOc)dRV8BIj&jd0q}9nKV*Ll7 ztI|=5G224{bB1GEzAzU9?&n{e*Cbgc@R8MvYeU{)h%8f@+l<}IV#Wjctk6UGHM$$x z3;z4Be|jH*Cyx_suWJ2svH$xKPaAASuSLrhH%5?+5`!G9z*9%b+JJz*c-GM81V957 z8uku(BQ-YB%~A{Jydi81PA8gMr+`{o&9~O{zHHbc$d(NkV_{0M@bs%2C;tIJq91wI z&@Yro2?^`DLR94*Gf;iq&?U@39O)#dxcdNh{(J+d^7`HZt#Ys=&Rly7y)bg>-Ts$n zhKv6|omFP?rRbQ4)&>{B)Rjso(D$CTQtBf|J?4P_wc5d>xK2U!MpTlIa`>8XBKMyQ zBho1ir83m2yG{FA;$QWJryj-mHpoU>oKZpsi#jv+4yY10!xUJbk$M{1RQd=;{#Vxd zx%`P5{q~E|cM%6y(dstLX*IehAkfvpa!=fKa9fQQY3EQ*PZEg?!D+#Y0J%6tZcPTM z_)-DTjX;xNVTmvZE(qXitJQyvG=4?`c9q3VBZ(@)ZBUbybXE|#}JW^=?>KdQ0JfR|l&o*@LxMsas#@oK}$OKxN}`3;mal^Z7g@|p_MJ>%T&5}wIA3?MW~$#Bb%4qI#+khI(8`Bh`*XZaAPr9GnU zY=GeG45?g=aG>H%hS_$J7=^q|w%`q9 zb(Jom5}I|ZWj^l~_bd={GeLW{Ri@*h07OQ&Y3bd-0(?)d5X6i9=VuO=Ji}LuZM2#% z5O3H%-1@TtsiJ<_`ETPtM%YshbvGbrv=T9hS(%jJ)+26B@!3yVhlRm;uw(ATDm zO_}1@Rr)?BGANE^IiF?Oa#=M4-|4G;WCY*AEXKR@=fQ#VM8r}j3gDS| zf%mLRHL+|_`%!5bPP!t}Hl3^jEZ8JQHR&|xTgOBRji!@j{@+%MMv^`Ltt*}#1!H3JUF9(PkAtFE`4_DS(t&Wzbnk9VA1)9e_&3w|anfCa~;!#}II@ElU{8 z^Z&pqo+OAe0*=`G5f~a4Vq&D6XF7Fuh(sm(2b~ld(R$?&a)9IWQ%8iZ^#1@!LAJi2 z;FzC{+aeWwtO|O@*kZ3)YRUIxwaE(OKW*&6?}bf@u|?wEU1!M@j*;Ds6TV+(Nd*Xz zgE(M*%yCemlu=E>FXz|1M{7P7V@urc>nzzxrIn2nV%J-8M=WwzRc4^d-riuoq*7V= zujecMMU|GuR%eFa|L@FT?%&;Nvg7Y28@z?O^_S7cu&VKdt#PfjF*5~)#x>EDTHDP` z@dA0b5JDy@Q@lum!%$P?+)VKXS+)~GM^vWRMuNit9g&#=VV}L<_-8o%1SJPe*kA8v z*pGqLNRIhr9zqCahW!WNLD(0N7RiICRRxDgJVOWt4Ey@FZRYY*q($;TK~(e%!;gv% zDwGPEJ^nY-jL4{+-UM^<{kE-p?AcAQ&R%RYlBTd@W;W4C+HWJv;Qak!YHC3U6K6Nk zy-kxi1UF{Nos^zyy0upvyY+es-AD-GsBTRs!C^p`oHGI3N|rkap(CnWZzI8BfR2c6 ztsW0KMfjXb7b&B_2|_x_uD9Njt;Bs!h}z1VoTnsBAkF;PsZgTFVws{(4JdF0e)4R(^s^GYN4Vc`(+{mJ#PD0&Rb+2X8W8 zc>(f@J_LS+T<;U2y7f(XdKBk=#FD^mCNI3zL{C5~4;cUaOjt`qHq{XGWyTmfuO1<^ zz0<_=&TvceQKtsiS}J_s1lK||=D+JKX+xp*gb{aV>SPy%6L6Pm}@y*>fSr{q^y-xhZ$+ zVWX`NAsn#lLVdjDkb0AZp3|2lu3m0Q46U#UAy;{!-uey3BY^SjtQCo!2*LEDQSOjB zkmM+@9<9;M=hq-g$$slmV>X=t7rv>@EJx*4Ghn0x2Ze@(3XA-bLD6>zsUi*=u)_?s z6BkCT4Id`s7(%R)(yG2FhITrXN#sB~|1|A%NE1nN+Noayn?mG#Ldc!GFyc#OQ%P_b zAbrl)z@8z?W90_CPy$meo=(4YmwkEz~pLQ<6L4qIc5-|o=F#J zdnXX(kRbd&+dH@b`_c-E3_N~bYo}j?VKcUlEwuxgvhX5|FsU61$RhJ+%58rbnZ<;) zLxC=`%n;*4fv!@nfA2)=|2-tt294~ll0gglpDY7xsM(w(_Ze*&6 z?8s`RT_l6b`u};Z(k`-6wLSu^FxC{`G{s9;ydc5Uxl-%wlkk7mIf$>>Nd{|sgOE+J zhpo5dQR1c(qWiX96zQL#d10nJ^-LG3Bx{|M(T&In$d78*m}tAI6=ZuuVM(P}{9jSx ziA4oj0g+`FBZ^;4aLy%`U99I4P+op90^qjVb2*?(-;7OEo0`jU>`boVgPe-?CP|(Mp5X+KER^U4o)i`L{ zrJ5Qg{{LyB;ic5`2BBkkPC$06KJWjj&pfQDr0~SQql_|7V}CF%#8k9bTRuI}Ht)Tc z-fk8SKVBS>5QI8n2r;Is69STNJyMzwBBJ(PtTUKHN+Aj9b0rRG@F~W2L|#q^xt}gh zdMCpYiAcfiNp{$v0bV{o3+cYU7_l5sNIZoGFm?orZcsQg>NkZ3Fg~wGyb|-|~6RGEg$JHb|Y|s%A9ymF= zpDarWp=o5Qo*dnoWQ(304Ipg+A$WLlG#xxRIT}jZ2tx4ivnA)!N}V!6;;kRz##-MfKfPeRs z{P2;XoV^lW`)Q|xZLHZ*zZ8MS2?N^0pU)%H5dp@3{rHT@c)8v-{3bL3@3 zjBjL{LujMRysJBf9lx?^0)D#k9;wCMUXDJ>F;kNv*B%UIKf)AQH`&_)2yORd~)l|PdFru+73EOimd809g z*#omJNx0Jtv)xUTX3Vxk;_!Y)#+@#?L_|iqlbm-t-XCDeTJnC|RBtmLhqnC#ENRok z7QM}Qe-k(WJN{jkX zLX0y#Gq{yp_Y;>Np$O3`6qT3!RV} z+3cI0_^ngFJkbo}a>j+W#QOu8A(_?;w?*DT+3Qpgka^0VaFH$XMrn2BW1G2l#Y#7j zss!XIMScim9<)B)Y}Kwom1RXZI!Qjp0o(GQuWJ zu4sl-@_JKSk`LdBJA3|2*`%)dqp2;m{YCn%1A%fY*Ed< znrVMxXf&Wz4GGbrrOk9`JPxk7tG$*S?qx!ET{F-9UQ6C>W}62SBPleV5W=&%c<@vz zp}AIpOa9wP{gx11Tbk(|`u^auUtDj=uO!x?cfj;&GtXD+EqS6jtNW8YX9>acnVGa+ zRYjQ1+*DAT5KLbfro&(|)zu~S5<+mjW~yu6g4H!4tpy=?SlvA>F#J$m2NJswf{E2l z0FznXTuEwoLU3(s7O}9siUfxNvuXA6rtia++)Iw3gi!Hjv!oJSvCumh4#R*5hWU6; z0@6s5mJ(e#72Z*VoLfPOeO4acnbwyw@8L%g*cN2nZR`ZAqcrytOL)6&N9F|LtafDDYyLm(gbQtm@ z7&M0=1C|l_8X=_TL`pjhOCuOm8d+uskzWu(dR}wQfbS9IkYIRJ1~gY>di8a_YgpTa z;~2t-Xdc-DF}0+vEpdC-ThjY3lMKeTNRSPd{Horp8X<$dSw?eFD4dHQca$<}{D6>} zt3?L&9Tp1v3Z;?^cDym=e8%oW!@i*3ThI-6-&4tUGvWE{w-<%NQ6d>+9Zz_^2!5%D z#CHhKXM*0oxAg4Yr&o`gii3InoEySLg?X8mUn-T9vFrS=CfsvV-(HeR^38C4&qb5~K9#vzqlSu=cvJ9iOL|;(Qbfg2LiQC}PL7Ui;A1-WL5#=K2=c5RGn+ z<*R(#0&CaU4*F<4U%qKE7^}?WDR;RfJ~OANS9Z31r!1>G*doaZeQ-(5o6|cSl<6(| zejh9MbhI%q!r-|r5i9e72n1waOXRbQI$==aIdkK>rWwr$5wH7NNZbV*EXn9&!s_vs zo~9ct$?9ZF!X+Cl`B9~D(fDslxe|;PNKa`Qk=Wa`3$*Q|zt~zqf8Cd4Sm|I*vLC5Y z$(?QUi>)8EM3NoQ*_OEU4VJ8>83$T=`fadeX=htJ4{WgHXlGjzvNu?ARhlgc!3~xa zq}d{Ik8Q9dp|4AgIo#4SbAu&|(roc8++fK;a8$>+nwRAZg@Z-IB!iX}rJQf!pK9S{ zU2I8tifl^=F}s{qACKsQ&gk9OCGq&gk+(p`w}Q8y2R^O>X5DQ(IkXEi=wh23 zyOg>l^`yN*2p;Cx0bS9Z$gyve7^#Rkb~2bmY}m1fYzZFIROlLQ zYqM zE~TOz(j1;@MKe{AZp?eLOQ*Kt##}$g@D)XWAcXp9RUB89Sn?w&zY~Jv=~hYk=Jjw) zB?m}3NeGVVt#m3mNR&f@Ww?O_vA;-*Nv`hO8Aj~XIV6hx`*_ghSQjbfXt=e3QO9wM zTvD#l{q3c=A9**nno`~hdFzVH(DkQtELlb2orGw@idLS~TuUCg%$9^Uxt6R|ZuH6D zL7$#AW{`JRYE+{W z{oo0S>}rJ!_2XsEPGpyQLZ8gYXG**FawPJi64}!Vw=-s;Sm+Jq_b&=&g=DYt>;N(+ zAd_1oLnmHgOMH-@U+Nu_*IOfZ+;@d7Ddi1~8Lb-`81Ki6m~yZc-oJeJ3R@)QVUiLW zJ1lqsM!#w#f3+IAKUPYwghkbF0?HXhUvd?aR;B5`v8~arRae=PT-pz5EFk05jFf9I za*_`dS+2<0KqhD0qg}sVMc=!|mgGuc0s+~eTwAYI(X{@`_J*<@xz?8CwEvnKwkg}~ z{{fr5Z-XW4=>2a9(TQKR^2kO@9s`&DT4(CLCYA1KWirEq^ic^Rgno?-o_rD<2K0Y) z@YJL4E+T}A$6M=wOC-u6K^X6#>>OxGfR;Sj+VjgmOTPS%E&6NR7hi{Au&~IIE1Q^3 zxrPvmr?eLP-F24ym$+g=&=$2eZCZ4pk$a91v@NYQ$(0f1kYJGWeTRA%8L^89A-0w6 zAj%;@4DC3$!jcNMc5Y)QcPU034|yiQw*Kk({({p)d78NbmIxzF^%&ejRt zHd@l-dRyY|*l0-^@sqoH25hwC$?I+LWNozMBqYVg$8kTVDMtxm<$JC5L%DaQ!*jS2 zeT>9E2@R8e34OFO;Zn&-66IpkZZN&yS}&En0H*5v#s{DQspP=Etf>)UR@2o;rN-kK zNLH<(OY(xgfTWXqV6*e3j;qv7H|V-cPUw&>xxto{r4+iILh*T7a=JB=!m1n4OtfGG zdBzZ;1*6(%3u@j7Cir3kiIWJyG`fxY;tDWTTO0Hh_`D%sKr&e8s^(D!n@6e>+91K` z`sIl>$UqO?XzK&k$x3+hMqbgFN+mN1QSan75!L1SGm&fxittrOsbF0fw}`4Uafrx* zHb^hEyYb1b+;4(sVVj5?UrF(Ogox1SVfq&-v8(|0EN!F1^wc>d2uJ03eZ?dTZyTmk zI<0k-naIFt@|qgjr<=*h@~#$VceAB-4l*=8b^UQ0Om&j-IQ7gT#H&fKx4~NeJ&5Oe zhxob=4F|n<$Qx~NN8n61tR=C65KRBH;ZqeIK<|+95g|CvngKLZ)nH|Gb1P$RKSD4) z**3!5TS#yiqRg!xUR6QFB~m&==;}5`zmrU`%lkw}*1O$piEmXEJD;?9r;A(a_Q0{d ze9;E4Q{2kws4e1SI< z4hOxNK3UclA@>og$GDa9wg~0nJ#C54@)dZ8$?~=^>9d}AhJb*>I_3=(`tQxSI^Ye3 z@piHtQrtH;^EsShk>s@laY5DGKg6dX<*l}e{JOVb0pc4PmbX=||1CJJ9R%J2pD!RE zD0clV2)E>lLC)u4j<(g$`bly^26nkp)^1{oTlPV?EW=@1+RiYExf3E@6R3;YMr4)@ zI>twMx5zn}ex+G->_q){Y6*jaH;ByKh##GY%XVows~kSL}rm~fs}cyl7#5*j(Pg6K`$1B9Tx*;ZE&cM;`~U>a5s zxc%VZeB^=Hc4LY|$|Nbu6hDz+LL+BxExttDJA|OU+xEPh5nD)h*r0!dmGo+=K8MzE z{4QBOCxoUQrki#U<&e-QbQ8803GIx3FC>K6ZsUu3L^&jg!56sja}jCn2qE^>`F3AS zvcqoPTDv^i0z9E`Vk~J3=poG zPBjcm8HT^KHE%C|Nr~?Wq4H2$^Ygn7?&k>F;kG&hIi!6g<%o#+`Q6c$oFOuyz3Bqz zJkr+FW3(k#-fD}d_h?J9bUTKF3W#DbLB=7XIlci zCP1-$?L0MBT5{PP+}KRPAK2Jz!ynk#oVWuqh_%AQ9ZicT5W;z@=v`6fJ-HR(9Q#7}cD%$HX&?_Nts8rP7$>~`-BHnI~G19!Z*>b(DUU|B=Ey-n| z7Y5`V^~M1(_a`U#%x|dwr0iecWlM4fP=SE_tV##;u_fif zD^0_85c2wGjvQAnFY5zcW0i(j9 zOeH5&RJ0cxdkP1)>>L{89NhEg(D2~G!Mzwwi^KBeFq`m3drkh0x|+tP5+ds&`73W) zwrMVT9iCR_@Y?ukr-7FkMcIUC$2;xy!}edmgL>Fg^K!#fn-EMtx7Ty*T7BW>su80B z*xirMt@jK0f|APUyZ36NfkQIUrz|4VJ784)r>`x^foyzqTjqDbhI$m#YCfoBV`g-S z=%1UY_7=jZ{)y`~%#zd`{Ioj72{hG^oN^B)WQ}}g|NkmN{1gZM#AiIeD zkr32H9dt$PkiI1e)*yQ#3+^TE2qDCl8L@ptIiyIjKS+zA-yk;2h#fzNWDTM)%Egg`s?zr1FzeYKdEaM5GaBBxWpeemOs^{_jp4SWAa~5Q(Y=mj`FDpUDQ?+tH=YrChl>2I{r%J3PV)S_19Bv$+{Zg25*qe1xpQ(y z;4Ate8RWQd#M4ElDb9Tlj_&Y@nziio$sP5xG*{nan;RsV*BCo;3DJs^Y5IMlkq|Z? zxLHi<$AsXTW;AV7uBs?64rJlC`tk~W!QS`;zofFEG5;|YIUYrW-|dJ7{|s9&$gd`A zIw5M=(b43kdx`TAg0`!pJ_<_jZ<|L!_mSrCp!?0EpmF`tAzFz;43HU$KJF;`98q%3 z$oQnAK1ckpKc6FB_+MKRR&21OH~!eL!IDw`b(RjVQ_uT^(DzwK4gNQXa!9ZzYTXsU zh8$s+O6QbccfON;R3~lzuPtUF_G3p(Ms@FXqQaET?@wJvJ(+|s=BJLj4tn@ru7f_q zA6N(3_u1y#s@L3y#ym3Ek}&0-AcXv{9nFK;bUNoiM}08szmE@QKZP1Rn04RJ2eVh- z4}Cc4JVQM;+Xa1xI_gPhp)%nXZ5)XW3Bh!@qjTQ#&`_(2a&rX7k&d2aLoIphep_sO zM9+~G z5;EO5%#v|nipVG0xjN*ja8P=5=VE0cXS6rB3~+k$jP|zFdlcUxG(sv#9G&ziorCdlj+SV?9FkVv^U>*fW6siARn`P@dqBW zPalXJ^4JDTc2Z`1CmkMd59ILZIEcd|1Akz6JUs|DpmTp_-G36oh9^3)bF0&a-*%bebWm(-tVcc7|;p(@vnSS%k1Q{!MoX?7jNDh1pxL@mK~afRP;7p;^ILd8TbMtXEj*wtT!><>$N_D{E|kJf zsb;3r9S5}Wn5T{?-xZm*#1Hm{Gjru&r^RF3@?fSdwI7lRo%JeRO4^O4`rd@`d2&Jp z7iHq~JODT4$=J^D;y$3%L6gWmoe*sw*I6CZAj|RMDm@n!5 zPSPPlNL8=BI#J*nLQto4*6F7+Q4R?PMNK~p1=BNS_AuMyXP>zCM=4s(KpDoEd(Wf~9Se3PYKbSg{CXAlnI}e`-;RL3BfeKvuEDJmdsKnEO?HQn8@~kX+dXC%%hg<$+ksT zK`nDoFH~MkuI7Z`USm}LSD6q3X(axK5KL<$L!b)@4g)+M9Rk;pV=^IBtn2K_A7;s- z9InG}C9RYYJdA~2MD-yAsX7*>5W9d7)b%D7rV{0lVA*-GfXS+ojJ>;`9|l`A41UV7 z&9}?9Xy2Xl?eZ<1k@)bM*3huL(iu6eVXiGHb*azM8=ouNH5_iw)wKAQ79K+(Cm=gi z_4-_N5Axh0T2+%;(6Wlon&=>AbQZB;+5x^?|RW%ct77+wwH%zgFU-D1_x3Ev!S~A-{a9rM-Db_z&t~z+uIt zJc#u=FgXD^q78oFL8NMJ@#D06Iw4y8nQ8Hq2di3aOV`QZ^uwmrx* z#8*grjSxJ1E${>?)r|Tsi8~3w#Mc7b=3^0nd1>u~W{u3(0tbK~`gP93q#QMMPtLbR zCDQVvB;J68)>p_r2@s+_8g;yiX&8y6gkYjkZ3^J7=&3Cy=p8I&6v{j0z4Z zw54`f&T0WuVQCt|=b1trtbtJ{{V{16AcqPu&7~J;a4c88Tl~0Y1x${tP^QU#ZEPHd zLuG;S=-f0N0&n=M0wUTOYPh7+3oUOs-y0j!klC9Q*^(IODl860QDv(ey&(9p+HJEJWO zi@e?S;25{84B!S)As!y$Q^4{~S1bUnhp?{jWfui~@@>}_$GT+zFxh#*P`F32KU03{ z8eAJI8y~VIS^VnVon0Sa8!Nv&WJ}62R=SQbKHOD4*4nxU;p*gcBl5F~3*5$iv7^>lu~l9xlsg zd|$62zF;<1lj-ceiGqNv#94xZPdhtlCbSSo^US?6TKP=WF3&TO`;f5MY559`` z`idM~Wr`S7%*|bQs=S2|iWggE<99o8y$L~kjqiLMYD?l8kFX>VaB2A&%hP{^ zCFRBF^r~fYL?bi3{{F$du&<9VvnZG)Wz=xb#9dKLqO?84 z{Yr>h{slGT~cJ+8IpARu~l!=kO+T{b0KUtm(ZVGM8>(`(ESdktAlAW)N%1R zSCxy$yWrwpLye0kXz6j3{8=(p6>UOET|8aOf1{iyGqliY7+u_(7T!&W22OAp7yp;I zL4=?^=~5SahdC~Gh}q{eO;;wk*daa?#bjLkIB`=5QOi`f6I?N#t7uvc`qi2zm^Mql-#VMt*%8<=m_w%C8=cm77Q4RR_fN8rP~_vC{ToF`fc&iGxhUt!Q5UjtB??*IuvZRhHCI2%=PYwH z2}nxtF4Knfgz+YayzD{>Iq@jgk9mbYdD(>|()KZ1Qbv%|k*E!;Uv*`?7>nGSyf&bd z!3nixz+=eUnQ}snnf#c}#SfXCx%{I|djl+fUx}R2;&JfAHQZ#$&WB76dBNqmW|Jjt zN^Ob5VN_bs;OF3l?&TXT2@tWvC2==FkmWaBo`Ox5tSGg`6W(M=tC6-OJPOQ6M^(tE z+H8r9v^DE)e@pw#kzFM%j||;U;`L+}^#(l6~YoMhKa+F3*`wmP~?-z1fnAQU5Ee zmw5Ai#R0vnCm9?hZxKeMpjkDLf{u-{B{>jcP|T@;ywYkkRy@8EnXAQnN5kj4H(4^C zT4oZ$u6Z@ot|v#^qISIo?&{el=nDsj_40SWq2~>^+$oh5EWXD$%$h$$C(>-cNS%vr zbj#7vPPVHv;-y&J!GdYwV4g1|b&(*i9D`*hkiKBhUnB`&+cE~eu!~n%QlFYz5<-8H z=gAe898jjJX)vcK%Qv_<=gy*VUiL64CHp}_Ykmm~OHL2FB;K6-OP?cS-I6-imXy`x z`j#->=N}?{u{P=(Nq*fS2juPzzsJg!u`pBY`kO78PTCAYRM$uB?9G;x6Xnzb(%trn z8I~+Rhk^%ylWIn8552*hkVt>y-NA&`{Gn(}Vy4KAaMyvcw%{7;je!ieq>hVRw&oP6 zhEhsS`>)YN4auc&N1ogPEq%u^ncdlCJ(7>@U2Mro3f7?@D!$Y6_+m>w8)u8I^3IYa zHiG4Pk+^3!TXHz;qR95mmUJ6$OTtH+EqMZe?A~n2*75LQL?8P6Lqda!{dq&BjOupW z8)b65U+#gmN59N@diUu zLHiRjjRGgucA~Qa^0y1)Dq$jC{~~W?FI;Q4R@1bZ$)%d*WhCo@A|#6_A@$!!vKOB_B<;C1L4eOYWFrOTu%D zEh(LXJbh(UxRQjT#odp<$mttB=>8Ra7Xc zbZhr4W3x3M3ByVZioD@|xFS|&O~u*>CFIxU(`-pzTjIj6+r6Whsnhfv=zTX=&Fd=XwxoO zQdk`J4Q<;ghye9;I6iQb-M9-g&0nuWhC7Be-B}BdL z%#F6;M2#T?sgs^;k08dO@HA83o0v~p86l)D)u;07wNl(XSWMaqLhxLsnwJpcP#n#; z(D@2!?-N4mivQ6o<`ry_Y||e*3F#Q^m+Rn}zu=j)VJ?Xe%JoP+*U!MK0YH>UPq->L z1CgVB)QnnM5W;}#*+cht3t37yUV%Qv8H0JJPt$hh$alnJuCZ1E-DCY*e!Tijk z!os|;RFZ#8UbNMC5#c(V&V4t>$spGucZ_AWBgy8KDE>;T4Z2FWNr>1nYL8{9ORZDCK|A0@wv$a1A`2PP*V z`z`eO&5LluHb;K7(5Ek=lqtVi=<+MdY>Cg8-z~IzFAAX?{pGd;%A2xSCG}kTpkf9A z^H4wzSvW>rffA?zIc$A)C{|ocFi^drJo!Tn39>B5wT26q8nUl%ab~736p|Bq__fYK z_c5=n;i{1QscriUB>1)0ZE{kX^OnITOTKbMQu@3#!5Vx1m;0`SuszqL=)syb>D7CNOI|8 zDzaS}ZhOX-?7+BwS#WOGb*wTq~h+fF(zt zwIyNy083gv$4|oj_c>G&H!uU6VIz9hN_afOl8IoMlwrwMuqelr(S~D+OF51>94%HO zH|)u*y8fIyq5G|jax-tOP;9WNF8f9UNIc6Ivj_U1No(r9B;WIugu3yOchBT z=Q<~~=nM8UA2I`Y1tHSI`>rJOZM?X0ETYDlS`WB9AHHBo^XF|z`0@oy?!h15zhKFP z=g|bP;#?344jI;0zya1n_yerX)?js#?6qXVP*d*=LWsRr!_(GlNxwC=c)EBkd3z1F zKU2x%Ft-qq5uPg^u;dgJN*pv!8E@=dZ?tq=OD&7m+7gH3{hi}o5t1LTMem)T+H~P{ ziO6HdzMh1fW#c(y{-}W=6SFRAbo@~RLngG&{$FalN(R-fAUsFy=c@MmXtkfK+Ft7; z)#CFr!}{libMMY8^hw2IH;IVIRsWB%_l}RM=>EsgWRu;!E2|-91NPXlQSIe1fMAy> z`lyeEY?4h_lkBd$n}ql%1}TD4B1Kw&03t<^&^v_QA@mMGQK`}tk@|bR&zzg=0?+6B z%O5#+=JYdX%Ds2)Y_T?4m42d^1Vn9+_;V-Wi6nMt^OHhqgTdA^IZ|NAlP4ebHlh>} zQ`j+DoI4XwEQ6!=Tj_(zn6kZDexe|T<$6=_o-63j^5%Mof}bz8Qb$xlUslkahlNQH zT6d#1=y8YqKB8c=#a4Q3s(z&v!XVolg%EY*QE~|iLBBstoz!RDZB%QT9$G&{v#H$&0a(~+V#%utjn1f5jk<1_HyCS``Ad5i{s zm7oVG=Ib^C`HJ=3`VKl4TLeN$U&TNC^&1nN$XB#gkf#KK=v$R|M*%-sI~-Qj=nE~T zl|WFGsl=P|Vak2^iXNH?OJPdtSK5`~+LSaPSWCI^&J+k41FN-Q#W_nbO9X;qkg{X> zIa{hs)SE=n+Z95dyr7;x8d0$%z&D+>)n;DlM3|tE34LbTDWNUy^|G>vCh+946m^kJ zKY>T(VKT?$@fs1kUri`N6TzKjd)y5kfwT9o|kTVdXwK1EIS?TP2ETw226Ma&F#MQp+ z_J#I{=_oQhTKgN`?6zT|o?7jjy)=w&^m11J=0ZCq6cLrP+%Ffh`bk`vg+e=;%!Q*U zq|+2GBrl3opP8Q*2zs(ZlqPyw^)vN-#4}a~(RDL=*r@d)8QkOX=85%iC%$lWQ(-=SzFq3`IS~ z-4O!eY`p7}8HxrjvXjvfJ+(&+d5NfwYv>F`dl5FWkDh@ib2>za1%kJ>YrzafcP|#+ zRN<}5yg7@JaQ2lm6y02+c^?-D-UQeF8Hy&Fyd}bW1M~i^d5_Le^pWs%5eVMvUACEu zo>?M#D~0z)=IywI^~TS{BSNirg+TBoy6&H;Xoble-&6a06Z2lTlzE%XRCG#sjBm6I z@VZ>D&Q$c)Qqh|#yf-uNV9opQnTnbS&x-=Vo8$`2RJ70JEfL;ZnD^dgthZ>UqLA=( z7YN=uu0Asrhr85=H6rObg!CTigb*7?!Oy2lj+TYul_u1vFcOEE& z=epiC{@&o)I#W^S<)SxLc$1lTmFBIQsptveX(bSPZ*-lVsi^h};Vlu~+nM+66|C1X zOHq;V^b!c(n_RcdQZ&TmtrXrnnD-aWd(SLIGlgfJK=9t|N|~kTzLlakzC`+J=9g{PN5@ZRPcJ4?|TlebcM?_u8SS2OP<_$xdc1cEo&wR)DKcUOzv_;0ko z_cQM>&AWM)qVvMz>RaRQ?XHuv6#Z)QrV8(a%=^F^)_ZQ2qGyFCO(68%;YysX=;Jk_ zw?ud!V&3VR_mOKy>(SYYE||QP!dstto3CZP&(2n~OL)!*1n*t0cV;W< zwpR4U_tyS4VBU4i8#N7kvopf&!uR2O)_^M9UEH0S>O zRHdEBK)a^)j^X-d+?E|G#kUgiO}FJTkdxt_t*BDyUvw4ER^(i7Cs)_midy5M|7=BF z*4rum``L=tthbW^E8_cT4R5e!+8`QI`{?NDk)-7YMBXT$t*Auk-*T;;t*HA3JGr*Z zR*~$HU6j#ej-v8@F^ul2TyM-#ba*q`Gi#2b zJH>aMqiER{7+t+c%*ge)gRQ;UK6ma5ZeM1uCm5n+u{&3w()QPB zDCKm4PA_%m?J;MgW#U{@Z@@#vLbpYr$g%gHqiB%Sl?jB4Yhx0Bf@ks5<|xYE8f9mu zzqL0zRsS+6RSDCd1ET|s?y)%r{bSHpJ0+mg5p9k^Z#uQrPDyFs;vrfNZRhP$ct=oBouAQs`JvnWFrq@0B&Rx=zKiVbTs!SMlPad+1 z8PSuggi-h8{a{2-eqgsSCJ)pabx;0qHy9&2WXPKx4!ZLK*?yuyI#up1)lhOV0sWOG zSkV7Q?Y2{b*M|o=6D-L+ZFCqF8R2#yz{Bard+byzgC<*$P`vkeiUrA5vK@s0^t|DWvos6+_6_pK)p+-bBCpK{zutatw*J5GZAP@p(TN06Il4S#RquiH> z$y=|ylLzT|-k*q-H~x%Dm^etA__HPc%v?oJ??s%ehY)o4pg-$1zwdcJrAT}a35<&K z8IH4mZ*`o{aGXb=g5!LKrcogi-sG#$W?&-9AL4BMf~PIc-E`elK<`R|+9aqF@F zrY1J-%#ZRzVLiU;rcV=w^TV_rQ$8nRSu7H9N|l}XWAL(Ayqx_VMWl}wKxMIgd)cV| zKJ)EQS!^xr`oRidI2)M15BV4l1!xSH=j$?k9~)m{qm%n^TRtcTKR`q?x$2&u5mL)M zMUJ7`s&N7l(s8k_d*>Z!}NQa9lh!Ptg`;dtsiUzlHp~K(Nh+@eWc*^v zz97gU;yH+BYuQi#BCI|!jMNfWi zfAw@w6^pK1hzd*>Rk7&7aNdcnt3vH zyV416fJVRB$(fbw&JIz(IJ{-=j*47QfhU*#;fm{im!;W#yfowCL0={vM|=3_*El3t zv)}dN?g*ELp_EQ1;+mD%=?*r(J_JVneMh@2znI;ec9vGK6U>-Jz zqBE2a)7r>IIa)K5H)I+-Sh3;860V4DzW zSaR8whNYEVZWxcp$3@12-)mDK>vXIuYp$Y!2kjIwdEIo#PVs%`DthgZjMFCXDUqSa zX$dxc>Nt4(Oy+oaVvTFf)-Vn%3tHeGtF@cj&cch{+Vf!b})nKHe4siMPk&2e#;y)u5ojruLIx^z8 zke-hWe8Uk}20k$2suq@y&=#JLi?DF5ShiVUl!f-jpDL;~TDQ~n0?}R<;&|celqwTt zE?n(r1}OSikevmBuh^RC#76YQB>sOJ{=4c8RP@$ibU7T$GeyW33Iy9%R{JK3kTQS|H&+NxB6xMdg@ z=UUxHQG=rx@3n_F|ES4w1;U6G+QY6OV-NELStbxf*mPRGe#`WFS_b`jGMObyTpRzS zWlMbZ`sA<`>yt{zu4WIqy&+G!J5#T3DMk4HJ>e?+-E81b`UA5uQ8ycAQ~w{>)F_jC zFW%a?;t#tX|CflcZ31EY4>lKOv^$T<`nP1HIR&_|{{8G2$H$7SN)sEt5U5IP%=Y1i z(&v^{S(#9{%CBPeIktK$1Xp_<@?yVwE1zDIB@0_Wfl)#0Xou6c9FKhZuY;w3SEQvs zm_ud4>6&;I1A4H8j3@~;5l|cDR=oR6}6^QVb zUS?)iVP>|UDum+o$yYINGMo44iRwkyWIGmJBT&K1`pI^zxi+6LSFDrmdc~SmnAy@t z)7eD($?E0P3_F%jPoW|^K>O|J)xMLG68BBg7CbBvHt)9cTK|5jdPpEEEBaRG#t4Mg!A9Z}!!h17#TLOF5D1E)CPj?} z`93y)SNl`6C%pukHZX3Cfuz}V65n@v!Zg;H$Ty5HV(=QNNBePx%R66@?Gy%B7?~-8 z3IxK0AFebZ4-cVqZx2zK(5@CJM${M_L9KJWN+@rgrp*@)oG({l;C|)FQ+)eD3k=+D zbU0-v1Gg6O-)Xa#8GIKp^^~1>rGEhSUsazz+DX*3m>#9BmJdIDK$~@3lG488CGi#m zcZfIriHS8hUs1W}+-k)4ov-LMMob^B=(r%Z8Lq9v6?FiDV|Y%~C5Sr2aOagV%=bma zB}8dL{g*(ANu3|1d|03}6sG+gmMPH4H`fhE>9`y<_~!Zm5H;b@0|o!0BGC*Tg7*cA z7QAep;drmaMmPPXBR|uD$iMcNo$RLoxx!e-^Wm`>JO&*%x%)&4poS`iv_~ir}!)K@-udF zVMp5EXVB(|!Xx6-ivmIXU__QzM}mrl;@vq{M&TVq;a~q?Lj_{+4*L4XC}y|=q>JDE zWBU6Jd>|)$dl%kr{l`v8f$wp$r6-TlP~|vl+V`tyJtGkIrIWp4z9Od>(m)_knGvRE z2mOWIh?FK2k1UEd-JhF@U(uo=yupN>E^0FU`RTbHR8Hl}_b*^$ zu=zFo8ilUh3w603AA+=2AxhU?)WV`Fd!jPK9jGC@;}RZPP}dm5U6DaXryND)-^Xyo zwkp@)97W%fLH3)yicU+cXs(Wx0KPy$zlVt8U5&kpR**rO=5fI_7YLdJvTw^)^tDtC z6bMvZ*WqkM=fSRZCy&;;cPm!8Q)qt?2%dPYsqQ>&#hn6y5=~iB6&46oT_XFQ`HCh; z-86wnjVh&;7mM;k+VKX;bX;g@zE%l&+VON%?YQ8Y3j~dr(?zQK3Is|!-Vf|rca`Wq zsdX48_ALStlU^}AF1TY1 zJuZx4a!WAZhplY&x%Xfkq7>;lX9Ox40>ggpK+`z4EEaB?X1Falk=yGm2DZ&NB&8+cDf4WW853)elMkL+%#?vxBcjvud>rumbKSYQ z{tTkU+UbEyG*qRp^3d(qU!1H`T_##-WUQ%cmHKVB6<Pw4LGG-Bikq{vK#tFd66iq z5{T9Qa($!xqa8-tH@8t_TdGa53xq3wDl*_^!?9ZOIqlkB=8ASL!=2IA6ZB+xb8{(0 zyn1uF7HKwh2GPKng)SQ<7&YDvjDdGKhCxnl>#`U${1TKowT5$QB|8jC3XF|Gn}5d? z|8-y}!1qVpMO}Y^uzW-ee~k2#!_a#*zWulqPnGk=xCOS?&q8+>op*Y?gV0Xm)yaoeoxUDyoO?!Ap!1j29oCWk3 z&mpyH81%O4 zTA}FA>kW$kSB0W`6VWHJ)VXGrcDJrT#OhECuXXw-8ss{at!O1vBlio0sr0t!A_Y{3F0r;b5M#pA29a*qWw%FsGGEB7)@ zt-1y!CI5u)SLqNZ;v02gSyBn=LUf7~aeQ5KTIHgiV*g?Rl$1On2Iu#iS=uocS$fM2 zkiye%@dTX{r!4$<`WJDK)@ld!tV?>by;~~p5r~NWX(3McDv{GMmebvHgQWWpP{oPR zMY#G11b3&{hy?yp5GDayv^s$~Pp1pT5`hrWC6@DahE$m-Fe4q1r&|QKS0LE_(s^pV zu{uxJX^+1Y2%_I~o)+9_=BeOJ8Yt0uIu~-Zk^O~elt2hNpmTPBRGBF72S~40lFM~N z{9%b$jp|JX0l(K5#`djZNxL2!w5`?Ym*MsWh<5S|@YtISN=Pq2aY%`c9z)Tc`H|lK zvNLvGiH$x&T^1-R|FY7Mn+$U1d3^!e#hVJOH>2!s7ogo-egfr8Pj1*vd$=O^W=v4! zym0-EYlfkQCdQC6osPsJk)OE5prmrtd_;dR&DdKEK2`a6EWV4~#U(n)s5@_!3_i{t zP*U2Y7|`a^rC6LSHSSjAE0O(T8$|~t2uB4XzDHv9*KcK$bP$in@_oq(@Yy${D|&0a zj@UZ_!E`G2ib(TUTvR6EjoYG`%rI*#b&tF4NgLgDn?VWgU^dFQF)q2yoTIwO;dYyx zX3%@YA?6ovGsx*r|0qO5;#NOtqugYkJ~G_7sG*})s(rgbPCglC2$x&jj;Rch@Y13< z^xGoT#81JPk^T`aj=Sw)8~q3_e3rC?cOvXXF&&GvrM!tC;SNNdR&t>Q7sA0zci2tq zxvC6R*%@53A+FIRE1g44h&IM~c3P?FozgOznvzncahS2>q)02f>nk;E! z-KyEm^ueZ-zvJ-AW8l5W9kWmV&H1tVUbObK7;MRh{7d7=ole*D;rtB_4RVEPBmo#;g!D^2PP)zou@YKuTnchJ-g?-$t__nVe%6{rys=lIUQ@sY?@%jcTVFT#3Ho-j_=qIJOPN}r_YQbU7W zIg=DMZe);s%?FC!6rwbN8ASAlRpWe8X9@!Dpw)Hp14W)j9I6!+isEPLxPNVP?XFNX zppilG$14<_z{U9rMK3irDBik2QAuN@`Ib)=Id^Ci>j;F2=d5<@jWJP)f^rb?-WWUD z_*SWWPaycduyK1Yf)+IM%}oqFzBCe|Na7MJ4=b&jzq4IjjkYO)MTg9jN@EXfr-pykT&EVq3thp;C&3!d4|uO=b>#joa?k0H74(7=I!t}c#ne@KLj+J?U?pB zo94;%WYQe2IfxqWH*>js^AkwA$wi7LN{FTiMCg~-hB-2%-*l z*V2)SzF;D(y9%l_QIS9p&5~{Q%YN3l4FZAdZ@1$$-*TxkQPrE2AhYp)&G(2v@a?ea z4NU!h)3{Lrf!l9$VFT0DCk%3757Pl$+%{0rO;5t%ztR)R!M008J}G(9LLhK! zw8+<<6p=d2_RHq;#!=qm#~ zr}xuX=1Qmd!N8Px_-Wkf&ccL6J$duPt8@ zqpZHKI3n0%0>L;c@_hmx8}ROm)&aLKL{;Le|438-lPVA%{dj6A?{s+dU%2(3jhlD8 zOIU9Bc3WvSDvMDWq7??#=Sk1vQ59-%v<|K0%D}T|K>P^u9A2z%V~Nv2nu?kbZD+bC zQVdEeLk%)ps?(<~U5RP?xG}lV|nquO}a986( zG>#GXHp4w%K{id}VqP=c1fWF%^n+tW9UGN3!>X@GB7P4uX%=hq%F|+HKvTH#}K5UW+5tD*Yo;AM)LDQrcY1fnHzhRLX@R zqnaD!%qyVI>ZNaNw5_>JnV$nk#H056e`xJ_0%1dYjT#|UlLZ3xmC`u>G0pasK;SKicV?> z!K;;P$pS^&Uo^H&j4J&o>ecS2g8|$7227dn)xCq;6tNV3}T*4T!5$lE2a-Wi|zjigbxR_4=Z00 zAMScpd^jOQCUJxh-@XbT>^LIolT$hz9R)(<8O0CGRxnk~)F00Ar+>B&aYM)f?^F{i!67B zhq}cqT5F|WUNfjpH&HcBARq1?px(?}w-q9T*C+D?y;LCFDAlh|J_J#X8yS9IhC3Vz z2fe=R5T%F*AD=ZnDds_uS5!BA+S^9ow8A|;(G7`bthBh5IX>QiUa4@VX(q+ z*uxub(u=~LuwSP+C5tUhE?vc@*J0Ck$VMln*YVi5)_)92@DaU^tnBe0Q`74(n4AI1 z#Y}MLdj=(?F2KWi@}Q#Ry{McEx(l`ba9)5?M0FgsApAvzr9Dho^qxTpxkT-u^YnWL z)eezr&l+o|lWLD1LxyXiqLKwMobnx&>;8p`GT%4I^~gd+8*uT=LPe84FetvoLPg~t zMp-20_^TsC$zsm00;A0OUcs(kJ~RkBV!v0gC8>=WjPDg&g0d^Mm=9GAl=glHEtPRlZ=R%U)4ZPllrCnYb8!Fk2o+3=^cG3Ety)gG?$ zqpD^c^ZI1yrZTbp{kW_6@V9#5f|W*O8+_`%J`r?twoa+P*$`|2`+~QCHE3&~5znx( z>1_?2V^s@vj$KfR$T6K@zqd7r6YN&6B-q>Ds89#ph3I%3aY_@*ez!(jh)5BYu=20G zct1y~BnHV;>BYq14$wC|RmOgVnUi|+&V`phk`4?~BGvf$&Clg!Y%J5dwjd7#x-6gg^BoMBT)UIF3MS!YZ zcZdDnM<1ptA)IJj<}}g%7z``#=9wLAf6PtutmY}d`}qV5s^#-!(?Nah%=ghT{&kvL ze0YdQ-7H`z@EMdui+L?^oP#*WXHcEHMPZIWX9k_%9WOC{JSX=xqO&aP5kJhXu{+=n zhCH}$Y|cNiRUzz4uerkhaz6XNt>3i2oXx>@%SNQiEx5(euRv%TZ)#{7KvMe)Jwe*U zyJW(s$fKVvAI-JWXcT<(8w>dZ1%D3x#!_zom@TG5O!(%<2G!Z-5Oc&Vr;lbZ=OEDf zb7%&0uK5_lN-BbrK}*;Q3K~@BJ7Hfb(CMRP%-$r3=T>&x`z=jKwCSTdlNSSD+p5YZV6X4btyGf-z(5aD$#KK<#%n=ukXhz=IZ{PH^w z#gIG8gYB(-nc`T;pgJxQZ>n*Isedf;=z}nB>$IfuXF+cV~u*LSauH-@s9s zNLnXQmEr_o#ovuhmbxVZfoV!)#VLhVQg^-6bhLJRY_RzFxa|RG>2#hK%NEun#2gQM03Y z`dZo!!#Ey*pOPS*7Kjje^!+I(TWQ|ymo z!~}s5J2LVZO;5Xk+n3oq+pn99QlydQCuuK~G!_ojIKg-MiJzFMe?l!eZzXba(}n0P z7yt7K7B#_aI;o!TYoi!|v92d^e7_oy2^KMNEd<*Q|AGuKtm$U;Gpqnp6oc zFU{6n3Z!|NG@GR^0)^3Pp`!TZI^I9Uy1rPb==7)ZvhcmS+R$u)cp>9-PW%wt(b#tmSm`{9zO1l2o&IL$8nibE8-S=g@9G%FMRz;u!Ns%fvF2Zn1gA4h z-|TaPl1fmM)rijV9-<|mqnkCR^IVGQz$NZR7kH5RsRITnuzW;c#9_Jr!WRewB_*#w zdvRO0b%)wgpSZzCtTcnM)sEM@UsJ%X`|5{1?ZQnnGlP^SUgzEs?R{P*(fByD|B)}S z5jiWXNn_N!JJCwFbu?3QJiEuEG5y5XZ*(-s8T5o`0v9`X#Cv+!=cS2k^xlpzy4o!K zN@z=eFts@qiv@%3inat@;b#_>(8<*Ma~uXEN-AT?GOYa0n~46?NyZgjq@?7PhciI+0+S7A~19uXS$m@BmQ1G5$EY^qYRX|Esn)uO#2pP9$1cZ z`Q|PL4@`f=@xa7~mz-jo@y8=hxwto3AQE+doE~zjR_ZSBdmN8BBf7|#vl$l{bL?Nr z3&nZ&=v-I~kn4_QRTR)pQ()og}hD}uqV$~sxw{%NHVT@9+UP6X^1 z=*;p`7c0WJnN8ZTP|;k$RS1Mhovp6p3l-VB!LxrBDoPX2x>;SWMT(y4W{`2~B1L6V z|9y<>sYQx>-3*FvzDUt8RDx&qkl2 zh)0}%Fll)&gY2P2iZ+W8bgwo7&9leq>bXeK>0SoK_g|#wz7oW06f#y~wcqMmx=4|~ z#30wYMT$n07!Lji;52gLe)_#e|PEwQB8;f8Tz-! z(j+op)z`+E5y~R!WkW!Qf1{@XlrahX*4x0Zm&#ieIh*3YeT?c?H@$3C-`HpqYVcSm zBMc%eFTH)u2J2iju0jjgOb z5M*naaS<~&2`&iMZ1{@ zi_jHgxE#e*L9#` zn_qcA>wZHZh&GE|9Uj!U5`n;B>j*l1_#ut^S|D&$wul5q|K^#wtiGmvqJf4H8GMp6 zxZYqh?@sczADu6!Y`DQBqrqZDY3p1MYBJN)i680wYX2&8FR5YMORho96V=8P3fQO7XY?^YY(} zDJhLy;6n+JIHCrVHwLIGQSw>CE8@_@j-Kosg2&YEJf@}|e4fbrLrepD*m+LpB}`Ad zj?JscXo*cvyDNXOqFzHV)*wiCh@O85M38#gIY%sP~{(KTk>tUwh zn?&bPfiQf4HoVI)F?k# zx!X|%BcJ+?XN|dbJTD&bot`!3vBktQ#e62Cq=uFFG9ZT*a+A!&J|rH7)`>Yg1tM4G z*)^_(nE0+h;BYK|^-vJteFl1-t$JAd6M96$h@oIT`*ma#hc!LdL$sbV_Nni=#++%_ zv)MjWN}$(spof2N24uZ<#u=o|e6{I&gY2CaD@qilcL{{0o9(WVixt^M8~OqDO@g~a zAZXUw`PKH5qtOSh>Q^Hw7W%r6Ug6kwb}Vl+yTOiaXUFE~8q=}u?AS3>ieuZ^u{*}# z{Z2UO#S&sWH_TgOOkcONhwybbUv(WLzD^N)77K(QyS1;gL4#$|Y{4xQ2paMAk1_w# z*T$4AK8_a{(TKmWueXn_@%0z>HK1!uUw>g=M~*e!_=Sy^m5@g2Ci}Oj$Px$>f7fno z87ocpf#5O)f=1jh#zngk3VQ-nA#^Ptk8Y{}(IxI7PmeQ**T$FZ_|WL59}G&sdWtUD zOZHo7AIe$YU?_|lEa?(|G^n=EQy3tnB~WdD4z7VDXMTYmQ@-G>i_iavDUG^tp$7_q z42|!>Rkg+&WRx#f6sXkGaaY5&bg?4Oc!OMP7b|+>Cxcwu7c1)glR@#nELJoF7e^K= zI*f~d7AtBr!JznZ--2hDiZ~MY=^{;pEeZSdji2WB*ukbKRq(pp!g+i6*ZX> z)iRm>>b9v6uGgN5Zks@WXaom5YYO@+N@%Jdrx;{B`MsiI3EGb_t`EOgbP5{mPZTQp z>q#x?yg=A9F~*fssOX8Q2pY~mx*$l0s0GpF81n$6>J&oid-IS&LbvW2EnL;4&@8qq zcd9vD%+hbQk}B3?PZ`bO53naq#foPGo&^S|g462Psgg*#NJ+&TW5^i}1ZWBS-Fg~g zmPDI0(?(_*KTVi)k&?=Q2Gdq%x@kI?^p6=QZ`NtGQKwZtQ1-KKMU~>r&jR86rWn_w z>59foHz+YBU11L*8uy@()O}j}4bm#zxI3pypHEE+4c#!rD@jrR+CGl3AZ zKx>>ZBUYmgQ z!VEZDCFbwc>ZZ*Ub$88zI;2fKY5qq9Ld-5RZP=ja1@n$TP%OQQL2U$|DG+o^v_Wq} z9UGLqMYrGzZO~V<#Go^vV1r79eXKx;S!o&+k;ne(Os*2j3(x8nH8U9=n~AN<#9x0=2Y%PLYBpXmK+5 zqvkEhZ#vKYW!W4gO|2!0%EifE7FWF`iq6h4bU%Ju3``RU*N)i|(T_<}cm)#>2#OOn z?&+=Pq91UGJ{D}TKu~>Sk*>}oMrXnF6bOpG7SVLIAT}gQ(b4PNRKv(94zXaK=rR`% zt=*w8jpTUjMcGH=IUWh~a59FD$50E#wHEWtcr@Iq8~sNek9PAU9v4NWO;p0l=y=2n zrj9^RNIcd^y&gCzC3eC>^x{k1x~f%cccf)elv90a|FmOs^JV`{Gu- zUk%V%ZpID^4Wgtf)cHJxt+kS``LOmC3k^M9m&BsMA6tYL#4uRCO}F4)3(w~t0l|aA z{mpcMnh8W;t1LY54q0^BFeoHN0zvw#g=f{uMKTOn7MmJryVkftYkU+4*4SOxM+k(N zEn1^@akR#sbwZ=!5L~DFQ zNV*CH=~}I^?Gn*Am<40(rRTKZ>ji>(pP9Et<0Xp9#HK#6u6LIxTD!y`SNak~YNtW2L2nYH3KS+5%Tf+Dn!LHb~JfGw{qlwI*I#Nx8(-m3OWVg!9)1;$j=glGwO(9SEkmGD^hn20|q5T-7P)fszM>f)c*s)1V; z%e`{Oikggt$2ST|6M-OIB_5m0Cgkd~f`45g=+?%Xa}Ffs3Z|n#P*iHAhc8q5laMSE z2-0oQN^4?@@$OA5SwoZ}q5SYA?N?+-f8&tex)MukO-;YWzMO0$&q}=f-pO(Oo#Xl^ zY8vk1#q1%DYsM;$E8G|+I%WujZ6~5_W4gE(wGDR&1l{?o(6tkM4}qXNqQmm-s_3@p zFC;$-1ZjsjZnhPdk!}}~KLmpGw3d3lhO{P#?o9mni3BE1!uRH@+J(q44vE9a-(a;t z3HV)68WM+{Yx%1UJlPCl?&pdzs6fkP(ob=S^3K(Gfw7z4b4=h@?+e%9V>Q%-sXPw( z+;A=S=Ir6PPvLj_U!kUKFV4%6rPg%jox2uu)bU8faz-2n0;?sAd7p?M9Rwl>BjfZ6 zsE^crClI(F<75TI9q58!)XO>wpqLV;8~1jpdrTm3({xL`v@W{QUJ#OWfgqg`r-zKl z4pb!go&rHPJ1(*V9TJS?l^TN%%{_zj4F;y$)Lxs&x0@W_qpC91g2Q-p>MI^TBA}YRn1d>yeLAMElUxE3N2aMSAtC zG}Eh#73sCJ(p>xKG9^`NgSuLgH+QUuiTgNjy7ODkk?Xm?VjS!t+DZh%#_m?#jI*U~ ztw7-VSh+)OSs&eu+l1t>K#-PdQe#6j=_Mhl+e-Tf(lYCnEq=G)9}@_=k=Do-?<$zV z0zolWD}DMhrAvk6XMrG{5Un(-DO&mTph;!Y3QxSDt&Ply72F#B4Hz?tR&cPVqQqT) z1-H%l4e0u`!HPv}gN?X5@_bC2tXQ)apy&=}(?%mz7X8k0zngflh9W%g9U;@ZW8h~ah_mYA0^n?0zvibWj5hx zwXK5REf934^idgQun8wHZWEkI!wVBWD&u#p@R|=5ofV=u2|NV-ZRJBh&RvEAf5XUE zBUncSpY!B;YWjAHi0Soj9oxuu>}o@=s=paK(=$D})PvtdhfxmusVBeMyLJn(dX#;^ z;|@?S8y=UIpjzgI5*tQx*H-klpLsy&ZA1U-wGCtYe(ryL`E~rEZHQ}9!{2zkU(5<_ z*^XfY&#T&qsci+q^RLbOTm!3#lHc^|e!0zcM}eYY%!*cewzc-|ErDSD(H7meK(|fs zCj^3S(X*`ZncSsdEVgZlGP?3EVGrj|l{BsGU3915#z8 zpfu{s?~peuoFCw6kkW*B$vaVD!OiRuHZViuJ?P*~Xd{<~qEtv*nRopjJOu!8 zVH4WTRnP2&-8F`%yY(W1lEv0n1xiwp^|N$EX;Rr!peohLmcY4IBdsv#4ST3es7?!1 zrCs?gMOG%!O_)Cdd-3Ln=%!$~l}4iABf9CoGp)2`uh}SEj1V0Tx-&d)c-)zuAkq6e zu7?Dw(t1#!ZQ8(hReXcBjW3NVdD5(lWPf;!qGVxxSRe#!inYHrM$v;(6^Z&S)_%I5 zqK7U+;f#qM_$fmk`Ck(3+X5kTYivXxdRY)A0n)jq55X)G6BbH{*rv_Om8wXTn3Z=K zs>ZC(mMHp6uzdwW=Jr_E;Z=$9WP29hOZKmLs3Iy8@%{EJ_Oq8(IWEZDEYS5q261(^51DymD z1WFR{M5GDaEsct9Z{nd)9 z4#qIs-?6TO)r!7@=nkt@HOH$W0irL&x=L3oy0{NLkAv`uV80XysxvwW|CK5e1=Ud_ z9tWXCfyWo73ZY%{p^k(Z0Z#$Zz&IT4_|DIGsh#5upaO&5FjTm4f&mSTn|snqzx}LV z5DtpNW5Z{E!43v*CJl;1Zw#WCo}U$ZM6Cq4tUS?0b zaL|npmO?~J*o;fR;C3W{BGfkCkMY2pi8AySq0D+|2`l~)6>w__yLAdh{zm4-=Rkr7 z^H2U-?W)$%0TtTSCG6^oU*W2|9e+WfZ!2Sd!!Ym7$O+MgxR2&q=_Rw`Id4`LZRENV z)cLU7-ND)yq0D<)Q~e?Og&n&2cRVBa_yY7RpUpT0WlsUCI?WXCA26sEl5uHV!yj$f zF@7k9oNhY8I(i+zBI^6qih8!u!5b(Lxv?hBwRp9ng$E3Bty!(eIEcrkTUILy9MXBX zKhAZ2wW6mP5w}KBxgZY2x$az}$bZlv*F$R*jW}pf{3B}=ZLTJz!&=5+O?uNIA${$T zkoG+UbOq(?RBGL!VINt$xlBrOrrmjH($9{fmsQWpHN8dWDDP!!M8%S!3k6Egao&RlS{b)^yp0we zm9DUgQ_}Ir6{+7m^{v+Kyg;spszgj`mTo%{#|KGvv-f!@e!Oa1 zcQn1z6?FstoVJrG-{p0xlGe3*yFq`g1 zSr0LXtr%jGPnc8qVJo^6&%{SK3aw9IsgfVe4$x7q=zRlLNZ@NZNnV`l9L_9m%^h*Rfs`Ik5jbD^>XC|zr_X+VI0>RYH zmRPf{{#g(v0S5f)x#qG~dP5)UFWx7M*Ix@Xvko3pPrenLf6~x1&XYp(yg-;yVoOZt z<$cbFik=dLNdPkfiJgHb;wS1a3&qC*A)>d9pQxXNyO-J8GB-cemdb?q#+;}Y!r)Hy zoek6S-KWqsF!+DRHm^Em=8wjc(_iTG1Zfl>_?PgfLC#Enu0JD(zPI5{wgqaqVW-(J zvUW#VkLj~*NWe{h%DjI>jQK|(JQx$%7DokP5+DfGZNc+?s(ffRI+_RZYs&yPrpD9){k;?!Ei!2lB&|ENQbQSF15o z9G}F|Qu~UZY?O2c>5~yc8AIt8XUz0j%3I>d*%n``t+eCDW7nwpEbz!!x}|haWQp`qB-XbimzCs=ol_muTgZzd4uA& zu2Iw$7gcK%4L)y>@y8lP$;Wg&PuN|~wTjlBM?(C+e3zN3N<1&|MMc1g2yEm4s0#); z@9}2R2K%V}R(b(Nc6k%K+zVxlusiGzmfL6xiU`*xj+Su|5B9=2fehNq75Nvjzu_3d zLREZ6xdbGE460&rXD*`YF|ys8r!9I&Aew%oou3udlPVL1MsG-@Lo319q(l3_B}0cc zhzo>v&m{@%-Q*w+?JQg%w4@xwp>3iZ658WYq0LgbW#OQw31+Vj`aobfWlxE5{|JQL zoAu*{Kc&hIU{E-43ga5f}$fm`%SJxz0S{TcVwcLNalbu(E58k+LmL}v{((MFA9wDhxlp5xas zru4H$u-wWg%5-&LgMJf>LrnLbe@c^z9d}N&QI^F)WZ=lB_!GKW&KWNJ zBG^D6>~+>E$`@OK_+TxW;txwVQ`LjYM{U8^Wr{Pa$HWHcJI9DhD;33x!y2t8`c(03 zq=P5=idYAc9lQAEi?*c#Vf`qF-qFWIcq@HekT-})AR6P~IrN@5hu&eB7l#~^O9e`cIs*Y(%x;xI!qo)?+&(H3zPp3bapBWZS{Hf(VWM>o43`_@ z90akIEcQXGgLtFBb`h{gAiSt_@J4|y*8gezbAF$PQbgx*ff2UvU?nq6CGCXbGl5XD zLo2!7b`>T5=0T4;>>&ziueJ#k4LFNBo9KuGXP>sTIrPrsBkX2(n}e|GJnq1aO;fNSC znEHADTfP8fCX1}!1e!9l@d)7>1n*;`THHVu_no1$WY9I}HCrLvS~N)!6>77d5_m;V zecs=?DAb~zH%uu)az>!3H5?)ua}6FcIvftZk(kOhq&lwRLF=MWGhP=`JFR%SKvNnz z{_Jb;_`4&dvZVP)#HTOE)XI{ z)*?QHu~Gv5eJ%c6{V}IQpD6heE{aDe8iETPkx_|@{v#Awu0?06?km|IA18M@&$FW9 zmHwu^U*nl^LLj3dQ8Mg(^jai#z$|`;VlH+_GWPN79K^jK8J!>pC4JYMj4t&_JdY@R zU!07u8Jb@2pagsxr167M%y8%CvMrQ+^a&gNg}MTwWP~I&(Lo7Wx$f)`QSx_-t@J~p z89i1&&RkD{Czl?@^RYdN4s!YeL9Z`NFF<{5mxG*z?ofb#pT8Aui(XDbuLKG92)==; z-%*8)ocIp^#pmd=sf(>NtPW)9likz}4&Hv4kwdTJCz5vF=pbhn`6~ai(myvj$eEGt zZys(Jrc|u7>m>urC%n8k?MWN;Np?^z{Y}k(3m>%+CB>h_cTV}iY`OL zr_@tbF1FG+7LyyK^$L2tw>v0_{*EDMZV*2vd5q5|$-cuuNoAcE@R7v6yu zPf9+6ms=UMfls0OA5k-w33}d(M#lG@WB5p@EhzI>fMdDbrk?my4!Qh6;7n#*UC+TkbrYa@>_p;y zrl1+j_&mxiXeO5{?}MPEWMv^|1~R3RWAe=XsJ7P~spz=$!|VU6&HS2(9(6SssVH#2 zgA$(_sfZF=;D7voMk<;HPX3NL=Tpt#69`5>8TiEcxW&T7^GcT+#_IB3i|a_bqJxmZ zV@h(IM*JS*dT)fHp$|BS2bYcwWN?{=3k)s?ae=|*=7tX9!KGD0tZs2UY_Uk`Z(%84 zfC7i!WZS*|~x!wW~=i^$YPkPLO^eXVYnAwij#UcemsNy-IRTiI_Rms0D_5EWGs^ty6 z;w|vd=GdPn*@$YfrH!a6_TDM@+2nwi^yxP0ag08>{xGDTVfHPLOP^W6diDK>wt;G~ zHaZcDp^cI%<1FO#(>dmA`GkX#QmqzphCZQQ{M3Hh6G%aBzlJuQ1uJ5?*$zG-&35yX z4t-W}D_o%2zQ6@$mZ?vgjUN!^wVL?=C<;d?y6Gulehn93?tlw0Pk9P${>@rNwFl}Z zX(ABK`E?vIE+BQi1p?Pqa9gB~25ElaItcDXsml=vT+hgJS2*6t41T20n2IGY-YwO_ z%>2OD%T&ej`~4|Qg`b$khn_}JT1H6Hp2nhCx9kya+0m$JNBd&2&iLbL3`wGCt3YR{ ztv4%7`&q{e&mb!JK=MaHmkWdk`(j;>eW2*SOjPVq)yT=wM1wtwetO11@gqHo_JR5; zU4k8NL}}viXn|3VZ)T$s{}t(}u6zDp=1ja<=bE#+J8a>!{N!H|-C+xNhw-T51eNZv zoyAw7I^7!%(Jn4u|LheDIxG;HXZxG`ePK_#Fja`HjfO=xRzR;chQwj9(ehdJUrdXb z>uCu8u32|f@)%4*_>iEDsPLhLC4)7^T%Zi$@>eOQm%2<&x38#mQC_+~*ZYYllZLa< z^(lHjpt3j|1omuGO!?XV)aD@?8dtm(Q&WY_LU>*@f|Z7wq9@uh9ng4Iw7w}i;$^Lr z!8dQ2=|z+xj_wj@HWEgw+5DqivCS|%Wzbw!@KQ5bOMWa2VS&h^`B(IVYDJBxN(jFh z9v#{&qQ!BTcE4$cu;RC+S<^4jYc4C6a@GCKx#fKxS{a8?@MDyDI$X&oHqC4<zM(H%B1p7fvVKy9H_|N!a@8KEKlJAzn9{}MZJNFhPSwC z%7%kD#%zT4td~Hu?GVE~9Dz+O(7ysCMO#Y;CFBOp;*%(%q4#h@=e4}5szy{M^4E{j z`XcrG&U(rq33_z#+UG@&F7`$ddVXg;J5a=mG(_}!92VcVzkp>9b>){*B`-KAsl;xf zT3G(#3$b8`PQ*1vwo_6Sa@+08@PxwtAoaDDthdsZ7aXKNnSFJnw(uQ+2>$W7MEwrV zX#A<7WJ6CzXX5y$QXDU$cU0fPaHno6()q?K-JOv`RpR*9qqTT50M&NTU^e9S7adfm z)%Tictw3iMjtv^ZzLmeI`_d3ACjQ1R!R`%sK`4SP0%7+U>*c-n3d5?`t!2XZ+BmJ- zG%$;3q7{AXlb57#O=QihUotz=EPhpY{mW0j@m%pGeMm+QYG9cuxzQ&O6N z1+lE{CtI-t#Jg&uav7=w_L0HP7&r=R_?j)ye2(&7%tFrjaCRWdT#%*IzVFtBG469 z-E*f(-70~=Er@Ic+)yGJ(z zuh|jKJ6f(oi>F&F_-*a{Rt~D=qm?W#A{WFAbCwk&HVPDDocH)>m34U|8=Y*Wb8a=u zel+-^HsJ18Netv5FlTUT`5Gp$XNG#fvY-p22*1Fa*6 zKsGSnm%%>~nd!)_pyy5p(@g-eQcERCZ05iQTy1a3{+JcrR%|n3ZpunnHjPGeS{`bia#MSDg`x!i*TdR#9aQV&z&z&bQIs ztH;`Gf6$*F_WC?+^)AB{32f2C=m2Bl7;Hm+e*d-u-6N#Gr7Yzw(nnBN==O%Q{6U&v z!?VlV-a(3Mq7i%m<3Jq0zEaUU4n6wEU!#YaQk(0=PZg!S>(C#m>=xbo1l~(TBW*;+ z=hGFX3KLG;!tTs-LX=dl4Mk8UMxI{9ixx~A{%~827scXH=SiADx@bb4hp2)*>+&wf zV}9bafZxjRMMVa0-B`>NPy9z(e5eSUDG=Hh*to^}{KrAu%JiPJa+CMa%2;`j=&mae zY|CwlSbb1p(m+L&h;;|?q9Y4zH7#|SKQi!?iKJ1JqrF0VZD5-#-orC2c48w}Jovst z|9IJU;oU0`)@;;m(&l}bjH&u@5&Wz`5be@Ls~`xUr92@xlg4Z~_BklX&H^Ez>VNtC z*auPBS?%)+o_3k}ID0{a^qU&(F5dOh0UMs*jr;&zJ&0+P4%qOkM}MIv-JOXtX8fl= zL_7QG2$wpd)YdDdRUbx@@_#xO*I|kvs)duLY zewt(#3D*cjQw+1~&ev4xo)-w*c;H4TN|U-z1Ohj~&g0BIX;BTvOSk6P{+d-=h48GK z9&NqMpF~|8ziqKn_cXc3`o@8KtPN=ns$&9`8-jkREeC`GowwxN_`kh>F+l04~IE$zqlJ^Y=Wd=j+dv|=&p3LT{Rvil`&;b zxX)cVuAE^ushol`^XRq$#`^LNNpsHSQo-&9nX0 zccwwA5+7chrPY}!$i~iMV}H#+$9L!E(rm}fX*Q~x8JTBT*6Z7C+{dPgn8#;Fi_5^{ zOj^akc{$TTdJoeo2OfpD&ot$)WBG9&X~NBp=ce1}agPk^UyAG=0uhnQNK@+F-zHoX z@Z2ZAQ9>zV#0r6`)WUBq!bFea2b^*}W-C0(2kJRP^cXHCLF1iSiryDSk3g_L=6W_u zQG+Z8xt`Bbl%Exqx78*Dadj6m>?2EJY2S7B;%Cat+N= z6b6Dln<#>&34~Go6uUM$TU^@#>YCgMdP4r(0?%viJU*4MN;p09qa6!`gD?7C<&&<7 z7V~eUIomo&KOkGIT28W3N?X(A#mYGi+a%K6ArCF*mla>Ob?DQnw=nO|C}#QdeVMd{ zf8XssuY;1RoEAR*e1*a}f&o-Dyw;-mRZD=_+E|VVlbcuxF)us~g!*u2s}qNJa^S_^ry0ZC`z)DiXCo@kYYF zm!TjS8`!UCg*S@=+zQ1K{d*T`Z_E^rYK7l8lFxl)w!&{JeUg<5KQde4H%>%MB_R(T z;qcA-2%9@H=_p6-h8$^=PBEDGy5u-0sk}O}e=yC=98N^k;%xELtn(5mQ?9ef7gcAO zvSlteO);wRDhj<|IO@1vUaQcaye|-e`%AY=E2)Y^MYT)nWdsP{W$p5*kbET&;{Vp| z@|jdcqNH8gUxtF<=ys{@_;~P$Gd@$KMIKwM{V`i6OjN=yZ^|{>qawnquS zU6c0smP78&)9ulpe;#ffN{I3gjCA=NlvIgua;6VpniqU%kN9}$6=f{5Cny7`W6JNC zax*A(@F$DWO9Uc1!(zBoOp&TcR8;V%UPgczT^9Ubh2)e#h#wxqo#HpCibP59f4>X` z!O_9Tvkv}8DH81)mqbV1N3_C%v8JKljPeS8=SI$4TEi#vWcVFq#II9S9lCfPMXPm+&V%yZb&9CArd(h#l0Q(CD#gk0%MOBBV$KqQK&-d$bNks+ z6^UZT>RT%ID(udtWO1g&(kq` z)DBZrxlk_9A^K6Qn=BAkvRIDo?^1h8Ah0_$;{mCPL@{G@Yy&yjsW|&LP2xIh*%k5K z&GB^x&G_!Fj_*E>XiCsQPQ3g1nTw$y9`eWx`MU*^9VH!4u#hviG3{rPnL(`CkY^3A z*OA(%<8mY@acLZKP(0$|2}y{Hg;GLXDMfaPMa3s-QTr{fChHUpfCS|3DqJ9UFX93+ zp9_o3G+~igKPSGwED+IT`5bG9)LthL*aH?9@})5BAWrCO1Q$s&*}^ZP#)UEBUlx6D zs9CPtmqQi8_u}#^qJNa5zdLM3|0o~Ugf4r6V;P?>UA9b|IiW+@JYPatfD5=i2bAcM z$Awbd{!Nsh5(vlG?HXgTq|C){gY$2+q=}XBYon}nf{Hf|pR@FzW20mFcuW`c6wpNr zmMAY3VEpD)QHU;B@{d~S=K}1iaOs82C8kO(bWl<;s=~SSMJ!&5j7L>+l7*aM>KKcu zvZ@dpG;;BK*G@FO%Nw()r@ z_NDQk{lbTe;#TOO+$<2$ykLn>YNP1OPhezq|3kP!Ek4e7=Tfpna_tVytZG)sbJ&(y zpEw9xeRPTbi^3n09$of9;JB_m72Q8AE~aS zq*O4=y+N3^@~_6Mf*n#9Yl5RTCaol zwm@e_m=47DKW3%p+vBdPfDUr02dI zxlt^rF787y?9UI=-;92#*g?*Mn)3c)9liR2aFG6vbx%jOw14Bua<0cGI~F*qk>#Xv znCGRF{PR1ncR&Q9lvKh5^d-MB zorjt#)P(b>YuvvtS*dwP7@tSoxb!tjVQ;u7Kz-xT!8W3zfGhfO#Z8@%yHuy!1|965 z1v>M>R2r9XmyKTQgzjBHL%7rz^mR-s+eXdh41}pH?m3r@c7i%kK*PCoduKGHN%f#f z9V(zvad*tMQQOY^0F=Jt(gaW^HM|MCGr}|`4)=h6F+~B5<AvCM!X6H-zh#>sm)Ijh(5hFmhTk%eret*R#U$( zR5=1cy-ia)y9)K2U7_@zu%f^%TIq>cS4vpXmt7qc|3X;NnywDw71ePen5ut+kh(dD zCzO`m*dxejcx#l5qHZFiqMOW1OQdU53WP}_@02O;$*&;K-eH}hqnowArv-w1ew@ac zb(f-X##>=U#bU?bv93T^QQlV$ifF0r#48Hl6C1i zMafcbB@p$8)+tJpaxa0XcT_4Wlkz%&k$aUhJsJK?{*hLy67=ldrn;W|I3`5&G#21WmkyII(wsK2Z-8!T45z`4+kX# ziP}QkoxRK%qb*cXosE}qJH7M~cC&kXAz0OuRzYUS|Dw+uZW;9FwJr+bMN$iVXqqfa zyZ&M-FJZ?(K$O*du8m52IVb_Nlr^WqM(cWEc@U6+WU!z#&G3O zkSCQzQvbw=^`Q1;v~_!ZG=Xbk`#^G399w#Qng8|#Ltej+$|P=6_FpZ2GZX^&SRX6` zJVBxv%D%`(pY<`@aE3ygk~7njMRV2p`8HbIM>@m~5xiR(IX%lH5<8p}yJg3hPtd!H`EkMGaAfnBC;S)y!YV=6~5wo6r8zIyQMt zKL^!v2Lic8v`M|O7<+yj-hoHa9JwPLIrmIpD?doKsKz}pjoA^l_IXS^MvxAQg zz?>=#TE+f-hAK>}TNK`1EE(V+`$LtAx{3A@6B5xD=*$4TE=sLbG+2;j0ztG@ z=||&A%)U_|aJzKtJupyOFNBNj(-e&!h>%3(o;$x?0ns7t`z(P7pQ~KC+6;XHcA;3r7M)t)|1JvekAS{!qfkV)~!nMhD(3ye&GSU zfyo~fv5va<06rb7Stnh503DahG}4BSNl6Xw!p)^WBgd1ON1Y!mSYoBwu!6V81n#o% zJG6@r@C(vE208RQn!RGjF9Ko3Nb?10c@0zPbVUyjj`GRt`^b|K&c^MBI8`Rj%sm?I zl#gh`4KO%+Fm6R)rz zM1dJ!Hsafq2L$I42)3#lTsZdrc&U7w^70VaiATR#LKPAS>g`%dwp5v@NF`yx4HF2q z9a>5IA);hEl+@&T2w%Is+1B&6KbUJC+)yFxM+8dx)iC9`y*_DG`a`$olLD`x&2op` zx%|llb2O$Dq5M*yDs6ySuts_y=;7CC%w!HlWkUVgF|ALyYT+>|&ER_>N=m&4Pcdm$ zEDp@8H5BXR6TOXTf}2 zXP85d6uZYlpcre3$mpAe`EG&8m*|X65zMOsA!59RGrFl%nJ6&hk!tlYS?~T(hP%My z%k~6u*tO@r`gr;w{-z1{7J;g?HtfejZet9Z=%r!NujT%ytj1I&GKQScF)?NNh>r0f zTt3X4b#xh@?=~WJEC!oH@FL6|4AXHg{XGn?Dd+_A{j1D@pFz%~lZ@+JCL@X_CF8Sn zMdkNc2&Ny8A>Iq}uo&@@K;TZskbS@>irPwDp+MkH$GDb%qG(20)DZc9#I6aI3HvsI z;%{yKjp=jzSq>Q!Iw?9Xwq1y^R~0B4E%ZMLg!<3$^=!VXuA3TxyAVTm;O0u*Vu9eh zBsjBfRW$DZR~9@>Rl@bVz$i~TT6j@bBPu)N4Nu4ue$^e!;e?V@qLaGWuNSCF@8?v? z4iHVRg&FZMf?J)J*%{5UA>(a-Fvk-VA<4o#NMN-PqH_jh+&UazY5Oxh0n`M`t@QeE zGpo)SwI*3{`Znq`+(C677GeJqh%X*58knl4565th!QaGX3Jq-UslP}* zG+f5zTSi1BM|K9xf727p^ZMM?qfTQg6A?wHbU?(1I_spqj?_D|GYV;et9E%9v)pR$ZVqu#mP;~#l7$2_Rh$@8Tj6h-KuSGZ8F_rg+ zmH!VD9wz!zyZxv@k#jjCK7-bcUcV8g2<;Ss!o#|M;*)|_UPX6}2&xdq2mjK_MSwFq zKx24kV*E%4*?Sf!`c){;2}FR$TV10I6umvtL5by8jdZoDCX^y7MhG-j;n<>+Rt#lB zM@EjB*%_@duxVeZLbwhH6z-bn1oM6P6!-9lrgtUy)Tl6zJbQG?h@E3F^t zpxPPk{Oq>jRQ~W$HQ8qb1Ac3+rNmFlC6&vXP^aWf)S*C7HfcJdA7^T|JC& zt{oTjD4lB!#z?LuiaB)zB4kmy<`RTSfIO+mH3PYpQcrH9BJ=Au;k#WR_#*PFW(cTv ze;z)Imm^YI2i)euIZZh81gcUS`lepmjB)VjVtn_hqT+fM0&1+ozU5Oz*+QQy@IE5? zPvmpHdiMw1*&aEVB~%o8KIkvxR%%4W!gJeMvz4xg&IG;tmcqFIOdq44{e|1?wNk$^ z4y+&>l42aL8=2S6P=4NvneCck8%#bp&mroeN=4s@ntlSIB%h4Ey%bf{v*@DhVlPGY z$2!R6C{g6bg{wqSUtHW?qG;JzG=1MnMalPRmIBwbN=0Wuu&`3mL*pD2zo}AD+BgT< z9||e@Thx(wcO4OxD_66SqCVps+uW;W>d(3ZH|*2gYNG35Cx=VdwFf&7=uKey{B*gZ=Kj2ZJLqZZ%ZyZ6A*yb=pgoCF`2kce{mDTI{@hHW4-L2_zD!CM(FFok>0R6^8ANO24s5W}CW!Rpdh$>K9kz1l zNJkMupDcG!?T`lv=E)?rmMbsQ6!c^iP_by(A}~VJM%I*P3f{;v%23pbH?rc5(V8?B z)ed?xJYM`zlvxw)Wv<6ZRig5UzzEgbShaPc8K`ai@{P#CNsC;T-jnMMdpK+mNEda3 z)DjpWu!;pfQ7y2_6ex07Mus~;$-?`Pzz7)!SVnHOj00Ddk?Rk6C`Gu#0wbgxXDP!b zBG*ji-Yj>9r$yrzsaWVgx}-f(rE%Qu>^9L>3tr4_nCPGceA{EOud~tvlN^+g843gY z@D3~eILSfAquGke?z0fMw^>{-XDhN!c984sY(;G*a|dOSmq)V35Ha8*!cvzmH)IzZ z(tENtWEUH97$r7j7aNj0MGQGEhV0gcES(~T+%}aBF@uor3%RpAZC>*fQn6@VC{UHw zfei_G0#1hvyjgx@s+k*y_%8H+SKMbahP z>}l$B2Vr)b!hUr`DaTVpG=*a~ZMx~VE|Zgoq^XQNI2{|wa%d{AlN!v3>}k~&w8?UZ z!l7`GC|0}Z6&PX3Jhmi#hPGrLThb3Dwq%|IZ(5hnFfEzK%EglTx-e5)GM_DJIrDN$ zLLqOqkBUX}Ie`%tEN2UfW@-zTvjy`}VhfhDl9MR2`%-cDEC=31u3&8Ltg9-maX(JG z|FysfyI*%Uh5$VevA)#Vtb838`p>>hc_#m)2$hMl0|FzI zZepb?A+{~iCRTa@C04qL#WtLCRk1ZbS+!5^35*cGoyBL&(LQZw@!z7v;4`d_1Vo}1;RiJV-45%MmwysT<@7e$_RPo<(_p zDjGP?K`vUaXf-Yz>lIy^hbFn|RETYLnR%W({8$xLiJ<%JI@+rAT|F=t1&9_Y4EBxZ zoAdA@h2h{t{Vd1wztd711iJIh53 z0?`k=34Rq6^8EWl%*?hnx`;9xpvzq<%;x(c=EoUP^ABsx^We$sK ztm&@`2k9GxCA_Jx-U39?oXjGG1>C`~*PTl#B5Sq4D48o+=6efFnJZalPn5A6m{#&T zhyy5xuw_CjZdw?rw7?VeW);2W55MTcNpz{Y9>1cU3ms&i)<)4`k$X}gZokLHxmLGPbnPNccf>a< zc#s(O=6Tu#J=xw+*b_|k`*WM;dfdMJ0HujdKMItmka(iFp%xw~HiaZD$5Y_JZ!8F9 z_!`rjChSc{QARF)&tP;co_vNEVMizb&cbNk`Zs!!gPcKZM*V>ab}Vv`vHE>QCHGqh z5`Kz}uXgfA6^9jRt-gHCGKql?r`k9My>RdMM zVlG+&m$RvgOHEMn1cN?5o#2YBB@X?B?;p`0S4-=M_MM7<<-GzlcYUbn>}51~+@*g( z)V356vcKI!kyQj-ClG>mDUG{L>h2T>T$LjGm@-8vQrA`>aK9#KxcC0Vz{-5lnZ1pg3Gj@zgLy!vwQgASnJ&t`CPPYP!rp@!7)^ zb;U(!n4-1I#K9kg`X_l4kj)a2cKWg4r24b79smp zAjpsDC!AZQ%0!{b`3YzBEP?!w>I}{Kp08N)_~~nPK1n}F2xJnS4s;udwY6yegy=v1y9HNZY=RIr_eh zo><|)4>M+Zh`#0NA$Nt@`E;4ki?B(M`ZIpm3I`d7hbTIJzl9CyALFtPRkUG+gW_)- zswi%ygY5SXRn%0JHWLV|D=n_(Llr%~61O9-4pr1bkS_`Z(Rz!^J5*5)69tDVdRvh1 z2?Wt5i)+wOMMIfr; z2n1DWOk_V8Etv5FK{3>%_`in0x82?_RS4Iw*Ik)1W4T!#TUFgGV>#@ftumWMm#Mm0 z#xZ{JDruI~2XwQH)6L>oEzOd;TAF3MDBmFvrc1MQTx~YXZb9x72qI~g6-9xfaI4?T{b~1%gQ2{*sB{c6&j7AyA0m z_ADlX+x-MNP#}oJ?V}+2KQpPdC;Xhpotf+Pd5Ge5B7K^qVPrpF#tD_Y4$D-cWxSOm z3#B~n^~*SY#;?QVnc0xmF#b;z3#*H*D)BmeYVMSEk4 zHd`r+i`mrGf)|PdQ7SY`f3BCA_(ie$4S{ffc?{3QPj7G#&%`eY&ZNPxtY_j*8@Rt> z6UuNQnl2E6Dr3mNd_)iG{;)fS=b+UaWDZK$=pdeh-q|Rb@vquCc+CVtia7^;Ds{yI zfivfz5~&+05IC8GhHjKOX#GYu7IRRVkmU#j`N|kOegwrWRVE6~Vwaq2y`t+Av~`UH zg6(*W>*4i^VmCR+^~`!jFKxp65l{!j>w}u2y-Bec6!v4C6s26R<)sRQyu&fBxXy~s zfZEwv(F2>2^N=@9s5S`%b+LuDf4Et+e+O#TUM|}I(b~706t``GJZO)1Y3=t2guHWF zd+RMYGO4qoE}%AgV5$*$Us+tEhbWr4#X*U)hhUYoX^5grTO4%VUK9;1%NjnU8@w!* z?DzImbeHsrMgpN~e5@<8r=tICbx@+OCssFFQ9yWmSR&+4-D=9`W#1Apd4)j8Gj(m1 zx`P6N6I}-)ba5WMBQzd?pzWpimc1)gCd$l%&xR=q2<~fvVEe{mKasEKW2x#O5U3-T z#5?rP3g-S+P!k1$q_4%*f0&}1wmFE!^cUP{fuN}o^M6flZ~5fs7$nq7>graG9F7KB zu)$arv2xQ++}mpL9dM3Pe=aOQZBD0O!T1Wv|- z{yStmSh<6ZLvou&y%j+|QYZQa*n|{szSB%WPVov!Q#0+J5Z0Cgp;6Lq$j+J+XLW9& z=`9en-)VJ!@5I~FA&Q>a6{U{qNB5`#VeKdoB1B#PT@mUq+C3&I&_W>7>MVa;s!SA` z4x=5iJXLTx0>L&x=jn-ElBcf=&Mgo$HF?Tn3Iz3yK#)w*VjkZuVhRQKr9jZsh>@G| zaND52kg9~_#v61VDZM`zyEZ%6@l^Qp-FP^Gcb4_Du(_9#g)&261VF5kWQ7 z?Yv==m~PZ=y?e8ULX6E^>u<$8e#ag>*TxSOY`+y7(>~qfAp20iq87sWl0a;!*nTVj zBFExA81rwOsHo#jT5K9sd%9NdP;#7>Q2|=V|EwFycjD z^S0jHOez)u#{`NktbLr+?GXs=yCSu(7KBM~rFLJ(xf*%ZhG)2atr3P|VLu>H#3Xo$_OscA`^@{n{f+SApOUD7 z1+RaOHbT!F2if+Q(-rj+3H=1ZvqOzE&a4|8jWhljtthpD?nXx&xh!K8?cV30_*!EW z#sBP}__|{hHOIwWV-ywqTpgEcKQjI72HmC;r;$K$1Faw3(>=a|5Tyu}BUy8)(n35@ z)UEYc;u(H+ErV74=RM(oJKMvLhLeS%p1>%^CpkSSa*X9)Wla%c$L&|q_RMA4csx!P z%2x%7nuH76D_X6!xc^2@1XdR!xhE->Y(@^hbwygSJ)l(l7UZ> zAi7gq`R{u)RNC6w?SlFG=+;UP01Lq`SMWtD-|A<2Xg z*454XA$gfjW(H9^mFntFneM8ls(L2DRoge~>N>07B8+bSt~#ju07L;niJ*W#eBc{V zG`gtc0~Zt&6`23$JgV-k?#>ME=!cuW=X=k+_uO;OJ@;ARy742)-+U1t`VZfZ_$|F1 zvGh~C6K>J96(4?={Nrz%;Vz8xtNYJ znEc*;0J~u+2anNn6n7oQTI0hGFOu@UL_)0fZ~0+|=lvp9$C_8d=B0uMC6tQdM$B0B zO4yMk?lsN+0?!}i^8iQa^1$1F5gG}mWBXft`b;vxjU;?(X;qm2K*BH+4|jC{-qwWd zKNGQkTNB<*cqn4ebZ9x0Prwbr;${i4qHk|%khQf;uRN^_?m1`08ZylKU6ghDmtoD` zMOkNl8P<&H`m{uuH%JB-y@#ZK;rXM56P_Xlo z(?JQt97V7PDX(8gc^#y@p8Kn?c1&l%2Et-RLKN%=bio?A+zdA_HL1Yv-w~H9Dl_~$ ztUuh;ij%ZzJKwFpQ9mSo zr{sN)gy`Bwhot#+w~tG)Zjumdb6pe789pIVAt?zEK4kSDH6&z=tMoXcXpT$9Dj6ny zsTbBI#b2Eris4eSYIIK=UV@*jocJ|*?Ty#@HBP<4;Y|`IVx0PsQf}U`=w_{x@97cy7Bfx7Qb|RRY>1=jTX>`F~>5spq~b0fk58m5$FNI`VgRmR!&B1H)W0p(?3XB}^Qg!160> z!Sw?Vzhn|3rgnxkts)YS5`1nGUMzp~k+344+l2FfII#$~Q59eOTXZkr4vKys{#bxJ zHsL!O`+s*Fw4Qo<0(v`=fc);*bm}>`Ct&}h$HA%R-JXDN;2$r!JprG5>^Rsugn#@# z<{*TpQ|6^u*GQN+_(m#T-~t5RwaxIe-{WJ%o?DXNZGYf{i2+~|LE?5HDUNW3579h(-#x?eI01Mq?CXI9ZA4EznIwi_EG}g@Q34I>%Wu|a6SHU zbtwTq#Y`aSSV6?U0&p&ivrEDl`+E`}{z5ZA%S*qJh=98Uh*{l}pq%fOoIlSwryiG_ zFT_7E=hr`uGJ_i6H0fYbhX9Gv<;Z%M$*{un0v zIVWquh4A|%)k6|uVSbgMW%$?q5o^#S1If-E=M-IYX~uAt&fb|}{amkdR&ReJhlzvI zM$4p(t=AP2u(dM@xU!Hq^~;3>TwBW%Uy7fx4BvGkuB*cB#5dJ&eUMhHfZl*FM{Mzh zga4^zYk8jQaVgKIyTGw{aOP=A{9Xy8TJGgqK8m#z zT2?};nKU@m$0Ue<)UFbRG?7$>jM1ix71XwNafNirzehO+AC=9?KWr%4Pmr32XAT17l$pzuAsH_u1$LzbIdVUIBkV!ocukT=;#EoUJqa;80Q^!Xz_U;luKZKjlb^-4sOPi?KS#7K z3{H9*mp^2bv;DFWn2P`wvb!f%7#VL(qgbRPh-pb|N*FSsb9sm92;x(J!o6L*3UHW? z9CrK}-6}kS$iFT6ZC`2u9Ht{E@5czw!tV_oPR!rd3}5*(js>BmQLi&VRdT&S!Z3Hr z?V1FB{44Q9nA_m&i}o-APHbO^pFl6W`@f|WD?dvOEg-x zLs|fx64n6=F76(5K(7F1B&-8E)_z<{hIs+JTS5U+8~n@jo`32V_-ag&v`)7w;BQJ8 zCNcr~aTOx*6EYzyI|ye`g{cQ?iJjOgdsi}-*ugt7tj|ZMB_zl`n-aVW)9$L^0XJR@~FaB)9Kl( z@n-}?5W0b1jm2ij5L~?p7w{5KVc$i!c*ep-10Q{OCUqf+=4E<<0>*k)0n35x(Rf_- zlrD3_FPR0Gy4<>y{qQ9`}k<;R=hP?!P!xc^ugWXtqa#F{XB+dtQr`mwJx!-+{L zHU7vXk5TFp-XX`e1XvY*H%h1%)_I^At_u0$kFOkyZ^7)h10U9e*_R~LnKu2f8K6lD zi$8WX9iy;**)s8Vz`pT5`KIf(!$G>P%o+V{bu-b$P<4Y zITlaNC55VR{FsC~=O5g;1v)p24Dg4w`B*Yo@k_1~*ya+f3B#XDs59=nYYSW%GR7bG z9E)*@KY$JgSf&FK>P&AxbqhQdGQ}Sq%^Q@~54?&Qq+gp3dt3o^?8VVfCv7{yuFmx9 zU|#a6NT}y$-n9jC%_1HA@vj@@7iP1F7owpmydINK=Xv-W&G7$1p7`U*WAXGWIky1t zFD#c!B-DBS{OirozD3H3Kg=x~$R#YN6W%+4s_=W8ggRgI)GhG7kT3rD(y{m!?GoM* z8=@N^tHSc*66&ne=Wc-~Le}`>+?Hb$dB5u|EmZQbCft(mVS(se=byU;7Ft9Q_~VLW zaV?m8@Q_AYn3)plO!2v;yF;e<LY?EmySBj2Rw*X_Fj|jM`TD6p ztP10%_twkdz@1y*@-PGZao4djK>xvZijWp=-;q!+wsrXy_*2LgfAk)AjAEB<{5+KB z7K`|`DPftryuQHK4{U+AA14yQAD@Y{K0Z`jvmMY``v1Os|2N+Et?&P>itnKK+wS`8 z4{mwrmb0UH^fhL1SEAIv5?DUqB5pMikt@FC^?8`$ zHzaow{f@@;p_z#c(eG?bpBbFZ3``T^o?1lT%*3eSj}4CP?jykGYXK8u)0ytBy`zRd zkzvT1f|QKqf$6zv&&_AhyQjKq; z%N!-Ei#(+A^4d6BGsbL?Lw^TmO2Vol!!{h!n_7t#}70_>jufE_E}!O=*`dCXzOhM) zRYl1TO-@Y=O;D^VKz4d&YBoDLH915CrJYQe8R{D(f@*gr?3o#x%V=BI{Q;p7z3{CfqF!33BF$Q;MC#PcMlN34Amz^2P%=XR9k|?S%(}mQj$;@ouz=a`I z>%>UKv{N%f+)CAIRjYrdFPj+~8JirQqO@8?GGo~bhh`>+#)+WyYNX7LO$fW!Yo#0; z8J(LZxYk(2p3AK@RAy}C<#S^kt-2&ekBxJVv7(I3&h#;7)fExk*DoSb{Sc%3=Q30b z)dw+lc$(#|HA-e|W@?!5 z&yGd!8Jip!rTFK>;>TEJPme`T?_n)JBNm&vi1p#QvDlf}38}l*A%>@ivSX98gJayx znj#BjYBv{BQ)Z+Lk4I@VeHKcXM$>7b%uRC3YHBT%nISH-rrAOno8+=-+AWmKTt5j) z)A0VeOtx=urf-~0pH?5C49&2_wE7@rs{dsnMXL|0KN`l6q_HDX-@rgf()f*$xj<9S zU0bv9LfSnxGdm|#ji*o}#n5;Tj86?*n4KNP@gX}fJ%?Fj$5@zpfyYLMc84$_Ypu{X zoSmB-+e<>z^35Rc!I7Ch?xtF{Q`wopsmbw+D1}y!sqCJaC|=_f=tWTjiZ(!uiKN7;k#|hNUiwxa0i~eC)29zxU<)RJ)bVBg)r4{OG?w@rC!^rEEza_n9uV zo!pRHB#25AkwQ;T2{a;&;hSBQPRTPO4n;&I(ZDDSiS<)C1x8_N0Y3vkoK!X#A1qql zjO#K3)KD83g$b*a35r|FNIZuF4fPmO=6+kEiMyIi-@4c;=m}-95Q2+%0-s3 z8j%+&`N%!iJS<%5A27^CtDipf!nLew4YpEddY|vRToSEu?2+Xsr z>xq&HRZpr^v4lq{vlR!=-dL>Ss!mMQNJgJxV)WvD{pq!r*} z9oQ9!v$9zsVw6_DQIyJXg|x}&)F=Uz0Sf^cTIR;Y%6^5knf;`ddx)%N7B%DNgYUMfv8DGh?ol(4{@mA)>m_o5JYPn{S|IQH5ZAId5MLy zQS*`zGHkQntBFZS8KF%sTEFDPYLXH{CKfHDoRNJitf-o=L=fD6(jm&@2qCyhm$3r8 z8O8NfJv)Tp&@|@Y_9JDZW;HsXAAb;C&2BIX`#&<6uu6SoM+o!0x~?Rc;Yv{P81q+k zm=WJJSYT(?(a5VPyKa&A|8-;fxZxF;`Sa@lq~YV1!Oi)CI{F?Qam$9o&2d&8otlF( zSL0JCfRUoRU=(RECxlwW4iThFL_4RBGtsDiv&I5p{-zGYZ~dbdys(Zoh%a)uCb!Ou z>d07UY$Zy4SQ)aCu{>)#E791f`gI`D14YC4;eS5gtXbxgv79Lx#bT7Ks(BxHIWDtk z=h=-^c8KEf2nY^5vE?LOYTuYLVfehjc;xS+YGu2-7HrNy4JX+RY7)gas!Dd)=0$wk zLEy5*7N&3&o186GLank{bZrna<>f4|*0;gV8yowTi$R+MMe)wiWvS{Sp@g`vp)Yf5 z9$-Yrg>=p}wv|zIaq+cW!$Mi0D1E;jl#H^@MU7(EVE(jhu&`vb>863j8}Ep`A?2Jf zr8A-^%gdAwr5!b-jgs^mK3*2X%Z#=Y;5{PTI$^2JE2Wq)mPbrF?}aL+OjOBs#;t-; z44?3(#EM+TFW>orOcXq?{2LQ?!9Z)l;Rw<9tX5I3r;V%+F`CsUh8F=6a>!GrD zi@CADQWTXx?gZ}f>>zY%RUW=kqRu&jFC`#5Rr!*!{0hr+DOS^Lv*<1?SYFODXu^&9 z@SmT(@v#TK{fF@T@3TX=AXPgX#4U^6ve=}Q8oL=f7yh7ChDT$LF@C%Z zXQ&}XiNGvZViY9;r^2(^L96T&JJkp!EAVU+7Z>`C9BjQ^U$9X$>^j1L;8Scp>h#L6#*$T700n1Z4m$y zt5P5YJ$Z^&ZO_q57DcOe&ko`TXhwJ~OqC!zY&+z`s6MXD0Db6f!gfY2qdaK)f#I0k zIbxPMJ2HSb^ID%f``ZIi9B0VB$|;$6ul5c zArVJpJ?mM|E)*;eMGS5YQ=#D;hG;rlp$*{MqeN6p^&=~ju4BQ!#Q5rDs;)?!U@8k8 zh7g_>5~y)j;ha?iDgo-;FjL~AlvXE4Ltf+5xbQ{}5MF)a0k5hJc{-;|V3f)vfltRI zkhhnu9L}MlMK5+3l=>=!XIUfU&M-vDCxWP5c_kOmbpvX1-CI#(XUSNeS}0n9PE}ns z=NYy$faj%gG0$Jb+k4o%R^O$j;-M#kt~u6(0NOH6!5l;`b539v<%B-`;Pz&%{DK%R zR{X_&v_d(XA*vPvq4vVWs=b7wx)sq?6$<8nhYT}C!(=0HubMy?OjZ%pYX!LMtZ1Am zm{a>Kk3nbxxN=(Ua#r4`6a(xu6SiZQ#F?n-ekgk6=!RxY!%?~D{#wZ@x!wvLi9k*x zu2IDOdCzs(H;Gxffcxo;5!i0%psXo{!BJg9gzn9YqB`NUq5vveTZfSam5%0{AsJqLN3+(NxWYk#Ld}JXVg-q4 zr2j-zOe5lS;AKpsXs}C%98|d?5VjUB^&nZ9<1Bhrvc3|TP!f~MN5|kIhb>F_Dia+s zV;SZm-Www>DknblOwGWy5*<_B5-r0%(y6k6Q%Yih?aoGAYfO#K$yx6-r6{_E z=|)WS)k__r*eI{puaruLw=!<+vx*Idw~*W((bP($RzP2yL8^IE44_RUYY~}>92i6q zst$=A$H4Dx?>35ZxGQ$W{U+j1ky=-nMdtQuXW?iUIasK20ra)Q0@I@M+4L(@1 zqm&tsmJfMsK;s;TmdmzhQ7Lf1q4$MRBC2yCYeC^sfE9zOUhdn4Y0E=*(#U02=)Esu z^t@;Q%?{7a4($z3>1Bt<`}ho!wxA-AJ$+-dA&!_df?PNhgS=6RFFP>h$bP-++`=vjIZgJv=od=RowDa51O* zW`^Yamp&*6l@G?S5b6s&Ikaa|3f!Q?7iD&55 zs|sphbZmSuJ1{=fH=|(nRh*k7@r2c=uLtwN5=EIcsL$-w^t584Mqnw-%bt=`v&4xr`j^ z)C!#$%g#oJBrjFnGLy*;j%E7#$A>5*t-DNS#<+`W$I-DPWc#CoO)>r>*||wY(mG^j zYy?|(qA$bUK;=PCt>T26Cec5MjXV(zHw}rVSVpuNehh-hifwkpwR5zC&`)>oQG%*D z(4)B2$^28_M~aovnvi2-B6y=}U_}k(@TOX#E{r$V5_O5ZrIr{k=s#-Y=|=4|jfD)0p*7RA zUIML|rVFMYxa@Xmtu!4;TlEIIlYk03ZF#oKZJ|UO6#Y!ml_N;1i7+~xp(~FRd*%dB zDpAr(&xkN%@qr^%e2OM#3E^7tGj@SbPY^*RK*EJ~o#JEkEWP@Sd{osio_ByTUR4U? z2YHEzD9W}VWyGZyL@|lhEE&6i=K*lVh)6M$Z5P7l)G?KA>@#*@tiY?-x+_C_*JAwW z%pZ?lT1^Qti%*jvOHDRJcv+={+a$7frq!6J3x>HgVJvHmA5?9DYRRt%(LPUq%xo#* z$N;ae;nFTD9^zE-6mD#a8W72{vHL1>w$#c5*c%aCT)r;tTaj?GW0=TVxY`V zEqT%%FmOQ!i?8N^3Ka@J%1NDR(m}Ks7h%-lrWi&}ibXIr16DAUx3m(KNi8qLG1xo= zP-}V$5Uun?S*d=dp>S{>8K5;|tiC$>q%hh;jtDuqK||2UO;mOINn^0$m;x@dbUM zh6yv4xsM3SI58o#|CmTwBi|~`8Vk|T_Ge}Be5+(od&z1GyrCwyl0nL(lU1JNLk|v* z)2e{7#S}d@GD*=|UUos+fsDV>BHu1h$H5^%aq;Z}cV4v9NQ!Yn(S!u8KodthkmQF) zl?Ls7#8Fwgh!ou#Rq( zV}o6hYFo=?EnXSO1=~O{%HfU65!x}F?k>=_1fS5)J3IL}Q9lgrScN#TT75&rHZ0w) zPAZ*hDJh-AD-mJocJXxajf#z9IJ-K-6~3p`z+*dk75{{acdUYn*BT&8{z-Ou!jnjP z6{u$YHlOR(oqr;XR1A-O-c==DCee94W~Vw7lW0$nNUO@Hpcx5SN1`av6JgkMOAQ-_ zskmJ^n ziX~%t%n7=?0KZj=^J@C1a?DN-4ED|TW#=5<$Xm2RTa$5!Ao)%hWxf%G<<`U~T*jQ@ ztY=vYqFE?`^m&DGd!GhT);c>pH_4^JH?F8GmN#LPd7RM79O1_CwW~U$R;~z1rRRG; z%uXv=1d`%YQUtbi7U#I8J8k z@edo3`vTl2;F;iSBM`pcF*cZWT(4vl;Zw0mjL?h)*9(ZG+BYQmB~u6 zLZf2s$2l!>R+9`NdqI0v>ZIluA+6%%ZRZk7sKzcu4Dd6~CBt?Ip(YiAz^Ah#nW*_h zNTmUjEG;EhQ;K>(*57Xj<|5(LtU_>Dx3a~JsU{Oh#1-o7?9}w|Oy9&1+#B;9BYI|< zpHo0`Tqh}cUuJ?xO4mxZgNdp8DXElA+-|f2wfd~gKFZ0Pbn&=kh3%R$lSIQgN9Zo9 zenTWVZ%DbR;t^@kDq1*cK+B@~3Xx{4k{fxZs_2R)i*>4l5NX2A+4+^QB&ug9qHX1d z46kU*g+kRqVvuno5P<3@0@xRFSDmC}Ebm#A}s&y2#UaiTF z6AgRTB^Apt*^+7UV=|35#8i_XlSbT~vjjivG_ zV-ryoZ)IvC;*i5`pRzO&31_9mQ*|jtGZ#f)m5qsr`lL-6nTX757AQ<*U?L*TEs3bC zN<`FG7nNO!$dnf6d6Zr)PQ(E;6~^4vEF}(*r7MJ})rcC%io@1MtwY2CxavY2)EYz_ zFln)xs>O$ho>}p6z@+4A!Q!0MrL71-?I1_V)xE8dOshk@ zxJ<05yz1&!16X7N)Fm!K;ojn`;V)^1Kpm;9!Gt}2XKl5S$&6L7U7j1C+lW5yvgFlf zhj1U5p3^R(chsg;hkrZcq*>cs3YST=y#(S)V*xtsBpPk@Nz{>|yMQL2h{`!98XYd1 zw!FzoX+eg)8q3?~@iSp+t)*s2h$-URu4|6vpD!APImdKMCD(!CbG~!R9iKuVs!Xqn94?CdkCz?QHk#0 zbpw^T#LIe&8aO4so7X3ld@vp-&BR^}mSHq!8!tM-C0{i{h6yBN)j}aba#llPNWhC+ zXrI+sh!nboBFxk{7*T|q8U&Ft;Nt5E%R*D5phoNH7KxFREl8uKuE48MFDy}+S{Jfuy?c`-H8VQl!$hZ^26mL651Y}Ken@wD_o1T~fk zp<;3isxb@+Jd>401WKreFr*LKo@EAOQJK{cfz*)!JXc4_wBC%A=%BM2bi9fq-@m}N zeDa9WRHS6AB5#yx9lvBO&s5~**^wjK6NY}p^W1_FSkcPfwThb}8vIV)k=qnersbLo z%NQ+JnVPSuZWr)!-ntgUo#bIHhL`RhS1~2SUt;F!J}SoX%wNd`<2VDQj~K^Us1Aox z>WJ#3YJl;bQM}@T@w=jUP25G-200$WYXYlcC;_U&ul3(h0&SWnb|&mR!Z3^B3v{P z5|p7r!pP*DV)odRM~=kFyN6~n7fn#P9zN25I5@-)Y&{Vt?jD-S4v&vy`};COlvoo| zW^^(;HyI{W&63TGk|4tTlv&GWW@l;nidbp#!T8Ck*^8z*6P?#=e|BVis$Xsn>e3-!c?bsyGRORSpJf=;?p#zH97wd#=QBTS~UzZSh7~2 zH3@HL`UhK%*XWh_GZC%H)q@8yC%7#JvwgGRLTfVDupnju#X%0m1hgh!y%8wOA0uf^ zKKzlZDU-~Po3*kyvQh`F$@MpLVR6A*Rd|_RkDZ>H9+;ek)?~3^J`BoahPpbSHCZ|e zW_Y3xT9Zo+5h(uMd&5tHwI&xEqD*-Lr8NmRv)EQ2(QAZjk6GUeEN36ICabSw41PmF zRf;ebCqiA;5Ve5U6@5BLJzNTWY^Vftd+<+sj*OeM3OY0`(9x4xw2bj9Bcrangv@%c zWM*!wt{ieVYh-F>Y6=DZ@PBc$-Fj0j%Zgph?Z#{7u7ge25G2oybUxZ1ANc+O2O*t_k2}->L>n2eYk#UCV$87vXifIoToGY)|x!<-(2TAzN&LV%&yK5v$`RsyDP+8+YrNF#0xRi#u$8zE`*dDLa;a; z-FUhaT9fUs=UV;b`uY+Jq-R4&cb7nV8$!6e0!cN7U~vVpwJ{741GYzfDwRbY);s;`F?^|>Sm9BBOCSTLgmKnKywr|bx(a+Z8x88mwbx^#^q6(9@ z9en*Rs9;B)$Y~o20yQhhEdX?U>jj zHzJk;4_#19e;JFR{qObkMzNT;(L}Xx#DQ-1dpK@vy^O1W*Y9->1+%=!4gX=Odt5y9 zHJyIL^KhlRHTm#cxfnZ-*Nt4k?8mFLmNP`hd2`U3JlL2UKK|dDtbU05^Dmzf=Yl&@ zxZFb5eu>R$LpJ!NkXf`0r&5O2WQ%mkrh9d{FSxk0OZ6V8>o;Vyw+I11Rj-}e+Bceo?KBi|@zyn|5!~3nt-uJMS?s%!rC%i+80P$S@bDJ)J z5P(Hl{UDe31HCa8xN41_(N#?KPtntt7A>QkMfRx=lBVZd^~7}36Zc-|E7vHL)rLlh zZ!OYWGz5~ez9W`b5iiWq#kSTYe3Uh7`?#JRAwsiL-54^C7ZeLrp5Bi(VuYvJ#~k1C zaAj}_t0z_^K3F1**8XHj?b#3&J$og{(W4>x@hd^Dis5_DGh=d>9WQ829u^z$%u{qx zEGWP=4FSsvFe=(y!=Yj>q2r6bL_-dxY0u^RdeEBu59u{WUKA?@jz1_RyNEBgAaGjD zM%*baRRU`{4!o}+a3Z>=IAajM^gFl#ab-dEvYhSXDSuvJ!*be1-27@yra!`iV0;o# zdl?W7##0QuIVN{nbi_(QYjU|^8B(w;}Tx4 z1-)^7yWm?v)+nMURTj;??mN12`{?!2ya@*l zY1>zuI+vWi&(6t$U~3W@VqE#)M98VPAu5m05rvSg4I%ufMTki^#K>h6I_yp-m(Z?$ zS=y(j1K_C&x**V+{KCeFA{q#g9vkmyIXmYDi`+M|!Xa*r@Y0Idm_<>^I1BwdqqKJd zt;rqI8gU&jd$tqcQ$0l&Rd?;ZY$CqWrO#n?5T8tIP41Ag*O*m&Gf9e8ZdkOE?JQc$ zIlF-0W@}B}E1)==lAE*fTvuzdUD_i)87{S>0sb&M9QVY0+X9l-SDEyYujrb`pBF>= z-ID9=r|N2lr)9GE_Ea{9j{vnM*JW6HXUt$CEQ3b`$PDHiwvenZ;S3n}I?;-Wyq^6z zy-1i_#x96MeUlU`-eHVlF%)U90BTyhSS+AIu3gTxe&0#DeMc(3vEG{Ok<@VwKsxTC zv?dQobzk}#T`IVyfF{DXsJ@pqWP%r$F69AqUIcPxY`$U|egS8s6~C{z-&pZyJ-n;a zntYX@;|jhX&%WaUb97(CgvaLq1yjgBXh^n}1J5Yo7%auj+^UP6$P>I3*_wQ(lp&r2 zW7IHpKv41SP7hs_WZ+DTO`Lp(E1{f~a`vIh_R7c=Uvj`t=N4@fQ$s^Q!6id8C|A~6 zllT5JtA5-}2yCvLV^{D#QShKmmy4i=X!Y=3f&4lKp}OGF#%$=@JlIg}6pq&-za^~{ z*DS*;;Q0O)A;x_Z!z?W2MQ)+6&+xEe=EYZd{B)hpOD-c*gG2puBj|WE6uW+%1t+}3@0r{{Z#hHf zhu;auB@C(TzAx&Xw4hFTwI;7=C@jY;S8)2#kSO|&dMrwGIF@<1q+h*;i+1<(^rAWZ z*=H>KT0{0mu~?RFJt{_~&Mf1+cwMY=Dy%4hA5E4Hz zE7O2$q%bc}==sH=q2;@>Va?D}wS3?8WVxA6P`4)U7I0jdZ69~8(cN1RdfX)0e$ig= z3=cO)tPK!`XD-_Nu)CWL5%{LKZ#lU#HKx=rK8hj4v&?-2+1n7}TcrT!d?@kzxXJ(i zUAm0&`*ZBTuU)~N#L6w0 zitpjF+z!EP|7*Se?A!Mhi+JdaGhCD*B<`^IB%ofgFdel_!bX_y<3{+>^YvUzd@DK| zxcpQ^YjX8Lp1wcY7)9f+gAX5JPo2M&!6(n_?rX#{XYVT+1)H>}g;&G3zd+9%4+vx4 zl%fX>+)tQc&&Du36w;bp|1$$Gjsx*_G_DMy;NQ*d{Q7zXKR4c*T>n>wTz!^asFJZv ze6Vmh%@>)+^*;oeR=AKc-4I8^J1Q}j4CjWJZNsswWCe>ZKXQf2I_w!GYii*&DCT=* zVt@V)y_~ia^m&CDi|l=ms@S#H#5m<`&ky)R;W;BfCvdfc zo2&P*-bon3-x0!vU>QcHAJRd2W645Wirrr9LfoIhnWSguEPC7mT9c0pn-kC0Yez#n zF7%!D0b0j=NsL;+HOz`H``!rK#LE5E1%02`EV$_Sk}HAQB{{{nD$RnMSt%{J{2iOt zlN5X+iUra zSmYhL`JAzmS;5i!GI2EG3W+QSa3)yb1dOf5u(TuJ7S;3ssUHF=p% zhF2y5nn;OS5(PV0tSsy_-O{;!Ip4AC+gcDC>Ad~w>d3dVvBE0}KcUzE*GyrE_8 z9Kx(ENF+|#2k_DJTjBr4X3#S6so_N8lm(z=C5@e1UMlRg9je^(JFR`YcFs8^!}Ax7 zA||jMN#RxkpuOQ!EYE`kt`Bo3bXw#%F0q2rE+ZLjy*A<=>hS@?Gc zBw8pPG{5`uW>}X5hi+hDCJvtZmCKtUef;ro>bEa%hAWN_Ih;VLPJF>WIAJy03U?oW zJhcAs@@BZVGYOjj;KWm(y1W_w>V)Ir)Gb#u!@r(zJe<1iie`B7gyR9A=`WM~j&n%% zXNOW-lj42$Q(-X^Coce;fVCPw@pw3SAHWINHftwtP~K-f<9KMn8t)Poa}p*1AVHO$ zKnPZ;OGqI^Rqyl9IG(F_-bqru;z`G&7B>AK>nF;!COPi(D*zo_tygq& z7=oH;vWJ8Bu1=U2;wL0TkOFjf!I}_`KVNZC0Q7RwLV34@aTcBDb;GJqPVQ;M zN{BoF5|9)v+$nbfdxd`eOBA0N&hSe#qOJ+x^AgrEEb+LyF7%&CScfC+hnI48+a#<* z@%_lOkY6KV9jrkos0#Lt5*{rLtP1D_f6wKq1FOrJy#o2Vgd0P%j%xc z@XL0whKu#YgssoEJhn57Y0(#9r9NZKt0-`#)p(^xe4=P*? zv#S%*Lc2vm%s7U@ZZEWphc@7YJ%3(^e>c1V2s?kT5T84;0f_p)5RXV$S0pk4Fv=`` zBw-zjtiZZZZyRHD9f}OWnotkDYy%Y8f;FKYx^M$j2bqI4As-sw0LB(!O~{8PHh{5F zSQGN0$qir~yE@v>?}Rm>ADY?#*V*0K(bWZOLO(RU0q(rcuFjqwSQGl8mv4aUXz%Jd z@BD696TqRF4S=2P7o6X5UMH*x;811*U{}WlUAx-5U`+srW;X!#?CR<1ZtsCL0UVm! z0NBxe{`u#3c67s=lAIw08q!$F8o< zj`Pp&?143b9J*)&XlHj%*RJ!r&g+IXfgF0p2GH|%b@!a#enCektO?}M#T!67+Rxv0 zepg3NXBVsq=Flq@HX1i@F^}gqYeN3AgxFnTLr1x?P{fae*sc?vu38uDk0q>2qdgn| zuj1_gOTs!VdNr^n)UQcchvHWX)`k3_gmo}l5;5_c4*;*`jGrrE9o8&Y0^3~jAuWgj z3G0w0t3*dy<^|wOSO@e2kAPJHTqR*0P&n@DgjIpuFX2Ye?k-pt$g{ItvpOhM9IwBp z1@RII>yVxmR6M60dIc~nVI5GOR+txhLBcv5u1p$^ZMH*IAn%c|4q7m2O(j&ORl&V^ zeuG-Y@dJBdRgfQ-@EAD^?u9i${yzzik)nSutPAp&5*{N(W(>gK@*gMRF;dL*Kw6OJ zNO-Ii7eKEdUnXH)ipaO$-3jvo`i02_+Za5JEr&0xL5`ujB&_h zm>1BZgpI)&+}`WMZRx7u{z<}P;OAgffS-`?XbJEm-)n-qN5W&^=U`oczmo7M3Hkvn zmSc;AM+476T2MPAJPLXjNvBtUqY@q~!5qvBa#6ygra<{r1$dc+M@ujOtAe^l!lR<+ zU`=3mOBljo6&lRZ=WcV^yujdHKpNvI0)+P^G!HP_A-aY;Pl z^H$*()qAD6fogusPQt1n@BPbi4pkEePS3>`ut!{cm`0wbFeCa&q`Paq{H|fuqO2TC9K2I zNA}l+`bP=tP-VMpbpkB2G)|SU4p#B;opMMEy&z#7j`kjMP!;++C9K1FhV5IhD&*TG zYz#w(8rB8!n1prEf)$kQ9KZ_K^}3#x)TAYmQ4WILwoS+FXATO_OlItK2~lu$baa_OZkjyk9p zaPKhbBwSTs|0Q7qxVF8rCa84@>(IDjGEi_c(S}TjJma++6vwv<`TaRa3%y^$I?le0 z+v=q<%nRbn64oJcQ!fOs3+U>9*f@K3+hJ88pOCPQufO6?;1<-H0Jgqv1D+xT0;dIZ ziG&Tg^43;WAcrKZgNA$=z9z6gNmvIj8FT>(;PqV2=SWxw%;SN7NDFyX!aA6VU%P;L zAwMZ$9Sk?)iUG|T0p7q_pCw^E*b0K854}QvlZ16R*XN1#ssOH$untHkjj{zRF!Fg^ zoLzx6fqq}YFbVuyb~A)~gEDZy_IsQptPAqtzijY9yRp-8_ebgPs&eha9G~-dxKwGG zcHXvfFNMFZ&@+}h#V>)=EAqAEEiEUk{l=l~le45?JF~$`*@E`A`EN86Aw@?NXd@U> z<-nuO`xe|6h7`?~x8l(iNYNW7@JxIz1yV-QE;w-N+pcQ{Naby-nCqjM?Hq$IM!;$O zw{=OyC_?H1f)-3-pYFIG6Z(M%JBI1ca^TInvx~M5FI>O~*by)9`>t)~YVGQTEltP4 zOL3bE;Pep1rQ4Edss61{PzF5|BiJ-PGPffxsu!l?zt2uD;Ju8NQ__zxn>O6q=Kq|I z<=XM|nOu2YGn`KBHYF0hv@Zv6<~bCD$E~31;l>xnaamDb+pBkQWK=W9DB(A-VRO@F z2ZfPg|R`rS4%zjezs-qjWY-(M5NsSasMwznP+b}zPK0riB;uHzu zB`Yg{UX~|zBFlr(>ukXx20j3AIpA%2&`hWr~<8>twU}-VuLC@JYqCg@$9_MrCr(=?^`QRF)PD}rW?caxP zR8rV|1e*oz(ov)kvS?{rzl8^5kpK@cHj1FBW^4)5I5+AQ4vYmzxAi^`iw}^Zf&)C~ zCM*OSJP{@K>~MI@!ZZ5_k*_$An#Vu2x+BXQZ^Z5swmor;#QKaIn_+wPKe_5>T-^04 z>}5SPA~bEQzJj~$v$4sV;Eanqh>Z6?Fs5bO>XZgZ!0E&r4TNsYxr|kszySIy@Uf>6K_#3vS;O{tw25DAitp(uBbD~Vla%HDm#tjHqxVag& z_g>D`II9sN-3E7w{@@D+K!^V!HEbC{#j{{54YDcv>MHs+kfM=>cpXPO)7NeITv@osuBE?SX2}N{ySp>5Y}fcv90&jEDLG?tr69UFC%bEwz(7E zN$Y{kXPROAyu(TuTE-2qiMI6Z3`{vLJ&g|k-)B(K_8Iu0QqlmWNEX1HM$37TkIf3eiC0wkNGlz>t^a@71$#=ANJ zZ}e=R|9kGE8NcBOBtk&aVf_K*E$gj7yp){$pt~!CGpbI_O<_JB|mDx5Z%(Y zcGULA4t^AQg_)jk>#>T~-35=`+6>#_>6EOy3tHM%U&eK)5m^>s=(C!J;$4j>RFq~D-CY1}^T*WD5Zm@yaooDQU`xyKz2f9Yu4!E(^7jB9|19>+2U!_5Y#qk7 zw5^XlEfL_+xHn%jxd2CV|l-FPJcTT#&n1f5r@b1qw!}hgLiAj~w zLsc#ghPL^?E#99km{{dUV_Ryas4xKzt&LldsWjy+#bD4L!z!y>rGY(CMBZ z--d#^l?$uJ9vyOEQ(Nzyo5={K#+<+hIPEsni)b zqjJSEZSR$OKmTHqaSx{0 zmMvHr{1?$mR^ZttepMcMAqoFQ#eOVl8_S;L5R`#g%e1+qJ(p882uu; z8uBk3wc?Pis>kCxAlZ7|Hbvu2JlVD{HpA)kLd334XlgpKx`lO56{H0Bd?oO(} zcLre^-{^uA?NiY0EZFOP2f6t2K0q~b9sS0&>B|ydq`&zPZ{C5M5>1q)S@8<6mSA3{ zQ7J6q&I;U}cq@_1aBt#6^p|5T2W7ZVe!0b58P?^8orA*(azs)kQhvPb_izGl6+(*i z6eAu@(C3X)W&Xk}US5AZf%mT=h1Y(3xNH-r$k9hD-YLIOSM8#;cqtr^7$0wiA;-%% z(VQ$rj{;daxI%tA*8YrL;Klp*NgO>%f%(9{Zu%dz=qcO5$1|@Ky6w~beR#k8#s>=a z7$H=(-^sqk3?Slz_!;8<3U(v;vDNkn(P@Y*+gY!h04NMRm0O2D;YD$MjIsfk%| z@wC0=(S^-hB_|aNYny&X%~m$NCAfQ&^IdFTqgX83&Jx_a3GY8cigpVq=Dtn0QCnd> zty}@tH*qWSHXsY+@TMwpVa(8S0Ee4c%{T_%1pl?fV4I^ID8a)`%o%@G=q0&4Jl^ym zal$xE3)Ri&Gyz4BD6D;O*=805f+)^kvdeH_Gp!?~e0&zec5qY7wBX9k+@AgljjVVC z4-RhT!eM(*9alGVt&8>o3HF-J_I)T7`CT^QzRl?4K^WtgVLcvGfWwbw&8!vN7pE;JhYERv#O8`Fehhd5Zfd^zzGg_IN>drQ zsrh7lIg`Zfk6OjtxaGiFGYbOcN0D%M^O@h%9gdwPc=s346N`ojdZlE0^%Lx4MK-1Y zmnGZM9~2wIjSWBf3d)9l6!1fB?Xvi$MRh=mYn!DbT#$Z@(qwa1-tu6_v%iKMO3=jh1V|7ajE!lAR#ivtEO~Q z{_+Gje!;bKaAkt~9hHDpL5vjYmTx*VpnbMPsNESSEDFLO8+d|IN&0Q%*k9l(te zh4=jS;n;32;iK<9+$03-=eARraxfZhPT*Pxr0@e8cEQ0t^v@*Nc=;a&$A!Qlkk4c{)n!_t~`0t83B#}jxh4R-+xrkk_c;lL(V5}zYF;7S!y zHepqM72L83*T@gUF)crEJs+;!^aHYfWK_x~+$0DTkr^z*n*2uPz}|ZIrk{TubsOz1 zUgx-X)5qy|5x>mg!{JS=qqrmL!NZ#lehb0k_h17*F7~?CXUoA8n|}Ij1Q*Oc-?#mM zJ}Lp#B#n{ExhTNzzN99==)apw=$qUo^XQ@*?u{A~;)Do#hQ zsj&}2>}gy5C$uksGqXZDbbbu404?~ME~Kb$r5+S4DIxnk~HVA_11#NQl{Mn(Q{4Cwv7`}u zg?Q#UYWFJa^z_omrmv&Am$~|CDIpF@otA!x5eL4m)()QamSe9S#QE%KTkVr&oU-Wy zu*skSD#hayStsr^N;kk6Q4h^XNG2&`arMx9T;{IM)|i1 z(}%x-B@dTgq(V*K&^z-Y?$yJmzlj34vu4)CwE4F6Zz3Cj)Fq}{aRQ)+qk#;@CBA(r zwBSS1kis6am6aX^;p0|$iZ{aPbYl*l!_`D8?MSBC^59c5%dmsF;G;6j(5`-50zFS) z0SI;pjPeg0AYt#za74k6J0Yb{(Xk7sTuGej}^Ov(eUVQgso~J2BzK-H~lXRQtBo4K_jXl%!0c={cnBYae5E zitU7fMAV}`p~ zTd2lq(JeKb+wd3|+{x+MaBYT<&Cm`tpO`r&gMZg6A(LY~dbdaVRo;=Vo^rzRAD__+ zy%sN;7J8l1)+u~TgB<`Rwvh8l_h~YV=D*Ok_F)#cN)ZuXuP4D7a!cEKc)&weeQ+}3 z0liO!GdLGlf+%jcQM7Z=#PcIuiJ7i_adtCqg=^Vj2G`w(P1MmIoq}1!X}D`Hksop3 zd(E(#*j624xl?-`r-suQc57SjEz(ob)Y0qAq+vK)bC#gxPF!PBm5wFOd@o!_?Cyf5 zmS?O*>xdV3zA9W_yzhHx9_8N|8e!p!&Cs$<2wcidaAuUWy9-XazfsceF8XxG*7~Gj zN43enev_X1tT;_uIK^WnaK-&N&1vX)Gqac9uN!_ki*npe&9Hs-`K%VolVMLC=K|5u z2t_2Hh=$yIuGi|O0DOdq5MTS0hB(V{jbcH_>DQ)*Lp%QBbXYS#9SMNG*N}dlUd^4u zVY~X!VtpSwkII$sfM0dkzD|oa+Q}%UttQ&4GqNO;1=>;N@d$vJvHQi0Q$^bkV5{>0 z%9Lguq*k&zBX5?m*-e!Ur(zU`JFT8u^M=$%h`aeRy)V=$iC3 z0qA94l~!x}@nzl7rXOOq1+!#$OB6HBF|?UdupHP+qYti8PgIKVO8!L*_}t?>yGpo0 zLeHVW!i(=fmN?p4VE!}l$F54(t#Z5;VdKiD*XLP|F|b&1mcU|HQSt4!@~&rbsq>r# zRSLbcMXncZ8%0Y{cs7}mFTpbTS1F0|p_=#@m7)@UUWxKVDZ*um?2oXtC_>se8Fsyl zX*h5tFI=gv%nkdd@9T<9TT0XtUwZ(xdm9h1QSVXot!=A=OjPq2{Pf4b=RhE;?x(IORt;9lwsp??`YVb!*#N=(I$|q*)Abi^|Eu z7FG~C1Abgh9YR)j>y04M z^E>@5ZSzBDDX`Cp`B1V9LHmBBivgDvP?-LpRSXPxd|fwUp{c3?UD>MkvG9wcc0lVC z?BvR1Ef;#swnJw+#ACLx|f}wV@ymi~^oR)Ue(-|y1D@cdOu+qkXy_(0;FGuQ$_h#E8hbTVzX^e3N} z+SN%8{Py1WhJ6OLa91bI2)Dx>VQi=gs*KS4Q%!%P?xX?IN~FG#r5AT`!hq@x7{d+R z!ZyV>vL5XfSe^(Pqv!@9uidFmr)BZLgSwsOCq&8P?LCZr{VsN7qrz!`o0{6@|3RF; zvN>uQILC**hf#ERpaDuQkDs+k4cown961mKfZ*VYOke5HC;X&t>*9Qgw$#C za`+L)k8m-cZDiwHB-)Mz79KSxb=tgaR&@PRZB{(Fa6CGsmJ^Di(S@9lMN8ZK&FqDw zEGO_*+_bYM#>?u^R4OxWZ!LB}p5{A@it8#(p!Cxshw>};DC?+j!^PiJ;Lp28AD@2WM z5UE7}{VNhkSS0SeXgE-lq)b=;T9xU@olj%iOXISmEj=u)#<5(qTk)n*3N0UcaFpLx zj+2s5RQi*@ZeUu7H1KOQEpqP%Q*N(*nj0cAC<}J5&oTqogRO1pn?lKiOM-acjf_+a z9WPe8qLO{-*Uj)(C8KN2;=|C1^;Pl6jhf~)a9?kKt7Vhofo@1mdTy@H> z@{s12==!8#Qm4&}R-tVT74z$G6wyD8#VXGv_qQBq9(K-GPWeV|rtd}Dyg5IBt>hp- z9X~TzDJ$=gM5R1ODoyOzyrPAUdaR_lY7>@!BmWXrT`sv{p=C!74VJ8gArn~#Q+k3E zKbog%9wAwg&=4Tcf_I(loN!j^6LEXwH`;OwZeJQ>xn(@ON;ZrxP=|UI zUk}0MuI;_z9I7Q5+^r;ad+8@N4Lb9jh|3}(05?9hWzdM~({?ZJ{YBKLp){syKw`hq z3a1Gzm@&HTVWoI45w|S2&p(%YU(_`VwBXg!Hh%#V@MuI1fQ}F-Q8Fs`F!uD2E62U# z;bz#rzQl=@h@w*i$Y}fg8B7mv9?B%XW&u2*r8mnJIeJW={Z@hsbJqY5zf{d1a2+3L z?hh%~ffja;@H1yyZ+ZlW0y^vosh9i?e>jyAeOVpudnx-RMb{5FX8ol+-N2YWx||1x zIZ8=IE5mah(M5wBAGnb4kH6LQBPx1Gy)2>1?E!r7w^*e8(87P<>70Dg-49#w+7(2< zapwe59A~+CNYe&rYBA?g?-1XJ3|#wXiDh6Ed>F;=%|gnXL{D)Z$nOfXz@jcP7F7kR z2|A;yDjJsfyN_rc2_r=^+VOO`K+@fXBdIu1D9O-tes6xuhW-zxjTs`mg(9aaa7#br zfuFYD=v2iS7k9L`x5t)9)?ON4D>}SIDVn-d!lxMV0?n>Y`1bD_G~5Q*Ce?}!_j}Q! zQL@~C$${TBKOG}bHhF0vW{+tRfydvC1`a$PM1ut_tZe1MT=mv$zT%ircnqh)U*N$r z(pILuu&wuDbO7+h0rZomlqZUA1paKIit_$r3;#{Wuspf}1t*{@jdNhX9A0@Yo9M#B zGeb(zffWDkl=+!Y|f$2X(-;&ftLZ~R_#BooTc$-A(%ZM{Rp!dzhSQ9LS)`IMmr zeFiO~DB1fTds?ks&<5>-8kF(GwB?l>`4F~WHUe`o9Gz7fw2M}*l&051YNLmi#r4>D zJ+4rO7Tm(d8(;Vhqp}%}y*Ok77t- zOfnz0hWfaLH=6o<{J^#CI&`ZITKzE$CGbTQv zL77-N*oqE1E^Ya~?Gz^H>qC&jVrqhDklR&{H^U1;U%>J_*W<77z}8e+&N1<=AevHW zf>Dh?sc>`F@_k91YU{mE>QM3v;oAb_fwHHm8mB?(SN~BfQ@Lo^BEqeyUb%pFtRgMA z6(`5n32~h{G%d>@+d(Vgq5&QSLg}%4gXgYc+lS(Z6?9&Y{E=*%jEijDa&a}t;m!h& zn@oRZoc>HW9lthHwD3EF$(ECPn|RkDjKv4zlUuifM4u6!ppVyCAELQ^n|gI>!6f5y=P z|3;+`=f1;s(SkJTVTuNtc6Jce$kW3SylTMfO0+0L%jy5Cij1 zkiiPOC&i-O`ZXKw|MzFLi18oq-Pj$(t*$r^OnGf$TW@^F>&$a5=Doolz-zwIT;a@f zF76^num|vE6)isGiYp$Ywja0!&nUt7p2X2b{zc-6V-6grOg5cE^#LA5A*3o!&hp4% zuO7$VdFWolWgMXzF3$60MHg^JuGUX zqs)hA)I1p3N7aoFztMr88E9#zQY*hAe6$B&2-@B&Z{{d+#ldZOmuL8YI?_mnF^G1Y zs=QR79RgYJE3p)t_&mch|7zx6B{!dkmW!@y21sS$gp00g2KfKkdmAvjs_JfhO_=0f zAccv*aPNzRs{tJ-jWfw)GSRnn$OjNHFk}*;jdAA8y=U$mbMLu_bIwdMS{^TGZQ5Ez zt8MyWn`&*T9|-sbeh%UXs3?jk3ba$G7_e%rT4P1|Kfks1K6{^g&rJqj`?UY}O?V!j zxqI)k_S$Q&z4qE`ueG*ekW>eM{#0r?C7F&Cr_$e2jZ?EMvQcC|Qyj2+=M(RQWZ-O_x)e#3PFs>Q zBQRK+2CuRkB#4@N>!LdGwqaF9E%8cYZ(<yXM-&m5PmAmA<7T#%annCMkb0jUMo6S604y_&5TM`bT&1Q?<(`WGHxou4lwrz<9+*Lw5evO3Zy!7T(YuyrVU|=|2`TMOOI+~sPcFs$ zJ7HCuo!KR`@SJ5RF0+H8a=`TESD#oFeCb|i@jM_>h8V18>UQ>x=}zIb;FHwu}cqJ-~CQF4EOfba zQ|MN_m=0-#Si(kh`1`lT;da;+B0BKuZWhy0Mh9Q5o8XNy z*LNbCe|7iw_$wX(gNx_^T?j#^$`0$Y@{Bm|(*DlHb!B-R zxOXX5Ck_eaX;;b?beVF`obr5!AF`F|8^5eRQPr>n-zcG*hoT;T+L4vmpzQi1t0izakf@5@AoEBh7AhHHFv+V`^U4ed%(b0B4u| z`iIBc)eYBmzmMypvNKD!UDy4LUqegA2{8?H_`2>PxDq0Yo7dox>$*h_DQvbmLEu)9 z1!j(#*LP$0p+f9NG3~!zyhF@T&A8@Hgn(YRdzU_QSQ&5La#D`=rMIu8u+3|EV{+pZ z5*_rFcbYTZ&$eO+*>~=GbCW$T4Usc7opEw5bDzT@58GnKC%<{JC0SGl8O?5G$gTVG zh&}7zF2Q-oE4JOYfZ~~%na?V6BSuh|$T9C-M0^rU* zmj+OEx%60{t7a!Jw^VXw)RrsHL>Gff$j;M|?I{>Keicb*KacSh;zsP$Am<`&<&EZq z8%xZK27e2hyF6!eO;TfV4ZQXB$>qAsJ9AB9-$>#;I6xx#g~fvjVX14Z+o4-SsB5L9 z49%r$?X@*C#{lQ)2qTEUg`a zrFN!_$SW;Y>qE()W6D)ciurd1rrD2Ijv6@OevK>(7a9S^zZT_ z0<NBewIkH^V0+dGs7f}A-GcYdx@nYAf9?@?3_a-OMB3k5I zDd2%8+K%q#yDQq{%UIw5&#}PsB};zc*o6!hHVV73 zRwiX;ja)P1gpMD3J_i7r#RQVVFUPdRLrQZfYHyTw!Ag3Gh)qaTNOwYc1h?Uw;s`)0 zaDjCSS6X_a#8d7JOROe}Lt8T|ki%L@ZW#-QBg3dLs`_scSIGSd!Im1S-UUtgUF8x6-jEaxS=LrQ><;^D+7ybc;b+W<wjSxgWFvMlDF=ow~IT~3p|Jzpk zZbO%J+n(aVB$tvG#YB&Bm@FH9gc1hP^p{6^jTBm4EvxLNwqcZG45{%+s5*XQuMV^G zm4}J}Y`)%hraiv_jh=<6Rn7~^)CP3dmLk0Y2Ti;HP|?1wFeJ@H%4?gwZYlq^d(k~- zL_;PP)i+dZI4f|Ga*>JVB3w*(f6cV( zROp5i#FB;r&I0phtAGxia3e!Sk}`K+Ob1Sbb08I}2nD2rr+tlUBX~zjr#GMW?6ZMC z7Xh!kPMhKa<~nI}*I94kB2Hh1HutVNdnG>Ng0a1>8_)x**jkqq1u-qG5;}0J?P8sA zD|AQ|%Xy6sui7WD@D5x5RY+aZJogAEFXy6djS9aqu*C^$9v`_?t}KtxE^by_5T`wr2Fb@!aPzui6zHIl-`QR#2T zFFprkkif%*a}m=>ApMv#C42A1J{{gH^98PqkX`Oan{WRJn2|>pvFdSTvzS_>h?-k2 zD*>)QQ%9d+LEN4vHzgP?#EjI&Ivxo!w$eETzuvSy4 z*!-qkS6SSp{bt9#(OiFb!WaY1|L+iJKl zxDI=ReW-_NVL%%Y|8y3gBoeu-vWpeYocN+#x+6uIK9*fj#tdd3?bvan6%0OZE?F`0 z5=&mghhxpUp+vw})ghZbew#fj4sN#^<5;DA6cP=F9f*yJ<4cq%-{US^En8)Q+Yoyh zcOl0K`xU0npDY~UD5}n%@T=AXz5n}Q=1v10STk%!Dq!$&GrwZwVjK6YGfK^6bPe{C zGgGBBL>5w|YiWPJIPu$RI6#HOaRjm|{{zS_9I|Xw_(R@PoB0(Bb|RBzm$ACDQNmF!6QDEE(7nN8bm@%pD9$snh-g_J29?Zih&&g5mNXu&^No}*ISkmt}Xw9#nKE*>t zbV>d(z zty#C0uh#UX_sWS9ZI%_Zyml)Fzv0ndtc;T8$YpM((uX7yXC6@gtP z(UDfB8NAk`6;N&Iw4yu`ba^Qy-UjAu5xD6k2xX$TsiG}SGutAB`yLCD734OF*w4Oa z=cu>o%LLk1IIb<6xuB%|o@X1Ekn4`(5@L{G0Ph9(g=fl&P9zCe<%wd}>D#{wYI?HH7_o;_!>Buf z#Em@3L%B)lpA03bE)*xW$S{rb7oGTQ@K>W&NwCjL5tQI7X5EmT#(FSi7BLf;H?Fb? zs-Nw9>H96eBr}WCc%FgQoR@W8m%0gKUfP2sXhIqnZ#k;`1u^wJ+4eyy+$l z@lJGh?1;m%C1vHL$ZD1*g(VQnlz;7WupTTyCtnbbmWgayT&G&f3xuQe3D~v`Dlw+s zv?7a_`Dz=-6Qss5!w}7hRi`dPF}v~qdagA&rXpqN)<E^sXaNdDC3ErV{`^ z^&45#Zfj-dlUJ{tac7ViFwu3`Qq5K>DzK3{&t_<=Tlr-3^X#rv;a&_^gEBn8D#NCl z6Gim%PiAW7)$*p%oi7%A;m76DQ~gu}giQ)AKlD-2>2sBioL@Nro=uJ# zk`k*>Ez1MA6%xA$?B0Il!4~cLReBcdHi*jeB3@jhjYf_7#M13mYV1gjMaSj+raUPd zmNMkM+!<7$#*CN})i=%y6b?( z-7Po53jO`Da8&Jjj5uTjWfcm7^7pt-8Yd=qm7)xdC6GT8KL!2L!A0#;eB3eWC65y( zT^5gKC1*2uCT}rB%5Pr>YT_2GM|j#2)F5Wk30*MMaZXL6dzTn$$(;=C9YPNbjG9Xx z;a7Ib4L@?jSts^pUAjTNB?Ig7fhFVX(HytmxR*MpewR^sqx!+S(#=cu4x=S+OSh>X zeq-|Gctj4GEfvB>Bc{8SWbuf>c;7nflpDZ1Vn$sxHLbD0$J>LG=NmB^Goh&uE*^qX zw`TXQ;Y5G3>$mtZeP$>}%_V7FZV4Q5JAScoeU4f~U-D+pZtcM0))+Zz@h+4yoq!?p zatAl-)Mz;~Z}w1t>XD(g)eVV-S-E$8M^?~Hnie9-0%s;rEiOeav~|P!HlVZ}vuUug zo6@V-TXSUB07#Z3fy|zq;cEkRVmLQ`7VHq#Z`e*oedd zWxhAukus)HXWArffDK)>A)(If1{|)ELw!rHZyj!>PYTe}p%5>sP8|WOlQw`xLu(U; zwQym%-%73*QcJ*M6z}0E>9$y%(qyAiqr8b^Jm>j2iS@DL*Aqk8G2pyoLz;i3Q~KcZ zvu8+ETj5eLaByroQo<;kM!5kOw4kidxYJ%xZbm4dMAp#J<~wI=lF?R!@1+cj3Rh&GWtbOkG{q!|7tLGpBPl zVVl4iic0VN2CPd^nKw0jDeIH6q$604FKIY6>i_Xa(U{K}o4qLB=K0#4X;`XadAk`w z335XUz{&UO*;!zRcqST^kMJAY23;+`^*3BLVc>{A1~TbSOGDd(g90h5)*6#eE#hYT zqzLdaShqq=_0AxQ&;%lr_IC-@m^YHr8&s(UkXs*6<Rl!sTRiVR=^x;54H>#qF zTk*{fsR*W9dXrrI5GZc|nEafjwrA?%>W&qhD2n1T-s-7vb`bt`U#?o}UZXsVVT z=n}#RwkRD{5o8Np&~Ei1jDsyk-4HG4kg76R?~J{g_X;QW8a}hf;jVWwGl94g^me4{ zA2?bOCEHaT1T~kKLUy{^uL?N8gS`dmh9!a_7jdHlszjXKCDQ1iD&vFOjY`=Wr+-|s z;)N-p-oBv17v!wh^~=G`>P>KhL6VJ8r$Xsy(|&=*`DA>j*53S)-(tyayXTIqXzmuV zz(yxKz7$S0h!asV;H@LL_P6J7$#nWiGkIh%Fl4dJ%L(NNW*fn;N)n z+v`&xzEeTy`4AYh&p z^{2B>%SSg1xB9VL4V{{%l^cdv%&L1+^?Ie}2Q%g}b$|zLwxkq3w~y!uUAF(8FUM8N zpEmJYVVfezS>%IpA8gO*cIAuo=gQ&f{F46bLIK60y@wSnY@fx4-@hycu=AI1OQ17e zYu8ZzwB~6F7U#nilyog^T+~rZhc{(pkF%|Uj(Y#W9KOn4;;B)dp79YyW-8HsYh@ps zSWKypJEn*WgBUSamS4Cr189tNmj8fy&f5f@D|=Lsa7hK8N|Gg7;Hm_N){zd)M06oK zILkO!c6ilq^(*c^LcCW-qkz4mIrtBOf*CC&+Cc|lA>=EgQHs;BV0%aImV7&wVV`$9 zNOow~P~Q_kD|fBgZTw+U?Y_1tM=jw>crhx`uHfm)H=-fE^|_XAW1W4ICKbBGZem2A zc-lu>5tz|qPQ3xYFG-)=j0uV;&(F1(<(2yEn$1wW3|<0~UwBD|Y2hT*(&LSrGx4tL zd(7)om#N1#rA79wHyqVFnd~CUbEujP^;M*8Ds5Xth&GN*4ot z+E`0CLfBe#SOv+VGv#e0u&M$_f}D~SjuJLvm#(!hMa`m}ru=7EtB~&W0V1LTlh2Bq zDskMDHPOJ2H+q6kdT+C)oQxJVi<-%KPRs~e$DgPe=%rwoW)>!@P9soh_^#HeLY)$TRLUa2%PF+v#VbyCK(}UMWVdKGtt+{N zFtFNbYm?042*V&ij=I~P|SbQh@ z(b!C#L+djb6AOx+iV%XHS&vY3Zt+7qKzf6I2azwCxsC2r{AARgHu+lpA_T_hv+i%YG$B9$wSj{WD_5$PQ7m0mUJGuHMD6~Ks zeDR{RO!%~MDuEr1F-eudzl0>7A77YoM$+>9l2mwpe7<2LmD+;8W>^>L7v3yb3=rS7 zL+!K?B;7Jl z=y3jWn?7xDWBtF3F}HQe{qp}fwSt@*Gyp!TWI^e<+?MOf;5bzSE$Bp*$KJKGjuoB6 zKtOrc{f|N3HcGV(nW@}5+P2TKhW($ZVb|TdGEsi@3R{k7P^R8a6e5m#M3;|(nWkpq znb4)u%kj&sEc5A~Utyh?lVZ6fx2)SN#v{E0VK<7juP9fI^Knb7VyIUo;$4-|vvl#D zDBmNGeuN4H zo#~=5bmnO4N~`1KwdiykgsdO=!By$4_HTZ1lGWQx*@8KArPbf_62p@m{#K_$*8$tw zd3UWfcP!1XXL^BT5IF&`s6~~|3}z(eWGT@IF&-D*36^qYRQQ0DS7V~#8C~~iPmzBM z54|s(y=bky8Vneess>SU{e~dxB&4gsfHtj3W9oqvgVL_oADg2U_q}|~VuECa+AZum zPcH8#o*!#%aIpgTg0V$yb{z1pBhaopZz^b*V=bD zW-@Vstlpig22}dy-8fSOWp#4E^-VwQPn;i(hFNzm_%woj2;@}g6W*WerEt+MDvKRX ziW;R3PAPbrK#+_AEybz<6?iZfb0%9+M97$xEE~hVIKJvU8=b2+vJ=%ucV=;of*?%} zSVCAO@?@X2u0qg2$}Q@-{Ue|^K8mRDwVhB95*dclF;{`QW+!AVQsZh47J0I5EO30C z2;;Y2lB0|~xd}^Wd}4XH1Rb(-q`EleCDxXsFzl4>BOr+lX&X}NgO|O;5|;`^3~J0x zw?oR3_Bm;juZkACs*Tmrv=hL+rse!0Ghr5p%!S_M+W;bSvi*)G1|5}-F%_k2chlCZ zGZ>@|{Qn$$EmoLmWrhF2Xus(y@Xvqubkq9Zv1j|g9i3lJ^!&G@-TZA#<}pNEA_bEC zp>TaN8G15Ph>Gk>r}9B!qXbynF2FKet_5z`Wlyd~50XF&XlZ9HA-22|XOV6ffEMW8 zyX+C;YTt_xa*ca;_!&fW;Y+hR&uaO=S;pWV#SRkqY?lyyUvo$#&3+m$WQm4 z#kY_~IA=lp<}PeIM#aZnFk>Y-7mh3}qr1*ZYsR*YA2ez;G1-1Ca}cK9((ie9Rac~J z-l6<=F$#mJ`Rs3AYEuv8o872Phj!rq;6(n8O-YS*kFGjhK=~*b(8WB9A)wLq>h|-|=mxYmg4XGzZ!Hs=|Gn>*;}Cn)g*FjQ*@|{@k~>MNB(QOt*nh0Fr%L9K1th* z5;iv?U8SB_y#?*J%({L|zjKFm_*ltV2^7~K^RwpiG(T`Y>H#~2bI*$ArE(w1*Xun- zL5aP(3xll94)N@GjEoQi|fzR%Nkn$=}%=SGa7Ig&1PFK%_esQOw{9ly(8+)@I)eenD3A|$Wpz%c$`n+ zxT9f4AQVZ&Ob-~t;v);f_a|&s*Q>g`GA!>BU3RhO)+!NE_aqz>$Ei@7gm5v6y#98p zlL1kEZLyPJ#)Ker;y1Jlwcm)nsX67NiYj+@T*}7dX(V_X_bQ}#uC063(O)_c>4Ww| zJuSB2K8qzRdJH($%q1ib+;9hXJvPTVZTOWf%Uv)Ioj{Mp8A$9-YxF_QS*y%U1!qv- zT{-LY`O_KF=g)8;k(_JV90oIyn4E+pu<{?Mj5fp1w8mlGsjF&as!3S*S^P*7UH{Ex zbb9kaxrV1cDcoAl(X*6PTrDpVxw`4U>85S2!u4mInX$f9Uj?%bt7I0Jol@@j3+z|zXWeWLDqAP(zdF~r%_2?5mZeaV) zC%oyDOr1Tmf#Z8+`td!GYwF)3_JF7)v)T!zi1HuB)5nW}l^UZNdZ%gjd-k8qQrYCxYBXK7qz9e~9UNY_-sG^do93pGh`fCxvl52e%`Fue{JeEDkvv8@ zPF6<`w}dOsd5>)nAPR^bJyHV89HyPJbm$p5vxrHe9h!V0p}C?dvo zz;=f`WyOS@mhlv8dx-do@b+noCdtkqb=JP7t`9}3WXHrBdC7o(cUs?FsTFZPTReyD zYa8ebMd%&seyXMA7p4~_Z++LT?DV0>mzeE4T{M|?I^22@f~3RB;rv_C9xph$EnAzi zljg>nZEbFneeBt1TQeb7jmc@cnz~cuB_cO^c8g^%#|khdyp$4|x`?qhYL!_>f+=my z*?0Gv;!ebsZ%IYt$R|2j%sT7i;q8-^7+(xZDe`yfJCUgtcL$1>=xz5dqu!Cv$);{? zEOmkkosg%6;6aMu90}b*@ZfyfyJu1SiCek4?TprG9NdudyZ1l^P1a($+K5?8V;NyD z$|~tV=2}E~d0QDdc6pVW_1FR+Ujv&c`Dl)Wa$45v$x&>uY#q@iSNUZ&8m_F)IANuq zmwW1|VpBQLUMV}7rR?y=Zy+n>MXc|u^=c4iW%yEgK-S*#JU2%8TR%wCnq&dP;$I4}3=(_bFZn>&brEnncP%|BR{+^aPCz|uiNlwz1 zN@jqDKjqBSTC1vMgb%|@tmT_{I&AEXf|}R*g}AITo?s*fWlF zx_B=K0WPg|(Ol&2^I~KSj#}#g)QwbUHbAaGBv7EqkjPTQ1K4cwptO=A$z#r@MdVd^ z95%~x@~X_6)5xph8QUzGAvGBSBl4%4j;t+N zFfiZcSRCF{at*7*^Q%Sx@rG_7maC0T@xHhuH?FBqYtE!wi#o~-wuu?hNTj#oF=BnYWX4#wBi6IVJTdft(vn`7rk+{ z;d1QjGM09FEb`0r&6UTumZ=OA!tt%;_|{T)S#%%YTA=V)yQkVfj&Ch&M>pb>_mcnl zTZ?rq`>XJ5;7#QC4wK=1cKq;i{P2QJ- z+(0P5?{T;%wDc?B-;mKU4{nFuuh?S|;6wS-=FbzKlOnr~ z%MNqZ6$Sd%yBg>#%S9N{qae#(5v*aMk~;rK!P@r1R@AH%#WrfmjeHa&SMpJi+{q_C z;fukzq3%wMe%Pp0EVmRZ*tiutix~`d4SmOgivgWW6etz=@?tS4`R-oJq+*#w)eP1O|g<;Aqx_!w&A(4lYakbX92OE|oDwH)(dK zn^>2evz4eZHdmi))Gl-9?5W0mCK2DE7oxfPrA{=hlXqAB8UCrBEkiE_NvTmdkd%~+~gV`?Rnr(lJW7TzV ztlE|NLK2=qORk;FoO-?&@4)79dl% zqqKN4XEw0^vx99m%p0HHD1}J7=`;H+QZIg7`t$#@k!UE*{g|Pu75V{B+_U~5N4@jE zC&KMHt+hRc`PISzg(wd7!v;pfT8x+v_Zl%D?yb+n?!Hd4CEQE-cl-e^XU(!zpU~xh zm_fs&w%_P&A#U@uk2L)L@QPmk6Z{IK{2WCh=^oLj_HyfjxF_@dNk}ET@utR%AFJ2I z)%RC9UQ8Eqjykg{HJ+dP1J-u6z8aOC$bOUk{y#KN2i^Qfa9lCeM6zV+ zs{wUa-O3CMrQe4)@}ED9C|~|VCP$+z-%;rh3M^LOhDS*)Nzy!CZh`3Xn5^&Pm-q!<3NO^&we zoqwF8`D@dP%g^k0Uo@QFKh8=Uj!e474yaHu?7{DsYe(DCwYKXpz9c3KvcFZd%dim% zusFy2VmkTt)&LCUyeijPOUCo38bqbngTJ^={Jbqvsc*ji$04 zmsS3tHWB!v7rnuzc@;x-YV1cqA)M{!m3D3>7%m$rKb?k@EB=>ef<=(DNdvst4&Nmi?EQkv?*s~V8Q@APL=El>F%1fNuj7#&G zIAt`nna0=N@It@*TW`RUb;2q?#NUEV2CVpvHdXJp3$3nQx*-A z>g7hk@DsM4^kTgTp{iG$*rEI@ew?z*BoNMhlZ{(k50IYj6LznO3|5tRo~@K#lO@Bh zs?lG(2@846Zc+32z}WH)l7+9e>-$%XTrFB1#~8tIm(IZ$Hr8}XxIS+DyK~wkinm4Dg^ZW{GB&!8^Zvm3(UqauOMyDI< zdX;^oP>p6L1xQ5Q5Q=u!=}yjn3otlF#(Qh2COiOhdB_i|TDA6(C7nx)SDsNpAd!v! z!9R~XyBv3RF)X1yERXw9Vxh5_>A15Cj+euRM{rPRRE|5l{QuI~g&ul`y}cdZIm%A$ zxCg%D9rwU@YC1gSxCg#+%Yd=%xCg$b2385*T6KshRKY!MCPN*Y(bES;l(0ycXTl7K1N zrwUY<6g5>&6m~GA{aqZLrjoPZ-fU0-Q2bDQ@DswiZk8PCD)niH$s)@)|N6>uIYWMG##Eq?^nfk zU=n>m6`GJF`k*Q@!ASHWRU{XyY(7M!QAD??ic|m+-QKn8BS0M?C$O!CE`7M`(K}F- z_Rph_sPE&@VRe{3+EOs)UPB-2f~|(%{p3a*NksFCWVi%}#T_9;$?G=50nTA~vK z4bcN?M!0~3g=nD*k(R`_0B)sDhq~mND)OpySj{G1U?FYck*?pJ=fOyHPe0utwmh_k z0z06MdngFXbWl|zxQA|3KeQJ_L^m&ai0{u-=nmbcT7Z1zcpuHH-(U{hD&Dn3E+&*% zpnI3R^UFX-qH*ZZ65&ytGeSDNL_Oz{MBC7jCBm<5(KPhr5~Rw+gNat43^h;S96{7~ zT&Fv()49A`9gnI!uG2}T5OaDzuG7U9HI%R}{lBWy<^KwHXsyulPP=htYBUb%Y`k?o z^7+;qH{FE(;@!3#p%nsUzjUF$Mw&%8B+9)9m%~mN(t-S{_oVKJbyFIBw{=0ROBH|v zmRk_(Y>YPXBZE7<@}7v4Pg&52NOC-Lj={!<`NAu##7tTYoECiUBsf|s6V_yID) zGmC96J1xS&C3dW=-`oppmFzoVM2e>#{j$TbgEIVL(0yvXA+x&nMegJa6FZZXzxyWK zdSbNV(H@i|Du@CF82SdvTqw6-N1NW;kw48C=wQ=&kOiVq`<5WlqRKN;ck9&ir|$(m zK&^B?{xp|LtsNh}sg++P_owBHfpnxqHvvweF*T(ww^~5TR}=5G@-=c-T+RtXu}pLM zqRnBIQ#(Wz^@lgq*c0wi;%?(#6X zasczG@NRKSi1$$GBR99NO-76^zZvT??Rre<%VEmIS5v^cGYgfCgU8J@CCu?rTQJq> zjkk0hJHwGy*#gja_r-eV`6e}g(=F|zwZOdS77Q6r{Me%CNbAc!M^Z2Qm@zRf7(JLR z8QV&g-bv+2ETl=eD4~XTc{^ql@FKhbEB>?)0mJe-&G7jpJXPE&T^c}=cqJ7C0`)v{ zE2z^6lAY!Whfnz*X9<(|jrPvzy|*sP54`5hx=7j3ag5xcvQH$pk%fFZykcr9a$}Zr z!<|OU-@_+MjhKH|_NmwbIb{kQIvryJWA7SRKfp3|n7;HriwRd+6=?geuJnw)t1E+q zdQP&52rwB$Og{Se_brNy^0){I_J~Rlsk$?z9jHrhV0H69q7BOV%=RIdJdu81u`Q31Xoqhq_P;t_cG(SQ?%Nxm1kYP|BZ;Ml5(y1siTH?0N z3FH!X_fY@T8cyY>ys%|;=_g06x6ENAk^fmwlP(TQ^g(MQE>{~npm|L?y+l z+%1b`WmEL3cv==EYNLYw)x*Ihc$8XkjoGbRK|lUM=+wyuGak z#b0EX-i^5NsN;q3HDXteYw3orBF)JQ!iBgI@T+k2YPQquapxk+Uv(RF6SzW0w7=_d z{?*X0*D6~m^@%(4BKv&RhjO%1zObBB671+7Z_B}x>EH*J@bt0|RbKaz`Nes+S+ijP z^%R>Q>Sh>)cz~EpREXD59t5+9Y`)lgn~hqeUT?UT);zh4XvO>oJ78oQ&I1z}n?((5 z6>Hb*wld~%m&gU)e9O_O|Eb#z_4`ixFn%P&KO}}|O_)V=*LAx+IzfuPi%KgNKGb1o zs?}eoK5ZMw`5(^FeAkN7J32sV``{b5vjcq#BNxs*_(kzO!wli<=FAZ}AHujhxbYiW zPglaDvbq(*pkh8n7At2~-joU(=|uU%Pw0FSoXthM>{s!q1zA}U^=$tLaBI{mx}+c_ zzB}ubXPnq2l|{wXWKa2%$P43ZF^AA5{ZQL!Sk%?@diT@I^xF2mL zi%~bO7qjI%3K{M&%z5njwy@g>f(qRQEB}rP*R?DJfHeF9$N7|jmWQP zu8xebSA$?st1r2HC&x{`RIaIJ-7uP~)5KpeoLM)lxKlL!Bz~C*GB3 zfq^yahBs{3&_6UhxMpaLPLunxPgqmGvQsM{!ef1^b+oz^&cN%2)@&HuuwmWW!8HSG z2Sni?7@|AUU36%LvHe1zwGdPaUuAK&Tbp``%=kOzE%X!4HT9Oe>uhBlOyf0t;?4*q zBA=I_bN&r7cPGEfeyoW;TN!8bjWVswR>qx~eOhAAR>t{!ELH)-e+G}U=P?O-y}Pxk zEz^~d9=M|e_FQWvu^gvaRu{-YiaX6=f zQ48*PFx{A%q7pMq!5xqIXP^ElMCq56=Z?G69C0zIfd|vBA9K-=DMJ2*Vf`~oT0Gwr zp~e3;KchGVv44w8QY7QSKga~zwZ4Dt(D3@f!GZPbhlbYLD|YjoPiKA7qTkA6G=9@3 zJFQq@uv1g~1MrsNt1=!tRsB>)1?x|(z7*#8X!j>E)4SFT4-Bp!+^~LV{XqZFx^-IB zxhIWrhgP8clY&*|T6m$g79itZ;)dXB1fe(Xv`CUHh?Yi{DAJt5u?K{oEM;3cxdp)L zI~R3`hEy}BH^9JlV@_|X^W-RL;bqQm07CgqAH#m3K2Wv>eKg}3g$omR7xa@v<%{LU zKA3^H#fM&#qgH#%+GD^tQHho={7NKEe)B&OHPhBzy-}H|xx6L) z<-dVs?-lB-x?q=4Y$Wa`|8vxfM z5#_q_^Xrb*tUT@bo4t^h=A{);2Y3R`+&-*AdW(S}n!XD}_!EQhzz{86(%l>sc-(B5 z9t8`{t5#wf^6+{$C)~-OMz5CEoQsG5r)-g?(d+NZ2{5;fAR%k(H{G41-ex!K$3)M~ zq?|PDFD`se#U1f>tn5HR99B4(P0T{fBO=cWLd(-1{w$V_Q}e1mo$=aR;M~I}iHo?T zS4#F^cFvT)-D_r?8WkSqrqwcoFG;)=QVaBb@ooSN;&4Y}$FvvGg+D<7Vbq;Q`GdQ1 z9VQ5>F;xGh-AkKCopMl1HKZY-dp5ZwsL|S8;<+)1QtpT1WeI7}8L63VzgI zzTzlfGW)jAgup>wvc$Dj*6qFIJgNPLis@uxJLP+!u0I zSGMQ^kJ_m{5J4KL6dM-Iwok$@Xx3?;i#iA3TItdD++)&BJbZs=hBDN!`%~bo31Xy4 z)@mKI)y>Pa;34hO>+V4Z@sv-?`OglcP*Bgfr_<_%{aG(c^{)f(&G_X;z25M5z|6ek zi#h5Y`Izj4*#k%NquXEA|Vbp@s_zg9-K$>Qz+ ziW@%qrH=E(Z}o7a58QjqxiXEd%emA%;qrp|Wh-HW8x6}32=Ec!fjb~-VE^{L9kGR0 z!^rOV@-dN3+FFK#j<{C5P(3@>0lfs;vM+bUuI>bk++|-mCUUyz)gAbKk2|Ny$Rt%% zoSZ4|abp@0nnIOvL%Q_V_d{jD9g_D7mqtZL;l~BJ;7TcwZ@FYUTN!wRk7x(4{|>{} zc)q>!sG;USWIcH7QR}8wOnavp>41-h@aJFYI19{nj8WshW6pzV{LABHVEp=h9kIfp zk&){C>M@Z@+IGUp^Cgp0zszG}CYIl8_;&}=B~a%(V<|@+#`ELH#?xxONV&~wbwtCD zezmjMwxCXbwX@8YW}E@WlG}fDzmePduVJfz;8A)`+2}dhTWSiXS(zfcW#@tH&dc&^ zuy+WFZNCH2ZHOE0@5mim;A7jdOd6S@U+oRhhK|+L?j4jlR(sax<(&PVui+@$do%^a zYF#KE{98Ho79?+qHlXpDw&z2i?L6HUl?1}X-$(zUYr9(YYC%2&9mc`tD-$^HQ0@PW*WK?2e>;rL7-% zYKMOD4e;yZ0xQ*#YS3LQeL-qdJ*h3*?n!-c0Bk^$zfW6Nyuj#X-^7qYftBh>>U)X{ zzbTcV^POMBVIl=znyvq4E5%&!$W@K764CwWLmhI`eOQgG0~lnfI*qakMeGjgZmlo> zvaN57d1#QfJ%}y!2|+(KHq{_sT-YvJvZ3NQ(eFK|*otp@(*3G0PkXS1vDiv9G)Poj zxG{^fbiMnaCe-R}PC!or#R(r&RixqKQgP%#g;;%t==l!;AtZLB{G0jjiWkOn)N}E} zsHl5UhdU5Hg$(73 z2S)`s$h{U|@JAvQk3#n}pgSK{WVegycK~q3$fg#mr`llLz4T@w`YM?bVIJ^o@5p1q zZ&K4b`N?gI=p&_9mY4?h65K@WZfv^0KpLspQx39zliwXXg#t^X@~vkvg%MBn*m ztinZd{I7D*PyLgcw_hDl8ePa``P}~sdno>kJypL#z}6Phah3lHyL;z?Uhf@QEycw2 zx>x=v_&2HyC^2@MW8kM*IODpHt^|TXRqbLkOvdZ_#--)YXKTA!x6DCE&QpB$R8ySQ$S?QzRrD92e?jE=m+PeH!7+yBgi=^D6 z%j6H~pGMiQiiMl3P22X{PBnfc1*esn zMplfxy#o}x=>?DF%muI9kFh(3-P8HJO(WI*eFCuvy+QtGMf2F7T$lx*@fhY3f^+p1 ze%YmSzKz4ny`qA#K$Y_4#pY*3@hISVUy^fCp-$bbuC2Y z7uTz>n#Rzdq>C*2Qg*<6V-H+>m zC1uIirQ*Q^bm-0U*$OO9g=pFd-3s-5`|%8z$@f>MU~gh~-=5<9XBE1*;U)SRKonxf zt5Kf+R%8b{^2z%jPZ5O+x71>CpTN=R+X77(Bl!sR{l$eVlmJ8dX7`#Icg7|9z!RVe z`)roDN2I-(r9S?><*+gQ9b?g5{cp_8u1^^jUF++fVo8(KvN6m$wUmiLb#?N0pdxJ;+6`eK z5#kdoniImAdksasllHp@sgvrgjU|@Ic)bJSAVF#nOoW2-@rYvT* zx1=mts$M7zy7tb0NQkUz&^a>`fsK0?N-~?Plme1eg9X4FmL9^?-+mQKO!~F&!nk)> zSWPBIR~3r1O3A3b+Tg*Ne!?-gPUR}JMq&KL_3vZxT-qmyUBVA;T`9ObT5W5|7B?{L(o-);=+IJ5OhaX zgBHelN!XYPXyf-_GE_4oh?&ZsVo5LX^bUaBSuU}qOxb~i)QS!U0)0=DqV>#T@7lZB zn9;kS?6<-`tsgM)F_mIHfXn&U1SbbFp4OwQd`MAsn z^_hx){vIs#jn#4kV7Df_b*eh|efeg)>mYpv-=jCbZNXL*FHr3S>W+rAq$jMFNmW_3 zl}|4Y8+FzCkk#6%e8cxaXs@yQ#a`Wu-HKGvDTlGOohjcux2?KRY`$FLM3_~K#Y9c%z~-vDUN(cfEkpZu+d%#AAA+ZJ@z`9HbaLU3p`(3F_&dSDZgF#0abhLF5*0R0 zhj>>&W32sAP7y%`u|$lyapYB~nEVQ=UWNWw^0OSrb99#cyu87` zo+-aJp{6A6fEPDHw;ICdn);-66kz(LcC_L;@iY?k4L|e)ps=ad@Ll+dM%r4k(`Rj1 z$}VM#M`5Q|+2#a+=T{>dy`OQv#44I@E84XV-9$D5o0hisXO zosqkVn_aw_4ytxZ!Hr#vICeT=2b8> zQ8z3F-mdlQriIHJW3KGr5tW##1|bV-^~Wp=TNr2SX51ka&OE4e;`)CWvABEkIsXCmd0>O3KA*PY z;8trHpN2Iq;cuc|pOLmWp22T&80~xMiiww6pD)GpR#tV(6P3%%D9hl9lCc*eri@~sc^3LYEPa64!tea$AUGB!ninP5k6T91S znvP;S#!~SF4g4p%;tA;q@wXXK7KFV&wOI1<+P0_)PVOnrpQ}zz@ZDD2xC5?t%DMOA znp2ImZ!c20ijH3x^(rI>DXU)%_M3KR+v7`IzaCYo%dDb{ow`?>BVyCG0gyDkKeguM>F6$NhhZH&rpB^%Scxk>R>%SvYn1ok=`e*49r#&}dgsqq8eJk^TUr&0 z&F3f@>tVA?U18Lz=&)E&vs+1foXCXXND*_J8%0hPMjE9`(RZIT8`6nC z2eW6dtAy|^kot-vUlOf1bIox6UxQxD$2UKj!GIb^VAebGVcExV>J$nj?2o0{JFn{5 z2%{QUE1PvkV~%<7=Vq|$7PI@d!73FO^l%wA{rWFJGjXxWXOEU;47Yyk&ut!xxvaZb z`m!P*3kTs^77h~4ZK$Wd`03AWs;NTY(cAoJE47g9ISSk|-SP_T?JsORPz*a=@hL3Vtd3CIQ>6Ra``Ov4AAIuIFD#-# zqL0U%kmu)Wxo>u7^(MI0Z|E)Xa!7Z*|82v=gaujoQ2CxIe?sLe$)8t`j|WbrpU!3V zps>B-&g#vOH@AK!LSbW#UnHkt{j-4#mm~7)BG}?D1)-_14S!!Pe{YJtI!)j5iyTqm z>i>_ue}R&#s`AJ2-Ax`Bh*|;Z+^YsFW+Y97PIo6Xji7W$C!`^dCLLZzOjW9GcbBQY zx48FK(hWvRhEc}Hhz}4Ql~z#^b$Ez^Ur|~{XZY%%sHixjGd;>EqWB)c$LN23_CDv{ zbL-LRj(-1Z)^FKs5$c}jKKtym_dfgVv(MhWRj(SlMVh?#lr+DI@)%jyAJbaM-c5T; zUPOar;j*dvW7}qXBI{J4#fyXi5h4+8=uR0%YuU8wR?C`eX79PB;$Dbb)WzRFlNF2G zXD+i^>Z!4~RV_f&o+T<^vSbZWd z5!n|aW;Zddkv+m684w=X+w+q_7*bZIWQadH)khIIY9@z5e5iTcUh+oEk)Frx`IqBs ztJK;N9?Vy0SU!fleVB5(L_T*`~NyOW8lj5eAfo z!vI(Uz(~QbAo7Odfh}>vpE6)FcfDe&iSYvJTHOgr^7L-HA;M*<16t z@2i8J4DXNl^ElSh?X7vN(c|TV=kS?K&y2(8{9s8_941hFVzJe9K_w-g>C`3_oORgL zP^*Qdp_U!9hT0PSL_>Xy04h))D<2H?GKRV-r6sWJSz=O~F>@QeDJm_+QdED5Fi2K2 z3K+p3*%SiQT(`72rl6vzzd8i*F0lQPmaWp?EM-#LkWkvw)9m=^ zbRv!`OP(UcTsk{v5TY?orGyeTC>^AvqaiyJj3k%^p>)iAs$Ly5%JSmCn(P>ut4XlD z4Fo3MF)&wiDAz||ave2QE}k>B4L0sX33HHp_xKH(*IVBDhmwc<1C+VpXiV#ne*h(w z5d$W$z%T3j`|1+~I@$Q3cGc=lQr&J3ZD3)M5QYNpdzMLzL;eA`K#v}6QO7{NAe6j} zLtj#C>70D%ig{bz&gTA;9;Cv@jy5|`y{uApQZu;^AUj6%Lgb@s7FH}T}^+*ccK6OBws4cdJyrfr8` zbh(9%^1aI~yTI7hZSt+6{?I?F@9ioI)HUsrKj=^7OCGoIc}Yr8tGk~$25YbHv}AE@ zOfRmD#(0&kZ2`3d%Ajv7s4~v=XtwEaRc0o!vTUjbdjGLKKdJT~34p4?ZO59EA1h7?HVrMjgBo&`XpBSPk+~$@gfnwWM~Y$PB3xRLd^k>oQ`Ltl>UDld#2u~zLlWwTe*x;=kGr=#4j(Etgcap$K! z&B6|fq2(U!6}ex?JZ^k?vU%dVt!yeu<*bvtSjLzdioU2QibE+J9NDc-j1)NB^P;Dx zLD?PTy%4rj1ez`>+X@WDGmA56eQfHxXT$ z!3+ju{SH4=yHYTlvFN#Hor)XpS)NNI(_5dmjE*A`jTgw1F{>DUC=%cR^^I!Om5PqP z!;`L7Y{d;qeo^@=*rQ}4h8H1XJY|(1oqM@@6N3HGxU$+`!-u6B(g5396vV0SUje|I zfjw|k0`}^)LIm*=1OtiXl^#^t#Q~rClh{9WH(M~k6e4NsqUSvyX4g)`r zKK5F3AN3A0zq3}VefYg@f`&uLr$HxKSS9_pW`SyYmNlkv{wGwH+5=f@W-_HYZP>jRjj zKE4vQHz5;~1$Q>I@wMYI+l+q^;1kO%>X?3kfURa*%kXQEms6}w<;7zBU7R@}%Uorq z3HtWs;6QQpJw1ka`^+;9>IJqLB#;?%^6c{LjugUIr>YAnwx7_d4aoau6&jcInR_Ye#atv$YfrLS9zYS=l%u<4U?KZ z&9PSF#)aJD_T@8s$i!i)3vrd1R1%Gz&kYTEk;JXCSLB`&DFh5_VxH?Pwlm$p`#LPu zrnvO!X6ZN5ES8{d_G3SW*G`Ky!p)j(JlSC-)5P}@)HGPf4}8U(D?na1VP^3QR#>!( zTW7CE+$oiVw%M};#AHa~3{P)g0V@KCr;KokFclkHgKcgY64h2fU~``JF+?^~t;99H zxWZBtIOzxBcxg1ErPi@ZP(ZUs`*BvrHWtz9wVWAG(xV;7{4ar4Wtx~ea|M`(%3oRX z*Nui<@QvaVlBJ7|$-Q4!l{}c(MA-cf-OeiCw>9;--Oj9bO59n|8WSpOg=upTQ1)d7 zC~ckfl|N%!Dp(RQp1m>)oy4z3oid9$$U?4ZP=toE83$`!`iO^i4MYEJ8QdIehh1g8 ze0g2uhEdrcOJrWJa+6~}>BEY>UVXD92?C{CtS7B40u;&R8nf@D=XP|;4A8#tl`_hu2~$vRCAkzZeWqnkU}CHn8SAaXusskP>?C>CZM0$YII4r=P5S&%(C- z2s%9DNIE1!n(VRC zI|dYg6pcrPxWQ$wjFO@Ma-yZf!0Oz0o(PP}W`)`N%%l)?eNX6)R}r{JNA5CVGz%xA z-tHqHquy?ffQ5J1(|ZIR_VoS<9iDz99iILtbl7(!9ro!CgdlMck?+7)!y^!WfF}vzL5?b#46KHw;k#xBJPwDWqBcROnF+*NB zO4lFB9IpRU=I}^H*!w4pFusbpYrYp>*6TYd3rA<~kubmB7R*oIqOZNv;DF|aQ?o%S z_`vgzWD&35a3mDBLG!}oq-a~o8*>Bt(n;7eDo4urTu)_M&a^(|-0AtFqog8Iscdl$ zNKU&{@{K1!D^UBCuA$-WfqS_}+tygrQTwFm2XRL_cbPLiqEz_pxT*$sBqBbm<+FY4 zrInwLc1^I@TQBKdH`TVLv3t4~y$>|+oh)ZYM{8^7JlTdx_x1hJRdwAR=)-tvT_>z* zjUB4&XF9nDMZGk;6o;Lp%M9^`M~uG*DZ^6JM(`MQxLZ zbzAK+TX&^E`wBW-xG-wal6#O zd3AoB)K1ERYEwzk~iwp*3X`T!Fj&& zWF2N>iycNqzZ&ffV5Yl3lJb>`>lGQjyEuga5_h**gH$X9JkAqNg<;8nN@v(k_H@P6 zVZB%L@8P#PirZHmP2Mo@!?@J68B_+$c)kb1?k ztIi$mQpgd8GQWNVtS2muZLiWZ5$A$n#bLM;9cxgA* znt9#W50mz9U&j;<)Pk5m+YbsAJ#H|gN4bp_%m|bscg%VIW}lQP;en})&E3Yha7Ga! z_RW{O!HVA5fKkb{om`(nEAC7xw8F4j4avHMPojbB+nNwf)!>+RLjlrQ&E&Vf*hU=eMVJVnraMV_>jqB=U$r3?TvT=Ap2#Lb08%~^? ze9x09&%IaxPc+0`dCBhWJrZCi{Gxk=z@n-K)-Y+~fQH=^?G;!^_=7v5)(9@+3slYN zdo}0>5(i{SZ(9#G_%tC*tj9R#fi`FMIYP@R_bGldAtNql26Xrhs3;3>7_!5ukow^a zC<`ZUc3{0)Iyh(fX2k5es62yhhwl zmUMRFp3{2t(y#rlEw@{kMm#M7}v#kEsgi$*8o+XL*XOXC*4_w|W()1FT^2jb$ z=oaa1K82BpO0AmdS6p; zlYHYvgo(Tt$@}#;e-20N?xZ|tZ^`GrQa+3~VS3z2LoeyWiqPphsuLpgoztNYJSf5^ zMpvBO?c~l^>tYK~z&x4k9n}fFD4?n6)8U5J|FsWi?CCiW-+|85JYb(emE>WkSrZtLntlW^5YHd+P28BKZTJp<)2qmMU% z3xiuRt>Ajy83|lZ=I4l(k%DV|FD-LsO}N;G0=U%OCIZJ^%rnr+mir?C8t-hbz&IFS(Q{Btyc7QhXV;NTpH1~4a>P(-gAPXb65)ysx zERg4ce7OomDu~E_F01ey=Hr~H$PKmQF2D+@U&I*T3Tc2pC-j5O_~|k(H1glt56x;zf%G>ggCa z0979K3mqqTN#0j`(~GfdJEIOaN&Z%cz9vMWU*`fg+c>Z>bsxd2j22ZvE$*qJ`F86f(F!|n^t2LAM;QU!b^BxW@9g%?{1 z5deeGcU?sT>9;C1{9Nhb)h%)t5JT{nw99VEM?|jTn|3z}7MFJYl7)*Tx(`2n!u_FqbtKNq%36 zJuL2Na|W(eI1+mh7zP4wMzmFa^3vawFPAq4V<9}+>AE(C(+=E7X%siAl(14NmuXsm zMft-1;V1~{mbS$kfwYph%N^sC+uOQkpj7(RNGIJXNy+dvkmnDWL*G}5E^-TzAJC;6 zp%tx?fybCn^0Q9vHnrdJNXbrF{jWgZNk>VQlQx=NAyzR{@wd=Z?!r1Mjel_zFB1&UC-X6qmvlI`6J;(vlP$rzMXCGKjTWua zNjwm?{bcWx8BY+vc`rW4Qbx%=F|+1&PR`aPz)Tqk?{U6%jzvz#rr6u3u4rT3@;RyX z#yvn;Qo`T`=Oiob0~dm5ny<9gYwLOS(m@jhA9G0CKg zbUV2-)N0k~o1)2x==ed4+U!v*+iZo&dDNrMTh2*wb6tgdyL6K=ojQjb%Q^#JSDlP{ zS~&4~AxoA@J{Uug7hwr@pq7ozt0tMaRHL8SWD>7DAt&g4_aJ--Z>}G<8;$#_#DJ64 zJSx?u8nqPFYDiEx5Kt#($^^w|ZFn#RiJAc(Ik4DKQ!{Ylo*r`#drVq4Jtmo)lkYy!i(f4|9svR*4!r5!TDQEawvJqC7$Q0 z|6J(K>MurKx=iE4lcKC>XqAp2hzhBHZd-e@O&=b!R zNf%>Q=U(FE-mfS$)hQl}QGIg%N>`OPH)sI556*bPaok(H^Uv~vt{#sD?H8%xK+Q+6 zzF%WF*|Y10qjUS6fjg99k{S+=LB^Aiimvq8Aro(`n{!u%^PuSu)^(NS_dB!m?<}cy z%6W$D8i|5xL8+VLPVH4{E^vG?4<5WbKStflc_k@*Q8p5qAivu60(^AwOz&-xx}gMRWhyV8#$+Mw@99E3Tf*h z{)nH*8E*ALPRriLwpqptIZcW&>IRl)-z&4p*Er30a++0HwB2l!M+K_0meU7Yw8CXB z-5#Hh08x09sY&Zn*0_HtVpJWD!rBy)h0_nR&!MB`hZke$7?HNHO>~o7K~Wqnq>R4< zs5ReLk`!+t?<=(g`MT{Ob&O0{XzP++-)2Y&Hug1ZwB$wP{p46Wf%eJj1d&7kYFUG^ zOivt3Crsy)DwrBW6edKU7$!mfS{}ZSc})wc-TFjXvlTBtp-*MAhs+a^k72`9)T3<%Q7>iCJVNwFL0*{) z6P^*b^yp5ojNX_J2-g(b!Bgj1^iW%x6|`$sAj>{`rTK=E#!-9>*t20lx7~U+=<9B= zkas64(bSMu3ZXEoKjDiq#)E!PR6E{eh;=o;IUFy}d4ay6e?g#c=#N1^JPl#>^3C_w z??0gkse=U(PiZnbIYu@(FD}=pKL;prW})BNpm}=O(pwUewSS#swFf>3+S$wZU>U z$WOS#tad;C1FY%%zEY7gKZ8uHZ=73s=S2-T6%T?7FNR*773CmC7b9H?*v`y9C^RYC z4zGK%`P4AOay04EsQ8?V%`QFP+nkn652I(rgOi>c%ViSQfXMwszq}aK+f;-#*1mzE zkjcwl8OwlDG*!vQG{$auw9%@U-P6;Jzsu5+A$y44 ze2K{+{2EaFz~NZ5PnnQ~iXwCa&Pb}7t7utnmpZtMh!Q+vES zts_mpVTrM*>-3Q27Z|uQT-61sc}F<4ZDR zDvBU(Qi8C zcPyv7H|+t%`{iPs)GtZ@|9E#-Gh!LzwwGX4@2Q{G-~3_;bqoZ8_=G=i&sT;bH=w)r zSky7Co%eK$I(O2^Y8Ep=%<9RO-t2CSJYg@o#?^ZOg>Fa6qG-pgI=>PPP#0jXbV|Iw z!4VTl#hIo)2w5ZYicd^LDO^BP-%kOjnC3;BLB)#CCJ16C3Le@q{aoR}NuKtxc+r_S zZfM9BF%NSMj6od($|#-GmjcPoq$3x1A5-?|L=+;($%r3BE}k2r@?~%XST0K=Swf8k zyPcVvq?8S*CkI9njg4$MJxVSvHC8|MGBzADB%}EPUdF}wz;}g&5ZO#?EBw-F3vFff z+R=%qt5Tu2ybLS<8A|M{#E06P+#PB~;^qT==Ve$(`CyD}^uUj7R$Y?A7khLfqJfQj zQ6zBvpy=Xx(%ajxT_$_X_lp~YG5F5ip^_?juTdg4iZS6>8XdVuWFF_(*ItVkUI~!ao3{`-@WS_ z;oh)dxKC?^?><1*5^koV`M`ZzBfk3@;Xb_;+`uWTTW*mpJ3_DHZoXoC`W4q3bVuF5 zNDC{xU*I>>(MY9`{vP$x-+NiCq|@-GN;+kb)ddfm-3%HaOCnf+&o$`CMsJ$Bj9QCVIY+Wk_b!bJafRZhK zFp-a-D6&TleOvgK@aiPIn$h}Y3s4M>+vx7MA=dPugz1Tkx zC(8}!>{0OhW2MSTfH#$$vB?s7VTV!BBp4}+h%n3_aN$FBuCPydg_epVNK{hLD-VST zgRCSVK1W!-DJcjSmeNEi(tdIhEIY${6?-B-d2uYf1#i-0FdC03q)W!2gswA`BqTbu za9c5=JModUYk0GX<-?gjixj4D= zT=izw?5_laxcZsOEsiNgB`oAUF*;{;VbBIF)UPai)dRd){uG2a0Xo^}Re z=$GRbb>v9K$OIB+bvn}-Js-TeC6Y&rc}`@bjSIq1Gu4F)e4bMsrL4|%_j50Q1*jF? z&=x1YW!#E=(6wytD+OEcg?ZvOC$gf!_ApCDbtxite*oXY};;(?^j*aSm)Oe1E2+rsC?ZUOS50 zIO}_9-{)azzd|>{$$cB>)^DM0m3$a-Nz{c6hanrIq$VHPipZM4lIWz_$GW!p zV~F|jlb2%&eo7{Ijgc|z}|fbA54`LD@tW`I@4KY@C3=L>qS0%_=O3T^I-(uOxeBrc}J3} z{?`2#ohT{!uuv+ExDnx|M>cJ9vPe~n3;oxAP-R`sW6GE>^_S&yAGP%Pe`FnByT)V@ z*FCxf3$E%F(&f%7CyfJkH=wVg>D(TfbcF(y)#>C`DHMbn0VT5KLS-dz5AaHs$A|Se zRMoeYlThS(nh((p$1bDeX8tGy3EMqZnFqf&F}ER};+hFK06!u;X=R~4d$HACTO>ox z>dZ}fui%#94@%bY(|O6I&L-J|6BezC)1_?@-nos^qft#|UpWDs=}HCe3xJ;K!J4#K z5VWQ-f7r?G7p(HzBzXRS-Z6mGwg;V*JOrkhZjt%>7h~)%WEF^cru@ z<*NaR*W~F7I!ZcSFW?iEDO(9LE4^wK#l9oG@d)Ft3w1}JXT~|Of!1Ya57AG3tA16s zQ>RGuKS%omej~;-nidMHaSBmrV%a4LqF=Y*NCnZyf}2D1Xqe)u!=5>u@(T0izI}S~ zVyY4iRZ~^%k$S3%^S@JxafBmH*s6yi+-+TG;PKYR>>s5V{dRcN$A0Kk9=2K&w zf9o07i$7jVhiG4D2pmN;fb1~Uj1!wb-vPRsq;gSE7?Le13pzlbW2_$yfK7}}I+&|$ zf7Bc=hp%~En^W5-!lJo@-8&-CC5U)IP7-qr?DL`NE>T~Q$pwxRt(@Z;DwLvlm1-7a zs&2Y`!ax@0M}RQ32mT$pSfUmn3QYiM`?pnWRh9?>V`&>_cRI66m9Q0RMjg71#Vr>i zYe@$9ExHo!moi7=g`h;jaVgY#aTVmC2gBDUk=%9wC;HzKEg=RV&hB<*ECqm89F(*N zhf;<>yk{%Vr6m2vE!>ytSHqbOOY8xN+20Buje%%hmYmsZ1lpvt<|PLY%sH=oID!Mn zF~8{UtB!SrMszWqHsVH6$%Aj5A)^vQX-L*@4nRvbj!x^U(*A>(;)a;Z^~E}!>63*F z#A8ocw|%eRQs%krhrl?c?B5!8MBY&b)&|Xy9^MsxRNVUra zjcevAX*szI6jXbO>`BntUZNL#3##1#C94so#cSEwT?es&@4gIv0@zl6438izpWY<; zEFS~#a{x`681uWr@qER_x-5BPm(eFDO+GcRD#lHRy+q$z$Osy`pO{obsmr0?U%Rx? zq1lixijRt7AdaIqwmAdWDAYFfOip{3)ww2LcR24dc20fTRJ;Np2O#B45dNQtwM(u5 zjhJFhQWhlEOeo(n1#$-bO|W?Rlt~bx-8N(54U0YI<_q%)Owqa zFjd$b?r9dgFJIg=o)1R$mnxL`%_~5@IFBBwj*gZlIrX}XI!l%&!*tWvyaHUI_q5~< zs#<3Gz%GNo)!J#5t{S+Na=xH953^4R&U1{a?x`SQWj`6dX4K>QoX`nBNqI)z>8mrL(ne^*m3_&3f|c5(B}k9 zTMcT$^`emIWv>Jzk+0gMT6Y~ZOLQ?r0rt$7 z1nd*_WTc8bQ|H*K>nXA)c8x*D%QE z3Z=vZRbT3%c4vCKTEBtsN5se>n@7M`{pGT(J&~_ez&D0(tAUHgOSZnjjWtbBuzQPl zLalu{jntD9uWTuUCXEfJrXqa}l6tz9Sbvb(l-7Ecp_%t5pbV6y} z*a@$ah*Hc5plMOtnbsVD z9}5qNa?D>vla+9Q$rLqhQtrAMtGKzZd9vc9Ekz3-25HtbPr>7H>kt|cKf3gDbjDdW(luYffk6gr z7i6T)ED!kQjb4$jw5u0F5BOz70~p}r1bMNpv4`9L8WV%Y8}p942IyCR2$s0copcL$ z0oV^{8kqz43yWUkr}DDSz(>@~?8r~V*F85I4npY){xw$820U}bdCU)RrD_OWGsS6A-7@^!0y>Q8!=H`WalQKeQB2;Hq;c3{7Wi>PxURvUnLCS5rl2Ut^Gc zQpR>>_3{A$af_tPOc^#aC74TU-TE4^ww}|Kh=d$lo<7!CF06=+wx(fCLs>bP)zL8# zSyoni0crAc(?l_Qh{mrqxWXK}uZ6X0I|Ki%SVm&isT?E;!D$yLv-EGEMldsNIf8@P zlHVo#H5oxAzz}rM(KUa&F!1NmWY($ux&iisWXZy>1Y|${0)ah6b)dDh@M}3PiH%&y zA|OJH*mymHIaI^@@9s&)9OrEg0;$E6nmt5oUc0dI{~5cso!Q1YR_&AZ;A^qmOu#AQ zz7BYkQzuPNafx`?^qQk_?%OU3+~(IAi>gUs+o^q2%~nwLJgBIAy%+&*gD?Vrvap7Y zMb@O1Kfcyda4}*@SU{VAfa>#D8R?~!Ode}9ZZW$Swxeu|+r$O3ctrq#@M@>b$~z(1 z(#T5KgD@V2BQTy5#c*OCL248?9vkW$93M0uaenpn^E=|ytt_v?04z9(G1BYJ(r9$*vWBaSLQ!@^@I32KzOdB*>ze zgF*N*>s5l5C2;P)4GC=KhJU9V=-hlURUzd+mt?;G?@Vn@R6%7J${%n8D!mc9T@t`r zBvxa&t<$6Xb*9n;=v-ObC zw{Jt&X7x?)yAB8>!OfbM#U5yPW?mqLY%b&ybt7htU33e6(cPY}&;YjQ2vW}GJep}| z2R-6V+Elmh*b;BUIB@n@zup_=rNUmWF zy3{?EliQ+)5CmGka=ij&R$K>iKS;L7ZfvwVv*S?AJ^b$Gy%f8p^#i6RqtLw^^(Ko} z@`o|RO@0tmE76cwsVaW4*jh6C8Ic-|<7zDaYK$>Bb8e4oA;JyX`nif6w%|Nf}d?iAX$X;+O9>jngU2L@vEY@vtJ|vi2 zJ-Z2&XJ0CkS1Ko&?QLzfbj6YvNxg4!z5kIBOT9P`&RR=S{gu3^Z-Z3Kyak5w`ieSt zv9)9%T@^f3YMzIhvwt+ZOfnHccxkFn)OyYU)nh)7wao+2ys}f-bh>w$mCO82r_whm4c^E4{-f`rTWh@paaf`TMt8 zv`R0guHEirbfGtq55n<0{8Cub)V?KSO!!Jexvw>}vOV1fHE$y+!3mSKY?FYsH( z=ad(>goI)@YZ*XNXwUV$>y$--OIf%E^?>X-AHF`>-M;Z{;6KgxoN9i!_8B)o&6tt~ z1f!fj;LLnhA=9+HTquvJ+9=^_?C@H~c&izcI z*~r;?L#&kGc#z$zgmTRh*Lzj*`Lhj;k}Mgw=~eY1#)OySvF0mpY}~2=zsB*g(d_?|Lu7?&!#7G&j^q&8fc2|y z15Pj&ncyaaKjZDq2j8;7Lv2p&3Pt<#ILCk8+d)t<5j}9Yb9@8(FW+eTJsBC8*@5M` zcN_dJ6;q6t%oaqO&%ZrhG0je`xM09`wd@|FhgJ{!NKvxhdOf(Od0=hy+4Tc>==!pL z!3qGb!BpTv{?I$%bi7kcp$T6>R?eCEYo#>_JE27nft`4;@X84SOo^deBwL&m^M$CI zFH`n^7}cY={#2$;`N{`lA<1zgj9h-AL~PynW}ca9RH;TZ%!-)7mH^7;cYqDU`#c%m z$z&Zruu?GZU}Wk_yIJD9?>IcxBQs>i?x~7TkFylM#0`Ar z?6|s}UAyNpwq)qh8ABU!qgK1bx>m@#_MMo#QOcbB4v-=uE_1W=X51%MX9?TNcLyl4t+}DzZ84Q;MTp;=JFBAgNJ6*b#2_9?qOK&TVR0u{mz0 zInub&Z>Pa#nzXj=J=j<-k_Js+6p}ViBmaiR{JL5B)lJZFRtmpadBF9Gez0!LFXz3n zE?_ z*}!nNP{``F^Bkq;h7pGk@dJ9n``{RTszANw2pY&bwXchuOgI?qKKk_d2%3E4y`YVG zR+QjP)ORzcI}%9dI}TNMnUi~o(34#%>W8p+skSo#+m~0}5ZDfN-1WQ{9(03{mPmfS z8jZshspN)asib1Dgev)RsKUq6d{LpGntq=(?}2QUOTJG}Zq^J9>VfQX!;0^PuD%1l zv%)mD=(_iV0dG{G=cCdASBE~?jmPeA%uGvJ=-9j5LNy3WzBlNGB}BB5KqyK2#sm3M znZ2xzmKtc+^`cT?FdyaV7)jiOdov|(Y_JrfY>|$YbXf(Ib;wHelYJ-Bw*6aGO z_5c~Urleg^-~&3TZKQ!4%J?sWy^;C_k8vuUmH*&EaH$|%`hoeA+%7ltt3kmPFzEH| z&OoOc+z#wn=x2aHUVf;x-|-$0o3P2N+kePkyLWG+Yue%B#39qhqH(%b7TmmPpbm&{ zF93c9vexdg9{ycGo4Be5hzO{{xjaM`@6PkY<mr|8*>#kUJ>a3-+}ixd%}o=eb-J>$>dyP#x6Yyaj>= zYx9SV+VhnNJBN42(`CHxy0Ze6Atbu#BMZTh*_!haHigd<1Ja@4b-DYaiM4$19KK-l z9w?6pFDs}&o0SiaZ$iRy^=bUVKyLr&0yve4ps|k_^EL0;*0ZHZ2GX@-=1!3u^KK+& zv$x!0z`*vzc@CZhs6O)E{phiDLhY48{1B;F01Ii2)h^xIsoy=8PMB4#K@(eOYp~|& z#+J?=OD7CmC7?m}FSIemS#*2f{SKZVQ0;-)pgrvd7+W{Qv3j&z8XJ!=WAK}N-cifw zxB=x6c=YX-VTNf|ywjOJMP?NTIoj$3uO->f*dyb4=)Vodm}ZULdmCu9Ie6y=ezihx zx*dezir`5MM5)H4WX2iLp=Kwlq(Zw)kag$n%qiyToIVRsXH))x2dzT=5TPqVW(y*1@Yh*(K$cCxj*jIDnl1Gjq;4NU946@t?9xk zFQopr-!aEHxqasj=6ooB)~Rz7g}oyCbpiMncO?AojyoZ?nx77`-`C-qWm>B#7behJ zR*a8XnI2_;K1F=mU{TMG%Ff+Ecv90O+p0?Eo!T$1Iii)bFat89+~oks>b3Jh3y={T zk>~KRYuhiYfY6W5O^xW^RyaTj{w`S6J{XE({>GK0za=j{9M>&G+|LD?1T= z6qQES%#$p+ThG%0s4Wd;m8Zd~(fvzJZ2=h3oHpqJ-C`4(#@%5sk7%=W6eEubWw^$Cty zr(onVk9}OM)?Hk}a&j9~jnN{}d7oewhVq=f@)LT9o*Qi$q;H|?f#(}tOM0!%$yS9p z>=_=H8P04pyGJ`l_OTI7Nh_x$p8HrU{ zblIc}hs~HcvP=((I9Bn8^x4qbNq1`;?wi`RWmDhjy&LF%?#2|_f_Vla$;&zP1w|?t zcS!UgQzkxy@E_(i8wQ1ty06o}IcqCt2_Q*}AC4hV90Yu$W8fC)h1a(MH5R)1i|$Sq z)~Y!c788uw#M*oGn7uF@VIvHE^Bx|v%ny$_$?J4x+5{R~Og8%dO(B3UNhwd6$HCvE zr=;FZ_pm?(4R~R=NecVeEzBz3aPX7K5bpW~sHr(`(EufFbUHKlD40BVEFZZ#f~7dD z>l5$17`f$2XAED`O!p_T-u!%dtm#2NK!-fQA-cY)dM2j^Zj@#2f^0)vv^t4JF|gSd>7h)w&WAa8)P%FO35$Gg0upQR=!ETB-VD^5f)e zV#XNtgMzzh%$LdE>W6VCanFs;^+|_Nb)!vVzP6o@=fmxTJ4QB^%l<(fO?=GvV|p!m z;h?*(I=0O{;Fgv25whj(Z~K&9x!6yZ;aPnb0G;hKn0}mN9Xpm=TDX7Lq)KC;5$tD?4<9131*-SPb~g2ZeF6AVka$nO?ZGPZP1x0BtV=urSA0TctUWdI^yLh3x@KCnh69bNs0 zpGj{+S!YGA5@G-IE!Ye~nI=%v%kMMgk1A!a$UY{pLF8%0_G-wl7Q$zB(-=W!XdAg0 z2F|BQAgjZ22v-f666z9}Ag~pZGMG8P8fEeSu0iGGD_MC(9!XEb7W{U$VGBnp|- zbqhx+cKMOEc_O4!+(VH>MLEo^*Y~Qlk~db?)MIoa^kXC_3NlhO4RKQT&}H=3_nXZ1 zaN&vmf?Yh&@qW2eKIbvct_)mv5D{w4L-sW*Q zP3fxWh1>mNY-(s_Oi1dI^*|4fK~zP`uysM58z{eQydbeg4A{KMQl9rZH}?g-6T$}2 z4QT%tVG24%G<8pkiz*>Ebv8Bo`*{J~AW=Os?>vlq*Lf-xumT+o}| zqt3IfE5E2aKg_0f4rppEw$1e*9cd3weNoc_Pafv3V<5FFzR)X8O5TGIEFUtcB+kk@ zGanM;sq!=ahnjj7B2vyvXKzsw>Br$G)| zYvfVVIV=Bd+($i^WE%uz)AWy3>!4Ek$7sDpwI?1*?)Y)ExMZVMs0)B1k`?z@>oT&3 z=+UptFER>DEDLFO^H&<>|3ce1TqKm{p_b4~B`8hggOVHamu8BBhfyVWo8^T?Szj?P zkSYORbPOd<5!x@7@?|+x=b%PN3f!m~cy3V&={u8$vWMuYuR>0!zd3vY(8~WRz=xe& zm+%NP4#SxE?s)W7^o$WnNtfkh9?r=WL5FuJw zyDW;U9tI(~QC*o%r}l9L8&*8A{kjc?R9`*v*=7r=qx310 z5x52*#Qqt*r#DWsL9I!EFrx-pGU~%nKwM*ech(4Hla2}7q=WU{D#AaB%S?j++2{LZ zaGUI;AXdZ>qeIwOiyC{r4t9^>L*&Svuit+i3i1h}ps;XG^0Ll=cHn^1mr{L@uWp2i zrh)`%?2BK=49|&pRx5ayAc5@Dd|Vc3tF@aSi2|(0lBaCZu>Z!d(HWQ06Qpu?Wc?eY z8pt`L$QezklT=U|b@E+Vby_mGV?@UD(r@B=RfmC`IIG{uU7)DezzutWi(Y7t@Cl0Y zw6KRlz0FXYhM{n`J5lk2d@w~lJa_g`xWkXO_*Jh+y__QWjr)A;8|pMjpc6NQ9)V7Z zN{07MJ1Aw&cD~`8z`%T&1D=-!cyqO$&~waFdV5KAw0gcC-tb9f|I?0vZ;1Yi zs6O*_wv8*drxDl2mn;|B$f9&3?T5owIq$i`rxmKI<>>yqd((4}UE z(YBc0RRf>f0f~Tqf#MWDA_}%`%p6YfGjaE6rxGW z;7l4%j(Ve%Wx78cs{drT1Yk@-^BHT(rw;?P%xI^~s7S>yf*d#{y8zOI%v8#oQqJ#q zk3~vm9#MOje_L-mj-+~;n8|7aoOAnk{v-(Nx}fhEl0nfb=${50;Rw&)v!JzXubBRC z*#iQT+O|>q7Iehs-cR%9RvWQ0aHo!b@FA!ut3=MtzrJ~+sB|j?dEA87>Fc$^KNIbb zUS9N4dP?iXaNd8UB=Y}Tjv*^^0niON1M8HMGjIN4qkZZWCW(PlzbxDN3Pk-->c#m| z#7;Y{xO^-N&mil&PrzwtzFqX4A-ohp&=1>s-x*{*J_}JIzBH&rXZc;jaqU;G_NWJ+vxa`hCENe=uo5F4?}pP21-jyw%UxRrWp0xq{fQq$ zD?yPIKAo(6&%&BblKLsbs@>smif2EC&+A2XNI+pr4I&Wka@BU5tt67k9*4&FsM@Ww zw{0tU(UsbI*=Fl1b}zdj+N{UJ!#FD*#v&{lHbk0T%l}W#c8UXzc&!@dqM0`fUz9Bt zh+6&`_})B?d~|tcJXzJE=piZr^>OdZQt=J=>ZOiU;!nhd-h0 zy8ioD$khZIIA&`Bc-X57sWyJ}C?;=C)*r9So?aDj zXV=B^d`P;NtZRP^<|y2&R5{RxI~betg>jco`hH6MxKUmHKyps3IwX496HBR$H-TH+ zs4$*v0wZ7WE>~LZ$Y&z!f6@2BJ9$Hx?)?A$m!h?j7ilv4#W!&AZd6c;`>UXCbsHm@ z3wwoLARq{h^_M=1Ic%kNgz8jmXmrRM^(VqH>i>Z`_{Mz0475eA7w{yLeaYUvrP0#f zO1?;Kn09rsU#{yb;#+j(ClQTDD9RG2#ZBXRya>OHzo@gZ$A9|1qOqaj?fGy&*(+*~ z3o6i!9_L}HOV!@_127j%>d-LXzUi1jgdh$DEU7rfdJ0&WHEkS2oZju!Zc!{GxxFJ$ zz2OJ(j7r&mF?!mB>mY-VLEm~(mZPjw$*`PRWw2HHdhD>vp}|1ZN{EL=ve@FI z-+WYK}`@lpJ~2UfB+UCkMR5yi{nE zdhO$Sos=qkuD>Z?$?q$bOA$iY?ER6+C4l;7r3_w?7|q)3Qsuyg&7OpJS;i_KlKOPg z)8eEJ+wq`OacDTnd^%@p#@Ptij~{1`;Dur`;hmTn%~QUcI~I4LTu+P2LcXG&5}QlP zE6Z3DjHFlO7USi!&p!_C!MCYGzpx)iI%3MC4-3DMA;)=rKZX&n*Nhu_LDNT5W!l~rd-mcC1pVon9>cr|Hq)482`ozgF*{- zu(;QdJw&}vq^PK+uy3rHadJa~mlPJyf)7cvlUKRIF*Llf49%PSm-GAD9Ow5fD!t+f z&GpVY6?bN_q{VD69@L}e?ebF+%T?YhxaBQXuK#@U);K(7JW$amXZ?a`zaa2{aCv{#20JGx;fT?V9rr+0O=B2LpGfcl5bsgjzdpo`I z6lI**tE4fTpNRiL`;{H6fn%$_rfT1@p=p1FDO5HE~ zHk=>yMUnn5eFp53)s8wS=;s*Q;aEw!Qktwyw*2ouLqGH0(Vdp%iJGhRCW{8|qA#$c z9_eUaYqF;&S(CDi8 z|K*&dhi+nEd%G7fgS|0V6~hfyde@-3K?G^S+8hx%>{Kbbab2N{e+A&&h`mLI{UFj; zkFt$+DcB^7Cul z+QjvL`zy8QMOECR70Jud8KBCQyfOOF*AdF5B$SA&v)BWhmY|7z{H`?OJ}r6}d*(?g zkFp3UB@|viqR;;dy#7Uk1Sz66i`dh3%zQ=~k(>gHaUC1;xL;%Brs*Y}PtNSQLQBG| z(z(C-?*x^61282Oo(T>=t3;4=Zm{7mAa`0FP)Kgt-vf>%9nEBKo}IsmM0bi9k1)4+F-D!KtIc2wtwJd6H-smmh)k>tLnM@ zEbTCM8$_L{?mql$pg@w8+<7g412yAM0jIJI34$wyB)#Hc81)*b7eg0Nw~AbzYJBUH zNq-}Syyv+AjXq@xE-9|_YR092fJkrU@zBX;%^MDR1ImoQFvFgY0vu8CrYRgs*qkoPv_%VoDnlf3m2gYOjo*0|Kbe)36+ zvI>5H2xZgUJ_88$h;iUk?u_kTs&{|&m8PD;_F@B8QtUOz@wEq*=Pnh^l>=liG9S$; zga=HO=jFeFS@L#SJjr7~b)`C;ff;o;zv z>~af!P}IO~%U>~dLDi4kP=z43cL$}3ZEhZK5sg&x1(%ld4BETgYUrxU$4S!eAYa03 zKIke>$4g>B_8Wfhq?jW`RvcYuomPGo>Ltibpz_gT*LYguvFSsNgD;s zY?O3E%JF;dk~Zvz9FR7o$)Eogeev?;7U;S*n6~S&t?+s4Z+O$4LS#iXW^Apize{34 ze0r{}b@PTYPWIKpOYO2jBn7{$&|XIhF$8D*u7MB~KY8kREeS!DFiaRSABqkx4Bbt; zwr!zBGCc>$I^{{IGihp6jeP8P7OfmBMdQ_dT?Kz)U050IS--Br5%gIjPd(tYwjGQQ zm*Se&fTJ64!zuVZe8>xelvW)i#oOE3W)9alOtX05;bnh-o#3lVq_==X7p}EC+2=^n z^wSh0eh{HhsG|WVJEHL7@lxcLaTnm|FZ}`3#=$exu8$*i7uA6vVtn8oi_SlCIUhlr z+~P)g+@d?%b~OA@{2+?cwo00M@FJJ0wnbjS7?&baO{LY^RN}ZFMB{m{7}AYx0XNUD zWlXp68sLv@uD3B7%!lK2Pn)bnKDdh~a;9zh?=dJ}UeS1RrUjimaRV{ovYc~Py z7?@PC#D*9cB2Ffg$z*V&vyzc4<4gi*%wuZ0Yo?2IS2b1D$qX840VO`3ytpH7qbNq< zM-~@U&|y>LDd6%W?!!X?{c!^qP?7&T=iFOcSM~Hn{66RV2whd@o_p@O=bU@)x#!-? zi)rL<;z58yj-*ucwJm(g6doQ})1mVpfa1GB-U20VwdO^UBJ>mgm2KAcs>?8N?yY$8 ztg=C`+B%=WEjEK}Hi|{v1mPwO%E|+P^%R#~YnpiegkhNu987)Z5i(rOcya%8X*e+f zfK3raScXnx8A_BFhW##NaP_Jw_m#y{_i_#m_P7kl-kwHg#Rp_h!U+Ig>CoF8^ZWO8AXG-cks!nxdc{31Tej5^3GXg%hiwmT^@q64;7eaXwP$XpG{?w z2aO16s7e5rFo%}~Z#Y8ZuPmMrSEJ!2GLrc}c|kJsmnO9ZN1ws6QP8>T?b#V<%RRyl zUy@Qq%4F4vcd=aIS&%gy;KQ?#5{$i$>P0cMB+6U_+e>C6mv-&O*KjkE1D3}IdZ{d) z`aZuw<&&+aRj>rnTb3XX!{aURY%qoD3?|9?`HC( z`b^E6f%?Q?JZ~O$+OFN92opSq^wlq5%~=-xsw~bu$)7MpC569mbb7i4wu)Be`wSC= zBy8B4oBrqph-8b!1&BPfxRAB+lue}s%5P|};p^@k$X$2@a*Z!Q$HiW(GSBxy54h zeBiVf#P`SZSHlA-b#j#Lni6|)Bly0|!!Xp(n3n?n#lV1@++hBkc!AWW0O& zdv~|gL*!f4Qwt|Q!vhJ$$%3~~wua?@76faaRu}UNr#_lcU(>Q1kIb~-{NfrzeF@`N zQT1E!U{8hXJlqa#OGrAhI-24iJ?eUz(nn>anTX3eNZ@uw8!PK3WemR}2?nD~bT17YW8-TWq;R0;Dn1G+|X&AN*(f(*o@d@4pDjgt(3q}EVKg`x`q zeq ?k=SWCpnyc*$ZEQ7KSf>#DM^(3ph#e#)9c*Qm2X3D?cA;NKTWYh%@`8J z^$d}h(B~s%OLJFsvEz3A3(*yx$DUD=;}$A0XUNq<96*9U*LMAEALNz#A6ntJEHNkjg2|Tn-P0Z5_Ybh1$zSqtk~G7l#)gVz)!ci-{GR)wnesb? z@NEkN{O;+7B`?BoQiR_<-8kD6{Qk@jeSSZBc>LD*BKvb}%$u{}5v+4cOiq${5h;~Z zr{sjep!G4}o66BcqI4II(Iy%Tgd-i3WW4J|nZ)SPsI|_r_|jYoAx%veLJAbfE@Bpk ztr12@J!_OGn}(bseqj;XfeiP3k{$4%af0}=X>5RDx+{B#0kG(3L_U97Rk2@|Y*L&KK zO%&aOM`K4PSarknEXKu1>ri@Hc1sI0H$AW30zX1}y}Awc__1mE5h|2bhu+6jNo%gP z&A_@)69awn=rPETUAQ{i(+zLGcRsY`t8BEJ34AXL=<#V-94wJlCn6kvSeXfjgSg5HGuYJWevxO8 zn7R-^xh(}RESV7Zq~Ikdl0P5DZ4wD_)F%Cddn{OdZ&R_4guzbkBfo&Mc;drsQ~&vX z^0AJp8CbHb6LpZY6~fuqkT~8N)or@VP3ctg&#|l}?IuZ-1rNupW3ex$hud^44n;z= z6B*4j9j5L9EHQN?6PUE-7A%le@?vb9>4F<$S!>%Gr>et;jzelQ&E>nHR94Mj$>d5i zyBViptvbyO__iF^gtrVG(8>Peacx7Ms+iCt4W+W`)IU#ifC@O?n+{_f2(RyudnGX~ zE*b)*(&DGuZ=SVE6g*M@ff?L}caDG2j#5&~r=Q+xLxk6nnI z!1!U{!{CzmuvP@@UlJ}9ybFX2`OS>Ng@LwQe}ZfzcUAD)GYRc%gnS^S!sV=S@nJY^ z5GR2$4EL%RqcC^^kQ{~!5c<9)!Jrn(Bj!%z7f${kHqZ^RG6XsH#n`&0`n1F9lm7gJ zFUH|v0h@v5S{NvmRdZKy5otMQ=dgJ#I;`Bp0KT^o&A1}XpQs_2f!db;AUkRzG=!2F z(b1mnrds;Wm!c;f)Y9$~kyP$b2XZeyi5^Ky`M1|e|E5~n(+wx)u#=G+VFm2zhUZRf zMN@ma|24WQI2h1Xesh?*+S3i^o+z8jT^10Lo^H7Ir1;jx!D8Ti1{(Vm35F*Ot!Qjd zH*7j7qO(2SfZ2xmh4t%`wYH}l?mG$FIlbP>+1R_5;+WsM=E`zewf=#y?%uu>HDKnt zD>3GmBIRN2?dgVxk-)mpUrIOemAj`KPQ4Fvl>#>nBbO4?oC`M9a~_$4dVaz(Y!(ZG z1Gxn!(tc$5+go;;NktD4;87ZDdYw>a^Q%ne%c95~R9tUYRa^s>PGS(&<+ zf;Fu`1_W=$3Z`19Ko*!k=ZMKxDv*}+=u@!;FPOdsvcUZG0%(OrA~@wD{;3x53;6k| zbiNhzfeF>Jr8`teT6Vm+9w{6pQ z$nx)V)(&g~g@11x7}!1lIeu6_(6^&+{n{(7GxrKe$Em95cHyz6cAt6wG_DY;vRy2$0WYOZ*5P`oKyqdw0jQWMnYj$5>9uK)g! zcwe>k5n~K)5IMQHYU03T3MWK>nDCf<-9!rRNnL~_#4NZZGjP#MQDz#Q0x?aR< z8sMmxVPJch#kQ5c@=9h^kO`W&?_Bg$*%}r7)Dqzywy&LrfweWemoG0{qa9nQ7ohmE z4D>F9^H>IHnm8YphCr|v+rVTSzid}ynnh#Vw^$yRF-rJjF5BLb@uHPic2M8Po&b?+ zfxE#P(u+W(QK~2z>KhPu`wWph@-pmK!;)J|Xj?)4DyDqNuCCqTPq}bZau&o43(fh0 z+-R#`EGt+UsURD!AO$qKw$La~A>KC=-OHNAcB8l;~JEz&>aj`Vrft zr4gV|*W9%dN1A;srV(KX0k*3X2N)k-ky>3$WbTCHngL% z0Ji~p=^;vfOm#+&Qo(0rhv0IQsQ9u!>B_*# zVTlmxl~tyG$IMJvVuld43#^DF}G` zD&%i7u|4Z(cMk^Zo&DB(|_x&|kNBrm)A(qh`OsPY63KNB-N%_U!xG&t1`?U27YFc>{x|Z$F ztj07#S)b^fCBg42I4|hu&$X<8vX*u!3JKk*K9%1)zFyVhrxM`lWdjdLI z?2gqL$PopGIm*VJo^)Fz=H-NZs%B3H)R(SHgL*l3g1@blMucFYV|!4@=uHGEj{?v1 zpb1jhnU3@tl@f4cD%{SK97XIGhVSi3LrQT9w&oT}(B63lMxLv#y@l?sF5z4Q@Oe>kiLr6XEF&%JR!4*ztu%YOL6z32gySg-E9Zyt30eO?U3+pDev zvs5@B^g(nm?bZQBcM4inC#i`aY;}_{^sN!pa0~z=^tvPpaU^A#{`F(nSKgb` zA&V`*UB%%lcA8GDiU->1MKsfF?dP73Q{MU95fPDzEs#}*ULtw}u_PG#*rNCLHi~Zm zkPJ6dbqJ}Nn3k$QiFS49GC>x-1wf6WLDM_tHIW@uf@>Z+J=4(nTY0G0#U&rxUylCA z4Y4eXfOe`=CkaIhFpG{f$g-Q}Sa`%YnFQV}8r7-@#%E9W)_kXzywLR^v8lwmZ9|&! zfuo&|#)nywRdf3UYsoJHI*TI}CDbqQjh8p_ka#a_A6nzKdb|Tyu*~AxV$t4cqML4` zxIHT>FKDLt0)ztBvK@V+S%5TRY~WlJ)vI68Fw}d@<&4DokGNB#P4mI7dqoCLptgAG zO$nxw+_~vl6JO)eBBD&(TM{m(PK=9Yk!f)N#&DF6)*LRi_?3-}we^v*UU1Jb+!BXJ z;g_#Ol|F)-5}~3IIcRP5?AGT@)$ z8pdCB?GW)%LB{PUhKc9TD(cYL!Vci#9{C=eGMA<3U{rr4g@W?>UQxJt--b%<&L57V zc6A+AC$7SFw(iZ~r9Kfw?OK)4iB;DdB+}~8SWAoulqs#vz_M_+4UdcY)#54P;-JIF zQUOh8NDEj0PEeLfw!^i1!hNY4U*&rlRpTp^BJEAyyHEJ?cPbgLk-J znNlbB3i}?r;jVW*niZ5E+;F#lE5=8>mBfRI8}1rw8ebPo9teJ?s7pPyu>Lt787Zb4 z+$I+SUa;PiPiz@32nWA&v;HNE!Y|o?tOza&^P3qh3OCX^xE{?Zwk5Hb9$DA8I6S?D zCE0Lt%cCO-y-zxgkv=+*z7-n_cqC(-z+uS2Gx-$f4Ydn%wO;y7ybz(nZU)ZCue)Vl z3@Dwm@X$9Fz%ls%EFQNI3H!L(==LffRFYN1p5VmL&x{A5m1}a5>5zzVCh^I0QC6;j zGzL8JxWmM=M#DVx%l002t-Z3==u~uY+;p`ucFn)B2^VtWV|76|MV*xAY2m^DBGf3t zi&+XUMr~NI_<>C*!QnQFDBW6&77qQ5r65YGKP7k?=S;awJeV|>vr!ACJY1dvgez`+ zaQ*8U0j)X#!}=@mDB!Z@>MLlQBc|h3&{m?~o_`fvr&z##%R!hNa0_B#wpm48BAa}! z2{ODD9uovW)Obn~X>`Ath_SijRe)>GLXivnrb~AQm z+~=}BrrU5wUk2JH-p`fB62@>7DYgD9hNAGDlqtik*5t{^N?9LqH|S-fBIdS=ZH$)0 z8xi`$w&b}jbbtbE<_FE)xP6n109G|yH#g{2w*=x8McjG|Luhf(L})gjC0ODYhO1Yg z`tHrhE5me*qQ16(h6S$VFp**jJM)25{x#^6$Fhst`J>I5L^eosHCvrHTMV&!#c=WP zINfw*lxo=4wLRO<5+N!)8r3z-n!f!kn1xm_p|i@mhyLNd4CLZ^%)zy>O(w23ia+(n z%^6U?h>ePElPpnuO_CHyi1#55`6o8|#?e4rI`uHfEB`NI@Gsd9CV+E zgT~cCUL+*S#Q-$7amHntnSrp2c}ZA3Z=NVuH!E2r&F&daE-*4 z&Va1XVt5;GP+?U#z^~$ani}}gvy!?QGY-&R!LqH$swY`|V_D^acB)go^GGBVEJ~&h zo;ouFDFw|VS)`QW+K}CM7B&`v98k_gj>Hq`p}uzuEmt5vqb3@$;4MRc;Hc|uTm3bQ zBTTF&enxy^A}-o{n*Tn}7vkxnI^VmMXu|MBT-aDyJn>5=>6$e@NfYNKleA>ls@N8i zxk76-ws7LyS;S!SkY@uqUZV0?RiR#XzPcl&YMagp!% zCf)9VcB+%7&!pS2ASk$0lE7UAAP(QYElE6u2_>j+BB?{iG$Azz-L4L;o;kJ1wFGK| z$jjT42<|tkI#K(fehdyj)r49P^jtM})l5hwJ0P+c`kb|nV~m=>_vk4b^gkE5o5UY#Vzj*lzA^pT_ z(exbOgjFH%PIcntGhtU>5eH#~ENi@)htO|)Z89%V1~juMSTXS(W<_qmXT^60X3B~n z&g%v+VtZo~P6VMl)q3|#7_rtKZEl8x$hQxmh{sAq5DeSy%@3Ex!-v?5auX;JXPwze zBPQQ7n1QyT7d2r>0JvQpD$Rr+K|MlMfZT7lC+bR|o}ocxO&sMUYQ~76+eH0EJ8<67 zY)p+5XjfrIBP$j6mbF@-XvvNw(l=OaWna7#m9eb}$0ekqPJV^KXoR264Tx7giR`%-GT1*sm_)W`XA;LKOM^%oJ{#vsi@DBN(tOxXHMeFa zLMpnriS_bv&pSJb*7YULV2wKV9E=p)(1cbWHm?pDGoh83p`d3b(~{bo(CycAQzG4X zPzYhY6UojkYC^ULno}pcWl|E-D#^304e|*}6XC1+@)Dor7S#MRUIR7|KyfAUYl1L%Lf<4{Pe*SHE zggh0*&2)Gi4IaBs1y^?ULht|iD*~XW2Ai8WM}a0SIyZ?)yevsf`uOWmV~%aYqyTWQ zI&}U_nDkmo{}N`AY3E$IcoP(?>2*o8>tfV@_3P1JesL4RC8VNG{Efj#FAmQCQabb9Wj=lC`SXjr`~sa1U=)S~jfW7L} zU+2)wP6^;Aj-=wr5C!MIA&G=_7*--G9!DxBj&4GQ51UgbRtdJcHqcBlAPi}LHlM{X zTq?-ccshO5??@ySZx_Un7g76x-Ka^;9E}ioPR;i`uLOs%zhZY1dj~MiLIk(}2a0Vo z2gHZ%RqKD7SwH(_pGc$yb32HXn~;==6Pon22imLV{ysBGyrTR5BZ(QB=);wFa`^S~AVilg%k# zl}!2c%VMhpMYM((%Yo1Y5MvYG1n_Wq-PM^)@ie^dTA7n67i5S5Adb;^|5}96T`OfW z#z_G|isLLs@<^~hbr;@X_C`M>hYL6HArUM?(Z9C*OBsIY@@9cT3?zGej7N#lSTx^l zQ_CgBIBGpLM62Ic7qClqt?a}^UA%}5J->-a+QAWUf~mVJYId1(`VbC}$`gNdJsExF z70O}(t%Sj*2rtj`PBK%mKjrj%6N79Q3|IhA!>oN+_|I8<16Uf90TT!ZrlF>XSjQpNVFc0o;-4BP4GHsoHS zV=M~E5dN>yuel|$RYV!k_R%A|^~&~&;S%V%JYCpi*#-TzHQgSE*YTSHZ67}mp*VoD z$<{_`eXGjP1KK|CmAG}p?=GZ%XAy0%6dI(_Fh?wS4>os5jYx*~xm}%DErg@y;GMgE zqpO6ZCjq2EA zn6!0PXhHOI#c=S#;Is5`jwhkUOumw#BRb40aB$lQPAA1**tHZ8n|(XxR;p!y2S>2q z_t}u9oq~#K6?Hi+r)8%0B?dwiX(2UF>q!x(PM{thL0*Mhh#H1tKa@sMqpyxzT=RkQ z>eRa#BD6Y;VNl8N&kM$o`?UCm`PvS&^G8Z0;5Yd@2|ypy3;bg9@9;&G zbW!!8(eSo}B#wXo4%{peSm42)j=g?OxTqi&^{z4e zNczwivOj)NA<||KQ@c9xJ<)31TqM_V=@x#-A{7md_sX7cL>KrwHje29HvTy^|8Zf2 zXg!#i05mXh{(h9Fe$hLO44i1!OxLLBVl1SU$Dya0ozNcsc{^vuEY$n$S#VgUYz!=kyt?PRMH@!$M5uIz5f zb3=#p43u-f%`3a5=hmvj>DRiZJK}0iL*<&)Em66q8=_RMSv_Ma?FelmoynU_MtSK( z;N#m;(d<2<5jlTw@n<78q`$TswbOwta~eyCB}tJa60!)VOGGj0|-2F}@9bM>+5gCeUTec%and@4#s{ni*ELCQ=pJfuKzdJNaUWpm|X<13OSd`x!K_Z=^S@UJm3wz83-5!18ZTQ~n(d zY%&)XyJ&5azhiLD6I1^-GGVxq%b9!Q4OGCUCl~&g7;Mo^0fWtN4#!|8lYVmz`H51< zvNAoV&fXW#saDJ5QKc8PZr8uQ4<*-=)_W4S98KHBKiwPLft1V=6rub=_yl{RlxrE> zjg(yQ9s3&Qiei?1HlG9opu%V5{4PAriU9t0A9hO^#GgDqYhc{s`-~~#Rr*s`oHn=R zC)uZ5x;*Oj`GB7t3-l-s6XANjxiBJZUpTonz?c-AP;x6}FDn;!RlB8)3fqjjN;@lGu96d;$|iBF)2VCE<@*4WR?1i3#~RgOgO2H<$oyK$E{aj<$q_E47Rs zq$JJSNRKQwvq$NHBw)^`>9>@ZxtGzS32B_N@sV1}oHtQ|U_2SaZ$woNemfZMQlWX2$h5u zPI*%})EK6g7%Fu7l&|8pzP(H{#{7Oh)~u*x+wiRz`wN_ijBE^s3Ij`Lv?cK7FXIwf z;MkQdZ%oG=Rawv+w*zBnba6kMoxpOFa2;`YBPT29^rQcsJbmRUE0PZ})7MYG83l<) zJO^@LxriQV`pUn(@#^2oyGm~UoA#rSBA?LVNrt=PqQFoQ;BNC${}TU5FgoBL@tYa> zN69Vy(VHblxSN}RYV~-gOk42aEHz(l<_hto7Nrn(U-OeETFFz~v3QbDWAfLP<%q769xK;wvIS2S0~ z*m1vO_N@J6cSjAkR2%LnSd|q{b!6qL1}w+DB?BjnT4l`~?Xc|86=N%$ac4!%G{!pm z(0JJAl#D_tXgE#?;2d#G%QZ&Ey&oOht9bnJ(8t&cE)5>8+6cUHuWq_9Z{iZc zb|)23)X7~!G|0M>v89#p?C0MSZFUlpMHgq_gn~U@b*+xgnp47UrS-S+TF8lbfib_O zm52OA{2to<4_96+Pd_^~=f6!af<^2xs83&b$}5H~%rxk*HM2ONYj_?7^Ms(SJ8chgPvvP5p^Q zK3GP4e=M$4Pq!%7$r906uBRJLcq@vRU!iS|3Y@pS6CyQFLt z_UJ`H#gT*J*!%6kA_{u2yuI*>jmN>`}Vi{F-k6NoXx#%Kqc z%+M6Z`!ZnFOw7%p?W)0fmItx6P^j5jVI1bBL=Qp$^EsAXL}QZg;WjVZwc9I6-;~8U zapl|pyv-jBesCGeS^VlP25a0B(T&;c&SjYHQpaE^2qs~Z@Ka6&$r@81l^dzGVF%K8 zV+EquB>0BQGO)~}&eU+Enkq5kR*7SYM~qnht(ST7hp(u?h^Z|vE*3b^usZOR%fW(1 z=k=0-oq9?zvOV(kk70CJ1Gb|ruQQP+j#S(ZJ~)vPt!2T0cK^e=1DODq@N{2cFSF`U z0d*EIH%K!X4SeT722+bYt^^94e;^}j^uW1Raq6h3)%*Cl1E>uvdv>!zB15nRCm+b* zp)S%TAf?Dsbiu3C<6C-RehbSHfu#_v$A?37$dLN%D7t{m6pg)xW7#nIc2q9W53F2B zlKkARPOM|QtFo)it8v}2x*Wq2TkK7v1%hH?MqKT-U8X-pKOW`5yh@Obz%ic=Ru^wQ0b_0+gaJw2UCHwwlv3F*|E-Wd5;L%Bk8K4(mV24@pXo~MK?#?l8~&x z87dJB-@H6{+7x}3>5a$n~TuRZnXC;mc$hSuK+CO$G9%K7|WzeBm z=}R(c<0G^av^fPs=i8OhClkuU+`b(*Im!1b!h~wfr%F)bpEppeZpSdEL!%8(9A$M zZ2Uh|8m0!@6&NQyUGO~BpzGPuZ{gyeeg$gAMa(9t8O;hDN~seW23N*_TvkxVp&fl! zP%eai{^7zH|2PjOQs2IUCId`wQ|$Av$iR}OaE4j1Dpk$KjomQkfq4K6Cs#19$T0gl z7~hIe`FC6)=MLfs5!^#?InFqgS1g(3)$Q*$S=F;zxHo0Liovg`rY9K8t2KYrNIQi1;XgQ(NN zc0_qr{cqf4H-`yWx_sA4Y4*-2%@2+oyH@g4q!)Hgq{APiEq$EYBL0@_^4_BXebK^v zANMke&Wot3)5%Qt!exIBR7GJxrkJLqyM+|Mo4<%Lzyec>V*uI-kEu>c>ss9-N1=P( ziH`rn%s9!`FvyrXv|t_)i-XYrzLN)`93Ec@I0%XJg3y+hcnC6_uC8vVlJWB7DvZ>5 zr$79x>VntZI1h3QhoZyJ8aZb}&TI~QF`K<1xaepd{hF;+bXT_rjSF=;REj93^O~7Q zD=Nj+vennWD+6uysc@?U--p!6ukuI50l52J+~lm+eP2+;FP$b5QAieYE5PW=TunEeHn^KZPJMckflTKmBFfBK!>F$ z_akpKX*d!4kq7h(YKE;Bfj1;WdkYnR@;zwNS^!+~Ui1a-mSLt{t4`nDLaFPq6m~BD zEore3RyCDbSU-nFgVf*@PdwbR)1j4hUZI@4ge{nq9sFqP1D0FF8m99E*rY(uC2KxT51hM#ez_tgoG8&GYDp#}g`;{fthhJdZfw zVg*(gXzj+~%(}or5x;4g7{m7n1`}fnSE7~S(7XdV`vdeyOE>)6k||{WR!cYB)|l4! zz8{rCuG}PoZTbMZ9pW#*+EUTG6ugnM|B`hZ!R5fZ4ZoSux=ms`-+iTI2X}EYWZPBo z9GR{h=C52KMy(d|68Bz(0_F+TwD~KIz3|Bo1oKuJzvGpb`GvU~1C}V5uhLjx<5gl2 zD3ObEZ$xb!XKlUpmU&c%keax(MABp5VU~H3tz|{7S`F#FKSPJM^%^>J%Pps4lTn_2 zC+ezBNdNk!=#RIIzH4Rc=(|=*^hcoifsxElrm*&A(*v(slo~u=<+PdSc7{RSl z9i`gHNJTTH?YrhfI9+@L&u30)4tpr2!hA6p<7wXxz&AgHf;M977ZkKYNe4y$FuoYZ z6DRRV!Oq1W!RNB+z}O}HbHsszsbAx7Xm4I$&xa`F6$Qeo@$|j_%R}y2ANE7Nmrqb_ zvG?UQG>-7hQ710p##57kh6#2~XW@tuLnM`3^x-(#$~b6fd`yh8ctTM4mjH!F&w#=p zwzQhRRM072OHz^fFb6xokyZgpSsS1KFnX*jY5hP*%Z7zhn*$2G5SB%FJv_dJTLjAD zsgt<=R$CM8Tp!n(k7QzM+GOh&V7LC$)exeOeS})uvm1lNhKVg+{?QE7(_san;Bb!s zKpy5}zem_o#tVr0%n=Lz{Lu_d&We_aikc69w7;}WFM%orrK~wF(ajyHnEIHzzNFdo zE{%loyME2!cSp*1dQmSzmYy0|PE`<{Z~iEbP|;>^-;#7-ueQ}4R;i^?NWbq;iQ6W2 zu_(mA5y7b4ZIA@S3WRFgmiHn8xNN(kU>8<(b?hM5{pkrbOk(wRNyBHH^VZV~r*`vj zL9TFp7B3@*@Z3L+S~&_jKaJxU{l!kH8maBKt*UOjhE6wGi9ba*U3(lTT)+|uDGVJX z%$J&Cefnc4Z>==~dB4Lpba?jTLFZ_Og~8LT_~~6Exn8|@e7u>6IC`OGvxL~SvfhFJ z@PbyLpOdML7T;lOrZZyM72Sq89?ddYaOKrFfR!|7V8<4DI z#6emN)3Pfaj>D2LBYQz54b#zWJd@!t%3|6f7MuD9J7Y_yS2U{A)-AiJ+wyw7PhrnK z!YGpEH`LxRhC_4Iq5sR}6}x8Y0H=Qn#TOSapgv11wDHqyvLuS*z*}a&?GQqlROG;H zjs}jv!P#3rjqfoxOs0)tH}3 z*Uw!oLWGK$A(CHu9Z;=3^LD{MqCMfA^XCO;hDG_q#p$z0&V|3ZF_SC9)v;m|S zOY)37Dbi{PR&(eKetq|hXK$WgECwjfkSiHa*|9QnoCR}p@bXel0+(+Q!tE8aEo}X z!sJ{O7hJL{yT+hC3ir$_RWT-|7GzFoZZp zw&le-bF1Y&6NDpa+mKjAZ?&{JQXn_{lIzhi5PvO-v@AO#FPsdJEZKK`>s@S)>|s(@ zeD-ii6@?FnR#EhiGa%NXvv}5F#-syq!^{Z|AqYgr_iE)D#^8Eyz;Vvvd)bx8{}UaE z7RQVb>Q8=_LRzhjTvR!o?SVN$;_vS__@TJ1LrqffXI#e|f2Kq=%iveplHO3s5WY~W zZ6`e3f{)yg;N;)|VMfu^I?lHYk;NFyOpR-XSEQi1`lw}(2iL!18}5}TYr}e(_eSMZ zxSGclh2F|cd<<5cC(am)Z)hC0_un{O`_LEXn&-}$TNjQZJ;I>XWj-*Mzylc->o_N;EoNe25M#9 zk@M|BNiXc#JYFs7rX%h{;&-pH3{$rqn9V-pUfniE#y4ym6!~^@__eK9ti3w=ANpL&o#vI9&R{my(($>bE`?V>^y_IkUL5k1wuE5;b>mGLP|+<7 zW^ToL6w@KS{BUV%XW~xF4O>?EG|nqK75AlxzW|LlKQRx;_4y~Ljj!&-pPx?h$zG5{ zmk(%}ZH!7A;^0lQkfr1Bl|s!P#JkGm=FLLQ-e?w~ll@5pdg;eB0_a!y)6Y*Uf=Od7$~_jhHv{AWzw*=}&)ndJzsb`5$npM42hM zZnbMgsj3zBbWi|f$9OfA+eE1%NkdJrbX7C#ZCXV?8=WmmB<$&i4WGr`ighO9-Y;cn z+f<@tC8EQuOF8Y1IU^9QT@%eqM(cd3SwAF~!>(^w+Zr41SZ|pl#wh&x z%a|4TGUiEBUNn~NRVRNgyq(QEcJ%inUTLlH#UQ_7jwstKeiVmquRpU7I%$MWwo=$; z`X@y4MPHtdPk}N8Zss#z!TG++!ID;+Dawwixl?&UstBeL*HQ|S=WwHXUtUBLgKzjn zo?jT%t(sdXq5HA1CnOCwEzK6R8C8HwKZmz)6J>nn zL(5!}2p4^|btV;zqRrisR>4cqFp4(7&5t$ph$G#LWf;+wU!8%r2buTd+fd~@ST>Re zsz}A2Y`hwaPYJ`=a&e#Thrfyo;WMpXGQEhUK}3S+lys!CV^FK;gN7R#6aB9R3wJ&{ zwQ?vS)Blbrx;EN;GRXWnN5ChTIT46Wm{m?A@BCDH=oti=#UN^Wgm}j>UP|`qPv051; z%oHEb>+Wo%h3F7mK~!z^pRxmTVi*g-@z^=^7govGX2WAKm5iXauBR-%x7>vm?|8-# zX>kCoT^(A@bWqc{c4AjUwSiJ+-PPDYp}!8JSadgT;rI{k`$+X+$aXb<|1?amCU88A z=-#^;L{R`>=G|^l2Wrw3iQ3s(8CcGu43@>Z??#MtIX~t}57#g~Xjizu1Z>|1PFHVN z>#nFNHph4P>!`SVFpIK(D~`urif``X8<1b^Gpq4!cL%e46NsZGXBST1%(jqHt%A9} zNyT3J^$-Uz={o_Gn;)2O7btm@_MGCAw zXRU7_&w`2H{ANap-%ZIr@O6~uR{QvAlx;bR(JZtn^1oiU0FKF(Srbw8aH7LUHOH3o zBWL-`xx3UocV|LjsHWw9`VDMM7^L4YM_Dniy$2QZNS4uvV){@=tCQ1NLNs@96Rp`4$!~doK?&g*MgK?ryGXW7^HA1(m`EN03BE!NAiXV>~5kC|| zY=6xu_1jj(aCD~iH%M##S|%VuYXfk*3dc{|w}iZJgA~eEXm6n5`fba##DtI^wrb~Fwu~mz=dFfm*)pQck_WxF ze;Z|WomCu%{2f=|P26I)Ux5HKVNCa45x8 z4(Juj)z=n_Hryc43MTCw=z~e|YR8sAcp!Dz14O)L7W6Val=?*(n>L_3Rm*gAm`ZK= zF@7(&WAJ$DstV0y8#ur6TNyaXdn-8h*-tNkW8}brZNrxHNN{Qn4|l=c>BI*+ur^U2 z5u?DX@5_Wnfy6S8eH(?vumbpiI;egnr$Z2BHM`t#Hikr{P)jiz#c&mp*4}&8=x=xxsi)xA*F_G9cs7 z{km?i$E5lZ1DF0C=xqBg>iXHZOl;^yx?|db%@_U%-{K}&y%>PUa~>R5t5h8rdT=?) z{Py*O{hs9*l`{?7Cc;f>s;)2h#<2+D(K){RN z^#%NGO$9s&*M}aA>Dh)FZ#cr2?g4Ed&`Aq)8QhL_gCWwmr32c&!P+n$P~&ZEr+iC3 z$tCa^HhTs79H*w+FvKsA>AY`Tu+w|7*4rU}F!gOZ62Pm&|8!;Q>F_6*NZ~n^fPG9- zc|(epOHn!ut-P&P8P;vMCDo1xgeiiS$<$|lKoY=hfm>$t^ES&}r;k{+4mZrr9EAd~ z&2ra{V3OfI;)S;Ze`@a1_aKgqW3Fyu%?><1_X7`!SGE>-U!TYCcbX;5ESB}+dfRY~ zf>sW|TsiNYABwVG6*tVgmfr0&_n6i`Gr0f%9s#~ibBw}z%XC~@GfdYxo1!#R^T?9m zNjz)eVezn48|&BH(iYu>$LBGR{8z8nZ3})cAO%~_(#QLX@boKX^qV&6&uAYm0ooMSS*(?;Pk8je!TmH(6)k)8pdP`hhJQ z49B&N;Tk5@(D6eK)Q{jg`>nE38268oa^T7%NXk4b)nE`V|E_=X4t`uw-D8Y(V26dA z(e)S{z>P{=(RO=OGmQ&1qyd!1cUpO;X}HkIU$$5UjS{~%^K-v#?KRATEjh9r|ScW;9JBid~o2N)ZL`>8^>H*<5yGsD#VRI zgTM43nd^Xs<&SvaIx?K%>T69rFS8aj-j#i4VoM$+JX(L1@hn{dSx@qjvb%dj0XGuP7<^)Kpx9|O+UBstIgq$xRwp`)*Vn~sN8$|(mfyUFsuY)-+h-HD!oPfuIG%lJwYd_2WL zGh>dPmfJ-s7`>N%OgE!f3K64w_PS(kW~- z3>M)6Rt-519+T7H3n*?-Pc8fw$`4L>5AcLH5a;n&RQa)&`-l7y5_xK_J@^>cb111Q zifFLEf`yWBT=o;}tRN&wz4sRmx8igJJ42U8x^y1GGl~q3wRYYfI8z4cr~b!(c(-c+*ZY2!fm||tdeM|v2U3^bl>rr(sMI&# zn-)jyeg0=&=ph-$z|XMn!rzHjIO47h08EJBLq)45wup5a{`QdtaLi7nxErx{{!5S(M8E{{1oH8ZS~{gK}G8T!~bph+v9;GKIZg?rZUi$JBpj) z8#R*NFyzr{{qGE>&{rxi0s*u_nd0}d6vvS%K%ENM3MwmM2nVd2YLtV4!5!$9X%z-J z{b3~YXT0(lAu|G+RqOXnL#GV$ABn0PG-O0v1mCY>s5{3ni`KrK)uQH#DDcmbz{z+5 z8=r2qMFBO95AoFuT~4h*W7n1@j*^Vj$P3&HYYAvg*~ zy@9rg>`hxPK@iDIk&SDcJT_hoWglP{v`tRN0||lde|`vppGn9>32Ie6nQu{&SL6-CGpAXPPg3u5MrD_{)~!d*RUF+B{{ zh9UjlUm}5nwc$?4P0?>6tDVTA-<^S?g(^%-J}EX!nAl?h#|dj@--~8v{;{_gB$n|96Tr{ zy)d^U@Of60j|Hnzr3H|*KY^+OydQZN?Jp0u2W5}JQZ1y7DVThcX{{mMd@~jp-j&iwitZIuq z(I`u}+?OBAz{%lu(FdM>C?E_MZ~9(&6E3m&3g192ZDh3Jv|r)6`zg515TfJ?ka|iT zx?kuZpGE+zd5)_U_DJ0uv2`7CD6pWIY`?@6V*5%~Sr?kqNos{F6@1!Fo)y%rRRn<0 zL3~j&bw?hlYwJ~Aa~&x0EU3im($!7BLe4pOq{7&R_&dru(FEgh;XlWAD{2#5`a$%Q zhq>Rd8E7KNLrpBx(+x*mh3;vf6w$NniGAb|Q^5m+}eC?T5`irvMz$jAG@pffRMBhgpxv#F}EbECW6oEidlX$f`qY zf(THqA_xTJ$-j%V3o|fu8*=K)rWXU~LEK{%I%^b=_f4~kkYn8#;us$YdCQ3ycqiZxYSI5Ob zG2S}_gI=^F7iy}uK4Of)X5zni;+{Jfqq_1H@&T&o)yg-xebwbG&`Q;^$}on*GS=)C zNU!QCe!(?(i30~xF0SNEFb$rQ0oPL!lx{r659Xf zCw=Yz!=JFDe78?Q+ry#hD3ydIuTI{~awVulH#nti)5lzBC%fcvBv|>GPiEjmA%&#E zEYy>4VO(Ar{`S5nGjcNCQPwUT$LSl)PcNAG8&6z3v2{x}o_y8uR0i7MQ(@kUZ#i}1 z^IVByn7GNRpXLChq7_Ppsl(5(hKUz&|H$5xAAg@xhu$u%x~&78 z`g`PQ71FE}7j#1QEv%cu0uMHGlL)MrlE0 zxO`U4Nn!Da3>VT1h0JdiV)NjiFt{UXmtqrv8B&Kn z=Lsl{=w!bGCTlZ^fyb{%`S<-PAg|&ZsVb^@+msjuqE7s#sB7C{?a3_0=oIV9hgL3H4C;>P$F&2_fkDbee zrNE8fgLGbjvUp02%V_MS931=w`a$u=OG=lIWAe|L7T8eD$*H_#CWh&}#*+{BTGXSNGNFT8#Z;eF53s1u3Ihr%-f%6N@A zu9Jetdthzq&9lRYn#C6Ccm^vMB22bhxQyu6woOd2vU@Be2=;Bz4Q?Cyc^rUn1<@I9 z1A$_Cowj``W&gwzJ6o@oMJ&L3=hy}DDz_iU5b+m~D_e&&k8W6A1PBy7rjxhhw?vXx zac(~-{?yo)UcxQ554O_AYMHx`=MSffHpDk8mt0}01JmxXF?`g35DYKrfK>BTnS>CO z4RlFWG}4r45WZLp)t=H71Rgl^ZzvwSy6`RB`Q&_Gi>7a@gRIHnI-+6v4WyR>z1QmG zuE%Z`(Ba^O-vd++r12md;O^j!5-0%eEC9$S&b@4b?jVIp0|vrC8d=#gMpAIm6t81E z4usnoNM-Wd$#s^WMO%ms;#P(`-a`!OMUyT&pxon_RTA!OA2$E2%zt3935p9!idPP0 z11@_O&z|kZ2MQzR77E?t5dNH&Sd2Tiaa1F=T%8P{(FdoXibvWJ=Ze6UB<)R6Yb7yW@cq6i9v(_1`=XIzTo47 zi;e_vc-+q%k8?=4Qv!Eq2yli2F1+;-xXX7CE*vkz<>3FTs_uF0&dkm#3cvXG%P-oV z?&|95>guZM>S}NIS4ek~XUCgQ)V6R+antGp{Z9c3(s-COIGk_tY`@_2B5ycMfcY2> zcjJvF?F>9lgYjm72g9(S7utO(>TRs(eL_c9CrAa{`{L__ZNI}OpQXDl{9Zrab66cp zj2xBkJM@reeUs=!-whhkC8c0e@e#uvtq$RV+G?jV+`D$QJ}hjjn;u=EAf{mLgw+rO z$9qMm_lmeGco8ISyACvm%*R{X0pPrto)8RM{)4||TN=8Os=leUJsy_Bkn+E41j&J~ zwzkiKF8(n}oOtq&OJK#Sn1Nj7Yg# zrmq1YxbAMe$6e)NqD%9q3#0hD5g7IZ|CqrvKOXqd!uDn+i>_G)ChL(!?a-NjfV)pW zS+!tt+O(Q1VnR%61+aLolT{18uxO5xB>};CcVQf0V6yI9+{|PtFf>{4I8&>M$x`ii zEpCSkQ*#=ZpQ@>_KHS4%GM4j!=5%S5!xYI7>QJo(IQXR4!!?jkASgtU~ zyEmERaORyzNl5}^d;Blu_EZCI)VV<(6({s5%<-hpo6PZ-Cw;fZg>4%}K^?_eDWlE} z>L~$Xjzh;t1{qg1mDdWISY@k=OfNitEI_6m-+Cob~@lX$Uorzn0YRZS&X0`l{ zat0{)4*vN}GzpT|9+EKxW#^gAQ3jn9k|-CR7C*nGCcX)CSi}F~3brIso5a zib$<BLk{&aI~B2CpZp}+NjPJ;>{~ z;K^yAz&HinG=<&0oBt2LJQod&`&nEkQ@yt7$rf$)i`ZjpkZotPrSZG}ju#$hE^Q+=R{eBQ0hY z`H+5Xz`O@=R90}UG3<1@g?eo;1+_yw^IT<2B(4!Q^7<{udzb?<%kno%BLh1oOGBPy zH4AD*wjnE2=t3%DKoo$r8qVtT((K)}P5U&soy8Q{Wl|5@WZTdsbKoZ8UkmOh*+vGU zYC%JQ#{w6^odUo&NWQojBZHO^h8>p6dcQ5kq2DhcgXL(;C(vTamW1x96USRv;Fk>3 z6Zj`&nK1FH%pO}W2$1XI|;Drbp3bz7XtPJFf`#uAO%T*UT@1YvvolweySM+IdItig_jA6^efGuE^^h z%aq#`sWb~St+S1Nk%3mYhkp3QXu=He?hvml)U@i-245?+1U%FX=H`3m-pHE1UiRXo z-6l|(EvdXV^&6=;5>?=9%TbHKv1V|v(*MBz$b>DR4)DLeIB^FE)<<6?e*6;^z4_Dq zO6TLOk>(Sl`%$lrCa`vlXPnni`3p=)jrIqJr1pnhr_%o7VCBwl$kU;n9Iu~9RRTzb z`brMTLn;*VOHhT{!UaK1NL}xcnvlB8VJd~X5f#I@eB}Jb3nAQM?TTlp3lSY9OkaCR zlDNSZtdTX=hOU52aRq8abJ_KS9r`FElPc`uL{Jej57PMJ zw|fNwzIRbTmM-7lo6^&V{-lm@TrK8g+TWYv_>J9W=mj2KS<`uAES`D1`j~;?Hdef{R0weTwK&=1dI?4^UXP3z&q>q* zyZzzHc38f@Czil|O+*mF#06@q*pL$~QqT3(E{~`-5w5ln&q?Dv1wI~GFJmEMq};im zSc$qq45NE43G_N9J0sAPr&<)P{3I)=SuBy~%&=mWD<<64u0C{-GK9%QVPIT>M#lG8 zx4bC2&aoD4_D5VJYgOG!)de{H3%V3;m#+jQM!qrFeSz_l#G9h^}ewX=7`0wU9YU-OFQJtj(2ssXqEYPNeTt2Q<88Tc4 zfS33fo=9g-_22~X6HzByclY8i3{4v@SqI_p0z2lBsAmUTYjry;XRq)6zF5&sboD4g ze)*Z!rPKEZw#eXXQ|VBJxAz45ZoEZ@$c(&_UpjS93<^y`Ti6?7kkO+3EYZ8iw~y!V z0j>Xk4e?N^$S;^VkmV9njO&G}?h2KFMohT24qbID_Uw)KNG}S?XMNGVs0URq`A>>m z>=g5VK1(w>=+ESsm;^XT@r1anA;ZGUg$|;0b`-LIybPyE%}>;NPwYjwMmLN({Q?|Dob@X<>K-V9%Avhv*Uo8TMMR%6x{|!$+8otD8l= zWO;{{4s78sL08=%vlx5o_#AVTPQ_Dh&I-RPuSoJRVkEPy*}Z`u_YUMc++EQN!nuZY zY}Qdzb}m7kaiu5p=gb-P)XL!Ni<4Z47bWAB{r942{7_f8_*NviEz>ay@>UQXyl~Io))f(<`HL}nWy5@^t&%_?*-%ayPJ=qbKZpHhe02kHMk1CyR(Q@}FM_mOy4GzFJ*Q5I5 z)69X1O&hRieaR|};VA$dk>OZa0C%;}wbZP`>B=#B6^^&ym3yy@^4!q-L6~>JD|TSE z<-G(NDX{|;a~qy$`J2t{(1HQzRaN#>OWSMOG39>DI9~JW$XVTP>BXz$uqL$pWlW6h zb_-wG1lG>Bnhria=Hk<@a#Vq$-8?2oWikzXqR{yT63B>Y*#ciJG0dutbX2({`O8)l zeUH*MhlSi|_n1-HYuch)?9JDhb`B z{^b*0RK9yuFIop3I3rMZr*K?RB$u@V?ST*dlkTWx?!b2~5j9z33D+Q{ksomjW6o)- zvwKb96!Z$W+GtgWO5*>nTCQ;5`3xXbK@NNOWO>LcIdG<`LTA7@Y>&tt%rx7?B;n(& zNJm~VssD17Np3&&DCCAwqg0gOyw)IdFZSEQ5%##)UA1jo-=auJ!#+l6qZq1=P=N5@ zONb{?1_^t8b$D3VyD`r)EALF~otDWD7|Pxp^#Bb`#l~u-M6W0EoX}_-`5aA@{0K7Y z#d(Zou9J5@dYNUj@=mObTS%(>yY=K^uCL;+Z}c?(fE}@GUls5)Cp>0EIy2wH!&j2( zp-Za3-M8b#S(`=kLnju&w>A(y2~D!+PCv@nT(Hr{ru8b6K+%5h6$#M(eIuqT_zlar z2r;M-9o68iTq!#YaNeu2H_5m%ffH}$SsVnQH^YIhg`2S2n3yD)Ctqe86O+ys-5G@~ z|L;YZSH^Jg!AF)O@^#XztskT}g7*=$D2`AKc5Vz`0*@Ff9_D@Fo%nc9#i#QtH%0Fa zSosB;Q3*TB(lCN1Sf`>5PD^??Kr?|?P{|68qQ^MCp{rJ@;jF8=mjBpCA1^S&k&=sI zs$QxJd5OTw__rg4Sbp_pq^%j0U;N%v6t%XANf_D`$65F_d+wm*Dx{2Zps(19okVk0 zuAZv{yHsXb?f_Gp7NLfhRHHBpG`VSWdlXO-4s!3yESpLNHQ46VW*T=rwn3rdpC;n& zu7*F9u*C7GBZAo!U*bCU?0_V5u}+YA<|YQzG?k|VBW5^J$J{!6X_I+DUaInf%&ogC z@p&cOL|ARk#pHzjkbwoy%M@IK*H8q5x>Tqrq9lUn) z_V@CL#W04(ji14-9)~e8nTz0{ZDKMCoL(|UOj0~Bc_d|aimkR?m?Q3JZk1uWQFVr+ zxuqr8VK(i*aXF#x~B$VH4V z^quTo47k7Kd4KV`hAjlDxk>W)W=)f9y+*Nh)V@hdnGH{FLvQMb`G_uJi;&g&wApjy zE`j8MJAR9y8OoB#yle-GSHszK)n>@CeCGolnJ!zpRiTH-8YMnuKX2IA#l9u+|;Y$CbKIntE8Pm1;j}Zqa&iDBO9dmAsMD2olu8cH25Mf4zx*pQ-gF|v@mtg@a(`H7n!>@ z^;w*+%kQSJ6P36K8LD<+)Q~+9zZ?U|>Sisd1t2Ch(MT9LHV4eUyc1Q(v)DTlj2bNK zBSyh8b;Dj=v8@WeBQG30Vl3~$Ncx4D)|r*9bn4T%6(tZdOiY-*cuKYk`3$2w>-YMF z|Ln&o6J2S#{tPs1IjBunq%i5{4E}Oz@eO56=+Bu|vl|TuP1sEn6`dY1S8}clU9A2W zpy%t4qf{J&J~nU3V%;q&x~;pG4gJanXac+K{mE;$5h$zT@)?Y@;rM@X&UdU085&OF z7S*WN@Cjj~DF|gaimr?r2BV&$a#0Kiw)n{Op%ut1?Z+((53A(_7sW8-czfn7tt)df z15F@d4KXwTn*qUGHT9Km-=%IXFy@!!RA3=4kd?VE^^@nJbQlvVhy7rmeu$Npu={O@04^jC1Fh-OH`6=le2GoO)r zgF9IP_z<}+@UfH(ZOv#bOYRDt#U_BfeGd|%;lN5_LfG*Ay|^8|o26G{oVn3HZT40G zbwG;0Zo!W;Ib)|29bt+1$-iR*nM)p^| zxG<`l!MNLm8NK!CC2)4Wg}1`lJs6!#Nt4&E0elyrCcL{X&Ax{_y|Cev*P!Yy|23X| z*{Z`gdAw~GzDJx}x5Y`PGpo`&4979d5n!)#3QEfk^Vi^**97C>;>m@gk=9WSU0PxJ z{kWIV%fa7@0o4dzWyCPRF5VbcbZ~f^uex48zGCA zZa(!oln8;wevE9x#m2b7z54>3dcpn!4cnpkAXf0*StwkUJ8NZvJ4@~tUeFfrDF^n; zt*kCmjW!z@sm2+jgOO@O`*H9bDds@#>TBsIMXK@N*0``KR`od*sa8Aat*=L6hcv+$ zv)Zp~uMJF3fPPVRpOuhJNyqm{}}V=z~PoF4~XS{!WM%ug)#k1T^kGp_V^Y}ikX(B`496>LN{@OVa8s? zGY{an_xCD>?_ZYjO~(uNA0SnYiREQUq5Pp3d;S=2a6dcXAILz$Vq--)5?E&0)Xx}I z)?-PT<>Wi@7<`s+PbD5`FYTO?sZ~POVse1U_4>FTuvj^Z>C@MtD%HVeZg4N11FWnz z1(Hv;iF%hoz-sLvBP6ty&Y{2CuEPlr5Ul|W$1>%p9~nTax#;|sCEEC_Ufz^`}#1RWsB&FSXj!c6P*e{;(a zTPHW&>I$3O499i!*tGJj1X(#{`wngPUEG*;f8jm-YFb4Bng7r+m@=qnrv!YBUc;x! z?dXo$`-X5Zi+MSv9}Kna(?I#GiLUVdK@`cm^n;LjNdf<)XefR_gvmkg!gXpdiZ;Zw7a(WdT@B)^LD0t3F?1X+2W&_=(Sz=Xkmb*L$V^L2L0-T;{* z1{FP@?W^>34}!>RgBS6^VZ(M@7^QQACZ*X}Kek;aq&v9F`6vvS`t7Elx<&zX@a%+*gQZ zu(2)6#R$e#5*3s$4!}mlrHRf7%$EfpjyKp!yoE<=HG6LEd#v!FoKe;V3AmV8fhGj9 zq6zXrXZ}OH6zIgaDIAd+p65U4b4X^=alK>|@r6F}lt?E5Xn6BQYGJ9-2!gtBq^X5Q zau>yJXI{#ZhI=91h&1)mYS-2aW5Pz?FM(OylF6su7VDsF6O(u`V@%larBMv8O}nQg zLCR{gD<$ua0cq$d_%;dP#Aq7w)jhH{Crygx^8&g*5 z2*AEi6SL*Bw#m_BQmGijOcq^Fj3CX#1cnM4F03R`pB)>ARrFV5Q5S=adHtNYWlZpb zLbN((r2*B5BHi1qf?nE)*C(@D?gf$vuM@hhXt2XFUGGNxMt#yhpH7x{0mxHhjkgcK z`W~Y!Fmu==ELyWZhVb1n3@oMss+HBs995ha6>4=xDJ?owy-OP$l62W(Reib`X4Msn zJ9dkLg%Rh>H#>FHa=1jg+xu-%FdV~*d;lU!vY7J{b3Ji3U0xp zA*0|*UoY!|zbT`dBy*cJHyK)UC7U=0Cs&CHA899QJ%h6QGfHKw$fxh<)o6!N@E+8 z5_!_~CGt(TVDHfaDFr9G_9W!B+y!!ekjqHk0pBo!4oc;eRa4oOnqLrb&P_8NOp5n8 z!I|JB0u62fM~Xj@3muh3*Fo&!Uj7o0;W=zbJy#!5bXnjZ5ZAG|T!%7_(r0)Mn@qzh zUN_fO(-0Jo778xBZ5%Im+{ZK9a4@n_pEj#_VH0H-_Z*qH`)1G#glt)!YUe&Ro=SR1 z*cXqd;dbBMz}_0Ajtok#1A5tb8vxix9?59tZ@h1*9DGk7M891wolDDWHKEPiAT^i@ z!1^LCL&w#fQBmA9QL$AV01D^5rfZZ)Ld!q^#-Due!hw#J6VzA;6S8QEq7xZ4O6bEm zB*&L!W4ta}OqIP@yD{6S(d{`X@5rb~BMO}&b@!ZiEP->tWQQd#bX2e#(~S~EDRh21 zfr_q-@o30pp{8Bhv`W^`!BqelxP|Y&iBb_d=r&~IfrenddjeNT@L(rO0z~r|a#QC_ znXTf6Wbk2-FAbf6oq74hX(N|Y_o!|bOTrHOneY%o!)XYHt~F97d`N#e8IA;s8aQv4 zJM^*IzA;#?F{x>@Rjtpyv0WW}M+xd(xkj^~STr13wi$pj$z*py=0yilzR2AGPvY?g zaxfi5)EIrszla9~HiZsu-FN`AYM>-CF|fff-MXlT%FVb8@hloLzo5T^Q4N_G18Z=jzP)xdvy$JWoOsD=jolbTrnaU(9Qxj}=^-i&Dprg&w&WR5^qU@S&>2G2Yc zP#VJ5E^&g79$o_H%m(gPqC_Du6s9pZJnH#q{0#vt0?dk`AoJD7vl2og`8E(j!X-_G zkj&Qz?>dAGhKron*t`M$#v7xjXP&z`(xT;uS=oxt+V|Eelo%*p9N6+d^urSwhg;$z zUFM6tYu^}*keM4)TF3dN@KN@Q)P>W`5o*s=5Vblnjf*_L6pqJqT37$kslAGg4Hw>rPxO}iipq)MVzD4 zN<(=ksE#2czd(r86fwR1|UhoMHv0XG=NA_H#L zz8N=<2YL8G4KpK3=P!)oTu7e&~(-LXZRGmN3kb0T-iLpeG(CRUfj2KE`#Y8iKZM%N}qiD}o#38v%C;dP%nj97G5-!w%AU>3x` z6h&|gnxO}$(I17ED}Hb*ZaH)tVW6zrV~|<#HY^clk$>mZ?}CM_2YsJ;GkzyMUxi&b z)nUBSwU2`^DtzCo!oO(V;Bd=2>Zq(=Z`ttnmd7a_b=fd28{Wac0@qg&n-S4 ztY2hUosb>CxQE#;xy7P)*9%<3BrWQ&NS+z+VNrayNR9y)zW!E{gE8I8iFKjO4S{}FT#e(p8r}5=pM#Aa{W?u9iB)6#`CL`h%Zn5@h{srHPlT{RK9{}7!xh%@A<_vkRg#{f5j$0QV6 zS49NrDG5mlML6BUtSLz~)yjAgIS#k-U`K^s98eDA=~f;K_Usj&kcGpR<$8suWTC4Y zC9m)aS?IW;>=jNeV3@KG2aYbdmq@A#1`q`}zJQT)TwCa6lnb^yP_eCIwIGUcVgY;P zn#GV5u7kutEoJ9V~{mq7|FdG)(iD2n~KCT-jJPU!R zWFNSKOczeeYW&lIsW#FYvW`)%l*GW8m>keCv63jlQF&3@|Kz}Q+gZ0GK7q1i8x zk%hx&J7_rR8m1?Zmlsol>3JvnJ7YSPJcDBG+`%8RXnD_VzGweCe}hAfc5cRsARj0` zGhj;xB|Z+tVgY!i5chCNmP-PgL=TrBW8&<<7XD4FJ&3fBhqM#?H?Ac(!pk^*B7DUD zkW3av&Beg_StiQI-|7=ZKN?RIyd)DtYo9v_@}PwL-P?W0mw!4QaxA$+aJ#grf0VmZ z#c~{DsN@}U+2V$(VT+ixN)$)+A)y74%?jTynlQGnxaeF(E*TXPfv`^sht(Z`1 zn0Xgv5dN1y7P(>30wu!aBw=u=vXdI%)`Xa#1lTwnhWR6&MjV-fIry1)Vkf{1i3b8c zEfIe69sW$-__284u`^iRiy%yCFYNxs9Jby??@B|B;f`yCYFYk zlk#Bbh(E0Ugn5V^RtRpNmQ(7JZWcySEum46>{k)2%!jNP#t$z9xBWH$d*6#6LUd<}LXLNlnolJ0 zpbwV_9^VEx9^8~6&tIt80B(i`2BK}@QWTC}SwEL?P2_vnhs+LCi+)$=cRV=*L;m|C ziHw3&AQqXG%WCFMpGD4}3yVmIr&=^{C8^1Hcr|U;u0G;Dh)qTzQfqPNDYU4pBx2(Wds0pIdAB%$hv5*B#GhxR+v6cGUMm&@|p3!u8of+ zjq;S>h(cg79g1`YByvGTH*6k6BPwFe7%Ji?hh;(_K^Ee~RK~v;JFJ-qM3}{A3c|H8 z9Y_*GBw&%u5OSR=mrL#t^l3AHP`Hzn8(ZT16_*)f8FG$KkeQB@v;24YCU`P1D= zdt9(bM89+9Hs0g{373$A0=!hWgAKUQa}?bScW~3#{V}R#tCqV*4zo;N7Jmvr;ayu>(uu*%)#g8qK==DxGR5dHd(wQ0F`q;RFsJ8a5^gY2X4 zM^3e>_`I5OHRMM2psPa`QUe>h_~|w2jgT*<@h@^j$i3ZnPbf#2UqbaNtOI!diV1dC z6m-)vje=f+sg~#cExxlhBpi2ujcqvG!mX%`^Mt4;YpbSFz^j8tWixVPkk1#UTYf@b zI#S!=Sjz`#qo!XD9B(;ILno)F11DSdegG-KKc%}s_R2^&@I(t+{9*kFrdnBT;%abI zdRzjoiD_Ac0T2Vq8Fh@~nmql$`*6SfpahU=@KISFFm2SQkI7FscsMS5lMcQU^5?-( z!xaub9!lZDi+G?3vbSs3z09d2Vq z9lbFj5YzGl4iJ4y(nC`yS&k^e1M(-2!GW2!Ge3x^;hnVsE*vn5aI%frP-&rXs;z-r z#b2KfA5HM9&>B;Vk{m0!53+Hp9XYBTEA)6=tWTvD#NqcRs>cd3S`ECbNK*<|i84P= zB&a3{<|i#80y-;!{^qazt?EM`BGL*|8T19cqTJB2vRr{Y(yHY%Qp}O|eWqH}wsh#G zb=}t)M)@ei2)6Lz4l!xKx#O{8z{%s4NoP-(MUSxuNb(xY$e*r0;`w-4XMRe4@yw^g ztt=UDz%1!S->iDOEN5-v9j!0Kr54XAij*JyKzqD?NwDyYre(p5Jl09nEqRe7niymX zQ!)tFt*?>$FgH~u0@Z>njWoGSb~hw;$wxA(O70N!XtSzYZmzoJn#x;|I8>S)1v8Kg z*4JCS&{i64WEI*SDka@8mDf1F?hrnZkhU_WQ7VZ6$s^Ju-3WHWYQzrlwi6k=if4Fs zN2G~N)KXOT2qPz$H^~qgK%=S8MhqHW$e$vI2!FvJxt$yk{9jy1=);TH(p<613&V@B z9K0k8POLG^3>*8|5w@Y1j2i`$J$DFh{~+peen0ZTk0esriFb3Opiwu8@!5Z;q47a*gyw`z}glZUx?cS;I;}gi`(wQ z?Sb)f;N;>l+AfNgDYlx13#a5G7I>gn5{?63=YmLiClM>6DrMQ!*HI@{{96#L7W zY8`FSX1^~7L05*MM9SrE@&mLTp&xtD3G~njR9`82Slvrm$6mxP{O7X#_ z3;7q(IPq$VOzA80`qO(Zs%VrUY_=>{6-{svzWU+m$s71SnADLYNkfCW_&!n+{M@iL zgU+5iEA!nWvPvuXWWs?9x!E~}CLV0doAE`nz&is7J;5mAxCBxnItQ0BFGukkV$Wgl z9opb(u7~H!pxzjcSnqzDZ+<9-OH_pTt3QJA?{_j2MD?#KR_FvmJVcQj>LYfcJUGJ4U$f7rwTL>Yf)db$iXSZabrT zN!W19cNf76rhdweA~6ou{=!FMrW%RQ95itZW%e=#7&X~`)vPwyEt!qlI`U>(BpQCR zb;p8FQXwC**TWietdej=5Mde~$ivo1xKXX%cPu%=uikIwXX3luPvh6&U)u3w`2sZ| zL#7Ew3`a~Ta*>y1B66AYmbld%wxIW;=-PR^+$$qc4AjkQGb(>JbLa+n(Lonqki;r7RD=rxWOkry^B>QkJPY-t3H1BG{gUZ<(fZFU_>)MXjx?Yj9Kzu0 zDl^hUCl!8w{wid$!gf4Ph zL~@Pa=bay=tsr9Hex2;O(?8&e!7-@q;4dFQdPm!Hk+Y3dsyp|?gUL=va*&bBNZ9bY zkK=y*b0$y}hp3827i)t%xLQ`)y8!4{Q;Nr9ZLD}$RTrLE#GV6G%wdXk3h5w$!;4us zdP>L<{vJtE)%*887QMW8gk=^a$t=I_=GkT>?wr zFd>82Zy+lm_eoq^a6ts$s27d0=gvy;h>aB2&_$XUu8G>G6||vGG)oA_Fo&(kar#R- zk~s51!N7$CUw9Hqkh$%CTselRZjTD+VsZvwW5LzJ8w06qxOpZEQ*5AI5CblS%5+Z2 zv*c*N)S}KIGT_3!?+siDSg~q?U{Enu$VPfL_`bo8_Ei{wJs|fdd$qLgPB8-o`4t)oabV%J6FwnY+`zsH=f%QF&+sfm)f1OWqX2GCpA<5Sp@MY6V6StN7p>ax^bUG|K- zS`#_NJiBrCs63inwgxgUzZV00=Qz?esm;7Ko|!k-uC9n2sjq7$o0)5_fD9`~bL@ZZ zWvTh+vS-LYYcGFBLtT6MGaYI)sZ%o5+A9=OMOtqGdl`O-9n-b5?2b4G%X@&IjhUN3CRbN|#o-i?Bem1nQ& zKRyuS`@y>EaBPxpfZ^F<=d|;;OfS))#&?$()?ZjL7I`yrC@ zzTb)m(GGr)^}+P_{Q?j`8{Et&hf*3O-xmzDfBbW(fck0g0u8$>_#zG&o|u97vodZ9 z3jyx?6F!8~)wt!g55{+}!7_)95z2i+UN`8_ayRp6!am<<{OX#2{z2r6{cDh0g)&B< zdRHL9{dqC4wp$}3iV0^V4za_NmA5?94j0D2+iN=2O2x8WQDijb0JAyyWHWk;0eUG; z#&^8LF@YTGW}_t3tMm*or_KIJQVgHrR2hv*R)Jn0ccj4*I}}E)9_|wlAt_@9cePOw zHr)RYm?!mqKFN<^URm|%0&R9XSH!pudL~byT98cOj(U#tVF$W?+lq#@Ey|WF`fY36 zC<@zwzDNH7i@D8Cy)1xVO_L=!4j4oaohm_JEmVRf{lccCK9=dgRLiYddX&K&myf$0 zZsEFyY2f=b>O%0*7JM=fvU=6E%DQV5Hksq=DwUEUif}}#vceqSCMI`@N=YvW8;-Va zdl+%0b4>E|Z8FEbkRcuc9B=*bmH0L^-j278qJR^!peTm*YRPqAMiz{XJFaC5I4OTu za2+~us&$-t5#~5N*2)je(UE{~V78T>YQrE4v3_!+80NM7gv8e}dGa@mV(t)ls&&gF zh;NBk!s*uPL-O5+jC#iLMSW_=`nYE>91<@*@k(Hq>I`L;~~7^ykS%8OK<1 z)Vo5nj`+-uCo?F93%rivI5`@(yf#>p{>h5uQpMQ9ELJSs zH{}Cz72O?$9J7}r3bw!ucxXC94;99eF1qLIXV5trEg3P%ra9uV;w^Zx0zc+$CbpZJ zMx770L&&=k-PPujF87EtZ(IWB%(&bOj_8Sp<1zG`5puH|nE0{C`Snjc+%7W$1TY$Q zOv^QfC%r$qH{ppRrU}Sj!1{`|@0K%EhJZ9J&wM0)*T$ z0F$1Pt1!E}Ix-?0ce7>7#|*N&M=je`SDIgATh+?ejcP;NZkZ!$E88@o;{{c&_@r313yQOt1Nj+y*y_ ziY*GdD~fPR7OgW)%azK-Yzyx&R|~qL1W(91{rKB)h3WR&Vpr9K(=ERw3~E1Yf~nSn zUqRet#lx+#BDLEDN91P&a#ViXRW&!kwEWO-IWB%YCO^vGo8Y*r;Nv2zo={b5zifgT z*$BNax>+2-IdR}*>)#TNI?{Z$m1&OqFX>?GtHW@*m0qrq+|{4wCpm@3>;gqycM;DDn5=uCC3+h>#ImTD%m5- zl@ey)KCuABFJnU}Qr(ja_IwTNj*3#nt9nXS#X_nzyMQME3)EtGV!>5kR4rwh;?}2R z`+|iWimX>tVXBRBk!KTL$46wjVdBg9!iMQKzMgMY-D_-2eg?>+}Qgq$H4j0OY2a! zWtPqSH8%(hn<7JkDw9(g?p-U1R|DYHk2XD3NNgBurDGqz*Ji1^5e@1SRzM2 zx-FsO`aQ2r%YT8*5+&|8vO{4***lk$`@l|Xqi_m{mO7-9AF$XqDkvTtkUj(6bpo(B z!Ak5v>M>jRFQJRhwMHdV5?xvHOgQv#ZBX(QXt$;_*xVs}YUgS;LPCBpuB0NNFW4X9 zdEg%9QpWqea#3FOMSoE~Ognz`qQuaMU<4!`%}=$|1}|XPM)Y7+*Vv&Ka3N1f%6g?6 zb)o(BB8ZervWpL-Sw_B)dZv5hpnujlCME$M&Y(_;$sQr|r*EM2a-oBAJZ48Bd-K0y z2`8X*Aou@$i+)lrS^gVcU&9#t_MFNk`y8V8Q>Sp_|MSi<8jl_?`e|gJLsZ%DE!^zn zzrbq2OtjA-Gy@0o1q%bY=@gAkGY2yG-Wp`r!x{XC=`Du#PksuoAdKqHXb(J(-gopC zQHNYOfn>H^(o{0r=Ma&We-k+zWgW|j=MrwC{}#<>&pk|!v}kah-1H+KpnlWyl%RHC z%iWKmAolnzJ}d8Yh)>@7?O^uYKfgrGFP%Ncsw5qLXP}E8@7Uk>XGZ3X$C4xYq7@A< z=H!apDreFxbnm)mN7WS*4P#WUfXv~aqkmJ%SueOQ7#tPd=TLPxXIS!VfxS5K8eO>< zN~9mu_N055_YORfi#SA*FXLl#7r>U8+77@XwBJ>`?K1wzShSeHY|rvM=}H*u#cd%r&Y1t;{v!v^W$UxaIW@nYa7^ z&vsWln^-{Uhk>0o*PL{3YP^tHra0DjIB96(k$10Y*HbgJhNpgjk1+N$G(<^)g^fr^ zM-?1jemU<`G`@5LS_zAO^o({D47rTi1$^n993hCYm^ARZwGsnZh8mL>AXeC70CI8- zFDyB^S}3eLdcX5yqGQnsg?C3o;kf6VA448ptz?+NFz@I}p-}JWDi}iDurnE3t?E5T zL%y4ru@nqsj^O@_hc8ZUl{ztqlZ&-2AcKbj7(*S$|LinHH?L<@V^C#Wb-7$f24uoA zpe6L8XHY|u2T*jhWv`#av7k5WV)lyRs>fh*5?=YEz-HAv(@o5o2o1>>H|Pm9=mK;g zHvlZ(e?`5XG#KW$MROQj#XDEWMb%KLjh%10Jya*MY8B#al=@kN0%S<##j|DTpg-p@ ztTdF5+};$sJsW+-5|1p52rf%SK7}!x5Q=26$4|H>(bG?-&#>ePjHZ(Zk8#IP;U+n4 z@ZBt@vQBkKi9ZS=V^OV=ltUvpo8mG?Dw}ZX)}k6M?-ac3xczDUHbm zj-NR?)I~$yN0F=fxePr~7P%QaEy1)IfsFEc&PBfD*BK^Tu>6iHEJK zS){k6>wxlYuQ(AKgNTwo32>oxG+F1heV(l&>& zd8@GrbKA4Fm&=##1EG{(TLjZJZh&VbBzo62;RaY+;|2)0yE$eh_`Db1Da16@`P-8m zy83R6Ou~~l2M)K~{bb0adouQ&wV3W6{dv&4TGqV>2nm_(H)SBdbTGx!WK@0RNsqEP zP&}21>GoMUA-UrhM2o-)370f=LK1`Ur=P4jt%#}jvL~OBiiq3U+;u04T-@#IZZ-6_ zTg|M-iokN!t?H%H)N_Um|nx0geN?eK+DN;v;GP+dCC`P8~@H2i*FU;=#bm zB2v8c#z4Hd+}>+xR>K8}V;uVeR<0#GG&sH~8*TxE=SNqM zSeK4kWl=P2e=F{7Rx|GPRO4W%e$jAk!(BZt?4odmy}E1_MahvD1?bWizD6hig$$3H zma+*ZS^C_saT?@ZgrMOO-z2XMo-MEMkclBpj&Z$Y6m{3K9q9PUuWp>-_9@g@ze9^R(kVD@BxMI?_eco`wHEWcky zrJ@QagZJhH>YvgfAp_iKa&f?j4rG?i{!)6?Dd|WG3?kud`)w*hVAMY{6J50kBJuhl zEz)8V4eeiki^4CSlHFI!^{GtqzSDU1<^f(Z3G7tYutyu*!ma3lmi&>FmqM5nlbCru zE*7%>%SH6YoyG-41{Gf(+9oC)$bN>3@lu2yEYERy!7?4!)(z8jpzCR@nlwpuINtTU z@Qt@-2-7)%DdH@i8ocp<<2gUDQ6vHLMhL&JE`f8V0$~34S7Dsu=Sr=(4IU9ZrunI} z1kM=@+{`=r`&29#0V=a>N-YAiSW_&52q?RLAC97}kp+R7F^7#2IMM3+_~v}SiY`>i z+rsKXmAooUGIbpWz*jKPAN&H3golIosgBg&r#jlgE!Riir#db#Mg{IusVi2&`&6fD z?o&M`oB3e^{d6x1o`}6q^;ApfK9zUzirV?tt?Kk2rU@PMBqt0W&9HFM%b#5fUK%Jb=ar+1^s`>H0s+eG7aY zM|JnPiet+b6bAyx5X_}+YR45<*29WJ+>2#BEGK@*mSUSIMp@lEy4vX8-Rs@GvXtN= z0|oIml(eBV`3xVAP)cz~3x@Jg(uB{@(gd2&q(Di-BLM=0@-rO@I<4CD@n93` zA63ciO!iW><^HQ>@!DJpuX__~w%t&BKh%9bwg$fiRPBdqtI+yoEwI+#SX^5kG|O!l zEZ$P4r>Tv}ua+SWV_o7KTKLWTl^gjl#*<@H?vznv=s?1+hFf2n6lY1l{Ov3J-6c;i ztiW57nI&(eQ0@j=hlexeLTnyAUjcCKSZ5>wa!+1x?TAvjCb1QcJLE1&ZZPfkNxo4O zPwZ~v-~QoFxa1Fbwlz2@Tl0liH%tEkEnHU1f5Gw=QPM{G#>+DD?L|AEPYw3BiIYt= zl4*H8-6#(J-$uL16j|ss003(yUe+xBy!Z7E_fRQ9^riP*x|9x!?@qBqX$}FiXdS)IMwWH zYJCOA8m@_AX8f!TPa=)3eR2VkHzb{s<(UPBi`LVAq=4J-FZZJkE4g?*k)PI_VOP1# z>2;W8^i7ql=^*VS9ut)utB_VdRTnQJ0=VKn99vO2(0tXa(FTYSBq;(>d8cf9+EvP7 zv!*v>+lnMk$+AoK^znz*g-RD4Fdd*+RpUoT#>>2vcQlgOZhy&z65e)g`zhH%{)>x zvYTM_1+T>iM<+^?BSph#F;!C%awE7Lt*l*jO3%4ftaUjz0<77L6Ub-;k+OxZICUI*j>|0@?)Lq7pox zD7kad=lW$4$e(vJ(2D$^`JV5ielah!(r@glH_E;wr*zW)`t@Lhk-iSwV*Ge8`kKK~ z1IhH);t~Hrj?6;u7cr-l_Xso}ZKn^`Tu)qDAjQOFek4=?9wg*H%c08jUJdigA}}p9 zzvFRS)bQUmKA4Ast}2)5B}*PP3k-l;OfJ*UvL>CYMdW5l-kHraqO6vbVKg=(wMx>c z?HPF@B{|8>7&FYuF{Pjl`jhQBO20{`28_1w2c|538;@girHn&7?)fDT6Cp5Gzvefu zjx*L=W|%n{W_deoBQI6l?hmOA&n}pm)KxTW4$QQ`3br%1%Pg4n<>Ork3SPFToj5=b zN}4b-)3`6iB0MVR(l@ziH3Rt1FJT)A2@cJi9LNQ$pZqc=)XRldq6YRv{T6FJHX7xF&XqArS)S~0V9=nct20mn zha)t?vL`29=J!aE<`S}Dhh=OhtB%p>)xV#}K}mUIg5@z)$#RWJmKw%0N*R97vn}Yf zP(}dFQpAXj%LL72sjZ?+Sp7FI##b@t4I7^N59}5%4rV2aB+6^zx{<(b&^m(pFY}s^ zop-_Y49|so2Lnm*-O68}&~^>7paG3L?#{XJz{@|e97zSYXjnvfNK!IJW{MH%Q9(j~ z(Ujp%5%F{@WIK;UaJs3v#LNg=?{+1*PXOEu29Iriw#p)5=j%Ds|fL zp;MOavEb2^G2@?tI6CDpgI{yf)mgsvqX^La)qAlw7Ujua^r$h-pp_47qnsg02*uRc zHFK7c-(?3A{7BQqH=Wx2r>>W3h$P)tWgbzd^ucTZ!-y?R<>f zLEP`ST4vnwIKPZ~>NBuFU)yEGaU=%jE3L6w6GbGfvfU zCT~wnFo)hqCMq?s8#alDCx)rH4Dl%#PJ~x3gSYTIo?~QUvbj@^X-!i{WKT{;*}9%x z^rqNR+sS96Ph**y)(q}RD|&Qkv0ANyk)6rfmWLDTFf$w&#I{g6kdkoWET(08u@Bq{iD~i}j0P=B+71ApJ1RB<%Q%VK3N-VWVk7W8NeXNO zR!f?06L6tVS8M@VC6$DRi+D7^9+I4*Vh+E@X+GAlK@xn7p-mxi-kUguA{wU9&7Xv@ zge{z`VhCF~Es7m%<4-td(2uVMygoN?2VlVvPve6GyEp;CfnoZsjv=xWxdR4ndqh_v zhT_`575LLJe4ADoK1dD$-nbQ4+4Naru=>Q0up8YV`aYRw>soUEb;`97Tuqo?b^(fk zf!21Dez%vRcXlp=!xg4}p@>6eIfL}a?l|j$)$7oE5tOTO`1snOOXY3XgNL3MR3m4b z*&MUv^aJ1bxJn^MY54mp%QN$G+CgHpawl+sicj)4pv7atf_MxQv#d0s0u7PHM6zJa z7WlDN!aA%1j=O|eSOsjDSvi@sa`=1us72Kjpu4K4IP#DYl zv}^er&na0)V2Wn>^xHMBXD~}f)0#D1^mf90;(M<`v&aoPjKRsoHNT57x0JPWSSeUc za1{`RMuc!C@yNGuD3HYq-YC(%A`wxFww;Fu5--08(_rli@K9prZj9wJa`^CQg0O7G zrj0asEWzbM0uET<@dO`LxN~m7<{rZ*WhNp~D(O_iVLH9N2Q64=`rtGUX?+@c!{CJQ zZ28nZw#VQm;gl;n_N19-Q`f^ukq-S~4nvjUS_IrG99uM8CCVv5;nI*EPB(F7;qy@& z_m3?$J&0pOvR|BR!@bYrvjXBnM+>2J^ymTpD6nsO19{N&%D5S2$z@KcqsP?(1XYfc zgbyfqhg-b!*JtO*NIIb<2jLrPwM2ItGlIhk`vuYDE+~gyQ2s;m5(N(}n`Sy?AIHgv zg~>jFm-^cUKA;oNYp20&axfmub!xn9G01h%R(;$DL`aQ z9i9ToHhRaCTLf)W7~b>rSLAuzG9|dKnHx1GM&XU`T>&?Rl9CZ`AzmFl zaNF(6VIiS2>qllhg(&Sr$jmWCN9Se4WDDRKi^oGejwf)*u3Js=R4B<)n4}wD{QUY` zDZJ^iVDd^07vBze&ud^<zBr6K9T_4xdut)RN6zV?lrI{S- z+U(nazdVsV2B(!JK4c;#!A#J+YC{X1S`n8Sa6#f!s2^O19|8LXk>q_-`e<# z;S&Cz+QVZ1z6MXzU4vtYH8eWq8$@bjb?1h95kkf9J!&y0co*aXi{@SxM zvi4E#6$%nhF(b?9@&=EEpH14fSMHf)hwF_ISEys zVA1?o&r#qDchL+5TqO;YU3O$gU!+|0GohPGDud=!+e?$fc>S*=;*>a8bBj%ai`qlz zvyyqrrW!R&e-$M@6&d@eF`@IK!O18NqXLXF#nLW2hs(GD-Z*01UYZOi+FqK}`GqTq znqZDh6M4tcAeK3P+sYjdN(g*fWwVE0kz8^*RI-BT+*#zR?znKDB$6bt-SgknWviCL z$s_DY1buW59kiWk=Ij!l_3lXSiPB`H@+ac;nmh(i9xu})`i)dB0Eu=feV4KY!3FeM zMmKrT65)lMs5L=&5hu!=*!JZ5k!*6%${otoo~WgPSb`)9E|QCdN1P?_1Y)X)1bi-5 z8mT40HqH*s#7 zD~;3eo}LrOm+@>^Bwo^YeA#Q-@l6?+ADleCjE`%0HnK0cRr2D7K;{IejxXbLB0+@H z$CnjfgkO_$!U#J8i^rGoN`~zO&KzHM9hEJt10I#^@HErMg{1zgyN1@ZG%v2~ZE}a< zw<+{;Nc#m8{4BS!p|=2gQFVY^poT^+*w7+W&>a*^Ylf2P?@2tbioE&BV8DY-K@JqK zI1sM60<0d|gxDf4Xg!L*fwl|A6%F2W3%ocv$@c}~yB1%%lsrxZ_?n5g-5uk}F)3!b zI9TzT$-4H)Tw%h_U&-c_;llUc60CW>zrt_rtqK}`o1+NqxJd0w#Tju(4ONRYkWwNNyOT{%=d%##eNk z@jtoI720;!s$6dDK-=u-^0y}=uX{tow?9_*zWLh=Jmz|NJC`bylB7~{OmSJg1qXc<%^%5cY*OgXF68E znwNC7XnLrb<%v$*tsO2A_B@T_{V(&Kz8BL`h8f$MN#)t3*EhusPr>Z_k)fD6g;)0+W zMSaDPEC$F760HSje)_wpWz-AjCG$^^{ao(HXStD0;xf?<$Mg+L6Vfp?3(fdlyXuG{ z+4fo)c6ricvtGN$_|K`&F)zR?A6Ws3))`p+tErVVb?WHk^JOuk z4o^nsY5F4+nwqrp*))r4_73;$84cq5`$tFmhJ*OXkiu|eWS~oV6pjvbD^iY(40KB| zYt>Nl7`!hLbT#7ud}}YNYG6e8oG8|R2zvPd7M~qB1l!eEC-nJI)E$TwsUZWSoiN}( zMeV_$A06D?3p@On&>sx>6kma`GoXI?RR~x5gpr|M*cHS^2D)Ik62h#Myb>);GNSs$IJjIEQ*w_=b8VdP4@*U~`8O@7v$kr9^v2_wL@= zr!|>@sl=X zv6z?IIozuZ+T~;UKh12S$y8@8UKP9M*@v5f&v9@Nyk^@Eo3#OcL>StT6``I}5nq*- z>uPd(p-o%ps12xI3^ZT!L!75ikT|gVTNLAk zL+i@t<1;K2Hla;IE0qV^_ya5l4)G2B!IXw{fzt>sAQ|zN z#D?zHN8f={+G;h?cwX2?9~jqO`M|}5_{jSR{@>LoM|`)wZetbh)?{YXF&P;B%2(vo zV3wJ{pITI{xXhC3N4HB=p{BW1Pu3@u$W@nEBF|m@vfJIrtc;ER^!Dpq+e%RkeeoV^ z^ZgR!F=$KDGt&xE?k#$*_9C!)R>GP;*xn3l-g)Ute{V-5pIv7O7Y|@7KyL(YSD>Ba z;VV<;aoN3-e@iRe6(J|)%g{r#nSX>ni7N9q(SjRo965K&F$5Sxrs zlU@vCTMn1YYi2DYb)9Wm`0b9mo#KKk0uSTe6^i*?7W#B953fcp+S113p^ZW> z#T1)+lnyhLfGn(|M?F@m$ntsSnGCJq)t+6*x6gD2>xh{t13w{Rj;p!NAG)$7#%-<~ zR<$IqP5!GEM^LmEi$+ihIf4pKhFuc>`72xaYMnpB=RZ=@Y>t`}p3Tuc)dDY0ntajj z4YxD{?yjLVKAzaftGR*`Sol-^)`T}r;>zDtz~rKvn{ggX^SDcr_zhWV$Z)5W(aytf zTIr8=K32h~L!)mR=wF^J7~WL-gqcfuxN{>p*3*61CuPkU)3tG{z`})rhAE?*Ay6)8 z9@@=!PsQYh#ka47`3rTEMB}GLnwgk>gvQ=3%ak0}K4E4}r<7+Y{4?qpmTS^_;(?E@ zgiSh6d|6=ERhFe3&Lhv%u>XR9Js(*aw^*?j?Y%Z;eR;!mVe!K&BLfX=dL5g$T*^Cx zEo7SWZ_ovwe*>1axr+}+M4Hfs#rfx<6>O|34oy`iZKpuT(F8-{fBJM_B$E}4WbIhT zWvE1aM{r3_-xylIwc*sOwrVNe+|#F4 z#?8Rij`eKn;A)g&y*^ZAyDFAU6q?JCTsVtbl3X#9De47KrCpteX@3CBXItRKAXfPC zTR&XkN9E&IP}9oM0`#d+C;TEjE{eTc+!=Osd$qxu(zF=u!h#zk}IBYv)Oj!<%YSuiw|=51Y!TrQKfY&eU0e%lG3{ zZw`|5qlN-GllSdwsaUmvJS#BEi{G$Psa7&$(|*+r6lYWJoJ$VM@rqAre0kQZd%Xt^ zX-;q+9}K+YoX{s1RM7EDSq4-$JW+-txeh2RJUq?zgJI6lvL5l6WRW5yp)Ree*7^KuxCYBC^r!jTp`UsNj@893MM*(?%|H#0A z5+4~EP%4DWhC$xi*J96&wI`3kC-eoAZyv(7j9_;9WgFX@41{_kOo$xw8imd~#_M_N5V9bx=+WIwqOf(QU>{EgYzdoSxwe@kI zz}pC1s}Qh}fZ-FcmB54=?ShOF#ntw#635kcro}s9lE=p(M^+s_xt6a8^(COb|Hc6} z;lX6_GwRsf?>$5l=}Jx1UokuR1b3;gy)hU^4&I2@E5*B3`NEU%+|YUu{h@CV@SOkc ze1^lFR_NI0e{d~Gc&^Ii9eJH}Me;=xVoQH~-undaFP&a4*ir!s@A#~zUf1Gph)wY% zBXq)3|H0nSruCgj4gjT#f#sdWY{gX!nD-A6=aT;>^zv>o(Tz z5kWtQAF6u6m2o$E*8Q+JE^H=pN<*~ z91Nl3o#hGk2k?Xix>^S>)PcogygjYk7(L;1#w;=?m1UE7`sRLCust^H*fS>XDNilp zwLc;ta>eOf%Cy?&j6(k6PBzn(!e8U8V0s=NCF2<$8~5NNe~j7QDa(vG#FVmGc9xCf zH(ui&eDMRT0OsFSQx*>v-;V{nyIN`^ZyN469``iv!Ndv7^NwnHXraj&msPQ;Di`uL zu3g?#*|me;yG%1D#VpU6gQu^<+Re+d$-Tmxe6S)4%=( zyy>!3A9}qf>G(Hz$+vN1rU>gc;=*Za=kOlp!R?P|<|`(4#9(07yOPaaMXRa(AJ7;m z$=Zw4<}9XVmTTG;T>4<;l)awkm=h(Bp>BFDakW+90WFtWfL4)gs3HZkz}gF?yk`~- z$4d>Gd4}IMF$dm!kH#_X-6q}Cw1!-C?Af_g!N6O|9Qda%tpwP1w^VJp+~i+YdPQ`) z`e9vcHu7nS?vgucl>F$;@PlS!{7~eK;d&`t#2>^vz&tRHYnAjD%rfpws%Q%jS?Rx< z0p@39UHp@5aO*)H_m9)B(LUOi;xEIOXj4G)7dnMEf#)@EWDf|vzCkh3ViWC#ajc6ep+K|+Nr+0?J@^m@U~`vZ8u4-SSQoUxhc;v z*&aLzbn6?noI>BJKEoC6@eQwuO+dc$u1Z?<4=|FPUavWIzj z)0*CImpn$b|L!v@0Or3a*~oMwbMCNXXLk1EqEF$86#$E3EB(5S{`+pCU=(5ccX7E~ zgy6MQVBVCSg%3mQ)1qfga9n=$^W^}Gr)2r^8yvJjmt{P-?`O*aw%s0nj-8-qOh7k1 z{uF<_cI@ypo7;-7y{^tQxvG*vFyJSX;Bv>|86&@yJX>kVKs@=YAg2}a7wxR z4HniRlL5qln2mH-w?z| zU=1-&Su$e2xNjv@h#;D<{=HwCzV0iFl%81jnnl48%CtB(g^-9|b12knPW=X-2JJ1r zi1$$<5jZgM2^)e4iKrpMDK#MyFXt;wv`P^K6yha>D=(4vm26PjF{V|}B7SY*EY;9@ z93_)zZFtdjh@Ib@rap}E0Im2UUQ3BY;Aq7sYzSH;qJ|cy)Pz>NoZnO{B+wEcR?#&a zX}ViO%-%4F7nndTm~7#!7H3;s=+7x-JX{q`)1@3`+nicXTQyGi@<9@Y__yCJ(}<^N ziwlXbQ`Cp|OyYPR?b3hy)m8ZUlve}}dtLb(VhvOw%^EnRCTplm{JYfZ3nPg-Q-TX+ z(sZp$1b1OGIQab^yKN>-x64FCk>jsQwP^bv7W70l3;+9qV&Oy2P|P>*g~Wud8TfOl zY6}*MCIW9i&n591(mV+ct$A`vP0jPUq@86&1w7IExdSgvdnd}i9ICr&qjw6Y`E85B zRQ!3bY_GiBwxw~d`U<(@h|<6o5)O$ zi>a~nIm#@8W+F8*XoyWvl{A~+lzMEUM)_Y;s?P{Q*W9P+_V%+eg$ToX4dU{dkU^|C zid71CA(iwIk>M@KQ-+$&BEqI2#zEE7jDu6om2pIBv5)jAg6Jodw*&X;^JTulypf|1 zX43HJ9jjtqTjgIeW!Rhue1Y+ElF$p~^|P8aEHu4%F3uXN%YQR6l0h?p>UkT2J5@x( zom1+;y}Ib5q%IL8*wJ-ahq-oshV3?rc#3BlUUl0l+*L1wn8Ak8uFj{b!!88(mDlTV zpSSFWSh%Z~{7&Q~gN}Fg%nbpYs-gkTDRlu}UG{#`m5k+Q)&V&M#x{PRS^)ydFgOHI1S4_x~lw8t6VmL z%ORn!a&Go7yitK=D1^%J)$?dd{*bClS-(PFGH`&ZA^^y1KKm=gkO|=n97pQp|^KA#o29f=1`_oh7;m z93KB!Ltr35G#EIgCK!CteyNHr)UAw1ixoe>%;GVH4lS4L>`%kz-VoCh3WSuSiRr|g zH2lu7nA8%krHRlMEv2e&`D1TU;eLu@3fy1$W382*Gr86iUlF*uoHO1HF*j0#W^SBP zlewLGD0LRzP$La@|Zg67Wck^4iuCi+;D7%D=dPIu`xznMAnb zZ5nzzLhp}uVv6_)a*%=RJtkE{luyEG%IB1tlpiDH5vr^R!p?)Sh`+y=+`fM}P@y9g zz?REf?~iqiYroT5ja9sax?@j5?VuxQ))u1ioh>=Cz`1U0=con zG5Q~28T`yV4fpr0s?d}~ag|xr+n+swLMkveee7K*wcogEDzt<0h@gR4S=fd^N)^x` z<&=6Ltt|FKYIQ}YsJz#3d!?DNonre`CQtu7dzx9PVcShZYs;z%`zI@M!F}0%b^$*R z-r?A#Vj3>^oeJ%}A}?Pe&F>zSJX&T|58yrT#*RVu-c1+22cv#Jv2fn<_i6^#ATh7S zVrAea*`SgdV#K5*&4@XrCL?Z8MO^|;1ks=I?xEZwxE#atRBimfblqzPUpt|jP}9!$ zX(q(^`s{y>$z|Zshf*{IG7?IIj8kfYEF_>s6%;|JT0vD=ixHc%jeNWOFe5d9ho&(n z4ewvEt=D+04}^?o;Ks8u9$%0zBV!qsW;{Nxh8Pc3R5Knk82;pvy4PyC^OM6o4e{rBGiw3>Q8l3IB)pR z;!L4zdH;_2WzY~Wo24PZlGqxsoKg?4WhH(q=|luEHr=SF-cN9*;m#ketmH=R=}rTl zq#N6;KuF-#n~g<`=dG12xx4cm%k-GP~9;J{W)-w;$uU=3AH zsR`AJ;*OIlM5wC#8vNS2>cj4p#3%l|Hr1ygO({jFqWE-U)K0=`YUh-*Q+pa7P^%`| zk^GjI9|b+aJkPXp=%X~%e~j_Kf2NmHQ~8s`L4?W}>)f?k zGz504oCZ6moE7X9Dv>>wRK13AnPSXTe>Kt~kmt4fEe$f;m)UTAxi^_F>&7p2B!_ zo2Vv4iP(rx*)XcHYKV1EH8tztl(VvqYBkyM5#2=a{D2tqNW-7k(aqze( zvhiKI$m64Rs@iaB`NtHrHiTZtw5f`DT|a}5R@GIYbb=)nZ(E^(5BYOQ#t&GA1&!;$Vi3| zRMFH8!HI;`aN?BuaEc217E*!;;w>rf?n%RiPcE-zQIUI~({(Q(j^By^`Qx86O+P_G z014;Y7Rd8fdM*M7B9f*d>La#1>W_%{{7<6giQp@}{9#dP=(=ZREkIOaQSa*R zeJG>~&YS-drS{v4U#m)mzJT(G5CW`HzJ`EE70^KBl=?udB=%Rd>Wbrj{Emfgf%2#R zV)O0>p`3D?cl8;3X!CCJrGKSiQn{#4e+m}Tp&=-c$QlZqQWFZ5<-L-$A%b}0 z%*34AFS*G3KZ=Iw>@f;V>`MB^7vfygqMhQIDd?ocTj9&PH|s8xj$%Q!Rar?Jlz z1IC4>H&9gRLNEDi1lez;OPAy%a+ZNx%hH)O#FD70nk8{cO_sFuy3CP=MG#hjGY#G$ z`Y*!|t*%bIQO0E}ys|0FtO0 zfSghjfaPVqnlvDS=mxOacJ!p_ikq_TR-UNFj=AeLRJ>@2k&gKkJ`I|o#`z#U6M-vU zd)^RTlR%oTIi)6DYvTR0D!x#!IB*j$m@@Lr@zU_vjTJnj;pG09zN$;~{hw8|9-S|* zzg;u_vgIry8yPqRWz#kU4iZ#@gHvjPqpYY0sQMyk(9m5xX_$XgOs6FJFu4h&-Eggr z)PCcrcpYBy?v=1u_LD#^3$br2$D!&Mfv^4>1=XPg6!W{Zh4Y_5LeQ9MDe|3^MFbV# z%91t&YZ70>np5h)y0X-l{w-R)2m;M9Iskf0nl7U&zsFkDrJvmmkze2OK<8y(6}vFKGCjNqi3p0Y2r*DN!;JI5_2!HUt?GQ$vPRYC@)*q^rJ& zwkd*uMZchv@mr13@V2=MBMQO4OxByKId(&X>K~v~L63GK@y5SHG5sb~xwIEjVi7c; z%81txxJYCTE>5Wjt}^o8u2wJ>v<%)rZ+UozdK!K(TQ6{0_Iknlz?Zc4bt19#%hkct zO8f`pAVUQJwM-2Gkwn)(Y~>cOn6#Ov-vixok@r=izQ z*RS~3nxx_5JE~(?nM1umHvfGH$j>1m0%YYvw^JSwG&C#cYY3!N0S!`4sRz=^V*gsL zuE13{0s-u(!&n-QURfQ~3fb#L^r5>#h%VfXW*F``E0p+B${>OUXN61+!IDJRu;i3_ zu&f~SqE=C{_9fqNI1p^()1|7zxzI_}p(U>qiI)GPK@d~KC%=X%MBqA)N!1V~lW>}n zIi)5g#|YU?l@%dYt8{8fRl5!;HMDX2Oyb%zs50NKHA$$1XEi}+G!RYH5S5Z>no2pP zew9*17O18ohz>{IIdm)yolh?p&oG3}e^5sh=(8?myd-9-`o%)XMYHegTDP*0_yH0E z^_MGWmXe9UK`58BAyAN*8WfyT6BOknef~Gl^h6L&>&TaD*Bv$T9&?T|!<%AG!LU-J zQx0>d?0hy2CpT7jDb&LXF*PmR$x_W>@GuH3SAU{=i$3!YSSP?v7&=5tF zNSdNKr6xt|^1VZ?fM{sAvbQBoxBW+s0u-I2da{69ob2douX?Q=vNZ%<5?@1?Q))uD7OD4>enb$MN17kU za}VCxmp89xS=TA}+DK%Noxu{i<^e=+wE|f(T8gI>gs;)H^%2U-aLLK?d-$py}dxbNJ z_J7t4L-d1T(Y}t^WZ+nrN!bwiNJtGnPN@mLGJ;-16&FFYcf1mF%67e7wmn@c?sc;G z<ITKN#baV7b$~=J=eXkF?vG9llZu9Q_)12Ar>OkWhWY&h8PJ|PcsruIhRJF)nfY(mTV#W z`S-QI`;oIZ5n@%ljqH7>qK#bi?^vgLyAxf84`LBA)MX?(pN3coRZz1MPC1uWqE{nF zDixu=j-)SdxNaJLdJcLLVpY4D%sgDtO!|Jf6f@CfSi~Y^sLM=rJ`FJws-R{joN_MB zM6bqsNTnjkL4_DPF3FJ-S(kkBM;d4<@0;n72pkLbaYIy0;%F-7l$unmO82rKW4%O> zqxH$Wk)wOo(s196H4M&`^!1L#{{_oe=CBFlCn%8Li3(ZOBA&%8GHCi%Q#C~GB%G#p zPN_%js*vxX%8C%O+ZuN%gnR;#T?)575~okj{3?1Tf~HCSydgRyfixX*NPGltmhoVyQ zh9E=YYRGU(O~_P|cAWGeLdeXOEe}<9FNAD8vU}m?pK1CQeTP!QR!SfO*K#ybLv%}` zX}aZQ^@XRMJ{gsALrLz7J^UAo(Ug4 zk@)E2amtqL2kEH@nto-9hNzT;(p1VR^{7+|_;s}k(%{`WE0bcD=gg&H?)xjse?O@0 zf77y6HS^H+!FT;SWaexCL(_culKvKR%D_P=pSU4-kf<6SoKh1W__vVUh*f52 zFUI_L#-oYp|I`{&*>aXqIuSTVWz#kU9}-lv-du2w75lCUA|ot#X=#AlaB z4_OpIhVgj#v&+kOiV{1)xhsYOm zrsH}5`<_B$$s4W*&GZ}AZB!Mo?@2Tl5!O#-rVLB)x>gVYT90JxlH~z>^e(JN*6@rY zu6aE)^Y}z*5>`8>@DZxWHLqvTdfV+7&*W{FW#J;O0DOu@4@qnv(CRWPI|~~)7l&nL zW?@qhIRaafBs?ZN0z*8Kw=>gl=!*NW>gzVD^5!wI3<6|j!(YM3nHk$MOsBo**hS`e zCUfc2x%3jOVAbna0X+AtpvL+}&1Ck!12duDzM0g>vgfx^JE}43bHLDkpQg>if;lMT-m7D{5KaekQOi`t4g*DC^?WQ40zs zc@9|0O;jCWDLfKqDIvk1z+5sY7LhfL{C;5-9ZRta>xt*ARfOsmwT#D}4J_laXIlVZ z-A1>RwR2nlKXZQ`-&FDakK-pzn>Ni2bRogFYZVbet$>QV)&-Tl?6}c}_7-B>BqV78 z*RlyH`;H+ARVJ|6N1lbLho zoaZ@nX1R0cPT{??s(<}Y z?RXd-GycgCR;`ZtcPNY^RPSyM@181l zBC!1j0;UC|%{kpdCLui4;BOvSKAf82==s)C*$1G2q|t zwe<1-CkK!)n`#Ek%EYRG;oqTv39Gi$S~EVv$p3+G7|mu#IH*jda0mmv3pI>?()!pR zOYi0`)c=?1+>7)f8XoZw21#N?sTvf+_UaA!mXL+(Dh3k9f^Qv+m;>N!Obxo$mLhvTj(+w7i!l(ywTs}Pj z#)0Q#Eb{nVIr**gTsb4Wns}<0M-xrgtcj1N@XBWX;2@vg zG`*eMlM6{fBGik5&kcobJh^Uv?YwMsNNzEadtFo*d^k2=AmkC%1#wqw*PBeWAa?ov zu0eMN!RRBxWBkJn~gS0Pp(l_S-mRID-fvTqIZbJh2 z>lGpVUyeg>sjU&(>4U<6Lgyc`12&#Rr#Pd%ZfJxfQ19>9t14=**RiPZKDSH zB<|)-b*fy=RZ#m}989jw%#KBcor<_GOK_s<#B*1z@~$^j6}psr7qENld5ePg@SDrG z;`n`J3h6|K9?Wo_rkm$wNmw{FRXjCOCw>zh}50`ir$?u0;IbGt)+(nrHocl zQHnCW*S)vebORrM8N2mdQK1(191%^^^};@SZm!Ns^N12QM~w(Z8P0xgj67-iy)fq7 zQi4Hxu-)_!RO`S1@h0$9*P60VGLd922uR0G_(nHbQgrlua{4=V=$uE^9B7h zF9y>knHdFk^263i>0Jl7d_LVDS}L7-RV|rJGx7H*Oeui^caBb!jK$8u`Zh{_+TWZ^ z$xE;lu?GkF=rW*tAjw8{e(&B0!^%=*gM~i2n>8of$X-k-ST{V7Y$NUIF3lAmHT?Ev zr7pWvrFLI{nx6Q>Lf`(IqogO3G`iMlqomS>C2Mq%IJmK-u(*+}&K+3k7$w=^%+(j!xIf*FZjp77tu88Vq-+uWhNNLCZh?wb7bz8-IW8)0L1(<`;yS5l zMdc#eHupY$pbJxRBUDVdSgGL5XBR6gZp0AqSKUfLnjDOI)=M(X?0R@9c75< zO_GMGXa*I3iVDtLd8v&D+-4YXAHFoI3Z75#A61Ij`L7!m;2IxOiihai7(4`ha;Y&z zd>g|LVDHASO`@Z;VTjmBJNBWuSL zji{C4{4&OhzLqK3W#}~tVCXI|vL%Js?_;=Q_K>1*5?72o4Z^zgpsO#HOTFFmYgo9Q zEiAvxuyA|G!kuj4k;`mkFK9`-ICn)O8zoFg(P*nk{6SKH{4qxPV!W8NQ~Bb-M&gUn z_yJ$6Xe7R<6i)F)^Ba|G*d%tVPfB(vQGY-J+}ikZ8?mVT%SBX~aDJ&g)m|*^Dk<=> zSa$IUDV-!Ks6VNSBc&*u#1+rsVqbpWOjocU(E{b(hu%=BsVb26u$yOHZn$|*$j$rM zu^TV9ksZ(4zi~FUF@ji$A`Pv$?gWiD55D3V-dF)=s)vsW}kixH3hf zN3O6D>l=q3Xsea@0euNgL|?X4k+%9-r2Zx;q$}O%4hy7ok))s=iE#`}(dgDDGON5H zv~ZqfF+8hyn((Y*`8Y+RY-yJ-BsI-+>`KvSb`zsjhMBp0M``QON>=t5Dn*QYVfE$? z5{-z(Oui{3ctk7uir->|0QZ*_Uu1_R2 z&2)51)u=ecJ%x>`)jMbJR8)$*m)@-5rfDp3en`W#*w5C-6WNP`G(8r38$UF)k+oN< zMx_!m(_;lGV$HuLUgaGUk{RE;ukQ879**70eoMn$NN!MBe< z(j`Uhcho}Xb*^1oBvkFGl!}PIBsKbekmzN$a$7T_jb4t$q(u$a3F{_F?ZF_;j>Wc2 zy{n96>QbSVOA3Ugv25R6%(OmLqtAtC2n5qBv5qsT8U?{rn-!UApdorowa{0RhS@NW zZJ2kJVZ%HQV{WN8xTU_o%4jL^^&6_C>{m-mrHjxTBn3!msf?@9QrsV&7wULP!L>;B zhrrd+ALcT9Y^d1|u^=iYQ_rxGKeZbA5U4xZM|GWLJoP0eP zpbxpU3zyPzW}beHjS>tqb%*DwWEs%W7cV$XFjp zH?VGu)v&?f%)HgiL9>asp`L&$=XfdmjyECR;<8F9`<}PCc5+$TZL03}*ut;lsll~) zfXtS%%GlFi$J6~N<7cH01zNeJu$Ab+tdNagCVw@%^ zn6@aU$`DgCA-0kfOxqMwYIAf9sOu`kY)QfNqhh)*#8e{0(UO8`r(zleCbINtpi!kz zUw_;1yyMvh8ZB&YBgfbV8trIqIDU_EeA3hg8l|+5z&<6_NvcE1Uge$EEif6+ZlF== zZE6JiE!MH7fkp#c*eI!@fktmY3WlPqr1rIvLdx7Ye&+hIg^hSFOKyo^V)O43whoel z{WoRVz076V-aw;rp{6emSr+5aXh2KDpo3yiqC=wvEybWMQmax@$UdYD+78(aV4o0= zNeZST3P93zfN60!G|CXgGbA<5bll?5=$`8g0LQpnQPSNGjf$@m0KJ4eTT;mWO97a# zWOs0AR4UXHlA2~Z1~@eOAtd`Bk^PKAqx#p2?4`n8E-7T6QL^v8o^e0t(1?~Ohdn5% zX{O_Chek!$8@Qj1<1svGnM0%34cX@jcbcS-JtB?=>upN*XAX_Bg}Pf((@e*Hheq{o zFl3Jv*+(53-F1WD9w^);l0x=4B|CTnqU?-Aqr(zqlj0mroEpu$0ZTroM&E;@wowS1 z#q^G{d%vV%1Lo8?ENSemY=r%dsf;nBm4SI`91lsD!d~Dl=0Ga}exZm;lN7+GDd2Nk z8Nf4cSKZ@91$=8O8zo)q)JVHgEV%PVS?WC`VtPvoaf?+y@!u%@WX_FfNDk9c!Zt-x zu)i3`qtX`Us%2NO}1dMHxC&%O}C(HHM|WJWB-4K1q;K^Zj;?E#m~E4>DUaOVcGs|yyOdX z56xf^AV$XSV!U?DFaPR8Nc z|BX8s2bY}Yl0U#W{!UDvg~rOM#Dewx&37`dQ8AZis(Hk#6Kk!CcItf5MnZjB$&gPO28Dw`hKory-lv}3A%G!1$gC5*&<-o$2E*! zXVEI+X-OMpyvk*@wNXk=p|6{(Z-7v?*h2PphC|jVhtx%RcTcYFFBs(Z^ko>8qJGut z8Zb6<8)URoFjQ^@av>O-S?x9L4Hzm0cv{rnM$VFZFyzo*7QFu5)gHqV z9p{XzgN>X?_u?fLo#Mgls}43Ir%x3Pj$gRcLU(pVST#)iL_xe+QhSg_#bYpD)R84V z$C>m_s9%QqL7EYd*WxofG5rP3T#yNkty$x27C$Nz;yDBoS11*!lA?9DSvUmhbvEL} zAf|;e{h*k}FjJF;8hs$da!DcSkj0VNP@|KbZIsljp+@d582Z3n(pvTYql)9ZF2d2H ztBtIP%?e>yr&gEWb_Havnsi^as@=Lt)s@|(YNjwq)#lw%H319ix#h~*1(E{euNGcZ z&+2Yd>*$Mmz-+Al4Yzj@_k(*>|rBb_FvG`rj|+>!qi?;Fw2Vmg`NxmA`MaQ zFfI}KWls@#YcCPmLzwzV8YXgnFNn0}G}LIkSX&mKFtedXkAJ3294;v;O^PAKTTz|Y z;2C>1FP`g??pJO;ZQ;kbA9{&*OQd{nEb+5hx#WL~c{6bBOR zLF$Xy<|ao_n(U%u~EY&BD1xm_8ck#vGt>X#_yXGgj8Qr zC@u;LQ36+b4uhv#KL?@bUx@mJf?RnI&WVQ)wM6!O2 zmq2aRE9*I?XueV_UtS1SitJYFs_9UN78WR}c3%#?VZz?;|Mj+!J&zWewx6_6``)%_ z3iyCXVNoD>w;nqAk|7$d{Gytslsuvj_@L%9b&?mhUdRwhPpq#YaWzX^99<%NTWyY& zNcFf4)x{JO?KB}^cK0^itny^fr(Gt@W*=nP$eG#JO!k3vfO(zSHnQtD7)QHJh@{Th zJpX_Pp>)KAaM=T{V31ClutC<%C9mjDnGlB~kj*Qg(`>_X7bXQ9MK~<&y36FaDOsZf zAaF)p zj$bJ&!us^E7_?E>9HWhf#lY>90GG9sYMmv8&QURBJ=##C=IvBB850vNidBrX*FBUi zYByBWP`{Sd*UvT7ujMyo2$6Mspy=;hEO^>s!4sq}V{oSLE**^me8WZV7)gO|T?{vG z5KPv_=V??fKr3Prx}B%dJHoq6Qq*~b6f3n?HhryFj| zr_mYVvVEhhQUa1bJWr$H;Ig8#R7yj>W_JA6P^0xAa9{sRYFWf5s69u$lS+LIIwDUm za%hdu7PTPyR;j*L(y%iR|Az(kLyy_`Y!PS1Ky2+&TT+Hdna52usC* z%3IR){^=3t#3DJ+%nv4|B6YQ-rkS`v%ar0HGGT+~ihLWT^q0(o`8G=SlgWg~BBI!c z;;(FmL)}e7Z(K#NzF9fPG*f0ld2!2gYgz|0v0i?;J35~|er_wcTd4`XL`45AX}ArT z&sP{WAoE9c8*CA6XyYk%6}WQ=lTj3wyS?55rkkRP2r@Y)D)}a+o1@ZOv|@(Xs0`P& zWQMq?46Uwb21{gy?rwn?ADyl+CPZftkk;rNf-*5WhrqN&=fD(?w$LK8+*jar8G7vJ zU=c<2BD3JobAdiknChRCsYOfWnWV^EclrIUL5w&#GQ&OnTpp&UM5fGM++7AY+P*qITGwR8)&qlnSJ$A+&zwyEO!9pW%Zd^oRcu}Rx$}bT zlqka?SOtG2C362f`=C4;0U;S6tGRN?i+qq1M>9>4*>j5u3kQ+aTrzPcv);J1bbnYaRX}wAh$z+aT&#k^p5~T19E=;7@*Al5-4pUc|kf}wQ z%aha3i}hScl1B+i6$(9Bj&BzuLJD_9)AWGezexAw=vjf_paRv%=V;(7&#GPM^7-7J zzICgNW@dl;{Y1TU@bygufUbf9?*Kjbt^&6!(8U#W^Jg`=dX6_&S6@PLH;m$-j^13o zX?mN$L%RALN8EBwZnr1bo#P7XxiTl3Oy{iT4s_7{ec4mzk`7~gx;#P53YkyF{1ARWRsr zJ*!yv2i#symU<24E@u0xORmX6uTG27ZK|Pmdvg4`E1+k&J$S`a6LVgHcK{K3QL17o zz@?&GP`d>={q&stEWOYd9F%1Qa}5>$PK-o#-K3n|B?39F0++vTJ;EKxauxXc@khIT zRHsdKpCiECfvkW}zVxmmf1d)ECm)v7k>3@_al8Koe;>c@sxQ1LGz9#EdD=cWQIjUrZe2eSHj3!$nmc5}D}f_~jqm=y@R{6U%dFtfP% zuj@ln*zA|8dvd(FZcksLcZb%c4}{I3;kHD?&S-MIIYot-ed~rNO6SC!Rn?~hM4QJZ zQYucDxO3dW+PYW>gYL<#)gyHfdSx?qo9=I#?r|3svrmcMe&bvYl)hL;H-t}ruw6yU zS=dt5R7dlN)kSd~Y>(cG#(?zy1^nPS0M|e$zu|{8|F8JnfldXvyjfy0q04=Un-bLh zucY>oBF)|fUQgc|%cTM=mkJ;N%cTMg^bsp_;LG^Qo$VYQFiJ}oy9$bQX?0(L%k9ak z9+#>8i@ZTS_v})Mh`Y||QWusa{|Z=iD|tPrCUp53n$J~UEtjiL=SD88(B;o3Y7}if z9mse4vVz`x^$mTvyjlVI{9fGXZOo@UmmvVcg;W~|Yk|T|sw%713qMihcndMM@#o2k zDCRQx9P7`s#i`25cUi{Hx5-pps8Oy$SaM-LG~6l-vVsa@sMTxu0@{-^YQ|EP^~%)kkA}ak6#aX3yS&Rq`D>qU7H;nk=-50%JHjbySmTA=&^cMzCI|+ z9mrDqxo0ukTov|lgu7VBAImY(H=dTv_C2XrE;4YxB_mjyT$+F1p9vCgY1rAYO>dVGWE z=IHXUpu$qG&bGJ%S-I}M>dCw=w!8i%f4G5&c%vcF2_uiCRnIp3Xi;l()-zgva2)2Y zh;DWVvij)*(KL0mF*0|(K5lBQuJ?)XNbC+|1zmmWsw7_@)ZQHk@{3xNDYby8?9C_( z9fK9G!@_utXOPs#)Tj{Aa`wM0X1M`)#U3`~2u&94)yABN0zLYGd-*XR16I9U`ZlK7 z+$gv``hZLqc9{TL9AD2z&32!2`$xt5S!)Vas5(JJSZt@_Vl&+yUr`Vb3t0W1)g@Dz zsFoiQg?aP=t?}fbY}Bdgxfj3U!m}Vtsd8*YHH=x<7__%2SRJ(xm5fv&_bJND!%ZH2 zyG7ZXsUf$>!+$ppeyA?dAaGBMh%xM8AkXb_%X49Ej|1|MhS`?a3TL|p%L`dQRK16M z_=ZQ-Uri%pbF{%!wMiQO#&PrTL~2|hZ%vWOFR1p`)EuE_vP0aSfbI{k?t(SQKD%2lr22PXZ3S=atm}n zm5925UZvi6*=(r26KbC=v{8!D$ai9ka7Uqyl09U)6EG+lJ9DNxd224ZxuTxCdzF6C zJH}UCe<&&jVRz~oPZ)qf0IH~fFgEu9jsBfT#!b~VU>9r9K zqGe(y`7WQ05}^HMzvA8~DUdwMNM7{e%!|E^M!yNItw;t>&jwA~XhaQK;s4qY`gA>? zN~HD~NljG_$pO9%KEuyBKv|PQD75Y_0Dh-qAgUlxVZDcQSdvx+6d?q0~pr7v7 zsXyk+{m2&v`qEH7Husp{Mr`m35qq78g~6jt)hteEH!_(rgx*0?@C`OO9v+!YAN%>B zL4*!c)o>j7R4J9e8c@TANhTQayWeokB(?Kyy}OM@X&qJAOg1_Cw$bRu0OH2iMx$&Y z%r!Y)ZllptAVlmcRX{x6T%9UK|L`Yj;8?&o$^te@!7C!71*U?biF6DFxq6SCQvu1cT#DkzvsSWszMy-M(QOKQxg#7u(40p?8=xz1T+9*V|}R zDrUWDa;$En(T-vpC2fSc18kJ^LmQ1gA7CTvtSzaO)X7XvB62yFY)PdP1JDp;*#jA3 z+A~iYCOVSaYV`O(8#(^3twwJSG;n>!$|>oJwi+EB7-guda-gvdMI|EnqNfcFhzaiX z>)44M2N^2XDHV1PeZjvb53-RJC^I{$mfc`tblV0Ax=SCoDM0-mhe_v-E#3*BG=Z_` znHq35Gn|!=8*nx=2*CM{eU zWC&#E9+KOY-}~$|Veezg69^7(uC5Aqam1|QLi&qq)qher_!tiz;I7@nD8w`2K`#0p zMPboM4{|0XkqpVljGsG8jX9(Mvk1e8hwi&`E512@afuH#Mthl zQjyqrn9>k7X#K-}$bZ`K!#`{h8s!ZCdi!bl703DFs7*Y+iEmJ zbj*ESwn1udxL&tv_B)q;JpS3yB{Poc{n=;y-HFGC#k3(l z=vn2c1MDdC2=(RcftcUtB~q&qHcIa6_2!c4Kn!op+OY^c7=zW=@DVn0j_+(HyH1B< z9Iq$RA0rUNN84&t*;(0qG{#ZCokopE!j#CPW;NuU`UJc)S*n){8 zl?5l*f-T4u5uJ#scs-FW85OeNM3@C9*@FI~@abt6wqUp!7W_EMuwZ-_Wx;c1wjlYr z|J?%P9O(pw-#tmCM#vTuo#a#4Pd|rMqTf#@1#io9HnQi^X*N=O9z!dgW*fU9gPwp` z`-jg^k9Zy*&B7LUAW)jY5nOL15Z&p5yPh6goKCMoBhH3N;#Iqof9w z6zVa?MhQ*-PNr>AYp_kHR9FYet{lGal!$%T>_=Gde-e1O#uw!I%`9K3Rc(O;SX`OJ+x`Ifd3vz^cQX zLNkPB@SqhY*@>*TSW<|(seUob?C5Msp)nI}l+?$PLY*g}=U}kP5RRA44%ew?=PEophN($YtnH}fHrqIKa5dv4oq|k67&X5#LbIguTF)4Ka6qr#-oEiqqmBA&jRW}{?Q zKqkdQ&XR6svU`dO>3uUEbJC~75O})YbfwcFDGXVrJY70nJY8RC22V9lCv{hzUamZy zHA6go@e78hGlk;=<>_1yYV%Jh;wVj=GIf>$8s?mz**T3~RL=RCo%1Ae2wwV`-Lv_{ z(8&6;3Ql`Sww_DJxNP=J8(Gh9r_p$U`m0%HG|BHb6OT@>zo0;5yr@!m>wuX@r%f|u zbeb?;;OK>|zr}`qm5CkR}ol0Ml(P$J=RC3bq71*AIJ15f4fVdq>1pf6N8n zA)!AcjRd}Z=4yPkwRq?OsZ?a>FDu<)4L&*+1K8iQRD+L>#Q=8A%fpHuJ+9|B|7bx-&O<}d^rH0xmthT5$q;`r@%Z^!Gs-!g(sc_8n z>JF?8o~NjwfU>3j4X-G9VNO}V=njVPEMPpB&Nf!e3ltnHdV5+A)mazDCSV91B~r&p zicsMp6a!?o@V*sWD@1vG%MfsLKBximT?V;kwraU|*@a237%qI5A@_X6fc&n4Y{ydg zJ-#|?(d8)5oz`{oOwo(@a`V zb5-qPTEprdpBuh*UK1NyJLA0nnpk|&$17!A@4P0~dV7M(s+IH_b!{G2(l|9sYhoX~ z72b1FFEiPTs3P{{guiC`ni1}rCkVGO!i}$Ex^Py2%N@A4$dBWK9y-J> z=s4d-&a#KX(9<8W7{CY5hh0ezhg1HFz2IXDy~7k=HOi^j$3C*qUZzx5qYRE)u+>86 zFMzb{N5Z8&%kPUiEWnrakHW_^GVUcUftD{2_#@-s-~*_NkNLq9YM=>m0Gaj%#Fkg1 zOpOD`u1rbl9j@@jIDmYXDVfzMr3`WzC=Hj+SF!cCq*Xd!k3( zmFzXKWX1Bn!e!)n(tLW6jjUMGXY?`i=pz&5{bg7@V4^G$f=rG{Z_DI(FMeQh9PqY{ zteE%8g;VCb1#e?Q#F~EM9Mv>4Bt<`!S#vv>NI|0<1?@KlEorepE6J$_ZR=vl1+)hx zY(`58xdQW*B?5CZegLNR9f3)?N}RyF?Hz~%%zP2!mlWazrWZ`&(TrRLb4@I-TVDam zigjzL5Wb2fUZQ46A8<>Gsiz{Am#F`6B}@pUD`~r8t(XupbpnnI_*(bk$m*S-%K;3yG}*@~mj`!-^Z zDItz>;h3g4))*WoLmbpk;h3m6(wB-1*HUOfd}j#9>Nt+?$xCHX*x_9jgHK4BQ1!_A z=rUABK$Z4W-j^V{Vz~s-!}x(98oOK;g40FJYm!2o#L6ej5m4w53x!xFDVQYcj)F-7 zsxkywb=fqxGIDhs2UwF2AP>7GrAw6!nMyLm#S<67%>s)d$9J zss=`$w!cy1Ag}Fz6OE6EMj-!2HRC%UN;4i5o(qKsE|npx-be5gn(+!Dc9j%N(xm-9 zk|v#rA869AK9VMFF5EXuidxd7F&{%Tn)EIqww4r3(xf+lNt(1onsAe9!hTGu<%u-3 z`Ai=vkMI6OrH1EoiMGaJ{k`&IwTjyshxK>j3S$+wmA&72MQ9p|Kd_t4!5 zG`ZYH_Q&WT&#tCVa5V>i9QFg(?Ei_4oaJu5wdWACe2J2b$FP@>PrtLY+gD<8;YZhg z0@N!h8f<$UFKpdXWRT#eNp{C&<`nX=03NDJA5)ROBaRY=$EVQvkCnxgqHCsR4BwENg?1woTFWQ3i&=o z!voqXA?}bAOuORLGe){J)Lcmw?O#2785{AmQW-PnYn6tz{TXii^`EM?Kf`UG@|n^0 zXSf9){4CV=XSlVjIoa>969;DYecNjVKR=cES1h3wm0IGzVi|(Xa%WmTN90hxxvJ|r8#xc7#N(!6jQm*?l@;*K zfWw(-14?{_X0m%8qi30^^A`wPB4@UTr7dU18DC&$*JmbsKEE|xV@bRcEZN?=TU=CRoh)4DZ*j8#qo3d^Jp`~ zFw-?cyk1f;y`Y#He~I}BQ#tvSrdKRH69kz66&XT!U)A`X3D|Zk6T*8I-gaxf!A40B zT2g2weqjGC@hj;PO+HsBGbBZq7^V?fm$%a>Eua*CU~z0|r%~otvLY>)^1bo=Vt43Q zvJj;TS%@|d%0d*o9N4FGuTyHCmlSrcwD2P6x(akIEP`5mp_nox1=AV}46 z?~d&DHAiJF6N`*3U4#57cBz2)=I82Qa)}OFFuQF0T8%IV8Ct_{j1lIb<*K_AsP{La z5$2%6Y7e+Qd0skX89hIdwta(9Bz(vziN}!BYLijUL(Y(R3^`Au(CxwD54h3TPgKBTpI*0xp_18q~($m@wDUX#jCefwKDiasDO@ol-ttBwE!t`$XVTMVva7A&+41n-&xT;$GMO1B8JfcL{K9Z% zJdc6c=3vz`m1=TUJZ)B`ET`-&IpKMhQ+Ae|GLd5}STagf{2#KYnYmo@$1Sp*KUmS{ z$Md){{CgQ!8f}x^=8|nT;^ELYSPh3fmS7Mold22ic@X=28%8$_GD$;}%;)2Ikjec) z2AMJ`mqBLX4>HI!-7bSn+R&;&#@fr8LfJ!=q>1r7W<0%Bh4y4g(dCCVaA5KA$aeG? zu2e3S%HoyDNyC(ovUoK@zxSh(vPx3)`~~qmjK2mcEF@DZ%@iTytMavWOY{<|lx}$X zSEbDu8*+(O#G^YN*={2oz|%cJ6rtbT{G*LhRCQXxB_$~F7BL5+Z1s;ucQa=Ga_)wg z?!eo>VLY~c$|2z1f&P&(oQpPb(N<@KrPOLI zenstVs`kzZq_b+@C$-*?6t%ag+V@LQIH{_3#76g_VfHC2=16LqY3H+sdLe(5OVk8M z8(*rlQHq?yYJ!v8$107Pp$W#AsPg3t%5st3c)!wCLrY6&$=zuPZ5drCpUk8T5wzf7 z6oH)}@S~kJN(m5k!UnK&7v6^vb;94T{(6_8suQcS`=~2+CNqArk$nJl!|%XPHnPUH z*Qn%KGr=p}9BJ(}n)?%CF4Ek_&A^`05vjSKIfKz`q02VR8 zhzbX}3JXFfq0wSgF6xf{9!2d$6Z9U2DqS5Xo@kmgCy`q1HuOzY-@iF4pT)rf=9$7Q z?%h~?%zi+l4kCT5q;Sqm6CeG28%(u>_2_zTR-xCgtAow~qCXVigOb*WkogS!LG3xb>EgXMN~!s2)CRUg-)p#E^X(o4Uf!J4+$=v@K5Pf|44CX=Ig zdyOiHS9deb`!&! z@s|>_K~lh58pH6O{IyO^h2Y28?a(*QlqS%ooKUiBK>RocJz-H8#E)ap6E4_iK>S#p zxM7I5i#WfefLN{|cHCEYh{nrI_|qSxQUUkWnJ6IlGRWoos{FW@LDFwFO38EkarNC^ zhI#*Q25gllX9>c>U5Kyn+(8<`FSOVGh9&zb?hC*3!J9|-qj#VL-xgJUMf67ug7%C3 zu+3Qlx|>dNjg$jer=p~KjZ<8sZ!%Y;A-Y=s=Aa3+2!9Xd2~vr) z#pl!y%g~yEv&)RYIdZV7O?H_PI5!_MT3{FZx(>anIs)C3OO>LvFeZxjKUsUpp(^cv zvi7YZ?SCrm?4;8ouBAzdgS-DyPD(orSJur*{Ar!B5t!u;>V;Gy0M8^S$u;`ddDdF9f~=hZB@ zEsmpO=h6Sor3!m^c%%v9FVByH{4^tP@@EzD(~P_jC4&4kJM^7D4dg1XkXH)wGYa|M zKmT7KSJ6-@m|wg&3iekmh=yy9RbhYCf@lb!#E6Dhc}HdWF$28Ht0UyiE>x0RNQw^n zp~dl5Ta6AJtNRFpbNN&%C{JIaWY*}2-!a1?@FjalGzEs{=-q zrmS5mX$`9nvDJ-FR9St9t%qjV3FkYymg=@+crD#3O(o{kzIJ6XFrTul{W~X9917 zsc2m(;x(Yo(%tfz19pwVHmWJbKBsDnl=PS(9eCAtKBseoSJI12bz82o^f zRp4J?@E@Htz`r8k@ufnHh^Z$jz|W6&{MJ^Z*i!&Mtb<0)$Eapl5byY)gGTK@sC|~t z;d`dS`az}W=-4C*^mPn0dy_aLa_S zL&0r!x=y|h=mmOCPy$(QqskVflbc3Cyq^(2db-Nl``Ov=oi=RPFE)6*_|TpXa`xBL z*n{Qoh>pbLJE9B!k#*`k(fEU;Xph73JRJP;4<5bNbXngx*u8H zeIa!}{#$i;fe=!cEov^lHj28FtZsBj-N}EeF3;-?hSa5rn!}RT7~Dr&5hc4r>PA~R zN@{O4<5Ioq4}a8LnKiPdN^9tw$NKItX@n1%!X7kfo)u4;{Y^%*&QnP2>g#WM-HM=n z&7_g@Fa`@ZE#bRk5@R%(mfMQ%XCy@zds{s(W`>xa7vd^O!St458X98SC`3yOWd)et zP)zTE$!h7SQOQ^}!oFj5H14R;uQ3`quIZ>zCo^7CV#BapIF?w|x?z=w`&&|oeOHMc zf=c|TW)sh~mK03O6w|w4s(Z^A1BD2hbGt=rUSxydrq$d?z2eYpC^1;qGV3g`D!UI0%+%`? zOxV3j*?k~RQ;VuJ3tS85Hy^K@zeYLVYZ2!+iw6gs?-P#I;`{?5H(A^O`ClsekH(Aq z@u*#Q2V+<)7ja*;Qm|`ycQbo;N4yGnqRs5u#tDWaH;W@HfY(jmv%eZ!ji5d)@>|}Z zE%T9YAo*#-eJ?Q zzftQ3fJ-jXG)8H$x8hEPtA^cs+3weDT4?`sFI(PUGc4b$EVrviExDo8>krVcOc-a^ z$j%SxVWfRb+6NL3t9)HgfPUlRW%V?&2Yh;t+f|U2)6eC1~MqyBNf+>GA(8yVecyiO2L~NuNIW)WrQJD`N=wGcmYE(8^ z#oYUej_w^bI^@vE@n}bl>s|11IG^+81X&Wh9R>Kn&pL&w~#VK zTm9Biw0_Q78(nDV_+06*$U(oPyBO;gcz#OAoGlSZkR zXyoYBNuviZ(WrjUPH=Z!{Vnruso2`}fhabgVw)>2sTx#IvAxbT1K=sPkrDuKqlh~t zshx;UE3n=)0sC&+zXppHpDfC<1!$)>Q2-Cu&`auFS_OExh6d_(sR4Mn#=V3+nk^oE zUSp4bajAezzU+SjX>8?Z3%ZBeM?pD>QI5Q<3gsk5xdA0L!e|mB&TM2@pz`D_n`S1> zO*1rfLvm(MH1j#&|lH*@iaK_?(Pn$vGa>e45A99~)`ptVD@7 zC#VPMb?w==E!6&U4S$2~EzV53oa2lr0n4Ii+bRneNs1PKS>yHTelYT=nD&B-+qre` zmg<&KnfkNEjs8rftj5r|mfh)TT;FTf$HYtMZN|~;Hx)L0i zESk?$Rkvt7T{)YAfO%%T5O!!h&$I!dt{pqz_Vg{#v*bcnabSr!?xyZh95~F5Uh_rM zDhCd;qt_%i;{|zvcRNs~(Nwz!mJkvh*qku3!fqLrL`rT*3Z$;abCiDj#xSIg@u@tC6$$ z%j~XI%3aQqQZq@vTxUnW?9`kWO6!?E1es#`(*DFU3#~!Mn@_t~*pwFVJ!HEY#iyOG4;?K&!LFOn%zmGOc01@wcYVlCyjQ4WW{=^R0yBjd5tvcdRZe~a|7B0 zuCEl1)ynnRH^>?(wiP(guFYRj?fODJZtxpJgi;~AtO(m$NrOLgBdVgoD~02=dfecP zL8xoHsztx*5Lx})o?w6~r8WO?MQPQg_0TPL-&obEOY5OqbiT=GyruQf8%WFP=PmTH zSXx={@jop@&Wu;ldVD#*A}r^+ctQTEne1-*oc(_N&9DxRNqbE>W|^{o%*`4#zygQl&NLS9#o$)DaLj_-Xdxcat#(LD;>LEY~v z5JwXAQLbB>tI`@n^DcH_)@@ZT+{JE~bDQD9UCM>(NhLrBIosxT#Qz+4kPfk*#LSX8 z%1MWn5#w(E7ufT>1$eemF+k-4dBI~*ppU4J*1ztKD(EBXqxA>fVL%^IpIhI6K83Rv z-5K@_$Injzn#z=ccWUG;S4K^%k4{I<=JU7@zQEbE3|PaBRgQ8ZnqHrqGY=GgmPvbE zIpD4O{4A4rmqv~;c&NDx?Tk3`2}fCd?qEB?fjAm|x4}_Xonz_U($gNf2OQ{WhlS&v z`rOmTF#$o8IbW%NQQ=y7j|5TPy++mX!ZEXco%^P-HCirBF}yHJlYGKWGUHy2Qj9wE z2{+1)dyPiSjbYX(9 zBBg8*(AuX2h6(BhLHYMV_UQ>wc`Z&=9!kum|?|HbN60nEgaVH4#xT=b`H7 zWov1!LUqg2z1|$k79r{W8n}7`SK0%{Hd=3>$V1lcA?l4&#Y-R1$j&d2vvCYLxs68r z0oCgwv`kVUbP=Bxeou zWI}1CMx%vetEAw3tif((sG}1oLoDz2l+qg3GG2Hfwyog-FFep5S$Mz;5BSk&b z!xxmJO^{32=fNckqfNbY;%Rb6EMKy#s!TQAIVFLTJ7JSd9~h)*CJfXAkVma)TEKQCY1SyR_FUe`ra*EP=Qq7h%$n7vRA-1Bvf>${*q z__LYPg-SvZH|b4XF(%@Zy0kY{d4ID0nW<5UWc})EogV_q^*>9BX6&DUZ>hFRi9x~1 zeg3Wr-!|?ey9ZKR~&c|x7-4W zL3Gos0Cf@qj>LWrj& z1(TSfgNY~sk&-JWjFA+rGQp(GOdO=lns(+N49Jo>| z{vnMx{tZMk!m4xp!#8D5DEqfc3j1F&so>5Qf$y34Bb$*A0}#F$pZTP!v`JD_nqhL( zZ>N#zgM+NSi@$eync3eblpTwVV|9mMm8TE?Yd zB_jB%l4=TYKl3WqP?Cj}GSMoAzXUlv{tQG3K0P~}t%a@uQ#|A>eG8wR6&2Fwe6~Et zg(ko!kavrgHj<(V)~M+C*d@_%kI)Pr1Q$mKM#ru~ER+-i)|&Wht=@e!b@|#qeK2y@ zvRVl6cY?)KDS}!IsbT+Sw*TH7qdhlsdp?Ie+H*5IhH5I!_i&SU$4u7{k;f)@VJ5~`kkYwQ6ApjpfHaY*GKtu{pvh0 z^IGWPp$bcmq-cg+GJtKDvg~1s2ee<+0QPsD3}8PB&xOK+HkJXbMPCF9#_6ktXb1w6 z3}F5G$^iBfeqaEr=qm%*%~Gqiq^KnWn7JQBW1Q|F#Lkj}Nd~Z1U?Q>(k53_bTeaCC z6OUV!!o5dQu4U&h?%Z69KbFgoN=H?tR?jLo+$AY04QoJ(cf9caS$j~(S+HWtmN>X$ zloA{^0+qyI1bVxl5wRtFd+T4w=Mj~}#8z17em4S^4(axiyza-F}|}#D;|UYUh1sTypc-x0ZGxu&&AX_f(G!XmWwGvknew9 zNeQ!HEL#wtZ&)yvE$Dze`rOzUjG-^(hfEkBgFo$c0tFtL7K6p;T?J~jDp_(iUyQCm z)0sM|0IRoMoi*|;R*gF)#&J;>jrJ61)SxLAeU4ULG)gbTOM@;NeN~7Gh=vNOFfE3o zVa{_3eVL?aSc!&)9_}fRbkXPrv2lQ;@YIV@Jmn7D?F#6vn)9FfCK|2e@0Zl@Qh?|+ z_DYsVqh!AxC@Kh&={5dr0~`ADW3Y?3!=q8cqu-~}gHpY}qyVrW#^L`yl~TND&!Dpr zJubwBl7i{27{_F1Bbw;d$nlc15v}rSl+eoAh=vQ3!CaqkTb-kevk|rSY1H6hXCtBp zIr!g^?`%W^eegyd24uIVZ!ysrW%l)xRBD*56Me?PaolGF$7k$@JNnB6`xytvwf<0W ztct+_yO&Uq& z{87T^7d4=q@yh-IlA=j=#5lgcr~w@Y>#mC$V3@*<^v&N<>Nlu6mG3E%N1R3YfjgBQ z#qx+#`cC*G&I82&!;jxt6O^_uC55&PG1Z>GneT~-itnJL;QOLFUu_ND$LlR9rVMG` z(UXi4*;gN}$=nxfPK{5%_jfAR6UfG=Y78G`!zX-Z6( zqfasV4UZe>PccHr6XNJojDGMFjQ%v!Hb0?}wOf1&RS5diF-iXT6uRw6jgp>-Pobet z3i?T+wp3D}|6YBa{@#;yK_7G%>cvzksIQ(;1N~q#Cc9ssG|&$=V<)5eQ-Xf58B@i~ zrx^WErv3huruJ)EOjpucONuBSqOR5L`82@QvOvo#@VbJP!Qe(bgY8Sdp5qSSl)xzdy6p!P252l-s9&O~N2%=hRA4`6=DBC&3rgd7 zN#R|&FXZbI7+{@XNug4yG}c^epkrUKtNIIuX<|*|Ql%rzs#$DR++aKr@LmtiVwfFJ zB8Ly8=pz(itdxA~AsVHqWe3eNV_c3Ks!zW_CQ#RioRV)yUDUt42QjaCOz_{t+5E^1Etu@kp$e zx@xonKSp=e=nwpOrK?7bM?qdKA%zXcV#*Mo?~pXi_Y2wgg`*^b7IFl=GfE;lPbw5k ziimzwMf7FQ)lofFO63ttYqWeBYk&DUjZ%P=sLYJb(c>sk4N}ID(DivfP3F(hI~RF_ zZcktOfE(oy$`KCBn9V;L-4glboZm4zZ2nztZn4;+Zjt2qcRBY9a;7ac=HE}a(sg67 zUsxI{UB{&}xb!ee8R-uUbR(B$EW_zQKH1>}ph|56yV%H-xWC-7!uhXEsXmX((Sln>(KOJI8P)c>+7f z8>C?@;NA%uHSE7cIXmthmD;b!$KS7fmTP=D0Z@pXsO)3agVf&XTay9Xif!-1B4VrAfxYevrfAgQ3GB_vjyLzz<|~w* zUsO*WGevspPW(Vmy??6c8NWj5Q9bqXsjLU9`HCtLSj}&ks*wY$`HX3rTF@s?mj(Ue z=`ariL`Jz%dt9mgd%CFYI70@AcV>v%((-V%duOoP%R6gSStSC`Ot-$Ek>jz>8oh}h zczAmHMR|C-WG2)u>Z(!ZCra(~SjWz;8ugv2k>fyDja~o;ul<@YQZ4v^q-dP?V|nej z>?Mt4?Z*qUmTxQ8mn8-3oaz@LGGD3C?TZyZ_+E*?cfHW(ND96c)%mP1b=GLS7%?H1 z_&LYm6~ep2e6F_`_}g6ahv7wD5^9=>wXO*l!~}Fd(Y^Q! zZT4BlyTN;1(-W~iUuhjW}%rPjl2Baw$BA&Sw)^aZ$aogjsRtd&JHUg z>&}GkH)mmDXH}F5T}Pm+HdU;VvPE!%^2iDXK*239R~-l)FlSC8O?ug|b^zX`MV`>Z z?W%soLYgRRyfU)VsU~PW5T zC}V9DdWk+W21}&DuWIDX_>`xd+5A|#N(-SANk}zFFw-TXhb5t`8r;Fbkitlm1?~)W^UG)`DmnH zx@lA*gcrg2N@2kI5@YP2e+4~oH ztNl@aMQZpl8Wt_?TccY1jB4@kLWFW5jELn>xM+n@BWbOwu~*f|2@$e|@P{JIX99w! zObA<4@Elqp!E-}-Nai{vbE~TQBok0IQwZx~Iqp`LOVxx=jH+eA@rAcKtch_hUIG*XQ(VxtLZ=7hok});b z(R^AeJ^ZPru0Q(ZQ$vPNI9`fn8CQR%k>joI8u>q~`#`~gABylS-4pZ=qDtvPi%&%E zN{iw!U|hedsw*wxn;{-YNuJw}>w6aQ%@CigGP;V&8(n2t9EOmit1!i^53QEo=F(d} zhk*#8=3gooycfrjQWzrmgz$+XECGSX(KUZ6#AA=C6yxanI37n&d@keYovRJ`bIZ(=N?*Y#mBJ@yluxc&D?aJJwk{zP@D;d&S%IKl z7+Ma{KZZ~@KD(=7)I`JUCw*I^jqwd*ts!eQ>ZD6gc$my>E) zr@~fVMP=pdgD6b^?65`#QpP~GuB-BH8Q=PF$roDa%BeEG_aW~K!`~`z_|!q6@r4mnNnfeZdEde@o3h>@WC~$}BJ=`*+oyZ1LYxw(Qnb(a7LM6j>!p2u z1~(5rr6Ojxg~zR{zLcS*|Cfd$s!#~_C`C(|fT+$8!hQ>n7yp1z$EdFEZ}qreDV`o~ zSGdoP=acO5dpA^h{3Lt)xebPYPqM!a|DIw`ZrmX8Tq#l6qqZeCHB=vR@)UvP$Q^HAeusmQ+HsSus*iPCs< zf&mp(o+#xj8a_gajF+W+D?{u?!#65#_-1}QI!L>XI8|B^ioI93^tFvf%V%sxT(R5|vfPa(&d?4@`HSK%_qnW^g14boq zpL=h!IN%hx{~t6o9$896&j%MOy=R+0J^?-Ip6{y6AD@6nmQmjs=8sR{?Fo5OpOAq5 zQ}JD$Cm4>z@cE@&kUV-tWJC)Xk$FoMq6Lho4N9bsFJMgLw-^{z-oW@aWBhK5Mo!uk zYNCZ)de2s)i83~+7=0^&hsEL$p+pGF6yd`VpQ>N^f6pgw`HR=Q3 zOQVhjH;)MPty26+0*?saG65q(wh(?!AYQeVOMZ94zlsLK*((0C#m#Ze6vndy-~hY( zf^AjqKEUpFaY>;sIEd%~yZiNRhPzeXaQ8uW?4fP)1ioDqj&7n9!Wl=!89x}#_`zre z+N_-Mm-6YiAaF-XYO1QwmlR@#Sh=HIuwBHsw%2K-@OyLc^clLlGC*nKj1O*5O3rr5 zbSrwr>)Y{KO!wnmURCWZzn(`l!KbG|F$ zUKCkZcGsx%JLTkMR>z6%8vU?KBZsAjMwk7hQG*nm$W6Mwhekbr(kKZBbl>?&la077 zs^Sk;-VyrsCo~(LsVarA#mdiA*ZwTeR8Rkm7UAe^zE#y-VdehyHYmK!R4#;tO6Xr9 z0)4M)%u|HhcS9TSX9!`n!asDk;9tAD8vcKF3;qZ9Xry3DMS(eXkHFl%2QX_LVsrJN z?k{wE@Zgc-#Vrt2E)lclMk8_@{PhU0Y5YXjB5;!S8ts0q8arLZc*%4N4m0)Gi&w%E?i+s7bYS-@?kkzLsFHiSVrC_<_mdKbo0@G!`7??UL zOab@fh-FtUbpn#vzu>^3-%mNcbK+^!FB(}hduWug%}lVcpJQkbjh6hXkz;%hjau&0 z$T6#jM$`AfleO)o31-2YCOEgWj*PcI@P4sRqm%-5Ss3*P!nVH|7W7vZC~^EGG{FRp zFMh-8IDTw?nKx$3_u~VVZK1yMmI+^79@(#veSkYR*pC)*y^jxQWQRkGJbpOjZ7z*H zh*yc*LmzXlHQ^Z6jVMj}5yva(2=hI45H4`~P*&g_KvQ@d_tS$K+55Ts_LKZE)XUys zKxs)^Vt}RTAylRW_cy%|3s*m}eeJW>RHAt?~Qud3a4M5=uNZbn=xg8x<=2MvzGqk_2fsDYtUSdT07 zzX1nOcKOrbNZYB*AE$&3|5Mb(9ur|V9y3thBT+d_QlK2Esyzm72>un^5u+ZTn58$T zN~wIfz4D=HrW3=2y^!vhUY1A~{)N$li0sVZrPl2%+& zi4u2EFQhwT%M!_b9O1bO@4qPnd!DnvMb;}vB$IEKdb@dJ!Xrh=wE6)BVzZ=I64515 zUi>ir7DOFXl~bKmD)^mctPijGdqU*_#_*Gw>;)+6g|hJ{!ruJ%s{Z1?7kViX@ypth zpA^Vme3*m&mUp$U;s;(4TTjZn+QY(_&xbi~JIOsJ(vaiV1KxsSohVbG-rZZJf*vz9 z(bE9A-gfF{nrioCZdNT#RpRnwN!+?72+dXa|!`#)h8K2zPoXV^k# z^Pe$n@l7WJV_4jL^o;m@b8`bWmxMSQaSIJ1?3jSqU2oA4)3uR5cVy@(6e znDCcQd!vB2lW7GXV4r{j4Bh1{=6teK!_T`Z(~G*R6knMyV=&odCwq{VnXL8%nuMDm zoE5vxe4`SMKz+%`)_@5jzhsdonJsA#Ru?!x_YEUUH`xtj+ZdS(1*r86*P3jy6FGgM zT9sVudxNQxnd~uOssNKR@)(QCh_RFM!a=STKpvtGa;>>sD`~F*=p-}kH<(T`(7cdDtX z-{6RDcph7uQ+aAt{9*Zq4`nMfyCt<3)AQW+?^^9d4gZkhVJ^jHFQ#!U=@*bW6iUSl zQ%xKT7bHq7jKmMbLYz%vA#I;>q>6=`Y<7%XI7L$;1Q9XECL$it?CJ}|w=@ya{I_rs zJ2i;l(;LtCQ2^s|REnsXYHH9FUzZwx5GK+Pr(+?i-;Gn{*Hfi5&56EBh%^xnl#k)l zox|*QxeHU}$*y~H+Up(~7lU!?pxsV@T*QBW|c1E(DocLS#_Qz-%m#j~QC#>Dh>0(V)nwI6vGRP zV=(B!B`wIbSl%PM>3zm@cdDHlHWOj3B(>+zGCqDkG8N-g`F@O)UVou0NaZa2gH+gd zz^pzI`XmOc=fnnp9ua#W-|eFeL3-h12I7WT9fTet2FGFre0u{s@l^sD2h0S9A+daw zfUkjFT_vy?YOJ^hphP%E#_}})RtNM)avjw3y`z*Sx_cBv#_&92xXocF>)sw3Rf>ku zv5vT&8hIUda@c!n^et3bapOSqg9_!OScSUUFv(jMm=BaAq-_Tb*|P zgFUnOed}bW(XJ{__5t(?zjvK+p17_;K)kG6cjP>A-Gl#!K@qM?I;3E~qF{~&A)@O5 zQ@Ji%Fpl#_#=4ZTuJ}KNbtz*#?|cKR%B!2%mNVLQ7utzC+A?N6eW5)vg7CLDd3rFX zpZW_q{N^V>rGn;zU}RJi_^p`bVgttn^$yJGJ7gwxG9~EE&vNGuq!;5bIJCdm&Z~wO zneUm4?c}TkYq6`qor?=P7h7nt@XTVK-4~;YtuofYS3-BY9UF0qp%r>91} z@x$9wqY0PT$vUW~MrFb|G~V%MPmMmi1TrEvKuz;K`oJJi>mDi>tB03FwqCtyO-!>> zvNxZMm#E>t?Q&CvIv%h$4yP_M)9hs3hwqGkSN3d-bHw%1Xigf!zn4bWUuGxiq{6Ys z!q3*1PA%RvVB-0J%xOs%b$+|#PxSg3}fUqj&uAUW@A71&-jJU zCenvjBC-*{Nk^28hm?)KUnw@WZCV!_i#*|0W{7o+{Squ9=;j*+=l09Q69w+XHC|%ba*MR;&Ep zd|?7?-g32_oMqs3(^O`$UjrL!ZAdj52ZCXLU#dhboG>=Br5~`RU9T|=_&^L$c-AwX z8PHx^5LMHSS3aep@sSCUHGjvNH-t2QS55PN*4!Z7PTVKcj;hAroxpvvO}g~Sap}@0 zi^nM~mhmbL>ysE_w{?iKo z&}#+%+G_>BbE48RSJE*2r>^}s_`Nwrg}Nt*2y^GSf?hwBivioFDivoNGM3*m+}+&h ztYfX{tRtHnhK-e%1}Y@xuwh>{7sJZMuqjq-keu8fMs2E&hdJ z`~ok>TTr0q;ObL3KU*m_&77{JpKV(i+xBS-!?rTE&Dzqit*n}DtJt>8mUWn&RJflF zisN3O9D6Y`qzZ;KyrluDf+77Ff>cor(r$)y({)bcUH%=UK(||-cCuc_0s5#>%mgDuFkfr^Aa>uDIGOSrDwOo zVK({5^@i6ES2OVpo7nyaF|k~*{h>@8e1n+y{S9K`DA9KQOG;aqiS|~&Uq=Jf85m_j zsUUCjijsM@1)~!2D3sUAuwYao)}6*wH9rxZePJsBXnI)*86_zIj!opH*3MRTYOowD zIT_cEsrH3uAGlDqDo2naGB1V3yjGT9q7e*&~&t~S`Y?%3dH8ZE$(3UH1#&gCo^_s+;OFNk7=*{X`MCF>? zf|cZ7p#{rscF;q&05Cs&Bpp|cyCadGKE~Z5PanVF2cAAIxK*A$N`+INK04kC8N6(_ zy{?RyBq>}o#Ky5S@79o;>lpDa`O_@on3)Te?6VzIYD2KoZN>;yYQuzZ-))A&O4S|C zG9fHrhmF0h&Vwd4=1N8NxHlt1Si%rK4XIpGP31?d(t7*3RsR22`||iEi|y}|Hf@ud zCuvhs5Jan96;Nvd_q8lV%UYo*pg=>Lme@84Nm@3SiXwu@DlULp6cBKsig3k?Qrz__ z;&Me1wTdfl6%iG;_wzmHJZ-v3@%Qovr!#Z*b7r1-=9$d!uW)3XmaeWRIaaI8C)c+w z`vsPL;ROb{_4rC6Imi5t3rrVC*>u4U)+gyg9l`^(`vA-Ck=+j2JQQJ(Ga;M7}JAH1kw1*%#b z);K&kd39VLgFHBS^|=O&s^5fki(ve0VvOyJ;2-Mo%NEDXQ`O4HpKaaRcO2-=3;Lor z2eC#$?>Mlvky69@0y*wW9S4!8_h zQTr>(1cgA|FR0%)qVjuT_V41%2Mit+kL!;(;DxbP8)iwvL~g+S4k>>K#X`d~6Gx%; z*VVWVIUs#>l!NjVW3}OVW0Zp~&N0aI-Y5q>#~3dRbx^fpJZunC)M@!{q4?RP7(3wb zLpq)VQLFLvy(nI5-l4Y|9M=Kp&{1z#7mR4Dfj823P|a*;t5K4lL_;n%qup?TG(FE} zPTzL1K7=y<6t}!C{u+`CZ{XDSYHfJI;FH=H=NfX8kYyk+;OaWXct=Q2M??GaxaGbk zd5Bl3)hVyEZv7s%e%ioh*6(5KYf&wUOM8rIFD21ggA8&@@@mbsgG`6)F&y|=IHyL| zU*dx=B{iNOq^WW8U?ee2ed;Aq=*pJ`A~O$&+2erpPt6X<(n*Hed*o}vzIoK=IuZ4i zgPYks*NLd_MYS@bxlS1F9b%d}mrqJ2ESy&OXps{gdd(1gd6C^MQqyCoWrY1EqqmifUhMQ(Mmy-kp$2*EqaD)=H-PV|y0RE1>p(yABp zOb6De1BFC2c+`pE(s^masMn;v@1^ z!-0X!%dm*!Ul!M`;RcX~wBdCj{mvxKA7PT#C`O%-&O$@`yslHmT6J)jovk~1FFX3R z5seR-y-qx2((+M*CBVH-Od`kRo8H{3-i*-K?7|iK_<$8>#R7PMe?m9cg)I`dTm~aB z3}wfO{Rf;p4E=DK4nvDB2L?P;r5FoboU_kgZjc8rTSts)_aKbPX@(j(`GeMtUFkv} zoHPoi$rE*@3&#F?lxf^b7Y`|#DzwUlB>8icL5BX6PilIP)(PR9cSTb7_XMKHY!M?S zjyA2^q1Jsa4UeFqeL+Omk*uXEwQ1AGBB^cXgV zJ*t&G{pvzL+BL@Xgiw+Zp&L`+gk!HT$liCfgEHbJnt!=G(?&aJ?^uI8vqn28Yn(wT zPmFfZmI_2V7$@Eh}Q$MdxLEfC_#lYnA z77?vxr_De`>_dKa3LIZG!5}w;(drcT`UKPK!Uy>m$@iAfT4sA(A@YybFw2RBhPZBr zTKtr_Zh4`)F0Kf9he%~5i0gKW>&_@r*G(_dNIg@eX*}{XG4?HmNMrS6H=jl=;6v2f z=gf+*f4nbJ=neTIRG^ML^Ba-TJaOyTp>O+|I<$^0?_At0aqHNBUalspWA8m#YC7QEU>WOc~6KhM<6W^DpC(fLxIZKJ+GqryCM792tiLl=O(r5=&DazL= zo^MAx=n_BtjfPrn_(mG0bHf1~f14ys_oWb*^J2>QhFq=X11Xa8WE1>fMBPXHs_uTj zs(ap5s&1ZQs=6z#Qgy$$iq%CHEKrm`h1rl&Wwy9fne8f7W_60G%(Bar*-d3&*1pI$ zd124ikWc-q_0Z2tMPK@+tZ_V^mx}SYS9$C!{Jd23t*PZ^l%-4t-^Jk%l+azN2zG5b z?=L9~`>>3zmDdJ%p5(>e>+uuHyn#}hUCD9n@GQEAH6fmyW!NR;52W(sY+$8M z&T1;n$=R}R#fd8wqL0?3>gcD`>r#27-2) zVbXmv@*2~W0&Uol%5$LLWS!ysk1_DtRjnAiQu(#ZHbq~%0#m>P7AOzsn<0QE;poMaJd{c=1STPX&4Odxz2Qvlrig>oreDZ*>x@Y zzcj3v(Mtc9rXe#8GA2*->#dp*t-f=XLFqf3)|iVwF&;%|73;8Kwn6DBX*`WC^5I7b zCDDmgn}+yQ&cQcmkJWq!{DW)XLTyI6m5frlp#$*zx9}b_sk)!5)}sm=B=%yjOh<{p zJ!#x?9CNkjgy$kg97V;b?H~h7btj>?GmR5s6%hGtdW#`mFLnw<7rR%Gz6O$TQ|ial zI2C%{im?py{hghKs;Y}XQ2!{@ML?2a=SY!V+kt!Px?8oUo-_|^(9iEbTFBQb1eRB{)x^4q zt7{hWbCJ9IEDzG;+{Feqau$u}Z4Prh7&`7iU4&+Oko6sIYmxQR@YRx5vR;}_UDhn? zrTUY5%ol0(_6`q6bNKxl%_r_RbFZ!eL$W8Mi$w4}kL1IShB9;b+T<{CrI`L@E2 zA)l|5mZl@n#yW%2>$_UXi1>T~x{oU-u0xt~56d`4JbX_&d-VBr8k3VBL`?83EKrOG z()n39?m>O9KMaiaxkWt^p*nTNXIHfDlIPhabq`|7-?&ldc{Vrru<4QK)g!!jPbXE| z*|6}_1{t{6I1nB0;~$>B#kk2^4Kj-T;fPuNHdjwUHDX5ZFnLO?fh7#y8nu&aoy z8|Bc_M_l>FHmn%I$6s*ylxOgA*0_%Q8teN4YI%)80{bf0e)6grwD&k@m2aZVD-kcG zqK^Xtt5wZ2XZ^mfB2@=J9=@Qk@iBkSnqPp{a zjq0cmK!H)dRxuWKY%4T1P0FB{a`VSv!+%NwK$&+}+7zfdn z5=Og1%W}^(V;nT+BQsJ*LQSH?o5naOLy^uLD@2y%p0#5f^wCEKc^)0(pbd2fc{Y!6 z(C2k+d^#%iO&#oyL^B8bA`!|~Hb#lbt`l#7E+guKOD~T67_%s%E>Ph~6t2?3w;!A8 zb&;OsEv2KA&$Cg+Ck7c4O6eFB=Aqy%rf&F^&7WKdmQpuR4A=v_V(N~jd0YsVQg<|M zL#fDL;*Un?EL7}Ag_n-Pxx;fm1s!$8-yJ_Q$nb{g%)NUP=`j>0XkoV3(&8Y1>zz(ZbPt zb+0|Mqx6CvRx+-l!C+Cm7x9%7hUsK0!L3KzjCeOat1f?8p&T%*sM(5oj2);8PPR5Q z^CcfUmF7c*;CdW$eOGJD7U9ZATEESz*w0OL(+*{y!Pj~ueQi+6=tMUy!XLN?>HDt@ zVs@$HBp)&qg58byVIHm;c|$ATQwS|iWU@E4#%uwZ9-e&0H*g4Rk#UOn<6o@B#BWrK z_-_rlWu)L+)uQKk(IQ(R*g*?E89t<3&h&)rZdz^9Y%UO*7Zoy%c_~Cq6Pljishp#{ zLUWQrlg5@3=cYHbGGT%s!P;}l{-ecB^~&x7DQ2B2c3tR6igVMe-{ENr4zCmn<VU+oSXgvjvY85rM;Z%dwp+^)YoYJV6OL}zSXBisc)*>ZIGcodC)`=YSA8DNmPO^ zbLaO4r52N=1l>;dU6-H(NP_iH>XQ{h)rn-o0r2N))ddRC6p{ni>s86C_?Y#?dMJ;h z%tM*tkU$C!Fh7Uuae8*W)|XMMwgf85d2lLF6YeZ+YKoU=8cZpxH^@Cf3m5)ijz`lP z&6%qlZdC}Kr;9nOwQ8+GG~Hk!J50?wP4vD&?ipFHD4P@_J?@sX?tlA%v-CK{`1L<3|JRl8y9&X7mmC*w-_QIJlB%A<|2jF}yw)tH)Fis;{QU;;fRxfp z2Bf-V9$9W+`c`AeyQ_WW{%F(}9$#Em5t&HU8picyVz6cTk^HPtETUs^edwnBW*m>@ zIHu?IvdT|-PR1{KTtA^#Ju}8ZU6f6ZLNGhUb6|{v=Kf@m$9jc>J_B;A>UHZeG+5;8 zp4s15h|{TSmB*@}sahhd79g5u!D-xs4j6>ng zkoecK+|p`FR0Q;zOUh8pwG}1>)Ufcq6U+Ic#C-=1;@>6fm53$3VXhqw`wOF}LgK!R zD$bGRoFl*g#yN5i=Sa`r@pH`(^*HbTWSWXXi0-wZunh%1{c{B;p8XHJd7uka(*2xJ zMSoyqx$p`HW%rhhy4T_vcZGw#`@bJQfU6IR|MA^jRyHl*#ah%|n!5J>k+3itj?Q+S-V-J=j8)f8Ux7xD}#T%(O2 zD+H3J@Xvo~3ZFtw;uIcFPD$Y>75fE+pwbjxL{1`3;qBV^ra~ZT3O^4deYlw>{HSO! zWu;{2FOY{R*EiZ`;(%2{cK)f2o~Zal86Z1{Se!C>xzFMxYBf6>5{whG7u9NdIVy!4 z60^0eZc5jaG8Df|A?R9LOdaA4M<#m9s7mpC(@i7WItTiNM7$Ug2$2kp?} z$(|KgI%r}%g0|^O2OT+8)X7i?x1B^@-3yBSrb19@()CRMYmA$_wDCiQK+>eE01}Zs zZmff{&JZtsWbyPE>!39WPO|qN>!8pX;-!l{SB-U0y->6kehs50O_c`mRfP!tp{RON zonoJIwfG!Vt)-0lSj-9VV=-INSKnZgArKZk7H^2dWAXSzCqEW%hBKc9`A@2tM z_3eKXIc;Y0T{x8FB*Pr?EIIGE1qgspd)VSgZme^XRHO(1L z)81688RNK79F2r)Cvh*zP@*!0he6zvs+8zeg&=M%)hF_v&75$U>J)SQOjB2+gT;+Z zrWJ9o9&MvNM>r{+&c=5Gx{q_cyTeK8*{Jc+{c*O{$#jQ3K0{O9nkGmwQ}iIOX=Aqnyb2 z5e}N+bjm>&b!S`oK!s91DPyDaZ#*RP@evb);V4uqP?esV(?YcktlDswY4HY8Ej{BL zEAd4*&v3)whCvQ0I7jq-Jl^x@AO{_EIf+k?sMY#6&ezeVtEN{95Wi|0E}?n!f!-g(k$ z=K2HvXl5@eP)gse!buawII)s$v7Ws-nZAWAOc!S>CMhOl&9(B#n$bZ=);WsvvO22caGn(_ zr^}g3#!*g6uRb3&%%2`&ot`|(DgA9F-;$Kp6*~KUWknHs*xKQjL^|tevxe@r{xZ-; zkE4Qb&b`lyn{&T9+DYkk7g%xTk++1_GoPc6aT29xU5MJ~)R2!}X780BYsrrMmS7wu@_flI4Qj*n>8)+O`)Au+@qXyEI8Ko0Y|3Y#nPk4Iw`%NFKYQJ z-uJEW^jg%`ptd|xLc3X|-C%%!>GfvA0dDXe$0LF5kt3Y+q$a>;3X%B>tQ}s&lhgJ_ z48p65(3yyGI{buokHz7n@0gi=oWn_3{Ur4kSyN^>oOJB*PGMo6C&|@CAy`zzu*g3i z`q)1GE0t0f2X1ZkqLfr}(>oxtU3hc{s#Dy93PJO*)idnq z4m9>(PU>*^(K!6mcA>>h)eD7vtwNwaXZ7S++|>C5C)uX`l}c;0?Qw-kL{xnQk=@nX zNg*}yd8?;uZzl~q0i!hjIW&xWu;drx$deW}Gwq5f9Z=g}iP>n(0tbP_ubVkX}uV(w4~G22y4jdJ@y#GKm= zVn9@{4NpkJvuJ32K#h#?g@aVBqeRjg5vBtwmY8l!z_QWc?&e@|TLRLOj8cD~h?XSa ztIC@0PD;WL|s*KVj2^eo~?BV3?QJF>FsFxl|Xguf1AN5Y4 zM-pb#B;pq=1JGS)J)bpl%E|D99jp9#1H^Mn68Oc~d7o(dFNGL1b!mS+6WLCQbJNdi z*Y679yxS8z!_WjQ8gohuB^`STJd6dlK3g$^^3G`$xUvRwwZ1j&H$)iDs`9qT3aM=)MH9jk3FG zt=4T)h_-tY^ciu9X!VE+SfJ%QM8FxR!kvksTnA;W5eY9Uv@G}Bo9m!!PBr6vmrnCq zn?U*_<3nM8AnKh^=A%00&~=?~v@Gw+i?`d*h&5K@bun+j74ID38Z*s;GmBo(1r2Z0l z_4scb49YWNjm)ctJu$WV(&?I78Yqau3g;4bk zVKClguu`OX{_F5z!2_Bb{q< ztz<#kaTed!3whr93!Z*&?w&c=7oZH~IZj~%Z~ex7NEVR@6)5dD3N6bmNcS#C_ZNFP zso@j#!Cq!|$|veWaUU_+8zOpCtiI?mfy%uzxS!fvxO1VPx0CEQjd4(YgDdbQesOQ7 ze2M=Rf8a~}DW}6Z@$mAwnZ8Mxtt?z~Fd9$e86Tx=6+crUUSo+Y?hujXjK`B{{OL|| zPtwAo)18zWCX3kz8$?B-n4e}$&uB$v*jMZe`vQf&NQOTUJ+Czs`RPlW%@JSN?=ACB z^A%;_=IM-Us9Lq%rZ84(=Y7fays0$`zqF-wtIG0$qC>o)+^Dad>Xd)khK3+DcqjN| zGM#*edIyC`XEgE75lz@X{21MgPUP>AQlJ5+6+T0}A#4tBK(V$ICD$7_VAxt>^nr^T5K>wqd_^Pp0@($vE89O< zF`u%hV8;jVA-h=&7U)WpLD76*M2L#KCV%fB!`+&0G68EDv9Er;|UHnQ*EkhRh?*^h(an?8eE%4wyaGQoghgZsCp*WY#95jmHR%o*A* zN1cW1t=sCneFqQgH>fp&wvuqb;9-}yhToQZ5xOCL^73+rUaab@{hQc{IxX@4R-2aS zZ7DN!*!cWmgK~z_2Y;i(i2UI>eTIx5k>6){ehhkBDkyr+(Ec&VZ7FbB&hQbr!-kIU zpF2FKUw-aoIWaVC_0jx37q^Pvc4qb)IV5LjehUlQ>ahJyf~GdK)omq4F*(-MPi^&K zA#03PQ>wQ5i%>OH%-+T*(L6PqN=R-ORZ~ev{2fhOra0O|)Kreq28n5X{_xQ;iQ;Sn zo9)kOhU{tsc~DL)%eF?J%lZr+8JnZ2ZE))|IJeJ;7!}=Z;SKF~$*|!uh-qygBIz5u zYKJzk^qJ6z=xGBH58}&mhUSxVX4?;9?a9*d8`0a*@f(rb>i7+PtU33#dVK={GNqA! zTb*74(1_PoUssPcBDU4boAvKTg0}j113^=T+v?a&dru?#wmP?o-;{e>ojSiy?qJMW zcpPkG-d2AeI&A#VVf}OHqQA=ynSV6kwV4*?!?yvmt(-7TYCvo&7kHM|G(AV;_sP$p z;NR#gM7cxq2Iuz6&2P*nNx(+>w(Jo4hBRzW)|OGt$odT%ny=3y)%Wj>Y><3sal?vJ(}*N5iRwEMO7 zIFI3Dn$lV_wDpj0g}kXJ+IsG{LfG8&wq^pYkmd}@%OBl>L3$fg31QIGKONh^#T#yG zh`ISW z{LYo1!}M*9-mTE*568p48GT!0b}RJFDBBvl8!6jLb=ck3u-%ec)NagoP`5R1x1?@L z*Vbs=l5PYh1UXHT9fI2$u3IvQ?Ps8DYq(}gc}_GNa+~?Ptuebb2F*y@8mwbT|1MT- zjn}P^H+6Sg19U5dZTP#bfw>h9%^lv>Sj?nNJ7Fv1u0If}h>j0?%{w5+<2FZLlCNr| z%L=w$m)MBeO3Z^5Q7~?S+R8|!sIBQRqm>~FUt|5=vhk6q7e{OOr-{0)#K6RyRN2r8V553jQn;Q2Ygl!WRXG zctc81cPN4qUjUx~8Y!v|Md2^@7Ml9k911z=FE?@P4}}|whH;mYYQE!8=o7pV-iD!vc*=h%VaMqG^tYDWhb>^LqvCn0(rrqkg?j!Uu6cA1-)=l zwNkX{B5zq)aI&umLEsCm2JrP#5LTr=!mhSft&k6`V)C6T=SbTTtt0a$xgp-rkcy~p z3Ost#y&M7K+oaYB8h!!d3u|`JO%jAQI}U%@mk;_dpf=V3!qy8bi?msM*p3{b^zEfq zqMZY{Hfx}jGU?)AMqzo;X@$Y^kiX2AQ4;K#*()ov*LfLXUx{~upL{}@;15K7;efa7 zw6L!jcN5^q=uGH2te7m8G(Qo39N_e!-_Q#Q8~&R_Z4h1NEvpbx5LOcTUr8coG5s2M z>PtyP@uF*Hw;ue5SZ8jiHg!KjZLlnl<4?jqq5;3XlSEJ8EAX}0#xQ_)GB z&l_kZV+x%yduI|obT)Qr?U0&tcJ53f_c^FZ8N@gjp7d@Ktvd%qsKBeI@t^73 zJ`t)@0e61XiaV}^$lm8UslgprBD{B=Z@S}3n9c|6P$A-%c>%VGP7P6!V@DFL;u1R& zDMAxb>9`PEPGR#Dnsn{ENwnlbCsD_>yG8zQ3XLgL!A`pfPOBIEX>i&j7hyx(V5|I4 zbUIWVn9WYR@B`tIr_h)}*Yj_h?n1l$CzpdlgRShTLXRiKLH0gQvLBt|pxVK*wQF&_ z=fV^R-P;E{(JoGL5Dk%rCGnop6bGHr*GVZ?r#Q%uKW3&lXn9{J+2*G>XxT0izDgl> zjxDlyHl{e}lfKxE{B(+g9@fT36#{9o#q)8BgFO9U1KDpKV^H=G(Xz->Gsd7x&|;s} z$w5_G@AEv^$w6EDIVojBCkLI`-$^N3Iyq=fe<#_}QyrB0z9@6-`vM_nMI1@ybW#`h zQi#kc=gj#I^vIkHZ8}9Ek_MS$gAZq`dow;1=AaL-Kab0Ck`4Y`tSGN3gnaew(>ZVk zeEW$urYj#Hsh`ITP(RPZAMo?G0qW=PmFhQzpi)2Y9{|?ybG))lQV1mV^GO%8pBwrB zCO%ZH*?&x(n52UOceIzatxh4#on>Kvjk#ER+IDT*rO@;jCG+SN$z+g^9nSXnni(>l zqc>Qn%MrvZiENh0)Ii~B-e|DgUr6bjf>z47UG%9N(w;$DDdS_RwJUpu#d8p#{h*fygGo_wu|v|F>e`B z2MiMX;r3QFmjV2AEQ3$f!k;MRM^+h>T43hC;p~vT#)kvAKb0?_TQbYL#-o!Wd}- z`@NS$C+3>I9yon7^0S$9l$SWWR+&7jFoxL>FdLm~I(rD1&CPYTr5k&qPT72>FosHLaBM_p zSXvFKX&7Q!tCC((7$b2OOWXnp8q`@V^LxmEOpBCT7#9fk3x=kmix!qroihGdp$cf; z6HS_tfih6hos!oU6N)36Q}O&3f-vqXYK205yxE4lZ?s` zb*ghZ)jb~Y) zR>wZFb#6>^&jVNDlVpsI7YlO%u}x!eb3KW$=J zHN#uj0Z*b+grZ@hyG7?Dh31Z1Z&6X0DF1`U6Y108rndR`#Ye{x=5vyZ&ALNV*O*c= zl>2E4n@R~l%D@q(j{=Z#4T|V>Qmlc{h9_l!9n>^WI5#1$cQ49TG5r)a6}Q2%>eEEp z0|7jj*udR9J->O{H*kcX3Y1lm!lo>@SYSeKzM1%2EU@8fW*MCtl6~8;Qz%TJs7iU= ztkC3%J=&N&tOq~r(MI8u{3g4QTW8A;c&b)@YZS)v#e>T;(kXktQMhDeJNT+!Yn9N}`WV#wc{Stck|Sv3@Pa>4F@%+(2G9SQ5sD ze|vmjhOCg>^k^bk=;^q|>2ZlaIiv=qgtIx92KVzdu6j>~36Nnex z8rUVCUura1GeNDw55h|gx)@I8<&I=5)ah?clksLulz2m_K~+kS;}>^WmV3698Z_-P zCwX2jHR$^W4o;@RkA0ohF>sWVY_Q`kW%YwX{v`mLa?L0Voz{P-sh)vRpc=lV(6XGLl*v%; zhf$_-EuCybaAqpeLWQgw5uJ8ds~H^fm6iFTeqZ>slHjS)V0qbTmAxqa+6pUWcP{3f z&G=_I+Zy9cf8;XUAl}~_<>j`iK5v-#%SBpwFc6)ne;0YD%3n>gw^fEk-l>t?05Y{) zNMd*%n%W;3?DK{|-Ka@>sQTlaNRWkz$A|XNjPRGRo)g+j(yfPdLq5Er;g?btOPY`9 ziD2@fg`QRsh(xh8nAxpIo);JMDJurbX;fi5IAw-{5r5Pl4D^ZS1d2dujtk-7WU}Db zAZdki`YIQkg|yFtf%DLgncyo9hJAzm0bc}s&6{*}*a;RFN3i_K67W0oNS|=9B2Xl; zcE%DvVR@&Ajhta$BuZQOcZ1F#J+&d=$_R2$^}&aDEVmMdj1r zp$+TSgCF$1aKGr3?wS6`@L-U~gu>_)B2T0}I(6%zDs|74A7McOU!ag^{G?<`lizMh z@@t24`sr31dc)!B7n$fUjt=rog@nV>FxJSzGM_hm_)G#mUr_|Vjlzi{GB?5Z5a$Hi z9N)fCBF0goPs7is_>>Y1iVa>|#nMz^(~S0bTbwN2CgN+6l%{76$*OV29SwU6OMT(YZaoJ1rshkb zd*;YckvFQ}kS!KC{?v)dl!m2>bAKYUKU@N##D_uy<-~DF1)!t%)5a z=Ikt`?)b`lXzg1}D7t43H(d}S>RXgdX7~F?%=+Wh2#dw!bx0nW-Fg)HaBN(-dnV45 z&zTb9(Y=VM>*RLCH5h(E|PJ@v>Tt%&6`p~7EQ1at7i)js?@m_YPE zaWbWaeZ@p~7qr8y(_-Qj4hEy$Gri0yOmyYcWJ>cFP5B3$WD041`~HVf@*=f!12`y0 zCJ~5Jnv5=eLLncfc37z~#}g-X-N-X0XRwqu$~srwyf&JfAtn&<9mW3| zZN9iVaH_qo4mkKdzn!8QCW4f$LN;`5A*?Ib9`0%o))n(*71ou7VcFA1$D#hrF?y6! zH?$a6I>}yNZcz46D`6+cIrcsQgKD&NgVlarz@Us_(zp~W*zHujzpv0=?k(fj#t7A_ z(#wx-p?o%!??2Y`R5s7_Qm+m7Buh3_B%_l0pt93A98ERMiW9T?p<>)PCmDs*5A&&o z&qN!)Cg4sA$FSBct&?(zifenva%k1x|7l zMJb=>=;^gkSa*U212hqepX7CtF)>&Xj!-4aGf*z~2P&ez2wjVs4^R{F6$S%E5xU8O zs+0*Tr4my5O=!Qp4LQU{XREPOyR|U7n%~z36`EF8TiAxwYq6iFvCxw&f{B)1C_p1z z+7hBi_#OD`Le+H*HyvH%#7!rWC~aT~9~X&>RtW!ghK@wTw+3Fp(j}c6D_?^5EHN&=)e5;2gOcu1R|l}WZGuA1Uwv3dPcaVXXN2Hv#__2 z>Nz&ECOXLog?)v7eh~h^m9L>vuh-beHEDh)rB{L0Py4xMfS*%%KYMMeA2GFU3>Y-; zG_mY#tc)-;*jSb`Av5%iR<7LSx z3P$^sg?-+lsUv*806iRsr`2s&IZ3Yhp{L@IpSw^|OwTh1qZD?P`Md#N5mmF0Y*fL& z)y#HW84jfrUp&GLZY#$gl5Vq7>4aXQ=ot!O{oQf4D=SjzM6EKLjw7ODNSx;FEo6R$ zAlnefPJ6K&yy4jy+BiockTwa@!3Ly`X9%aR3W2mukWLLCNbPffZXkMzZwghb-@iXg zxW@SZHFixw!1VuXaWM~y*Vs`Q?%v|+5y2RzZfDAyPz9%MXWaM@zRtAw88)miN_4j9 zH0&IKF}l6a64r-I-QH&<&|!L#<$ab1-9F~(`zFQcwwo#chbri{n{kJS4@bAY{s0xI zPV3KYq1#t1;m@$C+gGfF>h=}OgKpn*^$(F4-S#r&zoI%o?Pc5*(ZkWLzps#LRVUy1 zEp+=W4t;7!g{j+btc2?J8_Uz4lUp=}u8&9OSyh3vBI%ZRg#TR>;JDuz`H0FG^?zsP z+bf-9`zm0N<2(`HK_L?LhImg}(4eW4+m)z=6McoHeF8TTBT;WSO1H6{zfNU4S99T%X-+a^J(FtU zF{o@qjX7*Q%FL6dW25G!Ry^r9^3utgYyNMB@t_!?YBgt7P7AZ1W69rNW11ypHS0Mw z%TL?cipQ^OwBlX1;vi~FE8b&X6RR-V!3saU&t%`v#L33P*{o{tCcAZK8r5s@%y#*#$!83X5LKyUi#o;rMxkZ7XJpWz9~+SS2=XBZ{brw5^7QKlQLco}p)f|Ri=ozuv+)@j zpFA#R&!-mZM-M3;wqUHoWT>nxg)uURK;~%33g6az?w8snX{;DZLgo_#j0~xpLV&AlkjDCXS9DG)7v>xivIKIS|=zw0EW&Z4G$V*gMlx3sn$ZA!wtO zN%j@Oq%uaU$Rb6qQskzCP_2?oX1N(x3PV$F!Ii>r8q3XItgLDj4RWDgy`o*iXa`KR z?6JblM5`Jr+^Q^$_t0(1t}X@-p2`>}csE`bmy_I+d92Zz-b>BL%fl87G&uM? zT<(q1BU~(A>Ll)n^OXCY3egcCX^)-|9~oBMFBsr!Ub9uZ94z5ttGiAO8b@GR3;1TK zliV?%o27QcGHi3xFX0>5q*2SA#5Oj3510DKmYarc;7`vwP1AxsE@V(vk;LV3i>GJE zAjjQK@??h$dJBIH2^nUh7CJkN&=`VfEoFJ#c!E1l%|BxKN{l}<|8A2R40{E;}xpgUGODaAd>pw}M2pqY5o zB!ddnGtVfrEcfJ1GHB=;CwWFqGHCW1)37uLOa_-n{1p=8?fp!jPD#Kt{jYB7W*8)d%YsH|It9+J5V@ls{# z!%lL9eGwW8tJ|R=d(vDaHFsiEsZN8-Tj*ARRl=tqc9NUdM5zFaqW^uwRIfm?_mDHx zregICqd>)-6>K5a2eE%Pi18tIGTp&zLvho|P%)-EWJ7X)sVpZ2ge81jOq6&+*r03` z;|@uiWw~cU*r2=Co5oxP*K5SDV!t2Su$UgwYSdL$%_LJMG~!+o^o5e?`Wj49@tKf< zkp5zgsZ5X+kidt~bjG6^_z+s|e^dh>f~VS{sP1>6TGiy0u&GfpMsRGJPshgWa~?A_ zNQYE)M>=GZaUv$C9jBDq=>EqnePeiJ&(rp1lZ|a>W81cECmY-L1{2%1ZQIGlwrv~l z{Ql4TWxA)YGjrAHu5(v+ow}H7G=zR`np&OA%$97D>UDYILxeJXAdxoDz2uNfq3;g{hI8Y zX-pB;d?-xd@@3XcbdX0oNfmlG=FFKpkEn_w9+6Kj79NpD$LB8Hudq}Lc65}<1AY5N z%v%B0LiAcJayrcM5QgEdt+UTTw z#-tL7RE^L*swd@Dc?mM*J!Q~MA_x0su~wB*D9gIlZpZJ=$VRrk{0P;a=#wBz(pI~g`=tt`p4C2&zPR$~LY3Uv zjS&kPKX#F=g|lK(ZZaj9rEF%2Q434ES49HPh^uq~VUyh1OqVvcV#wCVH{c~Fm9NzK znF8$7Na$OoYA(gjDk;0>5VGtHNA(eI{CFF>&n}_#3uI-m)OP|_(We#|)I*vd!c&m{ z?Ov=pTlvON)S*Ur(gN-C+90+4*tT@)AU!H8)gnQ7avhq0BVxHw*|Glu9;cl%F#l)f zx-3zNF0Y+j&K3@85|y}G8Ir7GZ?u`zdZvP1avdLFUJ-s?%O44AX!~pY@{J?r`B}vi z#;{d6X##mp5?avHDD!xagZ%^G&V#S3YO#b=bhbO#Q}Y>li)!`iI_m_H>@i(=#f||hH?mv#{Q>4Hvk44FB z7-DdrXnt@p*t6&K1f^hc*f#@i$CL3;L6}5S{Y)Ft!CY=zr2QodkxI9{W6%)iH2!{W zP!nOvtT*%Lp9W@cV#i!gn2OdU+zU+y5mb7tW_SN$3M)wt~ zRkd)pUu2%dyHLy>czn6UPFWM&)0DdDx*oujnFrjFy`;@Oc(x$r+~+&-qNaanAjja$ z*?OSZ9uodWMIXQzLD4@+svgfSM6}hzpT_W9>|Q+(qF>hj<2XuUF&df)5{2!2<0p5ggU4!qCzngmZC7iAy)1BpeoTdSv!*n=IYIC=Lw%9=;FfhjS3?o; zR`((D0DY`TXGxwLRJQUnkxEgBZ=>tqM4NgmT8<%M6zRMl*73V8Fs@J#A5a$EGb!u& zowGW?twn$95#eo6uFRa>(}Cu6q=9sEd7UwEj9USpgA#hAVK5xJS-httR_hgS0>3>f ze#(kOjaB3fp`Xg$0&j#jJn|M=_$)*n69aMP?49{lm*DR0{cMCs@agrH78dBOTqY;$ z=`KoLyg5?b)gtcr%Ev~wuT0)19d>2pGW|WlBC9oKzQPx?Zurxge;cdyjJea?1JwVI zv+>{tygYSV6yNgh&+D(IrQzB98Jv7A>ggT4W%%hmc|t9@>4>}IWfwJEY5Sq$8>}}O z9~JNBvGGsit>ZO$-!Gl_F?-eq1wzliPYL+?y%8JoSFP%qj7?ghMaGdnUQopn-!-GJIo2SL%996Bb!z-zq*G;71u)FN?uukcLAj2duheJ+m& zCLtB6S4tC)9ekpXK&#q+UF`(5ey*pQUxkK|@flynnvdV;>Jrv@Zb>zRO4_#H^D)xz z`}*7OyHd+%PZTeP2aL^YrQDUN^U-UJ@r_>>fY|QXFPN2l9dEcj*HJo5G)~7oB_nf~VWuWdlOP9WDL2 z@7)js!eX4ru;NZXXKS}HPPvn~^Tb?_xMu4J`$clJa$-p4lqeT7lR>hW4W!HI2rNvsE|xQ&_X>rX^1w zOQ9@(E|dKB$G8NwvV)?P>kS-g+YSS9r^Fb}?}eDTtu(UzX^Q8-Pgu)yzQQOvXC?RZ zwzA-ju=cX#nYSlRcwycY zTLqbS(trCe+m`U}RxT0Vtl#t)ifieA>qefuyz1)!!=C|%hus2+&?<{|Ip(5=7#fH7 zes1yFerICz_F|I)s(JOf7#v1=Vw+%ze>7A0C$H{*rcm-)VJp>}Lw8NkfX7Souk{Qb zEF+3B@!T>OOKWw;^~!%tp{H~rq3s}aBJuul7{i%e;lPNqxu|B5S|d3#qYw$zm%9ma zE1FFZ;BuCERG$*=I^@fr?5F*f^f$#N7P+pgPZ{YzjHapYByXuMrca%c-$OvYA=$!4 z=<4?1kE&LebE62-BOrCIy&AS97`bARYV5xtptY51)0)^y*!hoZg~+m^w72olHpiuc zbF-4L!-+3#CcxEb(|OFltu6FxJl|Scd4K^@fj8r+dyz$UytaW{^9&`sMq)U5FrV^) z7~!P)e@XYn!p@I$s$uDN`gZX#xM9zvnOq_kc0`^JF+{%sLJTyctw1v> z$h9V7XKc>Udp#CNSCAAIJ%W5XhKhkT#1R<4<|sO%lG1ri|EFBDj83Y?|F$TpkqU`_ zIpfR~sVJm+*Nt0e8ptdq5NzsP(5JrDPh8o33KblzdD6~726dwlxp33s>O=sG7tN<{ z3d=@U$=ygcr$er)VxTzZ+U?|uv*uUBbT+Q~^P~b94uQg*sbhiYF;&W9jzIluE;jy4 zThfbBLWng3mDTZEyXL&hP+e%zV-?6bS1Kdc9)iw3+Jw0G z4wXi}zfSWy&W!yuHGBT#&S69!L6EM(EWo*SQ4uZRG5M^NfbX}}(IcS*--@T>xf5uM ziY3C68H(YzkVv)dcrt>U=$z`TD;xpr(+%iOV|UD^&3lglx1975ruV4* z?l=8Jr$2|f_`;S=hMj{U>JYW;0~t6|C0r|0mn~lf@*&vmd%#Q_K-o7}jE6GYfA@Wb z5r+VbdY$20usExS+HS&;8&J?M%gH@;86 z*57bXGxLq7xi=nw=BJhJkJ!)@Cu~qaDLS06n^mk0|BPo;{$Sz{bN?(C_}4;yE8Y9D zEV5fGBy*5L#K4@e(J1VYvWvQb>^Bg{UiF1sIh6TFB&}ygeDN$!dJ9$X4C~a#DuJPy z&oA+zyGasL8&7v~tA%aY&T7?8duBKRvu_djHEcv}iF2Q<&Mj*trCoT?6E)oDBY*DQ zoa1yR&u+7pFD~^4qtxNLn|dxCvn?$u)3x!xX2Z47;@}9An7twHYJcJYQHRyB0nI+d5HIp`k@-o2!PZw$*ZWKI3|n*^mwSi{L?&#ES-u0h zBv+{c<~OhE)}Lrd`lC2cVu1#4p`V{%RJ+U9sZp0I7+7)PP@nnA<_K1Z9E+l-s|}p^ z{PsLo{Aj|M?b>~~4!a0@{di94t+7m;Vmw7%qKJO7dz6=?XX?Z^*0^_WZ$;^s)14d= zx&02M9k%`W_*&JYtJl}CP}tI;25BlVvn>*Y@N64Z)3unPJA4ikGBcVlpgw;KMc8&WCkqSgFtsZfIlV>|g+bTbA8!xF5I!PIB z|8ibwKeNLcEK?o7X_nXGXu?3fboC6(@5()SEa@0!v#b|fPpZ8i5rTxs$*A|N7mUe) zzl0|qE}!|)Q&SmQt{OMOkJinY-GK-V$5$Yj2a`8b&a9Gmop`gsD+CDuuNAt^c1VRD zi-ELM4NU1q3}#G+4I;~9);*wuMn{GlY&bk*p5)_?&B5GI4M9sGpD!?LqwpEgp~ezD z=_a-o9XsGz7d_Q%Nq2cIJ$GY!;AuRz|Mad^P_sH$Y1{6$E-!otq~6J+G|LFr1>voO zj3IzR%fH!KO%(?ZFNG{3p5ER49LKg}+H{MKuqMcf6_On1)F%AkntB=zp*&bfR{>Cp zIK!@TdnXFzX;JN3PMvYvMZjl4e1mkqAHxuY}u{2N9R`@M6W)_20)2c_BV@ZKSn>zKG`jk&)m6u zN`^W^u>FT+p9rH!eX?QCYt)!#ugA2{!+lyW=n=`95vR(svlubYL##O!uXR+kbLc|K zCZhn6x&Qx@SUas5`q3NK8*e#*ei2&J^LpJxN0IytzCnT&!{oIQQtgQ=#S0f8DN1|d z?HS};-cPn@q|qTk=r?VXJN#F=RD!>V@ql!KMgKP{TrrQ;t;YUlBm7sVL0l+rwM@|S5h(Vhzjk3AWP!sX;cpBC{1HH#Zr4}sor^nKOGOKai8kv#@@P+a) zxaUcsRxD)DtK|6B9$mP!nJjyw!N@bU7JMz`Yko++=9^7fp*Y38s(%P%6E|6$Tf1| zK;WpJ|Dg3i{7}VJ{Q~p0(oljaa&IE@KDw92GxU4=2S!|%Ww@Znnu6J_b*kY^AgGS< zHq%h9WtG0c?FZvfE`dT0$6{{#t6DwEtaXIhjY{B`OI^f8iaaZYk$)18$ik-6yGkHk z&kDdM$yl3lF_+I$p<0OJ!YSf7unc_CpmP9AncNdp)Pyf{EErVhK_T1n@MAxQR;MLK z_jzH6&hcJS02o^WJ74R2^a66~Eye zAaz!Z$VMA|4=d$3KM9J!4mDVus!4N+!M&x5nE)-lf0KH`H!6Ciw5^g~{h+7i5-h}%=i;hZ``gu(Q2~ig6>?Bf zWWqRLDeYs{6;~eCoMGc0!Eoy&$G4A32mSy79Nddov0Pa*nt#ZOaZ9Uj>x_5hVF~(a zNhOgwOs&>U569Y5di<;kZLjL#>{lyv@r1e@HI~l~VyDkBEsGVq<0XnPi+nS~YM8LU z%KG029%5D4UrK4fs=g__7$G4ZYYYp3fd_pu9X{9~&4?R1O%}k`kudSz9qKXfFji{F zR0K%3XWYZtyYcZxZq6Xc0IFf)e3p}&fAB?40R;8zx$`v~J>@ zTe_h7UJT(ptd zYBk>319JZ?z}x&#_{b^2axnI-?O?A&u(Z(DACedEPj}=RQGAj2k13X_p!cM~O^OJ@b2&XCBhmC*W^c3-pg5gpo4dMm~{6d`xMbvv?wq70%hSwrY&EPr^i3cXf?An zp((6y0o+v+j&KbdzC{tG`>`YrOTy4m6gCG(gLR|VmZToZ=SMLvAiJD&oseKsH4tKq zIes7b)Y*JfqGF>sSrXSn1ou|Rhxxcg@~J0@w`&dEf4GZdLSkoh*BX3}#$y!6h_6tv zXSD#Maoqc_cz+ty(q!ipod>Hrr0+aLJ87VB4bX_^Q3IyO-CvOu5URW+@)|wr+Y4uh ze!YR)*Ejz{6-w;}(b4`3AI$#O>VHt{1G=J-YxhHc7ojr`?{Ja*uXf@Y8<2$0{?|aS zb{MDE(WX_?$SE}YfgSnx=n57b`FBecQ&n!7LV z2RKn0DH*g9J3v5-fZl&>p`95u-zEa=hy@sfkV~xxa`^%ngI7Jka@x@(!{*1CUVrzJ z|2veLZ)(W}Jow=k4g9UCc#Q$tMKv6Y*LJHtkC$#TbYDNxe)Gb1^`Iji)bf>wMy}7|S zBE*&xd><+yhx9-IU?kqNrWPCQAxr(gjvnC7lre)HNl)KA+C^!p&bHZ_h{gF&rqNJq zYtalTLN`9uISYW{3jLfv4RTb=sp?KMiKuySr54D*z~{O@A4F~@Y>}|m=x6IxFkbs@ z(qs^}606rD6OwJBqj(|w)3Clpe<)shus?F$q+(ZoGM!}L73-7g-6{tQIc%n+~tvc?NrDOvoH-X#m zj7H%%x5BK^4 ?h7{NkR>-NvLx3e;?BzEU#Rq|3?MHZB=u_>OGuszl6m zRylVF`Pda7 zOQ3xys8w<}U3nKYU7q{|Z0}o9V@{Se35CAflKjwGveLSFCv#(weJmb1N^n@}J9Rl{ ziJUuKGRqf;$q6XqjryNJy^f9?o$WTPWgb8~j$En*pi|)gsYURYMQ_yVscOxsR~sO*(mVO3fWkS;e{fOQ;P7VS~^zrcf-}Vsm)6v7N6D$ zpBiL)6%?Ddg^xl7z9QuQ;k&68=`fo2_C}o&Pio)QT6rox1=z1{yF0fgtp|EviZ? zbz*6!nyzcZPR^1?u;|23m35K-kf=K9_E0d5^}RK=;h=z%>oYNvny+ic?=+hI^V%R@ zqeTk&SXlD!eGD3D0~#C24=$l$%f70F1N})EhDHqYff1;?g>K<8b;=-mez~2L2D?;9 z-h8dFvm)_Kc2zHtP0O&7r%){ACh<-lRj)yU@kP(flW;`o7>P78-kY7J;kYZ)L^2*+1jj&xX^?a+x(Lz_p$ip zYPMtK;ZBCgZB$4xupVONM~jgJKcAHAs--Ogf7N(RDFuk*Tw}VNi9W^2nknAsZGf5Xlra zzD}(awvFYJk;zOeXNv-zvSKQ*Bsv?JHt@>2Mu#r8DHTW(-8FYaiSGx&s4lt-pK*m4 za%T*?L3dwxude|sY+n8l-W*R_%h03R<9B^4PvEdNj~~o;*QFK)=Xm%@vIy>`{Am-y zjv4YxZ9}Y4oFm>awDWx;>s%2!iIn}9N)uTQi6tRNi?scle#yC|U#iedxPp4X52R!HWVJVq_kCa6D0?%(dDj;E_uE4;I?4_ei zXoK;75k4Xt(3uzMcR`!ZcI|?$h{3JtJkpeV3I3b?fxd`Ql8&6Mg z5>phk@&`^sB(UYZi@YKrgO*7_yDvDbm%hrGPN)#JGYpY!b%d~M=1f21gAI10u!E0p zA^LA%G~D=8rBWyt!GN0%hD;umN>11{Oa(|1xB-sepE)C7@S@GZJ3;eTnI8mn^;AXYpho+e)6)H{KtSFWoDDv4YfXzBNJ0Ys5qE^bNxKGh>6(dCWh)3=T z=RaHu^b>(PL5T1Yd8E&Jd9=__UP`3<$+=J))l7cWek1IDx6+G{ z8a68nUOd>XMoueL$brfuMq}TARVQO}QG_UgU56$>B-tI)*v8N>n<#5Iz8)LGm@DVN zgbGo)kVtGQj6eLB=6_2pd&;dXTQ*1_(cRRrmyb;75$=IJRU#M&(u|EM>vwJ|db49gbUDQ6-FJ!M<$~+V|ri zLZE>0EJ(~VXsu|Wz(WQGKT#rYf^)!c9s&;y|O4@Ai; z{|K1VAx%@IDsQz=LHJ=hdq87out}k5{30-7Fl8LI!oA0FqlCsh^1TN4`5UM;HMnl; zLd;h^j_zX=j}YM}e+=(D*w$KS02Q=fQWtm5L~R(iSF<>;82FqNe{2rvi@8kdXhuiX zH!$Ko`I0I0!wwrRVeaOseCJ`Sl2-QxUx&1+Tt#JLnj&!KjBZa2m5!OghTbNeVZ4-~+=^Mvh`o!{sB@PBZ>V8d8N^3WnT3KDx~HVx@~ zRb2hdN4#LMcKDaFZ(hYA=Ce$c< zeRTBeV)3KR%rXR+i`}M)C@>yPd#_tqT_C-H_g#h?da`p{IqUz@_b?)w3 z@OCfyY3o-027`9&0{ByO7Sn@r7t2FnQJ@XP-Nl|yIn{5p50J<2A66W%I7M%ggrzF~ zDm!|yv7SQMvYa67hBq2E0scNe~k0zB04T4v-=m~`zd6|bE_{1xoy%=k<%zA5h!I| zqXs0Edw(&F29Epv4*<)3jnm3|z=3n~oKp6tD!b@L2ft>nW4-6ywr4N9W=t!Tsd z-YNFT9{M(WSpH=cu3UpysqzWY7rsbtGNVlxtMVzIT=9l?z0`Kv+u;IjK;hahq)?W; zyaA^i%OGyG?*LT9-ExrlGzJ8zejb{$YyU_m;DO7M^j(E;RP}S}`Og&m^}Mhw^3j}^ z%3;P01W)%XzAERg_idsw;Y!)~_Fue;%<8Btw4aiyd`DZueU4#l1TOwJB6mE$&k%al zyZk!#I;;MZY4y+0*0%}{Hx=>kvS+JnRb}6P0)`^(CNlYE?5cEKMYtGZ4__r$2(*B# zH4X%cbe?&YwHoNWFE&L#?WS^m-E}r*9k4w zSeAcLQ_DQMQFg?j24t0gL&Q3Z_B;_vreegqUrR0dNPt&9%nXmRVtke|FdyKs56wblgjo1)))A}6B~bk{iiU+=s%_{1eUx^UBO%1}>!FDkb4 zemBV4z%5@W$V43Zw*3ZP^)rh^55xDy_XYME7W5r*)(@CF#wP4ATux(HZJG zt2Irk-yh!C7Wjn?!21MRk=d2WSS_Ls1knrpImYbym)CPF5qT$S@OeSvPu;na1(UZQl>~h-V%%-KBG*CIQhxu(=>Gu z!?tSI@bftPQ~xfmMQMTZdr(^Y#hU;9!p1%5S?{vE`iG8ne}sAj&81t?O2l3KecXM-r~X zu8#X@y3n-4$S-A?#yaJ2v(1m}_DV;JzO>I`yR*TC^xS*T=xAywsoBU^Hh-2v{M110 zR3AsBXhfrE6x>^^5)`KMrfW3m+QH;R@jhZ7{%JxqhWfB0@}Y14r2eHdHHFxKS|Rj- zo1#QQr(D$(WteHpBn(1f*l6zCS3aJ;C5GaT46t)=7T;;#RqPT75lUmR|2(A3cGlaa z>yQ}^YQSZWVH;GB*&6e|hsJqFuU!%1YWWrd{Hj%!%RZ-4rGy$R34X)O`ll7_#M7MpY}6ph{#oC-I2{OB-~hcD(`(M*xv)7+ac~_S zzDk(~f}|QW1{=rL)-s)HLu{ud3zsv(K~aj8bL-AYzmUG(OiacQr7%Rb z#{i(|RiTRHE#O^lnS267a=adi>(C)=TD>`OHq3VIDM;E^*K+-W2#4(#oIQ~x_tr1W9)e9nayZ90xo@8Sl3v43D zM7?_sUvW|XHT(RjH*(#N4n8{PPlP)-;z35@pzko~-8)b=Hb&u!39{5tVlX!1Ahz&8 z-{k6eh+u2SD7KF|`~+gfOz2T^h695hzhEuy6USL9GA;JCTiDi5{uSI~+GnIq^AUu> zp05~-M<73;^o^%&Hd-7E3$WE6#+PoQ@9D#&TMLNczD=sDgxs`t(@T(HR>Ywx%1G;f zLjC45D8`!(rGUQJGnsgwFEJ!QX1<(MTQ^-Z1Loa&hQ+D+u)6Z4@nZZ}?Yjnit(kFi z4yD!axT*a*6G-|bt4^+LZzVjgVuL&~)tEqA%>hU*lg?HS{V`eZ#!<`x7-0OD&?wv9LVp`n(^h{Mme z>D`vM-}m$T6DMoOIwE)&QAn&1lt|4mw6);g5!s7DTL$dSw_Hj0A`eh5!8TDv}Jw}g6A~O8i)D>s}d}*i484vf37G?cp4_=LT zxk57peGgtTZ}d$TJ-{K1NVJSQw1BO?2Rwb1&v(mt1prwW-ct#WfeCh?1$YL_V)%Qk zP(rZHmmW3BVovO-@!PrV+h@2?xZzyF;|xU9ErjpI6>$JG?cqXtldibPb0NHhsS|#OHUY z^`9pQx9pAcTQ0uio{ny1)mFb>Jl5uli)06sUM5;)%rIPH^O@dd=4nXh$QUI-vPgs2 z63y3*;}eIln(AALTX)q)+ONZz_qpg)#dQz|eL$;P=^-g7DEhBmlHYlrCCjJ0{XY6G zyN)-!wvIQPrggL5c?h*x!fV|~SOId2)_wd)$L{y^toHdgo4+YRFe7^Cp7~4hfO+4^ zDVhw}DmrwOP(Z%hH@^?eHfp&;C}AZ6rPnq89$GyJ+g)dLv%%DaeD*-jWmyUo(p)kW z)hXi@V8#1+Oy2HW!+BGFgi!m!8XK9-+jV~MpV08J{H{8T|3&ele)N?QJQ>K!XPXOC z!k;k@=QDTE?KDyB5i@a(arusU6(_hw&-KK}8XMx(bMg%WzR5sNvy}1^QMD_#OvRnn**DYex)4s*ub_j9wLl_Ip%M$s zi+{6NKlYy^%KsehH!-}?$9v!s8u#TAyuay-ka^v$0%j`?!FcNN?OZc8fUKe_A9)^}V; z(2vsNo#s|aRFc`Y90|p6&CM~PhFjDoOWG5h<&-p`rQgbkssY~-;bXs+zxG(zh9G}8GgGX3ShZZ4vf-XScEwA z_*BE5g?y->cUQoY2|2ZQcXjN?J~_LQEhbf7%dpF2@>uL0=r5ZkWQDC#jv90!X?X2{ zKs1vvp^&*2q2R?C=Myi?HzC3r$*}is>sS3S1D~_ADg6=A#-5|Y0OAMrpka{loK8d# zKU&hEyi#br{XLVGotlv`N@9|s^u6pEzpA^PHTvQ2`r?FqIri3r|6KwaCLsL1Jdt=J z_vB2%eP&iNulqRi4P`>crEv7~FIut8;B@SoXZswR!c_KwxBFu6HLxP5~z}U!qXcR^rO?Pnj&2?i{t}Z3%MjxJ>$+YJ#N62h0C*%*jWzKiRG;Y{2 zhfRZ^PBr`pPfaH$(bM>Km^XBpfMA!&VHD$tAH3O(0);~^T&;SEa$sdynNRn z$#e&rgS;_qHdl9{zhN-Vp1cUmkr+LB9 z1D-3O5 zxrRUn?7`X3USgY|(1er*YEX>iKVhqmWLZ~tWZ!cc7qW7xE9(i8H=`#%?0tcPGQC>E z|L`kvoY)|VE-$d94q<#1DTg_k-d(4(29yV=CVeHAb2=y5b8Q}`Wk@`}wBLntCxD~| z-W`K@zjmK8V|sN*tEO}B^p3*TsfnyoaTDw;#HdiKA^h^Z3z5ranB5c zA9pcM{$r+ifm}<6qMYl3qEM|?zmn~R-Z>{g(R{$_7a3qB4WI|sKd!mwu$1bU3h%Q{ zjqZF#=S&Xz{np-|USo7vV>Azead*4(Rva9{3av_7@JCf>#BVi9Now}VcfujFMT`9fg- zFU*|m{-J`2A1Xfz?BO+f#bYHo-~*SxtZuLgqLTn2Ks6Cxy3x#+QL2qiy+w+rIxUa{ z!;OX}&m{Uw7mK<}Q~9n4K-rUD3OL_^CfE5S!T*h?w;O~3uqY`U{b08hM_cUd3nwg_ z&JEU6g1hW#M)%X0flBKb4<&?Cc+~))s7ZdY3_R)qP@;7rezvG{?1EcdDoWNZHbk~l zg`gx?Rsq^);mJ3`{4TET`@haD`yQ1;fY*v2C(P9q-wJC!ReIL>+}Q+|KlWjRavO|s zEkaqDZ~6SZ-+)oN%PO%nP|4@r&N%rQnDz&C7&`NIsn)~FH$I>ZvlxS~=*_IkACKil zg*I~C6NAq@&;|Ty$N&6xnKK&TqH-^PekZr`39Ks)Y&h9J>Q2;wN^36Uw)TWu1q-nSYIcmDjWZ=y4bG-VHLd z>_e)s@3*q6zuihg^&*24uyqW>e9@DPd+O}-%^%NRGN-SNT~Cai&OzeGLPcG%4;+9B zhQuMJWc!F$#Bku)?KQK?yE1=>Fth5Ly|fofVmO_6#&KyW_{XCSV?(mddc@NG)nGwu70t(dqy9#0p;Y~Sy^#pkeQwq*c2?vd~#M=2%R6JMWe z2p2qdKW7>DQJJb9_;Ka}PkHAi3*J0GUVjPDdf0JYkzSS7D+Ne3S{4ZKl^N4$A)n1e z=5#6iOXj%~ZJZrQlH(A%5hW4Dp{4XUXe>}2i>*D}rd2xMLdGSM)-!IpqU|Gm9E>=F z^}lxvwx|DQIcx3qOUWa9PWgRZnsRf8VyI8QLO?}G&+$Ym_zCHVc;+MG-BlR+<_pI< zg#2@Z9Jl9d2EG+%Ckz>uh+AJt@E{ENB5b=WQk*%gdW*#I&sb-Qm4OObMrMlC^HDD_ z?a#m{N~O%CeCr%a;RG$ca*O?+Revn#4=X8#+K(eNZ?hLY>}~n@#cB`0$aliR(mx3V zVjujdc1==J@#L=HT!mb8)2UDH(LBvok;IAu*;8h$$a zK43d=<$NBXFz$in4huGm}K_pQavNcY7*g%$I={MrS%o8YcMo}9g0Dj-HLnDYJ&c7MjsxUR6Z0y zy-|W1%6Vs#`oQ{5AIy>MFJzYf;M`-?{^0y#Rq3oR9EVD{GV5YbUbxgh3{tIG6xx(8 z&s2Eyq*cLJIt+?r;4xfqQRmzpUAD@z^-V&d^Tu1x#VnS&>o!eCkfsQ(5~K?^;731y zClOU;OHqJbzi%I`&4H0U<_tDWwF@mI+%xGfY)8Xc8$6lDMSehlT?_!7r6&m1WTEsE zX0h-AT`zX&%cbZj3R?Q*Bcga4H*82UJD(OLh82WicNDEISckLIr-U2%?OlK_Hr=;T z?nd=z8HXd(e5aCbh&X6imV=Q`!1vvdGB`t;ZI*cfL)sy?dR+x(Kcnc9PV#o_O1h}E zdF^^q%Xu#)l>LJ&Z-mo%33MZ+LV7Gj-bZ=EYBOVRpe_dUN=9IFbV?Qxty zL@lVOkqJo9of0K&Kd#+BqKoAh2)h1icWrco>7JPNfEUIaF{czJKFaK76Rw=r_QBH!*i-OSV43_BFYXUXs%Ee_M257iG7kov>qaP3kOV-yAiFp8~2Xh1HZyYDju9z^)#ifhZ}(z4sd6jZ)G_FYSP>6N6}P z`jyRct1O9Rr;k;W2A@>F4b-<9sirjFjdvz9@GbH6l!A&UsC$@r>`#|@s>~bq0}6eW z!yrP!$cPp9cvdW@L!gWg?o(R{XW8p3q`}2}=LhmKB z9ggdvhVFI*%REzGqNJET1fiMx5)b$8R|uNvLzGpIvTV83n7OOo{K1chI?3G41$zEL zjDou{8k#|;hJjFEkN=FUUmk4cJ$UmN?`g75c51O^lCwXl{a6a}QLOL(hDDakhE}8^W%q+ zGxndkifa{tS9JKIgz=@60s595IM`cV+k9eKL^H|9d%pdnMpN$#+vmH+S}n{ z1Go%J_8enDn10+MY*qbTS<=Gn`tdtjd4N*;Hicz(#ciwNFVZ@Tk-gXC7|((i=HaNLqgu?u<2srEOARG50=0%VQIOnl-hK?V}Geo{-b(K@b*)#|pn9r>G z_T^*e>xR$>_so@UB z|FS1%oLuuq!)sCDG{`=2$ShoeQO9&aP~$XsgpU+bl`DOPEnsleC)Ht>3g4(m?YL#$ z?H)Xc4z($k4&QKNcqSYAT%Se?ceK5lmMMn-FPiGpM_+YgU1h&-t3S3p6JO1&BumNz zr~Rh*^cgvBQb-6SADg*0Du!8#k9ywJ{3o_T)bA=8E|6oGo0pZpl%LhKxB(^00(I0`7XTD#7Ipcz^h*rXP-u`h5o)MISUXflf*tk(vAGQR?^55#cSCD#hi{+3W|0e;tlWP+Uf22?^J0Qk|Le^GxYP~7Iy?1(!}4=oP!OdF0YeO`zC%* zIC!B}!}g=rj5CONXFD>92KC}+ntcc2czQF%3UA0?lmW20_NModzSUDj&x|=h#uAHaxeVBu{HoR%y(JXs z&rGE>8<)6`u}hx`cZ77w{T=8iL({+~G}86ugI0F}9DIt8s86kZI(PT*Ghsnh?1OfH zUa_@EWK&V@_4NL>iDB2-u&W5gX^MhcCLj^L0tsC3L1`->&SIzr+kTtzO2bc+sr9at zZ{)EI(p`7`+Y(tupem3%NILa`PTABs_=^?qrr94sbE{WI-q9EJI0Fxr%ru3_hsj$K zb~&ZJ7m46B=<{FeXO2X;IX}}GdbD%@k`l%OE%s>;L2@2xEU-vS6r###S4dk7CCZg_ zoR`Mtpr4uK;kQINS3TYzMX2&8wY0NQQRi%8ytdG2E`_ln($a$$Bs$C<8SFMCr43#> z(qS0!*1sD*l&tlpU{nsn66Cn#l@X+(q;kts`SvqqR}u}^a8Tz>ht{-kca8xcn~uLc zI3-a=|3N_s=?TVa|I=lF=jYI#XT*9dJK5Gi^(~By{myzBQHQ+iQPvh$$!$P<5El6| zh$njZLcSWarOcqGoU^6Q%l2;U|7BE1F6aU~GzN}|xR<`4TkgTn78RQPEJ6h#e2&)rOo@Ebzm(ctSvz}W>QKUZq zgmgf&#P(0V-aa18zE&_rs+`*UCsk*|+^>R$ALO|KJr&5@@@P-QB%))|u(A*O!^SG}3n8rYJ(@{UZU{f@M^*IR89o39PD&L$<_h$Hs{h-u(q?#>d^y4cx z#_0K-00(W_TmhxEE*QtzP^8Z-tqTkibC*d$$Q!U5*e3*jkt%qt|;5eh&3GYg? zA4rOg9#(g6wG;Mpp)WmJ?S$`$$a+bUXBs#@u6DwKQgn!Y8svF`DSbMR{1>-U}EOL2NeikZ!2R7-buW>?; z)cdQX2)U~+T;qiIT`s6Qy2c6nj&ea=M~xFgqm&KK5bkp&#ag{eMV#YcNGMaBN-I2i zGql^VbP6JV4~@c>lN1j=@Q?;?yQ0G{8s*~Ku9&%fluN&XYF)6!Ce;lObuG?z=?nU# z{nI7YLzYmlA}TcfUyxZ3^jr6J7l5Np!)GG@7qfy=7fCzWd_}`0g0d0yDG5 ze3Myl6-SLjpEUMeS8=0w9CWQ}6f>K@u~AvXK)o~-l~gwZ&Z&ou6`Yvq9Q#c;ar96? zfmza6ucUgTID#%#jbdi4z0r}>OWk-Y5~uxS2VD{~wBi}*W0O5pTB4QWc`lvZVrVMU z2nZ{gjm}NY$rG)VX&rpOtSObxQE|PkxFyw{V)nkizCLL#JD*^+CKljb(`1$_5l>+c76);-KieTqZ6Mno)N63oFG^&2qry- z?|JsX8X`V2ULj~tXBIZ~&Y6?ULcIu{GR_X5BbNs_zZ6y8IUZHcwqqV4&HFzE>HJcJ zRQeqkjGCWK<@3oNFwQSU;|q}UOW70y2xNX9E-XD^O9hPjt_#1+k7e0B^q1bWr2@{v zvhlA7nxBtlG<@(kP>Pz4+{Xpu>K`w|gYC;pAJ|d>bM`@n#?8XAo-Eu*Y!~h0!Y_%y zjU;+IReA!=FduFvhSmEb1LhE0^?uj}luw`RghsJJtE5JM-7%A$aN2%q`M9$Tfyice zC;d(XKzVMm6J|-3Zb^;)x@D7{@VQxaw_bI(R7G#->`Kp`CD6 zM$qwA%}-{-q7j|33h?jm0%}5yNpvjyd1$DY`u_j3wS!)D$_VVjW&5+&oH9b|tW)UA z?@%+lcTNUQB@v(R?*h6RLMJPy(Qh{#`8^jv`ASq;nomlqexKzUZV1Y6p6rA^Aug3v zG2Nt?o}BE20U;jx9R;}VqsdNK@;w*SZJ+FfkG|)EvAZWb0mhacipx5*+yMu6_jct| z6bZ5uco;*Yv~b{eRZFbtSN{XZ(GHI6-jo*)jA?aWy`J|{_QY1}c(sC)fSyCh&&ZL*6=yOSt zbaENfek>Y!Bt_aOLQ6~8GD-2E{YUzHS*i3ynzWPjA_#6Ch4atfW9a%K1VhX{Ka`aX zX5dFIeF0pSO5>NXc|x3EjlNmZ)<#M3Ew(Jk$ZN(ndSKX*S3NP&n@{JvGx1-5@yl%$ zVDuLXA!mmnY5CxK6E*tu&N6iBl_=qa>?9aITos_E29?`Nb7xA5z;gh*%g{~BeypP4 zu%V2bHD~t;GJg+9Q?E&C^h-2TF#_wEwaA7rB)s#!Z__S@%0&@H4;V3Ru*7JvP)m6I zIztPKEO!X>Nh7-?MV&IhjXn5ZH%3;<#?neH_yI%vousB(DyrGkQngvVMyd0Hq&lMA z{||^T>cfyUcGM3UnBM3yKj8rL?KV?DC78z2FiYC|$&ajd=L6g_0>jYN((o<%EOHCS zbq9v^Tcq|glG5&m0{VoXx}XjN`px(U#`K||VgwtRN>7X?lgHvhotM^Tk*7DCP4;l1 zq4<0~y!0=rN~I_Ivf1d|bT&_F;A@4a@B$hA!$5{)HXG=fm*`4$D3)1;EUFDz9#xi3 zD&h$Faq(SLoXxi3TT{vQe6oXi!o%)Bn2_G71}yXajNs4N{EWQNRpxT|2h(U|E7r!pwn zr8f@m;VbFXqQjtFeNUq65M04$(^(j|>*F$L6z6DM^WSVFRMpbL#wOCtr5bzt$I9a{ z!t=}(7eVtSMM@1%3s+0g!;&J&$)qh(R3j}Ssg_B;Qa2a!hLc&mzm`h(;0Eto*?kLAIqL9lr_6SfN|wp%K(1DeKPC6>S(Gr!n6TqC${1LxCfhuFS=dzpK@^G=4RadFUrB0 zg7FyEoqvJvAVu>KtTi!!I244}f67o~VZ+aH6E5i+Pd?3 zlrTNf)k~hCL?qy55j-kXPn&0DrPI z#a#0eT^iFofJbdi&B=VSH$^Wha*8%}W+%bN4!cJ-C-cHbiDEmovWP9&DeY0J7~d&w zkLbo2N)+2?1#Ecq7tJT~y}60L1*tr~d1Z{54={6=ZZ(Z7n(FLHbp026`82;Y`OVFF z(mnZ9Pw%(4=SgRi-rjC{W%`@&p%$zVy3RLovL@fkl}~5>JI+`(k?|yYbL4?Vf)6+l z$5*1GBOB;R<`0`NF_&(qECR?S0G5_G@Rjsa${I=>nw#6}O)0K-Vky--x2RqqJr5l? zn#{LwEK8;50j#Waz?iONPiKB^;fOlmz}8&n+>Y!7tb-ksO?Tnwz^?@m0pRnmukFib zd(smFWcDP$L)$9wh2v~zG7q!{wMH&;#**EcbT*NtH_4?!5l^Z+neL^SRK&rZA_-#5 z0c_Z&du$`dBysuQNPz5Y3+Sw2A`}28Nz_ zFiXTMur(h zH#<5okAojScex-xrvqN2MpsU8VUT#8GWY%51vPUz8sH6*aOE#B+m-0dNkQ_LE~shm zO7|oWg}017J1gL3EXiPJ?xHF?D37a_O$M$gfBP%ET$xMeJMrp7PD;3}^3F8eWGo9HCyi+#xJHrWC9m-=>8zzM&{2RBdSGZ?YQ1EnZ^ z_3u$Jw$LDz?D{?W>bMoi+YTG4?Dvg`5uU*|;XNwKQqe3d!ai71hOJ$Vg^s7(PWbI% z?8UPrtpb2EO2)p6!MkpY+X*ib>lbb(eEM5v{ajLH9V)G>ZF0gqHwMA)HaX#kzhkBY zB^9PgO-{HTnQUXLJCP4~TN9Z~s;4st12Uj~*33<)K$Ple#U0t!vgdbHzy`P4ux_OT zT&U^5eZn@%Ol!i2JZj3ur)){B{YGgwIn~}i@7Z>hVKn!9T%ZK*B7x_7l)znO*yHH^ z@C7}fI?&7U2fiT660Zx!4WOaXKlW0Y;d23ue?la`DJd~5p|iim$WZy~CMRrtri`rh zMOodnCMUe_bHUg|6TU9r)#QX<_+3!f+vJ3E{AlXFCMVo1tvwVnb9o&^1_^70WFCmxup zOtYMHA=8{q+~omW0(H)T6(i8B3CyBZ&L+l3F-!fnas-9|?-4E-?-SVzBqjb!iT{Kn z@XP^?)c7nL>Fg0?q`gPjjFg-vMjD)^jPxsMO|_0jx^x5?>9;Lnqzmy6G}8K(Vk5Ps zI-1D?*-3|_z4N9GW2tLN_aj?Xl)iQZM(K-Mm6@(3ZD3sAvt@w6Yz|yc<{4^r!MH&z zL>t{eT!#b^%Q$$hi~`ym_!qIBA9TUEFcu=~ZN&N(vW{D!3U8;vGecP4>hUOk0?l?% zkb?nHVsua`gE!oa(YYKz8?K374JqhtIEl%_+%_HuJun^ToR+W)YG%)dKOsl;k(hx$ zW3OI$B;J-qR5_S|UNA3$(aH5Zt(0eB-CYrM6PSh6SQG)99vV&NgXx~xI5R=L;JZUo zLvYUN05}HQxi{*9(LKVR>gfbH1|76C=AuatGNZE;!BJBZ#XSQpl>=8+kw#LwAw()BFcQg6InBQt zz&MPC@u(B5ziV=EIJS0B9Q`r@zjA$90jn_6l}q$=fgkfbF^|FLaI8OfmJ4d;&xYTj zkb@Gq0M8|$DY&}=p2S=}F&mCRT3|Nbj+l+Nil$-S(e8qATVIgn_ph<7P3;&TCcP+S zzsIt82bN{9tS1X0M7N=XT7n=pb3_vTJ)4CPa(}1O1vTBd&K%6_*j)jSbYfh^y4~={ z&ATh$pt)$|%84E)xLzuwk3Jthw$X#z)mHj{2L4~y?r}nVt_$kAJWhCv>XfNfh1D^# z-)fX@Ia5;Gek+{F=8{sSHAx4YFd&R0X50I7Hb4$lN~Dyt~1Knb%dDzfNnCph)&?xJ>DMC!T$x3v1peBJP z;Fn|<=a367r&Hb6Ff$Jgayd0IDlZnfoC4fmF`G@m)yAt|Rlpm0GD^e5Og;;jQ>?`> z+JKJ&q;bqoR)0g~MvoJ=zRXT_xlw0$op4&O3mjv-PPm|*wY^+YwAO7lYvD0IP0`vx z{w%T4kLPf0qyPWt!f_5@63&>P_bO9OLX(K2Ov3)f^9vg5Q|IaP9G^k+Np)LKY5_D# z)6*nXBJlV+{HHw?@b7sp7?n%5gAwN2Pd!@3>TGV94!5b@S<+rsQnTH80Bv~W{ju3@ zo8B&Gp!^qJC-h0(b0jtT>tbFfe1E>u`e>>N<$v}%VL+Jfkrdz9@j4-9GRK+Obk9_d zZq~LYyJsh}Feuf2(Wy-R9Wpg;K>0}G6tkrhacKcHvKi~6edXHu;!AzxONTDdt)9wx z5*crzJv1+w&89kV-3^T*=wFf=ERdu0GTDY>Tsw#6=Q#^pP~8s8dDCiX;ZL-;V_3<< zpft4VSi1(i2Zf6bj0qPlzzbdY(;RRyEoHW20Y9m_n7;J*=Y=?T(S}~?R2`=lQ5TbL zv~q<9slATlaQjd7U!m&H9Or`STpsQ)9C&OsexJFF=0QnGrE963gZ_$CaJ8`5>x98q$^bj&VWV!P*9nQgxxjU~*9q4nhvO!%6K+qjz$Ya| z?lnf;{az<*L+;1CPWaLBxVCuK>x5&DVeXS8MeZS^?j5faW*qMV*EX*cPABf&UME~E zT(?Pz+?$L#r_TxZA@~3JoUj$SwfZyFo*iUCO*lUIoD6*;aYDCUat7eC5IdD zGs*lbwu`~}qmp=0!!p)pNu&Qr+Z*ppb>zUl%GdIC+t>$=Xs108k$AIble+wo7XC*Uj}g z;ck=rDaHL4pA#U%z^f!R`sXSxg7|*NtjwBMOS{ll%OwNOs06>=Y&~8ohPZ$UsvUK!d+&Q zFOu;9%E$Pf&?j8yOKSAjP4YY8LzDZpQhMM*02T|=>5?LV*BQY6O9;R({Z1GV>Yb7r z{dGtCop9t5Wr4S)Ni^=2!gP(K*yKBp3S_8vdp zG%o*--w8v~%ET<|Y4q2zHd9ZBR2nW1+iZc744tbEE ziP;Ak@^C_fNxIgdS*cz`O_fx)(hFs{r*odFM82Sld_foaLZQe+&%#(*J*9?O()fyA zyIxuBi`U93D;(f9rMy;#8${r}=WE>XxD{yAOa|U48|QGqDW~!tbQ1wwdnzs#)(gi6 zWsMF8z-i3!Az96T8gjTclmWJ}qpZu}fQ7>G8M(p(nCpS1bV&EJ)A68cVLq9I(?;Ox zId?kN4@>>CMx5(#z-na5C1Cl8r6mriJ_9*c2*=71|8_Xw_h&GM3r65`^`*#R^@+Q^ zJ(S(q@Q0G(kp6rG5N)26ohT{N zmXweEelrHl%0rr+;M&Nm+EdH5PRk{GI=XY6LFg0f{qnCYL$~625u5*;xUKQ1bBt_F)QqE?ZavZDsdr6UY zoy}}3#B4W}1C(PgG>V0Mk{bPWD}M#?Jj4D-bxIQ=`A`q-G}^bgm2PPHT3; zU(Qu+_R4zlf@UYo67Cg}8vS+uXm-Lzlldgx8#?~o?1Y8Fv`kWb#d(oY_Z<4vc{nGP zBiDdX@08T&Cl1efO8!!A63RC=J7G|`9+cGRuluao3G=W$({}1I4gDqx3<+!U1f?kg zG4Pz?S_7AS*PEiQrELw2|3a#KU#isP@>#f^h#OFnC8{aa(*b?LwpUWsKNz(xrtQN) z=aW|hTwH=7GJC$-6pOK%x~C`Ej&~SXlM^M? z~GZ zfkJQ^xPfHKu)Ki<(ll^mi8T$}MDjFC$~2J9yAI9@!d zSp9nl&x0sE18@($+qoTc6112exR8Su=U@~yYuuyT>K?&`Q^>zHTisg-i>8ijx|=TF z!H{6uxTqK#zf1bJ3o*#zd!`tIZ^fKoV|v*|IF+HEu(|{n6F;E z@VNqr&kqN&JJ-oZge8pZ|CVy9JKP(Dun!Sr0Nx;k|HK^4W1M$fg82AkiupZMLPmXq zj5_ZUM$BZj98fvxQ>t$k(Q@DoO{Gn&k`;cilBh5R>IJ&*FXs)#f-cI!iOw+8*ILg-O*5hR$` zo?49k4B85Rg6J{;XV7cbEq_P_A_|TOmoMX zr8svycNwksaX>CB#rfmA1A07Hi#GQ7Ap!g0X~m!~Akec0IBZ-%pwGn|xeMow%UwXA zFDS*3@f*yF{keMjat6&g0eyjh<|W>Rgz}2Z@s3qK3m1|W&tL9>O5FIb-&jVAh6_vU zaKrDo0v8SDEU#-b1>khnV*DAL>f`q^(&pD!ur`;GHa(alZ8*OH^VkKKm11-mf2Gw0 zT>XeESsTuYHkaA786a(rzf!arAZ=D%>4Hi;cyPVO+63_!()aF|1o2Rc*^Z&I1xCgEyuw_>Z*y{-F KhXw3) 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%0A(LTTZws`U9YguInksr* zVA?A-FfHnBf$v|j@ulSMaqNp6p?U!5Z^9oLynZ&0MX0Al%0>%Co`*VmmfGM zdyWl%!`kB?4E*!Tz<$F-V}2kc={lo{&UrU z>4O0?8iUFogOdw3lDSn86V0havO>CS8g`Kj7l> z!vGA(|GkD&G#UFK)|v5|#1%;ZbJ=WKxemlw(!Xv4a{x0+;9+FWdL3=2HvV2r{aGl+ zQeSH005VZ5#n0hbnxLUz(v?dvWt2-WZAxN49TJLx!of7XTn(l(QWkAuUgY6m+Jih{ z!Ng4=v6LnaF;Qq8v6MSl$t|RZy-+S(zcpc1nz>Qj-|c=oz;)PQ$#2-eNG^u!(8p8W zP#fnuY8-R+9P;1w=)d!C;EcYmrv=LA@Q7tm)|}#-RpG+ z-{k-cBWWa5MWg_9c%r)j=FC&ocfjBY8|e!|euOSrWaJ1HSv(>=v|%g$PFpQZ_{=bu zey|A2q}Cl*Gol)`A469_EcxYe{Cn#>8|cySkEB|HR6~c_$qAY_>u^H8S5Z`rX;Ni{ zP|+yfS5Qp{lu-+F=x?pK^C2L$S6)*CH%`f~YfwhPo2m<6r|BWghamzz#lFE=cCSz2 z_dNn4^Yx}-vX_$Vz?(KO<^n9GxkmSv4UBknRxJURlFn=_@fGLhDn1{JmV%GoQo%7J z7*_PQ0L073`DE`?@FDiwdza|-p5*0*9mZ)jcT3d@72^ZTzE6Y zL8#{wuG8l|(X+6+PVJGD0yW*0*Wc}dG7+(}6{`>N^(ON55AU(BH<7PzT%`JX6Zw=K zI!A4F)m*$^^lY)?rAF6OxB28Od>S$&yMH$?*^*WrE~1BRNzlNbXtE za3pO3+AxH|woF3;=?p>fEMX{T2+9{rR48XcpacZUMTT;Ii9i{!^glpp2W5icNV_mB zBeXPtEM+Vsv^drsSgK+fp``(YBjq)Ylozx#j3q4-EJe%y3zqf(?HNR22c{v8nMh#D zmob=$1m^5A70kpCFlhp2DucOsxqunH{PJKjl>#Ue#WA;q0hmDmK3vWKW)Ogc4^#j% zLI9KrfY%v7w+{rss~=n*KwC%_wR41q*#8!(-}V8ke~Z*>SE%aWV)bcV#65m{ zm{p5N>}@Mp>>?8D2#Q^F8L{2me#jPqpWhKCcr^*0D}q;(;J<=`SF>OWo`AS3!0u|X zQrtCs<>lSg&FyakRib(5onZ(z5`yI`*|d#>;Fp!E$2Ky8Iz5&SWg_lhp&E;K~{FQk9gDmLvG(*M;e)wEw&f1Mud4^<-W)_cOtIzeJDir5n* zcHl><*b^+4%t{lpPP19#KN7PJesp=W`gdTtm8?2_qD8kJgI+ut*U-}hg|v% zdOzqArhgjge|#P5pGNvuu2c0-3(=n@`e(8J-`9!$uIsO)-w6RxZ0Z&UU@ieDS0t;e2*Kn4Bd8z*zXVhS6(I-$f?y#d zxaMO);QRRU2r{8e)PCDNO#Na~KmTJ^znIit`dC%JI7B_X!4a^G)wlaZ)KB>23hIlY zO7z}(f0+K2q<`HftbZlxZ?ZwvzcNIBn&@A{`XAUJ`rq7eCH+oF6U8t02m=rx0N-t3 z009Ef`coA^AOt{}0NBU?ay}IRt3SOw06MaQa#1~BXh<*ok{}%alp*kIMAvUrA$-XY zY7egT;I!*tyB7i?F{)=x<8lGMBXjx(Wqn64t3a#|s_3t=8*QLJJT?KMAK<|fgxq8s4qJJJmh|2f}Ga=2ZY_96w~YCOw(;&atM zSL3-Yn$!&Q4}Xq_vTxw~Immn+=EZ(d$JXBAa`+)xbl#b%>c(#rY3Qruy`(H(D3Kwl}#7OH-goCLflnHz+nfL;7q^S4z2OQdYA&>8|RNM=$mMu!hA zU(phRy{do+DT@=T3NUoi7@^HPezG~6D_!-az|IzCr%<&LXz_vPU8%|tzEl=`q7ZWS z3Tfi2w}j%MF@VPC0np%~Yqu|LU>qWe(l2e0-~|moX{uL#$On7qxQx3@Ks4Omo9z$P zbjzIvSg2~k#19SA)QdkYrSO+^AWcM{7aFPpzo--cl^BDG2fu2dG4h1~dOgUCKVA-5 zY{B0`L)9E=Yk*f(HJCV9Q%z*ehdV7=@mp6dgFk8yeOS0tsAjI5TG#b6ta|(b*PDg& zPN5oXK>7{WR-3V_)T^?G%YR!3D3fX@g$5OFs^iC7_4u=|?+NERp{x*p`E}Uk70R(2 z^koyf2@Psgf0s54F*!}4)8dw?e8(wUDsL95nX93<;ym+W7*N>5l3G{4y5d)nr1B-9 z*pio5exKJ}3eb-Ym?2a%S7USm%%QW%O`C0CxTjeXRH{f!k2Onze>dA8UTKyDsaxu7 zlo}@DgVJ&lzFDYdu7(~)Et2#Sq2&E58JmeOb5%)=(*6uzV1Gr24fZWIFkGEw0eDj! zXu31Y0@JtHAii^!1wO|=9>}u5Ib_5qpJ{K#&;zP1I22yqYkd`a9+ZjNbpxu^djLM5 zpJ}~+s|^xdp!tBnKmy)$)O^5SqB0E3vOrl7R%w<6zTRpB)ALytxbPxRSCtiRSkoWQ3nBmp7mhR1jE!U3skA#;#Xu@z_3lA z>=pLILQ&m5f%2>5ofnE_`x_3$2ibz5-@qUiW1ix46aiFd$1Kso-P>%CK#z_!74$g_ z@oI&Zp57S(Sr%yXmfF~-vMk`Py=tI57S*Kcu@iU=6sb1ZvRlwWSowUM&K^@w=&WASQI9}9SbUhUq;0^`21fvHa) z3+(>J2Jw&du|Ss{4e_c^@k2mhoDhnG0N#MwF6keHHfRtK6X9X@-g826LNWgP^W*j{ zl2s)Xi%`Mk$Cv>wuVUwJnk{(V7m5}-`dA>XLZbaj7P2ggxq!$}9zh8Bp(l-DN*@c9 zsj~D}wU2{HDZN1`LLQ9^vCCr~=yjkQrP7~5(TyH}`E=bUZYTGf`82smu+48!zai-~ zZo#7revnYqkP9%Kj-7k#41dwE)?7)F$Q{`tVU8p>-}oa`^p*mb^3&&iz7z3n=xrbXe4d zRQLIyO6u)+B8U_3JT9W!yw`opcOE&__gi&mCfB0rPGdj~e!9{)`dhiucm)5z%hb)k zlPisV@DIGwIO@APhrA%Jex-H~R0*Cz_8Pd}C0r}NV_cm2{W}{N@J@LAeCgA46};Il zxe7iK|G=x@D|XePxQ@?^+>&1e*`hZwr&_;)pAm80W`N&z@tauuQIV#*c^~V;Vtj#Z z{O<5xRQJ0*s3}=A92SZpNN@I_rteX9@Lit9-v>4EyF5>QAFe6vy(d%xxopNVp`wIe zEc*h*mf%Zg_`=Y6Ou0R1PC30W^yHp!C3U<8h-v~N-j~PfL=C_8w`vc2Z33w|iYZpZ zul)_$8?L5~_bE|LnTT(%)KGJf-cDVxm(?89p*8z3#cKHN)Ccy3t0@Y;^~~F2Qj#XZ z{}d{=@C*E}>|-VT0{>=Au@ZiP|E?dxmDKgM1~dlp*@zuNMb94kI>WdhSPy@lVGX8O z4}YDZ)qcF7QqSH#?6oAQ5*33ASS1cG>JHy^w*iLjmrXGy4)3pLQ_O}WKb=hbl;BZ< z$L~!Je(odr>1R9EDt9U_EKhzGvPJ!Vp`kDyyw3pre-s#)nEhi77>#Nw_2Es?Zi-*Y z^*dYzU5Dj56<_Ckzv2aaQu%9iE%scyPw8d%6#_1bf7H|}EmWK(4j0v2_(_R> z;dT|I`+UT5DWX<&yatAcUk+EXLL6Zta_ugD5?b(bd61rPX?BI~^@bcjXZm$flIsUO%h7u61y5TwZkQZsT#IEre?o)6+4}3FEVJ$ zE9c;uG&~c~fuQUOc+P8YAXX4SYAEb`4i?QBIJt>@tjlm7!qJRxV=Y zxFW4Bia_&WRhHZBM8&gMvFF$5dbqt^?YV;yBg|yh^LxWtQ zna`fD^i%v`(54-jMNPV+4wQraMb3Uf&OlWNC+u1T5J@%l8gx}_zf$CJ+Wksv>hoZJ ztULy)WU9)V9|NgypF26XD6ci%-*-5bdZG^~dg`v>@bS2)(Ik2S=y;<}$zDgnV3M1mxC;D(k^i!CTeNa2 zLltk!RR3UyuZLeL!WvG1CHEU3(GM{HJ_E!#;62T>`wjI#3yN?QxbSyaH5yew-4KKP zN|D1~Tcrb_0h+L8h#nPa-TDUGee{CTfAF?b8mECy%yRqie+NFqLRcPvukWkRU77AY z1^Ztr{)60pfIsWyZqX{k;qzmimZ_z9IMCmXb({dNWf&mQmjmE^S`Tq9C|ujCK9wz6 z_4g`DOT5vJ(oldOptPp}5|P(hx~%$TK4|wk>^V+_o!Hgw8HPYg08D-AuY~%!Lbcf* zfaARlkeG|}s4EX3xo`aff*$XjtA<6G&qM9-I6Ml=uRDrE+K?thZiz6F^;MQSwN1)p zBNFZ2g3GsMk37ZYcjP-1FN^4>__N$Tbfg2|XupO;QXL}DNue^tocfFili>F{Tm>Nl z>aLinlvdXyZZzg{qiu^;-P~cJn+NcA{{}QT-jAy*YU>8qqE)8DDLxIF;{r$<&;V7L z4(EST)pfAl;bLW-^QbH50*rpp0EsjyU*07lm8+3T{WxC^ER6j0X??v`c5%DI%*+9} zXJ7-&#JY9bndtWxD*%m`>gv^-N$WVa*@rJ!I`VNL>~ShXQKSptFhR&K@~8I06$j?} z{9g7&q8$K#L@m(;bljRqPbuheNuATL`uLXhRl6yurmodMi&o57yOIwe=HUjohifBl z=|9z@dLq7MDW;%m{6>q;h>4ag3v>7rzWsr;kElhfD*B zP6z&y5>4~yt&CvuikkY`T?GW~avu8sM^%sf|2HOe@hbMhE2+AoV}b`Wb%kn3Gh9(n zf7u;eNl+qPQ=)Z!h`;L=pQ)6hxR4t8#jac*z}^Nd>~N*!3T_e9cBfr5Tz2iw;hAI4 zEiCq+dZ}7BM0FA3^UM2m4X!cR?(1Ic3R?K3V*#2#oDVo;*L?d3Nk>^g-`ok9W%rwF**6v6de zN+~XoLu&>X;|&LgS|wG&+KJbY-=fL>HeU(%>sN~k$noJ(sR5v1a8d8)HnRRN!^ zPjfKU%*C4=^ia)=``ZI}p8cG+4QR}3KGfk&%DN;5cgpy=A1D`DZJ(?u(+Mz+0{pQ9 z>Z7@F8ag3}^}=NOYsCQ@{y^nqTEqNyfF2hpL&Gcx>hmZ{A*6|(i9%HyoB%UPU(=sd zeKSc5>YGJ><^FU<72N1hF2XH^VMe`1N*4Zv-w~ZpKRH%T!nFsg_~mne&*|B6&H}5dRMU!s^QrrlVCBSpBOF^nX=Zpi1EVEfiaJK@@<# z*#Qf*@-XJELa}g0gsIyB3miw$hF%9OkR_65N0>?uSYXI+Hi#c{zye?XW&;7bnzT@8i2U8igqM{sHv-!IbY|EMTM(d_!RD7R4T+Pb6en$u*&u;h8#GJlXXzjT zLxL7$zF?ld%}*9c6JaGn5!tc`)1aR$F#eddd~YdxQYi8)iUKgawmT6{it)=LOv`pB z!rEgtFsH}zJ zaw%iFLnsRPlI_%-#2Cd0Z?lkNaWhAF2P(kM;gN!`xpPc9DM9ozabVR-;rNEDUV921 zjM2MpC@VfM6cz8}&f!OYpGlJ13nG-S70SC$B>;I5`b5aaC$R_{!hnSr4Ct8;KlLbyc#eia;W{Q^m7GWCq zlLdw&6ZxghyX?{~N*Q_|L zy5>)DO||i-$s^}aQ@EWY}mWKbGXC%zBC0~Z;YtD*8v(KVK zF;Jq1v-mzjQM?TQ(~*hgmy4WNS^l20BEL%VMSk)*k)MA~mEUv(%g+}YB7Y7tvHax4 zjDID|KX6XuXG^}wxBV;fi~d#R9~sH=Zym)nME*QvV)^AFXD!SB^eL>_`NxsOx`=ZDnaZ!~Y{Q}GHBQ!+*N@S{kB%mo1(j>^An!s{Gf_)PO`-O{Y zuy2xJ_rezx)?F{zAQpeU3Gb2k;7fYTx8#z{tfNKnOrZ#D3&-{LOE@6l6rEhje*IQU z({d!V;7;+qR5~UUD+j0L?CMH5E#D3;cv>C}EmU_3$6j{lPH4farIV5`?z~3Rf>&wT znijw#$g%P4hMUA4s95bT$W*^OLmqsTN#$#%v9J)I{zyLEqiG?_=^xpr=By<&UK}9D zCP%aYa~0;4y1jYuGhKEcjG3OL`1w-5QUph}_`vw*h!*%LoyLf5OWBuyXlbmCU&hJh zn)opXEO5291%UqlqwKolqo}&}*=$Lc5DW<$Hu|AaUv(D|0~Tzr#)68Xh9Y)JNEQf$ zP25c=q8Lyt6ba25AyRB81VNgJK|n#2W&sps=^didLHK^pIcIifNrCsDJv(#HeeP-Z z%$+-T?jR%FKU}05t5j4}%VlbQ6we|~0sUE5%bHX6@ks`rEN~1tlX{{=&>x#{8+H2K7Nc_SO$u(e; zn=Z0xAhfp`3LaCq)}sX8fUWfsA`=>E>hi~wnp}U1UH^*BaQ!K9eXW4uIiD=W8Z|~l zF=4)B!}Vxh81p3?UynE*GF8WyZG6ojyN4RV2+|cwwN$&p-6(}Aq(cm|8+J(4Mjuov zcHm2DC75cLpAGU*Ago5YA`E}4ni|7d4Tr-+Nk#n%iH6${+-)6(sfLSM2>}{o!v%G; z!y`JbQY}hF$KP=t1C7L4VgKTG?BZDUZ?{-Oud=Zs#df78z1{_r;Abk%D8b(ptMOB+ z=hb>w#3_ESI0L`*4Z&Zn)Pz3)OoG2kamEY&&NvTopf-1ELy5Da6e)Ikh$Hq(r?wbV z&uDSMo6_P*rKT2JfvFZxd5m=_*+m_F0qm(U$vczf{Wji^ccuhW<84~yn9_s*&1D7Z*Eg;snQHw-;-1^;t5-_({7egn z*Wmi-TX5jplKg<5(YISr;-oRRPAE00krO%>TTPJm1f_?{JNonR>Ry(pBj zYBo0J#Re!VSdXCzh92p2B#M3#Jr*RW9))^d^{_QiJ??8@1l5ma(tLyWgqrji0453J z3dQ+F@E12w{3<=K`1Q_H{LJ$V{JT`W!Aec|gTYjbox(wj=g4X?8ZRQYeqX4`V(Zvq z%g-|`woXGfH?JGMWV(Uh;ZI8R)Y4kMuW!5Jf+8PfDfDj>sx@(nn;4yFG;vCt(s;5~ znX5D*Krh;n!`7oYPSojh#XH08oT%$JRO=P$d9_~qhHAaH8XDH?rE*MBYO>xBV5(i8 z_St~~I~o1F=8m2hygk3Ld-j9Hy?lYZ9Li8}4=OdB9Uz*-=6yQZ5POoH^OF-FK1rV^ zrk-qf;ln4h(V!C_J}Hb8TpE)^iH#tMW7K9h(PWX=V$d?ztj%u9Yh>Uz#VjO|iqbm0HSNTQ|F@EXT`b` zbH8|?9rYkSO93zYKy`}%=K?s!Whj@+4^0v-4|X9RmcQNW@=)Bq&2D;AA$BW;WL;hE zEp8g&@{lWSi<^FNc_`7l#ZCX0f<$Cnn@kn+>M>_G*Trj-X%Nnn18^BC$&X4cWsJ2f zMX^q%c&PDXS~yuLgWuU0uB!3kU^XaLqrnao(#n%Rs-}A(bpN=qp*tT^f}e_TKF00g zui42FrBuzUM+v@sUoR@g1Ftr2=-6_Ln=-x>9gAF#ZE@2yw})KWTikS*8S=NdsYDri zyWZI1rdv}z1OMasZtGDYH>ZdE}8DTz(cN1>yl~Y z1s-yitxYDHFI(*dT=Ul^)06)P1J@QR5#_k=rKv`jDK%*}nl+pFe};)iTk7n65n#k1 zWhmg&pH?&3n+*JG82C+#IIouA)+tW$NC#QcmZhkRlp12^5PfL*??X=dzb1y*ABwXR zf?en%%i{iV^iUHIaWBo7FA@BSrB-W2wQWR0NE@9zEn2l4qR+VT7n^7_e8$nR0S&^D zCEDOrapd(Es{hizGW)OeLimp>6n-TVPLm3|FI3Opb&=Mj1?HL?FACSpTp%?oq~?uj zTA?DU!ss+qI48q%v{b6bOO%?-K7%#imu8rKM%~d8WmpcFkYc`EQO&Be89VJ_1ABJe z0h5_m=!=S$a)rELdNgz)(FzMz;C2l|uh3}0m0%@%@3V_FToS()ldiUKRzG+#Y*$On zMno`zCQaLZb7nOeer6eNzC?rOXKr@jB_2x2{2KEh^ebnKrI&app*Q_%!7}3qF7@EE z1ycSemw$MvhZ1t=PYYHNH~Wu~J+dlA?2tsl+yBu>SXF5boe=mX=n@x7g>_Qlip#V@ z$wG4l|7B30qqI^hY>*0H7!~LnbA^*!;p_(EKr2@(O;&0IS|QPPw$`1O8^N%>?m&xp z0#Sw|s#MSq=2UaVZU*li2A5-89RKE$&6mRmSRuaOf+gZjukcVx#y9Mx1MCHh$3qFZ zbb!6|j0aw-KzR-wWXH_GDd%svOf3>S|7~&Ex4LPM$3w1!t!}!;>mgU;t#0a%KbLHE z(;_cMmCd)h>G>~2 zxa_PE3p-Jz+UAr}lLL;kCEmEwaKQ1pd!syUi0Y3tSETQ+)Bw*W8XnWKgOiqp!H360 zMrN|+WQ58BjM}^w_W7dGXNQR2tTB%9= zw^{tT%?%H|9aHC(+YHUl&r-u4k85Y1sRE^VRVGlyI5)WSn4SxY!o z%#FcnkM~-5C?Px0jpniuTeb91O4_&hh*+Q-eHDWX)5?}Gj`PIYWUBmD1pYF{b-}u1 z@?N7sl=+=RT{aK?3a<%QDF03>ERYJbjS7iN%@s~XDr7E|3YAi!^|jhUMO1}h*P?}U zau~;HNbR#tsmWd6v7LUp)^OK%b;oH`FmRw!rP%(bg+fi(%Ng5ooq@faZH!F5l1n;Y zCqr~Sq?D?q{Hc*u%s1~kB-6uN-ITFRjIuJumA1`IY1ezm<=N(@Zr6k3nr&_>QI6Fy zuB>ftng)*U+uT&I6%6GFZgW#e<=dvzQs$bt%}w)LdB`D3$~;!6~7<{}Zxuy!8N5pMs>8#LmNaK!JwK}^hdK}Tbv?}CnU7a%7Du2c&i zjbTCWy%DBGrcL}_jDJ)TXa5^@{QJv|8k!~FODxNs&x<#~;^(RsM`xw#vP7v#rxUEx zA2%5`K2djco@q4>(2&B8TU^a#rx`x+W&{2-2Oh<>*zTtDl>Gsv$fPA!SEuc6>U1;4 z0*H=ITIg4*Oo))mn>9lIVQz$AK)HG=Rc?gg<+o@UK6VT2S4%239&kim$;%D2CDHoz zCMvaJoI30lL%&jfyvO%pBdxd(`}!75#jDiIqph|2F1m3eAk(zfcfYIF`WxK(KeuQ= zzG21C;qw1_C?#<@r{FjFF>bH_dMF_;m)>OIVsAy@A=#EMm%w}5%E@-|tr~BcKS;bu zvW>qD_Tosb{6Q+bYvnOP``a{9-@Z+2X8kBNB~m+Opys)mn&Y%wRh+EUh|}JL&EeZQ z>AeiY(BrLgwRd2^SgHJfEj3KUgT+;0?uk~ufY&BU__Z~Dxs;X(ibJU(MK00j)(<;6 zDdl!UiqEYw1?b4x?xr;5ze=g4%r$Jgo7#lA=d%6JE`{Ow3c~>O14>P}OBlB*jJrg97&msin_gD-#Y)l7zqPu)-0r4J@AQys(RMfWxD)Et zB1QP^LGk!<6NH@&RvibHU%PXFZ8uv3kYeZY%gD@eYI=I)e)f9aAOpx5MP}v5)4YV7l={SQ zcUprZ*rx}rd?6jHYw}uh4r$zPeI4xRMNYabcnB-}v2;x{+;5)56*@J#)&QdS7twiP z#5U*kf)W4}G?d)cqG^h_gG?6E>=OH?&Nj;|&jSPrL_ePDLI_>#DAv+=&G!820 zMJ-V=S1*o$h71Dc0+_~sAuDnCSRj`71Xd=MAGfj;&^qUKGP-0Hkwo=; zpk%;thG>*-q|);Qu_3OF_4wa6@##NmZ1h+-qazy0VpZuGO>m)n_WDZbm5b%e<XMe94YkZhV+$j@1>JX zFGAJx?Eq*OZWOEC89ZLgkj=2x4gwhSgPDu(r6T~vZVH4+RJibdFDD`Q<`QtNSQRe9 z$`2Qw<)cCZ^1B2kv!cw-Ay9p`z4bCu#^UV4eym7W)l~3{p@;_Ku8^J-yW}6ryuR|4 z{A}Um{)=7G#)|eKxjn}i9xmhVA3MCFfwvmrcG^Y@$5?&b;dU?9{(Ufk_&)?}_p}&s zUR*>FN9$;LPHv6awG{s{PT+OYufV;ci% zH^m7=D-~nSMQsQaa`oi_(w4 zcnmjdGAyVJGbCVVY2JP@=Vzl)mTI(Ake*-Fy z)}skJM;~MudzC@WV_9`igO3jc3V-RLB{;LZszV#P2G^p@bMINm3c343{UY@jRh(=D zM!b`4O{|qq6k;>9LX>}|k}?o@SDYfB{>rHlE!)N`!DXJMmr~J%7&K^N-rE=` z?gWR>%q`E~tdLuzN|3w>B;PT^Hq8zKC4;t<+gj*LxDXJ_JX#qF8txgPUGCe)QQ^yE zm^R&sd!F!otUIM00k~>|Vm^UcR(-dd6@O2t3`d^CaW`XLBY>*JYF#njHq49BPrC_VW+1@+mG@S2Pd_9@?NUEwrt>N)uqT=$<(zkq1EM z2@BaEMQ5yh2FY*@r19s@YLS{Gl~6=M)I6qGwNDt;zF%B-5$1u&QMt8`%x$h!Pbr$m ziRg~@8H?dka*k|nh0S;^PmD*<> z?P>{2-FItaiW%!HRc{Y>*HUxB-Ya}YU6(s9qi9>NHz<4kR@S4HL|PeTU_W{Z#WEIY znWC5C9lES_%MeLH?IHhA(NSPlB|!0b!qs>xxvTg4xa*lC(+;?Zra{;YH z5>o=vV|{J)H!~eWqj*;1Io1fjrxJx{HT*Ef`^ReZzlbxeI5LA%^#<`ZQPnwT6ioxp5t~Q@y+QL#71K1Z4cK z^Jf_i1+UE_H!!=T9Py)%TW%mJr>W5+YW2wFsXd=rF|po%tf4(~pWC*G`T5j#er}A8 zb&jcn%zfe5@W4NQ$w7zer!CZP(Y8@9U4|w~zc5Yl=GN@Lc~&SgsT zWj^gq89|@=6rgnOuI4)}S-C7?Z%y7$-*8FBSD{w08BQ5NM^d?V*L-B>xK%f#mLu9$CMr_CPV#BrWW|HN-&d?a0JLKpYS zq)94wRsR76g9!~NsyeodNlL4WO9>4MW*Z$tiYzG|Rls3g{1d?H39W}1M$6>ZN#W$f zHK@b>>CaXR5;Yt{srop1N`{noy!7hQ6y{OKvLGTit=XeDHn6_}pg6ooC~&3&=cR9( zZ7Pc6%s)VeBTuGo4NE??O`5ZSDce4L<@C#VS`@8L3@ztb% zbr-|u`R`-2n{1D&?2vTM2msBinvs+Dje#!q$btU(w>Pg}Ri-YZj}aJhYEe^3ch`E< z_6Efwr*3M&2f}}k8k8oxIjsEytt|`B04Y_#HR;sQ-gJ9Av zYdi#hTzi05tXAH`z&`!)A|ABy3>#7b?TL`4sI9{q7v9zDi~S-}2RGmAlPVcFqzp>) zc8@ug%iN}|G2L{SjSQYr4i~`K0gi5wq=yupt-=vv&8;y5t?qcC;h-LlyXJyWlKz7w+wm0FGY1T3RnCjH!%)*r}rDTVH`Y9fX+ z$f0WmL8yE9E}^SILW1Acg=2=-2{t>1eEWM-7|_HM z8+Kim*EZ7+ZHjfSDah~OjfBZTa$*Kb>o|GKB#N+qzS_|mT$is1rRp(5-}7r8WJ2r* z8anSW+smUJh(|AhB&J4RSH@+Oa>V8(<=Q3xJle8l4bX;&=jjCmbjzWH6Xk6@@i&&I zdL8OpPyy z-#qC@l)1Cgw8hwaCDE=?oNLYAFLv-h(({ZnK)5oTC}A+Z{jlh~q{95Rtm*!7@2s2S zuHLV@In7_8{u|V=)_TLVt7gh?))lUXDv*)+FeN*sQ$Jg=2~dwOMOe7;0<9Sd&*H2c zpZOs;aE?m0F04JbFRa<*Pp;~2Nf;?%&3Mg@Rz*s%{8E5?Zj#9tNv0m})X$q@_9Sv; zQzD|xpVAJ)%8xC6A8$v@BD3sQ*w0hU=lS7nc~X{4iCn15uMQl{YT$}e$9VL^a04fd zb_tebkkx6&KM$qfSc-Fx!Ai?yPBn5*zJ=A9+?v;T6U6h(XATHjRxQG5IPem{50!eK z5l6ARBujLx{-KB8pFIg^t=Rq=wi9)3w7eYX8G|$*Gi|pSDbG1DxvOOlux7dW0$sm(p}5ZUegq# zI3{T47n5ojZzpv_1}3p~1e``Z<{(W3{;+3CYBrilJ475w=N2-OjYTV=Y z7vv%Q_r(^JIqM$b)u^j~0?n(?Lu8)5eo8U9*#eXa*bM#LqgCR&7UCeoy~P1p$lj95 zPAI+fNU}aA`RwtgZx;El`Jpzr8m z8qm|)l;Ik2l)0!UXJ^Xmj0!(cme?Nu2=-jKBG?}c-If*=g~_!JvBR<5D61|em(f?R zbmY?~K|7)I&eme$3)mWFuDTYrn)h_fsE$+3*e(K^zi#^pw@t2xvYpKlb9nmP_ab>Z zPg+#xo@b6P*~305?!8;T8Uk=$xJ3~hR#WraYhd2}3Or%8-jN1)Y|L%PnL#rnD%re- ztgx91yrGJ&?@}1x@*vk*j6Lqn7dz@n^YbwLPEk@T!8(5-Rr}zZga{yGdT8g5Tp|St z+imdCjR>|jXt0@VZMTq*?nrMgfE_W6GIUfGt8XuUjP~Rq|KLZA7}@$o;eJ|FzsKu0 zdf@dsq1L58pC1gZ|6{9!NoU+nQ#XDGr#PH zrk9Z!IW(_++s7n>;ii^)RRGYE9QG%#lj^^r1dPpzWjfjo`b~rP8t?l&1q8Q0CHyn{Pp8OmUl0g~*Vi@|Cq!<1`dT z4b$*bw;8hEwFYb~q%_eui$gm2lF%ifV@q)^<)rZ+);ZL*dhNcg zS_4XX9uwtmli9f4if$LKTaiWe^_e%N{`Oj2(f3?_8R7O@)`yqcea`J0weRAE71$i* zlj2kVW6)0g5QaZkf;4^pk*SNA|4%Q~1p@2f|19DGt>F(F-Eng}k3>~!GQ1Z-7yR2{ z$a)hN^iOydQn*REVkVMlihTI-e%}XnYbN*y(XeLdUL+#!UGlelDLZ8uBGdhmGdm$J z^r4l&(g{*cWN=}`5nVuK;a1HN{}uG^R=n+!iatzB8Lct;(fTT%a)kGZmO0<%4<$ieU+&q4Ui`DZ4vHttbZIJxY&`R%E|d3{5!_H#rLsP*2D8u`*6;9~ zrURPGl}bG6?f+JBBcGCa{oE;ORnQDATz4Kr|Rhu}0@jPxKG`A-k!1IE}z9~UL^ zpJR7#dpQWu%hqgm1cbh)GG%9}p;df+f)+F>Hm+-|-e-k zN-he#aS#KC#3*=7>kz?bb#Vb#twcG)(~KA*Kh#6F@yD^J%#@i8aXVG2d;3w4!>k&{ z>WLU9>MnzVyrbR3#cAKhH}(qoE)h|X-}=eReVc6~!#%~t->?t$EVe&F#2F>mneD2+ z)MYeBYp;KnM|C2IY(|37we8~?GnE&{4IfG-XOgiQ_<0&__mW<_()5(h`BThOL4Y8j z8a<@*8dI#W9r3>b>dljfMM{UVp{j@E4Yr-VRGW2PmGMl#<0PhEXvCy4W11BYNHe&e z$?m1#DhT{kz)2hcDY&9~=@CqadvI}vj+u=LPmFVn+%>KI9($^D#~NC!NK562zgrQo zaTTCN)+4=W8`q)1t$1&lq6ZCC3qADPZTUnjwQMXHLSz^lux5CPt6Z3#43}Ca`pC;& zqIKdFV)mUT)MH=(s&+-{Z4ND(OatWVdg0b?h#F}xL0J%$TA;X|7-Q{k;NPusn^lak z$^hb4N+YtJ_L*D6@lrTwu!(#1tnIeVzAO;>9wAkNn*L)bd0(SIf8)w)KDt0bE9&iu z2d)kReQ0mEt?+!8WvF4XFH?e&V{jK>ZiItajMCd8G@K}V^<*%Vc=pN0H$C|_Moi)h*DjW6xYerE z@!qe(L0L8BmvY69sdd6{FW*`!RgrrJS05XXwAdHyl$0KJ!kgHo!iYE_1@-ovmY<1l z-u-*Z8ScdxO{w;`6&`wZ22=H4Q0%2)EPvr7CptBg(R{QLP6NFRP{mUXU8B&ky&#`) z_^Fkgk*gv5Z8lw_PV%xZR4B*!!!}8Q1KM49SQxdVpO=VCR85BHgRz~x_h((-#GEVK zi3AFgv1JWa4pFvG8o2~w7OQSm0C+S4y+m-lU zikry9ohNwtQs{@6g&ZDc{5!%u`{F&idpboR^|H#P@U|RAzL}52x~12<=AW{_4RjuO z+)3ZG>R2`(CaMRl7Zo)_eS0q&?H*!{EROTS`QGBt)e=tfdBz1H9vpaEjU=LDcH=vB z>x1cI6HOdtP!`~|kIC7bc@9-O2iKQ|H-{EGtNl~0dC+Y;$zbFgc-^5`n$WQK#thKa zYB`D(Gxlz;)-5eRIb&@ve%b~-E zPp>s!K{<4nFp3qGn*T^Uj1?{vwB#G)U)D-2UbirLuOP{Hw9#Yz(z79cY@RYwd>gnJ zrrtc>LrBb z!0FtHj(6|h&c}bM`vYAjadz?i41UptX(s67q!=4PMF=#;D6@o!GIs%=NlerCRw`5y zuN_|PDc?ST*|(iWx^gQr0@${~d_%Pe&o)BavVo2mP7tOTW!pI|!mT0l_TFZc1%6!# zI%-`*w`NQhmPVWUn;vqhv8A;IE^>MZHW(5kGiD~FFcWlOe?$j=Ya}EFLOF*dpiCY7 zJBJKYwT^j6*#BM86p=b7NR~KXA{91!TULr!_#Kbfgv0ijOb^k!`X29>*17B=_O?Bc zGxHEk;A7b|)5|GszpSP!f#M*GQgyb7ugQ78d}iNDWz=k_iF_`OPQaVhY#(pWKNEma zZ55tb$hbrS-u55a={1Ls?v9;6&hqJrwfXU#tp|#8nzx)FJhh};|IHP%)lXN>pcG;w zI;39Hre`fP7Xi;ycDK=-ZJ%9(voxQl@p*?^l*+b>)lI6!C$G12Y9|!&wkz8t@$hlo zd*6Plf5|f{o1ZTdbu<1on(9~ExTogN$71%r@-HzuxKn8bW>lrU2!!Q}bAAxBW-eyG zaf$afMVh`#5@_1_XYOD<(0{|h_1~14m7jz|#!k2Jj2R-eh|5%^4eMCeU!3;=eGT`Y zh!k8cp)YXkjLy1W!HP_{RwnbG(I>5p$fmQ*ORg{v>V3-U4+t9o4ZPlQ|LXb5C`F3Q zzio5inU%QZpa9xh9e8!3pYWdStZ_&0BJ zL2vkUx8PO=g}?dm;$1vg2>Ea3iF)2Nh@OY(a_d{x{H=oqETY3Zo1$?N9|+{}3-;q zU`ktcZzWlTxI^68QUXzrFtg*?k@gAUQ%Nh`XHBq)_^|{>BT~FJtz;R73Q<_e8Ye=+ z2q#SxyWx=l#b^FJwHD1+H7mkA)@)%~lVwhd3O~S+KyEsxQ9u7pyJvCAEIV*xki+En zX;SW&?35gwbR7 z0=-qO;9jbp5DS<>8vjURj%;;?VuV>1u6oRyg!HWVVvm6`Omr?(X;Fd z8?>B1748^RLoT83jC5n|CEF}GB!^KP^TxsCr6O6KsX^1FQ;DS4!T|lyEW!eh8x=o} z{>VlhI4r-(s-~3v4q~o&X`E%3-MEYFE)E@Sc!LEWgt%z+d?t7VRCGvN5rXZn>ElLt zxm8Ymf6cnU&Tf39$`(3Y*}@W^-5gm(98awcyO<&15r4o?xgE4VDOb_sSMN zFla?oK?$x-C|j;p;&#&YAf`hX^IiK}*;XkxGr&NG*Pff|ZF2fp0MN(oMm+R^bEQxU zYmiBVjvDTpf?B0UmnuS893hg}|L3aIxjt26Zd$)&8a*1^f?ejPEjoXDyq53V@167H>NmKq@~$v-4)* zeMAt})LAQR@uHlYSz#lN&#@p4n7Y{5NYK@WV?}k>mX8V-1)mp zMf0snxc)_>(WG?;GskT~c#qmHT6wm0}&B!y^8|tALDJ7dBv0lQ>4BW^; zqxv00El**n0u>FDFPG|(i`m88F{({Pz4XWBfQn8i0eXyS&==#sVMs_Kn~)MUHYj8) z+I`_lACa+&a?YHsHg?PXUDL1dSy$xSe@eympHlswYBvm7_gQkK*u1g;`uN=#{&6^z zVk`A=D=_>0ntdk)Tq|b4GOH3Hl;${yiWNN4;-)yvDoO8WnjY#j+{{KOK5$~r^0JY# zj)tsNu1T8Ux+#Z2HTUQpy)TkZzO3sHlu@burr1NnA~eXCZBQ2(f%_jMck|!LP31Ep zK$208M<*8P#pekeKNUI{C9wpV(8@e2Wr^5zbhkuzQ6ozc6(H3J3X3JhDC(}=pt6nO_J-REYsf@Z756$u!} zeys)#ykN3nvs*w_Lt#5!&3(3U!%#y|b@BhD6qV%o`PY~Q(U&dT9Cpy6p-Y~7sjpc{36 za;Qo_GBZc?&HM4H`}hMrv{`pkYJLRYT!NO$PQbn6wV1Mgp zDkARklp0AB_c+-!b)k4)1fo2erO^<&w(;3wP5eC_;<^@Vv$n0JDrNDnzBxdqCDQgy za!#JgY`X2S^AX{5U9T7uraJKAsJm96rHB6+iKms3F>7&3iJQNQ_FI)Zepm5kfo2@9 zfzC3DjhQFAa^jdYwCc;zs&g?oJi9&FoxbG(5Er$gS9h9)7ulvw2?)s}O79 zMEqdPTaTF)?EL(D6O%L4DD8>(QN1wEh;q9r@BxLO&F!Rvqo6neAD>Yim02x%Qm72CWz(DrJESKLkOkDF> zHa$P3*~ft{8Sp5(xE1qR#=nEp;yBbMknk0g5Dz|625eqYLn9_T* zVQqPeG^#_@NSCcA%Z>Ls;ZifM8MQIRMZ2_X|IH(_j<|j;6{rfL%R1`TbosvD;Z#5H z<#nrLQrBBHJjW~4gW%cayg#~foItIra7RViNX%Kc4k7tcsIILp`$x$y47Ur`PdB5i zltm5Jt8L?PZl?IUVR|H@adob2$0^DTPKd{TgSwV)OUXPvi z_V6qjO$rX1SO4mNR_VE?2_MIKYtE;_m&u$h{zV={YUqYI8 zws>zbhv`oFO^SN8zy4j075xdemY=9ok(E2@ft`}CRKp@Zx$Ywd9{xVwL)|qO3aqp- z>qoOc2nLqL!SFRiyjR@&;w?>&eQ%O4R4j!aW)p{zQ5;OSSfQI+l*sDqT&hllh0uv#s`?wk<;rDG4=vcG6J0NJ|5QlFMx zkxLn#Kp~bfr`bVvd%DGq$O`j1rKNmAO79SlG&>gskF-~%nn^8Yx?eSIr!l5H7p%lH zEwLb~-OV85Upk%41Fgps)>k54f9@B2jU`|LN5-ba0ZEu5#`G8&qq zHLCUzck-_!OyE?{(AtbjWegtbA zQ69>a(TYnF^fG4F_Xu@sHzJ4B+%IGJ8q>ijPcgD!4P8ih=mY-*YmCrs^R%meGw*N4 zn}=lZ%yh$uROO6K(ox48)b32S(UlfCaz`)i?Eh!RmmRpC*f8Qc;?v76!9cjmhaA|` z;9|#FA$XSCU)nJ8gNDtpCOG0R<}ZYSW<%0nfJl6{$nwuK@E*=Rkqsm2*bL3C2AsEz zo{>$MRnGk`(JRz?ltn|xS7RLd`b5MA?SN>bl---=!(C_?QxWwj$-?hzt3LoPfXkER z{PDv(nFuS(M^Q`{LIG;o8?t~c--ZF3kTV|+=%%ON+apR{Yd^u!d~_=FvJkK7iWt1S z9|px=0wp|*jILY!_z55)YFPvjsIlT-+te{QgzN^5Jf>G1OEKE3a#lRn&aiX~+{~mH zE7!%6N>4NPSsBTTJ4YwmoeiwMtAL&|^o8(wWv3vy-g}%Uz6F0*ACQ}++h6pZ)DVEQ zqkzuxFRG8EnDEGF!&jQrx%Jumu~>?w_NC8q>|^b-@Omf9jKXGzX?UMJS}?GWvZ&a^ z#9j4%80*flZoK~LmKMyNL-P`}1y7210#4T8Pm-)FpEfmM?vE6@$Usn6Ub}@dprZeq zF&f5IdYpvr%k>aXbW7MkOgvXs6_ z?v7TG5O;S{y$||os4Dgp5?v{bK@plL{FKbc{dg+eOc{#3D}7M)kQq#o6-z8YnR19T z1Mvkzrm)IRuCYpP)brA?4`OA(eGhe(Qj8n3)AGBT!LJBv4f&c3V{m;`E| z^K3z`yC%Gw84VwPPC7x?)2O4!tm$(t(x~v8iwe z%%4!K-a|7j2gbz1n+mZvf9VLUFNJ@M{Sc?=@SAblE*aK0Z2m3tH)bzYJ%kHvoMDS& zKycKe2vEI?I~(_G6*(pZKIj+g`YBo zalyRIuJViucqG)6hJ7C|3!W@tCp(>WZ9R0X0v>h_%A7W^dY?;!>7Q53`A_Isg$^Q> zc~|r!!6n>`3-XoG0JWp@Yl@x)a7i+l%i*WBYX##y`2G|cJ!6mrX^t9ym9{Xv9z?}g@ zz^PgWpesy(Gcjb3jo5{sO*Jk^zJ2u)rwfycPb(_yE)#BZ?q=uCu45v&GfzQZY<8YO zc_PU>%q1#vvuP{&qyQ<+6X`;&bBgh-y&p37e2V_jQq?1)JCu}7!$oPk)+^1s9Q}v9#Kf#_Qdc?c25sv3{<|kb3DXQM!pn|Wm}{ms zY~t9cIcxh4XNo;nT5Q|6e5@9|zr{eftAQ2b^%`q@BCB>fNGrtiUvcR?avDnnKI%*# zDtCWmTM${Aj~q^LR`;f6ASGuUwYg<8&fb1@nh(<2!V$$lg$_s|vmQJL*qPo@TFSW{ znLk2iqsh?*DTo=Fgs6ZKhEJ5x6SU(IhWp4Izkmzrt@P{ETsDCbVl z{}~o)9`yX_@QYsZRy241<%-fC+2PWAe?X4}^~!sKZF3csUU_cO7qK_NP`a>cAny^- zH#PB>bz1*`ID9pR+TrMEI7i=6x`s^E z>@1z}68j|+Yo<$(M?-$+4>J+RW_9uu2x@HILyzvM0fz;l3nGYnjep+%q{mvFqYB}l zrL|t3r2i@2tHx$r4eFV$TqZd5un@26g%v9#=-K5Drdf|xC6u4?h*dB&>1BNp&GuBL%L0SGkd|Z!_d$T84f$FG%#25#49L}EKXFeGS(S#hC2cRISCO0=A zXW?#Sr}rO0*JfBYV@uLcxF4HgDk9{mFAv{QlR{2zN6~M%7m8EZ4w;U%f5u`djF0&5 z%8mZrTzMQ2&11TVC?ow-&A%*C%IZ%4ooZe~gl)NV`NC$8Z=53l{U2=p2Jzy+l8_Jx z^v&3ObzRe5{FiLnI?q%ZNWT8fgpS4nu@ye@+^ais?(NjqL|_h9VC7BdAs6;#tt#R0 zlBj1eDtJ>>8tS`G(V~}~)dsVp_`lXQ-F4ggwiD!++z^(}Ul9Koz2miibiA7kaw-iWkWG81Gq=}&s<|4Ll z{V4-^Z?~aYM6HAQ*}CYbFhaPZonbpqDUIl)teUZG7vI0S=kDI;xg)j;IpINWW2tjx zEuq%Xu%sD(MZjP&y{zlCok4azyjPXGblRQ7cutK*%eVZ7Ht7=Ph|z25BA^X&8?2CjM?kMD@(<8z24@-K|bx-K#G%O!(;|emr3rSILovJCQR*P5|dIrWcW{ zi>kZCQ<4WpE?1>AEK-MAAm-zwmx=23c;75n=dk7nn`_4e4@ZH$>SQ_z1~7Kz2%jhy zcMS1H&iO#|Y<%;y8a#_*0OT}89bmwC3}zT`ywZp+vz1_cg{3|Ci&P@T>NH%2zqE@~ zg1a;;Kbch$OD{P^(EOxmClz0R1I!OpBgWz(iZaUMS0~FImQT(L-GRLkmuDM*DOMjF z7lze+C+a7N7IgU?(JIC86CgeR!6kb~)#%H#VHZwPp_1I{@gpi5qZx(Ux5OM4MQ>TrEMpoQG?2Srj5Y zJMk&!a0$h_w&}c8zU*U31rT*&Dxw7PGhf-=UwITbNba8)C8G@=i7@o#o3M9XTB7GC zPJRS;!)VjbvuJTWe=5%cI+7FN_pVm7Om*EIfgNj@mPuMDhsuCZQw3B}45gQDzuOcI9A zCWlTh0%<7r-{^YeP4*q#F4zB^=Z6#1ew;zSHiQ?xHd7wpM>+QD+IeN4@ zOE7BirjB1b$Jktis6QPjv9+Kp$%4BLBCs>k0ebas(#LSkUBZKIEB)$#t~L3}GTOq~ z`Zfx6gG$@E+uRR1y=t;1g0GBsoGq@%ZS!vN&<`%)qd{OI&*|o9^F(g*gpKoRQp>;& zK2zd4zXf6kWQ7z$=wyTVceomJ7n6)OPrxBTIov5-12}U~u!)RM;I@Rbv?FzK>iZN! z%wV?%ZYHKJ1Qvm$$A?lRo|R4Y;}sOZG}S(N`Wco<1N=ROYFgD)J?HVm zk9o~Ai_`!ECWsXvcRilt@5{z7seRr1qI4;FTWk?8G0H+yTWl~G`EWJ8|E)%jI|xNa zFtJzy#XpkbfW!xT=CQY#Gc1cwAdy}zUTcWj-HCdJPv6PW7F)xz$60u|SDM?mh$tKV zhpI~IYQeKP)@HS00)0P>>!Ck%Ny##hujv*D`~W_T_F45V@ekZuDjX&l9!&hWijy=m z#_*Wo?i`zn0R?WyzGNY2JKqF1$P%332eBk80+C-UVR~JQ7aq6xKl8gzOr6U}R>be1 zhXOg-B8ozS47o?G{TSmG;p(u9t}MAt4d1`)($QSLH)mh^+TR3w8U}K~iyZkeh1qJ1 z4`%b!L~6Sxxh~3+&rW9CV+u0$^6YqU03^YXLv*Ai0h7YC`f7ECba#|F26Kti@}=Gc zAUj&)AVr-2oSF<)C2<6UyLsX0LsZJ{_PQjo6y=j7y`zja4J9Duo`vaKzrpVa4pbE_ ztDZK^s6LIl9hnmSLfkJ&6~6GKiAP|5eetAvW;KR_*|H;v57!Ia@+e#C$g~|9WE1mc zM;cI&r!`mZ?#*)sUVlx_OEpyd))ai?#6wyf8k`a&S5>$b6xlBtNf3n*9>J1nhdrUo zxUYK%QfaHpS4Q<4Py|*;E0qn zjkBs`pWncFV1udP2O{gL#a^T2Ai0H3bOmimmqyWv#~PXx%XrZmMceN;P>V}t726Ei zdFFtT-GOSAuonN2O{Mw)7@`EUL(JGI8rzl5Qo0& zvneWouaqK$aMdk)jDXcR@NVXwN^+F`*Qru#(vU{LukDjoQ7LO9Ngdq-HE^+B+D;4- z3>0lrdC2XBEd)s!X>-T`0{Vx;|NCnr-oH6pCWKDq?d6M;IhZ6f zb*tCXvLss3V=#XV{_#ZuZ>4(F&n&b3Uwy6Lcs?6E5YFn_<(ZN(a8;>v)~i-h-fyr~ z)6Qts9Cna#Nf`~~1w`-lwo8!DFuq+4{u}C;S3y|CH_1)zkA_$lYq7psE81L8U*LEO zlJt&jwu<1t_89qiVbdgPv!yCM)*W*0A}yHF@$-|~udz^`YamZ7$rEf=7R6BB{G36m zlrNW?KbBh#QqwKut=R-PO?*#0{3QZ=sD|9VRbCnXJ+T? zI=`n`wzoTdwY7}OBqiYs7xIxiKyugSK>7VUwB_UP$n~CFR}FVkF4+hmbJ@h*0kDO) z_RP3p@XpC}qb~N##?UZ|Q_MrYAIZyW;~6T?=V{lQ|Rs&}jhvRkzaqthl% zU%bZ`JL@y3f2J%&y{Ie|E;74Lh6QNopwesZ`>=5T>@FzHI;jges`n~>NGD9rcukES>#w8(-f+KxA?xw3h zwF9&N5rlL-CLq@EtD>NNVK0G;zFG(*-^2Ls1osCk8e~NPeZn^RQLpzJA8ni z0`zt`1?nW;l(gafT>XBwbMWqa{(>$EmWHaqz&q|jHYSKQrHvKOOP&p{rN+qgT(oOY z-zL;cg<)I$@4;)>aCSY!2}+4yOx*>P7W#~oT}+e?;>3ik=u6g2$$70&zWy*_;+QSe zx_{l_8Ly0A0#gofi-*^6&AWizCBr@+hBQUXLx-U4m2_t{rd-!*vVkGQ(8x&m_vkcw z&DW9=)A4E(V5>py45In6W0Mp~HjEj0Ic^Q#+&^y*Y2*&gLmD(S=Ve+j5PU@)UP0EdPeIvWTvq@eFkRU`pRCb$fpH~1J*a(o8mW65%oN2ASWM>zGo$>XUR7tUP@ ze9mM@$BVd;zRs*x+WU4KL)5hoWe1J_T06OvvCf*Nbbl{=U6i zYsSl%_FJ%Y*ncO)=onHW?@~_*&gv5X zqpUiEnze*a@nX4R;{=PbE&h59>MmYtcSXd(RtO%82Z0t>Ab;`}>e7i`FqBEl54c1? zB4uF%{-4D{)vFL~7j95${I^7H4hg=$Vn6Lg;;}hntW?|F{>a+qi1Qt@CXJK+g~>E~ z+7dw-lpA#@E@22k_bQgvYu@`OLU--rTo3ijvbE>(xTcyq@+@|Xi8xh@%IT2v&3O*~AMpZ%iQ$;a;4CZnA0YCu~7 z6eKOr%Y;ZYSf-z_d19oZox(gIi@_o7+reIst`UkZMo5|iW{3_$lDBDRvMyy#$VsY2 zI@LmmyR?-?6r}Y#SWiC#4ZRWul$p_2DW`g_qH5cw#n-+l7=z0t9&m38C{Vo~zZgfD zg)PT#5`2qCy8;3R&7NY+39EL!{V;7afl+l3<)Twx@1?kzp&s#B`U3AIG9Kx>N)hj< zQv)I8Ur?XToA4CgO1UED3 zg*D5G#qp9vr&YMxH11XwwK>nS45Nni@? z;Sb~sIE96m5SLkJfHk>F+9 zxMN$Wenkpg3?_KNKp-~7ZNh&80ojk>14PnqI9z3K+3MPAm3a%E*i2snkGi<42-_86 zAH4i#Zc)I~kA6JgbFcjW4B>eTFBsaXWBE7sr>&j7_##_HWVNdhv77z8I3@Jxx~u&K z)4A8Z7PVJ7;6J;!QuPHKuJ+k)$Z7Fq!LjuvP7LXW2(+ysuyv_BA+lz-_K@<-skAa1=A^)$tqHP zkMq?)Dl+7%WKV5-x=zrMOJ}o9DzLxL6LD**S>{;!k0W&+78i>aFV^`Utq`Z_)`^zEVDu7XZ+x!NwR3d*IwTz{xA5Dy06=vK0A_(dKMJ+6Fn|gWy4gEN>d9n@X-;1UNm5))dU;*uJemJ2If-3E%{oTE4|9X5736u|X|D<}B4#Y8k$~#bwxy zYf0X`#ihHq$&}skIeFs&JM5Fc^&%q~(_t=JZKo`Kpt{=H%vE!2+n?c9&c8uhxv`}} zjfQx!%}A~DiiH#DKQ)ffPT&^57JwV+|5p7I1Wl~J%#{VI2#h1V5wu)!!9jPS{iho2@|0bMQGzYbWI2CXD&ToKMFAhJ7Po!vYk){ct(P3&{Ze#k(Hkm@zRBI{y4 z1D3^iF~)OKl@>Pt;>;*SehYBlc<<5{*^QONNzb1 z71;&QFgNOl2^fXxrJ6}*t_WMbl}UE^{XB-a zK(6yIzUjFq)`>(WJp$CdaPs{dGJ+I#d7(M|O8!<&A-0bjyJzF2s`@Xu^mKJdIgT-I?rnqGnm{=`vx_BJ z0{MaFXNf?Cv11}>iG^HuC%E9h6Pd>8Z{P`s_g$Fja{`0Jkwom^cz3JaW|dJOY0%MQ z)=7}8AFB*CXCR0g98FEYKRbk%YQGJ>YYjdPJydecFkB+%j1Oc; zb&imR%qtw)(zP2hYmv>tYFG?y)G}nSg%LgX$?)bV_*nnu_X7cyCECmXt;iw^>w52# z2~%f2$b$0BvEO0+9qDu^jafHgy%5MZ-iI~L(pEtb;fA{umJ%~?Yu#rewo;6-I9syn zTSMU0T_YibOdYfpGhEjYR&NOc?~nd!@*>8ulckAT(O55X zuXd2_?q}iKga~O5;vmg|8&|X&?miTaj#kmMlOzFSz`EZm5TpxNbo~`FUc?|iK(iie z^f_zKZ@iFI8O4kGoV}I z#%Xs92xsQh$kZckuro!^EiA*q6T(AnOo9dqm>~{tV=Fj+to5#j&jd2VJCsWDBx%|{ zcaka)I{ql0+NDOURR6$h&RbC^ihHq$x0i3sw5?M)zU6P5!0120q#{U z7ah>5NDLZ2mT9NgKG`|JEOXExxqdvf8;&n$;wZx#89fUXX#)<+sl1?#L=6IC&PO4Qu z_$^8O+GJH$KrqXfPD;h0zVs!35EDN^6rvw0Ns~z(E;;`P12bh!XS%AzFz~7;Y=L zUpH?nh+Or@B9oD)0ds{15CkT!Sx8rS)I=?|qAt@|u)3m8dhcWB984U!hpCrb$Q8 z5mrdG=-(d?YG%FU@WY>A7}t0$3&>#@zSKdB#G2YTH^*LE?QgAcWKb>S@6w5!H=Sm7^Cj9S1YNdz)t;_(LJ3cMZvS#pP>>g)q`v zVMutIkCmxJ_R&H%R|)lS`MQ!T2CKb}_R(JAe?fk58+vzOd09&hgulJDd$$7qwJ3BjrN2{#c4ik*YLG%uic+jDEEymakKAL>BbYC+f&UW9ygic?u(VaUDo`2$Q5>X)%xA)l0;(gvftY`przVTO^y-@GUTIB~6`62HS8<9--0^YJ}ib*_OoZQ-Li z^(m_92e7@q#DqVm(2A{W<3u0A-zO@Pi&Htc)KDo7W*O!fFk1-l5#frwbN4uEy4NUe zBZZ-^rEF3-yNlExv+cd``!?ras#J+@JSR$GTd&I-GG(T9O)~9M{q4rPMPJ->tKkpY zN?mD}dpo1Cc275J(ag}OQ2Dw4=`rJx8nfjjX+^&)2fSf@a1;O4xS5&|6%s{rKbdK^ z)BYNESbKc2Btwb33;DWp{SeI1m)kb3th1lC-Te1(@!>V{>I_Hw8~4XyQQ-Qzb{DnR za0&Y!hQOm%|F)wqhrrPr_hICbm)`Kdxu@Ah0$l-nT1K0m3}(&%n|GeEnbfdX42OLi2VASEb|4I&S@ITh2F%2^bB2~P+Am$@60>F+*g* zy{xWXQD`3K}$#m6-f07Bp6{MbD={C^F8lg10v0dzu+6M2R&UBtf68scL`Rm|-v} z?=l%)8OMy(kUME4tCpSHx-NBPDFk_vcFza z3dv2UC&U{bF1cFp`AKwwDb|L0$(&&D6RRd>O-kezoZs${Xe(1W^8&N!k4?`=auU#* zWLBp|q|5#!uK3y9!$SykY{&r2kq4B8r;;0zD-c$q*9Wd>s*FI&xkxe&L7lh~a5yUoXmzPXy=dGP7IzXmHcyczJ0FtK1%iONM1)e|8F=-<12$sy4C=@voZSMqKW z^gxxOo|3b%YobGd95~)3?4AjF>762g^pDCocCF`7#js4b<_75)*YGk*49Sg{#QaN7 zX7Y}-7-^k@jVfNxq+s`><%Cjg&~Aagw3blX%aHX|=AkmKzC-T*@$-WjY{MF}J@NR) zhuLIGr(CsEfqbnDqcSK;DhB?aPwmXCPHMI~7a(agCr(q3T1|lY(dJa@)REY^>zWc7|Rh^U>!wnj2Ooiy@Q~>D=K~d}%MIgAF z$V`VX?UZ7X!Dh5u#(xuG-h<-q zvgAct&4zRd!;la9E<7vrIPW4tv(YDLb+Pd1#Q-w)8(lRR4*7ODBw_%LBBewJk<1Q> zmDrB%t)qjEcS_=o27%0!tpkfrJMg_IMQ!^lAE}2-#}cvRI2s%(dAZ^_H>kSbJRX`} zOrt|9Rl>+@YpQ(oe#Pbv(|(fazpm&ow-Uoi_~ygSH54(sr^6+GYiKCdt`CJ-QH8hs zsfz-a3ZmFCiq0TX4aNUK?t(h>-M=Op9>qKnok6g0<0D0};HUNvS&BorJyZXhpM5ww zc3WG5I46?%qB--ah6zL|#@ynJ<?eMz#YUmYE2^jR*v5xUOmM<8P#hl+=sC=i z|DF_!hL&Qg=P^w0I4AjEsR&FR`aGsX>)i>M@Ibe;sY$l55nRr*FG^mtU+0AopI@|f zJ!(99Txs)T;S}C2Wc}$(gpi04;7O@830NRC#%0TXM6{Bi?&k?wUV3e@h0 z`j$d#c&X&GwCGkyC1cV>eAuaDamCp$#~MR%6xIFR4i?2?AEjZq@KuM>7(7r$24e4T zMk6;YSP#sq#JY$SK%I&-47xb^(y?*x78NpZ_Cc>fM7se<1bEa%wOVB;i3fF?H=dDf z@N-54!Y9JbG7#UCd?R*I!f!AURwr?Wqe=BABU3|vwY5>oP_)^rH~bdLpX*@w%tjB^ z*iS`cxDsYuf%w=vu0+>$S3F{aau)$GXhK}P=T8oy?_fJ;E?@E%v=6+Ex%`I~4)`E1 z_5J;qz?khF3enW|B?nlna z!4QZ9l_y_#KGa7Gtumj3XLuVc$X9o1@bd0}pxf(m7TKD5R=Z*h)3#}Fe#aa0Y_|Tg zZ}d%1IcK@iC7>9+anD7G2;5=>I#GM61m&>c2&;*tzSM+r#sGFFC4u5H@sK1u7dW&^ zg8~9BYaFTQl^DyFm?tG=dpSd7`$-S`NmvVMQ6wyj23Y6%{{Tu)N6PML*~B=csK%gm zS#&B6AQJP~wiGO2smDs1>&ddPAV81>+K88+5VtkVH}H>vEHD~i4ViR-&=bqCj=^*% zIG$_&zKUipTQW^h($k6#vaDPYHl4y-Wa@ySqmN_2P$-33G$!80KB|p_Sj!06EV-^O z=P1@Ib1{Gd@&qSGzKOjkah!-izJv<}OEY6sb8OD#7qqs%r8FQ(pZZve0*M#kF$Rr9 zW1s8QikN@98s$#2^gx4+L1TZ7-h=g6T-PdIbbAgA-$~_1%(SqT9*~EKu`pnT0#D#a z?3kTVX(~UB6mY}i9R2UI?*DWLd59FwZxiwmjWuB)3+h}?fqwa=-CdPl^UZ$e$z3n3@$Cs{n(1++0aEULu9hT7ciUzwP;WxRS&N*op>(5|mF; zT8c#{^Nx4;_R{t+BhKbV%H{`F617>WN|d7O0Te!bTuEJa>=aaXtciCf!K+~of^5|= z&A_e1zGc}yd}G?IG`O;&^iHz6#q04=D{EeKM5SOBTUu5cAvX3qCw8GL583baZd@J8 z`%dsgx>MDrIBIVCT}~`W>a}R9=Z?(r^tw?_dc20lEBh+1mpbOPIZcr+rW)E>lqIv& zcEs74(%m~T2LUR#iy=bg*0ZR!FqQ?uxlfR-m9zCY`PM>0Q@g^WN|!OiQr0p9Xm=}U zIZMbe>t0AL&yf8HeYqyn5I$8JWhSK!13RsUzpRatXIXPBePX|{oy{r-s*2I7&cE&< z#?hM=v(*o`Ix42KG{65Vg&eCN2G(Vtp{FaM9X^Dq)n#L|G2LT8AFue+(H5PN=Z-;{ zM;+Y2WZnM?D6X5yv1)!22`Ek!esR-+^!6Zh9TPfYTbTH<#QctZ#8#9@$F!4d!dI}0 zW&j&qc-0AP4Qw3 z69C2Kz9Pmysxa*IrOqVl*Ahf{uOR}Nk8C8v??T>dz{F&20B=fxi?r4^^-*dsFsNPe zGw+8$ii_QayA;YrWJR7kVidGiSh#X^9|}D12mG2%X0kW4?5KhR@u1G9kj3*ni(}l` zCbCkQqJy&Z`MnSgUz&CRd3)3EIKzLm7#1^McI!oovTf&xodZHCI<1ou$?4nFE zu64th@*j7&y9A}b3~(cB;$MpZBzE3NE7*B|7M19$q;g(>M&~s@>P zG=Hglo|(c5M9#FLHdV(N43g6e`A?QRds5PHl6>j*voFBg?Q?1Q-IXb9EP_1-?03A1!8R2t0Gfj6Mc?m3 zO5D_mR#vciy%0fYSn>oWR)Yn0IBI`$Fp;WC&r;TKv-<&Dl|gPNGY z&8hm#m3Ysq`<%>izAaO(DfdaoMNbBc&rZYZ27TQ)73LbU0KVN-`MUWwP{wupr~1Xl zcp6d~8*QShcnq!cVzkM(0N%HP!qjGs+pc6&qrpa|E0%W#B@cJtd*aQ_;9l*~zfFYH zRyQIO_(5NaL0#M)_BQw)ms=K|as0EunTUhoETb&<9Pxjq9)DT;A30m6iHP?5nq(~2 zNKN0L<@W0eYo zVxHW+tE6KDx_@zoC}jUo)0|-v_8f& z^zNL#>T|w}TWIC;L|dc^o*+4(@(I}mgk>+qEtWy=!SO9XX6=(IM#0{#P+qUsDljo) zJ7?1uzrB4wfC$Hyr##cryg|%Q{;gHcN`fXH9@tB#BnkeA#uNg>T@T))%Q6WWB@{>j-MzkaUZEqH6Q2AqgVIfV}My)2AVSXC?0F;1-UN8za-2x2GskynJAhidp*egq> zAdLN;?zVt3D3TGvb0ph(C^V?-HMuoH>4F|$WuxC`X&^n`IIO~G?4d08yMjm=R%;Za z?_t)qJh};omNNyBoOcCzIv4vlw{7XGiwD=eDnQN@ilpt%Z$ z`;fs*%6~#F?uAl*8NPi<`65guu|agEa{5 z6|ebc>*pQ}BajEIyqMCC9cF$tTGTb*91ZN2L5FlC1Cz6xPL{}T37$PXqL}za};nl*Z6p+#cWa6 zg1VuT%WCpDdH^VH$nzg6=MD^aL!D3^V+w|h16J0}6X6ad_cyQF-vC&LzJA(!@olV; z4xm!;@Dq+LXWz&bvrpLW@%ZQm_$mXy-&e-g@Z+6I&IkQ0J}1`(>O!_vxKKH2(qD?` zw9n`qotSshJla-Ukoa=>4*h`O9lz5EB5Tx!e|7|)bQmrsDn4Hg|Jjp}m<-zTj&me~ z1h6W|E~*(VoM2?#BzXueg-YJo`bJ$gaa)ij*!VJ5P{fY?otqw@BxTLOkEdZ|olTL( z7f&i_aYqR`a;j3Au*AuD2qbec!pcfKnV2#YfX3a+D>7kTCy=VW#=eswYRchW0W*=z z?#s1v`o>+*LN$hK`Ei>gUAaUM;aBML&n$I%P+G^Lpj_AMugb&q9(0+-CGy%KJ&c=w z#eHlE=Y)zi8i!ML?iH9=jB=wVl$eZ$VwZm(>9)k5lZ(Kq7{|V4h8@?=!e|U_SyA&6 zbbYIqoWV@mGBPMFs~o!K{<*}DP~Ojs|9&^cZ|*}Xu#EL+;H^rTkMq~natb2Uq<)i& zd!dpd1hmXF83Yl&Qoo7habHU<_Qv^VSjkt_^!tqZ$dm@dkH`6IS?N{Qh~#1!+r|z* zNuNsgRyL(4xwK%_S9rATuO?T{|KRTp2|}dHHj~{s;$Cm#=j-wU=>FoB8~0h7`f)2I!$aFBXpmVlu-$5zX8e*xR%kcA%F(=0i(yx*hcQ?>yWb zyEiAQ_H(0Nw-x^Tj2$f*E6=-s79uEM<8Q8KyIgcW#*V6T=hv&p=mC_j0ETIGj;S~g z1^M{93z0Y!vF9kuVUph7$f;ChC6fcl!0NAi{n0a@DemU3zbvo6$VC;+-@=xU9$6gN z4?hWV1XoVSX!Pe<{|?#58*<52cI?){sYm_jdzZa^lnTc|HrS*XmoZ+rzH~Wcz1NUK zMKATL{);!69my^-9yDdYNgq#2`74!wU|9fA5!^ZA;PL63M0UP#O~lXm_Y&&Hn23ey zJ{+;y!wW@1Uv@-insP)7n0eX4Cs(3ahYXYhM;ksUi3lF4Xg{vz>N3FvsZRqS01Ourwp>aV1ozyG91wv>$Eq zGr;=S_5|FY(L)Z}o(Fg;_?*tbASy9Vg-YKK78$;0Ou5>{t6IfIfg5p_z)<_nR&m1hLuuh%3xsMW*}sM{aP?e-4zap+|7`uv471soXX)W{ z04bqW@$Rt$lqLQFF3UdCma`iV@?D$eV{|YmGFo0~iG+WPLL4n#uGq<6(x@CG z7i)h&D9bdd4!+WsD@9nVFc9I>#GP@4J9U?GoOyt|5I3d9>D#_UCxlOWTP&FiBpll6W{eZI6_o`AiFUz4R926-uo>XhD&vxlQf@9b*PVV z=O#Yh`ww-Hz~8XTggIope|5;uFy8S-2aLij2A1<`qIc905>9ia6ja=b3JC}aA^%iz z_wh#-AP_~-ln*<>d<^+=XJVGaU@ejgvnQ3nP!2Fuk|i&OCf=O=S;I?BNpNLhn-*a$ z`keD*)0K(QMHfZTW#-U#Oy1A48|DOQo7(fMLyhy$x$l^ZzH;YMG?Tgp-lwPHUQ?c+ zCr|hg+Jb1y6CiCJI6^9x#iUki+f)DlMryD3t7W}KV=dPtY^4_6idko4txmQVzOL3 zI7B(|H}KlCO})h{eg{fY%k#=AezK?B&di0zOW$Y}zZ0eynyJG+!h)srVXGD4EcHjW zU}W?wg?E$wF}gS>I&4`GmmtxbS5y=7>a}+S78?7&c?^c+6Cb{zaTE0Lspw#${&(06 zTRtgXWE1vY&u$WhG0OCN?@JjK?2kMt&U<6|j{A9*Ir0^x37>m6Ap=(pjOx+LJv^tC zPxY~x*P>%wvXzmdRq%+KcEXqV$)(8m=qs-|4ScvD`rQb5g}Sl!7{`U9IVO5~_gW7) zDLupMz9Qv4)OHfM-GYhCS!eLRJ#sx-EVqW!KZI5~6m{Y;4Dh~Lc(O%mPvBlH58ba; zfYI1C0{iz^i!9pIQj}BpWt`jR2OqvqY*~#PRloZ%rwj+x2TB}wfD;9=1wIbT5Ep7? z(l6BS7Q9>RhQ5P2M;v8Wm7hSAvm-Ek<=WiT&Xvi13dKBSUj~*(9nA<2`vN?da5?oi z!eZiUVl*FWSZCy*bXlA0Aqv9aT>0|H+~W^JuI@q%oIX(^e?g3&uyF- zPt#fEr(6b5g{wjH%lP|?<4Hi$6Fy#2G z(AzUZA}*Y5Iet+-M@{H1?%SOUVnWYZkCe|nxAA1-6fjt6D=h8(3&w4VjZ=Km`=^^C zO>=sdNWPDA=G{*|Ekag$8r+WErQ7yX6CfkdTMM~3y(|2KG6G(uvhHMTY~5ZuO%YD%zpO$^bbFe*B4$}+maq~s zAR!@g98VaS%vwd_#V4_d!ahFuLxbn{&wKb?a9t5M@2bBf4UI^<3-I>uWnOK1kW`PD zDkSt|+EyYtKBcOvdxP`2e*~r>Vid->OhDYUA|Tz3{@h+sg!u~K-TWhys)ZSt;9EE629o2PFYsIUyF*7=Z$3fw%lNvR?~Ub;1AxZ=5IYtk0sPO*2a zeDip_#FQlP7)l!bWvJi4+}|an2wNoISIbbt(;5y(l9>#@fe<&)!O@!Cx^MtNC$h#E8bF*iPLRS zps`-2>e7#{WJwE z*lXPW1GLXQCx1G`TiF7`sf)1ck_W+a50|JtA3tt0*cvQS98g)peHP6Eno~3|qBWa= zFuwj8r7iW0+jeKC%CtO0Sk#q$37b@V3Fg`qz;D zX58e&kcuJnA8)>d%aq$p-~&nYw-jh?EAK#h7vgIc?Wp z`GVQbGi^Y0$&Zl7GBgxLOjX&2yGsh^kWC$PbRYy%SX~oArOCi=Y zPcNsf&W^jCD+bigtjzvOs39U~n=f@ZWn!k&gnMn{Cx8_#bHb|uZUCHs;8LVZdKurADr&paVIzwP!Rlk)pbWH z;R@~uxZmuGe&`Cg?>ZGO;y4Q5Tp@PWZx3h?>%1!ba?v@4l(6jRtc191BJ5m8>Su`e zcN2YL66Cod}E_#70y@;YHrQloY9^7BHUwBg`uv_K%#KhTw~3jvwm3^onvX;6L)LIPkNVZJ;o1P((l zo`I4NABz`ZABF4wHzd!jhw@cNz=MMAwEWVLkW(Jdj3{cUK9p|xz6u~7+$}@2gadTg zv>A83ejLdp(by(H+L7-8+(JI(t@;L6WXZqyJZ@hotyXZ*Tq6y@Jjn;~J_f{Z>_<$f zRCIkcpgOwUQLM|%`-x_3%`xj0Jtm=^!x7jYS=g6>g%6b}wDep+gyjEdTrJt}mq(8G zC=?UQ^}G$X+eK#Y+nG7&EwS6xDIB(^jhgabt1ETwl{B()gXWqqaiyO_PfeqPpxS7X z98P_ve>o}g_rF3k<2&iML=lV zqySnX#BFt!b~Q2DuSG;(#~Y9PmbqGyO+T_@F~(lzV}(4ZguCC2#D|CM!;d*&M39f4 z&(?U382XME7@^(oB~9XtQe8)w(5sC4J7j`296DJLj=~M<1WtP%8Ir!!-tfI%ZJxoL zba+{ZagJcO@V2RC6$0nb6giG!K93TF%luSj)V_!t^UA&uk40f>p9~M! zB6bZkQB&9J8sypMW-<+hJPCkjM%AeT4upIL8>}l-%nvpQl?`qGPhB6findnB5ATO4 zY1K(g)p}6(O=%dS#HR&c*&Q?AjXs8%zGAX6xmUM|Ml0V4CsR050t(=XC~>ED6MVet zP>4vzzjGK^5~}aGi85yeuH?TZIgj&{v~A_HjCY5PU1Qx;w`(N%ITj)Ok2NFq4RQJN zzR)=8TXn+J=-IG08G38i?l|_q%Ezd!e5GspZS4D&@ncNc9_6=Hk{w@yi>B$-F&ys0 z_PD-Wq-JKGk`QL;pgFm7E>4nmvwz0D>|?xj)aKU03Y2{_0R~g{X19{1b8rAmxZ@!z?9d?Q&--3DWno8nuGQm=~ya%j4 z=)T2`D$-zAG}bK!K>FcrUU3}rray$Qnxe|vRM@x}E+y2o1WnWCB+X;oa?F(i&8@9s ztu3{jvfZTvaW7K$+;>&)(km9XKUEPe*K+f&6QLHz7-1C@V%}Fon(lj{7H*k>u92m| zZ{&_8g|HrWW(V+~O|YIPOE41SaD`wzYy7yha-ZwpiPi|8I$UTbk+B?W6C70#7ZVIw zCc_W8prrLIE8A^C^VD&dc4?)xWFxbokuhR{Ud-O%CYp>Hei8;Bg0Oavw zjy!9AO@5#NH%kb4lP=o70x1}cIf5ZSr(Q%3V-J4}0?(K`^Jn>`k}R}8m22LKzl6+P z;b?epngvbk3W_?d#dyCn1&z4{7rr2D{IgTbF+65B#F2KHj4Dyel1iob0;git8)TeG zJO6f_@0We%=udqv_8Hxd>C1TIT4;c$wmjON^#?l+(k|l;@E+%H9$K?S=BhE?)sabu zlRwe;@RW;<^{cf#zEI;Q2q0}Xi%Dx9kDX1g6Qc*=_s1*Wvo8G!H-xi}H{<0L__!e9 zW)~13?Y?5I!R`0+fPY<7MBZ#KK%8+e;FH!2z7VQeaA-XSZk9#qE9vjcuT=)VJ0B_) zn^he!HBB*Q1iQVWQN z4p0)gckqh&Vu~i+)C)I1Y9uc@DS@ZY*3^wPvq~eaWp3#iysnn?IxR(HNiM27G%{cJ58O!)*_3 z=)ebcWvgwTT+$S)&Yu{wk-xU^DQ`5J#~*O4W?XLq`S%74YIspiK`HgVFX}rE?3#Af zc5PwwE&I&O>+_b5h)<_RW}Ijnj`R^-QDRH{(Oggy`b0tUS?A@A!}dog9)poSjF!dY zY2a?DRyB|IRFO6@Q!;xH+KPBjkPIVD6MC`k`FjamsWIXkuaKItO;1gzLgoT7vcK^z zu0VN&El2)zn7>O3tU8@KA8a4XHTAp1zs*tEuRD8l5lo}XH*c@RZIdnw@vtkf<)!?~ zq55>?4>N{(vm`6eYfhQC1}TA8p%&EMa5`wL+t8E8N0G|Z5cGUnESvf=uDlefW>H@FLOGWi zyH5O=H-A5OlDe_Fq0yq~itD)6;4;}FcSn_C9X^liz1rU~iYEm;Ac{tgl{Oqpj~-o+*kE0!p|@k&sU|b2)-w>mm*h zPH@S*Sxf-T*yFYz-8f(2j})~Xh^#QqZEi1vgnVsz)2GZw&aRx%+`eM5AD#5f0@y0c zZ8(7vY5^m#)jRGNQY46axpWG^Tagh?oiFiJVQ)y0Kl*hfD=azsL3rQk z($y1>wbOq{=CQ*oU*5CWoAS1+lp-E@f}k(ksoND$N7dfrx)g#qk?TquerhmMSMHxV zCRpp33uA;Ugx=pia)Kd<>Q7rq4QatDtN$`UGnau+=!*^J`BO-41CB)#mX=Rqf^CsH zF@zNRBZwOqDb(Q>-4 z=jvSIsDb&2qsbChSzKA9L+?aZ(U(mYu^R*qj`{cl)W$|?Jm!s?r@imSjWkPJuB9(q zREE;o>m>_8Dzxtta*$%L^2Qw`oG@@VZJ#4N&=AK7@b|%qZ}mj%ol_uJt_w@>+3<}a zHGz|N)b9&v>qi|fOhkU0zZY@hBm>#7(Lv?1LK|pb^&R)Qg)aYD0M_KEFOG@D5Iad)QJ0!=?YZl>*)D+RX6+h zoSmj2CNCwawly9asi(jGxvSWpmr+)&ZnpkRH_KRC;Z`3pi2x#+NOKdhhq4uG&fqK? zWC93X(*i;v(Ccubtc)6@qMF^-ohcf-8Gm+gL+Oz4h((kzr9+nNVPYE6cQH^9C(AXF zD_K87@i_hNSo+O599bUh$9r_EXr6^dc}}rcm=9x_4?Z|;%Ls;^>+~0+4c)wKtIk=Q z3AiUn!GsYH&7GYqyk(B&WQfvWWpHaZx)rZIAlr`JlDMQE7Z~q^>epEaEH|#{D>knw z-s3oT6PeVVwFS=+@l3UnVV}-!=b}a!(nbh$WQqR#m{r;AKSrh^%ILKJ?W5%(^hD6` zaZ^_1?wk;v6R~6nMAT74Vu}EQ33FgN-oefw;wNrAOPUr|l2!Rl1gDs8f4>fQ(t=q& zk7g$=frZZHgfJYzs&h2XDs z)y>|o`=kOz1b2!x?rS7kc`q9+2^k)TBvN9|>Uy4;aQACLuBtTRWoYDh95P)ToFt(D zN331b3~Tm5h61{(w_e19V=eK>`66)1>_$T#hJBH+H2mN1r$28PTkB9cU?d7~*>~!Y zH{O}?2q8y(_N#*npw1I9QpRX#e0QpYv2*%W*_GoUI>ZB3`i^S8jHsHedkY>42MkI@ zN079ACphN~jupeOvzWpOo|u%ZFj_AS_S;o;IFbU4zT4Vwe34fDecVaFAPBHwxu>8y zB)Uld9g=YU<;J1`GyLNuJp~1U1Kl05?O*@>ZyJFY+<0GMd5>qQ4cRG#5aKV?ve%c9 z!k`$$5GFo9tv%sL-55s^I!I+DxER?Ehb0qLe-r< zeE9~hkJSE1$CFZ%Mgp+lAdx8ZaId;egRfzbmp-(SihG8fJ$Uuf$wvDF&Vo&|TJ@Jf zWOARBkPc9XFMl3t6WFt`rSLQ=nK~XABhrU)TamuFrf47}ATxg-3!wUb| zI7Ams#vjq-v~KGbDONlv{d&VxWWIXQsnA}xgnVfe@*OyapSM&4_qz!c zc6h;;!5ns95W>rS$=y4UIBVq6x&V-OQE|Ts!f{NkTN|ob%04?8Lzb=bHa(?cJ9$G6 z=dL}a;@V?Qu`6JwL9hO?I~gNxXOw%Zm+4j3O0fB*V&@k?LtAO!r&MRr!?02bFn#4 zV!15n&1bKt!K|}t6B=?RobG>nN5b);J|8$w8C>1_&WRd;68UkVZQ@=~7|q3m@4kKm zY^aie%w{MvLK+wHvo*3=AgW4x6d@)?^0wVuOG{UY+B|v8s{`O>uCU8p zDVz)S8xb!)(2QNbFCfNqE7b(+a<9s-gpBM#fogVfh&;(*#ChkwqkCl9d?lo!(w?T> z6a(ycS&g_`ak#qfkZ12Q;_;kPzw5ujs1kja_7ihm-o+t)9NnU_?F$gEO#5XMD?%7a zxG*i1{rBHfTD&;&q4m%4BRKI_xj>{LUbwkANZp{1@dOcS8^3&yE77}x*GEjrshi|D zD@E}!?6&3qS9qA(E&8lgCM-j8C497W170kT$9J9~EdG?cU!c(Kt-$0mn1+^Tkc+tz z_{+^mtSo$I@KXj&5Bm(o`WxU43ef!@A#jb?Xf3||gZHr6L%EHMTF>2$#d8Vh_tEaR zLFx0IMpWAoIEF@k#|fK)Rq59y(d8+0VDp%tVPm?@7i1%F`h^(T!LES#Fs#lM0KGQ= zHB{J2$5nN$|9vRVd6*jL7AuDsPRpzAZxSzA7v&KBire1Tgys~4D-SH&#J#4+oWD5@M%px5fjOk?^; zttn3r~8v>j1jxwMhx z)nE=#@_c9sw6HgqXbwSw2`zn%&&X|kla$K9&?bs$>;afv+7>3Ru4`si=V?(Y)g(Q{_i+_xJQd zxAtWPr#1f3F6GqdF_SG`jEzUWQGR1C)*MRElfF3N7Y#H@5DE(c;&Qzk_hvh|$Hd3l zAFefy-lLNb&jj|Mr><^=ZBqJx;cH}5GhbJ3-YdL{G0QQHOg+-3C zL#Pog3y(w$!qJ|5lCS(JDwhvGR%F)Cdh=TIf}@*l^m;D`iR;#y^P$VzF3F!ff-`eX zC>oDSPP9zAhlr1L-~C!EX={@KrC_1V$c6cR|tZ@ z*tQDhQo6=#T_PCOWgOT0k9#;qIvEPi(F5BgK%D>o0Hr`$zuqGE+CkYD$>Xh(I#Td1 zx!1Rpy;)@TOX^6$`(&>1XQOHd$m1SK9Vz&P{HKMocgW*O*@AsW-nW^uul_9;=ypjR zDfpJ_2D7XB(a0(Io*o@~9(oA67i?t@**277SLa3IUQcfl_xck5LH9atv&615HzP5+ zSC^+h?QgAhKzL~NsS8?`iN%1x``hwh>l>M)BIJ+*({H9?T zy~=Mv*_-9@9!YWZISixMFDd&I^*GD?u3;Fx7E|`?@))wJ^$o-5brWR=&STjNC3U3W z9j-s$Abyxs6@4V2*rOgxeolGFjfA27kYZ9C-Q z=aM3W|M2(W{)7zh#*&2OZIu*12_iR^tbYzQ!5d4Sl+4d0MUdQBqV1@Gk>$fj!*cuw zFSosOM-6`;?nOcGmK3Sv#*%k-AZxs_U;Pf`TQjU}U>N8>{oUT!*GOgmXpEXwD@ z>2_P~`5M05^mxfr7-Y4{0erjd&m~irR2bkTC09RR!`IvX8wHlt4jBzmLB%CS^q0fw z($f=PsNwrZC z{RLg|1<6#55G1a+<`r?pZTJtm;=f)ISA1Ql-j)=p#1+TwMAqnvA4uj$k|Ic4QAZH) z1-w)Lz!7I{X=TfIqhJkY(apRY^D~Zm6&a)R{`mqn|KBCW!mlkQ=Y8r`ao)d3p2DDT zbY8ldcW0I}I_&IS;;=vL!bpY=JFbtFx}cPt)bpA+>ASC)IH__@4SK{G@3@3DRS~QW zU_&W(pLMS*r`%AAi=8q$+fYi~=h(jr{m_e;-jRY!33v3{82LZhz>kl*m{S}xmtx0| zrtEgfzEx7}FH5mw_&sJjuiBj;-T=IbvPa5em!ysqJW#q}g&p3d>;H91a^?9)nDN>Z7*_I0xy(dLwe~ej_L3s$v<=-n*Eqf%-{k^9ZTSkB<~!|w*Nj* z4HNF+2LEDN_qZZE4G9ju0l-_*d! z>R>gT^9^ci(1EGgptrZpjcYJltohartXYm#ciGXZ|M*5(b(bBFrAUC-WoN6lz-#n) z#t%50zK4wZh8yy_T3)xV+pJy;tMgm z4BbMziXjn6v9-N#Cl~p)vX)(BVpT0LI({{y(~=_kb4LHOO3*(ZtI#X1Vf6WuBKlKC z|7onC4>(w%H*aC|&5|PeLqEM;-padIZO!wnQsjIby`AW$^A{wJ^5kM&>h1QpXb5OmvlpV@sHgK9YiK zM&M9!)#0_^Xn`%1U;pD;z>PK7G6LHKR84po@7;uJ>F1Be)j}0)LkDYVhwJFshH>Ik z*O4wyj>97JSTZHjFOU>Xbma&dOa6CUEze4pN#1Hn)lkrmL&2VH9J#I;LBqdekErG0 z-yH(}Tv8kX$?)&2pVR`_aroE2t(-Ds$hY&zTAqCjJF1pH#xUimTAqE3{T*BDNJ){M z4EYuvh4qa?z8c9qUQz_fkncJK0oczg9S!gZtGs1I<<+I5;Z>C3C>af5A)75JkvoK_ zONg#zqK!wRP#mkBax-hDNs1P{ZbW5p$Y=;2gN8Qnt*(}2Dvl?P@P2=oDqi*Rt;|h% zR|;S)U9WZBF|{x{dt78~Ii45!H$I$)@B5|+xV^^?>wa2GJLGH2

    Gb)|QhCR`oqn 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

    {@8n{T11nep42~{m`lq?{ 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 z\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

    brx*mSBU2$k>eIH!>a^ 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�RN7d4*TLk8LQ)>)`PoMFeVbD7<9xyFv$qkpfiSs_-t z{-<05fbM~F#ot%0;X zX5%~|njr#KN{Ac}CCXI_kBY6d6F^XXPDy--59Ubnza!`F6*(%pvqyIny&z+};?_x0dgTvyOtSgzk5aFr@n(aJ+Ye|Mn56)Y-a7SWm`n}=n; z%k2pU?sNysyp_TH9s`uTP{U_4-R|K56r_4FN;1P1Q5F#B5j>eF)K4&@#>U943f`)Z z2rCgez)l z19PyZ6kw^}MvJ}OGsNQ^9;WP3Uh4I`gJl)8y^(M9@8y7b2j%zR%xF~odv%G-j0Tk7 zr-wZvInZy$1 zxKU;@NJ48`2A8m<43f}gy-bo<>DP0M9bLNEyR(eYG8^ZLyM$gdhu!73M(zSXL29(0 z^vdtSsnHI?CgSvH*D#QPPqb4Qjjflv)E#t{hg_Ys39((YL7Lz8!m@e8P5gi*g9`>4m?U*u`Wq}a{`MQ6Y?#D30 zbkPDM=yJ;4x`&4&raP@bY!8Q?I8_3IW1J)0<>pqn+~s+GZ%{7^Vi*T;bah1#_sz@C z&B^r?=Z^>k^$Mnq?oeWB2UmJLdN~tD_bjo5w+D1TlSOwi5oG-27<5(m43(liC4zEb zPJUjb?lHYiSoi+!BEL7_EeR^?-^>U0@J<(o64Muj%MH+jd)l}JAb-zb%R4%$d!zVe|7Q%JQV^_348Tq{iuG{=?E1!(yD z4!VSBN}ZXvMIdZM3rT%+SF!HTPyuXEMwGfC3RcI?Y%Yv1T!g=q(Ong}o?^WiMM{Vq zXDfozXQXA;3PvZjpvad^qf8mmTTSvWfd)CQqB6ZxMyVcz3}%BuB}GKq#wbNt4ZrRx z?l}U7?wD`|GFDhp{d$GV?IB(oOD!Z5R;N<=H7+mChHWgS$k&5Gx2H6~!a8O24fH4) z!ZL|wM2l>?z<|mMgT?=+n3RbqlIkYzH(D1~me4CnP^R&|nL>A|?6<*Y8+%uj4{hQJ zxv3z{b9+jgQ0t%XL|IaZZ}#>W?iwNFz4XG$Qd9x>mk_-ZU4)Gv2(shw$6+Q@s=JtY z!%iwT;1ajJ#>Q4YVc1&5cs;4N-&M*p7?TO|9^Kj$L`5H6IuPl(=Ta)R`uWj*?=VYKx^qtDuUq3TPA>7HV*|C&;7xyw_U z;q{kZQ+18uh}^~d{NAb&867+4cs(WV(oPw9i1)7a6aj2eNhwj!H_X(!sHD_R!#k}3 zaLVIIv`*j{KsO?2U&`-johYxGizkL=ZjXA8* zwDwrDO?d9GMs-4P#)p) zTQt8gU$fp!ahieh3*nit;jl*aLjS@^qn!2I!y46ws81Tyhmb5(xBVWXZgWJV6Cvs! zcx0lsZwlcN36t6$(WvufS(KE1M5CI^*aBA`(WpQ;l}TutX6=1MqYam3k#)ckjgDVt zz&@siI!d_nh(^^yzE48aH0ytlXw>O)gS!4a9=~D@$Gw#54Gb@(Ka?&>f2ziZRs|DSbG$ z7;$e&=_2{qsYVEXWCXi9WKjxa(vK{3=oNSw@DaYH)`N7IPaa=|w53RM(~n;)=nsu@YoTJ=x+rwQ9{!+ z>yjfHJ=Dpt{9moPc_*TFn+Z`12_fNBYp&sCisi~98l_9_a0yM*tb31W^lgac<863M zGw(a1QQpVO&ZF8is$9NU17i={nW}|d^EkC1+Nju)BBCeTU{=t!a~7qPlpzXlxdqW8 zZ>1;5EepvHZA+wWNcOo#lzUypNCTG3t~AtrvQ0}2_Q?-n$L5o5c&cD2p$Tm;8FF2j z#oM6xg~+5fsFevu11B% zxF_3Bh6OcNQo7jgs%9}ZEF=1jjdpQH7DXBDH#XWyB>O-FbCq6WnCrJlbN$BJ!(7iL zVahb?nk;I2e!LP@D4}H-O-RDqx1X-b!bK)DfluDNB-1cWzF@pVLYU^HGRq;B{I-`6-7Fzk&PZZwuVj{C%gH1t%50r5R#xg%AjKCn zS1N@(kmzMr_{U7VkS#_O!{o*GEJ_|mrk7b?b<4-g3YINzH@{+>#h+N`+2Jr~4ojuV zXC{%ku0f*)iO)*19&XU+c_uso{r4!}n4M&8cT}UT_AIh?I;zp1_*CbHqZ-u+!LlT) z>!?Q8I3NPsVs}W!@+9lD?HUy#gD3$^>qN185)1{I`9y~>f5%~1cS#aYEt2dS-NWf}UIjsV^?xFXR=4>$&+44T&np(%gug=OM zTOCsFrwyD^kcFmaOaGLqwsYDXP}O{Dp;qo|$0E=wZfqIHt6UKK6vDn+LlC6Yc5TL|aTSsrNUw0LiNt>ZMG4$ozu=11L(k|ENaUqI(|+P1CH;9Mx#> zb%v@Vlf%PmFCn^FLhu}!%-z#y<{9pu%7Q_k>exfibW|Y4o^7Qx4|PjrM2{z9Bz)t# zm`?riWQ>G&U5_0J#z^=$Z%i0_y@BxYjhn8|B1)KaRHNEf1w{YH z+PB9yQD*(0G=PnoTH2nYJV8Oq?X8=<0U8 zE28Ks-cakEn*yTX-TJQU1yJ#>h*}jz5m*&hMP2=U&UwyECzHt}VSoI=={(Ol-*b7+ zbD3wJnE=3druM+oUsb~QCe9MV6^+%zVO=`hnpJ~NS?)an{KB2M_>k-EaTQ`%fXC7%JWx*z#2+{Cq5??XaIPYuWtknR*rm z4*j|k4m~b}3!-Z9Twj9Izi7+i_eB@Ep#)&qQD0X=A4@G|>RA}*{JIh%ru4#+!JNN~ znU*j`gKjCIoWK6K5Kc&EeO(FtT>Csz&%(g1Usu9f6SB_&`3y5X#}pxN7m)uEkoSIF z2?JdF1yj$$!0TUELUoPd<6RcW&CIlwDMH>YAj36irBlxo_anUGg5e_YUzZ7L&EiER z*f|%}*s^$033kr6us8;=h(dl~Et-cvm$;}zbW7UFT2vysWoJ7qF2U`K(`v;Eb+R~1 z^kQ!965)J3Qv`mj1bpv(T?z1kNTVl80=vGhgy-r) z5b*4*gwF9H2o&wCgsJr*2$b)vgiGr~BGE5qn5&s0+>!u@MRN_~JtOS<(*(BfJ^Tah ziyY63<|W6Yeb_txT`KJJa3dk$`V#6L2T#Oi9`@Uvl>h<3RmRk_FmU|NN@$yiO@qDT zfl|tE$D}ZJbHsR2!4LV$b*q)m-9{NkMxpz$piBYbX1NBs?v&GFVtzut7m|VlAp7pDAledt`|9gVX zY$0QRKEW_{i`CdI!dM!P``NHBGZ=_4&bV? z#cO@=`^kphtH=&9zQTa$81u{WQO(<+HLUAIre=ZxTuVAnHFaKFMp;WEz<6dqfhl%` z>&j?Uo;Mjg!r*wvF=$H0JDYT^ONooA&^ZKcjJJlV#hjI8)7JT*-!x~XB?L7bf(M*J zkV!K~pr2K(V`@>knpEyIRj#%~;2CCL%M>H9MnvFu4XF_rT(($DfdLl0=>S`6cLF?0 zxp+#0Ef*i9T)YX3W5|TL_+bO)1P=I*axT(<|ES1Ce=G)%krxLxrVRLN%W%LysWBwl zvu1x`#CWFY%{t-D^^L}e-pf&5Uq&PP+D0BR_m~m_8ZocLKX62UeG1CpsNK&pua?oM zJ++BP?Qii99JQ}MiAU|VC-J+Lqkk=IIgBaVf}^%2r||q|RW4U4=97znDH~F2)S&H__%dz_2+xD`9}SCjQ2-HgLnvO7OKB+_&u~#*bmQ z<7~lPB^4(3KXz8aEhhK#0(-={%=jSF;&nSKVMA*OieKMZ3BQ@@kc(otrp>OZ+Bj6O ziq3-!Ri_(!$VIpgXr3B^l7ysp$O(WV{H5E?Qw^KNrk_8qhoS5b;|k%_X(8~d$*u{C z9F0IZo-o^YdI$KsMWloT#q@T~-sd&*bztyX zNk}uH`1}>aK-AN9fUZZ}|3AY1k17TAE3h9LFzw_JjChqR2aL*iJM91c35D?N$!K0X z{2DKQBwb@*+^npl1wz$%$<`=POg~| zz#UdcBK|I0>ZsiH7bEWzd7~f0!ZokYJVtqoTB$dX_W2iD$dK@@A>5hEs!F*g*uY;y zNUA$SxRVO9xp6Vs1J?STF^p`3zv>5(MU+mXRird~wpy?P@quZG^udk_h$4rT#1X?! zGoNs(XW}|30H6nI0~0HpVmj zVO32t8OO?V;CX@6{EDSzYcyphLFeZxAcTh~Er=La)DlB-Jb0A3q9MztztGX_-Ksm! zkx4}N?L@aTy43a}aEH zTmuS4@P{AO4hoA|QIN}Smx}nu;WxPj7>paqPJS8ar?r{dDgk0X5BR4+UCRf|thLp0 z`nO+U_2}Qwj20vOh<<=R36xj$fgGF(iWnKpr`u)~@3;?(?^5fX5;8uU z?1I(vhfU*U0TAx(ijul3W$yPUF|PI=qq{OY?f6w|bsH)ww_j06Jt0(UyYsL1cx6`n z$1$!>v0*zy6R_Ofzm@j+i~kxkf66l1{nUGf$?P4)xXN(dT@Z$yktx?|54k!vmDq)p zYjoKD9o~1M_d=#xyX_TJxjkx5o`C+S^~$uq>Z+YZyJipQs_D2ED%W}?TGv-2Z@4v! zai>Q@`)hF8bn~sHdOxAlr zg{!YQYhqEY%^i2wbl&v;-n!@v_C(0^o@N06rr4`9tHv}<)jA}jKTO-$c-3_>frlc(2MM!R0|#T5(wC3|7I*N>lHY?!|0 zk#MB5)PV+pR}J5eQcB9pMA{!u(Wv?%9;zFM>FMCh|hdqkXu`je`u(kd`|y3Y2T9GgcEF7JoxoJuJ34hXrd$q1A9Ek~=K^ z#_{KvNc38gNp~3I>XruWVfQ|{puPadVFX)h=~A+&GMQGUhefo<-i0f3ci=m=+0?Ys z88&xh9qkH#k5=|L#t7D)eP#mzVzzG5FtOUGY}Iy1N2#;^f(NnnA`wiV_W8D-(l^NQ znmb+Tqp_f#n2w?5y&SC~%2bf@emoUI2VOPJtCD5mm^QfP>-)Cb9Egk5s<%GiMg;PF z0}0j^ZLEn6h4O-%w+izHv$HO+S3K-m&cd4r2bwI5>Um+S=B2kkWwv}x zniI2+b`|h|zgnZlAX~(^7a&0Hw>Z)ne~p{43Gq1XaesICfnxG#@Gmgmo0U^OB}cMx zt{JE?iE$@(-L2AF`}PBu>+Y`J3-b3E!LEPCPJgIEa;^DKxd$FMU3`x^{JQ>#xhLCb z*L=sVIn(wW#+A@nmwyGUpw#zJ20H(mF~|O1fE*)eb|ZY=VXL$I}n??<+AicSJ#9YcMIng zuUzAU`rlzFJfdHZRw{nqLq~lgE3t{q=+|FxVmr=;2LK2y^)@uI!XNfaMY+0jAW4-p zVB%mDlDGH?R3HXrpsH9sH(Q4@4(EQ*Mhx7*FFzM*d(RSIY=2~>8W0Ui{NY2zAB?SP zaf(rVae+yld&xHJopxY)#F9O&6vRmiet2ss(=pK3_yOHfG)rVdNl^}P&3bv zFD#5zDzdZ|6MrNl;|&v#_W*V2{-QKHKGc)7GB}VgG@1#_Z_GE;C~(JPw`=){*P$r> zxG|yHG#b(sm4(|FDyxZ?A$(Bw3IO?wYchdb-k0JK6nGaMS&vUP_6yKI zO3Sq+;GZbL#ZGzC;<<%?c;r~acD`E1bbC4WMXS~T2>*UyZypBsI*H*sD%1>iI5~~N zP4?Suj4MHZZ9YqnBq0x#mE2qVG-J|fJqpWxcbKR&Bh9a|JDGycj^R02oKhqwb@qBR z%0^cFl2EXR*-~v4fILNX55gTfrcqUOc35m6$pO7Jul${T3YTp`CWXBf7G1&0`M@U0 zJxV8OZF;eu)m4~8diusgt^&@0lOD!P^}`{V?E&g&v)1q8x4Nv{S!^-8j=Y$JotA zfxWeW3y1f-4Rm@_Q)81nts@OK;Pwe|<{42{<#K^r{@z+eE&2zdX~6Ib0-U4pyVGx< z;qi}cS|qQrS{Zsgzki2n0!~ObLn{|@@>&5K7sJ#gn7M>Tv|uKmWclIvxLadNSJ^p9 z;Jop68b8^kp>b+D#jR-XJP+pW5k!to*odRouq@ zmb;1MYw>Fq5%zUKKnN zu4(;QywJ{c$aYo^NayJE2)ij{b;D1~9QwjpftTNz%6sNE#pZFTqhw<^Mw?jjTBji* zlBJC2@mj5{15$GGg*ztc5&SsKSq*aE$2dW`Zr&M4;`?U&;8tcIn;R4zt2T~Pm(y>U zpfN=%Uadjx55UT=-A0&V44}=jxZc9KRxd9%*Z%R1PqP^c=VGE`R_;m;*ENUMo23nR zs(}+>eRzdq1+IGtc5P72A;VxSC%GXzr!m^Tja31Ex_@k?g^@5aPP(^_Ys)jJ%#zA} z&CD7ONtdp2bD%fwg;RC8jiFK@qN#g<5kYTsB}~qfJJcRwWgf)T68;A^2^;lIVKQnL z9+cMn3d9tEA~!R_R?;yDG}qS-%K~)Hi0OTI%xZk5vB(0UFf=?)eHf=EE2qA~G+8-= zov*3{eww?$zL_?*fC!LnsO$RsMG-z?;E zAz`YkU53AYVGO6Ae|>~58nguPuc}p3hv)+fJ?fEf#`d$HUCQmiWu-E|Ecx*CE#gk zW!j}4YM}ApSbm;ZCF7!AHWgi+T=D>^sZFdNj`1G7lgiW43m+87eOw@i%AI!(+OgoP zs!6)Dff|CQt}wIqtgRIRT`e@sMvJ!ifK7WSO2=Q!4$+X=$+}MFKFKH}O2oX^WWPYh zmiBry?zE&uB`av*F5<&^YUqVBkUO_nS=AKHV%8v3TZLL1sw5mhHKrDKQs<+R=BqMI z{d2LSvLQ>vx`mjsQ>E_lmCH*F6PsTy$JDPA4@TPguD6;4jdGUu>H1R3%s+0;oI3&N~`bp5&B z^}AfcAPiILG14g(PqlK5z1(->!Iv_)4fcmgvcy`B!-tXjtIp3o}Z z_D~43BP$o#GV*!pkey=>B{w9`C>0{`ivuSZwpLt<&nY?pY=WQrGhj#5YnCW{Jk2Nx zEps{5JK1S#4H6`yg%tM$cJHj;~CyW*o9S;`)9-L*A)jSfvFG82{D zY1&*8XIaBYiqZGR*(cYiZLvhRbeGkCV7Qfa!)|O6-7?)*-=(;^niK^K0KL4h4$S|9UK_i|Wa*IXaVn1d-Nxb|La zm_-2#5eU)^qw4v$0`pVR*dfd#RCIS$+Y2cMl&#ReIiV>u_C6I+fMn#bg3Ryr4C#~VX-Rf~;86Hu2ZKEm)|f23{q=)c8?;TFgXMQC}K(C^-e_zq!e?f6T3jP zGASHz5<5+ej+?h0I_M+J(OlS%qZvqewI56Aqs&E}nvZF*licVTs?6N_05dhpY4n5ZO_@Dk_s#mn^Ial~si3Ll1Rc-D|X=Avl zc+_&)iz@4E@oUlj9X}N-e+hW&+3!Y&?({mSs`>8%qk)D~s7OZ%e;j+6sOhg$UVJB> zo=`n{>bgjXAxy1@j^IWwhWtPo7$rck&A}_jS$M{70X^b3gWVL&*5l{;IoM&UK&EN@ zL8AWYW>N$XUQ@c_j`>;rIigN_7i@Qg?Vg>JUnU;r0f3hv{dD=ArsiC<#y4-6Ein&w zqNW7aZYpGuio#DpMQ`7g`dKPR+;r7q4}GGLmrBM7u{Bnk^)t`|j8^=|w05Z*N$$6d zQ>r|uk&wy7k6ag2Zc8<(s9e|JfmG8LJJ&F+EO>}${_y(@y;6DNJQRmn$U(P3*uyqG z6glMU_>Ih1w-{)Tux(e7pAQ2GPLcRvOz0{W(z*z7;itd6L$zjD9K>#?ph8Y@mffMm zZs)Lv2NQgojI|;j5G;0bsl!4sW1B=usUn8;Hvu0g1a?{}h=Z)$cDlB*Pf#MVI3pAB z=9@qATtZpnD0-O<5uo{R=OYf2@VVGC&R`FXMq}*0KM@ObWf% zPl>HL1H4#}L3FXpC@;mlr%L{<`KGRVPw_v`ae9kt$+7T_4txJ7t<59aL=-8(7VN@r ziWp4noJ5*)ovo5mM3_xHW4b}9rQRv6%O%ZT5zfXA3WZcO2c5tR`sx88VEDdl2AWV) zX<`0l5{HB${+ozM;zXD~jyy0L7T!f=;3mih+}r&R(^*7P-|f@_b^bi@=wJqRQ&FMF z=@fk^t?d((bAy>a7s}N~&S27?Hxr(X2NSNiYwN!%`6x&lJ=ajldy00h9}zoc%G|Q} zrhn)imVn39HD8)fVonW*oStFVR6Y6s!E)>X=ZViEkTPBKVHbvg#@}<1YS`JsB^l^#Ms9KdrC`Tw`G zp#zLbt(+t5oFzG$;c0BJ$9K~+B17}>%HQnJGVM}_hId3Mq4NCAq$f5@+})7JMvMK; zpxR?j?KuA3{5(i6ewm1oOW)OIc4yuKxQz&EH&38KKWTSSbOZmA3PZF6qs9q*Eh2)B zr{`S*X#+8!b-#`hQgUg9&kzAdlgzgy8LiGTIZk%*&gHL;Oyd|VZKuod=->Y7?=0a7 zI>^YIO?&#Ee?k~YLT$~LiJ?`QX8!YE?2giiK$7)GYxpT(SInj1BE{}!XO7#211PVS zn>JUW+|h4F$;>;Xgit}(=ELK)@!uPWIMBAIor765FztGMZ2$SK-bHMHm5iGI^ehoz zG`;FT!-ITmHqH4~!n5({$&F#je>t{#xCmnU+{^X{iKxL1yF_a zCM)mPc}wfK@10Uzlsb+j9~&Faxzxs=IC!Q`ACph-C1=`I@A2=N&BisgAL;YTHgd(x z?mDQPn@ak>9#dMcdjHNXO%+PGD9$_4!k=cGqlygJdWV{3nv~^IzfULMGJ-fJXQ(Ng(Io;?;R3F63Khn50_9qOk043Oo%OzK1eD^% z= zl*z88z%JSR+bSHC+0XkOYvar->i5Eoz((v})+)iPOGWh_36Wi;?Vvbz5;Z^}`92Pw z-Kd~4+;qS475*bs>?-CEngvsylH^?qRGv#ceRxRh{p?>>nZb>?eT9{DuR;u5^R?k$ z(>3X8jO2M48Q4wdO;Li3-&bg< zg6a_HUqUEb#`CDvn8Hn>e_mD!eXho*qo?zUM#A+6fV18J8F(AD%Ym%58c8+)GGy6k zLT66tPw@m4*_^J*mBGXL1kQjMZb-$rjGFlQ5&{YVCe0nI zx?(!NE!+oE;NG0OJ9f${5mk^mSr9okbbWkp=G->51Kv)sed!MGF6mS_pgB%4ZdU1L z<8;)v#b$fRB;?@(-$wUx$v%_~s-Ocw=5H0Z#$y4nw4{nL;^tl}#vp}Tw5-}?I=(EG z9>o~;*x*1jMh1!KMIo3CoZJ&8MpBHeI%)+_sh=;;CuYr3b|inUhB@9?ZF^&!N8?DD zx~*qcN&c)@+wfFfHRYhN|I7p4K(YO!P#@%KYk|s18r({g`yuqcFj|PHlIUdDgr=y3 zPTuTKk(+H-F)w)~pMyo1Y3G>f4k!z2wUn33+%9XdlN)Wn)`#hxXTEC=d~48OJc4Z- z%4?7IUd&D0c zv~uU`|L`)xY&=V877s1vn!f2GxWlNvmLDP9W(8-}$-M!^L9p?eDju+Wfr@>An9Wzr zOi!4DXx!=_v326IL0!Cw6!`V%ZhxtzL3LX_Vd1DokB`VQVFs(6xxy|jPe4Q_7Qp(Y zok#fGEONW_%saBNZEL@oo%VHf>>-~?ON`k%%nG^T-W(a9n|c6oC69~VU7AnDn4d+X zLLj9?UqM;%?Dd_Lp-R@#fzK>e##`K7>u(iFiS#gMMpitlk=tUGhPAQF!N}9tcEGbk zGaqre5~b>G&r{?!t!6G#K^Ma?r9~!-iJs10cF({onx3H?N7uQjG?((?tZwbdtr4^K zg|a@>3|KZJTpx~9X4jHrsjiI|cl(GRla}8t7Gd-#XOZKv_9G|Nl9MscT3PYuVbwwu z`*hdm5m@l?om!?P&aJp~(lpB}maLpZgRicUr{cpu7O%jvUO_ued8=Ldxy@5C_7G4h z>yQF?*vug!_253(a?(nmbZSDa22dFLt7mf|wIbRq8BnlNG}~iF2E{L?}GNc98pOC2+BnPSzo$%GT@)p)$Gtk9+U27LM@p7Jqg{$i}r#uD45$3@U4d z%vz)be5*xHYdv%h|8lhGd;gdHyOEN0sC0jS`rroXWCX5o;%_c)Q z@~QN%vO{-41S@7iTY!H#glaR6U`_3#BgMX~^d?To8&rF=l&Ja4CvP%HNRe zJIEj9R*$8!E?(drN0A*uNY=KOH8%P1E-_RQx|C#CC8Npo=no#|i~n5`zw|Y6!HF!w zn0HV-vQ00`q5}9z>6nM2VSoNmm^|uU#;K@gWu+>SAd@j$7qrex<pxrX+ zAxK?~s*QjgE9Pj^kS{^aSHh}LSB!T*R}mj8%zkU9h@akip{<=>($eLu6Hz%M$s{=A zJ?Z0Ms>ga&LdW366B!(o)6S=2RZs7tq>N$BExbrQL89Gakad>FH2ovI1Yw0)A+w03 zeV5_>keY!r>A1x6?cvgTEw!6GjgQDRJLvHwdNrQo z3ylrbV?2r{o+C!*%*S9zmCRfb^K4nBq#X3b%&F#@p6p=2x*-l=HBo%>47zmpx6#XI z7)76T5h$;6#`W8~oW=(G8ZKykM0kwgw9g>p1~5}gcX&Fr)rQXFzsG*3m9{TTF2zvYQ@JEDWJX2x> z_JGehH96cL{#x{c)ZaLmk@1XaQfOEDqu)3}Al@r#)!u2+ux5=4hXU;JC&-k(d#iP3 z<)J>;(M**)w00S{Q}W3HxUdyRi-1Z2d4N5=w<@BgZGxm%vo2C>bjc-5Y^<~){Yh~P z;DOi*fV*GXTLp3zh~6`x_uiTfv5x%(waq7!bVWjJLZoRb|BZu`8<7BKsESve4V`Wm?65=#nFy$%Ng^Ego zgRvE)fV02A9}8}Vb2Cw+#n^D%Z|~R)3;&!4*Ipm}<&%nr?qNji5e*4@fFocKeRM|^ ztGsp=ZpQ`$amd3OG|;)8o7N=VuF>ZL@Ji}5GSN-Z*zkGV>hK?ZL zq^N?coABGqiv1y&PUHx5u zEJBa6yjohv7hslFGxMMmLOl7_1AZ&Y(>eVR=H*6T!hDeOlOw>o(c+Ck&gOEEhx3eD zxkfUK@7~*XM?xF*JAW$1`n^n67O+w$zFAZ?n>u**>u!!oXIRUuQ1(2&J8qDXO6Vy% zWL`IU6%)ZNN6Q(CRXb+Fr$m6iy3(a)4J~yD=Tf$_W&?{0Edu)8$UZUxcE+{Lo>#?@ ziJgi@SscG(#u;qsq`A`i%6DkdEKCrx;MG?{=q)czT|tm3`_hUqLi#d}w_~K}Ptmun zJ$;KOUNiOBbC?!<7o(A;9Y040H*gyb)*H9Au-&k2$;4JGZHJOlH?YiLMXnw`XGcZtaaut#R+o-7uuT`yzKZi0g_u z-vI2P&lCJvJ*92+ealGwQD?W8S4JDu@?n@vt?1cks)QzOJlFn z_|a&pLH0sA3ZX-&$fBI*a3U2{e_hvoCvowrLhc9GS%gL_4(Q?#UT!vYwCZ?Shhvj+ z&P5$w{qUlOrH4%kOP%S!S#L05Q!A>1W=b_6;LC33_0@YjPnST|Gy|$9#DuM@)RrPX>y>W^?2#!0#^-NT3PYE;QpAaWb+S#Zb3Ne!A{!@0C zuWYQ9^0?043RulTt*R1|TKLR438_u&!VYX)QTXn2skwoU^XLd`7zSRP)6Um*JcU}I zhifK5q;8I?=NB2PQRT!-MG};)B{IwWNEhD$T@DXKw-Ul@aM6dEBkBM@`%gHb2Qf^7 z-|AuAWRYR5^;u}?^n5L1HDhX;@w{E4nf#^MaBfs+3<4b7lSsaYs?{?3 zE(C?w@5V}{qBwzSU6r~qq7eT=imXgk5;fup1Y5lyE9qvq(|$}+3@D=#W4Hs>W)i~_ zKIC)q8y-!p4#5fzW*7A+4YpOdt%ZR5}OC~rhwR%v}C05(4 z$|d3a_yiYX8DKLtYF-Fj;Zj%O*dn1E`lYT96wVJDi@TeQdP0ul0i{8s=)nUO&J_AiQfv5P_=I~}czDag|`DusL8ZQ!QVr&V{66Vuan zcCYD6f6-O|9v)j@=2;Ib15#k^G^80F#?VNs47Nfv-geyvVP)1BwUtn#cV18ZdDG5n0Ar zfYx%XLfGCe+=5gWW3E5F6gN7b{Y5$(Wy5qj#zKdOyUT;uy%tc~?(rUc{|$+|o%vJ? zGU9>t*IqdZuI{5Eig@o+2f**!k8oGVzB!QhEq8k`|CJt25AY~D8dlS!d7c))d9Udb z{n3Am+z=-~uM)q&{B#h23$#Ah7D-pEA-!J)lGmTv*xkdibueLp^`nJy5)q_znUc~F z|KRREu%4Gqd^bAQCJlPLRQx=+3puMimtok7M;I1US(py^^_e{@9F#fP?KlS~;*Ib} z8C=Q;eDsax*X-U83(pHHjsEZ(PLnJ44FmGF^{6@%_%{3=i3c1kWW<-fc7YYc>GyV^ zu_NAqGhL`Gyf}_2#&{jYs|&%=&tMG5K-necz?4t)JqN1`cy6bzpnv!P0_oPOhLY?EqfMj6J!pAVbl~a5q+a zBuVT{NPjoM$7__ddFx+3(qHL4X2G;r;mcwHBl-^7H8fDM4{w|x$(@?}{CxxWtgA!ttngMnwK5#JEqaYUS{^ZQ$M_&zzlD9HQ zz?&=#m^wD(L5M3WurmTqlhEXs^5CKN#0rcm_khadY;d{7@UbsFKIuCK8E0Jb`V*`hVsdp@>JIjwT9nLe(-tHFV?diRSi@{sjIRlAoEcbe)mV=q%^#- z%r?w$gHD73CSyUQyqB(eECf4ykes#8SmpWQ`74k^WtB-8h8OT*0xS4eH_AN+x2FEY zEE2sOcEhqOB}Cmc5R@EEPJ;>z1L{CoNS>3=Llbi2IE*=RjIpI17K@;Gtv~6TV0JUP zW^(VN<*daAqzpey_b5yw^h|JucMDOvRe4JYN78iCyJnp;jZRM-Sbjevy1wH!xK-@# zAW!TxGqcWOLNXhH=DdSuZ#z{PGkLa&UbmR`V_9jkVV;`w_Z}^wD0%v${~NgVxio*{ zHInumj)vpvd)^nlF#@xrrp_?5;3I{*WJU(%ZTyv|70`JYwz%#*kk!9BA92Lv4Adi{ zp8F=Q<^|DOZuCTb?qdwmf0AIzMJ=!8MoiEQ zM|fpa&BwkFI<)wY?*%;t67+_ZYK@!!F<`H`M`!qQ&vIV3!LDz*b$ji%H#B0N4())$ zb>6E=a^wn#3^SFc>7O!$u=fuvm(Om?0|c2QyyM4dmyPI}ZQ*8DQJClu9MoGzh*)#q zC=SumN1AJSh#afy6X4ulTWM!19(|LHKD`61)Y z5~hno1wUlizuK2An6yg)e#0gLD@NOQfsFM*!-A1R5Iu5B<|7?`xXi6Q#4xez3jDa` z0DZYZchaAX!q*F|#WKTm-WKzy3*kYz=WKR*x6L4{5^>Yc-@h({=3V3f?aSa)Ws*)3 z2o}KEd-$m7rc13bK&fLVlp!{$>^^Edge7bfF5ARO0g)yV@=!n3Qn4O?&Mm3p+(&PL zY_3nw6GZhG7G0rk@(I7b#*A+wmBkwg(Dl!pZ^HHWBs!q$D2q%H`eMuKQE$?HomGM; z-b<7lhYQ~wo>4#=aPcFbAvG-74$ocw{D|jYKv`6`yG54MFJyesNs zl29%;ycPLpUPo9)fq#oJ$K17VFy%a!6eH#3GZNn%zUpl_@m&`t-{f!F=6y_;z8)7q zzNj7r+uBZBp)mFFlM6Lqm9WM z7an7J6}7xLXDhrD(8ITrJ33sS_vQ!3fO}WgtBKNiVXSFKPzMaC?`+Tyw!#1 zU5EX|#EAlwhw5MzvXms(*A0o$7?VLPdv zf2ybt>4*!7uRhmT!vgoEr6~n!D5Rrv=lyZx2;(9eVXli@TMe(Bdo#o)q-K;t$W zNtwxoJ;+3g;`x9u8Ss8HW{N>TWm>gK+TeD^^O$Hwl{padCL_YLV-grqy3JV+Q5=*J zZeOqe9XHsOPuav&4T-xDMcDf=StS&k!;e^f=NH`z6NgF7oJ_N~Y{RhBe!P*Wv8?NT zKWl?w=b;bzQ+)|tE%TJDdRm?>_X>iAB=x+zjiKwwt+iieK=X}o{as;X03g4UB5({S zfm!f9qKfPh`z8#X5XcC^$OWtYWJGLl=|CRJ;sM(c-$zE$2Z9gvYWq%3hyc8pqkCnM zWgB7wcW7b7cuKeL&TBqe01akDofA&}4+f~*NrsyQl(g5cY2+`8>%tUVPdEuvBWUZt z4+=Z}w2A)KG6pB3#XfV7}jl#JAql3uM}3$BT)JEAJl9LKo&SiLrki3Kx9yJh|a3 zh00;v8#PxL51RtMY3^m%e)-rTAcpXe?LOhs<2z(dcv*No<9#S$c&ESa5XB8(hUi}- z3VHsDq9kaA&C@Ja8=Q8eEZ+9Y7uFfaSYi8af}i$oA|@$~;X^zz@$ok$SC13nRu2^{@WXCH^pEhey66&mLn@qtHf{*2d2E=Wy4)w< z$NA{u%}aXL&cRgxDUAGnjKJSDe62@O6az!tkO6RJh{FSD7Vdm6QW(trYy!g`lrVGT zutKjhc##cLOqYQzk`~r+PO+&3y;x))+cl`eN_A42{0=S{c#ZJF25);5s0=vY7d@&< zVvu?o7`+}Y7-kZUwo_T{{zV`t=8l`{Eq0Qmh6E@PUdUBfC=tiwc@gQx(;#uERK!7$ z%b!rv`$H^8V%>ieC|hg(ry>XnZKUZdvFT=d3P13#GBYbS8-uTDynmK1K{Wx6BSirV zqw);x5wuj#HDc!rqjQlnV%XZXtV?)_zd0#ad3m5km~|hAr_^FiK=>n#ToQE|8MdUc z^t-mAmgh)$zC_*zJkx@@X|(V)BMSvy1St=Y#aKY8>rr8W;Hw4AR1hba-5&?Y!}DTJ z?q2`!5XhCFX7?%C&d*5GM2PDT5$Jqz*kPKThDo3;4j+(RvF5}Q7;be>xyjK|A5Osz zKo9@!)bd{=6loNy?4(CeNrHNMT36hm8gj zkN?Cp=;eapu1Cw*8^u^QUS1ejwhdhf(d%oq4OMz5i8`eg1Kh*)_Q(hzU6ld50aUszDmaY|b>){OF+DL`p5 ziw+7TMgTbGvphyId8^+GljQ?BEpJ7Crdl=U@ve0`{0<5yaC;^`L+Sf{mGu!ZI7_ ziX2|Mi+H)k!;Bap!^a%r;CA@yquh!!?WeelR6bxRzqJfRxQk?UaY2j<*TD}h+p<1H z)**{Z1RL@2u~_({yl7#E3@BfPI$?aV8vCQ%YDebDUxlKW&gJ}Y@kiMciEv$qHop7L zXw+*Ff*C&~ep-VTF(eLY!e4_1jk(h&4(nb&LWdC7`pjZ^mMFJ!62mP973qzKfoWZj zC8ZIgp`UAHCPU(Lm>>pr42b2?9s{+h<_kI;h*XcQN%N;N5%Rt(Q=zLK<4OrQW(m9t zlDf^9#0ZR|%u_Ps^JF^jN|sMNNdexDph7M8sUhdG<&w|T0B>O4O>UscM+@^+{QzE2 z3pdb@j{GI?LL=mk6HM01g;Ap4c)P(&o%}S#{87GTG^gqx>X#7D?f*DS&=*ch++g)5 zxc>e@0lIg}s;EiapqOVGX;ZtI`ky1t=q`%PjhK)A<#sw$QVJs!mq@6N-w>(pmH7Vm zqu*%K9A8YS&lsjLFBTHIHxQign)!_;%`j_f)U zA`T;Iu+~Q@4;=V>endu)XbgmdRAiTsa1Ad;oDh$(`4~#q4J#H#JTN*G>PR4nf3>RX zB1^1}vDvDn=o9^2Nw_f2>oKKMw9$;R|9YQB0b=k9h$}^m67cR z5D25$Y~qAz$eu&}8nSuC_5`V+SYCNX%Aw9;=rQQ3<@Pfl~(uZO=86`692 zhr*DhHSF|@6enk6oRmfx^p-e8V?SDx{Q+(k_+eTiwWoNMWv5@z=2xmEr}2hT-86^!H z8#7oKNn%2;5%Op|jFOc`3JX)ViAqg?>cZJu52HWbk^)n$p>Ehfp_LcZ3HTkD33Nz= zT|32XVD)6dI`Kf+_0J>ZB9FHs16yA_^d5w2I9M`8_n&eaZRdbIxFD$H8> zVSm8FUkcCf0f1(ZbQ>doofh5Bu$OfpoC&ZYgxva}R?$oP zC0c@x%xIRL^XR>k-9Bj#&3?p>?Bp_TG#_t{0Qo&_(e+i3A9#s9SYF-H^kZcFw4Wo& z#Ni!YxPLxq2Z3v4K*7sKJIh2)e)?m1;R)#SrF%RqwlEwB<_IaE=4rEuC_mssQ7c+g z<@&xigB-Pe6=H_pl1f@E4+`#hmx+sNT2P_8?4+I7d0<~C>^_cXS)yOCf@GiWZjm z0vLoP24|xgO60|FHAbZHl6YmGmh-_`Ev$V^?D9M)9=@h_r2vB2-cnspNIudNn`D9$ z2_o4MiKEg?+a$$qm3UtR5D}%q-wC4A562*_{ti7y(cH4bEDrP!7S`COn7?>r6Q%Z4 zD++!zXhYcyZqax}cD5rtKDvefqL=m5Ox35pM;Coq9UO|YWUzw!CD#sr@bt3d$-b*_ zn4xj%ic1lSbqLLW!LI?X2-69zr>K%d@WLxmrf5D0M;b1>!m#DTK^XW2wr?=65A$b{ zk65w3^@cj_ms`lTF){{er?i(Sl;2*!zC1?qW@mKkLX3Be*81O`PlC*Orv2}#WR==K zbE(!_V0Yo47UQAc9k42FE$Rl5!OZw1!r*GG442MsPCUkSiI7{cg084RhyLbiiSkqI z(1!Duv97W*@<9iJ!A*I77Qt*00oft1r;CdT`rwly4!sg{MMxR-<-+;3Sqp57N}K~v zny#_|#-D!?uIA-r6w=PJB1M0lwaBH!=im_uD0Q`)BG1$LvblSmi3p{#SS^Xl3f9~nI#d4suwN6?E3kajq}|~sq|wf zeMFOwykwkv;)sV90MCdf0)J7!aT=}K7uZBFX`M=-9V24ZI;8Ewc=NS>a=RZ}@inr+ z6>w#bYhYj=w3-8ZVPBu<6`a~|=xp@X&{bJ#0j1HX(<(b4sKGQUhp0X!#a2`Tm$Y5; z&=Q9%0+In3hkIYm&zAK}+Qq^Ovel^41?0E)U)>v#qswbR9$Eq0w$kO`L;>9;1P`s) zS?g#zW46h-ml?Be9!51j^vZ&xLC(Ab*FOS`p_X&f6AwCkdnRN0m>Uu?TS(LJkJ93l z0U;}8^0uQqk8hRV-|i2JN^g?nQ2Sh;nxNYwT_9Bf=#<|rC?z=BN~|n6dkliMWhB^< z!`m-@`yGyazx9r)!-P0c(m?Er1fIb0xja+wA>m}AAH9heg56h?b$Y%hmmEEZuV7W_ z6Pf2D#*Ks4_sl~}USd`$#XFqYWR|&Brkc|hR}#kKG3`D>1RSp(u?BfUCnbb^tw&jF z?<5$;)hwI1ZOzY^Hn(Gp8fD`MVRR^d1aIrGcI>ArdgziZr;ikFN;k9FfsURfPP6*EKgpd=t_Kqr|cTy;*W=l_CeS%q=BwOSJ>YxaUc zZ>O}WcgnC(0#r;q@Ig%b=C$&ETk*UplAS<=N0b4Gd_B*ywB{d3pMJc^6|eDPH?f~S%A-BKgB|0T@;O_KF==AK0`t~ zd1dC`4|(`$@cHYa7?`i-W}AEn-={I|NLG;F?O}yo0?6nH@6+rDmjHqG@IzVaj8p+^vm^P-Gd;0D9j2zFnv9Ss<|iJ&5k)TQOnzlkVmlsw|Exqw3*1_VN1)VZ_~U z*BguS?_MYv`@Wm6%yoT+F(CiS?#ARJ34-xn-rtiizV68W5pSc0q`>UmgIqrzgv!kK z$JMvS>UxQ>p4`o2q}22wh2UT%S@RT<#6IlrJ+qjK(yghjMxo`S9ReuQMQYEiIBJ)$v5#y#9k1eN!|lYm zde?tpBMyVL38-PahE}E9cMsY3`7ZI8{T|Z!>mQ6RcMsWzr*sz4UsHYvQAdM&DSL8` z9-h_fifM6~@4PD5l0}E4T14xf%jx9t`9Fweyqt~(511xhE>4f^b}rdX>1PxEUY%+R zPVP5*u}dBOqp;*=vgG_9|BD9U`&f=bAFF(OOuFhtr20Kn9S2xMPFMaU`m(sX3$JDw zb(8-ia%c&07XBQ9y=TH=FYbmwd2cD6oe77>!7?x2?M?X^&%A`gb#NbDpZ_x+lPxR4 zbKGml%ZHF73ajbjv!Ai^?smj+G}q!X46vKa4@-CVWpa1=FT#m;$cbC!22{9AEwPZ4LlMG2_#(O6*sMRRAZ>SU(P$N>c zbxVtN*9NV9?XQZoR?(_&gIlc|VJlc${e8aYId^7mCW#Z@f99F{obNf$Ip;a|+3s_n z%Ld=)&?t)?@D*SG71s^enxY5kYu-7(Uxr5RE;k&fR&Ii{hrMxPhKBZ>G9NC>CTEGV zxafP;fXq9m6apv8%-9!0Kjq=uS_fWG_qnuxD_t07= z^i8wrZD$xCOBFABUdG}+eb%vJ(-uPRi}^-{M8z2SJ9Uf3M;HjkSeqcp;}>222P z@=+SLI2MxQZ8bhnLq@sC>Y%N>`uW5tjbC2a%1r+lrTr-F7I>*!)Vg7IihA#{dWVcw z>b=J$-8I@$@4aO8tq^}LJ|GgR*hCSMig( z=OEltbPY59bU#f7Pdi1k-I5|){+oVy#Mev$&3*$TK}1QPSoy$7mbKV>?ii2hZ}ppx zxagMsG{UZ{YS{Yw{VZFn;cdi75jmKYb{q_%#sV+(O8HlvoT|qn=&@JySOh($W?FhI zO45T#BiEx@t#o!v$=Ro-YH%JjI6qT)f{*-N1q}>xoQJ^)WtpLibanXe%b6Ovp4{%C z{)4i4AAd0Kv+W*oxire@-|nFY@#o*$J@hx1M&ugZ@1eqj6>@3bDg7SG+Fzrbihd8B zi$4qdJ#^FlBWRuQBBb=4`C`elrItl5BGfI>dI#1?H|=k^aXrr?@P^I(9Mtd>D}R>nL;>0QUFfLy@3H~S1*+3W#L}2{#8jG2`~Jb zy)bL6<%M4>FQnTMpa}kIEA@%&T(2@Isf?$%j8MFcr&JkP%jjwL?BioK$_mmmoL!Nn zk-PU`bj)A6ubP82;yE!}kc_-;&x4cl~^a zhx!juQTwJN@53D)nw6tb&X+qp6v3Z8J3RDSjz$N5hcM)|s;lOzqPitTnEo33G@XO( z07#w2!iz~0|9o-ZgXb!-Np9T6Zai_EM&rOlj&1A;^+FAO$d2e5hXGy~Yxrv8=SQ5q zJ6B`a!2DO;%8h)8`KvsoA$QGBvT?w*-r@DqbKLoSbdW}FIy{?Q&e$(lEIO&fvk|yE zSe0o9i@0dapdF6HTfhN-ly)eV_?hW)?e5M;ar7@HzxWd^UiS4|_5+7%L~feIFEec5 zxz*Q)YUJ)gPLz6B=_3zA+eq%h$viTDA*1vcE~?{97nZAfCaX%_;YeDpx*Bwz)RRY% z_c?e{|LkF!n$(vbt`Se_w;zsMYwS)B{oxE%FYil=2>Z^FTeTDImJ4lTy$HK8gWJPN zM_BD)uMlp{NNNw8kC688;3_5f2uTq~w)U`A2LY}R_?LzoQQUDSK!qgrq;FrqO&1@=GN&1DbC4(KBn=cN%3xBXm z@_IfT3K=UFDK%b@6b^k_$)h9Ty6&AGDm_YB_G(7n2Rl79_ehQMKH2G^8}R3=ogVrf zLs4|MK>wdAdM6Mse(j-KCt1RBj#k3HcCfHlKwwpVd6rV;BT1pk=c-pbV6w$sFWg@! z?lVD1_g)W1&{QVf?Y(lBzp+%6oOHLpm4Uwb_Q_VG`Bnzj`1tmrPdVtx-FtL4UN-3C zaQ^_BaJ}bDQ3m!U*L#jf0xfvHDr=dfs8(CO-!6pvBn2Q|@9e10h2r_C5(P)StLn__ zfuqon){7ROW^hA#tw$Qtm+%J-X<>n_Aw5cbP%0^k9ce@AJ^hThcd1VV{ia@NndIDm zvUBe#u$=o(<=iaH*1qQd9~Wqp`LCTG8ZF$jC55eDWKd@LE)QKIc{fW6+E*Ew-W?vg zT(Yi}6xJO5V@5CdJR`p8NWCIS52cv1i_NJ$$}(pco4_r8ly-Bl+;J49M0gj#%9(L= zqN&}(O>M`~(tP8S7I*Ms0=avpAjU4DZ&}PY%tYVw#q=o}xueH$lY5gBP444U&WK0hUC^`q*Zzcf6yxBPqkXP$3)0yl0y5doZLb97=&=TRaYhTND9#1P7bGgCF_@x zLYa6tamVyKp}Zw2nD22~9TPgiE>ZVhXHqA4XT0>2n^oxxC53Dg?@#^ezAZkmL^#1>WbVUofuTL{b(LXD&V#6y5v!h41CuB33<EMz zdAgUqs~Wynh3#8OVcJVh)$o;zs3nqu_CG3C=1bO@l0x}-q^27yb8%eM9PFv0K9Tc_ z3oPx`Ym|*d$Kn8~zZ|O(RTWEsGhY``fnU|BI6a4HP=4gN=3=u{YxRiY6aP!0o1aRmeBz<{;5f&nMP zfUk}lp#k$v3|IWEVo1Fh@XCcLhD2e=BuyC-g&~VH%aACvWJ3%X(yu|^hA5e@7VSr~ zXQ{d{0qVj9>f%C}vJqEM{sJgpaJ)vYt-CzbJ3X6sNq6QQy4yqN9IsJs!EPK`GIO_w zUOOKBk2AfQ7gv(q#u<(6;Xo1fiG|O1+AYPCj!x+I{qdG{olu;zU{EIvDxQs)p^M=I zeYQsKoMU;>cR4EVPspf2MpUQE@O)w13Fw6BQv5GJK_k^MUc_th>92D5`R&#-al9J! ziq5MqPSyQMesX->32I68NuF`JPP9x>*OZ0b49_y{!V^_9%U$<#1LkvT89UKi%e8Cv zZV#V;$Q*pas_eKvtf9}V12vmg1nWt$q9yLK~hWi4p z{jrLLbCH9f8&!&h0CFfgjl&UYJxrmjR=*kZdg<3Ztg9^5RE|$?Qi}o`xrlE{H5zN0 z^qY*Uuu0n8f2_6W^1ND+p7@E_uvgNoW%OHS-B-gnBsyUX4X0eHL=;Pk z4&u+&&@l7gyFKI;N|mHQyp@rw?ZMzN-S#5>Jk;8-*d4_^6C$3-LnpH1bd4tVis1aKm0+9@@jE7a<{^fdHp~{=mUmNo{z`F#q@V3h4`w3KH;l%^R@Jw_7v~PprcfL z^X~P^lq4TrEV#u>^-*SHfty2c&%(Y0>)Xy+LkP3#iEeUidQtC?J| z06xkuRzA9i^UhkpK3eaFkFLi>pqMr==|zUu3;Z$8+W|y`e#3B2rSj1eOj^cQCG;#` z-Cg;A@e#kWMt$O%mK#!B^dY-wOQpuAX?)1)IIGlv`9oG*}RRsH+tV5zitx|3)Pkb@e)v zpInH#>K5m3<-C6`Cn6$74@IHb6gY&KcB0^s<{I|FW6w_Bs`j)Rs zXcu42ICF$`Wp|Gi(BhnTZ&9`+1@xN9aFYK_70_!YBcNBGsRDY<y~ET6R*;WH{+CpK{V~m{j8fyk6kXbKVLdBGk+9 zCvg!drk9xXAHFJ~SNUpY-T%o+64BzDmRnPN)XzR@s8bQ$&-(lvR}Dn{tigMARz&wJ zpQRtsgC4xnB}z2jW+`)k)k=E;kGm*)kcK@C zWwl1=Xk7da7tJA>f{U!h8o9gS{x+J5jC&W4z^9>bC`MhkDP1p+L%$`+XwY{dQ=dt- z`8$)}RY9~Jo<6I3tIvmL;ouzn<;}qho$IaWjQYc7C=zDg!QT)cf_K3H=J6v?d3j79 zp!N`N)2Ehgn!ffxKsQao;457hnq}zby?a)fy-wEnCsFsxzy&1IXIIAA=C9vx|Ssv3z_rtbUm41EMmrF(LkjvZfc)GD2=TjDbH8Mpj!a-%=JtO8*_H9U)Z<)U>Qkkg2NoiJnoK2ax zZN$YX^Hz?C&#HynMxy27xN+M?#AX%tuaR)o#S43I@(4UxXBGDHh`79w_OLox=g<)p zwm89-Hxjm_;$9p4T#wXNmct~ObHmnj8!~kREvlP4JKiUyd+%Kkz_L!2b^6h1Xf2U8qOBpvb?bZpq0I`Uhu2ZY$mNP!x+pZeh z`%pl-EqnFc1*(K}>#EA%S!ejeW@E%?^ES7KTjEYwo34`lPNmw*g>I;S@Uxmy9nXAT zua~(Vem7ko;zUBc0LyH9|2JJWE=^u3whDdawh`Ir^?J|IjYvgjK#!{X{^p;LNPrAp zmV{!>)lh{^crtAnSf5l6>Y4HBv>Ds{ok@IMU4wrKX^E9dQ#sASYj3 zF!TXAsV)dNij=r1y<3$o7mrAnmV__rA635i;|K*<&glJ6De(0O`3HET^hbH4MZ_fB z@vYKkLQVRSVZ>h`a5?wM*PZ-7hJRr=fY@%n@?H*)BmObe$w$LfEV-P0Yt`v9)Z?PT zPoEi#-*N>$%eC&u2nfh2Q=f?ou&_6h;)T6m*s+Y_po8{H20~DSyWoo?F z!&k9F=G;)&&nI@oh{kXDzsahttAuuzq@f?I4%DhVWat5WLs(Y5ERVMQM0wVF9n&Pb z(}8uazbv-aO73)I!vpS|AAGqc40jUW-B<(q&ZIu*d%@}U{J+QXXUd<1OaOx}-AY54R0xf=0Hou`&PjgNc}-I)xc1W~T?U%y+WmI5ZxB0Lg1@I0l!B2nNX za;VqY@PKzQo+(VL*T|he3yoh9`H}O}dVX9ZSuM!Ar5-&DMc}UA*V_YT_G9;K<;M-mFH;&VNA?Nf2}L+JPRKt&ar{3;xCw-GJ<0tM$=Ik`Qt{w0 zJ%>Gt^~P9Tq&C#l93vj24c+6|_?V+E0(RybrpvMMRfRhBAae}U(bzbu_4b(IZ)Kig zdKnu}L$n$P$DM&uXPO2zL>ET&FtemoWL3)2V1BJ2TCwU83NwG~o-C zq5G!^pQGRhqzSL~Rk5jqpU<0WYMBbKtTe@YBjK14Y2_la)8q-ax2Xv^BKg2HnJQ}+ zGJf#$^i%DqtyK7NY0Ix*`Dr}O=DWAHQsF10DZi$CF3ZnN6JJ?7pYdrt@ezF#-kqlW zxju!Tm?plaT;UH&6W^}BQ;?|WG@fj;A(3d(^PF^RyE9_o=~3eA5~GKn1K8Sum=VHq zTA!?FVE{bL^ufj&P@#`K4RsM^r^{LTp_)Rt(_8dri}AywaLhsK-&bq3=Z{c;wN~4= zTCI*=0e*V=u*CdB&a;lSn&jTMIGbprI?BBMgmfkuU~?u!$T&wt)I6g^$-LY3deM>8 zb%HulWvwH3ThWm?01dgllDp29OD8Jq-L~9P$-U2(+a6+ z(EgOt_I61z$nMEhv{xkWBT0*i=o6tG__X3XR#K+zulUZEybC3rLPSR?(k~?IWl2Fg zn&^NeXZl-pLyaJo_zipzf`=fE!66lf5iuB$kpkecPjw`QPtkw*bJrlHEDGzLQ9TgT zgH^g|`kQpd?VloPjz5S~cZ^_FnU^8CDUfoVO$bH8bN!)KJ;<=U6qphd-%ta!+$kXS zw8_v->`8*Sc0*})cnWl$KO8ih{VjSjY)T4jjz8$dndOZkd|RK3otgq#6gJzV(TEY# zQ^3P`OE8o%Lh)3KWg z@@A&MM2NSH>4houGTuN{u7^WXTSX}lR76l$F@{2l2SeZs2?tfwNy))_$sdvWwu-V?&7z%{+aLk7X38C0>#{SP>*qCmF{c@MU zf-QrA{L!cpi5ek)OrPs-ZEf%eS{VFxDtM8p8(u8DS|R?oR7`cGRuAhcL(HYa#<~!iNO2s9Gr5*cqDmE!97lk7YF@GrRZ)jBkzdaScD2!)eP2tc* zda&Bxrf~hKIQ#8`PocD%wYnLNgiXb>KC-f@2K6W&}zK9)QWpP6bW1L#Tx9hfz9?%Ot0{k&#U03)YjGt%@=A4Gtt)0 zGO@1GSETlBjYCBSGRGzZ!XVZddSj?F31Tat zuF|)()>pQ4$^5!`OKZKyEiEdZz0^0ajMq*_CkwM7OUf&JODoDNmU`!S<8WJ>Z-bXr z_*if<+Sb^lpo_IxHncXRDg$H}YqMB)TicK#9#)?2t%B+n!#Z1yrEowY;Xq|zY5DFH z4z7Ou4&~9SyPN|JN#Pk_5EpfAntaeQ*~!-p#W!S~-|~YTgVz16Kgc$iS+}LdHPEQl zLvdAjh2pJAn1!p;&Fo!aKrf1!m7sj04IX zg!Pf3SmR}S=aqTql@%8*tyx%kHojw&d=ou%=MTsCumXOWD!{4{G17AEpV zq$^T@!)mZ11wOZ|vT{zDcfnGh*SDB&$F4_)xb=tj67&5i_b}%GzsUFoy@uL;d-<4T zZzPe`F54@HBC9@U#ZcrD?sZlUM)vtCOH|oiHZs;eTm7LhR#2F`tIOuBHh-r#6m8ax z1Yp(B09dG$=(@s&!l1(l&eQ#B!zPzx>#y4Uo$-M^Q@grsJztx@bCIdH>ZYmY6DEUl zlHI7vs9PS@z1WMYE4_VDJwUECF8c%~fi1(_ivhN&O9GHk3sP)TmjtLR8Xt71O)_g- zG%;DZ*z%}8Pj79FU;v|=G4*V1Ai~>L{X(CbMb(7@ zExIbl=1HI`!oh`&6@H_2IctjtRJPhs7#`>Ai6N-TK--`Oz@*U`0}dEyl~Q_vzPzF{ zz%|1#+t_D-oMb0u4K9v-P>v@G&^~)0C`qZsx`FvHU_JvxOB@n;Qy;%w|2v zLToc(P?O4117(KUA_cGo`tn85pg*R}KWLyT)p}=qLc{`IP6-d0vSVb;i0^FifkRbg z2F*`eV6aVuZp}MXh4AnnBcmZeF+Y#_FW_(m&K4pGVeuJsyV0SWjI@m{Q;{{1P&lTL zwqQvhLrr0StliMdTALz9DAwGj(6(5JqsuC5s<~KOy~W8sZyi&|Cwn|WwcRZ+bMm0L z8bkLr`wcy~Kwr+VV+MsKZYqeftvDo#v^*vazp~A?;1I`pBaxPn&cbX94RJt?Z$VWg zD1NssF~lKB@mba$YlcHZ!eATL#~B83KV+~LwgrJW2RCf{V}vle=NHK~FEx)B4l)>no~ z;ZDz1k_F(gVjR+IFT}c=Y8H5XMIA*Nm$S_#CyuH0mDTusjQDVH1Q*4CkA?sQl|$i{ zk8P0Zh-z>-n$B1=V1ZIv{Q(f006;>9UKU+<_ zYKyWM53m;K%h8cm>gwjS*%e1rh8p!)s7iSzv)_Av2kQ=B<9D`l^~zL z?vH<&klZG<;pHPbEJC9P%IR-_wcOr>ttB-GgbdEgnr zqbl`iq)zXQk;^&dBDLxLV=IYHhc`cp;ZscoPycO~uQ&SJTVu&^M2O4Tcg4NDKM*c+ z*h)y{09^JprYO|xH&6Fgm6>g2RpqmeBbRfo2*#O3Ho*yGZ51O=|3Rd$}kce=M~p5F*w=r?qq8q$!YSw&fS0zZ2w zylxoP5mdfB>tW%St58v&_f4uu-7tL3?Xe)fq3?2*4g=$n96wN7VuWG{s+?ia>b6Lp zNVuFd3|5q`MaE5 za!aewOvCXOJKpwpIamD%cAoC@acM4Rbfo+`_E`raVKZdL^e}%^S-p_#a(4d+S$uH8 ze0fSoE@w}&47w*N=&f<{%%+P%QF6Z!%BH>?6-V`H#W(XgZDP0*<6?dxkt+KZcz3|} zQp7}|A+qvS&{arQKvIwK7FINkBM;tI1O|9Zx?-+zwt~a(?-E`&v zdSk1 z;ein}05L~5W4@@at0Bce%|RU~!8Jfaxpa==XzSdP%Lc&awKq1l`NIptt;<=FOZT_C zzrrxQ&3d54Y;Pl%v;Q(%A0e_;B~}=QTC7Af-j#%-(FZ5C)U;tp=bql0P4&;Hy&+v` z1t#;2#_x=fS%($Mkb0NQAiDUOF_fT1T6F%zx=H*6XBurrjMxmdQJddr>mz$Ah zkQV`z!tLRK*$wTDp~ws@JO=!HVx+?XL+ZBgM{PXoZlHA=$a3-k(5}H}?GrbaWHmeiMb%?7m75hWwbIQ?D>T_-7Rf zj&+&*(nE|W7jNF3)1=Y(C^m2q<*q&2MGrSwS~8uo{IQr}k_Xkfvq__@2Fm;W#hKI} z!Z}4JWfRV#b;F>7Wg2C*`Ikiu;?vm9!nN7npssc<(}>)wPR^z*KNXRCs59O zwH?gJeSYf%jKW>tZk<3i^HmY~jOiAPpNIwa3H3-8b(SHb^3M=aM48a@$`@3vKPoA7 zp2#{En3{;HKSLFCNRnk|1jcpCTvkAR!ZIcApk)Q*jX@N2&R?KJP0#%a%w)~G z7ATecaS2B*E1+IMmgF73tbmSb*C^+-Wd-zcyCtf=Qi(d2h4fU45V7k&o0MHsUQ#LS zn!$EW?0^LLyk8^~v5QuAh((1}N|Zs$&(SJX&@3*fPpI%STU4#6vzgjet$0C&dwYdi z%SE4gp;dIwLdA6wbJZ_YTvmzQLS4etexX7p)Gn-1yuLgH$=FU&J6e+vGHUAt>JeB_ z#Y4Ybp2uAOV{z4-nc#vstIkxyf2xWWYP{%LMfJ0gise#tSFK%0ufQ5u2>BEhRf7g? z^lPe0@+C#plyf^aMsh3)nmTF6Bos@1N`bkoz{{2btE33afm;MNpA{&qiz~o3M(dQ2 zGx8?CGl9x35-YY0faNSwumucTXThS264Fo|Jp!v{mG)XNTC89O&bZ{BAb=jc%4&DZ zLuNE$@+*AQD^2flZz|7NO|VJSgm$d`Vyne%!r+^-V#}k{49cSyYm{Z^W=vi7;nHkx zz*8GC0GNA;Mw$1#GlBL>8T1!b2D~20+xX4|T7C&$Z#}Rin`R2FN>X4hR71#!WZft! zNHImaPqKa|DM(R8+9p}wOA695l8&gxZQa36a&b0gMce#QdW5BZ2~3N=obF?m&6mYH8kN!9Wz~bao_sl8B7=}f3q8s& za=&yrit(FzHFmE(%5wGqR=5NmR15u@VK-laUc}vvOuaK?#!PyO2`^oNGU+MBs8Dnk z)C}nXy~-b@msr(vS7^klzQoAaS3ncsI`FnSy~e_fl^Q-r7jA0RYy1YL|MW7$pIs?O zdgB8dAFFrc-1TQG4S&zP`B$m-HIuP}B!ut7c0L9a0Utt*vv z5Ez!vd!2U`dg*gi5pOZuGgq;CZBeBjZD!^#k*i~ns0X1n{gt!ZuV#JT;*0mL*2uj| zguTJS%C2Gh8%&Q~gCRwq0Nzu8Yc*0zzNawP0+W9(zFY;>|IWE(*Fkl>H;!B7y0?|d z4@rv1e#SwW^OhA*|5imCBkln0PY%@#*Pp8zl|MU@I@9dyr3vaeR~n66tD{E?(=R;l zC-b~#@f4mn7*F&(RZd?r&qFs@<)rYS$LJTHk8!8~H(5B=Ca4z|mlRcm14RF;>^kW0 zDowgWzhD=&-)OZ{>KcRDB657eUM5ss2Yt)PM{h(0chHv(j2b80gxB{CgTCdvb`vh~ z`AH1yb}@eUO%j&Tm_c7UHhwvVDD&2BZt{purINzeUpn$OY;)5!H*1vp$Tl}o?vwbn z+MSSD9f>6d<@sXGB1tW)45BOeb7H+WTUK46&K;2U3rh>_Z8}S$df_hUOYzNhe2&2` zNQq%8Kn|5dx{knBA-1{VE4RRQ@#h8p^Dr~26~5|CX>RS+k}fZ*v}s(7AD=JDPtJT>(L zc@V^_>J`s}8M#NQ!LrSZ+~4qabm|rtuKh%rV^w?y(I$4~J-6a@VV?OoR8HKp)}^XJ zx#EtvnBHRM?YBzDyIG3qlN4TiIfHxNXKzE#i{5$u$4ZCAk^;0vfsS8|3Q$Hwbt9mM zWApURMPc0x_@g>?i}tHOQxYsIOrj51ktbGL;j6CYru-m7b&w*`q`#{G__>B-{MARH zPFR*ZIK;NA0;Ycz6ispnwnV{G&7XeVp@oVACuHX+N^h8cig)x)P5c^5A$phNC} zsURHxsZ#W8NnxshssM7WTvkAZ4T^hTM&7N<3aBeih}sDoK@jJddMv)_oM*P(;*#lK zs}ijb+r*#j6FttY%cpl}G#>XFvq@¬EDo=T-@RD=FSrij55M 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 &b&#g^NODFnmZ-_`IgT9>PXYVlkY9BMg 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 b_H3)&DxU6Y?(>Fe*|BUlf zyD0v^>k~?KC^|B9UIM;Vq&AjIT&^p@Urd*{3IvyxghqNH4{Y76(5V#sLuQr<{<-n1 zlM)+xUn`pIl@QZv-Ob_#j_-*Uyu)-I zuf|JjBpLP?rv8h1d7G51Y??<4yST5SjoyELPLi_S&wcmD%it=8gI(gRuq~kP+N@~^ zw=x;JAp)mnt~B?YSr(x?XEgPI#pp@uG?yef!Kvw0ah#;1jB{kTxuJWbWNFrszf%DL z?Y~SbdlwSg%Dx!!a=$!`}oIs{J6YTLC zI|%!nvCb#So+#gm9EZSLwInmj+NZVm(=n8aH()Tl$1q{7)d?pDz3x|xXC4c&yD-vE zyju~ZCtynCIAp*w(8Fm-9z^QkRGkz5i2IXF!qp3-olHWE@c?ki%|G+~vZy{SU<5St zIR%5pX(yF0cm$Iau8ZQQ8O}{V;rvJSU%P;w6Yl=p)TWw|@~@j^-C13aus?dwhOza- zzn3%#*Hxkgu^lLqPaZ}ej>No63PBJ#eDq#}=yHn_9j6R(DRB*UrRVlkJ1e2; zkSiVuJwfVVb*ZSn>6Gfz*C=Z$UD4K|%um-)p&?3_;5;v68?59OpMPxHtlbqQ_!As){FQ zY_VE^vgg%e`gv~^CgsTk1`C%1veGJ>K@ZE!d-M=$Eof6F*+t1(2;6kb?1P?aX{%z> zFd{DrP$A_w6ccP>=**U8qO<;TPZJK?0e+q0m_wSFe?v6vqfwTFIJpZojaIM%cjtTZ z8)BciK%x{GML=Hkov6f1!c_RRS!PlkXCkH!clMQO!sj?293 zItx)Jti#c$NKDuq$Z1p>e;n?oDN-ti`${G3w}$Srp%p%*oBca3`QJ9m=Y%S8jNR3+ zycnEk6T-mYQk}tbilcJuA0~cd1KfD}Mc~$mcqj%h&~0*8MNc+yU~%tHb9~oR#Vft=2JZrtOiCha=XV1D#Nl z+DcxMpi@kY;OfzSJH8tI9iI+2<7kvnUB(bH@CMyQY{XCw)^!aGi{AE(pT-vG^QtN}CT%ya!}b4>q>{+?(LPl*lJG;RJ$K_xFgWC;9_0e=)0R&Y$QBz-~k4hH#;{Ne&W z=V2;X=oAo%nuv^7O5_@-*s>Iol-ptQV308u*vAur@z*$kru?`lJvUq+GH~7e;h(T8 z0w@eQOfmSj3G$D_=CCdx^4cx$m_(rB@}3ApE#5ds@Yxe;+i9sKFH4DmNNl}JyOwrXF&E+FdyO$jm<^LE8Te*>;GdEfMdyF!>q;jHYX~tiD z`HMM0Pmtq_s-6b&_>EohZVLBCnMW@x58BpdLcf8#Duf6YWuBKNa)By8xZ`(9mgt+T za+?@^r8uLGc@|;l%NHL5&_RQ6yL00LOrI99{OiI34E84|7WNkWp{$Xefl2G#;x^=R1j_zwE)8im0dPtkSye$5iN+Fok2Rb2#?t3T0O>3K5!#ayU}$#n%Kh+)a35yT zbpM~B3Fo3Cex?!mBIH!_Zc(YUx!Q zxThk^x__?|9Sb7#Ai_V!9%IBLHj7XI>*1wX>uKg;&-1NNI;klL6t2S@+!jj%EQ2_KoDk z@V)={Evm(Z4m6X4AeIRW#@ljXc!`VPl^bGS3TVP)#mgc1t2}y?ptx1Dd z1-HnbUH*zbNU&#GhIg^(kt8DDQbI^k$r(yQqHeusS=zORSi1zp zOBaVv;Yk86AayV${J(LJjMuslX69(C=r@S<>($@pI~RR?!eKz4<-xle zvkZ>zx?xz`4mdF(e)q%}>IMrJROk4OauLnD5;6k9=rX-Ij)i$tterE^_Q5pvSMFYd z4Si2_r#>-QV+DkvxA9+b#A$n6#$m8!-n%4Hf$1r(nPj(w9?7av3N=iGlZ{v}QfP$D z!!6ojbHYaAF>XsZ{Pdfwo|4_c1r`ydK`vEf#kW)?!hb$O1i8p&LgBo7Cmz}#Ub_UWAfv4L^k28)~G-32b^O%oFL@9&EjJB{Y_fCA;zI2Dg9> zEdMQT&umLd^gdAXM59+U?pk&gHONZj)R%L&c@o;yps41|bn18AJar@)vb&bR+AQlj z%+EX`Y%jkFb?pPSv%N>cRZ)IgV|^ec{{QZA1=@0xCnOu0J?m>aHx>hcTDS)B?MtGE zDoKacp{EqU;OGGr3?4DP&(H)32vtUQtQ37PgC1iBc3>1?(e|bm=~jF%KM`S?TP5QI zj@QZ_s4>!7cnz1|^%x*4E>`J@JqG~JKTOuPW7-00)Ias#;?fR1cA$eN=ykTw^ zil%*kb&Qrs6rca(1k@?KL|BH1O0g?m(j1p%w;owlx}4?C=;nxiMafO zb-zmK6%?*bbGw*+4J$Q^RV(`Q8a8>|Y3g#Z@cOO$rQjr~`RzQcFw<0zO&Wi_-e<~$ z{GqA0>>a#9elzXvzKfI*#_qPzL6eB-S>z!oprB)S=^D|Y=# z+p8s0?!i}MV43hC7|EDr;#~eG{0}#qoCwbE!R33+Wx6$t#x-;rzlRC3Z$MIId=I@5oM<9RM zo+;eP4x1|IXO%oLLoE!2?DSafF7I`vt>6IM5JyITHtQg%C>J(P+e>=!$GcWDOq(1$ z2k@^%8sW~!H&AjB=0R1%Jw9UvZglRxHwTrT(3vkH_FDP}eICO28&dq~eWxLwH#e?M z!~_`w36#5^GsG!K?JWc{o=4LL`9F)+sdKqz9-^^#9S|QDDJx+L@P2A6ccoX=Fg6b% zUFGv|VCSKQApI+p|GEWE&?5fJg3AT2!*2He&CVm4{L8p-IN1FrwC(uo}`Sw*c!x0<5%XpxO#JP2R0`CkW|>!Y{fX64*Pdd}KQ zx-Thf?)F;CS&BNiQ+$+pXlGw(gjOFyC`K&v9HDw@{%Qrb#zxmOHZ;s5+vhpP%_>wR zVyYE7?ocWK1H`KwuG<9pYJ^FkW0RY)Frh!cIp6^J9~8iBAK7*4V%U7%S+`5s1SxO~ z<2@zUg`a!N>!QLmHXw}Aj&4>4cgQ^kNd-k$_gADZqSNTc`qPX}u`yb^BJ#kuF#k#F zhjJK8?HKh#AJa_091Brw&fCBUpF_WOeP1p=vvVDjZ+dr_QyOFD?QhSLRs1xfQ+=zD zt!hsUrZqBvGc6uZWIQ&*c)-=14YlgQGBtqxQRpe~9Jg-L!fRmu9AY>vQQ#-j$sSE< zzjhAx{;%EJ$b0GpYF#N7)AxStQ`gYY*DMb&x?LB(8W|j2hKk{M&)z`DOp{~3ayV68 z_?VXM(Zl>DNvDHtvV#fhU4|x@a#R1kp>pc0De+9)@AYps*ZunBF_$%nc}*x4!S{_G$uD=a;tRt+TDK8T3!|J>u*4>6cW*H*JkzqFHq|Wk}~x@guCz zd|^s}ZQ#}^?p`o2N>E8Z3SHXZ&U>wMGFK3a)Suk{YCO_aJS-IwTjFr)(%IC{jr1Cj z!D!j|nd!)fzQ{F}Gh~WJd0wZ3*P3M$tDPiepNajm$r=R9ngW?_6kyw2k_y#~r#&+t@ea zy0ItI3ak?SJ!bY>LQ8CG*~d&QYOGV5u1WK5Nb5zif{ z_4!8Q=*xo`qQK2Z{L`E*h|H8{KT}g6|$oJi-l(82m%F3ihwI8YL+ekK5%-6luAsKuLZa zf&g%RhxrF~IMCU0t7l&K)+Z%eI5*UE9(EP!l-<{-LC(q34E(W!N07WcsYkIJAjj2& zaKH2=gW8e1WzEajaxw(#?_B1`cugqS^x*eIot(j*{ zD;=N0e92TMaFFHQF2+MkV7@uS>lc>D zLhGSUwadwlofoUXzBV z^m~f<=mwI;X&!)xc?wI!|Fq4Wwf&9!;k%WnR(CUsk35pln_J)FIQvUZqyr_JOz$#M zOe;iA;;nV=;V&dt%1BP)rrw+J8d!OeSL$DUSPnH$j}V-7Qfu*J+AU*gw__WiM`A{{oZ%H_Ud7i8%r}wr2nKv#b<6Z>k`!R7VSo2@}xM{nB9+jmj#T z+&_E_jT`|;&wowc(y;HT^{q(Ac>B2Y|Q5H?(a!dZ|{l zt)kd!RuTn}B3t<<)>yPj=@N75gZ7q&X#@|u2Nm(Ub=w!LzaBc!yU;^q6!-Q*-$NFw zhFr|sG+in)$NRg5NT9H`I#bMO1b~eLagfEH+pIv7%3`YRN;;9TV)_WwTgD)8cQ0MN zsSzhn#uuU%T(tjW`ID@%YYh66amTzNt*V?h!l%F#MAbB=&FpQ?oTYXpywB zdLvtWE-?=1Jco%-lanWBu#x1O`tS*O{*6z)`CWu@QkO9adc}>sGf=fntOoxJ@Vd5| z7um<5ozVoth*kb~E{|je1Z&wbk1!`)`sd1PF%uH3?JZr~b4l?n4c`g55s`Zs*?1xh zGg~@mHHT?E{sv4j*)c{p`SQ8vKd3Cb&^1gCm(y^6Q8M}+{ z!uoc9Ub7QL3Skjmg)ZRr_tqQF;#IYUy$FagH4rn6uOO=DkUJMZbs2rQo% z-8QMNQy%Yose@bKLSFO~a{~u_c-*shH0k?#;B5b~7~G$VXP=narZf#b#p-tJm2dPWNa)42WYqmT20H ziEch1T$ClLe67h`Ag*l)>}9np|6;Oo@!OmMXqAq!F0HUu@{Jr2Fp)T=3lV@v&u&|z zf}P;(!?nWx$6v2`&C07zsf6N$9uSrI3K~@q4eVAD)96Q>mn2-BCGFh*9VQ~s!{Bm3 zIw|1s0eahOw3Qqw$bKvD9HUHV0J4l3lOk%h`f-RuKnca6Zib|;jRm(29;^}^+<7#o z0Wfu=Q-A`G7M`K}+#|v;n~;|`XYCumOoAbZ%C&wsg#w-|~BcYpZ(qkD`* zaJVPrTyyuh&eN7yc*;A6k`I-#S0obmO6p;k1DfG1g42X|426J&?+v5lSMpN!7r*MQ zvTM+36=P;JTq-msn^^EIpFsMuLi!_LpgK5PM4oRv*{-f1f~?VG4UKK2#lpOAg`Js2 zFb^7xB00)GhbpW=*P$Hd2x@5Woz%wwtKZUoco7V|s2RBn2K6IIK*0VA9M7ovXd$Yg zbX2)8YIgO1l^YGtv&)#^($@ldm%ThPjJ`)~*YXx&k}f03Kg&|ak)U&jn#dB}_}}`J z8T!vinTGc%3B`0ofqjTLtNoa_HyAC<2Sce_H83WGbV(fxv;uCFQ`X6DfAv2c?b|dT ztD3tPREFnH+VDgwFDPMF6{d$2ehnUNEkv`qU5$1H;U4b~$Y8HI;2p}}m1O?lzN|{s ztXyD3?u-D5My5v$*Q%XRQXX3fXVp3-Zym&dj6D;q%)jnJX)GlZ@6N)C$@4BPir$Q* z?1D|ON!CcmT4=`JO}@Q-)h<_`vp+WPm7-Y^&O(R~RD$cyQd^H94uF&1g$-z}n1*((Q$qO(LzHewdG~m@I zS6aBg(5FuSJCO3=)ugf&iM>ikd*grGDyu+&b||+t!|c?j4jZegV9Y^K zkw)|2#mS1hmA>Z;I|k(=W4&@;+()|W&IiSHcp(n^u4fm|>D7ldsRjLZpvAD7OpzTP zdhTH@d3awI^z1k-&88iVP1Yu6{h9vcB~X@6PDt1tX>5|}G5w`~kC#R!`k<5NK+APY zGpKnbG=io}FLp6BLiI7t7!jK<@ZBYui#x^D9rv6d4xzI(2Sr9wkk+28ltpd0o93dC zH#gg2ZzNZm%C?pbKI)}iBzYpe|5jdI!K)aX5%*&d%VKfwi!dW@Fyq(F)aw4J$Sv|Yg_=dhi(xDy1to^GKU=z3GyW~X>W#h(%g~L`2NNpT3q{c%b0}1b<`Bx zoRFyA&TlLfiVi^n=r(ARK&YBPd5q7vDN~;W^!VLZep7bs>49ZBOx~Avq5uuNR%vrd z!sD$P44JTIF-+(n4J1nlC!^BJL6V}Ta(u?K5xn92S%9QGr(px-UB%2*#6cfvk)#zTsvd;MNOK{OJfUQDO`B>(va%jL-KuDcI#VB_ z^d_(h9i(~`e~|fxJ^aqd@d1kb8=4x%}nf^Noo{h(|FNG>OK+gH-Gg;&0*weIXK51bDgySAmuxom<9;jvhf#u!k-APaN zo)l;$po?OLXO@TIQBnliX!4l0OGQKU*N0fbpX8b{3oIX`HAdPi!2 zkT1*xm7jaT6>7;?N<;zOJOU14^z^4BX`UI!K~%q1*8KUiv&q}TWo<)^^1;{aqx3?r zV?zI+E-~t>xpDGqO*;9w_cuO_V=3^r7fe{Crb`gd`EkvC7SE}{iAtwh=grc|#;@yp$b833Mu)jr0uLC_2$OCUk#uZJ0Hn zvxs5(v0dmGhiN}icdhVBu&rD)DJv0C9if4#|Lw8XFBlhOy@5JkgEf4-xxO;d>PXIe=b#gag$ zoO~QG8x$ge<}Zu=@0Spqa6qqJnbR@{bGz{&6nwYT1(xO=v2R}Ce1xzenh=Ez_Zs4A zrCnda!wZqX_S6+U34bW4<CUgg8T}#J zlpyLHk31kw+L;cwy(r2@FP%dlnpMq9}#kd26$Md%IJmLP;#4$f!{mmN9g6XN_bFBA_Ot>I<_9_ zU&TgidKXys{c_xSBu(u^@6}81-v)5rQyiV6kK)k}Kg0OQ^zjGro2JPuwQ7s_8`tX0 zspL&M+Lrn@Rt@cqtyzPK8{B_CyM+;lA08V_)#e|qAH`6W>~GB_lZ}|z_s?tki~4OQ zTb;A)0~;Roil69|KLjZ&00mDnA}}3jq8JH zAOlV>7wCQUW8Mphd@EZo9WJv+i+K4MW8ON&^YJjJC^1x@TLS}+NPh7LMe76;g@@=B z<)lX|TDu70YL$nVd@IHYZ}b3CBgIF`k~4ev5B86c0$3V!pzc^`7sK=#MRpR7P#K0Orip z0R3&5pB&^8=xk<7>}o3w3^RQJq($1a3hg|Q7RH{c)**g;vlV=DgmPE?hJ3++9kD7s z*;?C$F`jEOls=fmLzKid7%#iXl>no1e9%U*Wh0EE7yl}^s#4B>WEtDwWT?V{O|6#c z28yynr_f>y<;MqXbd|ScaL?F@Y{r-n^usBi{$`zS0aAwn&8>vTC7vXM+ZRV?Nx3C| znT3FlgmVvQ8E`2c>KK2K(Z9Q&_z06{(K40F6<9&t4$zJOLAee)>iLs>E-=a0c#Hj(%`LI9;_u@>+&}n88)38Hilv6{4^czX_&ZLlw-cFacTj^^y1G>}^2Mg^#AN|7 z6&d1pl(>l$=SNN-KMH3XX!b|A^O>m2^$19ZYMcOO?5=@Y`#|=Pvn`3l0ztkblsw25 z@9J5b50El?Q2Yf&EWO@*2;EBcz@flTmS#%f4$h%G5+eFD#T!j#!(?I*xxs=T7Pizp za`d+Ib?Heb)}33GBa)TkIwrhMwxXo74O3Kz+8g>qM`9TzC=Wl>-j-3Yj0|3vuqWwY zZDGv@KCH9&UHE(QL0$779n;12;G1Ies(Fm9ESf3UPY; zzHcdC=c6St#U-Vh9^E9LJ)g=XO~jvi<8hc^U?s>5cr~#+6U3zgvtnL~1mG)}zQ|!> z-M@dF)8#~y`;%aM`nCCOInFM@g`ALee&Q*dE|Eoml_=%+#2q}F-G#%Atn0RJIYcg> z2jZkpvskH18gZspzFDGFjCXgdDA{P9o2`{@kJ>c#Yp`qqIaRKLzE}@o4EMAZhEWf? zb&SBPEJgbn$G6<#Sze%?)F@}vn~51%g`fchJ#^>YV#5@rU8a7C8TjPn5g?SVHStzh z?dF{fBM(f@Fbto{rcto^LDU6Wsp^WJMpXj>SYVvZWs&|%Ms#lDq0J~uW@*OoVQ3c< zvRg|FCbO>3lE3I^K7Ts%^{4T0Bd4te673G}tclsGacE!O%qZv19v#O>$Gvo*1vPY1 zUlNB7(y1a#j$L%1FY9f_0Xv(Lk|9@>(ekbeuxTDa&Fnk2vAb>K>=VYl*|9MK-ZO}N z0?wiAXsz{A;$nJHfXmatGhL4m)>r_kerKkuJQasc6Nn6)t9+Ade3X5RTowT@@p;k! zO!8?{z1%Hl1JHHf9t5=l@r>+5w0OETv5SwBc?I13e6z)(x$eTcp5pxTB&y=*X(lFx zNuW%t{#-@kPiQz%T5CX5(Z_E>UH;`(^cu4rr$ZWw^&YB_k&E3=6qyN;#gq!+KO%?l zdOr-F)r7Fejd3FM7@3n{=b&^lF9Uh>!9`Y9_#S<~=9wZjX5CD#PIiY(gF1V69q4yC zKYTvC{>Un`a*Dj$P#4A@+6~1Yd+{A@MJXH>9G(}>eli8bK&#(?%FWPu1V~`E&&8=% zUDMU|dgNoTPp?6=$f>WXh~RD=BY^eJ^?@1wxCvNlnjbpAMdXSn${D%X=LN~K?`XRQ zQaGHD@jbD$r(-lZFA|W=MrmR=^sw-J>SU**yf<0{8A0#Hj*wC0jw$|(`73?@z(;r= zY$WL-Xtl}?&wX-h4xF0IWik1SAx`L2UEJ*O6tTTeXf-#AH~xc6dvaJson6HiPFekb zMkL|+8B`%|SkqV7Vg5MEd?ee~9-WV;!M}k(V?r?uaOxC?HLJb3`E&@DA4=XrtFEtPVrCMQ;=x@%+@#PZ$ZR$Vsow+{*eYAOLkb$$9~ zXv91B`zMNQeU^@Co)1A|?A{D)0w+VW)uS-_e`^&MeNHTF5(p@Y`LUg;%0L802GlN_ zNU;&m??2B3{qVqR;mYMM`4qI^`4gt~L`RoDKa695hO^uA(W; zGs3udtws-DgtDj)#1f1LZkPhIz~LpNROpl6+Fi$gCg&U0+hv9XGYAI3>tezKo<$E; z{DqVWVzeLQt^g{T(j)CK;0!GfBynHI`cjH0o`vBi{ zr}vsqlM1H8;_LS(K6FDOZF)4u4;mWNB6%Or&-#G;2 zh9lcgPBG<%8l|vRZ8t$#sAi_R<#S79s?J8OUlH@iq8V zxk7T}7U*%ZmT#pHNV|U42ItkGXgcUdntQim$#)DIaw7nC)jS%C@RwF3zIt_AWWZs4 z!RvCtpRp{t)fAKZiTNi3Q@rdb6X!dCfZ}L;P4A{?GYz zl6;I^ix|ALv!bVp>FNR&^fT_vY8a|gv(ZcyNGq6JPD{O>OP#7G213T+_eYcFbJe^p zN{IMHU2QB|=;hi3?mh!Jj_0tT48xbeVEM^EV(y0Glu5HJ4+0cGRS z6rLT2L;zW1zxRByRv1Loqzal#kHILHdC`gy*oQ1bfnol*`L-JXL#?iR1to$>AK-xQ zS*8U-eXxw0!D9peELZYH`e5yKK|9brcn_aa2y%2avSVTH{*R-pjB2Y}qF8WucMI&y3kCAljrIcx5@d-m)zB3QG0bAmy; zu7_4hjjHM!LG&zjqU^VT=8Y98ix3WuYabjnDV!XHr7+;!nGm7xGuDeGj>9=)IhUvR!-+B&Ny{6SuTe04LVg56?C4LvnIZ2NRyp;H@ztL?X z=>D~Qw|unHobxieZ1`>gE#vz8>+ssL+_EXWk=(NX$?zEoK{to6_x!B#JafECDXF9! zJv#YcpQ+>tK#Hg_A^XBZ!aL;Kk4hS@cB32g>LcXC^V;=kp2`|>)oa#j^cp=QnCOiZ zE9)hMdJWjtT}5t%x38;@(vNGM(~^5r=3j=K@|$ihPhf?q&&Q|lm$&|o|IxSd`dW*S z&FL^Kk~FzMvz9$9>eMCO-rDD0)~)RpX9&9VF^pW}L4G*2-V?p5SKkTT9~~CXb@PoY z2r=iKRxoRMkbuVFFq6;^bb(HRo?dvy5S#Rrk#ug3vDe%px2bbY}Rk1YrZ zQ7nilrnoV$4LWDURPh!;OH7EZ1!vUa8bad=d`Xiaq{+h$=H^bYqB9>6tcM)u+nD<5 zaBY*oDsv~2eTSc%m4=Fy>z{`T^w5-AwIeg$d zbS#l@H=sWhfhEmQcD%B5Wi=aGUJCw^^PEgrAH@|?pr|VJcC^cy4uc&IvJE)2Q40%T zjd*fhmMx8r$T)i0G5X->qK=`T;ONldG-g>A=E0>6B6YP|gaL=$tRr{}yVp98^{*bi z;$Az?#9VS?acjMQIiq3l#w4t6rgIx@fzDX@IBFgl18RL2>Jh@apT_Cpi^ktr?l115 zE)l}R0|%U*Wybv`Ov|My6uTQ@U6g!Zd2wm&F&|yL-j1f9j4GV;Ijx{MbaPMHjz^~e zf@hVEfbIUj&w8&>cm(-3qU4WmiK3hRKJjKxvQY=ULvI{p3QjIXX>fpN*0QGCG1HTb zILrZcd=w;lBM1yIV6(R8O_4UTLf-=mj3NfQDns6Mpgdb@qt{{l^<(8$zuzOinH0|g z-<`a_U)}K%mZGi0*2%y>BF3*VzmyxrV-D`-90o?)50A)fiZaz74u zooKYzFwcJJN%GEOFV~LK1YO80#TCf6(Hnr#a_z1fgmHs>%C8MEc;8aVd1r%F(pw)L zD&CLNSh9?(GGQ8}rXY2Sm*}$Z@58c`GDDHdVn0W0BPgd#{8Xqn7&F~dzaZNtWnQhF zkNFtJ{EX>jp?yQ0^+5E-)~CapNAz5*O71mIK;EVQ-^rjU)vVBoGmfg>fktLyBn}C; zYNNT-_rbtsU3H7QfbTe`2?KBX+lrj%boa=^Q+cKTAZ#<-c~YGAV{U*xn!(;f|K$0$ z1h#Spiy!gOnd?az&0<<$*n34>?L>M35~s?eBPLsQH$%Pi4T{(_a)3v&5+aBA^>4SU zk=)OK)%xr}F_cEm{a?uLXMxt$GQUGrzHl|#$9L)WALc3+SISY9z(?jGm9?&mowo{~ zjT*|thn1>X(yBF-QmaWYCg?WU0oB&J(A1l8qPAsE4ljV zo9JsjTlrUBsC*H5Anl`VQ7Op7dn^|P%`cr~*dm6=antE9;&m@y!>0kraew(aP$yr{ z`cVmqHyPDRuaHPCvqrD&e?_^-yf$_G$Ug1-fch&yo12>NsWf~m=6;^y?Rgq^6K>X+ zd)ljPRS}vS%czM{`wZu{#8Je_r$tZYBmC9-_qX zpB-t91u0^;N|~lf6M~wJMYf+0WBkX67+w(d0vY;v^O93GNSZuSMA%nb2R5tbK;k4z zz*cUqb9izv#}8%Ne7Uju&9IK&q>1n3E>yf^jXaWC^2&F<;ElS=U-$uH=9ankr;m7@ z=D)^-$$Qwe$g$r2MVqH^isI-XRaq&tsB)-KZZbQxcs2YJRpw7~tK@K0@P}~&70BB6 zbd9%eR6)1??5d|+^f?kw$g9v8uwva`W*Gs+@o(_4N`tu<)qY&jUzcT&%_=li?fvo1 zVmp%sj-rL%%+}q0K(En)(?0zxXGn>hB8v1q zl{rY9>RS0diq=dSgxZg#`v}t#=xX}|aNq9~`h=&{ITLvT7P&j79N!Zxk=5b@=R=@UkO$@66X7!gV=6_9zwGlk8DkmLA{D_9#eVmR$?p=1mPkvq%XAlxut;qXC8CVmbx+pLe-be zB@8|1HTn&2*saEgVmAPWJg=)3n8uX7`9r_+XQ7V>;4pD?OO)sS^~`rf*1?BPMo5eYeR{talBh}1mKRud4t;Fc@L^uS$CcStsAi4{ED!Sr_gWD@3zT*#e z`hs}{HLOW2=EhWB?I6h`@K8z?jrMK@{QG~&(It!aP-^QbUj+d%jWI*!rv%fVCc)n5 zMfzU&=b`q3K0f)I2(TBgd3Q=)&BhpmA7@;c{%jzAS(|y9w_E29_1EEd*JCbHOZO+Q zF>$ORkEadTkxHV9&x7UA55T~=uw!bT%KHx=Z(6Uq9Nt`8uPIm-W1m3E!}>TYvjtu z%~H~&q790Rr}{nUd3~gp$RIt#pe7dcGI3P2*ESiF`sr=VP=WQSN#akS_p|P#rcC^= z8NEhCHR5dos*6%s;PxQk7FUp$YyHtox|gC){3ybbwJC(}Y;}9D8ac5<##mb$a;UEC zUGU;Bl2pK7zNaT0*B*GI|3Sv!1G$IRyFI;kaT{gw5&HAe*Oa-3jSBqp({Gz@@=fPF z$ay3cSR+RdWC@N7xxYc^QKN`mJEcaK`Vb+=So87_MoNj(7(HPK#A=DjnEan&Urlc| z`7#Bk+5+G6(vgB8*F=WL>z|(-kkIh*t2b(DO}e(s%+vZM&=r?7=NOLUM=WVhwe>01 zWm4U53a!y!ko$t!gj48PA){YA_~gE!OQ`Acc&Pc0=||t4ro^4XcdrQG=& z6Q9{)$QHv!HgUTH76lgJ3G807qFzLoRU3pvXbm8>OXBcpbhE3+NPfbD!b^MGPIkL~ z1f07!Ux1^z2dgC>OR^D^u?caX>ZJ^vzcUmM-yzoXd_ca9j7DaEtMo$~ltuht*UC+7 zhB$h&diVjcWnzM^3u0xyYK9`MFmK_a%{5f*I;+StrwD-~$9Uhr(zN8vAOO5e%sVW8 zjaJWpu`pVAhq6hzF;tv9Uw9jcMm7$Gk;6nHG~-QWzU5||bS-E1g1r+gUnXYN#BG#T zZnc1f*ga65Z`T)=xYIEjOWD5RVq58}?Jd9sh~dl(iHNxXbH1n>O}I8P-&1dcOLUtTELNbVadK!I~^DzwXG!#xa8_OU?flvXFhXIE4H;&pObZ7yf4LaDD?fs*zlpECHOI4un7Ii`F=JI?mqj)^$OA6CN3hrq`D)& z_G5kjI{E(f-2Sd8_zA6$i8vQk5(6DF(kkxUB*;PNk%nhCM5V;Eh z`!UH?PTMdBeKdDkmD?~{8c7uKDf!6k1b(Rw((7kolv!ia%92$v`TTq(?;gs_fk92Cy5{Il( z?>EjuxL^Q@xB0DkvAqi1BkD0v=z+W6g-x}YUr9i+@KC$v&X8a8o-n@y+XOvZDnz1N z`3OiO@(?gYd-IC##I{Ux;IR+d%w`*hBQ7MJFFiq5qKJGJkGdzEg?&~eo9)M4vOesxFhKPG5U$3B0}oxG~@^-+Y1X16SVXHoL4#`w7v zV88iYmVJC5d!!Pg+SzF0ogkF7%!nc5eP?$~FZn&+rH=E^C#Al0aVoASKAflb!~~~o zLI|xJk0DPXo?%Gt_mL7V5iR{+kW%o9xWEOZm06fjH)tL=*pga7#})}974H;_h&a_& zNbk8myMvA(fOU^HBxQM-+`}SURyab;pKeE?RWyD}h*6<(!(O)5_ewpPSzXx@FnFKV zCSEc}G3t#mE`(M=csVY#{vJ|jHA(OQHK)UVGNgIF4O=(Avv4ISn+w;z8S=d`oFQL5 z-ZJsLZ)s6V{}D-;4?NY65?bJG%$-rx*3re&>(BL3E;D@nw&Md~*!>Z#{x|n>D zo*@68!Efa`K06`4WJ$QjkfQyBNNJtlxNv+hJrH$xt~Ku&e)G8?ME?SmRv8YQFX@;f zO81X%xqCF_Sw|*N)RM8RgmAxo6ixTfj)s0}gPzmsYU_K7yqaT3sd`}XXqUoZ@OtCO zHvkO|EtA)cdhuiOpQ`Q`oq>ZG^ry9k(gd{nOJ7%Z54IF;tmG5!KY0_2FPrSy?qnZr zH;-g#*KT>sr6q7UW}%HbijE?LGcK9{9`=4FO`w;}lbd_O`Mal^4osRol6a5Q!4EuU z`wHpMWRY20&d6701hQ%$Tcmq;{qAcN(>1KpKrWbiaJf}14XqSogHF~1F$A?^V(|&V zD!}C&Hnp3)>M@=ykLO)ybH9-uIK9!E?`6NjyEG31lKmacNJfAjL2m+6_Mp? zEAUnZ&9+%=lFwz7ixm0#oSV;c2HLMXDJ`bvyJ-du-D-;0G+jj9e;-MCZ4KEUnER&_ zw+UNgI4IKFiLVghp5hY;^cx9$*7m(%+EeClQm>7da&{KULFk?$g? z25xiG@?@CuOl?)+28aOKo`>l-K8{&S`C4p$&xrLAXO1LZ)Jd25?yUVnpf2XphH0&#aMp-JR zN~~_<_7T9}wh!HYW0S1ZgIe+bubx zj5H0XpZg|U#yo$<) znP}_ZW|G|*V4i?Tp?`{H$i)(gKT&B%bRp})L3?9UuxcB%$i63*W%r$i+AC82Ow^7< zm2uEkNjRLu9=XIkN5cQ!hg&b~NAzI5{0;5FPB-~vwwI4Z3jvFt(S^?mMwVMy#D5ea zpF_X?VhT`z>e81D8~ zKPud*j4FX2iQdC{o|lRmW+Sk7xIT7xuNlVC76J zGo@^GQElcb7-dx_GIMBjtQ}%bUS`i(3f(S|OFtccgUKiF(1=9%CEK>o$qbQr^)Ct0 zHBzf%WAw%wR7&nPj4}#-?py8)EIID(Ad(kK(iTMnYhX`|Z%WQ-a&ru}KOB(K-ZV?* zdE0=;Oz?<#x&jBjAsj#(Y-EN^$l&7KDh)hyyTWX1><4Nt$X{&Qk@O>u$npsvC?4^T zCS1p&baTqT9br9x$vf`jPNuLefx@P&60ph#wdf-+6JKX|Bc%xyt``ryv6@&`Je4AY zKVbetX2#A<2*ygsAU3md{7jEDZNS)}?NJ<;D^TjBk9ue@`vdz&Q_# z#JtjN!k;3QuSK_9CjXi&sS)7RDU1JL&>B{NMUAnBm*-E9HKb9_Psl^g$zs#jz-N(} zK2VkBB>$IotC1vc{0Ym)AGj9)v~Qkn!eh3o{UyQ~Iu(%F227mO+4Qb9clxsxT|obz zx60_P!fN9VFt8$CiB}1upaaxsqjs6pz)nPCWElO&9tu}RhY1J;uAnYRWg>m_EmIOj z>_^qeK`Dm+o?WHya4tA~-`Zx*);`H!4%a0`Na@{_#fdtwt)aqL;~CR16=QwXTJP)Ug?QAxq(=1*J(wbaf~3qhNGaiV=i*TLPrR3Qy1 zR3QOv_@Ddq$(iFf42YdbZcEOnJ&IwtWD*CwI4(1YJFfap(lgl^4Z@VktrLZ0H<*H# zkUAKJOUw`&;mwRvyThIaeXm#&!;qa`4x&Faz4HhISV(xQrclT&_nGar_9d`Y&8&>} zR8=J%^d2yX&@gSkgMX;98^sS%!3(zfB@={_qB5be-09W$dE*8;^w^%-=-dl458{KD zg#;@Wyz}P;HNcz$MXH@qdX^yCh~CsCGiK4zf!<$)^756tbIQY>d&d-D2!0 zv!;*Gw=6ER!^1way#$Ci&1rJvEXhaf#t>55 z@oa|Pr3l{IK(D5yPvK{wo>j<5vK37-2{E<-nbRi(A2nRxEg-92;tYM*lp!jLVy?v!(WUe#L>LeHH-95p<^!;mqjcA7Ai?#CFXXg6;JX)5CdA z^3ZSg;(LDfJOV?JAx`U;l7tk>PLebb1ml(OpMU;kTyV~>uTuc1Z4L1J3NLFRVRcU+ ziu?M}UF(7nkizU%OrC#*_vSPF=!Um;wvp!Cj73B$mipF4PaRE-XiIqPoBfhPg{4eD zW1BO7drta*(>|pL)XPM|e$IBg2b^}v{NH)h#3I>4 zv7jtprLlQgrCbF`C^vu>@4;~u3KficRmd+$hphcqzg;~ccMgq?SOwXVZ6Nrf+ zsbR-3Au`CdEBW&lO7LYjRwd^jyPD`3zOmu6D&d@UDK zs6c9Zm!U;Yfm>%p5jZ;Edm`OzSda4W(P5o^>sg5)VhC$NA8=l+xv&JOi>xokVb>BD zJ9Q7SQ3k8h} z4Sw!zGd1I{PE-}Jsp|-fvW- zs+%Pp@clFXMu=qZW~_RN2A{53e||rtnhOeW*1JH8p35W#4^w{9V3X4TqqewJ8F!>* zVUyDvfB;_0FV!m}Lh1YuCcwb->OuOAurPCzWUVV!;Ju6~#v}|5(`!{OrY`lc-#qsieM+r(r+B9+v&AQDpPC^fHaV_?Gbc8`h zyl^e@5Q&hZ)VRq(5S!VJbFiR&bN?%|y*S(l-T2&B&{D7=u#kwn>c0*Y1Z54;_=U+K ztyxc&DMdhq|8Pkd#TeSk*IH7nGr0*N$ti>`&>5}ZhLiEst@WY4D=o$~J!y*9#e^D|wlz!$6y%2Hwi5V6#5;8YlIiKehV_72$^Sqgd%SJ+H zjRNKf>9{1>)QJakfS7!`I+P&!vDhDP#7vH>H+O%?vxm>8C{T$;PDP29rF}rub(yFd zb{lVa10BdHsztBJn4E{qyxQiE!c~Zt`*VvKT?ogUC)uwfS(P?BJe4)?lN=cE6#Gnx zC`lz8AjfpTIq>fr-T3hZrXfQV<96*9(jlLX=4?{)ktMGTTn-faUIJ_kx1gA^?7*MS z@W$fsNa#Wi%)2gMhA>)ZBa*UdI^qh%_yg@L0PiR*+m*$@Frn^&fd1XqD_x%Q2hQm) zSX3fTj|Wbk#8+XuvIq;&!iG<^m^yWi8s4Gw#r=c`Kr<^{HtEZkysy3sh|lT-nd!75 zdH7MyMO@6kD`?b*INp3oX1?D@-yGIk;kqRDYvqndu{PeQM(UK(FIiTfmddgmD~I-4 z`{Xez5^*{~`Y#8x z0r6Zk7Ni})1Oc``g7NS;2wo9LR@@tRBptZ9U~=ujaxy(ivvx2voN>s3ElrYzP)zTp#~pPf=oOFQA1=;@(3jvH{kdK?+5M%ed7T!+rNjff8}uVnd?yQ?2EF3 zOHC|_V<^mW6GKEMpBipR24TvG@Dp4MfxE|@W{3bHMja34%%8-=P;WD(KmaqAYKq8C zijOh1a*AL&tVouSC`XcN)7J(CQ|>x%ERl(Yauq>5JvNA;di{}EF+1?U89ciUSKMSt zy=NKOMK8$&jK;Fxq+|J7Y4nA}!Fcwm=Crs{^i1oD&Gwcfh%96)5!kxmgt#Tx^epq+ z;EnBt?qg+mra~$fhIE(* zmDj?KJ+_6C)1SY@io4Bl5jjWwI#lqCn<2wNRdZwyqDAbt%f^ztFmURKpbEZ4e!Ztp z8EivX6QhL;;d(bj!+4yTTt<`-rLgeoHe7aoppN?NVWf;D3qLn)z6Q2(kI}WWmo`bz zWj3iXhF@V*SHaIHY=!9FdL!Sl2ho29zQY1I*~j{iaOc%3jaepB2oVO9OUWTY{9<18 zH5C2`+6XJzBpcCvqP}PWJPH@0BeN zS=N1|yRu6JvXA7?AUZ0NPiYa*dqwnU}>>O0sM)#wq;eVM$o5wNJsuxYXs=G?werRKXo0-8H4RVPb-<#&ljnW+;bE z{(;^j5w;9J4>a;1hBWOV5{k?Yu?*BR2Pa_V3;!qh+D#+0Az0$!?O!B~QN8iT${~Xv zGX&a$$+aNsME0CDJJu)d%2%x-Tl2lP%jYK-KT84pHQtVr*uc@R_Wx#G4H#oGJ+uCz zrl)(}YHnO$s}(TB7{|IW#1wfMx%-7<>fR{yt+IGMPBNR9g(6syN)e;P)gjUS?w5fe z5ZT9*GW$(9H@7QoYFvkZf+IE4=4O^{Pa(vrB4@;VN|cCkLxV-ga{*BqQ8qaX7cpcd zAOgpiUUEEdvTxU$K)g!MZqJ((x`>@;P&C3Tq$pTR{VpaTx(aCrA;^Y+f~OJRD}08F z9Sb>31~D%sj{B+<5w3!WYq#9nNC&`6DvP;0T!nU}`r(Q$P^&8wE{WF)Y+opkCZ-G5N#Z5 zkeU!-{?Ax){q=k)2DPdY3A>qM-nHDp$(@DadY&*`*_4tsh*!0Yq{Y;BZ*Re*)?$ju zb^6)AOwH~pb_Dh=D%YMYrxd=yiRhcu5(E$Hoh`56Pbnp*)Wf|@OXjYRwW1J(CP}r_ z<>#OFyDd3zoUL-l+#%-y4zybt=Ip@hHK7sqq}MUhCjOcM9*D- z2+vH$6g3D>xkofPSE*cq)KMiy|CrFjnm++LtQf`PWAUWRx((&vIV}sVA&WMKu>rOJ zWoG%0jiV94m!1v>lt9!aI6U-CnV>cH<}6<#6jY&!{W@$2Y_;}P`-X5rpy%|bmXjxC zu|pH-z40}(4$9f*fCyo(K>q3(YlXfJ_WT@Dg6s(UX(A_~?}#B%Qboq&)P(zhf*7;jYF0TAZrl@ z= z=PwZoAFrnc6%lihm8*b9;eK3&vP6Zvs4}Z?_vb-1zUOJ-^W@PAC((=4+T+;`FV}YW zQU-DEn13_>>?ZP05fOa4YLD_i`^k4yQ@<%rZ3OU1o`mOAB@Ta3+d`1pkSaPw(G{u8 zOf{l0LgVPpV~2|YizzAVuQ~&ah09gAl_Y=2@1@$JQc*8ehXt(g+031sz>EVsSrK(p z7MluBrjWY#SNtZU({=M{iR(l?$hJ$bi$$Y1H$~!yJ)i0R6M;3J;g4;no~7PGcmNum z6Q^Iy1C0wE>9c`%em)}R58%-$ZuM!>hO02sU3_rFb#T+W<0$WZU;m118JhJHg&`*NA@6`OUA@;s0=DUJQwn6sI3v(Jkfi*zf%}&q{NT__*Kt)$@?GnR;NQ z*Un8SrW`6Hk@axyAPyQ#8m?D!*P-R@hp^q`T9 zG0_-HuwMM&Um51EQyq|yL{_7*SW~sy0>8S}|L-4DUF=FV!;!2mip#udb|_LhP?%~u zYgGX=Rl9=^Vt)%hj(hSfZ|s35rTF`woeMu79AnR@(A~7#t$w#6kbVlulC!kRJgP>L z*8jHyzw3W`hr2VKlEBSxxZbC&mb8C}1oMn=V^gaqX>qd8nyQ)fi~Z{Vk}7+^e)!>< zZz^-O@AuaV!3#leEFat@kETWoZW%Y@=jsJd@1~NVP6?Rkn7fY7pW-6C5qJ3pQ;WTJ zmJ9jTEzIRtyHik+ujJUn%S7koWUwN$nmn@cg0kEbQWJCm1?c3$6v^Y+ZMBp4XoHJc z&4_9PpPB&){>Y9BDhdpA!L~qa(KTs8H$g-ipgb=ML1D*tXCYt`*9W4Ln~?H5ET;-T zKEFEN6!zy2@v;UdRbx8iMs0oYHKQ*$HwRo>& zo{wX_HLmM78>irhuld}#>`96o;nfp{5S;nY8g@ogkn$I+>F^tOOJ0(+VY9Z01YmU4eI_4u1!~1mjx4a653I7~x;Z*>4|U4YK-mS~^J+3fvlfwqEE*aO=?u2N{;e=zK&UG5}Q(=q;g z2tvowsQ7@~Z@OeOrZ6?cg_e4>maT`i{bzuPU5wd{HSc;EL6oPx%G%DH$yg@ddm+5j zRvyQRY3UmQD%N(>`G;ex#*_(A3k>s9e|VmIPs8UP6TrCmA>hZzpzmDluQlrxDy`rF z_3MD*d%;__+uR#gGOgff?>UenguW}k#j{!bz7J)IX8KO{I*XY5vhVziN6SVa4imW!5pyZFVdz`iT}PBhhCr(4Rl&P4Hdlq zSKVz<{({S4(FK3;%WSx2^$-FdsH zNE*gAfmCE)m{GjM(bx7Q@uRI8FJLI(&Ci=7(E2?(ynrnI;+yV*ee=WIH~X8bH{Oo=F zG=`>q;pwusC4WB=!Cja!9V4GK@uQYr>b)F)eU;mg^7elrMl*idH3Jfb}(ol1d(MPZTfBlDM1wss&*Sou_#KhoiwlNA7T&HIl6@oC)ay zI3u0{SV$K+?;5^Or4OJbn?ENq6??X+9|)gN2olHtVTIomub2 zt?xGKd{XOITQn`~sn|ND zT{^u!q`>}Q4Lil#+F$l(hvO8YQyj+FJCaMi*o^Nnw2ZfSVqUc@d^a(E92&0*rMns$98=M_lt|J-6^)$D~Bld=Dr@DL1$TMF@$ z+zgm|3mA8Xz;KpYfC_-e&d(+6`nC5hu>;qPIm?T=X9MdX^zpcjDb3y&IkhAF8x_F4 zKVyJj2bU1uo}F;OUc9;d|(`PGvad5 z@2zDS-jIB$C1B`&6^O^S+4_;pX04vKDq34q70pT9^-pdG`9qm(=HzHS?h2Q+j|}>& zZk>1q-gf6Ik;@Qna9J!O;I zVVjc67H3$57p#a4?lgVVf7lw}p=NQQjH{(naPh2x21_Sm{$^wcZ7z zq;-+nex6+@9J`TQYm$P`W6q-d=G&EjWvUrfpcFdy%C85dZ#>A6b)HEouN(*mBQe%S zv0b%jPXWL%y}DWhN1Eo*Yq#H!44!H-tZf@<#Lxqgea?s>2fWqolV88_W3bRT02g%y z5n+`@TPvGebxIq3tzROgz--!K2JAY_k}ZkoscSqx6?oCpWEV>Pj}Acy!GVouL4H!C z)I*5Q*pkGT0Hu9z!J4h)#aX$v=z@!jS^IFe-V6D*hzlW+s3`of6qNUY(*(N}<5F50hD zZ)X2X;Y}>M)hxg8LG|>=Ni7QWxJa1YIHwBcV63u*DX9Uz$Vi0rf5#-@WSpV)3r(>1 zya3xC$^N=gN_@-Ef63S%$7$;rf+Yh{rQkc5nEMDLs`J`0T8Ke(Y~j^xa$Jn3@55YT zZ!c{Z2GL-O7wTW# z-uE1gbf~EkF_;+6lxT$J`|6<1BKHlkO5@%FTsm+2xcLkAe&WGYGoWu|2aEKM4XR|1 zy=dQff3jY7zsUU#Xc#+>F0%xkEEXUCzD}u26gr&9{ms~U9fTsOJ^d4}zc)O!?c)^3 z(wj_z7ydgo_G)d>FA~zM`$E5KetB2wJyW(=RM=GNKU143XN@iZov&$Kh~j9frrG0n z^uvxKg+1~>258=w?C_2aJtf|7O7vr34=Nwo@fxVW`=D;$Rts2HFTle>U`*Y>pvEVL`f?re!bcD8H|w^Eowt^2|GjaGJjmk03472g2u{lfl~@}ECP&jJWF ze|womA5+=;-*86~o260Q2Q@3s-%uum=r1a~#u~4csER9A@f{|j^QdV0@m;hNW6?=` zh~IgH#_;}}Hvz1A<{$ZgpLIq$zrb}grw?ZsOELSV)2hdZhhdrik353{WJ%YqxSVCK zpy7bF6T_>Ff|({7v~xH0$)HrmN*otMdeQpJl0l z_I_76d$pUFNHm~)u2s#3T+&Mp$f!C@oU`)^;cnC2Mx(25{Og8m5sX~YA4H;Ake?&?qy)dwT!g>L`BOZl zOc4vBr25leBIm+D!I$Tz{JtWJqDcHH7%^)Li#wsdb*g52Wj+HywhD-tQ&>q-+YuCw=+A6`c!kP_!hT`vjOp+K33g8Vm&&Yv1E0|0c@f={QR(pP|jX zFR^_Q@gv;-NzNR&AGoL!2~HI(n{yUuiB1?)q{^{~X0w5^aa z)MFoLJ`0*gM7RmX#{bDPxY^2?s%AVZD*+wm|I&{J?Cl~h&ra>^pt&q%KB@+XTA%HL zBr{bhzOY+Baik@tYB&!qG0Cv9x;5ynB_(VKSiKjP$G3kr#9^bjsunINMCu(db9-`E6|4FbO^# zKs4d(TqPZ5F&G-V%;tZmXcEt4DzUV&ZvKRs8Cy8lbXF51{1|kl+(x>>t%R%j8ahT~ zC>ADGmN3179B6dY_`$awH@P;CLfi7k6YiOUByxOgX_%BtjV|t4UDJeSvz5f=%`3_qW&l6q{~Y@=)wmxv7O~de{rw z$@#CiXX|(_Gj4E0R2U)dcE%P4fg^RDYq5k}biPtvs8?Gh|6bk!5`nqK1`?Gar$1<0Pc>cY!tAe3cL``ZSl*^ z7{A2iZJmh~`EAj10lHGMN;+GcYUn>oiGjXSdrLF|TmdKEX57Sgnc-dy+>Z~6rfXaT zH!_mhv$hw|#{<)BR7HN;@*)zYkMCA82cw|n0H#`vXle6h_d4rsyV{(=K2^7KvoDyR zQa*(r0z!R6Z;E$IP`btEo75W%y7jZV(@Q~j^(LFqz>M8&VtpNobnykC$ z7pIQVikslkIe)Ko1CvuA)Fx5a{CmNsCq4`gT`PBXdpeXQLCCS4e`b13=$a8TEQC?8 z6;Vgp0D8ju6=9!hrasx2uoxH{fkpJ0-ea)uldv}-D=A>|C~-+)-juk=3^yPoj+zck zl8rP)k%;?Pv=fKFJAg;oVe}#SY21Uru}MT0$?UYmx}GoETV;&c?4&Bpx&(edd_-&o zNwjg7x8=`{$q)P2c`-AW_kTWk?Ckkor-m9nSsj`>|J6PmR0#QAGlgnJI6n3WCkVe? zJX)HOjQTW65V=%!=BI&dNIHEw;CxNHi-)=pkZvJ3uzvPh%>s)Ct4J?TAtM3(*^zo* zD);8$7wwPjX@c&Ax8W;W1yT|ctI7ujzkaRhmG8kmxIZc5FE8F5B^PulE)H3tq`~J2 zp);Q9@RD0VR|-14a+)uxRNn=U|60qeEH-%v>iX+2eL5rGa~)K)_e%Z{jvmS*7EUn_+l{I{z7PHHX&MEt zU-2&-pSP3^LyB1ugbz0@Uzxh`pri=#pJ6jzOyBYUy{xq%>>*)>CH&Mb@sOs*XT0=1V>>S*fdHi+pP63;reV*u6!5Kk2JWBZMW%3OPGu|od33m{TjiY&oY7?3V-R96ACl%Y~+F0 zI1w9eMeR-mj~7FXq6=GMNBv>iDMp_EE=AkUf~1^x0L%gBBkuU6YMm&aqC;LE?hSLu@q(rDU7f^v;chs#aF>M6Ukgj*sLn@-o5i~8OWk9jjx9y9-pKWm)!8pRc+Mz!@lUE}WV?(VL^0+izJ4h4!k#a)UPDHNAdCcf#U932ox<^tT^xe z{h#+kR#+=1+?#vmoY}Ky&Yq`1wQ1~0vxA)YUL_8$nGCAhktNghdgyi57yWwO<9>^u zFISFtLsgEeE&J?3jR56?O?IQgFslm}OWmIC`@cY7dAojV=Ivn>aV9YJU!cOGR^$Ty z2GVleY9Y>R;VGt_4$FPzvrUE>08I6Kh(Nf@k5W@G(7&`eq>WO6r>*os?*Hg?@jY@^ zkjn7`4r^cuaA-143BTwbUMGve+kyn$s})P#F7&%s=V})2Z_M+Y@evuU!fstmmlZJO z>@%;k(c!O3hLmT1CMq@!)~&?GnUW|QygI+^?)RzWUDvmMtIk+EP#L|b)tH7xqCHZ3 zB7kJpQVT8UzhKU7f(MX;WNLPQF~~X%9UlYXoEE^)1(@4y!?BL%CHP~ByaBRZ*-ur<*rN#SDt+6R+ zEuJJIi88pRt9?v+f>(G#DGwQ}P`qOQ$<@azHZLz6Q`nwUJd6t|D|2K<_dvDdcxW zCkY3>Vmxw=w@7%m9NUc;si>m%p)BGgzfC{@eGa~LEJM%<83}UYyeZ6#msh@>PbC~J zl|U19y@4cB7lP4H+gk-Z`LswNhQAV;-f=~|jl|3PLaZ9`d+NKwiXmpjHBC-G#JcW( zlle%4ilu!HA&YHZRClnCkrP6NK@_-_gQ$r_LoiQV;l?{pAH?5pQg6nh)?&M}rCS<( zBv_z5VKcu-*4q^!F2O0}pDn}cxkDfS_o70kt_=PCg4r)QJuC=p8tKz*qxFkbXQ2j5FO79-DkCu0s=+ zxX2vi6i5>@J&X=Fo`G>Cc4!ry$|}v8u`RNxoFNAs1zHba;phFb2;!R}LHu&n2a4)*Bn9Q)cPn-VFop4m- zH5kv@-J)w{)zc`XT?RWl|8Qn?vBv3&B9Btak<|*g1IZw2N&(c;S}wQN8gT0u-d#D4 zeovVgKQ#O``k@b)->Dh6R1y#+R#yXqEhV|n_1^(xd+zuuifh~_1a`hM))*p2kRwZ? z9VeWk(HOasGUV{&(f7jBOWc$`GI=B?%DNF54u5F_QuU)r=H#CW(Mkp0LRDCwwIn+pAm}|u8$mQOh`ams0;^9{8RP~lyJEzc8mUkO1(f3FFut|wRtWoY{(9+z^px-t?-UJ5 zY=}_C8@*@AHSB^(WPi@JxD0XAADBjy}>3yLxR!nHrb zZS=6VDE@TRdQ(4Y{ZMnHe_zsE#o#lKA>FALU8hUPL zk-4~azp$24Zv*Juws$K$<*&*eES`^b{;lwj&ctURn#$QL2Xi*b>XECcp* zSIwUW9WkVAiYsQhS(21qA}76Aqm=!Z3C&^f5nJ)8$b*W9Z4a}4EHGx|0eY|WVzL9j zrMNxHYfutEl0@{+v;xuZMr8<6aMXf_NJy{IM+r|6J4;KEZLZz-7G?AlgM_595KlS> z^45}cB8;rh)K)-n1nF`m;cyVDe2}l|4`*darYrVF{ju>)&jVPu&s{HniaAvnnr?wU zRJW0^I#w%Q40%@TbJ|E{S>|kM$uD1`Q(UTtAiVSQQ*V3JTsNu$k;aE5rr!3w)D`-P z>^VirI72heMd7^|2_3Xd9w}-buHRm_p@MmAIYDjHsN{lE08B{Rz($5oxuo2Hv z^yrx2m54t-(r4qlo_tOo8Ck&|TY?LO$@E#Gd!D`%Rcr@n-XZieSLp~Is&@oQjEJcb zUrq4DE5dBl2j~9ERiklAk#q25S=j_O^z9^Fy(A;q61LX_%}~84 z%F6g*C^vKR@0d%&-;|B?IIOU)F`s~h87l~~<7b9))QlMBDxy_)P3`WCGyvj9@bL4$ zVJWv-nWB$A30yG#Er1(lxVaDK?##Q}jgtyH&4B zwGw5N7~`T9;)*JAHvJ;%BXThrAaADSdeqv=c<%9zI_Wz`&EplD0-XHc%yg&}Lv2>Gq_ ze&;MJG1FLkxvMmd9>T(3g9Y66BT_&A&@z&+rEqJ+G~t_@1t9>o)G)0BeH#Nf^`v(_ zjS;WVnUQ3zOln`u_t6@mhUq^m)HxxZ)Qe-(L5Vd<@?n*|1>a}HhFX|7E%&yHcQI0I zgw8Rzh8ylvFSo;3)%qLPdlf_wFefnH2!@;;H;tPi67 zOu^BsPrF>xben~k4xniAO?4(yrxsoOplx7QlBENt!yPvuh+Y`FGp`e;O-zEZ(}9mM zMtFgrGZNz@Yplox#qBa3`+Id${k39qBsLei$YBwG0fJ1iEFv~pp;rzt!@kl_uVjj^ zC~J|7$>|PNBLgnG`0iI-eFjRz2)hTKO-V@;2Fdp)PK2j=6znEy&a?>nK_F*6 z6QU{V#G*#L!8kEjmelpBN|-FTdc{D&_!ijR5GQ#>K zeQpiV{Vxs}VPW0gV$i_+L^9$;m?H>W@cuJ$VYe_Q3QC^HC$gtw+7QOmRj8ha7Heg9 zq*9GeMT;h1O_MEDw9h@J|AW3`-`J@ZbCPF)a z$QGQ7IEP7M+S%l0*U6ir@%r&=j-?a1PL?HFCl0^_eCj4*IXlk#(gRjH^cSNX5V5I5 z!BG5wh$V1>_Pc-kG(rcTCZ)%qfp_MBX#x6zWv(shkGDOm(10FcAER2GRTtX%^e)EEqaCGU}F~g|2D3Co{Z#O@3TXL8{sj(+}$ZLwNHP0yd<2z`=$6t$6&v$cL z(76u3R(SRC?b^uaS=fg+Ye=Q#<(`9rKjR>ZFc;K-Y zs~M9`BZh42Lo9?=kE(xC*cA6K0P5+8TKYg=a7s6bWCLU$8OQ`nYPKOxcze|e0ptF zWrL#Tbnl-aN2RB@{+KA6wh0X!)G$-LekO=A~)g!MB%1`)=~ zpQ0(OczOz68psx@?bKtQRlr}lrB$?6cm=zNNK~{~<2QECqpd;h@KHrbYSu;s;k8Y~ z|CKdSp}4I`pc=o%B5(DTcw%LJ8(3#HkedFZiQVx93@QA4s2RLLxEN?4TUUip(NJJ& zEN763=IDLDm^VGOL1;4?2_VFTKLZc&Bs5VF4Ge|vyFixZO}8x4<;Y zVYfi{WaYq-B+ABw!^lsWN8B1?fPw{xovq%f&`F@NBE`MGwh!tn3WCE;!=2xX=rew8 zGH%?5h%$JKA^h)kP+*haNY*j68xuwvUiJ5%HFUSs>YjIk3wQ90!A-un0PSivCMVB~ zOQjiAtN~$9^o(l%Uttq(>nEUz2&_FU!-sT3-FJM717km1SXp??3ZP*pE6@)LZKeNQ zY&Q=-hZzV(E}PR$A01kp9-*nHPU_l zo@Go6j7c2KK_HpDnn;a5=Dp$Wj`S!&-U1PzOZB4460_zj#whb4$~J(-(+;0Z;*yG>G-< z2cM~b<|R2lFEH*yzKn~tgy?{qch~+TZ5fUkGGxdTn;7=YU_}R?)LWeKN|EqCt$n8{-DtRkr_i@lg>;#MBLG>M)DfbBT^JgL8x@uSNFW;z4Xl;`S#M4|99ooDsTkt@0qrd5 z>OulVV8?snVvcwD%U?~3wuO-Qj=ye?8tV1XcFqrdb%(z{A+!In@rJ{fdb^n zV$XhXsJ&vJ7Nl4wl&nayLeWaPft_?u5M6r?v7%B+%~@W+=X+5hdLthwV^ZC&F; zD7yR-iX9e^cm>S<6~pyKgSd}m3@4cQ2gFTLb=4!|6~5akK!_y3Z*TmyA1^R}X4)H25X?#6Cv8x$eBmASmo_k3!3LoQ?A!_)ev6C^KBdgDbl_<$DZ$G!NkW0U#(SF~K8o*Wp4P>F{)!V5*xsVhZ%w{YS;^6oD7AiM;WjcLw0OzMU64wPA z{ddQ?j$yJcr%hYt$0z=qfvJ5~FHHv)!P7-9buG&lvMz?w-+FxLtzps{){}1;K>QL( zgy?R)Xj$gq-2659hP~eWYol*0S8kZ;7w>F?!?c1fx~D#xU}*Whb9E3I1%g|$4JLUrxv*u z_NUv{?-w>Yzwu%SGYxjV3%QV864WH5h(MF4l=ya!%OP~;K)3obWCz#qQVcT&dk|uf z0D4=4kYp2-nh~8Lq+iT1SM7c0Sy_Y)Bo_?JITq7sM>^xj-puzlQP9YIy6rA>ha!@V z=J|}s9~e59OkyGkH0uv>s-`+$EF*eM7-OI!^6np1jeGma)SV4TJ`1Nw>2L5ZwIHH< z`_3)wz_Y!6fT9#1#5cUEM#?HULs5=F4NI0u9|@bEhx2L=LlSuvCjN!n{;_UQcdK!A zAtHFeo!d-a-6vz}dgx{Pjt6oh$bb1g$D$g%@unr_s&kX1;!VpQO7|Ej3WN@7FjWK@ zkUl`^p|-I68c zSD(KtFm1Vwk7KpM8f@8k3u3+E`kU~wB|YDoVmHr3=@(a{hG!cgjVTn47f)6!NLgS` zRMtd%NXNMG$Y*L{ZYsJIQGLf}cWe#Tif@&JZ05Yvw-xm+`GrY})ab1Yk+J>k{B}pr zJlqzNt0`@2?le%hi<4wXXQr=M>x1&6`*?lqLH!nK z2~1mNuIzq=$=pQgBIx+0TD2N;)|MjRT>Z?Ce@-JB8)w4)LV4r$^?D2ySmuA^PZ5u{ zi755sYMC@=y_P2-i8Xwzc;)`|^JG6{xMT%O=d6{~l_J#&%OGtAVGj z<)f7T1406nDRNh=CB*KcE^(T_B%$ByVo)dxioPaheh&xiR`e+SHTAXIqm`LGBzgNy zoFEUz5~5oG=eoGKqX?Y5n5opkS`&H&jnTlP4I*{&$vW6afc>kmr>(b zOt{4V%3WF&XxR@qe$&>wY`fs1BOWK%z2+-@X(h_#2tXkaA<~qW&{rG2F!WQo*f|Lw zePVA211QR7PvBteTW5~u*0)lQusgM%xE$pi=D>u?erMXchcBS`7PWVE(ADIBx&D(P ztNZi2328!(5R+4@<`E+_s83>V;kk>ey7hx;$(Y%?zW|YoI#7)oH~f? zEnM#0PJB3dlc^(!$n$i`-@<1^n{@?wc2vM(48VrLQO3&7IceX%VrCoN=&93q&51yqn?Q-Ym$q+SzVDn3w8c5qjJQ#J&zD(aM!!A zINv8b2hQBX-{8h^>JvkYn?$Oi;k=}s@eSb-7F`x1WHgKr^b5b|*`HKDFEe(uJz{e5 z26eCSGi0ISOEFUMy^5`#6d1&D_0=Z#=X}%1=qX=)s{mf{7tjbCCAlOAi=2r&W1gNx za;Nb{B$qsbsHG4SzF2T7M{(p?MhF~z7dq==6oEUo#<-R5Z?;>5^|02g@L@Dr4fs>< z?+f^@rV!rPAmPfQ=6bU+5}QC0Pw7LY7dg+RCngOSKqipwU|jDjL$wnttjj5aE32sb z1PY!W{uS%@6hp3>!m)YhX2AT9Zrj~heVA!tUM8)i*=Konyq52s2}#Z8WpBW9ZO>&9 zV!)`P0C~}RYBJsLRQG+3*p*jN9sT&7Ax4le(`MR%QE#XPGnjb59)+M?Rz-reoNKF! zrvVP=zA}+%2Q;r6HAoUnH_02LLO@#(b>|=R$r0=8~K3GouCPl8T}|_)wCVB zW3JOW^FF_Syc^Fo%P@&w4fO&a9^W;s8C&RLB*A=(5SeOOZ1?>jP||C!os65gp}dy5 zzE2>)++PidwdjLkAb+m%7g7uyO3lnPwD+lqA-P()IJ5O~)`IWllu-~4wjocyTJ$GY z`kz4NsOa8c<8VtfQg9*j5!WrW~=lRy{!&l|MreO7ovVlI}FQQsK(TF;4;uNOBBqWPPJ+LC=4luk? zB#{tiEK|y$;VKfLf#P}aiqWNQzW2E{Lv;)r2c^eh zAFNggb~JvE-#f3?urJa5Y-buFuy7=O2df%u1vy6wHaUs+u^Ay_v`LE;e1kdeHn|^~ z9E!>bFik9C8$|f6wrdsMo1;hPKU`%|K$~Xa1uRs6nr8VqsA8}d&{~CdalYHIfg&)@ zHmn)UG1c9M>TIjRHisLp@hE=8Yw*6UD2Xd_{XE>SfM#Sf70RI%q!yB7e8H;z2CDDj zfQTZ5)k>Qc_Lg=GA*?}<3oG8WK=?>|DHaJ(#N+N>crO;5fyrGNsp>|6;SPa!+5vr3 z_VAbFk`B<}Tlb4@cE=1xJZqr;MSx!rGhmQ}T@wiGB*zRK0rb<%kMd)gcCxhUxOqb2 zzIQ{<8BQA{K9k<$eRw<;l;d}3XF_qO*#fS2q<|{)tqw$EMi#FK6wsH8RT0N%M0-v3 zz3yK;=>S??KB6nmk?DtuI_S557<+tF?(4PQS1$|Re*?W_B7qeyo?U7LrWP>jvKm-l zmSwCgTJ$X#!Cp!xEMtpM_m*R@Y;R6~KS<8k#G$%SU#P)Hd z3>QTPCf3t3Vgr@4>?jy*o*NuB3;__az60AJ5UU>WsG_FbbniW|h@?ZH55?FrlEyNW zsb8g0%FU%OUo*%F{6@kDQGa^RuH0**<8RR8c-Zl%e$G=?{RpdOAn0`i~yXEsMi|Fj>axfvB8GdTKPSA#1n_>e4ixKkY z%Hhj0GH8rMa|dLkwgH>MOieItY3fTeCH6;+JdqsoPYvh!aRP2Uf*ei4r1ooO4tfsv zU4a3WllIE?e*2|w^2d|MT&3R86gqq7Y3Eg_Oe_5FTdRdh|M#Wa-2XrL!WcslfF7R3!%neL?PjU$GUOoe zhr$e(>6jkT57tNz^dXSC7hpNJGohBxdMCtNaTbFwvSkA@S}&EKEj*Mfdr>xL=pGMJ zP=vU*n5i+J%hT{ooYv@3ja#F-V@7Ae;vM9F(esL=3f#usU;FG%1oa4N5uTet#WN8I zqz@}jSg5A2tn+R`(_!{t%MvLu;7#kIx% zK9XGERxQiP5@g~;?nLN>g?k}#cc4h3CDH(P@OAsk6^u6d^0D|3KSOQ(h&$#D67LGm z*K1mRMNbWDN(FH4v62W$A_>zICn0={1Wtzd;D+_8$^=oCxkN9I;7R7RSX!KjSkzD< z%9M}1W>P3gdkr;gl1X^K6uCyuxOyKS4d=L@6?4kzDk|edTj6a*N6Km;{YtS$T>ae| za!W6q%w!Kp(fR0+e7f}~lPIAS_tdxqo;5FlW8I$uShhu6H}F@W4q@>H!k{&;5XpyK870hHS#RWsr)2#42 z^zLruBWq^GjcAF!bdMou4tqJ4p-yGFtstBJr!MCRS12Z^Oab-ogP*FO%M@aNCrjDa z_`v}3Tx=HgJ+f2<_~Yw#3hhO?j!3pvf*@D=Oj>I6uNZx_AABg|aLx3+RaH3v=rT}Z z-jy*gGAZI_CCal{9nZnvn8kruix1@7C|mEaFgZkH-*rr+qtcp6xK2UNiMlCMu#mHHjNQb3f%9wq|YoqkVL{i_48#oW^8|- zn2?YECJk;{LxUzp)E>3|$x-&kyTHDZ)V6WyhrV65lGbXzZb$5u=_V1Bhuy=%pOcM? z!4P7tt|P`%*l3e((+Ld+*_%{$B=Ipml2{ZdPWVoiv`814l=xvE&u06fllyKkC6U8n z;(}F8G1^TfZ-9=KFDdf3GU5>uY$B@zyK)i-MumQPkm%S}1r1`}XrZC18ZFWM6XFd< z48C8$=YF=x;S9uDcJ%+DT>=7(NlnEJ8R+0x6R`GbyZ%_QBzK^gBD>YDucdzqt8U*k1NS|A;&u&{Nb8oKs>z3H*vq`}-{DgPH zf%ojtMTGN(o~V7;gGi{Ij;w>y$>OxgKOwY#_XUbYU*-A<|1BDm&@Qy0OA%71{fz7o zv=uHq{Tq!G%rjd}Kd6gCXH$qKNr+NIk~Qe~r_*ZS_@l>_-{gC8Rq4t<&tIDZk{t>2Upf1TN@ z(XMjUq?CBhvKSn)`k;lBJgGr$9OYOsFr}2)f;@hPxs9B_B+Aj}+At0H^DT8*nQF2o z%j%)_Dw={hw>D-!AFSEDiYfW`##t@Xv4+XGv&<2M0i?sYu`c&1jM3M30P5p$9{$jVMZ++p=VR%5nh|BdI9XK{$V!>`5073!K5;!LdeY9kV*-$k^@3I-rsC?oOMk~E!-{08kt3+Vu6p*in@FC|3X ziXu!)=bL0$T=ld5eNSHgo`91#yL~{RMi{BcYC+^=@PgKJQ71{yb6S^jJxhlEjA1o% zv(-R;)0XkwMrBUsc_TbLdXjv-j=@RGr`er9PU*of3Yy<#HQH#%xifrplN8(VrOK%B zVr<({OyLLDRzrxHG0eUqMmlb?NV}SV{ocEoFIb=JZ;c5YQ4%Lk> zY+i5w$)#^&Sfy`P#0dAA{2SV{@WnnUO~D!8wCP3C4Z6R{h07A9*r}I!Ut}pmaxJ%kf)373!tJ9we<0 zkvpvizR#jO(YPWvL!XwaC!AZnMhr^o@jtK?9{yhc8d0Y3-}e8zUWpR zm-o$g=A>gg z?S;+WOe@VNz~-I)*i%z!18Bbd!37L&mVr3u!N!1bN(T;C^kN`Jdiznx!0)%(D?^m% z#^-0XFz*nbE|dE2i^!>d%$cv!;eB~od(OM)F!((Pw~WuPSuPxdh)_MDiWE#yoW(zI z&TlPlf6uU}W-g+*lTiBox%?}0LA%JhGT-;wF{j2{Qb9N17Q+&fkA#hJ^_9-Lkp8L~ z0~_e^?EJWuiOCq?AlbZEF))N$98ZQT?{$U8 zk1Nt{;-p~FlM>gJq@U!q$cNZ=K5vU6*!~(mN9tyjLIRN1N;*aaS%qo+Afy1#-qONK zMftI-k3pcZ-Z{bm&#ziVG}CuM(4d{+sgpj0y@-91;cxW{ZD;O0drL)?WjEQ%w&H23MT z&ogPw;&>%N757@iY^+Qq-%Q(|4%RwSEUFQ&)uiQ30v}D>l`c5OtsfoVF_J^=CmkR% zY>fV!Y{*qnwKHU<($#u+Bq$d3@71vWSJt;g8u3dNDw0+@PyoiX_Nzy*jdK9)d#wV zp{-!z1O%300yMeykY$_{lGj0CL)=Hu{PMozm(2*$x)rfL(YU8NKP!(cbC?1}Ev_0q zSK!T`Un!VJFp_TIo;MXocH2>b$vj8+;kI^2VBae1J44x-&%PaF|H~2rK{D z>f8vIG}mD^X4mH}+yyI|(5;I3Wt@_rQ}WHjeiw?|W)*R*G&Hfu&QxqMI^B7QIyGvn z?~%ThI8gO^TShH6S9NnJM9Ga)Pey#O0?o#jx8z)loX)Wjszx^ey!y1EZ4G1@^dBuc z_`|i_04dcYPAdO}$MuqxVvNOvq`+wRw+yV8V;c%cIT|wW*GGhzJ5x)Iv~9nnm!krK zq-7$KipK!;63((XRNP#)UKHR^-uT@Ts|Qg)jm7%*Nk6&teyfS&1I}qU!_Ku$pgKlP zjaf5XZ+ygXGDJs&9^f$(-MY*Ds980yu-VgU%_UX)hkhZOwkjb&yn5&=G%{r9C#F+i zfd?}zfo+>?AAC&``CXc3R90C!7}cyx43G@R;0czbnKMq##h51A-!QFy#wQTbdHbbm zHAW?kFT6l1+s#QqAj(ECHx)GcRBLm4ls6wl2%|=?;Xvn9<46Y9U}14 z_y-vfxA~8q1OBKeS@j+b&vxyYRu9K#CZ;;LI@6Ar2syEVb@WYU+)@-q7nGG&Z|4dF zd5_ZZHh*Lj;bYV(t1IYuJnenoXD)Kdo|jQKxCW-!t%(rd_1K8J89;4z0q_)zB zT}cEcDoW#l#!=bBm@1S@3C$pazz7-YVSQJ~d~NY5d|+taW&=~|ni>{0Da6!u7bSY9 z<*4jIgL7fsgHFrM+XTC&4xkY0!u*6%8)gLJujl(jlM!ev%*#8SG>v|7ImfFR%Urj9 z95o;Hl-8epD8?E)`den{7cKYP@x#`qz$&9Ksip7hVKctG^dQtmO7DA~6-ELQJ7b*9ZYRf_hx z2wiv!X%5WqE})$mqu%j(#&qC>3N#CRgT{t!piT9|i<~SE>O%*(w;G(4$o-0PFf12a z(hkx*rd};oGESytn2L1QlYeVsS|gwj%j-S|YNH;!LDEF5N+Vt)g*Zrv?LiRHyQ@-~ zOl@$`r823~`Y#TDm*qE}&i$sdRB`rOMX@GT*>?N_X zEzEO3;g|S;)tL|#n47Nd_p_-(;MvR)Kg{aHe#H6K2+E|&xK)9`n8An2#bDC4ytEL5 z_dB_}I81PxQp&>?vU$?3$2&iQ;sq%~i746wdG6asFwWYL&l~79ZqY2XsI8)Ix{SUS z)5#0J%LIa}lc7I1gkrBxG1*)N@K|}1dAZR#6?C5jH49YVK!z!)v*15YV>YLI^tP?{ zCA`s8pnyTQ!(GDN>qN%utCJ{YQ=i;AkYQX2my0ui8WT@OPwzUxW+WV}1ZNrQ8Go)m_oV|5rO z+V}93i!#)Nah=@?mBXKr#u{g`3 zdR&iM+{R9)#@sd;YZ(Pl+<-3iXbkpXeM66in&QQX&r0ZN`Q*WIiWTwU^qcy=HM12? z(G@r%9%j+q)oXw2OkYITJ6-FnU#K*F;_fml7?RlY^8~KQ*TaioKQ#{$R}|BGp1{~E zH~?CX-_*`{$!p389qzvl!c?be*b?ttU~%P6kj+^PJP^LrZ)&aZ8={rpf>eF9tddgL zRQNHm0=4H=pCjnALB^5MuLU@qHuT~Q?90b%@?&m6H%Xm-bnx+m?(coPA;F2m)%Q=X zs}Go+B(9r*19shgk*#@PCwi3&nD>bK=*x}!hFCROW(Y=Ni>g)?UXNRb4~?w>|D$MT zqGv0gG{T0UF2mblrftpL!aKQt_#3u3V4LfRZR2{pKI?tw^oYJdu@kVZ14A(wOc~AJ z-7kAm`Vq!Owg1!MzH%+>DMFhQWgT~nU7p#^YG65OR5K=w6}-=scO^3mG@@{BY9%k8 zl$-F-oOZ^-CMaYb`|lc3QB;0R2?-p|l_wR&HQ$J(?E32UOrR)YvZ_VJn7%iNgE9SX z(AfL#RG9aV_!ph!zkMpgCc7{0S)t$VSrUH#`U;j%SQDX1zwQn~52o zrFM@ICgb)>WiD5d#oSoLAsZ0K_OU~z4Bu4o3n+tsf~s*Yyzy`l^|>u!TL?>oq`qd_ znOPgGujR8MW|EV?XxDT)5Cc?1A}5>$7LJ4qrj2@J9`8e%9A36x=T@_wr%SWJQ|0#&f!7PE*0 z_1o?W9w}FrzH(b!Y>!xFDUCclsCPfS43zN?Uh?bsJkaX*=;lm&1C!z?JQlrv^{y#JrH1|2lw8yOoblpq;tL?fGX2 z3eQXfE4N#&H-g@BeIRBNwUQk5IHG@$6lI~5pq&8+QgVf0A_{mr$8Xx}1nK)&P0`Ge zNxpK|vo62C)gRgiy41O3WgRTtQ?c5nY)oZEBd%MpF6Pw`*=`=)!~@>51*uXZL}a~BY! z97RvNMpaERe{Z7-@2^K_pI4m2xHcZ!{rf=k-lFEGP9CAlT5xhfU{i)=cx=V0rOlm|);)$#Je5Va z`+~?LR1PC1;py)mxULdzz%6M~!J2punsU^)1+mdH6A00JAMnj02j(9Cl*)_Bf2PeB z_RwI$>h})N2heKA+-l7Yn+{Be+G@aBDwRN^;3?6VWG zUBy1cAeY3vkp$>p_TU;&Zmdnot=Xg1DNDG025<#~O(KdhKpi=S>UQOV!lQ0d$PTp? z*2XqzsleWcS%$ddG+e%<_2O^pM}s(e>0V-i-R!Ssyv0zWj3olstyd2+z6kTyectxLRo#Ro} z_0yz=19_amg6k72_cL}A=G@NEZ@B0cZM-WiY=n7Tk86yGUk`?`&xfQPpn47lH zLpi{k>23FJeSydh zy3aNNn33z@p8#s8*y4N*j2BQ<1(;^uAnD?&>rye%3(=oNZ6~s!rZ)@Q(r_{AM>WWl z64u3T$tglBcDwJ!jZsCtUO!cne@k>Fpv<+ z8j1!Qexj|L5PHRMOv+f~AmLd5(Aj@TUk0s$yB3NgCoz>WE2Z_hTx|5lqo@jGO*9eD z`3w?-_8ZHbOMWT{uuA3`dH*<(4$N4kCiEv}s&`usRF^C;FoUSePwVytZbr)LJ5!7G zn(cePQK>#x8>7qPbtu`7-aTMKcBU?W3QI3{b4{a!Qbyu{xAh$s0^UUarqE2nLYf+Y zmpKu^_}+H@p9p?Y*xiQt_3FzniA13ffOp9JkHZydu@AuX zz`=3jVb4JYRE(bu`eQ8_gwR@Po1qThG{V@0R||X7CU1|{uqTMB<~e}~l!$wkjV2wX z=!%(Q$7)fYnIC_~8<}deuyUE9J&f8);~aVX6|hQ(F=X2<*+%hya2{1H9^kepLqfwi ziu?~}pt`q9rI9ysMJ4Q&01IsY;dk@H{Y~db!jAhWhn>8CwOb(>b-zWA%aPtEBJN9R z55JQ(U;fau7k{n<0$Jkzxo?pUQ=D@@o;|v$-RL!^Et-($FxZfkrhZQ~>h2J!9QX4k zrt|D7)7hL0op(NJKE&a#lV`6iBlh;cZ$;R>jWRNe*>*k>Wq$(#mLGg7>M|#mk2|Mv z+E->7(A|OYt^ot-vpY@C?9Sj`!)Mok;|Hg|FelN90-vXV_FwYsJ7>>hn^ud17+=(V zZ_erN>V@YN@u3R+5pRlRQw#HOeBqd!y*-!A6g|*!z<~wdz*EHlW)(PU5mG`HaVO0; z_2q8q(zoWW?zkZ`ms~*|O;ygQzV*}^+Dk7-uor(@J&a}F_Q})#@XsRkovd`rZC%x( z5rTgUVo0`dk-Paajxw!=z@ihFCqd^Dk#-CloM9uR$JkDd6PR)G%E`1`ZPBH@+#ekb zmZ>$At*8kmFId~0Fa3@OReAh?tk4GdpXU0igSiGX8VlT`V zTYyPX!LCGRw`yIsQ85WVtC&d=!Io>@Zp^hP{6hOjID>Y~zEbqv1r?EJzQ*uyEn?TJ zJ4kW4KeRr;4`uMZPDy}MVwXf2VSt|`-5ynUXJrj-BV99o?fiQ2)dSrGXVw<0imo}y zrPGo34K1R&7`X{A(G3t7t&OLQWrD~RFr=#z?C5sT3M+8ZE_n06ja#J^vfn0AjphMV zvd4+%D$DkPAIf2H072CUnAU6)@?u9$XR~$hrrMtXuCE_1e=epqoC|2=7j-sld@c@~ z2TEH6uTN>m_x4}ZxVYp8q~F92uv!#FS~7|h#!|vh6Qkb2{gcI6(Ln?6}{q?ETm+3oh0s57_d9~>!F z4$~BeS4;JOzkHcxV5c<@Iun#ON^3Jhq@+C@M5AfKaT8wQxzJmeH8CUi|CJUEQIZ~$ zq^|T))3GG^OqQm#H7BbRFAmO?fAdcTsHQXzeO5;f%?X*IcX!Z=-T5?S>~Lm?(nx$j*jGhgK*;_0jh(ONuMsAz-QXI|}Y~-OGuM1Gd?Ft1TkZD4{DViG?&ULk>R7Cd zf5G%0=>yxdz`y^j;)*a`lQ(UFsu}cKWsP;_{-!5B5fA%K04l-a zhL?n@tuZ}}>{z~)Q+X%ND&V^p=8W2`7Tz~&pzckwxW`%w@`@Ioo&GIR*%=GDzW)rE zg;((+*&`g6f3iRe_k)MXz+WK`oKpZ#R-Tc*L;u;bnjBUM%S2HGOxpg*LI?!&6YG2O z&zhQ8wIa^nddllxFh_WajLq*`b#1`20zWFKs>gk|XQU-qa`M7nLVb4E0V?f?z6^CE zZPcnCfsn(6{$Lplq8v9|{?pjmX~DmnOcA;uO4D`YL}u!ssYO*QoF-H0rSq@Iv}!7& zXh#(5@fw!Go;bz3>QeiAO@_qUBaMv=kL!kt)o1U%j2SbH!X(&!w4M-c`?Z=3qax^j zs?)C$JJ{OCi#CgV+QO-C+OUM3NJVU3>}hgD+_aL;dj5no;b$4rrQWGtad1U)FH0gC z4HyS`DQBDK4hRZGj2!#k&Os_#&L-gAG%n2Yix9X4w>>P~q32j@6~goFYmAYAZN3eR;B)pSxmsZo#GX*YiHy3%zMigz8dups`co9mvZ5>_dHjZ@bf@SBCN&_yPe)W>pr zDBg}T55X*#XOYCgYt6%34a1vd$Dr8RFaM6Jj-UU8oL6iH)%0{ONAHlhQ~WauqCk!+ zXEKA+yZckmq_e}b@4-y-OURwqSR&k?5f>tE&^xp1xr7Wn!XPGB9(+oJT+$~L0t@># zZ|Ivek9v~w82fL6qN$E33GX&e2CwBxNLGw^u4yek#JDV4--UccsxRC z^@v25MsM}=W89NTsr*_cYvk_1cZw0R7UDW=gTVw-8;ggv2q^=;tIS&-B|8$#Xj84t z^wx&Y>j{Cs)*9 zv-gGUH2yAg)Nm~G$tShIGu!Ji=sX$h76mrb+#p|)_vH;Gh2_4CN@)`ai8h#DI=&|J zoJ3T_wo*U@9#mtgA)QHanO-`Aw`804Y~?dSSQ!MczSGm~kwVVkoB4LRk0aHFFSfO4 zH^FF~3_NJNuafr2yQ*0Ak7oL$k(N;V)~cz1zrCbFm3BtWr6yP(SSE0Mj-4{t;B5%J zt4aB>eWBN{0L!hh5eC|_t12*A`(E$o-rISSuhfq5GA#Ytv#CK92 zD#isz84o~u4!DUQ3@4IPEDbdOUk08blV6+COn&qC;y)ED<85!fr&z}i2TmuiIes|? z0-`QN=IW}C$)#jK4|#qu?Je7fpXn|bK|mXQ^HVB%bKljT;-5)Hs3bLMX>hfl0P)*j zJ3~Z6F+jg_rCPqJ|H;|qQ51keUcXj$H`f@V>xXTU5Wr)(#Hf7}#_%Nv|NC*7Dksij z3B28+kBX6ANMJez&)B@g_XKp{!YQIXeFhOPACiR|LoiOjav{drj>XzRfd?qocupu#q&zJU%V2PB-*=@g%8X_^Z5-q@#M&T zirSq+>G(+#!l9@S>Pr?CP>pA0)q*%$ri%Id7~M#d=}{v-RQ zg7iAFi_~eTe9V2t7hdKxzKRt831)C+4Si?*_7^3fmb?P#HJR^@r(gmhJ&&Ef;H$^# zM#tD=?%B6qQLR4IfY~E7zOS|1JeJXt(?+u4dNY-($xu6N$|MOW*WLT<(X_vUP1nXp zej{aeiq?PpZt<7pBV+jM$nFoE54z&PkBpx8bVkGu?9Anr-4u`Jo9cbVJDm6OjSL@W z*!5<#ec`k0wGJW4rl808*YXa`Vp(BRIMI{GEFW|Bex{GEx|gj~y=OrO-zC4gqE?c( z_tf4=9DKUor{;z2Sq3NK4`~hURR7oE54aTDXc$4(WDU>*5GvN9S-McsvUX=pLWxsRNY0zXAi|7KjK1xe0`hq zdWhqpanpkVvg?)E|26>S3tcW58?1X{-vd}YXb|>c+gI0Jf=83=x>Wdh8++1}8ndPY zJzg(N0Qo%@V_!LKb=eJ0;d5uO5m7ARi{Buyt}yn&g=(39R1L8}W;FC`^V?`LtF7dV zlDbQH6s*SO^$#tIJU?u}b^WVWtM;FOr1ElH#zC}NpMYd3iav{i5EypAY5DUxBJab8 zgkX1<05s`{$lgWMz69oGC0gv@R<5mU&@84mXT|Ixz#mGpV)SzWqGS<|c>X(vL(|$u)-qZtN`a3c$qgm$`_W$@4Y|Eyt211M-{-ensr`?5o4MV5` zYiV265V_|a5~34+RHRB!6k8*_%k3_)qmV@Jzm6H*ddw?ieJe*dv)D>iDh+iaksiVE z9ReNYEl07ClofARsI|0-NTyds|F@1|!SSf3cu5zFlX5BV(Ydy67(Lk0>|>@#z1x%p zE(iagM$!4P&`ZXP?U*xMCgzUINR$%!=Nu(WP!L9)Zp~b@3*J00HL(*Oe3m8C<&w%E{uIgzt}gFu8$$tU8~Db4)x3*x zlsAZnKgak&&++4(4=iqH!XDEs=`YI>VUJ_SEHgO?2kG;XCyr-7j)T{_bFb}|aG`S# zS`wqhB_eftPgV^NT$@@SHTUZ^q>O((KE2aCdwDOfue**HMnA(ud|*a>H1VVTaW2^&>^Q z0OAi*8K2=(*yv67mx6eA-myCx{T*(q8?k4x86PKii=UoV0{fer|1v_Q6xG4a`*XNv zq)XX@naNMDKSG6Glco?)W1TmW6GZa<$%rLtFcN96U|tH&^vC=T!!;j4y+MupjNLby z0Br6>yHiA9dbrnT|7I0tMZ{-Cj>is-QZTyv=PSL|&PyDqmNcJY#&jJ4GUM)} z|D6G)>>eV5^BIo6$|z1oHWVvNGofy!n$oU*+Dh->>Lcmrs)ozmIb0gUc8R**!_q5l z8AEsfiN8VhQHP3SYL&7LaF@+`Sm!bO&@1W6tO1Pj-|*t!zC7olj&HH)i`Mw$)IZy3 z-^Ry)@9_bdVvZc49Vf4}Z0kB--1$%n-4gX=@Y>Fara;vxO)Md6hZybw4sh_nW%iT)ffPsDwYA^U!u5W2%B>Le^aN) zbzpZY5MqeOD@2EsB+aCj=~kU|MV7}F`Kth_yW7jW9N7vEa z7VLn!*y_H+k0#7v49otw=8sn5#V9L;zhgmDPfy4EycJ-Mb)^^*E^t#!`eB|U;4&b# z1625TL13#FGbTM3vgSRcrBNJIWy~wC3-;(e}B%L7VKKD#> z*w&A8FyC{{_^udg13_bd)!xc-d!EKZg?~}E{vBAh-13k9IT|hn4Ut?Su&1uCtMS)| zbBATTV`GO>&p;kmG)tAp=Fp6#PQy&)D5?mfHEk0*V;GZh6^m3cb-t01J!^RV;Dk04 znP2J2Kovc}*8X=Sy}ppNyt+f}$_=XCD`wcq7czUT5}r}fJ23#jvPWq(OueB16`+$0 zlmv$*cj-$r9(vM*p=Nl2y7dm<)brdBfN&5_!Ix6eO z$?E`XtCSz3`GpZ`T;0%8hb`e(X{wK{buE(^-n4G2XT{Ky1#yl*op!daWuP;suiR zoUBv2NXo?-?4sIwUjR2jE=7J%YuJ_b&8QuOLVMl041;czQeSUrX;%ZXTK)Y+f{2!t zrV{X58AUh(4`2by+7~O1l8jfq!GDBv_K0QWTk4*p&T$p(2l3$+B~*AT2eS;7NfvQi zFiLeQ>vu?B7Zb*l3CW8p1NtfbL2-cH?1%ccVvmx?8wa`3UAA8#GJ!sB%4FyO+Pme? zV=wI&a4VzINF{kU3&f8CI;baHM zrDw8h zxwvu$K9qdaQ2S~NIyYW{B>09P`zrKa)hT8pEdATrlcuDN6CS$v8~^UG2ikNM1?!b^ zK2eW6w%WU{yC-i1IC0g}fJYp1>4d=~+2VlB2l|(4;L$+!-`d9D;1j3gyZN_?diNV@ z)xL7=ICG@^LJnj$eQvShSx_-;rp7IOEhfoG5k`#{mZQO1h#2PsPz;}S>@{ zBJ3BbU%i$*F^!WMKS3xg_e(geBDO-vtX(yJGDMNM<``DkTHj;HRjgbG{mC!>N-dE)P7-Y%~{NGV1t%eLlXMqJbRv$>gzLOuMb}CFnf@ljB9%UM zj(5j4G{Gl5$QzN2_z)NCR%*oc(QxM&Apiv3l>-71n`8NOR}LCeo;j7@Sxq`^AV2x! z$KOL_caE<-HGDok-1!Cwk?njAyi$w&7|Vc>6-~rX-ZuJdXQM&ZdXJa6vN@L1au8ID zqCewAjO90;hkm_r1qdU*YIl8eY@3QIz{9@s`;J&pP0=+)A99c7yk#Z-!0U;eRpRsV z+E>lN6Dnk#i*m7w!hGjP{Yp>ELxD!o6gh4Gysr#N4fSB~vv6d)WOd3U8(S(0?06|2 zq0*9#Wox-fqt!BrM}TEB>y6xZNFJ9DUZyZ=MtOt$L)iZlq<3kP9yYg0N3 zCZgymOA8tvm5*=nCM9@O0Uw~7#Q~gwBZFiAVWsVcU~W;xJz|50tp&CnCsd(X%c z89$!+yOegDY#X9?>P}y|==>mM*9?A;hF;?^ykSn#l(wZ-mF)%<_glx$>hdqA|0>OK zBh}IFL{H14z1Mt`UA~q2{*zjJ&K||3@>(SyUmw}sAKj48liho zO&9wR@v^kLq8W##QBPV135y@Y5!EIjLRMWFobLkcXs*O1Wraf3zL3{}-|Sp_b8)S` zWZH*M_LsX1neZ%0*ROyJ->-C{J1o$Ib}1x`B_v-Zo;FJ%{MCc*CQhmNWa*Sh_0()JoIHK9|9VU(qtu;)+_OPZZxzQs5VBRE&j8VJT7=un%5-ty6}al&Ggh z<_n)NbK=KBAV1Q25vbDsAq0wa%8E$4>3cUWv&1kxEs^CcktZ7i+p0a(yoTn~4}6+T}~r`{_H>uY+^8H5GfV65q&GIvb46Ezu{d@Yg<>t>>rwnEC-d7z+%%tT#ez4lf~QyW z-dxyd{?6nNCXrRY*Hi5i!`p#LtQ62?kPa|s;7XM-*Hwr|uqTy^&!o7Ar9^0j1W#L0 z$5+?beMhUCQbpF?70w>s6;cK{lRVgIe?Z;D^5Hoc?KD(Tq>P%(JN%hAcUKau?T0cm zmk&pQO8TsEA7%c|h)5e*S}0xrFi2FL8#GXNLZ34%+suJ`(FP`boZlDosyZff)wFu zs8dV>Z(@Jwb>jCi_YV)-Zs^R{&3rSzvUez#m{`6K=K@?_SM1)-{06S zD#8_ZBh6tsYa}DgbDX#yIY=<>zfzU1>*QEBAcd1beJy>TTs}qGL$GRdFMjHAfMN70 zvTf;m$qyF$b}h;`jld*6er`XZXu*(|nv3<6b`L07K07FoMGHvzN#Z3LKGGY*P3e-$@o+({Q08GXI>VN{*2e%sejI+UAa6@Q}U{i$P3^2 z#YK9`SKln25+_+heGP#ppq|))JAn#e7cs~y!3B%us2Dm3pyJvR%Bl6|MBBX_i!CYE zCZ!I}^R)DY!syj!dL=D&41a;S*iBf96?Yl>PhkT)apJ^Elz<8!dDmMFKx4LV-ijvc zx5S_Oo^jtBpdgH3$XtzbN<@T>@T~>(??_!Qj9RJ)zMeKqfh-$uR<67hV7HHFhdI z1CNJoR;!u60TBcF?7`c{>8bz`W}bRsjmyc)UdrdpTLVySm1t_)8W&c;lO>mYS940> zZywz;u&|9UT^~Vc##O6qw(!|76pP#+!Z#=dQTA2M3uc0h$qk96zqqaWIl%V2B7p!XG^pZcTg z(`ua;bMuQ*A&sR!zo2cX@~l5!Q3vmhgKwV20y}4U0Aw7WF0W42vL|4OxTRL4y4jt2 zjB$hb819&~CCBR=DYZMGB%1hxj1a&KlsV>Y96QPXJhB;YlnAH zLoABqe_;=W9GW}Hl*B9Rt4HNSwxfNM7_}`wlVns0#WZp+S6upa)MZ`on-15U+=r`R zFB~@hVa&X*YZhq)y?1q;(4+!l7E1LzkyE=u%n#b>g1f)DdAujhb}lQA))3?Vtwf*F zecBG!R&8C~JiAl7+@wa74$XIj8z^qzHGSD%LPBELi{|P#Mzh&06ssG6|6hr)5;>Nf ze%5h|p_zsQWpbwqP5yEcMS>TqFdY|-C`&>ydyHR%PXCK8^Nz5xnEBfXp831n6L0SZ z7k}XbYWpQyZ|?M!aXcBbsEBB(d2`Nti99quc7H!A;|Gu)_@~PJyfs+sH&O4J9F(U{ z`WNQX^zP(7F-ajAnxbtW4RvjgOBVhw?svtZFBOAPcrS>EEL^hnDqUvkEq*=$0_#LM zUkhUic7oRynyOwhX8x$A|FyW97W@24JP0Q4CA~x1Kjgo6oO4k8mPfHTJt3FjOy=tf z(xW}Vb($?>YHuM;{WOp1HXRC^pN{2OD($5&nB5rYiWpcOrllo?5*03q8XLohX9XiV zqT2AuXkXMTsr`IxZet>0xfgeXQnN@5C-e#FJzWzSBjb4YRP3W=m6q1>SFg|U*rXpL zywhETP6M5!RN%8cHXBUbJhpfv0qi5F?6@XASnuX)S!z@;{Gl^~{tvAb$2$ui#%HI# z&SFn1jF4PZZ$_TFyDQk`Tq-?14P6)dADB}oIxQX#d|zH9HhkGu-15*ST$s_xK}F0F zs(c7A(i&`H7FN9#SMrCKv6De?$*hp|!`E|?U-=t;jztQ`hL~X3wB*X_}bB$`aYq=mSW){-7L8`Xg4m=I1h1-^Ry z(n9CpV!CL3qX)y2?CDq8^5)nyy^@9NeB0a2>03LKk2#4O(S$ZU^R2<1es;?RoB5Y~ zu+j~tuyf$U2Caz0|Ff@-*v}@kIdc!q779Ro3rbs>8c%#WL$|c8-u$#<{R>|ImbfTm zl-xecTdtkxWbpB;3Q_lA#$9Tqy;TOJdh==1dSvc-Hz`GBY$7=U0sK=eC||OIDfiQX z(Gt8G-_IOTOjg!{_iCf#%vdOb94qxL6V0<1Zq%9)IO1*&(pz_JX9cMI?5~9nhp=}6 zE(Apr_Dv*z1pxqP8Q-1p;*zOPqtT}L36Q1enZ^AVVSB`}v2oAxv%pb*6b#$-tR9`e zgkI(J$jX(ayW3Sa+*j#JKYF7J?Kbka<=Y6ioiDcJt4(oBOgCkwstT(c9yNOzjXamR zl}Gbs@gib-9Y3v_NvZ&Oc`X}1MBMWErvC>AiyavAr(Q0(eoTf`&g+w&sC*v&Rbi z7!~%XVWQotKyu*IDr}L8KKGV5T}ipcW@CE$jPE%iB$*~9Qo`dorPp>Aq&Q>+E zAtNGpk^P0My#tfu(GnuE=dA_N?NSihT#+_KINw7enV~I#J>#zH#iK^MfU630F0;q_ zDx+>@H_~ofisGC$*$j^jtf>uYEurpYCSS^HnDv*$)0X-Hn8owL354X&hp0zq-^Or? zo0jx}8dTY+1e0ToYypnz@vPNEndaH?9F;Wgg&*1-du+bMa=x1@1$2C`V(>1zzfoNO z^v38rJj6hKKGHa22xn^eqJXs*9v(rs0)`I%YsZu>&_hm_S3_yE3+=iNH>x3m86+dJ z|Np1^IPPR)Nbm>MPMi3k4bMz``&-b!3DRzG6=^r#mWwKX9e?M_NPIoU7Do>8Aq1xo}$d&+GWRJr9a|Od! z=cpV-;R4b^o6+y*Zo#3YIbecjQS+PC)jlf&+jNVa9OqG@QT3qOW~Z)c3(cp;{mv28 zXLoRVC#)k(;y8JiSJz&=bA8u{k=geh&pRjG@+(EmFbHB|CSO(5Epi%<0_IcnY)jJW zk@7f=Z_*0q#y#n@DNzf9@3$$YI%CF`o=75Rq`kS4iIWqb)6J++m&b??ei6`U#Z-B{ zkELt)ft<>U2)6VZ?Ne)(L#mIj$l z-UWsn+f*EUp`@mFg<@WazUk@hjVmyWbUYA2e8HgDf`1J>tHnyC01_YyLb@;AZp%Z3 zzGmsv{+UA6S~z9e&4U=Ym^(BV3AG z-Jj9p&ymygg!OubeBupBY*5em_YnQ>8V-0Pe~p`uXLKvoGhhR_1X2WKK>mI`Z+4MH z-gakbP%IBMW_NI~PMrv`;syF16!0dDAxN*SkQ3PAE!d?0m!hQ zzhs_vr>&JIfnWCjmAKjL@E@SA>N!W6@VO*(sP9`TeH=L*TP(qZ<`j&Z7k+5d;{)=6 zHxd(lvHb=VMy2B=Le)`S+(;Lohh2|i)v;Yhf*$~I2nmyr_Rb4YLNM>A&6A7^qrV4o zA5v4HDq`QXVZuS|Y z^xyMO=wGT!+luUG>x2q&$HH}8$9`y=&;KS+nPr$fofQdQa2HDRn`%h-hr)@dvQFUw zv?v=Ym=|-%bNziJQD>=mKR2dvCC#~xX&5tQt;zi3q!4q2u0J@w5!o))LFSWGhRSEE ze*e<|2(|lskAZ3;$62iX>>f|dmkah)bT>vV!hxUMD+I_yQq^(9 z#|NAob856+v38j@**8pYqFEl(4(m~N(@k2LA&{t(!sCWFGxc z1Pz}M7FQnKa^k~M0D`-QrM=b_OJ1n|eTZYU2d+-yQH3pzGgm0JJW4Spaa7upNesm#C zWq(5E3qAehEARg~<4|AoX!a6u31W8)>ozA@5W`UD^?xT%Dy;peg*w7IDyWwoZ$J#a zuAyq}x{-YT%6)sig$DNJFkbkTgtx?1r7jbgz=qp%3nw9+BBdG=S+Azfn8=2wFY zEUB5kKPjPRwn);W#kqL8(|F0B*`jnEf8>#J z4&7ew2l^@RHrPw`)n2WmRUdEUJLQC2HpoL-I5JRv9 z;+tiUQ@Z1Sl-sb|;Mn4l85V$3XR6N1?~JLLzA2qfrlht`kOq$pHwQUk5RvPq7!?Jw z@Fx4EW}>ctxO@b{ghhe*4biRu|N5v4PB|%#BRR|pX_whUbeTK_g32G;Ss=JdHeBz= zOX*(9N>v0#81aN%ec`GcH6y&|DVrANWh8!o?2BRtoAFxtm)*&_jVv3rjJySg%&pB` zxMW4s9f64OpMR5Wn40ZtUc{>B`^MeO!U!_D$mlUXCS#bf@rwjKt2DVaK0f}y@_L)u zXVGZx+U)n%#b13@b}wBSTwzK*N@DXqpd=clBz} zU;eBd3`}29$tv<{-Q`SN7#L?LzV;{Y&E4jE`^=b}>k2#+Vw_=ak3na0#Rt}vnpua_ z5ucHg_BvXSPAg6ez7KF=ndIyFi9P#N%xlUhz>Y_QRtflig*Rc$q=Q``EJk6r{B0SZ zL*tA0m>da1ya;r&7X%#&$q1ChhM2iiIZ`@?wD>2oM#$qW7i(dq(j2)K;JAbpRitoB zyJd*L`-3I1)cIqTtjQnVk#7y$s{SGz!F91y>*i)rbZz7?;Ah#-mkaR3QPbD@!$%~` z0D3BWSuh0xGI4^dNn7zBCdBWt$L*bVF#@(u{%{b1<*Rx78aYFWK^U+PCpMo7AOp4J> zW;h04#zWKzC!fK^L*G<%7;Yp0Qr8O^T;5P9N(+X(%gh*E#Bb)*GaulOT#{(a1Qie> zFMWYIok|Bg%~1}*K2`l|9pG{YIgpbxV0P*9JklMr;BUjQhs~lN#2jNzrH!!THQ45S z_~RgjL^5v(<=i=XE_c0sn0oHmsKe+X^O-1e0-@|Y?jT<5$8CbQ&lFPKXtHJNF-966 z1u8f$U+BM72)l>=bPHWuvO4e1rjx9Zv%$Udaq8o2@)UIoz0g=Qx8#W3$e9!FyZooE zs$kZIB3r+nf3vF%w5)xSfkS8cAoOV)*{My?I2_O1$Z#g?w15r7MfevKggh6`7&eb zy_*||*+qF){}*)$;z1`KIQN}sV=`g$anuIQvqGLIp$o0=_Gw|EU5b^IVHKw`>4sKC zX7E`|r9AeJ(K`Ryv|#f!o@`nj;;vpA^-F)p(5y1YCofSE25&@x5)R5ILY2;-fyeJO zlapVb?XGjmH1Rt!4~h6i88+FyuEm zLW#6x+Mk0pN@I^!O#Mc&w)|R(O$5e4@J%LZe>(nbL4fMg$_(zy-@0{N>TvepILBeh z;Z@3n07I@O`IIaC87PmT{O=T%#p?-4zX%5U%nTQ~2B@`teEzl7G>0N%Xrxd3oSn@{ z-j44iCZ={lM&VYy-FSBbY@C_Ai<#hTR=w5m^0?&-S`}3v(;kKw=KiI>&7YUR#3J1# zt?P*pC)>8J_T@CjKg_EMb|K7%lcED07t)n*O}JD}A@D1G>2)fGwKtND#^2LzCl8r` z`dTOy?GSKS*u!?>*GkizZT}E1t07Ky&#+0u%oY=4;7q1Khpf0?DWJv8*~;?lSDL5M z%hZG?i_mWn-LQALoI`qEkC+x5;j?N)Q@-%6r7g%}uuU87I<0+qdt6@@XpZU6x48He z9XeWz+I^^tqw!em7N5(g81QceHYmYWs66_SlAHmQk^88Ng%_{itx#Jk-k6~@nm=@a zZ`=cl?EAtjFb@(bB>y9tl4pxDCFvb$wXMroA!Y80=z`Xujp^-KJZ3hk z-At$7Zas=*p~qbs=c*mvIe1iRZ8F`QflhUr5}_i@`M0L5PRX9Wo)1b51~Xq!3h*yx zIIT-Au8GQpvLg@ftP@I&&)*!QH1*+VCi{gjr2WdWmA8;YiAyQ>X?<{Z#aDRC9PBcC-0!u_ zBG`Ra(pbnQs>@5p@d)J>yIA-jZ3=6W~)Zd8xM=+(-5V|TUXKqN6HfWxO_lHbQ zzE*^3g7?yx@BN|q$M^5xlYDMY?;9_wrkxEsgOHvbzt!?D!~Kcufxqi@uz@X@-x zyM`lYzmIL{J~X|MqkFbParxq2_45GU=9k5_fY?Pj(1`BWRmravq0Og?^i7ocs-`0! zqArObi<5$oc0HO$ff3(KppE2V&vum{)0cW?s!x&3Xgy5>oZnuVpj(1v0T<6&%Z3r= ze~S-ZHDd&Y)vt@`H^hr}YPfxGNXQShPx>J9APbFE0zYN0QQ#$s8 zBzsd=Vb6aq&iy9!*iG(q-0h#RAIrya#rT?NM&J*oNlKbx)01&N1yN2=`K}{J~kRp zO`3z7*henaU*XVJ1rT(n~9{BB7d*-zT_k_ z0!1d12i>MPYf3*XdS~AD=j)_$6wIV00}r0T1t%9p#R@G}xI~um3+6J3sD9M{g2{_|nvWs%#wor24#?E01A3z^NtQ>u|q#*NQCmY3y!4Z%Jn{oYg!%4{6M-la! zt!VF{|3HvwY=bfEF*NhVnwAP7Fs930oNnNUpM{V z{(mp(q-@jb$IZzz=I6_X5{Xb4lkYH<=mtM8=GZvi1^HdK-}TLkK?)hX&-pMT+2-$d zReK-pB5J!Bubx|oot&2Vt}jl-l&(Ex^!z_)I;gR@PqJ31YiM`jt->&&ji-<7OEYii9}sX(|F=4?rp&d?6U_`+mhT;iQJ@^JzD(5M<_8OX=s(jdb6nJOb7475cX8tjPx{)y z@ghvKtJUv(Y_n9rjqk#_#lE4VIW)N?BnSG3qdWfm)U$AO^78c=_v`3(&EA%RJyyhP zNM7EksCKMdU+g4sVxRvJ+AL=M&ODc7@=`Q=zwzlQ)+O|**lqZK*LuIx+cw53mfc5= zjD)geQ;t_X(+(V}-zc}5xA2x7AAt#yOCs5S@XaznrB|o2#Q+PC$#W{@CZQ47ev%IR zJVLZ+MxOwsU$MeTz*orNYO)2H4*zRx(v?W|CR$Wkt;yge$Wef``6i1;ZCe%P~~G?TL@-A!7CQ$o^TUUL>`1lXhN{<^V7t2 z7&Ef5O-Vs0jBsU<-R87Ie+;0UmrxlSmv#KEqhu|0b-^dyJmfKNUq7eDWZ@kt6l9m; z6BY=ne#;iviZSe&*hfky1R36VYaXd;NcYDrv+g2UX^P@`_uYZsw~eJrU}XR5%d=+C z-!oiPsUr&<+D_weu_DnN)Jvk!c0193=V)ef_@SAa=`F3uSs8sTZ!l9RB&2%MU}E2U=rtx9zQ27YetVIes@&_kVdU&RbE@ zWijdFsDdffuj|h*<8sFYTzEK3-8JLze_VwT5YlNc-e)AedqVc?>C{UQT|R0ctXZxJ z|2E8m>_f0U#Lzd_R=aN!i&7;-E6e^girqL!H?Iu854yETMVa0b4J%K|MJast;m*!O zM@e?gn6U;cQVH;Ku6EPmkZ(2oH|3{=NW>P0@gPMqLW4MQxb|5KYI_8J-%t)yasGmJ zFze!m{`h@8(YWOt%;EhXF9A_8>STa#aeMeuZV|Eavkw!+w*edfDiT>er9Ji`aeO&p zbIpcY{#EAy*AOVPW(czl7XmNDKL-5d!Xd3Lbn~id-8(L;qtMC(00i*Ywo4E)_14W1 zgns9UkChbqoJ*raf~|w>?;F$en- z_6$gO`{&W}R|$$*;?hO^O4UIvJ854W|B68mhmETZx7z04inGMteEcy@X{!PTICvg+e0eZR$th)NW1{z7J;af4xSEuyXAF&seshi}4RhTLYm{7k1 z_Q;(;atZWvy+Xsb$xkRB=#6aCmef=7XYhDFecz}{#O(JvCH{ArHw#jVz=|j4Fq>VO zE!7D4U6xj!M|ey`A4O@-Xd*Pu=|~i_h(r1T^GV{j+}gsKN^;aHtKxwKNy4f1&ny#} z`xe1t&2P(#cin^lC&CZW9)4hFO%n`p>&Y3M!Wc1ea>?aOWfa#dYjYx{9PGLD${%Cx zK`tIB4o<1g_J$05@DrMTLT(P$?fPy@SSRu#dVRvo?WIYth(_9(`aRR1Mg6s9;E|cC=7yMVP;9QAGo;GtU6QT%h5yGu)Va ze)HwD{}ltin@U?jTZLN}5v3e{+RHMoFZoM28G8$<1nHTmT}(^nh`qrmjfa;FkS9WO z6r&%`W4D9}BCK~_Oq~5{XNIFgb}zWf^0Gm(tRHy%fXG0UqAZtDu3gy^YFEI+7H*Jg z3^!<_|H%1a`i+*>LeU!R3BJKfHeM=2Xp3E_v>5XS&i6q4=(|+|_{8UBAtrWY@;6m% z{G`Zf@i$$r#I6ucBevlDcTb)<;7KJ5K*@PF+{mcUJ{|F#$^}L$oXZn9F4JWE=EJ3t zv{hRpaZGmd#RpF~@NlKh#>3^E_S@d?)T50hr=LWhhTJVJaWp;D zH0UQ-@BJP0Z{rW10cOM(! za!zg&v@H!`6w;J-{|66P;xJ*M9K=es5Xlvbt!amlXyhacXsy_NG(%|3t;4kd?ZjqI%t|_2KFlHB zkXL^ek#Be_&|kuOAgeI^1#KdkXdRROni4@v1->=MA2#1UnK};Xj#<8b*DqjFiW9Z* z%Fms-&P7Wbhx{P~9CaWc#7CPdW9&}FD(vR-dBj~6%`8j!o7E)#rIY?g71P|In3&a* z_la#NGFF4Gn+}{C(%wp~_aE+m<%|H~#yfv?9RH3iaIoIK>Fq%S7ECMPx2|V|`56rU z${dq@&b**ALJ1*^Lxwu1iaj|yP2(rH=On-LEX9+&UVCuE!F}@dAa_u=@wWp>PkKjC zp(&+pUA+`vW%Oy$L6;F)@bvzi^p*hm6PK=il*wodx^d%u|3VggwtWgd&x?w}cEHgf z)qnM0MFQG5rPEke;~;iK0%A!%0^X1tJ5-2|F<38uCZ-i(v0U!hpaPtsIEU$wg3-pK zqgERMf@^otZ|`B$)(q{Ih=Wu*U&kr|n{MP4^aw~BYbJQid z#||1g*jPR+qAKdn5rpt*E;Tz*MgydJ zK{k+nXtKPjj8 zi&OX5sYcf_3|NY`HNc2z@E6P3WF0Gga)Un;rWf7BUa9vQ~I^R z_vi(WM=vbsa2mUZ8R6}bUrkgH$P= zWuU~n4I)Sa(_e>3fR556`K?~7Q z$K0Y51lZ7swcSCkG?`@g9}gIk@AA6P`IL z0zWB9H(AT)?^QW=ml|E!wO`HHkN4F^DqPBNv)_NpeJmj=z7zDs-f@pl%wdwlxAajO$m`Df4uEm%PlN~7Na@dN56@HSN4xm zt%plQ6`;e64#SVEH{y@$F$(H-IT0oXG6wiR8}(xl7~3`R=9l{yJJ09@(~4dr-bg4D z|0d+nVT#H?4p#D^4NZjDa%<2wD*iV}LQm--y%=d_Q!*5bDfiQRfGUqQw;N&t>O=9Q z!i%$UEnuyO^2^b1=Xu9hcIh+5|E? z-6q-fqf>hak@|*`Rhl}e&27^BHeO!w$|~?On8~n75>_V`Ot@c0RVZchd^r^7oDN53yAhm4`E1Lkd=xiU6DS+qIcIZSFn8R}zoe~-Dq5)Dq5;JQZ) zJ5mn*2JQy1wn94QfWC|xcyb8dEPjG)F=U5;rX>1BGX4%;H^o1gM|o5SJ5V)H(iJtaoW zc0vy}!w*J|kA0%_I2dn}Ie_QNf=c-lY;f+5!8gP^59#tUNDAXi30V_Hu{jPG~G{g;kh;d(Tmq#DzjOsYCUX(Tl(gRF@GUU>@{ z+bQ9zuLlo|<#nB=qqE! zb~mEecnZFQiX+u_ay3-N@Xd>!1_zioGK?d9o@hTCrFYT-prp$77U7ld1IhGC5%>+D zBG&Np@;?NG3H&O5?@5@;Pt**2tTS_wp@H`g=K=>w+k0z6_t*UlJ?RbqRX)bAJSJxt zj{1d3QfKD6I3hxHT2H>*!<7|e5Uh!vdnq9=9;UUBAo03!k7KkUtf@~e84;}fz}E+T zU}GuHiGaqw+!ucdUy}V<2YXg-W|c4{<0TuH@SL^-$3_JlsF1T}pT18E(~5dj3j>Nh z5R^uY{@j;O1DmgWUpi&YhZ5${yCa5&hEeR3_TQ&@XVI3@vQmbAT33s80s3d3Nw;! zX|qEqPRUlykU<1$^Rx^mvue4afBr(m`#QzYltI?YhsUI>fK4E_Qj1L*m6=vcgXdS5 zj6L5!_q$K(lThls;VpL;IwEdxNB5V)p%62ceS@P4GkVPz8}x;m+JPPhe1+cLbg-(%EW6Q(fM*@7ZR;P=irp!1p$I<`SlbHSbnM#Rn~vn4P_to={P+C81Kk zFp}JqKanGH*s`{fB6~OE(N)fA?SK?oo+QEu6NU>u=xMj<`Y|fGmK*N09}hZYG~ACn z-_iSwPOKIpG9^ZjdGoyZhOTqX3>3n77mN?(npq(jq{wy9y zWT?;>YA;!C!Q9<6i_qq>fx4d03PVnSVrdPFhtZ9hyA z^zmC4kiyH3_T>=qpMM3eW>+}fzkcmx=g2bjCA}QJGfEDq$3y#%c6PZ@#=azgIm~(F zGvQA#fX`{iV4HkGPqdJwDi9n=o_I?PQERmDGtDEM^=cd6{Bcu5z66F0_n3w1feS`q8Y5tkyKsNd7 zWGHG=Oy89%>}YcAGwdG0H#U%x?3I>;H~>9H4l4E^d}1d*t-@dFkS{KZSOgR3Y_ZSq z2-u8=WFcs2KQme!@a88%Zy(eUTv~;?x1?O>%R0D-kWcmC^Vv9P6yEd`=c^h{<}mg` zIBH1``9;_2bul#l{o!%3C&LYYP>TTVS(opDy>mx^W3xd3Ls!g&(dLh?7c#-GRLkec zWB%YCuMGS*OpP=Lsbla1oqCUCchfN!%)3l?)Ap;@ROR>u6*)ajJKV}DIeM3icv+Kh zPpQ6Ve1MJr$TAVtqi_gA%g?ir&O*@j{NA%T;w6cGn;OW?ZZtstmw*B{05q^xe$ha# zdKnz!mB}#z6lVTR==U?%a5kTo5EAV#QvYMa^Xo_f_x@R8P+??g({e|`Weo|Qg=k<` z4BCM)RE?MF2PjhwnFwK|=L>QO-oC%fa-8LWNEos{F{LzO8s-wf#d$han38ZPl784b zc$K}Xdf_kDpL`iuheCF`*{|%Yh&-NkDXPVfj+z0K)WuAzj{SvaW%DL^)?2GFT>ii6 ztIl}xVD+X7e+cJ>3ZZ`#;1A%8@rg^2AAtZ}Rq|MtsrQujj?YxrpENU~RHQ#|a%o0@ z1m^m>^ZmxJp)4@*r9YS>e>E;JGL7xFC>d?^d(*GTex`C@e-%FUu-dT=SKLLQp4xs` zQ*8+GZ(Nv5f{i9T;|nAwg^%US_l}Bg^6j zTA|h$z78Zv492la4C1O8yCC9Q2fPh)wBrwP_L=5+1Vx*)6Nvl6ghvc~6UNA zJ6{23qrC(5cM7BlJ8zqTA7fw7S#w@(dNHuR&m^T{Ae43jrvTZymAv*hr%`hlV4QRm z3?ko?Gf*9l>a0B5G8A~MBt=VSUc~!v6bQz30Yk3=V|qEHo^i!gbKT_>%xfC|A?qGK zt8tqYZcRV=n#&$wdRQu#f3q%aOIXbjDq)D4Wb|xeg}Uy6E%t|6sJy0b)%bKcg+A)a z!pi{_p4qOqHIz5xc{*f_ZfJ!80&vwVBhNYeH#~Mm`y$7kdZ@82i@e*=U`!V?g3L6QI!V=dOq!^YrE(p84u1$P3(i@k?&}5ovjq)a* z$Bk@>TMLw2BXCy<8frD#q_;VaArstP+&%3;Hy`F{LP2-NiqJS}T)(iNU(cAH@&!8R z7r4tycM-PU&|ZX=Y;m%ql5*BJ3zvoe0-y*f$c88}M(hPrDLL!Nl$|QDLnWIxxckh# zH&(v7wQJp+zR;RX{ewy)dS}n2+i~3?G#twfKYTBH!DqXx6j0-c;TX83z~y7F5V)@B ziJIZ6fo*=dhdnvPhLH31gkG!-x7^RS+a0xaCcf?v7!F}qs|F6=q4pGb zF%@?~K&$mO`Uo|5Xf3dU_oSZUa?kM0n$P<3OGAfK{;z&ChsJ^gVqV6^Wb=yD5PebM>b+MmO_vJ(_>N(|(8Cz}1{ zqJCX1`6e0P^<|ukO*kWO_m2kKy299G6S5$_0l2Y_8oZ<@1MX(bz{+PVl}lr#ks}-# z#2M>=E+T$=o(|0FCD|7gB;cr!?haE#B^X+t($2;a6GC^r{Qd)Q=uq$Msu^61_bEcf z=3+x)!%Lnt2InwZzt)#)wPIzMn`ZQ zk91$L^0Y@xyXaaKPWk}#{}8x`EBK?kW`xWO8wH16p0CnzPWmiu-c$*P)NYXEiUle` zSLh?0lwTa;mD%8}zgN#p%klT<|6$2qD!$>Euikxd6o1QzSn2~{ZeG_5+Hr=nM+Uf1 zxg~ZiouxMQW$V%?-?7(Ph@)3pxf>CohP(<4-u&DxbD0ypjdI+6$S zP%9!c`u(fqtAX0yr#Kox&t)W|+kN-VO}GezdeeSToP2Zdi+l|k54Eh&ySx~ulC_D) z!1p}mWr1;%w=sX*87k=83&5b*w4}n#cot)X z8sdz4%F8*U#V`bUB0daUHTg4Hfv*1Ns0hs-DPMPW26K^OVw;@eu7@n!HNi4Yfr(5| zjE`_s7FN2{me`CU#5a~RLe5HMkoQB)_m+cEB+xE64UaJ&=5O%>^Pq4=;k3Cw8B@Yc@TMUKoRllpu73wdMEkJAI_YyT8e`_#Sl`7+Xf z?Ee}>Xxo&#o7`2g35hO*J@G8gJ2BWC0iMKgD#L_$qPmy7LX~Fp0jjd>Q19<5XRL#;}`v)WMV%2`|Pn7C-o+?7TKg=MMGN-|B*2h2~c%6 zB^%iIjOtBM3cH=;3)IKj z=#gEtp+BN|x1c>Fs1@8446y9Fj;*j?_T@xk17|PxO_BUB$cQgn^U_~R;}9)q&K*ap_DCH1LaHI%Apj&S>z`3L+u>M z3z3VWgW<}kO@$}drVtzc4}S2h(>50+DX<8>kJ9XLg0_S;r504p!FyZ_)5+nYhp>08 zXR|1a=U*BCoYpopD3@3E&w=W&HyEwxj5(hHqg;T~UVgLB$MG6+Awxq3KDjo*xIMs| z!GKXzj~_kh7Xry`Z~X5!6I8-LA45~htm|!k45t!T9)yHEw;EYRdKb2rEh@^S{tHJ$ z%pHwb*Sx8=%H~uNwlB_23f4^zFJb!bn?;^H)*SeXe1gkjt|Ib=lz^B^FtqIn6Eyr) zTpZk0=BC}H2|2s==Z0~fuS@|@$7XSr#J$%c?S}OinRPvQLW5Q-F{eDojo6!m6m2hF zrCj`u#tt&L`qRi?9iIr?Rf3a#0ILd-LSO!1@6=zr5bY>mfxXV zf|N=BgoGB0lqY&>%q2}w2Ggm77+-+kdUkzwLUtP#Br-AKUkI7oN3Q~^NUKfcrs?xQtq zCk5LUO#VkIcd*r)UBT$vSoGrOowiV|xMVa9lSQVuG@)oByot=K3sc76!oF+!xJSXD zxg9lcon&6uSlj8>^Nr=QdcbYBO%gjbJr;ZqE6LKaT?<2^4*hA`p8`%RCzY2jGPAa} zelO~B4{f~tcKjkz?QwsG9x4@qEG|!lgVqOk6&jL&i%kbD)#LAsr!8vE6fQ2#0k=21 zF=Nz^6grYJ4lhw(?BF8dmvb4TAgA_oMm`4pH=0Te3egzy#Fzv@lsF|ORnye{Yw%&f zy+?s&EBVG~0)LHtLEt~{dlCPOn;?tTPuBDZvzE*@!eVaOCZC{!BETmUn0OE)SkJ_(d zv;e~N58jy&^Lhk}gZQFUfakI;hYeA}#CPLNz{o0(*LAsJ#31FjiO0=f{UD1LNp-w1 zPBL&wz2H=RQj0pm9AiufVcwaBgO{C(aDU=(6({tUra?<;%?3<+U^5m{2Zi?DCapa@ z&W?XOnML47BW&d3*Tx98Dnw+iKcZxE*K2Ng<4kfD#;Xhy+Ey(SxC+BzaxSFfZradk z`vqiBq@}%;3GESUdK8#WBHqxNbf}CxkKbez4NudoG+AhiKa$emV-rE6#tPjXtM_G7 zc;in!X*%N_Bee<1KMg`#w{)&L$k33}_)_ZGkiY@C*Tn1fq)FhA&;On%=_k!1u+kw% zEGn*=dZ$+`OrcTmW?ITOKw>5V3H?vsMB$Mr359|ugBjmNAsk~+DKz?LJqr@DbOUF~ z76oEDM5FJ4arXx&oJBD=N+xSC62iS)8XnjTgZk5V&sILl!>RO_tCF26l68$ZRYrTz+u;WP`+3sX`>`)DOAUaiCuh?ho3+s86x z4OR3_nfcAp5u%FBYZm_a3P(;%-nj8t>F59an>De2ssefoq@}C?`IP(Fs|Dv0mY%!p z4uGhB=HVW|N8hdGuXJFSs~{Lw)Ts;l%Q92(kLE6x=bii&S)9Xm*}ElQec^o)xO40K zio4*F5=R8@G5MMkK`ud3PPyI!0I501g@PUhgo!;yeRnm z1G^2hrMKv-c60afaq3$#a=_))B)!ezD2xds;KlPmS4;=K3&zk!IMJOmU6P_0Xv z`v0%(1D>?rL=0q7ic-UyqCLTy?sv1v<*l@f+Na#!;8ftxPd}eZp_0eurejx_BI+I$ z1sDRUy?$eu=s$A*$Jq&~ua(#*!Tm!%s(peD-CKY1hBN1}4#8O;TlL8VqwxkWgIxCV z&m;~}NB&vyi9Wha)pjAaHckj?OyTh8qM=9?H_4W06#J$Qud0Z_71a0jf5bzWRCD34 z{(dhnpi$=3$Ue*I#Z zb=|GxV)yitz%uMKi%hcqD-X)LE)|ZWwn>E2x+?fyCwH_{*Q!|t+ji88ndTj$v1(j9 zNzR^iQR^SebjQ3WxEA!Kmmcg$$iMdH{JH!h?E?IaznEM(=H0T3ZUuwAruWXYm_z}L zsduM+weEYJZa#YJ0$QeDc1clvpJNAdCkM4?Pac$>XFo#GmNH}>dvz6!a!z#x;_Qt> z*(8t$4KAMrF8duI=svyu_^)MSd~a>dE8UqL?a>P%rB=U279vcwH3jCM$mUvU{=(&C zz-dG3w9SV9<^|TrIHL*y;)$R+tADKg!}f8ncP2=A>RUw@t33thSbGkCL=gRHC>?rM zL_hG{0>%hMjqqsMo&C7wu)hq0;}eCZPlG&jywnT>tq&xshKy5tFTs~B*70M1eGoW- z>E^<}i0pzx2cV=rqrdIoQ%uHd#lLRne>Dk*9|R-#M@trEpXM<%4s(idD%`s!5xg(R zy%28vqsUxt8`idZXIG;r%urPF5J{)=SQrXY$lkAjGrPVW}_6Zz#9S zJO84Mu_hyVne6r(U?aT!GZ#QaUh$W1ZJ)pR@aUV;z=gQl_z*)csTKxbN=Tao1vPT^ zmX6*B5ast}#MFG=(-3|WPb*4j@pgRq;1y{15)@BLXxB86n7wr~L^N9Aln~0gf#@P_ zTA$FDOK3RdU(`n!f~MVhX(4>u&v~Sn^1b;L>{R%eHh(2S&^M@0*m7b@C;z?GUgQpi z`;GSmTtWJLDYGXAV_qX7h0T$?oFxXcBYQ`c7V_BG4Tp{SUWSnhH=*buK@B{g+<(uf zcuNbs)%x%4bQL-9s8ye7kh7&fe*qf&@Lz*!7I0}p2eajigI!O*VFQ@<;D|)P|E%8E z&7wK3z)gK~-DWl}^Mx-?=mKZ?Rv}BR)~oZCKq+L&-{pg_%I2b+0hBagJku)5AT6GGsBf9+SO61J`$`jnq{vWS%BVzBzO@%F6}KcJtvrZ7~oX4wa423?^7 zwtc8|whU3~j>9~Amh)7Tl}yQxZ#{pS-|?EQewt2s!FVlLKR&hy!|iy?sPt<7>7ls{ z<4J?+(y>`%SBIAzcI-!pAHUsc(d?LUtqGQe1T3;lwamxUs4nzq@*uHIV#t1e^d6-K z8rq~$Q&JNG?MtKitb|>e%kfkOYfO7+-Qt}oU5`S z#pa2)(~u-4_l1Hi)*;=a2P@AqW2P-Vj7#IC}JrwlpZbkP2Bnh7nMe z56RJle>qNO_4OB;{oSV$e>SMEHMBQ<3hlrxg`I1~0U6_yylm~7lxTXxPrnT~BKc@zAtZ#khFy%PR1ZpMtS9ox`fkwx zQ(GfJnYlhwNacT?pYjD#EEY--@8<8vDN6mvRNn&v(p3Le@{UtjWT4)Yz>da^`(Z4&{_DLpJ2Thw z``N}9s4!_< zt36;N+4wdrayuEsurfW}U*WM%2^2zjfFTPJ7($?ja-O3$FssdQlPT#Zr2wH}z3I2O z@_dMax+9B(Gp0f=P==*8eHCm#Mi<1PxX+iu>IjkAu4KMvA9$f*{un*)D?W1i6ZLwX zQND+IYn9s@gC@D@NHxYxaS@hT0jN6+J^%|+z5wvf+x|VmWNt$hLW1RMD;la}%hOTV zMSqzaW4NLU=>h~F32>s5VK$@OFsv|tw(m!{SPO2`7ha%_10=PNh*tv3K zLYOdsQe60VNrfi(B1>og-gE06wqK*t!%+G*G@?satIdk{qksD4Vu3WI>PrVk!&X6& z>Lc7h%)(b~Ysv~t&=p~`&N!7QPkid3PpjD{pd+H(u4FMw6u+k5A%`D0?JGYX5Kgna z_nCg5vSsf503^NT7!;rHhc3@h6hh3{pf5-h()q)80*!senb|{(#3S^Mw_k(+ZWukk zjs7sby(@SE(?6w0P(PT{b=8+j=W-w?LXe9`{7J6u{8)C-0}VUqiAy%Z^1Rp9IyO4& z=7W|5c5;lRI|4}G4ef_{##o%Wy5sV%Gv*Fq0&Lcqq;$5F%Q%E&4?H-73{$?PE`4tX zlQOTbYMmNv4RmPqf3`J#O>tP=Ajp5V?a{z)Y;Pj!b&ih@K8MMkgzColnFU3ERN#mx zb^PSLgF{No@MYWlwSSeHGT`M3DewcERr=W9+UN*^Z^3)Dh$DDS0AvBPhvG=2Sz+{3 za<@Lxm^FAK&koQcTD$SMSF3q|j_U^CM9PytePm$EI>wk+l+yaks!T@8dZ8r;81=n$ z3EbEXt4bI}ru;%&_=m2YP1tGsU3ikOP_`Y)bSi^V$F^`8C4n$TH`3Q;+$YY77de?K zND?N=c~;W>(>+wGbw5II_E~Ewo>8I$s2<-BslUnh`G@Ff2qkvcEAJNyWNe%tEZ7#s zBB2pQ)RU<=PF)9v57VVqVz3S-2$n055lr7Sa9$Su=n@A|-YjKnQ}i2ZWSbg%8HjX? z6^%gyn_PjxGCl)j%$l=kMK!xmM;i{1+Bx5lUyz+cm&fjH8sS9L3lO#t8XgD@<>o*w zKD160DGULqXq{jA^6#KymoWTIWWUl56gOBw=qzl6d-01-h7OuQj<5OYVh;~IMpY0u zx<~i_4YKv+rW`)GjH-YSyow&PQiKcw^T!rC{r=zrh;K7tV47N%J z8U6CE%x>X5-g?Ub!biywKVZB+cF1^7F z`Auw;yik4`5dZ%atLTChh(cg!K@&OUdR*7nNM_j&gE)%Zw-KUcKTo)IM5gy0(|7;Y zW_@J-bX&izP`?s>44w7^*iW7|~yERxKxk{uiWQvTyR-WV=<5mEO+;t6zh6<>+ zBRfU(m^|R~su8x`$-jitoTCT0Ujmw4~9#K=69n63xM73Rc^=S%WCoPxLjYVilTY6prRO+P8sM*pzQRLn$|bp+^$O&I&M>Tm?A3g zN*IGf$=k8v$tuds=jW5~&XS#o(jm#tV@)1Qlz$QwF>U{X{$^EV`AEjb&ER*AIXU^N zKML+Ou`?`YxZgeGws@Hk8i8MHMiNShA?%S4tyN~>9)?A&`u|NQ;Mi0|sM zH^YtJ_Bh$}bd@(a>RlKDB%O>GIs}JKrdy)2fF^XPJ*ZfLQ|sY)67!{GVR$p*Xn$-I zj)IBVvHH2@)eI4i&Y+zp-qg~=xh0v|*1!7%LedHX!+vK}3j$cB6}ij-DDM)( zQjXfRJwZ&3w@p`LKoe$2+Ok^uJb<3u+N6(Gc*$IzzA|GGxXa*IML86XYKE((UNFh) zSrr;SaI9hdmOFdv*d-7906hpfg@O>kFs=23ab_j;P3jR~It{NtSWGuBSu*_j(kbiR zmtZ6ED853=POS%gJki64?86An_`0=&=<0bw)A_jzB&s->2=}WJmucd=_LaW7cGii@fy> zrQIUjJ!)|D3#qJ4S4PgoiJ2N{SENv0j@1fB8VZ}0q#{%uu!ps7nvPZiO`$KL*MiZuFl*Wau`B+m)x-yP6zSCS9Wl{k(++=o%&bHq#++|p&pPxWy z|5PhwWWxuO#qgbY^u%{WU5+=qDfw@3oNB1$kws~RDf|YYJSQ`qN1_N$mlwG)Rs>O_ z4PXPLR0QK^0)XR+zE}?bhZ9oV#0D8IvwanWp&*z8#+pcBP&~KZKg`qaeXbCjmhT#e z+j*8CY7IEIS$Y0q0d&wXr#`!fwZF5}tA)ltyK8`-Fw>maP+U$vptE*V%)~}+l9=Gf zv;WzioIHfx%5H_HBwugraDapBza#jzG4qr|$T1<~d}Z>Yv=o*wjc{@){s569`Tg~4 zk9-dUu9{qSjSZ}t>&T64DZ)NFx-eHhUm+4Q47x`Zj^R_#{!OedTj%b=!g`(9{x)MGAzQPG51e6vE{SY0_Wg0(ypEJ6HOl zgZ0~BP98~WP`m~{;Kli@R0DUXAao$>DaL_TOD7~)Q23eN7;DK%#0ZG-~y>cjPTKI{1p&BV1 zvvxtCCcCLD>ZX~HgVTrfQneP$YEEO&dWR5T$JueYHCHmS~%+N#AdScOo?+=2o8=uV}~ zO_Rz-)-@Lh>>n3hDc1?XM8h6p$(Rk>pelZfSkS}36vRD6C&2$&g@SUz>CXEJ-wgML z%x<^VFIMC1<3^zV)|MQ^jY{!TsO}b1X6hY_(I^gXWU$RaGaO&(85loh?eSy_%co1= zY|0us_4`{v$%mvpaW<9lkIX+8D^5PBY?vV~EK9A=Rst-*7})Ng$o_J8Y+_w~)gBlD zGt$0#xophFDy}EXL|~v!t6ftRSe7<|7kEB#Dl&X)$PakMFSM-_Ul6j0|3%;K4v%e_ z8;PO9$HZUA0xFcIPKJe=Vv-;pskO9#Br2>DNIK_$Jh&2_=C%?tw!On*$L)kO_n zn_)MAtcMn)&#7%H z@Q6`C>op}DL~f!E#=w?+xfqbME)FVfdpMQP5^T%BSQ9bGG#$Y*RB%u2{w?!KP&y&1 zQlWxt&!Hj@q9@@Eb~$?UQv_uP|6pIsWe-=p{~!oa`}wL|0-rTz981v+N9EHk!X>Ht zAl-j*7}{k>jGCkr+%xiyfs{@+ANlRc7s)Pti&NyZ)7>CFhj@~ z24!J6hWSE$EL-CHjM>$4-K_y0`>dlK+g}Pcf}Wms(XE@}2jSy3nHY+!3!MzV0rb9m zq^{NBEfO!JB9Ldxr~4#ywoPEl@)me)k&2jJ=%yX4Mvd#L5U;x|=K=TvI(n#!3V#e7 zAM=V2?&=M8$Vgyoz8|+-VcvUouY5*&iAIqVkd!rcZvg)f%O{XT9->VJxXMf?GS=58i_z{8 z;_G3K_oQC{y4`v}R#ABv5b=BCIqQt>OrZqZ^03}z?*6P((gUm&l*{PyFFmAz(!SkP zPf0OD9PsBssr)YY%w~TLzc&@Na|$@3WqE$P<-Rj3V%yqsYfSF-0J>B7uRGD2Mok-$x6}9~O7>j@LS7<)v)QP6eYk;OZx*M+>d6z*mpTm;L~^KO{na z{cJ!W+|wa)BSEQM|GT(PVnw^oUNUzj)vXQQOJ{&6H$%RhGR?bUDqbUG=dAR)5!$=v z-{D;pnVQnbLwL(%83W-|mxmPhX^5G3dePVO=PMedmSAaY4nsN;IWZxPKLFu2VULK7 zX#51C6(>!?%bi?IHO*Js&pZ_bw z)k>(tDf93nY?jYaFPcLIMQS#@=D-8V6JtE@loynUWb6e%Gw~Ae3u0XAg!eV+%pU9> zV=v1}8XAf5lg|$fWbc}WX=7_69mv6QZ#N-Aif2~ z_TL};1I5}h@F`3sk(1VV{N7buKPCbgZ-k8J?V}82`tKni1xQzJMPX&C!jw~wL*%;yLKY;~z05b@)&J0j?n+-+8 zd#1oj^rHg45;B1QMTg!nUM}&H^Y>k%n=2_24smp$ptKsl6~@YYpd55+7!)Jgsj>CJ z`}Fp5Wz}Z@ZTVJ+@9pawdZDAy@X2%iBifS;a-g|8!|lwQ*=u}gFuHb;$X5@81NtXv zm+Bok3}&185SP2>@336}@^Vaa)iEHz9s5~5axDjx&V2AkZQf*NxugLFf{h~>9GN)NOA);-KLoVAHXkF-A zJg`lVJ)YocQS}J&_C#rz^iQhEUsQ_ z>yJ?)BcEEtLF6wh6%e1_c3#)r(*XK5#XLqQ&#PG*LdG%&H&re4SU0Lb565&=zeulYB#t~1wWwrdcz=p@&~aGcv_hpHRgjyMxU>pRA@tN<96CUpA{NWrv$?7 zG*_n3q2?O#Kk_D23s++YlEWRC77eFzw8?b(!%|$+zMwp&Rk<=WnhB^Qx(QXMY#;Ur z+naow4cphi&fS>I-KA7&9q=yq8<^VH$m;H;d%p?jNzv6c+%1ghpZx@+hnXp#p^&o> zSI%-?r{Wj*RZE4h66_W~MOYo|VXhZx>VBVau*aE{zAxX%#RO0`%TAnF2^LnsfK;FY zikqcV=o;|hRr?1kr_?!b6x0Tpy$gS8I)3vIs@8s>u|OUwVObdPj@@;sQ^@g^#Ek3ia_>-YepM5 z&;NAHp3fin#`5dX>3Rfn)ro|07bemzo3s_Koimuqwe9c1%0Zl&wWf^7r9EM$im|3j zJ-95^TO^;Z2|?+|vHw12ndd0T4cWRK;H1$I2o+}6eC z+Blh_gyfC0K=|aJS^uV`2{BJ>k&fyvQLdy?>1FGB{sJ;R;sX^Z1mROs)K^&cYGEwX z4eZRtkNarTEUlU?WLdHEcER3ks*T6GJSTy96&X^pc@kQ3(mwz_b7W4tkA*P{uw46y za4OcMBM@eZUpu;GjuTT)9TWtxa8=iK`;*nJ^MOB**cQ$O{AwuvK%f?v5aH@?3-5W0lZf6b=b2ViJE`5bbVnF&PlNyc8|4WqB^Qtz@Kw>x&z%H zj}jiG(T`Rr7J~BFfGMN@Q5*DMOTcSI%ZB^TZVB}$Esf)9=2tKYZjEoyvrLyNC#jCv zbGoRU`c~C%beIaJoi7_7Kf7q%RFfKx>TJy}bOKe`Y%V)VCkYPp%{?Rok*`Lu3LMFr z7YKcsRnwIFt3miIx(dk=5obgI+(JWt1>P(`X+jpax&E5((8TpKJ9Frfo95tIy! z37yz!?T6Iye)pwXo&aTRm|*a=j3rsz*JN(6+Z$5G;*pU_Xtc%qx8Eh=a8P$uy@2HV z4Jj%7=F4%-*$_DbImlGt1FcaKNwcoubS;!9DMI3^2$|uW9#9Ebv)qO8%s=8oGZXV8 zEwg-3&{$9=kW8YF7d?)-_olqjL;xzN*u{b{9pqr;)|*MxXyoqkhmwaRgF#4VP({=x za0z3pI$xIwN}=*oN^ikUpvCV-ai;gC+o$gVHi2Ts%gnW^r5~5^C62*EjO>n?CRK&o zjRHWT|ovBklu+OD3^wY_i}n)(`QeQXp)m zNP49d?*@vd9Kfj&|MxYGqB(tn_Dz1It2T5u5S^aE`j?TwFAtbE7e>5Wp}ftH;HtrJ znlEMpHJn0q5Wsuou@NxFbtU)u+OMNp5iM~$Ub?ryVzS+RDZZGe8pjy_0T|&hHm-W8r^p zX_6UN01bQeR-_5#J0u5sFvQfohZ1Gfx(egN&if#+CvIaTR>nyFzF{lEhw}H&*m2Vr z?ZC$=FX*&llsZNM&dzv{;3j31bLvGulfH``oi6OC!QiX+elixSQ=pfB70L?RWBL4@ zE^=#k_Is9jKDAPTkY3>4cEgQXUI=>Aby1kVfp4m9Kb6BDp{mBh2 zPgXf{tOk@)6V`dqn<4z(^t&8>cf@t*g)?uR;BI72zSNV(pN8jT#>c$Sv}jbeHql9> zn8arPW{>XMMLLV?_%b_mAsO=~ijQ_%|0o9^*9NL!k1;HoU~)QCU#cEtAPf4M2ZOC(v}4$9<&%OgN`O2BiG(=D;6E15YmKt#5R{jO*x z5UQ*Dm;~hh5(Jfbf=1c6RYiV{TJZT9M@oofr6|QM0ZxQj>5cB*E@sQr>6I2z0haQa z*mt@=OU@`KEF|)BJM^p~AXOr!!_8WTP=9NmYJ&pei0{IVU8pq3#f{;S8}RUrV&S8| zooKy|pg1Pmxp7FJz{qd;y`U}Je3}c6`5@95yi#pqT)h>ECGP?v?=-u#d!;tqfDNN} z6+BQqcu)-NonUkoY_V8b-R}u$H#TW`VsE;`XIJC>tEtR=5-VVT4|o{joPCQGGpbPi zq)vvDU30fD&eJw^5~%Zvi@wscxV&p%ViQF+BVXa_<_Z}CK<>cmS{y48|lbUXR%}GVVr#) zhANoyUESJk3I0W~IH{peF@(4J*CmiUrrd!56Z&QPH!WWrE_SDm$(vMAwVsG0H&Hus zRmxQ*d8>U|WQ1kH&KLSodJ7(Wfx133PQgH}EbX!At+6_#G(48X{aJIpZz-0M+!jm~*BUvs* zxy^IBhxZiII;s5V@aZI}uT$A|nB8;+$@t04rJ6@6l|#^&A+(wY383WMxg0mhoBc;cHBPqBEgM`f8By_O*;!9Xd`~=S%@gk zW-UE*+fqB@+w#AcdZPe6H6!;GTRfBSEs&a_U~jBNh`Y9bxph9Tg1lh9~LNWP^gm44KVh=7)m>u|kK-By8e+tvkSX8n=RO-Vsw&7?kC zxVV8ZjPt}0U=!iuL3(`}X;q3X!$P!uE*7Bumt%Q+9BejcHeFykCILHU?UUk-@~;^x zt5$I;Bm5xu4A7=S?qp{A4`(?!h1`G2Ji9h#NOOs6r?c~qvGvtk_AA>%gam9L(AD>l zQ>j-CiT=cg$e`;z5?Ofv3XmbJyxo=)8*%WDEOWG^j|N}23pXJ{U(Nbx_-qewaDHp# zeey^uvkl`-)b~sHonrtyI#`orMMV|+Sxx($R9^nQoi|xwi0DWn5`b9R48Yn|pH8=I zodl3&jW=L)C8Shs6t*A}FwVf>_=A}v42@Wp+|p=Mm=MdG8ewyTxf`Y zz;?Sb#_Boaem}Xb0}$=VX#Kco^z5FrK1A=ZVy{ylTsV#t<-*9=wEM}(%5Ob7J?%F+ zuk*VU3L;4@5ma}1^eYbAg7*LJwDLV_-e9@+`A$uH)gvHh_w2L~H1n}aKu|4Tpkr7=bBX!f}rB<$C-FQt%t#>Oa5YGrd{K4sE8 zcny?2=)h(a7MRW`lRa!tk$Y@SKhXuEf!CURId{JgBH+4-0x{Y5S_w_!tTVa!vf3_|OBx8F&~_x+B~;e9=)mC14lIna zdE`61Af^_da!Pwm=bU15X9*^FNhl-h9PAA{P`qg`DUDBRVrmx3Sfg^_laa-9<7~)L zwsK@Y{9O|PhS%f!_Vx50X~-jakHYa78Yh;71G+v+i8I{plNRsHx8D-awN5Y`v)|7j zQ=B~G6i0sHl5~vr4{V+esWMa=&yqd=^DFCxnwE^wjP+C;qC#Ljo~bOW`a+!wD)YAY z--SPN=02=&N0>Q-4wuF9=}eB?m2+z~cH_%+oW;0dAOi8PzNEdhBK$RCplu+8C|!}^ z8q7|57^!$UorBy#v~j-4$Xv^>odK>emIo>kY-}O5+(Bc=1MGz21e(Pz04mvyA8qeGx85Y%V}*^q8SRj@1_Wtk4CynoTL;gSQVa_3Ab05_Y?THeGuQcmBmHXE3-u*qP`FekRTWdK$ z6SeU|3lyVL7_XY7TN5y5&IR96$UUbV?SBLRfKCO;=|fLC)=ryT@6LOsJzZT*9LB4; zwqhrxM=T_QsE3)pk1Df-`o;}$`y_KROSX!ZXwgc8Q7cHCyR6ADV7ImjhDjPekCZq10{8Rh zzP*?1oPmG3@E6rHn=`Oe6wc7WNu9j}xFWxzP=+R-YbXv!Xzck=3Fd{Od9ozRQLGU;XZ193tp^6UfJ@sm;dq$@p^5RwuIRQ<#=Tc)pYY z744dCkzr*6mp-bzY{Gt{=@Ch*k^N#|FP8KyHyHg|I<|T2e^loBAg#@r9XeS9n%HwT|SQJ2rdC$Vz82uH-Px(v-H>T8a(2tGWqbPH`0llF$rS0e>VP|2Y|lK469Yn)-9X zMGGoE)>t}snFMKAM4sj0Ec`v4z4+P4oxe+{fXU}%ay5E?W(yexl-IDb9!YT3mjL?{ z$X(h}iDRW6b|=PkG8$VvQ{jnKZnVfs{QBUSAX#!I{}qKWd6^5*xzwp4DDL6rK>VryFl@E&0cu(Gg53UckNhE)10 za#|Y-G)#zyvaJe3_f)=_+=&fBeX96aTa4v4I93vArBwfqdZ_dVF+ z3-Iup*?`m-!I2Kd5ov~vM>hnGXDadvOX53))GRWfZB+|LKWj+Jl)IWLtVX+(P)981 z5{l_;Aycb#7xN7EYKB$IUB9|zKtEYC@_X~W#gx)L4Ayl4H9`7t+sECeMANFdiMo*D z3YOK{;et1QMyKQ`jMnm|M0lqWP~yNv$?a<@7=;(nM{@i`Pp=9~&rs~c`>dq?3q~{5 zXV-A>kk5m`Ud;iQMl1cpM~bBrj)DIBx7Wy0qxYumQp<%hwe$-`3HUfdB;SqO5+@T1 zmLsb`xlEm=^}os4(>jhV50o1j^kcLrk){2!X*ZuSbxm_}VaJum0=f-ZFXfmlMQMHe zvNQ3>(Tt~va13D)GfPF8+5_*v`&4iPktw7!-PCmiZAV=SMhtA^XPH5DchDvjtWL-r z?3=iX88rJdXDpAlXctI0MjdP(y6(VY_&Ay&X@v8Cv2I;vDF0MIlwoC=O*B7U(3&4^ zD2B{fi-ui)iBZC59nQEmDPK8Nn3G;ry|AeNb(|hw!8Ml(rF-k63~W2hXK%yg%_m>g zZm`r-v^5W(wu{39`my>jsTRD9ZOJE=;C90_wGuUH9Stm&7(FfsA{~EXcI2K4s&%m=s1^W2t6*J!V4@sD5Pf8NO;Eac}iGfhC#MjhWY7HCSfz)v{O= z?vcM)kA5?A1ZD($kl_FX!&sB6Gth-~RJUgc{qk}^-)F;_s-g~AjMUan|CfjqO{W4R z@^N{3CZ@|4F?2!dcb$hxDhaAwhE3xNWmqRXz~Av}TYu!^L)LZxW^btE^4SAM1$!}< zaM-sbKmcI%+J{GS7cu!;92*P~1u><^1tW!9l=%O@46`yA{?h(|>|2x`1dQ=1=bc=U z7HNu#N&e=ds!pBRmAkvCBh zYwwOjc6eKB=vZ``Fj+rg3<7GzZ!|4ph$5OWO>!us*;rwkbiZ_Cytm#ckfo<9dIna0 zQL4l5wPJ(J?Ep!N36Oo1Q-*fcOt)Ag$c-N^Vfq9s(ft>~k=PMc5CtHj+;2_cqy?J@ z!O1Rbh;<9D7C+WF64No-XWiIJW`tmMpA7o{$y4^9Jl+v&DnUcxL|gwX7rcy`YmB}a z*xpvajgTvne8K3%syMm~A6NY`&IB?-_z1gEV8snr^c-y%uZ9?Bn_$*4`}~eNR8VR<$SC#Y%s_PVNn2|qDTXN`ek|~4^^YRJv}A*qteZC z76Bv2i2?fANqijv!<;oI8zw67Zt*L8iq}@?;#WE9I45(&?h5h8FfQ)BxyU5B@x^m7 z3#!=TYSt3?i@#YV0UuiIp;gXK_13c}d()A3X9$;gt?fD#hwp`{gT{lV&Qvbp$*VIE zB3hm^Rn#t-$-+nbPWX{Aea4oLFrLaoG`j^mqEQgWkpN`N&@kYFI1;xkN*rb}XHP8x z)d?Ir;p2@jL^eG+kNdr8Y)`@ZzTyRQ>()QaZvO5g+ZJ)3mu6x^xuD|P(Cv;QJFaC`XMYLX+;L~vNdQt!)JF`eUwPl_7P0by0RU!QtDESiODJ8)EF3ZZk z-aW5*?n0Y;ZR(oi&;)w2wc8ZnIp2QCM(JT5DqpYaQ-th~n(3WsZWMF9bF1wM8y^xx zN@S|!=`-xwid3Rlf4kZ}{Nue5Vveo^tT~Ap^D_7#T*W0o+wI8$P4`)G_Ox0jpNttl z03@5m&GGOyXxhQjQ+Pv(Rvm;Tr~_qv%+Sx1DG!GszKm-F@JR8GXz(OYHpg8kicDH! z5g=%>ZvHuqPuLxqC~Y=s|!mEk!*r}hmuoI`_3=VJ?Ul9foK5`m2E-2H)3Xp=@OsQZ_xeJItQ^oI{jvWBkiR|f0z zFE;PFyzK{Dj$833&ixb>FWhXd1+hV{_D^maVxkqCt zkzfi06sknPFfynNuE_>yfKcku#HSc>Hs5=koWBj^H|)USAbw_pIC)AZ-gOuHh6+7= zQ$}v*L!GTiC^7FkkbM(h{(1G1LR-p(z;n&CRP3;tl4V<5eYcd%jIWH)PvJ^rud}TENRt9LU$X^veNK7Lko>Azi1gdV?E6;!DYqh6{JxLGfa8a}yz zURNR3P1x4XxT1U=R(HbsY%en*HoqwM<@L1h#4q%F`wZ;4Hx6h!`+~4z4V^i!ps&SD zw64dNR|h4W+POx<<#toc<^sA~XDo1%#CiT>^@PuW3*B97%WO>R&)z2n>)E+s87bnK zXBxBI(pOKIcNYha`(YMbzBnwSTJQ(PK!z2va@Y*@-*>8&cjmCInwAaK4jE6_u*A|k z%tK%RCBRAI5I617awIuv1#t9~unkGrbW6#jJ{J^_sP84M2NQ)9Rjq89@c-=YT zFV`S3o}GFlp=Ms+L7lQ_GnbP5y)9}3aYsX9@eq`mUOsNm%#?Z;*NQ_dh=gbOY_T>G zfNu&bpLBWc^H~>3QpFx_KE2U2*>t@w`4sEwK0?tI8_c!wcY&`FyVV-P$7$VUWaD_x z){P;HmnjlNE!JHxLpZl<$OQw)<7BVrUPj*V+c#u)PXYn;rYZ?b&5%Nmjqc9 z_>g$_dVLs6fPQI({lq||w{_9s7p$@IvoCN5&$DEms@>ml^D!y--BA&Mm%oEYmzPY(sc{#e^m3x>8Axe4$6N zw}$9xTgWwMA;h0zb10<5u3{KEo!UJrge6#AiTe&^O3e_~r1s}i7rSsR6WDULVFXB? zmJmQ?RPbhLZbaCXwcuNFd*^?FWEVoWz&~c;GuWGo>!W>P`rp0#FBbneBr#zn`5d5y zq2!Hgr1nu^{P5!2e4BLuCL0Pu#79dv0D=#3_U+=xJ^7qQ7A=#G%lUQRDok-2>L}ek zJv&=_bO(P}kQu2UZM_-n1=REPldBW*+7Rt_p|L3lX@>oXyK%=7GRL72Hph8PJw18Y``Q{+ zk~$q-g=!kd&?kB2YgeVGP=5BN=}DBFz;T_N@^x!**gi%e?nB&+Oa-G-X?R=P z>vr00=XeO$84&s7>!k{gJ@k0$m3$sP>O0uzrFwJc%t=i{HTu#p&p_1}$%%%*N;}ff zXO%g3^=KIYVnlUorJ=6==(^K9?=*u(O(O%DmQ zaNKkg&=0^B?Kj;4XedNa^<(Z15KVdYC`QkZQ+JN$4)BPFWR+-u4Z<`!_cG^Vp;gUv zo`nGNF#51yiLc^)a%PIjCBmBU{n||ZNmp>A`ARHMiBT5oFsR8!7Dh^-O^I$Rphto+ zC`HF2c$rQW8ns3$GzOcpgHx}A>jAgcN7C$6G@Mb}g+Y)cV=T90x#*i#Y=E-$@xN?q z(hv&d+AX)RE55tVKe0}mw#FwY6E!aqrwI6uAlH$E|8BNB5r)>K%g$;pGczD9vjnkq z=bp>%*J~|g{-@nsNVC^*lxH>zPC_8;?lR6qw^~(X8?9HZ>QW*yS|<%3;^Im!5QgVg z!?`ARy&HX~T>%tMD)|?nP!2%XCcLc0c_G5#h0J=y*;thNBEsrcZuu3|_V1)~rv3x%3g5=kQTwE_X|b%yH`7gAjW!H*_qvZ;N#W5*f4VMm zcdL1)GP}lA?iO=h^Zp94U>fDw_H%FP`+IUS;3*BWc0!UIf`B7PA+Dy#x`GzhY_(6& zwX7NC7-zW^3?W>G_7$S3$Rz9%cD?+84(zSn7m8{g&_emVp4{(ylYZlj*tEebe)8-> z7q4D9<5SdD?Qf}WjlkLgUng*6o5nxj)t8UZ<b)sudjppi!>oMiVY6Q-*U z-rPd|c@W&UHMhF*4R?#u)QE6?50yV-IOz&c=T*8h=Sl{-jZalrCXd$4U?;8>sE4EE*Npibe>|o zJdEBdHhi!4$I#cYOYIP~9(wpt!gG4=RD<=F{s{qtwL(O6{A-wsul7DpZ#@~wNz`E< zZaBFE;sGPA?FJSO6K1H4Jdm>_{`|RuKK-Hh+-7XM)jD%IkO%j&U?tOkK$c}L!1=GE zcFrPD)cGpS%q9l#WSVbJGp%O!ngs$1s|lhT%##5wK(Oq*99HLQyHt^=Iycj5Q~D$r z|EDhEt-%W``1&Kb3Md9Lw9&BNmoy-*+oNSgQsMDDh35UtZ_2d#A(6BFi>w8YwVS&v z9@n?wTkeviK~H)F<*F){U)SW)xpE=Y8L!#lOTJJn_VP7HM>qcD!X zGD3!0@iJeqCE)26y#CM8hEwO+Bq!D7+S@KDSuQlfG;71BfZt}oVDpe%SJ!N}W|h5y z+!P-^k^cwYAsdvtdhv6}RZ!~}a_FzlUmd^hy{m%_P{dsgJ@QaUnjktS#QrfooT#I- zqiZSUQFed0CG)wU%vR-5&IP0iHV@Sog*(-^;u`&uZ>v~lMk^#!L>$u`bIftw6ud*m zZ4PXLvG5ZOs;qj=q-xlh{FZ462Ha?~BphWIJDJ7Y{W01ggbY0GXt}sDZSkeWXzGr3 z=AZEGngg4z;?6x~O8-J@f2$3G+KgZlwH4qGwF!e|rd?k1`u?2@hhxG$;XL=az^+jJ zx1#11lHQ7h?jL|LdO(bOO)zsCv%(BEB7+@2A*xL^@j81LT#P~Yal}unxR}wxzyeyP z#i~(~WnSE4fythq|9Ap4v-6JnPR^;9UBb#>Q!wQ$`x**hm1CXHkdaXDYZG0Fh57q1I`NS19o*UL@pwB6 zvn+~&fc4xk(0tZPJ>^vB=_XU0f|Xs8-?;f*YK5cbU?RXX^Zu_F-PS{;G+c@w=GxC@ z4XFj9t-wP8sN}J_fu(lokTfnf+>9i=;;^!PoS8d(E8r!FMsip;p-zaDnE%^Hm)GVJ zw*^qD)omiiU{D4Mp=s;v)0yGpGA`x>U{jX| zUG2!a`H@YLSz&f7MG|50!HQtjoZGNh>9@tgUMTNF@q^)iVy-vTZ_@uPfSArug!43{ z_eUSM{+IDkLH+-Bu|cKU7oQiPq{!kgjquOJ z0V{rCx)WkJO#7mkCX>4i8LXMRZS5(o%ubQF(8k}Vt=^p{b`N-@XI55nJYi$Q)~(0Z zE*qGJ)+_?f3g3iqcLY6-nFcv!U1S#4!*2A!OiSqhvJyJxGp?QcZwzgR^Q*EMxCX6N zx4(zJZiatXr`stPSg3@4$_)P=T6WNWMnqbscrp622rU{Q1Q&YUcIr$9b?=vQ$Ka=@ zdyR`E>H-}~-V@p*QO@F2+^D5R19i_Z3d7G)mY~??-+^$W{RgH=lUrIfdr@OyNGsAM zF`$GvWuXGRTY>|Ca{^yYZTw1NueFKm1-HiSpUGQ2qLYs`UoE@d$TSAa%1`BTQOk1n z7B8FVH+d)5oT$Qv`YTH6a~m{mmT?KF^&M(^TV#oY+q#WuhS-C~SCjiilPzr)lLO2Q z%kEL{{0Zjh&m@nZD10AV64Ge_n(!G?qSUmbC;Gy`-su~O7vXZFIx^RxfDHN(+>(E+ zZCvNEH@B(9M+ub+6%Qw2f;_IefMgCT+KV>R*W#_kpP!x6cf-F&zup4pegTQD9UUXz zb#({&w!Pb+Ea>vIgAO!|SOA!lb7z znIqzd3lXcaF1`Zed>@#sOqOdi*H7ZwVSC~2I{WrN9E>qfJUW&fI~(;p^L5=^5jBoA z_Q&b@<4htE1yO^H6VlK$c9}R)GUsWTA=V(=p_r}7?S8~@}lEXDj&bLSu5=f!X~4Ya-fH;fM<)IPTKUCAk;6SAj8?&JMCe>wec z<+jpW!Bj(0>7e-D-8#s>RY2tH&IR>{DaDYip^@4m?*!1~U**TCL887u+eSys-Hllg(WCAbnFg<4VTYf`mLiRh)Sro?xh#%AuqR( z)PC#Hq-%59Su&Y%M7?D%Ub63M61v%bfe=3F+jve>kkYmyo&O|V7DRl7P6?zqm_?-t zjbm+HO?Im<)M^1ntUi?lA`*4T}p24k#-IkoC z(Mk8f1j+`{4hXFkaDRR}Ll82UkU*w&H^K=a{I{}kAG8Ti-`b)KKlyL%SKQNysQ<{T zWlh{);#r>;3SUAp8n$UlwkHJNeU+R&jZI?)-(cFIW|*W{zT7Afz@n3tVBKGocNnfH zO>R489m`XXZY?upK={SQjM4kzuJB$orVV~&vk0!p=86nNR)Bt;HvYw8~ zi?kzro$l)IRrF;^8P{-F{)kFZZ?n+gpH4%|7}br%2q^rKahso@0DPnq)Mkm>Sm(5}Xa}3GKm%egyY3jn58|Q5F5?yZ^l51rH6P0lmL|I6J$`W2v z-r$q-STmdxv?3!{7js@gbJj*oOk+kA`~LdimB8Fo)`_kY`9G$r%WP}FWH^N=byRlTScNY?*1&5+Zi(sIbHpJrFwL@v-D9eCb&1XjnmInW=XhDozqNr9 zr5fZPHoPyVP-n#rC?vYSII?$!9$`bAMMDHLf%^snIvay(_de3tSW|)O zJOM?iru0M2l3~o87TI+Fm*`uls+|7)3j*{MP-oLjD5>(w(tG3(Kzc!^$Z9?qH`xIhZ>% zISeI=EQ7GuI(^6gydO!DBctA^Ved%h`h(;q{sii#)NAWNpxXLsVQV03fXWY&`@%ck z-oRy;L7H;VeaPHl<)QK9g*vUL7vh~A6^ge6yi7wRojaC5w z73qC6qsq_Q7GuwE+n&0J(&tGm~R8u%?ZzDL`(>QCH!i*BnPs`jrrLzrK}sam^T zxX}w0-nukaBz&ipmhh&de@lAD+b5qd*a3BrgrnXQUBC*5lHn9*p;E-0Fcx!NY1N1L zL#ZJLx;*8t2TYCnkOft`s z2#mhe{Qb9eK!6#4h*i?8F*Q z)ZU8(mpWBI=*`usWoIL+=1tk%C~bPOk%3y0?%gSXp!9-k3*QAElz}kQ*~V7RR*dHn zYpu^y@^vs95F&b(+JCsOMS+o3(HYz!r5qQA0y-l?+v+6(|GX7UR?`K16}QA(8zC6Z ziYNOGI+ma3z3$7si|SNkpk@D!GVYuZ9y~D+!c_l(YvCo2BobVE_go*)h1Qcb+!fhw z4KeZ0M}#zV+G+!gLF#K$y%?zUF2iNAuDG|Z7Xzt(cym^+;$nweN>oJfY}xc(s)(yX zK%c>}o_F_rbs1g`69~X1p;Su`SHWvNss$I`(pz0JvgP~YZvo*T=f*zERAQ1<1C`bh z$H@j=L~>RtdpyWPP}zpVWp|A|xf69KAV3f`@FSZ#A`YW!V#|j(*jtd?@}jMeYUNVL%>8d6qh{@9z?2jD~&t$-fPxJbCVzjcqP~cxv>;q-{1r-AE+NFlbu_5tA4|35OsLL;n$)rzScAI^dG-FbSl{5dirWB}?a80bmF7|9 zkZiZcyeYF#s}|?KUAp?6ZJn*xjUg=SILrJ}T;>`Ht;CAtt5C=zo zGV1R~!jfyqf$XRJHDwPqV*cs=o71C393jMxP*1)lYyBt?^#?M|;3=%yRL=n`<~_u*54KMW7aY2s@+Q*uSklkwGn^aXaiC3h|*RU+x#SZ3OQUuud zOcy|{M61X4QXw^4kjU?ozm_?Y8gTW2dYIodyAI8~YygK|E`p){0th7w!4t{!+wEWSy$wohdkFSiGzIXCK^t-tk z%k>DUSy=-u|G$IC@YXFaBoxBBwG~VRO69M4X2l8q&fgZJ+D}>mC zoG6n?H_2*uBEM=OwW@LZfEd5`RDS!Z3-_~@ZiFxTe1mHGBbC!N-gArv(ERLk#BG6Q zg^HcSS#-!I`EQ3Qr*09j*S)%HPERpj&~Ga@g83bWh12xM8s}_@e0eKJc4s?L-#C3) z>sn_pZQ6ho)BN=g6y);A3SK!CHDdw&AafmLL?>Jg7hyTC?W#Qd!72kTvx^mScw>CX zLk-zMd7AhQc1=A{NQCg{EtB127c|z6cyL>*(<}-Fc}#r{C4q z?n0%QagK?b9~Ofr5G`|XTtQ?mZx(6BBvfqOhHdnjS8EM;@Hu+@+I|LY2orW25|Znl zAFPL21fSzM#&Sm#<2eBKU*6EQy4tJvr#VL_6;{L;1Y32E&M>NCt^6t}%CKPZd3X4M z90d}3Gi;a=D^5xKg7@m#vlbkherE&X(HaXDEZ4o-Xg<95Yh=bRU!)h3pcyUl&tLUl z-v(dvPlcZHUyn|#&*?7id%S-StnS!14Ltt*wlOdAnmwbN`EI?y$e!aY+G&VX#No)` zvv9kupO|KJtr6xR)Kwp?1ME=fDOE(Yh%acHE* z&3MqEhgxm0dHGynd)8~YFKgSnUTejt8eK>&Px71g9j*bxqg}U#Y8h8hi45w|DSj_$ z^b3E?*T!LP=2rit}T zibRwreBc5jptpAA@gl^)u_d*TmAN9i5rC)_Aq6gBggnS0(7$CxKnW+%Uf> zdRilWQ-%3di-Wv0SeMz9ry><9`e>OHVPquE=VxFZ8znJDc03Vw==j@=cvP~JR676o zB0-~Z>q9Qtw+1tEj>F>`ay{7dF za(GwzX9ej{f6PY=C?ay6Za8m8e6Tz|r0*$H4YNEXh zI8sa)w+?n5rkY*10@*Rn_iNY0k6T8BLVYr_;qkwP2cmhEbm0BT8#VngNnVKD2qAs@joW;=yh!kU{C zDKO`@(S}%r?|ludAVO!xd~Ezij7^?YjtgTmjj_`}(=FdbpA!IXQXd7Lh$W)cB!X`3 z{iPnd_<%sZbtMus>+3okRlwqOA1;hKZ8>!q=S~BK&wv){S#+`9G$gmd4GCyTFmk}~ z5ryzfAH0Lgri&4L>y%C5Gi*h^a|180{!iTeS_Vz`W(2&Gz^suh&@QA|`so!id%+}e zQw)X+?qEf@mQ{B2V)V|5U!0k^m5gRUtp|PJ*P&0HcO63M3Ud|oLSR9mpM);G`*^qGs=Jy!6lJ=GR~8aNasyHdm{y^LG9gsW*KvXB8}NLfI%SLh%AG z63HYr=g?`(ICNzHE+puHp>{-Ze8<*!3hUhC)>F0n-OE^5fw&5!4uEk#f!IrqF!sLj z9xCI`!u&cDlewVOy{Fp)?^>YRJF!=Z994U*rj?l>R%GK@kYx5B6|J!5df%-#!*dgO zr$I9YFuYxer>z!l)1woixJ*WJ;)M4xD$ClGxw}%B(6tOA)$E+u7$d?t$o$J8bw(gJ(y+kA z@cFda*GTCK?qa?!rw<~N*or{g3qa?h^O=!Cx5Y!Q=9GxT^O;#f zb2X1B5&F75VT(Fb{S3uUAYnSRU3il;QAYAM@#B@iU~q(|%gor}Vv7saDGfhQ_2= zlFG~Idq8;>t$X4>OJgdTL#LZiam-^rI%T69cqlA>f#pT&a>%A27)F0A_Re4ZeXNAE zQvrjX<7cd!1+IJDeh7)(Ga>&fnKHo8jAJ(YS#1qMekTD-s(O1~%xhSRfZ}V1g>Nqt z?F7az<5R4Tn`3aB(W6a-bIlKg-A}pR1>(QWNU63?XueQ+Fgkz#RlG#?Km}+|kU_aV zt6&^^uP?943wrFaH-d-?&2*1}xk<}|Q@+{p@9Z{&&j*>mt-e6-;rP#MKbFFMDT4*G zBoSsO%t!SXe=rXhHl2<=kJ&=b{3mdivT*lug-{oU&OJf(Jbst=uaIx4J-o0a>F3In z`Z z5##h5bz42xTtrX-COuOi0sDx{l!pdOhWC1mAy|`nNb<%Yh52+F>Gc=wVQ}RhEI2cs z{gV@6P&I1ErU$yHnrn`UY)JU@pURMMjRA%qknFOY>qQ<%iqHYLL&v;uwWG%pO@)34 z)W~9emx>J?mi7LyqZ2xWM<#WZPQEJDiW~nx(lzh@S{tdU4Xu(TZ8s^R2%4-h4kZgni$W=`uA)|# zgLf+IafD3Q`~I*Xod6q#xB*?w-e;spJG2f@MvOj9z($$n);N-XmWbv^8t_+H9OeRQ zV>&EvP__xxg4s^RX$@o}{v+#v`iLrURFI5#ZUcH%aB1rv#!dqEcS?g31)*m)n&YO( z-<0|6etv6|(LtHD&-$C$U9JV*^fV|+Bl|GEZC5#-GI>3c)1`@^EX?aZ6824#>eA=6JW3rLI|RfJl( za0F`w=-OwB2mJa&<0!#9w3x5wHwo#|jJ*|hm?&oSJHMzC6H;yY=$G4$#7c4}s8l*^ zHWBU7_A<>LKzzjp&qQGEhOdTiDr9ZJufr-n?f!O86PhC5%VD}k8yBC$4UDI*$S2in zKgK~GZ?S*TBs09f!O&GY1(rj+S}4<*h*;&lQ?Q;8Z?>~qJ+0wX{B_p!C|7>rpX*yF zs%Ck?o%MQ0V9S&xPWTGrzznL6`_$xJP{klfoCtLHK_&NS$8Q4~`ww7X>wQ2jGd@qy zwCPjMacdU#7!}JmOuryysu4h+gcMQ@$!t@gE~gVvFQ)|nnkS)#<9&}{&VR^9FUQab zoBo*f*94cUD+0PJrTAT!KQ$WiGL99&fq&G@OdmH32sup_gr{#5>j0anDtpL1&k15s z&C2NQYA>O3p|eJql!Zc{*+IpY+U)#PFTX#IaxEaoFL9sXT{f?NgJb@BoXu{E&rY;I zq}|(jtB(YsWm7rRZsq9x`7W#rIAv0`!!-}~+ZP%T8Kv}1c53VNwwvVSn0ue+er0SX z$MQg{Ao5z`hDikyYhL{VzV2GNkdD3~QlpKp(hT^VKMXY%&XSU$Vm)r2+E)T6&W+k6 zotj-8u5SLK@o&w6e-_r8#-FB>T3)$*^LEzSfBirR8G!PoZ@+C5aR!z*{*o$#gJl^F3uD>ES z>K?97a=21wBZSj7ojZLV!Jizb!UE9!`*s_j5?w1;`JJIAVU~?L+GEyCV83Sh0NpC zxn`b0rK-4jEn&}C3$wJccSpy6N9+@tC)CwL&%TK5%R$z;loshy;;6hal`_4!GX9Y= z#|;|jog9yl&SbE;6PGj`i@(ZN}ZXJ7Yi^lA0W; zrCeaK_>6JzLDieF=vKyDkxWvr5gnwoNFVte@k=2n^b)AO(vD2tcELsew!~=pW1?)9 z>yxLs2P8Rx7Yc##<4iL&`wC|;rcEge9V7h=4=ucYh^I32&sQ>zAbO!q&zZpJyC6`J zIqjTuvO?nwW<3nF!oHy?y!|IErt1U|v%kR{?v{i@R-1d+z;ZKTehz8f9K z89x1A(O-8OAEHo8S>_S@vVS9GaLT4>Z~DLEJfI!Fc<*PD!nSS|mmhCX4Dw@)0Q@Za zmFiR6t?V)3pfpUYK#pIF%|ECIqt=LPP;LFS0itiw{!gD@{WKi}LOTi}S-PctMVPjt ziUP#so$;JDO1C04DofT+wXV$zzMi+~s&H-YGe$1L8F_7|C-uoPX)J^srv6)YPVJz4vm2&9J6T|zEEc@7PJ<}i0Lc`GaQKz`AKm%zWWo;g9uN^vSTF% z=p?ixgmlq2Qu`BnY~W*Xifbf-F0jW7Gl+(SFsASh4LdO&Tgs=>#ge2HmY0uHz@lG{ zk8|0IT5kwcoP*9C;_lx8>GKzIzO$+*;3vAY5}BEBI@WQHr*)AzZ{x+zkHgA_Oy%fG z=K6vL{aP~-d$sv-!uF{kJeu}q<@AHJH|xL z9C}QgJg|41B643f8Sk|^cFtRW$T*;ckFdQ&X<=FFIw4er?UgJ;pWEe<7xFsM*CI8G z?yhQeFmHvb^Dn`j$zu`EwMWik(;F?BXF0%+6)`asbyUlRd-SC0L8C=syQw`F*2p8H z08=*lj1ZCYgnF69!*sL-$N@}9Vt;#5(-({1B=YH%ZxK#(;AY2|jNJ6e62|K`C0PyA z={Cw{iHluHr8DrSvGiQwaO6#x9qBsR)C~&30~ZdsF;vVsa+pf>kfp?ip5!f$gN@{Q zDEZ5GPM7eUJhMOU;tn1Ywga>Ghx^ja=&nq--(_^N!jxpp4!Tu))S)9K6cW!dMgqo) zO;&vs)CoH%DLq12BJXKX;`gf%tYXaEP?Klj7o9a@Gcg+qBkKjy6#fvWMo335`8_(Y z=hF@8wo+~wS*lZKH^M2t_ck-@E|?bM?6A=Bl~)m(pS(0yXr{7x zO?MNi!dg9F%XqZG)V8QO56EO6vO+mUq&Z@7*@*Zj<5u_2UvhI^A$2yc!6;U}K&IrM z$rP*0zD@THn^GCO^@VqlBqL(0^2Il9q@;pu_~j*T)v{j`j-%1Gn=D!#-A>`;qcg@o z9|OHuHoceG+rc5zJRni?T4pqOGKPyzVRJ@g-XKvvYjZ-pk^I#V<|TS7BK^ipiE9i1 z9#bS(i*oXMC9O2E^)e0b0eJr=uhn(h5by)yy---bV}gFg?&dS#vcD2?Pu@G#vwq2( zCR6&qka#*~^1?WZf(URg(RjM4vr(XrT#$<2rgjiUV)F&7(k1uzx~EYg^Vb&zJbdV@ z)d*uKP^$|hD%qjLeAD?l^O58ABtx|qLt?LLM>6|cHtS5v-1-#}2YCe?4slGfz+l2A zs>JG={#tnxtK7!8_E2x*Ld&j=p%_mV>dG%OF$^%i03ynTX7vv)i=#LtU$H!fT|I(4!{x39kPOA>e_IjIdBzEKz5$eg#@^%wJ>Bbt}J0&jn zxZ@o5YbvyAIB%Rd+`-$FZJX!x^=10J?k~Okj(&L+JP6!{kmoC%7Y&9RwEfJ7d&rFY z0BEB^97fZNf%Z4aLwDculjeq}%eEc1+WlhWOO-2`t1D-S#)mAc56^XwYUMtxp6x4NZw4m6n3;VJSbVM2^=Q1q>Y?rf;p28r?uC25c06ev>*xE zVBf;A{KYCH z7ouSBLp%iO&+f;Sy6SUDGujeHK@%#nQQEV_LIz0!WL*Lz=zu6?oWXEsqX`CiK571fRVKM3R0E7=k)*tqJOJlgxt5L&ySd-m4TiY>9sr2vH_> zG#Ie#PD+u8ks5rBWO4rO6vQ+0dx|h-KLg)BD1}Oo7UkTc8REBOzA89_1u0TPL4{e$ z?3iGA`rvnh!lAf?&xTJb?g$JKMLLNY>Zw$4WqiEL_ZO_LR3>d0rjZbh^S^*Ih`3(z zI}7PM#F3*fLrozps)5nxN!;z(z=GI&R@!HtSqsNTb$s`M?|VewopA;{An4OI+|s$j zHdc#G@H+CpgD^xo?Ekw!2S|NTCdMA4h=rKJcUj-;3$Yp!BlT*ZYuI|pEC>TSxoZ@3 zuK%NW6x8`4*=2uYQ2>C&C9U5)Yt?at8LQoJu0gu2q!36I=_E1HW}TqwtWnhk+_jMJ zi$CEW529x1mCc|~F{TuifGaHsrlYP=%;C}i3Eux3*~QtKTQQHJ1QaOe3iFhKB3-SL zcdrlAb-j7HrZvEWx|>ro)La|A5mV8`{t&d&<)Oz>VBl9E8gZ~vV?&N=s)@?^~`Ykzq-@sPCn^#<6LymhZiggPyvMe={jC47mtMzB>iI8IF zB2t5e=UR>S2!FRh6igi-76G&hwt~7&`p2+4-Z*;Ea_)`b=S}{ryu1* z-qY%&u8*7P+$^@SiKfF<(|{N%Lt*#!c@AA zh|L!;e)px$efH+%Zb2Zz9@A`6^egL3G^Ubqc<)rUpH2VQ)z0zEJ#Gy4z?GF!I4Dgp zg!CsVnUOjZ55rV3Gbp~Jjc zp}59}am`U3X8pMLla_A4K#_QjcrY5V%PeS9G22_W{TZ4Gu%q6zA)aw+a8;L<6HafS z1`pFPy1Tu@v9 zU50cozWt5?<~luFBGs)L5z5+l&0>=6$sZsefmAvJSp+0>h4f!BN#+iusdH)P>iQ%4ddSpg5RsyfaCJJMH|!fc9meFbb6k$9glLd{wQdUardQ5) zG$AQUjT_}d2w7`LX$S3HK`FPXilMlD6>Haz?V$EWgr;&T>Jz?|gU?6+#D!Xvngmbs zzReZ=313(V?)cl)vWM@f8sbrj-Tu->jmHH=yQcsaTN%)V7vsez1@fi50;>hYwLCZ6 z9WsU6B-*zi0UPnH7Z%68%stzd#$6+|-IHkq(~?V}H^60;oZr%QNcMYWJp6fOEbjfE zhmKfWXBu{g4J z2GvEf;5%B`5kI6Lz4IUwx~4&a@obwQWeS?3r+D(0vhqU4G3%n2G0GQAZytZvXGEUF zY@D`p&qNzQ3BAAAs!*){HBUF{!q~070=7OJJ`SiA#$Q(dC66fwbz}UeI(}Yn`8UZe zwXygoz;6?(xXi_|7qlyC=8-5-ru3VoF(T6mQ^&Ka{;c(U!7K4w=N_JX>NSm$k6N^5 zJdpDcsKa<~S>k`ju!yYM^ICfYPc;=EeDQ6G17{onHVLG>@9G7t(m!X$Uc0#&{-VFt zOF=TGHQ!N=*MDkoqlH#?!->&@CvzZGOL^099wq+qW=}MSTTQ{9TIL;B-9W^$J0%`* zWwkWkNvXYGPPCwX{uB6WIl8X2?CeqX6aZ`ppqH1MHtKnVsZ-;^ts2eBgwivuI;_Ua zaq3{h{G&33+q!|rA1SU?&x|IiKpU06U#Z<43BM(8yV&9PyDpN0H&k5z2LJTU@Wa9v zb%SPjOOpg{t5#G|khV;N7V4O?=FGj`ZSPO-qk7okbYcJ+HMdIH{Q9;}s6JK}Rr$vE zyBgBj<&e+NBWd|rumye?O~c06E-5!A=f*$BUmwwdjRQFKg^NYK7hZ-=L24T&c0K7p zaa&?#qi$MT;Q@DcFv-n8Fh+085${^70WOkv3HsH$x{1bN-qi-&L->eKJ87_hlLx76 zQeU+}Uj&EAFWl;I5Y6Ri@d>pa1)|XtXk}+MiW3+`mlK>SlNMEi#mqf=z25vBZ!NL@ zdA7v9GONPRsAd&QFf(6`m(5E#9tg{8nsn2tn5U|N-JnfQkZ+BfzS5%fakM-JUGbO1 zCdI@sOlz$n>YlYhu*GLToGA+{5y7J{!e1emV;=6KjTi5r2LwQ*2`Z(!HKh;>9W;GW zl)OUNXRM1r+XK@(9X$NgcE9^q2LLN?Icytj-scN`*7vlb`%C>;J<#!1X=3H)bx*?B z8-xU4nmxHt9FuwIUrjZxWKc2YFX+GHY*twj=~Iu?Tf7J%BFU1&@!2hmOt}0hxHNBu zFO-|Bif_KYv~5{ytUSq1Nn0^L{lwBU^B z6gXEL=-jy|!$jt80wKi$7r059%*h+5-tAItW#&Y{I{p))GIlU}6IfI|plv(ZK;PHW zv49ksR^(s*^Ajc>msUm9umNr>nu0${v_+aml!p!iafa00VyM1X|G~ExTfq#JljS)@?R~?W%HbBSGuXzH#DkQWhiSr$o#j0wF4eAHUl2B@SFL4=|bzGF{mk? zHzen~6nw^q_V{yyqi5t6(8`@tXKDKzz*q7C|XZdVR|VFo6IWU}Q30J_b$wz<{v*M9mm4Eg{osVT(NwYQwYu`I-8M)T|O^}ey+ z`i}h%oNGo3x2*r(D4H_;*4n`AT<3_ZZ7_YALDwp6MCvEigIE6nN&A6Q@}v*!*1;=> z17>OKgWHdK-K91*P4zVl&{{c8&ws{2lU3d}qKD>#o!2T6PDvL%|5h#G0-AgOcLZ}{ z3@uvY(Hw{o&(v5!1s`y7OP6N<+L zLYbXn8J?R66AFm*y{H84_8|qb4ZtZ7ZFiH#FNUyjeR0<}5kSCTFfbCybslMA&3+Re z*B-v}9!D0!_`4$F7DySX%ty_HRz!-7k*R1Tvh$cv%*1~#;$B0rna<5@dGXbl{2}(Y z8yVI})j(*~<)V&t=BOPXmqM-eV(PVJpK6_|ct`HJbTtlpHg;A;A-A5}U&OFIcqo)m zt0qgM@}9>)^I;Ayi(;Fb z4eM>_3mr4Dm$VjbqF+Bb+oaj*c&RH4tpA9j$}rq9xHiqb>NZv+vj&{2OmJAZ%decB zX1zf^m5njp)&r^n1zbaYTVD$yCF`*wgn#H@y#NCRI3pAkHRFQiqGPI$eEVDbf1h!@ z>RHr1Ha56J?51<$U<-A++(6Ad8{h8*Ie=6k@Dc>4^M5uzt5D5>Dd&9T3q($8XUhRv>1!#ui*1j>|e-Oa^}+!Vnj6Gc=XL3Z&A&^K%Z( zwArBkA}-QQ%PRW9@5iiw%BEDNTb9>^D5-?@q%`jssPYZ%@9eaQNuaV|?)}_hP#!g$ zK~zMvpaOBay4FwV1+&)q3&(A0gx>iW^qE8WKz9#}5N%uR?H#hP4U>rK`k-o1#1^w3 zD^uscZZ-T^ViqgsC>lllW?KBs@_n`_ zSwD_1IF8Yc)Wf=Iu;IIJ(Vfeq{!USv+vLv4yE$GGUrG4+pits#smg14_!TnqGp{7J z!w{k!YepQiy$WaWMOjc2s)Tf##~}8PzM;hPBwU~ce$BJ{nf{XoX(UwO3w2bfQwXt5 z%-g#{5ZyhH6HwEPM^V1yE|mCOs^u*&Xp~;@U}%1v?t9{&A-^aL#ya5?6^Fg(eQNYf z@-MZ4^JwvEJDN0p*NEtDytH-nbF%L7KZpH#PXxG+Mz*q}8GSUTEm||aoot5lb+L9t z9l-Bd_v;fsxOl>~TF7N~yD6k>si$oiL*Oy-)lzT#uDg^5+r^fisvw#h-wBS=kAUG5 z;nkk?emWA@3>4+zbnI2-Poz@R6mr5P5?}nA`r2Vm{7pq8m?;6Tr&7o{)lBqPFdp8jp?FBe<|3o~VrMv zGN;ikmzx;cHHN^p?W1ODd?$V^e^tUtzCwP@!HK+sQw*~ zj&2KDqa<0d7RtmyA2QHX5tAn-7B%o6mDFi(P^~w_(oXF1jtZJmS(;%>}z}p*#+acEx+Q6!GeQF zG=Hgh+2_`rj4K;|N=T=Dj2jcc{-|Y^%EDZw(aSxb(Lj7Og0|ZHM=aL^re!hm(?P87 zCxf1y>nZE^NNzT@m7@6N6k6M?)%E$Kf`n~nYp40a$_09gzpPR}POU;j;DbSzGdg=S zUD$TVTvFiCoGNNzY%pq8$57*~vZKu1vKl{t7FfGh%_#9rH%gYX2Ur103`C{VM%lwd zspe>n>sj>tZz~1c+vwzGs+c0|7P((IWkTNxXl(W1S*WkA*rI+NxCWOR>J9qR zgK5!yXP{_mKDkJ&RZ(C1*rG|>8!1W4*OFF+p|O?o$2%L*s{nM2mTAZCi)r#+_kcz% z<@-0ThIK$4HU*z5omo*WEoh*@Oa4K_XSNlIno`@4^{vQ%5CsUXNgEK~xFCUq^V}&r zH$#qzdcNQj+p?2dk`$jL9Z&n2E_{8LXgPx+(Gc>;O z_cT3ar>7SB>=F~&cfF_Xbk}1~4v8A?UA@#2p{ttoM0sCBUkKXEsvLuGCQg|Y5|aVk zB^OXiN=&Van)Y3?orPB=lI>+Dty_cqZT(Wy|CFjUHqQSkRe5Zr!A-w=jPOMRM;$r{ zDY+%>jsdVBH&*OtnUn}YjBEJOI`cnlcap)jc&_?t(;?bZiE55A@D&x4jlQPedHp^` zjQe^o6wobuBR~jQ$v|zW9f^`=@#ccr9EdWT5n!Lhv(*kR*bll-t|o6A?;E+((J-P( z%N@Ks-!?3}RPkCIE==PE2#jp@Ls6VNpRON)=pD5PKZkyS%qa?pPzt~(c)Z1yCEws< zlqj2#M=qgHtW->-ij z1pw=)Soru*eH0CfBGz?_lfre-M_s2jHb!}sIlC#9MlBKiwEBEcz&%Su1WQYOodcMZ zes3HKvhLKW>QNM7_^M6$N^g`Z|IAJNR)6$k{jW!=sRv+TiO#gI%3f{9#8;|cIcqBb zE*M*BWF^z5so_K=xb~Ck@d`N`k!bmfG7?V}N`8aeV9?D<743>9Pphm0u7MpoBGH#l z9$d0l8Z7h7JppC}m+DtMjP(tK&i(r`6b}tTz3o#6>j?gnv51?$9AfDwhNas>zY-4T^-T>}nvUWxux@SaU?EeM6c*ZkeR*6)uB_PmsXK9KzT^#gI<0Bqq{*_jXFxkRG|s8&p|| z?s$2mD{~$7p}EgcFR-75giAf%BL%8Gikl%{Ls|blJf`7c_$Zk<=a-3)^8>G zQ8;#O@uFH_!F~e##Ot~9laLLur+t{d9r@SjGk0daubqSTNrjg<7vD`{HK%&Q>?W<+3@k4L zUNnPr8}u2g70eRCI2aFANRLEm=4@!E+?j~RStaIS-owLi_vj6I+f6NihpLpQ?u+OY zZxgs<5cR0C33o(=-SQY+rV7Q9jq=MPe*S}djM)!hJwVw8PdZPYail6qErL7EWX!F? zb)Uj!8YqK6FHeNIxXTrB*ViIzI2TN~cQG1&;cpSEckZPPJ316Aq~3A01lPsB7npAL zX&eb}g_jk8RP~Cz>C{ZV3AvpejUH`GInh}-ygp10V~i;>Ce_q}iEkoG-V0}aKkr>> zBK2q*>RFe(4Sc#3)3~t&_rvc2`#zQZ#<<{^!Kw9NwptMM5Au+Xxmaf>bQbdPs=yd7 zD*jU(CUCc3N)+WaojRVdzlKRY#hL(hr60ik>}MI!=e?#jsPt7Kd!3zOpsHT4Oi6c$dm--k3h~-cL9yk}&R?j>!^q8qFcDNU0qwCTyh}(j-Hfl4E z@YY@N)Y9aPZLZ$U28akmB>1%4%eJRCrdNiCYo8{UvfX#IBVGnn0$=4h{h1-Tn@x3L zpvlr3PD82 z%F}4yp6Cxp3=7kUp7zXYn)uYPc%3+wKLXo0?3|p{Q~UIp*Rf|Pl2^-knQ)kx=5?3H z#_YHHm#@3_$5d($hI#^P-IZ#J-RAo^lJ--g2-@geV8rvq0*&;{E-&5SdF$(FzUxqi zFm5qr$@=ar9@yJynF!Nn%ymdQy~uM}_SqMBkM3}Se%~J3@jpM~ZGARWcYfIq`8$zxAFfQ!H{iFR zx4XjKJZeF3o%UL3F6X5xFy}Bi2DnwtiOmRJ>i8fgg?f&lWLmFsaK`sT2~nq(a2nmz zqV{E`^k+0!kh9=DAGT1L&hpAJ-K5vT8P8&1%D(Ba*sLdqK1i7Ln4U_mZC9G>8c|mA zksX^$Y~?eCq!{|+|0{E-l`xJ(>(5P#4m>=9ExSWrH6U+MQxalYMBq#Ahw36*@)<2R zd8H<9N!2qS;9$g~WLcFRI^*&vf8cBBXv9zKhjLXlc~1Q*Yuww0m}CoO@YT@gr>Z+l zO@!Rgn}gX1VM3an!%6w1)&3j2E_4(sWcD zpI@-Yx5f2fve_E^ZCq|yUbwnMRLt+bxKTBcw3 z2TFtC@i;3~)@|ag?Qe;$=xou}QXUH3ge+HurZj^mYb!V>pM1J)GVIUawpnG4KmAO8 zq`($sNS~P5pjkU(N~_tqd!8l|5&rNAv%Ty&;dc-Ingp3^`tU-pfJ~lK|Fe^kK7|R1 zI!Hbenf>Z-DQyDB)z%ycXhMF3->s(7|3wjmQAUM%61IAJ%sOeu*awo0Hu98!w=~X1Y%JMN|bVkWr37s_Lu)mQs(u`e6_EA{Lz98Yc#YkH}Xl`f=p!! z@@M81U$(z1w&&}XVDBF>-}%dk;!#8m5%6t$Hc)3Dm7L{Jri+#v$sO!55#Dz*9^RKq zJeqA=qx2=d&KSBzG+8lPBdjMK<4VGbsw-x6NjMSU=C zkK*5Tt>c321LHdH?iVsK^dp+&&>JxW6n1vg>^UISJd>u1As6+jJ zm+_w;qzk@6KX>2}X1tfBgL97%bXFsE5AW-83LB_bJf-c3R-qixsUd_kWu`bJ(uRtB z(2+}b^)biy3(McLv1Q;QQ3=vm+H2rAB~{WN35DG6%XCRY&taG)79tJh7<=W`2m1+9 zj%*%yW%zpWGk?gwD`MQ53`Y80Z`R|LZt~_~u2s3@Ka(yF$|R-k@G`uat~1-^K4Z_c zr|Gs82gfB7hd-AvzNcas{ndCR5bS&}=W|nY?sL#Y+Jz-Z8mSH@D@0VF*AK7=B4=pt zQcjSxQiF~~!q zVA&!IQyoK(-#vZ)(&Kh0&iL<}-cKLKrf9M)9dVprP~K@vUVjbkag#=`v!ECfbcWEQ zU5SA5brA-xKCKSt#_L7At?8b@h5Ms1YTLtAz z+hHKqcY~NyF2x*v5XZan!dJh-xuVH@4g7lBt{Mj@g+XoSpfoh`Ux0w1wC`<)9i*qaEZ*Owk$h4w-Tzplw+xOy!@iy=^HjZKgUjezsP6^V^7P{gauskoG= zTs>X)i^Nlj4wm3=EJ4=wt1__k*aK!8E?@J9K$$`&iAiTIo0|b2cNH-&)a&K6S4~*x~L3aP+AOL&m(HAC5ykxM+fA>%!?rC09Zox+Pnd4*l7&H^`660Mj+d!E!4<*BA9W@lYS zvF~&_R*@YMm%(QmTbxRAWo_QgMSrymV?V03#1Qs|b3A}n*x(Gc_ku?#pWVz<2-Gu^ zyPMV&kPb<#Cd*@?a#SSkR9+s#3Xauk+vd`Vxg2fVaS?#ECb@gqZr4|jHC`T~w8&h^ zz)!~kqlH6|>-?wPdQZZRXXBL(j!E*7GI~*egkFcJDF~`Y(D+6-`LU{Yhe?zKHVBGk zRyI@ameZ?vNm*k!6?k`=(2HfjAe}$Hb9tVwdYw#i4|e zy(Y)=e|Qc5WI%yar=(ne300%?#vuq9fM|$q z#xeY^a_L{?%kS^i9_-I!$%D59GiDL)%o5l%5QsNO6qOLKaT-J@AfU3oR*LyH>k~Kz zgHOM+lxOq{H~mpPPHh7Ynrn(9o+p)ad&psSC{P4rfX_{S<`m(c8)86C8PQUxIK$Lr znuy|V_233e*kN6MudO!X3`+cpmEd9Xg;44agg;P#+0w!VLLCS@@uBIwd)sLks(K__ z>`m)HD0tA1!l85||3Tj!h8V7Oco6OOskf`p$LyQfM0>*Hm^Dzo3_B#xiCiY<@PgzVLNTjT zU~zHR!J}cw-7uCH2`kIrw9egBswmoh2pHs$eN!_y^cfRZ`CW9C=)o~ZfhAds{iS8! z?GdS?)I~{AeXJUz1-#v|PIOy{9auN}Q3sy$J#HprzjWkNKW=v)1rU4{r{nYw<0_wE zoM~JJ$+$uuK}rvl{VUkMI=_*E9%4OVSvPj)N@H~XCME5%+r(ri+lqWEWq*LjAW24R z0o4WzI>b3z;zczkGtgDisy|QqGcdGs1zA_Rgoq+u>hbD;2u^_kJ&UI$aNLa5Uj-Po z+J29d{rikqh2QkCSjSeRrqM1?Qu6@{bSi0)8zOKw*XGRmp!)aLc^ZB%gf*Ci zvvKaMD&RPJ?bzI5G$e8@zzg?oF=Gr#+{KP!TxW)f;jNgrzqrqN=9ds>Dw$!`qyb{h z|J%?YTVL@zaaClD9utFPPM%#0`~EB*KgH=b2Bgxyb6`BVXBU&ke=}EMWLmt4K^bLP z<663yNhgVVYC1v6S(&B2rcB>!tpA>*s zwGC`uL02Y>#}c!}?{|Tqu3gmWTNE2yI}<9#Q+{{wY1$jN;SlU-=IYEWJ{7Zb4%kqB zL;uMnPFnJz0noCyb_%C1@x3<8h_;ufvaNFYG_q`6rBt=aPL+h2pJA%>L@AEOHWElq zq%NmVyof|7YwVB6k+EfR6PSds_-`-3BXr+Tlrc$~Z#Wf&eM9MtIlVDL7x6M%o||3Q z?tcTYS!b#XNIs`5Hj;@+KgX?Y&Q8OAKE5q{}4JN`qs(kghX=q?la zjN;9{7yD}fFg&QfZ%Rn99C(c{nLGDB*-jF`qX>~@M{E5I`(rr67*_ODcJT)V%i+1m zaM_Tw4jNq!B6>+rQ5N)BaWdWtiH_F=i3^vc0I3D zJ4G@OQXt{)PcUD?({9Pcz#_nR^Nwn}hoUI&{#Q^Z`NfyyK(<-fA8s_Y*;KA(B0?mb z8c@WUkb~;HK4M^|7RZh2B$;4a+v83$Gx8Nse6mfOxe3|zniDAV9%$C=m;@*}(_B@z ztmT`O&gz9NE@)`JkOVb^a>_7)h3S-q+nDrAV{^gzF=Vo8p+Mr}*BOv{yh!4DDCH(hcgP5#M7?<)V723L+2J zG|p)BIvJkko&*ZYg9gkhi@;+1V4&V%5aZj!Y%H-t8^ZrTN7F9gi?_K%-g+4w``iqQ z!GDFFBJEfR@(ehm3`~~5^j+Ns#0RJF;Lxjs*O&s=w*SQsHC)FAi1+#A)7x@)iP*t8 zo57|AD%m3EL25tEUvWrV;SNe+V49w#ogBQR!5EE9oxU}f^^26d%MAtDBE*VsMR zx59(aM(RTcUd^w2xg}2kjrkQc4xdI_k{@(0anTC~q&Zw{nf^OcRqx}%`_=!97Tr_} ztqclCPfH!PMy&6|ssF8jHJTG3`j?dpyt&jE2Ikz=uXx?mm0PNOBd3W1BYt>e_vGk< zBIDl_i!Ww;q3}1OsxUUa?T?1(;Ay&=dokrk-IT+)&OyIHmG}!;{ZPv)MtZ_-sli6# z8YTXk(*U)Y$E$Q&eYEl9a22iYdhbSNPg#y;Og&W4D*U~5>`JOmHX`MgluIvcC7}s6 z;kfqqkOS9S0=4vx4DERr)NS6E4B)lP`6BR%G-8X&ow$L^}E%nMrW>*UWDQKeo;^~jcv)c>fcZH=F5-$kIo?uDZHJASkE6c*j4VJ@Q`)L5yJ$`{md}^k1(Ft}}U0jjTK}?>e8gL6y z!HW6;fh=zJA=ztCMI*&%o!y0N_So;Ffo^KRa;!L?)ej5bjcf+nJwAfsSRQ+T1hyl# zPXF2F+!ay%{(b9_&MXw>Ad-}V;E75)V-)wuCwwFVdRuZ-{io2*t?iSHv;FW1LLi%B zV*lpD5@SEIGqi7-8ES9Z#V<}s0bLd_(>y%3?$z>d*!`8zn7pjL;#cYV_f^V5`@1V1 zGa}IjtBYYzdTJjEBwVGYx~TWX%Lx`g?RNBG)8ns4Fvp<%w8dE!*ck3r%D4% zh~ui;k4E-%J!%fy+Wa9VA&Q`cOl2j zBB(_r+<_P^50L~NcGClk)mfp5efgQavJUrrGWpNtwa@;#gcvVz$y-fOuT?pZz@V&6 z6LRTxiPbqV9k-bs)stUfg$pEhbKT{uvQSSYhBCBHh5d!F#%p7$XM^k-<}%%cyv@Zo zY8x5fu32&tDw@5~Z$Yf_P{ zN4m0SDmMb_kq=Dtk|(^MZFRedE_=r7xr8@=k$7tGpw2nMg0ETlf0Oo60kbREf_%AA z;KuKn7r@T%PW9jPKzWh8N1pUssrmQ$A43J&<5vDx3B{1LMf^jh7TbtDoYQ{mz2xMX zrlr*0pD(^rsrM2Py?6ndv&ph{w>DZjufO%%nQl~$0WI^QLr=Rq*t^Pu0n&^??s33_ z<6UoVPVk$^_;Bm=)y3;jgF!jWrkdT}%k>4r(C>(vy-RFvsmia28oOOucEBTg2vZ#S z$S{a6oguskQ#db1+)B67>vjuQuh-*0ph+(4aPjUvFyL!gDZ=Z9@qE9Nb4i4 z4pHQ$f6kRUqFdTAF{eHqf->%<0FHJ2ArY-0y%qGrYP|QdS=cCe0{z4L*$qm+%N9kp zBSkYZRk7^fXy)XoEq9bKhG3{fjCtFHw5KYzJ_3}V{O87K%ZDG#l!uuG)7>3>9G+!f zG5&+7^dvGB%htlnUsFFQuY{p==|%I3@sYC{_!wHDP*@lL%Nm1QDL=56V_iBNaX?+)%IndIc8K!V1|TsY>#7>yNm)V~}PZ zT+o~^YS`F5!W3t>Uxb8aMl{7i9n-Mhj;S8>EVsJA3=|ouC-hOBDy8u zA(BnsK}b$<#nRd#3BY^4xt*4PSU+Fhj!!e0E55&*30FX6^N#a04)3n2tu|ZLfQ5lN zL3@O|Y)Z9UTCRAZ=`{KCa-UNWhXUPRcPGZp{sqI$pMTCI@(Yrzpg>g53w@`>A^&CBS2Jxr%Lv4~Q*&qC+WHF-D z=&;MQeKkQe7H2zFxqitHHbwSCAP?o(O=f7~vUT@o!j&DxH1Ewl!V64RqV#69@hlQnHOVpV8bcO5;KLnd1)T21gF1;l(HDmL&;{onh}G=Cfxu1--TePr$M-oPFIr%P`Z z2XK{>o&Ha7SCE~~-{l2QGAylvu1&IyScO8=!a*4)KkTS${>cDvC{FQg6_w5D!_mui ziM+#}#0a3FqHKP^8#kt82XBJb%kdiP!m{kiBmpQ`hapuNilu?FSc2L5HZ{2~xb4_{ zK284?YME{?mCEa9$cEdv37xBYEQjtb`42i+K|bO>xZ3bYqd6D=xAf=TC=+dk*X*Vo zpsR08f`)p9G6COqMIf@^?q_a%ms&7fIuYVa+;Kl*N@heL|WcJ&;W;KFhu%f zrWFF_U;(Uk4q&1F2Ercgn09D)D$9n{)xn9AkuUInsD={)HQ6f^L?N1UBGkcIXTRUN#4*wh*{2e^N$%_CY@Cl%G?=*M3>DGAlSImTWQV zk$+wtu*DrCfbZ^hdAsn)gtrBx3?-4X1bO_D;B20*po3nbgcJ~0%SvSSg0H?Y4NV*{ z@MzHb+|{yo!m8L)s_Rfv8{~*J1F~7~eTQ9ZZ)LTU{JwGTp?PA40&3w+P1+;6yEr05 z_Z9HQEZcrVQTHx4RufYHidA0vK8LG4p)!a&a$b{!h_0Cd3-2Yf1tq)ZclG~kQs6_H&IE#ZVzD2`0Ou(rt- zU_UkA+0~d_?u%vx;SVv7*%`gCHsmBLTa1>4hMV6iuq0=Z z>8-uLDYyVb!Ut_`mzRr?*kgVIJvui4zr$crt^yU0e~ovwi6 zdEH)zzTMu+^)2U5BC-Pd2*Ws2J1Lj1Ys%j-_H($L;EcBNKKkx93CQnJr@DL+#MXPzZkstS zkJoTE6^)T=5baDDd%NgM8iso~TLqQg{18>Dwvv?{UF})}Ox>@6R&D>B?SOSM|JXcn zZvs{9fQrG*qxuQaZh?4n4X2yv#}$G8l+!)L&@J=*DV76_2fYjqh}cSW;L2?L&`5awiEg@kWD~Oy0i>BrjPS-fv;f$ul1GGw#_s#RE3pJGYEp~Y0#Cy&rX5PykqU_Taoyh2&HC}hMM%2QTXo@}bI_3Dkn9?Th2EZ!_OvFl2Vu>^m7Ditq;Mp!UiqOrp-X5$W6Cv7g542uFfS zHTOJ|zGK5ED@&A3l}J;0PGz(%l2dj46OMxCz8H|VA%$X)_D7inPuH}zl7YTHRH<?E<@{Q)CSP`wvzbVXGw!UvBWjf?^0n>yzwlv^mIjM) z6<8ve^p8buE=nyf^zr|52dJBrhWztdAXo=&V>@7=gLBgpyRh7 znG$Tpd6&407Wx9;pKul>hobd0U`x9Op?_OM=Y_LrnjD5#d(Nqd_lulyb$HuPLwY3h z*oj2}%dE;WEgEaw4i4lizufRp5gk1(MVPJu;Nb=8cMz76JIeQF9Z;`n>LuHHr zmUo(DzB${6xRW!Nc~8FPlg%>1UlSdxVYQAi}}fSkDXBm(!( zoFvOd1O5y`!5nfge1kB+GASKfM|mlizVA5BqdG~skUSS<=WL+`{HMH<)2YGsXtyXc zhU|~zDl&E_klyY?y!tnbigxpfA7J{gGgL;SMU#+cp`Ce3C!ZP!M=&nv%x1zWdPcrB7+EWpzaSl7 ztG;ifKiRVYpE-SoiSjrkO16y^4AfE?0=rwN?I;i7p5v%r~UCAS-KoUZUlRnD!%A=;5`6@ z)Zg}QlJ^#Bie}|g77r3#|J15>TB5R~VwqCUZRZps1J5Z9;PmZ?59Ij4Z4Gvv2)vBu z48};WER~`#Rx?CVe<~xKYaK}^HH#V{G|PM+g<^)pEJr|Wu5(Tdj6^Suh<+`F>X#o~C^c43!M*UprO z9CNF4=3rjbNTlwm>&=HI{(sN~yof;M?Gq`4&o?B?ZSNG~SI0F{h&IIk6m&wU<+>Pg zsKjDxiAv{!_Og8myCZU2X)jU0s_j|`?)z8o7^-{9BB$Co`@Lfb*;{9$2yn${NHF(f ziUvev1#iSn_8O4Iu;@GWC{Xvpbw8uVdu5q)k@v@+x$xC1te@XYc-&O1FTO#G$qY1N zuiJkY9O9Y_p4B}Z9FQPqnQ|4A`$HgYT&>S>5fNWUR8PsW6-4?g7>pwKOuv~sl&|b; z(`r<+zvYAg*al2;4X<``!1%7K7gpU{TMdWCH7D-dOc8GA9Q(t!xdKo>*MW)eTw&-P z2#>?tu?9|F<__twp&g8x;56vvjY9^O&)KaJ|5I84y}AsrA-zh0TBX3WmdT)(|80*! zvpyviE!|u%WDN1 zvykZP15GvAp_faFv^O$Bh#Am`9>t-(E{gjeO_E}j5$x;$wLk#LbO6b^|Cs{ot+*Nl zh&x$r;?=2vZU(?5)Ogas)W9c2KpcEiSz!ThTZTeL!?hp?LnlslRAm?blG8D{W=n8n zsvR8a^T!v z8eLRegdZ4ju4LO&onA>PiCeT{DA@Im?Dv{d5`A@mZ-@U82GGr23~;VZ2dc~}BnBw@ zlSCR=8q8e?v;qQ{Tov41p~}&poESViGguphGgXjV_&t)GWr<_Qyl}TE*naA?wKluS z#Z1J2K%Vw#ggwC5O%UCV`W=Kc$ah|UA)_z@evx)uZ^fD+3>%6NRL=wsM;OgVR^h8k zwS`WK*q6(IMtJFB0%IGg5m|+5gslykrwenE5NeJbp z4SIVp)kYRB`a#rl1Hz9sGnP&J>^KzUt@jCDTZ;!jvQY|>ZgA)AKm2b+Uf}ekLL18g zysDxTtyK2&xPOJ{(%CL!T*n;l=RA>Jf_V0$cHto9ib#@!e@&Srg=mJ3W(XNV-YtNA za)U}NOQEb*2}U=VSC`(CxIU15dOn8KKCf$zT04T*R>`DnG7^f{PA<|N;&8mZK5+Cr zbApIx1rC)ZUY{3_p(>G}GZkKE!vr&Fg+dx4;9bUJ^_T!98G7knN92LCSRAT)G61TY z8E{{#nfyoAJ%H6B(&{;})DZ5UfWbBgW%4}7iz8vTN5vZJMaJcy^!~+@ZJ!k4Yb@d&}Xo502kAc|Be`Z*^e%`%zQ`gQ=e%mh2XdO3J=EU>?W1)GTazV<0{;hGzH^y_u1bBOT&l3Fs*>U zmfy>V{PkxNpx--}ln1-dToWv}{@O_bV7E^gBLU1y{*tosmf*QQP;AmV+f9V6H%1UI z`ITb5`)nF0BXXKY9(mBEVPV#>rXWaWD8WD;3s$Ys%(lVC)|xu4?^87uS=I;k+nOor ze5)2Kf{c7;?%i-SQ7Rx!Hwnj-B z$t%DK7c-#t7&v^(#z?X>#CZY6#8h9-0CYpHYg1?60K*lpcQ{&#=0Po~(<{Uw3}~{N41K?Z&okHt&6Y??3y=?w;(Kdv^Gp**O-0 z`2v8vLv{~?C!|l*|ESNTPqQ*Qiuos%RTxDNV?xZ%pYCXRT2Qq9_t>Z<4?T@G78<#w zbRY%TEK4424&L`s58B2i94*~Ep_GFV05KR1(mbE5jS(QV_}c+}QabWKP0&_|BWp}R zrZ`{Sg4QPs-sjf{LWHjbt=CQ4I=_I%MrAus#bj@?do=DE=hSBVsc^huq6~Hp-vs5Nu_`T-SG| zG;oDyX#^H5wJ43N(58o$8RlJ8Sg0n#)fI^7RY0;8mvZqyquFZE;Ty9!E9Kwlslj2> zj!gQ{ffwpTOO4VNmsowb; z)fWOin|)y65WDx%CV`kPp`}`a_7$hH^b<@lR%FavUm37CW0p@RnS zH3hX%m>o{ueoM$37<6qeGDs7bRj|0|JJO|RL9kHHYWyAez!`d(8t1^5oanFOPb-Xf zMtCP&CP&N8X_$cWRpHJBGK1tzpBQw|W+I`%-n|JiO-zgpF#B6}_q^Kf)dhwX>&@7I zzY>vmXwd)BcK-r@mHj0X3%QHZqyAQTO(jrHI$tsAa;wSL>kI1oeu@XyZ^OzB1Lmg} zC7<0ITe|Rk0GEf{yDVY08d!HXVGfCPjzik83x7%SAI){GkpMz84X<{)KoX4tBIrRi z@|ISVw^lXR{3mlA{8w>%M<_Homb_68GI;=~RW`z zsfxmE5xoC^tTaxhFI5(+37nPt=J4({aHEon*Is1V`ZkrCPo?#r+=0fGF4`nI2p{8V z0ln-XUBV!3$!RCDG-nX>B`@Lvg1yqGWTGMAp;Qz4MUti{Rq8WC;TxmGRCwg2F05Wn zj70%K@KG;JUw_V!{11-4)V4@A>nNAEWVUc8;x;~(C-|vacXRj1S@bcl(+EN3&u;gi z^4<26PaCg_wGgN>1JrO6nJP1y10G#fLLpWgVF8dM-sdNw8o`kmp&h*(pMMkKWiw}7x#U_dmwnzjQs9D*-p-%>@j)w*lo*z5y-t28$f)pBM zKOD%qSUjwDEn0P_U=^sZmW(?Vx3PhyX)>oEt+ExXkzEhpE&B5(fNU~?&tzFUy#;@i zxg*&jm0bp@SDzd0XSwMXBR3k@hYHsO)WNfC5*r!PtmvxmB0sKA8dNAwL2N}inT9@% z+N#YWyd@p&j|tk*t>=kFTKAU489oELWrhF;3`_x8;YYk{4h}pnDI00rcIe+|7>p57 z*_t24C}Gpx@U$T+_3Ikm4OGaMCI|{gDJge-F`z7sXz^2{(-#hL;uj5#Z$8qFEd@Kj zNDtHS70>_|%rJ5$DbTLgT~C?`A8vf3@I^x^*JG^_?=^hS+Of{7?26_>-DLx zhiuwLk$3$X5kQ#ZL>d~8)(#ZXLGtKH%m&<6Egko}-zr{^>w{d;Xxt99CaF>yO#K_j z@9)wne((RBy1E3wOzA^aDku%=qpcbR_;e zy*d#S$qXa7T!Q84UvcR9fxz<-IpL>UI3gTAcVPp&+uM|%XdJyzlqhqD13ta~Id8>M z3FjM}l7YU2ihzQStk59ANNtnv7_tfHF(QH9c(tIRo#_T{G@YLWG^K|uIO7KDF!Cz(Mb`gUu z-)Q;?f|j@F#})75(O1ZvAR6J07&ep$grr48qsIM?c)K2rAR=@rxubvn_?Zoo?)uQ| zHS1Mz^Px86HyZ0vg8|l#y!?;@uCArPHHK|s+8=#~REM2guAX9t;h!C>Ap}D{(PUp9 zkGN$8?an?wa23%yL2s}kY`)j>l9JmyC4c`wF~2`gYV+P}Bhh}-W}CXzm^<+3H4>&M z0LULiMPwr=U-$}@1Xx&c&)Nw0dCz&qO3(8y02=y3T-GS2Gi`{z^qOh;GgzRV|E4+I zkj85d`kxZuq8#flj4|IE_|;C$ISU+TV#I{29f1Q~n14TKM;I)Jcp)$+o5r035=Pd- zwP`w#nJJ)Ef+f2|p{U1Nui~l%#baW}$eJW3LnIGAEiO>O@XE!m?xN;EZZJ`#qoOS) z9u~HVPC6y??Gt*N^TNl?%_>O;`*nt{Pp~e2z*HNRv`zOL6%QhDiXwkMlmHcIHFFKQ z#}6ynf3tf?;rwf)TSBl^x_9prI*R-k`C6^^J-ISmE8H?wF!otoIa{R!{#$Q!0CPN5 ztjg1G%*RB>@wg3_E>x&84_l}qtG>mxRI*LCit2XQqzu+P_!j;BAgUfIe3L+<-=b9k z*@?X09g;OFP^CF)WF>B3=2D_>?E6R90v?@*B)vM5BtTVVg&iS+oqVcpXq6Dj4Zm7U zCfy+Yv-7vV%rLN0*W2QAiR%8?C$0QT0Ysj1iGJx0wrVm+>k8iPOyv6nt2u1~@(!e*cvuSMZMt=B=;{07ODIDQ5dE4o97R zp(ELn^3PPwB>s6VVPv@4UvgK8!FfPSNies%EPcX0;|gfT;j$V_r3U!C(Y{P-Vm1++ z2xVBQ@{ea9#LCKdtIpaHY6oV&D|nG6uFvwhZs`)0IH+*7YtzkIicdLBBxn4Fz7eQq zMkvC7Vrx_w&nz%2nS%LSdx}bfy|~^nJ=C&(@iir5@{U+RU9wrk91&ilfMMaBQs(SN zgHFA|yx{qtR!e@owo~J{sC}Sx`LF)=udBo*wcx6^C*k2WCw&|UY2jK+Z_yrn%Pe*Z<&N(?oh9Z%`zFi9xQY2Yrw)5l+-UO`r;IejC++F!x7U6r)NC6gjpo2{mFW`)+)-%W+pibWoUZISfmm> z%WA1IV>P~!tq1_He=Lv{L_RWrc-mzU^p+B9Fg*M5FgcR%_6 z>b7J@Ca>RG=4^a=+dl7E?v9^Xv#k|lUB2s!?DC9jcyv5mi`~mnxO_zLP2NZ|MTtBn zMtBo#&$Rsz4;qCq(GDC9UNajV4+TiYv3`0ezfqbKNBpsH_*8=W{O%xEqxki@W7vK8 z1f%LpcJbCj+QW}cI~BTb(SL1twV$wHf94JoCUXa}Y4PY9bw419mkPOR7Q`a+%EhfL z6v+u_YfUoGZ!%6+Tecr&;SEZE)f8VQIz&#t#nZEV_rH0RY4IEtn6PQnzCmP0;uQa2M3=MF_q@vkV9V|kZtuCdg)kIDP0*5KB& z9Yj@|c%~U9lMSGrn9e6`^y4p zo}X-8(%+f%u_!PRKwnG#_s9QeG-JB7{H+khwr}93{72mYsq%3(BKd{@+^G$32wAh! zz=H6&*UE)ak4K5q=@L&cYS#CX25}wFyuW*sg|@n@$55m!C3kE+`Rz9zP#&f8%pr**tDS}>Rf0HHo_<(ZNX-W_@Gxmc@#`Z zmh`EDhfbK3pbVECeDy+fJr*31vzfo3hn0M+*|@WnWP6IdSy@3*I>p4Uk2$CQU|&!6 z{fFMvh+3{>c# z={%}fa`M#$j@E=yUjhO4l0^xr=eUfa6_f@-4$3~afAz5R`hfr#N)xYCo~D|#wU|-x zB;i>hmM@k{3V-z)7mRBqsN~z102;kMHq-`rZVFsSjT^DYzuQT-9Jru_Y>WbEO>cu& zkO%|d&UHwbC&Dl856Wh4RcG$^1`f^|jxc4$fYH)vB9wdHiIaSiHCX}%N3#(R_h^ri z@~LwN5)v>(Oui8tX?cA#=(dyg!fnWGQ>qtU>~>M}>m9x#%Fadf>nb|ovyrn_EShfi zmEt%g69#x(e$L7wXn&5d0RG;x6Vnd&b+GR1Mc3UfAT9+~>ltSwk;ETO=^c9`a~qbW zFN4_qBQ2kdVG3B)fp6UZx;I;GQ8PhV&+O4nnip}rj*!=WHAg@s3=&sFTCSp>QcT1o zU()L1Pxp4-odSl5gdzfrO&t7zDp+Il7UHpGh71b-$>d<0-vj}5uy`2sjb{>GD|ZbY zwWL3Sl141oR6YF6m!hZuDRxFXI!Q8~<&nIppyuV}xGsyxo+blC?w->sO&%l=eqc#r zwY@UiR}tYC$xyW1>#!e+TZNXfpcoGWSg1I*Wb8Z9PBI4kHR<^PEEk#V60_r$iRQiI zotNV>P2RxEYji>2J4CN%8;(BA;n0#?zEm{!)^5Kh6WT`qf-)(-BT%}n(@{SWJPUoI z=9N{ol>5D_)xL4YxN7z{k{`H{6U`2TE|o*+Y#}&IDFlX5!eO`s_-K&>6bfg3HJ)-_yUa+Q! z9)uqYF-cXIgp0cSZ8mwtVP^RLx#nka*}f>I1@vG@XU=&rcsY?x3)q$mKmEG?#d&Yg zB2vm2E_Sh-Lu;?aN^fJDaY+I^y0cA3f}bYi?mV0Qxxe!Wd}Nq8JZKQZxLICqpzPil znS&wv$g)?))?Mfmyf_CN9PuS+-u|NFcGV|ouk$7mrqHxCi>egGHNZhc)lOJ?biTc@ zq~^NlAG+<{JbopLC6rJlSVNO84{ve@gU?# z#vX%;MI+F>E&4vGCC&~`8M;(Xp)jt$_x)$^GgsekTkxZ6!pK%7{SfMyzDaGb&^~O|K#rs^3dO(rUR-7K+1o%qnFA5j#ctR(Z>Z zK1d16pGlV!9;}r=XW!0-!T#W*%rq(NaG}sPsnr!4d8Z#5)5ZJ80;hRXW?;sKhdz;Q ze$44oO%wk{bS(uHq08*e&;3et&`7|GwBEwcAMWvYV{wP*bC~wE&ULzC^jer!d#aT3 zZ|#lGLB-MX&J%>9j`4gRAB>-baIWcBtzS z=;NAJTUV_!#5;QDa70DN5t_UZ;*z!8y8>tmj(#{XtpwkW7pCjz$SxUCVY=rh^wp9r z>rTBxGy{L16D4ywD!D>*NlX&Wvzx2RygIx;qw=i%u_14?4&~na+@sBcy{$iXa#r8;7EIg2c|n`W{`vNz-fFurZW(hVhWP#jaoWsYi?9A1%Vjuh5rHEdM<1pbxso zI4-@jH(&8B%Ta7Q1l0xsj(!>(UHiFp@INjuGq?^cbZOR|rM@Ufus2)3PaG4o$AhYu zef7rW?7y)S#?{?7N5}ARaJ$qOtS~Q!H>r9?GP+U<{L3sr28oQ^#4H3R*_rB*q?dd} zUkz_1`1iI77|+!iNtqpC-CM>sUm&0{Hmmv)L(JsTZNGE9mTFvMuWncB9ddI zOF9}WvUb887(6+iWJLy+{A8Xb;{O8|{DqrM7CkX92GbP$r5LXmPFiEeE>IY)5DQ$J zSuqycC>3;V6n#$|J+L!cIXbWkoi>^d9$3ZmzsJh~Yy5sH7k%XXOZR89V=^+$i=9(u#^pt&nzy0pl3;>Se~&=I_I^q3-h zCsfRqly*vY>DxjnGnFL=AvT4qwcodF;srJ4nm_s%B}hmm2spf?n9@2WfWt#-?&uod zThuaEbpWW0rn|sf<)tp)qM9(3X}xr*CP4HuPMVp7GFa&9_>Q%7?k^>9xZN7hP`_5t=rR zu45{TM*L7@{i{7%UT8mvPhH@H~$~Mc;gyIw4KVlkAg%6+3!^LPG zA_B#p9wHL&q|^8%4}J)SWuE)$1ktw))%+aL5E#S~fsQqcj{D(X<=^7;h!dP{>)>VG z7f>*GD@2ro|NQSJVg(B-ZsqX))+BS_FANc{Bp4;GOD?xb&zOo>N-llwc&Zl96TSt{?%a zIryWtW!)Z}Dg~_i5qp+7sU5!lkie>XI~0v9fAYS_EYei>yx}JkSJEM(w4{ z&`cQ*eM)LU-HEo~O|vVf**NdCr2iY)C@!^C-d>fELCfN?kudYQ#sU35>HjpJlQ??~ zQr~-e#rT52ha*PKj%RJO6D!{^!~ZN>xcGkEB;jLy^+j4s;_A{3m_NOwrxYp?T4`%9 z9fSxWBR(g4XY7&nI_5b#xZ5C|J*4q~?Kg0vT6>>vgg2M=H{#w2KXTVkl!av3FKmSO zKXZADE-fs!Ly6krBpLhZ)20Ppr$r#oatcZr4JA`R(=BdEIonv50YG zGLk#W!1@<)jbO=?J@e?(I2R7?X^}U5YN}o7l0G=5k+Osm*X$W5$M|i?rJ5lWtibBh zUAJF1K45p!kBQ1qV2u=%G~#B~Y!rg94fZ*|+^SSMM<16M@PPm($)X4%?>4ieIT@nj zeAKk{2I99r=pgU3Wj}k!wqIG6TD`NnrrJx49MU=>tXl|DG)-U9)|TR}u8S2ojNdY* z1Gvv{sEDy5|E1stgc+ST{-z&OjAbqFuP@H1`b2{h7gcrNPc|CMzNX9}zbU0lGqWH* zu0`;79x$I_+Ssh6_PUN_i(?%-q_0z*b~dzbQXXUFWv1KyE#_O=L{^ru`6;)BOQW>u z-SU!2rqrp@lK7GG+Z07yxWe*(=iD*hh8qfTCIn>vFtaDjJK|UaJ~Ok7@991*fWrs1 z?NvIjtIMl*@Q~=$#4fQ?I-UQ*q+D^`HN}%TE%EE?o?o0X>|Za~^f_Xi8?{}k92Z=m z6NF=bn95Z#TA(^)oDx31Dixa~=yeB9;Eugn7It*_IUG}Bo0qq>TNoHrbDUFUwWB0N z49}fm3y|Rd9u}x%JTfKo@=z-0(YYe>3h#g&?J1S1sxF{_1m^ptwFsvksW_Vo)q1IN z=B?UfgZ`IABZ>VdbV4@8LdJ~y5ENCOAvtz!TBWalcUM;~oJKH(wmYXyd@&CO7eb`` za2d0d&a-v{Z*aHTB>ezz5{1(4wT{OPEc5*CMX(;HeTy#*x%!79{xF9v9#XP2Rm^x9 zi9W>u`2`Tr1@v)kPMb81+yKmf@Yg@rFGy&NJ)~{5X&2Q4tE%z266&S@TWDI_`bkp& z=>6bLxG|-9b&)MfSgA8*c9~wAmd8v|re$^~6ob}U%i_OriE6m?hED_&=2P0fqKqdb zVWxsfAWIVSEvqKV$pMBD7KW%;xrRqt@vo6bU4LwS6ySTIchR9ye4i>6qC+U0=&6O> z&uoas;UNc--B*@DTYMVDU;0zuTz-}_nbD^nI&C5@w1#r#@6ni~1ogV99?WJ}6+$n8Ne|My zP0L&(MBsal79T^kv__HSqe-!6x>m%2sr{}M70kfPX*gC+(r|TOp5}v9-%J53bm@+> zEh|eD=tRdcu2+)*5ha!J#s5y|N6pU2=(|>Xu(=b}1bbm-r)D+-W&J@qQe?5;E~MQu zgCJaY($p*LFd;T-yKapU%x)1SCcGcKJ{sc{$Su(=UJ(BdxRYvlzys1~aP3(*#EuB3 z|Cn(6u8&9y-!gej*^gk*gWa?d-?mS(_+d$cYxL~evlPpp4!lTJIpAF?H>s?dY+cOrJZbS0;ZP$GQB?G{I{80Z;h@(p|9qh?NRJWWyWW< zGz1}uE!9JWcrTg;I}RP6JR5Ge@|Q&ixRl0cjm|AdUy^_Ew_ev;c>`Vz2EX6MdU^H9 zE7<7Pq%E@1pPUKxc{f*h+C$)IcA4wpE9O;j3{da|G-`mv@nL(&N5Pxh;ygK1vCnc0 zDRt~t{l_odG^@h9`=7U`zy8)ArO9FZ69ev%s1WV$xq@wM;O+KsCTdQwUg@syxRRyi ztg>8sI}#nKRah2a!g>`9M+AQs#z+Y?@GhU~ejlL0b@gT8- zViAMdquD!(pfvT02cn!M_9W5J+v{iQtajDZd1(z2$;dPrQJCaTm{;;NQRMrxlK%gDck zN<|PLo-5`4J+xq8lV!1-_YSg_Pl4oFxP}jS&|Rh&`6JHhSu z_gKBfXSUTl`E~@qlCG30qcO<_LpDnJ!%k+gjI{cNhr-Ima|sn4;;BHFc8NoClp9VA zg>a6p=(^$x3Rvk|Y8NTSP1MBf_+Pzzd(BCgJ%5bOZ)plP*;RU{mQ z0WM=rbwVJbtdOQSc=={=G1-BS1k#Q3_|Sq{U1^LaI@AS<351a9q#EOjEeH&%A?$_h z6zz)U3?wBTg!)LyDCacFL$58szPUFk2{u~TOM#UPiCc_9fYZk2E(rctIi9OBwjoJE zA1hHaB0`>2&boF>yO@`ViB+&B7Ni(Sn56fi_C}P5llj1j1kIBN(|)7+&y?O(7Cbp@ ziRgk>pA|CII}c&HwFJbq`YrB4JeHs8sz`4-+REuLf3zDnKx-@?HtmWaziu}|z)vZ!Uz{faKcVyo+1qN}LqkLvB z>r>jI7QJ3{;g{BJIY~<4qvDXZB3V)SLEw)T;~afBa9{@>DwqsW3){}{cevOln60;9 zSV>%69dP!-Nd%R7IFGLtVYhyIa*flzfAU=_lyFjKP;r=H#75icYCB_+tZ8s51fub? zNM?yiaYiG>0@hGI;hx2ki5!D6oWah!-a9gsE2-r+v_v`Ev%A;r1|tB|aOCCO1hc4$?pA;l`CMB&Xg zW5{WVT%$8C!g=I+g3f8*wMF=cWI2QV6uZPJ(Yo#WA@)WnpIqD;6W#kH-3D@Oh=}z9Jiz^yu#Q@W$h_xUwBpy9E zw_g7kwo?e@&P$_57bht?(cYNz{)_es{HSb!ENtWgviWNqOxEuL=-^lBw2G+*dCh(91VMkA5tvyH>mwcENA_WY~fU; zFBeYPA8o-57}a}D`|c$W<6VD#xz^9S(7MsS15@V-7_(!mU_8!tJ{tCve`w0-shT|Q zy`rrYYOUgz49%a3rqCxzE@QE^OFJ>y*qGY5z_1xBB!)*N5*)E|>1WIx^fc=6W}$2i8`cDoDyRQZ&U4 zlkkm0$$ggvXCEMH6TMYvHIsG0fQi_;bA}-?s(Y*YTGd+ju#KUb zR#Su-DQF8&!YGsPmMnDO-XaJD51-0z5*~&-g*8)WPD!qO&O}?LZ+NXB&($;4C4`)u zyWk2@#=fn<4`|yoE(=|>Lll@2aitM!cddQtK zM#dgul6|@ybqLHuTY~Z^8k3dWSDJ$1HXD=n2f%o5;iuJa5PI$wo?kx-Q8jdSEUEw1 zDL&>jGvZ-;RBxofJ^^lLBfbE;ON$^F$}9CI{Scu9jGR%N65+1L`>#*Fo}cZ256~#w z;)Mm%p%tj}r^|2r*oYLb7xKNs^Q2R6X`V52aes>Rv@Yu(lBPu9awRI&#LYFD12>80kO#{;9K?nN|k2+9bw|stCY)ob)8K!uF>~O;p@F5zB<)82iV* zwWE;L+!1HChjSP66a)o zW=Nl~O{?i-EGLsTBYE(6+9C34*G|I)N=4@3%8vwn;p`67@L>BszL5U`H5dJf^uJiknL<1GxVsf9*MR5y-!{qU~FUnx92$#7XVb9X5 zrvh55)@oH(y)Q~|JvA&8VRA-+I|avVnFEzv6?^M1sU~KZZc|U1@X7j3sw8X93fm)W zL03Xg@pX`5N;_7$4=+U{A$%mvbxN*df=L7NZ~ z@x;ncS-vQc`3GuU0Z##yyjS%j@6Gw3B2`csOpy9uDFeaSS-Em|O_KBPqpD{vDRA*z zWL3!X7#RfCcxxnqPJZj=nZB}Vdeqn)l**_6R00}!*&5CEd_bc7W3Zq8Vd|tmm~*5E znksv*KUF=&_fC)gN$}#EO1&RvqN#}E$4}oh>e2_#oWm|H8t8&REp72uQa?>Z>~xiq zP{oO5v_#S?B*RA4B8?nDj9A!F>|*4`FXIPM@gRQAbXe~ZT@_5AEc1$AD*2ydMc{p; zxChip0Y#$ae8zgg5q!z*z~{;jVRCNQbM24kRJgbs={Os0qL4$hOKP)`K7O?wS|L|c z0hJw(HQbpLr-?D;*9G$JT|ou=T%^etK}8o)=q`h$mMjhra!ktZ z`;^o@Xexrn^$>F}hto3EyLT4;Cby%=^iFNi3)HApfYR*1Xxr`7mc3Q=@WM7SM)tz7 zzm<+!&zgZn>sT0LgRy4?&l-_wht!SDEAh$F7=&n_&n}(SEb<=fb@IEEnZ%MDmTJjC zY2eY0$xc7)_(D8_fb!*YlbPy6ht-9|Bt956?cbYf4tp?U;sc-xz^c5kXk~-ziiWbJ zPCkpMl2&cS?cjFKDj5wfEOdV?P_nB_CR?gE2Da9#XX!Im5#945EwR@EYA&OFPvgwS z<05w&_k5LWjtFk)|}>?>?{S(}Quz?~&rw6jHcFkGkC{v%>|-xJK~-jfIw?iikC zbHN0J7c4(AgfdY`LB6Oszw z<_$#@lx4$JPl2>6aYs?Ds}rG=L`e7Q7rsE{{F)SznLzk8cC2xq@V=IPpMW-5$9Y5w zzEwd{|A9D=cx#h16mKR7a%+w?6$*E<6eyvnm#qlE>G(L9kSc6S`bsa3=ybTkk(k#q zM1aL}R#S)-r$xuIeD#;N*zw6Ml$kJv9XQ@q>*biqQ;$M>i3JHa_31l+0}wKCAeFey z0KbbhZW1piO(mC(UhhmJ6k&c6D%NFn5GwZ3b_Tp@u(OrchxTVDr7x}Y~O^59!BsN z4Sf@HJ17b#>uN>-p}G`Y6nEYf^136(kD)6wYIus05)^;U7m6GmIn1BJ7ER1X9FF(| z{LAh91-3AL4{HW>n0TPEv?6a0Wv`VbyhmRH!Up!%5D&RS{Zt+5ZEe0isEx--r%_7| zMqjqwo|uAdxbP8&E(VVok)D({6k$OabGybK(?B22>k$I6%3;V^s>^UwXpnpBvqNg| z1NQ?80LnMYUe3)La4dwi1Kh*Pq}(QkbZnKi9xLr#7xdV%=}pFR09qh+D*DhP-Yx*H z)jcTg5|7;KYYAZWH7rXjKHRdMTFy09mQhn--h+ugTXnQ9^T2kE-0rT+PS+a75d z=leoaFswi9nEumgvGa?nbvmHd!uYX zxtl-V+a7!M^Zv+eRUXL7#j2a36LLzClvqZ65Ljnd3QKLiHxxrDuS=T!n>&nt1saEh|0mQF0f^vzQ< z+N|9+G-|_Me?Z2c;p73ls@t?3TpdYBK~pZcDwWy#=!B_=~I2jr+)YEkVC2S=T}wg z%2mmQtIu5F_fDTsl(e_E_mA?VMRm%v^MBKMsI`EL*RqYt>hYR#VW6&+OHuiX8Zn{NW+=#t1|QWAlX70Tp094O&;Q@VmfCs6rZ!hNJz> zbBe*m24Am^G_7g)Ne~xdJ}wz`?iZvcYTKwSH)?}du>8*N5*hZYbtW}rz-Pvx#_nk` zf_Esp8rs2t<0cY7A66B*YwMC@F(1;y-ia_fVbA`BcxkqA9M~okD$-^hYUG<#D-Jhm z=^mFfFb7_E$mG;nD45pU`^Zbi-^LgXp1FnNN<{^eC`OOM_iN!L;y;vi?KA?APsw#B8Y4+8> zrk4FXXrjNp@AuBU3rMKsXut8O$;XeXn2A@Ep|@qR4!_%DGrNMlIAS_rqA@++pdlW& zDQoJKdV_X(Jo(OVfHGZdII%H0p!T8GFjT|M5f*`jOeQIk_EQos%DL@U6B(@agB+^w z*ALj33b}tN_T@Z*jtj>kL>ohcd5@~yx+T6SAwJb_5WPG7l|5jrRxP0FsaZG7iJ;NJ z*#$9M;zvLG)sD#CbH}l$ac_QR*Sf7}(-KwL#MBh@V)uYlet7K*Z+=irM_~bqL5uR> zcW-_O>)?z}8|V?!IWPJr@sSD9rk6vus|eFO3qbWUS+lKfV7f)>n5Xb)^nN7~;?H3A z64wFyFeZM|iPbnDm=^(SEw&Q{O2$nv`l zP<0^_jgpSujlyjbu}@Tllj|yP-17Qkxq8MlJGzOM%)sS3;)ZlqQZgO^sxID+`C&W4XUsaT8r1btMSvH?FA+sUsaC*>yzc(fn zCG?;wKUvBJ^#3Y$lGqn^^DJd8naeepC6SnDvlk?$(@qyPVP}sc35U;zuA^qaXRtXw zm!_YGDk)}QmWFIt>TCxanb+Hxqy!eK%|k59cF%n`Ze+Ls^;y^Vh**%^%VF+&-T24v zR}H#n7bSze1ug;7oMgr_`c#a@g&~7o`(`|d0Xjm%Nd?f6A`7|vEt2)A*Zk~^3r3FD z*84)RW)WEiP)lLYhP{GGfGzFVQ`foybtw=GBQ{t$2sc_@&p6<`E>w1@@aCBXNUfbt zX989|;VT==f-i}b7)nh5PQt?eE{QHm7+^?r2neZ@y5qDPm<}&2rttrXnYOChc%90k zKTq(M3Rh1R>EfaWkcF?ckc|}i<{Z4hYIiloBAis3Frf}@^Y8g(Mzj z_4wf{_FaE$^lelp>ErBO;>*HTLuCtCv2f@=Q2f357wRs*9Xzpcy;*0`%f!g!|XEX>qb36z$_~?zhRn__q~KJ3=cuy28hWA9XR*nRsut!B-`B)q`--J?y*Y z{K+7XeO?N;V4HV8jh5DhT2X?H3{vG#G(!?{f1@v&jO_e_3h(HumswdQN#Ktfngb%^ zqV!EblIIYXNDUt-v|4@5wSj)GZ=xA?O6BFHe(WRkEUcp1t+ZelqG8Z@yoD1Nk@^lMtB-G$E6_n~2dR7eQQSLOU(cMh>bOwlJpi`I zExu?sZk3rV!nxGNpfjLYFKrQpPJzbj*?D+Ul-1j`k=7l&(gKDaX>r%N?3s4j+WP0V zm$ykcv|Ez&bl=`v>RWi=z*8a>&S~I%X&m29PCilh6hp1j?}p)hjiz6H2fm>f5Hh z0IU=Fq@Fgh1glscr~pCi&94di6QCb$mfNAMkNUHa>fJS{jodu-X=~7)o0Uhmiv3;qr#jXWh*6n)b;(m+s$#MPYXxqV!!(UMUPw*45*YpLSgo1D5Mjev> z;PFddbtVPB%mUJCcew!KyNv=~u>h+I@GgZG2r!M62BR%-o-&%y)E7sgx+g8Y*kSGg zA%MsE<6oo<;K$ZDn@@b)4((Zfn$4RHgJfP|;3nU@T*%C;peZWhB>8Kq&&<<*PNYwC zjNYoO-rW+TGym46ME9c^oYOgmg-K^gDju-9?5wojP3ZsyWxhS3y2t$I z-Y;3%5B4H}w}xVfC4K$xV~&tfN(@9>#Rk05)q zehF={Hk~GfoZHnHAk$&bv}_>&*qz+q`=7ayr{Y+GJ9Jc*dR1(H(x$o3oC*flXIXMt z<_~C`8Afmr=PWVQcJis+(7Wl=mTYF&jc5*Gr77A`lnLCL${uK9>-vjzROg-X%YD=- zub_pWXCbr=r2lxZHdva%gXJ_(m#{hX&0ZbExAH1uhZgT(yEel4ia4$3F~-#Jf5+cA zChC+A$ORqN{FDQBk{x7M2iD7aty++}p68{Yf`F2R(k`pqQKWDEql@hEJi6(*WP?*4 z8?S{ayVL_m*~+0KseD}r`@V~!ZkC9bt6C6mk32~Dh!D`s^#=aDX=YxCKas) z=E~huM>XZeD7ZO6mmG&cur+-UqTF08P)FswWEuKGhcOb{=rF&WZNRgVNpe)r-F^ zYi{zrg0iDkE6&My6(ONknZ>d2csPO9T`=bxF!m%6Pvf!Mw%n_i?IF-pLc$$+u-zxfej|l+E>p6+YNYx;Ky#c7|nZ?YL_p9Y~BECi1I&>U3 zvynyPo+8s{`+-EYE&AhuPLwz6Vi7DK}7R&k=AQTB*#? zkv04vJ>26h+c7hzKya&eF*Sc((|+zyxn*1zx}oav*+%ty0hq2FCJNz~h%@_eSe^cSjO3 z>I{*tqk68YWx1-H=5lq7Yy{i9r4xaIlEMapqGRmf7gkW4Ck<5!sog+gEeL_D{tn?kp(_TjHj zg$S;#&oh4kE#T#*+A1BTKG}&s)J24vpHWPrcUPNN!|l_qL_^&b?)+4lY-hgPbQa&d5OyZsfD=Z($(b8arS?7pd#f#2mNKzplNw69>ChSXNY6(MToh`AeRn z4sVjnuQ~u>~+#gXJdReHzbF4t9 z+xS>34nDL^Va5hzJ982)XKnkc2kxB*F;i-BoqLoUZCghCEH`@2T2n!YmXjK<%ZDC+ ztpIZk%WTqbn+@>z3GpZhKE2;#GVQilSJ(dP5@FFIJ2IwmT1ZT^zq)l4{(V&=##pY= zG*^X_$VkYVaFi36yoLT`X8grc>h4czQVGu6f5-l9=ojS_+qHR*L5=jq^)G>P?Aet*ZA!=Fzu0P& zzLRQRQi1OUBW*tn7$)ocf@Vu!9!SVCorV528-+goN(YiTop2C?IDJCio#N@~6>j zF&Qf6?GBagr$|_1VQkBB+dfGO3^lRb959cgopJP?wV#Fv0+j;BaiYxb&*ubHm@cmTY@#BDx3Ar%&;R6%w)bRLwKKXA(s z`lu2h_-3qn64b=w$7WbU7k>!n%ZK5P-ubshK5)l}^DR`xU4w1n=SNRhiYj16wXv(5i%psULBoA?Sy=>^-Dk?gu zS|+nbF5W;V5-~9@Ceg$NIg_aCwAKu@^fGf^74csfZIfAGyBiX5OD}W#FO2yr#S>oK zy>kVHXKpY}3yy-#2%yn15fJGd$bSM7UiGna-6FTqktZv?Q9Kz2JTc*{vG>eu>#}c* zV3&@e9NoYDZDEi8(G{dG6UW$V9I4|wF1@2g%@IbCAJ-&%WC1H1o4Knh_H6PUbuuT? zL?r@Xxjn~-IxZ|{SRnr|^5{AP*sj0p;j8oW0#2AZT?5H33VWETr|EP1F4v~^Kx*1E z9?pFG*`({81>E6$n1a7=a~ZRgiXKflbQ?a>frJQcJ5^Ew{0c+2hM%|2G1cJRY->5N zbJRnq{2-J^m>NAVOHzwcZu=IR*wL1?7e+NQ-&O|Jv<1pe`G#J^jWBZ_SL1?pGbhgF zbIQPi#+(0hnc{Ui0zZY}*Pn(zzFS9O;aYfb;h`K5R0mee_`nRa!q}Q|JN)M8=N2lL zn@wwwYNlV9nBv2c$%0B?lG+@Aw`zyFPKuu6-Jy5;tea>RuLWK3kQNpf&2bv$ExcG2 zz32!p!P?k>XEg4}k5mMnCg@B3xOT0*(9SH6xPeOPS_--(cGn)8ZOt>@m~CaE3b4hy zJ>Spzxyb6Br!sHHW~jRPi`Eyu3>USGxfg%_lY=DTjfosg1g7naY4faBA8T*;(TyO( zqB2&*CM8y2S6YR_r3UeGTv}U0VSZhR=dqs3kAqMDUE=NueOd&-9dZY9%rGZKQl%vV zONxzbL^t#2Xs_DEAAZxZKhr+_8ycVsj~g=!d_2&j4cFwKGaAV%wd-Qc_xa9-knF1O zJu5^X(*s6&KPXl{@ptMsM5lis9f#gen4D>b5oEnc(g5*IVW(7sO3#jU`3dGNOwB}n zzjG7J&t{ug#i$&MCG9&a%j8W0kK9YA_@!;WLf_FOp`$&|Fequ?pO?x_A6+C&B!lGO z=--=i!~Zz7&}M;uT6}GLB*r!3pMU}wy^@Pm3k7(#P(W23GL^z5WgIf4*%cQRvWn`N zij8rrP;izdugsk2dgT%F*?tLFO^|smRyb5l%@ej#OXexzv15C5&t_$;eo8bzbE<-R z*ujj%o@$~AxR&INq31~(@&VQg+;nn2KWf;Oyw#O=4Q2tYHBdSm8D)1H8b5sxkNlJA z--qm>Hw$2_hQg_CMj^6md~!xWs%~TLrBWp&xuGe8N5V%%dKepZUynfYwtTk8$~BKw zltKY*GWOyZFxxz!>9k+gZpA9Mb^7%9prP`kCe^T+ODf9&tv$8_CgGyRl3Y%M6eYhx z#RCv?T|&K(#0LITCY8_qG>CKE8)Ia)F`=w8<=FGE|0x5$W?Zbj6?rVtcLAKj!lr&M zd6gelv%yK996)yx@Q5PhiBQ|LId3k=aQ|d*)?#7YE3KHN1Nc{pVin>u6`}_=h@((W zB52Dp7m{zHJ*)eMzfxeqoor?Ti!)#jvWrXY2TLY+Vp_5h8d5k_=+bcIU(27T{TyzJ z2e6|we&#(gH_~9uA0K3tQXyKPoB3ZY=c8h>5RO6x;5_U_FcWM0O~LLlpcihquEDyN z%g*3u+j@}exumAzj=m4Nik5+jW|S190BCkFv-s6 zJb{sH(zxlL`yRuB45}#)PsweFUNu6mBTZ5exyC3Jg#G*n)_*Pbf}6V)ZSBEGPy zS)no3LYZuun}}ShMCnC=pA_Q|gZ(m+O!c%btYTAYv;+>0gS0d(AX*MuAuaS2^0{g< zpo2aZHDd!HQ6iNh~fEM)DtzBHt@$2iSJ)u+B&9L zs(@$jwcq-OXPVzpy|9A1Z(JZ13z;}-&(41CcimfINlAE45*YEQ`st0$>l?5cNSMYV1ejIW zZHd7uniK5uZ5bjq_AtDkk$w1Yn7y|MFskiPOye5+mWudA>Z0Ec*&@vs0KB^vtL#ag zyM<3sa(bm}Uz?sRFL~O8cL;*0qQmRf+7a6$xOtW_9;R{(FUVsG%{yPAB45^)7NonM zWH@Wb``W(NYR&%&d<$HYkY^~pOfQns$xLF)(RGvL_lDtOgWfOtSRRHR5tiIoDDFK&YDTpZA0{mKa$}Uoz+Uz90h+GhM^YW%8Vmp5?H5y>YFAQ$*>wPFm)H zqm))Kz}_c~xhOWO$l5GetQ(g4kA5S_INQ(8_ia@J`bmK{P>eh9RhikF=iG>X0TZ{= z!YHf(721V`&y@q5vdCd>X0Ot6>m?1iG3jD zo&QOk(*1j4%$B~UCc$r}7|fjx?Tp-8;NGDRlO)9QO;CMiHd`t9=yd(FwwbWv2$JqBU_4!d$9dpChFzHQc-YjEV!-}Cz=Bc`yj0^GXGTr~?EJd(RppiR> zILlB*?o_Cr)vitG52AVCv&v_UB;C?c9s$`Sgio@u%UeDB>qw?;P|Q$G`8S zX`bfgWH%qZ_x0YwH!{3XDHz&gC8Xw)Q!CDP&5n*fAjtPuMw0pbD_DP}AF*Oe%3VNJ zcM*Q4ooTIF<*E3|M}YME^u*VM-_Ozn94M)sYP|@s)`XdN65q}8RzKZ9#4RcBPrZI5 z;ZLK>Way0kGaA0cKVPo+h7NmxR(!OyP5)WjJl+uowa6p*LLQiF&i#ySRn6%Vx90&R z_JJvz=&q-4<57#nFEC;N{KYR=**b}B0lB&PW?q!^9)E31D)Ng_^sPb`cMKV4SRAG! znDOMSxtO?5xy|<+hTs#&*hRhIB$HPN^Fc)-C&5j1Btkf9TPZ6#%3{kuZcQ3$T-H_V zrn^|^3MI;16wF9w#EEGB7q6VWiN+MISOfLXqtX20Y7XdXSdHA#A6C*}Q-ZA*c2BUS zCnE07lO9`Ft(7!4;8w}BRDRLFgC6vB`f9S=PBw@yXkb-{So)AzbW+A(Sk3l}9NdJ; z1K+SQbuTz;G_Mi&HSa(%u_*(_yn>;zY5W9fwJAMddKY$tCw=^JnzszTRo1_SqeIuc zy)WfDPu~{%Pwa{QUCSw2?^qZ+sHOdnbWXg=+Pps#j^PF~)6*ilkYUnZX%Krq859bb z|8>iQqq2(O`mdXV)?6_c?K~wlfbbvk7Cmb|cz<>;E)lWzz8li69p~OYmgJpl^iA3eO+y=S-4R zUkbl2`)CAXsd7u;8u83DdrpB4u=s#!CEcGl(%uKR%Q17aSg(}LSzRm}-jYB+DUWQn zL;Dt;p>YSaFNN;-D>;OnDOFk^29DlU-h+LZG83@eI2zkl*tf`wc%nqh6~vpitDx9CU;(_YXBG^)xTM5D7L5AjUHoK#A+E!@xWw3mKM*>TWE#v)ltRcBqglaO**AYYL zO>iPT9BhR=-ob(!`7_dj%&H4ZyD8|NQeu{0Z^)5$=1=HWL z`twRV%*JKY_l*y=lr^*AZ{MNP+tzLNIT$J6ByAY#zn|Jk#kUl6j0Cs09Qd7k+GH*x zb#UMlwYma}DA>$_>4|>?(l%d_zgNm;fiCb#4Dynd}4;3u51I)eV zs8Vi_Igy+gWqYRxYB#`|z*F*3z_$p@%&_Mr>T@0}CEg-k<|E?Wzt4!*W=X_9!FSqaWhHz3Bq({rZjn(dW%i#L^V*J znQDt^z?i{~c-$APQ1weXM?N=TBxKmfrgP%Pfzu{U8bD}z1Zqew!DljV980ze$SQ?V z#LB%Ou!)^1{GIr2F;`++NwQ9ixIrT`nI4Tl8#Sn0w$Cr(ic}S{w|y_9BXd*C`zz(L z4V-nT`SrJ%Ut516N8QGl4q>>HF0_hkou}5nDJGZR-Wq^1r_DhLm6rK5JM36K`N5(9 zQ}0d{snDR2d4*8ZB)=BBypcH}2I4X{D?IFgo{2FFVn9ab@RnOLNIV*^oqh9-K-4u?FxFaG4o!CN5b=aaFj6AZ0sFD@A+wqXnyEecZ~6T$W_ z9Qt-cdu0+H7+fQXTOE$$2AUlaE|%StF4NaYT^W&;g4e-*0h*dHsoc}*dxfwu-rqG@ zeIYtZfV;1!tPnL04)hFV@Iq&@?t1ao=o&Ply2A5ZpwkkAY1Q-hJ=3PTrBq1NREIa3 ztd59VKqj&->4$z)(5b>$ojVBU8et3qg6a&Wd`PZwt9ITsPMY*n@O1Dve>Pp6eMe_9{%ymG2M<^=0Hrp`hAwe`!{2P(h*h)u!M!J zH?ivvp8TlTPe1R&2fb#GM8OcN>!MsU1{u0H(p~0_E;-6DBzj_yIzO+S3pc~rw%vW2 zU5_BB7=zyh6O8A1^8hBCJ1Y89wQmgo#y?Pv?dvp1->!i_tl06Cy{g`Jb6zp&o;)^==m=x1 zr07gg>!ke^b*qxuI)ekZJP8cMb~6PD|LWc5Xbs$HvN<>X%GdISNvG_N{?kZw>7K^N zY<0+7T1b4MieRlOaV>g**w>ZjP4@*wLf04`WtzZQGs=pKLFIv~4E0Xa4vZ99gUe;N zTJ(hLZB6u`GYfK5^`b^YHLt0%H;R66*K&n<()WM5V*fLWO67~M#dXb8VG7qwVr4t? z46rh{w$8l)KYg^8t*_+IjHm?J;^n>aT(-tYyJQ;G8~I7xn(1#0pW|FaZPQ0kF=5(8 z5Z%ffpw@h?3WYsUYj^34(~kbLcEZMwc&3><3d6gl)l$McSo?$5XFs+)xYnK?7I0!BCdNKS zIR?-QgAx-+*{i7{97@zTL#RlyNFko?rDgLmfB+3vs4G);3H76&-59?5YSPI1we;)E zt{I|S|F+Ns#)|+fTNhW5s%U67Qf3nO2!V3`y#C*HgCz?ZdVccD2Ko4#B0f7Ebx1Bt z{AaYNBDzSWe!-IF`IYnw4xB&3p>xzEzHqxxkW?YC%>21wB}zBAcu`xP*9(R#kQtc> zdof-%+VHaWZyP^9oqj(2r(VuZeg~B?RqSm#O*lubYYx+>3++aB8E_*J)(W=qAis?0 zheO}(*0w(Y+%Y8y{>rYAW6SDJH}4tY464M*JNH<^(@ZwIx9#qgh1Og}Mq^!7`J1%2 z^kW)@w&vbA>s*$y5MXI!z(KK3U=&M4_)ukmf0*!3Ipsq%?0Ts2sT}AVa@~d8T?Sy6 zf%KHy%YWj|U2gnseeh%4=m0@tePlhIgz&ZhlP3aC?S2k#_)Eu)Gly)k?^&y_JFbZl z)6MF%1>Z`{r#X{nrXS`hi&uci0gTIo85onSdXV$0INeFRU(yQnl3ts#CD~(`;1rfFjhi=-MKI-URx(kPRVUk%t59M z`~jSZhUubXezmrO)oY$woKr42!YC8MbDqykElmrapc!)kWm7w%usCZ62U$tLqfB&$5(?FbzUexJ~`l$QCkGvcPKm=gMsi zR;&jf3}W3kC&p&4OPZu#`fe!G=uO9dM$!_Ixf~^*MO%gEciVS^ab`^_>9+?0x>} z{`G*k7G)sDW|PgvyclB)Rp&m)tnb^kGa5!&kY46xeeJRuM6`cg%uqJBY!LLd%2)Y8 zMOIl??ORn*21x0~oh1TQaPad8-OxptXAe>Vqbx`D-6wcLi9R|VIwFS5Uumo~+!lg4 z{#4|{fo!qxBh=>4a4`8Qu{vk%bWS)vt0N5G^V%47ep(7r83@I_=o*d&*4j1`yX~9u zlQD5vu3)5ex?kSsnWtOzlU_S=Xr^r$ko4LzX`?%DOfL~hQtm|ee#o-8}BqvbrcUmVS4Sl0K zf&e;HvqU&DwNTq^T!$)XVCIb7Uz`bJO-J0bH`r-p71x7v{yx=p|PhL0PUdMhB@K zu+!{8Mm|^*-l^+ClBYQd=k$NvviI4VQP4%QwmLG&lxA8kFDqX`!jf{GaZyGrVX*CE?T(5>5-~#9*8=q$1Pr|*om{W@mRw=O;B z!~uEJ&S}w^ROyS;6r_55ZY<%sOvL>Q2B{08l?xN*Dd*C$o)o){65bm)^b*UBILE~s zQYBS!4$Jg_{Y>s7L1l*$mxpNEA>A=JbXTn9t$gu@i8H>18!FHImtep&n9eplvG@E35N*Rt+tll z`0M<%h0)ws8wNz&KM75XDtFsRmP(Z%Fao4t%F- zipN}HVNJbL8cOJB^8Wr1j|3k8P3+)@vp#48Fu*10ER$jb=u>?>E-mT*P_yCnHm0W=9+x}KZ3u_n$pDrFEa;vS^YGM7WixO>c zjYqyM6>P9QC(+3!T|CtGi@e!#V<+RM_3<%qHU%5x3{5O?B1*xL#xI|sd+Re%+a@X* zXoGp4HKQYpi{;o$a{!NzCM+9@b|&k{tz3U`VNM*9fVzLSj_B&IEB*_~BELZ3kb$(} zEB2ZYy)(A+4ZyV*&Zx^EO`5!d6_HPb#o_1k=w*HG0d)gV6}MF{ggZ_&3YC9;9Lq!5 zv4E`;8t@!1`9d0?bM!gAfJlRj zr7(|_!$+}|7H3Gbzh%<~Nq{^O$D%&l3d#99h&=qfGkSHDRVJeR3K^hw$N+ViL&E4K z2r%Nm#?LJy`7c}a0%uF?g5$aExZ-a2(HNX~kayf@}F6M%y5ZQtk6_1{{M>cPGCl6VRmWXNyddHtiEnB?9dQ(T)M+EM6D;p}CzcKUpP27G9AS`-3ZI}dZ;!OXKWTzg zTU7RCCnGpy|I9uzWRJ8KGR#ZYf@S~Vb7L|W@gaK4F;Cs^Mo#O<{D-hvq3dU>p(uA# zJjyQrV=T2%I3XXag^bOsHN@E_cfrBdGeG)k1;ZFCO`q=z`e)?FzY_!;qEvPklcv-yY5Gq<>qc<_}}n$;zZj|)!M{%i>I zM)zRHQAsN|7CBP;r2mWr1}vP=gT@x1Q{vxCeyr~+5a!2}uy;b`rbo*MAAxO~cG@N5 z6s}w09^{p)ovBKSO6OCJwrdCG6PCs>aj1C3wQc!sgxb7rv+F7dT>XbLEDX(Uj5x%E zZv@$(GwVQj288N=2LZVwXZQ(!^1=->(LKv;qO-tDbnXE=~oLxYgM9zSOh9gO!u;j;wV;Td~;AShWkzg8L$ZmY26NQe z)YU`t%2X<6Y6b*@Vc`A86foakm7j*%9hYi7#>%PI-;hk>p$adokk$SJCj&A#cr_v5 z|Jlm=9n~M}UCCKN-^6;5;3}*e6%Y^J3hS2ZQ{KL$%5c^sj(A{HZ7VB;FR(dcP7`kj z)89S!y7+}E^4khabe2dneDy$#GBWmrWc-c9k28Iun*@+aaa2LvRL7GSn{f5v4nJF| zMazIql`_h^&RWC|$~-r!ps_>{I!+!bba2j1l4)zAh9t4Cjql%r6fMm*QPo>+=3|~= z0JJ&Vu~c;z7tw1ET=CdBUg$ptA0f}!tB$`+yc!-s6?K)V3esStgNfp!MJi^pV<2KG zO#m{myK88r^a_)0wBqTO8j{L~_Gv)u#_54FGyh&4H8*RTU`Rmk^ceO;Lf%&RH>|UW z`YheL5}nF961U)W9`PnY*e{;wYj5vC=VdqZ7xCPX`XY|I_G{U11db(=5X+d3YJQJ& z`^%wD_kTHbAa%V-77m zsn4w&8HMdXI+TBVjM385a1gR%n-nwv`^sN6RKJy;Kr8=co zZxRf7t?@JaEZS%3ApB-K6R6bZxREc>7tHqSImAlzq$V`q zW)=(}Wj(6TQ{*6ggR+B9w&_jET%x|HKd^~KCBxcB6Z<2IX@7x3n$=E~{%nn|m`_Bf z(h8^*ob$aiLoX?%kTI)DuBGJgU;h_tn{3-fWD0k|O@VV}9OpKNJnb0N=F$Jb zm%mATvD|RXvKtYpGiH697PmA$x>#sEPJ6{j?GJW?P?*}#D}Kl<#Fgo6305-ZJG{%J zQZOAJSE3Q`TCaSpNNzWmamSDx(hnEubI?s+QRnFmWr`t1vJGL4oF=(b(#8Xz)rLU~ zy29r5RXOqfUo=~QbCkaWNklorhHrA>k2zkt7VMnX(;*Pyy;v^ed`TFn zPCt{D_4rs6ZP6kCxP9iJ%$dK;I(Zb zGNpXDJc_BsUk2a5)HtN26YWTBb>mVTM;?^)G2m`GC`RBv5pY{0Kg^vNW)~!mv{C4M zZ=s?n`h72zf^7^8AnOE?Ng%e0l{@?>M6@X1X!8}VyS<2#ZvpPWwl!v)5l_-vT#2^TD^zS_kapwT3u z)#*S{fD|V+$`t%FleQ2n_93zxW+y^nW$dOi{J~6#)nfiHMu7l4X zxCXy_;6G4a^yS=s%->#wc$;FG6(^}Zw7KAZ9iq&xwc+q zrqRk%Up2E{*+$#9_7(B=Oo(7Y?BeYO%MZx<_4Ny?J4c#FgDX9>I4|LqhNz?h4)0K0 zC%KA_);GR0s!@q5rb3OlW!^=z=Dg5}Rx3LuV5B_;K9mh8-pd^ow@ zqXegSb!p~*E=v$TML3Vh+7wpjx7}u}>vqnTiGJNK(yS&UuoRgl)G*`D*@6MqU{wDT zSe$pKSswQCYD4(@b##>lT}sa{9Ic!kG4*MM%Z-=a9>1T&0ix$1s4@86vR~t0%^`TT z&V~6RWZc*f8GFAMM28UFyaZ<25u!*W6l=oooC!1Z!ib30ZgX>d;&U*2jT~dyiXQ7# zZf7aW9=7DfX-y3e}Ou4Z26^Ehrs(Z|%e5zOf39`P;YOL;&tY55xP&+G5?B;=3L?VhA zHr3;>mjpJ6hifPmZ_FZAep%BwnIYvx(%3r4vS-rBR#F(zpJEDq&6oN5bXEFT+ZqRJ z!4UN#KRYaonEm!fdRS5={E_Tt_3;4WTL>k{xUM3bTHUPHVXsFiP6wh)2Ix2PZpFGZ z1|bIlWB}?U*?@Xsgt3foap?GZOIC$X`_Ge#Kf1eSq{zy(#fthx@>sc^ibaQhNU6QT z=D^$@C&Lju9B;MW7L}0SaxbYYxz+NP%PUs159`7Ra*Lz=ZBaZ!BzV3+cNRK+ZljxN zT*1iVn}kaF<~C)9&cXEZ4%uX!&C3Gyv|ezf!*=k~1nqmcL8aX6$LyFgfA(GeH_yHs zLEl5sgD^HDgIS_;1vioRZPRm^RTYkSf|2(iWq(aK+< z@_%zUKsAH@jwgorDVQo+3~~Fz$(1UZl9aq=cja^cTXSe;-W< z`3w(a8e(g48K9Jv%uAD1N1Lo71Z#Ye;Q%P&8n&nl?hljs#_Iy;J3-K(UVS%O@sJE? zB({8WP+hQbH;h`>7^eU_iiPMIDcNH5e2TfmM+{0OTlZ+IPYqnN@12)=QYd(%3QEYf zLpPK!YH^}qg{9YeUn=|Od!sN*&CINC$#OPj-ymi2pvB#tiki8 zz-S@sDhDm`vz-)`HubZIMcG+|Gqw!gVz~a=3(@s0+5FKo6r2-xNEIC)QqhH_tiDai zk!5ytULE$Ch5qg*ZF*K2hoSn321vVz7DjCP%PPTI)X#B>Wx0IBqN7Oh@FZe0wb1Z> zy;ugpJe>G_RINv_;uqvvU zRH+wA84seL!txX~L+Q9vta6Qr*c1q>FQmo|QTza;nm$iqT=FHEZRbb{_VVTL=6+tj zJSV0y4o+0te0ZWXtXhG<`M%i?C5{Dmo!Dagj6uy_4wh&Fpr;&YG>VP*bDh(z(G94K$V=ElojN5X{5e+0@DU7j$X{e)p|n-7z5F2OH`3gw&qn77VVQ}&vde#2 zEknd+TK0Ra9c4R#*eG;hy_z$}bHh?Jy5KfvYTsbd-!FD~`bK}fyjOf((L(#+!YpzF z_vIgqShP6F4s^Z(S|#EuqTs>HRLFg^t!1^_Gn1!-z0{`rSbZ>0qNm)I4~A2`JT*&O zHCLK8o?RnU!{(wa*_X*I>YWDmtk7$=A4#J5zBWrx4Qt94Oiyuo^SmE51^Dm`RKq_5 z)*Q()7QRg)MDD&T!;_tJ{!mk&%AJ`v+jAuSAjeD+-f7ACc^x{)SRGr843bJS|R}Wa8eL6ET~Wx$yKkFIC!}aaIwu?NdE2*sFXnj;_|C!mQ$=|TZ zPpx@|RZKH0Tpm(*o4&a7P!D>%oNQ?^StH|xP25FgFV6c-HP-Y(HQWsI`hqDCP#D^f zVTL=Iu|?2=`8*&pLcu2eS2jT^@W;FG#~Djlxo=1zt!53O+wk&g&Zo{9Zg&+_{ky#r zr|w6Msr$v`6rk5Ar3F%xbkR%!W$^E0R#Mvz6SwjE>fbGpHqN>=>g}#0&dSs}?N1|& zKg>jOu95CKK=n7bj}AoB_fj&z07b*~zU^)0*5%8uIYyMQ7`cFuEbc{L3s&$>HZH)! zXZ|sS7{9D1shbv z5kCj5NaSBRCmyI3G~u7sdgb@+kS%=NKIW!vi`=JndG4x8WAg0VehEu_Ru@ zDEo+&x1v@sjs=PzY&1BDq|}?0ha#>cQ&FqLNf!O3?c&cz|K!gO`>r`TFhtpke{Nun zevFg)EFGrhaKJE;QT^wfdIWvU?YCn^gaAu|OQr8U&s{y!b%VH{GI7jf=XrSEA~mRL zEqksVZ;O9tSQz_Y>680{Q$?*P?hJUDG7`U_!5=Y^1q4ePMC*nsn{0KNmS(UtPkE)a z;U&dqI4!Whx7w_~W@)WJ*#J4dv~Nn*L?0WoienfAEmc5lLlBZGzNUOpP6e7UCKb=v z@8<15Upx_=kVmxPB_STreLu-9OhxP)Qb<5v;#cC8XSXg&#rw2yY9B7A!vRQHV8Yj=3;fBoo z-vk{*%-eDb@_4(v@=%9=81ZNOM;C16T%2s|TK$kzVL*1E9}Ai%h#_ju$N;XAqm-+~MlNBA!?tn;?l2J74zp(iDKg|AE46A8p#};F9%~ zfVlxj78iQYv4_wKZ&OcVdJ1kA=rfHgDnhUaB&E|#(~n6=K2U?p2$Rf4Rg;H8qq*fi z)HIU9wOd;-wvfiefcAORK;B`r#oTW#U?qrf781?>L3Sv}FBZ7>p`|FMTqrwR?4h$? z()Dy`jxBnCe4q2Ba&P@YKZIyzN~EBWu`_6FWh+B}0AT>>l`ilv`NT&$UXFb7C z$3!uF#6XZjJpIbyYFReu9@)uk1!dlQAMQlGSeWSG;nZdlVHE*NE7)LmOlTvka4vqC zlv;*bv>I=`!XcDi>Lhef1|vMoFl!3!aJ%nUA5y<~{EetbS*OKMq(o!yDa)=M@GG^^ zJKN43O|};}?Jc&@z_m0NE7zN+-l2cfE=yl!LvDxXMF!h|yAGK|;v-Cz`AdYoBM*?F zUzw-`Bix?mn!Y&`U$)>7dkz@C1lMA^aQV}nOatP=j05RXCO)RNXAO60j%>&nXL#7?ua?=-w@YN#Q5ur0QLi6nZVdN=j&H5;r0W)@7BE# z&(yc8zPwfmH=VzOjnTpVdBZpMT_6ln*r%d-`zu5ywF_4_6I$km8EvsT*Gli*fqrAd zy{TqePa$D$c>52e8bZbdrPSt-_8MP0+9c$<>_CS>`l~4&_d=rysh9PFI(MI{ z^{>&3JhqKg3cMss$)*FBzNd_ZEZ$;7*JjMSW!hyeA&#h`7*y`5;*Y}rT;}uZ)~Lb^ zs_-x4HtC+4DUQiKB`Pq08s!@Mvd&;$*`efiIv>2 z0JE=Q5alP8;NL?;*Y|2uV|DU0q>G{3h&Ze4ADcA=mCD~yD)ihE;bU;|Pmt(9pd8Jc z%)r^NNSt9+g9=mGLF#mf8)1Ad8%MUl3I3Q4B<(^S?FR^m9Ep1|e|8O1#Saf_5s^I! zXr1Rv=+}{qw}zQV`5v#yKmQVNAxFs;e9nja$H7Lu`J=n*ugeA&!55NSl5Ah?w9Ao? zYXs9PRQ^K*(~f=!B@W7^oL8d~4{L&J*ce*lrr}4_!sl}Z_qb=lkK5=zq&O^i%-|gI z_}5y#FPW6Sxz`!P_MCS)FQ=OhmMjKNi8B#1+`NI65UyQBRC^`Ke@pO)AZAu;w;TOU z?t^e=)@Pjjl{-mr#t2VIXl16~>~$B``6-G#`n|M|(V<)ku=3e|?>f~@d-K#m%t~a4 zx|IW+E=~G3_FyP_;6Ft)GE|ysjWxG4&va>h&$6ND$zDL6fj>ry!x{{*eTr<-mM^-s z`4=K?JL>$5rMNTB16c>eEgY3SaG?wWga;8I41dEv_>k-zuYT`*Xey=+8i;iE1Hn^h zX5YZFUz~FuHKAl#v#uiC@mXYx%MaezE%S*`!j7$VB9b}ZL{rwoRcwmfa=r-1J~1df zrx&}>?R*9N#@;(yE}irKf)eR167~|)^H27cjev;+J+xJoBnTHf4>z}=)~p?wqd@PX zSe_-KgvY2uGMutHFpC5GH8v5rDSH*0$hkJMH-A_Bp7>;vJu@g3ZwTG%iJ@S*4b*0q zd=xV8m&H84khU9z33&4}Qs+&^M#B_6vOtj4h$~euYTc4^!*4qJ1eYh*8+#iFPVUV| ze#I(7!^qJ-G-N!LF8 zWJU3i^gG@W`1vJICmo%@Ahh;ntNu2G5x=%|+lCa^lzy<3(sX{ba?kk1}E!FAJD0 zgeS<28?+h;<@TC0eI`>EMCw+=w;)9(XH*%OeEGW&kvU|K$bx#HO)9<@X4$cb*2o7K zD3eLLlbV~iEb1g{`5;_cGedC{rj18FL86EjX%RxJvO%o$b()e4?kM70Fn8u&6w@hX zz5B;{Ev?fI9Dg+r7kw-dZ}p{4`x8Ye#RF$qs#znoj5{<8)>s6EP8+X$psIHiFhS|J zpky+}CPZNxrY1L`VEqW%Pz{-rps>sSe^h;Qd|pq`Z=A+xY}-j=r(t6>wr$(CZQHhO zH%XJmX5-|Z{@(ZA&*%R0>~r?)?ks1%JF{o@fpu?9K`mYI(~C7qs^--rd_!=prl&dc z&jS)2VVrZM;e`38zgXgr&Z`>(pZiiF2K2n2mn%QpdKj%f4?ge@4`Wg!OE*;1-`){^ z;4k>Ux4Jl(Dx$%5m?qSa$37oo3mtx83g2{=m-|6~x78>!O$%J;tLTh%CL@Ddyon$SSCw-X`d zH79GPFe_A9+9G;@r1j0AnFq}kS2@X`Xz@eu?U-1r+v)~{mZufs5)}QhUT4F9ktMUO11uRwlNGcX7QP88E`^fHE z?y7;PWHp+8n>GEjbY>-( zgY@BY^!PpSaWs8&=gJKWRHbOHteDqkyiiG_s*7d_vO#0 zL5=Z(Qji4C6-(Sc7F=I;axXYNCb0AmMY^5+pwi69*k_F{L6a0%b(35-J597XSLL$u zto!Sz%oJ-s6VCJ*;8E5&!~TskhxMJe3v7%vAbWZ@F3$OUpplwV5_2#L(asT7hXWnT zKCUm(Ru3-XqT9|4Zt}NE8j5!@e!jNUpTPVmq@6B6i(wW!`{D1Urtle+tqWj0LYHA zl3Y5o$!|7+Tz~G^OG+Q{p(h62gM1j`jr_xoP|c?vX49KcUhZ%bSZUXNiW<{RwA4yW z+SiwCn?VVksGLsnO;hVzq_LoBh`wx^Y+vGm+?fI2EzJvk2pavU!i7=gpy>W&B<^{l)XeY=S$ZH!hT3M$P{=CEDbF=ep?C zZ54F_Ne%wHn8RNCE)E5i1xP-Rl#@SsDQ)kjfh1!zpegoY{P~uUl0D3MKjTac^CLec z*@17jqhtO%TEPkD7K9;tE7u-Dn#HEFqR79?wL$s+v=Ca4BA3q2v0a5b7y1r7nG`p| zq?JsaYg0EbL8HroT7hQ#%5ksDHOjMNPu{6h<24cAv@bw@@O2hVZaJ}=X(by6QsCV} zMJmbgvf9pZY#tq%$wGYy0O&-XDIH`EZAG4^4ozPS&oWvFT|7>eAnKkoaUaeKO~icR zY~=NbOitXX^T{JNG3evlIB887Q)>iDQ7MRaKB*He>9hKe!sK|dsi8xsXy{YUpO(Z5 zmhSQG%k9ZDv33(SwbIjzY%I=HKQ~dhgI37>!qyHE@Zl-celj#v$ zW=Y(Vk*Xz5qC?C&-?{UKJ6u_E`@eo6~Y?5-I^5YMsI4A5M4=goDW#V0G!}Pc)%8CK@3G`(* z^9p}uA>I&-F_cGA0Cjx5l zV&=}j%D$j73IkGoey!vnnb(|5&a@>IMw0H`zS(VpHw@x|Y zI8{e2PQ1FSDzFcW>EO)|c>W%PgV;3w%BXYqNqZO7wI(Eu8_@+YR~@|`1D(<8oAeT& zARhJY1t$ac#WU=mAj&r#Hpo+7WoQ!qGK1|=&zPZ`Irg1%mzIK*A@TfhkZtuwP2)R~ zkUcZeL=ox^@*@%5fN@Q}pj~eM3#%ue%2~Pc=xU9Kwc@+^$62|I_47U$QPZYW6GxuV z>E|BQp~!odOD}QSESLDtW^AI5W>!>ICS5yOoVthcb}T?MubBUqLEu{!|1O9JvW?0`D_;q+!)WrqeU5_~u#uJ`7`$^7-B|TT4Tu zd>U@PuNGe;QM&WSAflyS$TxRldO0#P*sgpY_BX9gV>ixYdG4uvD$q1Us*fB<_G()$^GC8u31r1J@gykle%$7vN`%Kc|yz$c&e6 ztF>YzJ;9e2Pl5ycQ7V@PM;4?5P4o=U6EQ#$4e_mMLCTf_vS9$)tJ1fewgOX)MZ|vq zu8=Pg1RfQDZZ8bAPR)_7WZQ;D`5004Has~GY;S(X+-#`u!g+#{g81cn(u(Np%zIUy z-K6?H=r^8GJUEAs+hPTe8b{ktHYb$U)n(y@MRr5LF+{OH9XZ0PZTK*E=zHOJPvQj( zQX$xQmH+mFhxOuvURN!NmvS(b099pE8LBP(&-(|&%DRs)o@WlBDr&w>g*%6K!qG#x zT|rS-#)5W=3*jz-rmaVqcs6&&@Ei2)eEgY%j+-^eK{j(_>yJ`_6f(>9fgdQFZjB;^ z#yCNt z7=(oFk!9tha#2$xe5%g6{GD7E+vu@jD3=#?6As;UmWLkLh>dDY*aAS^f5iRp*DOz* zMEisDFyQBQR4j7$TvOE=1QIdWxY>QXr9nkSSJOP$vxNj5LSJ}+{9}=@B3g@0$+`AQ|_ZdR`dPpC}iuTEcu;c56sK1d+tEr^xP+L?2K}lt@0Bom?8r-p_w0 zr>uD!n!8dZJb%21D&pWKo6u|;m>3Q|7^qw!jF8Kjk3S7Yp9(!u^=*W7jFH>u;(5(- z))Q~);USr^blD9nRpg#i|8*^<7VKPL?t5(3J#-NFmV&+<=d2B`hkRY({cXuD(4Smz zx^jReIW8Wf6dv6p8;&+DF>=Q?77gO+V_E-)@mntl%#IJ{i1BV|h$1IO2az!&>AG|J zKdV!reaxw*1?ngBdkhs}Zc8s|KZgKZSs%L9h3w*G43YdV)M94aRB$L`723^im=(r= zoR9$Kz|9N9t@?xOftAYuIc>s?rQb{)TWa$?(2#)#-ZXY@qza<%@QMmdB_`-I`=`x2 z7Y80HyV5oCubo-m2dsNqD3lD_(lhV zior+;9A(*!koPe9t_d8^o}>)n82P>gDpXvffdLN9=Ood8P?e8G9{g)gK6F$hdjL(e z-c*oqHUTAe^&%I{3wnrn+#Ea+H9L5iTh?RPNG9m_q|YFex|dUZ)-;w~eDeHhG5Pi{ zEvyNnub9CjpfDWK%rtYyo`vO-w>5WZJ)TrukFc$X7yDQ#G}-63ysmP=1yk*0CtJb< z=9g@ho2g$qZgAj*6=SpkpFF5my(VSMF;vf1_6b{n&eO=6k+gnOD&oSF%={qb1z)HH zj%Zwt%l_F>u)k5pP5$}n7yJF8lC&zoz6d07RCzc8*iiSaa!z&e93kyk0?Z)hZaix^ z=+I1L2QDIuQFhkh42))=iji1QxqSrs#{d&wJWqQ3*O2B)9+BQTceE}6S(c6Q=)|a* zlD{m&6w(k5s4+h02sncM7r&|1X3!=EUM4>*L;1bi&%F9exnNd}{whO5wg#%qrVF?G zot8scqrCgJlsK7Beatdk`bR-HA|3fhouDBZk)>&qBQ0I7{2=&Ji|avDkA1P?h$@?U z;tqoL3$X^AONnap#)u=*(Opcwln#rOJ_^SX^(S719k@bF%2G@i6>6MX|HK*QUme+i zO2mWitP`+pTvB>BM#_F;zN>oOuH){D&Cu;1USelDvWjNjc06sD2h#aj@{c1DaNC>i zgL9`%^8BO|9A9uokUvdpJc9vWms2>-wHE$+nU%Z#KlI|crXV9J_*z!z12#g4R=wIo#$Maf*@WsPCXt z3n!?X#^5K4aw7y6b>uZ<=^ ze|=4{xaNr>g!nZmm+&WY3iuClz^;v@u8}b*p(w!L!P%4;Z^v$#EF1Rz!6r%gpg0q< z%=Pn5!Z0YJrs;ug5w?NG3iZO=S;eVUhyb%MBv#7C-lzX8j;TaOd&&sY;EdRMR9^Th zpImaC;Eo4o;ewFI|S|2d8{pHiFSc?@ z2|?>P$ig>LStHw6v}h8*H+4MawR&=458%cEwZbZ0G)C_*mca71gU|)W-jgx5hSaB6 zyBp+ar@12-k*H+RR(Kxvy;pG)DSXQm%Z@EQ93(X0 zzXx^v7!MpZM!>D8(i^CE?_wDMDe>*u!DQs2W>hm}@qAzmTa9=Zg@@l>d+d^8M@0&tiSjJ$sL-yKb{^ zp^+~m#}##mkw_b&71Sj$L>K|g?3_eLDx)Q+>exdvAmUJ@Z8eX^hj)nvnnSf5HS)o` zQy%c&48UL*XSjCD<SBRZx&nr8G%RT8Wgsl>q^ z|44Dro|}K`P~(`Pn1S`Q5+kgu)0gTWP76Lo9N*MNS#Y#*`t=3IZxZoDSWEo)R5oFu zv?KAbxg6G_u)Mtm#1%Wb#;>9SL^DqK-^+HKo(u*E49N8WUh-l~-D7%o1?}mm@URPDU{`s_R2nk;z_5`&o{sTjHC;sARjg zj8-gUX}tM#DMaf4>`$2!zL=II_?pf8LJvXKh3Ed04BPn@m5irTgtGBX9RLY6CbS40 zj_g^%Ly2i@vCMoWuz~5oBJS>&maCli;GUsCH1V(!gJ%6>)goUt3Z)Few*pbOtB@_5 z%|GYYnzrtVm%@EfC3y2j`~$4=3uR1rox;JEr+;{7RErAAK0Rm)QPTB5On6*_U*cdb zye7iY5}Jo!7MXW1#|HR5nd+uc@Iq+Npsic3JW!dJXP?~JdDXA?p?5+20;(op<35LL zFtfT67{_<1MCDZ>Ngkc^R~0l2{9WUGn`6(yII&TVrwIv+JN{E_R6&qJ$Fu z8;y{lI3|9BCa=Ce_W?cnBVPTw7WnZU{FL#aiG;)=OohT~@NNO~?ea=+2HsFdmpJ+k@_~_h3RdGEL6R71ss0dsD zYk$^VkdGa9f-ZiFrC5&UZH3p%_+(V<`B=pM zJjSk122)&&@)T68{zgZGg9b&(|D@4fjYBb?0~aoaZn|t@Nxfx_x|-D3y3o&HnF79Q zJpv&aMW&GwKJ$*&adaK$IVe^9My&r~sxIg6MR&jkf5M@8+Yi~dU0cnp+3t|8-#3Gk z2SX_03(>B}cr5_sLl9y7&JfjQ(O~ma`6LHHHbcn89Fpf)*rESqpgY*vv@y z^&e$t(yvrtjqBmZ#Y2tzB|5LQ#v~IA#aESx^4ChdHVlR_h}7Fn%_f7mB>x-c>!qOf zJyf#Sboz5l`lKJS0Rh46|Aw0!U|eFG60!q4Ap>n3l=`L?yG$q&Zg{tToS$cXZLVi+ zxj(<+!5zWSX123@l^7TeZRT({Z&IC-R8)^@8M059*I}mI{S!K%Vi@^y>-nMX&;w`%z@{gi$=}WXfnUb?JF)BxJb+++5V`I*F_aFlRViS&NGnUFyaY(nK(xBBQctjR$1qH!-olS*gQ~mM|pNr1|o7=z--;&EEf(MYhgj z@xeJ>_8dp2_kl|0nTwsmA6Hgoq9UTtq4NsqRnsMZ=ij#rQJGpeMkby`Cc=+{-JI$n{Oco6s*0v*_n!1BIUXFSh9hW2y@$Tf825~0YfhQ6` z@8Sn>*Zxs@-4zOf%bC|JU-S>yZPZD)N1&f-$R>!P7or0bqK*{-HDpcDM%Ya}A06y}I1pMh~+-1w607YQ$BxKCiOb z#`npBEJc%iaf|YRJC!#ARPIJA?oH$GavXKID7ljKMC%~w(Gn$uQAO#f40NE7nay%& zP`gm#F_tz;9>5|}e}6MuCMw8JW`|Uk587!o>B;SWR zB85|=I$G6ex2LFmcvg?Y2tD$k+N`H~tl@g)GXMU59KUi_5x4NPajC`4J7ohy zSBWcitrkl1mRTSZ>{uFny?Ll?d&&-pwVAJQdrBUOmG=b6Cj^jM!6l^9rKIgeoAJRU#3N1r1#@g>tZZAlGcf7%eVUGs zzn6+S)BVcq*`{p&TQVIp&T`HNyOBL^2mV=MQgAZe%|pJ%XbbV=FP;wk z$oS@#Bwe|bZw~N#qLU#^TB*gpaVPR^p&KmNEyf1742gKQ&5VmHVzU(pShPKb;$wdm4?Rer-!wY< zMH2Q1cG33*{>9$0mC$OkT%8Y7g>K`-xgq)%z=w@*^F+>{4XOZkxrIEQ=%k1ck3icS zS7~=OBGDsg0S*i80*68?4_#Q&H&pT4b;KSk)-FWGfpPFW!^XUlErHVDn z{u;kOZ%sqhS@b?O<8Ym_faGdn(z|i+G!}w?03BV$4cinR*7V?`z`8WYRy2CAbjMF} zFCnjt-3Os)MIx!iXQC0s4N>Z`r5M1kN_7>wl)Hgke63AiH!j&YX>N$;H<}1W?rO#8 zZxBcg*PWp^sXUlejzp2MVwRVem%G0jDfsZh5YyGECanKpa_CyIO0j^}(^8m#wTtwu z`B7Kh81jUk)i9ZWK3B03PsS@rk(x$q{wciWNh3OvN^FB_awvd3)>ah7v_ZSoz8Ts^ z0+=AL0;s#TyGiE^w)+b9RO8HzI}~?!DTb4c9R0EX0!1*GHknElTAXE3y$7AavM1y( zQk^WQO=_0MXw?yMhx)=; zkiF$Aql}O?Poldt@84ks_TlR4Pa4eOcU_a^_gdNBk>vMgq;(oA1#4t&t6bd!=M>~> zouC{GskE>pw&+&I2JgBiQ>dh_#`Z_*a_fuaOtpDEI%}2D;_-HLg7lP~GEpT4>6DU0#u#>H?FL z#*k*(TX?G6GOz)ms&O}>N)^(q!0VAt{e;}anQaZqcc)~n?=@9?O+;4m0ge3dQQ%TW$N4^Zl z>%;@%c3w{8N^7~W>-W?nh_^??$@TlT%5n16fXLrl>xk{Eb`Iz}S(#V_^{jjj=tVL1 zg|yN%BRtpzsfq^H8p;BBFlaWiGHE*<7=q-t(k`kE7^js@^)J53ZYoG0tqY?Op#Gsy zAbz7zAnt)t6>B_@V)pm|lvmmu8EL_fck5DRUQ(*QxN=Yj;r`TTzyrBKWcZ62t z=)N2ymUnnTcPUK_xe}#N!a`5B!_WDKY6Z4?K?gwZfc~C$jT=?8G!_!NTbX!m#*lX4#BHAF+?`ES$sMH{j{qi)h8#Bjs^J=uB~zIGW&XadDzjd71yIdcl3U1Y_UgtVms>>VGKc8`Fw7;Cx@@64B}2{o@i=aZPK{EAp0yw z!6C6mUng-wQ`^NexlAA?LbPBYCXw*M3%pQB5_XZ+m=_@Hd$(F8d3B^~ehSiYOxtIF zqXp(k@;eVH60M8ZY()k1XT(I!X@7gWT*S{9!NYomWlMh9p++Sm=}}!M$aSjBeZh|w zJI}TC>jrMby472ii9_u(Jn|d;inA&Wf598bGH~$qbnIp9)={?MwCs+;QPsJB9TcT2lk3SFtL9k0;*AaWclJ4M@hl=Fedqhfwr z>Uv_no@qQ~L~{;_486L$gZat2$_1=P-vzy!{>zs?iII};pxtUa9O-|!EoWyNXSiQi z>-ZIIJF++PaHa!KYRh3wLwDR;G(g^CnmWH1|SGlXxc9`EHE zzQ2{4JvA=~Zv$sf^IN4Lb{c_uzf_O=b9D-#brlPtd$~?KXOQ0XE-b5Z2%i-A?hgf? z96KNSeXlXax|e6x=6V6zWA6)Wn`ce0NU&7??PDC16cDr`hsWSw&3rjp3JBDlu4wdKktkeus}vOvJz z*zik6P{oLZ9ZWxNh@@xjSSRM}@PEx-TN(_9*j$hmi`z4cIL$vgp5 zCuAx}pv)jR)AulpRl?r* zDM%4YO2+iPVf^SYYx^T23t;|6PivROlG!7OTC$`*q9S40U}KpOkG}eSsI; z(BONHeAw6ob3xS^oBw;rlM{zdl@*ZykyoEHLqmg&dWNZ7+-sX5%ry8@|({G!mR|QH{eD-`0pa1QJD7|3JA!J=Tug7j#=T zP1>(ifmYHsJ$ODC7XvonCtFdl21yAwX?F1L;)Z_`*G zY~W{+zU0KlOY`n@ou6?>cRN2GXrJMbe=7azTrrfAo##t)t=3M;qP^TQGySO!u8Rp2 zuyc;et;Oh}F4q0ROm(S!W-3Kc=-Sw28BO(!Xn&=_LFL}t=32dSS^PXXd_hHi1>||? z^-L09Y}OSk?q5` z^OjYw57vl>#|Y0=lJ?3GE9P0+S0OSuP%-6Sg%ffV0?*3#?-RGSd)vUAOb|eQw6V+R z3JbC1SlFG+qyg_e5rTF1*!Hp`j#98pB70xla9?NNGWU}1zH_+=d5_>pO2j-y|DYW% z?U)hyfs&T;cmA#S14p;^v*E z)vf+Oz6?pjk)xy?YNbU@OOGzQe6Y`Nd)`JT3KP2J;95kNTSVi{0RR9NokZrRs*7Fl z;C$jeC|Lr4vOD!av7*N+iDdb({g<;nd$JSiVS8qlRHOR!u!v0^Yu}EIQ-hn5Rj6f? z)Z;m%$j5ml^|tM@bwNVaOM+r}%K^LkrxtXtEQeeo{$=MDI?=o^uVs-c=4i#waaWTaH$%o%TlT0P;?e!3$_8$CPYrwRF zsk#CY5z_8a5|Y&_x~m_6a^GGjw3Y)KYk(iZV&`D4132`4{wGI^``@$G^MSs#0N+i$ zA7(GnSHU6Lq*^oqdktnO;bwAETo+tq<2j>2vI|Knm#OnE{$T~yEnjil&q)dTqG;|) ztvN^Fpau@s$k9*$)zju`qt~-Dr_FZUJfUTQS>__t%WzROz)TH#by5uR1|Gc(z!R(A zG;qc2g6pnp$>`TjIxe8Km&FiXwMkpS0jQcC%{W~CbZuBDdRV#e{EtR`6;L&6Rsef3vErO3Z<+Jshx>Y6b(1+@7YCWW^XImNytQ_PFfXQq6w4X%R~B z4Em{F?SW*JY|D1_*in5gM82XI|Gd|+qBk3t-;07dHTl-%O`oQ_(Ovv%Ch0##SXd$V z_Sa&tt2YC()ir2wt|E3ZB3g!VfI9NLD%xd#@%N^c7hR!#Qv1%;rE+iOV$rv_W-sME zL-!DP#+3N4UfRQmw;sEvHeJA-js0k}%yG+Y3d`E`@9ifxRI?lIAywZxQ3=Oc_m6EV z*VcljMp(~@8V{xj%9`$?Ug@_l(5JvIL~m7@c9xC5%dt}a(W1?9Jn3YCZn*olmsNR0 z;nfl5~tec29sGgY|>av?5ZpUlgAy;oYg*K<8HDEFGNLSVMG#_Z1`Q>E6#tz%#DP_ zwfB;!@6A6#(8Tnw-v^eI_o3Impg;H3L_VK?>l21{ zQ9{CBJMd6UN`Y?SK8>*85a{1lnqPnR@2(9+JSXLI(mPu&bK+`*aVg3XE%ph(Ulf7< zD<%W8;H769-a*e!cmCG*kzcS`$2r?qbCwV887{o%M{BLYUk6t>(?chp1npuCP|)@` zP09gZW8;&d={U2?A!bC+IRt%e*>kJ_f3*kRN56ErWgwj|F6=_zhWH^JvD^5BRM~!C zv%{HS9a0Z?7QBvsaX-L}FlE=^vBW&W9y4EnZ<~R#{J!XqUjd_10q$Aploa$<gdnjH9JX9Z`>1}E*iM_K@07t5@YO5NMC#|hddRhA z(-C@K(=9bl3&@n6Vlu`z_tkA(q{UqNOYPTgDWC7ZI{&ghWW7t+Uv1Q?-0}iJX0n$c z5DOFG{7-b*Dr=&wbXm?S+;52gvZ8j+ZF9Z&^T6wz-k<(BwV^Q1 z0Z1>O7MnkZ;Xs(1z`OHUGfnydUEGi{XAQ>dkC-sg`PVYZtGjJEC?OY+t=^pp*AN>d z$*vcr=Ft7107XVshiHJnyHh?VARGVMMBIe}B932d_x*WqMKzf$19zQYJ1cxfqBemq*F^X{g|VnVhyIdItgpa& zN`XisO1D|f9Xwqh_zp{+g8$wiwm5}IUINrd$&q?2L%m?(L|F65`Ah%KLNDG zA^uexUx=AMiU-mki*RHVV)%*a1M*+Qr$j!)jB~rId1BelQeH4G(4iX+PSBGtcoZ^j$W_FLp z3aXWjGF9tg4O~98W^_yIrfP*2Da$EG)>+=0sV1YZ|!(7u2dk@NaEd5fi$5HL>&TtxT*w$<3 zSNX>I+(CwsTYCcGm9aH{guS;~bm)WgY_khqa~HRjYpVsY`YCC}t?Uf^U*tA$5Y@aQ zU7Adc1v1NI1}SZb;z5p_w_%9T;`}OZrzlvDV&#|buup`TtDbgYuP5B{Xsj8gW6-d2 zGXD1Y63&#gLD}Rrjo*32ubntF&MyQM;;r(5LU?7ELUYO8i-Esnb@or<&TFPa&NE@5 z#|Z;mq=dx0e2h#C9_2RDqq)>I2FSe(X$EmuXgL{Re-=_sFPCqoGM#P%HGUdUmp^%k z(jrZYV^ZBJQjfJ?H+^9ObE+^b|5Bq6+?GnA97VI=9ej3eDnWJ+r&H99*#&l0!y_C; zdPU3o@HNU@s{)+o`*U5WSCAdLZ`M$17+lP1S;9Gu@%Oh~lZ0Tm&A4TCz{>|n+Pv{h zOF>Qizc=_8e&5OO{}e$0tOb%&8(yBw!kPz<_6IfmOY>h@Ipr@T0Rfn|-AW4MXBg1F<+EO&vP&4c<6 zG_P2jJ9RlUuZ)_}Dr(q6g3slS99SPU63fVd+2!bW@!^BVQZj-(9uLTfXVe|yn!;!A zBEEs*wx=xmRwFuwim^K6B%$Cos!c`=9!T&5mpe4 zL(Ha;Veq+QIufjYVXKT17|J8Pqxe=4k4IrX`vxJk%}8w~cbMDf`0t8Tfa5OA4HK~F z57t~E^n!$}@**ChCh(_>IJa4Rxp}?qN@I!I-@G{C_&Z?{W0Y(ibmnF<;jFE|24^tlfW2;FM_;+YW&fLFPArH#g#a+Wb}_Ekx1Vwrt zWo@p8WV12y=^P2_Oal`dTYUd)Ebg7k0GlK$*!&@v$Z%gbzV}mxsSB4Zoi6AXOF6y? znX4!dnXh>BK46XVhFn*DN+If!(Iaf6rQkMd4puxcF)oc2B^p5$`ECdkKaT=M4Mzyrj&y6t!F53dLf?d!Jh z+^N6U`hPSq*nH>kjhTpIXuepu6+=e_-0SJW#u#H>3nzC=YpLoF9V^En}X&E-$)a_XRR4gbggC)ejRqWZM;2hZHHuu72T zoeOs{$HyBK=sQy{8M`t+L!}&I^=rEr#PqytK_+XE$GL+5mxK#!Xg0l84G_Cd)ZMrw z&!rj1=%b>I9vrNOP>?bF-xM2a+^eHg&Y=+FWs=nE^ zRS`FQkCB^~mo%C9;`lli$#T-reFw=l5s9E^AJ7a0k`ba9$;n}m@`}jW zzF_@KVpnkif}>;kw$m^6!AtKe^TFIZu9GJvgq?*kLz1FSYcufBe zH{?u@q`xu6BQ@HCP>2YD_VIpja5jF{xKwSE*35@LmHnP_X3)?%CxhO_JD-&LyMNXq zYM*;1X@MPr>P!om@;xB>uy2lKgP&MbsTCg%j0@6D0ks z7-vJHsQ{M;`}eq`Y7CGabudGFZ=RaQPpz-h>iS9>MPKW)-|xrg z7I8Z_d4^m9DUM!6YBK_Of)v+q@P;g*3!$t3~WvpK_fSVYuIIW1UzqSZt-+xK_g+pvOm zTD;-LbO?)A@ox-zDrp!a2C!3lSwM+Pl`@pWJ?DV@$uPlMHx!>2$&h3ui?us8lk>iR zye7;7O%!tc$z#-NghRpO zxb%ZakpnMob__1@Xysz+!G?3{S?Ms1SV=UC8-o{5?+%qmNd*YFN;}c}++OfjR6y54 z<4wQ}o7tEB>-BKq!Rpqq(Li|mU@ylb@=C*LaYz`@fd-DS-~?z9{nr!CKu`QUZcHw( zG3yQbuUfTn-IhZ@wH^XkSJ&ma!ERB^&qbivHFf?aMHLTVxXCAS9QY!h$N5BXMQ3TM zwvC+v*I;AP)L4nWtS`cT9|d@Q4$HX#6`jK!Mn^!g#RMpd7_&hB|HbOua9O&meTGV=P@^`ikYf0N(7zy5ex`vo>Hl!yfK?(@s~mTo~D zw$b%mm8g!s7zE|IH+L4A55*bufwR8aJ{quXHSw9_RyZ9gfnSIh(Oz{SN!bn&%o02_ zF45{z)|}z(6$dols*Z--!S73%Kk+p*|G0%e-vytjPdt?(OAy5;Em+rB*Q8_+M;2gQ z+qR~1ZSea=9K9U2MQW?_|5ZNT)98xdo-5!f3|NONNilxXk*3xeGbR7KvW#!yr(j6& z{KEuzR>yzM48w7Y3e}sQ+npKlzJ^+&5#Ndts^Yr2R=pRJ1in=XJl?IOW zxJSw!AjJk;Z-j|b@(_1A_+NBY@G02p;M?gj^Z&})7Ro5QeU0_kx;8waw=BKRVJbtSvDD)F%`ZG>(Li(P?8*LbDuVS+ zIe?4tldM@3IYAh02o+0KqBt4_PM-&p$3SSiJCXg*^xY@0W!fh8z}qy~-8hOEyHs;2 zCJ{(?nXFmHUGIwNuC_JtRd%sKy)s;-uT9C#Q=LrLAkC%I>i&R3eeP-dZF*8XF*s}u z=SY}4(k8$18;~9CIu-mbX1zM03Co?#37N&WHc|87>tieiP8Z1N_2?fu`AVLpZLV;f z-^OHT%@)JAIQ*P@TiJ@DEV`3XRm0&9p+7IrLmrn~rJjb>@!x$Ra;X@etimIQAa&_( zs`mnRh;Op@0#>E=@lpD3Y2#GLTODrUp|xypI_s_CKhnbJZG z9^@}Vq19tOnkX)19Y#c$bw z>ohlm;8*VS2+CE{JPT)N22&VT%wKXT~uk|MibfJmHmS94m2cvfL?O&ipKAGS^?HyU#hqJSv zKuCe^KUFS$H(9BRLSfAd$>lfNMdfW!Tw>{)pf|LT=rgB|?K3baY-qdWMbwSuHRv?y_N?0C1r4l->BeE5p+%oD)8q^|6^)= z(}y+*JC9@!?jZOXy;Wk8OtBx%0eX7iKGXVWnj-ovlhaWi0lhF;=lviCBLA6%nB<#p zsOy5f;r!!knofrS^}FK)bli7q;4cp-!#07tCn&>J1hxX2Qil}@D4htd;_C(G-N&#} zEcnmj@F#~zN_#!R2w^cFF7Zv}H8As3@9_{@zPRE|2&adryEDM->h+-DmURTzt{lI| z3u|B+RX`-I1OZ3MMhXAKPG>edfzikH+HC<^fy1w2fn3Y+=SaNrDCEi;L|BMfKo~L{ zn`NBSGp@BEH3%(x+$AbI1+i%dh}tTlhrP?iF}MqAm09fn?^}rtQQ2j!a> z)jy^}0{XaPVcHxA|0Z(Uqn}jtFnW1gBeZftwA2&*X3Mnf?XULED=`cNu(X&F>+-9Z z@W)>pfmqLhbT_{CR#qLf)N&8%_zp_rqG7q^i#-IrB7*2)ewi>ZY(jAjqF;0A=(FL& z4kXe?BJD6|adS2OuMm@#CXku@QBgzlXC$nr?)Xg^2F;O^K7_VoTkoBEOLxl3`*9%; zi;VZIiCJF1di^*Lx_pbPfUdGDud3UV@|n03gDw6Cc3m~89I+>@^bp(zl;-bUG8u!J zAaSaRMbYW{Pl2F#wOtu?Uhc%apTKxm^DbSTn2THOe6n9!9R^CHcb63Cj@USFSW!Q^ z1o<{OCf#d0JQx|~YtKzicC6}PpTGsia$`{Isqx?ZKe+NdM~>qjD=KO*W4@nUi?azp+Awi{(1*M*L5@j`Rg*sJA*UDEX*Wx`Vg%`yJwlfa%+Ar@? z&U_oNUZc$Jz}uCCL2m2~WzJ&LOM3d;A~2Kq)S2P_oF2D-2Xz|}{D)TOrQ^$?q4gzg);9F!0ZT&(hnZ^LBdV*q0Z%#8w7xTyQvCfIk14a_>KTwx4ptDdYF5haunLXAiur)T9KUyX=ij_Z&8xGZd+N58IrW+^A zEYN>td}W*r2m*~;PPaWy#5xOb+w~P5?tu!-6}s-0>)FF!d(kQt8_k9g|@1&XPz*)%EyeP zoMX0sdMrb`PLqH_Jap~91DS%`GB zO1Q>T!osgBC=c^#1a{!`;R|ppl~+9uFsor`KJ02q@B9%s)mWTGOk+#649qE$x0MG0 zn%r5cY>}=dD?FzaoQZldaVF$(jgJjfYk`iQ@$%TB_iFnge>UNsl==P z{855Lll}W(BRSuel>$}F<5ykmiQa_~AGKLR1UvKxm)1I(x_b~DyQFOyI_;-TR$ ze9~;JVuT1_&#h)Y$N=@<1w2?CZJOx^TYWb;mcGSR;jY5P=d4am3>JN}6r;V0b$Cih z|F^_A`Q-$UO~}f?ZgKn$IZNuAFk$*l!vnPmf81uaqV737BHEUY_=2&uJf&uiP5vq% z)mBaa=c>*$ztouF|BAH3^7dnT&*xWkYqP`3VdJ5kNQgsTk5Flks<$#WZMul7_%`lp zBdo8?_A&A`S;NrNz=(>raFF(lsOFy@3E!fsz`XWxW^@M*PIVGVTG;)be7lp*oBD3P z?7qm=We8h3oqa%)Nb;q0_WpT@$;$L+eO12oFD>mW6u4LRN((+D`n>JCeFuV6(eBp5 z`afAXenf;h1s5RM>s1vhFCc3 zoi&|I1jS-qN~{Co&)E%>Ej0HkopCxiv|psZZg6<6HW>WlFp~5_1m6X;RyP=ywhIeS z&MF)jPd_*FvfY0#==ok{Z98XKdx@de&au^e0gi`v0(CMwM^$ac7HNrq%T%s?^FGcL=b>!s;oSxQ`x zSyh`ZDe#e9jm_0oY%|e>rNMX2u~}p@r|F~c+qSywc8N@81*%ts)3hG8Q#^Z~hYxC3 zgp5D&fr?^_TNB?wuZO_IN}o9m>{|R}6qSW#E0M$<#c1;85@pk^{Bz~{y_@KF>9w>f z;~%c&Z7vPPS8)voaMNc7{wFWXPo2Wj)R{qItev*tMwg1?36%Dx``If8iz_q&L~5ko zzqKj zpm7~x+l9yI;SdpwOSS_gCm^335)Wr4mzDFhb*jXKz$5pDmr7^n-XYTL8~>XG(Sx}& zxQq<~78)maD}lawisRX_I-dTz+PYdTWh2pgH%Xlg{rcb|$1NhNL264zQKS5eb&AFD z%}|e#VZA7MRE`9#` z*JIDL!uV%)azxM>Ht6j#QYEMdF}FDZ?o=9MEh zAx$p9W0vPBV1w`8b1M2Aq~-S0@!G)(-w)DxccYjaMnYL#cw`k$mT->eiLiIOoq$&b zQ#^@V0%hAzLOqwqfr6C3hn#elyCm3M9aCX^h_&ZAs!b3M1};*?Y5HHy?_Z98{2n{I zXZtcFqY7$-6g6tAIF_qA-8G1uqiv{pb9iXS8Lk)>yw`kUB`-}6z1Q}pVXq6k)&_hE zzbJXG4f!~UyWOO7sqr$aToN34uWi#_E4cJt?7nM=KiqtH@vAKj@L{O*GTynUj&&1f zI4WwSdh|Z<5kw zZBtH#VV+r7ulUj%6}*fuORd=+YRNU!5oL-*1E*@En|Bw z_R6k2*SyltWy@yuX_xDd+N{#YUo|j=n&p?v7`(&bEdbE+&RG?E$J^gP$#MtbQ2G@~ z9*IzlHpfs8=0S8M57?RK0C>Yf3e`#Y^eu>FD(NCcv2z1B<^ZcbgQv%HR5g9s1Y z4_OtE+ljdooqA5PreWgQHlXKyykm@{H#L^$2gbm(Q6Q~g32uiMSI84zv`rDQz_LLJ zQw&oZLczeolTPxDO(*E#@Nec7_jUKY zSS%4dy*UFu<;A+VY4qQbGZ}sMIPj6k?(06k6!kH*hlM?AsxnDLqK$51 z!*Gjh-mmm?gdPtLfNMF-l|e$GWKY0z`mxcC5RI%&ZmsGV>A*u>LOWYne>V?XzV^w* zf%+7$lA}D%g~6x!x%m!#yF}DuTFd29w`V~;&2<-xAYU=B=MKKg40bL-o?ta&S+qx= zWRrzUeY5E;C0~Z(pk4m;pQth%Ror#iRq}s{g}6foqO8)~uWHHP=s16Q zj*u<{@Q8yDMo5imV|k-Ss`%WNO=`x_4W#qT>b1ubaRx>uL)q^FmXwqk4p! zejd7}avOvHN&7@lGIn&M($fzaTaiJoO9>hP1KB@m+a$lju+$e_l|={ijU63|y?Fz3 z<1f(%Ge@KRxPk;qTYw6=gY|R|=$@LUj7~DiXrq-C2+jl*`A+lI_3vVL%dE+xQ52L~ zF=n-|&%>ibuS=4841ASXw!!$3w$=(Pm(fzT!5tBpG&22La;%ccZ)U1mH_YPNFQ-W7 zAJJ^qBV+(;!hz^Ph;k21*i?|)?T5I^l>R-B*18c{x@**LBm@~Aj5Knu5i6jxQKzbS zq35gR(|+)MI)8IW5bHmv=0M2Um%oFFR_2S1&_tI${A!`qcJ)OmmfQT$5(IM$bi;vU zmZOZ~kuor91O2@&-vSaeqGdlqqm0Y|Zi{z5a}dl&SvGlYoL0LAB#vPy@AfcD!-ZKh z(@=J}t>m~!(CflOBCglGp7g(!lm7P_Y`CBVV;+3)!Il;Odxs_HgP`oDE~0%fobe2P zbP$4*S$%r#kow#&FI16=)nZNNxhwbeOXcsUuh#Zox_5tvDdXj5)L%*Q2*Ot z#J9kx^nmVA)=2LpGmwO-W(Dxs;GY(}sN`mGSgDf!n_zH?#L47BJFhP#Vpu z$y2Iu2WyarbOj&X@|33l89GJsV05BZJ3ib>EIRTsHK!q>C2VvQjkIHQ^OKL%GXTa_ zxi*MR*%dVK(UW+X$Rm*9X@Ru3YhCku;J< z$;gSL0`;}$S>We})Bv9jg1}c~RkzCi$vufB^-TPgC(2vptCuk4KsivJK7@CIywpiQ z1qmZ+ppD5K7=3&B@7=@@A1BS#5w{j@`LC=1#0WI8xd6ma+vqU+55C`W2fl{1D98qX z#jP*qtn#=#cc85K+{0R$-oqa>?=837h8B7RR9jnA9SSqAGrXXOI7*`a;8<^6^HkMn zdy@Pl`ZRYKf60JfwL&%;+J2=^9qj(#KKX#kG%5LjuB>o=l@^b^H&^wNm3hW8O6--&H_h^4Xt2V6`7@l*K& z=#y|WNFggUK@T^oy9i9KFIIl$ycY&1?{t}t6AxGVJq23%y?jr$cm8S)CVAQ!Ba^>e zuu{CP{3zM!uNqPAkf#%{nwugg*cFTPE0m&xKK)q{q#kKuQ zwUnB8^y{QzW=U0*fK()>FH5EXO6(8kt@;E*oN3(}`)q z$T>hD+(g)6e=<((rn@l)*l?Ck693!Lzn}oq* zekx%^22-+JW84luz;8%M==TapBpT3z^2vR>4$YYOi#n<1`V0N>paI*vZXRiKA1;3; zLWcP?t=?dxjz`lJv4DpH&uM!;+duMyp1Bsz%1nG7F)^#(WmD0m8t6aADsT*XTl^MzG7?8h3ctR0i{^-Civax4oyL)g`S8a{i&pNpzQ zRGgtv$-_)_LF$SISKEjs4i;7*m_{H-2t1{$P&Bs(2KVwim^+0@$88bc@b&o;B>o#N zX*7CK7r-aDXK1h^D8$UEHYGr*(RVh5gM@0gYcoaAg&;fqTPj6{5O3p ze354rt52omU(D_1MZKyMFLdRPGKti{&qPQVt%9a~RJ{0Ec9z^}MpH`i;IxE+H=Yu# zh!PzzSVs~I3zK2T#z;WUFvgb$T#@ebXbhf6G((+Y-!bm*FQDp(T$tk zvoFcdGM!Ob@_9(jNY~{`^K>s>E*Ss5xG~XlkUi9Sg!a_O>C^PUYyLq#*Jp}^9@{0j zYqC7rh8X=G8B6f%X&FyQb*tw>NC|{G2~P4g_v8noGby|WpC$ZWTtlC%_m-8Q8Pe+I zj$1kLyxS-80~D5z3gnz;2E7wiL{Q|D3DIAJT% zO%2bVO-+t1o;Z#ZWzI2JOq~^S$;5^(ZPP1{y?F%Heg(Lu>;{$?hD4md>9kQeg^42l z>HWd88l)$wWar80nx#E82CG!_i$=Y1X}Ide?VyBtus=;tfZQMt~{xLiV`0#h9Ta0^+oe5P_EQP%2eqERst zML|QJAm^pMY=c+3Pmm&dAOYF)N`ThJAFi~S>hukZ`$Dzc)|IXd(uMEXWO(H2JPdkB zR8SLNgX0*3CM(=ZZD6@dv5Ch?VQK=AjpWH#nHcROgS*&*$3RftX9_j$Ei#zf7MkUd4{J;S%4VzX0f_8@d()QF zYJL~hl*T6)-KvbqG=u~4M#@@=C8r>i8-ERPcLu`GPj$!Cru3#S1Z_xq+O`Ok5T)(< zpAR^(*hB;p2 zIPMJ&Kg?@4#br#AicFGA6O&yfq+e`@$K5%kZ;EO$70pQ`>vTP3acegu;0#RL1-`;F zbp9CY{1y*l?AW3>XG@X`%`6#sxclhVzkaRYBEsX!Hx%pLPQz5aF27ALw_!LV!ij5x zR3rog{HY-0>)8=KV(+tIUxeuoz{L*hBzV`~LsyREkP(;3FQE!2c*c^`X^$r)kFnhF z`Q}kT6SM(L_6j-gR8=rxL8=Gmu(GlL!5SqsWWOK}q8<|ERQvF~lkMQ)S?pZMCjT5R zSiRXEvnw##Z|+&9VtcAv&>eb*2cstI2ap?x>0X~%#0X@IZ7x)8}&|4h{BS7wiP5SoADjjZBLqv%i`OI}1O+4H`x%V5CQ z9&_tN%g>tKwL`$wl9yzroF1gmIQwA7>w#@Bvu4bG{idllff==%SiYaZ=Z#OCeo;XA zZk!8>z<6`WgGcw*aV%YPi~;-@5w*CxI;q;A6#IVHcADT@7OP|Siu=YD-BO(YFsw4{ zPPOMX?_1o6hUms;v;$TDN?#!5jXBnm3s;XBL6EI^T_9zH?kM8nlSX0kbxymi6^z;{ zL|7+H#|73$l#Q5jCWPb6x{#*>g_B5D>ry+AG$tswpK*@a?eD_kZ1)#K%FO~7#gQ z!~!*|_7HB!ti|ZIlsD43W2xkRZ< z+pOy7Awt*9JLF|lb*D5MWg*6r%ejnLM9gc48oCd!i4R#q%=&qaV&R2BI+en@l#Th^ zn}o3Td~e>lFEwsL;CcaP@QNsOOo;oi@;gU&c1L9}p+hFoPwNm5fu3nN`_{P6 zTs9rML@3)7fK&LPMpCJ>a!{xe+TkdelsfEh%#gmV$++08(71}a=uleg&((gOS|KE= z$Of_~P0MfW^eLR&PT&cWCg!vJ8#ph3Z?Zs~_y-!McSc`Ih(^P0%UFnk+6rY}f_qQ7^KNn$1FmDdfshsbkX?s-;IYJZ z|L5O7UVwd?xbLh`!x&Y-bZays33X(obH}j~b$norIi50KC3OdAX18p&H>XG$*sz82 z+1z*$#4$26$ov2+Y=87#1?dY;#UUA59laOexyjZP@5C4MRB6-$7EMgVA8tQP#ohcV zudn}8GrALGm%33r@pyVK2urjPsVjgej4XNtiDJvXzNxDn5ikgDQ!<7o6tL*giKE27 z?S#Jj9{k*;oib26^IXNb`j38g+62~iv|$+i8ti7`dc$+P956{@D9(3AJnAHG)!dqE zR>Sno+QM2rIQ%SoWz^_~*L*^*z{8D6PhU3)G3#mZepqZ$i^jx8M=znxCEJsgG5Lv; zJO$p+HqDlb%fNx@eJAqjH>|FqfQ5c0;zbVsW}S23D!gE}f>AoVFz;A9E@#ih!F#4Q zlgCg@J4U2bgZ}45^e@di55H38VrK1X2UF(G^mi05cP-d!S`UdNKbRK6Vf-;l9g5(r zVTfkZh?p_PXkxj1{2A6boP!M+_BRieQQg0OiTYSPuEc`DXAXfM{K;?XGOX2#8K&GJsy5Nj+&|Vs&-#*n8yg7LA5bBg}d2e@rT`NpuJi&h89YWXmKunbFuoDP!%BOSDbr!HmIsNAgm=eO*= zXf^|NF{5nULX^KpYRkS=kwz0J?!GQR24~a4Y5hn@r@znNalM3kZ9(%J=NrODNL)^F zMD{N0hzLK=4vvlBL{eY|NrvJf*Y1|z+f|rZR>6u3l6q2I4Q9+9ox1ty%tx&v3438XRTv9WU&|G~o6zpT`j%s>N0?hX31Q)9p1}yA zRpR_s#<~6mJRFN1Y{-2K@+dapH=o#XBu!GmioBoWh@pBq%PkGT>#3HZTJR+Bc4~lO zhv>k-o0KrFZih+sU=nQJt#9YYcze}h?T6d^6wiJfyENFtN>xA$Bs4C1sAhD-UsdDU zo-D(Yki*~Up`Zo>z7JveFP#Si&tjAjR=H8E3Q;wC{qyzzIr6P^#vFQc6?PF;qTknv zCFz$m-PMI)?NHcyt&s&tNpBBhBE+G6zS8vFMj}&6zkF9gB!B`k%mES;OWH>WA1eJ) zSHMxd$=Mh{GVLTieczI@P>H;^B&{xP)P>s*x9LZEmz4<{eKoE9BQA$W+AFQ}mq^{p ziDCW%K>&I25VWde63-N`xzEx}2)imaP5i+K;(x49`nE3N39-!ZDx9wkC>%3f6xRjy zt$2RJ{k~DseB=6f!(heYF@yfE2qH0+mO!T+=78)%A(Jmq!+#627gpX`?Au6OladK< zAgA^Ft-jG=8_k~2oOr6jY#Kcmu{Aa?Fw73{_KnSul6(n;V zP@V$1g;)5^sW)dNhUWU!^ZU!q>-1JiFqxO3eIRo?`#NuoV;z7~e`{X;uSh4NfZ#U|6_#Z)Vlr6&P5_ zW=5IkDhC^x;86&(G>2jscUj-8V>T>u6#{O|L!#RLL(0l)CR1(pFoKMw9tIzP^Y3!Y z=%eC~>})6{tBd9LmjN`MUpwjT{0l7IAm#r}5QFC!Y0kXHu?{8d|E?(gjL|5oy2N}{ zb_v@a+SH#~*TH1dv#={>=x|cL#ch_*N}b!VQX9IVuKtN}w>}N>%yGb!p#Rb|FpeoB zmk6vJ?;qV)dMtTf7k5_KM>-6P3XJblmv1{@jVy8vl20x$J0Q-@R zx-f8+t7r}sc9GXT(GW3?V$f5YBb+#dD*_3j2@g0#jiaA}Oojprz37P1yn6;X%;wEo zC?2E1yuzHazW)L_{t_BXZ{36*BJKO9>C=O;QBpx#c1E>-eWFOilDcQ9_1&^(ko5=G zE<-vv>Z;B* zi@lkIN-7Pc;tDj|;_Zd4aaCxURVx#ZQA7(#Mj-h#<_oq4Q|bGXO`S_0s`O?z^g7nM zmCgkbhwm~LchBuyzT%*vum~v={^ybvt@^0j&ZH1f@#%J+J;RqvOKPx3N9&T9TA*iQ z5p{X@JH~-jScs6^EyrG=SIc7Pll%{(FOS>06W7@4&8Jz%>8kAn!-Dt%!D+FOl)h1~ z1hf|h32#Nw;HQoE)O(Rf4f~ynOT{Y@)(NsvLSgq&_9a{Dpaff*N1w;5=Ra)JnVqJc z)E`Etn*6up{_j59n5P_t`~hRT2|gE9B1f4FJQO(7nIkR_s`sP+-mnih+XnB2i)_da z4hm1mM@t#Z70%k@U!G~eSjH`cde%6nBxB4YWjBpyQ-$zqW9u}V+nY;RE3@p2!ch1x zK^~o|ug6k}zG^Z76l-8)!9=pb#qg1P!NLJQ6h$7KHC{N255ylt_%IArYdhn}0|z|m z&}4cIu!Im&9ut3rl;Mh|Hxi>^L4cIiK^u9HV1lV{sV3pX4&42l`|+>3z|v@bmb%1vS)AYK$f)6IRyD}~Z`B3oKV_*bA;P`!=N)mGbeOeXp z;Cs`r{9NB@A`2U>1rYN?x~F1s#NN@Cz>5E$tl0EMVh*_W=9d-wVu$!E4Ppafd|bmQ z7RAUvI{fr{gv#My%vw6X@-sbeqh$BY0PcF?wE({xW8ql^N)T<^!~RgsQ-Z9CQ8eIWEX3#%y|J zkRD;kkP14Ou-eABg(MlR^Ok7>5x>ZMs{moVwtqsj@=;FOjyG;%VgJ_5uWAsLNbDp? z?;wJkMI)5gLDGH3r0*VGjg=Q~W<)LUHP4BW0g!og42F>%1eDzmXBp#>-d{0R`$>)aW zqr}whvanYwNW(!s`%uoir~6g>0~!pruW*cVIoL*;9Q{o=mCHL{wFtan>apxk)Z_fFMw+|FblplBWa=?3#fiie@m)F_8Lwwfnl|I!|E0 z;7%Xp2F|7>P%$X+{D{toBECtHdqN7;UtcH(HIlBO=VV=~RLnVd-7T6r8{oeS4;oMCsu z?ZC&WrD6%eGiu?v<&$!Vp&lQF2}tZprlNtr!U{jKdme-e=UTAiAs{c+fKi))c)-<{ z6HV{dh1-#Hphc4J6m3J$IhTun?J2NP)*Xib(FLex9=A6Zke)@00=rYs1G(jZkLZV_ z)9M4H=4s7y&SZ$o8RQGGM{PNlM*fAkDHzhiZ&?Hwc0xbyJtYo=$W@+0`W^CvHq`DlQ!qM$xRrtb zJ2fY4x*D{4KogBiC!-6}1S>f!V=x1nl9qUu9*cD4A@=e{Qsh?fOQ?yw;y5FGTm0{n zN8Lv6V0R}~lCK(VdZ~Z)J7Y+B3@OV!Py2*(Yv9?Hh0G9;RW+^UCO)X7qfU-2u(2Zh zef3$XzlsMMmCz-^pr|8}YiqEOwhMvf@K(@M6gwOn8l@0MrFG*5F9jMG?Vw9H&wrO* z-2%HZ!>;_44wWSVOU{y@9y@^mBwb%eq!bCsR0uj+hFEco$sxO5{r1Y%spgJRonjgK zDer2bXXt)s_g#VS`m4v_2&2nK#y%*md$ClzD9AI3youbz6#Nt_GY3BizFrHnZ;m}U z1bP6G0*BJBPbNl~LV4C`yWd17G#O@@2*sG$@x0skW8iNY|3DpwMO)kBtZF-A7R_E` z@M~H1Wn=Uyds1nw#2Y73>xlT+dts8RXEC?2okFBcRcuI z@b_JWs7TRXFiYb`Qj96gT8PiUk77;;YX5b63vILJSr%7!ka>ra>l1<$&8G(4f8wEm z%!ioHuGFRzo_fL4ep!#dLf*f zCZi4YoUlPnMXQ77#3Mh!?54?#A!+pJm!gy76T7+p+Q)DbiWE8Sv=@rJ{6$$8bicjw!0V`v}&j=IPe^~jo z9FWlSYm2CT)<)zEz#%pxxLIM|9tKocd|M|+`-h61@=;>ph2Dl2u5$A02OVPa_ZXPk zp3P94JaAmb+nl%9sZcmjQPbW5+wP1YS8=3Pm7;41JZ_B?5+H=GEp9Yh@)K$*Rin7@ zjRm;MAHrd^3tInJ($ONDhPbCb&1a^K_9`Fts@+`?P1zktRLvEnUl`zA-)75}J3`o2 zP||y#+1fH0gIi51MmMyzlM&KFH2*RoM}W6W>YV9ZIBX;sxvB2(0dorijbfHfM4hTb zH~@hpmdORSHZ&J$_m4Echfzk|nx#oAu1-ejbhZ|mJ^1og$ZU^g#+mVzmM$m9~eOOP%KfdaiGMpcRkw!9p& z>Z%CP)4nwCuY70UOC^!Cr?jgSrExOJK$8Q+ zgd){@($?|_&4b+2LTJoWk9k1w1y)|?o{j_~v}>w~CJyTm5m+bOQo@dmkwubsgvRvh zRn4W~YE*-tV5SPMEO5(PDpCj@K>7OJE*;mupSX0klKTa{L}V!|a9HL`2v>2q@G+-&HG+iGXut-#6a`>f%aR81DyD8D7SXYyTQ%vuDC*0hSm;A@q}CXE6a^Z-_OUq*WL z>J&GCZ;A7JsoRBKND%I&V{u4EXdT9#*dM*f((c(Lgna9p?t{eF_UL zsDn5N^@mNOF!UrL7PNatJgT!8T)%nuJdhl{@D4X{u!c48fIX56sX$|Ws;|$@nLX=N z6uv1p=&vW)s30|mj%Sw3Lp=B|Yqg6}lZyF4-mz9-9XP*&rb+&JVo=Uo>Rnl>u1GKS z{ABnD&V^QRkdTkX-F?0Up!oxUxidEc;A&Gq>nP%h5QIRUtI&E4j9lc@Aw~3q$lRo* zo~%6MQW1H8q`4(HQ^FvB^Vyq0e&^rRGjY~1hQF$}I>*_A6ZdtF3cuMKjQOXA$uHxu z07sZ-NorUgso~(+{AY?N&$7_4mWECEIc`u6W(+r8Ti@O*YC5o5QsD+Gx*Q$opLavu zBSA&}l0_auwC5U@@wc7+8Q58r9%@aUnGiP;SoFFX%$F!%B~*}1B*d)6i}nT{0^3f0 znRkKDI1)98z&%R-ig$HDS_L)Z@n;CFC?qo-VMG}GcQR{?uT(6diS1KhZh3@9yot`2 z-f!dP2Xb5gK8$h(Unngsy8*xIj9Um}8}M;6);+tCJXAoxNj%>OLtJNq@_(q1;uq%? zGlV<1@^3nW1z3DkpRK`fVFfFvhWXoKHZEOql@n+VDDSAnqSSkH2#y{qc2A(Tn}MVg z8^R6@bJSc$u$25VG z`KdpF5H#*#qgGLw>Gq@OXd-o^=)WF7zT_WN`+x~uVZnKnhR@y;l9<{ssQ!8eZX4E+wbdt^-4m+fzY;Rq1p zYf((%U!JCin9!s_Vc>hWddg z;bQU4?u(GqmA~Z-iSl2YWL)xt_>`PQe3}4v6wzDTv1~o-#}fYz@z&+Ax<@xmXe2}W zT=uNyrL3FVB~e}xqU+WH%bn4a^3}?HRkpwy5xiwvjPkp>1RSraEhi#>n9{a04J9wh z!}!LqZvn=@iG#5+o0 zSz;?UzKBx#8j=bo#QSpY`Bf{o#jh&{B3^8lcULE(rV%UxE6k4nMrFNJrP5?M8j`ZR zV!SAu`jgJ|UJRTBsj{*D1@~)>$$qp9_)?Du9H^>;{Kl*$H~3H&gM-p@v0saOvKW>1 znz%aPvE=bQT!UcWVRJJK-WiVZ|CcOXoy5VqHd4k>TdnAB)})iLWF3^L9mG9X%o#qg zb$k%PBQ*B=zQOYY5y(QT?fQQTyJlk(B$&qt6#Yxy<_? z1FEX?^Jv^sazKLJ&ez(k#xM$5u?@Cd8UuAz*&TG86o;fg^$wwpO~W#J5Ve2TEq z)HaTrL|gIM7UESuR>+ev3R;L7y|9on`<)Hd`Ncf?bV>5+UweBpD}$}7RIw4A70k(- zq8apQm}`=bMSaX`-B;*<-}Ob3R1%()j2Tu%H-j<>tP|5bYtH_0t^pXQRMOc$UQO4G6 zo)IZ0%5)9f;*Y)8#`sb(!P>AF!qOwx4Li?m-LLxL5=j%0h_~05SaI9%LyyInPYke( zoe{w2NcQZ%FS?4Zu=Yn#cUnKS5?t}VAK}0hrcq!yl8L{O=y<6>SR`iF#Pl9yOT1ym z*pij`3*nY*OUcNZ69F?aj#pp;pR$Coqi;0!3A69b)j#zq=mYlCiY&VZKJ@}ubb=uT znQWv@bD)CEO+w+xwXYq7!`FdQLfi8P}L_sywF|q9)G}R2f(wNJnHJ!#C zj5l6bM=y}=0sWUpO&si4aEYGa<$4ohO1a&}AktlrEb_G82)N8Xv4s>-1oKN8On`hI5j6j+A7h!Id}Rl%3nKrR|<`SU?w zfT^|cpx&>e=cVVcV#PZ-R)rQcY2^@K*k%TS0(GG+**M?t>Qy1_HC)g=gvEJ1Z{aNy?3=|CBuucD^txoHens|a#YC}{+cLC&)1<^ zVq_f#R_kc~l{d-YO<|%S^4}-c^+yFHN&dMZ&dc=vyI#@d@UlCUy3Vyly_&?qFCDOm zlSxf#$^?@Rgid`0t| zr6~Ut9JbM5Dn1^7C+rk$!1Zgl%{T43cu&VpMofNr8E0^bXX?HiGy|dz&nhXUOF*K0 zM6M(u#0G~>48t!zKJC_8ao@#g$0dwNu7652OxgwpKOof3aCdvPNt)uS)nYxCkCT+Q92-5+}1Ys#a2(pX$M}0lUnB%9#avG->b(c8Hq??R20? zuC)RK&9Ma3R#&>-FUKO%z;B$I@M@4X$y8U8b$VQrSJwMEr!=HRN_&rYY+R)i;w&ln z!q5z&$Tx~!=-IV9_2biIvag(-v@?aq1gP2KLEYUrCeI~e|HXUMv_qH-qJKF0qqe%P zetniAP%XIdt2;iaq36yQ-!AevtQj%4Tna=*K4=ocepF2#U+c{)TU?@irAAG3Qf<(; z=BnF0zS5H3Q^Gov#ZcV}Dxu7cRk9-o;vBhgZ=CZ+mcF*;5`@Z!$t0jX@SD= z+dewekHBx{rEu}dEvL$)d)@p}is(egz6z7jrAD%iVv<;3J5iaWXcA?quqt>9gie*l z(OKvB5NUk~a5LVG9WwOEvM`fGmghWecsW_Gn+lV^y0jzW!6t9NY>WHEpjr}}uE@en zp0H6uGC&BV(ti8dy{b|Tx7$V^WUzdJL5xK|@=EP+<3@U}=2d8)5<5auc@bU|F#FT9 zQ(ah>*EN=9CijY2nfYv0KTKQ<&nb~}qIzoh?3PWw%E%twA}H%&VdZ1N!?E_WFl?S> zpgBh+-??!~Ueg7@;S##E7o94c6qLPtA^O$yx8EKh>*na~H;jNmTI!HKog%y&oQIsT)5EJ+ka z;gc_oN+_ho zH6o!6AAd0Q3V>1GW0%K~m%xEkbP*?d>Yakt1tJZti9N*Pm;pU6<`E!q@$jxa&~|GvTV*|2avAt+I%1~W- z7neZBB_?B^5lcW0E{mCkzoLtSc9e5m4X7XHVi;e8rRWR2sHETx}qJ9(1I`&9US_s-=V_3Ee2 zThAXftn3uuk(e!Xu%K@JtuZNtooMVQiFs!4VsG5Yg-HfI76Qo!WU&U2t(50LP!G^6 zHB7rwU3)hatSUl@=@ld-DbXMl!Q))l*-jGPlMf*uOK5u?)s?5JGkI4_+{~oV`XDPQ zDtNLA+z=yl!)N7Ss3(vINsm9p4SZMb?r8&>6YZn?*E=4QUFQ;E!aXYS%wdGsnAog} zP{qNqP)Y_ZG}x%A^x>%CvOy@BK=aWDp{LJkwV$AB@29@2{Ida2^}lU{f4T1}-R>)u zRcb$F)knq*%~zgNDdcM0z9?ry=IooDym@7o_e*EKVz&-AJ8x~uB$nrg9EK{of(^hxOi&-}*) zLL`&ME)QfNZcJIegdyX%DJWngN+fKr1PPW9GLAd0ECA!f+xX;RCUa6+iR_FS{MDXc z-V|*z{j02T&~M#I`HLlF%lr_~sfJ{RC|eDEq4zD}*lnp2$6 z^;g4<>@258X}ROJ$B?P<@3J+D-L{08I>Ju+2aM1ieQsy+DK#o1I^LP+C=TP>AUm`f z`P|?W{NM5GyI*t-I*4l4P+FcVH;;bOCWdgxXX8&TB4LDUv>Z6v;z-Qh1jBs#dIe7& zcGO#{4Q)`YARj^97l+niM<_1|&_kgS2A1a6s_&}P@L#LsoIpJJD5>>ib2;Z_`o`WBh~LPfT--L+d!{(`2b=a2^w|{*snt1aG~gir$7D8wSPV`_zX~IYS?K zP+^C$_MPvh?wzzxbens>z+Wfv!>gV4f)QzlV=;wQbejbuN#>K3i(e||@ZN*?l7&V< zBVBYN6C(PLwSX-dVISSG1PfQ#iGw!}0dhsVUbsw0uT6m=<-J8eMZ)+RUyTt!pB3ZC?vNf5UY!On&LUDEnbaF$P>)cG=j2W@&FFGE^ zIdFTPD-3hYh2qRW%)2Z@l?|zv*iWp}6V>{Nnn7fbITCpK_$~bB)UF`*eyh zWyr|juZgYD%J_zEWg!45b*hn9Ghy|Mi%SK$6^RGM-Y@-X#QnNzHhTHLr2&L%ZR|?w9t3_&=tArP2?lew zjD%vV$mJN(e54gtR96{U!H zY6UMVDybRJ+kK9(2fWKIGmX`H`GXCYqS}*y&+E$h;v_e@$nfA*`ip5V#1x%XE5q(>~N!Xi;qvW`QHI5 z&lPf;Bph!((d3ZrIAX*^%!>)^Va&oKq^wecU)^9Aj01r$OZD=i+GmVuA*$B-K_)&Z z*h+_+uEhM$RyY$QpM0(ui$m;i?H}TJ=@71EGdk;wQ!^F{W0|%K|4anAtRZ48Wwc28eFlGX$*F>)oyv%p$v?Dg zDHl9gf=v-^{3Z$lm)R1$lAnZNo$v6Ga+zY9!GCpH$rPgA_UiAgmrQ}4+yk{7-Q{#m zX7hMka@Ynrc@zToQ zotF{eUzrqZd%xz5)Ja;nhNFqa!YQ8C?@&l%L&~9;|6C^QjDhE~?!n zyxTXR+rz)Zk;p&0j3SLt{f+uF1a4DLBe09>o+dr}Bez{P&DK-4)S^B713od2uEYGK ze)kdEHw}sG=|3FgwFDtQc>wdZt@ZVv0x;u7z z0>sjILEGPvsmv8A9D|-ig!q1sDXm(Nv|bEycyOA zq*GO1@(tj>MQyfYQ3mFCL-m8qNjJe@9&w^?+lwv}1|ficqc&;szIII6*NZhTKUG6o zdSp%9vn0YnQbIgv!NQ??4>QGP|H2oxm)o5!qghLL9XoPXIjE2eKmt9x8yJ08_Kt@N zx@v7t^BB6H#U5STNV^zh8and6LX4D{VMP~gwqaOs3wCI;7vAkGX&zmOw2W8C%FGp;S!2ItJ$fC`(WYyF#zGe}vpP-5n_mltN?+T^);gosc zx=6xAofxoX|1X26DNiO>1*fNPi6*@zl*s;I$sizcUv;}0*5FTxV#sH!of2}FzQ`bI zAOCiofeqydA+IInM75xtHKfKhr{iWV=t`>_T-byfyL2D6gd7y1o@%3F&QTfSKh6?q zjQh4%+!)-S1j*eGLi4T_44KGF8UVdKi)huSZcq^^g~42R^gecNcE_?o89lpijoQbc z@zPxXOxUt!HO2^mAfy#VM(Y_k%5H{45i-q#JPIceE?#%H;t7LaL)TYBZW=Ts^`s77 zr0ctySPlZ!7I#k8q4C*SRYXz1<rwV-@x3(Zp@X|4BMHe@ zLq&cu%wD@Vs-Q`CCu8A!5JiyEc)zQ|9CW0kfc$=b2=3fBk;kV-*q z&2!(tjHN72ZR*Bi01y1ly#fR7JF+IFX}Tv(-COBm!=U5P1=aU~=N6M;cO*8a*{HzN zfZTdHJ9e^$pu>^-yrGqx!ULyz&;)$D?h}G=k}t#Tg``M!ybM?H&BdfQ)VDYY7T@24 zIa&DO_TPoS7n0(76>QQX)f)+SuOijYveO1tV$5q1J9X$;?s3)8HY{kNGY!uHWrdlq zx-N8WwHk!U#olp`>Rx|1SDtjWoym?|53<9WeXCogmis}0kAwk@PJU`p^4;8cFmj6m z6RQ8M?ZlU44M9uml6@@gZS9Gd0B>@}%qLQ=w{VTs%0)O>(*F|s4)#3m2mL%>Rl z(+VAp(jp8490RD{AjZOgvr|@BYid{3byC&zEV%(aEVDwxwtr8=8H57m844Y^A7$o#Z*2Zh@|-^|ThR;b zG2-YXRXSd!#Y3?D4UPhKgp`bHg%Fd;#WLs#h|v?i$hk!qH(IE=Bljr0dd4Zv`%H=L z$W012D`Dg~BL`8sfJ2Qu7h`RL#gO0B3<}}3JGo!v7R1_tAsQ!8wn=NS3BSghg{&Yu z1@TVEl1={BiZiTTScp?{D9+*&;P5_u7e0J7*4f-dW9W#I2VnU3@IC;PmRqQ5pC(~O z<8#NcP12>lrvgX{XDz*c;OF!qW*ku{$ASluvG!yyGFc683KgHfiK@iEA>0ZH1>bT9 zPQ&<~)S{L82Auh-<)`4mD zpiKtMt~e^lzVKSL$kB9t$4&Eqf(7Nyr+~Ltsm}93F5h!JK2^%6-@%@dd7Mdl(1*vCpYpO7 z6F(d`)ZM&#A437`*VFK?Ckj)NvB9HSW_Esv`+{N$#wPj2lXc3c4t5^e_*`q!D9{@) zocc=mT;IkYGrrf9_q^U(gPrwZd+1Mt;sNj~Jwo{o-TmjCg^1q_6iUw#Wf0jqn7QJ` zAEuxbqk0`^68ZAL3nxK?+QAp4?*JvB>Ub{DN6^P$9CHU_V`Gv55X*J6S>ixcU-)5YAAq^a5wyDy!~RX zv4-h`!@8R3{EmgNIH@vCmSMg*c#ubKMp(awVL1fKJ;h)M=gok_kAh+qthmQLm zUF8FkD@iskX|K*VP5fU`tk|k7ZEfk+Gk?Wr zW+H~b%LK7D=Xv|QgS-!in+v4VYgrJgjM;~RgGz)GJf|9E1ea-50Vn>{WkkXLQ-+l8 z-L{zm9^XU37)3RdLs!Eoq(GE=$Q6nQBDn1sRno$^oHCFgYy*sv&;v|f1ix{0z@U`@ zHEXvWqhXvLWG+Rjg)wfQr=Csi=-w4=1Qn&R0k}Q9YnCDna5G{u(-FuF^=a3H=*3myTxNvb5id;I7#PW3|?!&ozcL(#rsvRPJcvLVv9X=^!gf2T=-!O(+To zW~5u&Qik1Dcys(be~I94T;A4VBH}+KGEmOD@M}tVTmlF60dr|Yb0#va(Lxi%*_+=M zj<(Ax!cz|DETTrmUv|)@KC~f$sFpjP!B_iB3&YOX4DPT+kPeTe;I1?C<#0s=i}gI^ zkbw2k^K~phL$fD6m@(<iR?a*hBI?6qn7u26DEVr<40Qk+2CGN% z53uif{$qoHbepp`Qhw-KC^tQi9);h%pPTQGC?$pHjc|^_Bav%6L@MpO$t4UHrRaE) zm+Tu{B*t&w9T3$&s#I&SOrgSfcZaWs)Uzb3a2vbWGU2)Na{)35U8SaSW()X^nNTb@ z5Yk1K-{Zx~Vcgt^EzM){Tivdgv|@5_w@DHxiTICZE8O6w#>?GH&&(&-nXy%~D{7)w z)}>Lx#px45VB9#$%R7300IPQ`rVN0k2R;bnyx0#5$^w)+~S}BxiRm7XyF(j@!KH z46tC{X=>ywZqc_)@vx=Y2m6CAl|9T&BO=-eE{eNRdb`t<3=?r5_wOoCAC_m#RW6K- z%bUuVIe4fmp;=gD848x*%wmFK2C>x4&whsl1Tn@#A3q^5>VXGaCN|EOL5gjh9_V~r zGK$n8vgQf})|16A4U}+lCh5~u|GF5%2pJq&Owt2yf`1mF#6iXqE?N_1;_Zx}QaW>4&70!WPjBm4&7%k&O6OF`f0qP+A#tlVvJJJv zfcYzI=Wz9c-S%%@IwJmW{{!kqDwn8DOks!&gN*K2_7&hU8AlWbJxZw?@Mpi|8Aa6o z{d8PFoA0*l9IGB>ESiG@EB!aqihm3Pjx;_t0M&hDxA6HGDH6;+ILp)^Yl&c<7{u*Z zBdF064<_?#&Bqx-K+tJ2#7L#1IWV*r;`d(AH|U|$LFW6pB{Ye>pH;pDL`t7cTmEds zL_8-P@|Yw0jXwh5EJiuQ7>|d9+)CGa0;U?I+$#UWa^G2;K7w}~Clq4z`naKIzA%ns zY5CJbl8Yu7CSI|PKti}&bz1lzO<=3&d|qt~|JJQ#048{TgDc#27L@y;o&#cMwPBX7 z8kr`T3i8|IC2MMkW>NjFWM8IzXiO#FF#G5jyxU)8?xfUwMhV2cxFE6m;237P|3Q3w z$M-ET6Xz_tSy59mQR*7L*sT7g<*`<=XB?BSUeA%5B#KGLu;4f2(GQ9<-7MwX45U7= z9eAU@D6x4X?)ze?;Q=miw2{~A=a8gIik}3ee_d4g*%!$#cYHr0<@evITyvLiubuwkvZ=Vu)N(Tk%H z=Yjzx4a8c!iu3ozlz7tWokL!fYr?f0YZxA?pFMF%JPmBpG6*sQ!OFVqe?o{yA{|Di z{Rim8tmOi~hT1lQqF_?-h0wE$Z*@wD0R?6;=v{D5|C$QR-G9)CLVW6>z|cTvl)B z8SnsMD8h{RJHYosgcTt8O{u`!_FRfOZ-=O8XHK+X3PyG`HME9uO_)h&+Au=PSt57d zzl84t?9dZ{Qg+5_hAu7-JY?lhjI2Zxsqr znxWBm^2tae=)3NfJ}{PXy*B^#dT$Tq94*;OHABX+@}>w>B?EIB9}4)&C?-m>^kB-y z_?I@r0lY9*2t+Nzlac+_Ga&iZhTuKZ=`bN}b?RwJsfI7&G{GV4rpm z`WDhm%(2VVWF)=US5zCL@}1vb3!+wo!{3d%1 zZ=>|cvM$=P=oK1|jPz5c5EYanzvg6rbH~Od4I+7S6N7T_$H&F2hhII&ujmmcz`TQY zS4FIb&{lwOKKkQK!hbe>-NP`eH{(+64Q#S9(j^)onZIp~VD}Yg#Sx^WaYtjQBBKVW zBb)@Ub-`Fm!xqssZCZEul-17*!hQ39X{}&nIHRAx4*3;L8}qDl6l2Z`o~haSoRG&P zuVK0bO_-r-;#A0YiqSxB>Jn%@J*2`)DAW8Vxt8?aU!xs!A@SVfR5^@O;>@-SL>f?Fhg_ zB{?I8bis>p(2k-FZ#dO+7r#og_RZ<=C-`&4es+z@HlJ4c6xK{96lTR(hg(@hP@M2H zq=U+!p)nSC3wkTn>uDH8(iv7u?T-JM$$QhC(@&m3(1(-kU;sw2YeWTU8Zk9sG=17EWr6Kn@k!AcwNn$`t|zRw_Nt}4X&ZG>xfnJ< z@|5AUg?jP))%JSLLh*?tOKu^hYvX@2Zz+lSCHyqy6;L{eE9cYW2 zoavd&OQuVUT;pK84Dqc~s?!ptP+ci%2lgJzUJUi8=pYC()2ez>qku5h)|a3!hMvhd z^Bz$EqR9DDHj-3vd5I}(q<;Y^dckghLi7?Z8E$V#B9-J_3NI53IPcOL8_)6m87~=E zPRF`sLGYg(?cg9pw@w`J=atITGeXrk{jDr}Ad%vfGYa%8 zg{u9LSfqLAc(1#-$N|!PWJVWLCsEWKsjq-Yvecngf+5jD7cd4gNQ*d z;wD^EpX$q2*j6aw5G8T6kJPG1?^-e0pYrKh_s&c)4e@vec2VcJY!noqP}Lu%lvZN zimM9j0MkW|_BVA8neRe_JBXGC73w@VbKW6=Ez+yj`g|qc@H-q`c@-WTBM?gb%mo#Q zSuWW+hd$WDLQoBm1U@o*ifiCVfoIeIV*2)74l}ixUP&L87I|tyqf!T%Lw4qHV|)neg9w|RU+QV6y+p@O2dT*t>GI|q6|wM*dcis0UMtaD-S(Z ztaoJuY;cM#4>*Jv4GxS;=|_F{<3~-9fF)>KDz~yqNli4Gw_z#4#E}U*P%|!5yj^>= zJr+L%TiqlcRDzyv7PDVL8c=4+fu>r^NW~m|&F^hS6i*Olu;N$_32=W$f`Ll*m7n0# z;(VVhq7UXz0VT+IM1R0YRpX(rBlfN;5x*{2t0q+U6Lc-<;METx7_6CsqaJbph*|w! zPx~u}vP$(@Ut}EFfF8Wtae;n&;FAQyWGlu<3qAuVarTRq^&={>2|sDLze#~RFq;w? zRUyQz-SC-t@<#z6uG6X13^7&p78Y4lSNTWbv*F^vXzKC#S9j5WdB8~IRcbPpLhVIb zr+P2}>*Tv47Cxs)lf>p!JT0F2t#q+>34y?(E(4n(5Qd?|9<--uBMeFQ!?gE$@DTt4 z!6Nv~@X%ele~#!Wr&|8iOD5H)>onD-LQ7Nf^!Tow@0(H=Y5}YZH3QateV+69rk#HP zNTJ=mOs$iAW->#ZLNY@fLo#c9=jy97r2so~$z`1y)GASbEv0x13AxKiZBWK!oj?O% z_0=8#Q3Yj+LmCfL@$r(Wf*j%I;Oi7Ou?fU(y#Z9<{-G^m)(4gn26^hrar+#IbYOq}=U1se2?VXvmquq?P=|TV{uk?@gv&bh z$W$=#Lv#1MUp_C?Dv$KKzF_IF$Ke0$hq4MwK+8@R3%OzFfeI8C>=W-_cx!t|FinAM z48KFR4HGx>6E)p!*+%Bky(|Ngxbk#ylmZ+t>RWHY9m41O~4G;{^v` zmGhk$4?yb}MjO2KVifD=z;9J9VuXss zW;8I{sb{i)&1~_&Cmc_bO6w^n_&D>zn-bUO8*be3L_a14L#2zrWKI; zdEQ&}xst!^3J5zHl7Er-9Aw`iw%B~-E5?xhEAyWkpU82@caNgy!oTu?&9VfR6;xZQ z4E$kqmq4^0F=XVxIK$^uGWbjt+Jt)85_?@wbi>}-JXk#MckWeY5XM?;X5E8}M4x9C zaUa25w0?!Va>0;plu;X3m>W1^b5mAf3`>}tH0>GCNkNF~ASkYEnlP7H>RDO(FHT{* z_xcGfVz!EuNR#|xuwUK^*o3; zWl&K;=e6aZb)b3y@{1V!&%AtZ&lJ6ak6%Sw%&rx1htvq&2gqse;w5?#NU`el5{XJ9 zeb?m!v`SJiHtl@~N3`xJCet4<1*e6+j78);RUuSGJd6fWe}n(`MosEi(KcKo#oDLJ0Y#P zaJ0As?YOz2Qd+Vl9K+6QVb?HEEB6V+&MtysvKJef?dB~LUNhWTnA!uVy^azdtWmSz z!d`_xF5Ixv*8AtpnCE=pOR%y0JLP(NOE8OkOdry)&}P;m3BF0nP8L0&SZ3AI5?W_) z(%LjOYJPgOOrLC2ise3vwG5oq>JH;KghhUWiG^1$7@zJvVLQKHJDptN@ueMb_;N=8 z<;VT9e|C#mDBXha-%gR92>Hc&FFEUU&6p>p&`if=2;b(SeYXpNp5|&=l{h!@LQ0o5 ziYnfYep;ctsFz?F8V>&eDLA>H?{MC3yW2r$Y^N!bgJ{T!FY10@q3<^rRlE_(%Z9tj z*@Pb@P@|Y*8wgA-CYO{KRR*x}-y*8rgZYQE*NC#k-L~`*iy$7MAt z|CGg}YQUrbIhF##IkvoTmCu%2FEoiir++$oS#bQ61Ci*-hA(RDL( zX<1+IXRH~bU5Un$hKaWLTCD+zciok7oR~qnc}#gcxSn6uA5%C{WAw_zx6M{kq&Wqm za~32RBsP6KHeDhvr6N*xFxyDWH$f<{-!tz~Hk4cATxHh)FJr|03aEFj;ov)>o^{~T ztB1+Dx8m%7X9?#On5hn+qgCoh-iBnD^DNyx5bW)?4I!pR!MW7|7O)btk@j^HhEeI& zNzsE*bL&wpD?lr~&FCMTDqrDBum*58y-kb+6g+d+Oo+itg~-Azzwx`v&CDScF#cLT zc8F!crRiq-x8@(1R(w|ZSqaMkfGuj8dhP)agx0O3uFJF6T9U-p_NmHwZdmJ*i3L#se zLbQ5Fr|^=9E==if*dhC$0t9k+L`ejTpUb-|X0k!>AHHieL{E*yJi(ZD4M@#8uvJi2 zO^Hgw+&ZxRkaD3YfY5QQDyaWnvD-k~tp2LQqK3?EmCKZV(HpJwrY$}GLWFEIbfai! z8I1<|0;aNfbp1pJXvhk%ovYRB7VqB0B97n7*NGKicLQlhN%2NI9hl0o6+udua@@E> z{%*$#sSX2R??*Fp9bt6#a1gr%XWZPUQi^&)uqYaTLwK^iFod?7Hx)Hi=ZU|00n#b1 zHN~LDhWfikymt^cEqv)c*6$|%KrVm@LCCD2y*w!;aD_9Du}+z$rZLsW&ElqdN*d$o zcd5ud5z^=@b84b!E11B%V#leg#bz)_c{U__~G8)gnn73OxMt!*B^j{sp%SWd*l7_K@7E2MKQ)1u*kg05mtuIQ*QS z=6UyzG?^Cch&3oUmt*W;8I$r!NbuHPCY+EK)Et)#|jd!^v* z@Ra+EaFgBj)ig|&7s*@}MyUf~c-F@^2nLMlp$-e6dx8>a3CLH1UhUUV3R>coQrza7diGyYlOs zT=i}6+^J~pns%tt9cqYw@zybf*}3gd6l5MqzyXgLYWm+aBbse{lph07FwV6tlDiXnD6KWL^)2N-$;sR z8Uqnxe~sI*qR_=--n;{?fuOg@#8GNHUY7^dR7UA1nwtfII0K#a@_#4`eH3uv_T6Di zCC;*J&;^wU<~zt!93g?=>4KS>_M+1;sDOx54K-i)7ds`8H;DV^+8N`LHPbn={n1hZ zbCRkE3V~i?P6jJW>pzmgbXPOpv^sOse41|JsTlt1wlj;=SfZMk+Y zhtx9NW^QTW*?g85>#?Et;mFIs{)xXNc}Zif*~KEzu09RydGL~pc_y>n0m?*CnN-DC zTyplQZ62FZU9DwA=I`YCjFqpmYW~FMCN{niaid7)RLN4z!KA}ubc9!MkqF9q4zNQC z?O>b;H#}KPF0ef{Qzzwax=Nlynbt$JKVuQ`#8%S-_;eUwQVk&|#|8V>kkp~@pz6Q_ z&ALKVT9_OB{dyT5&O$wO59adyqNv+uI8#*!ZY@}-X$sNSg#VMuz(`<}wo>^wSupnt z)8ri#kr(uidUiszyy7eQ!U=zx#CqWFztNLacqR)imwAg;R5a6LeCK0}(vYl@kotuMgWoL;D;t~)yIlS6W}2rW8Z$hMRM#`|Vi}x*!p@J4cA{{2UuyM* zT+FMY2B5PIUMV|%;H1}4_*G!?8+&YDG>c{5v7kS+*0 z+GiBU_ezbZ;Zm^3{=Y{ZjZz>n{sF`gN7&&LN1zN9F}YeVU=b+4)vq$*7AnYyp~28V z3F1iYmp~5rYq&#W8Z*%sc;GVCxil^zYfjiOZW5#*e~!Vn(VCuSi*Y<1EolfVi3dX& zfr*L9>A6G6TMPP!lum$*F-bvzK=V72yv}$iajE*lUwy&Neo4shaMJ8+&ihbVb&d7a zYNO3k!KnlgUvJb<{RKhbUV-{b(@@^m{S}LRj z31Ir4cKAQ*Fv_@KBO{qCmx#4n_zlW9kzFRf-5bOg;|5UFSkbkxA!k1%Wust3kctK$ zF0}-22jRg0m09~w>vJjhfcn&JAq62XHC0721J8r{B_?8N|e3 zA=73g24el?8kg}4X7-@K*Lv&CH<xzw2+;DJwp zF<{4N6^yvdUUr`OR9;=9{M9D8ikGDuAvx2D{Sz$L(C~eTuZ!|zuF%Ts_I$0Ibi6*k zdjT?@?d9p$P#cwnPyNLE1+rH3O-03Uxf+Q;Rs?N6?tEvAOQ9|PUcto{IrUn}+pc1MSVD((=;zEs?e5pq{hn1`6-_RoYM@VRT`C1X$9InT(` z60=wA=V!?B8fuJuGf7u9*2r_l&~sX@3{IZNQfF}Lsf0py^;I80=5^E%`-_^Xj=^WB z;pE|Nfy?VJ`w+O=^)Xkki}c5orXC3c*7ZtCl(8a9_EoHDm_1+X$Nl?8OI+(Ad!k%p zf8~0_*yHi#7@KLNlB-dyyqE35JtO1(6=7=Tb#*{nwvQ2JAb%aUwJZG#|3Xx_Q9m2D zy6wN{N*a0Krtz(gr%(se)TuBQ&K?Gw*su$4OzX+76B=~GI0=@?$l>l{!_IN7Z) z7tf@E$ki!Tmk?6;x~H;}vJV>I?RHE3WWA^P=HCf#k@^--`P!JNn)aD1k)2cNEzcEF zMMO!Q$-B8AyxP)xL2%btw605%x#R|1xXDWiZ5_EL3icanN;%(Y8X?-mV`}kY0uy3` zrCO~@)ecfy3Ol&gP0^QdlwNeiFG2}Wc8{>AJchr3;bTOQL6{tKG&?WROZAdXUHwCo zB2Kso!2DJd__CD{_VXYQe9^PKn7=Vy9hD=T0_E3AXOnYrKfCt~m! z+c-Wb9z3YBo5~XYz2SI<#mmma`63kW(kBCTEto{u&N58SFrYQ)jztVHuymPgpmzVM z9Jc!hTyLfV^xdDLq68CQI`EGVgievk&JPD+pTUoffhKSeL9?BpN+{FAg1sZk<#U?Y z-hPXjMWklmfAEWkB<(|CywGtg$b3wp1zy_PLjwYgAJ&#SiH+6D`T!NC=6+hJ=zzuV zKD=|!Lb!dgeE+I$gou5R`8FevSD@F1eg7~JyXRP48>?a;!L7?Ou6wGE!qdDShf)xL;WwvT{`@GAC|r$aD3T~{cmlh$=Znsy$24O>Wkh|V4iM^ zA)=UmA5~mXMyK$qM!*Oz7sz)qjSD=hL4?WeA3{cu* zpTqfAf&g~u=5UJk(P#R&2SQvmP-MDt+1>sR@2>}o;q8x zTOfR-5-j>`T|#3uruXf4@&O!k60MwKamJb+=lxCl=3T?Tqp>Y-u@)pDTF{U`sH&7efk{#FRdD=W8u2qnFnG6hfxzE|z_Z z75@To+Kg|gRyzhoPz&aL0n8Yv4Hfob9hoRG7fl;60v*cq8HUQ&Bjn_j^c_cXrtm(s zj9R`yc}8Nb#%*2Z!aT60qP5tpU%L?b}ZK>sBe= z8n?Dr0)qNAg|}F7J*KydgD3~r-OcNNbG7v8=3y8SPa&oIvHSup!3yj=OA3NSDBGw; zm(|`-lZVdmin%dPOhQ2sjoc=L3lsjEBA9>-*f6CEdpFKdCqRjqYgkl34uRYq{?Sq! z0$KF+`;UH+AMTsg6fq~{p0f-IJTaKg{xb5P@dbk+MHw;^Dn&83NY##Qtmt?LivzT7DHJ*@M^_jDt^h?%0EL{?YUgqLbpc`LbtV z@&qwD*dBO7j0OHPoYFvRaX9&AXSld?({aB9W+S2x6lJ3RAfR*e{CmnR;m~S@T4A>g zZAs9R$S3)8EP^{;p3Z;uy5jm%3s)5>K=&;mlKD+BwZ5lZ!7@UFDE?VEg+Bm0-598N z{VJ#36h4t$$DCYu&bLPS0mbs&ga6YkGvE>Cyh?VD_Ri2dQG2UY5qSML^7!rc=jFz`XT%W@AOOyAfuAk|8B z#T`!O3)-W zcw=iHKL?Fx#Xg*0PC9Xsa3|KkDI!*_?>4(Vf8wkX%IcCQe}p-`QyBqo-56rSG09Uc z(H1Etl}&glanTk$Op?hnO3 z&e(0F6@UFhMi)G;7xR$AwQOdXhpBBk8_{p^l@r}*8YLECEKn-cOq99}9*tLFvRAbj z+eMbJXa=L>MN9$%{ZXZw@t&?|kds!=3J^tC%iFrx2u!yqgP2bd9is zy30~I%mBP!8iO7a)`R8DBEEROthOSnCV`#naqg;f&e0X)&?5UX5L_N4&seY^U(1}_ zXTR#|CBLcVNlcs88%sw$;;afy+4$N5om|&erb3gzXfIhyQtBA(e4T{vq<>udp>|Ey zFUG+0heep4!$1w}k9jM}iI_7AB&d%wEWttBCn;pG2hcQpM95tpzGKMjt8*BXMh#n= zNXB9)5YXWUTFBt3lk)LkWTjtN8v>hx!zd-9y)U*Q!TuB#Q$a_Cofi50Q&BL@R=RdT}U^puXDb3Xx9h8qP+KYF zEwWCSnPXzW(b(2~3BK3WbQ@uf`+zgdXO;;VGMXE^pcG=4kvMXHukWGwXF^%M|?9@cIPJvo>IS;M;{(35Ef@w+?}WB5H_D%_!jCPp(08FP9~vl>r4%Q?8?GG3n{a7 ze$h0T zHDdGL`oFB$qn9GgBK}VUYRZ%NW;h8Vl=P{;a&g%#}uGa26tnKThGszgR z;lyhIcqy>Sb%TGbphIdm_y6tnUvGjONBtVFb;p_!E%SewF~F&1IsIR?N>j6KQh+lr z)S?=`MHv$A|7X0gHF?5CwNe06+TnIX8+*g&yVC}vYgD{Iaq-Pye|BJ`JAH04>N=(M? ze&+UG-w|y;CMR5`!VK~WJ=@D{TPBrM{0OQvmSPx?$_nMARPM^`5A6?-^7D|w7Jt&` z`9mD$fMQy@ACPJ)H>xP}wPr!^e) zGh2o1p|p|%X{>!AV3zdVGb2BJ^0#8Vof{HH`7iFCx`lyPu(2 z*4Dc})Eg-C*xjkYArg^i#9=d2zgNYiEMteJ45M`6d?%6xh#3%Sln%H3b7UXgGFL>I zBM5%`lZlda_3!UhL+fKa|CHXZq`y(Au>9sFgKTBEdI9*dGa z{C@COY&i4E2*)9^y4rN71DC)822}p{i0DXl4(Bahx>`o*0#qZ@k0<%y5C0J6p0(_+ z{R!Ug6j?7H|9nq_VeE8JBE?1Se~nf5b>Uo$AkGrqY)382y_4lzDiv;od-@0B{Lyo~rmqSq*J>LqX{(}URkpo=V((3ab3tlFXY0V;) z;Ku#~t`GeDl{JiPOFc{LNwKh8NBio0ZBkI{!JpZv(5yznB{ev#4<*9XwJ&Tc%T?&dyBT)X_Dsif3%#l@3D+cM$8{mI4IA@KJu?4`sc(#qr0c?sZF6F) zqX{RrF|loHl1wtOlZkEHw$rgEwr%V7`>lJ|x_`R5x=vM}I#pZG-sd@ob`l(HEFH5U zI_vw@*yLBL4mBW@$sm5VrFAq8o7^B~TaQ7kHa|sb-yOf&xu8x?{Gm&X{0XR%od#52 z+zJ!}#K4C0GaT}R$R8nJ0`kSR*)s5qQbI>xRtoJi_zW*s7Qk?6MK`F=9jrGI-s;M* znuB_)JDReV?fzv6G|UBM4>t2D(*n!WcNrNjZ;Kyo{qBn|l3N#2*@WNN2_$ua)rU&~v9x>&^`w-a5wTr#Rl{@#7;c;}tln&lVa1#O z!MhJvW-pj$b5)mYcUQQG=CD?MnJVEHaG&3r9-t8>RbVsHX%(D{M+KIHjL{=vOJ+U152}!YLg8U(Djk zuYktrnzg+Wf;#LSRk zA8abm1&@ftzpH3Nf0#swj~`}f13(($@wkD~1q^RfESRE%%~%HUoO>M=o!sF`Owy zoN_g~DB_kp+L5fY4iG2#y^Xt@(){TF@*{MU$jfah^LKpQdFuUE(=OwW6Hhx0gjd{E zR*SrHzKewi@jso%&Z>d8|Dv)E6$tQHlx#iRN4B5Fd=eN1lvC^d^(q>JF2)0veVNQ4 zJ5)U}zJDs4@;x>DgszFGhpj*4%Kx-fY@KX=Z;k*%`RxniW1V|c#{Xt( zUsi{O_Sk3rgw6b0d#+?#y+u$B!qb94*RgSN$xUznVy(d$b{TPtYaC+zla5>oeP0!$2V5FAYcS?Cu)R(M<< z`Cg$+e(tjv#>+v9cl!+p`bLh#3x*~^EM$)|C*lCLD=&0cUH9aS)(magWy9k;J!l{h z?&J5oz$Vb)St~*G*sqZ4_p3A*KRJWo*x6}>-v2#OB>)@jGYNwn5st(g2FH&p92)wO zi*tsOGT0sLwM8bv?IR2=hF0pd90tyGAO!t`{3&@X+Oo6t=q)S-cQZHOd>Xl0Fw;=C z0Ek442@Ti6D<}Z+$5-?b58#rrXn7MpxC+-D=o_VL0s2PR>)`;TQm`N=A?O|NI#VI& zc7rNI<}H*`Qro%3_IDx#Ya#LQtn$lBNP1>*yi-IWyfegGd+ekI+%U{pV;|vPM^=Zg zDg=3_vRFMCP2Dr*lQ2lHMo>cF!1h9P6rimzmz0<5S8ON%2t`1K#cO3VNz)sYq_chN zm&mf7ttvkZVNM{ibYPx6dK5GP7j?`22FVWNBD9MtbRW#k1T^)Zz>QKc6Rq>5uKW*^ z0%|ztRkR~ci~!w>JS#(syiv({{44RJ)>%9dJ7swOv+X9Ph%E|jSexPs{3Kx=>6hjy zxzQ0<#R2)!TxyK|mD(T+OdlqQF!}x}c_{2_i@Zd+jZ1HGFkC*u$_qa3?-VZmWhJK(FNxyh!l7{*YiWEJCa zg^3bqF$5~o&D_@U3@Aqfo?3_z-?hNT&qG4~1ujP!{%B)(WY!9(b&k}n=drc2L6o3x zTXDK?<35wdG3s=K@GN(xq`*gGv0po_@A8LwL1%69ZCVdnnl~s4(nJBCC1U)9v`j?P z651?E?5)=+z=uq;xbbLqP7yj}msq~H!x(zr(X-dx1PI!oAmKEElisgBmk^NR-7YjU z(TrlKgP>zR)5rcsr{n0esp+GN6~sFi=HOB8I({^ECyy9tGwRF#jV_p-dLTL9e>bkvz zjnyTB-ad>xUx{Fnv4h@0%x`>?!t4v*gFj_C$pte(^S6H*9!RX2nY)WUOo(AjzV>95 zV7D%HYGNQV&}x<<hu_lCuyfyxR5Xvpj9jADevx24z!xDZ%lR`m zq9(Rro`F3_oPnK#SJj~iDHsv^VNFQl4Kss@2*$r22uc;K^_ik04Ep@)Y=UT0m)rSw zstVCv2}p)?E>Q`v2K$p21cay;oy67z;3T&6`d|cm+qSg0j6`?kzS)kpix}BS3qTtw zF=L6M!`OkrnLrBx_R9>{p2nO16R&s&FoYHeZh9tByeUOU(n`DOE^+Th$lES!9tBB4 z5bUsZlUC6D1qkFv=GBknkSGuTU-V0p#1U9v{0XkQ2A13<@4-6gefVGY zWS6+=?&l>hvjIWw?1-ypM*o=J$U&P|bQQpEf5>Is(*qm&m7$8f(gTY{%nl#8`=iA4ZWy>nhs5Mgm|tROKA!EG53NGJaE;S;ob~UxJk$c3 zp!C2^$5?cBQG`j!7?Wc-2*A-^qzP@Itz17Av~!UCEbs3hBZ*$l3nR-z*ph;+N5Jd5 zC6svy>aTL=Fj+?pqriP%vPUMoZhCOCt)V2=K#dw{ZcPh>%snVrAHSpAZ96KM3VEwenL6D;HPYr(A zG%m{{D~DfPE7Nfd8RX{g8!}fCke7 zMjB-gj!}h|`QM%uSdcOSkn3m7;HY1BQQ?NY^ThiZ%v;;TSTXg^+W+mszK%br3yy4I z54Ij5FlJ1AKNjQr2RX9>vHn5K^GF%}m{|l*#P)xQBB=uz>GPmU4AQ6>HAE~(IgLmx zBmk)0|30EX&9K;Q+pStj*7kMSahT-XMth+Kb#Y;-(Wu+q4PU1weOZsapH-h7Dz5jZHLi6}iPZ1aS*q zgctc|8}izXN^B7ds=lqiw5QqYSt1K=F98Ydd$U}&DcB9sn)RA*H+=u4T57 z3r++IMBrHxh9(xO=>zL&MMAfqn1jIT5u()Y?=t(XWFpJ{RQIMa^h!+-WOO{k*YWv* za8UYRg!6B;&UwknQ^(JXOJxk&q^}SctV_iy2g0V6uVymeL)jTh{+W3ThJJOI3AKgX(_d;g90MaAf=Y5dtW7@!;ZOQWppr1GPl=0O?UtDzoLkxD&4O@;b3uQy2YLxiG7;D;~~zU ztz@OwJ;vQfz(I;&{cq@Um%=>Cq<20Pi3bN{B3=3t_eW~5n-Ubh4UT3O9&Y_rkJzf1 zhSp;?7MX4ev~*$y`4K9#H!1KMj}#G~$s&ErFziZ}0DoYmAr>PUYmgB+IB8S?Cvbcy zU5-+yMoGmK!m~(4glCQ+md+w5053)GL`Jo)omuasW})bP%>@MZ3PaWdvna zkcagATi2utBe)+V3dp&%$J7)t6H_OlzzV{1;rjh-#t}V03`cQ-@^vcyrUHgnpq38v z{Wn+t|2dkV7m0upKiIEY{lET4g8C1}MN3xi zw_cdo>l|tATOnd|={}2et6bD*(|_|?C9frSG`bel=Stp?J!^#svN?a1Q7Qg&2Pb0L zD~AqKU0`a@eLOtSr$*`jGdX%*StX#C<7Ecyfw|wMuhTA}GSuH!$NnBQbBk)L=bQN( zQQ)6)8sc|U@43EN-W1eNz#_FWa+uxe-g;3z#0yS~MxiNiYq9VKIyh-FPbL5? zZWJIgm3F#|3c`9=Q*z=B?3@y~Y8XQAxMPq0?vgnxqxt%c?;AAPpkNwx?WKiNk~|rB zrvhm>CzcDA2E?8_HXAV8XeOm8%T_rq z%0P%%qYQ>Xek!a126mUt*q5ZFr-zU)q-W3`9n?D0d^T8HOM7-}7k9AXb+I#u)i(Io~Q6)x*q0-@FhYK3C)|05;b0Ww;tEm1F zn-x?kUDsJ?a%T|ZzJY~LNwi>iWeWyf^a$d7tEpXl)$7iRxj<-NzCO7v(K|Iffs#+e zR^D*tpy~9vigIk06fsQc7}Ky`m4lMgu$}=b0Y{Lv%GN4qGiJLtXGmXE#BggVA*h33 ztpwFib0e18>)cyFC&oVz|XB-l@Ei$x|i66O>!ns)PQ?CgKhN%yTRu`PPh$DK?)HFI`%+!m$mm*bQ z2AnnizzB+d&^g2MqAcp`6;@8tK}kZ_@`*Cs`E!eSpa=4JNhWPvBmYB+*MDhhEd2m7 zZ|vJTCA_JJWzy6-Bi77P!Tx^vErxP(6Y}S$$o>yHseKb`;+zEFpU7<=2C=Ed6qjyN z@-L}ey6iZufl|Y`D3geTz%jJwU-%M*+q(=oSn_Y^Ax4OPfEZWObGa;}ze1Ti{B9WE z;8E4q6wOF?Y(4uy5Z<>uBXP0Qc>s`GgL^2>z9>1u>=ooi+toM<)j2?)Ajcfs- zF+iDoPRaVl+_dxg#^Of{LWnx%<=IR1o%!CqDPc>?GYZCf_?Uiu0G6#zBFs0#JkW!_a-A*ZOMmW_x~j+QN;j9I zqMYxKLc?)4$A;lIStW~Hc1&|R*5hq%4D<``0u1EWMZ|KenRKULcne`jV!wq5IgRjP z=~$GdWiG__Zv8{x=p_P^jFMR})k&5@j5G@0>`CsvO>|GaH_mtU6Ew3oN* z9CxWN@>pDTJgr#d9C>6vZJwz-(!mSH^GOU+5Z7fV@JVbTBVNWm>aQxfS6nElFg@DC`x^DVB@o(*45THBxJpVT?Kgy-8BiWV9RRYTK!a?4e1%-qodLnj3$hEn^JrhBzYR&hBTdEul! z#O-F16lDTG|5sO^M5~V7Ehq`_MvULYlR|YNtj}Pq;q7=gKGUmLlRhVnUrH!;Is_Y^ zA=Q54U!Zt8*Q*T2doy~8qKtZ zAQm9EW4K}>g!4l=u>`oNM*;N&H)%!^^ds7X3b z4t9PXOb>hv_~}OIxVJg7MiT{-DvS)ER~5(l*iEOEb5I`6Di0}swjrTz9?~oD>R+F6 z)$`XzE7RMCXxMlEjn=|w1U|1{oZ{R0Z?UoQhsI^Z{HtY*SoXwmXENlePPN2oy89w_ zDoLdA4+-tV3e!%^ecqkmxk&T%^wh%@0XEcHBo3jz9Nl>VZL8sEBbcifa%^AHxKG8= zVbE&l)bejEtt2-NS+OD0ZqU0V;+7@2z3U7SJz)KAryIXzHR$6R{0^ePSNnP$4Wme2 zYQL?*cj)p2fk>6~#~e?f(LM-z8Cy3=1AFaYqYUvx-9j95@kHE0*|tHSR@;_yyaSoP z_e~$_@v#s0ii_8=)lCK@UwizrE7(+@Us4-7wHQANatwJs%%x?SX5}tub~nisWYgvA zCl?lb=6@cW?7Oe@{?KnkS*sH9(YAj*Sxf~XY2whqpDpv3qGq~{|^vy1MeX9-82^*Sn zl8!|{)FCBi+`|L|o_|$^yQCHixrszkQTm5A0XwS6{mO=E z#rDywpA<RFm5*^vvG?NOV~2#aLAx`H5a#e79Lps0*OR9M-=S zE_?55!gIfiC9l#$I%+6OGiRy-L(kQc1v-@4y;ZLVQ3^FA$2RIU$~Dg<`X5w)k6o&D zcsHzz2&RDw-Q3Uvu97MLiNkHtcVdT*w!hY=-_(E>F;w*k@7BELcpx-6MntT>rvk2H zykZE5vP!Xr>^kUYb??*m=pejazWw^6#LA#!+kn5NY)1jLCeFav!cT;Wb84NZu;ex^ znESX!B2aSW%==7J3VtFB`-Y@EkK};qq38d*IBe4IhkRSNUMcEmFw2M7b7w5l6o`wK z$T3sy1PJx;XK>RD@`-qs*EZLe6r-H-hp_W!@&cC+mgZr(p}ZiosUmEJIE-g=9BXhM z4kM%2-Y_6Ih0g)8$H9fp){+5<$MA)wC?I7MQA2k?q)oUF&waq>Z{bkw8#vpm;&`-? zNB2@I+ER?-qYYS!{~#dW!?24w1iF*t;aD=tPQP4+U;tthmDk#F$Ak9u^Dk4g6~>4A z$9twNN=BeWg}~ica`n1<=RFKHt;gwjk%17InQV`rNctP^I8GuhzDuVEGXgO|mv5p*bjJwu8zBeA|6h3)8$x&VG4g%rtA z6cMku2<8Mz13=CE6FY{m2B0}FTS=FAwMF-#d`mgAx<_32rdj_3@=lskfm=1SwU)A14SVur+wKIvtbi9aP zMdh`?uJ)Z=?-dbx>~65<9+8%|=^inO9+n{*=J;7bIh6>+hpsBZ3T^oW?2hVnkV?U$ zzW!FW2Xn#)v4ns>z_Gb@kEH$@(@PT^Wkhg=8Z5JgzIa!) zTcl1J@ua6KL^0=wEL<-o2@{M3xgoN40yoG-X^kuNT`@Sdn* z-B?-4vGW3X!<67C#g!+uxCcScbIGc``QM>A{n`dB zC;O8yVIBAW>B!!!7z;nhXKnG2*QZZfqPYkqpk5rr_`esXe9XCUpFqO7h>{3B)A-CR zpnEIO+yr)ec(NTQEKZb+olO`jqH`u7zjhvs<{B_N8$4S4^y#4mb>wZ)tjzFBVnL2& z#)DC@d36@rh7Ab?7c4#c%@h2YX%Rc3CwdU(Z?TfKy%L?E&cV2QK_$?&U)lU_hFEly z_qX8O(rdvl<_y|*sI7!L{@U>B!FrDe#z=fb*aO6f1IBlyi?3v`@p|nBgk{@Eh$n-@ z!eUMZ!9D!2Or)>63Ckzt&|jKrk{#^d3YG@qr)BcftOi0*5;Q1*=O!t9H)*j(W0v zUEsWv!X1&{cT{MZr+NP3wPj9%BRgWAyPUYvfDcp*tC56yQDOo-gc&;mWC?T8JKmQ| za0l!=b8u9VFn{GR57;BzQM_v);0_Ep{u!?Ajr?|6;{#mJn1`HLjA-=ca1jlmT3K*uCNNHpGWhCQ}bQj zfTK#mfMXfA{QbaNQn#{~l904(fvB#EAq2itvRp`uFYs%&e+bZL2TPRRIDIXsPe6bo zsEr%J5s?qR)Pj>|HNn;rB%oE_To&qKIhlb$a0fj!B-KgfaX>Wg;L6xLL0V_d;6F4ql9T%gkjjdG-MVcApqVvq5tlV!4n z*iziIiiZBgMQ9;mj+7=kVtfbPzC~F<jeR<{*;Blr6`6Uuf?|0Y0F>*e{qLDKemmrnkyLf9E70bikd=SJ z%3Jo{KGLt}ReENChm02viFB-dso+RB(_ZC!NDB3T@}3*aQ_Y4nV`FUCu{%_hYl)yD zJG$By{bfmn1V`@?$%y8uuBsWX&z*SxegFM^F5~-3YP;bH7pZU$`R@F|sh3;;Q166b zqOGK6wQztjkb2`LN^OK~qTZNs`P&kkJ@tnO(O7FpdPp`PPB_^~A={1}<*g*jM!=E{ z1%jt;!}%Y%Jur7PH>z^owU&{qm#FRjW8zWV46f{hN*r$hjzv*6`BEsG@Zm0r^BUy5 zeR=9oc&VoT5!$oq!!VDH^eh$#H$q@J6Uyj+zj-Fv{{Uj?PhqdF&Z$8y4`jwd3CyzX zWm#%$U$&oi&Apj8W3u}z3C?ug09m&V}P)4BoBVZvTwk{6WNLV{DIwmd+V zcn8PRA%$?DpPFjB%-KXUHSr0iEqEYIY`RMaj~C?m87DRxU%etS!ovWK#y7G~pH1*~ zx|9=)A6Hk@pkmbPP4M!VcoMo*IZ$v?guju%KAEJxX6Fk`g`%kPe=TmdaW4Z&@#uQ? zRbc*rh}WIh+)1M4+BYFoH^7oLq?T+BR=LTVOi4ExMc7%Bsu{r_6yoMCSlvV+CBNIY ztevXnBx?$rJeUwVdlQd+skV`$CjZWL<<>Mt`bQybxg?Lqy>1shEW@lBks8m3fzRP7 zZM|uP+p~PZf<_w+3WWUn>fu5r4$xb(pv>tZC&c4+vf#(RTz4ShHcjgD4our`pe8KT z09nvbLpAkh*YN-VO}QcU81R)5@E3h3h^jvau5SndBx@tb9+3^58texoNo)0fFR8RT za_o_xTVq0h<3am8@>mux?J~5*ii~tgY;}PvD_}Z*#D73kPa&bN=bsLyk@b(j*G#i0 z1-b>VH;&tWwpW}XATd4vi>v+E(wO^-ge z5tYlUeO^g8r|xEY??lYJBxg8=pSz8lSlpA$z>dx@aul>7NBTXIR7cmvP0#;TOMI1# z&KY*T7mTU9dikqHH!XZyIbvcG$~Xf~=9;jknn8(}X+lndSHnD?=EAYf971&p40>q} zeHLNs@2VXPR*nV*zl2Y)8MaC6K$^3gUi4O)v-U%uwGP5jD(z$F?>o2S??gvWe+aUR zLyFkB5F&V(2nRR>dw+CKHW+u zI=hm=QPh1jcnKm2(8<_V&xZAKs=*Wh0X)A+W-;B}=NFh-KL+uq&J#7pqN zA%P?}o3#0RNiX1TLFK+IFi9ZrE#h-xC+-#`lv>J6ru^#LCjrT3fW0Skd_}(ImEld* zrWTuZ%8uY@64J|mzxv>_xgf^B1@ad!g?$^K)Hh8s-$c8sF#Z#=eoycXTwTFrIT&~4 zgztts)fYyze}0jg{lqhYKLRDZ^q1=R600!3X3r8Yf3B}WVZnuU_x+wxbG6XzdeX(6 zKg?yykmWpGxVlCzv*VoWYZ04{Ms91ueX3yvUpUK$J%nJH?uF&)Fh*(@Qiv_ifS7&7 zR5>p?G5R4W4g;$j2K1dxb{3|0QwZtf;Ec?iPS*F`yiO8=I%)iae8Ql?I9v#&+Se6* zUjn`ydFQM8_`)luY_(=$=Mh#qPMmn662?1c!y$=hO_VW+1+&E1=xr|Tn`b&0+4E1y z5`)a4NJOh!&Smqh$-ZqVLCUHOiM-q*93V3|r@jPzgZU@)Q=F)~q3&hHF@@HSP!(`tGz-evT%#X+C~lwlh1m z`S6cLcUkdT)T{#ZL~@QwpAJVum+Nt;Mpwu zl7mPXkkx7Lck;W%@j{D&TgrZ(q<^6uKiC~q=W%?ktn`BCXU6EYA+eMM9yR}M{7e6# zUt1RrXXHe*A5ksxYVa>gRXPQvnkDTCFT z67D0Yd?GA86KN(#Ph-l=g(OxU-Jc0&L|ZDrxyVjN==H|-7W`x?KBHo5fnH1d@#nYR z`a)GcXkpVCuZ*Swvx3;oyBS!Z1@g;@9rUi6rgQkKePx6Oh+PLv7o6xAOjp6Ly ztlEuvw$_O*8r3L0wBUDLNW=(Y_HN?}L#>H9=gbi{?!#5oWa8-y+;LV3cRqHUDcyNL zj6-4+2O(kInkIc3S~C>&4CLF?RMwNm%G_8U{c&DO?vNGT?P9=m?|h#tyU;}0*uN=J zoh`Ieg*M4$Q2^987D&oMS?pB9Kwa**Qa4KOJUGiga9>^5I-*`b0aZ)>Z`qdDwC1pp zn_$?r@YU*=@VCS0U7SYW>sS4L7eC_u^5oYzW;cs!*hjb+gOei()TJS(n=l{fPl~!o zE71FuQv)By5huK@LT0jklo4oU>}Tm$-=o!Y2d8@91q{qx=LMJc8#0a^3A$OTVpht% ztO))E>GDTZUee6$Ob&^nGt1rdSB&iz;ww|Pe6u9~nQh$+8vg*BX9$|3sX;{V9 zC6wot->YzH0pF_;w}yrx_r$zPuOl*QJ)EF&4|o+>nl+7Dnr@N=ltFGyoJeXUH{}8H zE0Tr^+-Dw8iY$tO4odJaN3j?lw*L=RC&BVGXl-*TcxM{sIE+uex}wKcz=~M5Q+}C-Up;~igIBh_ggHMvcWRRSh!rE%*%4EMTwPPw3EeEeko zzbKWZve8q07L(~I4Er1cktU@&7J@a3JMI=d@0^R$H<2|Hi1JSak2D?X+FA&7$Hc6G zEVtw#i!RmLw<$G3j;vSz3?;c}=8gHeF9$c0Ev<@ef4<4LmClxU1wbWJLt;VHK7vo} z4?J2L9vyrP`+>WFF4762`h?K`2Zf+Uf&06NEmN6wCk4)cQwNqrNy9L#vdAwFf;19v zS5GjQQ;L3QCk@ z$=%5K$#g%O@y*aj*huQtN=n_eNvjL(SyTBWE8}*S$AV#mb03k(>3W@4S0P}k`7pn& z1$qMaA^0Mb0SCj_yBTS`b$A4ylsjUJ*uu}dE0r_8_Mj^A41v+=N_A*gC?p?EBeR}` zwo8alPa}vm@*^bmn?92eQLWKRqfvnL@$jKw-3O^U(CauGYxcgO$qyx_pE153N%bgTd*+gFKNl92S&{d>+xYCrQ^I}6wsUw) zE84i?J44`*|3$;5L^AKkxd-(DAIF!OD?q1GarlJ+<6_E|WE`58*~h^ucXYx>K5^B> ztEh%F?`b{fQ3wv=AeiEm+iDXD&}B(?LoqKg_i3(%E2!Z-YZ#d1r2^ASd#8J^9n~^? z$VM5|Q3C*rN82GDz~eGu2UEnQo^IDro!%f{)X-Z(Uoy^VhitQexvX{)$>7A!vJgL8 z1AjiDsNAC_$^Q|ySN|b&XTwMlSbT3`I+F+|(=T@sT$o_>Z+K41uUOxMTUa^pUsd^6 zgq+{MvTqoq@Pv9b;YW_*{4?0-<9l9fPyxe{^{ulPD<+FBW*7L!G>!ZBn#J0pGm7KD z<}L@28Q*H=$LDyMrq`Gso0Eg!D0r*BL^Vpq4mS#VQdFz^Z#>Z@k-vNi(IyHtn7a_% z8waUp!uAUyK*`xZWStMu!6{?PeqqnV>dSN~4ZZC}Y3rqWCxoUF|1>O45q`e;xsS0& z%l0u#J$;s9Gv4VF*X6dhZa6o#fl1JF@AHhI1&S4tNu1Dt-WoeiX-%%aLNt$$`m->z z21MJ%5^dODPI~@kGy~0tmK~*r_=itrhIDAjYme>HU1A_x+ELmGg|os%g46-Q3tWTJ_Nqbq-gDTblV z00A4-c*OPQ37ilIX@rDR%5#iwo+Sr3_Y=_U!m>R)s&AQ0Dpjf4<9Zr~Q_B3r)JjJY zrgD>t%77Z&p+6B``Ou!L%E(J^ztKA5!U+=GpilSW+p4r$>rQz}F$~Y<=*1#VwTJ)Oh0xX)Va5lhG z*F|c4$o&h*Ys^F^%6bO~42akn;+j(rnN0gA&_fkV3IeHHfqvzJl+iclHju#o@Hv2= z<$uMM?onVLT+zw?RX<_lMF!B_Kk7n*n>uV}G|Z;9%Yq*KhF%|zJwqgQdJKDtf;|z1 zdCw(&=@{?|8>h{Ag#&|V&Spj#nl~|+{-4Cix-fZ`8>ddGCUkd*p5|I2&9{Y|@M%cJ zo{2k*JKf$xTKrF79-4!Bej*^Z`|5bAALD^$u61=m_3g!*&YNCb$=8!idkXzFxOqBM z68=;gv{eD;D4qne<%-%%`|*0kmY)en_)=ylj82xr9yg@W{3j#pxpe4>L20Xq(lqmx z9>yrx91raS@DT)!_G%w0Md($kKPZJTzPIaRPVYqg%4Hx=9(ibnAN04Mel|;OvdGOT z%7&_^mKHXci=W4;0Ot1mKjH91al1_aEG_wwz}G)M)eIUzwglBO8LxjenN{!_1b_3Zq*}|U_>^KThDy47~)PQXr&kWgAgczF3lKg}9=ET`l2U>bh(W9ixogJL=^*YWrf}TG8AINA`7uT?EW9|`c?N-AXSSr)v-F9Fs=9WS)XyqfLA?37kXntUM6lnO zQGW-WP-;|ei9%dRP>)KepRlzUv9gbcc~(>M?T;4ZUhj3y&||VQww6Oet<=d9lfK)` z83hk}P5-f>rvVHHqYp4*k-#eY;*8^Iup!mWL{1>JIPq0qlvqVAhiDFm*-f9C5E|oC zH2Y}TDkfHekODIaIuNYSzo$lP4`)vMj0LZ6MGHsbhjUhpR%;*d)ZJ{r{~2sdi$|lo zWRaIU&x>BnqF?7mfT4-!gH%_k6$;6XMT!gy7;Af>K0AKHpTLnIsRc|3=`?jhX=xW6 zsIfZd-iZD;AWeen&4dF;`cv`4wTLY8zDVr9X6qb%1_%~(EFiNe=Bq@k1cnxm14*x# zlqIqJA+@mdm#{E$=k<5Ze2N=>4g}j2g-~ElsI>)eXw}Z3&0iL|7-71Jr|Pz#_!_se zi>*7**|mNWLP9NJx}pdM7;7keg+XZA<6Qs(Rx1ol9^a~87Ri~2P!5Pvlaqfw;}u`C z4Pk;n@W;k|EPXj0ZWrlCunJmIFe;7^H~Pxb=#KRK{!FQ!Qa`g|v7b7yt*u#1M)Rre z$Poz1ZHWRP?M>%HuNhIEH1H|GE_0fWaMj(u_1m!vauUVpa!u3e7l0BFGODY7GBRG9 znr1eL)ZHF}halL1q0cPjT1>~R;Nb<@NWC>5ipY(xx9zB(kxIZD<_)ARPjOZ;V;=do z7%=^^U=2av9A6Y3to3^mk0Drh%|iTEFiT{PuMdcQmF3$t?;s>*t<#azO=nL56%{;a zL+uXH`)5(ZW7WKue=Jnn)K148@J8h_qmL5wI!i{SgYh(7rZry%)RA0TBfSYGt#=#s zIrDXw{&UyUeam|Jvvj*Umr-hXrJ0QINOU0Evj!nMtX<8yfrEGJCa=}ChfMfW(4}u* z%4h*`d~WQ!*4nju+n74u19?oUlZGmFZIiPP1wElP#F;wHcU=I?kY2P=nYzzFK-XXO zW*>+3+_8{tw{o5^3KJ)dgg)5Z!(8fGdrpf1XcMLNMZ9EQ=bmyNZ{HdNmrohbsoqQg zUy&WrceS_SleMNVGndl&28CUBLm2YEhuE(H6jJjb^YT58{w#BD78a0$QM5v?gNJ-r zmsRQCtNbWubGQA2_R_0SSx6N8PLq|hE=xy))KLcqkh$!JLw6pV0STi!S&RN&{F9U& z?yKNh=i(&2T}E=JPp_QlWUg0_n&1}BfVq=xX%Ty0`>q-_&EbmTST!^=RJN&goF(M0 zP37-`L{H=xS<0=Maw~V`H3FoWA0a#MSpCTo+22F0`YQ)uw9zAhr;eG19NQg*En$Qa zu6|5TOrD^SIOP>wjp`7kUTdhkbf&jz&!Tn<3PRu6!WKo$C7cK6#vJ(Zl`^KLhYQ3R zGhX0s^>FRe_@_W;k%5bX#=pd5EjFC&f9H&)fxL=yl{U5tgK#@Ss*y^MZ~XEGh1gCV zg+fM@+DkvV{rtHNqf9R*KfR9Ir(qmIYPuiCVuf#yAu@!1JhPLNXcq%VSQqu_A%nbvb_@E0+K?i ztm<;pYN1A0Up_@3G!su$m7##x#;rhj^B(OT%B*2Nt!f*DT{?1GdA{F-@_lZub>V&N zXJel;;6S$(28ikq9wAZzoCrcN`F14XSV;B2``)0@I7}3TFk+YN{j}>JQTD*nZ7%;F2N7_$IoaNar@+daX!b^; zBbqGuq-~p3FIaqZ-tYFt;<@LM;b@txi&6}It4NHgnOAfI@EW{DB!;kLj@HbsL;79p(MNrx{x&fczL7GXWidM z3C7I$k(C)vGk?2WS);D=&C4>|eaG?=_J;wHDeOZa)EWBOqbcViIVG^I4vheEA;4j8h)V7IAsJ=_b%!gniHGA4z4Z4f07TL4i>dhUvwN%rd$RfP zyJ6K!K$lYUxoThiNInG)7ApM;T*L3FXjjN(+sTzN91MG>zXOB@GyV>u>0e zA4`H^HK&17--(n2vC0}6EUK$}?VXq;tqM%_{K-}(g92_Au({=Ci~I{(PD&vV653u> zCjDKfHqk%WG*|1je^{rSe)A&w_8Z#1{%V;HtOg0?X3N-XYpX#^Q z`aMtgs-Jgro(;F5fa$TSJM&{}V?xG~bK4&jng6wq|f7VU6*(X&>eE0lt}?qOMF!1$DT z;S*xtBqh!}$_)5D6A&xVK7+Ieu&V-u6!HZ{9yhTLC7-Plj8g|Af4|8Qp)|6DnKO={ zqk7}OeI@Ni7zL#yC_b*diGN1@SLx!JHX|^w6~n0hlU}jr)IWWK|KQ>;Gm>A&VslV9 zB2j~ZB#2@aoih1Mvh<#3|GOC3y04&wtRMW_&sw}@MW4vs-x<1JWr(|XI%GI3#cN}3|c{Yp45jhthyW&r3atg7_NMZjtWrR}y@<@LW^QW7mX zKD6`qk+cm@_GSZKwHSj5Ey9AQ(R#oNp$PX^TPloUk@?orPaN^ zrHMc|2aOGY%BZ-KF%DWapA~k~sfbm$*e^WzI!Bhpr#co=obhik0};aAV(oQQgJQjw z`RX?`G$JYoeNMY(FTXuf&o4`8&CQ|{RXtDP><|Zpt?pl0o4Zu4YU19q>E)T_3}{3N zf}niGCXo{D92p%(s4ijzMm3usDOJQfxtyoCQ%-jT73sjxsg4hpo z#EsUuaMHhcxtK=ko7gW}Y!KCjXzz;T6u|)5GPU%!W^f2R=0-a@!%xx#@zl`k!nifz z*o?p;ZCxw5SeNgXa?dhD-D8@c70U>AQ!%IyHW+JlGk%V5pYycD;uKL8L1_CY@08~4 zk0tk7xC+l@?c@{JO2%-z^c!!cYQw4`n1%MFnb)X;#naf%*ZlExrC^0rpe$=E>%^{4 z#Xi;}Jb9`Udq-H3W`LB;sp1m$4k5N^zv4ga9aQ(5c{lM^PHh5MwD@B#yjK?jV4U*F~j;7ke&OHhrx{@Xp(#(TW=+2(`{CyY4K=S~_ zCETK^Hwr~$vLHuyII^JYuNA(hUtJNmn}P{?{W4N$Yo~qQUZon1l2uK+7lR!o&i7rf zD}3G~l%WMhUY$G8wef}I0aZBq>exd+ooCbsWt0Z#AL32QaJ3KStgD*r5+fGWh0ma? z#$G18{%oZ+QF~A7^FfKQ-i`20^EYH$WP2W_jq@$l##2-n^~Vg-S+SxpC;5#x&GKsVxG1-68QggYz$w$)dp=bv| zUF`gS$5uzuwN0_o(^#dY4VBg$U?Vap2fX0I_KMBSgI@$DNzz~kHvjb>z9;sDu<4SI zet7xg!zGVVumdz`(;UY>UkI+cw0*C6r_;g>?C z_qgSF#o#p(M7!r<`ld`Ktxa(jo_-TS%MsUnn_s{@^u4(z!5xH8KSDt#RZxb?gmb|3 z4c`F|_z1s!*0{}j0F$;FrgqqIKi;mzd9K9$(VdPRuqExp4!x!4&9zjw!{b!Rt6%oOg~b3l7Wj{(t`J! zi?@7+6dF;ia|iNw`HGKy2X~wNr`vF?=8(W#(W|M6W?5R(-q$Ao4WzeTjQ?$A>Kb0D zTO=MLnobS@#f_*Oo(Wi}KzQNc3AIHgCv9)Wa@N=oYFP5zI+~VF;}*9T>cdq~n)wNq zPonx@(O)!~#%?Gg;|XWnY9~*C`m8wkUn!9-D{$U(88&<^Ug>8Ou0VSls^m*iXs`*M zTD4|jmb|Wg>Xm-^wdZR${^i+A2!>Lz7^M{kbMdZv2yZpb!Q=$IlMa_>j0=62Z!K)~ zx`1{cGC!rpPGJXrQ3muWV~S0$%)?6~ z*e5Uh8Q0k%&;q11&w-Efu$(%-DzRXXp@ykmp#qAF zbL1i7z+)(w2fUjekKtr%CPi zJ>tedKBs^Rd4FU#HB(OK9YjDBe8p9Q%2$evFE_kne9T zBszcJ`5w%gSddqmmOK;$6AwqitHk@42R=!1P$^VJJ+}EhJXyVG zxFTAMr(;}Ste#1fm=&^8O3JmI1v@)3V%cnjhBse4xU3IAiZ)o^lhYW_VwsQA{+-GH zx=(Kz;(MzF4i{)hEe=f7PuGiVXu#mmxO~T6dl#9jcbqER7{d>^31{8ixEvVs`w|?^Yn=^%z zT0r+lSAYT(VPWOm(l8t;9C!Lh{@U%EZ{_~5Wv)m7hv>;x3XR9K;er3QCgmkc8hPvk zp61W;e8)7hPXJJFuFIeHqNr>AC^uH;h)cRMzINbceztLHX1~5pg#R^&v3b7QwX5NBdW~762{~O=@75tACiip}2bEv0O zJQOvPh9k#}13pM&pA=`P0NR4Iwn^ATF>Yb4zZAjxKNu%sjt(z|t`%&eN{61ZwI2;l zg8_IN{`2s*h}2jPq5bIJL6PmSMPOAVA$VzYDGp(bKnlHpW`^J!!?hTPC_ z^|`U=cnTJT1~2;Hp?>ORw8v#pC;iE)_t8mEpn2y5j4I|go>R9OpuS|x;&`MAQWfe# zBnWXjEg)MVo1Wfs3d@L}GXlB158n}n6I!gmm{-GvYH?Z-)g-0eGKZf3(ts(8-gi3d z416x?^J-DCfFXjY8aoBQmygN7g^Lx<)r(oOqf*1B9s5bylxq&MOGUKhXSs{1C#Dmy zh>5B*9hpS?RCGWT_(=pT>i@^8^cbzrOqM#4zmX<+WOoZjb8pojvH$sQWyFP;H#zw? zJbaO3&A1?GQ_jsomWP(gK9goGKZ&i-bs2KA;#SrQlg>aF(kelOGcqz<#bayU;G3$mAO+-s8cD&lQlXe)S7*yK`!xZvXpVhUZa=aFfq;jS z|1zA-AZ`pJgW397kOMdg7fO`?Lbg1$(9j2{l^M#*?MJ7ryoO2iP0KMn&*1_!)l=S~ zQkFHJs487g}yWjQ;(N$lPK@Q-fupJ=ge$=DHk|s(PJKU@O7d7|qv? zvLEGq^h7z%!4--zn}h{~*onH_Sjj0JHCC|JZ~vR@P70h?=rF*wgtkB!T0^^GDI&Fm zpy1O)Hn;Gp>=|1Hqw=4S(wu=Y*cpTpmri$iZNxaV+qI-CDwEIJoxj|3B22NwIu$-8 zZj0|ql85bIHr#1m>16Cs><}F&SNzQ!7QUuoEkyJ3>UI204q3oxDyVGYg7q5YYx|Tt zrTtcE{snBg5(5Mmch>*Z(Il+yyU{6@hO%qYi;#ti#O)5SHgfd?3LoMBL%aPU^^yO9 zcB@V9EiWS3@W(e(7!G|?Zko`YeBb@;&hC|bpESZd`YSII4sDA2eQ%=S0Ri%Ul|T-g zUCY%&7d@h{0jc}P1>^wZJt-DTb-DwUDH5hZHXAA1=z#-R^tA)j3w9;df&=B`WZI$q z(Fx7BWz42WUq>PemH!(k%nToaW%?F5763<83;Tk8*?Ye5K0ZsN6LL8I_F#J_aA=87 zp#OYswRPn7SC1Pi0)N;JE;8&-f1Mbc8pajDR9i{s7}Avd5hokut*Vrym5DbAS5mME ztsfQmJ)s$ntf>&Y0c$MHFMyI%4ln9Zw09 z?XoPkVbuK(v^`!Yq=`_VD$l#jk{cqdl5;%xJsu!W$2Ywz3pVO_UXVRNL*oY>3y?{Z z#IpV8ouS!<2BFUxHVTUpGPjx>Xt>$Jb0Q0I+&`Bfj`QZ28=*WlsY_=C!0Dk{b^0XG0(z8zoj$ANMV0OqYnCIQrF7(Y;JcHmD17je`9MHz=3II z0(w@7Bk-Lyv?Pb0W7}~<5y_r259w@)KBw}OgDvgHjd1e{|G)s@VEj zaJ?*xcjwnRn#4qw5CZwUR!eh$0)(KSQ?Nlte6{DORCF04o}js9g>hmH?xqub3HCz@ z{+t&M-oMD-no_iJK@2#BM%LTJPR57?B#0A#I>z`i{WHpR9|X=)5n9$B_CgoJi;$N9 zPD=W~5m+obbN+MeKbW)p-WUAaD*>g>!wgnE)PZMQg`ISy$=1O}f#%(ppRaFk4AAw- ztPjWtf%-jj7cFzISg&>sBo)7T$|qM=`e%;Vyf~gX*n`sjtqH%>cdd^E2#Ly?Wf#_V z&BeFm&N>?Kunn@8dl`@E=&QrFpJ{Bbn8*LyrsBHlFAWt^hH&+)YVzs3$3Ai(!90!} z$L8V3d3kIU{{<; z@Nv#_44q65nJg26@F|#I8|WRcX`r{x$)^Ejg!D2MqHS+gyqR5FgApCNX?uoj@)=x% zV8s-cE#}_<8)MP6Mxosu(TeZBV*g1am2o7*xn% z)+RI3{`0GFZQXsTw~2&RariZ!IM@rmsze7FrCJH!-PtI>P~O0;dZEFzVI;e^Nw^6C zWL$5EVh%bDS}+br0HjHqFJ48#L0ScVL^p8}?mS=?`x`+pA6GBHO0a(vJAm(5s6fr0 zrdwL5uWEm5^FC+9qgTk4#o;WPcFhaA(5s*sm|2WTLy%{Lw);04f#^tm1dnC#45ci+ zY6B32?l{ZA^=d4Z5FZ_;5V5BrKMZP7{FZqidw(o|cbfqN_GC-MPCM%TqI0THka`d3 zW-TH5HE8{HTndUgAO8?p|2VLm%uX@DY2=0Sk4{TZ=02Ji(|)(r(5`FOJ1g&rv~0hN zJwrl1g1eKEfE1A5;W%LqBn#gvITt zq65844&^zxI#<*A4399N;$+N=2XSmC$eJ*ycr{hL_6pJnNA*ggxP(gg(wzsQOBJ4v zupV0i!-WUJzo6Ky+bCtZ9%`g1m^C2)teywTtI1&EnE7phIZxqheT3=15U6rVaRw~( z(a78caDerB5}U+kCPNVLjG*xuU<(WV{$q|2G4w=!hcO@>KMmScUDs->-O+BhHg)3X zsOIJ3pVUtE=>{e^(z=kf6#W6yF(ZUyVBX`GX|^OE52tx*9<8fcq+cmxi7*n%pgfQ> z;?zO539J`C$Djf49`OgKb;j0O@KHX&y#}s%pq=&cCE7hCwq?`E2X`EMkdpPWGur6X z4UrPZUsJBU%3n!0xOB?DAHeXbXIBsRQ{ie59$P(S(;5S-7;MT;!l59Cw>k7J)G>y} z<7L$`mazojMi}5Po`|8spp383#H>;)b3jV>aP2HM0!ytRSAPwFe*?n1Yke9&r|XFd zqL5_fgi6$~K^l$YmbyFANA{1Zx)jj_ zA3q%+N4;nI!{ANMpYds0j0*N%pyNV+i=5E~gU>B&ASci3nb}m(I?yMoE@g`4cXhZ$ zhvCtAY3D?mXH*>qh93GQ^TJ{o6;}YTjEDMcPD@-I_L+W79JZgVUuQ=q3Gv&O4c^@| zSy;!nzm#UIN!4}P6p`%vrs|dw1C*!Z?N6lAtJ!TLBb%ke))O)y@w$R4JdYVGz~`_V`2UEZOMW>E^f*Ebe1k zw_zo^bp!`XK=h-o6_oR+UQNgY`;r+vAPU^~oBV?-t4lY_(g zGCUtp2E9yhjXEuVhrHaDmN_nss1ug74bhB;V{}|9$J*q~{QfO2stB5Iudl43D`C|A z=|6-MQRYXiC4)OYmk0*|SE+=4SlQ)mo58fT{&jzh7*z=>YHAG*?Z2ur&M`_a#<*cC zj%}7DlSDG!B4WL6H(sVeM!m}qLoF%IXXG#nffl+WYCevZ_n9`W$})PjSixbjEDk`i zrpC`C<~B_Y;b>RH;U5j9e?M`vOD9^@&l&cV>>zdCo_|MLie+7u_aK3OZ}LE1nC&qG zkGrL7de3``Kd^a0&}P%#pxdFXus3El{TefmG49)^If?awMM=Y7v}dk< ze!9ncqMpT(ZX)zXALHW)AxK(y2U8f3i4jKI#l2h3${OWMBjc%nSoYM2yqiE2)3sCxPW^6IQ%SZWpijfsaQTPTJUmt3|i-n<5Jq^OL0@t}^8 zL{DvJ{bWIO>Gx_yM-$6q&aDd_6}9@PorP-1K#()Zq|0RnTjuZ&xDeWmj{U7%mj;hs zmf{mf!qVonWpwp@&#>h@?qy0q+rFr{Qt8v@)e6s+LFz>cmFWgxWl0Wy{k^M>!Sees zKYfZNx!{ar*tA^)GcsNv%Qon}=x&o)mBf?dj)Qdx1c15?y+PcI$P+#84c#DB9#PXx?QlK3EvuZAR@=W zer9=my&*S%V;Qb*no1c$N+-tI>Ag3FMcvcH-$%DYL#dML;OL}Zz!mErC&nz3uGNV6hCy`tnT#sV9)jlA8hcvEC}5_yL9f-_g;1qo7X);cq6&4CEz( ziElw42@LZIB|8BLUOy3N2i|Sk;2;DB#?a?sLx@0ip?xtoV*Q#SsCJ5&cCd~}nLH7E zTpoSgtpSEj=2l85{c!FwKwqWMdYwp=+xn`E;rdDq?;8Jhv_Rj`lQRA%cg>w&lc8** z!`i-22aVnlzDYaD#(PngVlR-M{#Hee%qtyNYwB2l=s4Kg07-cW+tp5R2+*EzIP>-{ zco>4fxjxXe6Fr|h?dAgAZIRg5hbPmoBgMhAfke(MwkD&enynti&oaIAZb{0HSQ}O0 zgnPG-65Z$`A`nwAQnjY*dhS~KMm%8P$6!u1W}AC{F9txfYWmGPKgFn7@+D3G#qIX~R%o9dG zE&(}?c9V`yO~;oF*M37pP%;A(T)pVaN4Tj)Mk|>22;QO3{w(A43fv6bDKnzMAZtQr zr1mi*v(bMjoHz)UvDoZc5`Fu!W|u(h$Ty}E zTyCrDG-+p94*a%)HeJ!G3#FoR{r2^PMu#7rIY4H*lE;C6H#KK4@J2VF!%gmzW@l#& z5G}I=8NP#Vtxq9}p|}4R(c6V}{(f1}C6Sm2#%-^+Q&Nrhs@VP@bh){n1jnAyG5-KA zqmQTt(Ym2y8C0>grzW6OHYmjNf}`B(V{R10O7gKd?5j^neDqW|lF5#1y;n$Eis4b- zNQ6us#g`0FlfATb&aj0~)sPstB$u?XZoT$dF&87(cC!o;hXS`+uM8p`$dA_Lf_eqm zhA&+EkVJEl*Sh;X3%)o_zF2*UTm*k?>gDl@Q~GkA&1Q>t1*u7|{Yu@7Mr(UR6j73#Rq`Ek!B$_LB~%7{ z8BH?d6Qt?imHt))ID zzN8qqEbcDLuvFk6A(SJPoqc})maFVAH{qCyenpU<&;j$@?G-3e$M$6&Kp@Aqw#()v zJ4Q7v2kWO-f+S4wg_Lh_niOiUfS3Mrj<8OfSaeU;^0WT(7eSianQEAN3JNz|isd4i ztWgC-uVkQfOp>Z^5P3TPg}cDpF92=x&VehEUY zjKHjcyiQ(00T8+?+Qs{S3`8jHp*z(VB%_ z`N~l41lTNa z^|fqy-wP%64qb5)&2#!q3+Umm>jVf3Y6m(rtBg!jJwXX#4uW^c#5e=Iv)2_Y`Ddhi zs}~bvD}}&b$hnDbe%tfysv*Pr16??II_wxj6k7folfz%)xJ4+Dfce+D%t+5Ju2uX_ zSNaC1mK)?~A6)&a)zGepMCFUyo5hUr>nf~AjrN&dJzP+1hRKwNBt5Tf;{Q2Zh}TPO zLkNzgK@RWFZ&Tul|Ep$GL+Xv|b>^)eqn$frqO%pFFUiW`uC5l!h}F}}=B(X<_t<%1 zD~$v>v6n(mE>)qRa~SDBqMxk}6(AkfU&?T7J3==wlI|DNa65`&s$|l2D<0B$Xr1^_ zxUKL&PkrD3-jsmB8IQ!0{?aSgJ32YL^-)7||U8VL;rW19Qf38lmZI!zlD;JnZ43 zKdHk1D;pT)dy60NhI+?IbwRpB#5Fgwm=Ay$c0C(Z+`2xD=EyI~$R|t&ryu5`kU}GZ z&XmW>#2yVsdisP>+{Luy9!%$hsx zdP{YFL)nIALf)VK7~95Z02!-7{af(_9qsC z+c|?=dWWUmnNeOxM2(-zknz`kmtdRN@vX4lP3xzdu^K7MOA}2^VE^!eIV2LkzD zLwi8BDm+KzcD6dUztrEmnrhqX$G(^f3&*&kVCk!*BR8^JPRI%wTduW(+X6h4o!O2D zL`X&QGQOon;o&!>NAu@z%PiK+0$VK&78mzr$ivs@sTu+UzU@9rbYLw`(x$N)>XG$7 zKybLqXtG69pGf*n$Yji0T9j2Tvjb-AdakWS(vg31mqt&M5-vi#f!_Cb-;upvax+hK z5|UOcd-{gf#gkl&SHcGh&5KY#?6m{ji->sB1d@@9?XXd`O2>Gq!~kFRn|{;MPMu;t z?e`PKc4{^;8KO{&2wS1Z&3)!O^280>hyJ4J+vJPCCLp*&mYqAYaJ#%>y)?MV68s4=ZY0!l?YA6aMow(@ zACu>3cO@#-9UV-S)EYG{@tn)JkHkpX5c^Qz^oFc?NII5Gixap5LW~pp=zy1 zc-{RdVE%m6A)GMlVTvv^B6V6)SavVn4`Xw4*K@FWd>Gh}Pcy;b2w4-zc4mR*axo`9Qemo8>>BCUFNd1uR+l` z6=E?!vZTkNwdMz3gCO=|JoMy7CCF2BHb~>t-5#onfjSSPh>taO+Or!5b!e@IW2IDx zZ)`Dzi1g=Z1m3y^8>_0Kjf&VuEd_(sS_V%`0SdFDym;8(9ldofaJN)jTXItsrsZP? zq_K=dY#spWhah%(6Zo!u#9ac+&DntEF$`L80P+79u70T%fy|5()&y^I-zZ|{YnZZ` zNWF^B#Om7RR>VMV?leS7U%Zm=3{3K_O^eAV>ja0K#n*-Soe_JdL13iC7H4)X4s4s< zBLtSAjOBzDd4WIIg|_DRYr zWQRVmQ4c}b|J*Z@oMJF6$|69osAps-doVObS*iH{up^0$l{Dd@A9>D8k2GQ$vc1!J zy{8>yK){-m0ztl8LX(}GO>rqaoTQfgH1|VKypSid;;f)00;Cf7OAUwj5tXHHCd~yz zWThIb$W|O2zW=w%Rd1rKrpR1hxLsdCH=q;oTJ!;G7S@hYj4E3@^VFtn9s&D#JRaOD z23TPA3#qIwVVcrn8`P8BJhg~bm0XL9iq{z_f{qMX&br>fM*#XT7GHNlQ^$9;t~PeA zW3m2gcyX?yS=??pWo(q1&!7G^8Xh&74qou(#+|QBD%-6>&sOk;kuuM3%ZW&HzYd@S zC~Ilek#o|u1DI?zyLsv_C(6Eq*%_Fwj*kdg1lbL>WQ_JE23M=xD9xSBd47jW2Qb|Q znTutm)duH%A+yXJwshhA`X5i~uQOKQm0ABk00S4Rxk5K)xh>sSAq6~%N?n#A{iW%m ziG#y}ix-elUe!ljJ=iUPAE^{>JWy02AP9ryBgP<0p&96#xpn|!2@D9~BhDR=qQQFl zAp(`r$~+C(rhSy~ei}5?3z#>#6aiuw!2?7s?j$ObL^`-~axtTp*O*Karn@S_6xKvB zXKkKsGS`li0I8HJE_<4eR#8gw7?>nr+l&wBVTKSLl~kNb;p`kkjur}fYhmdKCzhOq zSF#Z*Yx8p<;lsL#jRJ&VZnX-q_oh06ZGP743>KEZC5aMdNhqp=(moVL5O9rR5)IaQ zohy*{x17{La^=TTlFP;6@n37+sE1opM^rW*eE~4@gZcH8(s+LE3x^jst+bb+Ewm&k z|05_XH#+lcTQgR51YohU+zdRGxhT{PGd|n>2=GUWTOIr$Ni(CkSuHcOfv)#~aZ&G$ z_~Kaez&b2g{FxlQ+^vxFas-H8>7WA2XXB+FjB~iN zWb|i9l*-sYPp#SV6MSFYwzW6(a#%q~FHlEo0My$=u1nNBeyFuIp3NsnLYav;&`U-SdQl;}t1}sOwJsV4MCUB;E6k zlx23)p44oR17$I`CP-GPJ$ry24a^ZSlq;a_eMtvM*6 zHNl0PMXf(+{zj>c9iSZZn&1H;w}AR1#Qg2I4&A5M*mD86adq}T*S;N%BI^v5q7kuhwYgkxT0C&Ur5$m_uYbYeYe+=ZPDwi#2vC-_VoCzXBSCBTrJwCJ1s(;HA58`dhR06EB z(!a0jjd!FAY1VucBMXios8Bwa^FN%KJ=&ri?#xq1&&{yku3uzX_!nU7*tR74HuCQISnM6;?+zS2p z^@LX|n0N1773&&rs^>`m*J>35PveU#^9_ZB*$l(WY_L7R*iH7s8{V(R-x@KvK9TN> zxm`2lkdk1uG2ux_zLr1&lZ+Odql6_B!L^6afNEzAf=uQgXA_ej5AU}ShtzHj>qfDpWqops@?+~7;9m_G*^L{xQh zckgJ66RBz=Va9)H3f$y5Lc~kdZTo4d{^`@3l`M^4lSzGbM}{vD)~xgdX%vA|`|V{* zL7H#VT4~{jHkK1>H^~qklU&x1@R@!wi)&ykqf(2caEFg5*5;x{v#vZZMLln*AY_PO zkD>fCz^BF-_D@KTmOGjHD=(0Vjsz^4M$*+_xeZ+hXrj9>{!jtB#Zc955mFgAE6jjM z7%DQ&{11CLTv@Y$+EmFTCUp}pwNNG%54ynu%<<<#>#|2Vylyic;t4!RAw%h72XqNX z=OIgHiwkJ6<)0}hJob#8nQkrIrUG8 z&=|)(naQ6hK5L&{WhrZ%X>!!mrV}CyU!_!+w3BrB7`}cmlK9l+RJVtGKadjtKvTJV z2lt$UmQXg&w#3Z+2{wkPp$9$ZR`YipaHyL~@%z;=S|2T9F)(8U{Vl-(HSRILXgaRFYl#5qs|BZq(s>EQE(qR;UYlm!@bDGo}>)eRnRydU3pP zC=(D|8psP5A7v|uq3^Wt+}$(v>pLo};l_@Yk4O6du(gPrs%Bt@`IJSpc!xAy!#Idy z{?=!IRnjd$R_?Bv>0?4;d9`Q@mJ_BgECSn}~@hiM);#EpCYlA~uA z9#8PXNI|J|2@m@WGXBBk<0txr|InpBC<9EIr(^Jg9|ov5a(mUn3MM)*ny5F(9I(~_eY~)m7s0SCH*{b$mkx?| zsK~Z0${&3Z$v7vgoCo}}E|Y9n|5SffHh&#-LRXrQxx%%VV7N|>A=W{T|HaHko@7SIKYTeOp2B9g z(Kb!7nd`FFO8E0ZS4jagd2ejdY>ZR5s;*<%{Jxb7xu+wT$jsA%JuWTn@;LygYV`4aJ=M64Y2 z<+bV9nbfH%<{@lO$HsAlnj(tjArJ+YK!h1%&v7jj<`?47vJs_0^L-HDSD0%wg6`;- zvCq(GYDr(1sH53T&VnzX!Ol&gYH)BU!)5dm`2JhVw!1X@b|-=jmK@}k18`D3Ex{wP ze+|&&Oq$(2G=kj|a#Z0#!h}&{571Gm2b*rdVuk-o#mVsIu4c{w1q+kQ-&^}F89|Mj zl;%wvOjwQ3;Ib2=ZO;4iFb!DiSPOHN1THSw0QU3%Lmr|q2;Xeg+zDj16giHhx_V>! zi!LyLu#7`>OCi8;==Z3xQ$?voQ+ zK`<0nWL=F8oiGkPObxIKU0lOUihqS9>ca{L1z%uT!@SsfslN_=IJPxM6Oe^ zniyDPB6F*27>_G3x3aP-2Lji=t*;#lxfmw|jJdBKHi6(Uy=WqAlnj7)F|3pZvbh>D zwA+_J5Bp~%S?5G{Np_pL3fHpEl|C4AO(T{&{t>l)By@Oi3^@Dc@t8vsp2+_wfBdH< zqm4Fuepf`uMnGGB{`q~rT>DS|dP7JEQu=(#Lx}X*=e)A~Tzg5sO?b0TFYqveP4|8g zB0DHbv#N$SuuZlp(LL(folP4&XLMVwzWL)c0f7|5-KK@IiTsYRbR^t6e!E@LQ#Xw5nn@%91Tp{k;rg!p)<_38F6#~|&?Ixr9~m%67aoK3gnHbTXiq|0&| z>m9v4+acmih%jqq;J;uWRE~SNl94C*nW;Zz&@UQVL2YdKFJxM2Q##;W##Je+Rjb)7 zyO|8?H@V{HeY90m`DOpFU}Q`Qmym5iVC*SvMo;GPj z9`t6V5OF*1IGWLsPme*%<15shL8K&;$7k1DVlW#JSSX#ymwI;ZliMv|NWv*FW!G{( zvP5mL$!tZ%I{|_@bs647F3YR;Ft%;f`4U?O?Q3{hLg@(e=Li~b+m;JVTY>Hxd0|Xym+iC>+&N`i7I^{`LgZyIf-0~%AW^4@V(#P37q4l`w#WA$g>=cK)R#%_w$Yp7= z0Yjhpb;ve9^}tHOs`(a;LY|Ug^p9G{2+fqmJ~}h^lWa#-giDekS53uXns3)nvl%!` zw)*BT6kEYfEJ{-lNr%A0VnFQ(G@hc0mt~FS`Z5v=53N(Cv=fnPiC^cD3?U&ym#nn~ z|FZrQc_Vy++$6ddP#`C+H{5~mWIlE){S@5QLa~?GeIY;L9i7b)5ZFyx99PyN??&91 zKs1Y4?;#|;R8Pw2vl!B=>A@X1Al}z8T^Zk*jzl$~UZWoMisjjM_$!Y1%xgbj77wI7cg8+R3~Khn}0U97J-0lX8?d}8ug z_rwGYLx~9184zXbaV~vv|Ss-dE z@zoTumL$@`MtGNi*hIbn{%_~|Lw-H!>}oz&Y)9o&xt5D;p1N#c4#e#=DUy^iCo_A$ zccCoRiFDwFAP1z`8PMq-TEw6RsKrXItjQ-JCM@@B+=zIa-!tGIszY3(jg}9vVWqwE zu;$xhMV*I&k#e``AF9#t{*Z&^$M2$~4toonhKO#E;^|7tG9PRHm%jHbaS;H~#xSD@ zJO6n0RM>cdQ+g+8&zKqfo)) z)tHLV!RFO*=^L0sO*G8Uezr_Nbe#)rl@9A$PeLF#Mq`D{htmP7V3?)QA4H3;D)h~0P5<67IKjxDZfYEU%c`EE$O|5yfrTbX?V7j4Hr-1UclyYGm8q>N|&QF_zh(* zUtzRMxYqG&++7ZTo+SAnWSUC;o$rxzwfe$B7f+Lu4ZnGsU=x0y+x|OKtbtS5-1fVy z7XZc`u1QQx!+XW&d38?HB)`@E9WXu<>X$y6o|td@$C7KO27r_d@c1>h@qiwVNX+5B z9_`{wk?O_5n%4*>1Q5P)56SD7?iHPNFYMA-VL_aeHw-E|(YL%&!K(Lo=&xjI`VR|< z#A_74q9!rPRDv(4CxgEELv`KYDnncub!;j^Ls9_^aEzd$JH$9@g|ZH1PXqq?!5^-2 zVh}y0v2RWwFR6Aeo-p5d}J1uB1UIyCSD^9RMa2EJ zE+=I(%b{S0X37bsfM~eawq<|}CA}H(ezni9iZ}l*Q1{L#e1_g$*^l_zQm9&S#X>xL zYTbxXNvNK#JeQMf_h9RTV(W4$XJL}AERwXodgNK&TRA(^(q0Ky-ei%RI3})q&2;(D zV?4R*ao%U=Ix^{EE}YLW#3147;;)r;Q0{DnGkFDd`7-;Z%EvO+v5`X)6`thFqICup zU|T{^?M8u&f(DS}|17>N#IOidi#Jqb)sy7Rvt@cxZUx=k z(hiI6$;?)L`TO3_nyO1Ag~W3o1plH-pIXIbhH3_If=Bb%mx1|Q)dEfI?|Do5v+4V; zq35AYEY%L2NSO3Q|2#yXofi=Ox@IF=p)&^5qe~Eprp7jyO=K@uTg;;=jXY7APK{{} zYf{N)m6=3`kJeFC2KHIm>uqYb|DJUn^ynkiq!M-7nABC&n@a8$w!w#`3NhG98@_K* zEIisQY#)?gI_IjS?>iUo9ZANsWiFJG3rDldo1&z3h?{-2wC+Z#I9P55dsPL#R;JnY zi`)MVwi*9SlR%aLRzEQQ9C~Qwt}7Rd4qj836jK?TCS`23Lb#cm$bPpH-DWg9)?kJ) zB2U-HvM!52Gi?*f)H%-nRgcUxwh&gE&^xZdoMxn%6t8V42BA~!d-hKP&Qs&*)7f>^ z#ZoD5rHzQ2 z*f{;y-X47&{hIEqln`%l2fa?1gIQ5ZMj({2-J$Ba4Oy-Zd>M7XL)Ln2l`;vp1C3j@ zgkb#rBvXgURfp9PZ7yohz*0!t%rM#~^v&b)?E)X}pH2ZTHS+u3!<1!h<}el#icqGb ziJ%_5T)!P4OLHwFEGILn(!%}LaxFub3BNh@N$m4$y{so{@qc9y6e;Bsp3Hs{a^tW6 z)%jTN8p1YHp4;BdcRvY>J}{fqHqtznx~jw<>k(yUzaHEvMZn%IU?r+O*$D(x7ns7j zZsPsncI>ks;ArRBUHSjnD^9W?cC4&I-pbeyswu`SqYo zCJJ;AxT)C9d<9_N(2H;<#>hWjT$c(|=za#gStSKU$B?1M*eK!NWY~x{;2(}s=q*?h zN@-GFGJRp4wVB~~?LnEUng3<#Jv=A6wb$fpO)+W;r+3#gIDS+?zH^HVP2aDPA;)q!PB z7*tuWKXSV=Z*%7pPk7DUpXwr4#$Wk8v>XrFXv@wS6qbQ&XY(^{pB%%AcPn*i(aLD@ z>UkyVq_-?K7coQZE<-S$&h%umY%$$aG0d+CYz^BI5Bq>(Y$JWD* zfg?OMM~WaXH&)Q<&Wxl+0N-Je_~bukL>J+{NTGPNK(T2EZ412suH-F!`DkO3_aEJ0;F=F}$St z9Ts~W69^nWiWI88hrE);66I2kijRx8(=fZit;B@T+~i1l=`;PEj+0a$bg^xwf}SUR zR^q)-ybe*a{LgRbbFHJ2$;4#73)W7?&vyfF9U;UDXc?~1)H_8ekn7W>Ko*fw=oxuYqHok`IL#OZD&#$0 zyOXlYFga~6ma=Of1?i?HrZG4Y{hfSy<4+}1;eMko27zlD8Px%@%r7 zv{$sREogvB_)CC=Y5`gNKYJIAXM2~;YSZkCwn6?Mv}T2AAd}A4=Ai9 zagrzMsNQE0E4iNDq8oZ5o#la~h0zU>e()5|aFN`;@tS-K*`E2p{?n(Zi_#!n*;4lR z=q|%w91AJq!W2Z^+O;0`HEhvrC3=z!(Ych6oaqIcMs+fbw7kk;6a%)Wabt)SL(3ju z>M1tG<;aM`@pm8%}|mtXswzHpg4i;YU@QU%*Ov}(P|GFWu956WxWHN@Lb`#LgH8KPA6_|V zbTbel3}$&GpZ@7o)@mgqsqI?Cg&G?rp9R(SLX;v|Ou@|{1Ag>?J#b6|&t4$r7$G~3 zGD^Qw=Q^?McRQ3d5PM5>|5}Q{#UrU}^p?@`twMgNziQ_+i~ez3d_eJ#4hf>dJ6fsS zq46j;v%Zi71aFg$ec8@5`|FK`ifAckM9iguvNA4CA<1W7RENr%Gs{3-(LyEPrb21! zjey^dMxR}k@xqf&_kE}3&oa(%HR=v_rP` zL8?A-ixS5;8GjvBU2XCR4T_R{4<+tSd4}uGy(U7%IE@4% zk;s)k>|EQaMzjAtQr!MGA8C#!F5BV~h_GG*gechr9fp*?g87ny(zbxF(pCG<7NZie zAfge$)FR|A&8oKw6Uk%G17=piO$f&BK9olUR zykP$Iijz$0GKd>aF-u~>`BX{|TD$S&4}6Fdva4DbQ_Zk3m<=1*r4}Kzdg&P>Y6~8# z3Iu&guu(G?H)a7gRL|a-GLdA=%)5c++a>0a4oQvXis&fabuGYvA$>b16EZ>=Gqp1DY%;^N^x5| zNP=67W}@2X3YoNJA9ou(2d`Mo6hRAPb&UJ7|8QuRJ%iLsSun^_N|>2 zjrP`T{!T^!@R9z;0dNHB-KT-;_{4&^2r1IudOM{i}X{(>TtAKkE<6sE& zMMq&uY-d`j)%e!(GfwjfjzJZj5s4)*EH0>?~IT{FWi@<)ic6YDB5 zi2e29e>0eK_4w=)vxQugf727rd8)U15SDWh$B=hLUuS|{*AjSaE$}HXg!+nJ#5D|B zAd{%>YOEv}x~3YWK~h5|-w^-Usy(~iFHe>oBUT%+Yv*R0mRXUHlp^|B}6GK zY^1Zx`KqM(!|txa-N(;}7B@~s53jhEMrvsAZwpl>VeUdKLB#GyXm@Es{8!LTQ?qE& zqBY)8JEGa^(O^l2MV0iMr51*;*)$DB_T4OFC&meoYvLH_hV?IXnu5ksg}AY9c~T7C zEk7z7U5#KcKDw6YAAEJ&Bu63bDbHmFa{Gf#If~GHBju6APi#(hA4y721ani}f1j17 ztVKiY5@C%EJy|C2x%#1MwDfZqO_W23nxvd@8@L1HZN*aat!GXF`YjhNL5$HmA|b$v9rQ;%*4URG zyFn)lmBC;ODsJAtuzvznMLx`F$JRAh{B8O~llVh^bM1%R!?Ub!y~0 z#nsjL*BV%DKQ)W6NyguqW0DCiAZOVzYFJW7rRrzt_SQnn@Y5#Urf}84RBh7y>;U;8 zVCuYSkp~c?ZupsPS?AI^zR8-HI*D~&$9Inn zCShT1lC?*;r&RzNeDhHZDoeHc;|DifExL3%%s@#6DTFki)J?3EiKxGR6UE%WSr+tg zb7Vm0OM9p}qLumhqL;SK1u?F*jy8Ir7#7O(US`Qx;yef(rc5YLC-j@c}=JTz$zu(*-`NlY; zJV!?(m}C0t1I<|ix)sN*Z@Av4{7&5y+{^DWDVjg@@3mGLtyGYcgfia`e26M*s>m*9 zo6C_2PVG$?L-VE5FeI}X9i743}6(>7c4sI>oV^ZZw4 zMw)Ny3$AoJddQm!Ie^{1e6!B}yEJ-`OcT3(lGsXXAANa|f5#mUX z#3`q`1h1ybnAk?xYR#UmT8L2vj0h$SbR8l5+r){X>3-;)(0*Bg^3R^i^z$z4>eYW`|Q zO7%tgSZHJhRxr^Z0Vk0b@8s7&yvUT%)Bw+GOJWQ$!$qRhR8?&-#KySgo)-05OgBqL zva2zY%}wI`savn3pTq%MIU3rI1E|y--w-7Z@wwpgmI) zh#QII)7%rr=IT(Kl0ivXir0`yWYODISSmY$>W2gRt=%rPz#A4kc2{&ym$r`tM)Q3V z;k*`pkFW>RR7Vj;(GFbzFo8%ugNM3lE9`1Yl)G<9CkG`Ok<&ZcjYI9Folgb>w@GWoDM~&xy$`1`u7&O4(~z`>uQi+1|5_jgAl8(s9S@0Vh{NO`J}a^8nnPQMh}*+ z#bWHh^iKDO=okn!Sk7U-hInu$I2V9+{pGHE)55{<;Kh6m?(cO(L_uZ0`7VZXkD8oqGe zkm;NW3zN&CR&l0*U@xO&ym$3W@TV<;ZQKNj-c~aLO;c`}ZCU~}tjpi%&;a0f_|p1l zy(*WtUQR< z0`*dSrwoU1GsJR}Xt8^CsiSk+8Ztf<--7ImFtATu9m(GJyUF+I(3lcp70P$@TF>%! z@K)~vp^~XQ9k_it74(6^Zcv4UYK+?+T2*cC{cMP9uig<1%ECTd=tj*QxUX1Jy<VXla2+K48fSr8tDd-1XpWL$#zE4=>T zJTmyTuu`u{IaiXf949ALQ#rIxZtFqdNFiMIt+wrdOxuAd(OCkuV7Aj&+Zn!BT;Ign zuj1toAxv9v!vhL z^4gRtx!OZfhkcD^9CBIOe0{uagH;H{&1g8jHwdao6V%6i8tyVjqx3&?C(`#Z7HSuL zG=E0=G-Xf#y(|df{er8p1mMN=Jgoo0;6B*Ll+hljP)<{Yv`r|Y!RLA&)-QB%_oiX$yhpP*AgBZmAc3hE!ES;E9Nqj>#Zz6s!Q(Ze zqL8KxAbFogGGnk4sPDT`IT|R{G)7`JKID~rua4kDrIIVnrJwup!w+vhZ+y>)saSUr zjHp|n?U8rgp{wrYpg#45s@$bQX;@#p{?iZj&HV_-p%N69%#OFeWE)GijxEQ1*2_M$ zGkfXMPXjk8TzseyvM293-R4~sPsy3Q`ps-5q8z0GZ8lifz=2X9dtj;@rlhm%=I!W-&V_2tZC}FUeW+m>@J5%gukc zT$q|~?i5b4)2&RaGJXXbU0@ABfk((yYw5_QlU>IFf|@6Oi_n1|FGMetQaz#5Mjm!% zWWE01MFuQGQ)_UbA~kDk@D9TZ*k_k6Fg=f>#a|zwgtZSa7Kq|mnx-J$g{p>8u7#v^ zZN#I?VDH#O;_OOZ0k@83E-G|D9{vs63l6m#9;+-Plg>hs#+8`dPXZanke* z#IF_??I1tG|JzWY<fQueZrDk@DF;+xZpk5HN)mz59mq^BNRbP=_WHI3*OQTGz*82+?^o09r0`NG@nt1+fO(M!ce|)sR8qRg4G8f&CYjM&aq;bF`EuY_Q4`PyS-yxyn;Mo~0{Wb$1MSq;zoL>|EZd&uc?RjzOu;@>!&G zl5HUDon;|r2=7+&@nQc@NpE?SEte@LFxL2e=C z&D^7iW{8nr8ZAv89@Mbvr0)-)+Oar_h~6oKVq>Ekm>}GlQM_I@LQQsiUJJPRjC3? zp>I^5SHVDu<@lihO@d<-IaIpsE3qB1KO`nNA>Y9uqL<*B+MqsRcp;V?axH4;jz`hZ z7=#v<^5cl5Q#kDRqg>Sz1!BAA3A!{jDi{=(?vf!3;sTalJ7PrhH@SMQx=r-SqZ`@c zk`eg7#+k-oe}xs6qZT^ZJ%;m}Y;b@H$~mc*xy%^hEedeLe&$X7G--<9toEi2hA=JB87B63)epA(;^7)6GaJu!j5ji~9^L$8Sd{)Fa9dh73~bo-p8faM z6mT6oF9QUr*?KDP;vcoy5dY;7ga|qoHhm^VLC?Rww;P~<&(rP}`ZLKs{L9tog!M3! z+1%ntIUcazz(Y*Z!?cew$;XUg3j+W>lU}h?qz4y#Gg!g#;gtq9r%p*I#}|^IhOzgX zUyAYSV3flW=Q}7E{#*XCU&d?ryVg<*WvOICCMUS=TB6@X`q`k{<`e-lu7nmD%%KTs z3`Q=_X7?iN&+^)u!{wnL_#b;j3`Q`T-wGRzf8)P|w@i!aab%Cn@;ZW(aX#feN4!cL zTV#@Fdxs0RP_&9H_&_&(C^i@|4GYm7=Om;MWf`y{c4@4Et^Fz(fZ5F!j_v%sa zqM#| zRMO!-8=!K0R1qpMcN{GdE?IqQ?cm#CvJ67o282~er zC_B=PCuZI0CberjSkz@cShZy!8yZxbw|Z>BscC|>zU<}bQvk1sX?!QlvmnvY9SGV_ za7R!kR+Sa1S6{}7JB##a=O8zHpu|guo)PfSXHJyTga$6UIa)7?O=qpvbM&Umus&BY ziX7KH{&Z&)JYm(1-i6)_f|kx#=q`nLsLP+?L2jdNlTtHAn|D}LFw-C6vtvIW-I$uu;Vkk&9QTo9IA4(jWxq`Zu3+5#h(L_o4*j?c=# z!y;AXi)q7kY`RC4Vp8hRN%T|1cOd2B98{+_-$cih$=F0Bt@}5-bP#=Ar z+vq^YH<7TF$%!G(auRr?^P{(K)S4geXhPW8qS1N)Y{@g+I9qJ5a`8q|Op9LMLZ{CC zci7`OZjnG>zziBma%d4!Rqtce2lYrjk6k+K$+v|wdftj0digPA?6TRk+}{em2zpH) zd}p4gXd>p|w49XRYuy@@k2?jAv$Z&G!zp5_k_J&N^oSwlvzZZr)ZBQ1CzD@hm>CFtdQ(_WlY z+`WU>!bIm?DKWJG7ww&uq(C*6E7EqDB162nZPxt9g#C2b(!^O?i9LU%G=fqgpq491 zspZ{KIa_dG%2TqAe5!@^66}QRH%U+5RD>K{|Kv8u+k3poq&6u_rrvgDGSA2$74Wvk z*RpRvPUBDEt>(&-s;yw3(f-LPyBwn+Oo!3~h1ITpfVr!QDtKGlz27L8G0ODrn|6v3B7^CWivvsP2l21zjrMsq)8$|i4)w;D z>?TH`@zcJ;5iAWOa{v}Q&RDfWwZR!Pjs3@{NmNSp&bgoS^E=Df;GuuX1*%Zbv;v%q zz+%uoOZ2@IW*X`J+h!UhWogDu_iYb{LpIb~mOS+(nRC)vLJZ?T&YjVb66Y_|3ORgA zw@l^ZihS_SoXFDYAU7d(w&AjThBb_Z&5DT{weC`hzhW0NowR+I=vsI@cVZWU37^n} z(C8c@e759IYVuAh&x0o6zn!35T*`@uZo#_psyDd;)Gy@%LzjkXsoEFjzGA7`J}UkG zu#$7x8}&>4QPd9+XefH(2DkNGm@r%>4_xgEmcm-B(bEYspLBx+v!l&Xty00kXc1S+ zFV7W zBFZQrJPD*mFx0TI18DGGQQ$TB0dX1>btp#MsU4fw9Q@0LUpJAYhNWQ_EM^aF{*U5T>vbab38x2gfp_m18VXuzGOv}sw*g0*! zQH3XMQ!NL6tdn^Am1BobcwT$5{q|;KK>pEAfzNdOEKMiTB?)9Bf9DFmq2CK5g8H*> zA-ztqMU&y((h#lw;WG8_uu6~^ie2xejpHKM{v5+RBGo})uMI9l9TP0n2LfcDkAaj( zRU(_S(zk>*Z$bJ?3HA#=0{3UM^g9@dqx717alZ=NW$laMKBXQMnVGS`q9(!#S$QMa z!?_-W`wijx2I=076wfWdq+{6GA&IfL<`Lr@B>|(fz+#TX0EjXsy%7PkZ-}FI`c7_R zwx)e%BW<(td~^%w@~55Q!IUnh8A41)iuz=C6y7h$1M&lDo(Cmk83Wjl)gnIwrW%Z$ z1>ysxDf;h`|c?)87|Z}H~c^}?~vZ=fRnYXpQO9YoiGM&b%aC@!fL z{Dqq?Av+^N@7?pPUOa^2u$)K}wn;GV={3*5Aix`|p?<{=R~!u8QZG9ie$EsFtQ_bl zrrzHAZU))!ijPAMZX93z*?%VJ>HK*5iivo+e4DGO{n@_VzU^1j_1}*oQX>z!9I_&0 zaX+S^O_wvJH~lOW6*3wwPXBfcsr5F6=I|GeFLCx0G##xXjT=xs&e2=qi-DR*vdSB9 zTq=t2s&qAkavI@{yOTg^mlWyhBz}R8Oz%A54bycpik%&mH-8)qyvhumr2Ub7=B-{o zjf}yvhXV*)lMjQI++CiO!wT^Z{h1{;E2=NbU5y^Uii~KP@9d_i!_;cP{RkN z*;+VNd$|?S&8L3@KhZTb^HToOmM|hGp6!9tI0F|ZlZjuBQ)$!>b+o>FUJoq__V)+T zt))Ox-U6Ee4XQ`C*G;0lA_)ntByO9eO{87>WD(Y_MEEPOn{iZ_?5b}q&?VVr+70OV z$ZW;JvBkWC>8peo=ueu=Y?(B6AB*heCyx(Pip&rTk+q-yz?k&roTpyD?~YQ8mFhABfS}>LyJ^yC_IoORwwf!F``7+B00R zlPess$sG+~TACquT+uLzdTiOGGugEFR=Vng=yyO5-09EuH{j{gxb3_gCqMX4wBJGL z36BGksosL zsd*kt?Uo-x)*qxni^$D!QJYD4$G|fkM)(vIvpI?K0w9I&ANFYQ;%WAm%J-z_J0J{e zXAJq=wENAD2(?ZJAZHJYZAEBihYZV8#6W~!XZ>%4oiRl0kNN5f|6Hbw8#g*Etkqgk zcu{87C7bT1aearb%NRGpdHR53>jFOh$rjc9Kgkmv+TiQ*pGy+t{2)!3AZbJ2jnrs`;UH!^SU z9CF@Cvc+)L238&ge`Lyk@4*PvNQW4T_nSFMh4{lu8|4PyWn9|475pZhCR&9-kaBOSobq2+m=@Qd?XlsHOlW$4%VUnXPJed2ufx(llJ4jvI^a!mfiUE>1z zE}=@X6Zwo;Y5k&Xhi`ZTeJ?diDFjSDBpcjq!m%>Sph@8#IoAl?kB>3 zhZQxEI+WE{vk!lB=W(B-aLoTrcgJ9>5=${_7vF5NZdT{l3fGc-svN@Yvj^C4o) zAzv?GYd~^<0%I$qarG6C8jIbh{)Z$VdWNlZKZB1ceEUt@(~lwJBh*@@o2!`VydQPD z-xgNBPjSz6J*wMGi*}1_;}|jT^rDk89JhtW06xY4`;Tct5>fgD1slKwv5u+i)zdd? z$lRDEOPm6JioNdwy=ns-Wf4DKu>^M!WvZzU47nArcM#o(2~np|amRUTp(b$IoP_PrYoGZ1QdEXR&0F|)vXw8@)* z+BXe&Scvq7wZ0@SlubKGoE>D{6o#z4tZWr8s;9x`lY zO1G92z^iR3MxHB!l9hU8-=~#&MLZ)W5WKcYkL;BhwSX>K+O3ty;cksP?F&irX>oMF zc*i*{v2Y=IB_zJ-3lD)`E#4&2Gpe2qXKfDZn zFSFs!bg*pQbaVFZB1Bp2)D}cC=8<56yNq z?`0=wev>3oNIO=cRMxdh)Z1b2LHCB(Ba?km{tD+A74D7)n)LDlyGujX+pUm2Mr->c z(&JT3GEgD==fJLu=gJYA^Ynx_!|~&ow`p}9J)lF7<}^KypD1J|m=a zYQ<^~5fmb<5f}=$sk5K~zB$|FrN?6~12<71^v}-;BJ2kFyjMe|+ke}KGr9l3F1&ls zrn%qN-}~FQ$_vZ^+=5~u#U@|f?IZGN# zx*Y8QutXg_HoZKBNl3wf)k{r+^|NPjoO@0;%1`{C%%T3_9wtKo#e9Ke?VyI5-2mV8 zUGXvswsfV?EY0;~nZ+{Fammqj83}~#(aY@Tn`#IJ@d(jZczI8gWi>1;qiTeSPr0&6 zLK{mcz3Y2r$-CZ^;Z)Rbee_y4+^rLbbvLlF0v%eW3EP4!jfeG+7~kv6KDV~)?$6;T zZam74Ym^>WwYeKa@1wWtLuaYp_N6)b5IxFc)X7Z!#q%NE2t3d+uZK?gAwOfIG!n!E z)XRAEE`$Rt?yWgHvkm$I2@NY`7)4f)=Aka5dli=HTpjA1T+!S2;oOt8gnyp6JiPxS z;rlNjc9G;-N_QGxft0IML1!1-Av+W9CmFYDWe)`fS6BOQVl+tHWizUQp`yY4n!qX2 znIlGuAod9=IsFR-U4$VfOvI?YQz_SWOu1>*EG72yua&u)Bs|0vM{5(j5N>U)OcTp& zD;NLn9mk>E{D%P>PU=ZEKf97Z4-m)~MOON%7>ivQvIOZ4>(Jnm01pjmrZ@p$pyaBi zQ&vC4jUftAainv!RznMWNQH$V$Xlc3{%m4W#lRn`7;gQ+j63e{Tc&z(ksbr&uGG>y z>IWqEWa^$B)bA-8*ZdjjK0qfp7~n0+4|REQ%)d1+itJJm=oA<}OYAHod*x{i(wc7J zW)Vwsz|VYEzShDd;Zt&#F^3}wJq86F4Y(CI`$h+VvE-WZ1_*D5tiMHhNjs_RjORQ^ z-Gyine2*Q%%r#cSi;n`O**XYUztVLYtr-gaT{j0CWs{$T)pQw5BD%U~H1^H_{~AOZfPy3MFW8iPl;^{JG=UGf}B)sa>yp&#?H3M0)^J zhkA~}+T0w7R|02!)B~MD`GF@x_|7tB_q$6pUt-4|R#t zgn}Gf?@6QnRPx1vMpI?v_3<)AG)CCIG#bCCF<~C;;~Y6YocoGwXclZK3Wl9s0IUz1 zobMyy(7=S4f=*OcwVF8!tE`Rn=Kx$h8D4;XB!gjq8R?$W;V#*RkZ+qY;qlEovQYoD z=vd?{14RM$$j0Ku6gdiG=KAfVMTce|&m>}>x{je)7avNG>ao&H64yv3Vl){Q7ah$9 z&Y!-`OIIHVBus>6Dc35A)t^z&l4qAUXC@fA|JHdy3br+q+eLP=*E^`(nd=G?n z4_XQS8DC$8p!crd^RqWLo1QPxJ&L%PAErETKH=lols4;2d?juXfzJm3=6u%9t8{Xm zM#x=Vtbm$F^c|YKwAzzX@~B&H;Z*jI*)*RfzvC#x6W3(La(pDh406tSjlAk&IhsOl z8K%QLR;!#h@Vg~c>Bgo>7n+`}v&4g{lzf`sQY4Sva~YEP)7d&&pH`Sg_zt?Ser-z}n1n3H zVbCBKu*s(@g{S&}R59(o_D_f(M{8xcOODwdW~S-iH!TQuXuabzvLL{^9-2mOV$9@5QN?18#QR zs1etYmF{AyrQ~+Ot(jI!2q}v&dpe5~48D;89mzwMam^stlz$f$_Af~^>bU5mS%cf( z09SWz_z`BlAnR@Bj=_75n)A!V4k{a~#D818d3&r}Jz#*9xU4>S0cRFX!q9l6z>aI& zH*k(2y$-dQhf<7=R4fFb<0pbHE})&5831(7z~gz{u(fwPVFrk+DPL-KO-l#THcChk zF7KU>=ba#-s`|Qp2Jby7s(Mt6(dcS~Dt-N@DI&kGL^7|Wg*J?N?8BZ;AsSgkD0o?L21IPz)I z$8yUpBd{TJE$ZNxW;7JaZT4%^ zUOsI;j|r5n*^BSXYv^?v2JWY)fv;Pa@f`F|kLge_x}{tSgVA%p$$|62e)!}zav>aC z@d~CPFE7i*4vX^ zGb#G~5h+g84#81ytnBC)5=wLE1~;5h#Vgr=aUe75zv;a|haJ#V18jvy(cXXa1RlXc zOkcT{t8N)=rm^W=8^6VT91OKGa2aCpHr zP_YGQUyljFd*}8{#GepZM?y=CwbCa*ItD~5W$IjCDhZ1y^$m}+$r)VQx7vY&sLSP{ zyu!5|Y*`$JPu*l;9FsDnvIG~TvK>Y}h5|QbG?n6bU_+;xRzNFDAvWsh1o@rnYSg)= z4TJCoz439pb?Kj?A+%LJSzZk&vy3WwD-4E<>nBt6xn7?n{t7bS~ze(Ii z1|ASHXcM?cSWK3c6*#)*y!p+)eVg|t5$A8tf0JbgHwY>$m&wZU125@H9+r?6W$Q`f z+@D{6f!w~cnwCgAiIV_#w-@moqr^`L;kW74Z=L~{GB;auG~co;s2DT*ieqtMh8hoh z(GOs;F15UAXSgxYoL#G5H_8BTeDaAzOPPT!?TUK+gll*RQfbxjum^J`igxj2n$cvV z@>Zqr;DR)65lm+UFq&vzeuHxSmEKXJ3JEtz+V62s)i`!s~-C9 zf1g-E;lXX5i!>kv*T3aUKijo`d_cH6O6wARn&9Gv{A;s72_i(T_61AatjWq0N&$_n zb*{A4S-AbBNoTz`j zi>;lzy@HOQ#@Ib{W-JzaXD?_zcV+3Z?_j>R<4wZ&_u0L|8n64p`NTvevPG#@e?kWt z!jirP%!6gDt;$1K@l_MBK*R~+xk`lynTF8B9jxl__*-;#Q0&Uu5#wnS7uo${YzaKE=*{}l!5 z03cvE@+mBG1OCD%#&{{btV>c`>`p*o3t$g0A8BWC8}Og-uw8`gA9CtUUb*M>kNeO` zCDx3l!p}BPxnIgH0kvh76qua5l};Q+315z%?q*WGYk#wasfpC5+Q*aEuXBChrB!E- z-6NmGJw}lHH97rPloS5yuFV+0hO5aYjbdT*sDU{8FH$k{W61yfU^@lKX4M#l@)cBwU*6X-IzFIv1=Og8) zEY(VcXuZ@mOuPtKZf?M_Q#rOgyFB@D=;M$M57JeS_R({>^4=0Fhv{$?(0FkaFz$Tga)Zlhxv&d+TW-d~}b7qHp6=jjMe^fsSfH zI(sT6?aG2xgI2~>lG?lr!6bL%KYKefJN#SR>U1`3tkF4tQ_a6o%DLv=I&rRv%;b55 z{24e_e-?Vs(k|i0y{~9^v5GLrXl^XaTEU7kHxJdrX%xqHo6VhvHs-HN0gB}FDa8Zx zn@7(?^crv^?(7f&YYx?t}S?yr#P6m(VMs~ABKAjhCCf5 zM&J7Vsgqq0TWy~ItmlYyWnPl4x{=rYSgZll0ZMs1=KwL@@{KpVXVjNg?6UQo!xg6o ziTgM2Eky=J=nP^H|1OO_f9w8agmwn-dON$4Q6oy491Cl(Xj13fZFunNA>C2po8&iA zcK@1`!28_-W4lZ3)_ZoLw2=5KI*DNMvx}CbCz~{Row4Col?3tkAQZP?hD#iBK7w!X zK_MD9SzcK&0l>E`xCmGaBDjIFh$o@bCe6O(Va)IHjbiVGskX!T4%8;J{fhG&2ey}u zVVA$xeBs<88KlbnLy4~hhzQa#7M(S}Zq}?v*_%DaM!2P6W@g;OoHiN+hGIT$0rnxE zQHkFB0SmU{U`>Dn74$im$d0bb`MERUg)T~+a4PB%{|2WChtGU^b!hn0M0v1G_w=TveHU30{{?fSkE(+~Pd%09nw?Zi9 z7B1MGMXWXE{T@+ zBH6)Dxxi4HJF?SnId7nSo~9caMZfR>!*|b(g;zh*v?jPwFfbUc=3J^BY{*zpDEnPE z*nqc~FB@lId|LU>fs=YMYQDtu6u{|%9ep7H4jIE=E{lq8_ECSEMdm-`pPu=bLeb(;BbA`K)@U8>))`Yz|Ww#0xP-IgcO0dJ%~lJsBV z7x4zXszm&uD4YxMLf|h+Lvq6M?nt*F7nsr;=7p_gE^&Q#3`_<-ihA7LxlfJc^$o1edVcHkYyuGWx55_K5 z=|`YEOw9Qan%x2zkk(SXR~sbcAgn2eE$>NC{cZyjL_j~-R!;`XJ*$Tr#vV_j)Ro9k z{3go4l=-&!zzKYRT~_W|{Ha^Q$NXUpTF!bWa&7h(G1p3Y4bl(%si^?&sj2lA>UuD5hQ-(*^#%OD&*@f2fg;((&Pgib+AfvoUeVl+uOu8 zNeT|P>xCBn^QaFM+s1YSt3JUh;=5cAj}Az!K)P@RXY9$|8{*cQNR15G(v9WnAiX8@x5$22?1+O((U-Zg`dM9Kyg3}Cc$!DTRQYebM zj)aKw)>tykG#`LJihYS^{>cH4m8(_HP(t?SdgEXoRrylwt)E1|hU()esG}!8;j7P+ z7~c3MKYdL0jOr#JqhmnX&zAZ91K@@n2?XPpgwr~i>B%%L#ZEc%ND9E2NqMQow(iNn zS)>__tV24Rk%>Zf8*?-dH4HUpI=d#uPc-};WD5fr%ze6y8eLTdQq|*^z@$Y=f^pv@ z9k2w&l7LiX4(6BysF5(_)NcrxdwcWx?7;KC0;Tjn{C7%>gy&jJFT*)^yxL=sGrz6QH zUf|!Ad6*YQJb=p2Fvj2R9d|~C$-bKsy>UQKF8M{7n?8ZoSo9K-?yPUNP|ZB^F}Emu zOdnN#oq^MF3QtL=FD{&Pv*4(pq=n0Q;Y$Q=oRm(oIN%j6Yhq;5amUrCBlyPm49Ghv zbMSrzExK0-etXdI?#2WYs61N;Z#tB#Ot>`LBJ4C$%*6!p= z_uc^$*60rcx1P6ujE~TaYfvNbz~0qz64qA+BrTb2mcX{^)&~0!c4?5q+(SV%3jUd3 zn+>i6oB3na##-dr(m3Xgi2MO+m#m0<7;?LfY8ak8{4*}2=4~zFWMmr74rmGHbdM-4 z5S{m(eX@{mvLV~PRJlU{E#6rx!DHGpQTGh0oRGK>rM{scJ*T9(K|AONSffwyK-XC( z!+EFPvicC%w5rChuhwyOC)w{)6v(IUAM_l|OM3i++Et>zDgDjeNm5KV)5D-+AH9_& z6xyWa3&*%dib=CpLu2{Ju%t6jr?P1IV~9_clcsw~Xn3g{s*V23>b6ln9bP|L?P?}` zl;-ohAVsn>pK7ou5Yg{ zSSAe5Xw+{$<}Dn~sIk6AE};_h_Gh6jgo;8Tx#h(uz8iR&rDlJJ2^R+{a{yEbh9+S| zHu*5H%*}))Gd^J zbB+p||4;6qt#JnZP&_57sTb&2sm|5JNXI_$To`bnJFq$KravYG*PQC$ciKL$EOdfh zSAsn>+awzd-puuj3hqv?*;$*f;}jB@9msOJFo&^9jL5=tDq%Y$lO1S}CEx~b38ShY z!O5+JZgH|@G?%~QMN8CfkY;k|^RtYlDanvC2{feikFh)&YSmWeGs)GsC?0qpuzS?{ z%HHV=z6$#AqaR~)=wHzBMBK)mgeti0F;pHXg58+R$i5nFaEv7#+IAwMH|ctGiZ_ z+R3PC+}8WL6#>c0N)I`k;nSMuQq2D5;kSB2^^Ye$5B;v*nsSau**?k6NTFFA*7k-C*`Gv?0AS=N@^vU* zVUlU>q*1r0>vuK(f__e!)k%OPgm*-^`o}L73sDPiu&k@Gow3}DJlu&E$oL<xjCWfeE%~3maCiR66MZlTvB&v8$T#Ct{EBlf6ESqZ54L4y!zDu;q7uI5s=!$h+ zC(Y*9egNo!BenL}2WC_S31bF_jw-~Kh5vu9yT0+twS=@!#@bOEB#z9OFL{;7lDGxV zM6`5pOcF)*;)%7q_hZW+)YXTHU;+4PAL%k>r!bQcz->fjiaZ|WrW=rED!!V1IdcKW zv}J5~8T|t8sBXL-`uCb+NS6XdVU1&N)l<@#UegSe^c9RM5Pqz!b zw$XqCEasKqH<*>uHPTgFw13@fRQ^SE@y*9(`1)|v-RUP9nws|7rcrEVfr*+{1?n^I zj^Bl#B&6<3XnkcEr&V~}R!Pk8(R8j#@hyJKYr$)6zIv@=fi>(B04=j5WRhljdK!Rx)T9uDn%_uU96Jn2#tOH`@BFK990f4tYPIhvzZ%Rs69kByd3< zCRCSZA_T5~R?#=_6|#XWq+t)S9|1ZZ7FNO+QLaeMu~*r6(n4}9jLz;E6Jozpdk|O| zwd%D@680q1A!*HdxZ28epkl@tlbD{%p3d#Wk9yN6grPFtjh|;EwMG@ibmQW2t~oNJ z^$f9U1BdCRuyJo1mQ4C2EW;&hU|6u|*lLZDMuyHlnq4pfn=e6A5={#NAr}K>M$=b8 zT)FEu|Jfyyy&HF19i9DNBNuMQaWpsm`@7AHA3`<@Z?LYYY#qVL!~Bcav@JARt&IGX z^pxX}@o*MxHProoh4)n{v^|&E%;jpyxNVI18-i!%c1joiwKAmY8MN8=$ThPrz1)Jv zK38+Y=dv!zV+`toP&tgH>xlHC6KWmGoZ1@Zo^%W(N50NPYtuWweF6novqL@hN%kSA zZ9Qb&iye7Rtm?tkLwd_zREZJIKPVB-^hVq_itdTa-_6+c;ox*Fi*8(c$8skZ)Vp~5 zU7b^?LO7iDe}Y5E{Irm(Y@O2N9!@w_#-Yq6waO8ZZiS{Ix=W#kOH6-0pu)MF!(nXq zsngy`Aro2qoKqv{#+H+zm$2FZtS8L<63Q=eb`;^~4*JkZmbIwyL<%!t20KdYqr|&w z3S6$Ufv&S5-^*0A%}D;h7pCJ#v=^dPO59oFb!+}Qvp31LuBiy(`gVD!_>l}rJ6a#D zz5cs-lm3*VHca_1p-7)9pb3X&w#tA~_;U^f;-(&M@lLp^r5iwdLq3*)dMO-^`QF)A2+}5_n z4kXc=Jjd_Y!D`V}676nD@`(W@eYU35k!Qsi-&sdh0DL|-VP-^ye?aX#7lsv9$kga8 z#W-UxEeI7cKIc0~d+v+0$_C*!LA06la-gy|h=X~lv8-hJqKR^M?su5@U9;r_yyS;a z?TbOi-tf&bWL+%vWVD5HXykf2@g8I;j%TXPG_R2ZMF8vct;LbZ_*>P?sN2z~SbpCQRD+r6Mx3p-ZE&a_okl zEf$;CUV_`k7s|mcj(Xmz1^Vh;rG)L;1vFl6a$6_Huk#+mAC(V^W>qo^9wE<3)bPL+ zYvBN>4k>~pTT|~i9X{E!h@vkVyyb~U+EiE-i?75b;~Qh>SXyqAL%2ad9p1maif`>b z_n@G(hiiPVB#i__^ipH@Y1<~^{DxpVV>20kY*VISLRYPw_ zaGf%aR@rtpIIO!BsnOkOB7T%ArHj^E`9eLv(Y(mJB@Ao!E^@Wb!1AuxZNK)eueyRD zx2CGipb5!ek4`x1HK!v9F7qf!-|oE-TRK4qqYv_v@TLBL+oXeNYD*KbCY>}P;NgFe zVoU6NwAE*t)&)u})EmeG8AL!;ezDL3Zdv=6si8dZY+ zZ~FBGLXgUk)I~7=88n4t2q}#(ly@0lM&X}V1FNIhN7yr>VwM<|^IVs@S1`Dff_V!0 zzf7$1%0^$0;ceIfE*$Ld5--zDLTINS+hf-3DB+1mQ_;*^y)G2zDssokh%)C8`A^x>}nUV|BENi6+5_I|CPl}M?1m)M}$VOO@3F^&L z{dS|_@1~y^h|B#$rCg0cqfGpX9e8HI{|@kdQq3f_n9RJaO~$LL)R)03Ss$SU5oRt? zA#>DJyk?N%KqV*HvpeNbVHP2k&JebJpF_pL${8HT?(-?ZneY9hYTt9krXw^BMNwvO zK?S36pvO!!NdrPR-_j`B;z)$(1Fh;@avCGPvy+GFUpAuG{Y1PJ_x+OaAXe^QMV7-QNYiYMVP6h2bur=zwTq1NmfC|1~*x24n5U zBk+Z7&=isNlb;aOjq7>IQMJTT^Qr$$ntL5k)bE^1bFTNO@d35**xwD=@o@g%9`ynD z(B0v`}yDCGaGIElw+L+%-Lq3*9#0ad6%Fh((}FV zZ04;1Yd;@GL=s=hlpg((z2QKfk_*n3_kBc5{+?x|>C_>iFr$nC&+y?`6E=-6a>5(x zQytsBHY==b?KXW>5*B1^24Q!HlNN(`9YGRc(g}nh!9nHD;uZ%bnHtV_R=uUXh1~IL z%g=C6K?6BT$Qd=`ZM|VqZ+3m(wQASwa7XuX4fprtn)dE_QZdE3Dv0b4sFUM~Ogi=F zsiPa)#}POM2KBk+az6*!I$Lr=WAS=Zn)uyyqwgh*yzmq!5`~IVrgj+OWwH+Sst;(d z>T##qZIdI8=Azk=Bc{9(9lL>Ea~Oj4^lT;h9Va>Z{I#LHXS)D6zG=rC{aI5$Gh`>1 z6`^@hpi1xxi{Zmu=ED-Fv5%Ivc;y6Z1&U6-oT4IQC>eaVVtrAd+zPZY>k{3tTArt~ zi>6D*^dvWu^7?z!0imWh%SI zD@<$>9h$d9QGcei6q8)6#5J49J<}3qdvUgxtE7!n(UcR%wVT=v|7(LRvMVS}jk3zN zA(m`$9X*2M2ZuoA&(S&c<>=w`@w!pkR%U|whV9euTfg)ep%^a99Yaw zrjaFW>Jm#@InV@S{RW!$s}2g{_th{+4SK71LUv}-O(ubnP(l>|UAtQZpSLy@k>6l>HG^#t%m{LQBlaK&QHg%%w@T3QEl9RCE z)dAFWtcs6EtB0?_)9wZ{Y2Hvk&2YZY$W4h`6rd{jy z;eRSmTvUq`s0DR z*3`HA6qTFf*MVPM^622d2_cC<7jA)uAFwJqBw43)IcjtsSO|KsrrJaQND0%%F|vA6 zh1V&uUyl43JrF1Vv7bh)a5=ia5vKQ=IqsS&47Z)A5Fu9a;U=?&y6m?4fT5@X!9mcC)7H>%wUY3NypCclsS3%!svBFKvNwR5l z8bZr#edagss*_-f^8L)70H36wjX;O#m%0rN&>8x6gZfSqQ|&=HuDmU9ISf`P^^4;% zvx!;RD!xe}%=oM2Bvw-4Z4Mv_8M9~7cx1BIM6~clY|WTo}9Y;F|p3@rvn*g)aKC-UG<&$;&10&#mJkbiOZyGM~~Xobw}`d{rX#HKWzyG zjx)znbS3Y-&OjQqO1M`^tnFN{c)Pkn9dT$sENkge83O2u3o&a{kLf|(OpgH@r85Qx zgrmgLl?yspG|_uOyLAdvX=RLtma{LJs{ERdn9$cqYm=N0?koun9VUF?K_@}C#^I3< za7ro&z0qfiW1=S7+JUsVx1lM4t>e#3S;{lnp=RT7j3aca`i zn-SG>L3*#FwnVj$382%ETfUf-uXCUuh8^=g`8kB=9t-ssB-mS{@Lf`mP2hn#=LnmqY zP8LTaRAL&l6spA@as7>&=Rc?8BFUbg_D9d*=6>MN-LA1m`qgeV!Qja1^dy1W*Oc|q z;llK5H9ftke=25+8fs42s}ma2QqLM^%v}zt2Bx$z-m8=bqV&aVgv@KT)rXYmC z(Bd#H5^1-A6~c*vyZc67#-;!*CW>WGDAX6i)I(_2;EEfGm7k#IBC#BP;=9CDdRUw) zt5v43;czjC<{`A8!tfC{W0rL2FSz<0$8?hgUCrhmqM)#wSZlZYSq@a{%g^Na%QFiL zR@y#svDLY3pwVY&ipKNxQ|VWoC^KQOuwFX%e+y3f*M!7f0=mloP0onhwU^%)d)MerUSFGtRqaGaF7a>LkR!^B8ukykI%>2{qjYtoJ5X?V z$2M9m5#L4&xxlO9sP$Lp4*Okq`Akru^^-zZ`?qGn`*)3bW$~BFxm0EGFDePXjd)`w zCA7+r9r+p-VfBTe2;@0-CMK?O4`RT?*vz%>atA&jV$sg6Cu`q48hFqlVT+Dh{Rp?a z5%E@zoq2}YLZ7+Z%?v`g8Jg?hw4t^_Q?Yk~%;2aYOcToBE#j9H|IJ2nv7?jfx|R`V(42HPhRItriltzcIQH zHA?|{K>(45JkrP6ry|%mp=D$KgC4zoTk{1hxFYW_Q*=}-fF-^j$C!C7gqb~lRh$*c z48>G34=5^l;$^%I2;UjE(obL3>_jIk%WW=r>Q&q8!ab;O3XE}*L8BE_97(}sR8By1 z|GcX3536=a);WR&89#KcL(;j4wiTwui=5Cljmong_|hH+5_IHG6h)fiuU2Kr&7NAG78 zX)lXySBBls_N?7WlbT_tCw>qdj>(M9!{ChH@65xXph_R|UyH0V@7pw(`tIq#QmNk? z!mee90kYW0&>V0D1hUk)wkPZS`6Pj76MDtVAtOt}Y6s-SPPF6^gG9>qrZ0Mtk`%(< z9Z?b#{@Rl8WJpTKSp6`~&&FSN7G{|y-c)u&IM$ydI1lMp{=ML5qwK3P4_22ck}l_{ z&BM2%7I|WZMcx*1cbLs~fzY0RXppJ9mic>KOtm(Nx8R@AI}Uv(*B!3PoG= zstH$r(kfh0&LY}2H4WjQC{0$je527n2Au_>#@y!ZY_Z$#CH?`DlFxg^iNgT(S@*GuGAs`hGsW=9PY}nhg13tF z0H|PrLi7|4KYnPDHSf;8hff3rc(A>O*UUN4tUp2Pu)6!zK-B6%-ehu`x;|(}Sfo&@ z6g|xX$~8S7dvg*Uixd~w^{xE4WDFk{1_VhnPyP5$cn6IJMWf!H8307swI#%U!!M5C zb2#|^##7c^vHjUB5ijT;#$zNK!dD5G9)~PJUY0&f$5c76tR*~RRoL!n*=kqYJcs# z3gY(s_~DyM+#Ldj(2Sp@!d~i#k17)p59%$2Ez2UH z%27{sFxgN)#m-4=r^ND+0c?|JqHOqN%WEMAL6X}>L8r+}?a)2MH>;p%dyypx9@tc{ zVpBU#n+T+ph;)vyB`-PnHYuh0h?y?hrozR14$kzD$r?dG)}>cSem97uRtOus;4z*v zz(R^Cms3dHBLWO7%I&H^q(~tc%eqEYpzv zzA2)5+*#kcjdFz*8%g>#H;(X0!NIy2qm;-fZ;nva6{-8(iSpo;+Rk)Kyk$eYpN1+N zPpd+3Bc40f7Xt>J2e?4WqPd>`RKs2 z^ff&&QreJc0436?ioEH(d1A(Ck#&RzeRT~)KqvV`Qxd@-v*wQNMv`irMqV<%@71yLuPYLISAS|exzW1%{*r6m*laU0Gung0EK3XrkBZeKsLyEO`)W)@Fa4T_2h;{R82pk#SKgm7`PIyHReg7!+k5=50c$&y8+(LC$r-xqv z58Udqgh`gQvIuql?PqcBu&^i2$XY1NKU;guq^(`zzkICs-i2g-aQDlqLK~zzHm>4P zTS$AYAIw8@CefV@7-%XC+6Pw}OkIx~h&Nre{dpL1+pXo4}zPhmy-wOgV%2 z|GpjT@ibRx2XXp>QCXXxKP}A|S}%Ts1VsjC2ANK`Lv0LCHW@xRbKXoW*$tF)EWdGv zOhZr=OOUReU}8JZ|6tU3YtBed7}*nfm{Qb@xm*rU@0*x!MUD-> z-XMi8=ZFBEf^Sp@h(tXuJ~Ti7cqj1}S7M_`-n8g(GPLq?u{=`hSxQ1fg78!v{yCw< z>H|-KF3OdiD%9CjnuEUl&@u*$7+bJ9hcs}_rRR}vi0MkJ z>Cz;{UzgNkotKldr?hFM-t)dt$kbbq%)q6$6}Q)th5LK;o!zUWjB|p)9Hm(}5Ei_#F?#Q^Ohyb&cnnl}9)zJOF8drTv*%ak$3Uz%QA+(%hUK+YB2sIabT zjmL(|-P=(8&x&Wz`tSg7AbO>dSmM#-t@{NA4|X}$_p|ZAD>?IeN_*~V%S{R55n*K`D62aZvhui z;btlU@W;o$`k&iN)ji)fp$wnl4mTMsF{fE>d|_}JM4ZZz!=cvA|Ah^U>AZZc#D3C= zd}H_c4+{`X=?|m1>X5m0nh<)(cGDiZKJ7^s%3rP>yiWE>q)q(lcy`Q{RxP}^Lq*B@ zQ|3N|-J$k1{btm)9+*Xz7tbKtTYbe%3;@>@m{Uq&Y4RhyUm4c5Vj)~<#{BY>F8us04`R)%I7~7-0ijGFO`U> zFLQ*R-X(gpRG)|Tu6G*X7@9qFAeCHUD!|~ZHDt62N~Lz@hIDHc-+Qlv>*lTt<1aJq zryz>$+CHLNW_iQu{%K%cSpU9hFe?FLY{G~IS$_T8>Qt`v>8s)$WDp`41KyDMZOD>| zLskVtBDvHyI%~9+Yj&R9$Mzq5(mWxbt>ZnhELXa&OBWUR``vcS<%L+_qu3woiLXqV zhywdJxVK#HzkqEc{s<4+nLp}TD3XvTl~MNB&dZ|&#J3yMZqM9%##jOo1A>(>;C$;6 zhHLw$LweISHmj**Ag`D_GDUF0SC`bGye#4GsdEyTYHa@C+?RE#R;c3OQFQR zn+XyhvYvk)S};mLazx{JcuY-81$YB+oc9g;f?j`q1eMC2(=rLd zyP7N_AH4*PCq2(Xo)16ryw=@iqB~=*7J@vqxop8?P@OVog37{!EHvlU)qo=XO zW}dyyu#QoT6u`D6MRUswiF(bXvu>?k!!*!@1GFpQ_M~ltjLES|`5<<=OM6)7mkd)R ziHz?-KA$iG9Eze@Y$HiljY+0qJe*Z2aX5Id=rmI2}_LLSyF^=A$4^`FpL7j!f#f@ zZ#u?o5)TLwV4iTn@rV$A9o-3J=pC2d8pQ%{T!7B=l4J-`NPvzc0P=S_xVRb$GMG~I zVJvarwBId{wd8D1GaMHzR@fZcs-a}B2#eQ21eB`)Wwy%*t(Gz>6_lE)+vzzA6^Xda z4g_k+Uooqu}#9d(8 z(j~va#N>VaWjVWqIL{=GyRA%#kkC^C*uo%CyaGj0fE;7gv>9VKc!7*+Qkqb{okrtv zu@a%_RbuhGnQC@@uK ztPL67tnW0^wj@XYz8>n*iq;bD6Df$DEQ|E~Ww<^ctsEM0dKL0PY?+UvVEXj)g<+F zzzA~|JS@WD&U_PwAnR+`uv^NP^x&AU`hj-hefpie>@}|(Of|`m%+~CSyTjcJb>r4K zR_$K16q?5YUqL^bWp0bb@E#l~GV=yKVPX2p4pJ zZSIxNS^WooS5_K3CDIA3O!m^EDE0*$4~i&o_RiVarWzvA`xl;8MXU)}eA2;EBYk1* zJ?7sC3INVyG1??CjfF~N<3myW=X2`);Sc!%9li4UCfpyNO^Y2hsLD_Cud2l<)%o&A zXX$mb4f0RK=LvDbN!SN9UBR3WMjG?Z5!a?nYb0SKvu3ahiR=#Q8G_==H9mX(=ud*u zZ#qz3U_995^RYFWC%9Vh&Arc7um@+4xUh${JsY$z4?Z$xQ8B_E0=b_TvRbh3Yxor3 zR;VO1o6D$Me%&2k(uHFi!KNa!!LzUsn&o24m!Dja1 zx$79IOw`LIp-4bZ^#p;*N17^G6>A5QUklu`P^y+cNmWl7F0APgM%C)$ym_1wOfq6Dgi5A*`T;Q1304UL*I$AP%W`}=)>K?aS-R+!a)^zjdc+H z>LT>PlK{XdNHp9*2N1nqMA_f@^qt5w9M|pO^?nYqNHbC8TJ!?dkmYV%NBihHS8?~1qfU#{2}&~w4PrR>bTs!r#V+zMuO z4?m3{xwC}YR74;U%Qz%nNw;2bt({qwp8niW#bL>}hZz8PDMjNb^=RtU80`&BI`mDH z;^?|mAL*0KU%~m)VcGpUzYr-L{*ix%$y0zZNNoQ{Dof?Jo$tGJzV+%*+PqeKPa8v% zBf%;{XC3+D+PXN&!QiK4pSd9hM7(CM?`zn?1~#NudwMSxPL#fd;5xk;+KP+F+h?|jb>Y%4SH_cYM zrtb6&cgNJbJ~37%+e)I~8Bhp44J{xkua&i&V|ZInNoH@_eiUKxQ=XB2BpYH8uG}>@ z(V-5YHYILZyRik_|KyE^SK^7khJ}Rz)JqQtOin`)JgltOrmdY-Z!FryR3LkPF)!*^%*kr?g*0cLN zwuHh<#tg6xe9`kNEcJ3Tlu^6nbd+oP@m(~-z>8V93vpK4$FHH`zPA%=@bcu1!Wos| z{=HoIEQx^idd;&YBXxhRz06K!e5cLVDl(@amZT)q1HI?GJg89jQuBH0A`MV zbZY^7rrX%ox_#x-EH=PZdMt+23I9-(e+`Y?$M^9vXJ9fKZoO_Fkv2dBXH}zXA%6w| zIoNTVj>^@ddPA78HzoIPhAvZgVAEK~+c(NUyRReT#GNf@|#!YN7tqdHS ze~VTKx$jYb8pE;l0w@N_$u*~|`>*%iGg6ms1?nIB8yh}YZ^t{@STLx}PopaaCaK#j zd2H-rG%ZdM!O{I~`oej1{N=E9?hz+h=8dO*#*GwY0I7b_QlUT$wlo$?V0CX2_H(xG z#r0S`G;&Ic7ItgMq_AZX1XZNhw2+JMcD=Fp->W|DU>HLnzVmNw zZJN@M2Km3QSk}H7f0Jc&e=~b~T!u6lnfq^E#n}7XAwIu%G{nWY+qd>SS^Mj06ET-x zb~^IS^ONax9N`z&<>N0Q`;)QPj_pq2`^Lju{4P*Q5|AKPSn^jz6C>1e1$j3_<_vM$ zT}X%Dzg>!U%=>hcx3JaG$S{7wFwOQJ2NUTV(ncgebqYOvU)JN zZZbPDCC#{-TD_1^io}}NZGPnYKFssR>oy9}8+?Y(Sm{R-t!O}U;{7~mky}x_6x@c) z1b8=*3~#=#9dlOyc>H@}hx}Y1VT+*uuKw2FfqbL{Dp{>8=i+CLsESWahr~SoWogsD zgUFf<-)gypS3~OrDwZbXxkKR7KgpR=(JqfmLXghCG;?0UO24}dhn)t$>%A;@Gt@Ak zVP7H_+075r59XJBJ2<{rwZiiX8oDM(F_` zq42M-t|0K46FY&R*3-Swh7@(DhVEPb8mY9?Zreh9YjDvKD#>6g1fKI7S)!G{)JO%f zmU};rw8uL5;!cbgdhc@iFD4*IuY9wZR5zaX0+L3p_z_K`($LAt1ef|1uErFh{x7VDtDzoFvppkK%^nv_fM-F)(7B&)%)t-KO>?GB z!lE?>9wQKC64YC4g!+srd*Vo}*ylhWY^B$^8W?0?d-fBmdF{{gCt9p-lMCk#8Cnif zw{cAQ-o^%Q#DZYVpGS<`qrXBm}WfT9dMdl*zqUi&(C z0xBd8pS<+zYuDt@M@?*iVselP4REjQTn1_Q>|a4JcF>hcQ63Rs66@AZdt%KKl2ksD zlV07oazHc%#4=?bJ-5oanyCak%TxpX-MoH0IC&bYB`hDEZ1nvl9MdcIR+5u3V_oa8 z1XOQUg_)G*`L>`v@5&m$@1JZ)0E~7wPK?b2RKigqH-m~&G9)PQ6u^I-is@$Lh>j^4 zH!I>-cRCSSzI0~hUu5*7nwkqSyn};kv2ZfhR!ow!g6)N|s_~|YLmAL2BgLYP)^wXV zM9vC_=l%e?{6{pY2MHDJ#*h*UElR~rpB@;q<_s|58O|N$jC0lhtgDisjp4*)UWIs% zTjmdp_|`{zhFWpKN1MDBbP{JXZFF!RvGCp)m2Z`RTHE^YKvJCjl)?hqBOS-=zqpLb zD!k`a3Uu|6bGx;qjQCGaHtx(Ncb6ZI+qeWsHih_$c!WjU7{El38jj)aI`)o6#V)KY zZY=C0bf~AaorVZQA&|Txh5*GV^Iy7W+7|YA#9VczpuPU6y@uOd^>VmG8D2UF_l1aA z;7@$(28Wvv*ge;YczCI%r|`F^CMTZ0%nX>d;%@<7<-HR!DEZQj+b&9i$x43}6Cw)N zQN@3A#IjX`?--K1B1$iNFe9c5OjL`JO2R`fNvCqykz?CF+0YahW47I_3X$#0G=Fu> zh@qRoB(WvFt4U}?c_ya$1lI*nzrApq8IN!5j{y9t^v(>|upEf@;RIMh*j#iVSY|ZT zY#&TWo_1A4h7ur5AlY9){~A8n9>3$+#kLs-2QxBl@57R9q~9Z{(PTr|eKTLvEFi0%5lPMNN-Rzc z*9veDk8~wiOs!)C>r^w`!y=;7ug7LO8wy51ctQ*Y8 znDigl>YdS1JX5S(aF+f%0}agxW4)SI^;d8O#QJ;ukW7Ie@lB_WTW(e~`4Y9qk~|?B zpPsF8k=ki7L|17(W6eZbu!qW9TYDcpYRFFO=4dVAIZZ2X)O26=eF!dLG5S2b?2U)p zRu)U2;X9Y4xtChuv>PQQ&8dv+BO`uk;%V8nMB%`DT2pwPje)J3DIlV;dw;^bJA3Pi+GxU;UP6NhEoR`o`veE}UsY zF%@g{p-3;Px(q@kc~_pF@RImSQ0ty#W#E#OPQ&kS!<{2yR*~RhL_1zf?Iz#UCrk>V zI-GbzNGqjVWS8`oQv=h=3E&0U@Yi|82dDIn=PZ`9jbG>Zy?Y?O{b+=lG;gBME4%Td66nCH_jL z>zqfz2NcBNmKnKZGZznLWwE3xCbP??6#1%<5`!NlzzTeB34tE_zS#Od3lB8V4oZKRImq|E7!s#p`Ou3!2)!iitN z_umB*SV3I3k8@=0vmt`bS}SXC5NGN31`(bVGn*?@$)yz3r}z0adhfY-%B$778Tv+h zeyX|;X-GC6qah}|R}M`nM0`3;Htz*fIR>m(-D4%1Q0L_;? ze%K(}OAHmfstSls#yU!%j&v94oz*9fEr4-M@AN<$C8T;Xp3^x7Q~Qq8G5lSSgMe=f z1722${93%1^q3jGS|O0+5!O(KJT&YW%wy8RGs9s5OZA--+L*NUWi@=4hU!l=FHqR= zwysGiaJ%dbX<^{zV?~INV?6d`Q&&ZZ+drodQo97nN|Z)7nT2S9(#B%}6&l^|IZw2o zatw)+IZSbH*AI4{TNEH6Gu_gKB5?9^+sf=}44wAp_VAM#9tbPuI<)UM(SQ^UA&gP> zV@^QD{fF+$Y*&TagU57ZKo_{|*V1Z}-Qq9pBuzCIsKQz#`STy$D}Zk6Pp$}()gndJ zyXH#g+iVO-S!1!LD?B!C+fV5cUeWz!@hef$H#{ZN=h5@bphl}tuHGnu;f+g`HH4ci z#YC51e3G;eK}3N(ZJ^AtIt;SDu~jfJ{Jbij3Adu}iw+@s{b$#6Z$jP`Q`pUa*Zo$5 z=zLAh@mEw0t=9ltr1cvzJR-l8tA_4BlSn5Gc5UPGrte0eER3?37ZOF?*3d87#c~~? zY{9Ga?=CMeJ{Uqg$6Ln36@1OE>PODON3z5y^>IXsB)Tc9R zX-7B2U=>LFUmIuof*T?+-a86)nYn*n#%L`Ob9l$$oT5cj!~tZXZ<850QKG-eFcyUr z029?w;@JAy31CUAgFKCDWam3vJ9%;(mi{;=#N5%N_c9sSUfkVe5nK zJ6Nqw6EY*}HH)oWh7fai5qsTj9V&juv4e!ePl%?)uu7Fa>fezqk4ihr7-a?v5^W{$@ROt7HJL1Jb zRV*ICV2sk5Puz>i`Z?RkC58TRKRlFse`#>+`(LoUQ;pd{tAGnUP6tH-WQ0bJ zyO`0}U$ktfM0T^S!O5Gli10FhWjO{oZN}lo)Apc3$3_)7qBS*oDOG%cLxWJEKHHU> zC-=AQ_R|t_@Bo2yw;k%SLH0{}!g`(>ed+3KD_05RmiP7ccV8jb?C(_P`^4K)TKc6u z;DU6ZE3Z@<@L)pN;Zy?%MVEC>(&$=ACg{jzOziEm8s;)u4`pr#Wo~A^u<3b~dam`i z=@{J;zdj8PAIB|HwBtqE{Cv*}L z6(rEL6NXTJU%26LIoT(Uj>Bh1gQ+i$hs|<(YqxJ0MF-ga5(5`Rs#F>|*DZ4)asrXK z8)JBb^`<#2TPygWzdlaR(VI3fIGXuO$;9)qFsI_naAaml zyTDFNclYUuJ!R$D5hXlrS2_9KBAqS@pFE7R96qPfU#5QgGqw3sF0_0ugzU9xXX_Up z(!2DYx{S_?;6U%Q3hjrHV(YU5hNSJbCC{60n9v8MZ`wIwP0W65+u zEVa|`QpUAx^W+BN7^x1o5iR_@?{D1 zZ!&3S;?C{*zzMYF_%Cb#qw{p@t&^Y*$5=KE)&K6~(7m>*it9(0hl(B%O89GIbWuu{ z^#|p;`GVOQTaNZ-P=2T=U{9gNUqYbu92SZ7gs0{M=7SvFj=ltHyS^Eda?g=Myj6{Y zM+WMHW%l$J{3&l(Ir%zVi!zU4S!373n{bE1&)oebMYugSY8|D$vi>(CCryK^KdNcf zFbSrP(Gs~-5bdhcH%HP=^wpFVZS{{!^1IaYdy!j}qkg6}O?}e9-shI^J3ehxNaY|d z>yf(zm;>Iz$XeiF*7nCCY4=Jnbu#jWXxyXx>v-lMBep$tPPYoZ7m zO~HVjs>Op)><*$#C^-m5FfcxQ4Y~b-FW59`a6D@ms6!&p>k$hBc=sIm>Y%x9mTUGV zZe}rKCa<*!zeY4;+9Q{~u$nw|_mpSZn3j$*(yGCY{uA_fHIwlIi>=r98T5B2h7G49 zd5jgVLnkay>cVWkQDA+vpYI@GGfL=`y*#N~-{n8C_^EJuw+aM zAGW;|H!Bd6Z@tCkd8KVI7^C9`*Pw`(+m4|yn+D5w#c4A(P1y%AwKi0|N8#wMV}BRF z^OAi3M8of}KwB$=FG`8*Vi-_}PbmWRi6O`pXTOFPv6`L?`CZ=PfB{*IGQg6AV8Q&Z z0W1mQS^VF7X4uc-S`V!^O61`GbwjqTxUU0alYcmrNz8(V2r-M<^9P1l{DJjsR%VUkhNS{-4gUMt2Jy)~ZTLOt z^iIWYfxg(xArfh=viHx#FVW`t_|>GiLE_iEMN z^h_e@Lpdo~)*_s)QN|ocV>Qc9Z)vR{oZ9sBeF(a<7`Ig_~pUwov8t{u;)?)`@$N# zE1Laqlo~nmhtM2F45B%Ys|nQADpihccJfd4eI|j_@HulAkL<#6&Oi;mAd3y->`l-= z0)<#oh9%JE<*-kJ{^bj6d^l@jCf~V)?%G1ZCNpn+o*dSqW=o~u_4yPm=Kgo*L)vwYPPYJf%JZEafR)7CYWEc3aeHw?S)ev1-< zsAObQMW{(u(2R^hB|m@)rw&A{0&1D5t1JCW9gKE-kfgm-?EVw{T3AJud)`aW527$9 z$x3wV=)7$u_ZEUrXUav~v9a+NTO!+LV%|#wKE=OpW7>M(3E}ivzwhE<9G`<6<0sYj zS0~&E;fPp^0KAV&r2Lb#i?M?`O$^D{Z^#ek+@YQ4<*rcR6*D^Sl{H=^| zohRNhD3fOozb#c!6v`vO>WVPAs%=icCS=}m##bwK1lck4?k4&wRujiG_D}CV;SCd$ zTFx)y0FbgnGVBE*!zx2{xJID$6ok%291`kC^OrqEhmW9VR29uX0)%$#UT36r>EAcj zev^EbeLBR7@Ty-huA5w^ z<8-%Ez6?-Ns0d#q1jk7kclLg__1Y7{omHN@0zyhPa0f(T1E0bVzIbOR|!}Utd6$_&(jRK*&b*b=w!DAe-l{CXg7zKXc$<)OFYcN1R&Q7WL zIbv)YJ*nV6#3R+L#93}DrUk-Ya2NE(ve5=5b==_eCOP=equP35YR$lLH~?5|$V!0y z1h!RinI{#faP)g*6tEsZSg3x%tk{Ml(#|k6^^mF`s=1d*ryGA%Bz38Iox>qm#-tG+ ze8z|iFa)eGDG+M*sM`#`H%LFZfn)#FZCTX0iRT2oPGfO7Ek(f!gN@J(M{qfkjVn0F z3gxtLn~rq#GA*H(BIOx^l`#C~ksTVu{;h`!KzZ~6El6>Y{eo+;{;vfFA=!Pc<(7b? zp6_%2j*W%2d*`VkHCA>Y@lvMynWU2HjkSTCRFs5haBw`RyF7N{%iDOi$cBIr`<>Us zgU*M}-Kenx+Q7@y72&_j;HN+9fFZxHOWsPi^Fz`a6DCaqj|*l`wW9yQyTC~rwHAxH z(O|gr@OptFCoi|AQ z`qc4U<~|C#IZpXF#V8T(D%c`*Oen2ZDQ!NZyIM>Ay&@c$#RM4_zgIwS|MgS5O&I*m zV8I|i>#UZ3E=5xvdX*so8Rq9Y=g!kzVznX(OlaH(i)`$|CY~P?be8>eMYz3tTvk%_ zTfwv&a1ZT}DiG@Oq|%;B6@De#M~0A(6IJ{RUz5o-tGkesF+06*KDrqi61==zpLCEE@AIX1W{wb8(9Xv+O==Ojvsz0gBloDni$@ve1Rv6G?)utw=-j}DxhmltYyTHv@o24MB4NaQn-hj!804epM>w-HLMg7>s~Gc4fq^alY|qsEXmPL&xFi zcaOLRRlvK31iAUAUn-Iqp0ZU`*|=jqp zmedI6BxK1nFX*#2x)~F6O2)QXK0qKpYxiZJ2eeQH>HB8P&U@euS{J3rUc0#`trt`bAq=M>ucHF2i~sP_WO1y`H2K1fRAXvXMEAQGFmiLyZwsh3TR zkVn{jF-7>F1~Ql4o}_3DKcyiGQHDR08t|%J4*Jn2`ZUOof;JiVeY4lml6wZkXa@I_ z1VYALhs7oE=@6I3?rX$DyRlVRKgw2*PyZ8>TMB4=hKwnY-?o)P<1)nyvx)~?J((+#(A8b)vu$_0fZ8FHBpbI zI%2^5eGVa__=Ov>Kj6ZRDRqUD&xuQtqMK@IEHkE<6l%R2Gxr$8g}lI>09h1vB7cO^ zzUd~d{;Pay)2$sPV{-)LSAe%v#);C20qI@pPo;cZaW#wYwbZTnKEt~2z4VdtLirW{ z^2H9(Th31NRcqKM6@X@+E8OjpZA(cPlK#~LkG#V^rNGDIs81ZM;^uuW9jjo1$9wD; z>}cTSj-d8C@PN6nKg~+*cd1&JXrJ%K5=jTqQfFE5Wq()(49fqE{T+f$oY!h>8*9*^ zo56=2238AMMjUwl0Igu2ZK28$xKac85XG#{#PC03J^aSM1(E$o zhB*TLFhZAkXyMQ2-qeV3b)g;3VA5t<{aYrx9}pfRfUd~>Pge+2b|h%QQfjjxFK!y< zdVCQz@&xDDk_GM$ zKzz$#MX0_GC;aJ58Q|jLM|8=0=L_r+c=p4;p2E!PPro5{sR^j|#LB}>`JJyRqdd$! zzx4|B8I>%qIyD!kVArbu7#(4DSe|>zBs*qBMPJ;fZj+$vX!k>rS(-Oa;Hh=7yn&(2oDg#N2Zjl_=H z`u@PIWlq3$JvUQPu4SHL3K?V6P)k!4M9QiDiF#cXgVu7O_i2({ub-zZ!*X{<0>gLc zx%A!w4EKxm_Tw-&AD@Q#J%i7z$wDU0YlQmC>G5npR2G*gy1ZhL1(qK*fL--y*1y&S zAO?NgT&U|}qM@%-M-CU~{YJ#^H~Y2A$pfciLFzWr22_^vdz$Af-3VMt4WwOo5U67r zBh!)$@1^0nUhB87SHma*S05D!J!^<>vjOC}~PgCk_3#K{9Gld!&Y$w0O z{t1r7fvM2{i`W>?4)R4HA>AfrRh$U9?+7Z=a|A^mPY=Ra9HYRkZ_`qB29peu+|Tj1pG4Uei!rBd(jvG(%? zTF>XvLs|p41W_&XCHfj>5S*8-@C$(_V}q$z8?WbJf?~%eGHe^0;x;OfO?Y5Fq6z9LzJbBo zMA6=Nar_ui$Knh$A2)vOydS@A1Sk^28oX~@rcUGt!k;=%xA!gkFnIZhg@s2kGqQe7 zLNrXV9QK^GRdv@IBK)XoS(3_9QZ-OW65~%@RI&0&a^T!i_YGBOtYhTWWKDgOTi+&n z+pj*Z&c@8rsXzGk&`%CuFrLeX5PURe7 zjJ;_5&lS!Xnv=8N{&8vIxwU^1zyOusQQ%!2{(_aOM{Hgc!t9AUPkGa+bBlnm@IDpf z%dckq`?=HrE7~Fhvuo4s+D}Go%~9~}7n8neBccusg7{&7 zwT8q_Z@0_$0i|cS5_PD8@pyu+GU#Px5?lUo!h2C2=iZ+NNwW5z-C||TsmLj`HIWYZ z_#sx)b&A*TL^^Fan=b*wQYlHSz^2u?_b#)lq;}Pbil(#zpdTe`)U$(;AwbgF4^InY zQU7(|UqpigH{pjHnA(OXl2X=dwaiVyYc9x5%`{^X7@o&quwH8JwiuQL7{g4q074>L z2W(4H5oMH)3|?dW71v6lXKgu`8K_`O$v$NFL@X+v{X{G`YBbOK-kn@YY69(u?d_Fj zatSyC93$djz}tZ1Bj`mIff`o()~YV<`*udBcoJ)N55+K+bef&~I*DS6Aq9_byQ%b* zf|$~f!(5-6ZFa%ETAI;$7xytTQ!X2)RrUk`P3-NuRsaQut z=rvMIwi;vjxt+IDRh@OUc3r+PBc<#KneqL!KOMx#^Gfm0lBa2N>Qy(@e`y6jWovXP z0y};X=~1Bla5eXVg4IaIs{d{Lg;yJnqb+wqAzTnA*_W7E`3wW2Es zTFBohA#P%y{u1m$Qw5yL?kz52OHzHL&w}r3Vm-{q0BqNu*RYa739wZa(F%tKJ*b#!Sd=?8>9Ch ziTwt7Nu@z?zPx>5Nc_9MTIAvJ(hq6lpSx5cO>Y{8omi9<_>BVF*xby2bX)xR^Tv24 zH?WVSjZ|EUf9w7-$^T8v;L5W-tPfwKuBLxxe+DeLuY@)_k01&QP~arbYLbC!1iKfZ z-`M1vb8*EP?Y=B7^hfLT*oLvawlY-jt0?0qldFIjFW3{~@>a1(S+q0~r0D^0Tp$g! zmI92ZZi2GUL6x}p^afaDp9iyEyzHB_9~6l()2)+R#h*sMK|Q5b9pc{9B&h4C~cg z34&BjzhHb4hezeapkUvXTFU7er<6PSHmutEv+f)VK7UGUtOO;Fe?lg_KcJyAV`|Yf zGLrWvv$%Q>!nl7`578?Uf^F+kqecs!{&k<%B2Kuv|2GT&A3YZ;Tz&KmW~L>WkRQ6C zx7h6sUV&R^Ur|a$eo60WQBtP#sna#7-0S(d}Hf=+CX@GNj^lb^kgzX%$dj)GUOW#F6}o zi5P13lk&(}6BLsRy|D_&jjpM|_4j=P|0z`+8q-ggF5I=x+!2Vy)JBGvKFjL=3AJzH zGE6KIJ9SZjDt5wm4ti|;?Xc6A^})?yf&2~bpHcqbDYOLN%xK5vt-BdnG zK6uGESAseCX7?t;g_X>NG-7Kh6HJ$<=9P)R$Lp!zUiU2^*)CQ7s;J&s2ZI^h6=hHN z0jVHlm{x27i=JNHHviEd^>2bsLZedr3K1im6E1i~-zpI;B2ldfJkvAwpXxYtN*(Pu z^GEc=&6+}{T@rl~EcIouN-dqc52nv1D!6p>bt241Nfd!MP3vj^gUSpKId`Fvi zjQV~U5lI;Y=MP$k#dR-&hfZ+z`;%$86ot5?iQl@bBf;h5$+cYP&L$D?2~_A(hw5KV z2)K1!44Uu}{Os(*8^}jPMioslVB}!kr3bqU`<(#C3`oK}DgX6kMt9X47*We3c(I+o@!m| zhA&#)fEC^fE^)j5%)^iMo@aGc3x55P4<3yYiV`934U^fQV_XkH%f}D-tmvfS47XVw z{v#&%65B7M2EEsK$jK0jIPft_kNxcO5I_907W2qh$#b=FHwHFmVd%SBjeo% zy^x)`oLv~zhocI;LmVSB=AOc}=}lLvC7CChw5^1@FCE=krC5SKddBlsqiU6oMs4q# zU)5XEcdnd@UIm_L>CV%g>N@L%5u(N&zEeq6zk)>SecEB1vZ@C7KRTIwZXj-ieBtQs`~+BOsZ7>yd8a~!TDwHGn&bHKb zuTwm51r_0~8^Zz4&FNWV<>L2_xzMo9TUgTSz6-EHb_L2$#$C)ZfIWP?t@!FJo z+sMdGR3&zJ#^j2{E(f1F2Z+kuGM`qAzw-@*``?&Mpvvx2S(t`%L?Jo(mv^Ye-~!3n zFiyo>u zpVMsln{=*jj)`js|FgJZ2QWD-i-EPne`>#H*XTi>O!jq=r4-|`mfSHPV7!+!l@L#Q zP9#kOi-b*Iz6>qMMI7P)NYpom<+p5-Y9eAcKEoW3lTL!CM(s!_{2$;N$%5Tdm7jBV zQY3iq`AOUtXWC*<{OnT)C#V^imkU{6)zj){>OG3-_Z;#t7-39EREa$=TYXbF$O&-&dqX0c&H zyy*PXY-YVoVZ38TxY3TBe*4ESXGW1PoWHHvF1A%k7Nn3LyI6Lt4Lsy+r|uziw!(s5 z$FN_1z)U4D-qB*MGiV)k-sg<|a|yX%Xj812&Q*4*)X)Ewza4J)9sQ*pfrM4dio}Ia zm9+ux9X)-Db|1mFI0vZ*`$f`w;rM&I*cb%`mjYA|PRHrr;@y=S!d%EGI|K!$lalGa zf{n9v{8uDn6<&t`UaW3a@eX-r$FyjIsm8e*BrH~|kdZRywP?tLAe&UJKfQtvgV};V zQZ0?tXk+-f?_=k~m&%Q;S2;7e5v@&C{nIlc`;w&Pr62~=qJkDi;|TU4EFfXEdogtO zAYJ-Uw-s~H2Ti3nj1zUv9wHtZAFlR@TN4M=%%lTPLnhDiH|x6L#w#W9ndyK_2mqf& zBpJUvT48o+q-)5!jQ|Idb_p_?i@x(@JpV2%X&TwpKZXQ|aw@-BFwr*dI>|eGYwUwM z5d&{MtZ?g%Q8jdJA|pT96E(m})zlyDf4|pSflLK_#A4o<^sD?&kXh@u3 zgEv;>*VaAMU&R{GEV83?4kD26e@{ZSD(KfR;zkf4%I0Vr1xT_KFQ(}V=znlO0Z`~OYY;{;iT zANo!io7JiwT@)GXRS{E5>2lkglhOLAU-BAc;ZC3^s+l(Rn{nfTi`$LAI4YOAbo|!R zIaROw4xn@w^eSznVMIdw<@0XnfAo?Se&*h}X^6cMMR`~oOtBW$HkbL&UTswvL8 zqdW|B7*A%Q)$&%;di5-dv~bvqaPNRr5b{^gc1&uOZ3Pwq!QOxlAVgz#T6W*SMET5< ztvrghsh3RbTLeD3wjoknFr*N>^cjYdFJUhQ9$Lg+9fy4$dAJz(&7|A+H=29a+0QIl zO7`*=L=}jlTTX`dd+EioZWn4{!<@cvNxu@uIH{BV7tUip;Uv8fQoe3S9*SPIjFh3` z={_^m7m0r68q^%4Zsm+IFc*Cz#I8`(aA1AkAs{Gqyv-ceSLnA|i zt;ZuUW0N8hAIGRe-dp$nFzVF0zpwnKI|l_n^q6(=$L$m(w^5;0`;dy?SGw^;b1C+? zb6#1z!n05Q(Ncw(n|9HB)@-D|l2Gn#9&d7Q|T!=5gS}UGSYerjM zn@NN{X1ZP`NtVm7`I-IR_*ai=-R zF&^1qneq#Fv%gIXLfG=qK6OYpU%@nB1NTXj_K4OW`W0vD4nL*TVlJoEqgI=5JVOi+ zl1k~#J;rXU<$Zb)+SQif#1D_=>ZVhED4(cKI)ou zM#D1UUr(Fzlx9PR4Iil#&95i00B+Cccp&8t;P^Xunu?a61HFsR{drm2>Nxa%!dK$O zFMsZFK`#96&X@b-RpFTV%w2-C`8K=ak6Iga%Au|C;fBCbx~jn6L8Fe~;V%@5@jepW zY>_!olB>~#Mx>G-s#pqB9D&IoNPL*k9O_Z47ujcZL0@RkVA&;8 zOJPV;eEx(t=IAx{b{aMGZY#cG&r*;9LHm^DaE0KVKoBLB?{S|j7Rz|&01ZSOG##5g z(Y<5A0Eu}*O5fB3)M96pOzs^Zf5dJA4y2Vf#~`8|l^$I*C~bfH$0wZ4ZPYo$180Oj z+ibYnM-eKp&-cjIjqHWXbPX#~RGdFmPLWI38+U5jotaR+VF@KxcBF;5LTWo$*ig$4 zH!EVXhXTono4L-sHH3G(ptbd%I{6;lM~dg%83lA*WDeS$dY?83i|uqT9gB1Sb$~C8 zRHolg++anQ%s!l;U(RJJ9xJ=ueSoPFVT~?QSgS;pBSQf4(BE?sO0EW^?}7K~LHL?B znO`ANa0wCal~t1yYwMXqAUXw3L4}CqdJ}?{&ffLsqCvo07lX^p!Yj#a1-gin>=T^3n?G()p&=G+T$} z&5P=tnc2*ew!0tm%qua_hupt%%tYg1`+Sj6J!Okg%;n5SXHF6zlU{!wXRr9Rj=+MA zDh&QvUweP>HPhzj%ayty#+Uvl&lqrr9<)7$HOifAyoDVqD>}+gFWyI$;$LbeCQBv` z5TQpx-UYbdFdm&Th6+SlnXg}nrOusqsPwg$Lm%AVEmCa{xg)ye?y{vE891)F<2_c8 z3^&yKb#zv&?6j{V5=a%mI20mU`=>VS&GMTO(p}GsnQK8+P4rLdS@Xy#4-A6z;_Aq0 z@s5k$RP={)#P{ZU~&}l~QX8c_wng$ONbR*%EZW7&vza zK$4Rr;YRa4c(g8wlj9m7VBLf;?ao8pJC(zfmeb>=&q7wcA=mLObvJ+Y$AYk?)&Cp{ zlWRq+oi29@!RraEZbRxYNMrhNq%vgYFwS@s`8fPUmf#XnQwUaO4-?C7|F#BJkO_1~ z1MP%`mBB+*`)&Uf%OL<}ad}l_8^b(fqC`4_L{FEPs_e!dEU(6LJv6#7RYU`Qp!t@uJv(zL?J4f&LZ1Hn$p!;ik?Ltb03%;tu^3i_Guaw#}$jXy4Z^tho9+b))Hoo3Y4Tl?WNz;C?ztKbB zrICi46?WLP;gU59hLW(~WU>T~4wp_X*WDO|8>rK(!mCK7*+>cEko|RU-pkl%)s|j@ zWn?>PN}jE8tShtGF9AAJx;K|u*Mx#(WchQY2RGe2 z93be}Hwd7Q!;QInAVwev-rT=Hy;@P*ldwluk`X1_WO`>II%3l8nYHS{X_>@kc)|vD zp87D29DI^ifQhlo6pz1n+7;gEIGa zme7VDi8z^jfA-_g2Md&+T)de`U?GUeV&TW34C%*AQ=`(W%B5@Dcea#hv*is=$EbP+D&--Vu=7PA4BkgL4SD0j~yP+bVx!tT*;8}JNZ?U(-;q3yGxq+G<+Rdwz5V%9Vuq<4O(|+^z0ON zl<_lLS|`~AqT#Y7HwdNl@-TzXTv9X(=b$)aRLIn^QEgh7?Ahz<4{-huA)}V1rb43K zK6Nu!i{ohH6%M>fU7wgAAhf9&uBJ1OzjJGX41b{%%)|0!L_hXe3v2?cd3!$Lzz=sB zctZXDaVeEY*O2?o6dKdk-^%kz!eGZ)s4D^I9+R4j*`|z3taODc>tM(35#`4u>f!P9 z7Ui+m*SlZp-WBhf41f6<#@q9Soyds4<`Pak7jp%+&yqbNcV2-zh?zb#OWvBq2vGuA z!w-Pt9ZRh64(TAf(e<7*@sVWVU>XwMPgIR22u{x-^rre<m0brW5)z308nVW-M9MC$^zzk|R}nQ) za$zU54{7`vXJu?iTTG-n$VtSaG0;o3Sa-!V$ZJ~5hEQ%lMatFxOfn7O#@uh;l7!4xUyp@8;HXXk1C#!c^u&s+If%`k z7vw{0qntAdp8dfR;%wkpgNiYh_PXnbeab5)sg)sX^68azMyG536J#+%pIo2o}d( zWtrD=OKVE7#o}*smne_KyJhx*2AxQ-2+u6HhrTQ2+XnN%%KTup6Nlu}jR~bZA^~91 zOQOn}s4^1!WSUCA{sIId4fRrDLTdb*e_0jmc?|0$>>=!LF(uUZy#$+CMhThu_@=x3 zga9sVh8h{Qd{qT+S#tZ%gDhxLK>_>Fwno~twTCIP4UK`db1i?dHHX+=PiH95?)j^Y zGZ#_*H{H}s4cilH>TiRyCt(fJ^n)0SzYH0{dRV$*%D<}NNHv#70$n;)qp61zzMxnA zBiQ@*EdE|_N0TI{19P#+V>?JN6{TvUOw`yHW0^~KI-EDtkKP;2DY8bGe3Oa*K;ri* znTM*t!b#AVMaw6WALVMrRqSSwyyLyDy|K!0k1Lx$L8U-0ain=ZKdCBMco@$kqp>|B z4(p%j#~+UQ@=m^6?a2t*F9oyCvg**c<&Zkr4a0ndH%|DblCX--1js}|(Kv31@}0e_ zl(UwJouS8cunbX1BXqF4lvLiagGxLv1&>2Xhe8TjO-jV`Qdy-83nXTlc3A1@6lu)u z<#}CV-Lh)=4O8rx$j|459OAyEs+<h(7-ca4 z0)v=wgVqkw$8~Y409ejXAM}^Ls7}hQg+uwM7W_$B;jG@O_VusTCu-{;7e>9;AgMML z0&^mpLiQC>iOBpZxEL*c0N)Ixz)_?6C#OMrz2PTw=X>1dory5s6~qO?*Lk-BwERz{ zkdTl?s94$Dz1+n5<3yxn_?(|S;_~QBsj%X+h?jKQ$|LK^fP!mXUFjg@yL7t*w)7&{ zAHiJSpS*he0V-CJSZYI&7&iGlRE^(G4=O64K(z{p!%Ct z%p?)@_7jk01U&srmWcKdgdzU%m5K+usWB;qO{^mkV*qa*>YPOuF}Cb}IV_dL1=ViB zRbO8o5L8$yArENh`aMG_gJKgQFw2V+ASqShGPY|0i5A+?Ta#UgjKo7ssc`EVwc|uyHF1mRpVEe!Z}j|ejq~ct$A9nf$m?gg%!5Ye^ zA-J-L92E$B3ibP(&T1;~Hi`TFdIYTN9)j<_>~5RCbonE)DF%@{bo5<9{$|rrCO%wNF@R2}NCOUGhrqS2c^cSXO-xf`>kKH);R*jda*(QTY z@Gwe06*|QbT%v?^q_JDSF&*PP=1su##F{7-*sK1Bx0WjzN~vdS|253srPJTum3n=S z-Hy!9=TxygaUE1@6ltH4;*gAABYaF|>j;z04dZ?=BG|8-CC-hG43}wrA)g^}N90pR z8N+-CMIk1y*q1gH^Q_5;+-SRt{JSKR2GL!;%8ZHa-PkntL9djCy(5HBNC)>A3-4WW zDCrpoE)&<3suSbs`J(?-6xbAZ@umy{A2KHN{zDC19ctxl-GfBGOn#%`Xfl4m)}ed7 zFD){kYH(PU7klrh$=%#?fS4`-*?)>dq)0nO3f+5Ti5?BPbZyDCu3~&Hln8+59)@x4 zFmKgEA%z$2jwszxu3L(^Tvq@4H=jj>O72_14@tHV*ml(eLm=tC*nMqdWm_JD5cy3& zLj<@aMlEKJ7A#ui7{rHUB#Zp))j9I5GR0ztz(S+*n4;{Cx4nT z`nDa6A7y+|?l2LCGK$Gb2T32`zv`$nvz^0g`}1^cF@~4gD5=rGQAmH?)sPN1mV5e# z9*-P(Mud;&Ck?#?!`;9Um~P|Wp7wlol(ka`n_7arWk%ifI2!~MY+8tP4@U~2t|7ss zn&fbIl%=~<^O2AHColCQBX2rJu(>ryaIJrnxv^D;3(VIxhB4|5!1F`5_kv4Zq6g-m!05|IUW?_EM}vgg-^RDtm>jf zTSS^^-I(g!(vMPwg1?s>=)>ae$S8v)Z%)g2wm7D(&PQC*r@-`CUv&04+vB22-iia< zMW)7!J#VCPQoe&W`qaD#v7i9++-1;U??#D#6PTc6+iixMP#qumFB9r`+WChKq598_ zF|49)JT#p%Iv38oGrr3IXDw=FHd^e?- z27JHS3pEUWxP(wqKbV55Yqg?YU-CbZ_u9b^y~^o!4u{Ur=n+%Sp>Cbf*n5@ zuux?kE7t0U#vb{+SB%ELw?Ht3&e8adyY!`60kpIOc%S!9A_}zx?t$ku)Fc;!7S(ay)LPY4!zA%NEB}C!5E`PYx++8x9qGS!r|xK z%+Y7!b{LCGsn&SGTCM+N5AEFw#o86(Ke3q(LSNM*WQ23e2F}1Q3lL$`uO}QXaC+V- z?KUUTarwj!9nil;E>VIml*O%up`^F47IsQ*fa0z=h5_I2s9i>Fu@rk<)TcIXu@!s4 zjgRe5NGJ~wY)ETe_NsaOQ#Nx3bFIDQGaSUII5MsZ@03jYEHAT;}sZUkoS zWsDw`M{NH+1S={6OZtNlSkhy@yRFyhBi=VNEP)d=B;z?XHQ4V+_fI!B5M4}CnvAuy|AkUeR@q_FJU&c+(IM)AQ>(LB0sM znFya=|9oXu{^OdQzd^dmev%Vm!dzEawHF#4LI~^Q;NPDfF)2b9>#)!)-@;!~PFBBd z{o6_{uP%R{2z}G7s@>^?okqqRy3!Z6{e0uyCFoVj;ur5dnjRw}NnpqqTZb(crdQIb zrne$_R_o`^c{Y}ra|8QzjS~%J{R5z(K7XDh~g+ zMsw}saehc%1v%72Fy?(|$Vwg*=(j|k2symd1t!-AB)Zg0o&q&JV$BD@vxt@%XV=JM zPH1hc!zjqhJbwmg49WX(DyL=jzi$}Q;Wex|jM^rW?ackAw~#je!okO;7!}KLicNaB zjPU5Pr&?yyS%QJFR8+$2C<0i52+5UV%zEdQ;_X20CP$jDVg|Ee={(l%$%Ha>0Z~8% zhxSOnbGuP~O^rE|UC*ky-k5BwWMu5tM~D1%4eUE9#R@)AK42&Wt!z0G_Z&CT>)vwL zLwI1!5{^#tVym+_$-{zy?QF^EnS+wOR;>n{4W^+0ml3lD!im__4S*h_WA;K~hrm}r z4vuUP@R^=TD;1|L1P+Pb$iEq3D>;HZ$dUr|%Pn{PE1F%td~mAZe~4$HTjxqi&UeQ* z_WDoZPM}cYOEyDB8{<-u@4~DK$d$BkD3@I=fItteVN1;j z%B@Y|s6GRY{_EQsE$*j+fDrNIyAL1n0HYcC=xQ#14^pUX-5c$8)+ElsE8^(i#jpbq znTIJoa0e<-{p*IIjpvr0p(f5|`a|2A|0D z_SOSDaCaiE8Q>$HGxevzTY=g&m>}ED^Q^k-iFf3pmS(Gm4KHc!BY6;u0N>!i|80}W zM@2+@-87~r{s=zgDEDdx)6Y+zNI#E{=kHBl}6KZ4iZ)8hC_@`%m83P53V&Z?I+T?*F6rFp=sp#za5UQxyx zqsD@_h(kJ^mDe_pL{)(<#c=>{cd4?bTE=!{dUm6((>Nz&JgY8I4hf3xm{)*swi(&X zl2hm~Pou<65KD5!6dg6ioKg|cbk9ioQyy+e(-1Q%Mu`-_KM_ZnNtuR;JiK1}4K0-f zTNhP3P5Sk>ww&$U)jAya{Fim3v^-HnWPXhrr#57qhj&$7U>v!Lb71ZQi6@&4tos9+ z8&nOJA86E^fyp6|4{zaVe;8R{X}gVgOpkK0ZFdyYS8z)w5VlC@_F!>n)Y@*ujR?p` zDLcksA8r){s^x~-U0QM%QND9rhw8yRmhF*P<}szFca5RD#ioU44B00rwy~&` zM1t<dG$}(Wlg7Rpn0! z#mkuNrup64nKcf*?WHSUiRH^vw}6sv+^pF_h|!z!SGDowGH0s;J_(O!yF!+yYV?Mk}?6w zX91KuR+~zR9F%uPS*2p}_Y&38^n&s865ukPID1|$ad6w*y61%AWN>-F%7wb%AmHf! z(6P9e7+PhhL$LMNVDf+SW@;q3ll{i{&>A-v{;`12St;tcIMTig7rz#%U3MKl$Qa#% z_|BmXVI!^^sf?br1bNiPtrVtcFHq|!c-9fg9mjc${)@Q?wRfL`sgQOd@XAeZx3mWImi6DxBuWYh0 z##1Sx4oJk-2O*R}J)TIR&#Oul$A{?ALl8n2)W?cO$T(O`iKL~=N&BQlxjt)%6Av>> zMaAGg>DF{URD-Od;GT&icF0e;YoZv}w;IDI*21bYLyTBDU&4(QxrWb+?G^b0l-XT= z@iSGf{Y!V_{?@w+DDByEQ=3?qR->NCQ2244pmm|U;E2fL3xj~W3S#{18Tq3iaRiDq z94Ib!!qEO%R5%x^W47%tM+fwg1P`H3moaH{EFBjcpqfC!3A4 zvF&7H8@sWs-PqQ~wrv|5b7T9R|5NXmshV3gQ*-b9y8E2&)7=%DO(z8Ka{R+E@Te(Y zq$pxzKrRO|n0Dr9@L9ZY-33ta4!;8(pQEJ%d!VAyBa?~)`^xjcrf!EI#_u$>oMRls ziV4_3RzE5whO+UNqWG|66Q=czI4)_qU9T<@{t=5|ME1cj+b$;zl0Zk<_5Mn}hPYEr zg$TQwGkQGGjdpV0+!X%Vd7SZW{-;?%dgzA_{{dvg>ZZY>P-nz?2rqF~@gI0fEe>P< zwT`jhXN0;Y)xT->(Mm|%0Wcw+E8snKB<}P|r9zhE3U2-inPW53fue5yLA;GSaQXro zTd7UoZ3(WbV9%G_@C3fs{N^4hy2^e47oX^hP%d9GR7_e_S@jZXv8qP>2Od+s8n030 z0ZDGTBqj~oM&^XM3F?|ycU5;{f82C>W|eqT15F`D1q#T>?}J@jwkONrv_nohtI29b zN=jV(FstdzX^p^%VZJd{MJ6iuO}T4=#7a)|%_u*ZNWt50ygv1TN57Ec53*b1eYXvG zUz!>Q@b>L$9C!6MAZFIhrD-6`7hvJd2S&#nL7Ol*htvGb|GJ`$2#`0{b#I^hJW9-9 z#z?%@`LLb=G<^_kS4!UiCN4Nyivcui`Wh=;f)NEG)rw6Mm@2P|TZG~}aLhRGQ*+kfteC>VQRQMn}435{>COXKa$Po@Fk^$8fN|=CbIXPhr zqalL*bhMrUSSJ{b^P9nwez6$nOBp+hZ2a|zdhtIuyM&O{DIpn&npGie(C(NPLcWVz zMy{T!A|Sp-@Zlgx^Jm)4vf8PL^2P4mu=2P1hi%%UVolAF11j){%EhzDp@109?ZY~q z?Us@a8o&4P(EVIYuVCduY{k=I=LTUO#V9rMa9ud;vS>HB($6|U-DdU1vs@l3^}}j` zQ%{x;;IzNXm{#gFSUY346+=>XM~T>f8SW^iNQOa<89-N0nR*VpB4qV%*LA4M&XmcW zG`SXBM182xSzlmqj|XLWP?|&3Oo7(~=(W~r#@U(D84Oy0a^Qbumko1sVIO3of`utX zoR!QHJA<O0zm4J&FnDv23v9&Ob8MIu;5?U|biOKNn*W5-7r7`>;# zkYlS+cO?W|I0hAbNEOyZ5jWD@=~}y%HUB1g7Mly>l~lqnetpJ^zR~2%jz#A08>kq& z1CmXk>-?GZSWfi6L_)fIM72=<_vhf$zpI};dCiADe2j^LvZyR}3Uxp)J`X-+$sF9v zb;-4k2F0c;OWI2u$tAg-JZ7Hs)B3^5h=LrAR~?+Q}L7ZWdI z+|sgKw&3Fuk$z>7wEN8TWBxj$u!A)$x(#3SR2?MpTC=&-wZvnofaf`~>4&E0c^@D% z-NP3!73vac!dk*~rYB0g{m)3b3jk9-r6DDPDbdQh^_M+vRxD-kovaw_X(wRzP%aU2 znu>IIeP>T{7vh{_M)anhkIkMf`|;VcpM+Xuu+=1!jx>aeY!`lu>;a8O_pKK!639Mr zbO{t_1@{2=>)m~r@BWnd`2o}=t+ZJ)*q~IkP+;k>0$E}bU7J#qNc{7KwH0AB`9ppimp&69m=flL8 zO4+ym`-J3B!&r2pq^Hh0etqiW-yH0Gw~W95gG{ejjqMIWbferj*0K@NlchDDs&VJ2 zL^35fBWN}X4g)jxP?j|u(JWIjjx1G<@B=>oz*q~W2_0;`ta?|k+0@%uqXUQd z`k7zM(YayTp^bVu<~gc)TZDZ&=#7cUQ*b5y~y=bUw|e$@c6u z1B&Yc%&U5@<4Vl>k2GayP;0i0t-_7KO%g)C{_H|Blm>>NQq*ni{wFYVGGf>IjK4vC zzbpC=aQG>+&d*)T3^)d+?+N!lKD-3>1Zl3~7tQdB<+X*`NFNfkAH!grQ3cQ!3g=F%p7g2i5D<}UFr>7> zS~BJiUZd9XV)$pY7>@$D$UD;zRk{!T_q#L15~H83zArK%Uu8tGq<82>RaDXa%H69k zo%YIY3qBl(tr#qq8NQG#M!{?FA&+={_#gKLzMYinwfr(#Q2WN}$N0-@Ez!|jvJk#_ z#OQ&;YCU*vi!qY=zcJ`1tx49pG^qwSG1N|2?qVc#bZ08Lj@kru##J!MY|zcw=CLW# z4p=j8&zd5u^!g)uEUAncz;Ir~b|ztPdKfCiXL>{>n?h>{*_kkY0`4uGviUWdJW)Z_ zYmMp;S}IP^{X~rS_!9Ubh)II=8Xu+EM3>ex?ZdByC+-qJ0oYcSuB&jK@PeXS(!{Je zBsiyNCCyMeZnwaEc_@x?qm_mwAHq~~S|n6X@VvhCC1OZPQo-Akvh7-G&7)S zx`%A5I{(HKvR;S*xX9)d_RjPNJ(VU1WH(M|+1_8+bnvBtO)uIg9eHM`*&n`>A4cZ& zVl%J#nE2KpqzMD&gGK+J8RylR_^p$ZKp;I&k3Ub@-B!g+`z)8JLs{`=JHeg%FHR^Q zJB#^kG9if#&X7p2>PZdpRvi%GDwr?a3=H`N%NuAUF4V_8SN zLrRb2jnZ%bm!OZ!iR~1M@DQ#yGf+u-R4Pe0Fu{d={TkWTF0gMz8Xb67F-j#xBqv7T zq@Z7RLiS=My?Zp!YO!S7NYDNA%cZnTg#}c(HEb)KHphcKI+k=(kk|&gTri}uqaII} zwhLc~(`A>$2Z0=)Z zo3#>CJ#+B(<*_g9SXry6A8Rwle1|T?0SN|pwy{`%)fRJwG;>luXH+3Aa<7`kDXNq8 z=@P>w8-5_??t+Xue?F~-wC0DP9aF0Mu@43sh8Jl+Zq7MWXlrp`Q-!1nPy19TPf#BE z(#2slfopZ4b|r+6Sc9kq%IJjKm75Qv^mAhQOH5*bx*K%ij3l_|PLjx%+~=Seo$(*i zU~1@YQyZi|riWOa2t41YvJf?{?%itHZCg=8`?>m%qL)|OFs~Ri^s6VgI%^^{_TXc^=QVmU;Ak*#oL{N z<--bmB+Rv&Qw_UbC{o$qq_CWZu8tvjD)v6yG`J8+|Fm8 z*&5OiLfjzk>5lC_b2=*dq}lfNT@1!NN@NPEyvYN@Cxl8_ZQw6i8&~VCe4}jfXMW!p zicR!+qy}AdsC(FC133bQ_CM-Pc~n@GWP$_oK(hh=35W(d+AVYP2&D`1v3BG~G>dZo zf5o*2kU-~6aQ@>{id^B~Qr%NZ_Xml2cXAg_@QD}7d&A^Ct-lE4mQnO>_|xZ*tPu~uY9FmF%bL~=|!BP8mAV>L=BhV z&h{hPsBr-ThkIkMY7T__gV!;t-+bf8y9&h$T6o3RUE)g|k!$&|_cONRtWO0_0A555$Ueqb>$SwtLU zBO(bPXr;>KYUB_lGw#m{DO<{JjB7NZDUrHMu77>dQx&1yI7)X%=V#&&JwP5P+xc!) zL5|NpPF~XJFrJE%MF`36K5}%*m3dkW1*s8%>}b8!rR6?+mcp&RH8c?1ku{4cLgS}z zKJZuU$%a~OCmlf*@_m@>b1YaEDvUU<(Ye8Lz^J-^XLl z)=M);P)Y+E_O2C6LtV^^cX>cvL)`A;f+%?frEF#K%< z_P3+cdD<$V5oLuaBaN-tMDl`T>#wH%7*?1gi5iu`Cwm<>UdxSkw}1Dw66`dwMzO$= zA|Rk`S`cg1H@tT#elV=({oL4JpVXd*EXBNrgYj2`?4`o4)J4<2lo?F@5=2C`8X~FQ zl|6c5ZIDNlW?Apa;UO%k0?eLQ6Vb(72ICNQowNJj3gV`qx$yy8OchfTm~nr|wwlx# z@K4j+_{jtH-o&}SjM|fid}H5`yW6Fd2d=!$N8?nYr;5Ph4MN&4czU4SX`1y$6L#Oj z|4Ioz-W!nrpA^s6)65iK?_^BdXfdC8cJH^itVCv<-SN>ZMF75;KMwmy)SsFDQEj6n zn*5G+U^Fi)>$~2AIIsYD=0=raf&(m5$72ef6Tf5m9Sl-#>}eo0g6t`1+mwfPMp&e# z7<2a~5!>C^HP?@Lz5w*j+w6lAtV3asRNp3s>t!ZDBwzsa_cvyzF2JWbGVf}M1Ve6= zoEYqe8eJkbF84Nxj_vM+SC1hxGsrtKpbwy2Uh$vy22R1(Q^f0X0)*uFcnEm4S9XS8 z56a;+@V@}FZR@pNhGPEy2!;oVc1YBL4;r-%xXwP3=`oJ?V2gjYNkP|yLt_cV<{?TV z1UCWr=t>&zL7r)aGz$j0MA@}=bYi4@Lkm5@@FJdc|2tFCvxd1N6C6I7B}EsVie+4!hO9!wuP$P;-6a7I6S zALKx)#iDtw`mn|9@4jeMBO8FVgh%HE&YB95+NHsDwz{sh6TC6aA`;3e4P8{*&qlF{ z!MH^BuF0MHe|d?2jE#hQjc>)$xri~ug3s(i<)ae16r=cgD@cXGH@SJ<2JU}AA2&M@ z%>&n`T_4dWY%Hp^+)oW4#0XAj)gnodoaz77vIqUDqc{OKlOLo`scJHyDp6pD(wU_Z|@Hvox2n&azsS(Pq-%{Pq`{|Z7DsWEjeu0x9WE*cDeYh z^I(}tCsxm@KILv!6cS~}F9?LuO|g_XD1$#1P5-5Bu9g3H&-X`rkO}HYKac?p6q;1n zjt)x!jAx}4g_kcz$Lo`&*ha$$hJ_Ik$@d>X27ZB05P?@Vm;N#Rvi$sc`pw?Y?ehGB z^IYd*(Wm^OO4aLf?Vk63v22aHo;-$fhV@p8lAo5&16M5!imG<2McaJP(6r)B+6l28;68~dVK!P-ZoB% z$$S1cAUA;Jc@RS3b>bWYs*;kn2SLdMn=IlPT`-HQc1>0D(dD{k%_{F{6Vo2TbIZvS z^-RQ5@$A%QDMMb3B$?0bM;mUzJLf4Bd$j+q-f?;XtjUVJD{)e*$JvVn=@iW2*PtE; z&C4-8tIoK+`8@f6KI6ULQ`ZV-|CAC~=j>4E-k`|fc$d|)XcXK4V=RTq=u6P1BE9)H z!@xWr$6Vd+qwu{mG2%qtP^=i<$na20;axzf|F4gXzH4Taxll-<)Z2Gd>WEY1Mkk!*j5zH%CkES;2f1{$iFzE(GCpKy>6u?m?T}TZ zfNF?4AP9W%|{dplI&MUNTuyWJWUNh82zrjp)X5FEzV@2Y>(9B4Y%)g z)Rkz1Ui)7w1U7yX_1lLs_u)OD75&X=`SlO8%ARVVMl{jhP^+k9vf^WsKWLm8N9nl1 zYx=l5!3pAf31GN!2&a?hUYVpXikXsD7|$Nfc%FrkfG-H&bmoc{@6Qk-D39kipm}>F z8YG(7*|laOLX@=Bo5mz(i!_OB=Ktjw)#zO{mm4KV+n!FbVQQk0>pras)9&l_@3rZM zsg&H!|TS7_(UL2fu?Xx3Xw`R-JB7AO`1sjV4 zC6*>*DTqr3J>K!~z6p4xiW!>GzPm6W_%H@n2O*8y<}@;cPtCgsE;Df=blye?iGSd~ zBv86asu0*zvuhZ55BbbaV~C@I*`gzE)=h|$jR$S3nY&PA1%~6Q_Qq#->R)_PF>CMG zt|ZrA*sHjE@DEa2M{^r~H}or1!@}$FCA@OOJfxA~X6j$qyde_eK*Q-ZpkE>e9 z9kEKw$8X>lD>9GC{1Wk#_!B-foq@0Wy& zVLKCLa*rIww>^HxljBE*SPbiY+pcY&VaC7jcgp%At#;~&Sb_@mIgs8Z=j%6tH;3x< zN>`WAtd0-e*~LE1Zuf2+KMI*wB5RWIO~reS#kfC2LqlyPO_`ppZws}9OhDSs8k(0^ zCbmm#_*eyvZ+Wg`bwhJ!`E>&|-cYP5o|Y0@&U z!$Bd(Nrwey%)4|Y0P@|+d`3xSSHO2G`7s$H%1Co7{K6K91EF)QC#%_b-ga%{RE(mC zQ?}hK#i@RpvSB8&phBb>|7I@OxsuEzozGmfVnx2A#iS3he!a;OB3cy)BdG$BiA7*Mhp>^0wu0jcduce7 z>(D1E;a}ra^aEzx{%AVS6AJ++*J#iKC`trLz+43u0XMhD+DeK2*a=d*#WxAA5wwL` zV0mJ9u$DiGHUuP(M2g0v5f?IpWUD~yjFQ~Kqj`(pZo0tJ2ygOwq#<>J74*kV&Qfx2 ze7Z%S{_2U$7{_H|I^-xg+nTUMZlhn6L;fMjv4>yxbb;R=-Km1b7mA%vNcUc&!9_PQ zmqvA(2K<5;SIzhyCIM{+3!oJ(Tx?>p>TvMr^;{*Jt82g6U}rBaLo5}`q++X&02?-x z`v&apYv&!|05e{UQNzI+*LeiIKPE_B)WvnHoh^Zc;n4Is6)A1Gg4QZduBXsS_!dsfXl zMqS|1$r?iPSD7On@%y*$YhJoc%7x9K8w*=OuDT&ow=MflTlNrxW^bf}VC#|Zg*w3GQ!)Bm(^U5F52mN7=DqAvpKWUBN&v8At~Nz=4K zc0l13-DxbVFFG+01h2i@G^c;@fjn<_fffW$NDLe>1-9N)sA3eJKU~jB2fAt~ShL(@ zFJKq)^Ova;k8NiDR-e8%Qc{NxZ92&6yZr9xj{5RQK_|lkVD4Dfw%UJnLYgESg({>B zG1O&aa;X;ljW`bB2>NyFjccHbR3{Zwh&a-J!dRsq4dPMWkQxLBBSK4=ODUcu)HZ#; z1#&^IeRH_A%}(js40pr%iz6i=507PRx-GBYw?~_mJUQj(T}9(#-=}h&k(7R^*!2ty z$D6INEl@QoWwir#=WUO{rIiv9O1Xm4x!*iErE!jiHn4q}$j`G1O{6KAC|NoDLI2|Y z{;s~( zY72D#TTm!M$oIup_96wD04Gi!VpZ0EQeh{%;W6w5T8qgY&Ki=*u{uN=>6HvlWd7X*JrI;Mw&oHU zBtZdQ8-D7oAzLFsO$1+(Iwyzzytx|pZ>Io<5P^9K@SyyZb5iT1aBa+>MD(6aRg(&} zp&Ge{{v@Ao-Uz@Q2ZEgGmY;PQ8?%jL+ufk(+)_tURw=-w|A;O$m_vwKHq z+Hm-~;N_xoq@4MBA}2vd)*G1Tn3;%`96l0A{n_))1dnZ5kP#J=GM@-bo)RrAKWFd6 zmLkx*UKZxLYUAv62(fbB>(02D5<}Jj>V~L%mn~YE@Uhy;8~SI?I7a_dctMT_UjIHR zQBnLTG8rKq+bdD&H@8b{HwSno+LDXPEnpd=WpJ4nBeR=I=}{|9#z$HL`E6v2>fQlO ziP#a@1sVT-Nt%}-w_5SWyPEn>+=WPh8ntjUU)knyIR73Gaa(nuy?Y347L6O=!%$w+ zB5MJgu2Skg&0AUYhn=r)p>^?y{{%VwbRhM27DBov9QmGN=R_0;UQM}}cT|Uat1L&$pOiO;(K;Cq9Sf;= zU$8X}s$lAwv%T6iXNVE0Z+pq)>OCz9afQOWtF?#IC0NFC1MI9S@G=)3F>?k{A;o{F zHDfZk5$hj(pSn>A11GmNm+=mgy%Z5dE)O+Yimr`yHPL*h5WWdP&@-<5Gz|R(i^q>Y z+w;j6SCn}DG^El3bi}Z?WeORG9a5>wysE_-BE**+?eCHPfibM2)*?2flKMHW^>XfD zVd8Bur1HlY+Js)ai^Jrk>h*DWj?^J^;ahTGJ+1Ae^fvf8%Y}Bx@WUFpjJ#}Y*Ib#T zGC}PAVD|SbiR?S%bw?To(!9JbX`@($tKRgfrD5!WuKicB4)eW8XR0s#_L%SxGXK`v zEIm?$hD1^z)vcYph12nWG&Dx@($a#B+$W(i4kUp!D2o)<1gYsrncHyl+|#vsVc(lN zX$c!69{By)IJGAbvxC8U$^i|jcPHRSI{R+#HDQf;CA0C$NzoO<{oHq31?)~l{fk!a z+BPC5_cN?EBI+&S6#hGo_okpAvS^s8dtDoit^dE5q~_E~WbPk}Gt`{}%Bq~}z@W81 zMr>#F6|Kd}li9qWl%drIykhaAtGOJhnP)QO0+Si8l(E#6pjF~BVOr@)HeIdfAx2&_O3Qk+z{{ds; zLeY}qr8}u5hyaic#YqKt}jH}Eb=b3KPd{|%A&!KnBM?l04s4mas(3YRl?REpaP%MjoB#p49f`QY;{YsQ%0#yT4t{%_#>z>uV^I?$_+HbKR z{$pe-_qo1`LpDdXM>d}9&Jd#*71VKic7`4jcMwM_8Bs_tS0Z*_Jzyhnm~grU8&86Q zv+N@d5H~SS2#=FZA>#w}d0`${gdm9D#ERDqa-aD3orID^nlQ++Gq%^WGLdlqpuX#M ze`lkYz~bf6Z>Xxvy;`ybYkL(j47UAj2iJ*|@We(SeP90&(U>Y-1ER*~Iq}ElcUp#a zSb6i`IhZ&?(UpBUun92ruIPheTc0b*_`Yi%#P?g%a9gaf1p$JW;O_4pFje z!HSFzXDt7jweQ8Qm`D`wPz~Xs(53WwF|eEG`n{N1h=9!F)?-#2<{2F`DT8;}D_r8O zev2iOJ;=LPTtJG*CSpme1h6V4TxMXk)65G7n9b+V&uo73F(8>c|7O#|BVhwuW8`^U zEz&#L>Be2ccqpjEr;^ajN!7J%VG;ulL)Wc79YpOz7Ro_c5BZ=C#uPWX#NDDJ;guPp z{wF%KPM^s-3e=#j*`^}k0r(L+gpHiS2ccOdxU1oa@l&GKy|vQQ$96z+e=gO56YL=%;wg zMqZ)f>1pmPE8m?v(#*WTkNtCeG~WpXU%@CYsk-f%{+DXbrdO7qW2g$WNgDHC|00cU zq!0I2H>NThbC51#!(^)ch9tsOKSUh^9+7qzv<3E!EEH>*!eT1|nRdtDU@lc0-#l0N zap=->mY!VTzKgZ^e`+5JRyAr85p^cCKP5F0=>hFX*^U~U?frV>J6r&mR8{<|1pAwU zS(JeTwFL?og_jRTTake`LFFpB8^iRaU#5PA#NtV1rLV5Hz|=~!mukQ)Agdbo;SGuN zu_~oD^&ePFl1lzzW5P5$js_k4@;$W<3pv@UWjjpuL~f6;7hb}zx?5s9iax&0Y~Y*t z+d&$y$wZQvTT7e^$xM3Bg2cY@jC0QnK3SF=&R# zWJN6T0k0qV+{)pk$|`=7MTY@nBy=po+;HqAECW!+0MK2 zYe-ci^_S-PHmIYQi#IQ5C__YNsNhSFvK^SIS^Bu?Twagc%RUQ!9ukE&&SUMWOeX9; zoA=FS-5SilJ|S)gKUjoMBC?c^3E&%HmxNuPD!R3)eO?(ep-p# z)VO`Q&hR)%)S;_2crV_v|B>L;nX3PhV4O^mIe_IAUkMpSsM*TKA>Y*@@UuTe495Ej zW$8wn4>4!Ca`Xt1Fl&PCA9x(iuqOCM@1``ASt`S;Q*rvUE%-ds!~_m+%;VW$u=d+4 zgmvRLkLTD%8i$qQZ+C9%G_ug0ehfSMYD|)y!&pAK&THpIgPupT9p=)w!=4G37UDOt zm~)Z}u719!dw2cYjpqv$NYTyl`f*6m58f5WAzif;?l;kZ_W%rgH$X-5oH&>yGl2)f zTTHD5{*y?F6{+G64a`K%anW_t2=DhIR(J1tXc+_TBnjumuFx2|w!|{=3k-ck_q&q@0rO978~g7ZqBo@st95DjmlaTYoq{m6{_UlEZbNll!|&0h7O?d^$ESNs4oQ zpi+CnAq;%K0Nr-AGpu5G>*e9U^BBZ5#h@m#4EUKRyTkdmD?Rd;zHfDk_77eGgV~cH z-+96Kloz+8aI(MbY@wqr6$7ifgj~j{Xg*!iU=ES&Lw5P!bxGpRRgfpjes~0%T-U$j zbCd*zm9Q|l=|Y3Hu=qF%@Q0B ziEO(1p?^L_i<9tXv@H{H8jU#P=E0HAgtfzrKz^Fd3jlf|aP9fzAH?uYA$yH?PA<5E z4G*K=E?_MRVhgdjJ1GD?5{Urser{+Z#|dOqfwsSqzCD>B_>cbL@}BvxisD+9M^27{ zhv1PxPSRt0+tbq<^9UYF9oWUgv~KQZqc`n|X$wEOJ}M7?ljJO6KY7V7@68YX^7(kIm_BxyY-IA7n2NE->Taib^pgI&IKIn-H12GayMoeK zoIAdPW6sApvKygR_SDam&5`7*L+op72x+en2@=OLH0GFR$pnN<J z-L>AnE8g%rm@?PUjCUFqk_w$D9A9QF+z45I7Ot-^bcctY%+0PWMC*G{Iy;yx{c`P< zh#|VB@H=#GF42K3`GldG+A*~En|!FFN441jjPym|1Ph)_V6TQe$il5ruX?wYc~fhn z<>b5$E4&Dz>2s|6_X<8{e>fe3J>qTW*czY~tta$s3SIyK!l$#yh{VzUSlt9Jz$wJ%pPdIeV^`vyyKfZLqowjJ7S<6MQ z7 z3M6|o_j9%NIExK$(iA48dO5Qn08sX(0=`|uY%K8}OY5%L^AK*FmNQPS*<@$$QxsA! zYwHIHE#9#(S{}8&v{_Aa#jqxAa#{vU%JT2O9Ye-Ga+EXIyNeuR8zHz`3QeK%5z@Wp z$3yvck`7xmx!;MH99i*vA!t|LvEarpOozDtD9VrhR{IxsB~x)3>WDL#q2|iQXC#(# zIT~(T-@R!0A>n218k0E`eKuo5NfuMgB>*={g)KV#qpUq;D{G)ty?bUSEb|$Pq(6~v z16(daynfWx*|F)5=VcQJNQNF21>MSB4Qo#4GQ@=n*eix_&8zsd3;m4|V>~IlH7ojh${5GCq zLlsnmKx)M1IoxYX==U|k0SWQ-90a%`VO+JxK=PEZmplcI;DHqU%3|&U{PNO{lV%$j z8QQMtirdy1Vv=bOs_9LcS-;Z1M+>pvq>gyYk}NjaOCg{T14wM?!a?G9HolW5*z#|L z#n@YBVpBvPQ6L#Cd(UySPxr$PM>~fR{7r!=fA&G6OvvG1O%koz`gV1d!1B>m6Y^==? znIr!RMkD0t4fa2~?4)OcxK&+<>;L^+H;O+X1Hqq7>k1O~8^ovQfAZt({CRKl>kFb# z(FmjhzWRDd8HQ)pwlPW!E3^4I0n=C!?#0+HF3TE-q)&Cwy5HEoCWhEq74U;`5J)k0 z)I4X2N_d0TRu)*7EvpI`W(z$ny_#pyo4aEqn-%~+XgB*0HX^E*SUCdy<2X26{^%XD zSxqnb_A5%1Ytoym2>wSr3GvIr05LcTR>)^+Or$-GipLk_C58W(e`kVg_5((|VrmP@ zQqFyWo;Eu88wEP+Dx%;X0=^9nxYhV3eR1yWe{;it+F8oYLB7pkDRY_2;a6;9skWcX zeGgaPLO)zSALq*x%$M&hmJf-f_6W9TP~&EPRL%39_%75r+P-cr($z;;Ic53#h{s?T zPU=apxkb>U)N5@)q0DmLU&0oWIY>hC_!=&eT4%_}ajV0Z=&s$C->pSDYclXB7;HL# zV^B~%cypl@C>WaE>vRWdD_c<>PFcui5A!8ict+7Pjx41hz;Dbo$+ESozV{ATTzf3WgFio(|p6b1qoWO3E-;7IA;cHTj}J z;)y=_V2o48^$bDkzE9OX;h(_t(Q|okc;L;(+F>`+*U>!5PCe%9sZOSA&R%*0a|M!* znP8I(cYo5Wry*tE+1_#?Q5w?@ajp5ObCfinroOiq*7YDJ7G$3e=Hq?vbZGV>qq<)S z+_(8+4DbRv)!8P(1t*XUi*o2{@)Wel!$G1A{h|6O_=TMi+_rE({By3z-ISU}O6J$+ zm+-L&N?PB3x^-RQ&dyA71&Je}#f`l&JjCfM`63jNwikT;WEbr)AOMr&!tLf5yWnJ~ z7m@Om!ss)^OjNltVEbug0!OFlh0dE8?DhVhoWC8irwxu!l{$eViddEM2<5ch8g|cN z+LU0rS@!@U$2mD}G9kE*6*687G}NlD0U17u2`n=qvzvk>`;j&f^laV9(b}qm49-eY z?(RKwG`D$NPZHXoXgLXIGTP$6UM$nu7U_1K>uBK)eQm|1!JdHgaGK!n;fSC4 zK2cdepnJg8qhfw@%aToBgHsi}uhrkYM_xF%if)GAgV7rNLo!Xba1NWx@~e_geUmA< zMj^lys^rTkM9AMBOZOzZH#ii1tr?!wOk0jB#;fL37W%!mUE?;wSJMf|5h|$QPh5|} zBR)OJu&;dDC|Y?BFL|6Nu-^@f-xE=l@BxV~-IINJHgQS0pOd2}J`H-B+bJ1URxfWo zU2T0HDDpsBGQ4<4NW_ip;y0AADzh1nj7;mFYMR?4s?4}sQtgNDy)Rys5_w-yk?XEx zV!^Ib-u@WuFFbu{VlGYy`p&g>nEjcEsD-FqK++6Bwlri&Ih9|J2qN6|O7oq--VJ%R zXR4b*#3@|V1elg1|St;7#!3j(;yq|5D9f!I7T5R0nV@CqWP!CO(q` z{L4uddy1Gjw9oQum5@rL<}C6f{7$*#Khw>l9&n65zBHRVj)^tcC2s+CAe&teGKJEk zaJaYRCDWwUJSXNH41H_<)w&$-tO|QBuuhvO+%9mS~#I6K1zeKAL%p$L9+eAn$h5tfX zob56m3PvYO0yuJ#-hd`VVLmKO@X$jty7C!pa2HNtYI<)8K?Y~RSJ+49-(7Sx<1ftY zTu9(;y~^fr$e6FiesAO>U|?CGL-GIKZTKv?kJpYV}Uzq0iZ1dkztc5bxaO>hoqn&HqlVk z({0-Jvei)KJMPJ0p87A0U8)9RXIMKl3+`3JICMEJ+jl&2&@rCwgA3`_0I$Dh^O%F$ zGXuYz1O3yl7`sUug|EA>DFW>K2)Wd}2DBem{ilvEda)9zhdEQHPCH;C)-8nW8`(>j zV8W^m=Jz}HjCrM8%i$gZUw{&d|A=%GOpwzupQ;+=1^1(~_-RUZO`Uf?6ZsxxH%=nO zrjG3i14&9oAG<25A#C|8iTE8R_JN^05ggC)xBtCxwB=|eglXQ%Z>>s6x|aJz;}&O% zvHW{C_gbx(xaX|zEh^uL{~Qn-A;Z4`(U$1< zwR1K4-&|zYsqoM%!E-6fYm?QmF(vtUFf)_CdwtGb?TBTO>6S5;cJC}GNJvdPsg#o? z;_?YjN(0D{zKYiSEFIJS9ZJ2dv(g_VgYq(9`OmDtPkioSxy!p(&Do63v5y2ck@XqN0a`Y*NMI{>W6qSBv%&m1ovdx)w8g zP+%z+<~aC9lqs@GCXtbM$^EBc#V@1X`98DJ9IA>^&ov`7&WT-cq2v4lnaNiztgvJPJcwdlW!A(55* zqU7kOS#!hMYb`Q97!K%E3V@53XvK(&d)BGz2MLrS$93 zNUm+5e)U=0caI0mkew)|Z!)R6&@g>XT*A-vvL~EUs_asHy#WD%-t%CBefPZOuZ)Ku zrbp)rmh(8SCi;apk$r~|{ape*D3d1Ki*OEH?^L+RIOXL+U_82n(l zTb=oqyFt(CLXfgM`MT?-lFpJ~oKFP|J(ht(w}B(r&VCHa`KT0>zV7}sXgfX(c!*M< zR4i~qn$!3HfPh_cIN^j26)q*ORKWa6r$?5SuAcydaAv=ZWANqk1rh>1;U0tB-VJ~H zs<^D5{qU8gj1dDk^#@LhOz#Q8T&_CT%DDy_fw5{#7V7YPKg3n@G2?DZRxj_{3jH$| zLO^np3{fLg=@85UftmO3O7$mw*<}6fj~!C+E@ZjgTYXSs;J7`~fKf?E!xa?bFf+Mb zVHqQQcxietSUR-2n{&vA6nyCyk^@ zbd6eND)W5!bi|-FvZOgQD5-cdq+2OYH#{(Q=g`4ug>*veIWQJ_Q3(SmwwdzL7i~Nb zb)5>GLILX`kHE^!P5<8bez!NK81Nq$rtg!{_x5YxSzGzI-BE&Cbb3t4q)|TA- zJ^~5`%j>sBKX3gLA+?INQA=%nH9AOu7(c_wz#^_NK$&g(%w8vKYr&zs+h__1bCkN9 zZigM(Z7mUOubi97B!R+vA@JUkW*YAXkop;;3ZM1mPBAMQ>*_IMN}@&I4S-NWmPI9{ zmj&RtI=JWZaP|E~+C7%%IoeVsEM)53R^|dm40@k#>3Z@k*#i_IikX!*HT$*H1-{+Q z7TUR2v73hn{)~^+%+VcsLArQOGpM-%Ahj#ihTd6Ugw1VXtD!_#@1RKn_h66c#Dq0* zh1i0WS?X&`G%hyUHpUfXKU5{>zLr$1p7vsMBf@AUyc&#E+Uo! z;r;{hVCAc85pgKcHSV)75+07~>zRANCx~;8s1PxZSDG0dqdn zL4OUI0!KJC*Ip;nUP9J&8YDA5Z|E9}F>FevFO;*8=2Djja6$s3L; zP~w~KzX1%SCOYYmZID)k5QJmQz9ksc`TZ0U8LbOEk-17rJlc|oOX-sREb zBaYIm!0+rPS|np@Scm*!7>JssJ^0+y_5V~SA-d-s+`ZpeI4`bNd~tk(2Eb6##Xw2_ zc*yDF>umSnialw6xMkQhm(2~|=ATRF(wK!<_oogAdBKf{ z7p}7+z>v;38yfsM{8@6;Y33cUx^f#{)@p|2pn(|VyE&*cDp#h&>UfF|@?9Nt;}UXK z-ux!q=fLXeAM6uFLI$2JQlsCkG;EG~{eP5wV|-*y@NR5PY}>ZYO*Xc<+1R$Zv3FwI z#>Td7Zk&yC=lx%NzhBP$=1kA&>h9|5=c(#bef4d#M6y)uAS=uszbQe$XaofQ8!``- zrZDys-WFu!CGjHvx$c9WV>g3KxoI^ANvU#B$$MyNt)hTAi~mw0cDgVC?A$8gtwa3m zEP1<4C-@*iX`aTqr zOyIrFHtQ*h$9?}GL{`0nMBw!aRlk4@{BG}nZ}tb39Qp2nn$2zFdv`_d-&4w!N_-m; zF0DARW(r`+igxV^-@~54EKhb<5tCGy0Y}||mpBV=a05fSh0+bGUaamDe-YvJuJ2*+ zXXOPM_cstBzqpkY+zsB?oA!l7kC|KFomDge?q;@ov0%PCqZY?CPESbA>8N3rTB_tC z8cPt1qjCXVtjx_J0_xBF-#Mgj{R>_hVin;=y8Hd!RXKTPjaa=DW?@t148(AKBsa3q zk6W+x1Zhd56-LLh-1!b3Lh_lz+2#^Ds7g-sJCN9cV8^FJu!ODdv!(5X8nQfaN*4&@ z!ll-+OK!qESCtIb*6T_W__#%(U{b4@D*5S&3NT z<`(CQ7|1mjI54O649b8fQqDjdD&R`uiqD_$KBmalEgD zEcF@NMOgwWz75yP6tt0DsN{tBKzeu<;}84y@Vsf-!6Pa<1~}NB2cN8GEaDnTif`Fi zaRuNNtl&~sp?yXn0_3#BWvU(|D{GZ_2caca_`Qc~;P^v-ONgA$=zf4axIa7=fNYaM zSYA5~EFr@;iyO_#TjGdMD3oYwy`+mE9f2#UxN15wgZEG|a6FAbldo1O-{Jfd4WQ?p z@_mIH=XZ4qqdgBke8GODkP>u|BmGE68BvTJL%SWE=VXMRF;8*rW#gkA+o%pit}J+@ zkYM?SgB|W{NM4?zj-=6saIjwUpu1mxu?(MT4$AOk~xcCrZ=}iFh;%VqWE3D)Hy#v4> zdZbYwRb-bHc5N1zO~=j0b|1`dXfC2ppX;2GF7Yt-W_FmN(YLCF$<;9Rru8E2}TZ$@Y&TU$R)=x z5nb5jfiZWogdEd3k4fmMH7&=kC<@%ANk4#w)Qu`O-BAcittw=4`s z@(?6a+_cDqHa!U!rc3!;7Mc@MrK6%J>#3d0E9_!xws}t&IdsxEg>pF1)yrPak#x@QA-ruyF-Ppp@cFD-Tjqr=3k=rA= z?v32ze0(8;2;sgr-Hj5=1X*Ur$^1Ttd#!yfz;)}t!X0CR4(_W;9CRU+2#NB<`l$7T z^_?}O-=jG$8&sH&=4;0%7fE{{Jn!4#q|e-n#&QURVq3#rEV68g=`SflPXH%W51w$Z zSTr2I!7hKb7RCl@wTpI-5s}^UlMpk-sIU@YdD|ahbM(u#^ceqWkG=6eiAnhC;ZS#& zd&LYnvX(t8&3E787X2ihs8N1;d&koJZ;Y?D!PKAUg%0QQcz<>X@SZ$Z`m!Sa> z_sqb%_})Kc*h107wO_w3a}g7%w7hnduXQ`S8Q`PRz2I>}C_@3!eSy#o(RApyk)l0~ zjb;ilQPKdFRg`)ObVgAD{1GWKg3ba3Ga2_3bHa@jb#!BNfwCloSRw&UXd2ohNv^?S?H-xOelqSp< z*$mFJvf*Uk-7)KEGVihYg&o^X*|6lJAo^7@W`Vootk(SpVO%4AZdfukX~{#Ks_B9| z%IDX|mtll~u(g!{O^1^mHzzO_EitgkbxkRSPV(*T$rLN~yCvsZIn*Y*RJz;h@b3ea zZ^F8%Ut_fSdd@1Gb4fh#HezFd#G;Ysic%T@*B1!Cn*S=>IfPHa;Xii7P-77cdWy&% zyt-$SJK?>&6MNIL$M0~eK0_Y$1c!f?_}Uka_y%@*qF55lDXyDH3%>vS0Xot;29gTP zq6|l#QIpLeV#C!2e&{)L#C8GeKo;{e(24vxfXhIN;~qjP$=wX?Ny5MN0*PuFMp=7RNy44N zDc!qb*WzmOt-4fc-~EqCY4jwKeUtE>ciW-6^dp$? zYle5Qu6Rnl-~=XB+vqR>fE zfRs7!cenJ}vvf$dA&u)kBbOXGs3h)WtF>#EG*rQYOsfKxkWHK^7>@W^t9_!RKBiDf zV8v>69`oML^oL_}cSx=1EBxx|eD!Sxmn1BFlfL8>D>XODGAJA}Lj$1hsjl;FKV#>6 zDRw!hr9xFX!{{4`N@SY&PAp)A%ge_YED4A9XQ(Ls8OOd%4B*9jy8D;nDz)I0_9F6@ zA>t%tE|k_Deo9fWgt6|m8!-jzhq{ZSCDE48jo%%~Fy(S1%`o{WL-0#2rx!%s3oO$t z_$^%cOBMjW7j}>$FhO9$e_rIqi%(b@gFfnXM4W0rREmlPb zZ_cFY7a#>4ynHW>rKN+9#hwFF04OL070vgkxV|5yAZY;hyhg)#6=*q*U5TDkS%(5m z)Tv97je1sTc_t}F-Yk31LP6^Vkpy??4!-7DXGHo^k&wIlHRr`!k0C*d)6u;{M>hZ< z=8Nn6L_ob`W*A-6mvjk2mvQuL2b^|rEelx1BexPo9{dYsh6U=^hsgAOjsMVpW^Vpq zakXY=sJ{6unJ{oRH0y_1zzz@xyQzDj?Sj-S@ zQpmM|vzjVvl|ebH@2sWZ46SXEPkL|=H-)%=edWzY{EpfBRoZBQnr5JP23q5!0OfBr zVOnG4Xnalt_4wX-JwtUDoQzl3T+v6?V#@*fs1L;Di~rZNa|E$YAbF$zugS|KF~Z(} z+#w76{1j--R(zm7ru=g7jxqA5mm*Ni1``-YFb_8c^Qx&J5mPLgNZWtc`Z}~H{zcyS ziGr<3+5~HjRCA}N+|x)5te*Ol@~brdf=%4KT`rxCi2VT&%!`Q{$`? zYHd(R=+tkzb9NN>VM#+|hAA38q~CrAZ|DHuZjWKzzdcB1AXZ)7T0FbMt8-p`{$%}p z$p)p9(7sj$4>H+CXisi#(O*jG-64`jvk zsn!SE;7DwIBRMhUlnR3S_I=1V-!qIswq>Zm8*D@2p62o}{u~x&h4^pP50s7<)9mv- zt-M?fkhmUAR-yJV6z45jmT1L+(rCdijc*3C)EK0jLdiByzaV&&a@=8cDO8`r*knc| z6Ul-XbddrR_#3^REfG-fmvRxm$JF&5lvatsLf*b}EwEQkJ(Vm3U3nqeBkW;M9BlG^ zjMqnHxc`E`w*#mbK+Ep+MR6-j3$lBb!&Z=LwYyEaij`ZdKOb<>(g@v6LA}q|RR&C_ zo6i^Js~)TIjMvs-*1Xi<>;OURZ|=Dju5HW1ljHSP0*sIcemOA1Zj!AfPvf5m_WY z6Ry4zkK0}ic>de(RC<<*Ad*Vtbtx)@L${^Xh{;k~#l{eOp_Mg|%Hr_i8#J|usZK{L z!9stmM$Y!UQB-Q67Y}$wYi%Oe(T_ChAkW{+uqSL9q-ZC~W)^g4to2_vIrdCj8hM)7 zaI@qCHd(0m%PdK8}%6cNI3?Pi6CimzKPZ%wj6iGm+dy9A5F zq5mLbw2bM>> z1(|b+Nirw*9lojCz5@YQ$t{N(bt*v7aVQAo0X-ISZXn5f>eo=0wJMS#{kGczLw(Fc z{6z=%o?!X$Dn7sg3HTtGIP>4d;lB&dE9~Qs+c0^Q@TPs*BUuc{qf(+m!g8Iq@;9M) z(y_TK$xW^YNOD>O8revT3E(~zFw$UGOSq1JfDEgCYc0*eKd07QSP9^*WkLB}PuToz^!JTEA z$OXY@>bTZ(zJMw@I|FU2d}al2i};@riLo4yRZyeLQQyH!7x!*1&c#c}n;#RWE;x6L zB{Y1D|5j4<>w73PF`$(t){89?IEc7BeIc;x^BzMU>uHXlL!mh$od_pJf9(5JAZ%NU z7eG=iU#6d0<(9&RP7bent!L!u)D&Ggt#j^HCR|k8Gqn>N>VrXARnUvAEn3Ey)^vKM522r_Cp&bdvMslN{4(@Cb+%y z@ndj06q48_kfURTK+=-7AuY0S5EEooe|HQ`YLrPLOvDLb(Nhlso8VNJ2?&3C*@i$f zU9J3{lbM`yD!~6<9hjJybxIJSPeM=-*1RUJdwMJSPbc5TwW zc`&5K-{c3(aWT5KnwXR!{oBbDt^!Lw_WBmDMOB*Hwb*+b#RDvxKa*#0yN5qYpPI$8 zY?W4V!ZsdVF!;sde(D<3Gkj>X@Tie3T9)0GQsa}Lb@ZG7x*RaxWTK#QkG!Z;g(?u` zYlWu1ivF$$4d=3osNerlj;I0uf-~tIJfGnmLP)CZC*8aClZHiFaQ@2@ze63NRbw70 zu+g`RXh=*k6ci%lNCgYlXSN6WJLK(i}i`!=rf z&wfG!K1}P18)m#V8&*e}f;KhSWZ~R}ge~shha9x)W9COy$=5UzRk-%3mgKCK@-H85 zh;Q6&<|X!O*xI=gKt+Q+4M$6Z#SwFF-zKogT%q!blYbvm%uoO6&_DN*AJsIfxW1Oo zOco}z@~VA!80~7*M}g5mFsIF>@dtyFiNLVNRimGo;~`-cP#+e_7cUq@?>T`@h-oaR zKF$avMT|vW(j=rPBuztUd>wG0gv5yH3rVLT9V$u@E)qasS~PD3F0Eq7G6$#3g#X;Ivb735 zw9CwSX-YjPT3E!`wUfl?c(m#amFL1oA zkp%J4NZUzhS1?%*Ib;4KljR!D zu*lvB96FgOl3QJ&}rJcu>Q%z7&;~jDTl<_ z<`mqSf0R2ZY9`HOP1OX7!E{7?-(~!4{m!wDu={JR(c;tR%_0OpgN{Ig5jV&wa2={2 zZRdCj5d#uHDISQ+m|Nf_r&D5WxQx-Og2myFXPSA4^Q_VzqzFPxvNPrFs(E~=RtPbP ziW!_NEcFR&m^nHUsY{CY>|Z(6IQih%jCEpwlxtASzX421skNm1LqLQ=0$_S2eOwHS z?Z1xKtm6q~gVq;}E#8U=lr1XWwPk?+^^ao;M;GnSn|sN{rfiooLlT{w1fw}FxppXL zy9g*fTkI*j7Z{=y-KIr44hZ@&Bs|y!Tm8%;_rjGpt%4}FqN(hwZ6dR9IbJ9;Fzr*R ziwhDbPqY94)PtdH3ie!xU_Juz#?Ty>F)A=E&RKQARAYG^efgw54ZDssO(LNwSWyyv zpd@^y+VbR|5~h-EvCtq<4ZHv~JRVRsSVf@G!fZY|dHN8~7KEIj>;)oVJy3(n${3y> z;^gVfWy^VhR^%EMpmnD9Fvf3{b#`Gq(|(%BXNT!VI)tjYz{aW1e()dT5S3eCtiL|3n;T%5t=MDi|PLMMctJaXjZ(H#tuVJFGB zLyW8TqZwJ5Pw6GUBCLW(p^?HUlzQ?h=%^%@$5lodojS1pU$qcRZ}~`XRAv&TR@JX#?HS}e|-o9`KBiw z%m2G=8`Fhrp%B6rEByZo`~d}?R{C5#eZiGzY1P}ps*ekPK`i`dsq<~N41V>k!o^-VW>BBvINc5{8KjG&qg=d)s&{E{g;yhCHVc~8OkPjQIYLhynzdQbRrTKOKjVS&9S zcm1yvL-iG*eFks2wsb#bp^jR2AJm(Dy?Q|-U+vPh)_T>Ym@ivgSDT%L5MMS{>m(bB z!62~F1889}ui0?An|8rJChYJH?AbK`I|OERV1d_^rRgy+XlkM|hL+7<+!ZHT7 zC37^0*Mv!AV#Cqt$K42C%#r`0c>JM38@i69wQ_z$KYZI#XYe#+;>dUftG%P^>Zrwf*S(?0hNdCK+m3ddntn5 zlg{3s5BkHZB_HWA3Lb>%!tP6(!c?|Bt&8dN-H@W3urbA;#p~Xq{o9YQIMnP-_AE)B zh6h3UNi(D?TLl+sbVN;l6l~MXO;$@yAhCa|%flV*NsJAWU`(dh9G8h3&84~@?|JiN zy6DQ!J)$6GPc@cBfB|KRRO3v8bYDu{wQkOo^k8)lfI12?mNf;`$W3jK4F5y^s~|mX zC8+D)X9AEGIq$hJK#5`Pn2Lz^?K7cX0ZclfzX_&2{8gEy${d1%t37SVSx&LZC z$|$skTdP1g&q#@aRR5IRR1CP7Njr)XOUi;EJAzZaOMqhFFZxR_{Pu(4k*iom*c1|l zhwagQr)-E+D)?ySVFTGv#CUi9`6$t3j7p(MjBbU=j$PW+d zjY0*D7poHAWisL|Z4gt_o{ek#gku*EB)hKf>Ll`3gj{Enq$nDyc>n!LCXagYTvt(b zfzuREwqJ2j01bmj)|Y6-=fFqF;KKMr`!pTX(CWViBB!O%(UoIjf16DRF|r8R@Fzr& zU&sC83`VCFUD=AyKVB@pTlY3bh;otO|DK4l`j}90;(GzG^P^yU;DFuFCn1T9=sACm z{~>$ru3nx{+1#yS?-84I$sY_kd-F{uON~UV2Cz$vk6xoHNI|#|ZlE&nRF~K3Ylns5 zzS=J2Mg7CA-pI9V=07V5;X##Iz`?j47N==~F zDU+w2aR;0t#2ifm3#j`NH>O-lB}x$=dNTy=I{e3bX%17+h;TXlcRe+FRz$R2a1*G5 zZv16jK_4J`@MeuJXHX_TN=WY?tXe7*3}Odg`Tk0~v~3^={vMmj&IL~A%YU*g+Zz$m zP?+7a6ihKn3cl|@%(jR$;~m(tf0s=ApObUidiKlME}7l?BjSzOtkdyWh{nRCmL(qS zgrj%(k4(iK$r|}EHgz_>7&AtZ?(_2)A|-EWjJ&>OkJD9_Kfgn>cuz-&%YO7AljhO& ztJRLHC++FIs!(9);0hgO&{y~jxzJ*Rwk%Y!S|a`k;RG4c#ylphEMZ_i-aR!8LNbd| zsaq3$@4-`eUQxg#=^~=O$XmUNoTLahbsvxuZr;_=@)A5(%he7mfqPKO0@p}4^0cAJ;rHD(WwH&as4j-bRwNz17ps*a=+0D%ifWXf8;*#Q%_%b2a>L-q*QJHH zL&#k*MtPa4w7|*ENZI4JnUA|D0JZqD;ISOVd)yoE7Mp^zIL*1xF-u{mk-IH>HcjuwT;_X15Me^nF?nfT}OdbFYX~eIJW;JyU5wB7v!r&^2eTeJ$?SB{g5y3 z98{>AWFk5E_&3${G|(9%-IJ6oEi7u?4E&^W%u8p{lim5&wU>srq~)KF7|55qx$aQqzt*0*@xA| zBrhy>L-fpK$In13Y`sYLf>Wucu73EHnJV7kc?MA;8wvuyjz0_=s*&^DFbI25Y&l3` zFHj?=X^;rqt!yfz(&j@&xGDJHbOi$@xzXq|)(oKVQrX;$r?f@M^UTgHOK9$ji7#Q1uW+vUCFg)|1a8L+w&b*XXRo=`ZrqJa>I?G#n z2J`wWTRQ=ty$jlSIH{m_8K?Dqa_dwK*oC#<6nmosHqSwz>h_<3mP;~pREmZ|eqM0z zgzJoS4Z(*{1T{enP?cO1(Kbonj^if&d0sKn0FUO zDqW2&{KVcEBLRHOj-Rvcz=z)-eg&XsQNmQpjXFXEyc%hr&a`m8nFQfP{>!KlXhIWe z)Qa_S=tHx(WjOr+F*4X})G!Twsu}$GR~O?(e?0V3Ln&go)w$TnMJdttzBIQYu~%W4 zrQh^8gHX`DwyNdvj^L3%dd5|OsOStHKr3J)Xlx|yHt6Olv-ouRp#7nCBJIx3t5&Z{r(T4|fW1%qv{-VbRRtmurc^7r(F5jiUWaoO0h{m>R3785@_9 z)W^AP;rD491hf=X$E+i%h#_9Q=ogc^lgsRp0cGKEb!fGJ^_k#}Hl2SNZSzlf53uVo z$rb->Oe2ja?{sOVOpOg!>qxuIl`OY(72}c&3==R?I3`(jX42W@ti<3IxlVHz&&z`{$)WQ_ChF~w%de`krdB+ zY@%JI9(v&=xZ}X@ZE?`fm7**GP^W}0H|HFzge7CWT5k77L$^~q3<@N=8bwFQ4iK0p zHF5RRaPxapO zXIbaCcYb96`gd-puuf{4&y;*o&h_DUyuROduc70Cy#CWeY?(!+jCJ1gs3|O!xG>-F zX>eQeid?e9K0^FpmHQiV>U<{*&A#E}EUmM9*VE7ZlX*YkO}dL-z5sM}^lDWU^Awo_v!bW>3ohGHKGd2Eo2RrZC^`bVA>)d@ll{_k}

    6xg%rOH5PO|7)D- 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

    SnWcb>pP+OTB%Q3@LZ#H zvol#>qnN<60rhobERGP(O?w6=9KIVH70|hS_U%jqV&1k)9Zc>uz|bTPPs7g%vbEXWJL+6{F4JL}6JP|~}! zH|2FtDXgKKRRi40f0w#cM>DG<`u+kfEluCEv0(l2F&LbVw!UNJ54DIua9G3cB zrI9J=e21E2VWA$0c+tRNR}=~p#m9^^N{g-PQw_&_Uq>Rj!j8Y2)wIq`V$37jfDEh= zrFlr?>gONC&IcWxw1Dyq+dOJ`7B}v4ZB6i(by<~hl6YN+vac`6EP4KsATu-eiVPOP z!S8V8#wd^0mHzAm!b$!SbZaWk`M~iQ|HIQa0N2`kU)Q#6+qP}ny0vY)x8|*F^VYq! zZQFML=l#um-%LBxlR3?kC)r8XUV9}QIBWZ;fJPS{;HAZksvA4I+!Z_S&}uFx+% zF{r0nwXwP20EF|}fdU2}!}15XNbOUv5O9pZmZsoJ-7wW_U*2;E^3#9XHsVN8msSS> zwnLUVYO=Ld*%l2HRIP^*bOHi*vcv${VyHtv4q+?}^rMOmXPClM30|rv ze4y7Jf4K5E8Hrpk;B-P2EB zS!BE9HRUI+y%7pN#`gZ($I$$DmU+6StG3ZoWYn&Fn%G2oB%WFsSfuIQarV~~)c}YA zPx4-F&2{Qq_#HeAU~iP09`5NqNeXcm$W|Z_76>u_ipr@=^TS$MNqOD7)Ja^pmqVsf z1;e^03jp$ZD1&-nWVZp_gJtY&Mi`XsTnu(h)DIFm_z2Ak|H%*(1`B^S6z+c54|?0* zIRhd7qIG+j={9W1o-7{%2s`vFR?P8YKT{}e!ypY}D0w!)Ua&CRHpvkogACP!KRU(l z8H#{)FuTTSKuQ8Ox0-i)uJaqtc%CUBO2{VBP`PEaJ?C!3r-Yv%ng#Sv-Q_-C0pm2U z>>g|*rDdhQd;;z4OIw)EN8YRo7cxX)ASono3je486wle> z^xk$+!l?1!FBb{d&=-gob^si{-4?AC|FPvHfmSj>whloVwE@QYbBZ{PSd2Idmglm3}+|7KhElZ0SV3QS6HTQ{_C15i*u3skv>>mS~hkle@s z2ZglGaBfs{t$k(v$s?9XHq<-=ZwvRP6jZcwc_n46#it4d4?An2QB6{*5uEHx*A}Sz z?$>t@fuyDMxnOrNnFb%LG~~;lHa(S}22?V??27@_O9WfL(6H@LY~K^geo8Hsx~aPYX06fd*3;I47!->IBiaC zeI@a-`(v0QUQ9fII%DZ4+Mvd{fK5irk6SvnzvS!dUpMP*2V;)8mT;fUiCRDo>xr?B zNo@aRkDU?blboPk7(piZ6WA_fK|ad0C1T$^x*+U%ryoP4>D~%1`_h$mo%LYye}maIUNpG0hyMd|5&ju z)7~r(}z0i0uT}HN+!l{+r({*PYE({_U9IklY6E?^8e}#Ty zt&KIIOo|%Ee7pV=f2IJ`!;8Eq!CtS_t5eAidT0XHO^+?u$!Cy?Jf1pv{|YWXBH%6p z9^!wrW$`=mIB3_TLakzCK>;k1fC#R%PORi^{S^V%a3J#NTaGxb{6Qs|RBalMG`2%1 zcu4J2K^{W4XTZ-5a|-a{hG`oGgU5P#u3!W2$|9H6xtjNJivb)^oL9CNnTBSrUB&OU z&C^8;glDH~Q;sta%Oc#z1Nm(@FEv`onS&F%J);g%D^yrec2=v}Z}|&|Ry;n`D+-+AI{P?K#8O(?|^W?@FAJr!#}_x&1bL6wTg{c#5;hxen_8%Qt43J z=1E1#H3BUk`wE>5Jxjog1iAjgr63ay3-tLQzjNqq&2k#>G?VL2)9=5$s4xZc1)jVy zY2*cmGga%JZyjxCQBUY(IctZ!dj`e}55s2oyVX&LC7&@WFl|~JUZ*#Ow%STi;ST9fG9V(Z zdt_*39R)TdO<_A*)p{rS;tP;zkPsN6UbtBC#9Dx&j>`03{(VM@_W=iNE|rM6Q;#rSSb*~D$mU3U&D8`+Wa<)CR1AGPuQ`PhF=#sKT!yt!_L2Ie@9F;#C zmA`lYVBJ#rmNm@^z%=ecB4>=L+ul3 zvDI=f{*NT>yRRAfW4po%4wf_|7i3BfNGN|P?#2^T*Jc?9vHt*o^spvNUvN{K+MBX; z;SMT*Inbfh2#9|m3p{2|2507q2qR~~&frHqft|PQR7PCg zejw+^J5CSPD`p5ZkEVlmx{pZ(Y6YpmJlZ|-8Bn&(yD#<^a{pScv%lLy&NTgMUPu>; z!Zccl$O$KG_|0X?EUpuoaM6t9D~iGyZ7MVX8QbQT(Aq$`#?GVtE3qFW_P8WBV$Cy_ zLJnAZ6U};$T%3SJ63_VF3fxI|XTCOj6Nb4y5^f^ENyPC#`dB8pH1U2be*Kf@%uf(} zc#?~auE*~CcBVD?C58d7lGa!vSm%bjmWGm(P&0LR`XwPG$ATGJZ8o^}@3Bn|cXy;N zI)x#iEk=oO!kP$}pUs%n{mvSV+jQD9%`Wk&py*DVxyu-pZ1}EOP5z=8c$>P(02pJ@ z8rjMcB!_Oq5Wf3vA{xvm-G>1@K-es_wA4}Q8+o-K4_|~&9fSs}^exgf#{xlPm=3P7 zA$x0=7TFW}lYPf=>4)IIT-%j8!#n!$CBbU$oKuw=hD5ewCnHlM42_W(oU3tf;34te zu-FC0?=!~l0FU{ee!*5#P?bQT#8w0B1lVOAymdu25uW_tm-}?HHj|TEAe8iemMU+F z0%q5`8?0%HD#1S1!z;7hmQp0tq0=Yz@%%*9g9XXu9b3+JckH|;>fIP1?(6I_ zXk|f`uz<0>!r=cdTnnk50diWtODA?JsuKHVv$vBnrT%!5Mq+;@Hd(>qZu9h{5$m=!mkeXj)oCvA8kwUS5^N6oRvdAOa zBY~i(Z9aarXQ{!bGDm_Gz^rnApq9gdrGP@W?{ww+l&Nz2T7RgH>na06A3f`k{p?|* zpn1?K=)tvkX^|BHp~$6cLhwos+_gVtx|$T6luY`HuZ(tarC($Zedm>6>1VQRl8Qth z;QD^6dZFaqkqc+8r8cNi;rWKst)` ztc#sFg6Q-EL|Z8mjf6G1WR`8>G(*6V+Do9ErXb-=$J|QkG^{<}VuS#=p|>Ui2`S+DEF95<5+ zMa7;S=zco-IV#~cz|S9j{E2OMuv}bLYtw_yOR3o+zDNnEZx}ospBpMKcmgQoZQAEl;v^XMdR8& z@3?=XdMhZ5`_dHV2->2-5A2U|^Rs;(ZkbtMzG$zA*-p!e26_ABvsjht0zhsTNQ|kC zS_@D7dO^WzC-fRJQiqsK%5w1TQiZbF^7os+Ea)S}dX)4N%d+dAPFxTBsEKgzQo};u z`O7NLaXPeVK{K7kk?K~`KF<|cI-kX`2F9Wje(vs|9s3*rymaS5a7%9N&(z2`n#n4F zdgzWE8Q&wL4N1@z*8X4qjS9Twl)Oi{Qa46|Q1#Ozt*G{UMUB|d~tR!Xf524)+ z=M+dVBLJbJ^q|XGew{Cq;{;+0@n4>2$SWO^iDmR-FazDC-4t@}7ulkoErMzo$t?Z( zzDS9Y2l!vg?vT+w7d{(nFNNXYH-a7bzmAGLK+0(&I1jMNQ3-VaJ||C}!c=8ef<+YO z9HUVvu>eeUQ-gCB*j3xVuXJcf6d*3+Vm+|P^qi3UNpDfKKyGy#KD!N%K!T^D20&D1 z!ef%lz8LNIh5^+#Xfn~joWbQs>8`to;aY(3(=otvvE3bj$z)j{%W0s$8|MHTx3Ify z-yt>$|GDY^iqZsC@7f;deJbzCUV=SVQ<;k@$vop=1xI?l6x9XhXIg!SYY$L;3wuSG zzps2MQHFS(gTaEd4zhB&RQz#LNN6D83D??>I}qs zQ=TAOWTH=H1|S$4Kp5ef2gLF{MlE#V?%FxnlnD9+eFN49}(mL)P=!|Gf7- z1ZFq=eT~H>>$gDg6CxC*gAo+%8r{T#ig5lRH}CINbrr~>BV_T@0{imk$~%EexUm~9 z`Pa)(7ks}`{d#^a+2(g=DsR1mYkz;0@nm$aUt2$>@uJ=3c}+VaOOOgRQHg0fNv)s@ z*bGx<9r+$>oTeaCeKrXFBKoEpyHK^eU`i@Mc?$(TAq8fYjb5Gak|30;24L>Ls(LVF zIw}!zTEAD$U2(@Soj+&s6m^`OUB8{)lCYqM2$K^N{RxCTPks-2jtoWJ04#Lohg|iX zsMOu86AceR1xl|*y3Bx_lYnSa(!1X@3b_&jOs7iwWNHwSu^5MBReyeQ0U0^O8FK!w zkSUw%FMMtb5CAF}I1a((gDTWP(BD7!-ERWR82f8s9)U=rDT&UU6m`>PIG*`;h`abotS#(p47_=pTMNP)voj%vTZ}d6k zwf>94LE-YC#bCKlIL+G_-Qd$XxYBr5b`o?>0vKMsDH08HJ_5*dorjSZVmVNcq2^fl z#iA|2L)+cIE6twt3&G~WhwJaFymUjT4f)&lf2V{K)P@GN@9xlUZ_W!s0x~7p_5E*s z{cw0Klebr{tMbC%oe?27*E>#OC}TsF_f; z1;yW*Lu~tyAjm5!5~U@Y0(k|1raEZh?KS`wim$9{7^amI-aKxU2SWo@Vdw**XxDnv zC|NZqxuU&P)Gz8PY11U%OU}8d3L`wt%i)*WnYAE|Y%VuH8Q)KPu&Wzis6yd>mbI2Z7wiS1CB3qzC1&oVX`G)RbA9E?5DVo0Y5&x1)FR<>r#5x&E9k{P|N49$17 zdB5zr?|s>rVDEix4*tqH#@Z6WO)LRm0lEA~sHP*29t1usJucPMU8R%-9C>!B^!%zD zN*iYy;epZRW%4s#Pg}nz0In>Son4C1t2HCaDcO@b<7H!-+M#TM+UVMMU0PZ6LIfPN z+BIhuTcMvs+NJwf$;9mn9CY*eX)lK2SwdM!!VCNx$FvlVm1+j882PUEBrhMpfn37t zqf0(S)jd`91a*{+z(DzcGDmcCFf$xG!3BJGRc4bKRZ_@k+Bvpmow~?ji(EnvprRG} ztVv!P1rep;3?F+s0r2DNnzBS%^V_B0e_dW@E?X;%e(p2W>JQbkIa3pa#mVwB{5R2E zTPQaUW{oY?QT$tD#A5=pu(_Q5)q{B#n%hmMP3YJxr}3PYsvH<04*Sj zpXD0VRZ&3B+vj(W#pamsTt?hRxXCIP0|`L4(ywd>J-14@n}IUwLSyqGd*14ayE~c5 zjGTMfaVuJm1vEF0B11El$seFM#YLZyMGHs6&2W03ushtf@oKVH+iIjd_ve+L_0|DK zni$uWGQo^a@hR_LgxG!EYbkoGb%2z;8p#VepwKB*AhDb0SWWIR^hRay0$Fv>=ych z7e09J>04Es_B;-vSMOv~*t|NK0ZgpA--KGmBCv6|D>_gHPQLmBR>ZzR8&~U0+;|`M zNWEqtaG_3RY!?F&%icd#TY%ZH{q4ps{bvhy`=y>os23@Ty%Kmy7T7vZ>(nWYO`N|# z@x3q^a4KM%Ge_yyyyRQ(k^qNa(pF?Oz^TIke%`b$5d2EynMQl|9g>-GRVg*{iqZBT zzDA?dd<}`XxK7%2$dY@JdMz;+P}NqPLo_%(-8paNvJ-@2!uba`@VNhOVBPGiD0!mz z!ga#d1^VGmr7hRz27z+u6MPhUlY0X@9Qx}BjG8_L^>0iGD13krR3-@BBmh14VpMxC$h)6W+Mg$zQ;;6m=pd8 zStIw|v#H{wZJ#k~DQJ&0g4!Eg;chMmS0$TasGa2O-R)qaBoQqNGUe$-Dc~3(yA#o`>vWu)e{h& z(dU6mZY(7eWRoG=d+$$N$kGbmUKkJ05N8?LBK#!WlKeW|Ll|-d3*4t4i2O832u5(d zp$xo?bbTXJB8Ki9P~QKWLS#9ADhq9Rn6siGrN86;^bJr_P&0W#{Zx2WlK{@XtAo&y z^3?t!6XwuT_6>EA)7d9b)4(&#u+b3HwFIHYc%)5u!aTavEcGGJp*5_QVUXut7?+if z>f-Lpu^fL#GCYcAbKKd@9Lq_A;~2F7c6Vsu+lBz}_%D|My~FTuEL|#z$JLaPj*SHH z?SNA?xs+l7DFI3R{ns#te6b>M_F3owiLmG1XI_-wWTQ z?q{~py(6CR#f!o_f7@vKw>;r+xa5Ql#z{jOrG+}VW83Qs;&*p$z-Bl)s~N>}t7Mpb z3JUo-qaA*9Iqy=V%udp;pUYg>c5`vJlPY^fLw7+WM9-Pw#wGOA-py5R?XK3jqfToH(Zxv&qwRt9gsx zw_%aOLqG?={;GfcRO$Qt>AJ`%#m(ZVzUgYSsabCUoPVgYS*cY`SlhN!)SP+J3&XJu z`YUXvPdP^mOLe2_V#L01ZP&boGkFP-kvCZ0Ti%TV;oUac*;T8Fp>)b@XEOOYXdhEO ztY#DphvZ(_DebN1)ATs8+Mict=8OADGWX;;+y#+r6qr(1!5*Mr&?v4}153?b1QVMI ze2EZ^@z?;Ldf$bvlPPI_2Pq<0r&QDH-3mcl3oQN}ngv_nL0Y(@_S?g+&_irKk_vvk zOJJ_pZY7wOX$~Ut2cKE2)C088ZR19d5hOjNaGRi%&@Eog>Zw%?Ly+N7D~xq{Lz)Gz zz(ZEdu!`*FUCfYBT2}0gvF8G{hfaXKWm^G|*!a<2sQEfDfbIMWMtyP#M%`fry2oHI z_Ni6(22bQBE%H9QvxSr2E#iNF&o@4oF1A$0Vs9G~YGRmqa}w$Fg7aS3y#Y>FIujZ=XuNvrOxu(F*n*N3#7Cse+jKMVtM1>+l}X5py%*DktH!_6+4n{X7n! zjYMHewLs(gMGYpyk#CkwTlsWCnV$k=w$9iocWl5i)GOKyuvBQ33PH}fX2iNyV6@@= z!dht25?kRU7SApCq2jSiWc67rjvmSn==H`dYrI~XslR`5>g)Y3su>~+hUO%q4TfIY z7QVQ$TM~nK)ix>r2e=-v`To-%J7MX_V}8B2z*jB@YbzL42860iczR=UMMOK$l>S#V z?3N)iq;7+G4wQx)#5J$#m!-i?g(XPGUaiDn0~R(5;Eat zKGlw=eM>L$hD62i43L)s+IeJ+Jh=szc4OVSx$qe3!C!b%9x?OitgmO`*l}IGR2f%t zEi9p_vC~r+Mwb%jSOa_F9(+$ch=J|6oxMy*zvM7wm@-$nx2mEo)GiN=6aO?0GLA1J z48m1F7U(SG;5iXL4wBQE*-E0{BKHPGSUsHPM3Pa4Q@zQ%q}u^Sd{6^;((UqfwQ5fb z?XMBtuBLi0reN)Vfpm*Z1rUMx8A)?^uVMf7zIKuZ_iH^Jk)y&NJl~F3$`_|r9+bX{ zKf7a@cl#l&M2$*dO`ZLvHzq?cOm6eZD$lVF?oOHgoLx-{PgAwk*gKcg^Jm#+{Vbu* z97>asCxHjC-gs!5zCeBt!n%p$4>nA_Y^!(tv0A`IjXl{AXMhfK_>JBl3VA{0G-90? zQnQ-sv1s(ywEo~j{zvMLC-7~D)5^q|JXlvzPjG2=rMzyu#SFQ=uGWXmA<{3Vd7dT;XfL|) zhzim&gBnvwx*;(qK=}Bdof_zb*2GnNGB79Fy-pZuCMXy!r~)d`$O298gl4*J2%Eu` zI{<@+ZJTGxQ3c{|=(R%Xz3=MqpKZ0dS>~SG>1(s@RG1amhB~t;xub@k8_>btrfW*T zfYuH-0-0ASxw1ih(rF|B6)g7t)zr1@V|Gu>acYLN6E-V=IyQsgUA{z={I9m6|7x=W z)D|y+!54j-@ABVw3L~H=$KW)+#TVwZ6jHQvmr~6k>eidx>q^|rGlkdVd(xKyCDuMV z^BKQokC{5`7$17TF`rLRY+5j>CfWy_i_Nq#T|Y+TM^7r2MFqL3U~e@e4PM%nGO(*v z^BrSYyZg9#gzYqPNHdzSm4v{MD+BXw+e-p>tqMSb8;6-Dt?5$0xm2N^J&(WYS#};} zSG@u6{}EnEmD%~r#h8%f0b|#pj%)2W$Hz8%e9s&hn)*UdZhjDXG7`ehdJ}bck&!FH z-s+t59vO=^grm!YDwl9ARHB{_;&8BpDhMA}Du`4I0+fXrJH@Qi*{1ZMc`L!Cq~`+J zZGFVpa@@|R^_eWElnF@~CCaB&{0pqK5ZJ~fW+IiqV^26A-q!Jew>1pBIfR7+P7Ggz zT*HSzlVw8+sY~*o5^`mfm>Msa6^RN%aB3frdzrPF43&HS2{pF+uHLnSJXMndV@+d1^Rnx#ggk^7AN>Zz`_9iXG`_%vjNVhZD6xY2_I4$iroij z9Nq2_Y*!(*^xsb56uTx>GrWlIV8^ghd@ADx1aTMgRTFFb90PiY(i6hFG`Z@{?jIEW zr|E58dthi>g+T~%s%FlOVvEkTV{)tJAU1lQ%0Azve7l97a)?Xm^1@*IM7e01eq^~$ zV4UU$bB&JVBOo{QHf!0nTo_YC@I9s{@;CyR{TtdO0-EmBOT*^azF1Qs>m72!{&W^j zjKrh+D7qy^S3td=IKT;fa7)*xq7|Q@#?rP zklC{#!nWt~r6$0bF&oj6j$Azi5qazZW-;li#7$+R#o67{>>^%}pW!yxs<@yK9H|0E zF={l^TP-*F0wluffZlk^tYL|b#IIeqvZ;+z@72skQU}=cp|g|nqK(FJ`@%O8MlZG! ztp-XTLTOg(1_ouLX?vh=3imA5&p&#pSqPa%W z&^&AbVLH2@Wq9-mqMR^NHS>Z+4z5|r#2Z;KSv5(7cJj>@u*@F?H5CaP1{JYfJMHR` zUc|6&7!!2gV_qeOkKHq-wbt9D-oK0wq*;wAAy1A%bj90vgFssEjWCDw-D5RBFh8VX z+cY;hYTy$3@49knh-VI)*tsjFhx@(;sgjtcYio5LB*}}`4M{uB(!32I5fjY(nc z#3Dfrj-fd|N-8QpBQG>X;$ zrL2n_S9VBHz!JwP8Gh!6zCv@23tQ%Wv(Hy&l@X?ahayr5_Y62|3kjQRo%KT<-$6`B zYAW2Dp5t*-Y?Dtd@P_qsejr2N}r-|q{NLY+Slb`c$J&KH$R z_{GJ1lveX}<8PH%I-G^3WsZ|SYD!6ib`x!s03d+uux{R0cL@u%vHnOfAwbwMI4+cf zpouQP`f24P4J8@S>P~>*%#Q(5Y~xp_90xsXlq5lZs?60q;H3~31FIip+?OpfVI%`+KV(!3%pq~tj=!nA$`lR-4879vR zB$6%xNj0{8B+kQa8ZxnBD^8Z*+bQQ93A1y%G4R&PD_cLThaT=Te|C6;4(YVn1O%)z z0H7)ccU9ppc_inJ&I?ID+7vC@Pcv)ua8SuC&=)thi1Dh0ID{w+C72;K zyL)dF#ta#{u?~%NttPT}>AB(4ng*T{@euE{#Je`1@06>S1#!i1!=emHjoUA06o}15 zo~rbO_}(^;bb&|xouE?wkJKkfnn?&|#qXz`r$O#SCQa82*gkN4dqbvlaQFur=IWw_ zkVlp(6jxt6)?<}+=3Cgj-2-r)1)9o$;3%w#PX=y4SoIz-ijw<2@EUnA_CKIu;BG{p zkOSWa1L8}!uwE7R@vsE|qIcHs*y3n{4?S>YeHcIkDI-pC3B0B>e3w)oKz8nz>y0#d zp_=H-Fb56+)xd@@6V}Gj$2xqRuq6$}H2Q?&Al$fg_BTNETp=BoZp}PfWndV?A!@f% z#jo=)?GpZQ{5TCCS$oEc5`qshkk^bu~YU`;$Y1s0qAS5 zbtF!3+ZvM1_s@Nk-FO%99KVdt!3d`v@u_-1X9tSQ$t zQMC!du&jFdbWj$SY+N$6RnvzJJ7+{S>5h$ogcO~}vlw9v)M(f#qGu=ae~hsapUNV$ zNVoJbl*-|p9lLojg+v7P739hl2%78642&8T!G4KAsL}S;HLUWmnvqX9L}HIjHh24t z-g9B6T{K!M#WDaN%;c~7je^VySUOa;RY^ULEf+@h%05}JkpXEKLTDxL(SCLVfQU)* znRD77wm_%APCUBV1S1jnb?sNT&~%np>Tzwu4!9#w8t+_?qm@(;Mn{C@I+sWslsn(}E?qs7} zax1J|wu(+; zq5g>rG^$t3?mnkl9>{s%Uq%pUrxt60vt7h<4m4w31arJ3)>3G_&$W_h^cIeH*+WQ~ zfDv2P%lgt~acaL9n<_R7lz0q%jT&HVK%Rtya9pcK8+aXL1RHpdFr;!78AI$%Y^VAs zkXsc(OHL7dW;9z8;lCq}0rz%?p2JQiN3^yCHT##y_z;*f1!}g}njhiYqwwO+0oFV$ znxZA#9Qa5?-Jvp>MZCTcSIIYpXfY5f#R(sjb2}0Sl7isP-wtI z7jf0reOG88=dY_4Jr+T|A*__v#uE^9ggd{`z(E%Q(cZ8(ksT39ZdtuOk&;0HT2*xY z?7@xrD?pE)mzXgu1twf*k*wFC02kcA1LtxUMJjZmGYVtK z??Bh=MdSik(2~koK(3*hPJT-Eote$5GyMdrY;G1*H#-L3T{2X+#ND*%=;3uVtuUOv zwC>(ASHO%lw%mb~i8G>uGaBTvUiE4dVl!Ugz7K;Ztm*nbE;+H}idOHO-bkOHR}XgY+yD;v<81@k5$&M?SJ*7E%ft)tkKNwkpR zs36V-6&0B#fdYC?mpKu}3wxZz%=pp%+uXo~)`e}V^=TjrJYdBx>ISEGP&oK|&bS4s z?V}_`yt96vx0!db#)m{p+HAH;8_OZZKxq&{ln2FnoI%?Vd{z}IR_$w47{PY6?whP= z=$ehi8o}Tag())^Y{eBuBqRc}2m;Xy7HNYD7F0_Eu2&7r?Sxp}m|z*UIz^0`kVG2+ z+e5A<`maLE3urlrZ=SibRS0(=TjLcCy~}l*7&y#6G!7vc%{vtD70P$vqp`)lQcI3s zyHe)THbC*>SGputrB)xNuj|zCtBStSHR`|i9x0}XoC1cyBPFHc27kt8ne#ZW0>WSSQ?QZ= z=ekdaOKbg8sFIX$m3^ zStga<*C<9Atf>&VbG`%ByGnu5VixELx2onqAg%(4y0 zs|OcZe)ZN1sb34LFP!jn>|zULE)-s}L-N0k%lagW6^S{bj|IE^kF~c@DW_?K+Lu7k zz-zri(7^V{YA*BZF+2h4E8D&gF~zOQkGwSj>MAtn9Y>d{;&u(wF%m&PoY5=?$Wh_L zh38lEk=)s5;y_n8lh>E8Vx>8c;7g80*xdN36h~Y*)cH^ zvTXz0O2aRo0>Z%8m+>|MiZpOGn7mS9Q*ILyM3jS6GXZ(gV|JLD>ky0_t&zGdXih1; zVNI8i`yCYfH-SoZUb)Ip>}g}`rrE@Lw>^x(Mc1AmNYOe(&7rm985SJEkQ!KPQQa3X zXdiW2LOSsA0u{kAFzBYm%zQo{7F06-(kk@`6l@SLjZ)ehpnA-73@@-c9+jSCa8UzPLK7&rhExY|uL>$ftQe@l&y;hE(j^6FVq zp!-ixU0Y}$q>T(3m`ggkcFZ_JHk{ts1tJ(OOl}c}hc!hT1PVodX=|qH;^*b`? zc|$7dGz<|#$;lxwC{EgfWgYh@BLs7yEs|f!W?pS#t}bNo{=#!R8mC*4r@1H%BhN-b zTxZ5NMB>WK2ZeUI1lT3?NaCCTQwg9ESfYG?m(n5fwj+Cr+NM_Fx`YWuQ4>q8S+=CV^HJ=EsP&YyDSFZmmKN zH6Ld^uQH1_f0Ckh0dy2VO@3al>@Fx`TnJh$Nlopj+o+I515%v@S570)lwp$V@imX| z32Le3P}{DwL-Z*)qDE3Xnz?ALN6f@K zf6A4~cHB1E{6|T!N0Hn4o3&uaQoQ%pyuj&hH!d>2_H_DVRatoey9(^&2n5r%pq?k@ zCK@2QbBS?{(*bQ;$fvn)?GL}WHOqEf9tEOL+CY610ayZ}SfaZ=kbL|^(6~4=tA`PA>i*L!Q_Kuq#F30dky_r@cj*ZeuKG$00p4s{knczSdjoN zy(qcO!$R0u}mEcsghE~3h)9_^D( zE7+qp1D%)xCw>#~8ya8dJe_a~{!>JrITqtp^Y2-;GDK)~;_zh@HAfW&;BN4whv~*? z*i^66QauQ3I)^ssB&Fmp7W+Z7I7xP8!qP>Ka(O;IV^!kvKL+gTIucA>IDBU1Y1l0PcaAD~xgPGH5bexgsg3}f}x{Z!GoF{VT@6AV;9QwIWs@qSe_E=h8ZONyqN9396 zmUbi6)KVI`!uxE`1L`q};~+3GNHv&eCjyR%BdzoUuQ4!S1K!&ZFqQ?BF7}DvO_lk1 z+9AIgI-qLc2I5e)#UhRDjRVh9p47cXE?R|^n|Lg2l_Yv9Vr&#VyEpk`x~f*HFAm74 zshNvWQ`FM2U``U3AwmZb6XuRTi{Dh3VNo5_(M3&2SaP_K;Gn|(_p#=^#R%GF#`QJuu5-kd9T(b3ygMjG%L19i@CCDTjqe7mk&G}TmoNv8Ys4g;LJJe&p4XeDlF5aIA(wKI_61Yj$=3(#w%PVqB}kc@ zxWxmcOin?KFUFX4C$+e~CB_q7(8@>CG*hA>VA$0XN(fQ$O(LyCKmvS#_GXLgt2Ui& zMM|B#-*<;6M6q$=((ZX6F377CzR3Uv$w~&si!+6=#_3;V7c!rWFEZbjGy^8M2knEi z2@G3po1&<~j$L=(#BTHz-M>-K!1l|>azx@PznJ;-Hl48iLJ1krbUZDuO7bPEn4*+U zY#*yRh76mPVA|uX{vlzo)rp6`Sz0-adF;VNEeGlQ9Ld+;ZaWJ)6bFvNJ*k}b=^itH zoaK^clMi|3q5jnwYFI~Xo6=}aVWnB~8zOFioJZyYN`o!L{jQwYfMi!q(Nj@3PB`Bg z;JBZIDeQ)N{KsJgpSH6?8jRm%8ywt2bd@)s}Ym?z>}Nym)mg~d!L`u)48h3j>mif08A-{ zX76JE$+zD!?JFX|)W#I}z(@`5zHLVg)5gsyknA~?>C;Gxr3uOfT0f}WZ;jdFBg!2} zZyxckD*`~M0rJwB9`0SI&9PqaUH#Tr4Z=cwlgz*%^dNxueUX*rR`dfc0I-LTVm@KGh;u9zicPbPris7 z=K03Jqq0F!v=cKhYfrZFyM+rUJqE2=z)XS z-4wpR{6tFE89+fQfFWaz^8|zjZ8+d2-_Z#!IPd?iE zeg6mTxO8vEzLPXBM>&@6-P2Jga}S|`bosw5(DsL}VdSCaB1-L*R=FyzDZ`c}w6uOx z$mue&K?C-FE<=4aiL`g1s=44WAKoSy&{0Nirb3xm6-fW#U{Uk&?st#atdT?iK&K+<&3Dk&u*;Q~=R6UC9r0 zjFlm(%t5YphMR@thdK~~0x{+<4;Gop>Bc2?a>;#ST&j~&x+T3Z9O$}(bBmr))v^q7 z{;NVKi`6|m09DNgp>IC_Msykn!xm+Tj(dsAVHk=UneP}_I=$IE7)504nz2>R{8NTb zp-trH!vc*W9+u4(V^qTSdZMXfAqNFOx+Q*|ocsCZq=zh-9I?=QBKkgUN>rRJN!XNw zVPi=;=_NkuQ<71-7RpF^w@L#Mcq;}LgZD=Eg|;l_mRoT60v8+GM2O?DhIcud7jrS_ z79(|L{p!E|?IhHtww-}LA%wLuXwTKrOm@Gd8*cjc-hYik!Q?nx2pLixv^`gxGqEFq z9_h032~fd08vORgOUZ&wU`zpjt=T6y4QT|jjL05wc{y$PDN{O(sCbQ_MSH_5n1B&K zJ{?<7tCN`Cd{5Xr6{6|@nD}QsSIFBMgLFTuf8_2MUG6_2H%sFqbugbJ?8LBPs1$3N z;Vns0XY}vX`9Z+={35Yt(%uI?F+ug_BpD~if0;_jiGukL;5j8u^1&=;FM3w?Q!@7J z8o_*jIj?eaTJS4@Rk4DS5tdm3JOV(pAlzIHIW`R7LP&@k+(-aih`QJ}@R0!^4nfv} zsd*aPjNQopJc@;BRLR-@ISkd^&1+pwT;N~OT;PcwA%E2`2Mz`sjrc)g3aVqUTee=BVd=lylCKhqZVKzt_h`kg9A85vF`>28L?Sv|J+*4o}ztO&((@70ucV=bv?=-M^KALl2Q{}*?sTxK; zrHxBYQdagYZFr(Z-}~KegSzwr{(NMirfRpPx$F^Lr5c+ z=rJ{Vv@K7m5eBo+&Ps&{gUadF03ppgA`GkHj$?;v0s;MA=Cs4xXDR%}u=A2vPI2j% z=dm3OufH8BVDCYL&a7Nz6|ZPA7xDMcHPKrw0N&fCZaFw<5C@-xo0(AA#o~7_TRLFZ z^26;*B$WHEBKVK2a5~1}-0s0YEGztY(T?Iwd=iXBqP5Vo3F&l1oE$FDAE~N!vb`C3VEcr4zk*fE@fCVv@zJd239aA zNM++;+ThU~Sb_SfJwuGC9|G#1UZ~R}Vo-gaV8lH=v;6T4@m5K(Hwzxj`G%QihT#7X z0fiM(z~B||@QE68l~^ia0Lb!m@SzjxJL4s;Gw-gR_4$H_bE`7ZGVbPu0vBoBLQFCp zCA*BGr58b2<7{fzoZ4IlS;_iw_Wa-uu`9AWM9|K#Mxclv9!p5ZekYcXcI7s zF(7Nm#q>;r-EWDT*6MP_&q9%#R=H=nkE$6_fdY>cq^}FApB(8oTelb^4EDatWbIP- z(q!#tP3k`t%Y!ikUBt>bLV(NXVU~_f^fPK`>Fk{(>F=8_19S10Jv#abm zF?`y0@IPK&hvkEcQo+lD2`NWg`V>ITZeC__?X#bh`XwW-v`$MU9t4w+zrLAh2a;Am z6>)7S!-B6JG8Ir~cwo1$aJY$@sJxJ>CwcHj*+&&mcix!fEPi$D-=l=NZHXE?d)aJ} z!ar5qQoAX7vAFFV$DWlf@^5EnjsXsfzxdUDpqeS36Xdi~09&3lU{axRKcRp=poFBZ zu=9t}3IpitqfV_GcNF|+uaN=$SX4!BUA^0`b=CY`SylcLT^+aBa~17wy?KL@+2XhX zVJ9UnpTgg*i(8aeomQ1|w{C!cJ<^?3zp4S$(9TUP*LD_0Er&BAthnCq^R-sF=dtVL7! ztz4zlTU{6D!FR7OSD9-O3uU+w)okQn+8!c~W?PB%Y`MfhQiKt3AQP*VIbqeUH(E@qs z2tq?@3iV(r03q(X46$Gr+(-ip${xZ<4EvSvlmN5620>biDG`SDlXApNhi5FyIx4%~ zLnF*xUl+di3fnKXja%J}K>>qbsflw_!6~ua2c@*|c;l_QXE=dqyA@;ye z21`X2I82RAxAT$Pu$j|mJP}YYVcS=3#d@=dNt$!uGG>loHzz!q*F$P^;X(li4V~1` zg2cnm07|^FOy-HoUw%UqG>$8AHSTVr2W~%B>XN10IMV1T9+Z~$ zx^f-kktsGy@b)aTP9jVxDkdkLaBDR4Y})?%_{G%)Uc-yU9M`_N-4LK!{tXh#A-b4K z^nVKwFanDOh?`ot=uazE%h^;NeoQ;2%7aWRy`maW7E%Mp@up zlV7iBh87fI$fQ%;5y&C=B}F(`NIdKBVf;=>6!UP0D81_TmjLYpVNH5xKymMP>zOLm zmCZQCi_MlDJxFtvFteaZ1g=5&wVdg{oNbv!Uw`_a5cJ`2iGVi|`Ktlfc-oxM*BwRI zQ;4jas$V=UI!%Ld99Et|K`v_zb>p4AYv-+zT!2KPUpM9&QkFyZDbG^YR>SpiUb?L< zX5K0yW^Et=TsA?yazFP_hRaQMZw<@e=c)~wQCTMDgdGsf%py1`NmjHW4d8#kZyZZ%1&ukK*k@&2BH zHVqH65(e&4UjhC@KyVkl7zUl6nS@@=ZLC{zLShtkN`uTxwdlvDs~Fj$mhj>0-;ivNN+FG=zZnB{Ff57DTY7#_|6j&j!C{|o<*P?hR}8` zId2w_k8>)j!fe8wpuTQup325XOVz1NTfE!kPD~3OF0D!T3=Fk62?~AIlq`={8@+JX zigE=aA-fPmN8^AU2DQ&=895`wH>|O?6_JU?+6ld>pzxERYe@mXzJ~a@mnD}71s@XL zZ(Hbt{+!L1bO(g`nKNu!n|P%!cWByHxFjW6^t_0b*|zv3{L&{AT8;;*M*qGzw(JKb5B>>7xA z2>PCBF8JOVu-+VFOhX%I{CA_3;-ha33D&97+$-`Y*B{JJ-)s*F61g>(fx7ZhNwZ#l zxRBRLDS5A(Sld706EZvg^ZVxiZq62k&{D{39b2Cu&Tc42do*{0>W7WjzI9Yyi=5oh zj()~~po@l=sXt|{H{idc^OxF~&;PtrpKRH8IkQhcUY0~^Ne+4Q;F7!Yo?b*tYoh-yt~~2>TE!wlKP6C>PY?@->VYypvOu7z^fHn&eO-b z|9Ol4=3ZBU{wEyUXai-9q>VH#QSgbaKAqvWwk)cE;#;3Q*q*V)tOypL1|zm&zq_&a zFb*5+4=p>~-Ii0~n5UW)^oDa*zX$@iP$T`DXpK>O0VWXm=d!I!{x%GM(zO92dS9O0 zac5(=7?EQ{OVjmd;!mygV6&_s1-oT|bPLv)GY!9Dz6SP4xXznt;SnDaN;62%KmCzt z8GbdpQOj>_O5|wxvx3^|v$i!*^mu14*UCbYHSLiD@8CtgC|XJmDWVNI5P_Q2RC9Jg zF;`DeV_UJ@zn5)A#QA_6#SZBVjQ-YhD?C>tqZ=0>qHG2H#2$ z3NIqAIeq^VvojoRkNYd#w4{KQFy9*i{BnWrQ&nL_b) z1zFL<+H8z5m&FU}bc*b#C3V>beZDwxO)4vxYFz8>KJ?Jen3fIZIRT|AOhC5@uRZU2ylnrGuGW!;>S`qlJ0$1Sns5Iq)M6%-tjf4zcOgvLvvIYtS(pG~&5IAga zKfE~UGlNeu)-qY&JfUt7mJ9>|3J(U#89RC&N+oV4N;x~JYeoO-ygq0@mUUw0^)n=G z#Iti&^pG<9u}r8SUl#=)XgK2b9-P}7zw?9J&*OJxcyUfAkLxhypQ_xy!`L!u6wAYV zjl4NMwPk&T?&oO9=-;=w^2_r7-4`_$j!@_a>uuKvbRpqmO6r{q^Wa1O*e!7)lH+kO zR>c}I=;NH4^KkJTS#V3$IVN^V?U4oamv0I98t;x7V>Na2BmoCRsjRNsj$b}8!Z$r} zkpv*IkwY!)O@ctLUM7i6ehI>`ZHF-+q@$dEu{hrGbXxQ+t=xbvt@DZHB|<+I9o`Hg zyWw~_^2<5ON)VQEwJyMyVEw7f_?O8OuBJwlG~fX({io~!Q%HNqldzk#p2I*FU^axP zfrpFQo$q|fW3`pLLRNtM$(6K)f2i^Ba^LOZn|)DQW5AIG92CVzIrfh@={znsk{(4g zz1fArT4c{V>_XO`s?gn#--4yXnXiF5oMQ_arU9y_kdXr$d)Q zf1g^*yll)ysxt8+)6Rg!cPwkmy15e9%iDnN_P$f1VFCZMb7M*`VCt-wZ` zF)reQJ?uQpW3vjSl8cP$wou8a@f6{ify1`j*VH`6Oh%GXwUA2Oyhs~#W+&BZPy{_5 z{&3L4aq^_%@wWdAI&XSDl;>jsvA~Ya`-&Ty1q!ZGoTk=^IuKKNqoB&^K?JHzG?1YC z3Y#B2&sT&Jedqog_roA_Mj9U{pB0x(9fclONK&Uw=nCHWoA!#hCD!-s zcS#GImscrQ7XjWnBKVrfZZ_3v5nE%2`G;%+eC<`&9Ki?6+H_x;kfTeCcJDm_r66`? z92@J4s2{8B^~8}HX(DYn6j>qSimpKu#^|~2mpNL+)tO>)Ij{jLV-0l;`ctb5UK%Q5 zW8tFOn0XPu9G6${fy<0qTbI(?SGCuaUi%9DfBP@5z|rq^P05pTx+v?g^LiDRMA@aY zw8zU5f3g+nj{vXc5nm-pv_SL93Kw5~61D*mO|>r_@s^YC51K*g8HTVS6VC~5X46W? z8jixgD5%mv#l`}j(Mi;v%=~&XXq^_5l&8dI2o0*;ye9H@b-DgU%&FkRU0my0TUp<1 zE5{s*Wiz{I$_$QPB^ICBagUmQ85qi=#1(coifyDB z8SE4ONK9okxotAqt1gm*#7jbnPLx86bsr1sH(j~b@bD0IE!wr@1~%0x8UuFFAU-(U zUyOP&3p*mF_&}096Gi+@4|Z*7?`QTnTs@o=RG2$*?fvbX)MFAfWXeQz`k5|u(= zJwO>37|ut96x=p#Y8~HOK^yDODu|pI&+vA>C{jSJvXJ@S@Bzav7D%aP3Az^~fHHnW zBpjP=+k4o8r4$^M-Rz*iL3{pw6@1iIedR%LMC7{nikimFH83o2Q^?w;(boN;qTr>s zwm|J`w+79y4|k}~%Jlj1CQHV*m{g7MRyLJKF1&rpR+g>a*#Z}(Fb;y@6IUN`x(p_zq|iL@AltekML2K!<#b}8*9s} zo1`#*B2En%3iLNXO<)k3zwkWx?TmX%Wu(R%Jgb)5U#G}u*`zb`SbY8o-6LHe*dz~4 zBKy*Lxl3&guzYHPst$HnM)_M6C2{P=FLCJz6|7&p>jibd8HbR|9rbrQ&5N586L9Ne^kW(7y>B`ajK@XXMJnOa(| zLB~u78>}uyup~EYw|*~^&(#4l4(6Zb0jtXkc|P)6`InZ4sv)_i?LIXeG0gm&gcgvD zT97o?@pt&)7gw{6WH(=A<7PfBuz|XEVYMIbFLW4iExgR2=xhw3=lS&LX=m*36 zZFDVu-Oz1@BA7-1BL1KG7-XrE*(*~ic&0H%H~JS@5aDvQzpG~wj7P7g94~%eQ74&@ zGFQdkDtYrtOa{{4CaZUonA zaqA5sEdxaypO8tV(eAmh9qFP7kL{pybY)Hi1*b9(#?vOW1?%Bsc@9Hd$$o2!yd(YJ zl!|$p=BahDy%<>}YS3!-%c90G*$9NF=Ob(6#T5|!JKy*Z9e@G+k*1`2^)&+@{;&!I z3G!BKrHO)>?U+P%BTn4hL{qITV;l|3F`h!*g6tmBx;4h|eyDv_US&XjlL;W79R84k zlMLSCFgS*>@%cn*5OzE>*1DzgPxj1Re;x@=UyAV4u>Luqbdep-(st*xMARqL5R?c% z^;|z@YW#~L{lJK0VuOr!I{SqY1{*yY-WFo`qkD6vwkH=Z_8SGd@6@-do)WuIJ*Nq# zHE>kOURhrUnI`h)a)9yKn6!kTc^r)OW$?+G&R6feVc6P(B{gHh$y`?5T{`BpV9pjO zrF!YFPd`#)XcdNzM-a0GAW<)_1Gg7{RZT<3s`lvkI;!eBmbhej&C-OHKGaS z>@64lMc#!41EIrx_M^FTc zaO+-VtXPx}H$hjZ!b$ajL_LVfw^N^Od>n8Xr$Jc{1aTS78R?Bpq zn>vx9kW)AV{3S`&#PgYH@etIeQXqo3O*g0XpbnKpn4d+KvO8O-$3+r}(sWMFP12Yp zOYn4_CZ)%JPDp71kt2lGWx=a@*^p=tr02<1GyWAN#ne@Yo2pyLT8Q)-k<e}{x10SQ#me~NN;iuTs@mbve7 z+?x>(7Y~vu7-Dlx9LJ<~W^(Er23y4y)`nXv?ozbwQPt=Z7~X9eHyYvP4kPy%P>-rO z2D8qoE-H{{(LI{k#?NW~DXgg46d3N}c=V=aJf?|ZLZx^3d8oW5{~X^>jnP&)wH!63 zKx#tj_*p+I?kiM1b0-J;hF$?r4cU+O&(JvK3?w^%uvEyR+^z{&`U7=*61Pq7@AUM+ z{i(D{h)B)~;XAf*SS8shV@J^aU(AxqT4euuRX3{h%G^Ika=HbnG5>zA==xQ6UJ=k% zuf+N0f#&=DpDx4Yk@mXL%G_|(VWyP0l6FrKC+&;Y-e4MwR!+pv1#&U%JTRW z0Y}m5x3=_57~T|86*!t`PlcT#INfqc3nj=OU!~*;UlECI!^hDYI=MKhii`4);3bH> zhXz(c>Nc84km?{Z`Fonr=33>d?@}lm+#)lJvvyP7cc32s5RewQSGU?&*tvJi9?#pD z{Oih~REwsKmn{;9V?Z^fGuInMrS{4GYe+hZ%p#w`s!!5T~cYyLnNL{WApL zm=yIcAjwfMAA936-NwA+#44J8t`QYhDR|7cBtgCnG5wL7ig>R!=hh+vJ>7Z=Gc1zB z-3XM$Vet?l@WdPd=V*+JvjzjP2I|7y4Ks8{p6XE6XjxAlL<=n^Hqy(tFrr)j81!$p=)R|~ME!1jV+M@Db zZq05TkEg)A)ZyE{9V#Kov6qJKJaQbx814`LKp)JuYzFa~2MmFjoV$>7JGx%sBZW5i zBl%#q*SQ^aei?F$q~Gr@LT1gVBd2&FlfXs z`;trH@#d?Cd;npM8J^OxyEYFH6fM~hn@TXDyXWtx6zNOszJu*46wVNeW$yL1KcN=Y zMW4=VgD0K*SOM^Wn3-o7zqsU4I^J-n>C$KL33VK3v-H0Hp+JFW1UmwH)mH+zsXU)B z*dqOg#YKS*T#tjzUvjmCKnwUC}DSzYZeL_?_R z08>Wawmw$#=T?N8-ugPW%2AKHS)lXkXB%a7&seG!8VUcn&Jepac8J*>s1tcVP0iv$ z8Eqf46rYQWH$NIPWkMxpXTfMd%Npt*cJN?N@E;)GM$_kvHkv6wc#Tm`Bg6&vIcBUS zF|yw>3*xd%uVDZM+9E_Vk*%FWWu}YDUF(yV5XR2URGQoqm9Cf0}kCc9Z zVkUynWFU{m%g6(Qs;DPM4$v6<`Ge|dRz`gPR%P63doO{r&~CIi&-T~}FxX&3OUpFS zZ3nQRE{boS20DF0pf@WD<}s3mG|IdNog` zz)4#a3b%^Fw~Wa^$ivxKAB+;U4a>Mz2l$>Ujp&n{n76Z#95QXV;dmz#!Lg#AzPXlu zw>NDa00|iWZ*N;{R7_JIZj$MF$ORO0Xu@ z4u;z>NyXJ_kWm4eA2z8P1OyV)P4{~_7Z9}qNv zgfXeo5b5=I1eP6fvnbH{8?HVQ?-`ssa5O{X_|k3;(!R&x&IpoDdq)6a_IF~pwWD?3GgMpvtx>?y69<1PIM+&d<&9w;zLy z(k9;Eb?@23O?0hKHHin4u-6tN@~&KO?Q77Mxlm@h_ZwTmF3E+R>09LZ=FJMc2>7+T zcFro&IIEctxzu8DocwpffRDTx-)2k!owd^c&&9{hI zXgtV1)x)qwvLC(%_7uTirt!`~|aaq3ECX`)9ox>{4gsQtZwQ=G8kF zwd?q{8HRJ6b;~_U45bHMt!)fT96GD^URa{bs}fOxJxQ!h<_jD|W~mNFrbbwS`dqk+ zq1N|sJqAQK|5KR;76sHurQz!4qg8jS*NN)8v$aNW=J8C#9wdl1Yb(p2H7aB&=E__f zjnsK2n%8I_a?Uo}`Z7?35PQYb_V>1!_T(eyE5Wt6ZzHxx3uxc{o8`}vChoyPi&jZe z$CYWMMnexG+i`_=6Q1%kzVilApI`Gj&7SJttx4dT&>`&(7&R@v7b1;I+#I>zt@sL7tCXXQ(kYt&`ZFevGD^Dp21121zIXoGnAFy@^cENibcysUtKn_GyLkJ)?K*y zIYD05fnio5G^kARSSybeNe+PFZ-b4D1NZG6lc3RnJRk(^X~o)gi7+vKx*bQ#HpQEr z1-C(zhAHoOg{ph`FFxA$P_xB&=f@EeK*NyR8^L1$T>j?J`wbc@`LF`&)Xr!KtrDE< zH?*xg*Eir&O|4&&NE~LuypPU5gK*$@sBv3we1SV!s?W2){Tt^!j+x3?1z@*( zuJ3v-l;rYB6(|IQ2OUt|>TF^4cQ)xZd7Yun`aOMp%Vab6KKr6PiD&+LSo#)+!~3>$ zNN6?<6Z@4{=oqFH(J3jy9GKq)m5gge;bs(4#QkLixX}H$s;`sW)B3VhxJGdS1sEY! z13KCFf%&ej!%PK&fMvp-u8zhh5(I9E0ynw@NT?XkDpf5HW#D0M<8@9JKAU>B2s_M( zS7tiG<`zC^MeFVW6SJzd^N_^h+u!J1|ccit10QyO^KeWYwgM?-Jh}Prir-e210r`Bk}!M zkEggkq`kzBl1>sazM(zyO5=9;bG`JZOF@v3%L)%`KD6t+gP%&_di}68wnSa;oRIumEG~QB|QsPBLEe`>?JoIen;@OHsyirgh zcRDMdEPJ(;Y4^%@+a)%nh`>@&P}%kjJIj8Ju{8P#%AQYC`})ZBBJCr&qe!~;r>)2| zSX2W61F;`ng#qx^V=UO+<)?bwY@DBi{i2DS60))9@X%V;7cfDjH)Tti_ia5{WJuwq z0Cd#Fp97aSSfZrGuw10&3iYenh-#c>Jgb(8jbMN(F#d>q=l(xPY?p42M)@&y$u^87 zQ%;c<1II(8)Ezl{-%D;11YDCDJ{t4^HyV%}UIj4jtku$M^(=Se!c-XPL zL`W>}5#|hndyR2G-aQGbt;k}-9~9&WXobyNP;y&0yu6xdldk8kK^InbZM~~;l3xT- z`Iayl2Lc+J3~HPt(4XLy<1s&>=gV3DHkM+);c0^DvQ65^WZq}|$#$%f_~77tDwM-D zVtr1A(c@C_q06V}a9O|t7-e-f%4hg7aNV5=oCd^5)nKRwg6B&sy zI+D})F7iW!W`qA107dm8492-AaDp{F)K&r9F&mo32*4f$ddEE3BngysPuSY-OVB28(&I3@GJ9&w4+*TIYx8`-@o@m<*naAtDYTRZ+$*Z`_dc#fDV z{UvwTLVCKZ>><_@quj{4rTYu!uBX=;Na1k|x_2RtF8Xp_8euzUVym%DV-XMNMK1yM z>R?_5VI7Z_j?OR4Mla??LK z%?!6w?Kla13F@Sz@BtJZoX*ejj%}W|X#|x+jqk-7Pfx(fW9?$xvCpW-1}T&{`<{` zT}lBn--K$o=7T(IJX%%Oe&x3*aJrE1#SCk8X(KvH_AfJ^&ue3GO54hehdQMnYRVW> z5Kl(}qUzE5Tuy(_z_K5Mx92>2Ojq*R}$Q)Nu+lVi89h z+O*6E%{cU{81B7!^hFG7nMAZ#v#FTJ1PQ0Uy+g2uw|I2jFJT#$U@F{RY}rxil)~*Q zV7;8wUE$jtd$n57t+=AGew{|0$Qfbjy4z2pM)Y)ag`Jel4ON2a1adTr69e@A){~JfRwvith)0 zmVHmQ^Ho=d(i3Z-$JD&^pt&l%S=ak1t&$tI(WQc_#8HQ7z!*5!FgvA?8mnvZMRg&- zVQ3itqQA0K*BT7`Grt@v*ndL_FE}&OOJ409Wr0F&yLZkFV~{dW4Sg>aR z%S9gYf&J_U{Rs`f2$;G)e?td$PTmR^LrPC5*wB&Ed>#cmnfHDES5vd?1js|j{r<$a zXS@Hzlb)=TYObZGP76NLN@&<9+}iJ$0_EiW6MT_f3MlQ^sQafPt$_N=oJStmzIoQ= zPB*H68p~xYIMoGyl>|-I&JyaMI25}a?X&rR8w}=j{rmqr`g+2^u|OPGD&SDs!QA0k zm&VDNn&?I~>rTbvz}YH0+5#+^Tl6WuXDLJuc-5WaJQi)e{NhN zgx;!^oLj5XMk}D6=w~KVI3c2)_Ic4n-5(ai4Lh;R^*^H=;PkQOj8B}JJ_H4DpBoZ( z;AJoZ&gCuE8j$29ygV5Hu|yc-3U-1iz%^`+CIyPHQAf{;+IY(!DE(V7jQo%$ygf); zVsudB+IUNK@_u&u-^`BfVwgPzER4&njk6LOTy@NehW>2$^MxDNVtCi#9>=c>0GgqW z#=Sj|7*jMYNOo}cW5Q%E*#fU$?Uq4R;bzl`mj4MlQ-EFSPMGpPP=&qD~7uosjs^Hxk-O##J(OkvL4Ii`64WxW5O|RE@z#%ESvAnT4-D1rlz+ZR`<_62FR^W zu&dsf>z43iGOc_+-sPu9R@u9nYAtIMjLa@6zbsAi8AH3@cX+fs zh(}!HCJF+^npphPpmvQCK=X+LVgDoBF;QkU-lI(z#Id6IZxP_E@mj1W?$cA%_frYO0El_g|A=Se546?C%f zwEK!&@clPBO4PUK;%Te9@OR#PJGl3x#yDCTsR5p5VvAm*${P#EYsVG_}*1@yjWiL&mte7t93&Rm6(@rkirq1OqqjQcp8GH%jh4pma z+%@W4gWg+L;nW(QX$?f?XE9C547Yf9)3zHMR2G+Tb9$P-m>i^^CoOE&jEYE0$#&17 zrOn?6z}T){j!OsXJcyUg(L z6MhDLmYuj*=ciFN;?2z0mqRJ4XQ(3gUYGrsArCR6RBAtxQ{1z@FHh%(F^kV^Un>Jo z@F76R**k_1q_#*WXqQ*svMH2#?TmTd-6L}dcCg1h+46p{J?UKUy-S5>7lFhiYYutX zl)mxQh4oy93@`Bmg|YK&g+S`hCITG#uk1zKot#vl5< zaD24fL@nM4U8RnWoHe z2MKMB%0TuExXO8jhbNOej_j8y5~wl3sG)w3pIH;#Hs&4(QeD}~Xs(f^V{}3>OoIY) z$R)!1hjrO3n#QnF1q?q+jh$ufR*~Z-QZR|VX0DVWq|3pv3;W*_9Mu1nX-6wT%!byL zA#iJU61^wrGv_rdQUeTNb6+>}ST9G4IycZvHz23Ra_u)DVQKWEB&n4c zke&4_v(^qVN56Xno)1rU(v`l(&PTpx5}mp!#tvV775$`i_7?d(CbaYsyh@&9wzswf z{5&oZ)!ht6CrTFOH#KyR$>0c_tdK5ehoQVgW{f?p|g5HrH9GIOsF?vUd|z zabxawxu9DiA7t$v&CE-bBuG$9=eh%h%ro}>l`F4BHzcDbI4!Cy%OMXskxL8B--Ge@ z_lmhwko+4#x*qGJoubmvGGKEt_!6lK_|V zkLn3t2@#Q=X6M=&jRaZc_zQwQQr@Gh{*c4Y4>muku614)ULCK>1_Lm<)3`5#r~GLD zk0&VQglRjluju_vKi3SD)!`W_p9BT}(_^=ZsHl~1qgO`LDfV|UML49M zJ`gq@qy4uCUvZoXR6yon+i#K2l2L(uUK_9-<0B2b^YLb{I1Kb`q#s4DK;Z&AoImN_q94mYE#F21cV6mHZG zFQ?bdxi~X{7Cj{BXRA@1cryN_0DwU8z5GA^ULO*CYOpRAH5YH$VRvHojrQ0I8(6>)wwiUxs^Z+?%!ezrVyLNu&Q zADiubHRyH#y+Kp;&S;>mNR(4JRm21~f>xSDNe75~>SnQ1TkB&{{sk=my)z-CP}x1> z!Ay;so(5`U5~chxUh^tmEDr0y?Q@;2{O}ah9Ta5FGvR+lD1ZC*VH2%yyPYft0{S!!rA*oteK1*iouY`v(@yOabz>|J`-S z4|yG6hy^{!EN^0*gNk^+Be{gAOGhmEk!S>%5M@%jCYaL+oL_?=YXGNu> z{5I-!9&17A6q9g8yXbxxok_$vgrb^nQXpLhOI|7Lsih$waQ}CyEwvS_i!-k=!QxZ= zj#mn;Ud(%AA6U+FO77-#64ZDsLL3vU>;Sj&zt@dG^`!Bsks`4qM}MBuw?XwCq+hSN z4Zb{c==c4r{7xeqH2_G6$ksFe;T_^E6V60R!dIrx9V^4V~qp^f4e&< zM*3NBtg4J5Et>C4E;t$;PlUH}kyQbjW(0tnZT>5p4F-`_me>bfvTD;CW(JVsbUp7` zeM&r5sa}>OO!9T1aKWrBsH>n8DG-cWmLRD?UO8@fB&iMG`0H4QWWYzv@FB1HN`0lr zuSz6!G`Q!2Vu(4N4Hgx)5coTS3?RWUXsx7QhN`%O8Z(YOfX&iOC-hn!IYpj-0d^h$ zCOnNGdGXeus?&Vpy3D|QC8LyRHBhn`HvSOM7z)xJuXTK3YstWi1A!HMuVKd8N?|xv zogKi`f6rF2CNRzaiJc+qAac8}XN~cM3+&fO-_&!__Z6)MF@j4mgy`q2 z+)@zIYz_hcEDRQ<2+A;=YD-0}#C@iDIS6Yu$J9U*Og}@6Uf(nSZd>WeAw~mN9WO^Y zj|;R`d%0{?Gmg$?^ls5`gK%TG;t21&^ip7wIIM2h!9i6Vq@i_rG3L=MZX>hBK4J`Y zdlUUIkdC+7oziM)krFiz0!XtB@_nX?ChGW+ z@NlqRaM4n5Yt%#>y}8UBHVXL&@j8oHU@_uOk+fbhG7;l)?s() z!nkrOXu-I^yGY=l7&zZ-OzR-k(ACZe+@O|%DG23GCi#aj3^4@C(Cg1t0esf+xbm&# z9Ak5L4{!F7aR}!N3dn=oBp&>}I1!QqxAq?%=jqfd^oWRI%dl7m9P_7#SO;G8JNvUT zAsARNi1?T=U5ykNN~Q>UF(X~v@d%KKz3`NM=q^3~9saP^(f%k@(qWMlY3|3N-}G^| zpi@EC;eN5!RKd9Tw*%AKU#E{v%?8?B0U96eTV~}MC`eFNySjNW{gDO&{?(dcv6DqK zr-)h>$~lL6CAB0GKrCenJjZ7IT1%1;!|y3I|8nWtmqrmlrz#5tGQo1~!!FmVP6-ZB zr`OV>9uLJN4C0<48lm1r&Gm@d8y{0>)qeCvoUYaXN@B#o{vFRhL{f$iW9#~`ZZyV` z5{r?lRxch0{~Lax4hbM_U%5@F&EUj8_y=h+1gFQXm?w&bvK?QNev{PKp4m=f*5a?t z?Wd;J-DRGk>U7B3SVO$J25!M7)eIWxp~|*jOoX3}VRIIQEgpELJcpH@@q|t$%O)iVk}i8e7=&{l6z9)70VG8QZvfk&o6J zEtpq1HXP6^m_J0SyldPJjGFAeNX#>=PPSK8$qxw){T^b`i>HUPrQ_JsBFHD1l`q{T z1ZX4qedy_+h0s(P8^}-v*d~MORq4KJ{2AP~{hMK~Ytu)r#Q#-Vk}4hPj~?n|(-K*r z5|0kD6q`O&nZOw5574>j@VtHwj7>S5mU#rd+7n&rxBI)hL1)(rqx{6mjhJG*40VyB zW#+l=>J$(Yrdf1GT(G68UPa1w!rnX5yd;uyJGD5A%A@Y2?S=y3g<~y~?4&3|q$#ZV zLXIo9Z(UuDAKc8l`~2)Zr9}KOamoq!B7Ul&mZ*snEy=e zadf!L1rQMoE!9?!e~0GSP7c}T#M;@j$_mYF--w}2mOlG&#e@DuOpOI}NMj6(4XY>F z3?V@a|PT}XAt3V6oA}h8wmKD|w+=hea`iJVQ>u2uibnJr< z4f?KY?Lm%Ve~bCSv*(P}Xkarbk0C?d?WLFq}YYp^zRLh%+Ja4>o)u zI4L%Rr|ye{2ELS+)ODrfoy4qlhb$KO2Bo=KN}*cN;e(qoSFNqrH;h=E>bISY4>IcV zkf9&GnEj$fj4$FGM-8@9krAc-%KG0uYyBsd`K`sv>w2r&QLw=Gdu<&H*BZ_;GkW*1 zSH3lkJ{d(1%jnGbpUt%yHWS@B(8aV|Z=Ba3&TfX~sHXwEQR|6gdT>Z;SR#PH0smi% z#iNy#uqQj98|Odn$tLSpKC5R~VA-0;CGF_7waqB}yUZ}X+aclPmmMs0mpwo7ABsm` zVvf3?YPWrG241kWafuF7R~C94IgTnYNmN=VQSBAqW_3zU2yW&>-Okt2bo)0!lY;sh zwMG>g5kLD__l~4(LSaJ9QePf^{scbpY9L_;IL zr&$T1p+bEV4_)s_jaw$2<(U1atNfW*MY<`~`jqvzXd?P?t=)kl)i(SlIyF6{4zG(D z`X|FnU5k+5^tZOvmzVoLC9B!nm9>~lCCQC(Ve?Vd560f9p}(9+RYNPZ zlT;UTU0tKRuoSauHo1f7+g;aTb`R%g*3IoNj9eX4k3ZEPZCV0kskDb3LW$11ReR|5 z;*Trb#_JS{&_SJ&M!Vi$qx=<&cfBQYnb5^le&Ztnz!4-TPN|*ud#NtkdB>q}3%chU znMVk2$Kgtuy3qlU(=~4CJ&^Plq~co5_rhcn@FqtSMX!_H>OljuXM9L zQb;kQ5=jTYp&)$D#AOS-y;QU|qfK&u2vkQ5&&GLACfC+BxGzG?G8I?Ag*Hiu*AP|W zT358FYPFu^YNjwmf+mHPXV!7>>@$u9uqE!HF|7?Ls&7Z_fTYCc{c>z57#iAZSAQT} zG>}SwO*ItfVOWjoU-II|TT&1X8j>Ug)F)}`-OUfsY+LQ`s9y`4G+IPDb!S^nU4**r zcB8Mx`r<~nHr5Ddb$madP2_04##x7vgsQ@UqscUx)}K(}KhA)?_9Yn&Zz<&P44M%k zJm49oU-ixub1{e0K= zD>=!WlgZ4Uwbx!Vv!{L;f=_SaQR`Q(xfXnW)mhxLj)&T}-lQia%UKb7>fEd+-G{bQ z46`q^O?&k=HxlnU>D3*_LCDwe$Qn4Q8F!Re8NZL^brxm)tANhlqqU+60+tbK31w!g zS)M|z7|5jqGZ6DQw25*V+k$O!QIn2ouMDKE)p2dcD0`wT{X$l3D~k{mXOa zzA)IKekQOkbyJewAt_#N%ViEJ_0V;s6L-z7T;B#r)RFBq)k8J)2{XOdeQgJnTwq?H^<2AQpd6Ag*xhG!os)k#x z+Pc}oip0`L+I6k@?97@}l%;;mC(~f{=3G%3m2${%zIC`JLj`%Vs%B;z+(PX|%QYK^ zi)th1Yp4m^D`wH8duz*fYAWw79Swvz#M9Sw1`Cn$I^gAMKoFj+Ih$sHvX}`yJF?#1 z?7ASZa{NFX@!=kig`YaNK~|I9W%=*IeFEsdV|`6?ywEAGsM>LcW6u`(>{IB`vVc+P zGC^473Xd$bx#>tpGp3OGn{;nVcgU)@<29veL?ezbC|Z~C--86oxPpWVBLk6>qQs0^ zo1;HeK)N&|Cgrg_&MoB%wf@$pLt4Ii)cR$$a5uXYlG@d^Uch?M;Iy2opiy-;-#Tut z0`(+UC8bt=)LVT3=Q_=+HfZUQE_1_>5sxK5Z4!t*GWMxBaj@4&Cfxl|7a4$`Z4R6k zcWYtd8kEgocQ(N?vLUPcq6)$v^Q04o6}$amsl%%~`k8}_LhxAOT{`#lQ*c_;j4e?H zp-Ucvrym&wXK8fNyEo4!^*FE1i$At4{WdlV{!~cnTQ;r>9P~Y zr0*OHSnidJM|TwPqc$Ou;_t+)5t(U(%gukU&G3W0XtZP#u?xafGbL%YZHeV3+bk>l zcL~XS&8f6&+`?lP*#~@s87#I6mtTa(7Mb(>^=*mvB9|PUohJD4nw{d*jA@+=_6?FS z!Ty`7FYe*M0mJk#;4sMrNuhS*a<{jzUtP})13rBG7&m0OFP>&(v5Z8qixa$m{@yy) zAyPf%C~;DrZ;_$tz<0;;H3DjO>6J2~u`dLrM%=xQf}AV}e}cgN_48eQDz)gQ{`a$8 z#{+|W_u9w(AaJrMP{qCOQr~Bic=*l^-J|?`xZcDoo8EeNo_e#G@%%PK5YBhW|*hU_h4EBuDq2KXJr zWp)1}2S{wrQ+0p$QvJh8rskK0sjEcWx?1q3?5r9$mH}-?5EnWDn+-2+M1IX;we>o$ z^FP;FR#)TdWI|qhw0SeX45{tJKIAdZ?F3g^nPgV~>`U8z8k(*L;PJBaIwo~<%=lg> zA}fso8Yy+{+SnDuFYA%TyhPMr*HG?jAJH3kv>0;cqids*JW`%;;@t^_-?Nf)1F>F} za8eK4?=SDFJpK@&OtmJj>~%VRvg(3=rzifMnOtR;s(??&xXX@R$QG3PLA4?e9a`e% z>Aww_!Fe%?j$kzUjj~!PLcc_Ab`TZO94){Hc50qB^G#>8iQT=T+B7;@{mSAC-ptqj zieW5XKtHqs`Yww{crj?Ww-`Jp${20qGbLdRF8@|CCF)OE$kR^#Ioc*9z%)yJ6iQT8 zQe#WejDk^RQ*k#`rDI8Q)Qd;Qjz57@e@65zHaK_JxIhqtBUK!>i_tV9$UEt0^^Wv1 zRuaMX`gv(iOSx&dt%g@c>(D&lI%o|O;{zpE5>r?yq0a8hQ4`&ck8)RQfKylNtK8K5 zdNJtA4$Q2do}qzL(nAJeQR*gNUB%s>e{^||+kr1s{y8r6N}D#A{MvW+tB-yII7$&6 za;6(Y$1-&4wJ~Qt+oOODKX{B8Wz>LOMv7c(m_#-b-s=N2quh8aL2iectpe|) z1GYnp=?##SU(d3rJF4i>K6drYcSY!;^27)#z1Oet;=dKrhm_-3C}jOj+?w3DrT?yM zA7EERq4H;Jv=oiW(==N}wc09yz9o}25N}0KouwRBLcH2reSF>i^F*r~L>gk*4_V0qKM0kdXA<9=m~V0X5diaJSB)kxt#&-| zCTLe4Z1W9*8KUm5jGIoE@oy~uKtMYKtL3EYu>0sgD!ymG$Bh@A1ZY?xB!sp}ql1=! zc}Lk=8!`y129q|PUKL-p&+>XUg-u;o3`nskpm|m}!kbKb7~yGARsQ6>?nldLq9~5! zY0M(Z%T1a8h*h-WZe6;?kylN3DEFBLKq)g;&`{1yW-VOB ziOSG7^n4j8m0pZr?5+M<9d811RcjTiK?(z>wu5n&TO4~q%o~l5*q9+YW%7e9^bLjV zb8g{7LKnM}Z@p3U4MJ$HJK1*kDfuf(U+ha;la3WuRSJq}gVy7iY6Z1OlC6HFtJf#f z&nC+l`=__y)aB+r+c=EVPdGiALk8SUxQ*OZ1VP9+(>{cznYieD4~`ekp`UhPATu_u zCqg9#4E9cF#SWU*L>CY=WZ+k-*JE6@U7j2SGBm{N4Gl{}zs4nWd3fI?PwIiVP0j22 zEVDUvN68|I#Qj`Q%j+$>Ka9vkxEFl1v1yu0_^HV1oHJ#Nubi`)RsWJX)2Vs{3TkwS zs*}IAcS_VW*W_AzGc?MU@upkPRjiT0j`k8({$8(3I^A1SIN;W%Wu~#kXYDqcO{vBj0ArO)EJ-7SiyeXe@8 z8861T-}zEzMV+QQGs%u`MlAwAnwtJK5ogn-WM0Grl##h>1o#?#`5I(SYm1;JGvVtF7poS4`KM9`B(+Wxj>wQcIrTpkNSW z6qmIL9o>4clJ@IB+OowfYjUq5S$gcifKQ(*1HkvaN~8|!?e{fbh9fw<%q_UY?hjM$ zm@5BwbB%7xp=|n2Td%hJ!*K_jLvuxqz-@#t`XxN2P@r!~?y?eniB|kj)c^Rk3oj`Z z#&H8fVjB;6VAM2fN^LVwIfHMB^pPdUoiJ2qoOf^(4$F!9$>!1TQw!P!1C< zOmRpF*^&7Z4Fe5wK2)Tz94$^pT#8kht#qN+U1j6lUdMcnnNO$j5bKH z>F6MU%#mKjAvx8Vp4#U261Ti~{m1-&1r)KoFDn zC{UNvZKh&18u*v(AGr7ZFD(lNWZzV2Zp#+DX);ExCon@haTb{=Z*r<7-tzQN@Hegxjc7=}9M!O%NS2lH6_yYN48QMki-) zKLpt8jV)mg;6%Pv@I2eooJA$NjE8D}__um{N#Lz*XysgKuDTniMzIHK-X6W=%Ih%7 zUVdmLOBARWk%Ur4u;k8-A7y+EuCmVxl-1pCq9Jkfy1C+aa^_TOf_A*TDQ`umF@B9z zq5uATQ=U<8r65v`%rt*`GLWw05o zwd8G|X*DeE3g(+e+FVkkZb>C31Hb&c7#AW?y&+I=EHU$^9m!+piJ0W3{`XyxYzX%z zhu~(We2&C*<2)(2RU9R%;@M$o-021N@Nkk?PAJJu$mAVRUTW3Sh7u+$o-I~db;Xy# z^;f+aWymP*u+bnF7UX4@HCj*KLcvq#{DVYqJ7~U&g0GH?ws9dl|6efj40+>oPfdUJzb+=X`L4!Skkm^G8S>t#59W!72!18DkW$^Q422gfq9m<`DB>Sm-L?WB^?{)X! z)J7C8%fvSy;+`46HH+@@jQLf=Jop$BS4<5_bduT5aky=)XUlk+$@LLN|DKrj^{4)@ z^7NvO+3HgrB&xikKO}1{WVXRq1V6i`qn39$o zoW$qu+q~yOHPFNED$|Ur>`A(ibpP_&`fL zLQ-kW$7pU$*gx#?gGb`i7)qSgHZhrg%2f%Kg=Zg`OJ67a1fhTsx@g^-piiS+Z-<#^ z8N@hAr_GaSZ4|AZxEypBW|o|MBMI9Jf#KvP+BhRCf1sku=m>){uaDBG(`stlCSvXS7b8~TK)CygQ?Sj*pz3gDD5dHO4{GSQ9G65 zR$mflBLTjdMw*$xN%TvUx~8lBfiIIX$?y^ayvRr|ylI(oT$qX1R5MA&9xpv_)S6Ma zZHBTZBj=bWJMyUzK#QY+tx&u}nabKW>gngDDQ=w4S_C+OZmj5?V*2HRFfdlWuV)9as~ zMu&YN=DggGTAc)|CF>{x275sV>o%F;3Ck&iucq)1aqqt9SlvhG1}$!XOXH6t7IhBQyLRm{8R3y&dugDbdJX8ib{h!lw~wU{AHSk3>29f>N8+EZ08_9ECL`1$ z6iS3;nno<8C2o+EKSPWflRV-nDjnY??4DZ020Dpo>vIF_@1(hpG@l za23ffY;V}p4=0h9iU5Rof#3)1tzyX*=lHlC6FuyP3ih0r)KR4lUmT0-{Nq9ii@3y}JSjBJBL=jG&k>u_{7ajZ-XnT3=$?~dAoU9qRQzl6! z5Kl5f?-UFPl1kc%Yl5y$PSjrKP63yqjgJA+f_kjNLA95)Asx=T_y|}>$uOuZ`C4S# z#^#U4Su|}vRY)6Tj%o9$6OSyaZ;M=BkA|x?Opu^ zFA6HZ)ZNN`=amnC$E%qZB^R0OiTR8?PX0gcV%~79udAhh4t-*PZ_vLC9%|$?Gor-$ zN5=sBTm4^IQas#(rqV<8pZX-t7uuR|#%?U73%_Q}Z8;=tY?pUvT1@t>_~aNb zW@o^N4p^!=wC(@Qs30eQgV*U-DA|oZ`FO)8RIU8Ik|Riu(8Yt&H{Gf>V7dK;Vs^|? zM!X>{t{D5Z$t{`{&mCtp? z)_oG4z?rmT1t4A_FOBoK5H$fK7|qfyDVA=3vvNJ^tH}HJgMZ*G5qro92k8x)530E0Ut|WV{Zy7Vhx%^uWw{geZo0O z!bzjCuBMvEo>QM8hE)NPEFgKEE>DfJx8dagZBI^>yNOIAZq{5|32F?$@FP-ItxXJQ zUvi5rncF$oYBM3{*6l`iWheV8^%~vK)>KzJC|hOOXTD6H#et@e=@@s2GOMQEuO*$Xt-&v(| zzm%)yf0Cf>rQeX@7+y051SCsh?`JpDs9Ub5@Xc4**O%d;ch#Mv5obFcba0mj|3$E0 zh%v-+0NN^PY8j!;5qwLCbze@A@iKEKGBFN_*J=VH^-bTk`db`0XrcYnX}a%csVKq; zX+@_mS&^VkyJR8O5Y~{MYLBnkvjXV9GBrheO{2kJ*3Kl(;cn$_2oLS~dJ1m}^AYYK zriA{QP16R?l|3(v_^$bFlrbIBC&6l5-Ngo7M5Zuv2TmcQ(if<|*9}edgfhO~{D6rjCKb2nI zAX0BM%KDczRlg!b&nKjCw1T=~Id~)V;bdK2%0AJ0?W~)#g@U_4dHzUF-@SH}qe(q7 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�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 z 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 QPXt$e3tE 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 UVaciP?=L(>*~o1KZn6CRf8PTyAOHXW literal 0 HcmV?d00001 diff --git a/tools/badgen/cmd/gen.go b/tools/badgen/cmd/gen.go new file mode 100644 index 00000000..37bef1b5 --- /dev/null +++ b/tools/badgen/cmd/gen.go @@ -0,0 +1,83 @@ +package cmd + +import ( + "log" + "os" + "os/exec" + "path/filepath" + + "github.com/ditrit/verdeter" + "github.com/ditrit/verdeter/validators" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +// genCmd represents the run command +var genCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "gen", + Short: "TODO", + Long: `TODO`, + Run: generateDockerFiles, +}) + +const ( + DBProviderKey = "db_provider" + Cockroachdb = "cockroachdb" + Postgres = "postgres" +) + +func init() { + rootCmd.AddSubCommand(genCmd) + + genCmd.LKey(DBProviderKey, verdeter.IsStr, "p", "Database provider") + genCmd.SetRequired(DBProviderKey) + + providerValidator := validators.AuthorizedValues(Cockroachdb, Postgres) + genCmd.AddValidator(DBProviderKey, providerValidator) +} + +func generateDockerFiles(cmd *cobra.Command, args []string) { + executablePath, err := os.Executable() + if err != nil { + log.Fatal(err) + } + executableDir := filepath.Dir(executablePath) + + dbProvider := viper.GetString(DBProviderKey) + copyFolder( + filepath.Join(executableDir, "docker", "api"), + filepath.Join("badaas", "docker", "api"), + ) + copyFolder( + filepath.Join(executableDir, "docker", dbProvider), + filepath.Join("badaas", "docker", "db"), + ) + + copyFile( + filepath.Join(executableDir, "scripts", "run.sh"), + "badaas", + ) + copyFile( + filepath.Join(executableDir, "docker", ".dockerignore"), + ".", + ) +} + +func copyFile(sourcePath, destPath string) { + err := exec.Command("cp", "-f", sourcePath, destPath).Run() + if err != nil { + panic(err) + } +} + +func copyFolder(sourcePath, destPath string) { + err := exec.Command("mkdir", "-p", destPath).Run() + if err != nil { + panic(err) + } + + err = exec.Command("cp", "-rf", sourcePath+"/.", destPath).Run() + if err != nil { + panic(err) + } +} diff --git a/tools/badgen/cmd/root.go b/tools/badgen/cmd/root.go new file mode 100644 index 00000000..ec30d227 --- /dev/null +++ b/tools/badgen/cmd/root.go @@ -0,0 +1,18 @@ +package cmd + +import ( + "github.com/ditrit/verdeter" +) + +// rootCmd represents the base command when called without any subcommands +var rootCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "badgen", + Short: "Code generator for Badaas", + Long: `TODO`, +}) + +// Execute adds all child commands to the root command and sets flags appropriately. +// This is called by main.main(). It only needs to happen once to the rootCmd. +func Execute() { + rootCmd.Execute() +} diff --git a/tools/badgen/docker/.dockerignore b/tools/badgen/docker/.dockerignore new file mode 100644 index 00000000..6fa68e74 --- /dev/null +++ b/tools/badgen/docker/.dockerignore @@ -0,0 +1 @@ +badaas/ \ No newline at end of file diff --git a/tools/badgen/docker/api/Dockerfile b/tools/badgen/docker/api/Dockerfile new file mode 100644 index 00000000..4ba5ed52 --- /dev/null +++ b/tools/badgen/docker/api/Dockerfile @@ -0,0 +1,19 @@ +# builder image +FROM golang:1.19-alpine AS builder +RUN apk add build-base +# TODO +WORKDIR /app +COPY badaas/ ../badaas +COPY example/ . +RUN CGO_ENABLED=1 go build -a -o badaas . + + +# final image for end users +FROM alpine:3.16.2 +RUN addgroup -S badaas \ + && adduser -S badaas -G badaas +USER badaas +COPY --from=builder /app/badaas . +COPY example/badaas/docker/api/badaas.yml . +EXPOSE 8000 +ENTRYPOINT ["./badaas", "--config_path", "badaas.yml"] \ No newline at end of file diff --git a/docker/api/badaas.yml b/tools/badgen/docker/api/badaas.yml similarity index 67% rename from docker/api/badaas.yml rename to tools/badgen/docker/api/badaas.yml index 0b7ddda0..3f97bd5e 100644 --- a/docker/api/badaas.yml +++ b/tools/badgen/docker/api/badaas.yml @@ -1,5 +1,6 @@ database: host: badaas-db + # TODO must be modified according to the db_provider port: 26257 sslmode: disable username: root diff --git a/tools/badgen/docker/api/docker-compose.yml b/tools/badgen/docker/api/docker-compose.yml new file mode 100644 index 00000000..80d85684 --- /dev/null +++ b/tools/badgen/docker/api/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3.5' + +services: + api: + build: + # TODO + context: ../../../.. + dockerfile: ./example/badaas/docker/api/Dockerfile + container_name: "badaas-api" + ports: + - "8000:8000" + depends_on: + - db diff --git a/tools/badgen/docker/cockroachdb/docker-compose.yml b/tools/badgen/docker/cockroachdb/docker-compose.yml new file mode 100644 index 00000000..14da23d2 --- /dev/null +++ b/tools/badgen/docker/cockroachdb/docker-compose.yml @@ -0,0 +1,15 @@ +version: '3.5' + +services: + db: + image: cockroachdb/cockroach:latest + container_name: badaas-db + ports: + - "26257:26257" + - "8080:8080" # Web based dashboard + command: start-single-node --insecure + volumes: + - "${PWD}/badaas/.cockroach-data:/cockroach/cockroach-data" + environment: + - COCKROACH_USER=root + - COCKROACH_DATABASE=badaas_db diff --git a/docker/postgresql/docker-compose.yml b/tools/badgen/docker/postgres/docker-compose.yml similarity index 88% rename from docker/postgresql/docker-compose.yml rename to tools/badgen/docker/postgres/docker-compose.yml index 768a1195..80d69523 100644 --- a/docker/postgresql/docker-compose.yml +++ b/tools/badgen/docker/postgres/docker-compose.yml @@ -1,9 +1,9 @@ version: '3.5' services: - postgres: - container_name: postgres_db + db: image: postgres:latest + container_name: badaas-db environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} diff --git a/docker/postgresql/init.sql b/tools/badgen/docker/postgres/init.sql similarity index 100% rename from docker/postgresql/init.sql rename to tools/badgen/docker/postgres/init.sql diff --git a/tools/badgen/go.mod b/tools/badgen/go.mod new file mode 100644 index 00000000..3bef4625 --- /dev/null +++ b/tools/badgen/go.mod @@ -0,0 +1,28 @@ +module github.com/ditrit/badaas/tools/badgen + +go 1.18 + +require ( + github.com/ditrit/verdeter v0.4.0 + github.com/spf13/cobra v1.7.0 + github.com/spf13/viper v1.15.0 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/pelletier/go-toml/v2 v2.0.7 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect +) diff --git a/tools/badgen/go.sum b/tools/badgen/go.sum new file mode 100644 index 00000000..99e12ce2 --- /dev/null +++ b/tools/badgen/go.sum @@ -0,0 +1,491 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ditrit/verdeter v0.4.0 h1:DzEOFauuXEGNQYP6OgYtHwEyb3w9riem99u0xE/l7+o= +github.com/ditrit/verdeter v0.4.0/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= +github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/tools/badgen/main.go b/tools/badgen/main.go new file mode 100644 index 00000000..c71e28c3 --- /dev/null +++ b/tools/badgen/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/ditrit/badaas/tools/badgen/cmd" + +func main() { + cmd.Execute() +} diff --git a/tools/badgen/scripts/run.sh b/tools/badgen/scripts/run.sh new file mode 100755 index 00000000..18797f0b --- /dev/null +++ b/tools/badgen/scripts/run.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +docker compose -f "badaas/docker/db/docker-compose.yml" -f "badaas/docker/api/docker-compose.yml" up --build -d From a8049772bb63315fdf4d3d5be593a7363e08e409 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 4 May 2023 10:18:05 +0200 Subject: [PATCH 112/467] refactor: time to utils --- configuration/DatabaseConfiguration.go | 3 ++- configuration/HttpServerConfiguration.go | 3 ++- configuration/SessionConfiguration.go | 7 ++++--- {configuration => utils}/time.go | 4 ++-- {configuration => utils}/time_test.go | 8 ++++---- 5 files changed, 14 insertions(+), 11 deletions(-) rename {configuration => utils}/time.go (60%) rename {configuration => utils}/time_test.go (82%) diff --git a/configuration/DatabaseConfiguration.go b/configuration/DatabaseConfiguration.go index 293874a1..6a950473 100644 --- a/configuration/DatabaseConfiguration.go +++ b/configuration/DatabaseConfiguration.go @@ -3,6 +3,7 @@ package configuration import ( "time" + "github.com/ditrit/badaas/utils" "github.com/spf13/viper" "go.uber.org/zap" ) @@ -100,7 +101,7 @@ func (databaseConfiguration *databaseConfigurationImpl) GetRetry() uint { // Return the waiting time between the database connections in seconds func (databaseConfiguration *databaseConfigurationImpl) GetRetryTime() time.Duration { - return intToSecond(int(databaseConfiguration.retryTime)) + return utils.IntToSecond(int(databaseConfiguration.retryTime)) } // Log the values provided by the configuration holder diff --git a/configuration/HttpServerConfiguration.go b/configuration/HttpServerConfiguration.go index 8fd58080..c9100163 100644 --- a/configuration/HttpServerConfiguration.go +++ b/configuration/HttpServerConfiguration.go @@ -4,6 +4,7 @@ import ( "fmt" "time" + "github.com/ditrit/badaas/utils" "github.com/spf13/viper" "go.uber.org/zap" ) @@ -44,7 +45,7 @@ func NewHTTPServerConfiguration() HTTPServerConfiguration { func (httpServerConfiguration *hTTPServerConfigurationImpl) Reload() { httpServerConfiguration.host = viper.GetString(ServerHostKey) httpServerConfiguration.port = viper.GetInt(ServerPortKey) - httpServerConfiguration.timeout = intToSecond(viper.GetInt(ServerTimeoutKey)) + httpServerConfiguration.timeout = utils.IntToSecond(viper.GetInt(ServerTimeoutKey)) } // Return the host addr diff --git a/configuration/SessionConfiguration.go b/configuration/SessionConfiguration.go index 3a76ef6f..1d330a8c 100644 --- a/configuration/SessionConfiguration.go +++ b/configuration/SessionConfiguration.go @@ -3,6 +3,7 @@ package configuration import ( "time" + "github.com/ditrit/badaas/utils" "github.com/spf13/viper" "go.uber.org/zap" ) @@ -53,9 +54,9 @@ func (sessionConfiguration *sessionConfigurationImpl) GetRollDuration() time.Dur // Reload session configuration func (sessionConfiguration *sessionConfigurationImpl) Reload() { - sessionConfiguration.sessionDuration = intToSecond(int(viper.GetUint(SessionDurationKey))) - sessionConfiguration.pullInterval = intToSecond(int(viper.GetUint(SessionPullIntervalKey))) - sessionConfiguration.rollDuration = intToSecond(int(viper.GetUint(SessionRollIntervalKey))) + sessionConfiguration.sessionDuration = utils.IntToSecond(int(viper.GetUint(SessionDurationKey))) + sessionConfiguration.pullInterval = utils.IntToSecond(int(viper.GetUint(SessionPullIntervalKey))) + sessionConfiguration.rollDuration = utils.IntToSecond(int(viper.GetUint(SessionRollIntervalKey))) } // Log the values provided by the configuration holder diff --git a/configuration/time.go b/utils/time.go similarity index 60% rename from configuration/time.go rename to utils/time.go index f71ef280..b075cbb1 100644 --- a/configuration/time.go +++ b/utils/time.go @@ -1,8 +1,8 @@ -package configuration +package utils import "time" // Convert int (seconds) to [time.Duration] -func intToSecond(numberOfSeconds int) time.Duration { +func IntToSecond(numberOfSeconds int) time.Duration { return time.Duration(numberOfSeconds) * time.Second } diff --git a/configuration/time_test.go b/utils/time_test.go similarity index 82% rename from configuration/time_test.go rename to utils/time_test.go index 56134aab..578290ce 100644 --- a/configuration/time_test.go +++ b/utils/time_test.go @@ -1,4 +1,4 @@ -package configuration +package utils import ( "testing" @@ -10,19 +10,19 @@ import ( func TestIntToSecond(t *testing.T) { assert.Equal( t, - intToSecond(20), + IntToSecond(20), time.Duration(20*time.Second), "the duration should be equals", ) assert.Equal( t, - intToSecond(-5), + IntToSecond(-5), time.Duration(-5*time.Second), "the duration should be equals", ) assert.Equal( t, - intToSecond(3600), + IntToSecond(3600), time.Duration(time.Hour), "the duration should be equals", ) From d5418b3f3229d0e33ab0de5c70406e4039999688 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 4 May 2023 10:46:07 +0200 Subject: [PATCH 113/467] remove binary --- tools/badgen/Makefile | 2 +- tools/badgen/badgen | Bin 8825495 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100755 tools/badgen/badgen diff --git a/tools/badgen/Makefile b/tools/badgen/Makefile index 5eab73fe..00f57549 100644 --- a/tools/badgen/Makefile +++ b/tools/badgen/Makefile @@ -2,4 +2,4 @@ build: go build . link: - ln -sf /home/user/ditrit/badaas/badaas/tools/badgen/badgen /home/user/go/bin/badgen \ No newline at end of file + ln -sf ./tools/badgen/badgen /home/user/go/bin/badgen \ No newline at end of file diff --git a/tools/badgen/badgen b/tools/badgen/badgen deleted file mode 100755 index d30b776dd18e9aaa117a1a4e618e64d89816990e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8825495 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

    f*Ym0+jOy@W-?f85 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

    b0g~Lp;-b4w0 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%0A{LJ1 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¾>p2=8nF2{ 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

    p*Y$j+AUyN7=X>*v!qk@Mhq6 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

  • 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 w+uoYfA8%7y+)tF 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

    k7nSDMeqND`Z{gZg9CZVN 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–M2ux2Hv&H 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�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

    >pD@rkKXvBtK-JT>*& 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 l6G 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¥nG_K&L4nj=ZvLasA#||%3fVmT*K|rVD_VLCo$@0 zas0TxP8guBu#FuW@*ocqUc**j32oV5sx!B#3okr1@>=lAN6y}*f~=wy_v84A@dF}3 zrhCa?5WxuqRj

    QLjb?Eb3N9f%5aOjl%kr^q!SEwEBl%5XIC%7KsUEy?FE*~%?=Nt}u~Gt&np3F5y*!l+_r=-iLPn!%A{a5&x7rIuRuB-0_(ht*-~ zb8(}hb9U%ui+589fP^DHw7LZzMEDTC?;%DK{t^0nU1)(WcY6eOsWiWVeexskNMDiS z2zJ85)gh(&Lkl~Ea>`>S`xACIxJ@0jDOZ1MQaf0fNU?{})2+LvGPeMh<47PT^a76L zojo|VP-{c2g&s$NG>!Mx$OX`9>H&)fTmhHvugBA_qB~Bh@y$lkq0@r_L$DQrE3xNxr;eVyr9WN0nfy2Gzqy2uPhzj&OZT9p_Xl|xz-)$8wT>MLgoLQwM=Ut8Gb0(ci0KseT5-GiDwjyMB`X~b5_jRdcGdhe8gqj_ zeL@6|ZiDTP0=X-E$`ZEt&uX(e$Jx{G<&U_tPU`K(Ybw5X?2bq?F}XwG263@w^&j*y z`c7qXk)B4QKf*x-4@k5wnwY_`E^)M{oT8Hty30I_LK)T+Tp(_S7G$$mdE1aqi>yT* zX)***15Wm=S*HgVC6}C>*c1iBf99xv6ag2$g&?bo3of2lPAIG-7-iLDHi>j4Lk)?e zXkNu`UVMsL$T>p`=@P$Hwj%k3YlJZX*Ypcb&QzL}LZR_G==9h5)P=HKm2Z){+W(p0 zuzTfF(Xi??Fr+B>&Z)Sf|27I51?;(gKo?bV=4k4cV0oPTcRc(1wLOIzrDW)-OGhD# z8;Wk3b|!2n3KEniHiCTHrGtY=njYqDA%vd;P}hBh%|opR4FaoK#uC~{t~ZpeQdH*a z!bxPo*ZC|QOnl6%<(2Mgh#(UT7p}fmkbApg*1+3PvZcraBOSpq6xdFmb^{+0X{LQB zm{WxPrN=q~-OM|b+S(M+u=ai-!-R_>Ka+fVN2yYR3q<{ja`s+cz2t0J*gIT4EiCf& zfQymEY`eEWP>nVmp_L|~LSeRW>KW@gSgc?-B&!aXyL>UoR3=_kjKGY4FxciGWi9@b zi9%QNNActass6g{ zqFJPRF<*QqLiA2`5Fr7U^dQ`B?R%lkQ<#Ayh|JiD|$NuNA~Sq*|J=-9Ewg zxSrHcAOw1F7Ejmwz17fI1^iZq;+Hnwy3PS{b082as7D5n=7(QT1wfC~4vvrmIE8uC zGxn)cvM5TLJkgG14@Mt$_AWj)W6(C63zJium&A{(b8s}5Rn1-w4mgB4JpROMEVAR@ z>w9cdfl9hrG-)NbwmR|=E0Pp&H@s8ZVEkIE$VEn@^0^>YBLb=i#ShL*m7-GT!r^?o zF(-_PxR2z*k#K4Tor-%CEQluJpn@A?hDo9=6&N)(*G`1TCvMnpM=vPc@2>>P+D@QN z;~8PRZY7J0*M|q`6Qov9zI0k02JV9OZ=v4AffwYW$iJB$$gtooepCx-O;2Lvn#{dj zRD(K>9-Bb6+jAv3HOZ#LU@1tLhv8bSSrG7+omEXI9u+tNY}>fgz!*=jA(?N3s-sCM zU<8bNvg+GAzd&%Ro+~7guoM>MdBizguS*Uq-i|XxIi>KolCfJ~c@i;~pImX_Zcdmt zL?r0VYqsoINXu33`>(4tXA^vm!@gaW6=qaZ(TX@Mc)(FFmEguY#iX04-ys_+c;+W% ze_iZR!ijx{Ksk^WR*wv`8fozS9G+ky3$p3I00S!Y`V_IPFH^tK^&3*Tz>hNCHvBt0 z`BA-KUru@s1&P_h+tN-wkS}P1EjxV3S-K82lYX2{$eoVYCbAB&A)8;WdnT`x(>vp? z6)wId%!aA}#g1xy_6tu~24nd|szz9N!rEtEVT|pj;G9z4z{h4sZ_RNaNQu~Z<@v^)PX`3zrx}`m$3c>m+7emB6?zF z#rwk0bB*lijSRw%?LHz&J2t3;CF35Zu)@i?YzrD($lH+8!}m$7!So)NyWgncE*`+6 zd?j3AX~QQJIAwcR$xQ@1P( zG|d#|fE=2u!pCJyO|!3r>c!&c5JnxfN<5bvZ9j>`rCXHg*Uh8u7eoewNl{=c-)pTr zvRM?vCih%H!?GhvHP$jUmV!FX=WoE4R`%%?I{lhgFa}ZWU{e^Ttj#?yJ%zzNa6u=a z@iQ7q*owV;uw288X>4D)=3!+S(JLX>PkUj0%}MbXEE%gGkWVR37BF!B%U|rKYb4^g z{Nmya8X6+AhSU< zce@QjC1y<&a>3bPTH+a1`XYBs_`DOR_n!C;%8DXY)IR+$PSyhi$>!blki+qc;dpkY zQWSGov!$@>NrP4-5ey-Q*_d*HJ{rDqfK{F{3xc{Ym3j-LZhHg1G&BW%H-45i+DQZs*TxF!j82Z6*4 z=a>ZvHY#i+=_K${UUjC*ue6<{2m0WU7lUSf&chYfu*;@U^G;jzf@wqG1cfwt?Bm$( z1xd-C7YQ}X{Vcf@+2;AsW>O?oX)&$PP^ybye+KUP9WJD45S&T0Wwmz0^U+Lt|7Hqy29o!eb46Q{~pl2zzes6J?FAm+2JHsvWe~UBT zcIhwmuJ+t+KN&+D_Z;=(cfjbxMC27ls|j@b0FN)SiQ<6fczy-Z<%p;(0_6kZ9s4^^Q0WVM_P-wAnCp8`!D|u$}_6?W)hmD-O&e$&-s8fPHLw^j z+!L4q3)dO4IAcQ2Ku#6Oh^m$Vuq=Be`BAO>0m;=6?$Ca0A-!5;;eGg5)x&dbQ90q< z(K=~*RJ}erdv>&fsq`RB!n3$39o(iZYk)#T;c@s000Yx@lJu%Gv;Lt=zzfHoJ6N?K zUul(izOWs&63~ee7=-*o7WM^l@(E-pF^JW4LDN8cd{zj}p!;N0`^%yYS?bAi4Q&$^ zcW-75qw+XNmY^)D3{DRuMWugBxW2)t0WZ$4Ztnm_cXtmXX&8 zdpm|w;#pt}a8?`_7}|uyK8>BUq_Qs4c6T`(m0`t*H2c9%N8 z!Sz@lCiQ{LarWx(gZ{h*H3)rfQ;0DO#m$t>KHVfiEDJ#lQUwCcnafvgLT6lr;X0oe7U}=2uH?O7MI3-FfqRZ3(CZwK~xf~&hmOo$L3r?EYfTU$aaL2oD_MVct%&wU61?^X zunMV~-1t$v@TcEE zqwv7pm#tRzrNtuY-4zc7Od$n=D_;$$c6y{@E9hb{O(nbTRmnc!U!V~-n^K)_^sj#Q zJ)VyN6RTC2b}^Z8<733FN7~Fd6eaymiTm60A~E3@ODE3ud7Hl9s#wb9ouq|Pb4U?b zcarArnJxd^m_E<#(OeVhVjt+^p zi{6kBhqtw99vJ%UKML=dn$|FZFQA@Xx$0()&*`!u0CFVjD-Tj(L--vER2*VmZTfK` zcLNgt_Vo`@dpvIQzOt*E26}-7&4HH@FDrg4p|5`8!l-v%IDw-)(EWI=g{u|2R6DEG ziX6|XRlZ1pyoyp-45nAJlW0o*wXgWg%x0R;dC|SG32bF|eNXWK->E5;tUyaMI1m(q zNZjeiMHfOdGGk0>1HyI1%rDY53^$3TLh?t??AlJQ7K|Rmc+XF;tB$SDn8lvD1?D}j zDKJg0(=!Q&6KjXFIR&!p98sdzv*ltyIcwI65t@(@MF*$%&ws22`TV89Ku)JoX$wkp4G?r zHsgv!xH2d7g-<^tH*N(|sCe%oUAOW8sWII&%{aP>;s02Mrn7QISJ}S|8Dw;UZtZs= zQ*J=3UQ^y%m+%^bOvPZwBD!YaFAA{EvEzspdo%EN`L|U%my`~pa>zTN?hSW?*-B#D z@1+xDGpou+LJfKX&>cC|t`hTI4Ouy?WfL{Y0w_}|;-Yv(f-c>M=DsearpA~t$H7+m zTlUQm^4@YM6X-~#wS#~`8KF)kwd?;+>fAqazfk)b>Z(-?w1p}P+`eC*@*>4TX z0O*M^wGfK^2vQUm4E|6zx)it5z(bzQniw<=Abmo>;uhvl;@$r6pD(teows;MxuvoDlI@5>i;03iw4tAGcZuOQbg& z79mQuo@pWOXZ}{-{Ufz5_qiY;I$WP~ZqiUQN zEh>|=!C>&e*~fWKB0A0^D5(pKIIwSlcz9`wb1{v#0L=pe>xL~Gk!dSYL~c&=Rt--& zWg@}_xG2g;KpvJ$Lvu>7_ya5%DsiiaXO>Jt?oWn7Y#Gd4&JJ7JlfJ=O!7;%ipM9uR zR^;51)wU}_K#5GLT9xeWk}vX_7c!j)Whnaa4+37=9GfFLhDk<`Mez}m8*!y=HJje- zlhl2bfvtdo2KnT3moWapdWL~Kk$A2Cmfh*Kx9)}%wO%rgu#=%-baaJ5HQZXN4TSaD zpElb>3?0D*l69@wO0hbkua5&gnm*6b&c%$MNtcaOGaTw*I8Vxt-lgk?JTBSD@st+c)lV1T8r5Wp(HJqN(>(^0^7cv=b#XnNW z@z0tF-Nv5{wk4Y{tmq(2T-nsCFexH?P_h+Huy-Eo+MF#Jh--Q}d6zL5OpZMBQZzy1+?B7q)It6*@#Wx*5`dAq-4yWFH<{u^RmI}~x zzLe`L8o=0fOZ^NuL@Ev}^1X$!#~X+AB8EIDl>eVVghq^yGH$nU53Vtn;l*IQoO0}U z(QWvmm-O>6HGv`L{vcVwk}-ef9>w7?3=a+v-Si@J%{KFd=8w4y2OUsY6iO1Bz7N(v zYrK-kVOONfCvW~(NI3O7cAmBOaRN(Tj#^u(21Y%Sf}{nTUD_T-#Qx^cF?ZS^{}}6c zQF|w1ZSW|VE&xc4ZBP!w*68eG`Jc^L3f^1}syj}%&6hj*I1*zE3|3G*d3nz@8^hsv zAzn2UFVU4Zh(a&JxgkBj0yGaEYsqt-^G`y_zxQmG*3kA@q%F!$6}UT{*6}>F?J!gp zn?k~M)6f-)N5<1@H{^YP1~Xn_Ss=?@FpM{vSp+?upFrWV!B>DMy6l9pfW4yUtdh)N z$HYwA5mU?lj%`L`&hQxSNpc7q>!1zu-uqVj<41jQSk#b{Hshm>Z59SVKz8W^1gVLF zHp8_y*70(KdC^Nc#nRQDXBMW1JJ0>tyu@BkX==6;c5SZZC;a1f{9trqNj%2kA5(xO z+aH*T9#l|kD@^^NkrLd>Pv52&I%&WI@)rS4V8pV}xS0xL8DAtsEFs3KAl$B~QV&vA zPVKSH8VYc>4_38-mYMx?{UhkQ;k0ZYU6I>#k51N zl#ol*$PU2q5WnF8!DrUQu?N_LGjYD(EJ3NED-?k~23|wlYYMOI6-=19+M|+SBrI7f z!jm9cEkw%gI&jr7z0m8nhcadTDvvO_$Quo;i@2Mz1B-UxeAZxQ~nl83T!(%PAyui&FK1ZXN z8(@z=i}7&eM&r%LqSuOKsye;HZlA6oRcwC8G);wA>bczS`F+A|W`@>jBVRy;suu*m z{?RG^3P+Qkfkv2~f1=`PmTEo(Wgg?A2+$-7Xt$it&Zpbq$8<7KBLV{^Y)ed&jP7C1 ziIW-QmqR?xSBFRdCJ5mB+O!7WqQk0cTmRhv2d_n-pB;=ObXf|E#veI-2tXD+rGL;t zKBOkaTjO+!r&KYFFWTTFiFSLMKVc&)N|w6B79F}ZjZ|7!&{X@;{u?d@0%W{4A({Uv z-&TPXxt#O8NL5bHKZo@2SIz@J+9iirGL_1eTrb#ubntu#M>HOW>Q!dn*Do9v2^{>$-EU%hp z&txW+_mJ)@J~{E3T&r}jTO#J_`q27p-D53`WL3k=9wuX6Lx7*j);B{grUGN2SV_uB zYLSuC)k!g#SV>hp-jSaR0*yCtQPNGLIk-ny^0zoag(WELeSSmt6kF<@&ygJ`9pmH* zvUjun)HTZ|6J7;H9^Q0yK5!@-sb-S<|?h`g5GCe*dVqSKyhPuWPEC-^SA zqf}$^XBZ1xMs?LuQ6iQ9u$k}J07dzTo#FEc!9Ej*kZPj9y%Hy%X~kWsBtp?mKaiGy zd*mr3nWa5iy4(3LaTmAAkz;jB08*ZuA)U+}p=suQz}C@(Yi>JN&t1r@HT2sRRFBA5 zR&-$pSj88bel{j=#gNLSchDksPT-ThRi!0uln^J$&Mn?(GTh}wK!dyO5Z6f+vZP1Rn&iRf*v(h(ZjEA32jd8xAYUTQFj zY0qv+qR5PU)e#o=g8Sf60lK)tie}X&2Nn&m5!V!0qAOzZ;y-^^_1$VUl$>iE9)l~r zCOEeW20G4(41$w19I!EM3)UTseZQ+Q-*`z|QcKG%6MB#(+j{xS~ zq$ZGT*^C^mmFY>FSUym5E^>e-yuyUxyu1Z0ENIlbnqMVW)P(TD&nv`d2OMOu>FS^@ znoNc*V?`Sv)-B^`GN_WGNqAzP$v%;Sh&L?y{n+jPjBoBf^Omors6X80H)p^dI3Pi`Tdag*yue6u{)BngUssuGmoRvQ1hnDNfftH;;r> zGn@-Jt3|A~jREYaQ_N`sX+$4nn1>pTVoQu(M-xjZJ#-xQ8Qya^lS;o+H9x%N1}SEQ zmPIi&)i~Y_DEBnRs78;D86-W28~Lh!5u0BT?$zwtjjm9>{{YUesStNgJvt^&r)%;d z_wx^F`p)o2Pl`%rXjG)SOpe^a1NI}ErkgdzdV3fF*0kE$$m_v3L&~O02eeXDSf-yd zw=a-^PfHrA-X*1aUAxkHSF`5AdMM0002216j8fOQ02D0ow*88Y-J(X*E;vVsle35>{4;JCh$p$ zbqw(zF$v3;e}nYZGGk&oQcsygyJ1x`h{JoLUW7fc)LsCJ@S(!tKAqDIYiH-v{b6Mn zU~v2YH4b8^`DF4>Le4h#fhO9YLBqsI7Py;sG57$`ATecyw4T;tyvj`Ub$!vX{7JWh zf1or}Rr|Y#_c|>2gW_V))NZh#6Oy5yh$2_C$Mf7?2rCwP4>0T64cRsU=(X+qeb1dt zB-M0ivRq`MI*v4X?kAzU9bZ>d%!)`J7UqD3egl=zP$nsZlI2$xf|C@Pedenl=ZSGI z4QDdvk*-zBy#A`=UdzwDU_q=(U31 z+U7Y-y_aJMWN}Z+>>ht;<$Vvs!+!H~Dl^-l>sj5sSyIMVGELi@aFHUAlQ_L4J9(P$ zRyX8J>4riy&cohBu$Xa+wGRLmlc*pF)aMQKaY+W>wQ1*9 zx+b{ts>dJlT{D7}*^^vn@QEYlduM2RHmq42mDwTxg?XpW907&HB|<`~{&%9-udjq?;&8 zb)9yAAsp4=Z;Zf)6TP=H-7>JI3JU_;CODNm$7BY8eiH><`3z>n0%OLC^3JjmP5_xU zHJ48)TTg=O1Y6UdDL%A`FrZEMh%Cn}U-2C4iSYYP_L z5Z);kVEiScJ!8|EoQ^bFO^Ovp_v0TOT>5B_LsT89YY7u znvx7c+tP#;V)4$+D2NB|^9{9TOTBHK+KEL3E1cQm(oeiW!kE&h$x9*qe1KNEm$u{E z>SRR%cpUG=NrAM_&FI|(CQVwW@N1N>I2CMvO%*51A6woqlFXHYPljgc8HLz)yoO@x zsR5a=O?hcp{+%Qt&8EA(3pd1TUi=|3fsb)vi^n3p?cbbnJ=EFkJ~2xo8@m}F14Kbs zF{1~ob4iybWi|%%-l}JoT~n?ZFxA(_>!RbQ+xl`AohEgq6C>`P)>u9J{pONv2dF1!`PUnLrlGQ0ZfGDyK|}PvnmEnCz~m++G>S-4!S0|vRrnQ zk((2T)1SSY=OKG>3>+kyc8|1^T5^jvXyb$7mRlcHPo3|e5Sc2ZIdR5zUI|X3$l-DF zxEUule=i{y68Zo?>vf;DZ9X(^juB2jnYJZaRlS&n`Yy8+)eW?v<0N{3RWN?TS6FvY zmCSvx!J8}+5n~1E+@%85g|2RLLF+WC$v@@yI7tqljA2Kfaf94xebiXYWE%7%8cf$_ zpMte$;3!@8W&|NAb<^1RPNv2$74a&1YR(y4NYqu=;z;)O(hF@NwVn8}YAx`_?F?o7 z8uUhS--;ZTbG)&+vAurFe-zSV0|>$Q4zJ3^30&Fp8VmV@Nc8s9zpr|2n~jQx;AETS zYBjy+oc!+eTGB4SrkFj1*coGF^>Z;6Pi)F$?JXC za*LC~&Cl2ARBmt5`-;-#Ka0Y)BLviqL>BZa1I!+A*>>y@jDAY4ZVR~um`{b21?@{R z6$|~NT#MOA825?qvpMkmypf5 zYdUzib^xfNFPWvF=+Hti>{fhJ9LL#d$7^erYKu6>pTEy9hN~O2#f*V=TNZD6xDR-6*&^mqxxOc8#F2)(Gc7jjwC-v#w2{A6Igi z{Vnn@bFqbu5QhM#0jr04Ac$G0{;H}~2k>e5GRVvtosG(c5sygH-iO(J$MUTtVZ>nY zIWS-JmEdu83)kfj=U`$`hSh=v(NOoNUe`Hf!@6~`(DRHb6VM?|R;Tm)KFvQqq)M`y zjtICkz$V@5Mm@dBP4A^|YD|h)o%y0{q#Z9+)2rRl&H5V7_``B|1=N!6P7K+UJ7UTo zw2RW=d_m{Zk|!kf=MI-~yh8sTq-R`h-1HwdN6=k8c{WV%bqFe$sh@^~|?g_`9DMelQuUdrSekjo&za86jh#!5{hzyyFSVrm-gEoYkWV&FkL)Bo;%l*|Y zCylS(^KEW!Aj^y|Csj*Jq_LM|o3Llv3gum_ZIAl{Y+`36|bx#06rM^(^ zlpNm>ea5;myeGGzb3G*}ZfG#_9MH2nT52#kzzd`sI(U}-K?+XP%~JxJ)99f%hB(J2 zzJO$c^MxWEUN-JFTnp@vjg1(BO%ESP8t*ik(ubtsLysDz-2yp$6sV=Nb7}qt_tG_f zMOVVl@4{LeVE~8JNI#RZz7k1@uVurO-!2yBOY{ z%j_NHKH8{1kEC4R8o$fJ!%$+ZxqcXT$FHD?X!X$o-&s_H{E`)Zn#~XU!0IasJ4YM1{id);{OAvFOd{in;dfU>$fcnv zC~rmJz7WjSD|XseT-l1K9ogv=A}$qlJhFUp4qKPsW(=utc3u5b{9huixV5#e(%$-W z|81+!Ni}T`Yvtheg!K<7ju$&afQ_H*LJgnc5RJ;+SN#`0>3?+6NwvIIHmf|ryyvB%S})wof_sv zA(+6gC0(pCY+UogvnNhxqC2X^dTgJdqiHVBh70o@TxyVq?*~o%W^b`!A_3Ie!gZ-0 zHoOn!NSEfv0GTZ|HK3vos`h;0JSrcDIOCx@MAd-bv`1TuB-&~kay;D#yPqGNBCsRm5U%s3T&imX0&H|X{DFN72AV7Ikj$Q^jA(l=7FgTg!Bq8`DtGks zOWbFCPO|NLf=a4G$K=Z^_|N+Fa+D&QN-WQUyYDRVe>PdT25vZYug#-)StK%;u?LuK z)4eU}5rwzsm2^WVr`>mDZWc7ps;WN0qolS#Vl17)NzI&Np(~_4f8oM2A#HqI>-mue zcB$qnz0QUE4X|asHEw`{Dml3Zd7qv;D-BJGDW47V<^d6lf_;*{iz z%GYUc?-!XLkPpflT{gM##&6V_>}Gtq^R>zUu3l?D^@UH4nuYZ*y=VA%0Xw75`U91P;S5Qnkgb~3BxiX-9;f`v7^>AhF;fK zkV$O4!tps#cA2I1s~>A^43Ilxd_(6JXesCsOcr+1z^6D4gejc)l@K343AtCZxe^%{ z$T|1~)d~LHOWnOY`(z(9MFiVh?LzO!A?UP~-Cz|?Qn_$YuQ}dm$kDCom1%j&Oqwz% zxR94*u3}raqU#!lk($ zhHSP1geh43&2dclZrhpJOg84Ks^V$c$BSebl<-S$JaOyk!n0b!Qf>@b)pcqT0AS@L ziYrErg@XPFLR89-8p1wGucJ}a6n4U6p21@|=LO)Ej0iFSjY^dHB~W}wDwLXij1=dFbSk zlv^mUudk|Ja7-SEzMuiC%GoMiPaXe1BYMM1nlx?}Y8*;N5**K9GB_z_Yo6J0RBc~o zLp|!7$c+C4O_w%TkdluSp7JN(Q^>#uu4H=7#pzgs(QGB9lF;6Q&YYdcx07ypS#HcH zp1U!UaOB~jDW0l>FblUt=7l$P8W_JGKMGvP=+=&Z!-ss5B(1!Sx8t6>V*C9@y3WgY z5^Ul%I*`iOxyjHuWd942jG+g^(DbDm>V$35hV%JGUAu6w~a4 ztM#*4zlCbXq`vZK3Nkz&RHSV<#f`0o5yZE!PV?&0NvuZJ$+f1bdJ}^Se8)mKS|Vut z0MH}{>ESQP&tngjA4J9*u+buqM2_qk_c(pJv4419`ZJr~SOFQK{oItw8VX4!lgDEM zYf?d+-DJyHl9!^9C3m|yN_0I0L~k7?Er9CIP>R z<5UfsXoIx=E+jx=!a7m*({&|s+olZ2HvseEONN+&&iu(OHc0{h5}|}~=}H`eb>)?8 z_*|5zv7{d_N&*WsrzJ&S*agYL(dx=qt}_Ra_t)u^-F)y|rpY8RS+%5`HHmZgMSeE7 z35WIEdVb4iFd!coD7VM|OGJV*fULSTJ1__R32#zG?SBOdBq)Il@ucXD{VV^(?=q7y zsx`f!cTOP=r1}(dZHY35@#O*RXLxo#fuR@i_^rv67j#s3+HA{(;o1QK(6qO_lzN*B zPD4ct%h>y`IYafH^p5GCR>a(y5~T@>F^PBBC9tvv(zJn+SLpf}q)PVpy4S3aB~U(S z*q@=(>vF(5-HqEENG@Sg*kl@1*Wt9Q#Ky#|mG1yXYznIF(l!;4M|VSpKq+Am+CMbt zC9hQS)+POo+4-NOzIj#OmeNe|+U{J)TH_G0#k}MF#l!^pEJ2Bi?)jAu>$ZaKS(Gf@ zs=}3JSA;J9{3p|{gi3dI)Mx`DH_6!VHf$*n-W(x!+Qfo#mgs)kHh86Q(igT1R=1on zoXzl%{#E4n%l!fKG;@BtJheaUv1j`MJCvM`9S5)$5A{UAfK?V{w*Fi*p{WUE%AF|n&AU7Xp> z@OOWd9hkp2YK3NQ*NbxrZRZ)l7`9V=)N33gc_M0T^d!V&*^=Gf{{wUKtF>`>C~@f> zRu%X%rbv&`Rlw8rkMxC4XeD(g6e=Ra3^r$=LD;POqqrX!sf;RMJ;Sw960a%(Hb<_^xEUTw@)!;#zeg@$U>LXAvUq44M#%O=} zQnR<)SkD3rP&;=F*_IzXAxJLj6&T>|uvfGHIe_xu%_PaW_f-3#7;ODL& zFfSIpNf{-})TI|rJsf^dgUjnG`S71vD~fjkYy1R(*CVND^G|8o-$eRb5`Sj*+nI4s zc`9$@_K$7A9TWKJt=_c=e9pA1S(;G-KI|&Ayb$-q87IQP%G1Bt9u>;TxB;Km7ykdyCw_P8qy0Pc#GF zwIE}Rr&4UDll`{P<1EOF4Fn4g52+}!e~JG^f-Ug6B4PRf=6S3tSM@fI7l?u+R>M9K zF&$F5`0?)*9)?Js6&KXt64aq8xH0il17i4b9>sHSJxD5T-NFs(5+uu{{};I)K|E$q zo+;ky&vZIH0+M=451F$mJzTM;S*S_8SP~G#(Fxas{79Rs8CmsyT9fj+J1s>D}3hI-gCCz`~!ubk~Fme-*{E%6QqYKP1_1(k$N<4i!OI8&z*UfZF#;Ylmft);&dQ6L}eHjjd~ zdF#5Zo?E>ESOR*T3`>L_4IZHF$=`m6bx~qVA+~9j-JcK?n0xs4R?4D?y!H(jh_^2O z`E#WI^akn-Gd<|UwSnzJi%9)md06w=4^8Wx4`NCdlyhpV+k2A60}q~`_l?3uso~fB z9%g7L@kpcp(CGAh;5dajgu>Ko8HSoDk)RkRbFpz|U~YNuGRBaQloKbZ#1Bn7mtgktoh+^Ze zs{~{eF?@vF7IC2Z z`|%_p=kG z%q`F-!!~I9!n|mDf(g)CEsz(%gJk4Z@SS_cR%3HxAiG+nQoK>cn81^(OXgp( z`AI7{M~(kYts%mm*7SWt752(`31vmQWZV;96bBy}*@?yE2@cdhtEjdosXj4xE`(L& ziWhKf$Mvo1|Q3n7Qw>S=xLTx(-G-S?O=y7&ychHvpfA_dgAzo!%4*mVVVfuVYz7Ebpz9PJ79 z&ptX9k)%L8AJ*z>s{H8R{FRIqZ=}r=ZX21S(5^2u6(mS`a9L|+-dno!-L`77yyj9J zJ>3X~=b?*shGhrpD%&tg`WoEl6jxW-7l_68eZR*aZ0YXV&8$ajH|&h%`*)%YD#QZk z6XZV;QNDb{?qnC;IoCdW-h3Vez~Sj!S#--#60#*J6NOea90(f##FhViRJ4eIy-e<7 ziVU8b_cDLm%SR+@7}R&On;~%1s)Fg`lcl1<EL zGabK+k;zcna|v&9;%+U1Tg|UXad-V7i*fwrp$7>4edp-8J#eR)L=Rqn^EQrQ4wG_e zzI%WpxOaRjQ2!^(1thrTVvskz7X#4Q7=D{6?Ij;=K z*Z7omMzG})k}Cma;(CcDU3J!^2#WT++WV0S9OOPg=oh~`J~TdaWj&i`4VcH$1ry=Y zGGYZYZ+gJ-n2&tz^hK*{pPB7h8wVp8W1 zhui3C>1P7ID+Iig@si;pSj0E7G_{5BXhAH4y^_(O9Vhm^jGTy3B0mhFlUgu?=vyfJ!bYD?DtmS#yPtQtIUm-AtIy<;%Zgqvw zE{k+rvV7C!SaLD2#KO$Q8iX}xX;7U#Ysr0my;K+d5adUp)!muXlx`_yI{OT>&BWl> z$h4ho!MF)+-`U6qLK?b2ZN^d@_m$Ld+GJ8EpB4`LVuO9lGA_t9^J6tYPo<~Yt2itIt%&fQ?qFg?!CGk?lQwuw z-_ANtk4k3|SyKJl`67F4Ky8E}RUe5L{2V=abp%bWYO69m0|3C!u{>(o;dj<55ildja^~Zw zw*y07e&}T^%LL!X8}~FAG^p)7EO+=aOSU&c5>E(?2mS2hnZAx_*jv_JN<+{F22Lh*EP;#;8fop#uzz2U+sD;QvkFORM)vP$6a_OkAV& z_WvQCn2{b@ghU+&5&Q{3T$K?B9%d2oB)XHH1nUK{gw)RMc(o+-p_|;6X^=kXw`PyO z7J}{9^i3^?&%P{6oR5$0Cnb?6s2#2eRyI;uuTR9O$9YHA5-uTVrdB9LH(7ZHR z#OF&QuE|(Kb#a%SP1`UcLA$Zr+%b*~y@ZYy(q9oAG*26*kHUyp75a6@3tPIS?hQPe znNrX~&K9BOLM^cA{&knGwp>)908+4W>a?RVeQ!{_GMl}Ncrc0OmnyO3H($KSakg_x z1`GgeieKIrT$0A~)sac_l}pQ}W(C!K@Rz@+o}iHn@LPacnA?Cto#Lfu;~Z;uZ;?|^CidMk zANEgi1JQ+`jw1#_?6^kgZr6_ogP$?IgI?HYZd= zxMY(`b*DiH=^g9OLCcqQPYPJSdMhO$AdbWrfs%4JaiI0aC>-0`o1VwyQDBN?>Yr-H zbIX(yBYVEa)gJRF{`jU^Hjl{ko=K`oA9An{YbyKW)u*#)9fguQeF=!C6G?CBihm9U z!TsBa;tcxn2;KP7fOI)L@Ri$6iwf}$R^>-Bb-Y+bq))&PU+-LYbvj@qD#YBZhhm8D)7c*;V4QG0US(;Hr;;#^dbk{JvuQ`{Rh)VR>1Ku-cH``rMvzuzw z6kdTw2YhB`yOTtS?f57nf=H_u8dl6B&Knw1SqFoeCbqm}9zrwmwcy?+$T+61Y%~zF z3ux!o)6Ue@mq2ge3!@TsQWTa6nx%>5{b$(ofWgpGPbG6MtaLmxqu67RdT;LHL?;vy zKVTtc5S=(q6sN9ApW>=?1$5F#Cl(fAJE+97OFOQyTVytlw4^Uys?& zFna8Wyyq0tmBps*?U{H+OGf7|)72gdJVNgr6L!pL>UMr17pcwXAI{7t7C(uKYXR62 zYfs0Ygx=P?VNMkD;ul!@&R)fvwK<6k|8T0yJF{f5k+&*84*_ehH_K9cx@WhTL1p;- zfb$K#N&%r{RP&TkCH6H;F7m-b8}+;Q;`4BtOzt5FWI;6_k{QMewCaNupNDcC_R5fS zvgc~|^Vy1-_g4|5P#G8=emdId=Hb_=U%4iP>x4I!5GpQIZtdg_gZ&bgxHV0@=>SxJs@JYh9w9%BAcveku`YCS=N?jv{GZ!-9tttX&tSd*>K~{`dx8iZ1Q@Y zdmeSH#Y~;Iy%9qFa%B0F#!ueJ($jK`Wbj1a^~-5{;grAhq711$;*==y_$5;s3)UBT zY=1)vUCYUqh6LxECVVsDcA1=%T$!B`-_*voe%?X4NXSn?=|Jw-!JnTTNufhr+)RTh$OTU7j$~<`i64pr)a~kBlzKQb9lFJ=Co*sbZ9JTJV6$L$T{(Xz2z!dU!gy%$&*GqEW2F9ekvk z6SOqJ)!5&!ug#D0?J>9zj=fh6M*O_+%=>nd=KjyM&MJaBTajJI{?d*zY)4tc6TwBH z&3oaCQ-K=xk3DRv!)NFLFUS^UUEwrVu(?QS(tAU}$J7~Y0Mh)@cImO=ZZc26wMt*s(q~GR!ByO<=wJ$c2Wl$HtXk zssWEL&d9;kDrs~jGQLa1XrQFjcr*aG+dRrH<;IVEnbQR9Yq1^b&&4Z`F34N3(vwH@ ze^EVlJ2q9r-Hy%{ZViI?5BKs)2&G|m($s#-a#R`JPDIl|NtW6;w4(kO0HU<6R+ILd zJ)E&>kzYHZreKrY6r54Oap6KP=^9tU`OHD>W2-UCPld>}cE$5Ip^_uU8yV$hJ80Ex z99mX!iRN!$g91xPrv2h)XI-N6q`+m0-XXe&(S!!4oaA)gJq+kGVRq;`O~a)YsiK5g zHH;~^%s!|Iz@$v7e1;jC|G0It5LO5R+?E6Pi!zq-W3F%BOx&HE(3rglxWQ3GK=O5E z)ErA>aME>iGwTOwy@n$Cy}rm+Mk`~)tkM(5LIT#WdP3S4Ms-}tw`DLf-lG@4n3yB@ zZaWAICOv4BO{Mk*>ryug-E<&zBiz17lO=*a{33Q^J6+{#69oY3Z2(O&^b%g5a02{f zsfLtN=9x2+3=O&ofN+;OM_4#EwrXk&xZ(Ir9wveWY+Ra=21w53(3*Nts;6oN4Ahb* zuwiWF+G>1E44$#1c(I)Eetd&nmeSb1f$*ZE=XjT>h!r^Ls3YLY}AM@(93qAOnL;KbE)i;{!5~pn5EX z`+73x3d$m{wh4BYk}%;o@mO_rV*9vr!Km!_G3diQCl)jIbVL{AGy=rK%87ZWANn@+ z#WGm!q(p*}RX=axkl|auAtpNXD{Cvt!*bU5gIjunMPm45a)0Rn^$DTDyC-v`TzFZ+ zwqk03=?U@LAW>FV7~iXi@he~Qa=bLZKGh+|^g1JI+saB}!sqYMsTkkM^Le^?=nD=0 z>h&*DR$5HQPEmbq@Oi^ZpP~-e1Qe2FaPnyak>x%_;DMk-p%?w-YAFu4efyW!oN*sW zFe^tZQjBl@m?~oqgu?K}7SYU!Vtkk_uZR%!&*m*m+RQ5|`S5x6{+A!g@?TlTYD;&iyXsPaOpSvNDvxdI92P-RbtJIB2ge(iyKdzmegXG-UTn! z1Bg8#_H#_-dpBf!!23>G1pdEeL51};V=&Ut@V(6?ZwA&>TW$DUV=Z53<@PS|!Rb+s zf^9U*Ed;NoZ-H|Fc~F%%^!LRRr_-Fs?JhN}PPLp3h)1(C?s_gpnvI!!L-87ehfm-U z$pVP&Y1ud#3!tGK5Ry;Azk|AAsuN8b-eqXM|Zuj z0E_qf+7E-$S5HGyoFt6*t8EFGMRgxbv%vU|lyARtOcPE;J@BqHS-=Z9)mFGJ-x3o9 zU%l$Ud)79F-$n0!wSVg0ALt2bH+R}GQ;d#cyj5Furr9L#b|uc{wZ%yWU|tZ;$SS{n>|#aF-_bRz~K=5(?Id5p{Ar^>AFm6Ylv z?89cn6@2e!^KMbY99&mLI{@!A4F1ANpy#vRW1JNC9l(wRY?zwIxoJ2c?|>d`gFt-G zM?@)()fWyS9AFX>E`3lddEysZ`qS;0#eS@}^ik3H)u#>RTDi{FxDGnpu#&W)V<_FT zX?qoQVm(2{PRGRJ$HZT}_n$Jp+MW7f>MB};hs#BDt@Ri29cdluHYW6&GqN=w|dT$o6^cRD!=5*}N_v6$1{Y!`7tQNKXqw|5r8DNAx zupkzET<#JJ0mWl0-Lz=B9>r*8GR*_5TgwYh_jzI}sLfxGpA(M#{afz6#8~C?cb`Aw z^tx=)DOXw%s(Zc2vmOVHB>84rNJQ)@7EGE)pC2*TR$XqiTk%Tdf z+<<87Z^JVGWWSttBL&wzyh=hF}1V+7iVo{lN9SYJ{Y0*Ek`p*iq`QL)1(( zMRjD$h05*CW+WS*j8h335Vs2yT@evpQRs@Sp7jH7Xa8dj`${8yQB_`b!H*z*PTRs^ zT}z7c&RLkM4+F0>{M6RHbVpQEO36_tzCdykmxJzgPYI9UG9= zJvh?d!+lt_wEIarVqanhji5yRVz=p?Th`=0-W7OpZcCY3(J|qtpvRTjsw2QA@@=%p z?ffcmO$q&shN#xg%|pj~b-v0U#17ZDkdv(4N1kjdkg5=qC6oqo>(FFW^?-iSrxT`U zr{U9yt$oSJU=n$E=gaWqAM!8k5WME;!b+I!1*6M%=sm^b+)rYIviZ83?7)Q-%~6zI z$R2jFZFLhLRergon2S8+D9n~X_~Wj!jT#SNk*|w^(Gb@z zAPj1Y2A+Q6L~9xx``joV+*hpDWXn2;rFP*$tm1;1WGi^$M!HTi^-zQ1ud0ka%5>KC z@+#Q#9t~ht?GFjU2i{Ow@8C#9>rYyCKLYTwkZ18ZGY|u_v&f@i9e9$a4sC}rR5-i{ z1A77}`vuRwFX6GIeQ0cBSbQM|JpkhXqp|^BH>o>eZs8q>1%!;Hi}d&uFvL^F`Ou)& zmuMWkReudT4(j08t$JIylB!#?^hi!;x6$k?!kT(*jrZ5$(3PC|VnPS?=@Isc3P(~% z?45>^8Ih{@;;L;rsY`D!)05kYAleSwa*zE zXk4xJIst~X^Ej55c4ttcC<~6G(6llVPkU<9xP(WhmZoL`o}tfwOZ&r;{bV0r-x+OC z5lNM8p*(tN;h&hFeW)iRjEzWs7o&XxD9%Hr7*#y^b{z-mJ8cRgNc~?}0}j{coflPB za7CzcTnu)Ig_}$y2UQEO3cq z?~9$maR0`_jdC@IH6q-_FA~;y`FG+O1JLy&$BgaWB~Ivm3W&{Pu&=0*V6SvF#-~0% zLVw-@gxvfLQlT2NFL}^nRTew$vPYVgTRn*E-MN{^1UQqofSmw@;F*+(CAPo+OWQwHGd)%@+0NoHxLhHI{|~0L#sGMUXZ}=`)EP~ zYj*|=qDv@yGZAbX#7VgVPwz_^M~yptH3fbS09)Z-v?j4AbY>>QL=lqULX)}pEItFZ z@y1W_RL|PnU^n}HrF)IoF$!AJcS-kX%P;Ls2S9e3Wk-nd$MoFtX|bJ$YWZ!^)pbpD zweQTns`dRq$JZe?>Frj}!FIJ$&Z#oCCtz=y=sG~tWLkLW4Fw8jE@gt2N7nNY0=~RY z-(IqKT`~Ez-Vbrf`85I_ngECop|~JOCqV5lKoJOrthaK$<6{wEawZnk>TwKpt)m|I zIieK_SUX2B0jY!7qGb0aeR9ZNZFL* z->)39Xd@ruGkDB~w)zpt*UZs5{q|uGsgR8%i|ZER4bmd~M2`ifD3-=ol9ncs&IeeE zLrxoxewq;ElQ<}?+MU&}%gGGGlYosq#x`H}vN8>(o<=d>$dQ3QOW%|3wccAb#TO8q zD5@5Qg)w5%5ba2$WKZoli?{E@r~~VPQadt{TpQWHF8{u^Gb@Pgq1Pg3QAPXEtLUGU z8$^+Brh&manM$N%bZZNhUn{2c&!Pe7MnqvE-;75tCm=fdvrxvEnhYusaQ|~in3Dj- z0d1lB28Qg1i%s30lqbOtVAN}G0D7tCS^vIXFwva$D5AAuhS3RPCW}DSs(oF!0JE`< z4-rUytEyxK(mZ%(VW5i-C5!eg>x!VVVZ`8xt;UY7c4wywU=dD%N z0CEO_SC;jr;cFAyz9anPdDs)L+-xMD4y23IPq8xvtn3#wtlAjr)-%1_~Sh{n<@PfQ$uQ&}4 zJI$u}wTiOXj!lVmh2W;{6*9>Vn7KkmpER8*3Kto-y0tdED;6xXqCC<|g>y9q6@m8O zl43#sncKBX<4~cuRXxF@C?I;d21P>U!3Ok(&y~%&xxujdbFQfov#W(Rqp6muuRfOo z9al6dubXfG=s=1Jn=qzbkLov(7S8d(B&PEaAqhmvqMj;vwedz)8>>Ri0zN;0Y3$nss0jmqU(mWc_k}yCe;JOg zb8-pB!L4Ud4n&v0jENDmpnr5fWvmX(CMQY&S#_L zq+$0YY~Ou zs}Dyd5K}0Jbu**{FV(-|ei%7UbiAH@L~9l{EHX>|JVULLQLA~n7pQ7->lNF<*sN~( zW4?9-kskN@7G-|P+M7<-p7b!nV3T)g6hBChkt6TAJJC1M z{M{{WLOOKP4&}{MXMWk_#ZRM&XyM*T>C(?~Ir1t#BU0cRY6g@YzIC1e6ZES%$1%!m z2${s29o7rA9=zi9j7pnItb=cq_r+}MD69YL{FB-zO!nAJWbBf}QG1;ykk_JER#L|w z#UJeq7cfJQ?TTeS>si_bE|g&lA~)O(qhLL{hkq_~(Ht>+ZX2-n?*DUSQG6wK?-}Jh z=XcZ?(->H9!0lss11m$HxV zGRJ!419I&h8Z#WtT*N)8)Y2F;jx+4NW9f~)yVpH)y?(@^y2HF--plVb8Lc6xT-{6p zjApEnN&3yf+|^ChJfOHBPcnoQC%JSn z+43ZLP~JNEzpS`I2L&@Y1Ne_dKBYH6-%axdq?2ilKpM?(BEaQCmlaz0eWoSB!pUzr z%fDn0zrMEv%WZ(El0`&(RLzG(OJM>VLd7a+PhbOs(~)~3;s1H?z4@vYV?Op7`$Y5c zW#yjvnUNvZA7&kj9OR7D#yg0N1le>vj}c`M8;h?G?uj^Ywj1IN_h5Up$~M^CPp+(F zW6ng!ZR&M1Ta`z!UnXR?!@@zBOkIk`U{6KQ*N^F74C-oi;`;%|c^tB;UWmvE&%M!+ z?^zSdh9z0^S0M;$9Fd6f7j)c+tQE!77IB&OgaOuY|kBV0kM*Ii|?G+{Y=;ZG4YM|DEyrBE2^=CYKov~aq2|c_S`&-b#z@+i|G#b4d3g!K9aA9cxviE0@W`@C4RbT2GZ`g%D-xHl zMKdG8oHWNaumJRPh~9@*ua$Lhqem!`!QS?NSQy~9%aOq^&ORt^R@@*Qi|@jC+|n*Z zUQ^~#?SF(RR93SN&^>1ghC;#p3*BOiCpH^$aaS5~J}FudCmD8s&Kv;WeN501uz|Ms zmKm(0lK0;hFs{T83la=i$G8rbm-aQl(*)k)ET38ND3Yzx_)sK?tHCL_n-WNU$*)j4 z;f2>E;BKj7C%Q!^du{tW0W@WmLMp8rX98kVywK==Pd(}}+`~c-D)KTo^rD9v8U|s; zYga`}_Q`k&(qH>+Jglp?kQ?B)0BZ9mHl9N1%`^9C%jmz{fkrx&$G<=dA`C z99ABdwv-^X~6OZbEUwJ^x0}pA>j1VFf$x1gAF64s((Wmc{N&;;Q`E5RD zCLdT=)D-yz5{%zxVo}KTVkB(fwDFe_!H}HYvm7mMo>!20S}ph}m0=yqy|KpCV&g6}g$m31vGJcX=cRIQI$x7ve9 zq}MWS(e?Mcf!H1WEl>NEfW=)@@~%1Jxj7z93a1H1vb&BmKC{zdVN|^p!W{($+C7vs z?49n)f@e#Mj_FX2A3ExhrH(Zul)>StC&>$SP29jc#ryC{(4d$$3+hL= z9x06?{=*nj)+xb5wFI~|7R9X5xLL^hXy(?HeQ6ME+b>1S8YM7pPzLi*Wohm)*+?~$ z2<5Y|Tko*+Pnwjtz4M4XCWDJ0iJ2YSFnkoN1K-p{{S{^H#jq~tbuXb8iT>j#;Ja*k z>%gkT3bI}igZ3?KGc^8pXZ*&^$K7yfgWiV=hy`J>zTL#x z%7isE;!AZs98VUrl*s16I_)tBOpt3&?0qsORX7~Ru6rgaJN>~}okIWXxRVQvz=qf& zQ;FLxvH)Jnx7hx}7XdTR_5qxM`o@~nRJ{*8y{6i2&!S0yXfSkfA9PLLB zhp`@X6pLBsSZ?N-Zs#BMb|`{2i6zz%%n@jc7*`@jWq$m_&D$@?pDf?ETOfPgQcfK^ z6y%~uc$Ag4ND-;;lh@=0b(SvuM$~?^FC+8o;?NF{-7YG{o)7r{+h4VHGqjqm5ezQm zAb84iMjIvOpx~@+Et3sQTx-0EnxS0@cg;97`@KkwIjJNslDI)tQN&#xRGyvuLGFgJ z4Pn34UNoPbpUSNEU8Z|JhLkp_dU)EMQ@XW|x7zs$!y8D}Ga&m~1RAgru{Gcz!X z4zQR}#5j~fB#s|iJQ$fj@Kw^C`WUhOrec4>kc+Xok-=^`_cHhBtA^(bku6G6^`ONH z@2xUjl=dZ;*3?s*iMkL4#&#+L9I;qeSzVi?Ku=}JlPHA?N0c{G^!7fs3~62vDSegH zuvukfV?#)Nj*56mJSV91sZ`E1xNJb~o7!*q4<;NQP)C&xba}m<#?tv@h~6OqE+d86 zLVH;*cNaxd#lyB$`?;J^N99wy4PYpQp8+)S8hL@>b}>g<2n_o*VggxgCiG#lpdsa}zOD-*G&_=2()6Ph7>*yc0@5c}>P0yGA z+BMjp-I*OjjiK$E;mpYZDsqHoO6|oL~*jgnBpOviR$cSG*>k@k#gnG zJ?mv5D}23x!12J`=N2B{GROxEt&ioGn?u7vq)_g2APygnq(cTHqsHsbi+?;*wc%rN zvqz>)`X&oOObulk`~B$MWICk{a}3ys--hQ5$_kGoCz8(@{YAEX{p@Q6ws=2OZL^S|Q!?>0`7%U#mr1RH0`(zBJV}NV z6xW{A@e{<{*tEiGC)U##_`F9`MS2wvM9GvU67&;F-2itve7~#XIqyzvk&38toJR&m z+xSVbv(v&tQ)Mz}f(_9h=~@Xx@CU-b(ORO?W|f{0n!(38SZET^O*iWxj) z_E&895LY=Mu#u~mz}s*cY;ob5_&w#!qAPk^OxA_`nVNaBDyY6%`tFoB)MEaVxe>;V z2KF8(H?Q$&X`X{Q$VT;QBkXs{$9Pp@b_HC$Oex-|z@*W953k+g)by24aQs7p5*X)D z+N;Hsd}_M`HFT5$6u*yot5cx@PAD&W$R_Xj+@ARbU6MS8-8Gv)=7DXOaFOZUnOZvU z<{cAL?0~$gHM2m;WPCvx>6dP=^-e`moG=#cteZS`1V~1KO&4wAmvk95hC*7P39;?1 zarzLXZugbix5^oEAJK@u=Oe>(JP_Nm){(p6 z3fET?ZsHRHoIYZX8XReQBV}(40^} zvcfl&j6F41X`Gl}FDpDua>>4Zs2>CWs4w75f0*6{*c$etaCvg=av^kS$4*1n zjx3)(v{Eb~_zp?Yds?>u>isWUp^KHjKC;L1s=91xIUuw{mNdQsl-^q(#HH^!Yn{G2 zf_?`_-hUt}C@F?z{B*-R!~_OZ9S+nr?QcjrI*MOJ%6|g|%G6R&= z`eyXt8@1QTarW8PLCvlD7p$VOC?0IOUmhUsGk9tSD@G6b8JF1^VP6XdV)QZe!dK9H zv_@~GWxwG^Y|4!^|M9#*K6p5q7zc6MsWV-A_UZ~QhnaU;htVl5O)-bcGuMa4KHLua z$BG%tNl1wtWkx0sJ*kAKcm^Pw?_{Yh<}{c9hZ{9KOSHt|pYO7-40$FqM{EyRN+tpe zAq7ad;*_C6;`yeF4m_}4wrZP6-aou@RC$~6(ttW{oLg(CpMgSc2z58)qv$@nP&Q`4 zUk5U={1oeT_B7af2Fc8*{V(a}bR=r(@s+^St2Eg;ac#HczG1QiglRtKaA__b5zAj* zJF=gLkW|;-a%@l$!STFdh0vEe2XJ1$f*l}3r!sQrGNd(qBl~qYPvxGs<`Z9NlKvu~Vw$rgm>;&!Q7xdAHBy zHW*T)tr|KVoL~1){{&V%A}e)%^WBae7!jI0-E{B{du_PPa>4)5@{oN4+krOovjAI!j;MsWllP!yOwi zk_0uBAcmDGZDi6j1Qe0)OV+R!^jLnkYcq}za>j3f~D74T^ET57?PF*87W+#E? zm@;ljXT4$^$Xgdb3}$$PP2H~-iQxoIj0UKM0T!q-g_^RG;pAA`JBkg*hFhlSJ3yeA zPHzrho}Vn}<~ByuLl8Q{e7GHP1?-BdV-iDes-#3G4HExDn|F7vFNwX=f}h-s$qfGR zys^dc=6_$xa+;Dvf~I54;7W-Hnbk&|G<+T|IOor-yMQb5B}0WJF}ku4V&S}(C{MYq!FM#_ymVq z(RyUO4}!)}HCr*e>}%(@J?uS($G;cwI$i$(DS~U4IYb2@I}N=HH_Cqo4?SLgWZpgY zm8hIvQjmQV-*OC&6};JXu;HQK*5#vte!-h0MC3V)L;a_Yvdn$+61snob4X>{ z1SvO4+NRny#ioN|#?NF0zm=0p_N1TCF@#ocr}<oH6M}#0qaz*tdmkSDk+(@@08KNM8f6HnthH|DB_1wX+blj7^T8qCK=( zpG!=h{V~p{0X#6lCcYpJ$w%(!f^ira0fD)F+k9x*_D|uVO%76ea@977x(Jv;#^tHq z<-sawmHes7ay$)AMCvPd-m3Z+$O!GpnMO?)7xIf@YX8Ka4M|QFlv;3idYLVaDBYHw#ByEE*xBNDPjMW< zq{RlEKA_}zHc_eqi}DWx!n1}G!pY8ywuWK22A>OP`AzbCfs)d|>P2hB5)QEk#Vhpx zCzL2nKs+WA#EyitnHXO^41hq;5ODbsAnOk>DfPv)I^00&X)UBCj{(fCBCUknO7L(p zdu+oc?Q;51M{T-Bj*8`z#nCrxj0g-8F-JL~+JHhn=X&{=V?Z4o`4 z5MqhJf2Ienc@>tshfTQ)Bht^#nL^=>yqG#<5 z!1VJ50R z*_?L*$hk>{>V-4KKzSVo=RE1NiF(r48!S3qb*Q!XiXmGiplF`5RA={!euFc$E~}qc zb6T*`g+tfup;ZvH6_H*DzE?7;EukCQSEMDzy7G_pm*}Kmg%t_PqwS zSSe66H)4C1? z(wo~~zoms{%-~bov!@=5pweNQg%pdfW2=?anJ)#0gb#E$>Q0xkTfUALf6+Eu%Df8$ z>TdX|;OY2iAOae-bw29}mWMQ?%HjH}U&^16n?)fStonMB(xhe|9H|VRF%#?~ z^T$jXkQSkeIus?X2%fbGjjcew3WiYUn+?`COhdoM2(VLZ7sWmu(4b+at|22)Qbu%` zm?f#~k)=!s>p#mK$(_5YK*F?mRYS!T+^-B_J1W**YlJu(H!o2KVS(eY3bz|qEhKB} zfN(8?M&fZhBhU-eof9#>8<{6?Q%){Mk$!n-S{P1i3gSOP2e;Wme#Y{G8-e#sXcx#O zUAbEXUI0_Q{b-JzzDf4wAVUNjGX)RZm@~uRv+4czuFuG3n;`U(OPzBX%&*bu-nfdQ zU#G4K(DBCVwO=petv^`BsnR5rz8aljKHpR@>Oq*8Imjb z#m)j0E|xq==P)n&7s?l(%Xzrz=!4h1Uleaz6pTIUZte|U=M~=GqKabNa!B%Yle=Mf z{>16i;IfBdDuUEj`6igf&lhC2o)!osX$dCEh4`Mw2A%fpj}v{|iXQ_2CilD!=0-da z4o5L!F}Q+62_bw)%KB|@?`Gy=m(B_(nLvD@q->4OEZ6^I;P(ffn5Th z?b`SZ!4d8NsE*e#b=~8&)I0_2#Y2qMKCxw+V-^*?y-BUZkaV;oghLHe)6*e0FwN29xq7mKk%#afJt*Q7KjJvXF+zv;`-H zEi6wbEma9lM2)|&(RF2*>%J&P@^NhD^UEyELMtf!L4ESNX9*oxRM z<6s`583Q_g8d-yLMBcCoR-_Pv?m_WwarD;aIiSI=F433~54y4xtmW=HV4=b5&SbgZ zHb@^pWX=_+mEg@rwJ|* z9=EP)RCQ*V$FTw7@hU@k#@;R7k5%i{KXq4AA1yh7iWT8Hmush|k(r4~|GRHN&z(vQ z{rzR065mafNS?xbW@v>x*^(N(;@_BV1!+7dxTgBe807qEpT=QOBiL(TCtmkzpq11@ zA3BF^1=Z7zYFn~uK`2$PBSji3$N#{_1D?qtdx99N8)-C^r3(m8t5n7fVxCJm3Vsq}f`{h$jrFGnE;}<8@0^Fqp!Y-ugFHoVU*7hc}1Fsx~%*R)b-(3bhoRIUj|wM!l4VbHD(7k#5YLHoEg zgodbM@nrj+y{w{{^5IBiUK(7tX`r=28kL#)=O#NZiEfo`M^cB{V3=_9quqiec~Q|i z@Pd5-;}AjCW!3+_(v;KAJ?xVyVM!6CTa<%RFZ?Q>?I zsp_7p>gt}}Jut%JpSn=AO2WC+F>v z&K`|_t%%R$SRRw@h}9u+z@5dp;!Qu^_VIlrZM7KiR{vh6BLCH?XH5o%3hIh({_tjG zE?)cVxV76|!_HPG=n<7Rs)D6_`^iL>8YJxaOleOS(R-YN(8a=VEK}6k7;5M#xkr&_ zTxu5_WJ>|yWV#GbN`+x&MTEzN7Q!(OoVN%W6xv5ckDk0=jFUHA)9^0%>7U+rHrczB zWz{iwYZ1Hsz!N0Q4Xnm$=Kn#SGnRDDYvh05qyEoqwKI7pl*F#bY_%kCRg;^T?H6XF zCxHXz^)*v1{#ae9wG3M=`Y`a8p~4s>sIw$;J!$SDp+%cbQHt$MT9=>u8cjZsX$R2)WL zO5$De(l>nFkSGf>hJ29o+NSONOLq|s&)Qfx^O3ql{MOF`MFcz9o|O1@;fhwzLOE@V zntiBUUn@hEKVjt`Pt{}d$u<^%oEP3CH&5Y#Q-YKCGfT!HF+#2OQ77n>B_TPuHze!& z7QLM@urH)^LaVFOaX<|EZl-T_*T<3;OQxZQL{Vb+6ZhjX@)=<-a_@3Pa@Fy6FOA~7 zk6=VGxZY;Dox@oWut^fMUPJ2LUvEEZ+(CZ6_IpKKQA}yap;#=9g=H8!W;yLC z?(iuP#UoW^X1143{CjRU1nPnp+bM&k!%8AFjX@vHVTEspr{p~=g-edc*53%M45%fW z<3)|caeM48+;_@URhmc)0-g_#!VBMzsZ^Eu`0_i!S1n-)IQm-o9mHBGGNP&8W6}Xw zf-HAO{<3V>`U@9RfvRRdDFYB|mfCcfIjsxWq|2!-BV}*T)f(3$#_ryK zYN8#%&m@rsXMQEW8MNLv`B zEajK9kQh+PT46SKj&h9Bt~{h}jr)5Fy>BY6(WJQjmXMM9Oac2Yf$;&0cpMG!y2LD8 zjc}wKk>WZGrnVIUN=`+Gp9>oqt{LEd* zbbv06iMO-Hl!9^T^HAzzK?;Gx(BV&t2M!+JyW|UTOJjewJaU|Pa?}Sq(P_aM9~-8j z(#TwcU;N1)yOe>}wQC1{CVzD)&}25=YvQ)&Ls!I(9RyTzgL!mER5RkTo;I*oLf)|H zDN&X1!A(^(K_8C$B0Y&^2HiO7zDsJ0=Vu!}QZAdKs@PE;j3j0Nzu}#P29qsT(pFqA zmKa$N?*6{-BR)TQvsRzeZH$((uXWpx{CI6V5!H_&MANU@ckgevRJ!{J$vD`uBn5h5 z5|qK6b8__MpK#R-)9?83*LB~7s?%26+L2~Vo|HCZ;B8t%5WUzor`PsIJn6XrwP#pG zD81{Q3?YR+nRDja6_z?|d%Z_X%UIX#b)-}95Os3pJUIJ0Syk}-Fi0>@^ z0-qM5y}kl@Gh_R%gZ=B`;pLYjHPjM4Z74I$@OkjqM7mz1I8^A)3*d&zo5%8c8#DXt zoR9E2ca=e3&>PC@tad@a2ZEA5Gg%IpEq+koT@{9&nIn(3q@^6~niXtq#oFUv@1s#E z4Z9s*I;!kKHQ+9R9?|s*J(xOK&+>l%%e*=%;E&GOZR|9L&ClKb92&Jr8c)LbH40vr z8Y|%_ZrTPfc|W-$zkbUfAxttjm8z3mq73)TGJh!7sXk(^{A0X+#7EsJPb(a&A5YmT zJb5os8H>e!EZ?n%aP|?dVUzQ2Vurr!vxoX(X#z=;h3Sn=M5VYizRnY}NaZ&Zs3w90 ztE@b`)60QcUfT#ZBx?)1$v%VNQRoHl{zsE4)F3(U&fpB8U=(^=J&?R5 zTG>cGXdEe}wIloI(w?^QUOt?MjNH(!DZ%}G56B|$L$4c=*+)9gnD#GiPz zK38}x7us}TG&qNekc%d96(}yus{3j4`YN-sq&@9FA4cGWrMqe;Z>mkSvC1fC4@rsJ z6ei*kNziwbnn#V*6=iKTWw?5ZHURy77^>xL2J5_Uad7|$#6a20@3zV)c zs<^gQYFNtl(Phu1a%um_Luc*`%Sl0-0{QpDqa*9~c;8bLycLv{xX45F7IqFs|9X53 zB)WpcV=nf)wfD0*<|oJA9+P-rjRY#_wOCI|Rqb}W0Y9^+f85M8mZ5^RBGnTb5DS7H zI@lJ1L8+c8NzFWw4jYYb=kK{zES7I1f;TVpEzUpZ-|URg9*f-b@vWu9VLFs|8lqNX zanyLjH)744Lj&T^ibT|^Es?)RdEZ4a&}XlNhkED{gyY?F7lp&1F+clJr=zrB4Y)|Mwg{ArZqqbqJ)L&5OGVUv$EPf_JJJYOD0fwl9xC)JZW zNz_tL&YqJkHd-Uv4|Y2^I-C_#P!L(_nbn$~F$#hXohGXNlen8h*~@HMqeJcCa+Sy3 zlF5zs-LT$wUBjW>1$p29{*E`=ovmTarkLZLLz%|Jg2rLH7m;Q*4Fa#4QBsA8)+^EBd7rod)W6`5(b} z6jVWhGV1Htq=K~h&hOiBZ`#lXS$jl&dJs4GW{f-!j!_K$Nn8rLivPMK@*pFNK8yH) zO4kLK#P3jPN2cttx-(CR7b$|>OPrmAxMo+ykly#6cN#O@XaRgza_#DPc)U2(zpphe zith1`DY0BPN>8z-Kd}RKS)^YKFWi`H=E7j4TSr3<0EfO~LlZelNhzDRSv76dpQg>M+n=4&Zzq_n|IpNrozHo9E_SH*${IEF?){1~fvg5*a zedMQv<)FDS@g}92K8C4>CDjV6mYZTMKDZh^<|wp4cp%zvwTSRx^ygi>)eaRW`4S&_ zY1=d=>Y6|lUm2z6p6yt|zY%nJT}yOBpR`r}iEU7O_9iK{jh&}1gsJ-N-jO#mEB?rI zxLhsx)8KCk%Q zSoa1oPYTOajd8ZQi*EjIqxQApL68_XhA3vFs*4oA9bS_~6J@B#h%Y%C$)z_IpZ=83 zozm7Humv_TJVW&}=2@)OO^P&Jav$yR#{g@FK?Y$hvfij8Q$itBcH;;2Ei91+Bl;3f z9x`i#2znb6scUI^!ZT!x-=XdL?!)sM-)6c|HCTeSq4(Hm3la;4k83_Y8BtzzQt>dzrXua1u(O&+pmIOS!DmMY| z0YzBEKQ@928adtwe+-UfJQl}HQcon|0BTkH$Ysbs-^Af>1}Ehb%rsA@LV-`ou0@(0 zx%NjpYgPj-Dg~Ybg-tHpgv5OkoB-<&)Vy5;Nr|&Yfj!!bUq)sU(kmaH-oa;^7jNf1 zGxpAZwj-|L{DQuEP|#U@klGLxZrEBDtnynkv9Cu#0L{6uX5(jh#ELg0MuW)^IjW~M z^pG`F?E*h=dsHb=G03hHvIhG5oNsj=J;F|AB(?m#m@6wKVbwcWp5dtPqgzw1H~N+V za;v&~e92mhMRZ&b5}H-cz#2Iu{%&7|ZD8I!lEcXJM-Io#9sZ{_>^x&S>_gFJ98nge zPZ&a16)oRv_@XSjg$swuo>(u7HByq)Sa4Qn<4uZCZX6zd5_!4r$k61?M<+{L1(aB_ zPVGqj^upm~-`Cz8z z#-+UTpd7A5VoYNv&Bn@uO6;*psq>Ai@DDPMu#{&!he8l*fy^1Z=HGkXC3ckQp!RIk zat5bM=jQiD!!9f6o@A8#Xt}(&kmjzU#p#}K4;;`Q zSpYk8!}^q!hj!ll*aa7m+9h(aykI6{xUc+c>*q9`XKd8&UdkDcEgLMQt>02x6M`GS zBRqpmTp?@-G5XXzDG!eo4Ap=*XRTXn{7;Wig*Lwgox>>)lX=&2KT1}op%*&XS{l){ zx>>g1leYgY;{*nl(F)=kfpl^}bt6gSe0_J$UuH#cDA81KxbMsu>I5!gcT?M(=nH2W zm4{`elAkrnJdH|)%%*^g6EiS6b%+uSw<~J9Uc10MuXtv{cFCx&^I%-q>Dd|R=06)s zEk6v~S25xf?c1;T5bT}&mW{+Erx9q^B;HR(gk*X&2``OK;ID_c?tM#{b*Y#>6Z^Ub z+{_ehu9=U+s7pzS^weQ{dH)a$`tW;mT{8&vnDqw&x|Ze$afr#mt~WuBV_}cBvcq68 zg@m8r-{IdvN8VQD;h`IGZ`!`Wfc)kBdE1nzjmw5VA@TEj zHv0L7h17^qyAdfQ(?l?9ea=n1BMK$(VtiCDXy}sIlUUocasN?C>ENeebjNNRM~7A(533PNGgIJzBAo0eNNgKvCCGhs+`?mA31<_qM4WYEX1wP@~Kwn z2avh_JbE0q1oYKO=EiCHFs5$J{8cw@dcbtGB1g5Ac~FY<pQy=S-GC^w<@Uz=0 zv7UxC3{k5rtpA{ifJG1Ne!O6uxsgU;2iH!AtIg9DJqFU6Cvi;aW6uN|&NiC6lm_wx z4<*gP%xd>BFaJ=vxUR+!*Ptu)+2>NqE@(#oa=R1)a@{cITbopyA0z1s;ntm6vDNO4 z$(K2NL}E+~o}D833VYv0sBQ_jR51nHif|>a+=Peq4XIlH=Fa4aQoM^Ww<7!Jw@3^Q z1_oJw#5EU2q#w8Yon7b0lHf#u6^!huIGCp_$0J1dxf|=Vu}Xo0Tj+Y7;4(bHn&A&& zp--vNLz$}E9}e!>x6WhE2{@w;ZfeN~SngK@e&-EhGsjLTD+uJ2BRV( z<*;E+zKIl8ajwVF%!%Yi?9@==YEWS8?#6Li3RBuCz9v60b@OZ8@vUA7zFUjYd=GnR z$f}u=*MVCd7rk9Q_3*XjdDB;*@YwY%IrRqM0!N~y&5Fp z2fi&4NiyZ-<$$}3n(m0GJM4sb#tQrlB6G%|kkTLGKMa3$=?i1%9mK5aw)bD@iw%t= z9{b6e|1f8)>8hvvGN(_I9@MfT-8<}kkU>v=*dF(jQCd$(nfc#prhDV@xQl&WsqDA8T-k zHei+NLzrsIk`8xX6{SFrW=UL-baA9IlKlRrPNSuyOG|2(E#hwxo^057G}g6iyr6XO z$`HGRG}0q#zPORyu36N~4=GtVRm|KZ9>$VYUU?daysO`d)zNQpBENq*-x0WLKVo*> zwP}a!+U0}8Z{K*Th*}Z!_i*D}qOcq}|BPY5^*$g%BBc{<#g-DvDhDI&=wL#&0_tC5BP>+?azb+Et{%@Q;0wHR*~q zjtTs-RkNzxF=A!EDsvm%ufn+rf$}3;QkxT&%mo(??v?5BsC46j{7I|Nt8b3jj&5r4+UeZnv5R7+D^=_*4 zg$(&*X$@Dovxchi(7QuJ5ypH|`+o#Z#T(kTdMK9f<)$vG;Ck3)6A-+MyLh0w#oGzq->w8W z$??X=kR*=hX^y23BgqPS@4*m`<~YxQEz7Yx8_*jF2%DLG^?0gy5;@hM5~O)Ls=G+h zdWuGi<@PS&JvI1nmmsf`J%uTIuD^>8?@Qi3O872}OsLQNO%b*lJLLTNSKC@#x`A_e3pYf@ zh*0iC(Ab^KA3d@}(qM{$f-m&hbVu{1Sl(vqsu+op?^enDwX%XZ4=Fq~8Im$)ea?>t zVK5VT)Zk;G$y#(;4v^U3ynLeH)#N_^HdKO!o3HNMDVVr=j^R}(c20FyzwFb~?MWU_ zXc<~7G{~YF&A+jqf>q|?ma)4ff?9Z=Nub(XR5n+4Daa`0e0# z7e#boHr5w8Cb3C5p0Lzsc0>ZkNSpxda$_i)KOS?X=6mKj^2N@qBJM4y#E6k{SRZr7 zHJz`W44`;(*-;ZK`@t%_axNYJsNZX~-unema?$(A2JkHRi9-a+U&fe8o^`uIkH>U! zqlH9IpRWAK4;W)dWt5v(kD%Ij-ZWlMH8o#Q8OpAdXOd5GJF^e5gJjTIL#ph3Tm;L4 z`EZ=PBx|lFW&IF7v>lDzB6UCLOaIsjCHtFQ)3SV}T-+ff_828nOxT4o0EXm9P_|&v zB;}9NCr*h{I)86MW`48}ha2~#U5=_3@OxlMKkRHwHa-7&wN9sU7`y`zy-1Zk3Pj(JH^tO^@YNz67rkA1t0zbY^n1e*| zP8(Nk6E9dvF|y8Y`C&v(Th=3|5@r5(I)Gf&np~{rIC1<{tCRV$Eb{N7><`Ae;24jS zn#wd)Z7?sq{3-8uwXu+02wKxdtPrkWm}=Dc%1hE&uzU_gD0{YJv{!zwXbXNGI%S

    4 ze5!sXFp1xvtDu>q3mm?UzqH-=*k1D^7B#fMi%h8)UT;V~0-OX22u_KQc1+0lnoVCiNe#bQDkF}wEEvi~YwEDe07 z>{o>k;%Y!H^RP#jOTAq7i@6N@!Wuj3gQfhhoi8x|Q0VF8^Zotn`0*D zn(Oyx?;9uMbD_c`A?jzr;~eH@rn2nee_ijMQx|x;OCK9u{B%P+-Afi<4R@ElvrO^qdj9?5`Xg}r zEfu}u6dxB6-B7M0p^jt5%}5h{{l@T*j1g42 zyGrj|w?Wyic`wx?)jYkXPmLjTpVw)zL=0G9#M4qExg$RVr1nPl9X7OW)>fXN6S@FA z*nm5XXT0^+$DNN0n>p6iuE$Oh<_jsg=ZPyheoDTg7P&L>F(mi4wTGr ze=0!jXj`IS>J$w&t(-`2=2Y7^o6IK+wJ0+^;6~}`8??e>*$1ja<}u^`@%_baXVg~B z2?foKR@ERXrB(%}ckOT|^;s6vt=Jx)cVM$N@n0J(EWo?%buwS-*~pT=otvd`_8{|< zI=W40+#@Lv;Wz56>xZzi6gw@cgYoS<*I=dat*)SCJ@avj_#n4jQPwrTfFgJIkO;55nS+ocivOodmXk2G=+`P=VG;f`ZkNjVZ!j3LhV!Kp&>PZ> zy#F;>#s=^2V8vrL1tESJ>b~j!mlK%Rc@zRRnic*~@L$cCQ z_OY8p(1#Vr_`ycFMKx&q+bX&57E|b5B@gCy#;^>dw5wwa3~sTAc|2z~F~WkM`F8sh z*}M9+pTbpLK#Qn54#l6bbq9A$rs^COSyY#6gI|+3NGkV}rt&*n%L*{+pBnRi+kYP* z-i$OOs9z}A!c>kUP3pKs6V{XWfK>Ej-le;mjUlGn_-x}TDrzq~;O|w7e^ir9-8Nq- zfi|LXSAUAYSOI3Eu!yT6lCg&t*5!QrO%=&%^UORaVbPL1E?(x^N!5=dU zkUR9AICf>ygo9r%&AtyBCB>L)jqEpGp*~pon!-B6!rK~6Tfw*@Fq?EukGlG27@<>J zKn*jXn7DAWu!t0Gbg=z?Opl32vFfgfADBBo9}}vKy#7`6rCEOOSK?Pwl)j1`#NFmh zaDJ$ZUoDemZAs?RC+Jl8qMNrG^W=#-((XQUq6m0k8!}_+$UoL-{MksxHhn_A|7dZU z@|cp_LOtBIlsW!Bi;TfzNKtlbChI+-3wge1_mK_)FYx~Imq67}71y(%>jcTpIk)VL zJrKR(iME}o90+NBl-^w}ijl!&cP<)J-jl{3#c4~SqeGHk6fH(HqmpM==;%XS!=x}J zT{|8r+@K9TQpfuAZzJg#Ry7w=Vre1tu8UxkDRY4%ei1p9<~q05M*?=DDl&~oQq0Rv zfEJyNNcc8esLo0YTB^Mym3^g*1NKIR_S^?}SV}S!-Sme$$|2bphH&fju*qUv^}CaX zEhd7sw77ri_9RTBI-Z}3kz!KHD5hYPUo(X?v~)Zi@pYC9n@E*O zH^BY0NSlXsYia%PwqrthEk2YI0{htwhTTnAb_MY#$rif$vd*Woyi5C1AEnM4A*a$l zKz+K}csEqRSf~nvBLZrCE1m8RYVMPzNkqbIYrRKGoOB|NAK%3GEUZdy+QtPD=u#OH zsbj%(4Bh_VHH}$0E!F@mbvTm08@{OQVLO;EB{c9YxIu!-;15>AikcUEX#O>sA*(D1 z2C*K+n{_hZGnPvR0cN!%vCbIlRXEy}aiLBDG#DXiq%Ou%lTZ&{JsDeiS&MHU3x23s zXE7R2vD3$fpEe;WU2$A0^L3c^!w`|BEa@Dhj2t6ts)1cw_~5J}&kXx&N9`8*f#GD< zFdHh;nNpMw2P9em_v?94V;0k1WLn_8gub!1H}QypoCB*gdm-v>P#r5a z?E=x1!IA3PU$WM1beeHXlm1<{VC1a&m7aDU>iOQ3!{?aIA?(z8a(~3*HPte+l!1+* zRG({JJEBl%VBgXWHd+%CR7MKGc;=HA{RY#j2wmAeU}J=U#KKB8K4Y`9Qk3-k=`mvp zsk^XOku$1)wo>wY=qM9-SxhV6UIjb59@mWDuGvCc{V%6TVTrnC7Q8*T3iMviB3N75 z=WsD^@teDxld`lk1OI~OaFw}{kzT%*RFPs*;@^xxwIpGjKXS!du2&9EcB~-HybT{F z3l{g_`Y_7+pQABNr4p@)uUQc%DL-iNlatXEH#!{D?P|fE6eE3h5rc~&!|Z&5rbk!w zERU07%l&>T6RPla*}Y$Q29`OKCC$dz86U-r*TpZJz|GQQLj zD-icSK4^Wolg!KUUlVhWXYnPRaZ&E#TuaGqZozELJBwbTylWZ{yT3^V0|=66E<;-} zgmO6Ujf|~RxaLJ41-?y$9(ebk*0)AOe`5yIv`pXmK5W>Nxfwt3Ip1%6w zePX6IOqr1Sxj?Ax#4F|m*Yhjy1&P)wjx;56rYh}Q4jvjH!`1j_prP#*x}!02f-$ig zVbqR$WncbSsRxq`~&-U!(FY6nPt7%uHREB}<27F*w#^XN(DxBrG{WR)vP4i4Fmx zciiK&Y-9x5aNQ7) zSZkcf(;NdtUuv89J&ycOIWE##8ip9$+JwS7|xj7^m)Wj#x36Si`kyf^=+bi$9oLrYRb1v3qLtMIrBx!wid4!=Xh74>%Q(v|v~KEU$ofSEAoS&lqJ_sT$YekG zvJ%7Ol(&DpaN(333nGVhahH3B&YaK2mm- z#-u>%p`tP6z6$+CoAh4 z{Y%Yc;#xHN?2Wy*pR}lNoU7#v4m7Z~u_;QesgkNcbZ=bJ-8rk>x9f zO+UFYdQi^8P&=&a5>|ZR=Q>cXy(;S3jtbcl8-tWs&FwzFC zhWLNrAN=RC9{xO*W89r))$Yy@iUuNxtD~O%xoyCci>Jtfnq5(#`>Fdd_Vup|ZS>63 z;9yy<*3cswbf5+^OH&b^Ln8}y)tweFLPIWonV+#l^*H*+s?rLnz%tb2LvZt?-ag}J z`k1qvb>~Nh!08Hs>!guvw#8&jdZ*76!6IWRXa5k81zFLpN%<>FpCB%fb{*GF##0V5 z7U7^&*BO zANK)qUp3YvMv9CrHhYc!pdG3Gj@s`I?}E8wZZzntasrs&&eVqF@4`olS^Go zE20s6)sE-P{`z-V?GZPGH3UPg)OGQek9l!l`f#$A{)X_-L#XMOFO;vrD6(Fxv;D&{2RqLDjDPQA}|z`7Hn##pV(<(qp<}t#kWPEe)wP$OPg-i`dvn z&xiObZfJ#*{7e6|CS%H?xpXB+VK#)^zS;+B{U{!{-*@~Kcg@?4;={s}ID4TxMr%*# zj#5!XY=JZ__>H-uZE z_iAR82ztY(lxHB(sgIP30un-3XyACs?xR53#|TprTr2^`CS4A8TkbiZTQ}Ns#1tB; zS`_^jwm-7HX-*g!ICafVUn?Bu6#HHL#06(SPor_|8LFrO#XkLFarahgn2;gPyA@r}GHIDZwKsRp)WR>}%s4`j^ zEdQ4LtLE9!(E*E2_eoOB>cCCGr1Uz8bNsr{FEKveA~;XF3T87Uz9R5Drho=AWx|aS z;xgYoa;ZLB*ns|5;K)w+`7i-HT7YOOnboYh*zu&d;*>N4%-t69TN={0;4){pV{1kf zGr0j`81ZDi*z6|+ewzM?2lF#1bITfibL8+z*<2Vs&)reQd2x8C$&j_K=(t~ z&~iltN7PkJF-XP!iDXeJeSfgWX5UhuPFQcD`sj@t6>kq=$QXOYa` z^3=DO%Z3&K3ZmW}FXpeJ?zPy`9!v3zaD8r zrK_=8$w}~4W5h}JOni#$Lf~T}%(h`ZRE`U$_#W1#UU!}Q3CmP(>P_QB_4MFKTvQfE zQBa^-_`tGV^E+CT&WEI1sl)^o&O(i@aD^(~hXJgo|KkHK9{KdLgKk?9I}Mg_#lg&SSm3ZQ;v z%^3TxJS5{9{bl*=rGR##1*OJsxdbaqUL#IM6^&TqQw`Tduh5rY3^!}ro{#8XnTAA` zH={ZT=XMotlYCDl;d1;`HE3 z^t^8k@*$Z?=gwp~yOYjta^#qmk6L#kv3~d_!!KqYj~gp-qAJ*jaGrUH7Of{{<2xFj z4B&RwY;#QeFZ{{1r~Zqa_)HSEtFr445#={}R$}bV(|?7@?=e9iIavM`87H>D>qkJf zB4ZK##Z_`x%WyqkLuWbkzFKY`Hl}69h#z6liTF3ffJnU%2%ZoUR?$zSMh|UFVY@z@ zv)VpPavy$*7-|9OL)DE8Mi+-6YR~DNTDja)-*@@$Ah6M|T*BX=bG>=!K; zrd8!^do+&EAtwZWP>hfzDa0FOpE*}IPsKcqmt_VKsI$>_$tN{^lFK1&W6XymgxMO~ zQGFse!2lSq&kyLu&EeFrhlrX)`ZJ6J&Ml&%!xMZLF?+hB@valR_FPC5Hu3FU=wm{E z@C&G>;*HZ>o@v}mvW0s;D#0--i}Y$+SoQm5wZaU|8f;CU+Zs!nh; z3d(uKoGpJBQo=u7lU+0SssHVw785|dAGg^6DB zqcPM8>hBnhn#l-MO6F%@sD3&Q6u?T1cQuGgIK|ps`cc=9^1z6m5~|qqYtHOr5mppR z)AUT;!Z-aaZ5QiPvQyK{!(Q&8Ik;8mT;`Kc7|zK($38mFIkHFJ1Ij<)+57U7zUNAV zMbZ!7JY|_D9$Hc^Ya(s!9cem2EinNvdKgU#i5!2hNynSRfj-+8cG)nMmbQak-}?s8 zb1>`5jife}x-r(cMR~W5H5-u)PhR|#`)Ulw0jpEFK*VRA8&T1XL(va?&@2D+Btuvd zRUcS~@4bQ?lRUh%=lQ`o)krrKnH#6K2cBMU-C|UsR+cm|=2NpVTE_|k8Y+L@$&jOE zH~z}n&%4drP()-wAW8U`eQ5`XbcIghenxL^2xuR6PDYoxi)us_>ltWa+IFWd zq@!(jRQf$uJc0BDIlWbbz-DKPcCYD&)Q|SFc z81|WRR|HySJS-A|H%+GkT2i2Y zbLdEy^7TwruB)iTF?{h@fl0&q0awv2e^HvsgLz`MsL~W6BfgTf>^a!MXdrU#dzAgf zCmU9*y&*-+k=mBHJZc)ZcB#^PeVD-$vLL4vvL>l=JO?7@7jZg+sIrsDH?EM0pv`)= z3ofwk4|ppUJ40Ux_;mF?k-z#&kSL}xg@Qi4n&y>ntPuS%NPBmHiwF+lx zXZt>oN$630)#sNo>0FCgz0%B-5um%AoiQpGMNdI?3FLeZ?S>wK;jACDhA!IxE2sU#2e+NOn|Q&?q$`3h3z%9 zv;O|hoOe&gyu3BeXCFOjTS?0{1aZ0f!?bT}W(i~jiSQ(o68Q5q&I8?-`$%YloKRIU z7$Pe6%IH(BR~$?R9DO)(1pLuB=1+$<(81gN*lPMS9bcl~FHEw>Fm zLFO^lYA@!>DD|w03T}X#aS5zNK<;tgWGvuEqJ;`;uRY!!MtQVNdI3+vNcgzH7pyXcFVu0-qHzg-`aRR+D&&2lN zxn8FQE_&<%3~>Eu^T|KE=nR|yJpr=5X<*0jgsU5>bp2yo3%*6)H?W3`IUV|Ra^ zb^@0Y{^W_sw=~_CNXhJ3O&ufZRDdbVQOg|~7K9c$<7qy&L@DGg6o#xXlNH#oG`7t_ z0TENmUo7&A?`n-Be#J!fmd3;?rj;hM?#y)I`!L}L&K37A>ccZnZtBn3DDO1#+X;+K z%rTZYe_Gs6shIM)rLofX^X8m+XCMsTe5A&GIOuluHs`J>KN$lfe)j?CKDC^V+oNYz z(W3t^Uzy!zwK-dD*Z$M>mZ^I2X2(=gF7)DNJNcikYg>KDs!&A@`S#+torV_M_P!sK z!DTxJXkk#Tu>y;d9va(;dNewTX<_$d4+uhj<=9}5{jBfHE%U1?R9NO_{ZBt&FYi%* z9R$7lv&nZvupdC9a-pM($uwH{=DC-Oc>zxErs;bav*L&0iOJ#xQ#R=cY>Oy8}z_gxmKwzMxhumTwfD|A}9h6W^2-EOtnD27uuwx90v`7h>Py#3Uk`xJsoO%oJ^|noDBJtr5}u(G4}@Rw=q`3z=jr zzqpLhc|V;<_sJ^CyR_HzdTLmJOkXsQwPasF{SP#(-8{`vWe4UXJaWGbL~)v$fpjALC`@^I8kseQ{?-gCjX z27GcZQ~GWuXxKrMN`a*(Gb)r?fXLdLu=#X=a#w{@H$1HgVn^$F*&o4;4Mi;nr{gdd z-l2O1gM7wPv@QriO^ZwC{W-cr;O;;Tny54BJJv@cO|LH;AyuP_7^@8(VU5}wk1Ykd^Sw}k3Ff)&2 z;c(k6#fkce2sB`P<4V{giG3dfna2@yEi94fo|%iO1Xk38CTr06>|3>Bxbvd`tVgv_ zmTEYf15JOD2+HcucLP>|pYNnTC_BNF4`{EOnUSQJK~j}RhS6TKv~sUxvPemWL7XHahhe5?c&Y{xN8(S)w$5#m7!6;%9UKI95G2Os_Cd64E znfg$-y9PJUC89(9D}qN>E|O@IW8{HFY1Y!KiX2iBtore6&DT{?G#D>wB>#!&o2Zix z_YWPVsh_&7S_&T2d@%}a3dPVIC}tih&GSmlydmR(cRi7)L%J;fnm;&twtoB)IMTf_ zl>lAFd>=tMK;%Zi1HDTxN~bNLJ#JkSIo$e~FBMBZtZIA0w8+XFJ9k4|QQB38Cc$yk zzKiz!{|W$23ILv{007tl-arrlD})R105kxu5CCogC;|XaJ)jA|0stg{2oM9X(trp6 z2;Dz}DgZ!(1^_38eHMXzh6O+--~eC|00aSm8vwA>z+eGbP_t_QKn8hG1duHNFkFDe z8vs)TzyN3%0J;|dW<2JdqZiT85CEBF0RS8T_yPb@0DuMn6k0D;UW{O{ z_AfgG000jF;IuFMNZ-I;Zt82WTHO{J5Z@!POjudWjboG^C^+ZTq0v1xT&7 zEnonoztKVaV4#fQf+hp9Z8WG~8D8)}FvzYCXlsQ5gUx)&0cd~C9Tms~aT&DrBfZ#z z1v~pM4+#7q|A?pnDyVOeP$FpHz#2VhU;!}Dl*0$vMFsgq#|LE|G_c^H$pw0WEdURi z1>hjR5Fnz0#*znQ1Dw5W6B-Z&^-p9M8pybY21xIqfwc!{KqMR*@D7Io+F#;WqX5Q1 zlm@`gSO7z#wo1_X0DzI%gN`F@!UJ$Y`CB6e=?w6IHYhwmL>(3|)P@BvK*xZ5f#xGD z;w|Za`2fWP$pKP=rX8rjg60Yc{|SkpVL-!i0f|pwozNi5pjHnc9cb=@f;|8OO~ofL z)ElrTFaR8M*wf?7St10qg6%_r8vB5OJ^)C_mkAGe{m(KC&dcPAe6a%k@}UXZK+_sz zul7Z}2dxT#4QOfuwl90#FBOk3VO|0to$E{Ea!@<(s2k88NDVsu!TMhufnrGqBYg=R z^dbD>4f6R3fPH)h?SVa8z}mq+E5d@#t$Nrt*k@3a#}^->FD?&W8iT(CxeD4|`VX=T zG7tHZ39$b@z`#J&U@)Mm2aBQrYV_;nI9yO$(CGzg?D-N~-HQ&CnV0oO8WbUz5BUH3 z9}EqFiwgU6fB*QhRQ~4!bl^*1h@j+v@G3!q016ov6!c5vFP=dHD#$me3EWEv00I~a zXgT`NFQ~)KU=J@z>I3#(QUMM0yo|^wCKHW~f@)FMZE|Iz#Sm2G;j`Zn-a8osg3_q85)qv0Dfe!S{Qg*AFGss?LL-IEg zy%HdPeMp8J*F{BQMqZ!+zh{O*+*AKvu5uOyXtWt-S54MkrGh`f>gmENpxGRvFH z^vVo|SFX{$={a60BK@Y9eAB;wWromOz2IB@TfA$PZ+XdmWk$&>fyOs-D*cyd0P~gJ zw(|eUqz2^h3~(D{6^5%{C@?sc>h;kR^pfPvU0u@&?)y{!FeO- zEBC(w`f~WMyeuX!1@smEU-{p>1AQa?S3r~YzXDoh|0^O{*8j0B+W0@NIh*`PQew0J z=xzGSHt<)H!o3mll_Jn@^>6wN^iQvL-U#5C|0idxytRL$_ZtDjSO27M6w!H$NB>Q4 z^hyzpSFR~rz1mlJWgFQmf!$Y%sK3b?uUu1mrT2sS>v4~-%n*M)Z%EZ&nPKtDHp5o} zcCR#adgYq;D>GK!^nc&<=Wp`U8|z=0f${3c5bw?JyEmEfl>qN6y+z+-8ot}I?mo-UP(Hu{i^@_%8Y?mlKvliZysk?Rpou3bMLL>R>sOa zLT*(O2tzOdgrF!lj0p&YQBc$pMI)kM<3Kx6K)~Pxf&-2n6%|nt>2^SS2;i)3tKIrI zK1N#Dw1^*ee{{c~FL!^->hPxreX;wU z`R;FB>V9{I`(p!v%fNHp-*Tw?#UbIZald<4jQ3q12S$%S-t5tR`+D=YtquGh$K9^u zvB}38z4(Uv-SEfe9%u2L-}`*f`GNb}K76{%4S#F;zd6|3vuz81c8bU;Lf>+urYfj`Qh{{^=OkGyKu}9B&JM%YOt8f6Ld8 zHvVl_dpk@yTc&vY*fCwBcf;Sd!SR-h!@u9;5j{!|(py@s{8p`)$y}FM_WK`j$_) zyseS0_(kaXQ};)I;{Mk3?+yAdTyE!BFYo9P?iW#x?kzE&{fo=*9_{pP;g5yCCH$@7 zk7oR%oxdCYmM0%u;I^gzD5n>V9`D;%|xg*Sf!L@9;n4{^-r_cW(80tNW3dzrydnI^wT)e@pnI8y%0mKlq>I{^LHoD(^z1PRqx47R8f9zd8 z-j97a{6+3>S>pcIM+QD5{6oWkj{Do5;{MiA_dDwXcLP5*{G;687V)%~3A!el*1msj zDcr2#_Wvi?cCqtgBU;W@Aax;Y!VLm)gt>6|=z}ASt~kPVod<}tt?GRCwXNK>u4u1n zuVMS@8*P!oxjMP!o?*LfM6mhY&K}%dg?DWCpl_XRN9_A#6FF4es)LD+PFfVWwTx6c z%F}sBIZ)aLAGx{V*G{~Wys^FGqV^@yaYK8@S?y7j^^LqFYn!g^Ista!^Vzs7Q0j=! zk`HOqPe7*y!PA-@JS{A&tv{k-gYT(y&LB0gAMGFxC*ZMj2?FDy-H=2#!lqVF*qc2X zb!PQ*orh^xtN@9puGsexhJTL;lP~!b4?ioT3`3~GYds7mk~EVD%O#IkEQ}6g5w^Ba zi+_DBeo2H)W`xnF6Jhd59gum4Lyl3+kuKX{hS7;|wo}6W7jlV1H=WX1nD(3Tgs}xY z_|K0px-E+^@x`${ImJv5!}FNnLH?o$6F(AR0VWH`~f6$uk`BlJMmL$H zlEYa-%2BY2Cr#!xwa%jqQs(tFp2@Ya-8&FQpOq0$c)ti^H}pUbwe z+9@venHyo#N0|{14_D^9e}s{*gG!4>FDfm0IPf8CWm)H8@+~7nX#E%+(?RD-w<~OU z1_Shm!^m%jp;3c+z=pX0i~ncaV^{TGZy){j2koKSlO2>ZhuSnRW)9B(U&218w{&73 zQn&l^sAcniwPvVhdo4?BokG*haRA@T*RVM2N2iy)@Y&8wANpV4^stR5GiDeMeL=Sv zD*kgrw)GMHK|X2er-X@TT+J|nDm-nvg%jhOZo1V**mMh-VBHR^(oWVSn&}v0Gi|e` zo9^FOyp2~Hu;3v)SCdnwovsWsEHM?&EKLl=TV01t!i?cn{4x)Ni_+~$d8fz##F_pI z5Y91;Fmm?Romj$dpSFdq>`j*g{|pU+@F3^N&=cEUUn>i9cgn2Wd}`Q@ybe9Yc}%{z z;WxR;1fRSZsVt6Q*wgfnvda^P^T1b3bU9X*PRJuZbfaA83NQJ>P1w?gOu_@Q06x6` zyxHldPtE4bLr>&1!Vad}x)Us|m8;Ryzbiguq8p1&!tkH4*2CoWrZ@I@_R~rM9^(tU z!SkwD_0q2G_V`DF*W`z87LK|@9|cVwa+m~=Z9KZ2TZI)O%$4>hO!@J#;UozljQ*!} zd-0QniRUWH3Fe#K=6jswwR~B{GeNZgFYyP3ZkARNDQ6(`B;Ud4zg8A8z(W{En7rmj z`?P$62l*>Ck;8+WEIT}lqu)`M$E|Z7v(KwvQ}IvL0*ka#rAq5^+*a^kR_ZxLg(@u-MI348g&cWS z9^x&ph&MhlCjb1n)6JpZ8RcCtPUZoAPIbOnGu% zcFU_~tAU8eo+F)J+F6oP+I$S1P@r-#GJW-7J*kn=UMZV2iUV5yd;wk1h zKV>YMUS87E3-CRyw`VK+U0W?4{=tw*UO66`9cuBjqTO0r2}GvnRcjBjYQ|3rolQ>6 z3$BBwC0uCYNq$w4g-r(uCZ4qG*Lm3TigCcw*5;0Ex6~19TGAp%)31f$heka1XOoli z*Vg!FDKdHX34KV1BOV=iT!S$37X?4KXt|w5*5f;O_T+?o(_gVErBm0p?HmQ+YB&UNG^M7{&P8OW%^BGCH5?hm zv6z;YPVI2m6nPOOoersV+EWENMM@5jRR$af`RcXZ;b9v)z#1cC&w=G~NNCKA11X(e zEhu{uGN>hO99{XtD{)X)9k8KJNDymk<}2{3@YQKr%Qe#jHhL1ql6f%C%cQzJ5mTmh zq8Oae#kyY0aXq`kgET8t3fh^q-@(%Qn6>HH>N!*230ZV~31s__6H`Kv>I*vI&@|5a%RSS3Vxi&mxcEIn$N@dH{Q zkth3^PemEchI3~b4}8VsW|eQTZ22kfiUSgD@d6P@>RGw!E6Ga8uHP9q|>Q* zCWajJU%!5R6|YPzt<~4W2`yxBP0}ErVb$Pt!tjuuu(j1!zG`#E7bPq5&{JbGVf3G+ ze9_(8((5eV>V5LQ)8OHvRVP2^YJ^FnqEzv-vF%WZh=_16-%yfgu2xEOFfjlb>f)5@jklQ=HgQ-;+XEQ}o{Yw-^+^rea?%=se@ zerp43J&c}Q#GC#TYV{axhPwX1&CUbg^meZ^ul z_^G3}6l0Z~rli3`z7s=d@Z`xp*O(3(pYhpa@CP~<`_T;NJYu>@MdArJ!v0`AZf$lj zotyhwTJ+Jg(iXOQksx@{`Dk5)oqtL%FRk5(_q?Q>!dCX+xAICv$|=fIdTGNx^bciQ z)e8lz_)pnTlkfIN&+9L9J*_Xayib|kB&erDji)hS@{PZ2st0(v)`kvNuI0;?6Hool z3?0ZT+Y&U+knl~89)wOg>>&tqF~((B1GDAj`MRALt6L%8bdJ7>-Wq-?J21c^2m9bv zGF3vt&hI>?XRB-RR(G9_g)Lt_u?;`vnym-jGmL~Pyl1b?voB2fVzKeTbci}a&YT&A zjTL6MM$_t-yuhTjaJ|n?@%4u36Jr8$ik8=Dl%-ckIy|X#Pz6-sM$bNELOi;u+N*pq zIPqLi@h#uh1k=;wr`r5z@r~Y`wTFn%vFH1WcMcOaJ+;Qj@PhgC&GxkOCq=&KuZOUW zCv4TrH*`Rb_PAz$WaS!zv=Z1WyBY^{(@hA-m(%JYq)5kRI@C6C3oxi6uB_a+zUli>YTnu`=$OKh!hRHE$2}a;R0kxSpyZKIr#c_fnU4VF zM~03G_-oob*1|flwHr+uaKO)1%$Z{e2xCw6HS5M;Yjew%FJGoG*z1S88;-4yi$Ffm zEk72sfr-<-MiWEWHB-YST9+x-vR|k5aIir~A8k|2B`zj&^5^M^n;C-(Vf1-+JRc9X zg1r6>*YcbS*b!n}t z6s8Kprr+46E5-sN?|@FHBhTnzAF?uxJ=i-YMnCpMIR1`U$p7@ps~J%aZ0T$EjPh9w zbjzqQgX89kf0FG~dRRZXoPwSyPa0I|k*~eHiLL06Lnw(U()?JzS57m5Cd8}cqQO-9H)ameVZdgX7|5&gC>A+j%Wr}YfQctIxU1-N z_&5_7SDp#I@hRvPKjoRsO)I&~pLKJlxAwevPaZ2Yy4i1_UA0$lIxSnDr9R@cVt`F@ zbG*LH_QWTDG+)Eycd>V$imtQTN?!t`!)5x3C>)r8E{jMyqZsiO=I7vntvuxvQxiG? zS+A038JE5GZT+FGgWG!gqG3mEJ^9|i!Io2_HBO#er>2j0che7jqB|NkeM~#&H+`o} zt?X}#Ozf4{OIF$s>9Ra3lr`W=pVn}tKcYELdG^8eo&Z#gg^(YfP{uZpzc1Xq>(ixmgkN z$VkPn@*|Dz_g3{`1yOaA0Gef7G+2N ziz1xAbb^~QH=Z^Pwq(k=a}gN{f{dd_7@M|#WOher!juIQeItvt2+b?B$&T-hhE zmAlf%Zyi~B^0}k0zq>U(?~re5lHLs6?yXmhK0$}6a{LK?TR-&%%6IMSs{Ij)9puf|=%%Qf&af%k>aAA{uUmHlCL?by zowii^hCR%K20>RvM}OTSGne!r_vER(ln6TInK+;ut2L~9MP>#fjiBy8hJ-ESMsGf{ ztZMm@a1sw91i#tKkIyZ=37$T=svo1PgJKutgLOVxo} zrv`5tArC#S*L^L{Y7+lOsXKu^KVvsKAxFLP>dbbW{8_WS2Otmqj*1Be?CE>*EMcS9 zpIwj|kR1HzZ)FHfoNiTA<1_qbgBo4!aU5NZ)(T8oGhACY2ZP`8^X0PT2i;c>p1J*4I{q%%3yCq#MDTi}73e2If`uOJI5oP|&y*^{>aZ zK~8y=5Fke+`e}N$3=`|dk`)_l35$74^wJ;;n=Ma%iM8@lRM= z$tOh%}n_vzZwyS|ev`IfL|A8QE3%t~J?PmOK_)h==>ePhN1bIqvno4o$> z80muo@Opmbv`!t@)@RU{>MYRoP?-Mnp$~pge?7hFQyZ_4N#DW|4t=fIV9G1?Ov8#k zq2MvrUU_Q!HS*Id!HRbU-2}BgL(+3eXm!41xUIwfprQZrT6+Mm+`nUDGyN=;F3X2q zVmdb2tU<-HKjjm)&usN#dvhheiy+*S@tkimBt@G zi>J%=t9u=Ee&H_{imHxxV@hUme?<(xEv2jnrX+5MnkFB=-!cvQOmm@7A z=XeON%DDD~8Sh|XIJd&uBX+&RQyrvAa;EA%4%b@Dk42S;;B!RC(p38VTnU7bn7b;N@uUqH+(S*wob7BJ~a6rf7{1~)aU$3 z8*Q%-f9PB3Z{?l8cp--~mHbx223s)s=iaBHYwdy@n=@nYnCWw^3x?6mQ@&!)##=(*~4%4-*n}sO|P%(GbT!nznD5H`K{q- zD8aAtn>azInU1Y}j5eM}yC%-^i?inBkD=M<$jP&I=!Q8Bi1d`fWCk{Ue|#A)BCPV) z+O=x`(64J0*U2+kwrK*$W&T=9*x??SOKsmI+pL<8J+utV#u+0sv8T0G< zYVE4K>%H>pSx-B>r7X1nCzWSgg;(htL%cAurk@ToYxS#%(h8XR(5lfR_0d|<4oAVJ zc;o#y-4t|dkFi!Hf7;#PKl@p7rq8un;$m;p z*GXTt2V-pMhPN6hbdx6^2R8lH-tZIaEZ^3eVB~uqPA85SCUC-`UsWEXcNXly&9#cI z;v)lW^kRw~mJv4n^s3w}uhrL(FJ7U0{ViU?@oU8|wOdgh(&xQm%HZu8Y0hu$r_r** zQ_`Ehu8zsG^4IJK&U+p3gO$hz5HQz>MR^#kAEoSzN7(EYMgv> z6xi}phbOwCmo3{IWqO;xf=+pkvj*Y1(XY>I@MMQ$#!Ef+Q^~XPPna-qgW{2A_MG7T z6YQ2MtNJtjXlxzlM?Vez4Wi%&bCgZF606j9^DgDjk>ke!U@L!H4^{_1agx1+bwfpO z_MYv}`q$&mmRF9KB!l1TPmR0YAF>qC(N9iKfjhs+D;jfh{6L?ndR>Y!=?{F?|3s+L z%U&>4`jwo<)^NMGzA*WFEY{n9o$eK(2|qA$n2zN2h|Bweq39#iG7)m~c_ zn|Nxi{hED?a*zQo=`^zG0u`1DJhTWl`;^V9eCW?_j&aavKWRnytvo70mM834^=B)e z{@`bRll|6PCGS(^tNO~Xy{U9eeokVzy;DEIvzeZN$=y_HHKlC`-@7b^2E034Ys<)y~*OTCM@XSx6P08sc znD#SS4`0#1!Cd?8yP_k{%J1VTyDi7Q61mZuEqO5?tr%Eg%`oL@^@bTtmX$}_owUE@ zr}e@(x`u!FNbmal!#fq$8i?qN7a~0)*4FZHoKNt^hfUV%#onQelilKe# zZ}chCr{P!pt936_zxfBF-$FeMlj}Jvn5@Iy#iVP0CoabplKrEc)_&@1eB#0D?SF4f zQh%aLRs2r3y?&k+=N)&b$H)Nm z6|ReCS+*9Yyv5M$8M9}4ir5#-rM^8s(-RMs zE7S9vbsX68-(zUv1a*W=e?qbT1UbW*KKZRac-TxgnBfO&e35vUAN+VmxAL^wliOlU z`NgGsEn6l6*yxkmgRJ?JzJA?0>#tzbZ~mSO7pTD|UD1mtE^+%9z0|wrWr#|i_6vG} zdyl_8X;MQ66wuLEyD`-5@fYQkwi-%Bx6(K^`Ne|C3-oYL(%F8{1i{$9Slk@qt^8ou zcc?i-B}@KXZzX-s41YMMM@NXKr@eCTKjnkv?BO{0$xrvD<$C(4a}BiA1E5EG+cBqn zJ)0s*UB5*O_tfDxbgM7^M*U$Q#%tCencqQjosMJVhk8b*ym{}h%3pCfF!ifvp0$In zwQnuQCq{dwf4o`4DSE((Dqg#2=Rsx`-zxMNX_W^AAYxW#0 z2P^r-f*C`NNjh*2x<)P4zqj9%m*uzism8?n6W~Wb#?RE(`I)jjJ>@CJHeGe)+g@+{ zr1>i?gP0OCeKEV7qucL>k;8?99{EdPvr1pgUpSv%%Rr}m=){%$Rv${3@@LV0!yeWi zb-uxQVe&UMT#^r%ON+0`tRE|SExqXz<1KXZE!uiECgd9~d_PmAr}>0F#GQ8P`1UMn zr62S&PFcGa8>D>ACuT-4?fnq;(+YsCe${+ZU$^()eEGETC%4_ud z9{BqMqJ5*ken&Q$=kk%y#r_+G2uJy*GGT$u9!#dS^lCmud(!y!llC!v)oj@Cke+fv z!-2UZwb`9N+rnO7+CfMDq_^{qu&3oO8a`>^&-HCjeqa3$&DU_`WK1#Cuw$Oeop>k@sz=#(2x2mmJgRRwCCyRL!`?my?!ff7D)Lj zO`E%UU}d8}<&9gk@&t3)`CQn;@G-|d{hSM&X88@TE+XCG(2WM}U^q2z0QmwT zZz62ZTRjYj&b*!bJ93Kfw7kv0?{xHjr4Kblui*Yf+kfD%yAXC;q*{4!mn8HI@t$?& z6}K~LdRC>|imoeU)CQ;BZa5+upvey?q0ac|PtM+4nSZJ!JPr{C-NTi1fyS zIv%%LvgJ{)ysf_S>W)-p58Ww>)s*x9U;IDQ9$wc&b~8>5)a%|B&UV-A!S&f!od)R~ zr5ax}S#<}kvlr%zG`JzDwpl@bk3n=2dR z%;eJRq7>B)S?`p+9xg4Td8d+5L=#o(gx;n9NrTIXivCDlxHB|HJw^UY4LN>l4ZmOX zHNyJ@9ei*fKA;aDSi>{4rh@+jjcvH~8q+vmy4FxpoT_#I=?ZVPL0|7emHcaj^Njvl zZGKM^)>LM0sWzdb3dN(L#fa7{-xWT=sQQhz@;g@H#|Qtp%I|jJB|-lWosm64VL$z| zPdC{YkJbf0_IQ%$X^*Dtb*b>vBmGq!55)Ge_?`6Ue&1909Tn_kgZ1s(exr*PWul40$=h4%<~(7{PRO3G~#&itmG;QDS3{>6{; zwx((@cg^~u&}-`oWozyh(VwBv_P{Go)N>^YKPA#*57shi53s7F!qf*Y>*K>4isC)O zUypcj=OOTuWLN6b4$I`f_3?TRPyVBI;lSjVnEa@Z%#TkDQD2k+_eeFqf0EDdTygIc zraWA@MT*~Fd0y_Y=sv;6gR_Evp*{)na?!Sm2Zw&jqS6n%LcFOj?PIR!**?B0nyS3G zLl^EX8eG0Ff3hL{esa{`#jIv(?l9q3D)cLd1@h>NDernQA|D&!e*9D)KmN+$gYaEa z7W*uk=?vIwUj@@%;K$VP;(fgQ&vo`Ow^Ij_WFEvj0e{Uli%fmzp0J^zA^9@p5uMv)~JtDPS)O5_Bkc+ zC#Be_;{RSWQ2NUu!r5Q0SA0i!wbI}iFVtm=94|ieJYQq-t{fcrF8PVCx!C39c=!&L z2mP=yj`3!d{4lr8C!bRu$v^MKUUzo$SbWsqe)6;aj(dr>#RXB`yT#8~y)y7qMBhs| z57X||V7yW|+Yk16zHr)y@!(U!IUd|QRuqhNm*~R1>N5YfW!4vXMDdCH+t-y>*q83~ zn_Ej>oUhD|P;iyXh@(B7C;#V$l+Uo2H|-C`R&~6lhF_zJ82TkqpS1sjg|q#Gmn!eX z^e@VPhc4U%&1ba79~si7VyZq_r!Z$nxSvWm_4QMw!(FJx_#*jP|FrjI!r9)LFQ*Ap z2e>b)^Nq;g8tMD-Rd4k2-e%msexQD{{%5?|>7S&Ka%+U?T6YD0I6C7Q^_k-t<)b}h z`EH5w`!6Aiq94;=89P3p3rBm!UfEt5&uNP?vpL$sV-(8vutLT=Q26amE_NQ~^7ak; z?$G2f6{_~N*9#m!J;o0{d)X2F#7O_Mz-I+s`?s#oXTrW8|2uCFI?Xos%v(J_yV<3f zhr_QFKkJ(>M|=A7Z9YG2%K8)ibkR>T>G~F==qf^y^nXy}Su3n!x)a9Urv&`>e{>pi zI_|muUn{#o942&;+NoV6=D{N$bduhd|~e0WRPqw%?-_=GTR z8n;%M{`afU=b2xy=;B{?gRcns*Mk0?FFF5}?iFW!(aY0_{9YVbzhy87oxJOGaMDNr z*}kk>T<`1!SX1~z;zRrBhxg%rI^%m?{$u)ZKYxGz4@d9Mzdt?WUp@bRd29OU{qp+x zAC7)bpS*tDU;Y#N_#aMwfBE`xfBJrWWM6)#_ThDXxL@CXdOtqDFa4AIa6kV;;g6`j z)1Ndf`0b!N2gEnsY_}=z#vn z9U+XpeiQgnpY`!#dhmbw-?YA0_@~j|z>MvQza`B0Jtyek7u4`U!X4qmgMOy)LgDx5 z!oBVrT1!jb^^yPG8ed+dc+{6s{x0x2 zLI3EtUH;=@K6-lKd4U^&|1Dv5ga7#si+x4Mey zBmE75yTSj4z+b!9?WJa5?k9m&40AgJ%QH9Y=g$A@z%2d_P&nu7FMQU2`*u{&!O-iN z^+ICWH~MD#zVkk}&od(Zw|?vMU((P0qtnj``jJIx-#F2-z+At5Pt#3=1)`*V`tg(X z6Ef<9F&Ou89n^rIU`XqWiKUHSoxqdZrR}#ai~7Am82zQDxqduH&p96|O12L$dZw3sPgHm$@EJNFp?!WU^4D_}w%$9m=?r^lBR5~c zw*-bx{U?1_c(jlHm*R($U#Blpd6+-y<)M9KdCu0s%?pL!q6>$-&Mky-$#`n{q2w``Xje#nfKq*9TsQr<^5OFq`7|F z&kv@o_4I3nGkrgOSD5xzPru?}((l>FzxPA%qd)dZeJDTmmF3@6`Re7_mA>`-_ts*G zwZ%S@^hd6rpZwVCWq#E6n}oAI!7uK^XY}D4YIsbCe=CL0(uD)l|LXWNHGI$#ub=nE z`eL^5JkhTYJYD?_d|~vr=g3|i;r(Mgd$Ta>lP3heMh7v_>DRcsg8sCizfU%JGAvG?J3tU7eB5npyhn^CE;nps%CTd2`^LV z$$^=l4-?MxSBOsi-ecSvOHcClmFI8UKIrG0d0uktDX#zd!M`hv?4*BZgXh0K_{o1% z;mm*MspH2J?7{q!_W06iKEEw!x`31P-K9+mzNvWFYFYkGeFYSJYnz6gT z*BOgKxqiCw7OnAx7YCX2^yic}^(bOov|8I+)`uE%8rK3I{UKZtHJ-9&px!waa z-X)&()Ux=U@SVYbzcAy?kv06NhrpkHy0`B~NB#BVzdf(Cz0%Q=fdgMCKk;jnALAu! zBHRa`;r2jB+>4*-^9yTo+^>Ww&kZr&^w%frvu}!)>$COem&IR8_MySQ*0)(!e@N)uh2)yLwWx)&j&k6b9 zXDXcd`j`56*a`Z-i_TQ>)kyy;(hJKocl@T(?k}7#nYeca|CK@C6-M8rPrB6g|4i_c zAM|>D;LPt23Q)eS!T$jz{RrS}yfH-_z= z(?_pk<`2fBoIl?75udLnD-Oqgp7r--VW0B`ef*)1;8?$$B>%}lXS`;9%kdiddkUxg zuYA7DZXqEn?F_-?-yQ3Vma)?{8}&nUxGh%dueO4SC}-dTR!FWzqW>{ z|2n4r6EmJ^$y1GI;AhwHvHwsO)b9et;m-Rmxn*x;{)_sMG(dhW|@~Q1)9(~{OO^ZcpKG|HPk^g}PL6SjhiN?ep57xqa41CJxMg zAn^hBmW8@}(ba|Px6fai-=BUtzCOT=2U#C){#9wu*X*u7{?hjFaQZzQy}v!(`iJrM z0@L5qUdR8jwEL%B#o_+D_WJpMj<*-MZm%o<{Lt<9FD)PTMgE9s|6u*ESASkBS|{k| zYUBDkg-;Gld8y0nKX2Zu@m+11G&tJ7mcUi}e>naA|EBlX|4Dl^%r>miaA4{`@!i6= z3+MW}zy6<~@vS5JG+ns8zv=j5hsBlpja5hCDS@w9+OYA8ITyELS)72(G}1pdY`4J+SZN4R5&5*MFZ2`@HjvhMkSv8~pwHKb(I1 zKE7dX_ohhCe8T#z6PWcew8sSQKTkgUc?~;H&-VSNiyC(CYGd#p^)J3YqYiPe7bYtIYG<)nh(?A}=b;^Q|rY`lAA z(DxDUDE$1u{rQ3EU)jE1e07W;!4H0+!i;IS{`7mi*607HIJwvrX8f(w*()cWdu_w- z7e#vT;}p*J{J*Yg*xGlO3+3vbbdd*$nW zzFsuY!^bF?_$#90-sD~ZX8cV&{Dy`-54a%cd%w}gJMzR~ua@d7?Mr^gDL&Aen%QQ?IO|1j`B3e$d$4P2^o*!Uh8`KuL9`QQ_3xW7I9 z#}>CAYiQiNZfe;6ojoz34#0d19Kjb z`7z%eC7ko!*S^-U=XuVI^zE-VimvES3Cw=xlft67Y4pXc!5Yu0#E*S!_Jy+ivj&?$?J&z z`H=VakpHK^@WYz?{rI;(@%kNz`d=t~ium8D3-`x+8pS6>d$Yshkw0q`!wSFpA#hhs zq)z{SAO8%=OZtXiH0)l_!e~#Q{AHtfgwj82f@eT}%zeqve9ZWs<7+>@{?~4wLp^!1 zI`G`KN6ZuMC^$Xv@qrfx{?>22KG#S3?tP8o^UdDxC(ij@!+ztmG3fpL_xzz@=j&gs z(a|^MaX){h%C}ZFz}@{vAOAKxEVw_)SbJyCTgvZv;g<#-d}0khTMt4m6E3}57U0DX zfmz>lMbGsO>m}A7Ptb+C^MOY3&+>Eq4_@&wnDs#NV=u<*J9Obb`g>QS@3K6bMIR9-WyIYq z+?9VWK<+C+e}+T-*3J1D!*C}B=1c+idSPf?fZU1!=fBWlaeMGnXSl;d{+SMo{}g5| z`0T)qDNS3S(Z+EX2)7#kn^y2!rZ(;QV8(RZ-5TF%A347NT6D(uA&7F!|ExDg3>C%8 zrZw&Ni2DaVIdHB=zb(x8G#d12dXXLY>4Cd}v%Qb%mENqqQyv)G?GC?HA9`lJ@Wzn$ zMr|ZJ3V%NEwR4)qk5rfU1b&0sBlF`GQNPzMY}#3rw#DXl_52w2Xgk^L!(JlogS{Tm zSeW>gi<`w)M9=4)!T;8WKUTy2_TFdsq3!)i(HALw+T&G$)86w(+`gxY2X|6n)}*-0 z0zc7V(Ql7!E8HHsEp6`M>@j!0W^t!D9})au%2&tKMdBwvqFMY|INN`J`PsiR*X8-z z=MQpy{wCzV?BJ%YkMj9{&Tm+|AEGq4pP%l}W6X3|{NPc|LPJvZd$Zpw{XU}6$8qNz z?)_~qheiMRu;z%S$=)3FWow&uFOV}D9OE6f&hhT{Bb&t+mER>s)qPN{ztHWui67(b zvlIA_fpfm;@1LyKNT1`?OHXVT)ZO`!eyx6ZN&8QIJ}dlo<}t`E4t}2hWBs4c|MlB@;kn)(rU(BI zp6c~ADezmL*0l5A6@fqV^rqck&;H+!4}WIU_FCCr-|>Q`o!_7{?vm$wdt{8kt$1;> zm^)FwfsFBJznA!YlIIhQzx#=A#JIJNdAZjwWx|0OFBAXxvZmet;v1*9d#`TVvo5Ls zgYYYxHkO^?>;=y&9<271&nrHl@?IcXjyHe5x7WvtDV|`B^6w}(%c1E*e@lH1ztrjL zfB*#^UXTQV{Dif^b3VM3a9-qeQVQxAM@#;U#th8KdJCR(h)cNZB2W&@YN2B z!``m`D_V{};1AX?>6^lt{_ZVJo8LYf>06?|TJ%eF;cj}T#&?BZ<pod{zyA z<)&uwx5_KmgJ90m5-<8-)6Qe`SiQLy3Db6;@36q0s})XrGM+z9ILC9IhdoI+pN9o6 zt>MT1ZPV^=Tovv0^*Xp^Z_OBh<9Rg3!`!dG_x5ISruxc@qQ8JOklgZqYx%HN9~FBna?L&d#B^%|CcW`t!}Xq?rh&e*|8EGq(%Fl@ z7w#y0VBmWL=YHqHe|CD>QEM@-3e~S59z&&>8!ZzT(@>;=RKE zJNRGoon~>f@KwS8GvWP&KNa;0{op?OVKqAQ!_$Os)P)1Dk)N3T0Q|Whpgpj^$o7D~ zj}}gS|10Tme8tqllT+&%X?4RDmtR?r3=@OAES4g(ie|1s`fR)`zw56 z;C}jkO_w(s^nTo*|MOL!$BFm+C@=L5&ibDH3-8b0iTe6syJh?BmqdNiein&8+Yiqx zF?Tbj+c~_duk`OX z3<~=j8~oeylMNp+;UIm>4wYT5eq*Ncf#F|PF0(TX+aCm(EJ%p9gR4Bg)~uI~ydZ2GjPv?i8q3wwS$ znmfe^-G;$(pBefbjbXa|U+LmynWUwBdY7gC*7Q?&s&Y;F)BIJDHTimXx_F>lwKiwW z9-6hFlKci`I=FoLRGlxj)_2)KDd#o&Z0>RTe zeXWW)+w?J>s1Wk!DpsvI_(1hbXjZ?)=Nn&Wd`WM|P5qQ0%7eWY*_%xDLPmuxy#yS1 z@alsJQ(oT0$=fu+lqs5vVbagiccgja2XyjO+4OSE=48UI@6{6qTZ6Uo`gf?|xB4n) zHzrIPa@&z!ZI>@)lRn#Hwr9%2w*k(R5~R0jqx-arpMCDJhKbX|bZUKDwp99*gN5F9 zS$)r>Sbf;)M;5CNMLtzAI8|?ol|8`TA2*cbPkPGAn@ceI?mA{(al)~AlBb$v5EZ|Cgk@1=mB z`h!z?T6(jW$~HlkP5ykBecI!#x@YLA(jLR*NZGOUlz-*QK}i@ijC{U>o#i3tnWfiS z%GX^?#P!N!+-_g9*X+6TXw6yv>BjA4&2?+0NB=Xd|uz_w4WKX;1HO=%$Ap`J)f-BAyf2>@_rh=Ij~X-(YO&53jpT`{ui)(|%u= zbhULmu=nqsRr?{%I*9rQ=}n%QuUCfY{_5PSehw~Ip|;_yZ^^O#YWABob7=Pb+W4k- zbvG9+s+E`2UOw_Hwys!N3=GYz@{a<6t-S3ilXO6C<9YUf-u<2BLj+0SC;vr@Oubru zw1ytNm_NV8mt8CQ`WC`Kary>uwjVX9N?tKEUoVGsdszK-ie`I?22An$cy?0bIZ<@#gDr{&tWkwoa_*VMNuo!9hPwWhOd zq|gYP^C=%wsq^n_?odX^w)!c`p|;jF@Z0z=zbgctILWq`75{n1pZ~l)uRs5}_sZAp z{(@FT$kEvuW z(&Smb^Vi(=?tlN$jS#DRX>O*S$5A$>V9mi*ISA~$=GCu$^`=dmNJ~4ILBN9+Kpy(i ze6(!Ve<#M-Pvp>-ucaI(FQhnMO`dU*hbbk6-?hcV#9@1VqXJS#mz9lj=q=TJYr)Kj zKCC6>qzlOTNc7!r6kH3qd?70j zK6EKcy|Q1k7=4O3^1U7>AD4WrebNy}zVqhH))&b9CDX)F-eT2|Do*baSCD+8KE~PE zYJYZX(z@d4flly6*~amij3|fLOczUg(W*6!l;}^s7S}!N)UG|H;&J57*8yzMQaEj( zV09m|Du>OzS`5h%N5B9Pa>=Jds|EU8=tA;E-du!!#A2=;??<{sca5q~&JXfH=bG;4`}v9S!kOA_X|^y)UG$BPJCwy%r8hp)#p{aX~&zs1q+eG*5U}`OQ>0U`_3>uV?je72BZy!jR!&UBa5)yRbb|YBU=GEP5mS&Z3d6A{0}VGyc=3*#*m4BOuN?=4kiyGi^2R z<34?j9_=HDr}h4=SaUsj6DQ_Q!qfWNZK{4Rd~>zdMc%B^zvIrlOrIUrg?n%w%D_p+ zw^xMILvvrBFV=p65{;La0@1_AkWOoO^@`Y{H-o8 z##Y&xvAAwi-Z6D>$@t#WPwS<~I`h?CM)lIQx_bE*t-JZBl)Z9b2`!*44tYL~8ni#i z%X2J!Qo)KxoVN|?&28VycYWi!)-od#*E>U)tW$)ZE^nT2Lu0;YTiJg7I=z1gr*xGr zv@@EU;*jUN(`ND8*l5CM?O7c5KWycDEqzv~xOrc(m^{++Etp)bkd}79_hRL&B6>PA zZyjT2o$wLQXSniP8^kF^QEZ)m_+vYIZ^r|@vgrxK)>`}L`FgwRHd<>J95zGxWxo1u zoE$Z+ zH`^&lFJI1*)4}I$Xot4TXk0H_7u_vuWMQjEaBP9AR9Q)}j3+4<8e;_lfpAO7dkov8YSfx>Adl9T;oe8lts>g~;}u$RUk)DutvR zanz%}S;uG0)hCB6j(q26!qTNGJL;kCgN!3z zeZLfE63K)5P*Vw4ljrqee7?5az9Tm_-XPgO#j=+MSzq?&k~3Sfmgv!JtH!PG!8|xB z8+VPXQE~ZdJ{QF-#>Z_vwCo+f`B3-q4=&}0U`#7itrpAMYf-(gG-ZxOzkHU}b+;?J ziribuYqO*+LgjYFUlA4fKcM%vXK9$+J=Cjf2VKeS7rWCQmz^$-+uWq2-nOFJ()Ob4 zi#}0YdL=8)wnQ8qocXlDnWRMu$#4o-o^hU3beLe|Dn3L0hklx4q;q*W;ML*V;OfCu zgNF_tG}yDjVVd13?qQWa)7|kg;_0NLe0G0AeV_hM+FT>fRw_QqNWL9i=_osVj1xt% zrS-1Xmez+`@6#8cb1gaFPUCp83Hi12y^f&C%W@Q(h^g1dfMmCd)6a0-;w)%%Q-wxw*;>EqVvPq?0btIE~oA?2aE4@24V-acU*e7>&WJxH(6 z`Dw@ON4b53gsX1*hT0qy?!%=G&~%D^+xn;~ZEq$k%c_1&XIieyUP-{5Ma@K>x6|3( zmj2D|4s?lg+iz-JsehYVpElcPy-n1;mZjq9m7`s}LydD#nh@vhl=C^4gf5zbitDb^ zf4Q+@Y^+Z|QGJzkfI@Ybx_rI$RTWr^LJ^6xP9{H23TpjB@6Xj9;5RB%FAvyoh4B$D zYGW|wBjmXarl@VY9`Ims*)+K7`R-HhSFS9Vm&0}gg7a^=oApyWbI8jvf_40j!dZ@9 zd;WlasnB~)G3&jj%V_u9?$f)^>0Z!97kK^bM0c81b?{+>0eu%b&!T&257zT*hubqJ z#Cg4~8ai-j_0YjXtL(XfXyc-)uo&oL>1#zy8IfovB)+7B*>Gi&Rh1ml7??RPOrXX1kcxO(Yn@Yw6jy?$aT85qdfc zYa?yu_U$ckIEWrDW5M*`HR(8&Y8DSG)r+nYF^^e4s~c1iw8b0)2h#*bRsukK)ZT5XK#1Go*$)}CU0AXU{XP4k#%rH`CcRdt|* z9Q}5wh4d$Qf%J1|9HxNr2@sF3HH8LA+K08qUVPhE93t3kNJYl}rCoF;6&?K@EIOuV ztXYbiF!mN7XONE?JsS(i5pQ)O-)X87WnJ-;%=Gs{)bdrtcsqoB^kCayqg=1QN(g^E z`!O`5oU8LEJASIitJtfxmD*x@z#noHFJoE@cRgMIS`k7|Onx!rj(i_}YUT3vgKTEY zh};Y3HkTQ;@2o;IN$is~H{~qr)6foMS9ER4(oC}J==QFoTf2^K>@vExGHADI6Q`Oh zilbolLF?qzq&QANYuv$I*V|`mCh+>_sq?hc&TrHp;$AU#bITc}nJOoI?n0Ygn8rOa zQ>QMeiDqSSW~}L5y9;iG=}L&5Q0TMPYs$l0-F8f_aF1IJaH z59qe7XcM{ z{%-p3r~g5MiO;#3wcWCEFI^pbiWZ%F)(vX zjd<68s|1{^cL(k)g*Tw9-?^!VDzg#%Uak!@pD^<*4aso&xl^9QFkYoSDH9xVR)nW; zyUnFIk@`R-586}a^HsImRl+NDoi)~Lx7nUK zce_FDwx6Fg8!qd`Z;_l)#dUSve`PN|<#ZH(Uro-a_$eb7{UYVBQ2e(Pw^diMsTY5( z;xAIv23_~n^4+X>bf^5IH8~r16F<6R*ZHE)7ReaX)vo1xtK!LXovy7l`GTfPfBYKp zcST#Jt6S4E?c7m(-41EDQN@3&mhU~1Lz()^b)Vvgb`gJ(;;&Ua*Znm)S*|UlsnyF( z;_oPqt6v{f8+C1|$sbevnBp$dbxAFrJXh$NudCi}hjtVHEy;n#Rd0t| z72j1H*H>%u;YU8#{cr5)nf6(w_={@w-c@_sszTnXYh$f{WxY_|`)lRRdZf&2c42?Y zbyF=KyAemZ>+PTRv#a=R(&t+7_RFWd9mQjZ;!VABZB{(IXX*NUt^K4OI*PBipKXyZ zd2g=iNj$v$c1BO)b`_6|emUg3tN63F?^@0cD(^;Y&sEds+TG~0;(?tz*NL~^p738J zeMWVyskI0C(XRBrLGc^K%eAW39L?9Yy`7{zvCp?^?f-u9w-v`# zZ_i)djr{v|6aNXtuagX}`)mEK-VW>SoOYP)s@}iQf5mR}S*3W=)W@037dy9W<--2E zvM2S03~2T7Cv_pdt|t)NaP`{FVt;`TOmO{@03kv#$GU_Nmw7s+#=!G>#21 zuIgG*8;7%{F09@T=nwS<=;?~pL%x0zPol?xAV1diMARf+zY(L{qCkf$7I}d|q`(|xyYkNH_1~l^hhTIv)9Am$LSX-8B71fiOiAY^| z=}AW@N$F=g+poomlb=38ahd31&w*wl{5Y}5`zLWUq32Rm>U=`p9?}Sk9m0$|pYZdl z-5v2@r*S72y3vt`E;>aScbKJ96#D^zAI8+rmR6O!BeZu%Xzh;B2!d5>{nk$&%Txu= z3fBYk_NdNoHV_Z&;xs5TH{-{jhiXT#?4I5`Y}%nSD>XsRo9venaR*kXMg0E4h@y=@ zKbzvmbTT~0S@sjdk#bpUMN48bPo;2sxTIb-J0ENBpK)>KwOH>7n5X_s zuk|v-b1WLd_t689nuqqEQt4vp+HWWstj z3u~F_?3~{6g0F8lXArgg;BIp_`P#Dd*BTsG;i0J6_?9eqs0cb zEoP#gOa&F8N-(34cXV)O9e%as=O^v9=IY+9ZyWK}@zbxf>~7WyzuBPie+M_X&T4NT zZEy7ZT!H&`osu^0lw9Lj%4D?J-Qc@@C$_~_kFm!-c=Ch)dYV~r&}eOXoQ`U;x)QXa zL8E_g^}D21eMTv9q^x9W_8RXzKg?!~p2U&~YrNdmgxc*rz+E3mb0+LF@b-1}A=@iN zC-JTA{Iso_uWUl<{oHMbem1TjxwW=0Q(n6FXiF`>U9-b}uIEF4Wqv)5n^UxrW&Q`x z0-o|AYeo|zb&zMvMOU`gMgPOm4!v&|IxX&&opMM=axFEn(r7-eb&It{G29tmrE6q( z-(gSZ=j1w`Ek9lUxcqGSZ{?SjYN#f&TRgRRn%?>N0=+kKR5=wT`T2SIB~oR^>E-Fg z=?m4X7ps>+^ZVG1k;_M}7@wBuyzr@DbnQ*^I>+zrYp<DlqSk=3YYske{%m>G|1>CUbx6vc2oqYT}0t*CMHkTP$7VCM$^A+Aca zlzpNqB-Q{wUQ*n>r1<@k z;wMXr-`Pq)H0UwCsk^B+9-upH%WU`-#p$swQN4cP=6!FzdEcA-XL=PqgmyN)n)m6mdMX4L z=^6j!yvd%^F6K`u_GuJdi)0;Re3roP@O#jbTmG?r(v&3=aA#ayg}o%MWfkiVyzz3_@&$sxiLT zRIF*MF=$rv#s7BNST+t{DENbH`>8WnNAY$up0rAh>;dK?e{^nKey*2@p2XT%uT#(r zZG(fqgC_uH>X&b`%Q@xTavuGUJhN!_JV0+V!=CBSP^EouA;XOzX`_D+8Y*(>B6*_9 zgp7qgt{tg!xvu^#D?0iW;=$Ng4!X}V8#PNjU1QzEGbWtT&{OPHTa7VuZ85CjPjAoB z-P0lMg~mv3>3vM?NG>%vy|||Fn#R<)6OMeBq<}_T4g7^(z25#z^Y_h33PUITdc8-- z-=rf@b3OgWCSJ<}XKFlGOdKoumEkru9_T)wbrz5A+1cY0d#sxCo;`-Ab`~`3@%WUF z>P`=3kH&+Ol%Jx%vL?VV}R-G2HFly1TuBLyhWYs>eR z%)dSP^wXO(t9`lAE{<0oYm2oFT57F1_{wtoSuBZEJ-cj8jOj*Y5AW@Hd~02yZSey; zwZ5sHH)!dpUJ}hjl6!CPska?(GY>pui&A6M%YPo+<}$5s=WR&$IcWR1QGfg_ORHn*>B->{q1qwO6V+ZTyw^PRD7zrklcE8A|Sd}}5?csyu$;6Aba zW8(LL2jkRg&nD#UJ8Pz5!BDLyLioCNW$3z!UMUak>?2>I^kePK`b!JeYT6xR%@Ml3 zRl{$s;k(trcn^2XlLh$RKCCHi9Q{>&_M!+@T1?k3TJ+otG6>p|2*jX34dSVZv;MBjE_|Kn9%1L!g{@Faa!PO zCI42@;}uE8^`hS?yjo?zJw}r>V^pp|$$zPE<_{fLr|&DA^h4FS;eP~7awiBMDgQ7- z`mL()u?pAe;H2NK0q-foF^?DEY0@q6H&l4a|8iZpTl5grI{EqT+oOX1wkQu6dn7(a zU6S;VVId=Tj_`>5PZ-kq_^`L1JtF;j8RI(9t_}L{Gy%LpVSQ529Qa7_CVrO+{{d0* z+tP2*pgkh`<3k>F+E1PS4dJ9ypT`IjhtsE0t^M5LusCy>e}|wO_`8y~S>eY8Mn2_B z`BR1q?ez-#UJERbUGDAk6$2oB(?wWGs&`Fq7N%~01yPRj9VkD`M|oBVr@j{`Gv2#= zlP(-|+JDmjAbEQUe-NVFGX;*5|4x+)2Y$T##MGCPRP_a&^hy8UYHakSO%wD-4ov?} zJb$H^fB%qAe^C`z{pB?AcZApL!u_@I$?`WCQd*@)|9W~g*(&{=YPhEgzpLp9sGrjm zyu)Duowl9yX_9}Q@Nv=JzM=N|Dd9H-{~79EUsd>}fw7-hD*J&+pZ2_4#)p1zln=b7 zhTn2PVejrex<*$Qs`#N();gW{O{P5P>mGuB^C4~@WowT9y-K0O0@Gg5FWU?Fc{Tj8 zuGjzNp&zeNB)`jb;ijFS?_kN_9Q5x$x+vZ!d?rLW@MZGrn7)$uZ6~_@zZU5)Imzqm z)g+c%uF4*f|I46b|NVs1{?s4(XZ?Lj?O`9`3v}TguKd&&{V(h5@oF5{Mz0Vzx5pV8 z0~LC&++$2Ul8qy@%>QA&hh<8YM1wlpD_mqezC5^ z%ny_==LazTG4XxUAN^>Wy_>90Azo}|fx@oUfEUm!!j zQ243={gL|{CH$%Uch5Cgd_{#+#dbBJ=xzr*r#{{77JiegN7YVd#J`942>F7OwgqqZ#>x2g_t*iZi}`|bG* zKlh=|aMYig$hi8uO1NHs8--PDbJ*_{3Z?x%`eLvDM@RjAQJDPb&Zu zyzs5U-H^w4z}TMS0pktrJNYTkKEhd^C(d^K1m%GvzYogK{OB+1Mf-oKI}b3cimYAl zb53{DAfd^iqK9Y`R8SO9)B}hDrUp^bF*GQGn8$>1EQj0KtUbFjLwWUDvCPh zoJJhQJR|<<7{+klud3Fe*b;R7@AKTdpnBK0*IHGpa_!ptR9SnONc&KI>MUXC_9}m_ zJ4Z}9Qhr~E&&or1L-Y+_LPeIo^^axXXTkq)+N{H3pZXWGPx`xnP5*ov$ukI=ugJ=o{($sxa0 zzol>Wf8wFO|DPK1`=|KpgJV8ZjG}&HD#KtfM>aU>4_1A8FW9?q4!`RK|JAdT%68tK zs{$TJWuQpi`3SnT{oT|Vu8Tu>X?}8#pPxM%+Ebd}@?PJcEC~8f5`HhjV_0@H<$iD9 zfx*80{_OkTB|%={(}WWXUwqjY^S6ok7yX6z&EOqyq8=pl39f2GBJp?Q8uL4VjsGFx zZwEdKCu)xTR$Ps*@KpYW6)$PNLpHl^d0q(?{5Zpb}|pF_N6(H zXmxz5Y?1#p@|S_%k}xEEB4HcuQm54*#s{28{3%?G|L~vu_(-*L)Ej#>e|;(7F?BwF z3js^MEq;@q8TdASr1}3??9Y{=+BrHMtng#Qb&Xt9``!^Hch&k1_w%6n~QxU-=Qoulg42 zr^D}^;$M@}Uzh!B3;*G#{9MG!=M8Y4@TcNLe)1OM-lzVgHLRlW*8F5iw|E8j0(^!6+Z`f3>az<)pBTKJ`4_4^{>Ex8)r`ei@& zS`hfcH^Vo4CWR$@2Trv75ne+Ow)z~=d&tXPm8s}K@K#)c1@h)um5;pYfHR4ZxNj zrMD3Ab++=EV1+5#jE+tH>lq#VrzAsf7i3;FLxhl^@;vc{@ z<}U#oU-d=LdsbhBCr9|G&wT&dO@To-+~(JYHuNz0y?o_=JHoR3FMQ$81y-JlP6iL< zdb~r-L;vadW>2%PeEum^mgj@cZ&A9P<{2KUG@HJM92z>P~BI{q&|CEB`{-<%opH?s9))$sb z3Azn@J=bxRkx2YDTw}iK{+jsv@Nv#K_?zNHtJ6P)`)kry{Qukhw!~-l-$8i~0Z+k+ zWM9mGKJcx4()_Oj{{pX`ELzW>?Pt&bPXv5Glz*2aYw{b?F-Yp~`M!vh}MG?R=auHFG}3jPrP76Cs4*7#l%@LS*l{?-A{ zBRrK=qX?^g8-Au)#?60|ke)f$l3d zvtVg9jy4CYzuY!pUIQmRb1R<@Plvw*Z0p79Pn377^e++q&-$E&2i93ABHi0y)4z^G9s7X$1^qKN&bYIg7lr(} z8m#%%=K&v>r@XN3kzn7+;I`PZywrzZuVcoo?|fUn607_TOMiGu|75V~&%&Ogkl!`f zBdocwVWls&e<^rx`29kDbY;PFC-5o3KAi=70JsBA^jK$apVf~JWM&ojcX3?WS*MJf zAB+t6@-CTVE`EFd-WRO;$FS(=Q?Sa?+RM85gSz?t_nV-v`1ZqZ@zqpj-1Eh#z*l+) z;J5Nx7r!+N>!Xq9=pIK3Uun1SWuI_tzuH@Df8P{e`Dy&L{R(fNNM8H`*wQDy`bUfJ z*YGvpGJV-U7HsxQU-=*N_f7FNzQz3NweVMGf2_YQzU=$0;rEK{Q}_piEq{c6Z~3e( zeAQQ_&&pHrseQ)rYc6DX1M>So@a!`FK&p@8TYbC-thTeY26agFQ}J8HSKGlAeW>I(K^IQ>gr2N%dfR%qY!q;5rhR{EVzfr{R%4AUdk)`~B(){s(f8`qZ zH!(0ue|HUXP+I?`O}u@RqxfU{24P=U^lp#%+knmf0`ZG~P!xZxe|q5G81ZBMheG(d zP#&@`<{t}|{TD_2IDb^0dH7bI(vRccue-PJhI$A=;%lyE_U}SL%Kr9I|I#nwj}83I z*1+#Y{^pU-M)@1ZUygkWf8U57r?2Tw8TLx`Yt&ra^WE;*mE&p4A?&%${W>wB-r!DL z7dphdWAFg{3RCoF@P1rngXnnhc&@ho@)YqgWE9^g4H}klYf*P`Pb55xtKsRp`0+<` z9MNImySW||u)^O1Y~c%+!86=+XMfi2fFR#;w@mUs$jc_tFp9$|3uxt|TwP(hycTdTAJRYnAmu3X4{8Zk=`FU9iACkg$L_-(Q{-hO&Jp2Vi{HYNzMgkt{YhZc*Yl^! z+MYi*-aq5scU$`y4}O5~)aFIP-$r;I3(c~>z2oxj3-~zvg91+TRsNU2v-1DF`Kz;@ zv)J=6PPEOz%xCdyj1!#&*8Jh`4)GlXxHo*|u}Jkpb;s(*lkl$ttB#8P307Vl80tgz zkW6wG`V#^cUwISrd(%G|e|66{1Ceiy6RlV7$H&@W|JeGze^;L_8alzx_xlj0VfAf> zb+-8@U@I@>r`G1;`nn;yG2SPI^C|pW_~U4=4-x;BG7geGKM}v#(}d1WeQ#68O_CoD z&$zY8x-ecUzmG)T@>}+Q5ZSNi%>ugiyjgXGub=fpcoWG#wa>33Ocz$fb7>rv;F|*f zKJX^^t^JGNF2&DB{Ab`RE*nqEj`r&r2XasJz=@gUF0MCVvq)HVEyg>f@aZY6_G9u} zP0YBpv$H7^(H!tFu73;o39!azJ%ftg4EzrQzwBh+KVRk9No%n5-G|~_b_)DE1ApJZ zUq966vjYF|z@HuXy#xP=z<(?7-v;l7fA_%u27Ctii@@)2ik~lz5B$Brd&5(k6-@xk zzR7`q4R}v5kJXOUzWd^{_N}w&uLrA6IikNi9FO&PkDf+(qHFa}{j25|#&3GMA3rzq z+DT(7pPnaFCq(3G)T+SVbD zH69qgAAU!$+KA`_@a9~5JH&fY!c$uI4_NK@KH}ak;8~Nse#6k--<{&yqtYm9H`Sk& zt~80HuexFS`@_$3|J$H{9r3BGxa~;!uf8(Qf6X5(KNcY`{)`}hG4(_FlgEipARzI7 zjKc2#w(whGulRcf{<(yw^5o*E_5%OBYVX4z0?&anC*mIoj`_Dm{3$aTkH8<+=MVH} zu*zz`dJZN%F7nTBxdtAKul8pAO)uw{XvFopXD5Te3~Bs=*wb9F((_`#w}6%RO9Reg zsPgmqfUjWjOnu#?fV*GC`d@D4`@NrDNs@a?{W}batYCh+gzJGJy}~=-H@x0lzkX)( zkNv<+;M@BC9pGu`D^Eqwg5ThJWJrIb>-_xYO~<8fVDA(7&E9R`j{z$UBF$$;bG7-* z&UCB;z!hRbTHjRPF~}j>1N>d_$Na)N_ygC$UzdKGe+1#h@$Z=mU;SImAMqRc>q?)- z!Z`fhQ{k^me_i}zQ{h*q!aq30Pp5BfeAVwf`f>g40k--rzWT?Q-)$ZIjn~0nm;P_z zzcb&r&l1{%Xd0cf`Y-kQBH1sB?cV?#r%&^Tn6LSe@ztJB1zUT*kNDaVA5UQ&yhbe7Gd8LKHFUUs^4+=dq(=Vps%^qKX4+2*DMN8=gmB*rVerf*Enft>X*FXQMe}5@p>3@cQP5R=WoZ_Dgw(?MVm7kVg^>4z~ zzpaa}{;vx8xcv`}^#3>bC#1qZDiwZv@-mKJ`ET~GtA2^E^jiHpbdg_=-i&*qH2<=| zxB17q>gT%Bzb^YUe^6ZU{6YPL%^%hkzw~!c>8pL4{<`8%r~kL+kJ^XkOL6Oc#irZH&u(j_a7Wn@8-Oyf61NVggNWe3}3jdRUzahRMV49gD&2QBHU-!_JXMOxu z-Xj)z{(EcS|NpM9@>lxf`lI@8!lDo!c-1o>kiU|#3@!>G8dgc}V?S)KI%T;w)^!9O?@HID%^(#~Q8>RU9 zi2oK1SLOe&P#-Fm`RDm;WM7ArzVgTH8@t@Er}LWK(eYsA$GlL!pVRQyR{r9zE&ulW zeC_(;uT5Y1n@+#RYqLN1?b^c^e{JD!|HIn##b2BLzkgo4zW8g?pO(qG_R!F0|1avd z_$sfMAJ^|DC0SQKHa@4@r}&CL<_lZI4esE@}5AT$&-9GWxX5YkmS@%7J z%1|WxcmyoQFTUDK%>Ovzx2o^sFXNsl-TuW_{4qbypQG3F`BUF%dwtbsOTYNakC-3l z&l`=se%!ys`r=DI=EwSVEcEn)-z(&&+S}t`Yj64<;%>0osOXU@-WMU;-@`=ugYn1u zUxH2lHa^@_-yWB*u%%CY*&Fj?``2aPy5hfp4cOKezxZp5|Fjls*B5_n`d4hU_VN*b zZRMl&EY<(*aH4BB&bsd#Z2h}I2fv7jZ@V_&CiD(JXi;6<0~Y{|TGx@@hia{IsE5g=@HIY8 z4t$mOAh4BpQ+~MD2YgMiSL@le;D>|!-W`4as5&I73Ao(DxqdZKG0WZgI>#=ip@_e${(c|FH@og6HrU&`?<*}Zfq~F*5zs^5yWHu>a z`_aMvIpFv34-fcXd(mD<>&Da>k?^Dl_vOQ7KJh5NuecWeWt7z?UOef>%dofc&ktC9 zhNL22`M(*wIR8%|Jj;LCw>^BbuLmE)&4WKX*pude5%~6fyTX5v_~P)D77PC_D)RY+ zuWt}V!V?MKaLK+p35wtBaZjZFR`uWd`&W@y{k7k_s(uXvTmAaIe6_ERgja(TseN_e zYVB)X{O^v*y7zl}CJ{A1mhvM%uJSPX0j&3hyGFQvgx{ur)3e8hVE|WubRyXLBR#Lk z9(!I<`c>AJ{s;M3QTeqKPBerMnf^%lhk2Ncsq?%-!211;`eG}uembPe<~+NBqqkmvXGhy1f=?){b@q--qAoZ^zoK z`yS8YlRQO`#PaupOP|rKsn7>#y{Eh~DqK6!A58jrj^Y=J!wWXGi?XnZCX$ zOp)GqzQ@(-<5c)fz}t!mT?DS+Dw{;57y0p{+9CFF1@D62@+Ws`)~!|lDbzoGA6$>$pJ9B@1$6a^(?Q%~xxenP4gZz+tnLiT#69Lbov((s96Yz)NbMRjhu=uL4H36sj zU*Df~{kP_fqE8lax-;P~@-W$GLDr22b0WMCe#7+`+`EFARyx`md=tJy1ODU*-(QUJ z?BxD{_Y3t?U^HJ8l|GC^lhgpJ74Bz=_Hu(tN zN5S3~!6QnkpXFX*!HR710Nx{lej00jb2q%2z}Ng|6n>lk?Dm~+KOI7OYJBem-|D-b z4>VTn7xeXfARMAk9wz>FV5Sj{G=J%f&-$|k*_<1{nC3Xr_gQ)t+}gwBfRdc+FD?8t z!5SNQtatQQ&hvK<^4Y*27;uw-)n|yd0Qca!Pl)fUllWc)e<9?b@Tdr@zA8SeuUfy5 zEw=tJi2gzz-UVM7!W&b^w=mo<;6$3A z-p^HaP$a(EZviI~U*nDOyVIFn2DbX4`gAY&*^nQaKljAH1NTJ2TSs_uL*G8FK3)c% zi=53zRUiI9-H7YQxe-=;dmwM|J;i+ZHSoL;zxu!Z!Pft&{#*mL`lIovBX~!gsNJqP zH@`Z-LpNTf`NQDF{Lx_3AI;=gWvM<&G+=nn$!_UkvX}>{Q}FAVO*Ct0&aLOX>|s(p zGUw)Q_PyL==&SzQ{7&s*2x+tSusVM4h=1k5Ik(?TWe8t*6XG`fM=h2>2L}FgV3XZ|$?w;oiO`fqyR_#;SeL z#2g(0z7*ej0gIoIKI6Z8dd`J)U*I=7!((eti)wOi{ln^);{P+U7Qddal(+VLwdKaV z?;-pfsbiw|YjbYCWAFDhznRVbqa2s#^s{owclcQ*akLbCCH^-9U+Y(rjn}VE0FMm( z%cuGN)AHwia9enr1^&TgYzO?!0#5Vw`wpco{(Z*?u!XPmX?(Tx-Ef=#ZSRI5Jf(N{ zD7{MGBCw_J3i4B9WxF7M82BapZ2~U2!rP}c1yNV9bhmMc-`ayK;2Hlo@C2~tbRuEZ zJ;Pd$-VL78Ecz0@;@;jN-V0utbKicp4f+Rzr^Blbe6^1o@mu@2XHL$orz(x27T{C4 zp63w1%N*&yr?dQ>e{Ie^+iK1)IuQ9GTxFAJM_x=F!*x-p?+Rah3;))@UmW<7|7#>K zem%l6zT!I#zQs5AMnB%{8sdBDrkq=!>WPeK`P^Kh^~-xaOzytTr_bhtpMrOSe{9g# z`mXX$W4dSx^+n@})eo)js;`RIcXyBYTHh5vUf+%RXWi-h->Jxm?gh^zF6oGbpXF-! zhPyofx?qp^sxQXh9{#QL4`+q;Cw})RJn_4x_{h2jC=bm3r^lX>^8tW|o#aCD{Ut_KDPq{zmo*#}2_2EYF zJMd4!Cef4!a&A1jCE|a;{g|(?WBy|)zT%7ds{gV6_!NIpim&z^>z|zBcUcQx>DO3o z=~w#RBL6IY)nCo`t^SJ7kXGai9~Q|AXX)HcU*X>zg@5~lx#SY`)#gPiKlMd%`E3EV z^1I}Toa;-ie|;8w9Q;u@QTt~+-|E8wV1;E^^M^~pHh;L~#hm-S*&|Yh+CQ6f?ZM##!?h`C6tx=X`|Bniy7|=(_zMARezg;RvrqHezTg`IU-nGG zZ}xOx{;l@CO$dMV+d20eT2&2(kFf8U#zdWpXvV^{<`AV{49>YS1SIr{u1~W z|GMm7-Se;7lZ~&JexGyWzxp)Mv*10r4hs0<|9E~k$L0MPSbXabHNV#UC!Swxerj0u z-2{%)r{@F9-(SPm{5#gy{Lu6(UuV7q{(C52)sMeoyVZ|(%S+sR=+saj+SV^|msn)<^acK9{xXmJhb`6``}C94G#PRT6z6}0Z##o zKQ!P=)+=#y>B+(Vd%!QjyE))LeBgh-)i0EX@MQRgziH&t*P`49*rIWXo9nd-_%`qX zuwM1-*IDIyrCKUSD$gmOCeR zL9Q%UFISq)XM1LkNvfTFt-O8(U+z0$iml^_`o8l~{7pUIGYJqYxW!*c;Wu`^vTkMF z&+68yTS>R1vO#6Ga!h5eGEp*Z9i`g7P$Qy>7MNPnQ2*__giLv+ylMTW^>Ym}4JJ1@ zyTPCax$=$;)TM2J6Dh{p3701|IFZ_u>FaDO5~Jvp>0H6M$bJ}9*s==ZgA2S4{u8qS4P44RkhTg~AW{n=Ryy$yVi_%T{Ga5XA88sO-q>Nrd9uZ zQj-*tGUa(z8KSy{F{_+TqHXsbaaX#eBO!lESN`KhNm3#l<4CNl9HOFtR|^flQhAjTP|-x`7|#yPnuUWFK?c2UgG?j=Go?ozk!p~`QeSI z0VTVRJs$$#ine9SYMkoD}MgbV(gM;RIZ} zSKXK84S9Rrm>ylHat$F(^~36o>YnfalJ>dw+4ck54{JYxQ^^{%->iMozM_4;J?omt zxb)D-GnpKY=B@_n{JQ7+7$27t&g3&XkERXhpuLfqmAOdCb@r$}(}_{>Ii9_Q<61H$ zC3RTW-sPN^3G-U|_{wZP>74DHo0q#Mdu^+CTXk^SvRUDbZP2+q{wJoeu9C6&aUofn zt;;@{eVEWPe06+YmKV;D{*04nEu?Tly2={zR<)cyBa<1R{wLcp<3|?DAK(5~ADF^X z-GDNMOjYKX%rUuByPn?lz_c#htssksoSwoD<`ZX<3Z~HV{Wk9Q0hXl9!s5ywbe zFR540_1Er_sRwb}_uvXA%pWK-Dhip-I*DFSyFyf9Nv655%OX8VG?V0x?kQ%+f-5V@ zgmJv!R(9bIa$Cv`OOk4sP$Yvo|EYD}R2M{1hWI&Ql5-~cFFW|F|C#XLg(E8BJ;6G09dZ<<;CzrjAagkM=TQZgR<>^2-L5^Uz7SEpo|* zx#TOdDDUS6vO%pVO$tgB$K^7Rab>7K7Fw!opyR*K5BZaKPs%;q`rqbBGIy#M^5Fy- zvW5Q?%x4=X|J*qF*T%{FZn%txi}*B{9}DI5GdeM5<$*CJElTKiT>ot+>ZmH|Bp?6i zr+zTu93`Bt!Ep(se#iF*cuEk{_?4+4({+MWQl3u=?h(?5|Umk8}M&_1J;G{FfBQ4)pz?@>*1&qLw6is*rwrwjn*grC;fOCgi{?mpC6v#FlXtfjm!D%&BV3(wC4paY71K^)n<~LjORmjuZE?y& zjX;XAA#Z7V&|5X&uJ<=^`6HQN8fT&~xone^G-@-nP5m}Qm~9t0)GD7@8BSZOMGNv@ zZLke(u7ZEM`nY_W38TEc{;w`QZk`E5g8UR(Q8+g*{~|pg8xO^ z)eRN*%9Nf+>GQeZJnoOe3w@<$yWWSlh#93YlgTHUDk%ze#yN7yboMDrS0Tl_Y4MKl z$_5niN{`a3aR;g>@JBOss63n0B>hYKH|n8)Fi!S`eo=gg?=aj?!&|x!OzV=QPMR`g z7;Yu~!ZgQHytH%u%~Y&ck(-lyDR)V3Ms8;Axm?d&MT3fLcCNUJH_V|6Zr7p--_|?) z+j>WRTaVnTz&P0lS-HtixH+;$GZm&M<)oyBROOQbJcSqPRo;CC())+pRzKvn{y|S0 z(@3>TzL&E;-jy_sk+$9NCuRYzVbLV$dR_FJ6J|`@hMIROxU2u8cCE78G@suzQ0LB_ z^H9>MQzu-a?c7p|TSjJZ8l)r1SwBaaxu#Uoi7^gW zimQhcDQuOonl&X=B44&DscOX6Z}nNt)mP-2N58|v{%(c`E!8RAnZ7W;C% zZjCRrzjAck`c|H+obrYl4S$U?3TqXTOwB5HJV*;F9ljs!*`OyoA#B0dJ^grNp689# zb*$2Ma=w-Q+rm&DvTZiyrhM*+zY;g9W@UL;{wrP8QTgV5r?Pt7Gsl}9l{eYxvU~t1RjF7fa^JBW%>3E za(V8n+(&^WBllb+_Zs)(cs>HlHVfb4Eu`eCzs=~H=B<1gUi{%>{VwmP{*QFsaMLFuX_ zEV&s``&h{R*uFY&0U5ct+>S}f$=(`dy^?M=U>`h3$HFEr|^3co?KP! zO8e@5{Q2h@+?$B&i``Y^Q;aRV`9G{$PZxn@+b`0Q%I9Tk2(N%WvA)V9#ul&aj_+Ih z{YAXURbY=?+}{hUAF=ROmoJrwc6B)|w=5O!iWIhZ$EWVA-qsN2F}R6Q zy;A*<&6Yl;S6EKzvhap*U-=@Z{={TV&*T;%mq$iU#b&=BBX4t8z1&tUO|SV>!F8@k8kqmTsJ0%NM)9Cb=5)^Fd$bzBc<-7q9Ng z4zsT>;VBQ~s>z4(;Mw@)lBhqmuw9(3QzX$E)^cp>h!DBfd;X9)N5 zIMqv)V~j1lI_}5eS^4T-JkF>*W4UEug`Jk0&wbf!_F24rxmPoJWxiPXnp_;->?j>3 zr!cJ^xwo0iJ|+2CsOxPXi28)^M-*AU*K5T4n+6x^4vDsl1i!b0xnxhJRoPU-52 zUoIX8=ZEktUljh3AUA_{Z|SH>$;|+(JWOwGa(U$B;(k~4CBCopC=CiT?uUTxp552g zTr8*bn!eiMYXRqxS3jb4{*~*agur4uYur4g@)XO1Cu?NxnG-Q58`i8r_GBn~l}-pL z;^l@nfWKZ(%X*IV!eHeMpk2XVr8T^U;S>D z+01FEuGC8DSCGP$9Z*S9TF@)f5?1$0YD#L{Zw#_!tN>+8viZc@p!J`j+4`w}ys*+g zm)r9B_16x_I;yI2iw(s;CGC@J70V6Tz4gbf)pjx20hC~V04P65e-6^0o%P4vbF!NN z9VwwI+m-pWYzGpwYzMU(Z$o?M-pt>=4jOx+q+|mcb5}e-cxV4Qg_4SXh z6x`MS?NC4O|7G%-JRHfYETC*nt}eGMSIAXm3N9_VY%Vt_cW`dc%pmeB=fVu_ttOMy zG|w(>o~>=3o!Q*wpKB3$CLPVQ)0?|*8p8TsO<%XH(=TbTUD9nk`^m+&Nol{NWj|$x z)?qB%o3q@2I=Lic9Sll=7#C+n)0&ED zEvB`Y-eP`>xfM11t7=VZ=`qOTN)evb5uCi8m3>hlBLp@3=%aU$o{H>@g8_~5a+qJB` zvaEh(S)TiqWz#Cl8sd?>@?7Mz53{J)nWT_O@@`R`=?PipZu{^}z9L(}|5n+GrrARC zY@R02G+W*@JH06%*kmU)%}&81nm`71;M&O{#!T?z_-#-S{#S$>VpJb63;&KffK|YM zTm#;ZfHcBw<;C4OuJrmgh9=_g8S!_48MIB`!)UvxKjgv3WLy<_`eGFPHgYq(-zN_ResEXZ}~Np=5PyG_e728 zkk!B381#kJM;n&D(r5bXI#;_d-x?g--xd6Fke7Z>{HFhR5~4PFUl=!qmqhp*a0hfQ4SbzbUj=_} zoJjnOxf)+s-y|EpXt@7PRc|Lve+&OS{FevZm;pyvVTg3D`$k+9r%3tRpKF}Is(&rT zgwpaVZ>9fe$4!#<;O+4B_#O=Q2rr26 zBj7B&4VroR;rsf!r!AokB)FMVuRl@Gh>v9{gdv zN*?Rw+rvqOBigN)bkGl&xCL1 zzKO5C)%g8RXN*Af`_Lb%eD4NZ`Ko^054QTU)fwJC)iII!zaO|-|0llckMY%ije&3d zm(qJR*wU+W%wGc!4)sIlv_B2rGs4XYFUI#qSo*I-`rq%*?`+AtBSLz_pTd}D;V+ux z&tN<*gntG0-%fb@;6!6+UmKur?Q8htB*}As_aJ`+_%v|mAU_q{0nE>#97$ev$>hZ! z8}XGsVN1_4_+(M>9IS7_gTaqsgGl*xAy?EKbwXL~kLiM=lj*-TmZ}dEssHE?w*E%_ zM_ca4{fEXIOP|_{o=dE~X#C}War}L1I{69yCgi8^#0aO`qwL!rzS*bn6}N@|Tjf=L z-O;!5Q+plQI*X~`BZ9vA zBa!NmD2)##@m;y!y|rT}58UPVb$L3ZZ`?xP*1~i!833OmEAA_;bIw(NY6X|zG+j1S{kjJ}5xG~`=KgI<9)yN-?UuhO;9~#xCmmErxgUL9_Ym5?| z4zA`pQvjL`R{goeA%1^I_}k;}8St1o&o2Zl`zGNx`y{^yIF?uZ1)NCoHC#>p*(JOi zqzxUB6_?-ff;VZz{v#eH{|=aJb~N%S|C{b(BYY2j!$-jXJD6(WNb*$KB40Qy|1Nx! z*E!|N??FzR{YAjXM_A{Y^S?OX5PzG9FMM8vCI3H>{H9O(@$0h;H=!orO}Q=)c=8ke zJ8K)iwxr;C!s{RMN9QyT#joFHi*!!&+4$#qm@J}mz7qf7fR{hQb0hjplN<@}8)511 z49E1}dl_56uX=HJuJ-r%Zw|QmYkvOtZLnARC&DxR@d4L{_V_H}HG%(3&{y~s_~Y<< zfi3*i$*cXv^21W{JAmWx3n}^0k-X07?hC#XCtBUP;o@6*{%^}qdc*f$^Fw|qKBnNS z*cYc)`KR$C&JXpUmVY{zd@{H)#~-NfE#DqnhWa9WKV=u=eUUZ16OHFgWcm56qrC#I z@1fgQgP(F2>(hG}(h}a|K|Xyhx#~v&zU8OVEBQFR?ZI(*Y!9~d9PyE#k8K;m7yc9c z7!za>&w{V^+bzfoUy{Og5&px+em-X52`laxE3XZo3SZ9$7QXO>Dg0=JAA-LXcxbRk z_`npN6yepK6E68~IFZ^fO|Y2%H-7G)g`RL+#zpYv_!Xx}=ZH_>YWkAD0=zc)!&CB? zuR}f^{&gvNwWrvg<9&)v7yQSsZHy0C>0N+7POs`$Y|qJH z%OB-$8*toTPEO&cBRnnV_Z?RnMZ)U;4POPO$ra}}Q%ikC*jvJo&P{KsYp5SOSG_*i z<`+5_JP%f%EV>%J7uSs(Vy*;Me?KnhFJeWj2Uuwo{rrhvkKy9z@xVvTk>oeS7t0?6 zHu($cd;Sq#JeiIBj`+U}_+Iz}@f&{$co6uQz~6@Pa0~p_pC~@zIKETB7GFC2bNK1t3!9(M2CIEr z`KRUY3i8Th(c?jWu!pXF>Uq!fRiCuSTZ~_iu+BwSU1${ag}cFz@n;d%x$Ajkm4_nj z!;$COK>$*Gd9D`UZD_zYyPM@A&9J(vvZ9A%AVc8;?4ZJ7_YeOtBxKMS6M z6P0b~&-r>k#3z0AJ*L0c2JC|cW;-=US0jH1zPAF_x$D!h=aGPQZo9_s<)vQ!A3S*W z!E5_$3adUDmj2(+HT~*N{&&vXH1zt~mqv9r-j_ygbEIb{Em*kO3ID|<{>H~0Gs%5; zp9uDd|8m6Fz9k*Nrmq7{M}WuRL^}7qH`jh4e|7HpeqcNIJdM-g=^X6+kzbB;MELjM ziNj|KR19C|jw`>val(`f_SNAx`xM?Zu!X1cDS)kfR34JG@(`XEVeQMZDLCGjMSX*X zuXDAEergVYUBQ z{-l)rZjrq9X;*&6`?RO?^LhAY|JGaheaUYq5Ii z{-}MbKd|Y z4l&;a--7?*fUAf2bH3H)MLMTjdmtX|p|fuZ*z8mPr~Hfizs_Jwuku@b%Wv)TKLZ@^ z^RNEL_W4(Q8)2)(ckj@Q+e7#`WJEeQc|2De|8y?+Kfy|qD7U*mC*0l->Rj+G3D4#$ z8sBdQ+xRZ|PUyw*?}B4_M2hmVPyM^ur|_Rm$^Q#%;Xj3abcxP!JCXc>;5hu#qwuwU zrTN@&2}4?cY6Sl!58VdKPlJuGefZnJQyUiP+;G+J(GIb81|EoiLcmJDd2={}z5r zzs~X2+(vcK5tZkUcplApxRk{irR~7L|8}$=j|LK_sPCAJI}`a(50kyX|A41HLv-CZ zzfYppSVY>Vr32T8gZ{nn)&7+RQTp8K28a25$xUD9SS#;ZI%&Ue=Q8~26GY1Y)`S(8 z2Sr-Mrdo{$b=bbKK)d`X0>vN6en}TEc^}!~;HP2Id@D(^w6IGqQ8R`{vi(iGJMG^{8(P$$MSLbbB^=nABMYRER$if#LdAJg`N*I_fee} zsee=5jr+HmVC&zsuRTL(abJ6#+pGTa$xwbe2YDOta{(Vz>*s%x5eX0GYFOtMtNynY z6B5?*hT*wjrAJ|kbZ(>aXGsWO=NfMYZYL&G51i+^BC@9^*zDP9s*nH6FrWP>gx4dq zH`(7OlGi!R{lG_r@U{f2ExZ=6(y#oA)89AJ*SW`%w{wqQ2X_VQYzdLhK^Eq=CpsI2 zr#2^2e^m|7`VZkfu+^|Sr*n`q`MVb??|`iGT=du5Gj9ERpohti7^AWKgMd3+;pcnT2CQ>{ z3Bs*$>XyQr%hkfuIf!{M-LRuu=J|c6rw4q;7rw4c2{dEi!FinMkAL%g?L}pHDjvfF;Xe&N z#c{p-^ATU?U=+ZrVAO9ahdL`c)9LuYInS2&~^>;SjDm=Aq<7+;+ z3s`kdw0Qfh`+n{&50l~GP4R2aFS-(ZJJ&@Hd3n{vSiTlsEZ-3R?~(tO@Z#{*KI8E3 z2V3}m8R++QKbLzVox`ND>R5-U7YF+1q4oh^wxd7C;<11q0^f(d*W*MVftOL?&8BAPMo6Eh2NL^7XHh- zdil54BA<`sPu$JR|L`m2Cst)$`?vY>9PkdFwAyyD*zZ1HP-vJPza>D;9U zu=gtNiPRsA<7)k_a0B>;)jtSZ|DgV5F7jrd)(7qcoBc|!`i?lgYX5P1)wi0w!aF1i zPv*hy_L)7$)tlM{g7Y~1d)&HLcFYf<46JGBi zulev`u=W31Uq6xZR+))(?(OdM#hTNJ#J?PDe7zsv68&#+BE7Hgjz4~1e-(J1XS;KV z_Qh|{13H)J!W3Q*VRhbWzgGWr4w3TaUpSHGhc|E~T1RCw{dl4=P9*#Z*BDa-Mf?T) zJbaabXkF(9{WtQj5^fy+SKw-#NaysZf8Nf+WY(N)!vEs;Q#S%W0e264o#WH8Y~}mB zL$31sfZF>eom;d$vfBoEom;dQ{~&_xHgD(XHUOxPI;s_3jSN zQN!Oi@Fm|Ke=M*1Z1ThJ&bqY%%ycBoD~Pb`DD?`QBP}uiBqU?JHu=)!{(b)&!Jf_U z&n9#U#rl0TcvJA1A^ryzXWjZ0&Cbz(z?b6d68KdQQU3UCzAbs>T`aG@ES6XOH~A}` z_2>w0@i$6_32YFq2(|8b0Oa>^Z1RI zvaUZnA@ui+U-9SaToXE+bbSz>jA~q8G=Da{)yKX+JkJO3&b7&7%jFS1Bf`D-!1qPU z@6enVkp3R^{5MIuqjPc=)nBQ93yrB8_nQTK(^&EpX)(T%ud=RxKTUx_!as2}+#382 z_Wav%`S$;7`fvR9JSzOR2#=eXPr zzZZFD>kYHIEPqr=KDNJkx19Ta-}p!&*vc{Hv5nuhA@tgL~x%qo% z1qSs5t8JS-I>+Np@YZ5N+IPJT*J~W&d&KShzVQ15taEQ($FFy;qW!n$To2-I>Y?jj zZvk6*o(O+bZsqT9R6iJki+o|tUrc`V0H0r~^CE?R3)eXO+LZiQ%Gcy|j*HS_4feG@Ip@l^ZNS@uo5Rlstof(9 zu6X{|0z48Y()>-&V>TbuIV|UZZ9SpYq?|jaMRicL8@Lr=FLQ{s6Mx^K(mZY>)a%lRxS@!Utay%2(%*s4kz2 z6A7P4_%Z$?_YLb@va7%yLV4;Om7BoLa3a~Gxo2$8!(g*V`S(w-<)6--QQx6HN~HR) z{x+`vr+}^gEBrmc7QWtRj|Ru@vv&tud^#uMZ14n}Nb4yzT&?_@+>vwhr5#DLNav2o ze(V2r?udR%XXlEf&nXc;7J1`KU+V?2{tc1-cZ>YFB2yF@^vrzUAK7@fd~VL2nRAb4 zC-pcdMENx)V4aIGow^iJ zeCca`7wgXi8(;DL7I~e6qPgR7QGDv} zT{2<=UHe1sKVXXNAXdPm`H|2*r3VAW}nQ5O$2wspW~X~WY0z+ESj8K!_aj|a4Lsga7W-y zqtZ!!1Dq%nKi{g?IC~0a6xOKkEHHRY#eS%*H(F4 zepe((-raM5N-)dyQ*>p?R_v(hh;2VT<@1utC#7~HBVT9k$pYzY$(H8Y)m-xqUG!HT zC|uynhph4}ZLhP*m4wv~Z!w~dlz&ZwzoCv4;M5F~px|7Aut7tiq5Wt2qubJHE{|J| z&t;NY*2-Ak8c>=aP@3?cSJ#=ONy}tC{`-(zTDI^yPS1OlLMX_DAGP~?{8c<*yj_+{ zmhn-(|6h~MyAOrGh3`uJ5$DnL)#t>9v; zE_F*_&Nj_W0|jf`rC{HOs7}Qs+uDR1-I9{-NugU(-7Oi@O;fNEN{@o5Olm5V^2#LB zEvZm>M(Oc|ke!=N_;2;6#{a~F>eV2*Hc9d@oNb!N1UgG?pQmbn$$qOMPjdbuuOr3N zGWcCY^>~-c^0|AXIwfgYleBC>9#kp6J0&gi5>`n><+V7X$LB<;lWn z)5>SamDiNd#$AM)f?O?5BprL!(}u3fW!0qyq%|8dr>BluM<>tZE=%jaW4`liVdqs{IWYpKO{rEIV@; zf5rYaq&`fRxL)9we^!4Vd8MxvPBbNxnUblPlBo%8TAh5)DSU&^XPp^#5h(DmtG&)e zN?#}E<4Vsg2c@{0__g1bu-tsG=7Ov77jW9&%k*?#Hp?kL7lQNnl^*R^rSvKc zmACfsGQG-_Uf&cR62i%&r~S1|uaJ_fN@1l#I%&Pt?UNhZ-DVAXN}s|~dbBTBT?#Kt zVY727_f^JL&dP^4KIz5fZhAvf`@W3=EC2F1?e{eey@~io;g&|_p!gJ?;?RDDW>+4l z{F5DV{1%_eE7n_AIHsrYXNQgSm=crLgaodPbd zpXq#n?ZUQlvA7IdeATJ&k4a(KlP4^>xPJCb$rVz#Y7Kg`Q*!fD_&IPTai#67u%h^7Y6&d1-`j^+( zS6DixSN<#Y=BMmbe&z{BPWkd0xDvnRx25mb)XzBIOs{8%&%!ID;#a;|I^yzE`NZKZ zOW_qMZ1F85Ut&G&zZ~P|QrPrfBmZK#kD_vsU80z8db5#>>*vB0UYf$Dr}~i(VQPG+ z30U`34s*fP_zSqWzNr4m4$IH+0qdT|`-$Kh{Kw$5@3F-vxjgsev`_Igu*z9jq0mRKkj!8o1J;;Lv;vG=Umi)7l9YzUL#+u{gu=HD#50=l>ND5xnHX{ zEvkP?-|Q6bi``3!yAIce^jdsMw`?!RX`ZU|#aQK#hbPD8c11nODPK(Qxs={VDQxkr z2zt_0y^?;MzluA?rl;^EYw;rdPxLJbH4fk8>le`lxgi;K{}F`DwJT*bcSF z7|#di(UFVm^&-NH<(7giO*UUMtn{0mW|yT;b}4Mb%Tn0%EZ-HT>bvE;VQ#OsJy?8_ zn~k2uXV~I1tc8YXeP93!2t3IR(BC9G$Y1n60kpHf1Rg+-^J`jP)3dB6tw8*eq+1o= zo?8U@wfbP{S>D;nwMI{l*VQKTYdKCKDX&dRrY0q|$z0wbKA-H!|5{h=h%SS)UxTzY zz5q8jt~r6_k#&)eOc zZ{;7=gYf7a>WpFz56)T}6Zz=fb7gqWuW6Fh>VLP|+qM35ZIk5MjJ}DS>;9usa-+95 z`M60^RWDhga@KRH${ni7CpA5jx}M20{`X2g>Xp3PD_PbwS>7jkw@>n6pX6))?~r`a zC;8%}?7Mx2e9>o!*AMH1E`O3j3l1vF6iReT^<|~WBc;ib(qte0vj$$0oXG#OYS$ zSegvW9I8LgH%vY!B45{29F*z-EFft?W?MoO9S1IO)jMF3_7fY<)%Fw9{#;YRdIu!Z z{&`yG+T0<(KjB9B!_rft{jU0hj}H9y;O+2Rons~5t%=_j`1*EeL;RBhmVPDvSYK<5 zrcbW9@83TS^4gziCVp!V+TTg-Dy%`ccNv-sz8vIbzwC|eS9)UmwPqT}uQqP+UrhzL zl?=aydm`a&C|tvLf%{^k(kv2wJ;KLf=nmZ9+i{cR3~&LzzG)E60wZ4ho*<2@g8Y6? zn(wT^1Mu$`>8lS_8H%JIQNIWFrl}?#Aol*u0Z}&@Q#76{Z@|v+xoZgtr32hilOgSdCl%f`-6Q9mX1jFsJ@sztHY{G z#@GIys=q^VqIK=>srs+Hj`I(biut#?_NTm!>u;Zw{=i88)$RSakwxu+iid zzw#%Jzb813Ujua<{}8anFZ~`VeT5h6OFq_D*~R)DQ~DiJ`UP;TKL8x-YyCd9U+p1| zUv(|kS9>&l)en_L%vXAiuk?u*hkp#%!XMYgw>5@KN7`>tx^n{7{(O6Yn|ij}uWw|8 z75=)?&nGUc*rz@|wr^eOzm)jm^r`-tzV?4DfP3Ra+W%GgbGbwGTXej_7e`qAiDB8F z?*H@fEq|21+k)fxHJ(}gdN+PQ>3NxZqV-0RpWM67L)V_R051+$V z_iCKeiknbwy#H2_&o~{azuOU?+KfneH?D>i|GLV*FY6ztiD_wP%ojXqvA-mj$f-Kzks!EX1essRqaOV>H<6hr*i) zw(u0+CEz%|R#AMCFGN`O4o5z=S8D~azQ$$?U;1iuh9AZ-)gK$5yPV+1E8FigJ-^U= z@D=23J}7;Lw4%Q7^ax9THh3{kbbA$hNO653l#lX9c@gJN3$W#n`i~vJN8?1A{}#Af z{q0C))Exde;t>h&!`1LWu=?v017G-05#Ia`|83A?fxjzQ`hN-biN7~E=F1l2Yrj&e zSn>Do;}&|`ng;!M;hzp){fJ26pUKtqB~O)M_j_@f=icMn_SFGPeh==Oyf))e-L>Cm zrS)6h>wo*VAkrV1(jO7&-*>kkf7Hi{(pcelK~8_e@-g?b@9{j z3&-}ai~mR}e&JYuZG7dY`gY6DoY%spCzDG1X=nX&KObqhc-}DfIdd3HrXg|-f_+^tw_Dtbw_H2oM9(+`!uk^(F zqrkEL$zap(jDBmdzQGhJ{;jyi`dfoz{k_1ZKM(zu;0J=f_9q<-z7r>sy#=l&ulgze zJe+7|(7)rq)W1LIKl)$lKmAWXUi{0OJMZ4 zMuJU$Ci=I4hXna=!IkK%PKXr0^yBzr{cW*V`nyUP8UvR8{vIYu|6KfW`Zov1=|3E7 z_GmwY<&q~1(Qnm%G3e`?)&E9+;7>k&o1gvG_-_sRpN0PVx9Ye2*~h=+zqJ39p#Q>u zslPnvYhEL2l;ih_)U6gCChfp#iyH>q9XzLW3zc0-sKadw>i=!rG?0-Pm zO#|);UJw2*0dEiP9EG3Wzf}Ei4YJn%zDQ-){!yAEiL{^T+u(7*{ATee;v3NP9*;85r0G@zh8irUpM9_`WCgyizf%d z7e1ac6dg~0NfS;ErVK>uH|6)q@cVk`_WQXHyhXs;pK~v8vw*e#=TVeryMVP{5Ff!7 zpTG6{=vnYgUwr+xxp$BkU-lcnEy_p2)0ipJ{+|i|`K;cN_WwKypMIkx(*B=ka<%-* zw($F(Fs*j<0QQZ**E-;TpnoB0AA}7e;rk=3{XdoVZ$kJ7w)Ve2DGT!AZwk-&!Uw=J zd{3K9@>le?4hCrdO5uK?zt;YtREgq#wAwGUKKS~;*M5>ck?#|5i?)aSosm- z?h)4hp^cG$KiI4AHjcu}!#^E-W8lvsJmuf6q5LJU`fKr@319Q`%>rNYdqncJd|fO4 zhwJeNO6y;Tyz;+aq_6SB;*-Akrmy`?$AWEt(^odixZmb}7}Br(H0$8M73`P3u;~kH zd@+2+#y ze?5@<>JvqhznH7ZYya1~!Df%r`zF}Z`+N1@?&{m$hGhf_b)s>1<=QIL2c^FsI8J{7 zZ0VOhmYy2;n$M2HiKKrpSJPL2b|u*QGsXWtIF6qoq!|Bq!Cv2)#QJ-{;rv%hVaNXN7}Db`Sp>9Za>U2cwYvr`GxxO z?E-#yH{UO2D1qm%x8M;PLR)7G?x|EPU5?=u<>#{i*QPUg`zD^dA75zBXGp z7OZC`k@hE1-~5t?$qlzLmjZ7Xu=vwRtMN}5>-X=zAlUQIgT4I+27C~Fm4%%bmpvro zbhTz9+5-N+xjwiC{UPvWzxsTU^p$_6uiv|p#NzK=h3ir{PukT6Mc*K-XMdZY98cyR zMtW3cqO-vh!2>-^t^l75o*wYf34TBHKHL+{Jly|Y*w&}+0&9G&3HdGlOzesIcY=*S zp_ES+ke`ba>HLA_T=#Z}=l&=BZ$4f{N2L8S+i`t5VCmNf&&7$Puc=V1-v}J*w*s5~ zpN`EWj}Vr9f3Ot1K51KojOa6P9eJ-cUs1h3W|9xU*Ls)~z?#4GkMO4v{_JS#8{wNh z!dh!HtoA5;q z7;C@Df$*OT;c34~J&PX^@T-$DZhx}@Ic`GY-_F(e+OO|+(mNx_Yrj6W5K8hAhVDYX zC0BiPBGUeuJ-99j^0I#mu-PYjwgHqdi^JZzV-u^{jyP{^z`9s>Ct|mnm?!xi(Ux&Hor`#U-E;HGx-m| z`+$2(8T#%L|NKxM#-rZn`~4=r4&!;(OKIQ8*?2Dgbg=QY-{#en-Qyv@wO;lg@XZPw z(t4TjJP(uBS7(w}X>hj%dG((f%dG$GaufSC!+R^pYd_65!5;+tDR?>ff`Ct3;LB5O zP&5;~fa@m#e>30Dm&ry)-IlOcfWMiC$;p4pxV=L*4_Nzgk_1;qx^;fw=LI0~d!er~ z6ls4+^;epsiq55c$8qK2NcC5JL0o??2j?A^b=E6<{kS$@?GLK@vPr;-uYlj;tGCee zPm1^hBmN_Iv7Z-MHaQ}H-@z8kUyVOqscSa=D8I?FVt%Xtcpt^MKj9Ikh*chc23vWw zoZ{zqdqwHr34Key_3rKcCW9eTntA0Goat9o1muRVPHUzkolEe`-p9 zUZk)6i0?oz-j8@W*q#TsTjA&LR==vibeYBWHm{2QfxK6qi-g}J{|tY3D|MLsYT?<5 za989FYd=o)4etcLaQ6snf6mLm#r-)q$-4a{{vG6X9><3G?L3at8R*Ud+k8xXeLt}Z zA8dU6{$Ksk&=8*X&(ymItH0VmvlKi!@Fm|9Z1TbrQ~H|w#rosGvA&+)OurEarD*)T zl{^zQ-9DQXxLy;m_6rdIVQdx&*Kswh{W^QYyG2asc*0}Kl57{`PlA6x{yN9?`+1Hh zZ1o8u?Kjz$>#+_|eh2#a+6OGY>Tk?f{WSiU$e$0c#)+h_zR~#7uL8&VyI_y;rGE_k zYMe;=k~O~c_XNlK6iJbP`L5YSW9Ks=zXs8H52Ac_P+-tg@INSJz0Si#@+Xz8l-K^1 zz2F@k_$&Bu-~hs(9Ps(zn{&ML#)+=oE1UdCT%UNDr1d5LG5RJi{x)C>U;A5XtQa2j zRi2ySxAHuX#laQek`SLTU1Slfe|!dP{o`2&`}NDehwvo7W2CR}l@}Ji+OM#Umt*Su zdEf=^iL_t8`tMN=u^(esf8LfoUkm>T&#=}DdV=Hif^ESggT9_etMS|OsGe8P1>5tg z%IkWtmDiHa>@Q0CNT#D*rm){2`Q0(#!@(_bE7zyrJID7Q%L2dkxmma0x#rBGG`}DG z+1$^I36)&n_s1LKq1!J~ed|F1i+?))m_IGzr}v9|;6lG&Ot~e`6h2D}U*44UYBW@{|5N_|-Vk>h$mBeyo2b zw#4zj4z89mBz@Iyi(mLu?i<#Aky=~X%1QIhJ9rW0R~@kA^I($~R(=|m{=O;wdf-_9 z=#>7>DgDc_&*DG#(yV(v-zAD)eWS&v_|H!1>-ov_WxwWfar`4v`W+(uPII#ES+oy* zj%Zu(7hLajh z-a}dU{#tVyk@o8>MPFmANa5d|3V(4Fe%CtY1K4wm7f-%qBO<-8JS*V)pJ2X({C>!Y zJ_&e?he=Bw4F6i+zZ27~Vc@~w#(_WJscdos`o{)*6nGh7O$hjM@EhO*1AY{|fcQ@c zSmRk6{8rzDC#Ue!DcqX)OkVqes=mbgfgTUG{XqZcHO6c3jSct%ZM1;#9{o8UCjVK^ z{0YC>glPQ_=zq9g>k#X-;O($~gMh^sHoo@n+#a5usYJr6?=gNf!rCvCCSKg{?yb*! z{`W2S`od2lZ}`Pev&rVj_m22%;a21?SmE325ner69Ue${F+au=zodN8?G^OT1=r!< zE8uIv&*JYJ@SnlW2+#6=pRcKp*k}El@LcSR@d*0D7}qiXGCcAd#(Tm(1szeI^b8>U zn>VzAA>#J@4(uh*LW-N2_4rf56x zhg^?~FjLS~@SQ1~kL0yqs`?I#Py4HCE;Jb(QM!JA(KhG4?U)qelm1u8#rkTyv3~qK zto>78gWn+NYyZ*1@b}=JNc*S0OWaKRikL0qig-rLoO?e0$g>mePx=G?CP7|U_1UoY zE1d=I7x>?F_WLEO4-$3jl5@}R>T?b6k3Yuhi({Ne(6IJvRsM~YGPJJz>tC63>lJ#& z5lMdm*I555aGZayfUW+f_ixpHt!)Xbeh6<1CY$$@Uw5G+64rj?hJSDVX+B&{xHccw z`H^am@%fRrgX8)2e6Z@2XcqQ-!*!`c9;<%Fm?^|6cpuVZ{8RhplDp{7&kOZOxDosq zzfrytYrok%?Ro1E-_HBz-1odchx|IJI_JKRw*FM>6M9~=@wLI|oLjqW7W79QlJnos z1$-e`{lSQUmw>mxZ{;O<)sOLk{~Zt4?eI^>W>Np~>>tVXe1}+HgwK-0Dtx+tBLB@J z*&h}A8U}f#PxC=b-<^l&l98mBWnV|a4eG7L8)1*ef2~1?WZyupW}ng{d*k$Ie6jRs zf7Xw{_l5AaAM53m#lrz_IVG3WCv9b+e6)WnS?qqJfSNlW;g4Lc{^)t@eXu=m>3!l0 zV5=|U*CQbvP{e_72TTnk-Wkew(y0&L_fwIDPO~So>yD7=lTCb-g^i7QIw1Od(KIt zpHKv(orD%@LNyfOKrXG?vObK3<9K`#`_GVn9`ht|e%LDs#r011{yumD?6Z{d zwRxJ4_IdIadgmwQlGK`?bR0i^yd}14W&6wFcL>M(4DBx?{S#Oec{%E1@Kw{8KN)|~ zpSAq9f}^}VKF<&@j`v->_}r5C=O%BozvxfL_wkvH@9z^ueC?lFXqNqDzo_TCUM}1F z`x|=^-YoOY=$9q^MKVu;y`KIs^HML8f5NK_s5eY`r><`gWFGO$`u+7P#8FP8J+?kZ zd2I7;N3}oOZ_f7pvG0bL&-Tu*dI)Tqiu1d=uSXSn(=YY*zy6W_oQ8gQBmTz!MDP7s z>A$NHf5nF0Yjv5w>4o0w(;n2XxIVeRkHe)sMcztJd%txE`!Q4hd;fC>{FnVt^BeWm z{^x{3Z+bUTmSuYP!sY(`rlJ2+)-Qmcg;_!dR9)%CH?!S!dqL~!wi)Z~uBKwKMY_gy zdv>;WSL{*xncVcQdVWB`xT~@r5SRbR;?;n;tATS@ZE3#GDm`lGtUKFXRWAnQr2bxb zumK*YbysJNsLmQ&owa*)*63wvI_{rxWf@(ds-e zm%~+Czy4KMTR(PbFwF&jI@`MzGPHny7WGftCTwf#$De8bNyhULzbkyWk1j*`Ng~$0 zENv|P+%}}@?P5KQrPDQ&cpmJsa@A|uEgwDx8AzqMxFIr>Z&un34Qlg`p)UVOwV013 zbGVJdJsnk>>a-q2e|8Yt237m9bg(SJ_IX?|Vc(LcrC58PzW?g}8}pC<4IPvIVP2(B z`xyT9q)gIWwcgk0kc}Ok{B28GlvBB9?C2iR-ZQejXZ`k`4cdFwZ0{M-(KDjGtE;`Y zVlu*Zref4}z5lFx^E@TgrZm4x%rg=k^Na+?JR`xW9Ep1?e%uz@XE(1(sW0cLaXyy+ zgdgX-2|qpLXBheEV$uIO4W8U!^HbV~pWWGB=KJ6VkAuA?Xybe_6X7m`F6Dj=Ys4Gb z;4K>QOlJ#x*r$5)^jZ7myi#R;rZ(95s!ZF(^v%EfHHgLef?~fO`*UAEGhySn%r2hu z*38b2^P-jc8H8QQi@>E{%d49-n)@}e;b#&&0y`JydwK@$A>7U4JXj;}^9*5^(Qxcn zZ%)r+;`}<38a%bZGa4LzjMs?|7w7%4zH||Gv3x9#5rkc0Ua--GJ!VtUhac0^hl_rU zS8}A^g+Rw;OXQN!Z8ax6vZ5PkC9{4K4E>&@U#eSKl<>P*J5e}Z(;28~$ z{9N^M-}-SYY+1N?-cE(}D?8uS40wySS@kLW%xIKc^(J5pOfJ&@Zs_i ze#4J;W%{?~c;R;{Y})$L?~DeAAMHv%&%h&y<8l?{p_KXvyY~2opRS@DtskQs+zU@6 zj>}ByODE~fG|V!o*ss~;rxP0&(~JG+f}=fjAJuz(jr{a9_AAOg{Pd#lB8rQCCc!;~ zyIH(`gr9TRUi#Or3mX^XO@+G&yExyRQrg?k8KM8Li z?Uwd#{`l%=E|!&9vZTXMKZANQg@2g-ZkzUgo77$Zp|KLq4jjU=!WJ_J zcFi$!;A*btoH=k=)|1%2H0vJLSf_hI`|3(>Tfg46f&A^MUhb)099O+KqwPfkJ=I72 zJ+PXZY-&pnllK?-co|6b-f~+bQTj6~6;8ELy&7MyPOn!h)T<%&YH-R<)mE=s9>jE1 zV#}lmc(k+3E)=@P+FE*8V;iN~XUnXb?B+&>`dHTYO3Spi_3p<=?r}W~kKd3#i>}9? zOVXcp3H``F&!;~l2@O_}{;X!GkbgEmi}PiT#C}lDw)0(_2*>k+A+XO6yq8NtWx0;P z{5h3jJp8_i@K>_h`Nv*{Psw~2_P>B1%)A%;E<7dk_QYS1@aI$gXC4Q5LwL{3)3LWq zn13&c@i!wB@vq^oc2{_ZtpER;zi~tAvCZCpD|>L>`|co~KgvG;58jgFc^^EHMUj2h z7HoYP&UP2Y`GiKWj`MmaE&`v04^@d+Uwl4S))#eAU!0%t064x6aDKuAVc!uc&PVt# z>)kT{j0?eg@HQ$D=Pz6j-TPT@{;VHm{<`7FpZU2I+cH0w!I2+cFI6|gzQb4aw=C<@ z-*Ry2Z)>>pXWqh}^A$Y;ubKT#X05L~S(L?K%kPXt^>+~K6MjCk_MR)H{TJb|H-F}( z%%A5=|78_5o{;yyi{@ov5>Gs)Q&&{Q< zQO;Sco}VnAzSTU7)_wF_uu+^<4_hauWFr^uc>$HxVAnqNulj9D4nEJW7893%&M^ z{Rw;h*;gt3`Tjffj@ufCzqd^ckzZk5^0wHQ%qzq`d}qPq_Nm*KWs^7R3I*{6!kgy( zU*&w>Rm10HwteT`xz)bkenHJ=X8qY0)%TYVVxwFSQ>9w{KabxwaFn|cjt{=C<|U$=ku;T8Ez)+Ot|Wb0qa`xiX*<$7$yLV17WCx~D2LfDr) zoVKLo=>ul*zmvbSNxRJ7j|!ff{kQ#${^1Jn%J6gKN!bjx?5WmCEHCR{l-GGMRk})# zu2|plZaud4@np@slCW*@TAAPeU43n)S|<4w`u?P~MdrW2zabp;S%25S|H$8A=u3az zQ-r^7y;uA9nxXtV`Lpj6{ucfNeRce-mb}&e&LdprZwa{E-_OC3zoR~&y@RO+Nfv`` zpF1-Zfe|+-RCx7=h{7q^2vu!W;_lkzU_Z$AGl6~?=lhh}FUcX9zjx8?p$B^|t z`TI}$>qo)aUdQqG_?}Ya&-v_LhoioEd~YrC=lpiJ!@Fan{5$oT=eI5YCw^S_=dZ!% zzw56&KL-D~K0ofv{;YrQUs+%1LiRZxZ^Cgr2K|L^+Q?r#CUic&`{Ah1|I_ljuxd+V zL$AW6V)^+!Vw9ix^Lkz8??kw)&#%IfKmA=ze!`#mn*)E5zdHu-d-vE6Wl{W|c6HVZ zCSu$udOjJiMrGFC@+W_m%Z|1g!cVJQc{@J{h-#_00zcJS={dXJs-xm7)NqpY%l4>_*SpqGvK%$pGEwkg}sCS z4u;3%_|6Bl72$QrLlX3N5h(Q+!J%*FuNV7W&_{iDJ|y`wg})mc{*EgAHS>1_7uTK8 zGmJlp^J~fF{8=x-aXd}mv3QZb<@Fr;vb-LH%kokmb$?)F*vcf4^o_Ay@A z@vTq6<@i?5?eMSudHj|7N8r%w&*K~Zx>smR&o1_*Po`KN=dccY^Y=A4_D}Zu7kum% z^?Y(ivQ5$d_gII2=Vy}b!zkKYzr$XA8~Yo2>(6hni~1vXp%1?E5at`;*v!Q?<#Bi* zd4C0;iuOMlG|OIIgzXW3-Y>MJ{_gV0ns+WRCav*u+IQe9>}Bttf}KxgY3zG)djE`_ zZ^icEnQZU;F1x~q|AY9$8vZvcSbql;{?6v)vn&tH{%$^_o}Xz%2OAO7dw_MM=X@M@ z(pGtosyLs_`EXaF+P;TyY47#Cw70+9#iFdui@SSSFPf<4=L_B!{jsFAY}Wtc%=&xr zIWt?n&k&CCl{dw{WTN!pX$8N`{vSg8S91G%Bl~Cl9gmGNko2dqo|)P5dlru4VS2t_ zi1eJ##r!{-?VZnM0m8SlO>sUK`Q{p{2YGO?7G-^5=I7x}xu3C(QJlYIBi17labI># zJ-?afpt9!;ZE5`ZmvegRrxOnSqUf#b>(u7eIrtt)c;13N7yl94KP>ench6Cu&zt4* z$@x^-#p<=}e>e1>5MCwo<~Oxf8)Ms<+3WpY@Tkng9;oN9JSp#w_Q#_u?Vp6hUOkuK zK6>9RhW^U$)ZhPal>J}A!wTEC7c#4#m-Is~`+d>hl}UQT_;jm2e#YIhja`PgGmaufIRKt@;>Vzcx?v zF}N@By@ua!*uM;R{uJ~2%fjCMFZE9s`X@NqZ-z(Z{>w|S?b%%O@dr6PUwR$~pbh#@6#CdX6X?uiBoT-_D!a{9VNM(%-gl z__IHtZS)7cK0naWcYozFf8!hetdHT(^7H&G%kRt7kFxya@b?)y^T!hZQ5NON)!Wm2 zRz8Ccc7CIh_ogi`c^i&Zu=B}0K*XsjHvMRL8}jq@%+5b^0{mGPMf)ETo|>qhe`XwM zPszLujoE61Z9^63OW6m#bx?VU$&b&2cdM})i~Wk^cdyLO*Rm=3Ju`E2K9>DC(e^ez zi}LJt?bVmakKY(6&d2frx*ck)o@cTVK51-y|GDuIoWJOv$k#X9lQ-SJZ149pOA~+H z%)4Xn{n3QH|6hQ2hNC^Uf4VfbW&d<29LM*IoX^|Cx8(C<5cTJ3_;dM!ZT%UA?>OF` zziY$g`TG#|<@x&#T%Nx}u#f(^=kHKB&ff(%S)_`1L-LN;#{SE@7W_Aq zwv~J643XzSAAB+oM{LgzuGN*yCs{4N7+!<2@6G!5Guo>z!ZdS97K0}e@|l#Pegf-K ze^J%o&QH`04@uTM%Y>IF?TCNL`OJTT zF6-%T@nisUEeQnR2=F7k~>YMXxJV*JgmE)^F1l!Qx#>b=A z!I2;Jmyy5FcYLW%{~Niy9;C5Y6@L?06z2o!hps14Jzs~c@oV%lRG8{5AG3LVqdz799Q4U3m~Rp7o_JNISW|9F0NV;|?2_7^tdd;O01>i^bY>u2cocVFS}b3^O-Rvi&BL>-l@)cwYj)hHkf9AMSuX{_ke{ra$>i zbm3oa?(aY9ui3v}g7_n{|KERy`b*lY=JZE=x8^TqcK#LbA5P2m`=a++X`7%-dcK~I zra%3BW#S85Z&)9W zE`>*CcK(lF!g0Jl!rr#kGEn~0$M@gy_pKs-#_u41kzeN*w!e2o$}Rm8u2&Zmj_)}= ze_khkoR1gI*^%aZ>)@PK)GyjGOYi&}&#~QeN^!o8UC__OhvIw@r^4Q&EAsNReFHCVORDKY!9OSvA@qL+v?A2udmYH;~(~qklt$Wvn-19MR+}aED>YpW~0Bp&~MK; za^pvPHHOLkcZBC+pOh~z!1vVb>lHOt@6J=tSJ0VR{q5L>-uV?A+u$)!#!Rip&vgrk z-^XskI{Jf`Ol1rdd?bsa{`agyKXSv4^xL&jzn!o0B=mFVu@JrCWRILfFy+pD|K-&A9@?*#6*IQDUU*#!GdNIU9-`+F@M`}+t3 z*Zx4iHj5PFg>?sh{62mD%4b*_7}SnTMU!k$y{LnOxuHi^+eF;s4^!E~6`r{QwAAk1m zOMg4T;cwby9o0s}AIhTqg8H-*>(di4RuevsaP$|fe<#3Eet#nVC-92d{y%*@+~2|E zx7^<=Nvqu7N8z&kY(LBW{Roczb$$v?iB@|gUs3P|_jXiwQvWC9`l$Y|grohc?qhx! z>gNUcRQCUJJ^w{dqWbz`UpTHmv(x{!&>wS69e)k-pg8}8_38LTHQ$OZ*!eErf@8i5 z?SG8FQa_sfhW^m09ce61FE)zt_hTJ;=S#7CqW`7+W7wAVkHcZ_^=dBc<9f9c=Z9^} zVmbfb|9XCx_rH_ixc~Ki3AZ3syf5*3{2laBUPGR$+tUebQ#OHLVZC}H#-1J2R-H`z zxIP*GC^+K(r=S1nf9=A*_s8F`hINB+T2)fxrd?zeF56JKQ0uA5>Ltm@svo`OfrD6v ztzU0ia8NbQW#OvoNm~Z-H=Qxuuw2S9dk6ryAB>b?KtLtFwLBAS^4o z#!37>(sS0u?=}5?wPe4SEZOf(OP&FD5!c1FFO;aOPVID>4L-W z*j(=OZScg*o#?GEQEp*B8U1K=YWbiGKhHFHMuRQSk=PGo8He9tr1K2nDJ)~poaJ{U+spJu z!^Z2`5lX0ncv<9Pi*k)%54jLk6@WdeF?w+&Uw2CK2lEk zzIz7gcEK)X`!KuXRObJgMt=2E>Ss21G5jyYf=r^MT=N5mW@GT6YVab};Ki%KdsTy% ztaezW+F^12x9zZG#YZPQEne-kSGCiU)t-w~doIrZwmp}u_Fbgfr?b_yPO}WfeWs3U z>8)4o^@>Zi;-OLU)*8mvs~Po*XVl&V_N!OsxhoWDJvZ5JtLVz6Yt_JwxLzN`xabpj zmd2&$hptbUn`Pzdhab)p-?z4p;7vHotzGp}b#>31yzR^14lYg?C#s(({RQVGuinr% zd7FlQ!-D$_Wo}=5kIH-OcX9R!-*2lETmt=S1pDU#Qh#zoe^x_(P@#W$p4#7|*}vc6 zt$}{0%%*=LT&8b7E7HFd-c)=Wh{bXTJBkBXk50rC3hUMPv^*Y5BA-sEzpcdRijt9`)&U!X9(Q?~MM$+VfuVJE9@PIkLuT2uz>3^&OG^mqb_k_r9+5zb9P! zKMXGYUkI1}FM@4?lsTwa6iI7d?IzF51BD&XU#2l4>+2u!ghKEBoBuL@rXBgSylgLG ze|+Xmm1-S-%g6dx=6`EA^1tlf^)n`37bNk!8xCRXI|TK|!KMDvhJGRPQ0hN}FYjfP z>12Er);H$!>$m&V=a+NGD(dwYdiUpSIQB=q?{!MO&pArH_fDa=yiAX1NvtonA5mUo zD32H5*ni8%_bx})=BfTH2#5aH`_<2oj?Vf;_phIMo|xO0yLPX?6M2w0%A5!CZjklP zx&3;H{d@#IDeL_%avQ>*(HQak`xNT~v)=Ezs3NWJx~{{XDxB&VtMtzKT-Fn_{XOW< zho30;)`A@qG!*_Ci(>lvi}Wq8z2LIEIOMJJvV5+9%ksGrj`BH>iw#9mt+X(Ika=lb zzrgy*MD_W67~yFJs}Ht)mZN>Xb-ubjO!TBe{OUXY|sUmly54Jo^D#}CNs9@`l=TFoh%fqrL%VR7YvCgrw{LYetG^ZhkhE1^3H1YH@3&;`f7dP6l~Rp z4+vYgPi9g4uJ38qn^F%I{h40)V;Dmk*YI}I*54K0OE}p2`y<#kSkbsolPycJfrGJlg_`i$BW?T3a@})cidwxt$ zR9|20AC>-3g2VsEoILtJJeRNhm4f#?zpevEXaDkigiH2XS+c(?5WK)e^>-xq<5O{e zzR0@VpHt!3pOvt`8~z@PV)@*|y3D`FEAp@Zr{L2658=}P({Snk&v5Dg6S(yM7r69q z{VM$*1DF1fg-ic8!KMG3;nM#taQOfJW%ctoZIshCrwwBLl|=mhIC>6g>-^K6CZaV? z*Z$OT@C~`X+P^s-j{c10V_IeYmw?OsdwnkRKL@_b{LcxO`S%%OH?m%Suff}P^woFM z7KHt6&(k*G&vQ_5+&GuW*0}LwxpDe3ynk*#o<>g*w8nj?A3%DgesTDR*eH%mw>^85 zZHoR6V|{y~dR)33=f^GY*4Mwsv)=DiA0)h1X1~j`e$wnF@w>AN2)&$H{Y8XB?{|BD zg}2ChzuViGvN|ZU-<@3v@18k*_lf_`%=)*zF8!Nc>Hj^r^zU=_(*ODm|KI&T_Wy%M z{;9Hk@;`$7ME>3Xd&qC>zvbmP*K&V&_1G#e%ZDo5r+lcwef$q^_-ANhAOFw6rT>lp z5B>Yy-U#yh2Nq=%m1|YjYm;YXCwMq(`(%pt<5`FO81z@b>u3GZ@Re}H-@mgS$Gsri z6#46{gB>@}Mcim_9XG(H*0_PU;nfR!^-~MI@BMqw$9vZSoO~C;zotx;F8Br33)-N? z{L9@1pUSucf46)Jc~qKw9r_c{znk^)$pxQC;r@*Md5vv~d`^S+qP~^->kGEATb8(S zz1WBNFAkv2<3nkFhiCpbWqa(;3)~!T1V?|{{GSNN{+M6;YmtACkNu_iPOs^|8diUo zH3l2S?+~|Ty$*R+)@7W8*UGaJ@dx`)Se5p#!(spL_}6#ozn!u#{r|S`?|W$M2TQdp7u{ z2HQ55_O{I>k1zN-{Mldr6X&!dk7r%-FB+`BQh#lOKPlMXY4_f+{GIk);mD7_(|!tE z{!aTfg?Q|FzXa7vYzGVAv_Jzy- z+Y#{XEQ;S1$~Pyf`+Mq2`)A?OUJm=->+0+8{5k#wu=VZTe)Wc@VB3RVXP)!=wlwd+ zoc(9%Pr^R*+oJyi?A$EMyzV^7c9Z{|W!L*QI|s{7>UM zuXo^k$&=!DVIyJth{~7YJK!lbR@yT(u#dg>FQxs`=)>Oca26%*Q91tXey4n5L;n;! zB-zgE=#Nb=yzr-z%httzf$nGFKSQEW52*QWeM2++`fr;KLFdFm-;grdfTH?e_NsV zcg+uGf8%)go!KRD4>pS5soe(0{%P-b&!s(|D)g~m84mjw_^xbM{5aNI@prVxvpyc5 zis`M=NbfSXM|{&isz~4O>>k0FZLp%=_8{#2UF-v~-#Te){Xs>1?S~OR>}5WUXtDk` z<@knw^S5gwf3}4Y-~D+Eee93F3r-QWeiz*MULSjk{LC!U)86B08>>8gZOxymvGTjV zJ@LO@<}1+u1zsw1DnH`(WOje{EcWmJ^}9Xed;VBw6u;x63)uRO?=cR}d2FAOw2V19 zx~-Z)_=bYtZ1C?J{BeVQUlQ^C9dM83YHU;d9q=<*@0N&XbMQRq#%A`rp=IH)AN4f% zPjK{a{GD*$&-P?{f7knD^xo4c{;v0>u=}L=yWUU1(O>g-!B-%DoKOCa_vc~jgwp&S zZ~Y(9@IRs9|G|d;B^&6kN)e1 z`1=$3Q_|jG_awhF4Syr^V(=N{C+gpG@Y(35W&Osm&vu?H?Ar$PwOdWzbH#Qw!n0->LKYwH$^~dkZ=0#V2 zS7u$BUf46Vzh%E3jmJL3KU!zVzryR_tF-?|?DhSA{Qjfsdq4b@*Y}O!cs}IyePcMT z@AgOa7yU*3FWK<#wYBU&*cU1N-vF2XZ-h(#&%oh-MJ9n+8(xk@@w>LoSU;PHckA#@ zgdfX1JN>r{z2ChVKkEAj2iLq>j_>aZb4%3ccZIKkFU{o}+<(Mk# z<8KW(?Ekm@+yC|YAN^C={#vm8pO4@nEXuZYhP03TtG}N83%&iLb;-ZSQ0aF;UH&)K zSdD}|o|7^k414`KC-W_EFX3UCe+8dKc!A6dUC8fl6OQun{^bX7d4J@!pu9hN3y%9E z>)#yYH|mGqVI2zZ!J>Ho#3PN?{gd_6yp;8S6}YUQ-g}ny^IW*BpSI;?{hSI%`u=Y0 z5Bk^dsMuV+HmRe!i1fcHAby8)73Fz+jnzHyhv-LV_IG5T8!)TAH2&}4h(GVwJJR!p zgNpbbzcRkhBci=EKg*Ne;n`mHd2+D+AA`gH?7n+?8U2wtzTZ8)*N^s)MY##ymHgdE znu_uNGH{l?-$AW8$E@$5X6OGh;)Z|qj(rL?{;Q;QLG3=Jw`3!|@_t}v9)>T1t=AaE z@2XZ}-6J4=2Xip%=~;jMb(AmRuNL++;eG7+l)Pnc{h37kvi__9m-XimxU4@{z-9fp z5-#h{Bsl8N|HktNre0`0f4HB{tIq>HXB2r~^d-|I_F?DcDD^KjcpUXT^e6B;!=vzf zJI6@zcZO|Sm(S_>JGfiIdu8@_hIfbQ_9ano`IP!w3;iAVx4eHvn#!@S@LebQ_ncRz z^PqMz`HS{j{+PU!JYtT%eCk}YcuHr#H2%dti}G{W^Zn16=NjBEjqg~KG?fwXYpfR^ zl(5qtT)f>^IZ=ZJ0Zu>5so)paq;h1!_#h-wJD z0?TbIH?S-5x6@7(;_fF0;TU%7RQQRtK~{EFIAP`+DOCHKkRRuBmJw!nUmbR+|`I%tE)Z zHJ_K87SG%LPP~-v3=`en^SA1fy!Jj%X8WW$>UFa8`ETA{O*-Un>D{z#TrFLx%3#uF zrSRQsd-@9z?(Nq(cyQa)j;gc%%iG0ta8FNvd+WcsZtIUNM60)3rT2DYA)P~7u*l#d zyl4?#q6jZlgxiX6tHY6pX6ELj8r1l%#qW$dNz%Odeax_i-tUgO(7E`1$4Br8!Y+Py zG?wo)CK7h}i0@Y-o#yXsHoxzg!uLK_!bsQes7k+`q|<}Go5k;$#=;ZZ@_VQ=W~DQ+ z@tw%*zI*A!hl}4cO>Nlw9m*o;T>O2GU>ucJ;(`jpOfBPRaR*{kL9pq0+{Dc`X>t(voKkr4xH(&7w?ZyJ_8-s2&IX1;S@!_Pd1>2|u4%`*R4F_UFQ3KleO!A7~KqlwCQH<~^QE z`g<-Wx0a-WiYf(j3I{`Gmj4`fCE>@%kN0952h) zetMLz?0rJ8@%?6~jNb!C{8zi`@3hMLvO4~wzE~d~hoe4Nf4na#>yP2^r+#J9FZILV z(EHtwb$31DDAou2!BHR7QzU)#>lJ$KH!N8D%?ta{pQ*3KkI=7FW;gD8F}5$1wDr7r zBM3)*IB7oaVc;)W$q;{^Ye&{|=KOj-9tt0+67hUJjCGukvrA7`k=~CsuG4xcH+b*B zTcE!?v;Mb&OaEIJ{@xwqCFTl zq^>UvS4(1fZ%=4=jp@6sLkUND+kQL%NBd#<`W~??-}%~S9Y51M5c@K{6W~Zse}@r2 z{F(mx#4pqTEF9^Z9=|ZdX}f@#s0ZJ8^GoM^uVz{`g;-%|L)(ijs07$v456znO-j(>FLk= z!0>1Ks}a9U-?lN*H@)$V^mtX$=lruRDdSV6TJewBzaH~8gftcTcGkgux3v|zIG;`L zSlE3~Jl~Hi^p@xPY>)jj|3|@P`bWc&fA`n;vA-Ta-+N5MMln6#o0sWbQ0$-W(I2sk z_Q>BCY$JZWhw=AJEnDBMDt>2VTkJWfXn%8I?{{QV;PN}NZ^I|CD8{$^BK{;U))Rr@@gQe{XRD%4oR#0J$_t5`y4->K(vmZ_V#tAu_*o? zq0eCB_Xs_HlVCO{vA*0uDC(2n9Swn_K4`E1(%xJ9u(y2ogkyiS?`hcYSJ-d3QhlvG zn{CQhPpZq$XRXRN;rm&yN1alhfUjijHBi|HewOtLi5TBAuD<@Sn0ZqgqbCS2koh(2 zU&Z$-`FQzVmhH*VoSwXWgS{4n-tznwJdH)MKld}%ZzrnxlY;fP2yr65zxSua{>Z}{ zyj6n_XmD?XZC^`&WqH~Eu)f&FDE5ChVQrmI+@Bj*m;3V*xZIz1Y=WEnsqD}5&-xbUpT7@u2K)|-;&&fsu_oCh{vMaQZ8Cq0K_w62YZ3NK@webXCVq_^D1JR`&Z zvqk!cqL1|b4&_;R_w3L8;}q(%f1ENc|L&j1C-!gW{~|B=KPtyRj>i2A(%Llh80`Hf zIQCEb1qaNsA2YT7uD(0lI}WIaaOCGV1M2rk%VqtHJL>OpXl9Z)&gSRj|FZ=jN`6Yd zv*1q;ZmUMZBeVS~u+N=W&%6mlq5o&;`CWzS z*#;@IOK4u>U;JyM$Tv6m^@8``zW&bUm|T8mVt*d--b}H1O@Mv|VHZXF8LY$pylv}o zmVZ!*c>W)V|2W@G|H>l0w|C|{1bF`1Jk4kC^ME}H?qc7AwP&bQAN#wg@1=g}{?B z{}*Mw;{tj}JKA60``fk;$@x)le<$>gYxNzNaTM)8fx}*Yiv16E+<@bLhu7v+n(vVC zx|t^)UeAX*GxM#m=?~59xT_-wuSOb*?#Wt4?{%HmWqP*v_lZ_R zH~#Oi-*rqz|4i2VUB{e+Cua7$k%!QCu_&|CoA)l2i1o>HKkCzyy=`e;l?9WQ?+sz| z@(OiA`F+-RC8~cviA}Bfr1f_>9R8Aj_Aj{kos9XLgs(FH$HQGL%0g$<<32X!m;`&T z61*~c&o{p<3%%n8LhtWy*;nYnMmZLHd1$s*|311>@AHRJ|21q&{Vj0l^|u%2N3i>M zC;p$v>3O`)hU0ko-Of+o7qedbX$|}53wz6lCb>`fbiiHMD5rDdU|(Yd`>Z?!Phfp5 zHp&qf*XP@l18cqswl2<{+3#?ch2uM$7toJ|KV9f8@6emxBDgBk+a8YeHs?T&hd(u_ zPVWSGOX3gC{=No#y{R()6!v-QQib0BZ|Kdx*P}B3x4~upcY`B;=6@jZ%lto9=%3^} zANP0FV*eh1Bfj}x0{b%mUQf&XKMP0x%>VqvFZ2KBLcit}b$V+T>FrpgcRt70UzZ81EbMby@!(?55=Q08R+h+DVmkY5URj|*e zgZ=JhG(0Tp{qBXKP_6#1-@V9|q2ljLSwEId#P>b$GlX|14aMJ=a{o8W?C(oiKfNbW z{Cz1dIj#56&Yv!q^QTk9t?!`T=HcEl#Je^78@xgN`yAJ2w!Qr#`su_`{QaNDSx*%Z zzYDn;-PdbO`WN7-nf*@W6nss|tbglY_@8IP_Vk_Z9Yy*V6?)VE931KUoyptyzc>3c z{ozIW&F@m2Uw=DnBhQe2er!-V&ffBk z{;A`<-QOM-#c|#jvX1ME_6!a0V}C!~qcNhr?_a{+arw5N59j0MIQH}5_!dg~DG zNmR$bnsCI|pXY9{zi;zPd`17karAxz9QUvK_go17#<#x^@%!;Gno}V4u}#wN9Qwig z3drpA-amxi^vFUhJwIyv67hCOvAJ)94ZusbWq_xP;<$MM?` zz30nLS#N&i$j=GrZO=cS_2zGG!jV7i=Y_-G`SV-KTrG61O^zR(P?`6Q7*5;Mt zsz2Q^Yh3cD&ge+bkK=sX7Ty5=GqU|I3}E6C*ScT5YC=c#Tl{ewljJejv~8mm^-ECq zO8qLdzoGZ~a5#2xeQ?~f<$IHn5yw6Mmh~h7aon@#<2i|_r||Cx56kSh=id`vAoD#J z^ZO6v?T*Y|e=OVb`m+HX*B{57dc7M(8?X5LjR&zV$DQ5{m(MGH1;_IYpI5vB$MX); zv#l%B>w(Mk79@XVdP~A(dV9lVdUS#Nq(>LGPkNgb>G}H?*1zpp6!*{mT$$dXaGBnn zaGBn(;6D2Y$Nt@VLr1#yc@0wJhgp|Q7p=wqzJckDNY>P&Ngb&_`pwM7|G2Q1H>G}s zKgVs~i~f{s?>KMok8MK~$6b%Y-a4f;+4SsdMS95}ZCChH{}bwO=>L^*)N|r5+6TvN z?@0U@x9zy<_o@FE)Y+-WRny4**}k&^2V$Do*%Z$ zW&H=(Z^`ye$fNS%8+;eS`5pHg@{R0Y@YORr(i~?GO1 z>P3EJ`&W^_XW$jdo7W6a;Z0at(w%P2T1dd0B^g#t-7p2_h``(t@b)puiebHC^cIG- z0-^G_1OwlD#>KVLv|8!N#hzD{7i$L z&%6s;7sqi{d3;;M@5&r{$Ip$!*8c5djK7R@d)Qv4`>%|$qO?>*Dy|NpKJ0ZWhPsR@AeSd*El# zxy5E*ZIKt2+49n5ww#}(SY1}rCH1N{tOtVTFoj<0p2;Sr|KHC1d>A_0QmJ(I z&RX^St#c;Csy9_sC-Co?i_%HWs|AI0){RD|WeCwyFIX2~TG?1vorCI?;mR?Go?9{I za438#d~|MnWbY}1oy+#yuz6SHS6Bx-m%DxFM{|6~kot^hr_7G=+Y&x6?E=qZ7pkA< zZ;-sz{;nzfIYw1~rlH&kr)MlVzIv|*rT!k$vR|*L?^oy_g&%_N&wA(5?8Yvh5%O~Z z=^0VngP8xj(MSGg$MaCip+B7XQ{h{QqiFvM2PpJ%JLMmIttM;zRlNu=;)E8JQj9;yussq^-v!??sqmO=A8IAv7(sV@}2sjy{uPS|-3tWxZnr z_}>~MpnvZdO8+mz;eX)D%<~T)^(p=!UGQ&MAM8nvI0oSp);?!dOn+U%W%`z9q;GxP z6^{C7`o6O&)3-b$ef`}Bm;T;@!{1rNw~zWhi_&i>&j%=P`>DzYEItD`IT2;c&U=0x zm-X_d1@BFVK|ZCh-?-3gU-CQfM)==4+ne9r;4;6v!;#-ZIQc(=?ZVmq1h|VZ(UOeM zJbz~GpC(+|PlZc+Iqa{%-s3r`AAb<}L)O8T_Y!bf-iyOg-tVw;E5PL#*Y)9Ye{k8_ zAMLMg*nhQQe^X)a`OhiRI{%$(cUkxb%1G%UvAtMZrxkf`*1?Wp{W*M@N@Sk(Xw!+i zLyo@z%xz&Bm!f_}*n7Ma1!TK@>oH^A2P)2OeLL%TN90`1zlF=Wo9RZk_(1IEpbxwg zi_*OZV?5D&jDz=Y@5|>D>|Er#Vi?EE<6(K0$KwDvj)!ByeTMrr7RCBJj^$(lu|Izb z>pK(GW9Yv~_>9c9Cl|^&f73~bD&88C>X^t);2Bx(n8yp?H!?dn|8&@WR*dg6f*Uj2 z{yYXxQ;DeOv0NYh_He0p|H}Bs!J)T3c^8iM#PsDd{RJBS=VOR3x7d zT$|go0}rY>=BoF2Sk~-D62|~~ZHeRI`TYcZWUWqPO#h2;oZsr-Xz1T8^!nFV>7TAb z%fH9l>p^+ESAxsqZQSyBkAUNNoBkGXnZGUJ$e-yi3YY0~$or(vA?TC7?Nyn+{>t>X zg3I(hzGeCc!jZoDTfCuPqR^W^PT4;B^LR!1s~_LcUtZ|-Z+$G&e;khV=RBvLx8?h6 zQ08V`V;z}?NWcO^>j|}53q7(y{hJ>aU=`ry_}ntg>5TO z6OgSk_a@@r3byZcYG!|1gH5e5%(C_Gq@3Ox-{JWhd_=bQoyY}*cgU>%n}y!F$*01` zQRGco2Y(N?J+e(ze5c|!2hY`5Id}O$j{hZ@pQQ1eK-fNyGCOw6OR4{#vd?JB_&m05 z@w2bh`y1zjybk#*d0y;Gp3&fb{b%XlBL4I6%JuG4`a5F4EWHD^-eG@iW0ZdH)aUQZ zHKsA7XA@pAvvY_4k?#0v_lY-@~@ygB>JWj%>=RgUKTS}3#n>2T=f@$7%eXK=m-8-D{h z;$OfEt`+dLYW8ooo3z!ZCNU`c3dx>eKnhF;g7F_<8iZ*O{KmhTL%Cw`faqlf?DIci@*1Ki+}=*Jd>zmi^0P+1HYJ?bl-cZARY0-(CHf zyMnl9=J<#9uk$l0^LW_n>8_c7!o|zF`V;b?Yzv!L--9Y!ax;Fp`$w9JW2}Azf40WN z9q5Ah8qXLMbRXsG+fU))@NwCnW6oqYCz+l7;SGB^?C0d-Y5(xy9KXpIQ<$5h_dT)l z0_?fG{G17^!R*X^;}J&{by?P>L_?Dao5d!KJ4>^)iZ1VTEl*ihW%@B*spg@Jq9S= z+3g5#Kz`$Tas)3g98Yyf_Wv|D!ygj=3%NYxyXTn2r(nM~jl+%EelGO8!!d?o5BNMT zpl{$)`QZ1&B|Y0b#W6m+;(t_))xy`cRnNh9Vx#=^&)hqb_OEk%$F!dU?^UZ){FCUf zM11}InEVCnZ(ELS_;XB>Wp5o(oV(Yy{;@>dtKQmHJwy8T!Ib_S%(q!DUGN2jOSZpN zvfmH{&qw_J&12w*TA0k-qKie&jdWTjL+h@rd|)ti%|9j}JDA_J1R9 zVeeeR^7c9Zvi^c6adLTX9G~}R!KFBV*q6&FQ$>Ei;5FbY=3@V|{=3BgB|Nw`uYL@V zosTh}nf*=i+fnY9*)eN}aQ>~I*|}Bi3zc)LcEfMrQ&E2`>r(#}xYT>DlzQt@sb7|T zFZJ8Np?A#9cG&l@D2}<=p7oGKd~XZigndtD^`C-E{U00p4-36xu73p|RmArjpNN0q zvGrV@@s88uw-EMm{H&jsz-9eB3Xb~m`{V1mSntgKo2)+6D~7xh)WW0WF&$80T6-pAzpJEqJ2?Y^1Ug3l-X-OSr( zj{d89`&Xei{=#s?U%0dGf9;Uts~=A|^v(sl8N7AYJI3qlgrk3;{@g+@pH;B-ba`6# z@+Spre^SGqL*BA~g27`Cp>HRS(s@ODH9zgOWuhz(zm9$MmtV$yG0xSvzmR{_;4NtH zO8s-3t0nurWAJ#!1a3n*_L-GSVfTO0MD>`yO^f|;jGo8u_?%z&_e5-?ymn>G;Qi$P zVr&%0-1*Iv$5fH`B0s?$l+TrH|3zM=R4}T z^e?W})$G{wz106RKCNMYbc4qheB1kV{Wp$s{vX=Y_W`@qSWQQ7UwY%rH=utRj{Cvy zzzcKiV}JT#Z{O^cY~MYTnX6{NX-jh=e}7$ zVtEXvzL);zgu{LkH-pa+e|T+PP0xIA<{6pq&8+=0_z(MjnfK0m$MC3M4WCJPcp=Z9 zQU8y?;ots+ZA;ld@Z5|3f#t2fEbl|%vb?W`%kq8{F6)Q=lc*n-=O5rG&$kclNY6et zXPe>}Oxx4d64hfYf6Km{+fi>=AN}v(3k&@b>`$pb5)Qp%F1?;?lxlfA-Xr*n^tK+$7%K9!SkBM= z=x>2(GLu*y+yb@ovjFxl6Mw0~en;Bl(%$=n$iML~qrR2Az#Ox9p#$r=MJHr`j;URq zFps5^IOcW*LUFz>36Fypuho@fY~7crPmZzO3*Is7jjykWKNA0^!EyclzqtRHK>5Y} zh5fPb!DWB!DDo5a(ff&?z;Qp}{mAQZoUhhj+v>1iZPoglz4qLIX}>YYJM3>ht0T?f zbR651=V6-Q>a@(p-+}FA{N3S*|M6WNDgAXxQ}LU_$*kk~gLA?5r#|$kL>%L{GRJ>< zwm;^YTE9lYCsA2~|3YVF1iBZ9qc}#==hH{lSWSR$hQ}A|^Os=b-v&o~zZv}!^)1>P z!JE52hGwS%Zr+mv5WI*294Dy`0QLBi_On(*}+3u6z|{0Q(o)WSovE!Ux63Q z>WlSboAPB?+X0y``%(SPXqQUlG4w~UzKDHP zehCJzaBs^o#r~Nyp_X0CMo&H{LJ(;nTe}A3+{wn=_ zYssZJVc$%DXDpd)u1kMU_3tam=Dnnynf|g7F})!vl>Ve!I(B3cpFfTC&mjM--{YUL z{z;0*2~A0VwluV5`_pYxKF6PL8+za^wmtAC|0I*W)o#t7kz2DZ$+#^Djr5P{56fFw zS)`65=^VtLtJ9xOLyM$8^SW&wZj4kU>8#eDIp0|SjP_4wzZyTD?^yBZr0sQEyMMa< z)8?Np{&f1svT;#3MbmeOj>CG0g>^Se7fa`7+N(ip@u?Gw^Fy@vZ?D=|svsZ2IE*+ceAu4pQBaBGF$Yr@$$UBHm|S9 z>$CE@-~P2-cjk@SYu<0;dL4c*->K#WN9FBN0Qr0goXWV-a{u0Ja3}dM^&=bH(_rTr zE$t^a_{9cCK4y}xW#i&F>k7M)%}2>y4Ia_p?go#BJ+3a!KO4uT7oNem+{lONcCjt; zVLB!2x8$A%_cnM^gQqrlMuQ_Cy^Zpi*x*SGp4?!MtNCV2IPevp5<{L}5WiTr6xe|iaR zslc z4Vb$Xr?+zem)k7Byd~6|$Iv?NMljkn$EREX$92Z>L*5H4RGX*qk=_qQe`^Tw--pZi z{n?u`{s6d)@B5oF{tb{NBEr@EBWpQ|D|B#k1ygo-pzXNJ)z?9>S0}$_aShU_xj!SyQz6n4d*=$ z_8!0Yb9~1aKMwCi8j9nOxFu-qpT~DuIF66w>+FBW`|=(-f1Y2asXPGh$NJbrJgZx` z4u36Q8yxTWB09RANgUrenUMF;isK*Uvl8(<0)CgUeMrUela7bItj3hyeB?dSn@&O4 z^SLpnH)i|#UHU1RUm))1&`-O6QJ&wy{wkQ;o+M}B`*cEY*H~SI{%eGLv!2&8 zX?)%DS#S9~LO9Cj;CHVN zdB^juSG($W;Wx2O@%&$saGd|9Hxn+?+lD$A={df272<{7@yMPVOXmDI{_mIAZ<@~! z&&M6P{Kfg`@!uStX5xtU-=u8{`@2T-jldktYnSuqc;%ybRuSWs)jRKKskiM3z2ggK z!ZDukj$Ya(()>og^zFfY!J+V4*eKfb$h~DRTNlgtJ})cdkAWk;;|+fWlg%XV-`!TF3wj^GEFD4ZA-THkWd}OUo<9EMFxUAn# z!%?3-_ol-hBjtWh?#EgGE*~G~lvGEtCXs(vubZ{`XT5_{pN7!S3I|#qch5XD|j;c?tJ{@zZ7hKc;wM1KMTN-AN4-JFZ1j3@6bEm z)9b}OY*WsLmt_55X7wJ=(0jbMgX4H>&neT#{+x#Wb%nkDe%#PMTIj7G8^O^YT3%bg zWqIugM|rt_W8rfDj)G(VY~RjhoUJrgQ^Jeg& z@cAstLGUEjgQ+*ldGHOapUm~`c6cfr*MleEdtu8|c?(_~-(J%d{cQw?zbW_dj+5=( zIsIK>kJnb2Pli2SBQtMvckSD2prXCUtF-rcmG&O5u-BjEQR+Qjq1WHCaOrRThQ0lb zus8qLz-9igZN$H;5&!lgzWJHa(0hFe|30ttQbji@iF{^*pK7rE=hA-v27jZ$A2xUt zWn0F-u;A%DfA)C2O&sNH*yHs<=IddP*Q=SYShODBu}wbTwfA_H_8za&-s2Va`tx{| zdXHD=_2=;_{dv4fdyiMxn}3g2nSYO08QQ8Ox-!Jr|C)DNhaV~$y zPnw@{yyZdgart;T-crUaiF3eN-cMw9PPs1=9!eUDbH=&@Z#B@<2&ukJe>XM-|I=~-)nRDA2XG6 zo%r1>N^{QJOQ!P88r!2iR&RaSokcPJeE91Y5cNyLp*OzQ&ocfO3jK;S-rJJ*`BUuL z-!_E1GtVwRm!m8F-3mu~=BIxnKb(Rsz4@Wa^ohS;p}&TMdp~>zK9zP}HVf z-of}q^tToKNAh3t0o09>Uu&@EN~yoM!H%yf^}b68KJz|)dz`ebbIK*~60FvE>1Fp(>DhugBFWEMHCB!%T!{Q^pZDMQgS(+C-w#fN%lCW# zg>B@|_kX`>=wF0O{o3yDoNPqgzh&Uie`9n#XR~FXn4jm0{5Xf)W~ApnD9$0b2kWmV z;(ZhRXTno5Yrh)tOZ(l4U)sM5m-c&6ze@YdiC@|;fj;bg-@6)VmE$2S%h(^soA$u= zkrl_A9?QBMZ~7cujyLsPW*q-fjL$d%zKc4oI9|iHv3&nKFZql2zklMzir1%ulQs7# z$F%$Ip*4P9J^x#J$1B>NF2_D8j*r-OP~Y(pcf;lQh?(%EwR!sfV7WPF-9I{hW_dWq zN9gZ7{Fmb`ULbDi?^EbYf3_cSKdQemaQL&ld$s2tQL+9U4@Y@hUvGhm@Z{{XX+-$dmfEH`^<{=pKvU~{^Tz*#~%79?w4_?w<&N>p`TIcjo(9iR>nUPj_bMO_pYI=E~X3=`KE#$ zzqc72=fA)0Zu=4STV9g%N~Q|;;k6pPQG>lcl<~cOm3(A_PcGQsqTi4FM0+hC*5KnC zd~1Vkf6MsG;=kkr8hmrXTi(EL#Zz`az=vXaoX0xyKak4tYxoA0i2PgDC4bQ1zc$$Z zMQPvJV6V5Oo+hBh_TL#2(>mVAQa>M|e%fbMtbbc`e9QW`4Lqb)C;e@l&!zsZfqnIN zaz2;(Z(|?voulwQ^ux2iwRmCs6yxaNY z;Zrhi2(Jnsmw8`!H~5Uqz3_DSz|8t1iI%^w!0qJs(5!dP!eNAu$@}Y^ie7uiWp)n5 zk#N|51KuA#B>P@okDIV4#=n?##9xAkg?GYxt3;fW@kgx3Bx1Y|8x$d}*G~U~L2*vSb_Lr>oV5U$)nOerK9>RVf#GFSs%Ao?~wNe$%Aqj z`~lpS+4#rNK1F=_kF*CRw>9_(+Jn&B-f z9D3uw3YYO8D)h$R0$*i(uMZL5-{SV!!>=gg!Nluk2^lf9F7(c+f29V@lI|Rw8tZ&6 zWUR-a0I`|FQA<9CdDp6p)zoazIjv5o^RasEJ;@3=>MAKx{+qU~Qv9v0y3&^VZwi*9 zed-O_Uv2+C{hM8+@AD1+JL3?z^t8rPJkuDb;JAcE(7QM;!{0qNY#e_t)^Q)h2)cZ9 z1>U%7_|7!GY&79QqKK=mF;VJWE%k_5p|-zf^=egwMz%teTXt)Qlh*rnt{kmx zBU+)>p>M^Ez&Ac!w`I@d4X@2nw`JBn|a6uN9;UDlF;zmU+1!)WEcE2b@_vX_5e@Pw6U`-poMag=LTt?%VF$$SEQ7~4%$Xq zT!!;*hwzs&tG~I>8~@vI8UKMoul*AR4_~wHi~gEzisM75a#cA##IlOreyOKwtbAW-Uumt(JK%q5!hgtoIJ_6(U*-B_eX#Ep^}+fz29EmW_!g=_YrKo& zZ9Eoh=JHZ6ub25Uj#n4FAd8~?%B;h_$;STz`iQUoiw*mdwU@(w7dm1bl4@fXWh}f6 zYxhxce!81jZ{rv_Gf9idf7xC49ROsb)_C4%n?|*}RA7_5d zqvHF`ZCNjrh;pXA*n@ENhkf668GK~cJHBHA;pqSBZ!%o^yBjY3JqVZn+@I3l+i>{1 zbG!O|ral$Vb+S}VOH{vKw*HjqQG~7Z%nvU5=npRR?$1eZnZ9jNq_5unEA?j=de4tR zcHrECv&{zJ0dXZ}N~NNfCt`pp~q9Si-L^u(+m2a=|;M!)*~+{Dc4 zZ(w_={{bBO^Re3={u+z&0gLs|W1vh%KZf<4iR$N)`x8DRv-%U*w^Bb24*m07|4i@7 zZ145eURzvWH`u+_ADH#>ON4`)zgZ~{LBD0TxBVwdtNpirT34oJeUq(^-$OS%>pkBd zCmiR8_8YTAeCwarN_{GxZV&HU_yoo$|SJrPf2{nbw;td=>Tp0Ce) zK*isveUtTP5^%Juv7a{f#E2Ic&h!(s2a70d4ngeit3mY>h3qx^O} zp89~sHdZ+pw*4NNh`s{+F!rJMczN#~`Efkk74T3N#rgeSBYZ|?k5jWWHQG4(c_n*#3G&kwTd_>MSldJZj;=hWo?`MA}!kySV zCyXMGYVd9a`$llVS=9m0R_eZIfZ$ScvRBbTS|DylaL(Tf0lY$+$S>`EF+IcZN&* z6X38{&(8|<(OXwS@B5J(Nq?K{&-Wc(3x;I&{fO+h#G!lz<>-z8k;_aQjqn_pf5_Q@}gjQiw|N4zcj zy|G`E^wz1}r};wegL^WYzi&43cLMb@@@IaIZRF=Z;+FYoLq96}vpoJk_TB{EujyR; z{^gv6m}91<6Z6!k0hr?d|7b(4) z;{O=*bdxHveAGw$rf>dKp6YLdLvQ*HBz!KfJMa|oSzhnKIeovxKBw97s}=N6&&Sbd3t`#PJIjimfvo)m$84nU&X$M=U8Ps4n}$BiZ~A*U%#I!u9r50 zC!pJ*=)Irj1=jQZG*7_8i$Cv=aegxHkMVw(esJhthyRHEQ^j89l+(q_FU@>B`XBLA z)`YFUbJy6KG>mT+!<#1ddEDSHZf2~7@|mybZvm@vx6oAbUG))z0l@D^>Yf5U!-!q$)FD6gm=dl6p!C!|U7{R%_T zuUgpfk5Ya)d>_g$!uQ^})}N8WJAWMEJ^xyMG5+rPmo8k7^Y4yuKL4Hs=kxE$aGZag zzrP8N`FqdDay}p1f8LI5isSF3+wf3jJ*(X-sg%5GEDz3=<{_g)E@bMiI-^a*D2{A zOh7s6xB3f-FZAOEwYO#=z9Wjg`XO_7>kTjG@aHA{gUn~ILD=I<`rd-|WgDb8KfW8w zjVt0hjrno&enipx%|P=vs_5t2x}N_&qpkMejWM|MK3RdKG^nj zFLcqKHre)7eQsapz+belP5Voht?hTgMzQ_1{zv;;*`tg2Hanqy-^}gQ5#=>5q%E7f z3p-!FEZY~Yw6tsRs;uu{*!l87tZ!S``SOiekK^C@a_e>+AMz=Q_1_6+|6UJf|F^^0 z|DAC7w|oY{xqMcGqkMcH%hqt*k0@_7m z?>|_d_Tk%!pGa)^?MJ$D`I*-!Kht|P9O z#Q}f%_3CWfSd-q>A46cmAFTN!vhx{|=Qq}sN_tNqm`}O$JzqBLSvJR_qjFKvq5aeP zs%d@gv~K+=a%iu#ZfaxuMrqyqt77}0v|cB@(j1!CJJ_^T2~cmJPwGuIsM_AvBkk0f zlf;v(#wWFRRDTAxCc4(D?dbR0P}6Qjl)csVo=uZp{;8U@6IeOvME=aQVTXTM>%9$Y zy|-cQOhfpm&&lzpb+VCniO+i-4oxo`9nZZIj{c(Kr$2#X{M6^UHpO;Eu^$W{fd2Br zyMBXXnRQ=lpg3M?e>l!Jj^~~RTh|oBd%Q<@?d?xy`(bd{FScYo_SvT@B%{SoC>+c10*`N0_WxkuZGEYrxd@sP^&*xv?#$U8= zuXogQ%M8*clY>WD5ecc58fD+#Nx+&`vQzee?AH>>N!YJCG z$1>ZW4~MAE~Gs6x z2=Dy`454?;r*6T($lb7IrdYm*u*~JVIy_Y+V)+hX`A$W3`*a`SbA0#15ufRO1 z70&s64WBvu>u?VLA8-!;6&&He+_=7X@n()e<(@(H{VY+Rn7(M;!1l2!k*k-g^WrtQ zqWz)RWc$P9O3SH%^iO2{W40;YuW<$Ie=6bC+y4o@?UC(Iv`5yjFW{(OYjW@}jGxJs zx4JynVm->!`o>$B?TYi`BUuKY$bQ-%-nZ!e-j4NKABx}GIfvzs zD&klv+*#P~?fjhe;|uSD|F2lTxcIYv4uzvU{eIVz@GQiuOrs$G%<}5OrvEv3s!Bxt z0c^|qUEt8`Zx`ao{+!>;_QT<@*Prz_>z!W={qOdx_xI9u^i})41?$m%yMMQZaZ`!y z^KPug{&hav@>{c3SN(;vSszu{_S5o={cZby1sv_a`~MFO`xhJbpCnm}2h`lZ@S24eE9~6<8vL%S&8zm=zJ9dN+hV^Sylk=e`)S{Y zd3dM#e7ndzHCsN`uUwvX zE2BJj-mk7NLl&s*-5+P8kNx5O2VU=Y6#x2Lj`U@J%fsQ%{k=G@2Gs7V`vDeXJ@&Wv zKMclK-2b4zFVSaze}luH_kU?$^`P0_WW$^H9R651!keCt;G7=s4UhDAf5YKxhSpA7`==Fa#oc&v0!@u`GSYPw~4_CtZ{s;RTGne?y&-?Hw zev0+~1D25=?{_dMYpF!6AA7T$T2XyJ*vYI%{OTtpz4sS93on`CdmYa4*}g=4-Vd=F zwr{gdF@5X9+5S6l*k6pj^=B^nEsEa*8^qFcawR{j+heaz6!o{W487k6n*^_+5;+q7 zh^1|&avuCAmK#*W^8hfXv@ZLf!)Foy+C~2=Z2#FdTX`2=n*ASo$5$uAmWguxOZD~6 zWqrEY_ZtP@f&M%2%Dubw{qP@p!ynOL_d)2-eU9@9`{4ZI|416E`S3Ne_N> zqo_ZKW$535uYu=NiO9FG4E`9Nm$c1NX={JI;PB`37fYhsuIT+fmg(84u=jV!aee3g zEb8KZ7VUrBu$RMr;4*dkUYeDSh~e*LnZv&VM||4<1&}$HID)=S<^jUPfogUyHt@BI?%(wLZ%C zPCAyGw0EB`r^4PZ@=mdr@8wtteg@uPX8NN=FF(!B3w|BGfHwIjMeq9o&Va`jR{vo` z-%R}@@Vh4c8xPm*@A}1`d?M?af7{>%DW9w#+2C6m{8@ts)86Fp&L3uWzAE!l z?cMBntmn5p9=i&h$76ScZ4(sh^Jy%jetN&sS#XTUIv#o}oX112h2!{ed|rKw&!4tT zTh(@5$Tr3I=X-w4@6W%F{LWyXDEeQBW%j=)9R7X&e+4+6?|1&y_9EtA4R2gIy!$f3 zn?CiCKJD4m!+tF|?7jcWv5$QJ)vw^V|7wmy_`V4K{#4pu>x0K?-XGT`9`-@~K9a}r zq4@mS`>anZ?0nEA?9X*-b)|m-4!!nGo{Rk*dgK2sY02^T;`j;n`FzivaXvKvTM~CJ zFRDye{v8ijALHegH&ggsa{aPx$@S}7*ysB7Z8+-J-G}r1DE4%_DlxtN z&_{ZW@1RC}KZ0|7Q{WumXK;@1b2#GD-!Cb@oc@>K?C%?tXZAM?&i;HJH~d+@S10AU zeh-7AejDGxaE|Z$aE{OOQ;u&2oa1{7j`-Yv%UHfMu@Uin#UawQ|E%xoqrSWU_JQMg zF+Ix>E~m%#BBy6ZIH%_%IH%`iIMQQ%xe1Q?(qz-CKBsqwMtarf^gfuyO2qpmE`s~lSUsP;2Kztj*MvjAI{xNh|KFYLkASoN6>!)a-z4^b z*1rXZ{{OW4V0y=s_gsG`!nyu>{>t^`SLkznu|JjTi+#UbUv`9}zBpfY8XWUw)?c~| zUG-P}LrHJ_U6S&T`g;ivkBuRIuThjI;Llik3@GQGUVrZ__Rm-Fz3BQB{c701%(`uk z^5n$&dH4Hjte7ULdIrl)y(YC)?eoB*H@@4^M|`%ww#U)l%0nAGoUoyv^E%Q8A6fj# z*8j|pH~94if7M{e40HH38|?lF{ffp9+XgA7_b+gyZ!9+-Z4R$U9u?0&KCdy2ZOZLM zzfsXo_hu!|H(p~Ya!2BRzieym1b?&W^{+nsZ;1Z4v}Iowz5dmQf9>@j_Uh%(FY=qV z7PmxqU5{=Ad;a-Not)M_@P`D6yh59zp26B zn7OC^#>Cez*k1Kr<9hnX+t&B@omk4({qbw!j{UJd_BWwBqLh!}y?-Z%Uk%RT_l6_< zH~0|rckt&vR1AMQ^)rVb1LyF3vZO2g-}Y{=t`|LLD7NSOvCQqc=j!cLBJ-V9zu(}t z8e1OEbg8+-3I4SzWt;nlCj{tJ8c%O?Mx@A%)N z{o<0RNBia6Pj0_Hh1Vnw#s2VTaI|0gqe52wS~-@^FH{=NZ+KhsYW*Oh+# zp9<&p*75u7-}Wo}_xX(M-}@`VzvX)y9OY|!dl?-2%l`G8lwb6()jLO?^*>1Z1E+95 z2**PwJ`}$BDz*iiv#`hTImE-e% z|AY0A};$l${%3wzd4{Hrp+Ja`%A<(uJ9W0#VLOG$IhHq!Uv2Iy>yugkL%m-4xn$vSY&l_r zDgJ$EYPH_U-%B>A{_Z(}_4?k2rCD|f*Uwz}`DYe>-j3HAg}I4|McQdr?-y`@=u30@;fS% z;UTQA#c!dp{kqcacR8}(|4KaB{+vem2@Srj!BZOiRD-8C_=5&Vc~9ZHFF74gHF$c1 zKWK1^@5JQr{b0+^ZNB$ndAOsn-$NM!4}|>(B;*fhhCrt3P!uD?HBgzH@B!Lr47Y+TCv^MqdibUS+Ru*Clp>Hjln$?1O+ z&gp-sS~|39u#uAi%((>%vOh;yKh@y<#divB0D%>J*1!~ej6^*diKE8(3J zbqpZpM4cnF{^j^*z!AUCysr*d=X;jE(`5?FQ~K}+8M{XPyx7?_wtR+v1nWZ!zq~^I zJcZY_$}WWe4NHPm;yp_ru(o_*?-5!QTjz3t1~{<*B}^8W?;Bj9KU{pN&Y zlrxw3e8%3a$C!intm%7t(R+`=A6cJK_(V<&Q_$~Q*n3KT0iRRY?@4?K?^xLKx6ho* zez%cbTS;vXsg+qCP*MF2 zDbs#rVZRyWHKOMb#cxEN!}6qxI93ZEQ}_rPs_L4u*q;qQk8W_$>u+v!;m`2zqKokQ zm&3o`oZ1Qd^GkU5|FW#d{vX}HekX?KY{l|li)AkVE#WAC%kSIR=JH()j`H1LCBjl( zr|1mP-%)V(=k<2>cLSXL-3W(2>*Kv})c>JWv^Vg(@&c9n%KzfTpZzZZhkxzYfy3T! z8f^{dZyMPi#`(+h+2{r{E#0Lz{};eHy+4K{z3PA3(BGEy(@5x=B>igIb;WN8?ay+P z!WWX>3*lk36Us#Rbe3L2D1I~QB9^Nbz8k&$Rr_Fy>A#v~V>AmOc3wS<$$_yI!l~~dZujH=L9D}U+Q#L_w-sY`{ zwuA#~Z`OwuHvB=XM|kbGgTsC#_PFeN2ZDN!&CnkYcz*mgKSljGmRWxZob?luepwFe z4PeK86zk8yETjJT&8b)6?-jlK*E#Cgf9i+Bp_e`X2Kx@B5gcz9=^XJMNADRpuEv(} z?*&Kv`gcq``ybf5+n@f&C$|1w^3D9gZJPc2Ovl<&YJS;m(tWp4B6V(a5SJAb`_7c_dINW zU>n~s@SZPuK?5Ux)8HUDzGzZZS@zn98MlioF_Gx45Yt=Z6jw~C!} zKfD0tyL{m%;iKW*3cpc!v45bi>?z+K_HYmTq}SeWie!5^?5EAdJ8#%OgG+qxtY6Q$ zU(Y^K=H`apDJ-40Q&xdLcS)WUzX7u=I?q|k(eUN)l!`d_z}D}{h5aUs_k`S8*zm8R zkMP=izi+lbi29xF??s>OS4JQ97j4{DU0*#`{2#GhTkA>EGpexfQ1N&_qom(=7Wn;@ z=x?r!{y*?Xx3Ut$-%EXu@GtJbHwj?dWJUc&Nq;%KG3C2Wt!}+VdVC(?SA~uL$XR>F ze-j+>_hy23Ic!H1`^DhZS>LnpQSczvqdi|8z6SnT(QjRtZebbcQ|Q}&+*b7uZ=sBp{_y?SFPzx%pUj?5GOwA~cdYnK`A)UF z>YXf0z{3msj+G(s`h~TBll_P zO8Wig%QA%DqSzb1@AwIS>V2nA)^Fa>AK1_zob+E@$nipYxD}xi(>Du^W2CPi`h8&Q zh_W2K3>^K-i?3>{u8)3Et6TEVSgz7H4A_K)LuTpT_ezMP+;ejLlJKL^hGNe%tY4gJ)H{x?a#0si}tpXfiX zOXIdAY@bgtKaP(^dRI7=Z!EC=$V$stBD@g#%=V8nAJSm2x3m6d4Sqeb@n4kckNkRr zSE2q!`qcZ*yvz?Lb`JkW(w^t=y*AHt_?*If%;8@J=Q;eV;h4ks9uxh=Jt+Dg#{SO! zcZaio&mZTN^7EeS=iu!B_i*;FzwqxnUzLi+EczUTBG&`AHzrOcK*DHkoclZRtD1PI{>+5LW+~57u z@oo8^pZ1T(+v$XhSKxfSIW~G8+Z2yCE|Gd1Z(PE49dBzL-(KBwHE(TR zeY5T{^x6N5aQ5%HJ^SAl&d0NJ1#vukkL^PE&iB|3g5w@r^|p;!@9~iJPc-x&H}qVx z_6TqOa`-X{~`XTHC^btOE4IF%=O;pPMEpW|w*?g3kd`sNt1;yqzs zCf0t$Y(4E4SfJbf!s73!I(SQdn=!3m?;%@%{_g7!?-~0sm3iZ0Z+y!y*6mMzw0}3h z{xIL1B7Z9sd%xjx73);9S{~sZN7h#@xFWnJ>suAJzI~JWo9n~+aIOzjp&s?&9yr&B zd*P@L-b492?P+rq$47n*Z&zdW&MWmX{$Twu?Ro#$w#NQZe{VxSy`lGdEr80?cq&X>W<_<6QkSxa=DbW7 zXBgHMKyN7lc{}U2|7&$`8&p<{t8dl#EnW}5{Jg#DMZbE%>}6l}KPOBV5w5l`(NTOw zH0dns>(omJms_olH7eVVZ?S8jfz`r~uNdOI_G&RtP3Yaof23b)5IX~@7PKoN-k0Jr z^I+NFeL?m?CKvX;7UzlQF6@0l7qg!43%Vldy)Wo)_}9h$ukhonKU~=RggnlkDy;vP zSr7m6a-=zUDGJ*JI!8KJ#OCT;XK%;=<__-Uhu3Xyz@xr zKeOlgVDEbv4-e(1Xzwu;ddJakg-5AGoY(m&%Oxt}nTX}n*2DfxBD(<|UDv$Uodd}ed{?nI z{Qay)czJp1Y_RjjbK?I1eoB*lx6;;Zzr6VKn&NcWI;ZTnY@HUbEh=XD0xMm5`2EC7 z5Z}UVvu~p~FU(MQ*Szp@u;bwRP|WW@IP&ZG`hon$*6Nn&F>MjwSn{?Px_65H_vmh5 zeQIIv+j*7sc@n?b;6a25{f8sDZi5dhje+6sO#15EMexDN-`|qn@Silo?@t=Tzy9t^ zYZv&m;6~C*P@@wPcc8^*%tY6UVad^GuWn_MP>bp_0AH0CE~W<_gtl|=MjH` z{)%b835{dUfFtpB*^E&q{ll)vG<=8o{P^NzvRN7Ebi^Xt;H z3;Ox_Db8zO%yPbp>UX!u@$QzU-u8l!Mtxe63%D_CH%`U&?`W1$-!DI$_dpQVzMQfl_AA48)!0&hYtr8fd;Fi2 z^!Ae@{Jw;Dob3FfKO6SCG3uM~Z$w)X@%!zyVerQIRJ;%F5P03hMz!~u z{(qZz%#RpjC4QgJQ7mt!qI#6~k#Lmv_ptvV?DI;>T(I}}txKMi)8S{~8HLq5XBv9h zapK@B;dS7dl0S8!_uW=>LAvHyeYe#@@QFr-_-?BHEPq&0{cb8w2|eCTC3hCR@21*@ z_2Ucc-@5fAX;k!oCd=?|eLM@EsuD52%UI_4Jb#dlN_-cV+*xDG_o3UX@-*4dG_wO!W^(Qs-cP-Jae*ygpoWSQV z{@*IRQ}TEHVmicR(*FHAcuV~YaOm~NP+XTk_0AK8-tZR?cZ7eHV}I$H zy2pX#-ZOWz<0eZIS6s)+bUAvk^(E`)AibH7YVhq1_I#7=4{C6W{AB&@4c?CYWPN9Y z`;n*6`>lo1#NSDp6~DD`7Rv=IVqD{E^zOgVzwvNAMrs)-z8hsD()%bjis63?cUDyU z-viF!)kk>0W#Kr{Qz`u0sOA${V z7g-YC&d3p;m0Xi$e%5mzIK~AXC(P`-#Q%zZ7t*Y#m&4w7h0F1-@TT5znvV#Z)AKSM z>1l?)YN`6Zl6Y3#`y2*xJRN4_i1$T&7w%tUb>GEM{B2oS{pN7!{dU9wmT%GP&+|j} zcQYLJ>K~*$v;HAC^xo&O2**Q?Z&5h(#+m@3Z}B%dpYcHxTLK$nfRkT z4gUw~Lxh*@-(()Z{>gk`vfqLDyszwR;!yUV#Dfe8Ru+O{4sR@42JBI{%L%O^Q4e`^;^WSLPMi|G^XK z9Ph;Ocr|fG_*rJ{seg8kp8AvL>ZzY^?ry#QR-3Pz{g7M#MY`whoQFAd(eCRT_0JLU z8Flp4y8u>UJ=#a_>l+HkeSJ-KoSQCSSNrLGf3_cS-(Qop|5>u{OXIO2d5`-7o2>mI z=%ao1zQMo4ao=E*wQr~V!`}9OTjGoS*q&S8qCMAso0J~&cN-k}HT^Hbkss4HBBj^( zdl6rx$NLV4!TG+!32==2tN%3VeO7+~+b{OHV*Oe-)i3W`oCF)*am4j1tMbPS1*C6T zc3*{-?TeQsVU@nE3Ds%h)P<=aNT&{!2v1)jv-g`QbCqTLOtn7p(kk0|D!sBBUj6k? z&3(&NG1a@0h$gnLz}97pj>U=7`E&YI{#-VJKM%a-pXvO$%s-1v;Ll6`X?5@q8R(zN z_w259`e%xNC|(N8KP4r-S{#AZAD=5{^w~d3ui8@wtNy&(twWasYrp;V+DoteY4yXT zjm!O3yMOAu`P#?6x|_Z7x$6Wq_U#6{lBLtDv^x4~rAnl0x>h=?zx+@PrA926!Uu~IENZ@jU}O$Ajkx<*!N34e8IR@=U4l1z^*|Mzk z?OK^q;yQI&S;1AcA8YqCv6Vc(h7@0jYd zc$!|)`y9L#>&F-Wj^R&$V+>z*3@h^ki5*k@3mjvrpTl0mev3GjIcPV%7xP+dg1tr$ z-ktJ34vsONBj6vxKCh?f?{zr*`E25<^a(yLdgGr!Esgk{6EiOlR-u_If-hiwa$)D7 zE@qu>KqbzJJ;GX^6Z<6`dgsLc4F9^a=KY@V$E-hGxYwezN~DEL;Yyq%dy}=Nir)B^ zL>K<#!xB43b_#q%39tTVN$(ul+i>*J|98wE-GUzZGcS=}^EV#O`TKd&o4!$KSDqoufFM^}DcB95ZDYwd)#6y|!6@T+%xycse|kpW>W` zV*m%&*m}wIzwBKcns6)CAetsuh?%x{Fk$C87My6eIv_1kw(S#<0h6L zm-PE=^KG!>P)hG5$t$|Sg>NQ3V`1A2#q+~bEC*CnpC3p<*ZINr*ZP&)?;pa^ep{ZC z;3&`c*RI>98EjL&f}dgO^CgON&b^7>G*nFZ16Ysnre{q!r^joAIA6`P4&xp0D|PVd z*~Q)AoIbDlB7I+X{?m8(yA9hR@U6w4eSeRgv4zdw;%tlbSspvXIX>%O#OJfOm%^u% z@E-4uG3Dd^ML3Rk)Atsf^K1JU=~Mq{L;qRQPvPY76md-{@p*n5!FrtE4F4RQ{d)}_ z{@>e(V-&ufbB<#ExJ>GiKik8|pY@Glsjm8_f7`$8|4(rE*PrRnGx{&i;g5yiG4Y7~fm2-)r=tDO zSZ4dz;B5aE9QOJfN7&HY-W?7{d#C@Oz+t~TeUl4e&+&@kKW9CM|1+G!&x=hC@0dx1 zAHQFHiMco1lxyLYSk7Mf^6%E;S5KGtEMLnem+$6ql&}7dgtNbc8vYK3!{3spFvbr% zFR$zl+kSZrDb~-+Smym@dmH;p{p5!JzNGhiUMu43J8VQ+ zzDJpR--lv(KvC_Yi^!ob}&i|az@Zacr zd@JcE;VrH!A<6^b}$~{ASwQgp4 zL`C%V$lMF8A59vRBZu(5Y}Vs=_g>fWaK6{o{^AUd0Y(4n!@uE=Aw3aZew6(c?3~t{ z=<}S`M{tZ8>rc-9{Jv;}SHCs>Lhl^VEX03Uot$dU$!qQYg+C@^o!AfJr)d9b!`^d6 z*l$Yb=tJV~sxR1o4rl*gz+wNd=AhKyOx!vAEpUXt|EONA^QfN_NrU1Xlsuru){Rf} zs_qfktMCsOsK=ar{z~~e{Y7jK{WQX_i|;t!yZ~Pff1|`VH~arn);BEt9{TfGA6n|K z_N$TJu$R3y3jS(azE1-0Ql*CeEc_PjX|VA>&N(8-{~-r|gtvV5AZ#w5J>mYvpZfC} zde0|We{0%5A5nfY!^2B>=NS8@{U!f2@s}I6wYDd(2d4NQhjV&<0Y`k=FHd=7`_mfx z*L$tQ-e*f!#dp--t+#Az%}4sbOB$5DcIAE8u=fEf-aGy<>#G)iZ~L~^RBU}-QdyDC zACI3@->{b#{MSuu{l0~rWBm%tElYUIx5fYdg`H#l03KY}{n?-NNBPQ6qYpN` z_Y6jOc}eVpkNsg=_3n%Pi@%o&|G2RGe=zwQUfA%Lru|`jXQ9vW-2{h!kH1OeKaM}= zK*!)K&WFxfo(ZpB{5yww8|xg#l{kkwgSGPu8~#H$hwnpvBE0$svCaAi$baaaW8Db* zQi}Vrtf6ZAK~Sv&<8t*x+eOVLv;?w^Ha*0 zFR~5yU{IcW6`pP5_SW6-ilLu}IXBw#B~$n>;2i$+zTM&PW9RNc{G*fo5YDyP{x@*M z_uV1wt=F-gmoip7UvI=RpRW&r<9s~<`xCKcH&yZrcy-E?WL9GM+gZ!uS4J1%FXY5< z8TQZB=B*D1|9hCzQYG%c;gnC_fA3NM^8Q;4ecpfHh4cQ~3Xc8f`>e0Q^YSG=-)DU{ z>jxD6ue{H?lYN`h^ET1n>t`XKCcdJcvoJ-*NSJb055zwfjD2^`mZK6~{cyh73Q zE$r%BYO5CZS*vBq-&XLPW!rS#&&x1MHLvFTk3VQ|tIVrVO{(`J_iJzm+<|T(eisvd zP=kjzxU<0%8axFagfIKtlgE-W=1np?FO%7MmdsNcjGNYzWOgN%V+F+PSg$Li-SS>$ z>)re+5$9Fxm$gxrir1OF*>77Hf;Zf?X9(WHAnq-IO6*Re;(r>6GoYH zF3OwzVB4;EUFW@XbJtkKw+)=*+ZK-aOwVTx{pU&lb?=Zp2j7#6|4SFG$1Oc~E5?5d z%ZT53g+IYhsYKMj!ZP%}qxW6-1(k^UH(7>WR-gGW$|$(<4`=_sYUoE(R-yMDTh84d zXJm-}9U};Tlb5XP{1&yk^;g*IsGSP8FIC@1F{rTikFg&1vVFwNBN}{lgKtP|eD-M~ zKK#yrkf2|+;z`6eH3rGDi{Dq`9hd-$i z-f@&1-tx-f9rMWH2f{i2?cf}KdpN@XY60#TpnRsVO<9Y)9m8+I!t=2H48Pe6d$0at z*v(g2v;S$3mtuXjqL)`m>^#f4@X%uauh?gmcExryaVq*doMraku|t@ho?)h;|xYpY;O@ zAGU5i4{%7~BhcT$`qaWdh96@6nZmxKcM9v_?|$@uhL0@zr{TY{erI9J_cPX`ybbTT zZiH9A6`b|^CB5lgi|~y{^YR#(PoUJV}C{MzIrFA{=(k)KJ4Ao-|Do-p*Max{7vJ)SqNVq^UCk> zMV0H?AL`GBvwkydrfQ5h@9|T3o*G*(?NPTshq6r>OIqJ&{hb;sd)u3^H~hiqGJl%% z)jKiC&nzWv>q z$|?L5?YC!{?RS8~-uMQ=IljZ-h)@04hW^B)_gSUO;ct=$#rW(G+`AIYPs3&HlU&Yrnv|H^xD&6BcH z8)F#ob2YYJ{sH$fkcOSuuE_gP2Eq2fOhfK}y$#P@n^*m_aX{9e4TpXc6z)&YY05MT zzJp~xK5T!d@>BM}-nL+cikKfCUEkMFHLJvToF2&9yoHZ0_A3|movH`0PPeNP-?@4< zYf(Sd-vEbRf9JvBZzT4&!>jRA)Zf7}^uBZTLHOG$5%mwT4E^l4F(*!5Pb>Ld0X99) z7Ty%T3_hKovLEcen7fq!Y49K5-<18|`2gowcytNB{r&YkZb#u?VQ+t8D{Pcquz#QB zqs5;WVGLz?c~gn$yA=DJzB|z6^t}t`^sPkOk<+&_9O;`ud}rhNklKAUsrMf1+Z0y6 z4Dp5D?_~41PuG16eplOPjecJ2{jRq2(i;>$62+tNBZbd|?}XPYtiR(~=QLW0-`!q@ z{H|Tt?`|Ie?_b#OZr_vi`uBPx`=0||uh{!t?$s@y!uxGrf0uSLX;2*Jev{=v71iVN zcc2?pSiRRjS${AbdauJB6U^7WK4+J&d+iTfM-|6yPJr`u?^rmldrjXhaHP+1{pswl zh);eavFRI6dy><)Fzrd$JI-(u@#b-cC*c@pF#X;ekkh|7oYU|5rAPYV9_fc8{mwi1 zo#mK!IJ>a#5mK&Ns{U^8Rg3zR8z0^v(fi`w0!b^*!saYw+WVHy*~k8TDZ|Gm9+qB4gh8+n;TU z^OW|Vo~W^!C-ofjd||)qZlCPN!t=gRKTG~O+Z6r#9A)^IXX@LNZ=IzlPnxYK?>k3N z_MDXcebBF)eO6Q6fjAYP)qEG8RAb9`VmdE-XJOxoxe95ujw`+s^H=cX8Y}y898cN) z3c_c5?{&}iV<@|9e=+)OzdHJC|0H!e+rNoE+nU)z$j|VSU&rB(hWi(GUamjsk9oNl(eFt5c1rf=z+vyW{iUSmu%y2X4!!es z=aRlSzv_>nxgP$0hCb{~-(-%@;mO~9aOj-}*p~VvazlT0L;p!b|7t_OD&>>?F9L^u z+vlyxNN%4;!_hvgKewU3H|cFZAA@uIY5SGi&wk`Lx1YA>x&7Q4j`q`MKSsbYPuyhZ z71ZZ>g|*4=cEqXptcdz}KEw8Y68dQG_hX*KzJ+;IdQx%(2s|Q^HZF+nZVLE zT`~N^_{-tffOGhv@bJpI4nG`@@W%HQ^)K6d&ttal4~M<)DD9lBd;H4u{1wjn?Hl@2 zxuyuc<#kV^yl#b~ye!`};V5s*Z&B(;l%MlNzajl$|Fh*dKF}{u9E$sY2JLU&|6jm) z|F1P`&;5T0ocI4IIQIW=;yV*wr}#JhHyfT~S}{G7;7E_>`@ZBq&iCeLFYF>evU486 z=I;&kIe$KP75=pU0uKB48T5Ca<4y9cjJ%9@RI)z2BKqxn^=d6fTQH3{6rW}Cef#k& zlj;4K@Zn$mAog$QjZcpFEMMb~^40zn$|Bp#VL$qz`UO*~*U`5wfVU+r>lF5#amT>6 zF^cw7sjhiK?Qejy{jTIM?0sk5_sO4Q1jp@Gn1=SpREt{?Go1%>szj>EyYi()j@^RveQ30)^lg|cTn}WqxxG%Rfnq5jB*dV!pa<1_kft72i>rO2aL20QNZ1w23{;<%I7(eu|> zjY0UX<`@@o++}t2`cNEKS_6)87yF1$!eeT6H4pMTc<#c6--t5G;RnMJUj1PW{ozS( zAK3Rv-CF!D0{d?1v4tI%@q5-WE_2kv_4CGFdnwL4J<8It1jXlJzG6AKBCgRFr47bs z%scsf3zu%Khl}2Mo%dLe{Af?ty32kO?B(@KeEJ^_hyOc@{l-P_Jd@{{r;`6)z~TRC z>|ceWyo`Tw$|LmhnGN>58v6e~|Nrmre@=D(bpJol*#Ez6?Eg0!`+w=Qf8GBVG}!CD zy#MV(=K614%k_WOls@b80&uSX--C1gx4j7e+V7L>t^aba|3|^O{;SXR{~0*f|CizL zZ~b3@{N(z-O3I)4Uy0*A?3?A`@jkARU&|xXWBMn+IlphhIlm9U;osx6ZzH|AJe+rS zob3g|D5l4LRD_q+XMQKK{<#IMM|pfZ6bX9!&BzvECS`OV^#GyEE zxGl@o3fum#1`kk)*#6rmiuT{}?RwSHdc=!GhE%Xd=#h1L8{ zO3TYSrua^^xf{GhV$)04tw(yl14nvI&z5kc$Mc2bmQg=EAMFCi`D6l#-GF#6VVh!p z&taMKdj%Z%b)4RL^XD{1^uJ=m|4PZf{){jC^Ex;D8UDyd_#dS3#&;GR@#*hKZxmnnq`jf z893te`Hzp_8O6WzF2}&`L&fl}=kNpI2){4(BjJ@6?6!B_E8AOsVQ+jV!x7)o)_?wY)hD0#8xEgR^gi!56t+wh%j*c111hSIk0V)+^731= zI}o2f74!Qj%bfnl;7GsvKQ;8PCB5IO9f-fR*`{c3eailJgR{SL8v1jS-shv2#ZP`d z+PqyuIVqcR5x*l#zX7UveD2LMAFpE)Yj0bV?Z+p*;U^@v{H}!u@KbDGu45VH=eLCK zg7de8e+@_bqJBn0-%kEQZ~1U3+oOCuUZZ?`$D>)BnQh9#2i4D0jw}1ycXZy!_WX{{ zpTKJsd*9J{6TE6+-_dyo>^V{~zxS|=@-n|u;GEy7aOC$z!ao7;v;cn)+sh|e=JxV^ zIQ;4V^9Gy$(3^kT(^1$cwtt>)BLAl6n`|FYY3uU0Zbf=d~_d4s@|KAhq z|1&uJoB#OiB*zs&l(2YvSEeIDV@c`NfD z<3{rE#4|10tIGeMOaA8UU%zANCxv~7;0xHtI|;Yvg3J8BQ1r6-555wAmgUPu-{jvf zUVj@d+Hb>~{|GOe|6s$L-|R25{>*>&XZ|C+^KSNUqJH>%PX}qUO;^_0x>wcyOs|Nt zMDO`6^gjRd5**|BetYjY^7nqR_gj1S!ygrX<6-8J;TT8M{~W|Oz3BDV$$I!xKRM}* z-}|?7{7=GRU&T-PMEo+ZVd}xJCO+)0Ue)`#?1L#M7XGZpifv1R&qaSfy0&63Kc3k9 z{UYU0JyoiQ{SeX{;f?POIQ+}=k-lKVPf7Ojqlu00=$X39Q{H0cZq|MX{vtm4E%d>T z8-IiJ(Tr8%IQ1i}4X?2pr+$m|*k9T^u9xlYe`ove!P$N*(iirATgz`_-GYtcx2=39 z<+?Ri>LAA-ba| z1EtB1lY9QyqE=Vs@doQT{@EM(-yi$Xo8B{0d5q`g_mfEP{U!fZc{kGkTR6g>OnEO( zexrQOgI9wWF6l9SufREd&QnKtpWpbTZ}+&Y<^9rZ-TpTCw5__9`$6&7A6^0bxL#6! z7@YOiovdFM4*j0kdn}GE{^aq557z$;v-S-CS2%~Ch4f|nA)LcFeMZ%;&7Scm{gMR+laMA05oMXxqBS`Ol;S^KTsQ z{-E7Va&9qdhox3fCU&tTLH!olvby7ZSB{+I&(7U(o<61>)i%@(`vWA z9;B{#z(QS{m%F~_Dy7Stxt2SPzh(8*?p3cX%GU8@xvb7|PS@&qHpNy(@9R|pC9&?F zoVa_n?BuQuy_y^1_R=nk@lA`UNL?1as0}^D$D4Y{iOmi3HaE=O+|Z}F;pFCq4VxQ! zMA-#iPy7^$>j%dNCd1Q9ee!zeAvmsg)PK^@|1If9_pg1$^F7|Dx<0Y#A)vt_g+*j{?;KSgdCA{f9kM&5e`s0&ce(k@(`g^P4ZyC}X@#*iMvEkK6 zdcKbDPWt!o=ljF9AWp^WrSsuYHCES)7r=47w8kIncl$*7$;(mpnU}{t^L`CpnzkM6=(eG2j-vN*07#UIOoAdNbvYzMZ$77r4>3;=VM-;EGX2CwLw|s}T$6CzOJ1?)l zJTGtmG}7-pyZV@C_dY=`3A*kRd|*hg>bauGpL(C)KB$hqx_%iA=j(@?VUICId%sT* z_VOtWUYPwAdas}Ef}_4Xcn$q0{A^lzCCFb6e=wZ=U)0e5dqckr`Oo2fpGppYd_zAm>AeqOF6wXGSKxgWgQ=f! zU&X`A_G;}1k0i~?w;AmIIeaZ;s_gRy-$IAyEBasZV9`j9(H&}atJl2ktx536!h>(6 zzsm72v9R@XKiafhKl{))=K8rYoa^TaaIT+Y;i#X(iT^IxHc^qs()kKD{p&B#oqnIk zm!mx$F{K{69Asd`{>zpucdCeIo~G3ABZ~T@{<5Uke<%AV%18fuQr_X;`t){VfB61| z*k4{BzD9YjU*eNb;P}qG0qsNP&l7LPO}^eIb36M~d5!pf0N-6$e+#lda`?|E|I80k ze!% zMUH=kz2QB#1}{bUt6|6375S6I+OJCahrRD390|wuqwzfjKUD{>=9?xZd*`FpZSTH5 z(Vi}T4}0&+4F8T#u7a-t#h>HDhp;|>;m_8o-;Hz~VHBTZvhCldq~GVF9)*uliTE6o zd{RZsb-}i;yHQ7!jaaumcAqGo554av>Z9YQJHv54^tm+WYfO`({XGqP$J)Z){On12 z^vDk!`7!+y;Yh#!9))xK&%)tvv&}hn@PAw#ef7;S({~j=Wib7-y;;A!u=~&SMfu7P zBt8&-$Kij)I(YRBvCHA}3!i}gN;t|#`y-RR`d>Bl-nSqA)PM0W^h;tN{vTb2eF|?; z;`bX|E5bXL{22dk4gX%RMfe53SC8*o2FkkdVk~zlyd%6gJgo4Egr&>ZHNM@kZGCOG zaMAldF?Lbc`@e2NKL~aVL{YyX%cqO|?^$jGPgRM?!&wF&L-_B*-utNhityH@SFlr_ zA$?wt4=U_@;1A&ER3dZGF*t+eiA6tcr8@7?A9g(b0`y~w-u|FtC(%E&|K0&d|9;MW z>gO1L!#2hA+LxGGQ9a*fUnJMx?cw>0{xaUmXu{J{}%}<9P6T;|(~jH=O^of6>8D@%msL)@gz(Sr5H+W34_lH|Gzh zkx|Plo{RGR#0SCo{lvD{alPdGg{Q%J{_Jfy&xd`Q?7iNao%kcX^Jk_v+gpaA*WPno zuV+78^x=on^4?(TeDzJu>_ra1L)>4tv8toY?SvI0hp8XFsGb1Y0JG{zk#s z-vl`Odp)uK?B9jIDnD?K@Nf?QTH-1^=Z*+(d%6w!XkXnwwl{hIa0qtoALq9`e$L{j zc)abxa%x32k5BCU)(_x!iv9uuKgW8sAGTi;;eAVa_}y}kk8=uZ@BCl3|5L-h9evn; z-TCZZ^s)aRBmGap-lL-Ue#fU+r(0BsdixJq|7p_ujjK*Lf8%N#9P>$sQ2Fg|#CV(6 zPiw-_KlK|`Yr)^IqicCRwGL^B{;Km+N5J7veQ(Mn^jD*w&aofg(9-@jIPCR*3jM|K zul_GmpY? zJ##SEqqe6xe*2C&{v+WW|LxkR_-}wC{-%F*&&S}LpU2_IkLC3`oc(~9Y^`x_2t zfA+t!Kj%-fzvla!{-fcqmFmCOn|qO$xZbq$V$Fqr%Sh4R zGH~|yJ2?E!$Mu=-PdlHVV)=ZVeVy|&1kU*x59jik0_XCX3P<^v{?FlvugRuwdydDP zzRTcje-y`8u<5&pbmsIe1?Th~4d?Vtf^+(=g(H1lfBqHD;{~4I^Yy2F*SP-kdhwdX zhPOS<;cZJIy!sU=@2uY%&ia!ZddGJ{Z+z|4j~xGZ8+=h>=g&4IKdbXo@)V z)}As^Y@cso8ONjJf3L$a{-=G5|JnYthQ0c*H@()koL*e^Nbdpq!-rz~XM32_dnp|0 zz3}w*sy+^?ta)b)d;;|?*z|e6%IVt)&iV2BAkydYd=(tWr_b%k@!Zb*`?go(8ROWd z9KKI`b^RXWy^ro)&*#PdJ^vh@b0NK3*XC9GH5=)R_F;2A7UKOE+wxP4Z%)=DKHHNi z$$oMCd+o%qM$!X`fTMg&PjBLj z^vGV@1Y2IG!MVKdqwNj7_2oD?%Gdg|EFAuQ4r?so-y}_n&tVNjoZ_egsEeV5}e{2g&=d&S=_@mXIjt6X1Kh2!{A zKe3^|G3h;@yKi!R{xO{E^M!EKXYF5Z*v~;)vc2caus46pz&Zb3YexQmNd4IwzP6NC zlieSOC3~MsTZsA+&!sh4d+Trb_x{8+NpHSC(ehdgpGq~K#WJpsyg$*t&;mv8_2ghU zUr&A)j`q;&$*th|`6)vQ{{xmQFHm9ijseT>x*DswzzbMEwy@Xp7qgzP=P!ZB7QOd7 z-p_iz-|+!B-|zSm9O*N?e{S%HiL2`scoaXy@w$A!W5=QO{M|xje>fiC*x5Xlbv?c@ z3u(^zH}1&4{%@oFv;W)SxE>mT{_Vu0``7RIi17&TFa3;TZCr`p>%;G`p5xm9?hzl{ zBR)9d+jl?qHOFV%AH5d&n*`6sb+h9A+Rg{W{o2+C>uS^o$47iek#$ztp777YE0*xi z|2)igl3j`OOC99TbDpAp2<=JeoevsJ`w;0JzXk8ZCcXO<|Js}0uvh%zw1^@|g{OzQJBEX8Z3q_}&KF-^uphZSX}6e!an~kpCS1=mtOB z;5jJYY`Jok6ns{5tmep259@ib+5XI;Hoz6auM)^958dmzT4 zpIlgb--n*-&7umb?!v`ET+x^v)HoSM>5-|Ac-2wC_RNve^5ciFM%q z5gtAP9vqB6+pFw9v+sqFhbMoJ!QoH+1>`^Le+*~+2IN2M2f5 zH+S!V_bROY4YXfjuf9L+Q|JwUDxAYRSQ&czGyCH!_hfXX@O8Tz4h3EcB z$EAhsPg5mZ!%ZCG{dksF^rz>*{sfp}spR9^+FO4n{Rh@q**jhm_M7~));lMuXm5W! z+rI^e{av@#`hAQ2xZB%XJ5#@6e#rY5_on_ZjarHQ@7v($f6EV1Uox*keF=UC|3}W- zeLvO@N#8kiUd*$y3HiH)zM}Sv!aG%4yZ>}fDTX|xKD}$TuS3X{4D4QAt9y0e>@Rc~ z%-OZt>fYKpN42$dQoEz8-U$&%G1anA_apISHKbom0(5@&Wn=kDFBi>1}Sbs4Px zaxZpYWy@*=Tjh_jdUE&b<7st{ZrkqFNJ&{bS7#YUIXPD~6rQ1Pm$3cr;6+zpybeA@ zB_elVn|bHN1JIuauS5ovjo}yJI2Sp0co1!+*T0H=XV2Twcis{E2h^AF&IPQ*Z^>dm z3jMk8b9M06Soj6_XXV&6f3vV2`7{1);fUY-?E^>tMv$JL!W$I-+UqOqolEIOdZw26 zhI7)|n)L$`4@>MjVz+^hEP8p{#ML`l;cZHM-dk`rd`z+T-U9ig!rF6r+QWWxINQr% z|G;MTa{>1k|1ZKmyE#1hbF44N@7zcBCx^e!2+!?6)%>O|78p|RpEZ)dM;rd0Z1|JI z-!x9D&XvbpsMnsBU%vL-1kTr(`6$ zRF#PO1K5`JyTGA;k%%_LZtv18IoG=poacHiubh6%BiQiAHNqd?2!Cd>H~&{B_FD7_ zIIcx4?^j@wU5VxW7uKS@)qetK{Y>O1^xlhbDEwR zv)*SJgXej*o<};7GFA-lyl?2`I}`hDH{XGIM{Qnx+wCy;#=^b>aSCjmR{U1nRQUNC zEBiMZ_A}9!%J$2^*?uS-{!Q;#IMO>2&gCaxKwOdjuPeW|&`0@cpUY2vEtQ|VR4Om| zki;kau4nnFcdjksm(NaY`Rz;obNP91b>z?TyBN;paS5EuOL#k#i1uq>o9#Q`Y`-uZ_KvN#Q(k$jHFMt;YyHj~ z6N>gjsf%H+Uj9dV?O&&S!@kLb(EpC|*pr{qWXEzhq&)K2Zf4{6ov0CilSi!4UcF0T zwsQQ)Cz9Xb{ka#|^q*2k-?|Jw6uz+VIrF!-z9RkBN#&Mdy{d7@=nquki9d%Q14nrE zuhQORz3&YDXZkCW{!G%l2JO=eq*-}?4(4uPx{;Nr-?^dRIO#9s!O%a#zbN)UoU`VY z3vXR`xx)ItpL1CF_u9_BQe4~l?Vp)R%e zehbL(3#IUXZG_(qeT4U0LE1YWt@!O9Ir>B2VCTJr{{@SFW7xXxc#h)S&ytjXT)TR2 z_*0Z`=$#800Oz@qXDF|jD{*dPZtDJdwYzF=ZwQ>{Hip76x8b$->Rb!PwfBEzF2?hJ zj^F!`bNu@gcaGn>ljFY#j`(dKrf5$YD9(M{$ub}B)8RNC9UB-(d@(lQ@wPi0$D8@T z9nSIp8P4%jq&?#A&Hl;pd!d)(cP>81e-xbKp8y;GH%RBM{IW#7bQ`;^OE^Tkgy3H< zq$4D)wmMpaVl&I(X}x=OP_pSv>#dGK-9|ZVkAx`(6fKmr%*J@K@+3)Yv)#o*Dh$OZ*qXZ?XPC;RoS9w4EO(-lW0DBz_(H8{r}R z6w~`}tmpK;3P*a?A4NNq^#{SBA4Rp@jc53O|0s?X$S2j<@;L&! zJ6&Tl^2Uiz$N#%9)Af~HQ<&klN_-ANeLM%D{lk<+*xv{H%*+L~c}x4<$zRy(?_oIn zX@5zw*Way#4S$B0b9gzzKUcz!E%6z?Kb1d+mveYI!rSK_NZ5TTBgJdOtyqq#sJ>R; zn)M|Ld#!pH>+GgVyp}zjwfPI{&$=1@yszJ~u>Yud-~NwTK3#Zo^zE$M-&DLWzc=fz z6!yM-`vD76=AmCH>0czi_2DtazDhsqIsKlSBK@YvImDcv;c%qK=M46N^K%B~CG;<# z_uAq-evzJ|Sda92E_G}npUZ4r<6LInNPYB;yzftT{6aDOxh!*dPOn|zz0X8_+-IV_ z>Cg5%H0;&?GyA)fy?qhyql~_Y{+;K`{&z+n`Kj)cg2TW0`y7t^$@?budj@j;o`H2W z?n}99DZYE0*!xa5BftCeQ+7VAt@=Jm^rdBjbj_2S-oqN{wXYQEweNC29DN7*WYQCC zeta%5=VvL>6Zx@k=J!By-|Kcb_q}W@&#RML_5D`hc+Y*G72)W68Nc_LMEv%>o}s;q z^cvqLaE|XQIL9}LzG{x|7&yl_29EgtNcq!5bj`z@$wNhB;JEMG{pE8Ikzd*J4Yqub zC%w5ojDsV+mY@1uelNp0{H~4gTT;Fe-uTpqz0A~07yBHb9M1uI{K&hIMn!wyXC2|q zuj2wS?__!QZIq|FT%NnaxjavWb9s6nt>qbQ-cEc+vM+J_^ShYC8@zvm4{h-12K$}L z?C;bDpVQ!r8$6-G*EjgK22XCV-^I-F|DwT9HTZ=FPjB#B4gR3PpEub3=<}Gju#D$1 zeSYzD_$igh8+1MoVmWt3%r`7n-`})1`(F7z%&=W+*TT~l;hR0M-zHOhAMh6}Cs$Pa zd!6<0_bU3{)Tv)5{Y-G^jem*6`db4If4(pEMmWwx+S?C_@ILQpzvT#iih9RTLT`FI z*&gW~PksiYw=GkAp7kC0!5XXl{0)xywI9cE5%xYm>X?=1D#i2oN-Xnvd}TQ5^x?oD z_+@^IW6&G2e6Aw;aRjy>8}pm;Wr;m6Uk{Hd@p)dp8;0%w1p!r{;GGZS|X-xto|*Mf8Swc!XqVa2+vm`1K-GJG`akJVT`KQtPi zTG;1>?ttGZ>>S&%tWRf~qW)@@p?8kW@`*V%?ag1dZ%h8PH~rauJe=)sYS`bN?42XD zU8VV~_52G%F_l<;eitg2-*Rv+zYXAAeuLmBKl95ixjpiG5FF`O z|42js8@7es_iqfKz7DOE)ABo!JHtB{Uh>jj)%es^h1Z4mCcJ$+Wn0)ehv+A))XsMq z;9Y8U>j?Dn-i6gOEY_tz5xw^ZaJs8R{e86i5&mNIBRFR5TPoMWXTz%(egJ+E{(h}) zy$G*Hzk5K@zYiZm9X_Gx=f8~e?p)pPk8ASM=#6h=if=RQBR=CFk=XFRYWQpNceu=b zKgFNf^ZXg;@_GJDIF3)xv+u!io;{2)GudNM@jUwmY0dqXe}nUR_M4P{KF{t4=kx6T zaP(V@Z!(W4Iqi=b?%0%i*+^-_vnpl5cw}n6ZVRH1t6n9QKYW+rH&7#~GA~qWx(Nd%vNR?dPLDhrMIeBRT1>Q3r3`fj@?It83jZf7HL6zWdd;S-{Z9 z3P=65pL!OY`>9vJdH;Dn5B7No$5_Wy#I?(48u?-+FG<*|v~KjY!p zKkDuKg}wgHA%EH5xp3$We`O>52TAXk_2ty>7_-*@DR6}UI{l2K?_7%K7dZYnWGdMK zo|E#4^MkxZV(qu*cnf>k>%z=S7v`|(nwu!@|IuQjf28Q%9(%ZZ%YRzqJn+9j*8bN% z4*S<8tN&}0RsXd~bW{GNrPm3|VwJBGHio0$?RCK3@UM#}`}s3ipIq2}`^l_Fzg@np z!4nhPufGEh|JvV`^zsu8elfAvLH1kobr4NUkN7ug@ZbjT+hE5_a{8T{`$z0`&F|2U zB29|c_AQz3;h@FE4uiZ2*Tq-^1ha zy&~I`IXPi_-FkkFtrO6DO>SRZ(cXSZ*sJ&W&-&{d`V0Pr{(+=_bQ!K=;VtUuTD~{v z5!h$1m3e5-|DAQJMJ2NLh6S6x5pYi59&n`3{11R5|AyZ&g}3~uGF{~-k5BBqp{K#y zl=OHn=>#~>56LI-Q@j`Tmn@I0h_sP0c}xl43I73(^teCogJXZH|7+44|H_2T@vjQ! z_~jhG_jKp@t&chW3*j99t#HKee3pC&X;4hh3(4O6{RbTWFGv3t+{sUQ2zFfRJ2kdm zf#;^Yqu=PbfPKUPMeqENw(}Queup4k^Ciyb91h3)h~qY%FXQ-f9B3RI;|7NBgr6?y z`8#agev6+n?^ZR({H5tR8QYwmad1u#m%=^#{R+%NhB%pA4J5Xsmi$u^WRAxf0CiV%^=P`bASW`&-1?5UWotmz2En~-~Va-+>U*$<6P$&uC>;+u9?R+44Y6luDe%V z~9*W-6w_0Pax#P2f7cdo@T9dwQ% zhR-nYUPT?gM7bI0kNLU&c7n%4754Bq5Zv`g-TXa@^l|v(m|(~|IwSnH{SV6NACIP_ z`TrDo$3tuJ&*L2P&-(Z}pA9gb^`UP0(|%ZJ`_yCr4-f{PoHfPiKA2AMJUb_wP90Bk1Z6 zc-&pj&>!2|weNxcVf?>hd$6tC?ZN%4yFIo!`Ez^ZLH*tBQNU@B|BmhPm6Jc)%ikV& zRZ@0)QTO>hp6(w%@j8#S_mQ>---~Pdk^u(dt-KrD?ycl`u?m>c~K)nYv(+7Q!E69WTVHpsH zyTKm-3ne+eRh=v7 zh_bl;ZUuM!9RPRz@wsdB$MW*JhFjiO!QJxKKzq3UJA=FaH-fwV*MXaVmUkz(Ti%zTbme`|`Ro-&?^o9s~7D zz+Ij1?KYk7k%dY2vvkMv9@(0(xAhv+cX!hBS;{NHxld-Gzn;Ku%K2W}Yrs1w9}Ip0 zcwgmnYs)pd7RqO+&T|e7yq}EoeL3Yk9+(aOfpXqY_9(b}KiND-e+vGd0KeNw|BR=v z@$|Kh&im2c26yjAdk6e;^~d#h3cRv%-cR=(xUF}2e6r86=X-E}29K&eulpYW--thk z`ql9sdc^Tt1q_`3xn6MRe_n^M`JeX9u)SUT7`WL}e;U4AJq2z$->b;`QOzIuH0Z{e z{wdFY%JEP8Kb`b^4`zS#H$D%=!1qA%S*Lc&`5ww;-~&Vs$WOt1XPow{^5)o+uXXs{ z$nUXyIL6cVq0VP5%s+WgkH3fc&2+w}@)FEv-)Q^O{)@snI^TO)z6iF7>U{5IU2r@8 z<98;@qU`paNq%>+8F*f`=d+6JpIkFB_|ItdXoCWSaYs&qjm6zYWeH;Gl zy}JDFE$0sV?k(%X`P1ylUvv2IN;2Nu`y4hyck8zW+^yd?;BNhRzQnEH@8E9z8lwNZ z^*ayT>c{eP{cYuE`*OZ<^KT7q`SaQD=fO+hkAcVMJf4^$G(5iL@$qWqY+v33;pQI$ zxBPiLd@KG|tNj?1r5*TQtyOpP(CO`7Z}|%ik5;%Fpu$1Hs+%3xmLIexp9a(`Pz5&lkJ~-Wzpf z;Q4~x;P)!0UKHhX^?Kl@bG;Ww-EFbH195^_tCBd#mBPCg!i5Ve8<0DCVC_ zz}@+;D(r2(qFxT$%+(7!^A+=32X5u%eD*`pob;UUTA+`AqwP=qZE*8XzVXBy&iQXN zCMS3Pn+tB^h1=&w%tf|+j&wXU9Chog^`re0_-*z)9%B2|Qk};`)!jotvrtL}pd{)uw$K#j%;O39~ zEsOz|cSrv<&f}-M!QJDhDd2ATs-XXwJ@YG%{^jP^4*kb;=2sK@KjXA-3U2oQ&h;vu z4|qYh7uTy3@!QtpIS-{$|hP z8y+956*;UA?~`!zf5hQj-#>!%wtnw@y{td%J$aMBF(rrh=F#P2;I{(Z_3&-rwqCxV zs%$TwGi3OzhTL;`j+U3-1>cPLvqKfv0x(xZpkWFKgU>%ge$=a|&h;$U@*9`KSF@&whz#|D&Ns~znf7$^1k?ExCeYCem55yK2JCl{lVIc{>}n7e~Vzx`PAl1 zzB{NTcudo?ezdppvHl#7=8yV)j!ysN=AZ3Hd#gX6hq?*A-$0*WX!mJc&$0QX3)*8X zc8)u>e6-I3xAx-p>xhFl+kV3<$^9R8{JF4&%>I>tMlD6rgQ(p`|i>X00d1Os^#Xna2o=2PIURVS|t-^OVl19$Cxy``g%U4d&h;J2v1p5T-4`$pxw z8H?@z8p_CUBz>@>m%&1MDaLmR_+;>T3+U6Jw@{s&$JfRyAiri9|GhPT)+YsS^?4h5 zeeem69&>a*ePh@spg*Mc?ViS50?un>VNl)bNBa_(Z(REbxNA?{?0D}YSz9_GIyto*AT9})hKiv!N9^Zcp zZpX`*h@9`eb@`o`k6r$w&oLjHelt!Ml`NR^ z+z9=x0XO~5i-mK|#;|iOzWanZ#IE1d{z-7xp4_!Bj``TNp9}8Vle_kRIQGo{56s`L zKCEbtKkEI9rR%%EEx$Q;WrlN;%@5=}esuZk4u2Q=*WlPKgn|4-{5HHxCZ>~Mp0>)|2vE|x7|MPl#-pp(fxW9Q$M|&h+hOnO85p0g{vPa2e;(yM8TxW5epvpR;HGbcz6j&< zWz}i_GPrC10l3*Wgx(+H?dYhq&w&f;cFad4#y| ziOwUX_2UA(^udpVztP8xi{nMS8O3rRZdd#WalsMd5{I=xzKlnY5Enl}T#$(k;e=vg zeZ4rgOTNS7@*N>A8adpq#S!9yBgLT{d`EO&U`)%zdnca4?={$33|yUh|6-^8xt1tVAgBErKA0=~rUjoDU?86k zoxCde&@k5fFRsR6blFL1YK3%q<)o-9m!0ILjijp%{a4YlyCXrQX(qM~!oP|JJMPVJ zXnaTDQk-%2XjcNgLC*(Q22L_f>DB*o8aIpsAY?4&z-K4Wcd$e|N^q zX?o(~zeeEZkL}O*?pu0ppW)!bai z>65|H1;TT}rk4gc{ZZ(B!EJrT^t^w-^p)U?z$-8@0`-R-{eAG=;1xv<^)DR#8|byr z-%oaQKId%y4?^et>~=nh{(1kJ=_QBbd^C8(Nx#6+YeN4Xypp5ubo8ds>tOs;cJ!*? z=D#cSf#9b)I`4loeIWA(uj1$n9DM@w2e0brJ01N&=8svwnxj_*H~-H<9}Hg8(R(@i zThRF(om!6mxTEic9$>tl;plrE{SWAEq1SfwM&Ooz@e#Q80A9z@Cp!8#JokPjv@)t+ zI!eC7u}}F)I8oFF+uPdr40N6>aGt|t;CF5w2e<7*J%R1x>W_fCdOx(EtMk1frf-42 zZQxzSedxai>T5dvmqGd6^i{!KJ%Tlct5*Uyo&G-qcm4DHjH`cw`OwwB26uISXUNr4 z;HI;DyD?w7`Sbo^R}U~>x;l^FTz$Q#f9>hJF~7R$Pr&@@rZ0o})z!;_yZUNRU*qXp zG5@;hcY(X8X>OPJf%hU4O1Uucz>Radth0_I#J7*&j*2%h7qg@dI$X{>b#(|3+td2co}Qd1;>o zZu$B8X=u-L(f?m_+CK{Jwr5jtOV9n|ga9fY~oY!~W!uYZ4J1oyuaP#Nu zygqXt#+O~6p?z0yvp2uoies60Jw*OYl zzqWmRPWxY=oBa%|Uupjq+JNC1@bl0gHwz6p_gBW*f9E;<*XQ)l^J}jEGU%_a|3cvA zkNH(}ILpKL{kirX9G&((9nS6Xiqn6&9w&F#lSR-!-SuQ+aCbdtBntzvpr)@f9L%P%dkJO`xAISQ!i{QOxa=RP*U!% z@8)po#=AqmiX45CfxHLMIMZKGP7#56AE4>XZz8zmcQbU(=e(zgft5u8nKl3jS-SQ_d z;PG}2r+?~}KRI>dY|jhG@y9^k#No8>?AfnAhR$PM^T+Zty_KK-njjxH|JNP+Bk8=} z;re5G*IzTw-&>A7{rURaj?VH?H-Bu;By?+EULP+9-PRMl-d+~G6#f`^{ktx3V92lz z0dJ1qcDzEpji{@AA(c>fx86gvzoUs0rS%U2BC z%13`y@#p%(E;Y>`b@R6jzlY;*srqMM<-LGol(Rk)!QJ{!0=N3IJUkcTmgjwND-Zo| z!=LN_b8z$DxTG z3%5V<_!QZOf%$a;ck9y>+|92!xaBuY?Q3azo`2!}790d6cgL);CFP zQwDy^kY(E#GP!>TRm#4;%kh6ZxQ&0lM|CE6O8Zw4RHPJsx5PGQr~=OYS6yra2Hro! z<2k#Zi2gc(n?KGcyq?=y%)|S4qaNoq9arc5LN4d|T$c~^cwv;ybbib2CU7)U7|3t; z_+*E3zTx$9Gy)U+{emHeV#*pX>9U+Fmb!{|f%P`s4ifFYwjM z$DnQMqwV%8A65nHH}F}GJ)cK*?JsidKZpOb(LcuFkAdyW<2kE8d5!#k&-Xj_yq~Kr z>TK8h$@@8cAN=hAZ!6h_^XG5iZhQO=ZtcPL%!@X2+cO`y+n!g0yXj-#mcB&|oUa3a zLh~bk-Qj$X?8Q>6^q5kkX=c+22~TE;^Q zFQO>!^iH!VlG}?Y;6=m>`bi4-5xH2>oWO#mM`ZdDx%>zuX_@08tV`67h^0FXa(NNC zGreqKpPr;$P%J$HSw_>c&Fv=%BO*CAxLBJn-3KhvO9~kqDknrc`w`dq5qNga+YEO! zJ1pYz^euNsv#Y&`%)=rsNw>)B=h705oYoy$#=MBUzD4!JBK#y}e2X%^g|toHBJv#e zofsDk2k_Suf3_dwd&QmxxA%%YdMd^h=9MNo0G@9m>*P&&VT4fUOtJk+Xz*(Tc~4qV z%pD99A~?s0yz(m_2mh_Xf7bjbR+aY@?F+53|AGJ8p>0wBKY~vO->$rD6#IGbKh*ww zaNZ|dSatfZ4{rW{#yQz~;FoIoFN6J3{NAnUhkvGYSrx2v!QmzhY(HKHwf1BBC(*WU`j5da zJ?nQ7?A`jU$9~1?$NIYbqbQCE;j_4wm)pO70eLo_1@QUzu-^cE7V={EJ^N!} zw6*m|mj506S^3$Ywt&0+iTfV*r)u!GkWP;j;yKsia%4o>0xTyIzqB%GaY05j<0wM9 zoxBq+-No$8x^|^6$N1jN@Nk-!jdQ~E3K3c|as&E?gnP?oM_LqyQL!UM9?`OFxF7a1 zs+gTTCnMy}H*Tco&d3(HJdjqT>1B@+d8Fk0vWS;FUz|&W^dbe>70#(8UL%Fxe595? zJQ8b!!$Ywnc`X(xbeQGG6;Er7$nNN0n&)Gu;HRB$=X>bMc}|Ui`g7>R**eZ|z7Fo5 zZ{H7&-EtV1egej=rRVo%24jrd^DVrmD+O-%bn$uJ1K{>NEYtITRZGwF!xiAqJwMF* z>)rFiJU*PJ`SX5*>X`T3^S7sg+xc6*=YBZ&7iv#F1apSVCpdf?&d(PGw|m%FzI!nb zTKU*Myxx`FKG4ZcXZ@eVzRK#)`uqUy)~7J`6>fdngS+*)1Kh38L~yGQ@Aqg>H0S;f zo`1d)+}$2a!L2;Ze;&A-|6&}ox%uw{ck{1aJU#!@z%75?kFo&V?nhz%?}EGeH^9N5 zoBwIxZvHiKaO~!PBeEYCu4D-ZkM&*0Yo z_+I$Zm@lryHe=xStPgJ6lRV{cZhvyC&)HaXu&gJAsZlPE^Lq6Y&~8$l*YmkAucZ7Z z@KWgCF-I>AZaUNd2F*>+_s5vd{Jz8ZvHWTO6S!-i597(~o5P;(f0*y&A4UIm^XKyy zX5Rt!arAc_28MyDaS8eXu5U%X1^RTb}XY=AZr^f`2#vhrwOFHP!{Lekr)= z%x@|7`)+=Zg1hx8X=V^G-FLjQB^ z+ku-s^ZN$l&CTx|aMPLoTW~jhevCiUnZ8%?^z>gldU4dh1;!JK6ozMd;d^J`EtJ#$ z`QWbq72vM_*%(hTwP*jF1Mcd>VejfKN~Y`2gS+}>M`!-yv4?l_e-zyOciV__mo@PG zNG>VB0Pyds<31_n`#-|-*61&(4AF0=j{fl>`Y^+2=vSb<$ErQ`YRKQ!$xY|C;@`md z=Qqt5_$~DBaC25=j1dOv<*-{do#p!tYeTnudBClF)c0ep?CR?=KbX$?WI#7g`>WAe zUHkgwb9CDGb2#mvLit?#ETlJow13g#@1Xpq^V{lgoFdmySie`mSAs7lL16kzBRTf` z*7{)ZcPS$50G|{||JM3*;Fg~D^|3Ks`y$|Z|9K{!&&wt4OMOT!(b4U)pF0%wZ~w=v zcX-%PLI*|=oX`xXnvM~o$Iv1BCa1N>Ab0-TbhoOVsMt(;w!>>uIxWY2@-t|uFUccwi8*VCM9 z-1RJmWZHU`&jL@QF#_*@=6Nz(zw&sc6}YW$>F*tI*WXrfcYVz3yRJW8Z*l!~1b6*? z1n&C#6x{V!26Kt)uRXZy?_zM*-&^3WKVCm{{T0Q&)cmo27lK=Q)}Qb9F#oJ?6jP4t z??Q0b-#Bpd$Mi{XOHco=fSZ5%A?H`l}Ca{%GH)NRB<*=YDXv{^YK|D&Fy0RquFiJdV%Y{3bZZ zYiz%N6;IcH1Gn-}zwE?x{c>GS1(>VT`vLd>bIb=-1Ni1UHvmGBwc+Q zxT~L!;}chJ3~oBV$G~;ym*{g0{GLJ^;P{M?2K=7F_4xUNa(+*NzTQ{P^y|Rg^xuKI z>3OeU*x6#%}XD_cy{yW`^DV+`R)-n|2g1p{z)(WHZT2d zFMUIde>Z&$+|7R!xSRhZa5sP65AUYuiElT3MQ}GgpZ{>vj{tYmC%p78d+GVUBsYCI z%qMPoK0o5-Uk%*N{~T~jUt|E@KLlPK+nizNS{%E9Hx?Rl-tXh`0UqZwwXU8E`&XA= z?D1J1zZ~cYdog;@&0-|Qkwm|0q>vx1Khozz8LCaocF(<4Q|hKkn?>S##z5xz^#5B&v!`RG09e|A24NUMzC2J9~fN_E5b7zA$i%cjfy!T#0iPrWj@=}f;4`zOnv^~uEk*6KsP z+~K?*{}ph%KcD6K8r;f5|K#SM>F1)q50vVJ?L7ef-PN08|7$w^4Fh-m@qHPtJukAF zJ^kP0@iR~#SFi7ImXGi5cKzkS`9rg3f8Pl1K3`K6`(NAMOg|jw1KsreMuDYgc}iAH z=Z|~*FNd?fakP!qm)A?k?Rp817nXv%#|yWjZ@9+`PlDU=0*^O#gWK@|k017c+wlnf z-HGw<`kM^y`uhyr^;Zt#-St-)-24^5^|v#?AJX|^G+rFX{VDr61M4>)-0H{ckt@ON zdL+y99=Kbct>A8X%40ro%hLheEf2qaVdY_d1Hdgm`hOSP_5U8Y>pz0ByZ(EEyZ-xu zn}61KD7af+euvnt??>R4KkJ(xbB9~s(%^1+s)D=axenYd&qLsDc@p4O9@h6IaLbSN zJp}IhFNpci_1_-c^*;{W^*g~Tz}MEf7PJ7{!RgR{qgwS^>>@+ zkGkt`Cb;YG9&qzFB9albN4xAqA7MBF58F(}@2@cC7^oLS|1|yfQ!;{F&|kn9W_Sqv zN9f-x=XlQ#-L@ZjXOB;Jc#%rD-jDvlZ~igx{pBZv+xyH}o`v969{Rfn-25~BIp_~= z`i9_^p5^EBV^;n(=${i&|GipX>ijOd>HHpB3OpW`Mvk}t0>_jc2EPA2Kw0NuPGDev zIf%aHZjURmzq9R2o$t$Z^%p(;eNQij{h_7j`ij>NZGFY^{(&M`d0C!a;8vdCC0rXR zk@Ngc57_rFiT6`$`*QxRh2ujTPj7;61?Mpc19^K?*7!=~-x2#K-h0K+1q-u@*kACR zBEv)2J~P2NM>D(&`*IPi@0HX3OI&|4dzR-{a4XMl*yo1*dMABtFa6|7>FF1NTYBdI z3b^G@e;?v|h2E&o(cCpVq>@2#4ifBtIe`JW8#=HCF^%|8n6=HCh2 z{ImV8_Vk+^o$ot%wR+C`4#*3hmd-D6IG^umhJLgVe+&ok7scPL_+uE3ZB-v=?}Oz% zfV_vWPN>TFR**&7{pStAZ9T;2(ar-$7YxHD{2qkA)ygOJk?%{*QO^7KXF=bqocZy- zR5!l{;8^m7fzJAw|Pfp!9@9!sXt@eE0>Tz&;-ipt^ zy$p^a9tNM!MSY53YK`y2wd z_F?_1psa5FYJt1;YYcAnqyN_6uKzaR=ASy>=i%y;9G&g=4!HSe{`~%ln?JvQWIEfo zF1Y2-?LQCP-Tse&TYXqR>c*dgfAXH%zI?ug$CEq<&cNqy_|7m)`C*{m58QO}VGd{i zxdYt#54YD7;B_=TpNCljZrh9P@ea7#9`Ax%d(j`i|7ZT#9{KX6w?|oUw>@frTYJ2U z^v{6L<4HsWe*frM@VsaT2KpP0{jb};+<&|N=778YaurDTmmA#tvHeS+|G4cx8M?JM z$J=c1){=er{L81{Zv8idTm9RX!TkYfGhQQPVEGq;TYfyBQUmdgLlyU#d?4@Rk0_`9 zGU{qNd0zAx<2+x(XW`uQHJoqU^EG^a)9jgkhsSw5+&*af0uuP<6W1Z zipj?113b?AgIqlqI+M$hE~G433vw{aTOnnXZaKHxUg#E#c_KP~w$QoZne4DWw+b#hm~J6Dd*`?txz z(Dd|2?%JP-{d2ZI9Pi(a{iS>SI|aP6lRv-bVD>EU$$4`)^CNfjBe(pny$SdCV!rIJ z{fFgQ1#UY1^~|5+kNivQKP*4`CwKjmyXh+wO1CF>?a9ra=UezaSND7iuZOzlTLyu< z=UWzm+wlyK4;O>m@gd8bAIGCsUh-<_oW@ySa?79RSI)$m#BJ{=xZB=c!7V-g@o5<2 z^hfUcE04vE>yOVqyZ#D-yXna-J^c@I&fl`V$=&uNH+#0f9JN}Mc`IG=1=bCPj30My!V&Rv1fbUgZ-gf|2VkSpU(sEe0gp3IR>WR z0Pf~T?&e2s`SE`K8?e8$`}xE60(a970(aAsTYB2p!T!(e>%iYg@WNW2GT;w`a}8+a z`_{2%dyu>S$zA_#D(3iSekHJfv;4^SIh_8;U4P`}kNvA=B!_c*$13M+Z~A))y7{L+ za@QZZ`P+i@>#@Id`^Qk|);~C&+QGl|2lkh?;M!jfq4(q9DH=ldqVrxXP#LCGX^qi< zMPrrLgkbUFkczQBt%kmyf%%UiBN{>w8sVpU336)$ro}MisUi`W_QHVaEDV^Y1T_PW zdxrcNk0F+b2)2;)`QwrUrmHX%(7hI>qc9YfQuFnsVZbyIhGO#tdECx`DujW@?F=O< zONlTn!*F6I1{?y0Nf>y(nxXXMb=N%IwN_C2xw;|OLx}8mdtw9n?G{aC;Z3DK=6(U$L>`1&U1+n<_RllwybP&0tise3ix(!%a;Ws@_r?x|Q-))1<+* zdt`shMK??KGpQGA$7-+XE>Y~L*vYUBS_-|s6A}4#S}lUjk)69_geC0UMFvXeE;152 zcj*$wbnbE}6uPLtE`e;wE&_p?2VJxSc4?h&Dowj+f-Y*4 zsd$y*HHz0M_A=D=?Nz^AxJi4dVXsLd^m?>iXbGIoF49}m^+w>&zRGXV_PkN~pxl}9 zC@gNuh=(yePtGtzAh<@KS&CzH{EyTAHeSck_3#f!xN7<$m@8Pl{h#9~dbcySAa zOvHyhG;{G{>4}RM%LKm|fgXr-w0QAz18^7sd>eu3c!waKp$K!qJ;j}*W5O!T_(ds3 zcpnviuIpTR#`{<24d0VR{;9UZR-FL0J~x2T!M5;!oZHoby;J#4-Hv}~d;h6;P=--( zP?|e9SV_|^Ri^F0;mInkOXMn^J3cyKnc~Gme^t9QTyf~WL$@rrQ~FIS^QXDp$BBE| z{E{{v7cXw6LGs&@FIqXHMTyq-XhaU5U8Qwp)+;@5oO>Z`A)P*)I;Q{BW)3j#{XhLL zyPgrYOL`p-XVHV{t!KUEaLa!`MoN_BWt626S7&dmEDpIaEDHaxne`-g3YTWV>R$dcd2lz3_jh9DUP@5saP^&FX?t=5z<^3fWQrL}WKb_~W1U_@_Ob7Wk(-mcS;f7O#d8I2$l}t!#kjVue{0a-^3DiZkN@k3#~+{A zx|M~jd(%U)EISQhm}SdT!>n=XA$Jy*7HJ`?gcq`^cp=O3H~ha?4y>_yVa?mRMVAY^ zWZhY164zFb^S?V6FV+PXmsc2a9RXR3$ILpItHMNV>Pq7hVsW7?zZA0W#Gw%XJxM2N zKE$p|R!v)B&p(<)7$26xwO|3vM;PBMd$C?3%Y25*cUa{tCqq-Mi{m2QqUI4x8YV4} z<2oz-;Gk2w4_G@bmR3?J1ONXwEH2Cnk5!%jvT!mgJR_z5mCWMlsTvF7HZvY+0GTFu zxJ4s12#+vdK4-#NIEZT!pINpo*8W#l|D@|Rz&Q9@x8lbr{QZ@Ee4!^D@Og1WBP7oM z`rF|@_WS(O#+$2F03 z%bLuc!?3bRi%u7OQDXm^CJ(giuV2;rB{iS5>gNshb4dLh3O39QPhDzX%DPyD>~E%J_muc-RRoGv7c8i;*DKzv z7@i!$?|#a!Rg|*~Irm)Qa# z)kpZL$~SrT?TUzAR`r?Pg;!GkgqPovC8FE;>U-wP8Ad&=6de3TcqvW);8Njo_6GO* zjga(K{@))HZs)DtF{rB0z<*X#G-MuWlp6Y$-ai$COEHo|;dA!J1 zVjm5yFh)K7cQ3yxg~Z;r*Uy`zy=+|6NC_{Y{(kiOQ{T;!-mVkeFhIEVj|nY>Tm9-b z6Rwvvg4*lEzm1b0>ZI52mj+^Q+pGNpVt;~`r^l5>9={j!(6eq`gNa^&L5g9{;fYQyh6B*=N~=& zOK*FeSzPR`e+~UYxNVQYPYAd1`ddVJc`g4eZ~T4yiZN}YUQ+q!8zjB;zjwb+ z*S{(%x|QeU6{6er=`mHfwcke-)63KPX5m#dzmcoO-umC5--VY_eZ{w8-%|N!rG(r3 z@#jloZ~K|C4Mn&9Uim8F*50)|{f2s?+x&co#~=5`+h(u)YuieC8=svn6&}&@mYpPA zcZb2$?NVNw51wl-x{c@FvqiW5RN-miHeXL%F7~z6|J(l(y_E8T-hBE?QgmzIZw?B# z{b`Gjh1+<%w66HK_E_m{zlS|u$mx-2zK zxYhrOvBIr=%6}>R0?lvwi&9@3Ka+cjZu9$-9>4D%(XIVfdHidyzSW);dn^CQSB2aD z`0BTWpQYt_z^m_fYelyO+SnI_*HQaJ_X)T9F8B05c8ku1GQ*FZghxUa1lz9@ZuR}5 zzi^xX#(U%Y8n1r6J^d1I{-|-M__Oif_e*JS8~-PLCfwG&xBe*hmudM%T`Ao9=Zp`9 zpQCznZ+?5fjOaE$_Vu=3Rgd?dC-$eSzv4<^U7b^OMips{|j$D zaH6-q-u9ccS1I*B^8v}v+Nan`;WplW|5&)qr{8<)k)~dMiFoxtJyX)#{^uDl|Ef2O zZtH_C-h7*DtLWiDDa!n+H$L9nlCEcX{j8{zqfe#^~w<4w%?ZT((9MZExH}=-QGmF<+sP{U#ENP zfz8XspRFg)$&&Q8|2qFA;Wi#V^5&CP14Os^yPY?Fnhq7+`d3+Rf7Ikr(QQ7=d|bG- z&kHk!+kEh(=kLenqFa4u+$P-GGm#W-`@iK~gh#Z0jQLc!-9PrM*Wa&uNOT*YBRqY( zSH5kV#omrD*L(B(g?fBv>zPaUiv2}ep8kb|+j@VMw|z3b_4~zx#opSt=KHce?fgND zRl;q(aj`ePmU+jso4n(pXvGNntEJh4RaVyB#3vBF8^%a!&0`8+;rP?$w* zs+_6&y4*K$MkM~|9LAfTTqgSY-+%Q1g=E)DLOqxx>3u!gQS|sx^hgKQE&qbz|E@Ld z=Y)>$OxJ@I1HQC1#5e~gb`SkSB=OzCaN7s6o36oRO z^@Qq&R(-gFdc^YA_Dijo_Q^=~3YU8E?&^tW zSz%fGC3{M;KA(Ksm-#1}r|Z#cM1Ov3^Ke&{^7P0{lK;gG;zgN0wc{E>VEz-uZVLGi zANLRI7jM-&O;27g{y#sVY&cYt7pCipm&JdJP2Fz~6ONH#X#SJ0h`wp%A7T3V*Efj& zY2r88S8&jMzkf_2aj%pwxbMh%bgGtL)5nrxH!iWfIn$^5=`^6}eLd){`gBPbStI2u zb@f{#!~8G1j({66MNg^z+rjtyGdgv-=vKezT1o#`se8ghi`e*nG|O(^)Ee>A`;o6c zWPECVYeHb#KX^mZ?_RcWDdSTsql6%Pd=8NGr~h@|YmASU3%f~<|JOv%yyoZS)Khn< ze;t3Rb)ui!Xij*jnAm8o@-QA+y9V?SPe0n^2{rR%XbB>k(6 zPnG_gQeEed_(L}{S+KHD=1bv^jXHnn_&H4f)SKT{OZsac{Oc^HkAJDU)-O_4%2&O^ z!O(qVhgZIGqF?t}`{|*<^eaLLw0w!};=fzveK87&d)kD$Z69AxjTGJHS6`3asp++T zz8)W=x|TnAleFJ6^QJ!&=074`PpudIvOyWLbm*O~M+b{uYj=%Ircd_nAmz9D_bRDh zg>vna6rxjAxA|*>q+eWP^a)|Y`RVC{kEDN|SE2r%F#Up9XlDICIZDz$FlEt73Xvjh zMOXi^Vv_&E<<>n$A@R;7qTBwZxafWFSTTV@>O;{39pAwzvi-`OyK4#c=ogw^{YP(? z{9kzX`M0Pi_p1Jw!-$mn3y$Pp1@{3abgst21zKX2LZVMZxWkEx!>y8LsdPYzB` zpHzLp#L6?NM{Z8nBU{A(+vR`yj(XJ6Tl-9w`uAAZ?jq{h<6pO5@R_7P%_htQGtM49fSyC4}tx zDOFYU%vURg^K0Vg^!Sk~Mc7du0? z&xrVIk1$#EEv=vR-`b-0Y+L1Z>cQLEKDvKRsJ`d2yC0{V+>o9=)*nh z&@6lZ80jqfn|rPdcL1qVbo^=lsmG*#^?rV0MwoC<`u-#JtLXLD+%YfIcdKsmV;%87 zq1BW-s3-QOr%yaC{cphL^<}6>`@{&@<16-)^pE_bCxt)aeLa1-_`hMt7u&;x{nGW| z21%c5>yB{!5q+a$XlCsnSuFYAnst9T{|B$i{>}8b>DTTLJ5JnmtzV>`z|G|Ljknf8*UH{}Io8T#)IbABY}gWai43zd%7dp!E6C;>|87P_k6% zlTWL8daW~R*Qr~teuMKbYT4nkZr2UCap0hv2H!knI5Yd3kkI4x?Bi!UuJ_WU=1KWu z-f?2|u1iA8q+;x0u}iFw_GsPc(>^pvJtTIKd4gsadrs_5TQ@)a5r0wbma1Js{G|$s z-3v<|{g(a`x_?Q0(}6UIsa2RKm{w#XrK)PK@?b;7MyL#y0N6}M1rQ5}x z92ClHJ}Xk5Kcag?k9?bMmr}c5<9WmRJ=i6BYInL_Z0VrT-=aRXdxt;vtDRzYJ)RP~ zr|bR_Zo=d~u}l0QXm%;JyQ#>m&GZ+ya;bf4zW9kP6I}FM$Bwj1el5qB!5+bwZr|i} zVz=UqF3*H^Ps@JP)+=V0Qh(d;++C7(iIL_-}OJ%%X^70EcXcxSAWPj1#;;&`ZGI>M0SJLfL3q+4!F8&5@ zc=%r0rM7hs%_Av6vx}`0`{LUg?g|ZdiXPt~7}Nb!w5$00rF;GXv`h56G&D~tnq6?e z*j-m@Zvh&_&e#2tqS>X?ZhHlO0SoQiRqSGhns0E0`1|0LMI}PJyVcHcp_D(Vb|0U+ zB=naW7NdFgx;3VD@owTTermUh)Z;y4gv0C-t7QC+`ef~N>hY^%gv0FO&xpTqTLvr) z_1-bUVRo^X#NW_dJ>2A`Lr)Mt4C7(z1{7;@VFxw_s9?(w zVurR~*d%tXo;qn24WfTYxe|&tpT<6x?b~u#G~9m#=XMPJB^6`3J)-xEU5U(MSu{vQ zB;R-?&0p;zpNn0&g>SA79aR=RWoY}=6Q#dg(6an*w2KeEDl|_H6|`|4D=BuH-raXL z4PrmY_)Y8=OzF5xTp{&+;JI2uXqVg|`3AbK8tmP7MVljqx_Z7p;+^M@|2XhS=7+_d ztLf`{*9GDkQa($N`c`>CX|H}Y_k`z>l0|f#R8%mbX!Z%U&zCu}5q-r9tDRy*)5ks& z|B?G-oKJbQON{o(*5ToD5W7S$s+etmqLe3oKGsz2nhQo0%|7*vQ+IskFAjMbnSlkRMs~>MD)l|O{Zw~DYc*R?z^REAI*0e0WZ!I zOekjCYk6)vcy?`?#dnC`_)fu?p>D6(b5fp)>mRI1`@}Y}i+(N`Q8fR_8B*T?lb-l8 zwEtD?62A$?70o`S{#UOW6b_Koezp5iFlK1wd0xtMUBPKQ#zFrsMw6Emee zBfqa09ybOjYx_h5Q>O@;eMTYiJxR%imLynnoiN|6EDbk89bpzJ!TNSNbI7m zG@YW^$5u*t22D6+Sy-ULVwX^iE1G>u?Th95_T13_K=pg0;vhk@kG&}V-}>SEa6qL- zs(&4iiCaDU+0veiBX?J&|73U3Q!&A$qWMp$|94jA`!Tfdto{^}T|ECQrF|yPdSWK+ z@~rtqS>d^zQ^kyK1BQYSh0(Y6ATp1 zKK8Qsul9BCOxj035xbOPQqk;FYCpC_5$XTi#6F=IS2X+BE8@RM^{jB6lK4{WqdNp6 zie{fu`*Cj$4bLmYc8OiETQH^E?4xs}|D0EFTZHA0>{Gu#XgWo+kG(48`Fiz$Wweif zp!OfCy`t^!Qme(jOtUY;jN(<~_${Frt13L({!OtjaDVR7^dCK~6Cp^RE*MiD+b4GM zGSc6k?somXp=3V z=+TuBqztcCuIqu+r(%E3!V&S{-OVbV)T09 zW}o_8?0YP{yCe-G%ld`(F~#6%;o0`zh<)d|uYN9iqn!Cn?`A z<@V3Z#8=9C+Ro2J9}ynt`I?xfi%*n%YIZ;AQ&u2#pW00qj3`DGEuDXUC$>cF?L1F> zm8O4L(9%UFNq*hyUj0&--z%aANwr_C_Rk2Ww4BLTWqn-ru7}n$U9z8!55>4*X}O^2QfXL9F&)I&*vWd1mh#mXn$WWm{bfb{wLWE z@!m2|Y^g9~5z|GV(|)HIS4=8K_55`FUP*V-uD#)TwOHF8Odg~z5{w$ZSa@8yrH_3p z>F=2_COoi+^-#O3G`;dfOyiYjr=Ke6M>T%+1m+vfC3dL{!HDrZ!eh!UeRP_nuea^l zSxg@rC&xFDk&4Pw6NJZ=C-wYw>>g?FZ??xrF@5TgjH4h!#$6By#uOu}Tl(N$Nq@qa zALKl5rr1Yv>9|!MC=Zld`h=z*bIYS){Ud)#{?UVq$`gw5KP5h?*SF$@r2Z57UH@TN z{<1d^f}S|8oxry zy;68Wc~ted#+#qWTJbY*YUZ0^!mW}nK34ohHw#ZGPi;|MnAoz&~irnSQJ)2XL4pHY%7wnTVBc~bS1#+#qW>*8l} zvPrkFJilxHlf_R`d0cr)dGLqkr`tWHex^Kh<^A*%+aP){TKq)TD_4xF9yP9h5^qR( z8r58wqMzvdk}j!!f_H>RwA~}B$2H#S6+9~Kyx@_Fed#B)R?@|$YWu8Fzsi%U$2H#k z#NL$hjO)K=HvJ@jk#y0C>PIm?Nq9mrsc3#uTAs;c-?%08^SI`JtNK|WJaU`xsPgDz znxD2$WWAJU_C;@oCzfJwiypIfeoJ_u7*#!LT>S*sNc;2{wRjH86WM9`XgziaPmB{D zsGih#t5#wF z^lsrX#kivRNogUZ3OK+o}gvX4l9$6>x<|pxvl;`%-8@(Hr=P%W#XuB%L?-8C*Oe&h6*t_Cq6;3d^%s z{3Iu6`|Q#3C?-@-C^tWm_ry=hUe(uzes)W`!2Ik|KgtuTCp4aE+|YXIMIpUJv5R7N z#cLG%DBh?zQgMi)>(l*x;*;XPoZ=~pRTWQHtfzR6VspjDimp%hcc16Q|BZ@66h|tK zQJknaMRBg;bVb*v`@3)cb|D?8I8^ag#W9K#6{jf9Rh+Kq`gDJlj(e>&6{wPEIZ&v(5ai`*5#r=xED(1?Rbbl##eY(H%KOlBR6-z0eq*z(; zG{xGA=P914==yYjugwzw>lNQq+^D!!@k_;Bia#svQ*?d0zu&xF{J*RCvEmlRFBNww z?o<3-@n=QXr~5nKx#GWwVoAmFij@^lQ>?9cp5mE`u21*(sV{}M+XOWf>nNV3*hsON zVk^bYitQC$pYHEXPeeodnc|mqF<>HZ!uzG+Ca6vr!0R-CFh zOYuR)MT+wjU7zmnvZ|k~SVgg>VqL|v70*{}rr1i+_38e;{yk~`0g5*(j!?`}9IrT8 zahBp#Mc1eM`vcWKQQW4uLvgp__lgG;GvAkT{h{3T>He-!=K7FcqBvM_hT;o~TNMu~ zRw^s$S}0zxnC*M}fjs;jpE)~>iZ&}6Vq!u@i1xmlUAaOU$XP&q^F(MMR`?##kCM+C zMW3(JctcYpqMy$9Kcbn~S8XmhQL&818#lY1p1q&W_y1yR z@jF!UH^u25H@h_&zsW;O=lgGaiTHn_z2NW4H+tOcVych#(9-$-Khbek&JrAN7Y!Mz+jL79{ ze5_IJ6wU8p&x?F4c1gv+o-a{MDke6mzfS}MEsyz4eJJJq_^+XI;&_|-RSZ7Y^omKv z#1|T$Qoq{;&2Q3wens`DJ;$OL?2vR(#mHCcZ>L~f(YD+0XXX5%;Y#J36ze`GdJn~F zD}>ioyhSmgc%P#AuQpliPrpm>ta}7+xL5GxNrDUR6Wpos2NZ9cD)B!kUOG*<`QQ7o zaKqi73V&~t;2X*fO;2qRz1KFu;0wV#+m&ku#V!!OQ*lKT;S-~RU7HF{R(wVAlx7lt zmEyAI!i%>MwDSK}PmZrj*B5NAc%XrB!=V~KLvfg=&rrTXaiijQO`~B}nau>tDArMI zq4-gA(G5EsCEoOLs?Sjj`p9{M__Nag-=A^$?*T$;g&hARpA$?xB^YRYVu|pS9j7VA zE&d5jZ`{t8<~t!cAs;e00srt3#S?&}0pj&#cKPrd@9AbFtSla;VIr}DDrq&5ScfSx zgS_%uF?i7wp{w-&=8PEA?eG2`*}M71zx(^_rIYUYyT47Vui5Z-e`m&fg#~J(*i&(s z;@yh#6jv&~r?^w`55?l6#b0&B#)_9J_EpSMj4sse-c7c9myTbB=OKc=a=jy=80{xK zdV^rBzhE#x?G%F>g~t_B1J!P;9JtiQ=`2Llh?}&Qa`~ z>=TysTE$_C6BTDEKBoAR;)jYm6@ODKx?235tXN;Mxnd{9-ipH%Cn(NPoUizT;(Em` ziq^gtO%HEN3@$rPd|B;|7c0#W|AwC`H(cg%i|?xOru*FDo6m@bRau~zXQuF8it7}s z&XV}?iaQlAoUQ2<^UTroit7|>&XxFk6!$1Tc)!H|f5o#k-Hr#PeSSVp%=3`gA1{_x z`|65YJUrLqrgzl%YZPx)oUZtk;%dd+8wQa zUoDjVK;FfIg%pb`mR5`?4t`4Pju$5_7kk5c&kH{mmVY+gZrzLNJgIuS6%v26`mGot z`;(o=iN!{W{qbTWwKr^ho1{0)duuwk_FzfijNIB~Dq z9WPFvC;kl^ED(MyJYl}reX8k=Pty2Bit81RR=+~Ex`ome$BB=r-SOg2YH!%|49U;1 zOI_hUPEk8Q-gx2KlCGQL(dt+36FHAn^*C|7+8r&z~(g`2oTE6pj1(%bKpLrZe5I-!5kUsQZu@k7PW z756Cqp*W<0_Xt$aQ|%S-Rq zuWvu8-~TCWt^SXOXM6d-=Ghy!@)v{pQb?dG_D}!NQLnANE(fC6(b8Kz$2FDx?S;(*kHyW-(CiJ5H{R@g zJenWh&gXtQUpH=cR{xK$mwFc+Aeg(~-*dAwyrGZS-_$of-P_82e~)7JRpr8nmkMPZ}C7dQbaIzj$q^ z?esq0nARhCNY>+VE9c5+*cI%$jo&Z+Q~3%1sTDs;z4IO={y#N3-+yYwk5cdaM~VMW zjV|z?TJfXQJJ(U-|5Ky?*}uq^&j@7Y@z4InMuIHO|7j0v59uHO>|g$A4{L#Rl=1S< zd}^)o&v>zxAlm+=$3sKH=zq7L>?<)eOkXbiKM0=mzIUwA|G$HM_e#4RcEaetxTY`E z4`17p{e0ekvHNUy@r(ZN)t$C0^6?_Q7%s}27%pITwLQzD4wWTQn8d`_|i7~ zE~C7xqV>=6%1=_Ppjc7yWW`eyBZ`$2D=VI=SVgg_Vl~C;il-^oP^_tVx?(NGGZgLo zYaQiv73(S1S8Skors7$OXDgngc&=hY#q$&!DW0#`SkZ?m_y2qI!@rwu`oEdq=LspN z^&`I?N8|smq}zF%^|SFMd%Ga8ah6*fz{Z=+_tsu^-p1CGcAQ>N(-l%ItoYA3m4^7A zGEQ}~1hebh*=%Zyb8dR?kK~F4TUYG%dG|G!HQZl({}uDcG?})sM};SRK6`QAPcyoY zE%D0udR5krD%8d2L#}#d@WH1)k1ssov-^kazkjvQSNFaDs|hV%`Tq3>R~LQzkwR5` zKCssAGZv2<(&n>8%dXrq@wZ!i-l^jSvj@Ch@9{UQ=UVng))lY%{HKDc*IQ0qxUu84 z8&0^sMvam_A79}4>gQHEsrH`(YF&I{;d3wbdFPu8^jcM*-z~M*uNghQ*5GMAe`MFI zkGAby{_#PR+pd|{vHu%BFSl#j2USj(vuXTUMSdQX=vU0=rB}}{m#_ahC$}5cs``qT zmYwPIX9`tl*kp*6!o;ePiw!GVt03!%Gf-b6md6H}3NJ?}uKwcW?g= z^M9T9+bcf~zv*?KpPZC=(8lYq9l~wDdAj$#`{y@{Zu{49-uF;HJs`U6Uwdvzw@-zePHDK~8uZtYp&cj2XUfY$QL7vGj{ zU!bLw&(Ji{Az6TEq4hQ}Lu^T2uDaqP%bWgOT#|Ec?=JhmQcr}kF9 zE}p;JJbtb>Z{_}2{MooK>G3XJeX4l+OwWH!Z{EJmt54IJlAo>PuJHIPo_&G&VsG1H zfM-A2<7>R{$`AJD;exM=Kb!Y9c=mO6iEi_JZ_oZ^FTWqX^les4dfRX9-7ehb?b*B2 z{r8GyZtLDZ%S!*TGsUVrpQ;gVzMtB#@XKE`>NPF{cU^S^zbl-JtR*DHJ5&)4f8LqG2r zdb4Bb<&UA)Jcji5_&>bLe7{{K2g|IF~_3%~vikD+%thW^np#!u3lKmGiNJ|)}7 zj+cGCnK!@qdgo*4-HxG`^X41h|4eUw^!59Xp(l=^mpW?xat6ZRAN%|Fs5k#C_qN9{ zZ~o~uN7~!w`zc=ktG6_LdzA3T{~@nGUgzcih?ieIum4={`Je0APxQ+7l&AOe%5#?I z|7FiUDjOJ^gUjAR(tyIp1#i0fAzLU=3;4oJ8$@xr?>Lv$1}Y0 z<$5lC`<3E?&)r%r6=rX}b$-kF(akfr z++4XWDRrt=uGC9Y7dD3vg9}@Sb{VD-LS++t*I87|LUJUv(1u`rsg9V;B( zSKc;z@b==diF5TWH}9%V)k??4cAw3i7(2hCL*{I@h{$rbRNXvRt;`jw^-`fGvUd;N zB6c`Xxbx&a!=*cOa|dsoE#`&`TMy6g%ALIR;K6gdM$eD#zvJ}bEqC3SUl`xpsqbv5 zo|`Vr%uH`CR(^K6GF!-(F!9zQ6c^Dm^Jn(mda-nJ-}$}!#?K6IU8q%eUYyHqJvl$V zx4ik>zHcZ_bil<3*)T&-T6&(-Iv1rff}2tQpoRJ-TE-J_eg+*&(vFne*w z_VI(aj9u7ubpFukz1s@6-*sU=o7;KMw&{GQ@HuoYV27&cU9Zf}Y+l$lxUda#t4U_( z%eiCY6ZP^PM=Q0R`MJC9IDT+p+rGQEhnW-N$Pk=B~|6ZQZ^( zJ5{JwMA=)1c8Vox^+R(DQzD+J~g+mvTys{TkqVQJ$ZWb zxw{T6A~Bb()xFYJPj5eQ@$TH#ttaov9=PYw_#Lz7#&6wq@yx!_a(Q_6uHCg=Cnxu8 z%ig_x+quOARwk=ik$8)-=k$fMC(3u%x88H-#PorD{>aWVd*)7WUzp#rbMwtNpWju# zeOJD?dvs*yE!z$(BJuRO>NZZX3CM=lqrnM=N`7nY!oP_Puv3Y`*>E@FEfyO0)*mF?6Zg_6rww@7_7K z`~11vv%5-14or;gJD0!t?9B1X&f$d%Cns+iDV3)4_0sW9k@J(4S_v(Rm3pDPAYyk6 zZIik`x%Jrmo`b`O_U@a^9vdE+E{^OuIKO@G@$JXQFN_|XEAQKO`tCR4qn`SNAX-eTiBM% z7IR~p@5;{B?>QQ3=*y}X&f`N{a7t~S+iIt8pFOfWw|C+0g~I&FTW>kK_h9Y(%!T9U z56;{?w!d=l{GQU${QjAlJ)@ywb7zV}rSj%dxiqw}Rm!-_Dz>*+K7aGBo6A$9Hy@a~ zc>4J0fr-O~3;FTer*9oTdH8Vc#N^oct#@1;sT~Pxqhe)U$j;6TEo>iL*iOxE6@yKk zziW2$*u~+CqbJTD+&{mNs~@;^>m3ufPEQ}6ojq}+a$((8Uh1|BCJGO4$ za?4cy*20!ux9ptUam)6}?Yn5TyQe1e9&f!gTexl8mTlXAcFWG6-Ln1I)}2q?vg4`S zx838>P`J`msgS>ozObJ*? znf`mPH1pALe=oVe{q4kkpk#Xay@o$ruO;`xU!IuXCDT8hSbrt=&p&S058-?{nf}Sk zq<`iz>Hlz<^eB;kaKPA(X=TXV@C(PFzKFeI<=QK+S%2MQ?hs+Z zH@Ir;73;3L>YDY}-%u2syyLuVU|?{?3VFABwK>@Xy|lNFzh&~LKUyUid7oO|!Ctv? z)vu|%p5A``23N1qzt;#({!~Y!=5L$$(xp9pP!0?%=kEcb%fhIzQ;BIm zsyLMvdEwt$OaYH9|7WdX}=Zi+3 zak4=)UcGkR_YAMJU#TSwvue%%Sb5ToNulL$iA?HM72FTAs!YX&O-uZtf7v?0i6k|v zw2#3Rk9Bn7Z79Rv2Ep;SL{Wkn9NcPgCdDN0u)JzjQv>}!=jhPTIOX7|!>Lqty4wYZ zTGSaGpw#Z#wf9&$Ev=ShU|>>kVgM3)I6emVTkh;*o;C(8OPE5MG<+v&S(lm4~4>9WRD_x|Y`1!k(&g3nF12UJt zUvT2w%cOGG>dyy%ETkhT{PS^|5%v3NrK40*ROy)Twl678TCb^08Ib4aZc<0f#vv_WxFN6S~OlhN|}$K1FtT;OW0 zkjKFCHFp_a$#8Jxsio=IZs2x$&ka{?zdH4Xjvw<#msH!jm^{ zddlW)asb@ZFFtkkjgL#EZhHKtP0z50!qT~j?N+W`cjcVmmQY}AerDi*PI!2%NovDo zFH|~F8dhoL{JmUoQW@Hiw7D&Ro#2e)N$(=#+uFBTUg@bQ?i%cR-Gj=j^+?}>-_z-Q zL2;rAorriEjsKqwuegBw`xn8<9~gCeI?*47IPGGjnJiuU?*=DSGES?h<@Z7YsR?ar zS6p$`RqL<6NpRY%a8a=fXDnU(CuE9~+B{|H#3ct; ztiIyPE3aOEQE=K3s6Xm|4Z(>-{-igOzZWP@@{RuPHFQcG{^#S=FbumdF}%)B^6(p7 zc)Q_VYI#K$``2@y;T0oOIBJvfzRA#0>EgQhGk@<9T<y^$FLKPybH%2%S zCOY-K#o`p9xSpQ3syy)*aV+VJ2ABVd;Cv#I-mkpYT*6CDwIZBkpcVh2P#zSf4;vi( zn4uE|g-rf>KV^AcK1lei;-uxPBKY8{RbLJ1P$~TT|H4V;eW}8OJ*WW3npc|*5HH?PnExc!JCxV)KN(MM5R+b z)bHiL4N7NaQ6s{=#qx@}QcLo;Q+Y#+m~e3%dC(fv*=Pz+^LRCPI;)R9!(;PS(o zuR4awl>a9jU6i-tY|+BtxS zLmWs`;NISEs=QDWq3-SfuHbm`|Gpp6NeM88biY4Qc_Pa8SB!(JX6gwuvlzsmcqhol;YxS6Dis39IBa1}6kkX4R-^ zcte3o{zeZct}gxGTb0*HQ)hwyU4~Akx3GDs37xLSsSce`60_I+~lhJiXXMS zT64Om(bxA$#i@G6iOBf#it{Q2zxuM_Rp&(w8M@d0P;g88q@l|4fxj!(^@kV4l~TIU z-oBNBlM#x}R41o2*P8?<(+?_#>RGdH-Bs(Ks&raIVkhawmkk?vxQ~n;%;c%!1}|7TB*>q7(esTwj4o~74>Sx zVHd4j6*t&aoYs+ew3vS7A6Z_(N*^JE$a@5bDzc=J4(wX?az7p6n9i)bik0Ja-?6;p zX?>=*_YuJfLOsYB=0B9z_=fF=`hKFkqAhqu_Vxzh0iu)^eYBDVNBv71l(`Wi7fkfqoI?G^-s{LkQZ^ zNC5w3ODClZ|JsgDNcqEIzb-gfFq8PV{{2XBl8TCwht%=^RXQA;DwmBY8A;d43(zt~ zsD`>`y7Ebiv$GAUN&4=cin9t!Tm)Q>E-b zVQ^Yll}cw`P+n13JwwYE{t-jgPiT%VOCHq~L&a_rhdijcB!O5RGhVhyGN*B(H*&Jb1 znKZn5mL)deDDmp^7Du*{fh?%6xleH7VA4)aT@JiPaA7O8ZuusIQwIu3|44C;R_pn# z4kvi?XK|)}#iRLqdlxz%XPS0z|9d<-GEnz=zu<5baUZn`Gu#Iaoi+k(<`n7g9geI; zbLcNN39>fx}4_c6#&X4 zUP~ncwc-aXP8pepK)C7}hZ7p9^5rX^C^&O0Def(O&JDwcP8uuQHq0-m;t9nGtyP@D zoeXiHZNk!fEKXHaRr;4@jXZo;6k*23T&gBG5rrHXj%1$MP&#cOluS0#ues(`f>Uo6 z#}e+9E8n1Wg4X#So#2&Mz9+KiIgxs(sr=>JYcr$WVXzOOi4TA>JA@Yg&hb+x>_+qZo6 zRqJnj{F633W$UipKmQ9S1lKEO()EXQ<5x@zPO?OfW`cgR2B%0tixuYur&%z!kd71I zZ5Ui=Y3UaGUf|@3^%d3s>sFo$6ltLEQ=H@){rzT$6K%}j(pQDNMn}cIT5v`&83v^N z5B_e*t7bKB`euuh9E`d9`rc;cA&4qA9mgMAoESp>g#Nt|PAwqwfxk33nQ!oC`nA7{ z=+H?xmoEL7;N1L3TF0u@Uo>=^e`0VT4WHy2=*1jCNh_2YHGhI5L-S{7SB4jOBxmLC?Oki=LP{mP zDx}leF*2?R>4Xw0$@hAtlVU}GH-tE)Lmv)>H!3gNDta0s>*TAhx=rcSgRmCjsDQnS zGeeY}30!$Xa8fYpM@Cipmn%=JJW&JJlbT})nO9!Xg{d;5p!6FrP@Ks_G7L3xF77qE%}JU*{VatM~%F&#H!QZ zJG!tXEbaM}r4ti`{lP13y4J(&j6^f3+|8E>h4aDW4OkdwB#p&t3^h+|~0X#Qlh7#O&xi#&sKE`XGto>M}nZee60ZrPOb;wdt7;!pbC zvZWJlip*SM)!OF@PGZ`QX#W`DC5Bh2L^tUdUS)VCKj{yo3tZk*UXkVU?R}H-BGdkf zDSzMaTB}OIdwSoZbgHyCx%M&di0HIjQuTjq=*T0qO@IIUElwnvznBjd+Dyec?-jgNW*uzE0P0j~IDK5?yqTwDKo{Qv>5bgUe;3 z?26S_OCItUdT(Ffm4ZwBT^6@Q?hUM7`!m9;3k}^|Vt4J@>(ZKswqMysXW4V@b@yl< zWE+}=@EP%ZHSLt4BUNfr$K>TDl}EB`Zvz9>P@X5T9+#(Xw-C{3spY?Ojt*wAJQjbp z;8Z;|zdF{h7@XDE5WY}x>S&^z3`whBDL8ck?5=;ym;a975`S@=WY*jFrX(Hc-%H|< z^9O>{EhDUA|K1kT!4nqbT_Fx~K}*7W5;*bk_jx$eyZ840rNJ3C`+qA&2a?wKVZ{l7 zSWot*R<8Q2;Fy8YEz20qDd)O%-wNgFN>opF2Y(7S)X92~q?aQsQz;!nGxml-)YD%<`uSyxzkp0tMb^Mjo;IAwWG6MPH%Lhktc@MD+7tGJYyZ>Zyqe)NEKVAO zZfh}LJ}o%$TlIV6&vnIFSE0~Uz>4P@URp5O%FYe@NcUM@sz|2ZvOHS-2E~acx@4!N z4-EdH#f8dABYUUfL|b(ARLr6huAk@&7%P7jnY$;}B;$GWCwY zeoRrxOtwpxD$Zb}Kb2w+h96y&hG?dB%ho!a+DHGpLU78e=F&EDgW|L|#e2+OD#j}r z_w+o$@XDk7LD<)~LFvLmn7V(8ZX-_|#{E6R&>2o6 zbRe(tv?gUIo%6RfYv&aw{jFxKb^Khz>&hzi^n9h$d?|)#(%1iDLuU$a|9^?%w7T>^ zvDZsOc~OCvyv)$4IYR;Wg}h3qcI>;~@Ipe-Oul`u7o5>f(NgF)Sb4CDI6?LPfuX}L zS~_vx&Y z%j-(PLn_26srm1w5a$ubaF+J*NjmUPFgQ=zk|j?}&`INdvWF9;#X3(BoN~%M(~Ljc zEgfg{I-)R8t@s6xH&oH!Y_`~18uebG{LudL#9R&vleoN^PL%q_9 z$aQe}8byD&>kq|N1K%K8|h z_@;`+^M%Rz;;HQ9Bp)ychAzgVCN@>g&K6vnjhQ5)p5-zTlQ2`sISzfc=u$b7gqB21 zLNPyis+Oyk=IRvQ%8TI)S(Pti6e5Z+TAQ}T>1O}(lAtxaBuEoB zKm%w2!CB%!184z3mAC*ey|m=TmtW=?XuPFAXuYi`Xz&tU3rN46v;{(-_3oY^{ePeb z+CguSeh=~IfG5l>=?z+M>GkxA7sAGOCfLP z1&DtpUWSh67HO^blK*?i>r?Ral1-*h@I%KCP4do^at1a5ibW^fCp$Ep{#^0 zp#2PN`4f17^gAi<|L_cC{x2br`6(d~JiRw)0_k4p;Aw~*E+P+T04*T+MdCmMXi4}? zWIsf{&nCVGTT9*Z9Bd|k!J%`DJkz{X)xH8fUqjk!(di$t(N)C3r}3Q@WzMW4Pr?A3 zrvDUu#DA#g#)rXOkDfs5&D8N*@QD`B#DgX}{1f(k47OfDS`R+7vM)%j;u&1}4|)C) zI(>lriD#aLt*6OXa5umMq(z1Rbta4Yck9{|d?nG=LTm;7g6GNe2R6GEK{irq{wl z*plbp0tYmJ77$>=G|&LrS5lTgN4LMAY}hlimN>Rc^^=#hOZ+nP-^e1~27+_&E<uy87q1%9PXNIy(UUjboB!GuG~Wgdew7)9?yr#tG=Si1=)#M4&8_7B0n&LPtNA+0 zjBmEDL%+wOAJE3P+k_d~eL(vUPE)pZ`1zIKf#y}%;T`ziJF(f-;I9D>G_R#!<%P4% zdg6qw7P?;t?gQk%iL%i@wSGhz&u#F{>!E!N{5OC*haCxnA5eCo4X3Mb0 zH;EHAzD4=~bU<@}=Rux<%yQsiXe1mY5Bw*yf;1qrk`TzOA_Ow434!#tp`k6e>2p$Z z)En(6O`nu`CUrnvHGuXK@_Y`uXK52sHl8ytr_P>B_C?A zkHa?wsFxrG4oLqM{J#s|+o@aPshfy@2c9=zBcORJd4Oy1+>-cr(eF4m2N%2%8lVBR zfXvTh+c$v&8sDR?2~$slb{PNKOJDSO@*GG~o68~$;^GAez)ZfogPM#Y;Tlfhxk0lfuUe0fkf10oXG@)$~25*BFn&3(B@|+=T z5H_!X_HUr!xkcVBo`bhT%S(aj2chLT^L^@oumw+xu<=&f5owJXRO0)qDtg3CM(`Q(w7 zxfZz8oBM;*%lh#f;475ptK?aLhB^;k4SWOIKc=jNE#_7Yo--L}v-o<2w2z}Vkp6q> zNo14W;yL&eWIq{tpbexy0f1}5(;&>0vC%i72j3=4KhhUuQpAPt2k7xh@WdP6>J3s4 zW2^U4CZGYdNK1<^J%RE74W1icg_q|P{*tENGi$Ij_~w(B1sVLOMOg!M3*JZGHS!~D z04*TB0e%0J5NH4`Aow%lKm%w2!TX5=4WK3PDR}-I`NF#qJ%ARFqJK<-ZvZVI%?sWw zAk~k({(?A=`C@<2AZ!7Rml0kC4Pp8-$ofn2dO6QP184!keek@Iwn&&Jy+N2_KG5K~ zCG_;wX`mtDtD#LZ&d~=q>4Sr(V8uFw zpaHai;6ucL2GEiay<0#V+38j2jGWe$^jSQ&kd^*D7%3p!34ZO3rHO!9cTmT(@U8DmkJ_OPtY!J4A=1FLP;BL}^7LdA!bf68S zpAHQWJcD$g1*D!yI?x8v&mtWNPLU3@fK-Nbpbez6#2>`YAEC~HHjw&T;y_bE(wdU~ zcZ5LZql7@}V}zfC9!PzPP-q1Qw1LdWc?Q}*>hFmIO`r{=K0%0#3}I8Aft1LBHba;Z zdE}WAUC6Tyq$FR#1F26#12lm)kopX9pegV<;Pc?VNgDCgX9Ys=sH}fz!pbezHO&n+fDM^E-`4!TD z)K`fEO`t8$=+gw+0_c?@ujUtd2Abs8mOQ@!9nb{YK#HYu>@O`r{={)ITu1lkgQhY(187d+4e+Cb`i#DONz22$TA4m5!_ zka`4wFC)Nn6KD(WE5w16ObI{B+L;9+CVxF6lq_CK>=vd#(>lo`eq3~KpcDvNKL^9w1Fl(!8B<=3rLkn z1KJY8(-=T55DXHoAP%&EH1S|LAzaQ5Fp+X+zsG>2G9b68wp8o zi%qGM_VWS4^b3HkjNgP!!r+C#HpW%L3}K6~MVNXKuwBMUfUr&2CQRQ8?0}cBC3&2o z4rj>YL%>VmxfMFXhJ@gn&<4K>&trK$jb6|5q;HmHsHVK25 zA{YJJ6@V~3i*7tO&^Pl}l#j4Qm_~NMbNa)?d2T`%lnIFke+{IdC!Ue#pCfPNropwq zwRp~eYaloEGW3yW!qm^B6Jdie{c@fOn}q4x0Bn`PRt=E>r00-(6ZsLQ34^nw1C1)_ zS^Q+w1FmcK^>Vu3rNkw2eg57nsgu- zh977F=>=%^!21Ze9}ohWAA*07e1YIg$OeKh69O#mnae`+Wag1TW&`tk!F>hz2zdgj zza>wgEuqK;(tk((BjgWcplK4%ASc+1-1E@=40$~sJo*IZfRBPLlZFznkA-qk(;8%!$l4l_J6f~oh3rO$7hCnce9f1~*+E4j`40OShkWH9@zXhb8 z4=>OLQlCa9>FF0B7YJSm9ncnj(i*}`JoO@;fi}1{VGDfvGw|FC4>k;*%ro(fJY$FS z0dxY=zljdSQ`o2hG_h0g>(Bu$pz%FuUkzZhl$3`$OT7d7=$1Hl(b2ipG#4PlC~0i^CA|1U%L zPtXCum!Jb$Km&YR(%Pf}!B4VrB2o7N%pd|oZ>M*tf+CcgU z@J-|h@SJ)T^2Xu$7BUH2|4hhpOMrOlVdMjCApLE41gOi@oyY{*K>8^80s*|i1bGYa z+#*aJgAQl|>EqA=4f1SDzIVa%N@)ItJb*Tk{*IJQ^alSbp@kPnzZza3BRuyL0xcl* zThIVa_}YZ&*O2~Qbd>P5&;czV^*ZQ)Hjw^paL8#A2Cs((NSz=ZX#bEj;%%N&zXJ|v z1L-F8K=8ZJBR_qTIMCubxEmbM0#f*K>K^!jCjK1UPkDeAkoqmk3ABOqYtZr8JkxKa z2?P3rV1wvQ_*(GDNfXcT+yWXrr@v1+ka`_B;=v=}d2Rz4o`a3x2~$4+mm&Ww`c9%7 z&;ruLQ#o`4+CWg?`8hlT>E}WZFd1Z?M*K8!Aae#B&;n93&;zL{LZA(#i_ihVG_*hq zNWq^G*@P{^HazKB=zyS18qfk#74UOBp9K$OfK(Me@NJ+;T7!5SNY{u1K^>ZT@IdAq zyg=$aai9&PFMx-pN!a*B=r2M8qoIQaB`kyh;IY>hhc{&vs(lE&8BFqJX! z@rDT-&oW`AXu|c+HeuS*wWdt`9hN_1@oCG~K4tkXm@xGW6E;GAo8BlJ`~x;@-DBb{ zOV_kv+va!wMU$S+nJ|;J^sh2uVChrOH1VdD_kh(S_(g+HTfY6zG4Zyg%UHP$8;;v@ zxATUsWy6dO(>83{uwlctdC*f6m5e1FC8H*GvKY4f*X+saGXcr&!W4Kr4sl-2LS z-!%MlHs1%Wp1W=QWXYs&v0=-~P1*b#R_>hDYrhSDZ2cu=;~UN!IX^yU!Ut`5zYV8t zc+%1h*!TkrhW;TNp10wC8}7Dr@0~Yv_uBAb8?Lu>8*Kc?bwhW*4Ii}OZW~V9aKMHq zLpe3W_kax_vf+Lkp10w9tA_4j8*Z@SNgF0`qc*C4BMS;PfZ)9teqRy z?(K%5f7$a)_>c`#zhdRvF#UWJU;hFVK4QarEq?Bo4gS40%-HmISpH8~y8CT@8!TO5 z^V@I3X-ofr<=_26BlkfYrk-x%&727vw*3S)K4AUs!Cx}z1GatKYvcD?zerj7hpk^d zVEytFHr#L9*PIRSx8aX%ddkKdp+8$W56)Qq3MOpZ_R+NX^EOP``pMXE+~V7ouVurg z$_p=d%x`u+cqB9{;Xx= z85=fjm=5u0j9w4f@EtbXZNsLOv)0BRw)J}6=9iu{{DG~Hlnv8iJ=uP|ZNrw8*A7EF zPVKgSnX%<FrsZy@R z(@N!h;ryNp^#n`4!p|(#6Qs3?LIOpurF@*~e6diUT!`a9jUCY+F`AKI$_wPa;8TYR zXZblNPkpW^qF^N~QJ9h~?g<8iM9(_iSQvBsBRJ6WijfR>I=P&0QT)TZ#wdLp@ zU3Dq>qp7cm@X^^(>Ejh}nHn=WT)t+N?$QP;S4Jvx7sOtT$?wzd4p~CPRwu+^wsjDN_73ZT`W9jPP;fFE z^)y3M+qVhc@ACZM$Ox>PT@+Z7+i{zbZME&AGvIs9fT8 z1S%m$DvdUV$VQ`$^QA3L+t9mW#V<%Rj2lT&+qZS_(X)jH3Pn*Ihr>9^86kGC8!BEy@&g|xJL$i!RjzS^{HTf~)7==a?G__JOo70(psH?*yD09V% zbRjN7;sk^QX$yrzmHhk+<5nnCh|5^07_~Z3Bhv+J$4`J4_GGL4@^&Pp zR30x>Yo!`LsEZ?EVqa1RTc@TK0Q1sIa2~=*TQcISzcn~j<2ICDK8#Wc^@k*WZ(!V&7 z;0<+QcCH@PzC+JdqV^eg#f)(X4Xd#;{5&x~pzZ|KSk2|?<;jFe z3^FD_r%{ng8#b{AFkY=p@mt3mhrAIg8r0qD{6MrQbs3kl@@w|I;TO4ZLg3*_d91Q{ z^5}WSXqP;8gs5VLw$G1&y8`okN8!S#&dVcXOCuhxG5kpn zJX)<*Sgsy5`zsoA>>D<9BaPD(gx^dmy9@CNy09`LR@tb!tb{n-Wd#YjE63bSwqy$0 zT}3ZFE_jj^NWP}H?wmeBoHaW)NAH6BQ!=LrztW-;!HJbQU>AjD$#aJqq3;asC z)4%FH`Xv6;vUJ{&+nly<>&VNd?Apu}Ru~SrE|bV@Mpw#XCe~I}$gtpXv3f zP8-D1+p@J8H9M=PXzS}KdJmOqqvz);)w(y-i-rujo^W-7e5EcDMx9_Ed%$6HmGZ)| zcue01kE6U*f--pZsBy3AHO^dKR?T6V3{K`XG1P%=ksi#R>1VoPqE5{ajdrksiHMl5 zRhi`q9GQ{(E@e5 zP#8AdgwvMna#V>lNxnlMY%a+tSBzR*)@)SIItrTip%LMBn5x-yjz~hOv877Bv~W~9 zYp*c*LViA1XP~1m8L1ZXUQ43;$<0&`S7gu5E+uNZ4D{L`A2UFWd~rToMUqpeTsT*m zJk7+($FPpb`u(_0jns}F)%p5Fc6M$iDw*sx6wc4Zw;SyKL)38y)l8)rdDzrUCCi@V zq(5VybL*CPt_gf%zK}?bCLbF%;e}>PGd96v%_`qe$X3;jNQy0znEvYyrI=`;P({yk zuJ{`^O={Yr3Cx(gq#1#wa;{olG&M&LP%j)w<|wNZvOHB2r*nE(tc#0OIXc?M3bIml z=*fAOUG<6S(o|H>!n#NC!?EhFir>x8)#MB=>>0^8o09{$$fic*p=>Q$uZIS!F$7G& zK34TCR#?d9<|$a@diBa&Y;TB$mSsgDW1HX)m5S5#ahWJMH9QIiKiz~nQ-~b3OEQfu zYH6+%k@Gp!9WE0=(a4IC%ZBADQXYT2s8=e7nDB&EWsDh3Oc(?cDwwx=B8XsVqeu(v(OEvo0M9)Demi4+*QfO~951Suq zMS45(ZAo%T(JDA+jO+M$_$nupBApW{o??DVOfx?rrkbB1Z9UJ}7297@m&?^-etKWHz7N z!;|^>k@(PRw!u2JVFZqgb9yolDCG-#E{xKTNtfz)WdPQ+(QxQTCg%+#!*D z(TQ_~Ie(;z^3w|$G)tFfBzKNod-jW|eAweH(+O9-Cvc(|f0#Awa=9p(yV-14p|tt} zhcK7oK3=YMXdh-EWxG^5t7usZEUKV%p)PM0d)4}gY?#k7SVnDxZI~|DVorus8HI-z zvZWbWKsrgxa>J!#e7BWJsuSg?B{yl5EaF9^Hy(Gaw?G^(&)4E497IKPJiE|x!X+L% zmIexb1s9E0PQPSITuu!R+e_c~! zE*&vd=A%~VXRRGVG)eAAih3-6g&muv`U%=2IK7JT)qIi08}rr>kx(Lrjueo?c{T*~ z^esCh{$HrdMxx7ZY$SR#OJEl-)wI#?t(5(?66+31wODE~Cl>*Z#HX)(9FTUBIIJw@ zj#W#=Vxc<3W{K0L%Zb8qh7&nT^)LJl6?2?_RUI4WyR&v{!6`38M`3KFgU;?RbkH3; zktD4%qA-__%FfKEC{3Ozg7mabgw>{_LWDM9o)DFwm06Y4&Bmd42V{D!V}fpiROBU=@BP}8;96TaJ^3#Yai$|_Tp5r%V|Tiazu3MFl(%l z3%OYDsws-x&vL53@q?`JxlH4otjkvU-codwp_}6!J|pJytf5wnd_Almtw`hQ(Xb%< zY^arurokb(p>(w=dmfyd(M%RlkX^Kxr}=5*Gdnj#|KfOM&)}fPtrTHu7ej{59k*m$ zv4pD>XDX9)i)T5!pUl>C(Nz|F=uSC1HT$1?*xB^w3E^2~Y!++WE7VU~Rbu84YwMib z#Ev-`=L>T>8{IgRw5*Iqb*U{Z;H}q{Y>rzMQN2vf)(=k%*A7iMHKZ|&j32jlQ~|aY z#zu~@vajLuv7PoVZK(56vpPU z+C(`!SDUUx<4q(_=ZDVC68MBHSsfK?G>G}g{b$L&ie64ch)D2;==i;n5G%XxW7JO0 zn+IdZ=+=VY6_8*%iuhm?3X|z~q+l^;?1=>Lf=t&+QdjYYqb`oI&unHVhI2b?9l{nS zGm7Gk?j6ao@hzrc!fLTJf1o%)M@@-LZc$+)({M{etmmqwm>YN6IiyF<>R7s5msHH{ zlNIxxV&W*mWAS`m*77)p$Iskrnte^_KXYd$vQyD)gYjH(u#i}%zt;~rCpSovM09q^ z?G`J^Y{KXzxufyJ*BF6GTdxB4R=Eb?;^MJpipAJ4#yWx>QcEMW5#4%{0u^znLREG$!pysLFAS?4Z@HMUzl%WT#1*CqGF=NrE<&q2 z4T(u@7bV3X#wy-zaH+eFqVOH`QnaY(QV7>a#%G0Hg~?{eiQfk3Dv=|A&{0L-%exp?1Y~J_X|GOhwJrqe>>rK8I(SWU|~7xkR$LGos5C z^;Vg|Ms=ttNvsA+Qo|AB6rJkkoTc}%=XuGJu~2fVO%_AV9csfS84|RmFj25pxpZp0 z6%XlxegaOGaNY%?u7Y_L%gLV0%EWVGes*X!8(lSvvE}4Ozc*58{6PNv&`dPti*V7t zU1TsF>yoQjW!d9z0GTr}y(Q=L^Kgk0i;klEUZzXtI+_$;{BDHf>DVQssE=c>X6PVI zjcN2fg=(ed9aVOyD}ATaW5XtM375NOtST3MBQYsIx&&w}B=0LNE>lOOL$O&^B3Gq2 z&MN_4OHj$OS*&JWT>40Cd#0nfF_{%p%pvao*N$=Fd2y*mXY`5r|6C~=n9a>4C!tj1 zUa%KCoQ>v%OwMGo61gXp9FwHY)GE;JA0j+)2QVs7n*jxh5uIyu_ESUYKBS zD>r@2zkkIXP&zhKK3UdvIUMqLas17}p(tUfHa8QSBSlFYhdPG4*q#yd6K4$EmF*Vg zJr!L#!Eg0tjtSXKqHmFa+f9y(&M2`drSXHZ!-AJHnNPe92=WNPAyN}QGLP*#Mz z+bo-`E(0l!o=3T9JlE-m^>ukiBP$Ee`wv$ptS&Ca6)Y5ki^TdoN1%OK*M)>5(U%H! zknrV;d%q!?_S}US?4IQ2Y;5(}g(qLC&GF_*mz2rujNA_L zQqG|gZ@(~N$@ym)XHVRuiW9_B>0!Df5~idOaXJvOw{~cI$cmxpiSu;LPSx;GnpzYy zqI1-;aT{?Bvq@Dq8#0bDmYBRLCQdO?nJt`%$%|nVWihwPr5U&!O8N@-5oz!KG9Qv7 zQ!>qVgs5VA(Zn(}I#6|~ueDT^6Z(igL7$g9IpG{nVnUBqxwn2zqmYYApG zF1e=Z(}PH3Arw6X)}Wv=fgXaeYVL0y7s9U7p4m zI>nNddO4$kavC2XDo=<${9<9lk-g^ER;r)4^ zeh^3n9IM#XNirAztwK5%&zhoBqJjET|Kz)F9;cehWfT`0pHvvNje*6NV@#3lB`I1^ zc2wFWxcpjS0beW_FY+fQk?H2+Z>4ZtcV=A60#hsxSGTO`4)`w)#mY+Jn15}mTcR2` zS{I9}s{;?kF1d$x&zHObeo=ATJzc}OwK@SO2%Y-a@uFLu`AN}2O#FfxQ#E62WbpvY z62G$;(^NA$R#8GvQQs3pP<;6<7~>^+G?2(PaugLlehGFOs-EK|B!trSl>AZz@OO4F zAvcM!5`}n`x;PslW1Lpyut zIey%Ed1~FVI9xfgC(HnWp&n%Ju!XaF;oHT{6&yWybU3CYaxo`%{RS6NB5wigv3AaB z3bW?$Pld$a5Hft@m0DdFRhP_Gmeh{GFdovX>55GB`c^@|d)8LS=oB3Z4JnHEYk2P} z%Bse$TNm1*+@bfk8knC{c)N!iRRu8_6CGW)hL@INH_$Fat2O9~bs6GC&M}xJ8?%ok zwDSC7Q5u(bzS3RDWeF1Y7b8X&HsgyXjV0*ycqR7j9mT}!J3@8ij*Z1iDwuAR-YbT3 z1xuzl@&3RY((J8rSAI62LUQI`iJ79GB>mgOd@g$3$|cIB896(MX036d!Z}PPW3&Ld zSeAG}-^n3=o}FglfXg>AVuy+{$Db&4eviU*KC)UMbz)B3xKff6rg;BDXL1S3j=rZ$ zcV)%u*Bk9O1^wRYvK)z)WVF%cl2f=t4YZER9Xo?F>@3;y$2jG%bBx$lCac{jEwP&! zPm`Fle`u$KXs%v567jZJvP%h>6DQp!5zAbE#^NG767Oi7W z;+WM>a!OjHZsrxL(U~9fAhg+AsNom-Ep)MMe;GA%G)wPTBz{@Qb#im7NUK3XU9+}1JTHzxh zNj>y?LrLTwa*pPCmfI2eMrJOj7nS`AnqueneEbsx<~tj*|DzYZ4)cj4Cr-%|A2IN7 zi2;`_U$%jAy4UYSFrBW{1nn@qAuRFOTeY)`FeP%J4tPB(>ST#5@ZkjiWKu}x&qvqA zQ7U{RCH5L1y=2L$Bu<$3jD1)x>^|04Yox@|9UxS2*k}o7geN*;ot#NOIIX%aO1z z)=<>q`^*<=6WzXw#%A21NEWZxO-n=JI<%dUMy-(6%!MeEK4HApF){@x<@9Q5s3Y`|$CFt7(Altj>@w_MEV)ZqgeB+gvBy|Q=*|+YhkW`y z-HEp^s*|QH#>l=e25_S#e{res!)x!Acu)h zwrOgb;^fJscoB?d)k!!N)s-?<3-$SGgp)%X?w;07c^rE;9AiJ1HIC4&?G^p?(?gD- zTVkTAFHSNPd9J*W6}u;jqb-u9G!{O+it=Uw?sU;|$_J7rSjRZ5yqe^HK!FZ`&L&#v z%P^Ibs&X9lX@B!dV~HY7(RV~0zs3?2R%SH%DN$ThZcCmm4L z)Twv;o;McoFmzz@jUrd#Vx@B_$0gRd3fzvLpUIDNZz0PjV7F9<`s^JmXL~ zKjyN);pC(->iF{9G)>-=XAa1F2@zAacA=c3M-$Gd|B|kGXs44*=0YYHsC8-K5-5S? zjdGQGspdHVACEbO`aN^=Xgn@tDSV+Z~xOBbC!TU+Ib#M)li7mF{wkQx$Fj7nv*1a8JZx?dN+AOzoMkMGecmdgu{J z|KKNUJkd_Z0{r|L`2GiVbGP2EOrpmx9FUpxWy@`euXDZ zcvpl(rX$tH8MzH~31YL^$atvFI@c?888>c%hO?jj;FN%?}WjR3~5*~SaQ?~HiE-`X! zBAZiA_hNRy57lg%zeg(9NvGwKhF1_&b;v{>I+$FN!MjQvBaY!C`SRW33Euy3 zy2h9~QtgsRs>>?{3nSa7=_<#`(h-c8fsdVty*f0jc|^_6#G{FaiO+fj@)D4fI?Jbj zqUzwo$1&%zO>NwfGi!0<(7vcnXtOMn9F>VCtSy)9BNFpkEa&3US5c!SsA;+EupBV& zLJWHwicB4qD-y-cp~Ho9qarFA2lLg+TtqTU`;wlDKFBF4U3V=1p?ULpyK?1J(NR@u z7fOYh{HYic9U|EhiOg+kobg=VcT5ZyauulyI{f}>?6p>L+b9q2gO$p(>qsxn$0MK< zb2?K=XJtka^-uOn)0`twXQEy5CUeKPB)Zf?e6!Tw0PI3+D{YYz0bW2dpRktK*W~iI z(@9qEk%nRbts>89w9rXpF&DR0;d~)SKjXy8#`RJAI*3C`UL-{Jq`#IAgV2HU>5jOq zyBAU3=l6ffMYpZwewfRH4Mg*`0*BeKsj5r!BYd8Z4Q(w>N8)IC9#s;TC=H)U%E#}8 z`bk{Ai@#VrC*P;xd!*iuu#P1d=041&V7C0c`3^0TeTRg#*(8)t6&Bfbi#%F~V!o5^1S(=wU-9wAEV)Q%%HRm) zbq3SdoQn2!1nI37q_2oP0i6!{Cjs(m*;ot_&eQxoL+_P#m$#+!a*BVT(MvF$du4)Z zh|0sv&nyi(3GLwLva*D+uDw_>U02jgFsq=qk2))x>!^2S#*l1rg1go<(=!>8)%;Yx zx2lLuVo+Y@>vlWRiHxHYqlC|K3Qqrfw6U~ePNo)4sGp{L){CcTj?wJ4gYyy^spM11 z3!-7=U8u?8Jjxhb+p;G`Mkz8I?8YJZOLLu~RhuJ;$YZ2>ZI&XyBe{&Mxe{%>n;wxT zaJ?aFB>Dl#$cB=Z$bn%owi9II-Kip%6bBmSqOgqB(fqeKmAIqqeI>$aU7Yd9xzOWCm}n->ip^+2 zf9GfnMz7sCobu(Vp=u?XVR-%Dv_IPT#EH5W_h1O{FXPyj#9LC57}bAb;M9S`>BGz1 z?%B48Xc}>j6Qn3+SHKa1LqhR$elrM7?t8tt@Tp_qcGF=clpK`h7D+l~VJbs3|?~(Tjqzc0CwK{Sy zosmn=+svJk1chl<@ox9Fd>+a$I^EG%+82&96&F$IjXNE0L`{s`x&f zm%w4irHbLcKh!}KsmnmE>ehJSM&C@^H#)R4K`{G2YYT&eN%>V+fa z(c!V-1BV^9Xm(K!^Gg}g-bk0(^Z#l!u{iNi?0~IUNkq*aV7U_el&INPIW=GQj*#Tz zT^+rtb^)$rb=E1IfVemlNWLZ~TSjcuyIQ?$Q72>p8kzD%>v z`%X3~b{L4H*r~G1N%^z#MV*a9`USwQDV;y`BdQp#YDE@B2MgZExP74}`KWyU+KHAO z=xQO>JQ>AhZ&ZGrDB3?qjzcd-KG~f-*BzZ-1RWha`+3&7qrJ8$)!yrz}v z2a07nH*dxyFG5eqIoyopaQ!4#@{4nF_oPzW%p(+nAvneVF(LU162{FU*y(mI%TJwo z2WKw9FCRHX>-~6wXA!bx;>9^#)Qy4KSKym;QP-tEu4L!li{zE_XY_WXamxowg9mqSddqxJ_h3JvP(y zlBZ%HbM+FC$^;{tof3~9n`(?Nf3SZWQH4mSoFd}qhWS!KG%|&8giH}@1=d^SgR?kv zS)2q!!bYVc6Okk34lI;r1;wBc4WON3$z|$XKJFRuodtVk4nn63&zQttLFtCNQ7~!% z9x|?~4KhI66>9bpb~TF7}&grV^Oh>E(O>;)~n{Rb*`5X9jC!VcM)iK;ALR@CzYM_A0sE90E;CN{`%aUqV~uvQT{ z`2chByVlYoYyv%#_l|PJaw@*g)r7bzii-WRiDF_Zm}YCws-r45X#L8UD_M**fz`_% z5xewvhP)Fc&#`c4c&$>e)6gvj#g|WpM9ISB!2i*F0(kv>}krS z3^^M1?&Nq_M_JRa!NsMC=_a(dBHt)i*Yl<<+?$fi zH44FWWXid7ry6<@BX;uwHH1ChUu3!Q=6I?7aL2wm!Np;Q#F1jfq&jkQ$REFEx!5lF7$10`t4;7m7X5^iy7>)gIWGD!$ zR_h1J!xdL*K!n5)Q91p|a)dRd=OtRlHJ4+G<^5o)jqAndJG|fik*s3Zx^f*DLCl?D z8d8t$JA_0sqY&fySvv{c5`|ITpmK@|LW~?$t6*yKGcMj;TfrU5o}U=s8$-|O{l8>M z#aGm@E)$O~%Ev=SeFht1k%?u=Y;FxYNz6oK<06`R<@s=S5`~Tl8YxW-cUvmt<(>^M4o6F08F=+0$I)iWkbF<=nCKBTFEeJTcpsS` z)`6>#Pmt5G#8m-tq-=ybeRa&Irud*pl3$o7V)eKs zj%KTsZ#>1OWJ<0V`QxODIw;pIqU9lX`6WvuC4SK*O5#MGUf&7x6B4c-Wo`0F?0;!8 z7tj;GW~XQ!_`OS1iX1j4YpBPKV5fj=l(AQLhA%Z76Yb;g?D#=)V461 zyWOdZZ?Y?opDewtQ^jZ3n*^}|uY(uS36uB&Z2nC3G{0mf!{)87_*B^PYuX+$4Bim0 zM^!?63ZdQy7Cf}~3Y=oO-6Y>G>Ovo;Fl0OJe3saiD3eezZ@whRE8T?izJRwBwCwWB znw?nA^kP3fVTnPj5#qVY+hegWUDm`B<0D+FIwt<(sEZsz3nKQeX@MW{|AL9bBz9Qi_-OEmA}osgjYhDsW>&2hci2NHuICw*8dHpzqpAK%v2sjhpk+A*rNsJvs{?Z^Pw zHBqcZ!o-Ey$x7n4Zk!{Gk3_?+``O^cEZ^ai(=fKhDl-d(swfM`^mV0z|vXJ+GwpAD6^ZE@2V`G1trX!JMdF&dzY#3W+S#T}JD`^SV zJh$L*Y=42`{;=xjV~c- zyEE}6h@x$ZV(w_{7gQ43boqstsQmWZ>(P$}DRZP{_w-1??&&+c7qS+ia78rfGOsXt zcd$lDi}CpC=(HnY0h*Z1CH7Y;XKI&C^77Y%XPFVmF5 z=JycNak7`Cdxx8C0$-9XD7*Hm95-T+GO} zq+BY9s0C*(KgV(U>%?&sIdQu#!Yx`=6xXjQ@j&;Rv|Z~WMiJ(qNbl6bW*pM$uhVwo zSVYJVQaU}&n?oE;ncpgB)ub*fx2$Bpfh(Iu`Se6}oTCl7vQwU)GXw?wNRU%kzLMaW zBr+jCY+pSf=3JaeUOBx)@`(ED;_TX?UxHuX?OB|CqEPSnIs#n|%A4;)h?}ygxkLuX z?N=(KTNpBLo9d$uz?>&Li%b?+WEEmdHUFZo>$$uevzVDd)U)aym7&Lk$)w>as_4=w z2g)PUC0;~Q{lePioHsY_eS18NcM!4qOpqCj5QhC>Qs`o75vMZ`*Jk9NUtBp(+YK&m z27MDPG{6{NPLQv{$w`c7ZoPXI(x}y)7uZ{2a*h6Y>^C+#I{pot;+MU&zYlAw3-$5% z_sQbqIt~uuao#$}Yn?hXca1W+HnD`sl|}+>*BP#)wxiI|AtCWnG{@+UbiHE5GqN5v zkAjVP#zb`0$w`cL1Rg<>(O!C5OrXA-w^-uQ6PkSVGUP5p~Ix&#zp(g1KM-d3o~eMXJtECofKZNwf3}HR`9I(`=pm_}8DG{gg_3 z@$9cJp8uGN`{nsBzr6f0llSuHpMO5dt^E9_pI*GkZT<7JAHkoBeD?gs$ukH@g`T|p z<;C-#UgXw){_>ZffBb7v20uUl`NgweOi6G6mTOX>Y$W0ncJwhRf2B7S0}56C=6=o6 z4j?x0@G)bMi0~yHL3)lDSI>6~`@kXkBs&*E53^0a9p0G7L9A`qd7e(+hlDj0O5Bpu zJ6!?I-ju6DhTujH#OK+?`v8op<-lkE86>2L*L{dreTeCKkEoBaY|}J8#*?9;`}-}{ z!T`Hu#_T?m z`DtAf6Z6MNF%f@mvB!m{&Evr=0@A}@^G8f>F4o-6a2{G*w)3N^?{REM6ElkZ6Ast@ zTd+6lpg;2Hwm1TgE_w2iU87#x0Avz*>@Mz$$qs8=N8%!HkVPLN))~F+9gsKzv|B`4 zIcpe@^2M$qKtPTQGvRZ0{~04s{Dil#{ip7fWI%Kn;?{V3@nic>KWo-W-~=Np!nnl! zA@2;CjPZOfHA;e$ZFm0!SXUH7y6msGvR@!TiW8234xiX`Fh_*Y*MTX8fk?ZT$c8YA zvbNxKcgZC%4D0W4TG8wRd8!oph%*f4VL>cCVKG0Xgt9h=PoT+ci8Ds_s1J>6j^nt? z`$2##1pgC7H@m}TDqj#5w{Erm8c6W&pWEbRP*C+BUB>i+1NQ3?%%XyvZ?|g(J;65J zlL_LVm@5ZI#|iSI3arwcVp$E(L3ug+G`fkHjAV?Mo)i&{V6hVZQe%tjVZX*rsN1fG zKSA~gSnOukviHm>ki?DsKknjv$|pDPA%NL$1lt&&PMmyC9T(CAX%<2+uOzku zi@gPoa->eI2P7m$i;x@%(Uzs6nlL#D7Rg)ui_KwDHpDb{jbUV55MLxk&|ja6kt|@5~}CL#1|?!t{1y6 zxJ-lwR-oi8Uj$2ZUvGvC=fPLd6K^QvO%ix~+L#Kl|CFIK%JsY<#!rdTXF^K2f4-zh zL*9HU=}kK-ktifwkf%#o;!s^t@DUEza(}b?%YXmHD=$xL|L^d*`U{p6o}c{Xe36_({B^dK|UE3^C_96BXiwHz~U8zLqLscdG@x!zP&e`=QePl_)&9()CnH7a# zAHs`RsYb9LPhbQV3$!b5N5`+QbnC)Z*ATi+RmET*Lsmij3ZIviZe(O6=NcqOqOzn? z9j2C`N0li$%$Ou$s`?y5+!51v1*A`v@!hEo%D@qacVDUNlgU4Ley*B; zY`tNUxM*qD;OG6n3F5!?hz}Y_Sl_A!&N#By`q#RWSc{l_KQ)^>ZZwwV<{4Vzpx|GI zNq!zCc{xn-(=bW9l87Ci*QLmD8UE8ibK3Wtgivh|$w8m0(Ig3;`sv5QGr4LK_%lLP z5v+=SdQl~aRYpghHWBsZUO}7cMuGzl5aCt?*0AQc?-3GkjbNBJ2xkt7+}lRJ@K0iJY75THD}{ zj_Jc_&asbIO&|#2C5kr1JG(8MrsK>8^S)&yya7QV>sL97`hX`#do+sq!ZS8~L{3se zjH5Vb?Ab?b{SH-SOaV9v!xhV`^+2jRB$KpG$j1cQX{PPsaa3E|p|bQga_O<+nbo>p z7~e2$T7HjNtCpit9zWONNwZu zo9OaEv5bzFHXQCZfw88u>*h6tLnR@qP5QeK5rw7O zs={CB!k*I=>vxVcfmOS!RifT5LeZPGC{b4>l)R(rX^bjqiXGKzh7>)MhT7LimFB#= zz=fTv5bJ3@8zwo4PHrP!-653u`G*J#fkd52qE*>4na`mhhGp(aOXXC zWD|rl?IfJ`P^qb;xjIT&a^eI5sruPbm^c}jnK1$Sp0Bfq*{25}4!FGB@?nLL%1)*n zBB;*A(t{s~Fb#K;Cdum(nA9u6TTT&$>rMz6=gW^a zeq3~NQr{WTmp2BN9r6*33wYEJ9b#sCvT4a)G5h}XM}RH?nlh4@Pg;rhauvWLKH%EO zlgaC~C)95oWirebCR2-(8ns}ac?{3rJ(*m>1#ucE0Oy}l0Cp2%QfTP&Z^#YK`z2iA zs1>UkolPs6LbRnjN34Ltr zYdn+b)Q*l#GIGhzX==c7=#$`5Ql%$Fd|zzuhEY(&xg4fYFU|IVDaAxOm=rdGi#1Q$ z=($^_N+lqWv%_a_SMV7$7~+S;dLri~bg1Sh_6l!Lcki%c2#;nx;ikH~7>Y0V%A4{K zodBW`hIyR0KEY5?Ht*h$bG6>c$=&V59pE(}QE7X%ZlQ#R9@QG%^5Y&?x|QomRIUb( zI!c*3CxYkIL-9i5y9L6==__tr{bLd?r)Z@n69z1)XQTp)Dbhi4nSN5qnn+d&hK|W) zK+WjYx+cWqYQj8D^Uy0)$gHo5`vBaZ&{hy!z{PGoo1EjH=t2tU6aPi$pa*hUe{dK# zd}AysKf~yuJa1NC7TYxs`X=8Q70yb3K3(0uLFn{&Y*`sf6g%69Bab{J=Yd$Oy;@7~ zq6Bg-XK*|SQgICP{55Z(HYI(tA2D` z!6GEa`gcsu--=ZNt*1PH6+lxuSW#M}$O=?$*g5QboF`!1U$4SS)pKAD{dfdmb^Dre zZUW8nQLgh~7U4lwq-5=MCtDR-6`at3fIyjF1orK2mP@1&r6gi81oER}p0m}r{ys5U zr&mJ}UuJNkDsW}Ez}ev%Ljqs$cGG_Io~s8OfHfZr#PHs{p4~90>K6B}IT`i1w|Zv= z?;CjtTi_nYfXsLHiQ60r+J3&hdB8Te5yy5!*Hl%3aGcIDUs(m`$TO9fStdMjFaEf4 z8q8Eq7WClo!~$-@gd_|bZ+_#zRv&UZe~n<3HAZTpO4YEcO%(%O`ms2}zd4)jahJ-Q zgSx&5Uq{Dm7}x~C{g?R;FEe!RvxnkklY;fCN$?J>dpY|qZ#eWPCv zUtfrLUVVe8i@@+^yIrl_$t5pDVOVEK0atilWWAlqWLLFNLbh41+Ing&(MeXY9;#a# zp7s?cPk|BouCP`azF~{aoO_DK7S2BF%?^%SphQ&XFL(5dyj+@$0I3;O=*t8Oo0Oyu z7%7{jmb zUWex?jSM{{8LcM|?|wD}-SZfSz@ky!VxgPC<6`@Uk_e5&ILlrDug92Hi+Hd`u}!MW zM-=2EqH_f1>3q)VyV{a9O2S!r0Q!Y2vFXEJ!Wadf=|-Zpc@9=M+eKa5HhYt`**oUd zD05%9Xn?SXLkkWGb`=mv%qR?|qAPHMl4A1h-iT%^3!lW>7EJTl@5e`3Ra4u^1jkze zz3)_Q8ie(H$EJ%ocfZk#%n1Q^pbIu!d#0^(<>m*9FzUqVRZb!vQJ8$?*tCPem?^#i z#s@up=*bNt?V*p3rI+_-MI*ffn_(i5mLo+(WrKyTHK_A|=~&@`Pk+a# zt7i;$Du_k*dU3zl$-y;GiZz7U%@h$oF!&156440I0n2Yp(Qt=Ne)8Xrj-`swB! z1}ILpeBUy)jy{Qec8p|=tNb{Ogp!|J@gFy#kAPnhph?f!5k0%^Fg9Q*ED}&W9{vvc z>U;nXX7M%fNX7*o9_Tb6H@k{7r;?`vtXZ|-_o#~xiLQ5#;&g~CDET}3+1r^rPVPPu z`akw-^zuTE)n0}_k;d+uk|5BDVIxk7y3YvCEl|8=)?pRaF$=3AU`$`Im~%#%j*VyK zttoj>WA$ z+FHSyv*-FDdNYCl;%RZHR=At)_=C2^Elrd%39sVj&ZIak~^uQ0ZB_^(%3GXP{K9y>DTr3 z8=RWM3t$NYz^_s09&F|Refr@dB@WUf$}(IrW?v#bFhrCvoOiFMuGfuafhQQ;D8xZw zimPbzH=DJ01cWcGNdhvph%e>1ew}C{1*siJBQg^ET!qU`zkc}m z;lq^@FdE}pihGJ4&$~%9)muhxmTX1CdALoIQ#&T%x|mQ6bDB8o5~1RGNC|2p;sH3n z!8j-dI1yVohR9K=0aQ5L9%J1M z4>RL-0O3&pyoQrXEt3v|wdXS~iU(Q$-ow(#M}$^;?C3^#!gK3-1YqL-J(-v;H;@>I z$-_*Iw4mtGdT3)1a;P{+WIS;&2ngc~1sEqksl{UjP2pw?@Z8p!3NSOn3o!3OctASD zcxdnp0szBzs)P>c@ULp%FwR^4IIMeU;#PWKbWAOzsB3oUxx#qxWI~8_N^r=DHsw?x zPIa*gpp(cP?EN$x=I}1q(QyPCN6&&w4>QH)PG*XwN9?>ui-_f3K_-PC^-G*qD=f`? zWXKCX87;$v*`K16zWCoVlPo}3O2LyNVL41X&kB7CS0?z4bjF_UcXz)`)G_iM!j_^W|*E`+}WeV+2U^W|ZiAbo>o(LO(!j_mYc1 zvA=?u^yT8q+Um&XI%g}q3xSohRf#Yut+zP-aAE*k1X{$(njCyJ;KYhr4ZH#M%iB)B zoY~xmw^;V6Zi!?=jGEa=sS^_^$mCf8X?874e`_Z7x6PkIuwcx)ETRWC_ukL>9=3ex zGnEd56U6Q`FzN$ly1s(rKsPt2N}#W}mee-w1P=C6My%%8l!z@fNil=RL=!}sZi+HV zrwE>_UaX(qbrVh|@OnvDu+E@x>Uf%*44n>c!YfL8)i4GsEXWV+K7Zn$hOFS_AD3^!)7)5`$&dxBF)L|k zX8k2$zQ2n%)h3sW-GoPlaf0N>cn+?Hb-no_m+-3|h%4al*7x^3dzjP9p|S$X9jHj_ zcDbHn%>0HEM{c7#FePZp>*bZL-(Dn>J z(-xhG>?N*i&`%!D<)q3aXNa?uS$uEhq(sW21uL(No14Y1@a}Hi?TsoPdpB#&Y~Gw- zTz$++PQ^-sc{4T@BjWRt$Hmt)ZJab@iJH5ZxsKbf%d%z~Ioq!|z*3{2Y492X?!y+D z2uk$e$;#U8&g|DrD{ZC+&n#$6Wa+ z@(Mv&cWI}1>ZdAyx79O2tt1kfdMY@ia)wm~9Qwhsh zf{Qql`7Bc%N_sgU={*i*_Gts$Fn2pc5HTh{j;udBo}i(Rbd*J2ikdn^#+p{Ap=kxv zP~!3{yX#n=^s{DQrEG|jq^{gC*O~-NFiuY0zD7=~wm7oF!oe)KG{s;Pxo4?uRJc)! z{p>)F;P0<)K82zBX6YIR8Byc(1bQ_`ifZIXj+)j=m52r(`w>i@u}TvvnE}-VMs!20 zJ1Jb_SJWV{5Y)$3NWf{~s+|T}bKQfQh|g|C`uNrxSM?El6i`8E}g z8%oR3jY<)xp1F489h#V&L$uRUqEQK*U%ubY|A>d>VoDyR5mi1O)Wz-citczApaLa5?gVCuxY<_)qs>)%r@Rls+`rr7 zbW*CXWvFVLEDKgCDhm`6vnH;Q`AyqAX{=*dqW+b%oX{R!2;P<5HRvh=40tDJBL@W%@8*F6H%*-H{SVkZh7)BG5gKrm7b1gQbJ5Xe|6mLILWZ8cLyZ*((J}#QqfI?tP>{ zx++N;+#o>Zz#+mdGgQOjs%kF|R@}`W`#3SsHL%qkM$ zDn}g*>Q8dX9Gbzw#Ut0Q#E=~vty`wW7+R&nKAppDMJNNDw78og{DdZ~P4KPcmK|ZG z4!FEu;*NF2ByRtyf}t7Du$`B1VHYDWY24k#iX=~$KnRZOBb&^P)Yy!-(@Rt~F)SWC zR_xrV_7Es^t|tXGv%c32SbSkw4gOAdwOu?;@eBvfHiS+*(u(VrWh*pL+XQ1* zW`#*mcsbl*q3mqzH}@EkkOk4LK23@UOJ*q-Nn~va%HwHsTsgs0uztA-kw~zeWF@Mr zZ89oOG%4mA^wk=^-k^m(Qz5YUu3P4#Ia90=a^I6lB&&J^2qu<~tD@Ze4IWNl=7t~5 zYjbnPOZ^rAN7659XJ8to2PJu|;&xHcERWgo2K@y+1xW zmjlmj!%8C2{mcXz0@_Z9eN71fXn{^iPmziK+!lW=-V6@qI3pe%Td1CmD2TnYlM%xf z%nPjeDM%&&J_)Xmncosg zq0C-JD0M_(S{z%@_&#kbMdFmeR9-GyzFtdWa;5;{1C2AY1$jAAL0o4lYCmI&9Mt&t z9R^bQfl9Na5=4*{qY&}e@O`A-vZ>%`LONJ@DHIYaVED+(-len*1WX`)W#mD#zpcBS zZ#oZ^-!bplZgn}Z^(4YfEr~$sbfJi4mKf?840P;3sB=P^`6{?p!EIi-q(rAqwrId3 zUVoTO0N^!<^9TTAold}E&`qF}kN{9-iRZ9JSWKy7TNh(XbdOLUddsTiJ)jDVrH#4W z`so5Ee-=y45+AypNMHPe{Jh&D2B!Wz$7Rnu|MOyYp+9-^2gg0}w5!nbys`Xvi)$H( z>yLL=QotQ5V+1a7rqhe}!a3B_<54;222Y&Cs0t3}C`^h$(&On*%wQDE50eRgk_Da; zrnFzs2gpPweDj{`dWC&2^iw#OcFv;+bGZX8qM29Eiil(2MUKVI3t$9}$;cT(af`-VO+_h#@x>O|Q_T z)#z~+>$G$I-!g`st-#V{c+t4&CItTbPGX=*pn}+{w!G3geZWCY96ShG;nwY&@PQ}u z!f#&3wI7I|=JE~9e}<3k_dSz-%bSKKTL^&o3L$ClPw?L}gj#j1xYfAm7C0#T>bsmw z{wZLr9Ah+>6YXMh;vzHXx3C82?}_+CAv!Y!)WH1W+5E3oqSB;!&<-1_nmqWdJ^PXQ z3lbRe5pNEoTvBo^;H1fQ=q?d8$Js;)k`@@^M0lE0fh0oIGD*L==)|ZW?ykPBO?|{| zj0HT=d#R8iS-or^-Op{(<5&dmH3$*|cf89XGhU)HVQ(-zBNkeMSzwU-6%*ix#SNqI z1di)Y?kC_OTc5|X8QzM$`K(bMJn+*>z7fbajwbungX#1gMG&)Bj_|G5B)mKfcRQ?K z$5wIPU1GJM(92YV)U)w|e1Gn*hhV``1vyLMHiJP;CHjO%Ejna7ejqLXffYRebJ5|< z<8se%4et<{AxcB|9Zz$${)CFLHQ(l^1TG2RQ+ZI~?HXH`o?9~J-l>4kH@jX;=YPlx zf_VKoJnJ42@N4l#u0)OxSa>>cOsYaY-h9Eci|*ZU^E!|RmGSH&#_O`3-)9L1E(U}T z;-iup*0X8fBxj~8y`MCIb+8YmSH#8PN!V=f$H20EHK7oobw*Ok|dlKsI-^fd2iesFd?)=?kdz zzXeo+be6>O8b=RKUG9K?&%}RJutWU7|jDp)zVD z?s1rc)xmeDc~wL1a4o5dP)V=8Cq*9e>7N{m*>nlj$^FAZ1v!Qic{im%oOi5QaNTS_ z;L?!SLp+CjbI5-N4fScCI{4N1bGfe9hplHqB&tD@HXoA2AX7->Lq!FUw~GoOO0`F4 zU}~ZP{*d%%&O8?A?28o`uELu{vnrL<8@4-ap%snz=(x(4)e3T~hC9dEn@%2;ywAiG0#kzd z6gFZLnjILrSKm?5Y*P@s+a3_1wGkuQCn;Z9VbN7%4?yX04B(exOo%c8WHzMw>1cRw z1^yq>mB3njGTjxjA;S~R4tNJq$Wi!S;8GhZ%eTds$hg8~9rQz=HgE(Y6n*l;doBvd zEwv!vde7LDMmzUffvFUjWbb}GlYr=6jZls5Z{+505U2B(U(c}87rP%JF-b6N8!yZT zXP7Gx0`T$|7!Gi2TUx&~1MfC-l@&4hLVB zM9KP|$9WQ0!(LHTqu{hzQItL|R}taJ(UxinWNu%Q3=R4ghRyg;%cKM|a1EBa=qeoS=*ctY5~5^ThyNvg zJTT2|7#|RNDbAI>b?_JGaWW1Kag+jOO)v#nUti^+nMpWFPiNXy>`b!Ma0sra>cLT{ zSqfkb`LUZ2kK!DIAYP3&Q<9(&Q5Iq7g(lMnc_2rMGCUUy*yl5Nbo_vo0;Eiz2uJiV zcaPRIOdlmosOM7EkPp2;?!jU$-(vzBQsD(^@Pu#2FCJ(HEGN*GxLU1?*_m?iQ4RD| zxR{u>X)N9d+;vx3`kt#+?LDrn)gDu+WX?y+l0oP9B?G~=&Otn)pHX2KJ_nU!10czO zr3N9iGCp-UzET-ldxJ7mv;nbGc zI=-qJSoFahu*Tg9knOyNb|PK>BBOZ=jOPPk7egZeDQ{6p>qivb*>D4yI%* z?KHD^fF}2W@Wx9HLg#=QmJXz+8g9vplM{9RgX^FvH6bWU?uN+m2~U}HtT@AzsW+Ab~iYq{t#;+SBGu=<#$@m0|eU;UJhY-DgZuPA!t(7ov;E}0P?(m5yGR2Tg>9sc$-Kp`#6wI(gi-;Nr^Ik5!j}^uS10H8^W1zU`#WyYA<(j<=q*im2pZ_+ zsRt`Hi;i_XeB%kgAdAhM6qQ&Rb4xHgKn%teL^@JtkNo;HkB;4vVhHLNF|ae{-dNas zlC11Wpd*hc7Wb4%99D+pDP|V%4@9vZq?kuug^Vt$n*lzVB;!+rCgW28i;ZJuoM1xJ zuE#K>b1RF;>v)Qjej${z#ifnKVr-kt;F+Uqu^6bT=_IY$FvPwp0_A9DX_>j4YWq zWDq@BPv$v+Jnc^dIGx?3;CzBp#oGByPLRw5Ysh3)6A9!%Rbi!MJPgFC!*0Np!a}+C zm2W^Lla?q>o(wNk;?9bl&KUY+^bGK1ttmjQ%N2lycV#ize8e>{u%r%tWXU@u&mr*4 zOAlOyqi!+T%s-&KYu(#yJwZ?V^yq3M^~idg%iXJ>Q{wCeXyWV{Xr<<$?bka%BI4J;9n4WmuopT2f*6x zaEt1Lmq#0-8p&MK3M)F1$a9k)2;mm5Hkqt3MMS+V1$@?&0=#TV5mjqQ23z0!4Fp*; z3h=xYrHH%{rP#6!<@l_w)X;C!78FRT4Jcym`HKjxHJ^Y@TTcY1jVHjFb>mL_XN7A5T{Z!VUgTAvdFTcs03tyWutv|=Ziv~F8eTD>i%s8=Pj zsN|L;tLF)-JR+5$lR+ZGH5DuByk$fw3`1lng4;ydvb(mB967*Qz>wM73yrq*Oqe5N11l1W4_>|bTwN(#q9$Z zCVQ#}BYA9vbz_JEp%2<55-7VMVJamf>;*5;L;~?@-Emfa)`wkmygQXx#++Zk5oDa7 zuc*0N;IOVHh;%gQE*_PKW(=C&{XpQ+vAbu!#av6p$9x+0GkU^e2LS} z+=@^^0^i{Fr+(rogF9}$$zk1$WU6(rLYQDgBL3lIk`E;)y@!6%y9oa1&Qp0`f-9@6 z1t}@4BUg3|6kWSM7i?hoIklXgrmmE?H@Kcm$a?+FG6V7-;r4;_uh&dG+$h*^m*gw?~7a9fKw)Z<1*b1t_|TK(g=GC5$02`8b`Ez zo8o)B;Vq9l;h37=3O8W+snDgSr{wMfkzmvTjY;9n*cC30(ZMzfUE^T(8MFCXsx*6Ln-=t#^76iXVufB$uL8rkADxzom~^tVQ#;du&AIM9h*T?ha+@ z7(h~^Qk0o#8+$ITLFl=rFqz)})}*Mu>6Q37#dE?|Wx~WPN#i1Pm)QZ^vJy5-vdwD% zMoH4+DfZ7Ui~NL{-h6m#04z__MUZCw+4L?1xX6Z4dom^UkyHd`iHmUDBz8BJQvv97 zj2@^KuNW&TrIAIy2oeV!?)!?1?mdcHS77m}#X2R9;1E%=*sd4BApZnx_xh>W!qU>bxB zj=}9^g1*j1XPD5go8fSELI`jQ2;SchOS}WZ7d!c02Wqk01^%0K5`tRrDsf7K*#_>- zR)J32l-~7K1ir=TwWZ2spmTzF2;!Qn{m|l-a|U&6$)V1wIhcN24&x?44!hbqS1w2B zv925{$3k-8Zu^}(X0LG4rIVvHIf3k_Qe=LFlFQ(y$7{zK)Iz~mYrS#n zz7PrFBkwxMa$$sJpYIS5!GN&(G5==1mw5M1bTzOmNG6+07BedOd=<;dgLH18X?vKT zJSo)Y%$SDaMR6lvzOw`bmZu=VGzrSnVN;WY&6apj%t@F1cDa?TSjnu##i=(5X3P7@ z*?x!BiLE0#I%ZvDM`wEt50m8(l^h9)EVv0g^)^juUq#DCM5Q+SMETbkH0P0 zsPr*bleg_n}z{_))*KDsKSFeo({1~ z*~ws4=Ly0Qy3k@(BxC#45Lm#d!qs7~ak#ecQ9P%2HbeC5Wsnm=&Q_lGYe@^2P`QzZ zAmD6Z)W$n^OPl>!E-LGB(1OwPHk;^8vg3+VS!8gURRbZB6IoAqvIRT z_C#0O>L`i7SY;w6(nV0+2*9IUTy>)&1h`yU{2Tr(y&i=u)@Q7lh{xWQ=@M zY59J&&-3+?#aP0_q*+H1DrK$t2V|vl@TQ$)71qPSV!I3vW^ZQl?ZJ}O0QbFXUhjYQz+HMRta&=ZYb`4; z2yxk;Tenn>H_i0v%m05!2W1Tti1AvQOF4yUo~5+q8Rvb4>0F)QvM{QKPQWmF&^>a! zPX$BAsRHJVs{+=!RRtjvr3#$4WX>Muc-F9jr2A5X>jbO9APDiu`jFyZ^&zKX7?Yy+ zsZt|&sQ8ajmIw21MFzp}A?x&+&R&%9BkO!wc2d3`q(Q$0}p zZHC}Wj3XByRP#HS=Kg zO=W9pMprH;=Ot1zzbgBdlT758&qD_xF65l+H0lCtN*x_@!qF=86yGmH^EMe=5 zN-EV;vl=pqSdjOKeTVS@(JftQaJ30Th;Nptd4X0}4?LFd&+F8*fJnOz9WisuNh)gO z19bg}XKXx&@FxvcAi|%}a9zR!l9dS$L;}O&RAm$dyejiGn6YuAj2V z;N{4h^8SNM9{x9qh>ITn)5jo--?|JEzTNsnBAiuF*EuYitR5tES71&6VzLC1E|FMq zK}FOBUD8Nw9iY01;W-KB@=6_=NT7DI5|i`#6%Y?Ua|=jG>62S>TnK4W6Xd%mattUeeyib&yk72mAhBfbG#`px|>;|Hqw#0CinSY|w$A zR73~0ANYL8Q%3!jcSO!)>pz7Z9WQ79{*K+$5S9%ge-U{Pj8kxJ;s0(kF@{Ce?#D~5 z%+QSAo9ZwtAbW(3F6qv@5+;o*6(>6?DG0Z`vNV5NFY)e-%)3+4e<2J&Mk}+!btmsZ zU?zZ>Q9Kb+fWsRHO3qCLL~s-yw?gDu5>&><9#x-8@u{9Y-UgS`OOQ_T4r_mU$;N|m zzl+2-T;`bWaIOR)s1q>}<7NyV-*HEd9K5Q}~++cNCmcClf#@lu^W zIX+9V zSqkIeJ(tB6=UzM~UO?Y(^eLevO8`~rBxbi~zC-`Uw+-D(DZyuP4-`CQH#T|0jbwQx zNE6`g$xC#vq0jeYS=Q@_dm#~C(+*0W7x0l^WlT^<#4D9{3R&s9ekFrS2N$&W>jK<$ z3{z(>T|0#WZ2PicTRlMMdq2NQ<|XCWtOpDYW5QqVSsY(P0STcwHsAy$&l2^p8C+!2 zS9>ZP77@wa_#HD9P(^PYFq8Q9Q6-%mY1riDfEtTIB;@|}qdJera&=1|0+It8IMfi| zO;XN8XnY8&E;h$UX7e^xg*9M{+I6%0hWRv~U@B1ez8j?K`|kh!f1dp?$CYXxrbO)U z)olA+Umb`*oVR%SV)Dij;iS$EhpqJVWiJs+8Mnl9JbVEs2KA7?<|9b1)~?PBOS|P7 zN=YV=*lRWjG!%kl|IFd(dY;AFC_yQAO4UTo)%;a>8jpdQu2`BaE8biabG!X0K**kt)K(O~dB z63#m!^yI6G$0%sD5a~FSsH2`sE0P!mBGA?RNc{3eE>S|T25>4RfKxeplR(V2ff^|W zS_+BsQ!xRa2@3F3R3}z0GnT-Os05yhlJjjbnW$EZFv3zqD(!ZUIV(;!m#SqLBQL{P zf!MZY2uYEqm5nC=}4(>ZRga*+a! z<;leP>p57aw>ePivYf5s!b6UQxE^7@;lTLrlt)LkrM&ft3!;F!AR#$1+qS?K5_`?q z)c|ZR-D?EutK`z;*qnQw5vL$C#S*NO*@=<)ewnOc*Yb0#&pnzH>;%zZKK8WeaND;GdWgUSH+=% zE`hWr{&nc2N~3sOkmLcTtr(TGcPhoml5SoNLiUY-Zi5v_UgXH?<{jQRDWQ9LPc^5N zE#wb8yqgJ;;kypS(RvcoRlxBZ`F*3SUUW?@fp|=jRJBM&8;Eb~AJ-BciW-LNTvIvsH1Tek^hxyBY z|4%#!AkY>39j5~a7KP!)o4`g906f)p9-+2?-3`? zUoMK_>A2?+%#jlyEr(=KYu+Bw;~Dy6LiB3Bdy4-Sn+XHm@$4^NeTl&9x$6!hNU9%+ z4Vlzc!mLLdSp?Iq%G@a?y|1y&cLR7#jsW$IbnjMB&V$-ub! z%o$+@{V$&1$zWLLfr172ytC?xQhX*X=RWUjPK6Ah^Hst8Y4wOQ&C=$?Lv+f^5Op|& zZqIlSEF8~(zFXtkE4ON}IhafR@^YV)w$lo3#^xHY=;Y+*2yeLDRVDG2LD%FY!3JSa zszLMXa(!LXnsumA8RT`NFAV0Mnc_=f<@2r~$8FO`A&;}}vlXEPa#B7L?NK&(TWi8S zh6oj#ens(NHMdr)PWjAIB)^`=`E`Vfkkh0F1wzcE3&Lsxki+wlG^l%f%TcC8sPkwL zq6M=4#lXCjZhxIh5n?ywN7(}HWKbxYgMzIwG~03v0tbvUDSABOYHj5x46|px_1MQ? zQ&5J#;U;1xT{TD4J(OnB>jVxgaOF(zF|mG_E$KcO)X_2X!P{t$RlMZVp{?-2l1zc2hPv1LidV<`$_3+@}maQS{QDTc^mJ;QBQ?0fikIcH#D6Z1g zMdW!`=}|4ZEJmMTe~D!jh2IeIS?3%Ru5_UhSt+Kp@A3NuxzTm_D(p*uLzP3WmZYM~ zfyrX~4H6S*Rbx$q|0bm$nO(jsU9Va+&X{AyJ@*e^5Q2TZeR{uM;-T)zdVBx$+f$O= zt~&nrh`HVDevVZH923Dqj?#yFJC5dkz#(kzHu9OCu_=<)c?}1rqfexaO-ZQ_O-uX> z#i*tHwW63da1D-O*V%_ti( zBNZh5AsHh5VaTGk5)XW@Zs|6P!k(1q&xKd zPLuK0Gie`YLJn>R)+w)~FEPy0xRQIg!Ega%(LIc3%o9Fz5I>{`qU?kE6YnKpS#Y!^ z@(lf%af03C_%zu~`c%j2={w``sT>{axOYeac^)^GVaDqpj(?fWsPqOYhH& z0qHu!NIi}B8r|WMyuRd|%Y~BHeI>oBafk5D4~!IuyOw)|7kj;C4B5Ej)uPI`zv{HN zYd$|RBoW(e*v-TA`vJQ)=4NqSW=ie!2s4O!7GVb-pv3GzPLm)!&)c(?KcC1_ObX!! zz;t^fD_xUrd&Aj=ejxh5dbQ&1XYA7uEaE(LEt@ct#pZOk+ad@jlj3bQmypI2DS&dx zw}AQug~|CPf}W|8x|*h%Y}N=Z^!L=3W@YX-2+|Z%J#}t=jWusuiP384UCsS_s zOg5b{g}%c?IA#G?U>>k?s|Qy;Y&jCEUaUfR!I@Jatgp?tzsmYPW4cYhV_Nn2`eI69 z3tZ!A+>Dm1$a=YEzLk)5aEh5gr_0m0;O1`75xD4n#oo}@ndZuo#5+kOS#{l1oN`FO z%KvP8dnPw97PCyOn@BnyN3>oAHa$9fDg(K&;xWAWR)A`b_)9{>ltqMvn7gG z_eW839&Q8~ljDZkcf7^yEQ!CE0;2Om#24m2a^C^SP1o1+rK_O5oFe@v$KNAeXta&D zvmh_O}+}zUFyDUpn!5Nb-y4UN+8EPyhwIU7&k3P=- z;G|eSw`jRoL>@n42iIAaF8ug?z#KLRK(DdgX&ix(W2teyC3RGAJO;YP>5&7{XETax zAac6q4f=u~#T?$F-yp!F+6%VASTj94KMy9v%GM=nA3|!fPrAZwGvNgoi)r)OV+!V# zO5cCazujPXM-WohXGzPs1)~k%7e!829r{SeO=jA_6URWfIWs_udMUi|6J zAA3BxH=RG~D1}GoUFmoYf)LY+N~-M~msz_gXZB^ixb;IyVxtvWUg*Ph35?p^Be>l9 z^L}%F`4;zM)vJ&VWbWSjWqkB`u^=LcR3Ef_jQ!MFKI@dSP7-~I#pX9WQH~Z2EQVxPR zK;6S0*B-xWQS$!V^gBYBE|+1W6qU!3G6ShRbW<9Uox!paWK98%!o!Fol*L+9#^6Cys9>E?uxQ5FcTTUgYoe zkLy_W5^2_NFxBDHph*cipwt^*nOzB4ly4Fhly8R)h1;i+f<0o+6yvuh6Th`$h#UKk z7p`YZJvkwfZrKui|G|6zxCI_+F0R>UzDV@*!^xe=QhG%U?>Ib1X`&sP&?oGoZRPeW z)yt_&L&D{j&6k(#LC=&19+TpfiPeHNQHjPYq8)Eariii;at_#tU<7BRz%_3kqgvj5{* zPp4^#5cU+zURDlYiS0B&=_;?*2Cn+9H~gCkal|!fl-;dwKF`2g5qcNv2sP7`JbfnB z4}=2lP)p#!eR*LV@tC)CVDzSxF((XZ2{evR*|g4?0ajOfr&B>?I^3fo{3bgS%ePGue!L(;y2)e*-pF1SU3aDFjNVcsGO)*=!!M`Wve!vRnLKGBc! z-F{n6H9VSJQciw(CZ*o+#y=C>k7d%YEw?TG&Prd|!qrxg2zSH?pRQNU8`!aCWaNynbc-Bb0O!K!)yEI=lp8 zCkRUOasG%Y2#uT&md>k^*L~N3lN2-8H6W>4w0Q)moeu>dS8j31z^NO-A@DVYEV$0Gvivg8y43pM zsc6e_l}Oi9UKL?1G6zm&Swtf0lRj8=ex{wOYMh$BPSMiB_4Xg}%RkYoyC94W& zxTefdoLEGuBom=lbu0-7>eRX+0Hc}ba%~A${b-Z0cXBbEx=MiU40Mi&k0e_uSU2Zg zKhk1)m!ZNEQ9r(1XX+JV`j|4Qe4PnHIJOU_vf&dNQ4TZ`ElRX?A;_^Qh0_xPfe+(i z(J{CF6(9Z<=44YRftX})Ur}az93B>{IXysmP+sk)ICiW=I-@BNi@>S{w##&=2oPB- zL(D^eU1Fm5E8M%|l>E(a(cG;e{N_QHWkft3Gla_xds^}!LC8`V5~vbZ-M=glA<0=M z0!;S&(pzA}f}py;>ilolev2Z2-EO2IWH0IR9;jkR-r*=^C{X`lRDiE%ybwh9JjEdp z(`f=iH!kl>OR$w0-5R)-Z(lp@U?;9Qg)uU$Z`|y*%Zp@I<4A2=QRW#sF}VUvqXz+< zx`JssIs{u`|Zm&u^~dgE3bBG?;&#;Tyh95~0bbj&~nf%(`4&_Cw$ z4PIEq(>=@<0I1J+lSjW0j?+0nX7`PKwy8B?S1vVU04I|#Ksf-FvoDdaD5~x6*1^t! zMf?F%<6J?>YK#G=^szRE5)%ds4;<4Z_aXiw{?)znz}H zb1BpqY@?em@2G)a+e0m~8OCR@p0SX4^3-Gj>1+b}R4#ql^2${Kx z>+sp`GN64`GoXCc1i)D)puFuXD9@F%csN)RJ&%rqRFYr{-6K>neY{e|5&72YN?JV3 zCexc-ok%|*vC3H2Qe;-tWTo?p`Py7nHE96g&oOhX z5{wkEw_8Aknhi)VvWj3`sWC}9s39p%YeQO{gA$IVNJii`ojq7McDm&dU%5V8wGh zF3Ad|se0LT*I?*Ep{npmn1Pl{2D+9bBquJ(a=C$46O!iziFakOkjV3svNvoJ44xcU z56vpF^B=6QX1Id8pm^`G)hOsyHsL;3F2z9avy#JKxGd)IpW;zXpfC$|$ELzLMMB-o zKP44ODToG@S!oJR*5FdqB`0bX7C&K4sb}eE>$1eHj(m58%geYz#ZxJU>bxuWYm~AX zZ2}%6rJ3j#!9PxfSGS1*uidutz`7i}pXDjDJD*Oa`o52;kkmWrya@>VQ!3n_+~gNo z!ND*yEO-O5BLI9m(_cHv01WdpA`!M1>46h$Y8G0Fn;sG*u{f#vv|0%N(5yKl^#*r#9#`OWVkF(23r~=NA~bqa|HiJ z26kto05k>(u-qa6VN7CRnN0$wG>SzPR>_fB)-1ZTOM&geGL zTE_r$^8{4IJ{DIRD97e`wD^jN3Un`jG*U8bpoe$wDQdrzAkAZB#3nd>jjYau(+^T7 zQw9u2uBIk%xsmG-$r`)As;g;asIXvLSwBu0s|4wCEq%bxE1YJ!Fl*T8&&@LZS9)sO z57_lewm%}+Zi{5&X^0epem_G!iMR|iu~*}(jOJoD-#3zl9<-TLdSB*Rca7JgbJpU{ zcTGS^)FUPwk*H+79Az^h>8bJzIWY@c8R|*IWteo(&XC!VUSLC5pcq%AW}84}@}4ih z)6r#oJgwXPJIRq|n;jHQC6rEh5`B-!(3J%luE8)&c;bgbyKpb!hwJ^_VvT&Uui~A8 zJH9-S126f+d=A`#gN;0gzh2;IAT9vp@K^GfH_j>M2_3DwcDuLJToO)w%6)o^)xF`wUd|FOsBc6{y%zNwtR;uBe!U~dX$ zSF_`$p9!6mLuir-Di%jD!g~Zdh?c0Yx4;GBF^u+hZhE`m`xKNeWPph2_8`LPWTw>1U;JN9;n6@ zJKYks=(yrPT;FzK@~t@+aeQ2P8U`)WcJU|VgJox^4=h9F99xV&oxzgyga;I+XBl6f ze@6G-Qst39L`gD3Qf~oS!dB5_BAdgG$Q)mGXVi5>sRirqapUz<;prHP0zW; zFs@vZB$^EaS2`o-uw|jc?F5t1%7xXEm-NA1&cIyt%*Gj5H2&{?gB&S&F6k_|Lt`58t-0=kd8HD1l~X-ni~X&xgE(6vU)J*-xjyGI2k;g z>*f#o?5 z4X=t{^yQq$KAf5DM%{nc_oe>~k6VW8QS;WkW78)+UP^w}M{;PX=-XL6IvES_;jCdQ zd0%UoOkUg?CL8CwaV6sI2;EL^Z&{4vDaSQ1Cl9m!5|6uWvsM)5#@;ck9(X z3(2qO$#uovdQYm2+k&K3Wd1e6G?J7C-H|SCT(wXx_WlRZkE|rJTK&V_<4zxmTaM}E zglBYd3H2$qq=rjENXLv3s4jAk9d8%m*wh$~b6(Hs)j(coe10-!8l9512hEhWJ)Lv3 zmQs$Jyrn#&=5Cf{d@F0u z+;H)Y*>r2L18YYq>4>@=#Wt(8lY3xE;_b|lU5&mtc?fZ%S4exYLzHL;brwi^g2Arl zg=*0O>;%kITBiv#k; zw_P>4 zyQ$QKLfWuUXc8iJZ1N3(u;jRzlO-H9c@#Nh^5-W9nS9iY3AUjEBTX)(4GUS5k59fK zP%LR3g=SAxP>(QvBD`4w(hEI5u?$0QOQFyhr=?&TbXf|HVTYw)8FE)5!-17>>`;Hs zn&^z%TOF~ZW$DJvh%Cpb`A}pS*K0Vv+x0k3Sq6IRKsZ=?17+JsS*$P(JE+t~O+H|y zvGX5K+OUxAI>sm85Gc8}jdiH&u+DG$JeKqXDS5jDDhwmKjx>dlT}R3^rt3&KMs*!2 z%ZRSSF&tP459m6AMgv_(pc~zF1dg#?hhrGmbvWX7J^p2+pXccYI}T6SuC-`EzZ_Iz zzl_T>QtvIL)WsuZ!!)+f7@KxO9P)cee_?3{EpCb1R+qlQl8@*qEcuuwZ|R2`ytm3h zH9-;>R~wuzy){CI{HXC^QX9o>YtNzjHpC*7JcCaTFC0X|rbFPxwW=7N3mknv0U=XI z%)~AmZImSf{Ky`ZlEx)DO0R|}+*RX|dvE@>RV``Dv}lg0*r7Q>LOp8GPB;czdqO?j z*c0-hww`BpaAa5Mhg81NE$z~kP_tw3L}Tlsm)WRAv0G5#qiUtdZ3ta#7-qrO%)u&T ziQCoKP_}BZ>^FzVB|Ytbqmi^-c#|F?GeDy@4T&_=8fjvvTM79YWpwA9|R z#9Og*UD_O68IGg_+h3NjRfjUKV+AygV2k6)k*h!o64Xl;z zgtBFAJb9G}ZMIq^9bY!nrZi(9C2ThvPcyC;^wgu8&4GFjmeA>TJJaag18t%c16lH+ zk+I|$934xR;SsXr8B>XDMyAcOH}VgyPLjxo2C51;m0Ha{Av~mZdD)Hn5XM=P$YHwo z3g?aH)9!5gTiE%#;I&l-4M;CRN3h;N@BNnWNd7i^yg1$UcQjumw7w`2E(h{5IFisC z-R_=y@3$nGu*U1&8V{g%gw`tLd>s_qsHSGg$JA&`uSM8jdZj|+8naDfWMj50Lyg&} zb!bzQWco9lRc@!$a8rxgA1u4KH57x%pU}M_T#bmwL&oj+mgHk9TOxi$_bK#;mZ>m} zw!2elxJ;w&2g`1lJ*#1VLidJnQ%G@-p}(*5o{}gL7)F;8D6VYQAL^7rWys$r+hY{thI*s?9uUxDG$1$#?(?muUwXz)Ej+O6#!uGn2Y0aMY z5Pv8d?4a`gllf?r_#Vr-W6IgkwM*9!wzVbU_>%kt>JjBfvc}xV41JEWVVcmR9*}lJ z+#agM<20?#Goc)|b`;udLn`$!i;p^`L-UM1rW0rzhDz*yfCdeb%zHdnGi3WfIc)nt zI$YNeIjuu8jXE!*gyU=c=mR?kYA|5?IHC{PK2Q$ZK9COE{t*9wIUjZ4Kncg&Uc85f zp^|!kfCdebd*mhT?GBmV6AoM6Qw|&cfc;{cbIhi#(2ckH*e&COk{>X6oV5+iv{^ou zc-Zuox^4cW<6QdC96P5Uvssn%49?1PhM_rmnT?@MsF1>8W8K(U@TXX2E$`5fjdKhQ z!ziCH(2sPBB!7*H8@eBqND>60eY9KR0rspsVJ*u^9id|pNWrDMLm;gGHJSf0=}BZC z%Y%j<-k%hCJ zW9aX)I~9Wp71x}`aU7)7Z5nlDOg=))KCKfyH5#EXL$owV#Te3b>>as}$2E$>?lAUA z|JT;Lz6g3c<<9F z^y_@wUzid8WvaeD1nw;;-ZZlM75(K`MY+$J0A*ybhxcj`=3{W6D7sGNu z_4@-KW=->y=?0TXKx4F_p^`&Z zb!onphnJg5OZG?7Y6km=_p3h`dAY5c%S4}yd%O$%B9q|cN<7UU@WvGTho}49-Lsd7 zq(9x`f!}*{78&NXbR%iZX{i)0u6>qIhCr>KO4$ z9cnTc&9l7e{G`sk=wQ~xZMAzulG?%5S@&7{s~Qby?{B>3b@fpG@E0Rhrv2k=)689g zuhzgi)k&5XRKb8!&+c6E$4*kG_417;XrEq79AKWhs55pvG3-!v3sfkonV_YNuuORw zXqxGOUnX~TJvTeweCk>j_&yykgP=@9jK#K@*OPHI@(Nec=QKG@9J-%Z-|G&G>(GA3 zLjXGWcrt;nv|i%1;8aM~6=>5KL!+Z(D(qUdnIME;Cc`aZ(Dq8cndZRUaAEft4?Jy_3pOwc^!j84$6TsYJHcn8RP~}wa9U6nZ@YG`@GK+DQ~JWu4*!_avw|tTy6I?;vsLM zP(qaQbFp$n&qP$0bP^Ff!rM-S6wJ;zs=S_L3Q^cwMDZCGR++O`WQ{3{kChd=Ow<@L zX!0utG;XW@X@!;15%yBL;Y`Z zU7Lp4I)@FaRLDBlVyd`@8RD+r?XD2O4P)SET-vB*-TSvS+?F#S@?)sD-#t|MgK>8c zi>_DCKn0hIE6=sm0?qt!(Vydlsx4=>lPR1&C0I)l77~g96T!$dWWO8`oUI@EGG$ev zr7MMo6(M0jS5Ta z7v>M!CRr%H+3pIvqnPnyC!)t{-^91>;{BU#G@s<};GD^BL(Hwv9v$ z#a#0rp<6=PRxcrKXqeD7l)PMQ<|8zWWNq~#T|>7>M8){kSG2w=kwzB0b|~!J88|xj zy^CgKRBoH~E>*BcIqh>t*v=BRt!F74_OoP-%wBoxDSb~iSW)mC%!qs>lY>; zbYrsO7{=tKS;BGDa~YrS&@1H7mMX!-U3ZC zZ-J_vw?Nj&Tc8<}HxT#aO`N|GJ&U1h>uv}e+8e5d{%|B0D^(6#@I5&&L`~Zpx^@l> zVIv2Is*wXezB|IYk*uv+q-$svi5iMs`D#z<9?J%rhBNM0NHvqPmA1J1jxhjRYTx9& znJL}*o)lE@2m@Kdwuvld!$_8_VJ59nBNViRZ3Qi5LqSW{P%xB{()ZYTKFWItRP77| zvWE77W{m1@R()-IzU-Xq+Za|NQQHPV)2^wqWsuT$>)~o)7M=yyB*`o-Xi}0GL zY!9(=^(}t;M4Kz@Dr^32!xPu_Nt-44u$q79>vEKCk33QsUYKi%!+G*G4s17Rx}7_@ zGC(!k?)ppLTLBB*JSWw=5b5dqCD93MWl1>Q$)gq>PLEdQoa?z>nz4%a8g3X|u}Pt| z=cGv^QgF?N=MeZ#YfEFPK}`zoP&F1nwQ4Yl58LMQj1pos^=hbAgNCakeH#wmST@ZO zWplHf&zy$uc;c*OmDzA*g6qZ>x*eDnTyrEILwMr`yfL(!_99}iv|pBJ=2dId^Cpd) zuNzpp)KsPJjmiV7x+5G>dW*X;Lg6Led!fw?eZ@FCMj)N$F?83<_06baMq`rg-!VeP zmVW4zSHxR&_C}XKo7rCDflw@wHfh-UxS%jZBx@5*A{-R0@9X*&yjde|^|o)ZQY+NH zL#*cdV3MA*s@aBpSKPp_QK0ANP~{J6{a=&G%*vj*Fue}BPdA{J zCmXjb**l-Uf>o&ekXD{eE=@lsl zG>e2S-6B;(JGU1yq*~ZAX_ltjSQru(_8*$U!aDzuxIj2ywLsT0S|DoJEUe!TX%+|v zGz)Ys%>q$FGe6!ADdy=0^zvjawLDEjt2k^A=@lslG>e2S-6B;(yXY(oX%{I6w2Oo- z?IKk}JGUA>q*_=sZ#F3}tkKg3LA^A7&3sU$u+H7oDXt|C35=8j=8uFe^GB+N`E^}+ zNHf3s+|20Fu_x1luTB$OdcDSvLPn76`j=L`Dy`MeuzEd|{XjTaE^eW_T`XZWyf=%S zDEfu)A>}OXfPR*=rJ|*4)Sa-pJ)~kF9MJFR*ibeqQJ`vNA`mrlkR;fsO-5F$LivUK zA$xebL32dHhBZ7<%NU-fX^TkIFhwM4S;9^{hpb^~2P|SqTiLaAjVz~=-XT3x>H$qt z;+C!{rPKCd_qfz3Kdbrf>3+MM939IB!4rfC;;ZIA6mUV8;H$;se7)aQ5LlF2Z)e-@ z0i^*uM2@?x;uCQJgZ{Seb~QBOCheEEF5ZXd!NvhjH{igN2Q0b=thoEH{mOo2qzHF1 z#q#50WWJO|a?dP_WIT_SQ;V2I$i+u6M=d3$BM z4FbVXy2#o26)KM|%2+HcP=9^MlVTv%_#2_nJVhaunHDRQn2+z$Q5@A!ZeKo`U>UCu zh5Ta5-G}`$!*O~BIojDZrpcmvzvwzd4aneczRhoJolChQ)-{V19kiYE`eU}yg}nHF z;>o03X`S4z_t(q$<$QZnY)UW|$;aA`S0WRuj5mASkIQw6sXB_nVap!9kLD4#Z2EAPznX(Zhbw|*_D%9KuD0Y0fe6obzhXvF z+i+*RQQ@ekku&L)loDo}BQZge`6BGoeU46nODE;2?>)mO6do%Jg4YzL8 zCuVUwC(Q~b&oAGs|xn+lpyv%(awq;Um%2!F_DO zXd8@M`e;F>r672*>$l2KbG=_IF}-5@%C?~<*vl7=8t#6**3c}evIJK~4{XE>b-5Wo zv8Zatx!EF0=5}7z7UcHb;&a}mBBlAa8Zp3`UF3po2E$#|;wB_&bI}O8+1jEHjtuwOYo;#AS`zP`I47!>gvP(QA8qzR=&Yz}W>< zg#@b9k9wBnqlfHdk`p#|`X|BfFN6n7nC@h?$`JTDgP&%ljmTH9o-OtXCNl2su;(ui z5=0`-=);csWVYLF#fM12VLYsZeXR2N7U7p9pi4@p6Jgvj_#uU3&AX$Qe>R=|WBy&{ zwkg2^uMti!9&Z@wI^UGKfYsN#M|W ziZL9H&Nbs>$Cx~+kkCJ+V18Y!J69&H6)1E$yBz1dv#a&rrynjt z(4ma#Uo4M$qW|hJ0QI3h!cqOUsbk^)EP3fa&7gRdK5j;e!p(ae`psd5{Sc!Y;hGT& zQbG!(m=9il-<70vbG0DtyasOg4ql=d5VE@?XA+Ep>4 zSw_9X5T3P&(^cLXpc>?Cf1gSq2pA?$fA>nxxRpxtG-V|(Wk<1NkFd+Dy)GkWdZ2WA z%nb~TP%*azFO;YSnXHJw9%+Wda%!~!A#Mm7>+O0EWx4prNhU#~^a*L|Dgga^fQz3n`#5yUa>uDP3pHbUt_1s`^cz1es zetx=K6*fu--&D2^Jw;6Yn_0J;T&=m_Tn6|z$Tv;w`O3W&@NSLZQaH)nM~+H`)xxXw zYxp|_Q*RQl-BS&HQm@uN7Fu8aFe$A)$>cJ~Dg2=9K7t*eO6^r$67FS1NSptfZ`T-Q z7mt_^G_>y%akb_{GHvY37j69WlRkWKZR(nNbm`*M={;RvavsmPz&*xbm^P+W72&8^xMB`831k zhdL5t+iHzw+k?irw?58Biqr4deZVR~JxPasY3*^>VPX&W^r`=$TU=q=!DQM~MAA23 z*vs8)zi)Qy$=_z(gZ#sJTLRP)O+kx)&l3QrlUC5_m)T+|VSpS|a_xQ}9Wyb^GIJu2 zAlj=EjixR7|di=vg%e>@39tp5~Adl+rbn9S-<(#u2S@7pb?AN{eDJbF19|tCTdW|UE+}k?L zDhPth)rrHH&O2dSASn1@jMF*a8yUm&IO{&YeDP|r>&8%<#&Nm+dUEm;BK{tz83J-+ zG4e1bdC+LH{C*(Y^pEZCBR#1D`O+r*>wG0a!A7WjH;1NU61$sE6FbarZXdM&dc=15 z(=ECfV@_Jg+Ic86# z3az@pg4TUGK54{$v7WvJx`LitRWZo!@%yPNW#wxW}Y814Hb*gsDt2#Sf-hlyu79 zp(5a*WJ3c|G|(-3Woc6q+li4T4nVAKvUKhjC?lAyN|~3f_BDNA2*&ufz#8$bID=wO$r!0 z$ea!^6pAf@p!*8%NMKHvb0Csq0sDx%Zxy;4`1RsTLHd4eGJw7AS($IJB~(t!vq#s9 zn!*CCX1T1)m+P;UD$rB@=j?wgM|!oz+{87jvbMtO?ZG5+T2 zUd@-w#q?pe`dqdmh-Bgg^T&!n6nms|RV4y^&ZRRez^AsGccg$_V1qr^`$O3V{u67L zIa!UhnicoRbk6@49W0Km1u!$T->qj6B1hNI9qtx5ToS=fdn`Jbmcy@fY++lZ1A#00itA~vjZ0aH@1r>0R02z>eeHW6BsDERFXttNI{P{ zt$V*lFY`UZKhL(a9o&u?7XX4O12h>(12hsM1E*QNf`SnrSdy;yarP~eZ1%egTQ?;; zsN9hv2uYw~E=%UDlMU!N)|`kJwg;nPhrPX+mZDAK0?67qVTmtC0FK>YSuB{)(IhRG zFx$HM{VfMts4_<%uUNXn7 zfQm9xc^J;w)=gInHeJGzp(zCLcWXQW>lb*ETy{z4%*0VK(P^J#Sxb0>S zVkzIzP4HB3X0aQ6@|4P&Ot^g8Mg}i@fnBAHXlp$`a)B&r;sDlp2MNl+K)~?(Z{`~@ zeHPrSnl00@-N|~F&KDf?70+PBbnh{l!Sdx5M!^Vlq&Pvn-*#NrNlXtl0%nT$q9fMz zg;-a-#%e9r7n4DoQlV}{y@&rb-+r8-z*PpTGy7OOMf7zm;e5Bpc1}z;PN_(Ze&)B| zA`bf>>r8Ar#+X$Y|pOlO8Rjv+A-eHC2C zl_xSLws34i5uXW_*HS`?rQj5An5Q@zqMMOD+!X@DezpE=yN@*CCbBll8^Pw)nI6Sz z6h^@Bi(4FU?BUIjQZ@Q#*=}hKuYdpa>?B>QN2%R&34hDI2EVlC2=UhR;(p$tM(Ddf zshEg$9>gnI;g0XT6uqIkZO%jJ6Bb+!CoZK!PuAfPfvOCyN2Jt%AjAJWISFg*E@vL` z)60_M`7b$j%&FOBd0H4r4m30=e&<61KE*}4`GVV5=+JOZ3P+1QNs+`9yXk2bqizyZ zsU(n4LK&0Y$#H22+3EY&aXTVG{Pv&bb-G!%dN#q-L0!NJT%#}oW+-{4<8;Xtnv_I$ zMdJmviSAGg5ILVSrAoU{lq{z4S!zeeL0jy$HL<-KA06j9W9gW$UlwVVbWU$LD!1$H z(_~lEm8Sk->rb}Xux{PW5=f{uc54kwVV7%Q&~Bql5-F(J@3oG~W_NS~O5E5%aV%QXwRuEV6DM?SUlgN}S z$~<(r#h}iiI97^`Gu8+qOo69r*n&+lMX9Ffq)1bgDbExU3Nz1BvNeCX-#I5^3|VRb ztpu^DJkL?$_@K!P*Hl+oI9%1}i?W%#6|GMp)@ z3=_)A<|>?y1-xTBPhg#?Z~SHxK8aZ42w@8?=%`2JlXHi{cwb?&~knTrJwQ zyoDQS<>JE#h8l^hH1MhM|C1j#>*e=n&wteZ)ECfh=?*qMV#bfT}c=9SbuIGO8u@wZaffeMZ zMpclXSPy&iZ8yhl&-E%=A%{9AO690GC%>2L+3kBI`s;Fi-C-kZ{=@bDZn2it6SrZe z06ey?-~S(ZZvrOAah(ZfRaYNqT%-h$AjJbBDH4FhDqN&Q9V9`3AVK010D_h%t5sc< z-Caa=RjG~!nv!T~M`K;Kb@-61kq^noYUJy)Mm~0Y+mbEIBU!e`mdB@T&sv`Kc*eKA z)>yOuACZw2nHdooS&jWX-)@tM%*uT4#fuj&Uc7j5Vdn}F$QEGQTTVMPlho5z>4~Hg z;C!P)vf_}lCotIQ6y@UVao48L;)A zPyvhtrT~^X^#%CHTUWy7N%Rf-Snr^;B?a3L#Wb>bBbKLD!*CC#r5O;@by+Y4Q!1m zcDqPp#w>_4Y*P&AA904Q^{Y6;HuIGXnW;u!OeDo86FuqEB_*iDA&URZ(h_TsD*bWW zlEi_NLM;(nsis(F>?$r0jzqY>XW35>FlB-OvYagB)kiaJ`Be~JLA0sX=r<0@a8#iE z7N^;Sr!d#zf{2A=KAr9M#OSg79A|R*nO4u<)DB@mY8cb*46ul1H3tsUo~d!Q#a6S0 za5`6Biuj|ckr9Lq2*wsM3k;DWkqiA6^t&xmlGeINQjYLKHbJ3?R_X%=&Sl2?BUr~{ zErja1R-#ZE2&1D#8Me57t_@>imqj`~WWLqRODm0p)wHT$d9-m0tqLYJ`zK0~AlBe5 zlvH~4<{D0u!9nqyLp?DSY?^W5q(8R17?nP9$`N`R{SYHRVgDht2oz8gD^a*Zh&97* zbhLXGmoTAiB5irr;D(aJ#!JwpA|y2RgYn=1I`*TAPL}n{vqoVO^o+!19k3vN3 zAsjq}L&v$Oz>|WdD9)p*!t?YMMI^!oPGuDM=ef;To=eP!7=q=*z#mDhCj_2+*-K6;%3Es-BUgsH4$Yx-==zNyNfTC((;>JrJ84h|x!!ASIn!Pib32 zDBS3{)$G)(Sh*jz#hxV5uGOZh6+^RQqL?j|m{ z!1gfVau*8-Oy!*oa*4J=nEC=XRD=}l?WdLlt>DF@kt;L2El?LjD_L^6+SyTOonh}h z`msb6@=0o@8!IYYOmlBx8wj%jj+qj`Ph&!x7+f@!K@t=je6!6o`&Mbti!F?L*8Lb^ zvy&%}9;7B}y;}hFX1$kFM`UWpTG*?^O=}g?ecccthmmp$Qo?v72gd})P;bs07Csht z7RzqfV1SmeR4 z42QiM|5+Ykyw}-g5$a%V1v}7Pl7P9n)G>PXme_Vq7L!Ef*jv?>6FV|x&9Ct`G5LH8 zc(jC9)~mEd4|mpD{ccBWKjunbL&GE!U~yMEPlP@DFdJg2wJciTE9 z;gt!J!x^L#V&)dVCJ)S==wcibTZ1>7<1Kfi6C!wYLx)SkSX9_h4ueFSQ^fCx@&puTMdyAC<5?19<7&9u0!g!i|6t0)S z)auw#VL(JBqVTKy=OCJaqiB8A3Rxv4`4Jc$IifCF3+*(VF#$BM2*}#M!)$fzUvcuw zsyIc!%)s$BwuI#dXDO})+M{xHv%EO~A_pLuHJ!p`u5>vTE{>MRR4^rp;=x9Abpa|C znlYo;WL_SLBSeq|BSwadmfGH`m{f;`3lkBOJP9)$r#Su?C9*_W9mVuObi>eo7yt#! zoYGHMeT*+&3*zU)A$I&<9teKM08s*ouh^4ja0Kz7m_;*?Y=Cosu=l8{VY0_sQvPcP1G8s!YhRHDYNcYI)I%XoF@b*@P zmL*kWOhbblQyG7ji-F}{5~%_dK!b5j9HU1WmX$=7``)VjCE^euG(LKXWYD+@Y9 zhA|c?8+%MgN|r)Yk<2z-eKc9X=-Y{77SyqZSC445S~#d_PdsKR?5s%uZU$g{>j;)B zcfG1bx)H;@(14<`tBdq>-tiXfd?3bEP@m+FW;iRoWGxUR>rnGwsH0k60%M? zM-q(zva*OEVk40Uk^enqgQ5hK3X7^lKgiIE=#7(27CMYY96E?iB07vUOE4t5tF8hy zX+6_w3Kkb@CRE9GY+-FA;+m8J5E>Gdj&wC_l1TtrM3aEA$tD4m6^`I2cFk__gqTA^f zm;;pj++$SmBz9D(il@|9opzLp1EPb2aFf(^d>pcjLx=6(aYC~5YnpSNb`O))9LRMH z_a+k_XIqZmq(1AkUq9md*d)6C9b@<|#mCR=mEK_Z3GG*~e57#9>@7X81 zu22OLVmjGc<+iR)7_nB)3Q=!2+yE8Zo3ytPU2ng{d32=YG&XJ6|YiiMLx9dHJsFrYe05-o%k{#oNKDRcGn%Nwvb0(SM zJTuIgmg}r+_}Ia%yB0>XbaT>5z#3B&#gWQUq!D)bC?H_tP|(ClX4&!`%Symt%kZ{{ zVW${qNd-8HVRo!w69+ma(`pUs;xwY<+Z6Q^*gMDxaFOfUFsSxW#tLD_$>q>i6kFEMN>wIp5`+8_p_%|X;w%kQs#s=;-7T;x8f!X}IgP)hH8T1jR{bVX zM2q^wh2t+tk>YeULsdC}T|Cb8l#iPvB?gT#kZ&<<2rA;^*?zc$h5cqs&SXV^G4qwF z?yVX=NSb1~1Deuo!y^&JSg#>7+;5VEQL4o~mDg z*-oV~M#eYVj;wqXb$GgN0PHu8aVs2Nn&d#u2t1H_pB!yZ;s}2+1uqNpOwX!+v6E?q zkhNs5*l!@2Af^h5O2==RS~vcv)vxLjPDB^yvDW=P~ss% zwQ}BP{NY?wc0;V$#Ec@WoyX8+{B?|`xta-bgO%>6-MrYs!rL*LBD$ES2#?XuvepgL zGC~xwpfzSnWf5NzYLAJ$&#cpFh$bb(2&)*P#G+C){2#ps`pF1k%y|r&l3)BDn`kN> z29xn?&ehANhiMYshI-HPI@1ZyVr}Os$&mUot_00)1ff2GNgIwP207lLaCCA!teD3v zWqH%3jfuu&D`7gTt=Jq^qwl9V;1W?1eh^I_0*R{5RueCUD|pZdpYReDb+KwHqTVNA zj6sK5RjKMP<2s_f)hh=N@yLo2Cy|ddS)h+PQc#&1ll<5c%hOe6_Uuc3g^3(u%1v)M{%)Sr}3yW6>8UUlGihtwq{pj_w)R zjKED?s?>~3N@Hf^Qhjo=ses0O#sw?NKz%ncroLswr%FBQ8l*F9%Co_ep-FcfaKH4%W*cZY?Lu6BqJp?-!gWOHO6|_t388&y>TpWPb95| z(iS4v3V!^}fh?h zoyV~Z6pVwIl!XT%s;{~1@WG~EmNnN?Nrg=psRnn>R%%k$_2YxAO_3W0qevC=J`;}gBr8pO=Er@M<| z-Hdtwj1olQj7+QoCMgT01x2ji$3c-aNLoYV9)RA322$evxNDI3AbJOhP1(f~KUfWY zv$!lkVz&;_X)+H#iV;+?`()1dNGmK*eK-$Lr15!9ayu`}m?wJk0^CjW%-}eVhC*<~ zMnwP|1uZzpUF_y2pDY{-;8T~HEu0448m^2Mu>t97O&f@7T-c$=1iW~10W-MbWZ>uu&dL$O6%Q_2M_0O+-BLNaGQ@7B z180IKF@!oiv4qMsXz{QKSBmG?S8+t(B~R#c&^bTw69eolXiNFwD;Phw=D}6da7Y6* zdT&+A)RM6=kVBedAg4fMFlWV3P@a-k;LfU)0CLnO1?Q^e3dU9GbQo8?Q*i#eFvf6I z)+CfihND`VqXe$%sgm@l1Zyp9co{EutckU?7}iA##C>Y8W!^b)%uauuQ)J|UJJE-1 zC77I+&Da;9D7h-al-RP?l)>o3)udH4gQ^@v06to4l~D-0bQ0)l{)mo0TI9ZxT^#9x z?XcIX13FkIxl3Up(`hJpY>lCehGllTmOk1*ICX>S1)M_`MHC##iXl-Z>q<2SGRQE+ zpa4Y|i)%q0$*$F*)gsm)mgzbm#Yi7_Nk}z?sdUYj-BLWYrj$A7?lh`W*Am={`Cneh z2AxlFMt4&cnVwIdG`K@Jw1c}*wYpRavms=R(Kah1n*za5rTi7 zu^qKoYE!fT$9M(GaEw%>7!_8bOtI+W0dudC5l3I_t;*t$BN`s43^WvhmuGA^3DctQ z*+);AyDB6cf~>)j!1CZYP9DZW5)2!A(AQCr7WXzQh;?)Yo5*q^SwXyq+c*`rAWk7U zV5_Uuf}(pogn#XsNTlUiS}h7%$bD$hb`U~H5Amv_b^crnY)8%gS!knbarn^Ls! z{qdfxw=V@tt3%A#!r@{|o;8zoD9T#_j5uQja5U8^fF)C6(YhtabDy!-AdE+R{EZmr zch)rnQZEcI6;6ps`XRLjPp)8(2kgJp@XSz)Tk*HBm8V|7kuIjo~pz78Vu?aNe9b`#4#NcA+xL3feD!i*~@iOQc9Jn zk2_#Njb47}X%(m3`BW-p&Fx$~J?M67 z#X@Hq3h3uXtWw~4F_jc}PRK@s7J8lMoTTCX!Y^5@+~7+VB|r3{<9LP8G6;_zJ(&~b z&`{7`FjVR<;RvBX2}T$NN<{^o3Kz^6u}ImBu?iKBLMxUr85=8DMp1YyN-4kgYXywr z_2}wq2tK-F@O#}oT|wV~qCi(v}CKS^1ZXe+n08 zjt6OALu`g-m*Wy46HL;38 z?xA4?!YQ!LHkQ0&e;GT&;waCY&rzMXCM0N_?j8%VK^?l*wi1Mm$C767eKf=hg`o=A zrQjRT;v$?gaEX>bVoxjQTGx-jxWtAn5rzb6j}p$pgC(%j_GqVIiZ|n z4kr|kmlI^k_==pk$7OGhM$MXM(Uo-f2P_HucLMrPoLW9+35BvtLc-> z9hsZ3OtBZ=awlw3w8iT#eR03ssj8sszq{XRDUAVIsCLNeGZDI)N9xD5CTNiXInLu{ z9$Zd%GHXYp4fT(UB2-`=p6AW>($CI-l6tQrY_0wxeVPWgrT>`%N1fO(IR)e3-a@6s|h zz{R4b)(Z}XYX_=>?x^1gIippqXpPQdSkAy^ zKqe6rM6w9NMP_2>MY7mYIL$exp&Sd_+`BdGpY9HicSoJ3S`B0Z7Au$$tl^qDJDk{m zH=CH6^ou~>d3n;4fumM*QhF90@kBdXmbS9bnQSP~h}hsEksAXmWq?FFJ|Zi z>+g<^c~hRCK>%^NTWtmk8|o-F_%Ps$ui40Fe%_m5*gGHA`#5IR+qY$oeAdF+9CYHx zPO1`0k)n=~m4`bEQ(%y{u+9AaTT+Pui)G0W(2}P#Bs-z|IW12+IhQpP#g% znHU)~(-h12^C^lJ=|UaOLY^YE21ok+dSWuLIpx+MGnQimObz1Lz<8u%K7&b3=Z=}j zv0Lt>c)n$4PE|EAxkBaSY+n_{3GLw(#+B0(%*=9&!Rw7i*z*!#M4uZQWB2-8l}M$4 z-LUd;kc1bIuLNTruuGN~VL4q>I1ss|GkEyS@qD5!fSt?-i#bJ9vD^1Da)u=b=CZcU z?K4BioP>xb zq!LB_gFH1t_BO86X+f&uI^{ozZQL!tZo$_ld-#D2oJ#;zGV9d{>>cwfX2~3Z9<)s8$B+|k` z?H)~=;tx|uvHf0Ra)&vglilUx2;jCK6~pfy2uat$SO3N(kF6@X8IMn9bR_hzi=xn( z@@NDX$=y-RLQBfvC;|k1({Q;DG8in-Or<0;X`%?*O_=By6M>4n8lMys za_ZOpNuouiI0@?VWGRAC|1P4D*-6on@>zx&o0AfVgtaju;6n6;?mb+zh@<2u#71#V zhzXAUI%S>VIUeaE_W7SMb6yE0wL-Etu{e=paa;&b z1=|)LI#Lh?t$pDp46R?$WX2<8#ac_2{v^qX?JEm2nc8pCr_4lLy=X!LX+qb-D}HIx zXL001LG8fELdb!uVudDl+boJCr%mT$dBb(m^H-FvMga5h*gvdvIej z20BJBB2bAYHT&T!JuDv@q=vBFDdV`&5w;s;c==rDV`VfoS84aiIAFjd^;uVIgCtCm{Ke>8q|HF9vg-o{Cy-uho3u6B#GR2uge`pJ#N-9jGA zt4AZ1$gw}WDJmyAv~(NOdMICJ21=oB5^jD|$)4y8&-6vy|4biCNy7A0IyW)RV4P0wYT}J| zqLUcHb>m_7Aor!6M95^dcm~JPBK}xd{v5RADH_-$xmYluEf}AflgW;e{!RXJdZJtiioWHd185_xIM@uDwr%g zgvpZQ0}}~bWUD~0FfVU{9_or;48@C@pZDrTs)#>blwfwIm~VkZwK_IzIjUL}9gGtQ z=OJ{Pr$-X_WVcaov+2(TkJ?->*k*lwa3Z%?T;;xi$%D^Kf{~0OcFsc-vU@8!P&{3> zlq7t-JPpMQ+|xIcWQE6>TOO*c;XHZ6!eR1;g^T13i^9o;crRQk)D+ zAQw$aZU0jg59T}<<#NB?lLKFVto5R;h>i>~<2;wT+yaVARI?LhjoQJm$>7Wq7r1&1 z#8ekUq#(8c$yc2E62?);NK;566IyCdHq9cM|Ew_G|>g~F|b&7!c9lK{Ax&30KHAkAhrHS^3; zibKvqz%U`A6OUi?C=dcV+XtrE7BU8)9pmd8qW)NY=^YD7`pJ&Ig6J&4=*lwn4b1#hw^otxt2 zR=W)+jLWz#bp0}wMLE;=4^U+5PG-+ozY-8=N95vdKgKhH(n;h>3cF>9{s`M&IGA2Z zj^}Zibc%Ewz_JHLygi7vea z%&4%J!gadV>1`y8u*RLRO^~&CSZzG&<26|a@@|S5q==3)E|09Q)`yK1zs{hBe7xUX zJu4 zIDt+>eu!?hekp`A2j>PpGhuSXKMZ)f2~@`YDoM ze^L|YNS&%6bRbuzCd>k(FuD%JDXXx_M2W|dugS5!LV2c)$7xSYA-xDWuaIMz`HePU zpRHka|3s4U9gi}}MViAR$;S4}SAUgHCY)IO&vsjEX>!wDqNDndXG;dbpr0*#+q3my?yTTy3f?mkfUx|- zm^kd`LNn*NnM}mKJ;U+|oC)K+-lMxwVlwnSL1Gf|yznrJNJHWkm&nA7Dl=X{GO2nY z8r!><5-alZETY|iA|c;7Mb))>dlbrd1(KOU!1()^- z)QQ)lC9!2#YrHw;dVRIc9mNk-`LxjL;JEeSg4nX%3Pcm!Szh3>umxFqFlA~-%M`%~ z_Hw^93|+wEeQ=xDIkw+Lp;#z}YbdmZX0#gD0@M>dRtMBLy)c?zn5DE-Z?!QIH2YzU zEcdr^L6Are4f5&+k%lyzj3_fH5LT3hVLS+!g&i~95evSu5Q7zjlSOni`)!OZL>ny} zaltja4IDPl4G&#V2;J7vdvJkZo?@G`;#@HGP6N!lVFvM*VkSzuDEC$s?80EUuJ5Ql z*6y)DRo(X8rKDku! z#6T`ma3<%j8gT|3bt8u9jCk6VGc{NJkxXNJwS~xK7?0j%>0xYQ$k8m}Z*zyUEQnUT zs`})BIciR85bX(;O$RfYL<5AdjURo0ixH?SDUIb-xdmAkhV|#kdS_@!P8=qc#lq`_ zMYNEYOe~7l(D;$8+AUDIz(ntVtsCZ!&b8Hqw^I2?V(h z=EAVPywGf6FS%iB%~$~wNYEO=j$q4X&XO2I=;6XDx)_+yW0FJynpuT0g`8J$6Opr= zdR03RbRx{$WF*d@wc2Zk3qC3~KzE=4 zQy^SL2*B#JNwJA81V&Zz;1fc|#xV`7v0t$JnnrL~%-sAc(w@bwz*pDAs1Sg zj+KG-S0QmGW?`fyj0kxnDSMgQR8T$lWZL z__o-tcZ{t(b0>E^G2_|1gM=0-_Czb4E2qd!=o&4*JSjC#)RKf}dk_QDeKhyKBnW(H zPv$*~SdyiN$q0lebt3pS!!n6p8ygKohQ%`xd4A!->oE}zPL^G<5(O<&Yj#I)vhz`? zcji(y5RIBpX&d2J4fDM{$xRzhM8DoHmW8D*_7o|YZHEnuXQg6Fst6}%E0f5w?gdJp z7ETQg*F|IdjM0(Q2uBH4H=9G}_Ulki2y1xW8Z4#$ z<;QYV8RM90ZZ#c3OiGiK|Dm(td6S9m}=~ZPUW~wjr>z5Z6M@yKulBck&@35U% zzq4SqhK2;}#Ob|r>QlC6i7&=6B20>h4`6inzqhhf)}r_U4%g+1&g!bwmiDt2@I!pGe8G5xs+?HlB5Dbqt!)o8;^`M<^FbA!ga^DjJOzjjYU>~Sw9VwWtgvk3N9~f ztVFG~Va$M+YZIq2>SMd}tk^Q50o;N-B*EAKqX@96qKOg;!15)NMv*!vGN2@?TAHE)u%6C#*w`|HHiDjdVn1Z7e|Txfpk8{)TALW^EZZivffYZE@-9|89x`X zQ*e~($y0!JTG+H?skJQp13^sLQ!~k7_b9sPC$O5OGr%N(H92qDCc#Fxw~iHhWAN61 zi^6T-TqGmO0uIIF1?NRC%&g(nMNnTHaAjX>$+lvtI)ZU{w7VJ}YxRTfpo&G-IK%nj z4o3UTViL^(Vyxz`Pjm*OUJq+R!lsnIhu|e3PHzlPcZbKjBP7q}&s|#B7R|=Po_!Zv zJ#O)g@GQ19rW<9iHsei8!Uzz@K3$e|y^k|2;m#LW?M2+k<;}sxqUeZAF^l|3h!aB3 zo?EFGW{iS{*HJ<-*pX&b22VrjTMJt#)(VF6WmdO5p-sd zY{(oY_g&Q4N#P5wCd37og)v*Ax}0CBV>9*;wfk5Y_Iz@i#yj4w%h~_tY7*x%jdx@; z?D`Zf&V$XCRRiaFRWEdT!mRUS^3Yo;{RsC&XJ}D`2*7lvbb>;9b$j9?$Xhv+t(!Y_ zX6+Ds(HyB7Ps=rG8Me-Co<(6<+qSr*2uVQEw&rp`XrFRSZzHZVNr^-Eq+Bj^@d)u{ zHyhDWIEr&*aP<5|8-ud8U+7Aru)J0~A7}i;0Nn!{y%-89w;xaLF{?8c!#QZ>on$6mn~u462l^fD_>-a|5eEXA;Ti&=eGg*Q0f#Tij`yEf$Ed6b!xzNT%+%Zbhk z;xgzdIdNiX4^%MJtTCM~&jG^XClOQ26{twlBR}V`LJVs+1&>ZW)By|7J&pdJRVk(B zuF7@PraptFLa28~xZK(fwj3Iw4jD7>NXVm+Rw7wKYizmJ3NwRaZu#@mBA#1#TB^v8 zAEz4Nq?x&BaJuueGZ_|zaPgp943Ai?-NUc9g|oy*b4-9Z4XB|08&`mRG{YD0$qAZsd~t zk?LQLu7r(C@I!3OJxQx0djJSw31}Orrfz7G$*Tt>eEdSdt|n7s0A$aI!7D!&0P6?n zkW@1DglGCV^cbVA9`aDo zp}p>Eng#_BwEdt@bOdnns340{q6h0&djJS7JaPs=ui8_j>Ihhmvdv@lwuvdNc8bWgX69KVE9!Y7{?LW@dR@_J6fG*wCMZ@BXRqYH~}GKI$PAh2a6J1gQ6Kebml~=Pg&Un~Clb`6Nl%V&{Q@ zaG^Z1b^`NgU`!bV7HuS|Y%#3JaI>x#Lu7JCSADGGIga5*g0RXUvSH^r?%aQ9owiI) z=`nZCOyF`(ra!!#Y-xtqR8tJW3a{8hK%(5NnbfJ`K$ewO8{-Co^x#ogW8XptN4}sO z8CVOWL_GLE%Nbq1aBUy!B`78iR<{^s0qEz7Do}q0K-Y(dNKodHnT*@^#6X-?=pimR zGe_32qa2$CUvEW>R}=^Kwol;6mpVX`QClAk2h#b`qS9{?QZdZQBLKeD#5}^`qZ1ZP z@477T3$ZDHz3Kanb7;+562Uv2;#NjD7rr@%@)VL3;FB5gur0cR7SE23U6j?hUKHk; z^7F`A&uipP(*iMX)34B zPXHmran5{Xl0*<$IqV@y1KOd<(0p7FLuyth1mf1&;?oB=A(X8mE~?;*K{RJbte z=sIhj304T$Dk&?5RY+D0t9(SK`NR@AKN{B_kD}B1!DBo>rL>`XYa51+&tj@+Kdwu% z&U&^&adR%lLH5Kfd)oZKBa;-k^91F z*&|BQ-_J`Vg)Ax){Ok_AqddMSG#8wKw48gGN7xOOBAd+a1U$h_cjZErLJpXdD}P*Q zSfc6oSIi8Wx7WZNM%ZV&T;#{#6Gq0wp+lYwIB7iD?KgcaAu4z#7dBndVuP!(HE^=fihC**VT2*car#09uyX;t2Zic~Lp9oH?b>kMGJ^LDRC`uoKiOhX>V0Ihu#Qk(wU)+TH`9$s&jc3xYJXTqXQBz zwGhk6H5CvuQKPY9iC!?C$W_OCjiiFkeCsZPh_s|F6N8vkj1F8e4#7WHtUkqRWEnZrD64CIw^xp7pVvciD5p9P`Zcp^e4g3S_2O%wCWgY z^Q-6?y-4R_gISm;2R^K?MV(7A%#iN>rKO~Rv5nsbAe!K5DP^-iaH4IYRvGLdAHv)nvTPj=v>MTN7!vw8 zW(*{EAW7pGG6%8wm}<&iHfp+l>LLaqEX}ixPs zU!B_s=oA{!972IvKvI^%TZdAVC1tkip<8c!==;y zB7WaACEvXY_n(^$g5R1Bf?r#I^-yuEHcoE=u|82lt1pSZV`$w*k@A%&Icgsu=JcjEY z4ekT@{S&wd|Hrs*LjGTb>m05fo8p$YU_TC_P zC9e15`Yl|~dvOrF8rOH=`XgL7y(9=;h3i{z{U==4-G|?}z8TkV@wplV*Sr*U5Z5>0 z`W0N8UKRwWaJ?7TZ{fQ6xDt^@1BpecH_Dk`hOGZ z6Yj)$2h#Xs{N91z@460k57#W-z3vwL#`Tl9{wuB%w+6w_;QB6H58VhI1wG%ABcFeYZyy0KckKv*+rR_)xgXcfNbB42dj-1kBQFSoFW`Fk zjv%Pr5ClJbC-eZzV)Xl)ac8;xD6YT5bp!PI>rs|0 z56XWXIMi{)gQ|x*-|G2wfFo_OcWmP_u>5)P&c26zW-2k zSM~6}<2UKviTbJXZL7a&UVZBG;AZGCXuk^=^Y9<=Tk)rt+gI>@KWxAasQX_6oYF0} zJ4#Pj@5$=`FiIY@6?t}N6257NlntWJlV{xy={$ZBu>5}eZrDv+eC8i*6#1l%D_ig^ z-n|AF?Ud4c+NBco_J6>}{Vnd#!M%p-mAHnuF5w-^=g0B<`?yH^2H^jirt7c8?`LrF z+t1=oou_=MCrUpkOX?5n2xZ8!{{`?unbKDBei!TsX_)?Km(=_3(Vo@2uRJ2Z-w7MW zKlOfAgKcWh>btssI{Nl!xX*xwdVe+Uw3Cm4<|?lD;bLC@6KpPN)9&7nx=DLW`^z%> zM?CXe1NYyEo@tB!Z+vH+XI&;u!cZ=xw**`M5H4lczX8vD|8d+^yYi2bTyKoVo zc9(UUdZOzUzo|c#Cw(~jy!3tP_wpP4JC-YbPTD5LqvC-+Hu+?p-i!3e&yV5GHjX^; zH`}5z+90+|>b=ef_5TRIkp}Zl8K}03W%mD8{d4&N%meevGNYYkKG?QXj^vlJWWDEm z<&%+rwzVvypTV7ZQT-A2K?qB~C~Yr@N4m7Pq|3HK+3=ZtW4p<3q(NVZIOOABLN>~- zxO^n$Q}{^{|L+3NAIC+VqMvg6Zs|Kc7w>47*oIJ!lsRn^`!AFwb&ocLw(2qD`7m&) zACv>1NsoW8!ZYRZCfrp!^GkSUS}YH}99S;&i>SlIWnYoXA^ zU)SETzD^@w^s`j_g+3wuFXGUTXZ>M&Lw}35mG9~Q-VQuIvrj;ugk}C1^27k zx=XvjZ|{n}5r*GCfjjGfs^1E3^OgVa_o1JHKz{c@nSaVq`Gc%Kv=x*y?F414bWhh^ z;^_LT{CArU=h+0>s2>79fA>HT{1PtOr4QoHbd()@8@_)4eB=Ls@e9T@SdMyJ@%{xVf&(N^zXdF z?APe&-+jL)q^)H4k%*7K$6fhcUqYF%onV~cW4ON)7j=F& zbgdWZ8~J`TdS=JIS7%a`(EnbHSmxv~GkHsiD4fjYqQq#sTn zgXz#0Cg0R`>OJ+Jy3aJ29^@WQ* zkPIqE(B|MG?B{V;jdJ`Nz&r`OXL0>1o|!jOUYKuJK0XTkFXQ?s zXi$g9_bc&Cd8)SJ%lMu4&+k1dJoW5 z3qJUbFqEa@kMGpq05F9AAnyGB8_{om=eI9M?-jhdEB~Lr?>sJXpThlHaBX`;rpx~I z@8dUpZl>`{yjMJsr^Am)9u=+k;=AJg$MF0+xNdqB^#vDYt@>%SJ&F&;D;R4a-FKXj z??b@<7@qm3;Jy#<-hqoWNt<;41{e8w5U^o{`&qoBZqa7k5WQ10()TZcCuJAOH+f`U zsF&1N_N!^rC}yC$9)Gx;N=%lyno^5Hk~`5pNEG%o&;CgrDO z`#C%lr~J6gC-X}=xbkbtYg#9nwyJ}CW*&H_{b8Pe6nEx@`DMOovvpnD2Yv`o*^|Gg zwcnHSNP7HZ{*~@1T_;ccrqWI4hw|a~^dEIN{Vx6ceZXZNeh&AvuIsRhC+fZ`d-6rx z;H1>KJ8{2=OSPrMr;KbeQ95cWGnMDZkOu7^<-$HjI`4V*i1x?Tr%L;y%n$i~3-aOO zU9V#%{#kb9nY8%#J)rkFTuNqtjc2|motsVt!Q;62$9L&^Kw59cck=cL+&99PO8>Vb zdQ+#zd@ybPvHp<@8tQ32=5KJ^H0|a;(Wh`^Lu#S2+!n|I-V|jjx{bl zDETj+k$3W^{#al38Qv@1Vi}WH1<(7FfLFRsUx9X6#Uc3pO&YzAN6+*-Z{IEL#h>FH zWp(>m#4B(SN3}HJL2cn*K`?A;y*AQ z-FLWjSe6a#JpEnr|IOfsy#GAzDh@zA)gDtWdYk;0fK$HozdDa`aa=6BbGQ?ae@d_T ztaOO9SvQ#G4*~W!aq)TTf=r*!cWckYP5*WA{fBT7_8%fx!rcD^V!zS*cj5WhalQW{ z#^iDFJNauq2_G20e-GCkcvgHdO}2Ne>!eHge~a%=eHF$basMFhOlvppYzLVRVfe>1 zm=@C^?ymtx(YW?i-Is7zeud)Uy?9T&FW^o%KF_>b)@jylrmOSB7#quw zbxpzl4B-EBgfst?EEDobT~6x~->W!aItIu(cs1%D(@?gEI#vTu7jdy(DP1EB`RDx& z_@?*w`R+UMj{PadydFi~l&w(q=>2&2bAVxcNO;EoSua_y`J45bHiyqF1NvgLJN&Kw z^tMU8WBKq|l_8&5ZtNrXkS68609x$FQh)hf|Few)G46RaW1g!2sMm27?__*c#asU~ zWJLb9zeehq^7-z?Z^mp@JU1P?)#Je`j!Qb!P5QTdre8=Oko7ZLcL`iLa$qG zq)D4%>L-(i(&z679OrTD!NvDq!0&T-W}M(z+-Y;!-)9<3Pxal^oDY2-2~e4bqlgSZ+o3N&xC(9UX4IXV&@aQC^z@jikAF%WHP?uJIo3nQ zPN)M9AU)P|+Rt~s4sCEf8Rz&tyyLfL@t$%w<(<4M+sgKm@IMRq>le{qen{p`#m-1a zwWED}SGxOCc;3{Iuqrmi@6;{wtol&r0Ha{vk7s^kdcTinm4^DR#)}E_FX20wWTo=E zuPO5}#9il|GGHDFM?F&c`x(G(38jpfKV2pl@m}RU4fiiC1C`(J29J8#{S|(j_$Iu{ z^DCCd@h*k?EZ+SDF3OEGsCUX1QFfFo^^r8FXSB7{C&tPYFaHF5>dc;Hv~{?s*NQ%A zkT&H>8Y~0q8EGlJp9PNK?fx+yc~WISnxwyDMbh5%G<>NRd>ve`#JjiSqK#30;!opu z4d2o}hl-Pu?ziImKLF08Q)+yG{vvs%OlV`sJ8cZ>4*MBwKc;s}IVia>en{D{ou?fl z-w#Lpek<;({*q^vA0OVC*EIjC-rsi#We3{-8h4JnQ2xw2?bOb;Igg6g=YjJSU}(d> z3wM=YmO1r+vbr64WXzlX6a6~UrBA1iFYw*f^5^u}nCeR{Jt)&v{v7>G`gHW==+h~G zjy@>MhUKElM9JyDBY%^~>h$Wk+(?TuVY&V=-t#`wk@v60{l}u`Yr1e9aD5rq_u)F( zli!q1E1Yk`djWUVtMU<4+oxb3eLd<8F3O$dtL6i~8}FFL?!GL0Rkly#w@&|` z@tfuJ!?=?#rbmC3WzF|Y?=hrL`7uq^p8hEE%)Bwy$az}San=Fmh5ADOM9Er>og5uV znXIpY)=)lw4$r3X!T;6fJ#V>;7!WSb0aiYfuIsctjKQ-l*X!;(@tbl~eTZKKK7aEs zue~hNw>J6Q)OVJJ@~c^%5v*LEFG` zq`tFUX|HM1()Gz^Yv{YsesaDI$0|7%!}&I>JDoQqWyo~duBdv_0#2Un(ssUxENR0{ z@>F9y^yi+%^%`89k4byOz8>YvI>5GqbD}6$&e33=^ttf=f0+Akn(wdb4Rwy?NgZQ- zqTZ?c!S3u+(!c z^hCje_VCI=eYJV-VNVQ5riWuBBb z9WM3jol6VdrKNnxg(Ymckt04?kr#Shp;K;}tCtrSM>**>mb(ksKqDs~gc`JPv?@1H zawiHz!BMi^<$itDO^PSzDkD9X@Mpie6TBD8%=7x!6d%z8~gtP72-Q}Fxv()a^bHtEalUD~= z4)10LG#1Fvp&WJ;T%KAfIP9#Ilkj4_-)~_PC!=Smv~;zBLrDAe93#5A+!$OA!yMDS zDh%W*_QA_Zb2-OsL1S_#VCURCo{_7(YBLB|^BUge#^r8qeo*;_Ij+EJzHJqI)8yoP zxzTQ6*RWiu{6g?B7%cUCvjQj{d7GnWawE80zTw-gg`MS`I>lBfhg1)zr25zHz!n48k1U=!C;wH_vD4EcUSd+XDZ|v04$i zg)pCJGh7-ZylPE2cl2K6ZzM8UiVjm+nL3o}pEDIxSz~=_+^+TMcoFi;;#P|X{ z6F04hKR1x*Zse54T656#=@`)#<+|(r5W5JudFo$Y&F@AG!Zyxta1)BeF8XvnzG?*T z=sK%12juHV;V8#k4BD;Swqku?kDkP-4KFRhq`+k5tx6K1Gsv#bb{o($EVK4;|RDRI?_l6an6NKE=@&oSj9jZ{sZV+Tb#eeYe;EBZj?CU<7wCBzi@In!K5_7J*#u+j{0A@7TJ@ z62=gp9dwPzX-Pw=?K*gNC`1}n2UE&_& zW_=_N0!CN^d+Z4IYH5J~&1B@)%k{RUFCUwlAx;ZNu%*V}nuU}yVG0!BIgqMSu|Ux{ z7lU44Fbw|{!Q%dj3rpC7aY1wlT_z&Vd4fsoxeUx^*AloeBVpUePS{?+K86DXyNf5< z>2?+w_iuIb1j_DNZIVn1#HHqfqk)g}7QyDoT|zZF!}dZXK`(?RiWRP!D-@h&q#!H? zm7H!uk~~`DPS;@$lhBZ$-8f}HMZeM2G$%0zVW%l{*U_G)FrYLGjdqu>tfbZIR zyIIlz^-^Y`3K4B@`9$z7n;WLAjU?WqvGr$0NPc3hNfn zNPf$q&%WXU|7qDvYlr|Mb z?}t|`rdE7+1+xSIy$;6f92vkS)Xp@l4x>l_Uk~hePzP;S2Tsr!!U`Ey$ZnBKCYY>)bfr5Dbs5`W%jskH603t@3VWWk~4`$&hGGPlL+=X_yii3E~ zkRt2Uqncfr6tyLLR3c)E5dC$_j5bBaIiU*`TlDrY`rccy&EQf%IJyo4{^pD+m_{7~ zE8LRZViOdc3nmH)+9$0k07p1af!G6t3St#AH0+&3#c#84on1gUgI)aY3XSl)V@Q>sG1_P`OYG5Ftqye$s*cFIO>ZIy!kHCI z0FnWn2LfeKU zmXHP1MYWNZS$naJdj`~ zHR>AW)lR_Hw|+KCyR}qoJ6vaAF`P^UQ=kVHPlTVFEt^Nf zudN(AY%;W2wcW6ISR_ua^jAP6v6VS<;D$3EHV^% z#3C?{WHm^48Alcq#J^^xkpOmIId%~mgEbKYvbmNCKoMz`-7cP^ zinU82o6K78(sFIJ+pM8uvNBq%V#P~Mo(|Td&+y>df$IM1J+(zOC166_h4GA^2`I$g z%LKT>^B01i09h>NnH0G>!f9h_QN;v_EBuYh4%4oq$uXS>Q+1%gkOSceI?V-=|h+7S#{8LqZ5$8*>k zTITUf02GaF_9;6#qkfy0Su9D8?9)k-a7sEpG&zW2DHFlIqJ=><+lsg(oCv7f3NHm} zi$W#ALWcyCko;xNbP`VRctu*)OeIKyKJ6tOj(3L(nyt^F%E@d4j9%N8U?+KSOhQQl zTJ}SV26U06D;v|yO zjvaY$@sT8=4Sg5qXNlAFCS)TT!O+5N#nU&;kv0<<2Md-4Xun!Z>zLUpAE*`gqKwpU zk)4eCH~Qk|wVVUX~Q9>&(H!4}gnb{bZ!4wEyj@bbbVjW|PxEAsf zAY4Q6vH&qTS&n(>U`;y4vU&&axz`^lY+kPSn}dV*+;iYQ%;^f-&6;iXQabNORCwa6 z=skD3d2A0xi^F!v5eJwrI8B^j<(E%$y3P$qi4Y}1DY$RZRM1BA9Y@i7dP%)u)yPb#rs$GJ=)10VY` z8U0kC5K4bwS!brf^e#092i6YUJa6bhfbEDS^ zlg36lpdR6JGIQmg{r6!g1YRZoae}Tk@2TPPf$?Mzf;&I~TPoDJAS9Gd)i~GfRKT(CU&Z^`HQ5p z8e(RQedeg3SE1eOQlCv|LSc&K0d<+~vc|mKV$Jv$%ngPWPI zsou(n96W;oC(+hKz=ux-DX7rxVyoH0blYxG4ifls`t*TA7~oe_M=ZG- zq0^`yt`Zq6FeuKG${TxO=*6yb5{5mbW-X)y85WU!fwdovR;M?zw11uitP|$_@MX8u zx^+vP<&c4WP@GWO4$G!nYa=LUYYj z;vC2Q!p6#|b1Ag6>$akbg$9d!Wu12Uip4vQ6I?mCusG^8ZOhSgI7hfY1{3Xxd#a&e zQqBg>5k?<-5@Ts)4ixstwXSN2`9g!;Lp;$^<72P}<}usMLJWi%Yv_37aAjMS8dISd za%gZ0-@vbUWILYARa`u3k?lg41IvPsya>CTj)yhS{Vrqc_hC97wvQ64ea-p6+9AX$ zF+S26)~|?$(7Ng|3F;WzOab<7TS_G1_=cNV6K`RONnw3xNihjZ3wGsoy3@exb&cypzRsYH{i#5z_rxoTo!qOt938;Wd{k|a2}u*D3stEB=O zu?^~gpmfzFFQ`SLXZ#5EV}lZlh;3B*MJ%+juBbV06RDBlUI-!+-jji=`l5{G)zF#J zqIwf0Myn-Oiep*_C*N(*04h?^-K#jImyy@TkxXz}JIg|HCGi-Tl^5Ld#s+Ge#79)k6bGO~z-;^kmhp_Fp# zq$M#lscKiDLg_U_1gIMbO3Uzp88_|uOL9--n{hMi!4Tv5!%4O0LE|!jh4$g7GzkX%28e+s*WN$2tD0umoN*o zDlRg@neuZnU1YHDE0zSQX^9&tQ!z`D^DZ`Am|R~F?S8lshDM#M$CB7n(JNzq7Fk%; zJd3Q{xb-@gd#oLLaE&9{n4{Q>_98P2$AXosb{0I5c)p98;*me)l-WW|Vpyfyjt;&o zgos_`xc!##)sU~1ph6^2vVM$dQ<_Xx9`)N&p7+Km$FtO8zvsPR3DErf{ z1jlCBuhvkj3ivT5qFgEOXEjaO*vrk=+cBXRjJzkiP~w+E)7-)o*w_RAz(O>6)?B^P zL>k@2ex3axcK&&oCeCbO2e|+r2@;%4r6f98fHoW*t(^4#lQhDQ!I+E+t@&s?2?SZZA*Ixq?Pxa$OZIhknC zW}&azZm+PP#Z)orjCG9*vZJ3~s?}`4VH(yjiJ%$6QgaOUFi0E~yM8_H3`>m_$3o;{ zMD%EZifbVSm)x(?S@5x|{zk-sIZiEvFV$Mqyi&F>p@f{`B!XV7H|urmj45wJ>@FmJ zV8vLiv5L)zqV7Ycx<{Kj%3a7)q|KWd+1Qhr?4tX81e2SwX7HJ?d66egrA6<@aXfi_ zEUtXS)p|>mRQ4SD^8EfowVQ&)ceqIn%O6Bsl($R7`2yQ7~Ti!l} zcRMQcQ!fk3*S)9w?KAH#m)=u;YvtYLTY}0L=7S$BSIgz{_DcELEpM2gpPHSi++Eo= zGu__umeTyL`MLVs_2s$pty6Q)xwX9Qxzo2j_xjf!m_Iyy`}Fqd8(((A{7uuxURo}f zrsiii?bvev=Iz_2XSP(Xncq>~UP99MU0Z%>X}Y`x*YxA_C#Nej(|9W1S-$1W{JH75 zm%VEK)zh11O4Ft3&C^p`%e%|ZD^1^g-S(+#u6gc`?Y9KMrqWFL*3x&+m#2f^`==_m z1LAObcj>LA%I@<0Tfet7^F5{VzPaxx5w=?SxAQ@81c{xmY?*q;bQ#c7e>fGCxBYDC zo!9(Ksr0j@L*m~}>fg=5%%5KqEbS_9E#F+eMf`VH`L50PUbC~jY37#M%G}GhRknUp zW!t8iFI29%t+Huq>y|qz*HtQI?Z4N~wl6{?yl_Ld4J`;@=Is$ zt6W#UWAmZ8%FZoYrmibj6os2+U$7ZzOY9vpH&)8!=gwS*-}86PpO`<2+*FYNZKcm$ z!~EY`{>$y9=ayesLS8?zwLDuoRhgaIR;f(gI#Zc0&&|%x%x~Uwe#`9UPnCl5^MYMu zvK+IDch?5h>GG6#gI}A1vvYH}&p&wKft!NzGePAUr8-Tj&Pn9=1yr0RNbu~(N@q%E zx1G5)DF10GsNjlN`{fc@`!}WX-DGPQwCt0hITg%J1^-l<3h;krDtJ5iz}reNR|&oy z9F&4mC8$(_Pl)I8Trf8m{5o!>xu7x^{F#9M+Nr7FJ8}Ks6mdT-{w;3}=C%gEGqp7+ zZ4D}0gTKcUlAoInzP2(Ql%@mx`=JWye_Z@qo)6~cgHKoHgVKC}e?LE63H~o!|2R#U z_s#I%^7deEd+^;e+k?{fpt3zE&jxd|!6#;BgVJnJnGHTOgEUG3B=z=9;JXyO6Ss0F znC}E1EZtbXv3z}b9{+7d?n<4Y(h15lL1iW=%>?Be-aP%O%KxnF3@U$930`-g{Jiob z4KwBG zXC3VywGTV?uf$mKPqxwn?KzoA^2EzOoIQ&V%ersls^ekpI>e8c7GH&(Vh_oqr* zf4T${H?wKe^e>dAKS`rfnSLH>)YO)3Q=7KH0?t9KGv)g}TiWy)el1UbwzTbYrOKx1 zndx6HP5)vE@YB;E5972bJKh<=ZNi_lrz#`lizMca>7|_?B26JKk2B{<>0S%UwbiFpf$J6_^Fc z;AYhE{Zq{UP0aa}$~7gwN#u6()Mk;}dsS|KOsLuKmdf8-EI(^nv;-wB(#H<;TS+%{dAhy9ttwRyf01kF@f1nbao5H!Vd~f#3xb9^#YiY-(; zK{c5MvB_xit-|J)aoT*FhEp2ADx2h;dN=+$rb0OCMGP=d$_i3cT5`+$JnW4UefBs9I1aaW-H#G72!4AUlKT2&nxHI{){Qh!q zzh3Lobq@4I&53oNDS(sGHl{#L;&0|#RdaH{KkAmui~Pm+giqEmX(r@1QsHmPmwG8v zh;p(^=7bQ_u*|s0$8zQD{b%5>Z7bbFi~f8#0T15y0J466P`RJ4_Xokvd_Di3(&O(g z9S!C_Pzn}rsBD?Pqr7!HOh3C5&n-Ozs==|!bEfd-hRWA~%9~5Oz6Orb&B4iSaH2qn z|A;5LQTGP-N9-Zzs=Cbz#s&L972ZnedBMH%cE7xVw_Cv*nvh4gp;!gk>w;h>D8e_n zj$X+f@JcF=1yAp&JdYh4+1WWPIy;qXWmo537|sWud7$**b8+4Az#T#5?yr;%{&VST zOTn|dPz>{x*EF;)W0h2tL&J4!R+m_IowwI1^5|3@C~KP;VHb^RrxFg zcz5|ADS-4FW74+;m6{;^R{CG0y}2^?ngs1jlJxTx=}(pDSG#s>_2Q<>4+lRUft0tsZegMHxEjVRB4xHR`MN%-2Wb1&NtBBv_fDu}%ZWB^&-_W9EJUoDkBU)mx5 zyiE2XJ_F6|U=-WYrY z?(wzP?Yw?^*L-Cs{@YdAdDray)0=0@c-p-4mTQl~hE-t{)xxu8m+Y@l zxq{$)<*TQ*R!&Xrth{3C)XX*0yXJPx-cY`$d}s=QyDBd%FQJ?E>e9LLJ4)r#Q%?oK zU%-%;9szz8Zqv@n^wb-JZ<<1fVN>wIsZBv?6S_R}!S_zhp|d+5ly3|wHwGV{x-lr- z7?gJel^wy4PwfawJAyL$6gz{Tp4u6db_V4a29*~EpPYJOPO29(^{EvWwRYg39-lg1@Znnwc+e!ha=n?swcezhwtJAo<_??OPS4 ze=T@?ynG6s%-|kGB%WaPWKZk*+HA1pHNgj_cFgU*asK*iOEa@bQ(B}yUN>UcFs=!ReAdB%hMm7p8DS_ zm5*0;%QDP|C6A#P4jlt7|IMCREntBK@bGRD4JLjY%z&3Y9eCC-i^Ir!-gelj6E6? zjlIM~6Km`(YAjLX{k;1Oi2l6yKL7vo+z0k4`|SGe^{(<=-?gSii?1RvHohq?NO5Q+ z&KL2eaTu(*r;Y4Ab<0uQ6G)Pfu`0T}dIhxqz=D3^OloTP+T8Yb!qpK#B_9dzL*agG z@0DQH`yA!q6Lw=7X4yw$kZH6ypPQH#E;tU7tWkU%Xo@pEl>siBA%@9z>35tCKqQ_) zs!J+IxG(h!;w{cZtX3om}qJr=>HZ*w|6@3B?Sm zM~@9B86CKh?`|4y)?VJW#hn&TZ|w8@>U{H~Y$*Q7agfSe1XiFngz7C}jcmAh{*Hk& zb$4gE7$#j268S}6-`8Aw{>g}jJ^$ic1vl2?%mBOjlnB4*2SG?chPUCS?WP#duP$u# zW9j;4M0&I!AhtvJ3`4j;?~W6NMo9HgMcCQH(b~6a6YUYp-0WRCGrG1fEm|&|TZ0r0 zXTtbeLV4qQt3=M^Ji_y4)x^mfg9fkBG~^pmlQIXG!#Qr?992-eb9qkzkfwm%Eq0tP zoQ{!b$vilehwS8C&$M#tt$qX&6|A*%@_7~>&dlvALAAHiP~FxUhb3^+v>XSie?dLL z!`1a+6eghwpRQM)k%bHELw6&vAx{4Jj{$x{ z-GD4bCOi8t!FF_tgthuPug;#oUVbk--cm95V6jvLYhE_N+nRZXxJ?AVW8z$&9kI+2 z3!y>{v{%~NQAZfyOg^b!6`~+yx;3(;?pE2AuB)`$Z?QO!WYE$*^COZ z*L||r-t2W%ZNhE(ypS)5HfLtv!qS4#g#1k^(s=@*%56gbP7KXnixY!MYT~3xe-aZ@ zkdqXtcBku!o+nr05hD%fx>3LY%C z;v6Th3H`eLd{_{C?yLX!;x$otQw;rFi!W8s9!Xi)(hc)th`}O1GKB~H)IQRa!6N1Y zQ|+OzkgB3fc3ADYK16CXBGsfL#K|`mUwcDC9TejL=tszc7^+3?Pa;m4T3hwb_MMsQ zI4flrI(02|(PgJq7plols}sewH87{>%p5jcy)NS4iRy4Q;wR1vDDceRMR8&ZKM`un z_yN#fLdma$T1GfvgB%=^k}2yPPmf?Iu9$k`89*B#E9OKP6z%=o!XsQJn8@`m9$TvI z_hB3~R#jISV7>HxvHyDl5H48j^-QtWms9yN)|vSc;$yPMrG6(4%09QDUJf_U!itA5+ z?@+|*pGv*1RN%&87;av0(E#l0D;JStE4we&!Po40wKDfAli-Nk{q9!kUiRbeHyE>e zroB#Z<~aNFOc%IYn0C~`M1KQsJ!|>KGqJEVH!&t3F%QI0oVA14pp6H;K0~w5d)5|D z-n-S=RHH;BXaOF`Kb0}$_;BDf{HJi>*oeef zU4g04TcNU?O?vQHiI-~DuEE|)7UVQ=%}eE$UkR~P9wM^0+hz9lmdW0}pS^CJz3%dr z80~Cwomh-*_s2Xa?Rz-pP#n;4{Vcn%%w*AH3*(l{?B*xbHaR=nB_6Ypa}T(4Amj}H z=YjTrD))5vLJl{mY>|`o^VF99EVE^BgA`-^w`K8NU)~oWw=%{bE8G@%?5HhL;ul!U zqb;bSV)0}W>D1J#25B&I=$fE4_%Ki(1x>@_5z(PRn(%+`_(U88^e=u#c&dss$c4Es zeZS6nWvaw%NnCV|Y^tbgUIOrnJRX*8P>m5%sI>ntp;k!MFW&bm$NB1bU;W!tAA8Zu zfnB{hVrJc;k30gQII$B>x##-oJYW4bP`3uYosFLaYNb>Ua4Ys6*x(djo$9O4J@o~< z1=4>fJJwLllh`r8RJP~a+)gI8mYqD$K;py)CTx?$8L1oR4rf60eZqfC=rfrn6+&O8 zgG6uHyIihv9g}752y}Nrms$$H6u-6W&;=3q|m3r zJJE*dBeVi$Z;-xPi6P4-V0p7O_dV?#pP z=uqZ$P8TbK4=NHWS1I-merw^IDs~KhYv7wsh0N!c$+9nX-GnMfXgFIm;{vv9gobSI zYV(~yVaF#0Q`dh2+PH3bkN7#j+k^a>Ym zv}2F6$$riSrWJS4cgfAv;R@C~^u_jC`gBF+4C_dU%7u29&3Ei}HaXC_6$>0NAK4`t zx_Xyg>@EY@F08Y=e9vl>hdngP*uCqVO(xo#PsVh+$wp@SnW!(`UK^Z+6)cQ$t0t<= zxb>Vr8#~iX7<{P3*kq;2)q7Y-*{pqW^7gS5zuv*TBGmD2e2mLxe#HG(Rp6;OM3tGt zT=SLjWY>R<`HWDtbt5&?Cz17uF`t40+KEVXw0a^w;;Khoa*K8v)~RA`8p=Pp>H!-8 zC2GXD&kd)2dr|GQA9&vLV48%$Udjf1GLb zdq%vhGwBEIBDeYYBL6RonD}2Tva>V&WKnpa_(a(a&N3ykS9n3Sr+uVv0g83?4D}QD zW@$F^FO;4aHV5OvYLJF*z=l;_uO9aFFvppQnN1WALK;tzVq1vQKAdGlsFi?jeKib51mam44vKSeB|P- z)pRz2SE;76iDSsDA1|`ZdMSIor}m{O`|{`7m*Lr$$4&P3dwGKFbv8L6lNNtWHjUCT zr`JqWa;q@E6?1En(^Y$0X0`elmYrEP9n|WNYv)w2JC9e@>28f5HCJvK%mT~Wjn4!H%0_R_<&IYfuPxYFeTqz~hfm2}e~g78h2 zQSx<15R&OTU8~Q|@{?ct<{ZC_|5{qD*WR=Hg(v%!J4N^htIj{mRU5<(m+A}FGW}8Q7kT<|xkj}gqtvlV{Y$D3vJFC1JI87gm$<0* zqr7&vlBxDgsb^{kd;nEVL?avP3LkI>-%GHu!j| zWWsT>a)#)s(HbgZ1(N7E{}2F1C6buaMZeo<4ij!Ks=ZbITX@IGa0fZtyetj-bmN$) ztAyTEEl1N&%rt!EgrHj_C6xnS)_6(fx~b9u0b==Lb3+FnOH3u_iIi`a>^3lpYVvV}W@xC^FtPQNjxmVYHFlaW&--HfYeOD>@_CfhRoGk*AB)cclXscASWlvBZUA8aCYX=Yn$>^TmwdG zLR+)5N%Pov+@O=x=d1|JvFD3NJh5YRn=fAUxfB1eFxNqhJ5rZx7&1|OGb$xgwSn#9 zP+N7)=1`kCZ^LeBvS3jBntU6iA;{7Z}N?8>M+^#m5^5p z?-m^9c8(PMUKAe|-a|q^EJnEEdJ$bK!k%fXwdNnla@eqcw3_YCMH$YwTCz=EgC*OO z%O=IDCb&gJOq-E@DwK!>elP7DK%yW{+e^x`*E_hZ>fh zoz9l&V!Q|7CW>j!UuDPJTqESQx9r2! zUm%`hh6ql5oj9;?P}TV}O3?;y#{a?g@d#XJETSvLN)gTi-;_K$PLPT}b36O$-K`kd zkJlkUJkKh(cOs7-XyimuIRUKWFma?$n*= z9{*CQ&XrJ}aCC6q8R1Y9C52xK@n`A%NhV(i^^Ra_zbd?!ML4=LWX+A<9>wGOiw8LKz_D7m!F`t72cF_09!A9NJg0`C3P2H%qv0`x4cXf=C{2yx zXFv&vw&VOl_gks$(j?%xjPth!y&MTE$M=c=Ynecl#F^PRohCs@nK}xA^Ybe5 z<1mV4bC@Wf`*;=~ARp$MSd88V{odl{-8S)kxkKCZg!`|}=Kp4rxv}gZ5_nh0F>(_^ z?{3+Z`-{kLn`1LOxj%QEGr10(`TnDKZ05WRoO48j9I`ssQ4;Ifks4VeEj5twyoMcc z`$rQgEEhY2quH$ogM^ZpDOGK2)->o%*(7i*(I{iL*cWJPPjiIj5WN1zdgR*hmG#1T zl5etMl{v({)`(T+pXOTPv*qHt*m+wHlS5IxdD$5Ig>uoTN$~hmUB;y#K(w4l-Drq> zb#9oC#rFH`8tc{j_5pUtf+vS`GUbHdfn$@h1tQ@?lCsXN62+HM%I0JlOoa8gdON|9 z65paMc00R`E6JYu%`GF<8)OdD(<1t-P_GEXFK-Lhg)a&9qG{pU&k(cB#&+9b`l#4({!4}darPO{ zK0(sNeg-wpn*g+|PBVV28Oaz+uh-8J%vfrf(JmozhzB}`S>3>rs9D*Tz8c{-iX6XK zbfLuJ;g*igwjwdX5tW*soo@uL8pKGv{`>b7W{=zzqvTog^vr#q-DKxT8Q>)8f zUUlkFIb>Qn{`wTf{b88{B^G1TqMkOC?ViUrS<92L`W z08bx+E6>eTBewtNOdh{x_Dc$c+TO=q`f7Ej7I*2!JITx*FZRvr1pdkzaPj9>_~HH$60LR*Y}Bp}PTwbc=km+my80Fi*9JTeP}QCx6iTKB70( zrGBjTRl~Iw>o6LJ2)&I;RnFZyJz3Z@-fX$!cWCvLPM+5KDXr=U_c%xECv@_peN~fU zzCEUs$L*_{5U-0mn90%dg9}HU$*HAkRHT0+M=-LQ#hIHq0s@bp9|M~VP>I1pSvY{O zR?12M6d;>)YuK_*yW5tuLni1D-D+skr-!*C6qvsnZn}iF{4YH+hR+5`r*^!_(Nr}h znW5KrH&h#_4WSTioNS>t=M(yyMe8}qHhR9AHTZpjS+91SwO{qN9S-CV&6D21S!Lwe zx~s?o5=lw40`ZjyFZk7Npt|tD5|5L+%EKhhgoAB&y2q%CnfuvJ0We-pSw=Iz+6}(F zlO8xY%Xr(Yw-_io7l}QN6Y23{3+G9j*r|4gc(|ZP6`8D1>4hqcz(t0$j3H$~Hi&t- z2Xkx-tAWHuHi>nGevB7+JA+o6u>K6OqkLBe zZ^_d{p{NL_YjgTB?5yML&V>eYoa`5~^#+*Xs=JX~Cy=r&dyj#d*r5vS(F6U!y+DY` zj`MRKt;L&cKKytTj*O#wMH(brcG&f)Am7u7pX?qZ+~YCgZWXZ-s!m)f{2LK|12{*V z;5hbS5LLnPux{KSi@N6olt6f^7}Yg$d*@?O4GWOMsEjBWj7S;}1&<}xBDU1I*M&#g zA}kb!)JG_e-Ss%xf_Km@Cj@-0>WgrGZWXdiZ12cfPB@TVS-tZ|=BRtPbdSQfcDu7{ z8$wWXneQeJWd`MiLSJM9G);i^hR|;c`IvAY7XT*uW5M&)rwhxp#b?Wqo^B%a z6j0FAYm9jX;83vyj0^A@*Pl<)ox`2h#i=Hz$$lQ`T(e50SE`A4Xr?(YTZa3E$O~0k zN3N&l<35Fzah&I*9>PA2a*jMjM2%^?+$9(1bGfnU7CH~{qf}srZhfv$C%GEWXC$>2 zWDmb%K^OBu(6IPjk z=L#=2M~TuYV#eTf+{}4bRgY2PMCJWnnO8{;lFGeI!))-ePIjW*p~Ao>dVD5f!RDB2 zvx^Xm+0`z$MOLeFq)nVxYY{Tp=ovn9CfJNi7+5a)M>-)0{;|48{utuY;QkjAF;dq9 zwlh|-k_4GL&tCKN3&gbHPWV^hoT(|xfpup}`=`=!ifSjmEj#hLdObOjkd7Tgc{5J> zIJtkuidsCIP$B%8bC_u@`{0pz;LcnH^rjZl?Pw#0em%Sf1cj1-JY2km-DO{!S*V&U z8^tb7Yj)Y*?lOWzLD^ELY@z_DC!9WaS`n>V#{W!l9!yF&r1PaU*^z~IuPG#@akMO* zu|q>}2&Zo~t>A=9oafk)Od31tlspnU=2u_ge7oa%vPi7Sj*Y5aw>TfOIYBXTEcIGC zpKzA-0Bf>CH>%Fsq4%EF=7fZo%Ux1)=uBck9}Gi>3ERy8w&}HDPgPB`PE9y{ziGpq zkd)aNS*8 zNp=;dqjx+m+OH=AKX?VUl2!95Gt$@aN7wUPG2uz!)jRB!$B4hF^=xPWEYUN;r}Y zo>4on>p(MHv~Z+zxnD*M)}Rp;yJF{dTaYb z6@`UPaz-#6eZ>*D&Bp$sb2$Yvi|t$p$sRiOXaU~Jy3^j`w%p?N7HjEb>18SIUC$0D zC}(%e#!X#N9jQxZoQDRKE#Y>Be)7>(kbayAZ&(}`qt5nXM7>JIl#^;$7i_Jzfq_;@ zrl}c#f9n=45vn#8A7lZ*Pi;uCGldeYuR_&rhX3$Y76gRt)i!&zuDqQqAJ`7JYDj+r+atNJ!$$zFXSTrF!P_Cg0PQIhiU!?ZJNuzEWvE*eIZVas zsy;3g-(JLb%V}i}bSer_+JVv>B#gA4D2q1Ms9nQ>R{py5_BNs^!`|j17GG~kVZ|No z&aj?VqNTM}Aqa02*G00Nw+2$V2#hD2aXZ46qR9?uW#fVD5h5GoEiuKex9PZ3gzmPG z=l(p52knzNU~j?UH{HE{w^f3d^MS(<9!vd?;xsa?!BBI9tbfUBIxp7;4Y#2Qm!{15 ziU1~&E4~C|QfXK}dG*y;DuBJ3j2?ayUeu;A)3(%GE1}m><8fy}9F3e{hPpX}4|X6M zfX=THTpedesw|na*x$ruEwPkZZn^?GP^{5jJ8JVR)B1C>;b~<<#@do-?eK&#oDiOG zE*b>Rtd96;ZFcA6Xsfx(`WKGe$@#%fa8iuT1IG<0wnC5?Y8Q8M^iEs_($ehIPjyDr zWQECHdrrNpWhI;LeNO#2XZmV!VxHX~nP?9wC~2d9?K<~D6H4nF{e*uxzv2fx_F`u& zQ%ZYqn$HvXQ-y}IlDQ4?>p;Cxo|G#@_%d0yo`y-X9IPt~!46E#MHucvWi4{s7ny5( zwE%zHPOT@;RyK|Xxj)9uko%izZ&%~ik8wtA@}#IfAvWYr8`}!){cVly^V`Dq6SUiH zCJ`&iwqpAZ{I1*l?xWTWpxrujuDhDdWdzQzQ0=*@Da#(Qy|2g%0@fh38I%YTD57+aL z^Zny}zcpy_PxAZ&{p)>y^5Ab52{;2y#tm;!3L4P_b#Q!-c}6el5HRy&PODDl3G%SQIZ8)ysr`6;S|5;1~|vl=AdK2ak>f`HyAgZY=Ylvw2*G z;VcvKS7I8oU%nyb6T%xQxAPAY{kq?u>u;GYKVQ0&G^>AgCG?V+$8vtODj0U#iW||b39U1&PuCt z3M|QvBb`xOKPie&2xz7LF{0;Kksc!!J4eKwaaof%^vpPMv|BvZRUZca$1qDvjI{VX zNSB7?iA4lEGwW6ry#kTZR)Fsgic(bDSWOgy^uy4{I>HlDJpkQ{IsH;LweIdxd2oj_ z>QwEVlTW<0<0HAWVtWOG+Fnb3JU#*=# z$$*?qDu*GJw&Zk+E&Su@)LIoahLcHnLplM3A49aP5Mdv)Z>hLRNN!<-GbNL z-J+|hp}F@SVeS^2J}H7HMD(QapAf;5!h1sW-6Q($7K`r@>Ta<@WIr@NDWWIDK%4qV z=nsWzUuM(0r>c8I_ub+s<@|$NOriS*Bfyf$v*vV8yQp3-Zg3m4x1-s^9O~)io;Vu% zWw6{!+{6u^C6`3OuJWFV;R*McLp*byhfC$xL9b|B59-rbey}W%#o&~{Kb>Hi1kkSo z@4TQyuxI~;Qk>+M;A12Cp{oyvg#y$~u;j|Zf3*9#ke|r#TBBAO%gjn-jCuV+xS#PX z@~JsNSlav%!f-!K_x;Toq%yUiP!!}oAfZ1;TL-rX{#`-yok4VO(12?yF80)MQXenX zrC$Bb+376TAMv3}HUbCN;sHnGtlyFLjC_ErzrQ++ERh*$ z4j1M~6+Ub|WB5SEkl4U|=E=;cCPEP`UOoQLm}8xiYfR#u5nWYrXaL4F

    =QUA3=UP^5z2Lw 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 _!G_=I)BL@I%LTSsewcbOfR;e_V5v+6{xW}h za=PX050pCF$9gNxp=!QMwm0XeQ#m=-J6$uqBPK zNA@ekx`*M_^kam4ow`WK^&%od?rH%FldMx5t7S3uz2p;yUGl-CNIP(*NS!4HNTSeH z$mMh6S|`c_>`g}#YUZvM9p!eTC)r;Xwl0>(^UD@B_LpNbM46a<)`+Q7E)(V1a#rec zxKncYo_K4!nK>iBe$@;?-`PI$)Hh7$$gd>eK`l4(4Wceea=sqF6Ks0@+g2~#vZ}LY zPR=gP7WBTHVK|Y{nKda8md{F}uVC6O$+s1qC1BhV85*yY%jM|;$Dw{j*fcx^_XcTh z6@G)7RE6Xj;yJynGPSh0`}-O**>QgA#t2u< zV|;NUR6oQbL~JRxJe#Fvwx3h#8-QJYCH+>9zQGV22j;5G*1%TBw)L2?&L9!;zn3kR zR0zmKH38(jOBMm((}*|(^Kxr|?@?qTBDpJaKXItB5(g_x9I(---$#QBx1CM8`1y@h zUbU<$S0ggkO1(~cYbA1q!Tc7iWxDCK2(AJW0rzSoB1bYGpc#bQZo72U@E`Y7PjcG$ zHtwzZ&CrSU25DV7aNz$V*$ayA>QZRa8J+4ku%Kk&g>CS2*2LrveGoqzH;|3μNA{2JGl8PCJLCoy9vj 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%0De16qGEvgIHW!F9-(JTAN%GU2Co}IgTm9C>9EO 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 e_M-pEFGWI%Sad%t&Joa9* zN#JSkc;ueK{cx`1nV&YALOn@5!wT>;bvz6HfhUFMQ9RmDp3P@^i$1WW<9VhKj~rj= zG%940j^}up3{E9e53fOscI*cV*4pM$p(<q>)3cVllLQ(UeEWnN@kfvQ_d^SVa)uTdkb^C ze*WqUxYmX#en-eGa^gLaZR$W>(0KDbZ+1R;9U;!aT4I?o)$k?8h0I!8j}llf)(?YQ zK;x408d6{`dC$R0NP^U3egp>%Yq4+tB*%x$PUrK!OZiQ(6VyAvdXMJfRTZcUBkR$A z8uMA@yFSF%&W=C&d6N@D=6C1wj;LTvQ?_dX`gzBA-mE&4v&;n?!)|*tcZN)`W9GQN zi0!03c44V;O|fxZOWsW&X)H^*uBq)&k3TuC`4c9Ew;EpQ2S4Ed@1gu$cpcQM-?KPo zBllyV2{eEt`*-^)@4jb4_V4>R^tet<44KAwHEDZ{v7LV2M_K)E+hg=@?oZix#oYs6 zKe!n*-ud324a^~L5xfY$H!$hzLaP|`qz(q!{iE@kNsKFawI5o`HlM+EQ1A2BYd&J^ zhGU^DjE!X4(`4(F<5G_AB;LE6c&kxf>bf>d_3Cp|&vWhS4Du!QAdtfP&B#3=GY@Z_ zbZM?9vt4@_v+pq z??dE036fr9Dc803F=^TGZRXrnkCVtlArr@|?QR9---E9~<2}xLYkkbK1keF4fSeOE z=T-gecp&Xg+DH81ka@uIUPt*6Fh;f`E}6IJb+~!ty#||MEiA^{;yABAUuTcMcX&pA zF5c)2?!P+qu$}VX!!Mv-e(qgT;LK0B-V5E~GKe&x|J=f}zXOYz={8=ihuEXsC&jDt ztYMTN19yOWxy_sQP9tv?NP3E8Vf}GrX2|Tp8%dYu`$d#r2OB`WgRJ)$E)bk(FA~&Y zIi%vB?_bIIL--~(i|bmK@*g(Ur+gGz09Bi=-$%W5Ii1P70d59utI}t#WUP$M<~lbX z?I&-ejQjkB>?iwI0(Y_Q0gyD4WkKgVeON8mL!xtdP6DqU2Osjx!KWb49_Z&5FUM#4 zIQX1=N#p+F_mXr!CGfU&ybFlKeGWzARqt~)-lZ%H>wi;thaCcM(}J%14(~`3ZJ*9 z@P3RpJx)k@w$tZ^{Bf2@alIJATzK-w*(fG|&6xPykom!h)BoNq=W_?1yo&Et;FI*X zzq5n46gT3EEY5i$QxTuG(;|x#Zv(tCHAEg@oGOcf%5mkT=08WkoO*Z4x3?krHpsG^~$_au7gFM2$?>3bsX47`C^}O zEf@Uz|1k2(z#@Y1@Bc?+l0Zt~8|Bn%QMJ?PlOZ#s2;(#hL+1HI5N8bUnj(xd@)Y+u z4?&!9yuUf#^6b|W;1rPdbRPY`d!4d5`Io>2ApNO6FS^G+|9(2eyBqAtf#*uf4~7wd zGVNt3law=syjk!p$o<0j37iM-V9r7tHP3|19gauOvtFdEv`dMvhgg_r7IdB!W&20i zK0<*z3Fi&ATMwUte!i<^YsR6yfa7tR9p4wV&nFD9=m41#_j9nN<8d9OkG zZ|Ajfyg%X9ej|==B0LBhuT(cFu$#PMTd4;q2g|PD{GzwFPs-Ht&ikd`C`WxpmvA22 zCF89{`FhX*#M^@X!zF|CIDamA`EW6m7ps@ZxtoAWHG-z47dcy(SPzwdM@ z+jRl;Hnd*-eWw`fMy zynnI}&Z`}7J@R#4k}kwQfA#w2QkTxbs z>miBv@XIsxJAgQEfT1>CIj+=u6M17n(p@YI@*bG?Ee)BPc(ooTQ(oqL53>}*9e8V} zO(rmlyr)3Yx6KNlpCs@$bG&*Tbg|==>zbs4>f!J1S0(XwDZsnb@k)F6x84-qfsXej zd@Eq3T$7)^74GyUdJo*1X7^lHqPZCAI<~!`+9Zl zaV+~yt|KO1Y zd7u;T+mzn~pMrX0*83}Yd7m@>z|r8=LvQP)Yx0icB==LeAgJ|lGUXdVdr)t0>zzv8 ze0URw(K->3WF0!uda5?I*WWejn@y_3HE8<-g!Q7UaV@;MT(s8?RoMOS~E~ z`FKlsF{SV0c4V8&K)pxXcx{pN;_vR`Ch=b3c;&db0;k@`mE)~)0p7nmE>d`J#2c}} z^u##`Zgk>h7fT9EByT!Mn$5DX`?#ssLS`b~YU$G4*Qb0ER)W@p-pAca-nWwfCFl1n z-TSy>ZT;$f+{lWMdEBW7xsO|l?espb)I($MZ>IZ)e|jG`fp@v%mHW6Mym}v3yzczy zukPbcwejkCY~=Nj`ONViiSs0=1zHc6*m%z;?-G#Iou%7;yV4eg%8;q!cyGaZ zH{1(a4|*SW33)3((mIxf-N#M788WRL@5fRez6AA7Pn%3&7kQd~;lB$S-{d%!dWdpU z@d~_p9RET2O56F4C8(E6(vkvqkhc)thj(QCYs9_RoA1r>wTI}tA@iUU?&cvcIJ0Et)U;ft+T<27qSW(nSE-nOPH^dK z3MfH`q~4X*+mGwNQV%J-8}Zh+-occg0C$6WAF|%lchXis(sY&$yD>NE?bU;}-$%IF zAl}G&?swviNMX|BlwSgGfqLzI@<4}O#0i7oYLI@XS|!iB!Nx1!AC_?|wlQR?bj!5g zF_fPI(?GqYilzT#U^RJPf~0*cW!xNKy&A7Rzn9z;GUwurq)T%>C(d?X;S|V|{Z`w0 zW2}?+-bp%w_3n6~UL7}6n?t6D6R*7YPM&W#-tnGpy-C)|d+#Kj{1;vwhs-C;ADnp4 zr2M(i)bTd5-qz%G1WDak)}b!-yhY>9w(TK-_X#K7D=B{sTn}0gt*rNE^6msl)lTPK za%b_r8cq__DNBi0&M)GhhRl0-wf#Q8cF)67P%mFYkrcS_Yt9c~1Pq4h?Kp4g;9W=F z?rXo%t;`>;aM}aqAA(Ooy`!yn);G*^U^A?PsYznyI9|j3#&tct?{Vqzme|4bdw4b8 zGr#4Sf+3*ZY1X@+yb`;a@4zvzusZFZYxQy;bCtb5t;d^87$!LJo=^G9pev|%vGtB7 z?{1JZjb&l|nfZq6=}x?lQ2vgmvdwaq>V4CC>wL$t3!UIX=zT)wKG{BB{U({XyywK* zjq*caIH>n`>-~wmyzjkuk7e196NFVK{kc6z|B(2B`$kT@RVaThGzImZDDzI*!^7mw zgXORc+;~ecs7O0IP`^KM9k6?5KDmnWAHz;iue~-F=>7x!8QcToK)w$$ikQW>$c}G% zA3yeU$aKJ~^T~yjPr`Cg?-A*6P2g+titX|0;pdHvHS{_D@2?E8DgQXU2iJNA%HIsPf_j@#juco=-Y$^z2TQkpr438c_A5Vl&{5smu#^#koU7&g7|YCm}|<)4C2LA~>=chE2NNw63eK&hlL{a*I^ z-?qnj{jWSfE#r5rbl41Z;{Aj2NB&Bm0_t6Dy_fChyEZTd?u2|M3jHqhyt}Pe`}KIa zu!%d~{gglcH_kUfy+PaW9R53h6B@v2Anz?$Lp{iNG4XgW-UIb;Y}nj|SNGc}%Flog zK)o%kcibOb>xUJv81}u$^|d9Qw@$?K>VAuy5H=4N;0>AF1Kw-@fp?A18?72PPdfFm z0^bL)(eeI|IS(ly-}C#K{F23TO*Xj4TRGeRYCXiNh0TYK_Xx@#50yacp}h6V`^e8B zUs6k!1)T?oH+{UF6gFQu-U}(;5iSGuR-z;-vo zt)O1H21g29(~|E7ke`5W87tg+sOGDOMD?%<_004;v)Sf(SPJTGZoON@2a@)&biLkD z{Kp^jIl!bpi`NL7DvsA=<(l$vJg9eo^S-g`oHyolBcn>!ru zbCiD%J^=NOwBEzAb4^*O1jm9K@2X!9?tc>}hs^_yw=v}}fQvxA{FH*Ez;N=$!UJ#* zNW3~vt#9jB<4x2Ko0X1tF6CFio1k8%KWT5VoLm!x@=zAscuVa+INns9u=&XGo=JI$ zw;4fBQ^Mv4yxKn`DE|yR59-zLnS4s#E|ByC%fkBg z=xJe-du8VQ?PtoD%gr@cfqIXY|Db;R70)$8;BlA%Etc`zp6z!Aa4}li+9{j7c9u9Z zY|7$|q&GFDWFXfxfU`lp&8_!&@?HZ;JM(jly#IP(t%K)%vfrfrM$ZnLs*d+PahAw6 ztw6ogtoPKza!n(+3OWl%XYMoP`}Uh@5;mth-qDnoerGaE^)ls`6sXMmwjUv1(mbD6 zk2i_;1{q(PhRwNnb-z7B`Ks?`nd+ckDMkvsz`7OITl@QhuiN)wBdLcN-d=chJYL0i z8zBX*m+mjHgSqk0YPIH_jxUx17)2o=&jyHCd)BxbdM1bY@*I+eucaQmnx96#d-M=3%qN z@wVk}_lBV$Ug--iWl0JgUn@jU$?GLL6ngmUijHN@7Zj=xE~;~npbY*QbaI9_gAo*{p4grTsyA_Q*u3d@N3hLZa1Us_z3jLy^84$g|Au*%^=`b{Uez0K z$2{8cE~WhI@Rs8pW4)8cWtnZ{{{r8E>mBRVLq$GcqibQ(jMi7*u;KDmE6*jp8tL*62I6J7!L`=agaJiiZR_#8rJ7RFQ`PA{==B*2SN#6G$=~tEwxjv@jqSogfSJ{3W z?+uPOu`tU#0Vb4*cbxTl3-90Jtarb^=JzJ?-h-EENII3IdR+=|?ym$|1na?q+eWAoE=S4bxCA)>q8YkW` z7+y`&DgPKO0y+NW zbJzB~IjhOr2wOnrvC}Jh&Vd}W2|Q!)=<)v@W%k1#pr5;yjjv>xTyrEylK210^_f3? zZq~{1Z>|oT`>l6CNn&QZ0dOm*SI@s%mSr9Y>)|a(Y@yyNWSNP)0Dtp&S*9AFMfZ1d zNZ5SreD3{}m;39vN9Gy{Q$F{X{0G%k;xO{cfZOM3J?hea2i!z%44Zw9w>;a4x3c41 z<$1HjThsB%$Bnc75q&cCcpB?V^yL{smil>Rds5&M^16eh-a+p<{*EshlNjO6sU6f#DR~R{=7V9FDYj^d7r{gko_Evc>8%W`#Ci%Y_7ng<9zN>xuzO4 z0F6)H2}TO+Ag_42TyqMX1TB)hf1zJ7vzs408*k^22j(Rs!)B=Sx!X|wLLL>!2r8xQKI1`nT=$Zxh$~ z-s?CjY#z7u5M}#EDE~IR3+mPLs-upf4xlr%fmQUyrPec#>dyN>=!fJxhf)vK_&mwm zIIqI1sXyg!gs~uDO1n(Rf3TlslJ^X}1n&HCCC=E`u=(2g-0x6kEBpW&-zv`&XkI?o z#9$;00vV5EwohB+8;|36giUteO#8f>@{hq1Q14dj{g%A!3c02-lmquT@BFyeMs+_$ z#)nNs$6KHB?H~r~-D|y%koPKVf%PEQjVGV%wb6CHc$0UA&6$q(8_FMkEd39tH!S}_ zyXr{Z5SR)RK)ibWe2>o?yPNBI1$bw&oqA9D2i`K=)N+qgGdXPf0uM3 zuh8-2t_J*OEd9X+Y^UC5t#|g1S>{RBOL~rFq5T2g%6KE`(v-#58wNSvH>~&gin-=o z=m$OEs~#M;e93Jk{p&y*?=5Y-c~s<)uxWr-`^6h6{{YMejW<1>(atuLw;lGt2@hqb zkBc>xY#(dA6Y1WheBx2sgX1+Pa6CbCP%q6?Qs7?lR>Dr$0`uE)3$>$n{*(WN*MF%u zHal!qO^&6SO|p1y zK5Q!C(f#3nZ>4zbUkUu1_f|&c(VrXwZxU}uyjq`U^O@Q}2hjSIc$tp`x{}uiu7{(p z@ZO7~^QR5Id2M`t*bH{OH?7Gs-*b=ch&l`)wm#J>)jEask{)2`?kA~NN!nkh@ZO6z zk}l15?46;+Ga3r=O0kDoHx1nTsN?N8Fo@$w+Iw_C*erD7mG8Pd!8S_@@xITx)!@dv z%s0Ly@UC{^O;LU;d;@?T z!Q(*W3C7v}nfev4a7H0sspB(Q@5bxxwLkvQ`iUWp#Za$NkI@4v+H z_HyEtb~cz;ZUuk5=|K7CA=cgRi?`Ho-hR{iP2nBs#QS33EVF=ZUMR%-0qfR)Tfh0% ztH)b(Vc0z6#Ji31U&B7|#~V12^Hw+xjs~}W*V+E|K)iStIq{xE`BUL6@Ox{$n`N4l ze*v7sf4lMS@%7`;r^4nPCtf+;E@8XN3-D_F_F|p?c-v>&nZ_H(yWNRbj*0$kcS9lG zTUqBn-pcUhe78SK;yvM-%<(qpYR*yE?*2l&3s^S?-1^P8$Fas6c{*&)!K=sHeYJR3 z0^7V%h<6j~J_NUZhx_`67~ZZ6HtI+ATF z$+qk$_juF&b_VNC1vlQ!zIe?uVKWu4j>n@o-p0Y5;CgWe?j~pByNM2`c+ zPx+VN6;NMauW0eN$@>Tj@&)&Mg;MxV!N=)dI(yr&KZ*VvB;C(4em2*Gct%d^RJ|3c%lM07^9Ei$P9LNEv#B^+o`vVw=dK6>-`C?l~cw&o-}4{ z_c6TNop?{fx8Y~Tf5$7Iixg-~UTcuFrhR4}uTEKNyh*&_Yq=(uF3q(~wz~z!fW}+h zdaKvSHT6K!`Le8>xxcOMQXkv*C@yE-j90H;cA)%~&LBe`p39Y3$J_DtK>K|=Y`Wvs z{r17-S-iI{*K`H-_Vc=^gZ7)0DQv%`@YcA_3rOm%7v-;q8$kLMIo__56@>ONd08hj zmjt;Emxy?=t|C_RF843+Xnb7=O2&X*pz+zia^QZONQbksu>LfLcZB1ePyfFN7K7h= z4so3ilG?E>%o|<9b2NDM`07IWK5#9#UYW-YCGU24049N3pDldHR|@Z|PP~s$ejzLc zzjrNppTUo?3tVqU>)pUc>GSlp+z)W#HMMz$0m^{idn|d?pf*h73tz6cw=do}-m=$c z>Y*On+`~R^#8SLT`R{a%nm|+X+JdB>HM7#!_!bhJJlCqn7nfeVc;Dyx1Kv8`wx$!? zT@N>adgT%hDcxS@S?^OU3%c)Ad4=bVuM3;jcs0p5I0l|)J87>Huf6p0m*e0N>cD)! ze8u_PFR}e<_y9CM`75&jH@jLxEbVgkM-4O0`C~S+OO|UuuwHNB{VVtS z-2JcnsSm5AT_x}?cf3nDAjaXG8$&{&cVOqH`P}UDZINKuf9j_QOA3? z&ny2c@0y!ghH-&7G*($^yk-N};doJo*6(b5Z9d2{PdVO4toJ+eeuL7daE%qxcnEn>u*4Kd5?BwmF4u>VnqqJnKD=br*o7=guqq`d$ieQ^&iU7thtld5+^< zV7(hy*OL6U;P)=})o=8pu<24jJzU~=pSRw^>S3j?9+I1Q&eDlj>)|oSo3!44QxB2N zJcr_Vr5>byA9uX3`szXc*Iy6XCbT`o@jg~SJuGm%tE{)Mdf4Er2lGkTEOp}5did4x zeqg=-rXFH=-*dcL4}UmbZpBCnXnTfx=SjYRT^^Pa+K9ICw_TTgmczZhDL9r}z^nfh$kmI$dS_k@H z@k*J(`gI;~Fmb0I9>FL5?G3WE-i6YAm&% z3|p_%LrwA}{cSzqecJJ!X1!-R-qP0Fh`g5n&>P*xbylYy+OnPe{=+4Xw}SQdBJVou zy^&=>-*?sVB8hjq6R-9UamQQ5djHLF5&4|sZE)sz)BDb&9B)+e1U^{Wsq`i|^z)E4+F>!PlgWd}n&L0@nB79LoRxntjYE((@g> zmpI<1DL-!x?^AQUO|18A@;(GfCvY{RFmH5M*j$ZQ`<;*3PTt+L&GELi-tFZ5V7>SK zT=4ZI?ROG*<9KymlFPJ1zT^FiCZ@KR0hA6}hK zXNpR5W)8VeREiKqQ8e94MG~cwL8S=cpa_#hDnu8hVp1wZcamsOle> zKkw}IHmfnell*IaKHpZYz1Gva-@R^o?X~xmyf}5;hFES{(yAc|^@!zn6;D~s+>!An zeLN0tXFPWN+m!sRP+O$+VWj2WLfV~3!nfZayjFF9OCh;#3AnQyd+W0Irs7?!=R4f7 z8T=r53hF0AKQSIVT;0$2u*030fqSU^d||ko9IjrsUJiFk2JWHW-;cn}W+SrJvp(=- zZE=9Z)$d;pB~8Pt{N3Fzt^U<|mVkR2Ty1Z!lV94!6o>o1wO8839Lt_hT%8*(y>C&j ztPACkKf0rosg{Ae)Zs4t58TjB#$(41*E3FC#G1g@4tI^^eoxv?B%yyG^X~wvA7XGj zz^z~%_dDfER4ZcqNbB!L%dJ7$RY*dFILe1Vc5<`q-Vf`0h>@R5neNu!H!0tl{N2$L zNV$Jl?wh2&iO7l9ed$bAe##z-Ewrm&OPLtuNlJ#Q9B+cILTZalrRxvC2 zJ(F#eQ|U!R28 z&*8F!AmO0-r{u}V#TdE%VYv4=_G6se`D`2 z*4`N0pB;O1;Vov(>tu)fv*n&k+9l`;R0p~CPPg`c{E268w5Z>l(Bq%}y@qn?hh&4` z%nrxiP%*!$3|IZD_TJ!di%Ua;Tadjg)9f|J_|5eh?7hq3o@BX)V{Z)Z-5Kod;c(?Q zOAlr5?lgO&$NJ5%4EFYSxK;myy`kcMGc|*~LmY1SU)USG!0X4gK9~}I^EKRX@>H4E z!<&SrIovBPcL8Z@(D!IP8c4sW^ZTOxz4g4jjb3|8z&(~13A7#WBLAOgKhk>E#&S=* zoON<^3AzAHub66YRjs`Zc>nEQvGF*+Im6*LBL9c6!lpT~aywgY8`3%=3DtNulBs_< z(B9x)23PBESIXUw9z@E`x7-1w4MVS?(a3FYEz|rPE#)`2IreIQHkES9?QOY-Q-4E# zzj?y3SKHfchx?r67S!JI)9f|5elr7Zqomi2Spx5uE__ef;f}G~A4vNRN!U-^A(Z-F zh0a5M;Cb>%oM<@UH;Wy6eYL#%k>iNf57R97MAFJ43Fi6?KnKP8O?c%w4-g_0X6aA*-L#cY!jQrQ3n~-vMS?+zLJ&p#Ur_taGQthIG z!%dExCo#W)tMjIp$lsm4Dz6eNcdz9}2WFXRq)T|7zZWzfC*WS{aA#32r#8Mo%FU9$ z(67Hm+ESGKM;-2k)-x|%z*@(Of8L))&h(pW;D(a9dA>t_*#}ULSh>wD_gd0AA_;d9 zXIc-EeE`YpR@QI2IQHs%=K+VyYZDRH|0^m|H#Hyb;K8!bA?*ru3v!<~7w5&N*jawF9FEqz z2g%bL^+Rf(_(z`K32qSSqtGzq*1PJqKI?seso*!8;WES|gS>}3mNIXkbZ$ZK;Wn~d zy-$n7{mZd;I=qwEEA|_MeLD9;jx9nGvVhJR)VYkZ9<#Ayg0uDh0?iV=k*+y(4M#;d(GK?Qy;Dd`3|mrKVIvl zy>3}Uo?}lI#}CwL3PmX2k@9-KQj+t?reVoDNv>UF^>vt6*c{Js38$x>?*TtjNcyqJ zIeydK;Z`93`KSsK?nlU4?W;ywT_oWOV%Lw#-9%>LhAR2ZAjglozTd)ff2JLU1eDe< z9BO?(40keInw9wl$6X8Wc62WSX@uKBs4T<0M%t(78?-LM^-J)aoU+pydt@zP)jVTj z=ljh!q-oIa6YrpmTo>VWBBnhZ*6$LT%6_xQo_}rdzrZV2pYJXp@vCqj@%~d^UDB>X z*P~mn_MWp(yqdWlHFlFhvc`t^}Mb1$=~%}z%dESh%?nE-Def8 z;y2GZ+_mI)-@_MwDmTHgA1!w`amIFuF*1Ics?;Zk+mF8KPs(I9@Xq@;d;Q7D3V|0& za?CyN;Dz3J+x!RWG`uwq?*#H*h%QEQ{=!SntEu-_lGX-ExS3e&+(`$V*qqt}Fp$H^ zc6yQDY=f)w<<8{qf%+r4KEkETkdQN(v=7mjs9hW0&Eo-GYvx8lK42@?Nxo^HsLuTY z@6YIU`kA~H8uHuLYw)851?-A1a zq36(f3WSA$9*6|+hD-KuomyD&% zc!%331NWUna7|OcndxxX|60h*rp(6prL3W8hb|SyKb}J^6J=C>%4j!y^?vo!~KB#^U!>x+_>c~BJB$#;Tz(K z8J=e;*IeZ{$2^*<4|?4;I$Wxfgu}XSA-JbH+^z7op&btQvo!AC9NUZB`YdfsfyCa~sQWhhA2PXqh{2uaaOL+OcTnbMhg(7hNT)uOXo~-l>xcYw zKfqn=aIfT9OKHlSjMQFUZ9j;6F~=@Q;|@;ahFbW|7KdA#{7unSNV#k^JcxT6$2ua{ z57X1QF}VI{s$JYi{w7-ro5vmQ#cA9r9GjTN?a8})u7AVV_{~KQcRu;oqOXzK+stxX zG~@je)D?9?u769N;XQviP|sTW&7BT+2Kncr`AE6Eo_&xX%$2-{Yq?q<7Nyx6yVh@p zJKPt~H0ET=oraYAU>dgy$Ie5py(`oFYp(N~x8a78Cb379{GCx>q}<+?yNgyAE|@Jl1u=-PT?o z4VOp%CIPo8T(!3o`R_(Ok#Z+m?(3wzjXp;2qkRmv%I#|RW#+UjJO z`L|0Mq}-X7ySG@jIj?yUa}g?eO!h(k9cj5*AEIrze|Na@-b+2oU4xYSS(+bua4a9W z*KJW6HxBo6hbzCa)sHg69qzg`Zk%K9rE!B*4(@kMTff=waF>#Q7ut)|Ui}V3?WAb*w9+%aC$kx7?>m8;+)-H<55d zO+5ehw0_X*X7c@}Snomy+S_XKk7Ld6TVmzTx7^=JJEoO4-|-U{w9b}*ThZa3NdAhb z5mN5wmOGZT$>*DVO0xg0C^h zS|SN;iQV=lbwPsqAp$qwv3EDT<6E=03Muy|%WXs2{b(rai)26euqvLtRc(8d^+s;Z zOuUER40X7&zq&-XEHj>R$}KK`amIQ1M}MAiWU{w%7q9*%;J)Q>Kjr`O!F|Kw9+!bT ziQ@%v&4YgP30%F;noj;@XtTpT-g3{no^==03^hdVeamcn-3C%!q`ifDvaaTEJCOew zG!dyEF0@>K8=l#t8_>0=Tb#b&L(jkK9zXc|aiLy*llOS4{_4DX0Ogc>t>ubeB@E?Q z`u)%ZJO5SxhT&FrxT7dD9nEyOtt|H^(*8jHwv3%f>hE_KdiKst)6s-IkG`^k#mvF1g)h(F;s4?Fg5BmZyc52W1ZE%&rS z?5%0%wc|Wuw_o>K#s2;3huD)mZ+EySlfOJV8!2~;<<=zaDkR}L;)42zXkWjHJKP({ z-x=M7lsnmS`;ayejYcDoTYp>H_NMlRp7NXD9qvT(e}tAG<<7L+-I8_#_a5jtw66@` z87lAfzxhr(PL3D-s1Mu#hmvPU9kT7X9Oaa&->I}&lF^~saSUz)hg$}2E!uHKhs$Tl zB^-2LcrM3XKcru`INWv)SMM(_bh!2t)CahAIF^2YF+Z*Tn*PkA9PamL@_hlyHFvmt zlKCKeJ8~?7Tzl7~aU*b_gRA{cH}b!NRwDIpj#ssOJ=+&CF|-MNgGy~MCUUPg&*^&+ zzZXoZ^k?J*1eH^c<5@R+zTxC2GTks33m~@_NMzc0e22uZO8fK?}r8><<_!X z;eAW`cC;DoaponHYuSCezkB^;c!=Me@!`UhhO%a9~|y_^6x;uAmuK%+~aOxK8?zwPq~?qetp@Q-Z(Tky`PNvP1ckA2R2+x znf*Po%w@zfW0LjR`rfguhNQJYx`r&tamxECukCe7{lcc^ZCU2neD8fvDR1e%)f~Ht z@)B+%E^ys^H0wifL&@B%5%b(le+O63SGe-LFvhVr>?WM4#F@DI{&(mVzqt~w&Ks}e zrPogAHk8i2le8X4!pnRo$Gz^_4< zGz+=&yDhf=zKuLGK8D9KAB7v@?-CB@x@CHg^d!5^kbpbivG+6VSb@Gone5$2`WBS_ zJJx&B?R}N!XbyJ=W%i)L9Wrx+q@RXPM6MsE+jgaXh{OHe;hsbOs;CCaWN$svuSAWJ z%Pl&A~-Cvxo_kY;b>b-y|7sZ{;d zc0BxlaQ|03E}hmc;&7|O4JCUW_5s72gx=1;okQAZ=nJ$Qx&2NB%hi4-`i9?J<=A`g zIfczPl=&W|`{8+xjY2-;9N;<9rjwnx;$;u0rX4Xw9)(kc8WaU9OIs`g}YF_kG9S z+Sqahy77P5+ne;hDBa%T%vKKSci!@wl@9kv`8N)C`%&PAC$ZnJU#eZa%sEa#@1S)5 zieHzJz6z!Lp_8#QPIhMQ`@n33%2Y+ z`%pSpc*ow#9uiavx%FXX+PG<^_)TkvEB%A+H_F77{y{?eIDep?aZKhV5x9554e@sg zA?zr`?~E5g>D-J~r2kpG)blab3EkXC=g(|JzeaOaZ$L8_>H^CX?SoMW%>{8Ykg#4cC;p!1SA+%o-B z?d?c$!!u|X4tE_kZACj#y1iQ>{4SHEcjmca#e?fZqqOlN0k<7oeXe~hWfsu4%DW!v z+*3KWj&unX_9Qpd2fP3Ll;6`ToO-qNHzCYEyj}<@s+x@9AxOX|+BUOJx@9|s^ zuFiLS{6%yOa<3bv9#}UOyXAPM@j~Z25xC=y0yhTtBgYSw9x9yto%_3OJ^PF9fG%5t z?^2G{M-r|iE~uXj&E`G;ZYY`Cm>%$YqbD8i8Yi(&P2g-sprpwEmwYjT%Hq~xjZk2TiM!s z7x@>`wM2=P%Tl!j-)z!Wq94(ERP>V6d(o|J|67jdZ(GIQPw3a5!4IBIW;gl$w=<_f z;z_Z$xyQ}9gR~*&B~*1$>e+Ku+lIHn2rpoN89b^>GJHVZ1o{rCoi|%M>vpBTKzE@I zNZ#Wec#+pXwzSL*6q2zay3lW`J`2~{`5gJ*LvxVYY4?xhl)Zy}mgp|Ddw*)pc-v&} zTGfLWTE=tXfvJ9G9C<%RpCYw$oVByYo$Pl&5%ku^LPu>z{i}?wz&Y!!G|1tCg((~8n!D7cpq|Zl_rxreFy>PJQCOBVN zFARS{{ePbCb4Ve=M#^kQyO44h$X}?ZO}cUY(XHqvREg(*(^=CMA9S|$bPaoDFDG+! zt=}wxtJi-Z`6r->NKRk;dX6{L=4>NvAIiQPo0p_~+ubs+Zi=Ne)Aq&ZTDx8zY3~`l-tX4hmiIvdLPX|0~_+5c|FgcyKR56 zyR-LQ{_sY|0Y0pu^RC~?UoM|L3`n`pSngA#y@ujwCUX0!MYjG+KXs${a*LmbhpB#b zKl!WNhrLL->nwK!Y44#WXg-qmukEVlRIgoKj)BShoNd%Axax;O_w(!mU4)c7&>OLQ zOG*0*N!Ux=mA)>>Oytso zxjnji+{CYb^QFW6o%}_+bI*m8+puU7rgL{)pFcw80<*~dP} z^GHvsiAv0O95;iiAj)8*>#=ZUe0 z{GKP=-Qq{dOn9Di8iQsaxjym-msf(%^klyVx(YQ!BU`X9zP)$uvnP7<*8}gB70)#% z4NLj+Ci2VWxQ#eDoWQ+~fAhSg=$)kXK>FOtt)Ke$xHkrwP>EdA0B!}bh!CY*KQs!d zy=*a);9E%Adh|E?4VB_VCO6_;%xyfswDyj^()I(#<(jT=WgMuD+5U%_kD!Z?a_>rF zjqf}5RkR|#3%Uu(bG-`XsjF~@QK!aJUe{6LrE<-Sjvw?rp1Uchez+U1_#yrMDm`~M z9xRoc5c21mC2+N#rN7T2MqBS6*8408xVx<%*Sw>K0wOF2NHZcNXvc1JonTz&2+-sAhgYP>ePbUBBeRBkE zzGH9UN13Oi6Oh{5%5uY`-GC%?Ar@}>{rEHvC&z`8b4@>odoTGvM}H&b-fX$6qwH@) zzoT6!d}iwXi-~p|Q*I=bYuV1@XWsO|(80EFUtIhG|s3X$ztK*gT z^(Re2jQB<5www93z6`YWJ5)2*jB&V=$p0St3@KNyYtB>jOQ;+=1-aaok9hS(xsl6q z%`~`Lzw40ydejjq_uizH#`h{|Q_vjrE*eW+S;KkDzT@eZTXvq;9!;%W^NGVR3?8jbUjk;Q16&;G-+?5 zIp`fE_Etyo{>v$ROiTK`XK9bkr2f>-HM`(eu-sMT--Gh{r?}HC_Yuu-yBf=DXhL@@KfWK@+%l8Fr6n zXQ|cRb=%#!kV)Q;U6X6Z!WBPEW4_y!{JqgYq+GTgO7K;Cmboe#hen{;U-I24o*fOu z5AE3BGnWGLy%On1!)>X2(1 z!qspN`KzL8NbUNG!widAHAriKbe<+7gB#M^-kOOCTZ^?37-&G;2vqh zyL^w~Vb51m|N7wosdtG^x#kPUE%xQ9_k+vHZdx3Wr_{PZGPd#Q;+xCSSe}ef8ykQvA z7#&aED^NS6ywR4ofwZQ>cozc2`A+zJJ~lG5EWdxmnTU=3;6(>fui2 zBW{cI^g^x~3O8!&&oJ_Th?XNg|19rV&ej*PaRmJ+>N%M6XQ6Q? zeSE%UX0!GY8k1}OhDY^EhLPkQizXtqlcp=d_W^0k(He9g&pzFGMA4@`dv#uK#^#zD zqdmX!*x4i~Q*{O1SmOULD!C|nKF zkG)Ho*+}c>BOIpN`&a#Twm6Lt8lP*%!Bs!R;eCoeLu&6>Ywt?Z)*}gSNoA4$^RSLi+D5b+Z9|pLNZp4_w_N?6T4XZq3~nRu zT-gvy8$%hUZ>l=%gFPTTr(G*_Ai~t-wov>J@0-V&)0{v7?LoN zSbnd#p6v&e+lh+JFklj&<(eIEHOTLAOFNiOIkj^Df06l5rr+ZZFU&Qkj7in^*_8VP zEkSCRlqdMUm$b3e15^^pSd_SrzL@i^VCxT6CTUk_G1mjG_)q%iQ^;QlRYq!;eV;d{ z9%-FX>pxiUV{$sd`fnQ<)qkO7tPjA`pzS^1;q@W^zisamYW`-A*huTf`^aw}NwIiy{RnxXp0U2j=w+qXQI zE+d!yyIj)_ZpbTZ+LQlQ)C(z>CL+Q25@~OuIGTy%_qDcF_S)ob%a#36N$&T#=1zyZ zmi!x$c|FCgX}M)ctBmTR8c4WhD|y`D#ooMDxuH$D=5e_8TupoOcSesPwYRqA#z>ol zK0>pQJU38#t6Hu+ml1ozn{&;}8Mt3jPPq;L1-E4yH?k$y%z_*C%9_3K3cpdrgphKZ zS#FrL=I9pG7Ky#;hkVPG-$fI9<6CphQn-yQ_Yv~B zY`G)9W1j#8LqF!4tr@t-PE2vH{}`WSL<1PN3N-#fm`U!6j#>$3BH23RnxeMova_j)%s8#US-tG;XYuw_mS2I4MPKw zTOV3l?(4sK^&$LouDK6x*eh$Mk^g=4B~m{;Y`Ix)u?~jHp;OW0PXCZ^xmtgtzvP;M z8MtA}DYy5(;0{jX#&_qMH{gb>z3Z+jY&yfd%i%s{xj%92A<`d1rg`Cm_RBT0>0%}L zJ|b-il5h!=ul#bU`Jm2=biN(`E!X(RdGpNA7#P=5?t)3|6GeL6?EST`{ABJO(Hm$C zYWa;Zl@}B;omVrCec|0B$~^Nr>CdtPraW8?+sOYL`Wxx^d!KhO`;;lH#h~ga$_dVA zO=j8sg-myRkSH85wH;2FJXfGLNI9J?=Rwl?pIc}5iO190`ad`7u1(f3IG_n~K>ugFw>!x5c>&P47w zKFnTky)Lnwfawdjx>wd*O#aJI9i&{HZ#5>ZC6dsV_>_}UdqC9QOYQft!oGkR=GfZ> zCq^jqdK2-cx1Mrh@^2<5)A@^i5+ZOWIQ|q)2RNOr9r8S*gqJl-Ir7gaEOhL7pZpt8$!V#2a!Hb8vNw=+ z;&g091G#X;Su+)0KI=r`K*0EUuq*bRk3mDo^Cnt})V^LG$5(y^YZRz8YL2>IYfMe% z=99Ox4oj_a=eda!0;U>V4Kgo(gffpIt$)2aDD^LWJyFlqjrI9(xOBj@fLnpG^4;Sn z;Eh2OklH)f`%itpk#_RioM)L_@4ZcQv&ABGdcbDa!Ka+VWYL4n5ci&jZc<*n^{e5Y;u`&TO53aWFC&~W? znvIle>$2~dcX^(LTB4??FNL~ope^FxruKP>w(mr_0Kd(Z8rM3I{~q)JQtqYJ-qoc2 zfXpnOsSxiglX~7d;c3qwGOpbyey9*IKRbRXPMI?JDnP7Uoi|h={bbT5lqJq|zoO6e zLlpzYHzDQUO60GBY9ZzJwD#Uj+QX2`cSz&$%)PIS1#$v=?qC5$IlZXe5) z=xfrqqK(Mqu1w=b&Iy>a9qwN8=e)=JQ%JclINS?KzYJAFE_ZhtH&iKLE_1lQ{gq|* zqNWZv=5W2g8q*?;D|J|c`XK_hy~Axq{?Sq1DR#Ky9PR+phoR?@Yj3c+*Ow_bdTzix z=x`^He+GINsUIde+;2(Wjy5BgTQ!|~Ucd}?xPOs9&dqm`*(ol|LlS&DNk5l#3Dt;Q zuIGi6A7bYROw4(%FYgT1qD&o!yCO+42c9F`#Ibg1+?lprs2@z_0Kco0s=r;ypHr0i zqQj-BO7IOQ?N#(9O8*3+f^XjJEb|2EqtGBUkqMiwhv!?aJXeY1OoxhzQ3 z@cKusXL_F*3kOUixO$&?BKa$!>ydINTkZ>_jX@uwS;&14XP^DPgZQ_#SWzcnu64Lu z$^QrX8!7jF%ia7DYs@I`W5!fesa)zgc*|S8aY(rGJ1UX-0n^p-Z(s6DzdnRmx!+o@ zm@$X+g=ijfuiF;KzcOzMH3*pJ9PT>uOaJ>Lv2uT~+!Aw{H=)X?EONPf9B%TuH4K|AyV!x$6m4dX^uUGT<&07e|6l9HVT;8a6?jnFpB)SEObnExcXdm3u(Ji z(RtJfRJlybztb&O>O*Plh&K+H&mDVrG0Bnd=ABGAwfAKHO*qi+$Upujt)SogOTgXi za8HL<7j<>G`W{2EPpAv%LiGGw+`?YL{ZB)${uVFf-CwC6BFzHkPq;ddzK=3P&{U-M zRb5y zFVc!G@VLhjyMECALAeRI7dhM@`R`@^?i~ zA?1E=x!Io;F=wFq=rSbt7hPGb6I+9H(h{q^u{Hq{fvfFJ>Th-0aVN?tw_MV~!>hk> zxc58UF7O^gPdHqfkObdrq|HDJP#n2_DEf?Nx7Oci+kojmGG*^d@~=l5klM?(vLtuy z8QEq#=@NDmyIk>s1mz~+j&khXE4+p5&qK;(%Yy`8Int`4+NcI{>u*)-U*$&I17d=gHp=MUZlJo$n#ih9U_uV)>q+u2Xx~vTq8fm7(7;?E_}L!+o9naWoexSJ&e< zla{r};}$0_h#S8#V19$E>j%e^zdSk{DfjuLg~nH(w40EG+lj;Mi%GY)`{#BY^`?L+ z$%|qYyt3v#^7lbcA?3d09rKMN?IW}rEkcc0k5O)ETOVW{^(XR2ZV8wgaCJQXhWx*x zy-2yQTkh$L8AnhAU5BFe@iWiA#kUnKcjR1t%LxC5It9$taKm0%)0zC;QBS1YIhH$| zv>E6#6i0h7M(wR`xw78LqY)G895A=R)&BQ$@^3(!ka9~}?jNN2mw5g?nOOE6>HJLV zgSO*nmwxLveOx&G9bJ+~8zLi+&uh<*AGr%*G zRQ>Hu{_C6ZJBGx{ZIvYP`$nYALJ~eEo?I?9e^9p6Uw$^q#P152zu|_Hxmo`q|7P?f zQZA<}!B==0-zP*8P9z?1`aii+&wl54= zLEY(h_Fcp||HRzX`gg~bcAel}+8f-kSJu2t{&DDaq})d>cPeS`BMEbfx8X?r4zK#* z#^3Do?EHYa9vIq}<1oB;#vE z+Cxaf)5J}0;d@Ez53Xl3xH+u{H~dh*JOfv++Ys^(Lt_xr`Q*Me+yCYyf&B3y$J~31 zeA|ZS&ZB<88{zO;G~joe$^VtZv+EfLc)zCc20Oe^Pu6eY>2=Cp!8`+9jr6?7dWQKv zCT%Awzmjieq5N{GdER8sMtrK*Df}4i*74^xOqg zX3aMCD%<)h&l7fL;m>{n^NVx-&yxRD^cv!D(x1o4_2jRMN&6YOzSQe3zLXGpI$%y> zO-}mR(p-?g$X{YL{VY;DPfq6K{TI?+MT^i}w67EUD5*R}xAXpHT0a{dNV|foLH3z! zpv)$uc1m62wmIWIlLX~&rhM1}woGojwEk!^dKJlwqdVyoxAZJz znilffkF?9dWR49An3v#oP8Kz00r^*;HAuPo9PK;Ob|MLTiJM;i&;IE<7G0N6Ff=4! zra1N%TEqJgr~*>%bKd{yYfIYgs3*D~)jK`4p1;!iaToo+)XBuqfcez1cL4cEp%0OA zb)Ip`TCN+q8r4Q?=2O0@*DiNk?li9Z6g ztBdD{@XG;n%v-7b?`_H76+MmA-Y+coBho%co6)zZIwvx}isy#`wmw`5_YCq!M)Q0Q zF8_5h>?eQTSJX44+?L)UUnkNYK!Z?!R5{FnIv%&XZKroIu5`w~i7^3F9d2o_tQk%I ziD)uXZqREUzO$-ko7tpGm`7aD@1)1Z2Fx{Z^|~!4|1T(aU5a~_<(B)JeWB=Ev>M5W z#&@1u*i@G1lxtGYDdqk?I)(dlxEktw!&ro_L>x}`D{VO}?X?AIHz4;&3n(9+8ZhTNX#(tUzvM!?+eaLsz&D?w$Dawmv`=!Y7Uc0KBXZb3z9*FCvc ztxo^g*XhS)9FM;pFj0HH3n~8~`JYE`ARQNjNvtW7m0-LV*0(IhnNj8y-=$o3P${Td&~KVV&#h0u^^lUYFi zFVI&=xznt@SsS=s=t5Kh$^Gd*?)l{WhuM0d_r0-rz?|oBFC~8?)D$U~>3{@Z7t;Em z;pkc9awnv5!yg4q7%tT%8Ag-;O*925ccFL4w}`YYXdn6+<(Es%Yi3%m-v7rwrkxH? zab+zqdn5agk#g5st`~7#I2J(eecAjpZX9k4$6n>0>Toyy3+|dUZUSx>$G;Wf)kF;( z?vIvx3uzCbXHg&2vs&u9t+Vw^uUlkZ!1T(%9Ys0y15*wOzJj>L>2sxCC^zv5>oys< zvmI_Bugw?8t(nG+%nz7ZaCM&h6}%tO4u@O9a*KXPpNOiWvyodLwy1wO$uiO|76i=7 z4BVQOQ$L*eFSvWsxS@psvjeWy-)rIBfNpZQXIpMQY0n}F!->V-?#!RWuNt)eMivE( znc@|c{G-V~0Zl^M?{@bNXU`$+GqfD(SSP%q&vM>yf(}R48P|~SDi{a|=8`-R}D|DNUj zzrB>%=WxHU+$7!pabw+rzcUws+sfgZ?->tK5UIUuE%$QLu0RrQATG*4@i-m6+A6VL z7qgV-Iu7?%^528*N6OuAx$+&AexyqnLhSY{%2sY1Zf}P>g8Z+e=}5W7Wq`!LMQgIZ zh4ch!T9Wb8**{d8Ywp^cSQao79qty&>_WSda?4rn9?}YL^6dTmv4gqk_C}Tm%v^`d z>qq7o%9cRNJFR@*=1n?(gZe~H5VCIi>+a4Y-=ZVc`p4mS^8on?hhS%-VR_3{Cs=w-oMh^GV|6p$f?%5f*O&xBH|GwhxkMzkhXLDS_1;m;Bpz8<;xVJc5^+PL%8$Jwsm1|beE;4Z2I^5d-fg6JRs^een z7jJa9tut^B_53glcaFmyN@slw%uWvX`V8FRWlF#XX)emZK2ySb*p`_Q?4*_o>`rP4;w%i11KcYX;Zq&UDH$i8Z9Trc4rJZL|sS@1MX(Nz?rHrcu`78Pb`w%R52In+}a`Vu3 zq}&TEH@t=CNvJ#OhUB|3rPxCv?^PDh$}%g+r`I9!CC?F@^OpP0QIyHB&iAkGJCn|W zABS6Vda9nwdzGW%zKYb|w$|Rmd9TuZ#XcIi(of54aFgIILdzZQ5X=3Yw31sr|CS+^ zeF*Uy-o3ZfNAZL9r-^m+|8O;^AI_p2?oQU57l{w|{yY3N&$AsroFjIiVMzV(s`sDz zUipE(02Tj{`ikm($$rM$z59#!DsO#SuUqVU?lY_(r1*X0e+2bL%KgT2BcltOr%9Kv zkIk|2e7Jf!?!kL`Z1IKqA-pMICOO=}l$(N9Io$P@TXP%dg6>D%qFwFfXQ{Z)yZEUU4fK)jpeo`tpk#97jY(g zl^ff^J{q{8WNzv&`5#7)A?3F7j`_xsHWf*DmpIe{CdoVDboNc*FFdHd3f*7&ce+w4j%Bs zF9Fj4?tys*`JX`j9j@Q&mV7^w_B#shq>n&79ecxty#Ap(9n=f_*Wur|&vX3Hg#0bh z^+@g2`){#S_Srqku^!0vZ&$kxp?)yG2TV7|56_c-44QzHdz^RbzTZhJyvy@%abkC0 ziu!jThvmA(_5^s3z&p_d9d0i9&z3T%Fvn%w&h@xOMw2!bEl1txP`bA8`t*Fp-#a~o ziTxQc&sv@olm2`Y`F}v#pG$vpxc#}=7ck=-zix-O8=0R|=YO$hr|&q@PC}K?naK5P zXWP!yuW`8VIDV~0{<^3UQoo*TxgALBiDZ4}31V4C9B{VRFLbwDeUCQucfceZ?m+U7 zM5B>%S!$8sd!MwmXgk`7TyEbqZft+R?9Rabm2%3Zt2!iiSQ*~IDN&6h_M%z%$k9cjE#a5|XO&faSkIcJeohzChG{?i$@#m!7tgWN7kaF!U zov$isb&-U>FY(r@hcSp~ot0So-Efhhsp!~y1?8?o?U8Z=Ns{s1L0V7L2Oawr-!gIL zjuWgOrrGuo$_bikj=cjYGYGwal&gMtum|@Eq)V7YoN2vE?Tx{03|GP@L~oOSJ=%k` zot=?9YKmO;E6?@N^+;@ONca#4KQo-s3#)T>jbdG+>{72bC}M?x%GCW9UtD|0+)sxDH}8m;c7ekiu~WBUy*XDMiP9-{Ec7H8E6g@dY3z$I(ASy zD;G4KGH}nQta5o=cS!EaG;XMT&^!TG*L~{2Yl_-CTw4cy50TanjY30^jAyz|y<52$ zBmIpzD`e9{yL~7QhOg%dr9k$UP42W%WauvZ@gmAd)LwIb(6mb1f82>OU6A^L$6!hB;p{(-z&**aSN0$0!+g}?-fy`D?LQu@ z^?|%H&oh;S<|4RSAD)9Z3XOKSk67+p(h^9*55#5ZT=hAu^bHbpe2-rcG|e1)cMC5o z$CN_qhyIp(K518=_NXPwFPED4PfxQqT!nEc1NSz{DOcv(1fOu9LYcTL)41`fK{E-i z_B(?pHwL|dl>4UTen8qk0kuD$cq=1<{^gJ!u}3@KwpHk+mVEOh%@$+7$faCba~L+<@omj@;`z4A+`7XB#HMBNqZGZm`v>62dRG# z^y_e+gj>NYYi5%FQ?w8%mnpdf-=PDyXqLkbdu5aRkDsN?Af(&| zmU~$HkLv}^&yIgbz?+1oIo!J~cOhwCAPK!L&Mwfuq546SH7nKLWd5*`vcEdql9pT0 z{2^G=o0n++U>XFC-{BU|$uXy*hDiNzoaH`9+Ouc^iXmAi(s6#Iy>HX|*LcIAsR>ux zg^cryDYG0YmuZ*;-{Fk&;YLBz(&5TDzX9eZhl^QBt`~WK9%`JAz`fn!$~eCjW{xjq zueOVV#`%3|<9y2g4!4Wt4kB$l znu(?&`ELARCKuAqDzRrvV*TCmXw#q>?r_z=^C>4m)^qOnxEa6C@ya~!U<}R-$Dc9} zSp;JZ((51fvKIUvl&!BiZwfaHnq`iC+u;3z_BhqGipkz9KTx(~{+)#oXvl6DD_(11941!GQae6ce%rWO0$s}GUugJvn*%E{cu$a`kZDRV7Sdv#x2 zf$y1Fdk?&4)-Gr^IrhqXW)F!i4mXQ&kKiltJu}Na@Sa)wpeZyvwf}n*yf@KQhg;He z7n8OXN!UX?c|O;#>A`-O&L-{Z_ zq0pbqqqb9z?YMI)6`&pYqa9fvfm_OQWuEr~Wp*It9_Jl9ta+ZfHOMz0QsbG-^9mQw zF~=e0veYQy!2M;Wd0u|agV#qQa9ca}$~>=iFZ~ghuA$qvl?zVnVaXbVxzT!cE*42@1kM<0jYvG2yvdQ^*1Ijc( zYVR`3J)HS@_~D?bH8RzXWq;;1Fk3m?Q!Us2*U9LR`!nI@V{cJg=%@BsrVY&Y4wqAv zaG-yXe{{L4;Qe?}xcwb&@h(}WBg`%i*ZTe-?wN<+#^8=~xH3QM3bVVzr5lh?;QVa5 zt-lB6XO9HUM-Erka|Xa1?r^WM+=A9~R;F>|j|R=U4BVLx_eO{Nzt(ehr*Xr*g64O) zA+K!mz4|X;u5-9@ZUo=qyjLH8jP?HyQe1hj{&$%B9Il;5`wr*5`sm}dH@MnQ%6s*v z`&n;5+Ag%;Ih^dRam9sP48M>pUvdH)wjot?c}T5dt}one-%^PR+ipqTCpd!x&d6y+MFBw4o7tlzg*NtI8 zg6}obW+Dl5h%@asm*?*}j2EHjgJwkr?tF(^BS|_uZUXKP8Mvz)Zk_+YjSUK#!gEsn zr0gf%2y?T;z0PvI$oun9`#$4vPl9W&jrkGYZ|F~lE7L}TuUH_*ltvOxC;ngSWo7Vh zWN^?_fg4KZ=KJa7uZ}K5dfhsD$9%Vw_9z;R1|avl(=%;-IB=geG-%qv)pk6A{4>$} zNVz&M`H{5!C>YE!#gY3R=lPba_d{kF;}BeJ#}&z68#O@6?Pcw~le9zGgX~!}@iw_T)0dT`!Su>6N%g`#M+-EH}Cojhwk1j&xQHY7La<^Env^U`ZK^x*lm z{$7HK1ZhkaKdmZ9|2AT zPNO5hiNc9Eob=zvmFsR>Ve za5r0fcOJst=sT?M9tQVcU$>dGJBPa$JF;)jHbqgoe+!+$b5|tcc;bStTj<>&-&Rbu z!}a_QmgrBE&P@XCA9B1PZUpYhAEo9=Tgw+VC-DP{zY)7!w(t1%N*ceNE8$q;jPn_e zCC6L17r+fkX2KxKUiMp-xgDi*V;p+}NtjBU$zEN*iOyo(_$b(G-ecX^;hxU*sDRE# z>Gq19)k&{|E<>&#O6zz>9`Qp2?xPO(i1`=pOGkklnH@Cm9R+Rz?y{r6jl9o#^ikj@ z;QnzGxRDQnCiml`(B9xyfE%LDNjPHdZ4UcPkAl4>&iLza8`F+jp_@^9dwZC)r_gig zhYr~XwYT792d{I7K4d?G!+nV|#Tay14bU#YxjwEdYnu(?&cfWjo8rRGXnx`G^xGvdd zG~e%@gwnZ_I5rDO_>kDO*PE53_A^J|zH$_}aky_g+$-dW#^aL21&%{-H)gOmK)G~oLH15hvo{X+ zum5Oortg61xEcP0`S;w^{9z^&%@5J-7yWabpG*2unTQfr6TALBP#-uf<68{wMQ}rs znQ%D%Ey&)`r|iEt3id|f-g6Y}HS^gw{vWvo)-$-{;c~l~3`eRRC*Zz!6u999L9@i+ z{?~TAGOb-i;chw#{xzQk&E5?59&S6{on~(sZtlDz-!9^CE5X%unIqMXLkk&?kAl51 zxSfuIy=GC+^gasqM&Z8lAGrm!W3!m?4epU{#}T*-j{-LicfG^?ukAQ^`N8uuvm|Kt z90mVI;THcS?LTr0YR6Hy%itdAcAS8_=_qi+p9jsK4p-a7;m)gDrnQSG+`Lc!Te~R8 zzh*_yoDEm~tM(plJI+tDHw?G_f3&xtd1@T)O>mENI}WX6-RLOT8-x4uQLvW>bmoJj zU~d%e`v1r+u%4}E|C7W0u3QoGGJ9FZp!EAUUwPg^wD*M-iJPAA&vpBLY=TbS55X-p zKUIIfS)Xk-qaRQ@cROi&kc9om6}&&kd=WI~!3`yIvk&b^*$cP+(Xe+-(A;=5?1g*Z z(Xe-I&^+UCSHHyiI@*BJubW(g?@5=?pY@}R_s1MduK&V)4X!@7JdgTQ1Jyz4+$N-5 zhdQB~koz7?1-q`S@4=WagXTlW-e0$2<;cjra z8}BP@ZeuOx4wTN7^WVmC3A>10?tygzj)@=QaD59>?czvr%~y;Ua4U!rgdJR$J!oI1 z>-KV%ITlICCC+#D3#h$ke`4D)+*)u$$=t@AK>lY~H(G?!{Se~VIhK1NaY6k~XdUa5 z4)+a~n?z6YZNhY}{jZbJlk9iT^xZId4fctO`K26q5l z-9OTox-lY>;=+aK@wgguAJfd<{9ii6??;9(=Hr8yhZ-^V};F!DBa$7IX2gF z7ZMlb-vrzR4p)4zj51%KbZ*j6{@B8?jmY)yU^{U`RY|L5 zxebU5st=L%LDS@D*bDdeqhW7?e%;|7seU~U_f5wS(uSMhyA~+jzsU>6A8k37-i{mD z{#UP?`Ih}3j=lNq>8H>`8P@HUD{-$wtlNj+ZgA{9QuQnb_bgo^l#Xn`}kMH1EcO>Ca;;^%yPy3<8%e{U+^gYi>;OhNRAM!tqp7`eA z@dK34e3@;Yv)p0CnXaQemXPry0rzi*+mZ1o)3_wu(Xb|3?uaxSh=xZdEaeus-CSU|2`>O zHpOMCF2Prmw5CWx8)El649Y(6Uc~P~a{^qgXPwFa5PB4;y^}0=1Zm^Z95fZV{_URT zhtM9zeTVxg`8T5Tvb`=oa$#Ko2A3 zer>rsNHgVg%n9f?6updjWPQ)SyDeA0_Yv9`G%q^-twR3W(49!R+TOlBi}$fAu&)y} zL_Mk4E3>_I>w)%nR1WyJNS^r?ZYX&*_$EC0ccOhrx$SLzs9ceEU{MRy2)TZkZR>B8 z8<%|Y$8++`-*7c_BLAJ}Wh8f4((kbBAR&7NX~&$+{sN?XWThUIs?E1MkI6H|mZa)c zXYxFXdLyx~AAdAXVvKJHX`_*Z8N{(>yhHgd|GNp`-e)o;@=Q~QTeEE;Q_0Uh1c&>v$MStm+BPKNcVgF{>GsCqc6PYtoE+mvc}V^6 zm*qZ4+OtT)Ys8EA562>9O03sE=Fc;I;f9jA`KbZ&FGa;GrMPE#m(h3f`P5~!0)2wA zzoO9Xo^NBXc;5$;e(?eFCn|9L9d5(Qd|v`RgVf&2-v8-4@q!$4F=~%mpq;dVI2Tpy z4A%1a!j$3_H?qL2CA_-RzXX0+s^S&U@EQYK7;HB7654A`};mgIVo_ow6;n_=I)wu3O-)0U;U@A4na zgSo`vG7XU6^CI@kSLXL;D)Y{hGhghh^BFS9^^d}B>~Q719eF2bmBS5rzyn>qU8H7+k$>t;sL_ z*R90rUz(x>-(Op@&HbcHxRpUTQ+?3&z0k#Z<|DY(lezi5Ps%-k`Z?SSykovWq`ibB zyh^++!@5>txo2-2?l!oMyt3wX^2^@jX~b&p#ojUB2c#`V5>^r~;w01etN-~cV+Y6M z)$+^<%TxCcUy}bjv;`?w$DQ9u%c`1V0_a#&wJP5sJm2&0Fk2rIbLCrX%nz#PnakmZ z`MZRZ$bT93mL*p1mEIv=WzuRQ3H6CPb0W%>YbT-7MwlFr^Fu0~;Ocd2M*fcIaim;( z%=as4xg4Tr1CvhwHYt+bDAfQtl;UpwlkoABSph z5xA=yZZ~*Q)X(AC_j!DyNt=Q`M(-iFy-l$G)pi^W=keR2DL*VE|5xZ2r1rKD1F`p< zi*rm})EYGx)#P^=sYv42;)M_Xo@yM2bb%X67B%Kx^7lp~kaF94$9!u@+l7i&2v$mC!{yL%uPjy^R*257Dwv>iabL)(;zK z$7LxPYLaJ`!)@)AHLJ;=KwFSAgw);a4WI2;|jJuNL`b#n074r6V39>xp12&bMsws^7lXwBjvvC z9rN`k?FA$uMm)0mKe_u07c%2G9=a;ew1KPr!vykAM$?gUOD0Li_a14VAPGx}WxQC2 z%XT}l2Q&|ak6faL}+<(?W{jLt*uI6u?2V;$#X&GXD6xY{mc zoUcupdPsuIA418$nT+qBNjs1bhqD)swu6S0zX9EW)V_*dR$o8ThN3sn7$m>{w2f;O z-okx^wNKkYs70PRbydor(hlCC%zH?=7g_G%w1WiPCUCVKdKO0zX4brYat7TKIU-mwcM{s+hVylQc2u#=O66=?sX1# z2j%`ie>^I z#Xs9YFNgc8y6pnCGI}NbTiSQ4)L?k#-r9P_<^3Y3xt-<7)5R`F0$Ky9;h8k=vLnDR({U zfRxLWMS|}Z((XkPBE%#3k~%&pH+O^OcFZ*=v!Gl#k=vL@$Uhv7Ldw7=!By1s`Nnf5iKIrc!M>^-4 zUU2og{Yw7d(SD@dqrCsq=c`XWK@#$bGqnqIQ?3~g*X_rHl&OT2%alq&k=jKN?k5iS ziU99Fhk1s><@PzjZO>=jkc3{u>Bcj?e+a|f3s=XBD)7V)=Q`XI5+vih^7I^2mvjk@ zh-JLc_Zez^(D5P;xBRN4f2CbCrA%{&8%&Ujw!RSM1qheH)%tKfyw0e*!#&e-`;hh! z8jgk_cYR^A?H_i1>DAv*7uH$e>U``e@;{GWL3-V|y_4XZLE2oj0PT1)yTE*GujQ88 z#+2Mu+=6yy<9$!=-zX z;QN@gkBpQyl?$)-ugngcdlu_HaVY^^@W#UPI0&oSZ=2Eh1Sk|@h+!2;rl=X$+J*>mRZE3l(zOWMJ8izZ^a*MLQ5ax%tcEQzpwguikl+!SI-IiGH zS)^TpI-qM&up#q@#k9H2++(HGv(SCHrrdYQde)Wvcc8nG)`#_$`y6R=k%TXZrQhkd z*5hhFDfcgRAv-J-p`4`F(7M ztIz3vBh55oT@3jorjX8~x>`R-KPmlcxPPvB&Ec-)w^@&)j324JW%yoVZ;&(%=kRxT z->v#VxpBCw9RJoN|JOg2Fd>I~tmWQ8+5jYBC~-CVoz(Y2i+{N#GQkH}hh3NSue^Wp z8Ol6|)LwnAsJ2R6*!velaH~1o7va5uW;xud*4}xfeT5`6U_6(3Nfj0iq@JlC4)kYm zJHyrf>|4tHfPO-1FHKZ}?}Wy@7Ya$JMV!eGW?gWsl5{{x6CD_%n7I_s)AhZ%oJ{TP_FqKuGWY843Ee) z55iSHOeFsd^fprNe#`xgwB=|MT8G?rvD@)O1)8(S|Bn7d$}LNsBKWfJ zDb< znhPB62jpLlRw3oqw%m%BvTlwf)FT#q|Iz>QnbhCNm|W8VZjirAXh{C+Px2R@9P-z0%ay3)G3sEzvjIeCTlZTJ8$cHlRIdJCc2LYfkg(?`-u0|7T+UFp>RE za5elz{v(^Set}AmDC=_aE<8fXilm*5&Oxc-xK`Tf-7{m&ERKaF=4k0aLWR@-vlCv6Rqu$ee~Iqkkl z!FIc4zjyx=nwo1SJI`%*lK*$~CsJ->%k^DOeM1uRiNkdMYOh{5;m(o_({fEa?A7{k z68USRx=6W~TJBuZengd8Fb<>6abr5mnHlVAZuhrHe;|Gc&ER>Z!wr#t?0qFoGh*f5 zZnmi}B*IwAyog>wYVYIL-j7IIf;OPlC{&Mr5lP$KZ0o}l3+(T!%%YzC zkhFIz`5)X~!u(3C+_9Eh@(R|(k%Y~S57OTFO#B;%TN|$J?u?&um!oTta%Wrar=%@M zhqt7@5Vx7ly1@IMy{)Yus(i&e^x%fy)B!1Xhvoi7+Tm9+w?S1(WD zyilyCD&cF{tEXJK99}I zHNH*B`PjSU{}O$JlpC_#t6DL~LlTA)@9)fg%8dovo4ilBf^^@X6L4Ed*_ zw~%r>S?*t?9eEYcc+ttIF&lNp^P`KK`(>HEBR#&X6Nw+pXSt>eT&j2?R3ra+s4i0O z?UsA*v=XKv=@K5}@9ur8`a$QV5x7q}ez=r!ZP5)5_c6;IK-vf-;dzO%bu7=Gl_|0K z;XeEjTTH(WSKFJ6UDdgtc-7%PXSoTW{X@o(O#N>h?oV*F-?^InQ((U4a2KcHc034I z_s5&h*|+**^1980x2#IGdC%d>@AVRVpOdCx4S!GP-*YQ_*DVUSAzZy~-;;kc+KL1x zt~uG!-F_cHRgMK>VzL&b!J#@B@VD$>?iN1+@ok1QZChBg6|p9 zUO_X^G~_<7C_Tz+AEj)67K7UuZd0$Ud6)e2(5Fbb+(t_9tsreZ+JSyTi>X999tSM9 z>K<=Aj(o|y53Y_wd&qCDhA9Fj^{in6YkWtORvt+>mDt@6sr9VP2j26F@K-z+gBwcZ z_VzfOGk#ZY*hWaii?FMu!x*4^um3&@NC&dqD zCF>(_gZ4|_NB&395TsnDjS_sXk+uLWM@!KD3dwP^spabPir}~G*K+)@p8UU}JxICN zS#H^Dsb{D_WXk)qRhw!Rg(`iexe>k7~SDaSP1hAhx?%AW_n)HyMcG_s?RIp zYZ-^O7JOc@1?H~~_fgBu^t@uUn0&d7Fn|NMvL>tbiAoaso%Pq?DifBC7 z^oQHha^-o&$uKK9+~+N~D9+{*ANW#ij3z_f0tpQiZ>sU zEwT41#}7JgzOtL&X0m?hM4ah4e|ST#xf-teSH{h*l$*>H!HzC9cjPA zGQWhxxOoBT5(*nPgIjaW$BrMGQmzeZ=WzA9-A-BrJ%I)zcifzq;s>*h=U3a4BGG&YV zoIkvidDM<%JCCt!^grzyOGw16K#D6T~C`qcc5EP z*;cH-V34dwEq2b8l;VEV?4^HztMzvT`NyEAk#cPx>U)8-sYt>M;&k_KT7N@uN5j>6 zHkXE9Zw-Q}#QDTgP&}$osRf^TRQ?yBzNK z@V25I4mV`E$F*Zk6iH}I9HYaJH7>YbqJD_%%QeUUlDuxs$$u?skJJxWTkgY8XPdi8 zAA%l2?mEG4TYq)kGx$fYxy0d)BL7S1Ris=V14{6HMA|AOVI#5hXU&6NeK>I6LLnJn zqWg2rU2wHN$bR4Ll=%fIx1)gI%6{KJEcdNOnddwF=#!ZYSL;Le4LsXMWs!1q-j_#O zMI_-2V%HC9?}70R?w5|evR+b+GR2+uMdAMLaK#Vj!mW$cUY+-4+V{LUrC&FHagOWP zWPOnRoef|%cDOq4E6V=P2;7En)xWa8vl+}Q9Inp$igJE5^mnf54%fCRBl|ns!@SAi zR!&?g=h{7EL_h{?i*_4}y7CKyQ7t2Un zha_wwPB#wed?!@WZ>Bi@m3Fa}GCPpkThaSJi*&Bq^fq&l;2c^>$Zy)lxc<3 z4-Ks!^jx+4^I-d)f0^&y4~2Ywb2Z$MS2l63x;@PQ?>ge`b{#QX+HdZMtNmF=nB7nh z$6g&T?jh|#Bw;Xdrtu;U_f@!VyBI;4;i(KP2IqcIn?gA>(mk{s8w;GoF(Dik5q~H7k zSKCErcz2=x4p-L+CX@CtN_QThjrD`hqvA*T&B=QTwhL(!#a&-FNBd0+hx-lo{D6K! z>Idt4-+t1{hCTlldLG~yzj*+z`XQfkXP~M`xs5&F`@w0F=)D0O|kkLBt*LG(Dk$@^c@zn@ZO75WY-SJ&5fOWKXB z;iA;@0D~-7?=Rxz{H8x#?H^>FAV9ewQf^0UZ&T6^w!S{ra&_Dc`u*l5xawb7C+I-= z;;yg9;eHKQ+p(+@bb?#d_4RTM3$Cw+1B`Eb3$7D%hg;P3^_rHe>+A7+<~wjhwm!%@ z!JTl6yS^Sg!EYXe+tPAnef=J|#a&+ym-m}@;Ocdg`D9^IZlYI~FWteJ3&dY?7ha`isT1pQ_; zT-$di?z7&5TipAsINTEZlI>0Ivp#@Z-1{t3(Qm52)$2A7<}$PfX?@UfGp8f(AwhLe zHRL{*US$2CuUIgb3VqA5tZy1xDiX>s%m`U$z~>zgfC$IaO3 ze$xuB`d7};{Z5&po}=4qxjJr|GyG;YT-(*LE!9W`DRvU0-jVGHyny_)S;1ZEU}@ z9PYz#i@LtvJ7wH7XZy`KxFO4xar1Gw#a&+yo#Qtj!*$2aC*T%$eLYgmZ+64g>n8V` zPr@zk{U$$VZ_59ftiQ4jGZt=f$IT$ziyf|vn=)n|Y~1{}>o5_xz2IuQcm`WvL6ecT z3mrE*)y^?*lP=+ted+h7YP$&5@S72E)xR=s&ZTT|*J0vt--TPp)-xG5KZ0B2br{=@ z_5F5{b6M|$tL;tJVLpMo6saHdepA+A){?#v{bL=*a{u_v+s_rM={HCHRdC$gO1b~< zI!t`Nw+<7mCS-!O}M{=AO$gN~cQ zI;{7>)qY*t#Yo;&QrvMf1ov%+E90iGbMeQ`*!h05$?=1nKQ9CKD5UOKoAY2UbhuqDw<(C2w& z6VIjh!OXrX>4$qPH`9KunJMFDyn)|b4mV`EGH#v-vx37NWVuDz&lPOsH+|r`4(P*cB|3|HHQyzed_X3*iD zXStc)^R?S)7tgUzA#^G0MsP!3*~ELk&V_lN!?oX~NbkFgT;?}>;cB~(_uX9#^HPV) z(FX}ddf#2F8T~_c^159M?>2O=!_|4z0@8M%+%Bce5oqah_7x0bj@vuSbalo}xj&7y zWPKg3wl}H2@($*cDW~wqN4`lLHv=s2X~ zMX(j?h>jm_q1^4LH&T0>S$q4D_9&7tjJPuo*mYmLa{ zDff2ET|wG*bXYgeo+9~OiE1onOTRP7a<$)yU+Xus;A+1k@wi;0g6qG*>zMzRO!hl+AKMgWONYxA1PQ)O<8e*P)%D-# z^?uVCZYWXIB=%Q#hk2XBo#1`uE6R8rZ|66|;A+1k>%aYB4sf_rEVn4*aj-q>zi_pl z4Ttv(dd=bLc)X0XINFJ}AgO11uD!MOgVwW92j;(UwLZxE6LM~$E+MTCIvxi|I~_@o z_a|f;kAq>qIXWk4uk>d!78iFs4#B+uuC|LB*mE^%kJMh8s|4R<(%wQ}p-)k;G3Wf3 zur+QA{ZC4}2z6%Mbht9kucpj8q}&UX%V+;~oHsZ5&BJijzcS8mgSpe;VwMD7QO5Zg z+!=7Sy~#Llx^qv2)ZP}Bn`xZy?XGjg~ zJCd{)kc5fEnf5(IyZg-wxY{pBJA0inGIx+5=NOJp{H>7pI>X8GCEL{u7%?;-seN=K z5`15hwiZd)Of3CN>iev9yovVkn~HGtd+#KFsUDmsM#|NF1ILqg8j^4}v7FN!$cO4n ziFKY3yp{VYxZy-@V``GWKDrDkSMS?zBJD2p2!ztwGz-MzoCoP`S%2x9TlfW;(2RFTeQ&ZX3%j(UUnLItD4X zx%ZjxMAFVc5^4~yoc+)DYmV-kWg1d2bO-we;CA)On!4m~jG7|lYI|)>S{O;_Mm%WF zKe;WicM_jR?&Q9wbn?2jt&wAHr%Z38+%gH0@%7|04gL6gy7RSq-Ar%4X$;q`ul-?0 z9PUw;t4xUto971M-sW)c3TK;#U_Rn-k4wYN=Ztf@eP##7N4VqR>Uc94-Uu|x;pSTI z)1P{ImhzJ|93ZE(1!c%S+9 zkd|{RYu2bNa^E|<+ty!w?`-I9zo~avvY$Pf{FTu;NbNntavPF%C2Eh_AoqRe@h zU5Tv3@6`nF@tbaN>sWiclm9MsFH)}F_dG({NF?DI;!N+I4fSFE3|Gg;m&iX2y@8b5 z!23UaACUGLlCX?;5gSxf-)F1u=ZM_vH*?_9H6_9t@^3<0kaBHZ@$Dxq?>3JcB(BE9 zMCW1B_ehX-5ny~Yef?&u!>vO8+Nds4uGWVpq+N$3+(?{}+s|)KJUn^da|`+JKzAeM z>iWfC(#9hR6NuBb;{*3S{r#pTTy4iw$v+#-LCV#B{R`5*LlVB=LZ@pN+TP-D2Rd9C z&wixr7Kd9iK`PpPu({uFW;)!T;r)j8I$T=^eMgNbVX}I8_TF48^Evql+)Z$`e<)44 zJaht5KU`?-J(INBNJ0Z*88;91Uf=Koese^bWIdDnv?i2khLo$%U5j#`7L52!eYn~# zHRPtak$r7Zl?RR)|RXHX~Bp5 zW-;85<;uG03ou`HxKeirMY>N55A>UTa9et16Tb^G1LoTfSMRTja-SA`*l*6@g=ktI z7Qp)kZE(1<-b3&OZfBhqHA4-MJb!NfH}CIa{w~uApGf-+<=(*@1NFF?dE|0qX5W`(hR*P~&FFU$b`0^G(~n4U>yf`XYKfG4rnUDL z((XqR1{2HgE9&q2c)eNjJ;ag6{N@_C+CNA;eu6Tik#e=Yd3f*7!p8Y1+(#U)wBs=_ zpLV$QJXDd|ad0U61{^;~|68jZzaisrb-XA_{~LUq@fdEMKfr79Q?5li<4jS*bgDPY=?1*41(|^=G|P`m^{5 z?t_mi*q@yNv%16WX}OvDv(YL2S$L%1oCi1Ll})TWHHTT;=Rna>esdFCw?AtMx46%N z;-md$G+e!Itzq^;{gC?Ce&&0hv{h&?+KK9XXiS}3v&^DBEhXd=eWBg_wT(^Ia z-y$m6JISqX{cBy7hzjc;;&694TpzqVRN3LyvfL|3>ws=WM^4B|^uOi4rT?X$TxRXn zc}Z-X-<*1MvRyntnek{6Qa?1d+_j|rhRWRq7s>AjH(uwh$L_XV?bpqCziAFv{abnI2{#eT`rA_G5Zd?Zd{X*{7~KAF>m+isG(`TpP=BP{o4wC`BT0K1 z%|@@IISeE^Pc3(`H(!^1hj&W;=ltedxZ2)6B>!jVYouIVZ`n-RALz)tx#vf_c^0PJ znwDE`kA3g=^PHDDCb`~{NB#=vRHWSdt-aMr3n2;3h?mmQwM4ET=6!76hZFUi^WlaP zxsADs{5PN*k#ZmQKJ)b?tsj!`C~=q@{Z#IObNw%{zY4Bix8dZUg5E~T)poI$wA_1W zi|8!mwu{!*585sw6WCt`*KHRUQKq=0)yy7>1!`1QP0m_U=lN@g2gh!2UEopmDZXfnnAh%ugwtmod5u4~Ym5)vOSK38I z$`rRyEq$eQQO7Lly(uE>Nh*!R`Yylq+Qg8 zTikXLoW{8jUa%XoTxl0|;TE@DgkR&n5U#e1`Y=18K1l1Cwu|pc%fFX3JJb+WTh9CR zZeq;+I?IfXB!4eb`m@kXzj+X@+b(Wtlx@0DPPsbovtKC@6*gXk;m&fnx4^p(jdZvn z59s@Xw2i3DeLQDFCFjx4KAL4lU~iR6J$toX#NTG#2UpugCGv+*8z~1*+MCX!UMFoO z`UCwYpTixx8ZP6|ZtDka7xDM}rd+wCf2CcV(3j`LNV(dt7iGMN&heY3aNTxsF3bxY zuHFx28ZVZmw2S!r>>GgVwu_c9+c@02t$#C(7rRs1Md$;+SqIl`7d>I#?r;ZNZc)aI zP>knRxdq!rf0zRt?g+~*%6Jj^&~F;T)pjB0Hy(#s-18geBR@YSQ?Ol(fLrW+sBlL) z+{C#@xCh&Z`ftxYM&QnctL;M013v}#VCNp6<}(R}od*uiV}G{eU)hKH0%eQ64;5}{ zf3jW3KGc`t7Ih!$Y&&l1`HjeYo`=EJb|L3Crot`ixyMD8EAyyX_$jo&Z*G9A?LyAU z&wzWdeW?HTcaVY~vn~fWBo~7q=QrMl`~N-nsPm}MLcf^`*KHRy`|=J{>V@`aM|l6G zuPE=2h{0VB*Bviz{*?FAw@z}?Jr5{syokfi%1d&kUA%`MirX$ii~QznxNf_c3-@5{ z;@_T=kHc*VSN$vP;v=}lZ5Po`{H7mV9WSI^dOTW1fZYXh;z42l%-2d-*q37hIU$HM4 zuJ&g#kJ=BnxZ_3eYrk0n*KHSn!!2&R2*Lf`;Yz!x#C<_=$BQW3(~d9LF0%U-f4m4S z<30ec`d7w_QgDkqUYKuq&jVa-7cyQP4!5Y|MZnfyokvCCM&assA?@NAxJ7Ljl`U82 zQQ_t6Q-`bVLgrBcxCa|A{_Q*}w8C%pz;)Y2dAR@IcA@jA@Jh~Uo{+q5GF}AX7I(ae z!@U%)+b$}>EpEFo-}=p+4p-X6X>g0%F2Zo1hpXd-oO3$^ZgJ1KnN@xhbNnmqqAJ|t zwu>0tt#I9TQ5|kk+eIB)fAySOc(vd7%O~4~%%keSE$TV9rk4B1Z{Gbya1HmdaNTxs z5!{2di^Aqn@%i35ty#-`EL?3Da?Y(0+~S^d3x3CaEL`o+n!s#>!btBg{N5Pldz`dM zDD8VytRHlp*2Jj~aNTw>o3gK%Bv<#t*dZ_x6?T6SguC70$~m|9;C_JAULF%m@D=5E zR-@l@ZsEkFAHIUO9&K{C`h3&$r~gD1P(E_chj&f!Lv%gsa&UtQllUFvFzt;pRgv0z znfIA5<9k&sSNE61Hn6`HuKHKbhhGl!N{6fa3FhS-^nA12B?b4@M>g~P4Q?B+Y+}F05}3;!?f}cp^nA0X)ANVEy{k4$Tpt8!PV;~?;XvB8F0A!EZ2Ue zL{y&7Go53J!hIO7h6?1bifW+}B+B})T~94}C23vJJxI>Ql;?bmJj-g0Z{t66o&E#+ z%y!;C23N<)=t=ScPy0XM2I1cQA8i`CW3%GRmz^!~K%aUhJ7|HuBjdVt4=6 z>=bSk?)eUPD`ox^<^%toaKF3@)FYSMFY@M94C_TY$eR_ZogRwCu~83$ukPQiNv46VJn9OUsj})IUik* zu0p+j;2h>Ak5!g4Yr;IX6z>S3VB~lDMdy3pNB)86bEI6|ul3LXemf2w^C0KkP&w{x zTAq<@R`R`HuUI0%JuqL)&NJOlNzQL?B>%l=2vY7qYww?=ReXrwHbHgKpbw2{{fD>j zXS4OE{yuBCRGyg(SHrdB?|`}>NfkfXu{nDnX;YBS4Wvx8be{Q&@|7)M7N38J79g?f zA*ev}KNFpel>4ydUO-wi zB%v*_)Stbzc{j#x?;6SVQ9s7Z}ka&O9wy&#oc=_Gk&yS;|pf>hEFR1l0E+X~U3&yN2*v=+xiT^VnJ+ zg2(3ZJCaH67|K0`A6|60iSripFK?0dq2(?nPUm0c#^BxoSL?&qp`X5`0r0XS_g_hOwsxHU7+)Ie&Zocdt`CuKFQ< zYMvSEa6cmdQNwv(EK)yo@Va;3-ck5Txk4{k{QPWX=e zHO7=OJ;x@w?Jc+4c=qT$%h>)LXMfR%g;^#xzXWSL*=Eoip1t!|8^h~#O{7bnsZcpt zADTqjAJseCTt%$*9wUFj-Z?LoH20D&VJNYjcSt>FrR^=$HP2k`aL17URWt=Dx1!}P zCGC48VJC60A>(+cV85eWb4#AN*WvCZf0tNEQ~HG@x1QyONxK~lM~@=mMv%0NsjqwM zDasA^$TM>s?yKZqfIdNL?`@WQ@{63CLzknAQORKP98hyRuTgH~);zNXuGWWckG!{i@~oDNH(wGzJkN(z_tLGt%P~2myK_&uW^Neo)pZkrdq3Q2 z7F?Ecl~GNk_D=IY^Nsm1$Fw573+jN{oo`H2S>)Zp89wY4{^#tI9!*lbZ=QJ?ZqO@h z?j-*J^e|Fx%=^r@g0u}t!d~KZ=lP`H>BZ-<`}52UxTO=h`QsJVz|i4HxlCgv_{t0} zVU8tT!ioGnU477c7JMMjtaG^elpFR0_B&jrbrO6-IpbT|atr%Cya?Q~XD01EhjQnm z3mxtew*S4Bw5~`(Z{pJDGM9Xt-`vB$dhOKScqGr%aJaH=w}IbI?&olIoKFDlABFv1 zkQtC?+QQWkfj1nDK~iO;o}KO4TXGg@3(#_;b91q?GIhZ`m}l;W6XdTlFZhl;+fk`k zlh-L^zjp)Du0$PBThuO}I>cPM*Rm|L_|k0CmVE8PUOygrD9=3O*jIN#N#4t!ZTeGA ztQPwkc--tZeAXSQZG23Jn`b_zy!I!LQ|=9P%*3Q!S6RC@lC~55jebY&I>gc6rko>t zG|zkwmti*%I!|J3LAN8Vmpb3*OWGqy!f@h2r*WMtC9kpg@Ta-n_l?6Xb5_#cC&?d0 zQ;>3HoG1AD^S-YSNneC2;tki{I<|ct=%)tdnbY7(KPBO7%Irk@k#hT5Zq3P@r$^n; zji_BG<}){W_Rh5ZpY&6u$R8V$XF_n*4|kFO0rU`3?qJIuPTDg_!UW<$_+c}W@2^4q z5PdAqgdIOjCjb9X=_yI>^OhSX?QZk}8iy*^#zFPjL$QJ9d6mz`3+4}2Pv1^!31|GX=BkWG#MRTJ^A~_yHmK) zXYRyWr~hJ&pWx(R!rzUTC>3 z-sGC0$It_4PCMQQWb4_|Ebso`|Ap6%<1gl!?;LyICjS!Tn~~&pv)mU+dkw8c-=Nv= z)844BoBL&%aJI))dn2#pnSF4z->EQ@xfQwysl7uiSDgGf=@Lc}ryIX@eiWIQXZ%%@ z?P47Hr=ky#au-^%9kUIApZ;KO{CmamV3optO26CP)}6tGMEiL zd)L@`cwb+Zxf)LVwLH@wuKITn`9E1!(u^QhZek#(-+6|#$wnGBFM-pNy_!K{;o=env8hS6!oB~(-?~?CO z4^cy;+>qriAZ-;Y_b#8IKJPK!(5|GO&PnMH%?Ekr2Doy4f_%67P8!ei{na{hjOpNPOwi(Yqo$C{wpJyI`t3mzPm2&FGyE6FEEXXsjI)3ay zxqfI6QoGphF2VOAX>X#>(E_xLFSCd_uzcU9cK&j}j~}y+Xuq!%{+9e3&<>>B$1FEE zhj9hfN43$)lalkT-nLz8eT*;6Ge0`^wtb<5X-=7zNV#Jy_d3$LAqjU#oZ-4h7Uh|o zb8J5i=pOP9LsO7)qn3N@`>Z*mFuDTC^=Z0^cNwy;pdHtzJo(gK^Eu--Tn&1C9;TdL zA8rc{TF=9jZ$^3TFZBBkro7rU#kvE+|GyL4t4CEPyS_S3sQSOv)l@E*>ixJqI$?3Kgz!0jiU$Z)6zWiGF)w! z?aAL2^+3v9W4Xgfdk#sMOgz2@@0NJCpuH8k(WaO$#lFllAHe17B*L5I{{{s=NOHGX z?n=^jqcSn>wUE1R+N)u~=Q5#Xtc$=6TJCk^?}~aLwKqrpLc2Qr!&1hNB-9{I_dd0k zsk<^RMOU)E$wWl`P?!9dp%zHFms{>O()J<=VsNSp*9aKX#(3Q&*VVZT7RRvsSghKBl5398<5(|@F~HU`!RdlPz_WC>HV?r z+SqUXFw?#J~<;vJ1+`C8{fFwLlT!sESbRPExyOKT@d*wbc`oBC= z87^58;Ysp;f<8yet?zy03oe9(B%DXQsABT@o!Bhllm)C22>16qbFstyaa~Ds5oH=8 z<#xARFY^9u$LI3?!qk38xKba?KGxqH?wt17=0?hNcDN6DD4!R3f8JdPHw5<)xYFM4 z#y5S*KN3xJxW`!T1&f$dpTwQhjAwCAxQ+Wd2JPkK)AkmmrHzNHq1Pzpc$btg z&)-(!z_?J351Idze)5TI^BAA&{KxZX!9V#4kwl2Vo$dHxD0YlSW0Cq-uiGTjW+4f4 ziAOLPq&^S(Vm|Lg=JRk?z$}3q;_uA?eN6r}XeUzcm3&6uii0h3oFIbO(n{O+X8-AK7CXGkbe&kB2w zUl49xxEh*2z_SRL{g9-Jy=}Y?v#;Z`n~>HANsdsywNri|=ZwYxe{#ep{L#*HLCXeI$k+eNX!V^dFTR!yHsqItOLt}6s zb+~_0?wHSbj)Rmd>*EApbF#jblK<(eN|+wR%Kg)FA0cfd8i%%?>+RRk z`YiB{(%$gzYSQ+g!xk9CIJBa+_N2IMQB63($MWwRc&H zz47A%W|PDHhWx*v-;i>zv|RsE_UEEzr~z`hvmO5?u3Pzl$>sr<&SP4Wf5rDXraQ56 zZ?xR!NP8cBg+4(pcToyAa#FxlaJZ|acDN7z3+~<&uBj9-1JiK3JKUlFf?Im5H}^VF&rS)L zR~_zy@S3jAF=HL>Qc41@{R`Ta%#N@aX}w+2P(ox%<%lNV)G> z?vtdwj^?8|$n`_z6hFi(2h86NcQN_TtId1oh?Tp*a(^amKax=5>&$+LoWZ=HRZJG~a#p}x>~JrH*Az8#xIbF%wWM`K z63%+N;5g)6wd8e+!@b_&cB9$*Gz0z<$rJQp0 z`9~&hn-p&J?0|VB4flJ8o8?W*e3`giQ@EyDz&x9VyVv0!{x7(FQn=yj0rO@W?orE< zemL%5a0jJuV>JS1Q5xYzjA6Gho)G;hyhs^?6Mu|4vNdMrsAj|I%<< zI9$6dn$h0bDcpGNfGJx$*^agTc5=Aq{R=-VO5uj;1Wd&=+&&IB^e?z8Q@GLd1Lk~( zEBin@ZOSo^J6x8c6W1;Ar~O0rica7LQ|ABLhTZ-*2DcSlK2C%u;7vob9PTxiyOgvw zXfwL2j&~1GKF{Osw)36tw0W7Q1}_MhTi^ygtofBPS>N!S4QV@Odw~Ssh)pF;71AZt zA`Wvuz2ENpQ=5CTekJR8!FmBR6t0E_nr&(!wa@FmjBnM$*}SLPgAN?Ry=@@P{SSrYd&l5@RPIPV8&CR6XaawCxqDN%reVPJcep)zW}CZEAC$_K?;jyu z!o$QaSL>_V8-_dH;ZDYu8E6hl$1PE{gjv96{lW$Bt4fda+L?0Wa6fRky;%nn_5Cxw zy$NIaV?eip+*Er_qkxIS)%vgmTUMhjY3wbrg7-3_Q_u;>^+Q1I&!n5R`g65)Bd$*Ie4;{6V^#SCr>({f-H*~*l?Bamw;`pI5`KzP) zD3vS!Zzs}wqOQobw}<6weF$F?FpoQah>-trG!~_DUnOk@nvdop+5cMST(5rBvHm?U zKW`E+GvU&OB*G)qpZn-&N1;^ia6Wq)NqB)+_K)ehfYvkJ2ONjH%JIW1J3USP zoz7?PTJDF$t{;@Eeh4+i(({w`;S0XsO0)r`+WRYMf1)zqa@|m2BJ3nPkM5)|_1NfsVpH)V#y=_wJuemf}nmOE>q+{=6d$Y|Klv{;T?NvYg z%4a_#*WNxU_Qv48?{NPlf2mdcW;#mco=I9QR1fKSF|B7cwH@=Hi@lL%0rLagpfzUK ziHvPO8*>5BRPKI0^PS|4Z$}cR8{ecI3)eIcn9_BV_3Tn?d38y)xqL~^Ke(;<>;@#E zGqLLjt-lA_8{BgoZa4C;hb#3i)!sY!tiRYC>=LzHNUlhe8{b5gKT@7!F3it#IFdLlN@e&@}Gk)K&jkj zq_syq(9KA=#n=>X_{xB(2e-0(NkSj;XMJDN}wf50`@1WbOtWPO;!_4tH7=kqlE<eh+FrK}e4eR3#Nl29SLb~fGaYY^u0U>m zpz8Qm!TiB;cM_-T&vf1wzBXXGI^2QJ@k|yCL#f;+NE?qNyhNOd8;AR*z!?sKQTB;Ul4N#c~^^0$-kcO_7bsjSt6I@^uz2F zZn#~*JPfy*SJw0*|LY$yrzTeJO3Qtmv?!7=k+`|cPfsoA-zOH>`>PuQW|HII*U4Xb zMYegDSh?#h_Y2a#LlQO-i+^M6@6l@}vDOFEAz;36xZBBp?04*ALdrc-CJxkxX{0Sg zJJ1hE_D%Jh=W&;HEx2#W+{AcUKUp7Yu47#qwL!|QVYx#|8;ho+3COJv&Dm$*+8en! zU}|2JUl2-QL^cW8>e(H;Ra#^K&T{+{S|q})3#_dU`+L+jBh(ygsLH|bj2FyN(yN&!O{lNJdq}+9u`x0r3(2r;x3O1zw`J26@ zoY!m0W=6L@1Rn~R@}XpXIA;@epE*};V&(p2x%ElA6iH}F?A9}3N>KlX;hyhsuO@$Y zbQ@Bx?B6B$9w+TtGzpE{=&fg{9~SHV6&Yoo6CD^ZZQ<&;_8w){p$$m6M_6w4A6ffE zT~QdxbsHGt?A|W+!Px!&I<7?r1x&=T_bKvELT^Yp{$Cj{IHoPZ_cdwj&>plMxqfJ! za(@*a959m|Zq{bn#2Gmzk65`phD&f8k#-g8hHgY|eb}Gkhu~uY^RdJ2NB$Sk%SgGp z-u(k<`_KtLaleS9U94%tUiaPXhkUSLJu|}tW~0Nsko=dT%aL;1SbO`EHW*15ODyXo zLu;q+C&N$hJfT6do~a+6bGY~a3qMqOv*3B&_{e}c!{L4kFOD`k+$Suz^cLQSfKEZ9 zelA$g+NE$qqXXtrhg+L6_0g3`{V>6D?@o$he$m|7%m2<~);n}fa8vG+}f z8}>{rz&)0HZo5deHw<@~!+i_hM`($|?QFT5N&5qp-pX?o-YX&VD1EQQ=#=&rdMaT4 zfUEsOE@jH2AX5KIA4TxhAnjr#LC$HEqg^QXfV~uw>lTMwsbRAIHmBTai*w8k4!2i= zWPA^h_B5J-UPZyi^jr13b}=)>-q={iH;4NPhf_YH%mSqL_O;yAe74CRURjU5nfzAbUPpI4w&%aH%cUg)b z7TNi)`Zo^u0k{YJE4-hXGb80rv)m!1y@r;fMJU$Lm`HQ4p7nmv_UqQavF90w9DCKj zCvQ)3XIQQmd4Cq>-#FZ_9Bw6ezc=Up!QsAbx#yC036gL*ai;nkjWXYHxL1=ujJhNB z!xGDVfV3g#NhJGpWE`q|p67>^DgF(&-Q;}}xz7Rzl#T3_@6 zdJ?r`qw6+1U!SAxjl9yI#U=*KQ7j6mz1r`5Ksn{^v)m%}JCnG-aJYKi7CKygk3gpD zwmIdxMd025SKGyEct4@Teo5MUoSmmOA*~}Ci0(%2{pMo5zu-$szZ06meq6_1y>62z zr+&z{T+bcepM_nwFx=N1?lgEiI_8*J4);XM{gAX}=m)eGx#Qd36hDNfGQK%n_3t*y zsl7EUH!@xhVEhC^7GQll9~#N&kKg@BZ2)%qoYg`$adBrePO<&$Mn9hT9yj z`d8nJyVv3B{joA7F6{jp5xDm{_U;!ucGJHi^+Vzu0N3p*(z>7r&|Rp``N{rwoAx^t zlJ*vx!M;w%UiI&I$|+ah=iu5~SbK}Z{mS7+;Y~zS9qt46y2VKQ8m&jGkUP$opHcAs zB04i*PHvj?ua5J-P)_aTXHFz!9OnZm?JYPfU@n8J{aMa$oB==$kaBf@>mUytWS98yxOC zX}EupFWr7H<%Zz?Bv~x86)a(N5)s<7~uX!(E`Z`>_ zZpTqp?d7#NMZa!vpLe)=-SQkRKe_l1ZlTu=?gF^l-cEpbI;!h%b^YuH(t4qRs4sG_ zTe(Y<`(P6DhdBYW&9PUn+c?UpA2y`1x6tbb_h=Syv_9x{d)DFVzT`~TtxoE7dp}^V zb-3D}O>(%uTYEFzw=_-RM&LdGSN;1wywA~}4)<@%?Y@`!I(h+(L(-q^KHKZhny2(< z!C1gdbnI3C{zy6XFGc=Q9}4qt2<{SxtNqzlhkLl?7NtLne8}@5xca%TX-JlP2lQv z>kO|qn&xoNvE2Im=?`xdRgT~q2=4DOw9 zD<`f7$CN2^;eOWVk=lE=ymEIhex6CCbOmOGQQc}T*D>%DWDHIMh&acaAW!@b+#s((Lqxck%CTbO^%a>jYM zss3H!a1$HW3%S3Tn&RKkih%jVu~*y0Uk8H=l4&EwVsu> z+#0B;^unYJOm?UT|jA}a&t!WPN;p!1!O!wsadx3Kw66mBQD>fgrjTB1%4 zSKiMeet3kmacCNvfZX{`&6N30^xJ?L;@GSH{fKhvhhQ3e3#-2|xUV@}o$q|?aP|F4 zndUo#Qv4fU6)?X!T%D(W<#21JvA3}MiwNA~*-WGTuU@z14!2GkZlTu=ZUeY_-B!Wd zgnoCp^(?pi-|R_4by4bdYn^)CRtHQs$6mc|S5Q{3TPTgagdWYNC za=VarH|me>-I-HhycnBu-6CrOW`)Dm`OZLx%kk?({mnGrnV7;gYnhp~O!{{$yh&)Y z!)c?pbOCKdB%i4^xARcCHov5=gE90w1IIGuGRZ6#`A?wJbTw@Kgs`_n4fLpIgZ2aN&b6K zU!?X9wcJ6ZJ%iprlThqp#*IcEcXq0OHwR29CQ9mucgQc}P>fi)<1Kd)X)DloD0Tj@ zD1{q?d!@tG_V$Creb#ba{}$HX;&AVExYHTSZe}9#lf!*34RTkbieHAI)A)OOrEr5&3soKJM@RsVK$xbhw?f-jSQSEl+GZhouebyNS| z;&5L}+gG(o2gxFPVsN(XV%ZsaQ}3;i~a?7ZwfcEo&6dPSNqAsOD64I zWx1L9$!g1tlmA^b7b&-i0^1@AMTpS07Egj&R9+w+{PZ9%T=PaP&1{$~Hf z)yZ=>4anaNU4fLV&;4&A?RNAK>Wj*q%X_uH@ocSQ>%*qgz4y?^O};rBZe{sD2#=Bf zNi+^A_bu-u-y5X8kG?<)(S+JbZd1#Bjr;DCvRHq}&NtV<4S8kF3iAJmb|d9}V7VtB z<}+uZW~dRWce63$JJaSK;@;D8XKdtI0r_J&`KCWy?bq9oKblp-+)S+8C6@aXX|vE5 zXdxQG9w}`XT`gDl_l11W}Xb_5^rp|fmWwxH}?&{UE z_+k0Re~s6UWxh0*{7cYgq}<;uw@w+K>53jgebBZ=`1eyjyg$qAhAZz6s_)A(E2W=0 zGT*d>t6_g`j=5+~j+sh1NtOMGdx%*cEPa?i$CN|q_J>K`m9Ww4`%D;aAGoD0_;q+A zdS#m!vD%x>^(FY0k+uOz_?1}tvxDsmiXN43#=_O>wvYT3%KFTyNV&QX`byGzA_;vY zrmi0JJ+#N5@nCJy3mA8;Kw0e~9ta-*T4~d|nvK&*y#MN&j{r|81y0Qf_-| z?+c{8i@rghBbiqRzxUd4%@l69e7?EeazEi(ZX*BTNBK+uDfc$ZZAMyGG#Cv)v5Pp{ z4|frMC_6KYcU>E!euxC~%@1%j$ou!Co*mDR%xFF1mAn7?y>n}9J&VIF$HJ!8Gg&v9 zKDvZ?8hg}UeIBd-x5S068&$|RA%`1NU+w%df?RC?0WTDgZ&5ShMIOUY9 z&ml8$d#7^G$T#cY1`}V^n7`m1b&Su{Mauoy+I#%5^k?WjGy^SN&tAuSN|@KF52L$z z^Rsg++xyt_=y%#Cx&GrA!_b*Xxqn)2E7IB{33n1tZO6EIt+&5Vd@Mo6Az7~uo}X{- zv)mA%{^Wlgy@-@s)~klT?WFn2`Aijb3YyA3rm6eb!~S5F8I2#L{+7hwGS0^@%r`H= z)u8=k1IkIN^pi*Mmw($&+Bq%nzsNUV!PWYEF}y3#wMgwf-}`TUH1?FeA{%XGyYeawMa4#W$OVl2z zy?0pd64L%gmHgaipo#DDys!(u%|-oPtj`NEAmQJp`Q~Yd+nW6CQ4gft;g&(S8%)tHOn_2!wtzdC2S&ph2OLJ`PC$Myyce7qhCg6pi1ay_99lP z?X`=E*1tO6i8RkQyB&M0lm7yAIZ}IHx7^1`dlk(`bC8S|mDhXr)}vn+yVbwpEAma? z`ec1rOa5Kxlt7aErR7c~Z8bVB-)G98HEe)9<;3j7`Ien}|HgL~|HiJ#H;*{nrsN-u zmLjzmw@C2yJKkqrN4wEBG<6~U0ONq1zX(q#cn-yM$TzRT)%in{6Q~d9Dx};h-q@1p zaBd)7LPuh$XQ}6656t`Eeg-#~$Zbp)^7luBkaBBS?wh17MC;HBw4eFIRNlKR`<0j3 z`YZjJyuUYmW4_rASHl+a|BCh?NtJ$wsj`IZKzX03jKoHHACQDdr+nk%0iAwdw)7P^ zpDE?NZq_@Wd4v70IumEw4`w>&n=>444gTM{s6Nu~tK5d9wLlWu5@+JZZ(?5Ka66O# z+gr2ET9nGYjnD40+|7KRj=KpXq&`J%&Np{D+yRsm4MeHjgrW8i`8*w0uX_ycIES11 zo*~!2MS9OrmwfY)!+jJxcJR)PT`1Mw;e7TClJHU?_C~tqn=KA^68YaivrsDc9nuyc z2}_7G`61LT-yBQj(RwED%|F<63-j3u%dJ~Cb3Kd0t>3>^4lseJtU*bTdf7PJ< zY^Zy_neK28mAw(T%iva%FGrAfCFuJS+)C|>Z(p!SzPT8VUhk^ivW@7|e*e5K*0e-)Q};sNa|8F5LttM7&Irf8 zL*>6H+;ras3yAbGu{Tq4HlG?z4x$zTj=lCmj0@mH$F;x4_ls3sczcBYLzR6H9{I ze%sal=lC%;%bO)e;2eEp^7XL{wE2;9mEZ!wq8(Ess@ z+kf1Dv})-U48fV`*mtP>7l!+_V_&BJFOz*yIRA6(J5>IQ!9A&Cay@M@W0a^2^Qm<6 zIO}F}B%jCA%xCm>bj&cmOzV|ohInQ~{vrY+4a_IU#RqYwZdlg=d*WDkUY&?2AmvhWX#v_e4 zino;$@2P5E(>>h`!25Uhk8^oXQ{wrrDCgKD1@OG?#CNLNGl+NHDTptO=cp6kscOFn zUVppz@A|c6B@4V#E0)~tyKR#5htirVhwyyr#CNK;!!X{xj`vixX9Vxr9pdNR=W=0UA#|$t*Ylc7$X_KFE=cQHp6qS@`yu*@Xs=qt$N_Ku+$BiJ~AYL8kPE|XE@DBYK;*H>a<6nq3ig(Sw5U>B? zbo2Ya5N`nQ#hfoc)%_uaw=v#R-5KPI9QUGkI1zm zy-pOxyZ;n?@4zGJ=A3)u>*Z99gF(DkIo?yY{o`$ox40dzPSrRV#XA)5|F<6n`lXv0 z|HAhU;@#wU|JQz0HK8B*ALU@Q)Bpc_hwzlfquckX>PKO`^&Ic1>PHd0o$;RPe&i3O zo6&!>J%@7*IB{P4lbx4^@OdWNKg+;KF4Y&A0ohZgSB{t0R!H)FL*8zXbbzJY2RROVx z@!dfFtsto-%VhId^#%sfACq_s<;2^e-2dPW-84if2B;a=Lm9byx}37m&RMlR{DYR8M)lg59(cRz4gxL{ypdqy&-%f zkKWeu-h0{YPw)P}UfjSU?GS!C-K=)J4NCiB?=x=CQoZ`Vyb>4qOb$q@%u@PU_tGcc zpQGN;Sgvn4?NEdAji5QGms=+#`TCGI7{C<3TXbBy+2?pCQT~1S5Y+pH z^?ps>QIJ%m4EJkskMuG7`yhHh(Q)sy>E=(T9ZFFCc6bid`-}BK^FXv6)LJPRcESLXXp^!i^*H?QE; zem0r%)8H*o?+ezul)TL#X&cLA$ItrwR`7MkamTxd^713z0 z=8a5CHyfRHs7Cqg;Vw|`Q27V#yO_LHupPbzxBm`z+Ckp?6L^#ROdaoMj4d^pSDxP8 zyYEuQb+0=ZpNu=-fu!9mlf^5i8Dx7iZ>5_;_r=HcS#@~kgB7K}ccfmq&u$@~tprJl zzdxw`SI6HF-qQbq*UU&ab@6Kd9Y&ix4P!yuSKDFGgcLJ@d`T~{JXt%0@!sipOI*x& z204)EElpk}kaPvhlX)ZWaDLzM)}{P!7xVj9EXBK;=DaFq^6q22&3f-(>5e+ zE7bm=+i`e)x_Jg~9%c8lDLqTQ*I+TI_X`oxA95@DOf_f(*F)c`Je0Ve_bqZ=?*Q?# zFr8^%8P7~4-MouelRR%G*WBAT_ntSC?LrQz7+#9ssn=bR22jEqh3>{W5KJb#s=FhU9%}6zO@ZD}|WDL7~ z6Z(Sd$arPD@YCLBRpGfBC=1%Yove2xc~js6mkP2khckr!cQRkx5{O_-^LE@^}ITd3hd;#(DBy0 zf_)d<3L0+}>y_U_YeW8ha4)#~`Lv1N7_9T^2;R;A2j^#-}0(=Vpe=|X;;z@pd@tWKvaIWK<4Xtj`tH; zZ+p_sY{#2N`KzHesJDUjb|tSLJP*%6jrZ9HRrJ1pjRbGt=XA3L?BQ9b&z=Q+_af59;OcPLl7OT5K2aI!u5F*YZ|A zSUNOE=)1? zvr=R6%6{{6yn%Bw%*%KKv8p^vRGarp!4S}R@37vsb?6T;58j5BRj9Nr`XuD4xeuvG6*>#adveYhQ(K;4U(eq83Qx8`=e$-E>sk1CyE zwmRN+l$Ybe9xT;6#(Kw)Hw9+H3~;?261<@cGEAW!@puJ3}(ujCcEj_nQ3 z1@VR}dGYp2@J7pIn7kz3JnE@;+TZXFN$>_P%rH$HZ$7@35Oln=t#=@Kqu~_@gB$Po z1aG)phUxBj-=X{>SOyyJLhJpGyq`eQQI@V(w_{yz(Yy>Z4zKp#KPg}HdiIT=-cPKz zcs-8apaEPBjk&ikQieXo{$lzdub)Z({fvGVu9#sK;?;T7SjxWw3qZZQtoKjyPOr~# z4V(w=JZhrd-gF)nsgz+hI^G(TuLrk*dJkFeoL_mCocxEO{56G6@UBeo1~17lN1S#T zN}UPtDyTO_{=s&HX;Bv;ncD3*Wsc+HM=CWv<MZ}i#><9jH6{JxIzKSISu zaqm3qeS^Gt@F{!*(qHvFM$H>N@6`k-`-fh?o~#`Lw`Z8$j&}#XU*VkF;_WcUdPmkxH7&@$8(!kyu6MW{50AHR ziwyIp(+>TqGZT(Ai+fjDZ{!a8LQBqF!PPMSTlNbp3z$GTwjZABmll@x-9Y(3rwns# zulP8ScPH;Ufoh=Z?KH2u`K}@F29R_!%gt<4oK`a(IA5XbPS>01%zn)AHlzFi7<5vTq%zB5jt@R;a(m4Ljruvum z)$JmTcc;@1{i*j9jB&h^t@rfy%xB>;xES&{7HMmbN9IoS`kS_ce?W#w?;UT4D=FUq zZUv3^3+wGdUT+u<1Ho;F<<_h1U>;*TCSHcSSX#$1@_6bz2kK>)D#>er*gu)OR6KF6 zsQpZThc$q=I`Jm9?-a+o<9}&iyf-;s87JSsIm_|xv0fP`7m@!lTzXM#S95&5ZM5y6 z>&*!;nOGVvZp z`R8CVsJFk@roKPOtKNa*X}B3GaP2lfYD{ns;~L}d8p`Q=#G+4RnBVYfl6hkr4s0Hz zp5)5BaUjdTJ8yhh4hl$tp&a-2@%ovZM|lX}<1h*|-nYG?z9r;sgFoRgbZ*Z3&W>_F z3g2Cv(0J#2 zf7JImbGYW@cY!u=?0n`Rj6Kr6Rf+c;>g#p2$cPN{N|JaVrk=L%!haC2&ddEHGt8$p zUJ2__d}H8E(0Etbc#Gc4b_~zKGcd6o-!G+r$=k{M@CJJGMvXTxKEtFw9N*sNQ+_3^ z2K8>W-fiR^07(TqaXzFf;~8^)-G*hU@7D`GOMk$t=?u!B2bmyUM*3L;@59tekns`4o-ZNDf0%*2aRuw_h)=N$lDJEJNwM9xznsqpJ2?jz*+q{}#O7xA7@ALTE%ivScb{8+(UF<%D_2hpIiT5GwwBw~-zYO86 z;&>lfonrQLjC*!vz9>G8SG*GESU#8Z9Lr?;PxVIe-ilY-VLJC0%!0Y#dQthVsl+v5 zVwJR%&rjA4k*OJ`hvU7DaJbdRG=fC$mtPe&ywWF@SUo58242fBV;rwxQl{?_O7#9n ztY2N_dFA(|lf`@dy1LV9*0OUGuW$u5Gex_dY2J;@r`zGZ-ghQa- zq1M~E8*@Gw4I{v?Z5L-8mgB)_qW7%~Q~Z(mxVC}vsrUO#8mM=i^#;is2a;Z5Df{K_ zrB58!blmX2!?=bw&#P;uQT{_%4C+10`^gCm6l6+s2w+qgGknIgR%;9>A$$B?*=Y7R+ZV#@3LCclQ zasFUiXT1fcoOu4xzbL~TaJ-LG{&koQ>gCd*Bwtof=Du((Tm|y`(%ZO>AaU+VIPMHA z%`pCc@&0ft2zN%$Uje ze&5NnX5>q{=dI-9nYOS0qYTsB@h+#{8ra}??Ht)x<*X_-_vU&Q+y@oD`@jgCN4w`~`--$(Ne7O&Eo*$Y+V_3e3^RZpHcVsvBH`w`%4(nY_-e!=ri=}LDiSOIi^%nXv!xZCy)vj|>h~4@WOZGjGSM z?fV7gw?c_W;@(HBw=a3aAq*419oI*dIdOjx*}}ZtX@^aeKfNEv@1XIHwBGKI;)RXy z3FI?y^y*f?bYnkMV?lh}k>jn<&I}WFyf=pUe$W!syVZIpT%2m|C0|mj!pZM@*Y@@A z$}sOc-utOH_Tj>&ujBpMdWVxY&U$yWDttowCT=B(1&&i?9DJg<4yDGntB5`u7p;g-qXF$eD{*q6C`yw zgT70p#Pgq>a7up&?8`7kLhtzNf8E7X8Q{2(Gh~-KJvBKQhcS zj&C?+C%`07-!#X!i2UW?`tlrK_|FXUrsG>pS@A_dzwZL;+e6+Fa9w}-z6CPPQpZ$Mxc#}lvwnj`Gfh3mSKx83%|I1U zUq$O1L*6u40>guxqx;6YW^=%aFLG9~g$K zDBlsffO;!i?-cUhh7VyLxbuL%_V`1u&zcJ}&E*5)^OiM~{|` z0{O$^-e%t4^i_P4`(&U$JOo2H7HvM?J1(!xL{-{idbXVxR?akQop$(%@~4krt_~Wn z&fkWRHxcH;Y^czj{(grS@5;pE+{-e}QM@`I`i}CyLe-IRuijs9#whMZg6_}(YJAG^ z0Z5#quJ__C-kErvR z_2w2n{+z0B6L~9tEnv2>T*K16A7*^Qb`Zq746hz$CzUM7@i%hf4@!n4P)vy-S`@Qw{8qc@|V__7y z-l~b-yJ%nfo3^id=TJ|*dfonH-lmD(wwdO7$9u=K{Jz=*?ymy%?)Eyc?_=`T!T0bj zxbb#R@P_WqG;Nc3)1HfaFSq-hlX*ucc%$7i%|OSy65j(8IbH#c*KXFnE1%~c185Gn zfE(|u1h09Bd4c1V^Ps({Gal4?uS^iwE>3nHG*HjmF0}uKdu5u%j`ufwMJKWE2KDx{ z-fzj<52YqEc7nei;}qkUj5Vb`Jkc9^IMe*%cso))CCoWtQ11xqolV{%_!8EF+Yb2& z+eM^*ra60Xyr1o%{An+6&Iim`c$TQ$?+beeA$D*x%ySl=dpWp9SZF#l5VAb?EHMHDcs=-Z=WyweNAaxc#`DDGa650?|)+s@!ZF? zU`gUBDgVG@f`9eQ?I0gA_T!o9e4nAK3Yr?kQU}nP+wfG3l{Bd{_-rwJ2Kt>Ot^;f% z{^v8zIy^eAH>UoWFAAAU=?K!^;?em-Gd{Z;Bz-X;`Sl`Qk72w8hQ!bJ@Uvs)H12um zNPY44#%ueTCyZIWGH#68e)saZobQR?J=gJe#`ht7?dX3g)68(ZzSr0{LM|kFFC(uO z)D>Ev_&Xl+{#POc8cwf#mU*gpy`-Mita~sHb(vS9C;(eI@d(3DJ5&hf~&|0d<$2I()u@m%K(a4GLQ^`q3gj(Qw!#nLStbFAR=FF@Ac z80s;#m*o46Jm2f=PhfqN=Uy}7_v6(_Sbx!1IR3?}$3N#$CkIM{dYf5qRr0O@Nmte3 zUM2>%#QP|Z-xu>L`*p{AJ@sycrl8(-*863Dt}~E-KV)8aqPM<{SG|F$nZ`dfejcC~ zbsmFBpx$NHJ8DO&Sx^2p*aGhHWq0O^vW`cVv*+z!%QO$;)&0(&l$ZApoH;G-{oZ=7 zA+I4wx|L<+^W)dMwcp5or!ea=@_MFu%kj3Nd}nwVG+ulD)YsvS6f=eVH{nAGgyYMB zoZJ!T@H8*pIu&nRg$s#%pF~nnF*;``Hr8e+FNG zdPi7q`!_j;fgvyeHaFq-nz_g!-mD?sykGl6cuuCNg;%$WrIf#PR6+AGOZEO5TT{kc zVcx%EecatH#4Sn3wZPm=&hy0M-Gxv15hP7wdyD-|nHMoZ@@mKb+ufTBo6vii=5;)} zp7Lfew}lFzo~Zl-Pw^xk`)rf(&(AdL@o19qFyn2WRR%)JdbZGd9z>{d@%0Bab(nH+ixf<^PtcNnWp)O_nWz5}neU;0e;|2GseWmu}WsrA+%uMSAcXX$!%%}9Tg z`z@n*vz>TH-BH*yq0Vif-n*>#1wNY&l4i0@>g6+O2md0DLmY3pM+%x2I9oa1yG6t} zU5C%wk>43+GoHHM4hiFQ2yfW&K1iK@FaR`O9Z#Po?|FC&rh@A&d6Rd3M*F#cai*E) zcs1U+)KhPlzY%Y*#CY+3?sy~kq#ZtTyxpvKIKQ>Fj{MD#*bYMyyivU0sA=W#Kya+^L4Y=O5 zcE7TbO41+9vP_fic>kn)k$2fPK)qq>y@|XQ&s@KbfAvQ3UgmfQQ2tNucYcbc zdi6f!7s#6ql4QT_dfn|JwjF=O^*Lv~&7|IYumIG{DQ`)>RpfmMJK0QYq3=CHtTIh zUK^0qm8INAHLBW)W4H7N*>49w=DHnTofq|_eA$XAW&lg|9 zwy*53#!)`Fg5zzxey^@sO!=38=9ta#o@w`ko5}kgB*}eL?)*i)Bg@%w=aWn`4X>UL z_=$SILg6{_c+a)o7UZ>uUeFDu6R-YWbW_{Deb=x%m-3%xnuB}5;sCT;cUN)Ec1=I)m9cs5f6g}<4{g7G3 zaj4^MO`R?<5Y#KrJ(7HL$y)-S!3FOWI>EbH#|H|^cHv*0X*%K6aYyby-cG#(px*ba zSMEP9IgjVD;brD%ZoJ*K|58czLlL|~@oGP-K%FX38`QhddfSqBAB3P6wB%VXoqvzE zUg>AIQ9kr}rkU=T@)S4``9qvY>_9pHMGYdcU@ z`a>A+2FH7l@_#_e`*AO~eM*YOn?b%LKTFrE+p+GC1MAseJQbhkT}b)LP!kGLU)tAR z?@hg(yl(I)$o;l^%6e_PmbMLU$TZdQXn!3+nXxbd^m}`&i9^M9h0P@LB~4+OY@E^d z^l!{GH{sQB=1t0fd3LIK&wAe_K31tD-+J=C14-wUOf|{gdp44BCboTT;<&@{{$Ra_ z9PeW>ljkiy|8IJ~X3BYEC18+z7xlT#P#pT`vG2EZ=>*yhl!52iiq&eA#WK- z`jlnTe#MuRc%yhXINs&Mj9EvWO`z>?P0Ymm8OS>Vk`l+STPblZOQ8nL!cjYrX%a|ZOKLn+wGQ2llOGIeQS42F|Sc)I;gju^?D2MzvCw- zzfV!OFF)Q|c>T8041DjyGRJ$r_nB`qdAnghoc8O9``?XrJkb4b1n)g~b-n#g9p4A^ zGthW@S#Nvtdcsf$f!hu>6UMJVl=BjfcP8Z*z-Cadp0CaNkZ~3QP#s)v=LB!$+e|YO zukLp`QvN}B2-G{+#``LHAA+P$SnetP*Yh2+--+$dwsQR`iFbqJeeQqpZs$CetZ|waY zKW3V;c>S>`xRyk{94HOy&9>f4$g2aA@>xdcoV;G;gmWu8{)T?aG&P-gn^L|Nv-C-Y(X=i@XCM={J`0Ub)2eCi{8Wj)Mm?%_PU0 zx|D0BPz==jxb^nFE7hD!zN8lPg_F%6B6#1$tNTs)?VxPx`W^2J)*BP@pUe2{^z0M2 zx19;|F>{FP1&&wVn_7!{0mnNn!JE%#@@`dkJ3f-&_2b>=c$-nD1+;R!^4=Gc*8u#Z zE1z`&*PAxk>ub6n3gJC%bi5sYJd(%W|y61by}=_~2Y0+BD4!15pxzzUTamn)AgK<^Wc^q6$I^fOM>9=#r+phz zz8SO!_5N(V6U7DZ!%T47H!oqm1%BoFoD=T~%CCp*px)oCxBN$(e}a6d4eoYP!+Lf8 z5c-Y%n-lNg<|*b5>f8kOt z2wZPfou3hajFUmU=Z}f^v)jw2n2pr=3e=l!y<5ra%IA`{a!@bhx*oS`|J89lg0~u8 zx?L>&MBPHmedZES@A=ky+Q;lmpf1#aJ*|uht@p;?m3EwLfM_-4BPm&?f#V%X`N{Aj zsJD^zHu{A9FuVoNLH)UMf1lTXSC{q9PmjfW9~DDsS*8_U9e>-b0_wGo$;Z~) z$KsxOZ%0C3}g2wxi_1?aU>s0U@JOlm+?XbvehpODOBkOL> z7mOKH43x++vz_+cNBNZ1?BhVa-&k+<8nz1vK`$7!gZJ=Lx5iJ5hmm;uN;^bzv&?Ef zqszonm$kGl3j5F?v^d2?Z=nA5 z-u$71(+<+U5xjRg-p8r)6pR7&ZnEB8_ZK!FlD`GkL+8)Azipt`4&814m3EMLqm{GF zXve#o^1s0qU&g&ZT5o}`c-Ju0gsL!W71#SXIW=T_iYeL2YX@!Lz~xzHp5vWF`DL&I zG+w{_gZ?1ziQhxMq{A%dR^^=n)&Dy0ll@zyMwSUV-ajcX^U1W$aqm^uTZ+7LAgK~d zcRSYcOyZUKZ|I6F^SR@#PWkKM2GDqGTW?qL27siYER*fuv>nV<^k2L>?mSKTnXnAh z+r)a0k(c&0`&1|i?zleM8Fys8`Dy2%WsXSlbti8KNE**FS-di? z7iYVV*2*&HX(hjkCbs)=BbG+3k z-vpY0dY`r4=g6A}l0IWuv^nEsv%h*}9v-NhW%3>GCd%)H1EAjbtoPDyXdjRiWO=f9 z1NE}ZU5>X4<)s}4vQ)2J<01JLkhdNr?Phs0um6TD^B`XB4@W4U7UesFdJkD|9(h-R zq&h5kY;I$z-omU4lCLv)4}+w^EKlb3=VzI6PX8TA`Ncd7 zI)SBn?JbJFwd7B+-v4&}DuQ<+@#_3xI`!s5#PM?2Bgyv}d0&F09W3`=#XrF9XY#)B zmGs}hOedfFJ;ew{{w;UtGht*EJZr&?leip$ylX(5s zTZ%e0;W|)nZR>6R9naFhOn3=~Y$vWBJR{nZ_fXpX{Mc-s38cKgS(f?5@qS79y>I~3 zJIi{DZDni#N#$5>JO8i8g)(24=cj_rvrHP}vi7q}D1Rkf4eDKLy-ULd&28jMx=WTc zQ1{X&wy)l|Y;Mmo8IHF-+T5mQpEOecrSOn zVamS>uY-EGTJJmLEdWW0&y6H{{VlT0ZFv2$(%g$iy|u6z)XV7wNxtISIOhyip#sS9 zP;<^fNW4RAf6(<7x+BYU!mItPCgtLd?>zzv8ELaHb9@;2R-hN;w|)SygzKB-ZuE&@!n{? zzmWF_NGh}=`TRlRm39cW&N3I^)%|7>%AW-#LF1(>N%Eb?c$7)Lq|z*t#jDThMe$zl z#9NN?mEbZ^uijU419`VXJ7@{6cb1($$a9dK_A;Tnv&>C+>&K$tSd8)$U=paez4w`~ z)c4GJp&48Y^ILQNtc|w~7cJt=tA`xm*&=oXq4w-I9q$0jPl6Xgy&>z(-N`fc&>9-R zN}TG=PwLa$%I@`??&$<-}~f!1bg5+XuOtl zel5K9w$}ECW<12rrf5Pvvdmh%HN3i}&~Bccfpk#sZ`NClylX*H6PC*va}v)_%JstC zeC~fJ%lweU+sg5#&>u;@f8vew;`nVsy#MybHxiz4yk}W&kv%-G0g~#n%%dHu@{(X3 z8)PZ%+grY9|15JhUTud)l)nqwfVP8ukD9MPc~63*=UD!yc97$X$bc+U+KG1xEJ3?MK6x$SUU=rmLa}XF-p?n#lr5#jE}75$c5DWl--5>%H&*<2^Kk z1~8*m{CyG?W_#nWY;RF1|8kbu=6Ii?{4AIY>fLI+7a!#MBQ%E_K)ieFdhw37=Z(a> zjq<@)v&=!f0oxA4DgPS00qXtLdLKK)wg_*-Yp{|&w)qy%+nJMh(jGESULxDYv@CPl zbMftXFXfMcIUM(1ZqGk7C$BB^hWnsy+4#6qvaz>4%XZO^fWmJuPsOY4JDT#Z!<(S- z*0)~&5$1c)7y=M$hx%T;EA6;0?XZ*Y7nqS{DmwA@ru-A|B&hdR>-~kiKOy5NeHex? z!P5OjRVUuZs2F)C%UtVtt5CiU)C2Xlx8AqOTL53eD#&6#)EBq3Yg5N7$Gzcqv&_v& zyoac#-rj%1+daV>nww?r#;g4y_$&9gzz9&UKF68!8}D#}22c~aSK;}I>R!APZT~I1 zndc5^-|+icrYGJGwx9K<{7TpY>V3z?`^WEWi+`{`hFhTfJv`fP$MwhtZ+vL!D_~kN zF9|NsGSA};TJI6cr~S!(6VzKt{=t4|Jb5p}3RnbH3-N5|WBd-z$^vG-?Y|GE7BDYR z-v3#aS&z4|^`QCI=*L$?jwC-kY;ZzDX+C+lxNJK0ynyD`h` zbK=cNNi*f)5>W4a>s?ha%|xM6Dt{LS4&peI^NHd+V7Ft5cOvD(+p|ouiShl#qm&;G zVNh?Nkk=097UH`=4X6a}`vQxe?)hc><&>p~e4k}nI^K?y55YiC@2%EbtZ1n1ioDZGvz`+-lcxTym=qz8H^5H+T%qqOWSXE=X zP`)2L4(jb@y^j`6GsECLm3j4CnF}!{o?!-Ho9qo)~ zA5t+;Jlo{r4cd4gr~J$C5vW(M>s?el%~XSya0^V_!tYknCnVmLwjE@98zL1;W}C`* zwVw^4{1o^Y)T`IYDxQ^Qu7Dui46+~cH?-|g)N2RX53Qx2Mb6DOwek9Gyu&Cz23`jB zR-+ur_ZfL#!cVXr-1WB8_6L3MPUO67(-dzYR+abKQ@(f!#vV}b)zmT3>rDvPIPWvvU{5r@vJML|4y(`Jv2)>eO=69B*b{KPHw$~2Dw|MO! z?fWzVMRT&v(|GIKc$-qE9XtaXZy)P@`kXW~2^PXU7|j9s5$-LI^)vpsEM@-iq*S~x z+bnRrhbdp+T>3t!ca!zjC9g4bgw`qAlC;IK2L=v&})g#jUq`CVdlb1C5tk zbR_u(kT(J(JkG1 zW4v&$J~!@;vg>Uz<3kSHXS6}Kxe+g2CYJ7_{2TBSXuM;+k9-4ii5IrRMi})g_Z@96 z5W9b8t-bCf=SyUK2;ZJSkHTu2Ly+%2i?Jcp zBHKLdc|uaW)*j;DbX#Zx(n zXRq}{@I32y7K95Lq3rqbcpkN$<(zQSICL4|`mdy5%WN~%@#yz@(DBTXg2ZzqiKjB- zPb{^{Hgg=$LOP7F*zx=<1@UZ5;@PY5;92H)CSS!fa`21ek>8mT&(0*C;x?Wro^_6= zZ0R&3Tm+J2eZ}qv!{ZPBwS9^+PDu*inQeADo?+A%MmnAcZ9H?6#1ppPD-z5$zv1!z zI_DNHNHc@sNznc+8oI4-G&Nk&KbU|5)V z_xQWd(WrL-bJ%nFyAiw@;dnpWNxg$`3=+N4&kB`c4hxCD50Do2#s*z)f%e&^Cf-xs z&mws5aN<2x{mg$)wt3`Vh&POP+`ka7>5y$^;SI13C7sPW$%H%_Tt*mYJ1(3<{sr)# zo==hbL43$Cy)WBz!|RV#<$Mk0!!QHX`?~j;&tHx?A2fsjxbH0(-P!ZX{-8PK z!w;~&@oIXN^0KbqWGT7Q4y(NnQ{E$QDacr&zjI<9WWJE3{%218FHcfGNd0e;)c?|{ z|LsZYN2q@!N&Ov8{hcSN@9&;%&Ui824|eg4{C?^l1Z~%SUi}mLfs{E}KM3Nz*zt~~ zb3O~cytwy|Bwi_#?0xLo4?=kJ@%p{G=5&0SaDn5E?ZEj{_mlSs41;^GDR@FZC>8d` zRh<_^duE#_9q%*Lc?aGDZHJ5ku|MkDLEf+6zbMU=gw4)*)I7)AjpC6$+2%F8^=Z0~RS z>XX+5B(-39viVW?k!-UCuckx4a}I(!ZEStn9?tMSOwln#{x?d!eNH^>Dc=pcgM7V% z)EgxQneWak&-X9+*Ew&uY(8I*ZHl}UU%yK!`x$%zlEhP6gm}6oafHM{imu2urSar> z|7!+b#yPXM3Ye!@O8Xqb^NRObtY5!GzND!vllAKxgWmWS{3P4da^ib~^7rQzGVeRy zw__&b>z7v0d}F=evkYAD*ZWv1TxsW}E3-`yZ)LBp>3D03DZ&M!A06+v)@zHz7Qgd( zvi*;o2aU}`@D9SO^P7|^tbaHUv>iBYD9Klgyavz$ZUJ{Zt`YXummJr|t{;AyZKmPX z)Q#2U&&XcGl-#hq4w%LQ%TdT~o?43}UhLw1m)BUj zUY*zJ_!Grj;^lb%JU|@3Lt3@u@uri10px(Y-8HxI>i82}lWnfVtMTq)|L4v_rN3%B z9ObiA=AV)h=Zk-d7jGN9nko@Tb+{J9kWQ;!A!3@P33+!zC(wPI_&S7*39ZdGBOFf+ zjx%~v?lBNg4j$W&QYVo2Hp~YdBgC^-&SR|0=G|KH_WOu3Tj9*=Ui&q|6B{R3-~GrN z3U9%ykk1Z#&z;_S4%d(G$L0RAz@}_dWlH>eZl(N>a1bOu@jlLylv?)kG*cJy!Hut1 z7|&PP=2kq~ADdFk=hQxbj%w$rU^V#R* z>vxvyz}MMktP|HpKK~wegT}?5mgGA|p09=%S232!zOTd;yN?_1bSJLrZ3>y}m4(eY z)YG^){FjuHLtYC$cjF3e$u=K4_46N1HN969HWi)v-0Bjm--6Golke7#Qhx*W{gilu z4p58F?|>IUzn2|rePyp;n}8rRhj1;uvtV_w=w7(}T|?^=0XfR~omThYjOx zjMpD4&3&-M@e3RV*DK@pZ{!ue(u?;DmdU)@zJcx8raN9uB`BW-*Ml_G)AZ*<-iN8< z$=eEfS8<*See`#48!7$`&q3_wyouv!OqrI@3B)rE&so+pfV?sAJh2ZyZ?;Z`J3)X!arx59ZvhzsFh~wLsO9U6K^x? zeTTdcU<0g#fIq&z8#joLgK|6*-Ir~ye>EQOL)?GZ2P$11_x7<~Z{ht{$|T#KHQwO< zY||F6rt9&2$GMjqSxTOJ^vY8Xp7ZLin8`a}{>Qs!jeD}Z;ZT80i}>Dw_Z;s`?=xSKYtqcQPyxz-d%QX%?Dc8gKB5OXAMALmQvN!)5wsl`x+MA9 zk=FyBghAjQr;HDu=ru>OP3qM6_%nv`Q{Yoj@A{aQ_m2hAOe5$BcR{y|_;E@%pVuEb zy%rmD!bh`t_iVi1Wb)6as52TQNxw;UJQ1N@4eI%0rFaJt<)^}QC_vs^>RlvSjsw=! z=6Y9>V*yTio8VaS6~#h3 zc?<8qQs!jam;dq{v%vAbjBgf19WR$xB>66>n`W+po1p=?<7Z2IJygddb48Ac;`PU> z8uJL{pM)8p@z(b~^R)`lC&|yaj(H{osHFSLrd>`PKOnC7p=`)m1|3&h?b-GqAD zp6xtuYCH0}!9(D-=khS?^{O0m4<2n#9as8MR^#hr$kxS#@B#@{jrYsKI@H=w+AE@y#B=TO6LhOUdi)N(ONm?eaBmp^0hjpnjDte z4o_Kc1@dZwq`EBSx$>R-uR3KZ-fmLhnjEthug<6QDc=$v2KA1Ya`Y>C57CwxD8CO5f}{=f{@7R|*X@#wIh7f6B>5ZUn49rvlI?Oy zy)?55q#td>Q^Nc3KW>*B!^N(w#@R z-q?0|OOAQe@xD#@h43|K`%bXlOByoXLsPf`j`fu-v3E^#oSJQf8h{7?DaY7!S(s^0cn>gPE zeL?zNQTy!7G4=_;Q8^~)c+%OKji%f<5PK=gFZ2FL$`tZufZN_->ObbxpTpu zQvWNje(J-GIM#=6AWHt+?cO#}lDUU}T#k9u@$8|@0XPC0M==}6{; zwf`LEvy@xBzgUqEPd2X)ypUr?INsB!cMg2D&Fh!0H=X>l>SdYCyMrLkC7$4mIp#yW znyOL0Ce#C24;K*Lb>4@mO~|_&I)b|%j)W=jQjXc{c)C$01RsKUF2YmIdM;~{W;(!F z2$4UPiGr+)l3fe(I|iJ^d^5ftzM{-`unVO9?x4J0KRQHSfu@|}hU;i>H>RreQE}dH zzh?yR`FI)1W9cmFREK7_#=SDnBKa0HV;>Funsc8s)a}f@c|WI^Uj2CXd9e2$c>P_p z$if`c2CuH~!Y#NL9IgP3_a5tQN8bJLGzkZ@!|>4+j?K@UHl{_ch9Y28Tht z!>o4=jdB=nY)L!7+V-3u+|9YBb$ofQ^+-FY*L;>^#yZ|1l%E1`fO>aZ@2BK#f*)WT z$aNw;K1qAQTW9L^ugWp6;bry2((X$OoBh-|2T^;*MApz-Q;)rNP{ zPoNKUg;YOt?F(rOE-du5_g!l{gxBPlZyoOv%I|>vQjfT#|6Xh3t#KE93tB=`nBJKC zVQ=x;wW;mD$Gz)v%n`@if%1dk2~ck<>pe z=~E|`aMg_AK-ibN?wt>IqwA*g1lGT?BE_~wx_j2ct;Mg=z58Mn`7oU z@yPegr%sQ9g^qvEa#a7j-?Nnco`LT;jrvXb>Z%ZWF#EywIg67P5GynTf;*jO(N@+-L9n6_sBb=E%&>FI%NB9$vx!J-8m-1@l>Ep zb!Y_Q8HUI1KT^ArHxwqoPV)P*?M3&pjo^v=m}4qAo;N8o7Z!tfCQv@;g`4^{d3)hE zaN{ZU0=}O(o^d>d+i`C^WPo}C_(-X@lGhF%1lKd4cmjKKOaxD!SJn)q%ounUq(4YJ z1HI3D*S6=l7$mi0nQZ^x;@F;Bbzq!?Cl*n?aq*P!-f$+>TcR$$J*&z%-EeGpM(_9S0@e z4zzdVXpVUmukOcdk++;WpMZL6S+D&{vBiTIB|qPO{CXwcB~H9Osuwi%*AzCZ9Pc%b zcMzXT8p<-+eny|~3H-`=2gkb(-xm1R@z!y?+sT*o1Iv?nBY4d_e{F}K9dEwljY;{> ze{Bc68F+QQ{en;8H67yZ%d4X$am2!$m3&G6E#Ba7Ii{N9)pj_`@!slq|86@(@ixY* z=^T97P!V+dy4L$J^)~YEheyHPzV_UlVgkSCn2~sN9``Fd5#e{xe&vPdeQ*7H@_DlD zOV7s#@y^8SwURLnyQG+_IUuCZM`)l3{-h4yeKPATl{y%ce0mu6hbymYykj(o7`9H&u4JZDNOpOF@1n)UB zPklR>KXc4wc(omVC6c(omB{|E1XYKP_t-hjz9 zUGZwV8DC4d2c*AFrK8;FeV96gym2rIbRHvP>}bZsD4w~FM}D7j8s%n#c&6d;ThD*` zeacyQA_a2ICyu8V_ne1dsr9^xhrTH(bq4vXU4ezldFXdjZ4EKS0Z?#@o{6PL8*bDCZ z&6?-!pLD!8zFadBuWs+^E!ipV9sM`F`PQrRK~p5xEW)cv=BI;kJ^_5CSUWIeNJ??% zr$Ord=)^Oe@)O}@kncH<=6W_(&G@e0#cz$0|1E3+_j`7*{Y~Quot|r2y&M0YyC{DE zegpN+wB9p1GpB+JAs1Y4FUKqQ(fEtznlJEbD#woa3r>Pmq@LtTyuW%Mrqm*@KInRu z>=5-+c&1&q+eUoe3A%&ERbCp5ad9Pi8{tRT4(@on*3J)V(@ACg3Kz>YgYjyT>z{++ z`1McXs^oq6AFqE7;k)|J%r&#{c)gVG!rztOD=pB)i|<1|(BtoO$n!%vxagS^$L;a9 z-Hwmjcq?><9`)cMyW#jWAZ!3x4haNmD*W8Ua z5G&1ZkWg|Ar<+_?AjuFUJ9 z5~!DIl6-fPcQ5pVUf_C5-r{Y4>J6NeYwpGCk5%Q`JLRXs0#NT!?=#;;_i=3wZif0G z>p#lMmNqDQM*KRDtbdc9Yu=t0kGCJ?hrx58-qUTr+DhKfkk*aoF+Q6!p!wW-<#!sB z#jEofe@?F1i`O5Eg6nbA`>ZtEm*X93y+!Y5JON3iStj#-n&)k|kzD%O`|p zy4MiEE6wo`<$FMHQ14Xhy=^zou#qom zKg(qC%JcQI-lC;xU%Xyv#s|uu`v83c)Vs=h-ym-ud=4Lj>mAO%Q~HFC50SFD=E?c- z@#_HP&4ZkG0okw1_%JsXp-HVsUM(2ZTv>iBQCCN9D-^}up zFX{S>6UT9{6`be2%jcRgNxbD8ug**Ui8ov!*L?1HtKqu|T07pBu?TrTGllL%;hT$OF*V@uvyXM>R_IQ7-oNLB@ z825fe*PTI~nV{Ze_o=O=+{x}!i{f4Cc<12z6uxx4vFEQ@ZzX$j-vL|&RY1nYW9+0Zob{~hAAy^YrK($xh8*M+`E(VMKapE`=ZIo*sbG(}=zXJ|}#@o@3U+Iq!BUFI{*(bg)ae6}gMjGdu zYK!9W)}~GnUIX>Uo(pHaP3p%nDQtzWpmQ}&GkovGJD;1Q-F67wo@>I6SK6WOqrCG0 z)H}__yMeqt@CPKe!{~%|2)D{L>l|;n5ce@a0Mr|?-nQg*hbN#vNc-wMWOG70MDNTs zMHa{RJL4&zd10z~lcjp)v@*%Jmb_gc=~tE&7_^Tq^X5y^29oqTd!%))xeBk&7gGCk zE)jA-y?WnTeezm?q^>NJd1c;QitiU}%YM@F_M-e4cm>qkEoL&lZ^$zPnDfH95UInQ z<4Z5zxi5I@PrcE5a?LKhUKG54mGZUWdQfjK>y<@&@+Ea<>5gY!D>&Olhg@^flKB4O z0m?rClR&+*Vk=={&m8ZClwWp6AyZN6;`@;B zezV?d$;$^x|Lu3h0-bZs3cU5bx~2*B`okRf#Zb3g^U%_Ge^@~IU*O_Faqki9jgq$q&K%715+LoH#mRnY+ZjAhAj?V2A7#H8 z>dAa;S-k(=K=~2yG-$jti^RT+?^p5)Kkl_dF_!M}nK&g${}pebcdoe;ulC=Ply43# zLA`0Gd)_7Ftp-UOStj%9abNV|Tr&|b)7MzqLirzIAE@_k>n$(@7f3prWwQN{;qqjx z9s1^)O-b6J6!p}5t#`xBKWm3ab4>|$mWk~Ua=c@$_aC)G|6Fr3-o$p;>3H{A?>}mX z0h}*!yhrdIuFreHpNO|ZnOKW@^Rx2gOS+V0vhDbI`#zRyR?4KorsrSd{Ug-57NpzC z_Qnt;DWxfSI@b#g$~A|n=Z}5F?{;#G|HLCH<{`?+dRaxiy0+i{z-Nz=FX@5#g-z%4 zsLeCU4%JDX|-tpwUWW9GV=*l_e8FU)=z0!If zD~$IRy#81e{5}Zv7QhP7cscZzjE9~09gPEgdV{x}PGNg$&i_W9 z$~A32j`yRy;XG>#SA%*#v)&fuwS&%ZgzFaW`#maz8Wo;8i6-`uo3<=^Yce-|2ulw03#4uJ)vy@@uUkC5Arwpe?0 zofMgzZ)U;O{evtW~cNW+5#;3R^TmK%&IA~tZH+|sZs$}Q{ zZx9;naQ$h<1m=>q2ub*exKkaj(b{!~jyql0T*~E#davf2368xoz9uNM8L1x{BuNK0 zzIuxpU*T#f_YmtKbTksTzK?m;eE()2Pud6kzbHYu?;LyN`_S(5c~Z_VW&-kk=(~?) z!X%6(cKeh5PF-I`;nJJ~HFyV6C(?VMDm`;c+{cnP&2LZI z|HDi2OM3PRAIc5P!2OhCLrA|Bjb@KY&TsYpn4{9T3AjSy?& zs(ZPL~vy|$Q4ev@&@DZi29-=Z8c(Or}GRSx#c=N6H6KI)COz>RtSZ){b8>nm^P zn^kbMU#Hhc;$PN>w=~~Wd_Tp#k-x3)m67^zxkK;74vtG0LF|slZavHXSQKt6xEgdH zek|qWcYg=Q&g=W#hcBWo%(8sb%i%mk`Kjn}%lRJ8CH^1D-ALL&4`V-~`2$UGkiR+93Iz!Wrsw0@so@3_XBGqND0Felh0CZ!E?piKRWu?=7+yISsCki${^a zC2EC~JKJ(6kTxGlc$av_%iL7;N{T65nIDq%vNGQchU@2M-9-MK=ntga_bvC)N4fVB z9W#;rGSq3YF^vcCK0)5`J5TqQ$eUa*tjjku9c~f%Peo@VI|{UGlfAOub# ztr3#YjCj$-sdb2QhjUNs4)RAo%{NUP?s??D6kUasOO;CqOdxGKdJVmZT6IftTiSkc zx#dPa%Qx4<)v$*AZBEHCpAk!{^tZ}BH~R(H`6Gu1kJ?US zaF6>aRqt~?&o%kkIc5(p7fQkmfd+IdJZ&%8VZ_GFMIoyjW(+^#P(z!!P8;Pc(31|`fpz{iSULS}1JQd=7 zk#Ckc+@~ZzT7%NLxl?#&E~Imv5U zE|=T^xexe4j!WoFTv~fDU*(&|aJ4;LM*eHj4M@1ZbKph!2i)698-pas_fn+J_IJJ) zhkJ>`mGj6)C_BmFF16ePIgbo~ozM3oQ}e>(@LoU*9PS3oeTTHQNWx~~$~EY(^ZDk) zZK=J*dTnew+mdf4Ioz$}--Y%d^}{cgYhw5mNvJ|xRF88}fSquBLD2j*2?qhY)s*zZ}B;+{zUGf{J-+&z{%fV83LQ8Wg9!2JUHJj8r! zuX4k?@=Xi4>Hd9;a>_l^IdIj#%gDbTZAI#bODy+HUJ`M_%G$=a+0wXSGT-lSI{un6o;jEg4`{t@XFSQ7!F4L6+~?Bl6+iDJ zU#9teASVPeo_TOjhO72gfLDm>JKPs7w-;#x(OoEt!tDPwK9zX~dyB0fwEczyo@wK7 z$B};;dJd_*Ut8`f(h}%<^evM1tLG0b)40(*&s^)#p+Z&9NGH<4j4~cS~8SnU4`^9Mvx1!~i)-O7xwTJLQo_W{dYCCJ?a4TDG(op`B zsh#yn<3`~A?r_!Kjt;lZKd^U58aEEN?#HQiruO!6xDEb+y~ESE3AjDsYCF3I-Wc?V z!#&M%zai~cbR+|E1vH-x$D!xjFI6Ap1IHY-6P0zKN^p;T^(~sk`tIr+EYlv!MFHrwV3fXyd~AHc>FBc zzY=htcDVPq$TrVW_63KVZ@EdJ{m&BeW$L%eja2l^a)DUi=ClqD+A>}UiZ3tXL+AT=JW#lVuy_A4k2v@_@ z&1KA8l)V>ey`L`s;B0#_$Cjg&$o1(2+GzMl&z$CPCQ<%z^n$}_Y&k1Q+l+RgEtnbe z{Q8~&$E!m7aX7z`r_3DA1)fgXb5+tDlRNNP#=GYkKVM*P6VBiEY%`p>JJ!-O zE8*yREqz~H>eW_R@;b%W_BzGRzqw8kKG!pQ9qxDCvW=+kK!2ae<@#p&|CQtJI#9<= zz5Wq_8~ik7Z=$e_5xxFms(#g8mn+9h$EAP-$E_UK%$7_bG?Fh&mHB8c@2ua=bKd4DS2?AGis) zdmQdXw4W}hdxm!Q7Hyy>=@P0Q&vlKXQuF>_+S&P@Id(&;ovoy-yU*#ihjkqL0!i3P zTpBkHw=rBlH`@s0&whzD1#;_6_D?I5=AjeOtLyyd!*Z+m`w{aQ1H|Tj{7qR`#anr% zn`3W(>f>a})ko=Eu`|l?GdOl9u{-W9wcJe3w>R7&Xc$VjcO+@!(UWK@ zlJnXRSg*;x*}63Unl_%<2)B093iiFpukUe|B*)&e?)#4PcYDA41*34XKTFmBOK|S$ zlx=Q)+y6eK!`Zj5AtmGFEA4liww^fwuG;q|`Q{k z&T;HakpI-}e5V~Jru*@hHY0NT#Cq_y)%2hUXeJk>tCQ|20UBTDC1shMML zBmEv!gMUl^;k87`b?KfoZulb4oZ@irr_4k&3#D_VhTkInL$m_9?LKdM$#Ktg^vneg zSFTZSq|8o~iMyHOWfpLM5wXiXDvcX~I~cC^rvvTp+4kd`2{_{&`~ItT8oAix+E>cH zf7{>H&N#dcj-CHiI}LYYyi26oliXKQ8UG)P((9+R`$~$^>L&rWI$WmkWGIB^exJ-4 zM*?*?))+}x&?9%>^Eo=ENG#X)WnPM2;+b7#|Eirv;pT5lwWrehyL(QjZD^vNC3W-68F2j8X3T%($0*#0W8dHP_aU^M z((FvY8|K*gU->c8-7{0+R!a5?V}@bJ<(K7}en^7Tf68XE@2fX$!H8#;I`;i%euVpj zW8ZM>%i5T0%AoZ5{XULO+>amC&TtRU9K9)3-~W{#<8Yh9)$y&gby6lj9=6%{W2C2N zE_dwvul$&RJIb-|mZ>@BF?{tj%HdDD_3T^1CxFs?+0u?>Vr#gUXP$BFEI5O2U66k* zl9uD}_N|M*=h!yn&f}ddQ`ehOxT_sI%|h;N>YQ!L5vSMpA*3CJO7-VuoNqdI{#W&# zfP35*|Mz|q?d_RnaQ^G@$6W52zK(tW*M1X+cdujTf91#U6`q*~_y0N{Cg6PH*!N%c zn@Atel-ZoJ@BcaNblE8NN zP!&=7xYmhdy^w@{#2py?C-A?z#*p}rP5wGHJb>}y%hdA(>EF?H>L+j@-_ec3Js+-~ z_YA@gogdTfy^&*gSbOgwo|nPiM?SIZ>Z?361g_3!W69qfAGFBehle>f-EwCU>+|%k zA9THL26A21vA1V_*%J4)xqcYHu^~vpFyb)J@1^_q-Icz*3Ak^<)i4)3=A)%Z=C>!f zmKgL8=6*w3`ImVX8M$-EMDCS|UG14K;rO-6ebD4-jKWC#`7E4sd`@5tX|vIrXfdkQ ziR*}K+56eS_mL}K9HkJ_Pg(b($Thgjd|4YAxtr&;cU zo>>7`+gWe&_kXX9xr$i1oZ?CdgvRhaDAFZ-$#+xT^^^87T|dR)egjw6^Kzf}&6FMH zaJeKeVc)t;{^uTS&BWFF#}jb#wxqasz#D_^ceqmp1ow$u*=9QF5}qY?-*33jUVfz9 zpC1{|eCTi&lK)+_5~&}aN|Lx<|0aD5NoYpA^AyH|8oqyBuDk~&Jb`^CxH^8dCI1!Z zN~ByaK}rbhCN1kNpL-~AZari6)Gf)C=Y-`wGv-m+uVe4gj;C3eM zN+e+@afG%I!TD;d#QI!?H_qU zdCjPw(|tb-pYF%s;@{+W_LygmV64;jdlC7&q8>=O@{B1VFpIQT(T8X`lJPdQGM(`kuK(-!o-p~P{q7=G?k#HXGOk-A2{nk_IYRv)HV8KX_iD%9`s8ndnj+=i zYq{5wb{l#CjY87j>LFpyu=eV8oW$dtufc7bw1WHm$^Rbu5GnT|%N?mznZxmoraX##&SO-?R!*d z4L(4LvthLKx#cVRcI$YSSm~K+yz5=;mFHwnBmZ194=H!3p4+H6(t zERz?_GJCCmFK3cX*4vk!X$@DyHuCR9=41c-M8@@DJ~#Uq(oRELID7}!Pb7F>d*%vj zm;C<)9KQ-(gVe6}@(=v@G-(Twgg1yQ(@u5V()Oh5<-``x+~aVUlfUdIJV%9;`#;Ow zL|WFT+(U|vNAcF!b%yW9$_&QBR&M+|)(H-`8Ts3zi;;47Tdvr76X_CeC3c^q|BJml zJaf=Cr(cnOG`bHd_hi}#A&}dqteHZ(ge_-fXC7ZTCiN5E$$e*VbzYc3xfjtwhkK^w zR@#6MP%m^oYAovnJD+cv?)ziky!)eP`Z)GpOa4)4EK+;BTCP0&S`F1jHIckm<$;Di zuhz>YpW}<|_RLs^dk*O@Fvy`8VNw@^?U;kaAmF z?#-l)LJ}S(?o!(%zwe<;i7(#FyD9NQG&^XSE5hQyJ%J1 zn7lXqcD84_AB(-u@pr@Jf@U>bZ4W!ifBYBRQ;d}Ry5&~c%-RI?MxD{NUYw^!d|uw; zeyrm|xKhyUf$RS|*01Eh7u|=HTi~BT1Qw9?CX!J7;?mo1^w6L=^t;qN_5tNSL7yY# zHnZGsN&5*&_^NAW?wB@yd+-hmnv)#v@05EaoMR6EGQ~a5avPC$Hj>beIMaF0M7Yv^ zBZmjgIS#io`L9R+Lu&7pmOGEMIFj%Yv8-fL+i$dCi*qeZRYX)wRa>^b5FSzj|gJ!D3Z3wS9I>+HovD^Wq z-H0UIMO>P_@hU;{n&aQm2ui0~I!2Db6w_Ek^8AZ&cQg25G z&8H6c5b_^~LP)twEq5qslaPd`iA&=~j}4mN;c9<-k^FC=`}t>~kY^dRXHP9)C6{ZrR9)q2Q-!{*(UPoBDSH#>jjeg?pZ3Z#{TTP*aC{jKjT%bP1Odmu9bbT+mzwSLgW%`Q`j% zki!jH?r_p3APLimGo7F4{zW)HXl{16Gsr(5Ekf$wT9&(nwz9RpR=x3zdCoNZ^{H?x!k0;LLU$r+<5M=F_Y7aHZe=4evl)J=o zn~>HLNs#XbXX5I9Kpbww;kKdNZRjqf+~t;=AZ;5;hHo?5tMA`U93M2dJKPH7U*C%N z=@Bb8k2)pa- z9eW>!HxvEhaCLuZ**5l$Q1$Jc&!Wxm@E(~zm~)0@8LymwUa9*5@solk@O`S@9wGlM zbmESby{B1wfBk{E??>LhxQjJ4n$I_uY8}pd0%qoz`Qu9NcSp_*nzJ45p+7U`ptF(s zf#qG&zf(z@gCx90Jht$!^Rd_~`-QPqLDLJat!1-{{GXuDk#e~OSwi5JPs^I0Ntf^k zai(!c+i$pa(A?&5bN0}OQ3a&jx|aL;oNRLp=@Op(GADT-QTqFnlpBZp7+f!zoA1_9 zZfZ2w)OEOxEVnah{Vex-V%gUlLO<3qU1He}=tKU*1wr$MWA8BXuS1_AwYP%*Hv>(7 zW$r^K{Kj*7Xde3vvq$*nLGwoX?N{whbYb3vtKlZ{--+%;k}B)y&|c2%&^laE zESpw@$iSef^h2sWr9bx|<^7*)4(R<%W)SN}xLWVke&_d~I!J%7aG6d6Vn<`ro1(@w zO76oKr}e8S+*S@(?(e=14MCZ>a(}mk^!vNDj`sNx?p0~rR@l>iKlbkLzVVi6_J*$x znvrmIUDE~L<>>1DaEFur02+iA(Z`M056NVtn>4~>!@HGxC^;F(2K3mwFVDP8W6G(VWZL9+v{=a)70C=*6! zA?3EU+^0!fjwEa(mg^icO>3P=EbmY6#PP)SL6i4mYQ4Xm{D=O@J?Tifqmm>OcrUA* z`4QF6E@w_an@?e!wfhWhi~Mo+;l9lAbdB&GLDLnk{0#|*=9Dw1qn1dyI=;M5+GbQS zx17mFvwQK*s4IMXSJ?Sx6}@N-4L&|RXx6~hb=d3NgH=eGnn=0Pbg}y_b&LG@ z(Tok6Q@HL_Y`NvjmNV7R2}teDm5xk5?jI;;rlVzO30lO3*A*A~ei&}s!wmd8ll-xV zf~E!BmX`Y=`FEfnk#d_@?vr^i(Kl!#%KMu2*CL-g!Ezt_6i^xJZBoz-hU>Q;<`MGu zxgpz>EtlfnZMnyhRv$G%?~uoBzcbR>uQxepM#Jr6?LCV!J<*j&?bYiM=3sn;+M^aI z_9f3zF7)jkoAAf)owSFaC>VY+Xf`<9;pBf7y?~Tk&L6@84a%1@ZO~BEAI)A%`)z02 zS^E^1$L&mFR?t-3o$|vIUe4R}m}se9OI!w0n_+@x-owwJ*#1E-38*ZZo(tPR1!RiTp311xUG*lOz+EQlXrg zg|?#4QH+I2coWZ1tmRpzO4()x{@QHM(-QN8<{G#fx>PJ@dZEjaGy@sWX8H%S2a~3K zEV3YI?sfckH^&}Ak0Q0_GrwG5FKLHV@_*;C#Nxl<>->7r->LIV?3JL2+21L}n_yZ2 zWlliK^=$j}@&14R?t5!-xG%t^+a^N|cy&<&hbw+2Bb9i;tN?)T*DKr1)wMDC z6R!o$f}c|3-+AQii7rR#*VC>c+|w%G}Dm&3i$hXwv1?GXFYiDmEk=XHABG@TpW5Hz(M z?%TB6<)|{{)!wHpS8bJe6?roC`+fZZ?%8mq-%B_KUPIK);m+|71&%z5W9VYk2Fdph zis$?NtQGxUZ0<+B-9UZBHU`auj=fRx--jMVYA>hp5(2A9`xQy3a&$Smsb|KQ7@nF&|NzaaTfLiLey53=o{GileOq3F8elFyqi)%HLk;U>Ncn#GR2cTwgA zv=S-zFw1RoOgYmTjYmU~JQtz&RjgC4wKw(+?bosQIr1+-ZzAP3w%qlkeTnv>T}Ze^ zc3rT=a&>EcYbR8lkqRC34$C2fL0@Zsgmb$=Z`@zh&ry zTv|1kP)@lQTP{CwUpS0BE?4VL+gTKDRfpTGZ?@?QGvaU~8MqUslsq3v=f>bRf~)QK zGI&3B$Tb5Uu6^fNU<_$bAPIAbYX>u5pOouH(QQG~5w5ng1>|qac(H<5{h;fZ4ZIsL zVYwrh?#B-ll6K~851OkTKgfMdUsHCg!@WO)ALN~unci=&{td$&@7No}@b6&mcDUm$ zSKj}62FJ5_F^#;h%Y9CGkG5ZHZw&5>j(_tgb2zGk)DMqXZa!%>kc5*s=yJ8*^!zFO z9sR4CtL28ft+KKJ`zQd+s^Wy@W%<=pYe7C%}$3qp8N~A@$V^O<-TaS zuaLG3N%)pLE?4bUZUXK>zohzw*4qaTcZuaDf%ZRtS8rx#(3}ic+nLncDwv-*+&3*( z>unpy((7%o?Z;|w1a4Qj+AnqsQ}%YMrTnnWa`Q+#97&LUpVI2hd>=GJ9D9$UTnL?v z)W7dqZa32Up<(Dc?H$lb7?H9#q+{iAjBf|BtUBX%9Z;d)2-Jy@Z}Y^1YdzIB>=e<|NDQ-`CdL zPeJoB+}f7AnEXr83Z&d~EO!-YpCbuh5pRY$A+7z&b=u_o_H)o=|CX|M8~KMYZ|){m zZd=R!owU4spIebw?3MSox$mh`dlPVL!c}{ZAb&n8K+0`rxu=kJI+DbI2q1hO1EUhg4tIeVgbnK@)ZC z?MJ!)p`i}9v*q4H+Cxaflf+{=f!}#niYYdWz1^|b`z>f@!wn~Mv%gIKCFo70_V%#c z_PijjyM0OA?ZktZ;NQh1xue;)k$Q_~hs;vA#g=;y`5#1+ka8cl-1(%vf!3h+P$kZ@ z=GEeRhQqQ#}A*8e+$}%lsn6EvxAKJNJ2g_Q@vvApv zDZ4jiZ*}sYiW(s0zGS&)kajMT(3V*2m3nKrEyY%QxhvgNhnwEcIy&6>mU|%WECKgI zxZ00l+?za&C#_~eu8pqx{$iH$%j(Nc0 zzGk^oNt=Ttyh1GP%-H*t-F_kMEPPPNOn|H5%Ytn4Hf5IE@{7T|?;psig>?BruZ?xR1h0Fm+!s*1~hryv#n-{kDSN0deM}*8BaQh^4 zbN?IpTcdVJxw7^q1iF&e7fHB=xN7^qa_1Y~;RZK)WXMc}+bNlwd)&x>JGvVwH)grx zNSll#JWia~;IH$d7sxUm$0JojW+B``l9@1z{EJW=DR;W%-h6yHGZ9I6hqxstu=9}m zR^oYiS>`tidclzS5N@SpZt8>l-=n+}Qry*QFKJWIi)b!#ukSvPwhv$mLuMmf&vM@- z{|2-Xsl8lsk`Tx`k$o(596A!Y*NcWb>ls;(o8vcV?t>tB1`0;OcyECi#mR=bCegl`HQ!5_>z7b_J3! zkXY`kZVbB*^R2cCoe#VkAv4ag_d4?5iAEshhAnp@Y4ebT*NNpjCW#s)`(Z(*!wQ|FDcA5YlxNG+H$v$_9K$;E3w#Hj3zLyr`wx=`+;Mxsm^?dDkJ4yXt~Fe z))+}>Ni6&P>Enag+Yx)iCx^@~xLz_h^FH~--b;y<+ud^elQslN7)C7i?#bubM906n zuJcX_nZsH8u>?+rJIUXUj}$*htlY~icLr&3B;kGHQvF*eWQyT>$=p2uME*_aE2P}3 zEq4!TIW>IlLByH-tMc5&=g|5l=$a<8}C1M#m{H)QUDo8Eqd4)=D;J)rhmFJzu{ z?5zv0IXcJT4!7I^q>Vrl9wIKyztILE^PXd`w%;iZ_fg9|koFsCNIP@veHPwQ#+R2J zZp?C*leQ5_IH`JIzwKAnb@Ad5Z6Rl0d(ig#jl-Q|xd+mIV~s*Q=bN*y{r(0|{CjZC zRC{>Na!(@dTqNP|{A(JA%wWe}ZNC>g+_xvW^k{&I&&+>Qg z?~K9y)8U?h9cQDXC;Io@xZH-z%9wMly={pzt^0JpDcme%j?GHhds5$QBU*lQ&c5*> zlf81hG;Rd$DGv7%?C6Pl*Yw{nsP-~k2YQn}2uZksIMcq6-Y=Mddy&Jvnf!O6QAn!G zBwoJY=qOxPAF%-KO{aeXVrvH5|JINw|a9l5L{s&A$Ho5!TYIXk!v`=aT+D`U>ee ztJGK34t$U69L8I|^Q2+YQzgG&`*Dg>;`_Ccb3^7V%6Sxgf{xM!d#^#)Bl%rlQm&~F z4ctT8LrB8o#A8q8TKY>oYiRc&)|0N^(~O=UGM72_%p(6h^b(TOZsE2d=C@_POxjyW ze-p_jLHUuCmwLPkyWZva2DAsMT?}Co0*9T<+8xzF)zPZj?B&d-jjhZwt7vypeh7ak zIWM&inFWqrXOaI>)D5X!-FpWX*dun8VU${-k z)XGV<|Bop1G1`EXd$Q$jCT$0j@Ds7yPIVl3g!5JLTMX_68MwbWT$+P~z=3d0+mN{y zuKFSS6wbv^Wu*2tu-xNGtBo3>GGCSKuY1z`5QX~yT+c6S&Y;YA>gil!<%TWyV$vRp z`j-v%_dL@B7x;eg+R=U-d$ZbPo1T>K?QqYt+@G$?G1ti-BY5P?2NQ!-0yhs_ZKvdV{6Fg?u#5{ zxx@STeh6O}GL7MCy{R7_akw2VSM8Pm{X0Lz;C6+p63-NV!*9uC@pH-}LsN)@K+8Rl z_TXIu~QR(z#Fk z+MoH{ToN)*JNBJPo>u50r1pt<4Euo|r1eKb(6z{2*Y2|GuJP6Ub`^vB5nPu0$#5(A zN23Q(I@hqym`wUi^f+?4E$#2#Vf#V&(vaB$x25GiOa9lW7`p%b4s_{rb;7t4s-dwY}xVNb(+agm>0GI|OG)p6((7%AMaVl92a1;{SM^!-;8e0;D^zqJ&c|}G33_U1nY+ur}_ON(miDAz}0z2?43iIc_`fv z+Rk3#Sb95~k=7m(aC>FozHxxu`DxrpBxFW7+;`!9j5hCwyMy$fP`bU9FY@;^wf!dG zKIi!NPs)_9Th1JT()|!5trjXqb>-jAcw5hM`!m?d`Z3xgWY#(Ms(+hOE}dJNf0w5D z!SoE7y^g)-!MhlB%fP*Yv}@2%bR%-@U1zy!Zw&59+&C!hOwJ$fB>y>HS@S5d*xU3V zE(H)10<%e5gd{8@9>fALaW3Z{_Ppp4$_w{Pjz=#GnH%MXL>mT;;~F1*>bl*GU8D*3 zL}JGEya(^gHurGcof~u<(|Ec?CE&gTx7c!5V#h}GJ5qb?DNNwRdej%X05wBx&tdO} zejvz2=@t@OW|q|KaA%0{$KqNgF73pu0!NL zw?hVHo2#%{{ZPjLqXGTf65mrj^L>wcUuhifH*j^FOn+`n>P_b%;r-L+#=O2igr&rp#@{Fnb})v-`h`pzxH_JFNd6tDe0|>!!d;Oh znZQia7NT#_7ih?9tRwqpnF(9jAGybG4y_XA2LnhYQ3!{|22yO zW-GCBueRL1q~#U++$zMby*fUqz2=6H=>u0oKKUQ0on=lWmT^bw&90-f>ymbX@M!F! zWEjHv6Xo@PJ94}~x)q6C9Vma8pEK|ZX`iDqjd<=tj<3dNi@Da)Guu31{n&~^Qt$Db zsCT%YU)CH$nL4NuQf^Jl?L^uDG#o|Ip84Dx_7(ToY~ebk9lu}3k8=M<>=yb}`J8?C z!HgyUR5TMQx4h*ZdKzsQor{{FiA#)$GUy9;kLAAl275?2Di#fy(Qu2by|R9Gzn36> zkm{kC1a$o@S!Mk!_rd5oSL;Wwdxmf2d=IX+{|m80zl)>xDtF#VIc71EAm2-H*EP!3 z{qZ>53Wub)-QhloW+CBr#a{b21LIET`Z{_WEkRvmfLP|Y)4_He(0&yi9x{F5YCHX! z{O`>Pn8L;>?r<>>KU8YMJqxG-s)^ijD{qF+*YU->m-YZx!?1ce<}P#&XioE{|j{NS3^SkwLNi2C>`}X;hW6AakH&`K6 z|Lx#)M%}G_!nHmrdjn~=qx+F}7W;(Ev4gnzqsac|&VA_bV;HC5wY5fk!v6MW=n=|D z5Z;OYv9dD&r?;PWInpY~2j`XyoGA{c)<59H;LL=hew$AD+2|#terxY@0`HKv7JY{P zXjF2YQfz-?Kk|y-B4a~ly~CC7pq|l+?;SbZh~@f`|KI(62UWRIxD_g<>{ae|hkMz- z;KtyFGjP9mxKy8n66=V+vo{X+TDUF!vSv5DKT*yZ{x~f4J-|O!wmfM^p=~sd@)yxh zx1{Eb_xJjlqW6c)V-Bwd`Fo?jNXB*HU2l0Wk@h-TRf9RW0b|_tsrwoB@y2sq5uT1i z3G)AePB}AG|4;k8zyi`Xp`36z^BeKl^SDoe`BM7KBK9yO*6||#NXV3_lp2puqs%$z z0;KIq$2Y-WM0yX@8Oit-ukLeO+IH3V4c>)DzSyH7Q$GW@&jE5frE#MZx$g^Zp8s3T zXH^4cCpzM6|GJ|1RqfqH`kzQb*=qj2bb>}Nzh6T?j!8f8CWXvH4)@6q`1U-uUcVoE zU*q^Nj-`KRsgJc+xly?9XW-s-fZQQz+yva*LsNcGd&e9gcX%2%JUL`ebGXO6pKVS= zHBfqcIEl1kB;icr(#Gc)-2M)C0(Lf9=)ccCojZ$TFChtwiId#gnd>b!C1j@j|KP?# zW+hzhZ?f&&3bjG5y_gvI_>;1xtM3M`tz~{bN#}iUYRF{qP@8h!YaPn^i&*UKN52RW69O~V=b9asEAxZ+SNm~#zlcr?nTTWW zPn3J)W%^Xp6xYsQfkR01kc1P7OS3op826LG^^&>ey{J3~ht5W7FOMin2s}#KeDo<= zg}N~2u3P7~hY7a*%Ke+NzKlK@GRqu4d_(>p`{tS-iIv;Yau03B^BJf%`r+U}^166Y zfzO?h)-U2SsJFvY{#9;s$||?lKj6+!X_lMc5BysOc54)-d{9YNZI=rJ@2NxgNj zKuCIfdKCrzc< zYvzQ^sc`L@((Hy;X)4c{JKX0j_t56$Od*m`leiOYjMLN-^N{TG$^C`qY4#;E*jtZs zT5qo=NhQ}ee`jw5?)VJc(;V*7f5DBzeaqp7;T?W`j%n?1*|L(5oQN+by%*|=+;L}J zT04t86EeR!+El@f?x{zl+QUf7$=YF@ z!~Mi^k0X78Y-;Sba2s-L@=9FK3 zd$(9W$o{}Xc@7Dih)d&!;bt9~vNwhuqqnoCh0^UUem-DkS$m)R8++q$ z8#>$taYj+bU{M7=%6{^gCN-;JWkf+>QtoY*+r0(P0--z6Ehx#g>!=lWKY3sKeFZ;MN!8nA@;{GWL(2WyatqF3Eqt}sgEBOsAFsUW$KC}yMLoPRRzW@FX<(fA_ru9)N zdz+ohIScB7l-t{KCzJLxdK0~ZTyFV8{qrH^hTr7=CWpI;{87gBZ-|w9t>ykAY3KRv zq1p)UHDJt1AJ>H|?I8yDZHIdZ<(fT{WhxUZ_ZG`7BCW3Ft{9nBD%X39^MIpM?YA-I zu0%tSaz|M1R?>b#$DYp^jmp>Oe$yKMxU(v4{SaOrGGT{XME;_+*`@)payMA+VA7&U zg1iqSlOMF5#oh^-n;h;K$~}Z0Mas>}PND*9N&5mx*iBp-*Lyc)UWDr?A2MW>}gB;jeHa`e>&W97qH$z$0Fr2 z)Jh1{A+0fLjyf}6xZI*NZUSztV^jXUfHIv>7bM(?jK6G2NeJ{JZ6J~`gjk-_(C;y) z&-1ZWA=4AC`Zr4ck?3KhTuvDz1QwFE25m)~k-Q&eDTCdhExhMvk-rzC?;Q@W37Ib( zdw(N;EGx$x+$P1XXSpYnb}o`I`2MWq`|ron=hRk-wO_>7a^0e8>N?>?l4z#n!)_S;Q3bcf;#>&IqooADRJrj{Hl}$4I&IxF#VGYRmkF zE=3ojz1+y;eav%aw6jt4iz4cG6NQrV+Xk+?!POww3C~_U8+JZXqjQ617oFCFJTH1D|_QrnTelW|80{Vsgp$_;FDL46? z9)9RX+O_CDGy=8i!86ErW|>+2R~F@k!9LaZ+)=0$hCKGh=R$%dD{L5`7Ll zd}x7r%(3@m^4CYjNVyb|5IBppHb}y^FZlaAxmEmipUy?<-#Fama5czvzK)dbiX>IW z^*a8+{a)uAPMw7hD=#7;mQT(9(Zjn zFa7$V@a+1d)a!>)I14jy^!lN2?EY)1oH(2fNjDV#M*L%CUmZ1-cs1=to=CIeI{aShPV+zdC1^d6wC-zByWId7e=l-tq&A0Wx?>gVH1?IdA zT)ocsPq|CexY4Qw=4QAu-$_Wn&gXIu=sI7u0`s)P)$3+w;y>*Nt{?Vyoo`)wKY;sn z25!p(!%e@==lb`6uJggY+u>e{odeKwSNh|= z%e|WPTabjih~<2F-OH)AD{WZEnV45#UU9gi$iM7_9P=(pueT{2n`OCQa9p^ZnD4Yt zxZG&4zP(HC#=GkrfRH&R$&mN?w=;9ZKkIou(Z8|cEm6gm~vKyJO2Kg{2!Q*Mk4b(d1NT5m1L z-xFPp)ZX=$`vz&N(a&fHT3Q<)oy@@~689PV(q+RpBT zSNX28W}L rb0Z8ef`W{u4Im0EA+|4**Rd36fRm7L(IA7uaUd&>NYl*=u-5(2va zcY61~?*GlU?M(d;KefQjf~)&ey8qXavdSH2xuxy@9W~SMZ@T{%uUBBa>M46=|L<0q zqa1F`a!cF)E3#bO|BKcyFl`*J?Eg)JImh8XZn>rH{}rckO@jh+3ta6Nxi9g}Og0i< zx7>9Haqo^_rvdl=;*Yq`*!@1Ej%RvbQv~j_aKnCCvjW~$^qs?PYq=Lh*e^#CMiTG6 zi2GtYm7Fiuv!51b;pLsqIvTFl+k@nvf}TcFZ(^?}Alk#bq-{Za(JmzCiQATNPsSFm zPuljN`--u~1*U(ERJ|S2gT0fcIi?!1a*HgtF=_3QgmK%;m@Zuz$5;%j58U~UmxGz9 zaEtx2rYGh4qd`cydLQrqNE?YHJV+dGnz}bq+57et&nz&XT6>fGC**%#${^)7^Z#bx zchai#)cL3E_nb$$)`)CL|28M4 zd;X(+MJ{V5L-;J#=WwMThrzdlHvnCY)LwngbPj26qXb%q%H!KEzp&@dend;!?>x$@ zz43Dj%#IB9ZlRpoE6=STsJ&jx0&_~ORD0M4uR<@bXCSqAsQ=RfgGn2WoTr z-%F#N?Ml0@lW1LF`dIEufZitmPP7XtcZ%hnd|5ejCb|T*L-DhDj<#=>iBe&e85|qC z^>!iq5pXqVz4fD<`XR=_1NB3=eF5*S@cpm~{8jMoL1U2G`@H{01Fw?yKH7p3NbHSS zd+T8@!|lF$i(Fh_jydVC_Ezc}*k|v&e_?MNZb!J%&YovH`~^EI_GVp!)ZW*uy>&=y ziY`WNknA&my3F7A>O?zp_r2nm6qvCY?CnlD_3!Kd!d~yv0`q~j*JGgV1@A8O7*cyz zTYHbVoc$%#16_jTJ^d@*q93!bxPp1J#Qt@pz~r6$SN~3+oZ8E_#b1l$&I#lLd^ zO@uca%|&YOpVr=Gq^(CkqHmG3hkCS!35+{^@NbFs+lzgH4EFv;IkneNp9kE2FDo#w z!S#HblKX#u!aV$nl)Y8q5(1^||CK-7U;pa zQD!cZRGBxK9wqF5UlFFcit|7?MaitjyhQoe&|66A|4TTW?nwxIMA~Oa!q>!u^HcB5 z)A{V7K7K!q!A-#RlDT=uJ^BAYNB2!}Ic<;-xQw*HXgInJZ9a~7dc&6cf+}tF>q(zG z4-YCZWo!HEkOlOwIpp7k%JfTdn_F&Q(r!bKqe*CDg!}ulvy$^p7xwKJ;i%zX7}Jw_ zjowgT>cG{IRX->Be8NJ?NqZGPbnp+#|C$OM*XywI|8dIqw06n=zd^ZA&~Hfnc%2;J z_g;4;@901a(KBd1YqWWCbH(jhW~}|aVi%VfOzh?YbDzWANd7(O(Ecgz2+JKv+Hf=n zO+!iUWj=S+J-#3Jaig3^I@}fH{|OyCAjO?zxi6Bo3YER8ocV=#)MfPhyZq}l=1KoP z66J>PV*Ylxr&A_^Y79(qU$fk2uI9daRP!31M?-Dj=lM}CiWc3+`f7^*-9_R4kDuU; zD=-ChQtQul*YZ3xT8z}cwa7;Z}&=*%MFMo4me1wZOD< zxZjgM>w5f)lsm?9n~-)cil9y?9A-V&!ta-@?06#f9!LK0V+CfI!yQci`%xSzcar7K zxPki+&_P3JYiRx^{Ln4iM7VxeX;Z4+#NP0%0`m-9?XO|-_eIws<#J1A(hti>+m5Q- z$a~|^uH~#_e)sL2K;M@>8|>@9U)y`8z^r!cEg=8ts1H)^L9|Cg;1ANO{;!-l51ol- zEN1L~$8Qg-u1fh=+HYbW{q@vTz1>Ovm(U+bxz#MU?Jcyipz6Sp6E<@_ZM_cyqnU)DTMxw&Yb!~NAi7LfNozh${AiE9TrsR@<5E+_N- zL*$RHEilK{P4%Po(#qZH`{6KR;SPqYK9E?RZyZGC@VWwXI$Tdm z5{@Ci+%JDJv2qW!+zUzTh9o@3J(ijL@Di1oye_o9!1Qpq{U~=68itg6qU9ca8|w%p zp(C-JC#T!1--V29DBzj@l)c@^KM-Aul-td6SCX~~N%)SqG_FY$n8)F2d-#d`*|*cb zk#ad@mk@aA2Hw$6dKfiCt{-ODaZ1}m0`7Ll-Ztc~${5+3Sh=e$_ioZ2MG|HZzrlsp z^zYezMSGBX^EMTj!&pO!z2nhb@_!f0F>zw$ZnxaE=a)4rEcYW~vA3lRAVd9on+_wN z+H1aGT>)3adh*NP*hDPDlk~Um$S>>Qt8Ol1ZbZ7SaNC#ud%i_Q;C8h33i~T~Pc!fS zM6CAyWbF;z!5%Pbimuv|ldL!W{_gxV|Hd~LnCWnJd}w~KF{0|+2d-Qn>tENBzb!$I zm$uJtzGS@tSI1es&fE^0g!?;wC`^({a<8pk`grKU-3_F#jtIylga zv}=%r74u7e-&OtFnSLz&EdjR%W0P`kq}&J;Lu&5{Nsd$t*6*D-pY5!+ESTh;skUljL8FD%_po>h+QHhjafTdK^83 z!pr&g(hk-HJ+e*zin*pbhKL_z9`b(Y{2Q(Y**B5*jvP6{?{8x7^&FJ`_D|kBQY@X6 z5QTe4!@qJnpYPAR!o8M!2g*&rJrAzd+cDTVbxT=OlUV)BR;h%*B+{Nj%h78nejdNK ziQmo!+x8&OBP73a}c~^(IBLL@a%XtX*AD)pgLoC z4<_2e9z@H|xu)3TeWAzantG1Cu~4De09S*yhrVlaljE<{o3xt)wbv9Bn&TR!=FOb3 zT+cx#AhnmR90`F>Nc$R9ypMaR(O&v-?Lk>4w#AqSY`w|4BzZnkRA@TG)%Fl1ez#F$EB+lM_MTp7S~%Rs z3fO2GYd`q(^K=?rPwh5 z4M*w+#xVNVo^HrmC1EG5(VFG>EFNl?^>yoXc z{emROd8K?0Ed9H+@*bJS9FLz>XvV|Uc9uPXxdK%|%GG*1j+L9O?;iF9q#woL7Q@wgyP7gLq2WlmrzWu`5F>3aT7q6iQg7jg{`fG_ z)>}XF3O8|1p}E1~p3PWrA$pH;%01n3{mB2XTolSS^XxpN>%Qpug=V?K{U7<~{>=Tk#A>f+x$@lM2+}3o zPaH1z>+_=OU(>44{G5UNki$LYUvQ&v^Up|)JCotfK(ih0IhMPKw2zR44a8z^<8CGA zH{EZEw=OgdEjP+K>I?E`J;E9ZsUO-~?sn2neH8zqE-1E&`Tg>&p;;)H*fR zq0o$jt3lQ!Z;#`f?39z~N7^qY{o{4XbVXfMXkNAUb^~X z3y|9Tw4XIFvrQS(pY&nq2ITI;6xn{P_iZHLc7^NtWzA^vPeN0Xa$mOG1?_Xpv!qLS zmDuHKf79bz-o-W@dsAPKhb3G@N2bBXVJlXvWMJl> zm{>A5du8Nbh~7ZTy~{rqIBq&)E9#8eqw;&GA2w@+S8V(1eLt~QCV%9nLURUO^>1(T zk4BFoV=d$+S>aRX)mA; z&{EX6H_zN%=5t#*+Sd!eb&EY;4gBL5I{FH)|qYu1qV0}4FJ9E$d~yh2(FKE=I~dUksG>UCTT(hja;#@o%{wHAb6|_Mkz>+4$Xs z<~+FC-(IEMd+0-l+doM%fgecw14#(X@b|lQ-&DDqFh=|k8(wGzIew@}{wAm?QhTFG zk_n6)I^IdSIQA*{oc8|=$iB-~MjW;EPlzpQzM{2!ywkaBf?JnAXtada+f zik805J^-C7yoEKSZNDu(;Tt2c;$sTUI=I^3E+YSxXdqIq&SPUpdlX4{LSp*bis~i( ztNkrLw$L2ZJjI<&{^!v`q}asmGwkuAxGW5~pD(eM^9Fl;UHqFIcV^-T&S}LD&#)dHPX0M)15$3YB-R8Xb9pun zZ9=P2`O8@EZ}7*RTCe)+yZ*GZ`Q%SLTWH$D)ga@}eXRrLuxC@_j`TOo_(%JuI_`v@ zD>S#j)pm9yyip6XO^{ga?cx8?KpoN=BMI{TmrU0a_O&y(GaPPn%Jo2ZBIRm7{&q(h z^D*f;&vDN>ai@h`4|>J#7p*$_eNO!wd7;p(aJVN@=2TQ4DfbC$@9{ST%-N(%xPUm* zx>2|?ZzkYwhnwe@H5ZY;7rFu|_c{MqU>Ip*kc6M6Wo5k1rsG-S#X?h&lSv)V9--WH zGy^F&Xt^6m`vyt)l~~qMMGZ^#V_iSQ=NFoj?I-hYSQjS zlaRc>MJjvUkSsG1-^LdfnzP{O@1DoE3*7g;3P-vDZVD{n*a{>;-uLQ`2Rbh5?+(9Q zXa+jm;)n7~oWK7z(%-Gz8uINgj`u)SdghimKOJJn8Rhb^SH6jovRAq99Uymj8aEDi zIoz?yUuVo}c;BMDdA_}JjZN0CgunpO?ng_|%V;q7R_v^Z*BNKF+4fqMi_=xfoLEw5 zE^m=zW+aPpeoFpdQJoi3+@}7q!1JViit=8h4WK=@XPNoz^G6wH#&Qi+e5~B~TkM0J zlUgsxdxe`)<~$_+6?<92NC=enUf~JW53j!AzgIZEtk4XBTjZBD&%%2{ z`X@-j7sT>j;ZYZrY_IxWVe?L*c>%8WgKx-x@|v>dRHXJQcQ3~(zT|VO5X(4|&Xs+< zWPPkCG(W)A@v9p7>!LPDxSjEXoTn24Q%QRky@nQ{{z1;au{S}zRr(?|&ImXBUZE*! znYu4#EBPDF=lU#CZr>!<1hy~WzLtf&&j<}e6ZuwgtFiPC+QjTi{(Vw|nAhb#w#bG; zbLF|I`K->%+zWuNK*}9rxu-8;ZHFF2_o79tcPr;`AJ0Sd+Zq0Oir#k@`J&J)hO1!* z`DgsfvsbV9^Mm+dfPXNj^8cglT;Qde`p3OGr2UIPAv1JLps%5|;hU66AARPb$e zQ_t}R-lm>*rJIvks`pfBP?T4mw?2)0N%Fk)iLQGFcUL#vi}0T1cq{%7-U7Vi9d9*! zd2pWNtz^CV&&{@)mqo-7F}=+uZS1`Cq(ys+(<&_a=N@poinN`*L6ic@sfW z0n5WTac}7R#mt(ZKVH`THM+ODDbF=oJ>JYD{#BR@y4^U|ND913-YSsvA`qm_$JT{)JyZ16u4z~y19jXN&Q%!s2+m* zIFH1u{o!EZN5ObdZ~vsp1it1%+H>T;4ljfI``sJu{&s9UhqrlC-@Ai07Y{0ASwp zChMI^-Xd5JTfQ!td=J~Kw|TyZ=O`xTq?Gsf>gLK8etFa0;od$t3Dlb$kg{J?C9eit z2=A{u{yNNJdmPg8#_ zmz-ZI7BXjD=l7Ebi2oCgf_k5~-e$v#o0C@atO1k%Dhc1J!Gcgm44?m&eIeb_0x%arg z1Ny+tAiqb^=Lqxe9~U#5DDN`58SQrxr94e5g%B?_#4!FsrOMJm%NMMYPbvzSLL~g>R!Kd$a>{|3z=Uj zC=)UV@M=42LHte79@N{!dV7%97bM-ovOaxT>iw|2d)oGJQpn_RJ;-hwGmQ9gFcH+t zAy!ggCV6jyqJc?wS0^@#ZE?CeWc~y7|m{zhEij z$<+Hpv^^By9gkP*VLR~$;3#N$J6La>_ZefsP#6G z#jD5p$BBOlUIq11Ws(B#llLh|O0X=?@uHA@L;4#{dYq4yqkdcY-rdB@{R_XaRPTLB zlL=HDoMr+a;DZrOIOa2_JB|h_`&+5mo?quzqWq(e;4S5?YtCYw2Apr7!&1EuT5k>V z>Vc%oS-Sm$mRI}9INo(md7BWwg7UUvsoqDd_o>|CrmOXKELrsL)o49LPY;<=t^IoF z#d@#IqWw7Dsn$D`@m9=wN3(RtJ6c}#nlnP?3cT7L#u2}DXK^#x@#_553*@~4l9sca z$o`hPU&#ER^pnB=gv?O9+CRKU{7c*q^9f6>hu4xO6Zn?AUqMo_4>{*L=kH$WAGY&( zutLZz#v7DiQU>uu-sATtSgLoa_feo4c{M>&9hODa!wmWdDQ^MZeNO$>C4To`X{I4d z^{!5uOyD~5I)J2ZEQ|7L{RS(BOzw^TcI!!e^c;Twn5BBxS?|M*ikq?I7r+#d_8YYA zx0T)BwEafT44E!?gWkHw>fsf~tMlgnq#k4*TIwN=cdAp~?)Ri8-;?{M$P2jC`lV86j)^e%E)LCRy*3EQ|7LJ4@i*?0BCgel9EkEw5Z( zCj~wr?=$!Tc7fZ@!YTC-KRaZ~wejoWAn~O?qK^gj>U$b<$-4-e!IiL|bD>%dyyJYn z^-4Wdpd5)RAu|ZC9xvJue+%>j^(|2v_~du(wmDvTBvZWdyLLa5Uu+%E zelzxUw_BT(dPv~ygg2O6mE#}lRF?HX>vw?lUP|6I&;{CpTfaS1wwtLQGVeO&?L+)v z7zOIR-+G@V?`3!s&bo}TgVP=crIa@qVi3^IFRyO5RgQOp_5PdfR)F^syxPumyKQj1 zQ>^#jY`0(*=K+pax7&8dTVTB>+HPY~>cM1(%pAOWJU)ak{bRl5o z=(!>DiQ|2V_%~rCsP}v8J#9VX5@-Sq!Szl~@fMsHGUYq?<5YRSqr7ABM%Gg=ui}vu zNdDLUM`BJmPQ`n*<86oUJ+7g4b-YKd_jB@ZCtuRtEaf~_x0|*z9sfpZh0I{Q+J1)- zKNSi<%bS^&R0Z~vS8;>qy?|v0PCWW_I{rMM5A9d#H&Q!fUUR(liI?+$D_N@7K6?|` z9p-wA^|oO-f-zpxpm&_t@`|?t-!E8)`3J`vC0>5Fsh8u8*zyi0Zxl$njO(B>{!Kk^ z(eftnR_^F;w})Bp+v+9Fla9BE^)4W9jrD%cQr^!q;!EatcKdaq^&7o7WNvW0UlIQe z>;tU_eqv5i;PTuO<}bDdNj?2$mDhM>!Bm@x51sD z-U91=k-T?c3v7Vo`+`68ylZUz>imOg7&1NZ>TzfX@jt*%px)Q5_li$>&KD&0VcF+A z=2Jo2t}J!j7rP>4Rygwn{fQq2!$G}oTkmx8)`FxjSPr3`t-8ZIpI5hD7l~iRIF<62 zN=Ea1Jn^M?hvY9T)yq%tNeZNY#IiV+MwRe z)*B(ODM)I?Qht|Q<~1gM=hubqZv~A*retUTeZTF99|@0udUsjx8K3jp2yhSF1{)b* zE#SUunUC6Jx7+RM#Y|0BjJ61wns~LmBZ-%Kc!H&R%X!mlffvb}50X}2R6Kb-H+8=6 zv|e6+7Ht_aH{uN@qq&cm_3jLpFzX!e+19(4yhGOeDlu(}=zsP4X6(9<8SZ#XY~o(l z5hcy(EVaDcQYtAB&na#$BVW=DENd~Q+?{uPKdIix4I$n&=eOVX#NP|ULA`aY_cijC zz=yCB-0PdWZT)^z-a8)0T7}G~czY&G!8;g;-vQr)=wyDf!27IZ=4Qr`kOjNnWWJvL zSlaC&>wMvM-i_6o#uxR+4Xv3Q>%e)N%$;dD>GmZh=gn&3l2j?gyU^G$9q?t9J@Eq7pc3z#8WIU2+7cwjH zYWwO={1A8n)T{HTe~_2Em3ePy3TroW4$#}{8_SgUyfPohbQkwEhfK3Be!naCV+>^- zy&pr$OZ7=Q;r$q;UiIo&@5cys4Vfu;bzF7_^?Cu%_tpU|uh#FDk!fZipGz9?AlGhA zP`?FuzrtH88O{4>DeL=R6*uEqiuX;*o8f&Hm`vU@kTjEJQR5ta{>gL;nKQfk`R;=c9Z9y65T`QQM_8eZ{k}G z9~I%_D8Yg@9fRe#qDiu4SbvfX^&Rm5LBx}>?$@v$dLDtRY)L!ng-{vUnJ;zIv;uD(RC zkhvD09v>efehw@J+5T@)IJ!Ma$#HJ*3yuen1@87=V8_q;JWjAri077kZ$9xIp$Dk< zHpe@S{26fFN#1+l0pw};GO$NLkz&k?9L#Jev^ybNb09XH;W7}qP?N|Jhmc=LPs6ceF zPpVg9PUMZ?eb_0loS&SG^K{31eTugVpQWCkG}iV?Z1Q{xZ$GEJ>dkVz3^61ftB0bz zZBo23yltHFGUaR7Ele%PYmY_8yz-Ao%!%ru0Pjmqd28dl3T||~cZi7cPF)=^qsX5G zrDERwg*r}{opRkZen-fB>3ARPnP%Q#y|*0i{nqO(xYwG`+VdOYZh1G_{X*MA0`KWJ z`|Uw~n`<-cB^>Xl6z@JhE4PF32lv(KesM6xYx;&v3&(qyby|Hzn+M%5s#)*-hagpd;jfx#qsAo-d^GC7kF3Vjo6h6 z@Vx}DI^HVYXMwlLTMv@9uxylH#^yYF3Zy(7tc3g*GfumOa!(!H2kPZE&7}8~U7X9p z)o>ZO-bzc3_eLHFnQ(8vyyJ-f6qiRC9Jm% z%6{j2$6N0*^47zzuov8Vm}u{h)$&Frhs+Ged+{FH89WVIUT%w)6uA0(#sDx3`h(mz zQ0r{3J&d#Sh3YMMlKCOW`!exw!$+Xriu9f0Ew{I{sRA`24CS5uxO`i$p4A(CI%F=p z&9C2v#9s%kLA@7Q@15ig1xX`Wo~V9fQ$uEg<9&$u47k%Ki2JLW^$eFc7MCwO8gjD2+MKhFSrY;y;s6aujt?Bu*_~ZEpPNSjzioVrQU~F zXAOJ_>OF~LIw`R5C$7=M4)_A39wvU^)kAH&-PD_SgYh}uU~*ONza+lW&)ky*>ZQ3z z3bY`vJxJ=!Qu_7O-%FJHf0EDtycsg99q$0*=fbH6eD9;y`x|*@9ON7j8bERGi`z{d zOZ^tw`|Y%yMVE)ng1&xv-ynW9?2z>+my9RhvEDAflr{rlB8&vtF9zBDVsFZR5nmZH z2VF1mKSJ+ceQyc*2dIa_-^e?}91qlhS|2h$^q$uqCOYjQInTQ;WG=eXAD8^rJI%~x zo%x{U?Pk46yZz5aoM#qw-_otLvE=a$@9mDaOs_Pv9Op{ME9Xk2n68 z*W1eOZ|aSI9x{_0Z(rg^!dOsm%zB?BZw5$um8CmQ^-AlPH@=DcbR6$|;vwy|48zONJDE~{he+B3yHIi-0RIiMS#QO$$D?!o~gZTXbRuZ%hWU2jG@Eh)fa?1Mw z>%F?2=N27rm!!!APCmkQVvtmWrQ06Vt@RuGHe`-C-nztJ1=oO`p#o!v`m2kXxopGo^x>{IaU^6i@AkbFi)WZ7a1UsCPxf|TnQT)eChRsXr^BeB_+OemiYy* zrn`wB2KR#u_hdi5*7K%~C2un5{vhi_S-&~nM@GXMIYymYgH{4J2n z-)=h{qwR@U`M!~iEb}m4ornB^bxN1YFeia{Kc!q{Sds!+arBCT%U61FZ4JT z$;>j#9B+j9m-zZUS*n*?!zBe4k@pU4hV|f|HKtoV(f%WzyZx~3Lz_KiLtMg7?X^$S=N9S3c&tny`%oRL0_t7veHQ4OnPFlu1D=5Hw0)g#nPS_+3>uE~%ZaL4rschU{k}&0uVBjf-m`4` zkCN91#=}T(+ru_{ywQ3n$jUN<9q$a{6W^6ID_ClIn^|wyhUsQ2`I2_0c(oqXYr$ub-9>Nr8>{d?CbX^sx|=KaM>GnI7QcuD5{r_)eV z#|ga&O!nV+%MS6qk5G>1AP!pIyrh=*PnFFuRp1i15afB+{vUDelH=F{JD;WASbmmy z!13Npyu6R>HkRtGZ@rgZSi&>`Nt<3g@jQA0Z!^a$^Su3W-tBlBTCcb8{`>!%=QWpP znZ-qT2RmLpKlwM_Am06s_j1lF@54FV@ir@>yi=wfe;m^NSnD@}x7twu{BIP#C!qVO ze*JQbo1{R8av5d-9E80vk(OCz9^Qzzt{Fi5NEi$1o$q}Xxbh6X2aJLt z(6l!1y}Q^O=T5fgCxbTg&Me}it+P!2FuxvtAb#_};^tSD>Mduzf00+}KN-pYw_!MQ z^F_=j`BPZ0B2)(T+Rp+Z^3DfIby-S1lxObAy+2F)o%oGe<|)S;AwJ{c zbaM?$_3ClH^}WT-P2@+R=SkkNO}%Su{T}n)lw}H?dbpK!2Ex6d-gA;AEs= z8e-SOr=Z)XxAlD?9w@3l#U&{i%`(^F3nu>`?|CKuD5O{PzqeketV~`GNIIY8iRv@n zCCg02tNqF)#J7OdBfoeco^h@_8~5^HU5t0_w4?!&#NW6W|eYFgvS-pR;BvSac2;G2nNG4S$FCZ^+)~<=+&3rfKG-A6oPK}08RM0SV{?Z2 z9170zy%a}M;I7JSbI3b8!&HOv%w?|`!~FqO`F)@kUjMq4i#G!a4&IYx9>lBVJ&(z> zQdKyvf|gg`Ro8MyNvO;g7CF}!o}7TA?~5g&sQpx$nLFH+z~@=68SPoNU4 z`GdOsoKN^dL#+1?%6ku4iJ@6$#Bjg7ZHd1hz6SO3xSyoJ;;I>D6?_68fm_~*_PkO1 zt3)izyzY4O&&e>2p)IKQ5$k=3ys0o7W`ayWHeTc%4>qRGR}IfHU*XmL_ATN+f=@xc zdVl<%*1mFVrB?mE;fSk%me;=)6OOSVyFk|WvU=q5Btdb z6C|Bnov|o=Ux)U`&(l1_WLztD(8PmTW(D59$!OkzMEv8zZ7Y4n_9NALO z+tkiiOMr{%rtr|&Gh8P{IcJ8 z`43_HcZoS!ciktG}OL}*!cfUb|bHB!W{W{imR`67o zxdgBFJC#}QhtZ`>*zxwT-i1$4U)Ec0OsOLK$z$W0r>O_Ly4@~jy~fbV@s6?HlfxP2 zS{Mv>L69FLPE7W`{}9{nylb~x{Dmy@G+ym@RuR7rHh|WH-mklZyk8-iaxzSf*4$GY zq(9l?*Mrt?bOz^Vc=NqzQ;PVCa1N+2SB}gzi!pHOPX_`G1Le5d}o{8-?U$kzRbAJ@#f|-28BkT-ucm)%3kwrjQgUabAWw3mUUptq5_4+t$Oe_PdhfyyJ}#KM@v#df&9(i5Fy;*I^56 zfPCt=(IKyX*V^)`H?bzmWR3C5TjfIfb+``H`-Sy3s-0ol!6+C8wdv35kM_1#nKS(U zY&c&o{&AM+j#vAgoy6~hKR~^wC98q)_>bx4q&kcnU^ktod)#bg>p}aSU}2WY8T)r{ zRn}Fnv>Vb1z5P?XF}(8~Z*6>ypsC}fDJ8wPk#|2l1rtG@r;2X!w%Z|l9Fp?NII3Vn zmO1x9zr5;wp7pf6m;M89sniqN?vQ|2~m*WMeSS7D{BQ?5AwUH;*D)#9)KNHy@QA! z3*$k(Pb9S_Fpa#qAZZoLN?b2E*rS+xn-A)$@Jt z3h%SP3i3XKBk(iS@5(#CzF=SGJ$2?6uiw#ebu5u(*5M6W?-iFY=7U>7%geAvQeZ>< z;^rChXTf*;z4sjE7dRJ?vX-CV?QeRXTJUw2X+GYshxb|M8`uZx{n>gismt{T=mKq_ zRz2p&Xe=^s5w`W)vxPmr?aVS0@aj0KH}L}?2I@VNuPNnyk-Yh^1dj52M}Ibu%moDZ zbI+wc&fmL=F(JVTydOB;^{i96UWVxb>XrRRyo2l0=fWP?4r{5P$vpS8iE&h6G4K3B zyvg&HADO?I;FtHN2DAl;gL-+KCF#B4Qs!CUWhj71A?H^m_#Gh`pEdQin|MbO9XXI? z-oqP7uF7wJ5P!yH8RltFug;fdHRL=S=D>@vjB|;pIsEo0*QN5W_R2eQE7t_Yb%a^V zhyC(4x}5zDT7!B^(;i8IZsgq#gJA$j{mS)}Fz+16x7$tYH;y;rcpo5s2E;+V914=& zvRAM#z=d!wwB#5h^G&kd`sVrdAlog@$>`m9gUMBCBg7AaNub{ItoJYSN;k?dRiPr3 z<=mpNJsux+?$b;5lWE!J8tPZmbM@0qOV+swBv_#dSQ;^4{rqJClD8+zIh(IR-TGyp!$mP`q;eF;Y6)6nn%k?*qiohtse2 zy`0KO3gkBCx)}_HyI|1A+&{|Ak7MXpYh`=wUA>92*`}W3-ADXMO)^X?(DH7x-lODY zUPHTtJlK0Z^Qxb6jyj~63I6J}ORa~3^4Vsv;~hu*RCoo{n`}sw_e=7Agd=bWs?(?D zbBvL9?Dlc$SGHU5jBK;m@s_)mx`pdOy%}C}3#=q>6C8jaK)jVY(B|3iCo@Quep||$ z^j6F^zdGLRrd;QP=AhoQtoI@ErowEP3F2*hwzu7urIa^vR<@}<$=`185TAgO&3tc; z_1;U~M0gpdgInIX?f!ey4-AF@(33AL=clsW`YiR^ zZ?Yb$W}7*VcN+1_U_EF(G`HT$Eiz0^XbxAwe)fyP2A+4DvQs9%2riT?~@E&cLv8C6o?>Fb$mhf8l@j16m+a$h7bjhJ;E z=b01zb}!#EabC7*>Ughd#qk$LfPT-9t@l&%zJa6gJ8a5lf8wM?>aXdt z%6H~IDdrW!b-nr(uNM z;mGXS+qO&Ss9u z_YNa|6g&v(9dEtQlJ`1DTE?<3`_f#_4Wzu9s`m2wtAfVa=3cy7537jZ2s=Q%&s%R! zhYV8}IzTJf)|GiW#>3*=Xv=zS+i(qvSj*x!>Y7 zkNf9C6NrBfUV>EbeDapVI#>gdYU~HJExBfK(0=dUlp)#gwahk`INnXfe-8&B)%z!T zfllmOu%~<&=4jzS6?^N<;!CVlpTMuJW>Y<=jwrSyb$F<`* z+^lr-5u|#j@!2aNX$POX-ecwEGieX8*7W0e!xBtdL|GdA$}tO4y>UMK5F~A2DaTjo zZ`CQwdwSY-c4M|#@qgfr-14+NKJkfTG+>~u1j`vUE z(>rr6)u6=Ryd6H^eTIA{sVvJAd4p{@?%>t-u1f+*vkR}b2Yr4z+wtoDcB1E} zr`YzZ&re6&Wt(bG`rEB0zIt$Z5#A=`wSx9g{kG%hhZTL>kNV+ zAoY6zg{^GsVG(&7LDIJ@+t5$8TzP!^onON47oD=rD7?XBG}mK^m-i$dWvSlFyw3td z(o2}rqnrrNb1N^y#3EPzPvII!=tCB zAewEy!mI797x8yO4Agsd(!_JF)p;ua^4;5mTku2)$%qczAbbB^>(w~_D zmo$K-TV5%vBrUJ$o^4)pyu*ke1Cv3$eXVyjc^lw6_zL9xGl^PWd0VB_L!w8vDRjKQ z5MQ|~*Wp3Ek6Q2DuuDHc_SDP z!(es~=C>H*$oHRYz0-DZjYQhRt=Z;2yn1|lk@(kPA*gqi^}bKuHjwn#krK(@M?TEB zU%Z;+_$KE!u|ABO@alHk#d`bT0I2r^>#fqA@fchOO(1?Hb0_sZ?_%ALiIsL1ygl1| z)5W^?qi(lgN7kmcTp+Hex;jx16V}N%6+-$Ts^O?@Hp=LLsO(VZ9kWGR)af z2hIg4Z;Uxgse?@^-hw-`P5xBB9vTpTHM9Wr9)Ua^w%wX#fzCkdwB1WEw5gOj10{-na}wB%k>N0K=|nYY?)>-QV_GwB}^!?MkFj&~sO*@)Ga|{4Ae4 z-b0R8+L^hZ@eW?uFKV!#WcFg75H0}q4z}K5t>jufbJEAwE` z5H5ir`*4DDHrX%6+4IZITe(k);NaM7bG=jEcEmpfuY-DbTJJS|IL5<+Fbrn5W!|bC zZtAye4S(KB<^>8SFrIY0D~Mmm_9$ej-ZEaD1->Eg7m#$xS?MOuF(`GMs`U`#0J_`p z9%j9hZezX?)T{H==aE+ru7_)&Wpj>i98{&>DK*Ed5AjNQqmN{pGSmG1q8;(QVJN6K z*Oqq%d9OnpmOw4`0i73^YWFue&P)4^Ov*Or;nnfkC&UlFonyiszPFC`K5$otc@`@5 z=Nc#UWDc_@*G)@ROXJ-!{ydTN>+x4OUf|W^#hnB2!X(i0Zm`~sq%A=kQ152zO^~-2D&0+aVe#9vC)%%!ALcskLCS09Wt;aM zZ!_Zi!Ox)Hqt;vJ-VD3mppGIHC%_nhg#EJZNd^?M;xgE$A0vU~VVY4(fV zD~>O3Vk7hWc&Ywm8hRhc7?=fG-sRSNPK;~pa65E{!<}ePc3yjbrssXHC;gPv+m>uI z1+TV;iNv>URnkmjsa~3-q`({GtpG`DSr%0fGVYW18^=2buZ|x!6aO9j0P5B2-C6h3 zFN35@Sr+B(&1cE|VjJ@?PW?6|z610H^|EV93drwetS0|!*Z}f-WZFMeu=}x`x9lP~ z{$;i~;&^`{zSMAzwV>VsNv#RgBCkG3x|ZdkT$8*fSNcg!;^h`36aOmPRDRB{-wwnN zf*7cGlJ(9a?;Y3*pMX3s*@lNY#2L2bmGPMzH_i5Jb2(nE-yOss2J?XLeaU)dQG?!rN|!1O67L z9{wc$`VkrCMo{mc);oc`XJIb94DNY%zEcm<9)i2GO{wSo`dv)?8dwYJy;SOp_K-0$ z!<-2<;T&+!-x@n!so#R{vQ1sQS`QZyzY#WpdbvF%>3w<>Wrfe+J&0bz@uIPJoLFo7 zb*YEs`Ov;>Gs`LOF5&~Dxef*D-EO@(NoZ?*DGG|>tQYNb;oc`0@TZ^DkKF;jip}UI=B>E zZ%^wzm4Q)bDaY^GW{~5(jrh-C3#j)N>z(-^{SF*}1i0QoDcQ}d0BrR;dalEsM{}#Rn_3H7h{W$6!M#4~V%R9!FSG+QQ2$l?+ zD%1V?ok9Gkuo=|L&mc$&v>4C1K8%4FxckMF6mKFUY;JVCvxxr!z5(@C)8o(t#tbk5 zhQKn;kM+K`St;Ivlf&j=$2*?*m*F)~?@iXbjl8{Z6n=wN)fp6@}UX zY}mYsSC2!1hq>MZXM%d~uwHroyC(UPve{1j`tqxT}0j* z_!2$?ce|~z<<{wBW_GzE9N9n|wTR+9a# zpnTZeQ-rsh<7GGh|9Z>QxU_!|Z{qZ@N#NDv#dv%#!YhvV1M3y}KJx#BU%)+H)K)Js z;*I_%Y)+l&*TYGVaL)mp16mJzt#=Z6Ghs2j25$YfQZFkd``?OTGXSracNOs)VH2pg zviw2)z7LBELKdjEhV@=U-i;us8_N@U6K91@ zq2s-k_)+j6sF$C_krbFs-eQmxXL%xTuyWWOb-b&I-wxk^dOKO~$&a$XfTYXY9e@At z-|FG)u&Mo`U%%(Dp44w0mg*gBy;8p|toKHiCoFH3u<7M^I}?8w+zsj-XT6V+_Z&!i ziRFpBCKxu);?@3PKJlNxeo*g=*4uJ2{VxoILE!Fh%k1@S*^iU^+c{ygA8$BW3f@~n z{0jII)XVGFB?ZEdam@{yLt}8gYwh{*r}SsyjaR2%pXHwy-bwsOm;~zm%zD2j?=L9- zIAczb_x|Yo?_oQB(DTAXR@hwYc(aIa08>D{-&$|ECwX25u7HccEpP3Iz3cJEyyu0@ z9=uw=Gl?&RjiBE9Ic7;c)Om_~3qaBUmag|$J7XoOhe++PslW}%x*rcCermaNGoGb- zS6lBw@>alRSPO1@*rfe0PVologiU+LyNmeW;V)3{2J2nCIAHRg_R3pr-tq5GJXT)o zja(EqWAJKwxRCWOhpRxnKUi;!ym2rMo&dKVcH8n^^)B-UxC<^0n@{lu`CHN);%in& zH%nNm_ptR|PX1@)?}9JD^&YZb-EPtRut|H__wFVBPdEzdE#X~i3RK)w+~iGVYz7yB z>n%0c8&@9lUJ^DJ;?;U+M*I+X4AfiBdaFFcxjtMDb;0%axBa^87xyyWiPjIB9*(y? z@#A16sJDsr#-8Ofcm-Yn*IVX4Ui;PkEfxuzDUNps@l~dAjsfcBHQbT{rxh@72@%K# z_c+uv#T&UYY(8ZxAXnDI@?|kx>!{_iZxZVmW z?IGSOY#w*KyNItmgZqj>y`!!7rkRYdU>uA9*IVPQyRiAd@g|55yhvXN>Rn;I z{m2^zkHSOX)^9kayagS@<`7=(cM6D~4f8?0c8)wyNZwblAHD^*-^sV$-c+shJF!k- zbKPv;`#`L;`HgjsfO@&@QBojdme=Q0WO;L)YWWxaLHg{*f4T;q7TO-oWBN?sor0P;L^q#E;xA#dKZ zjV-Uv??j`FtMS(I)-^*|XB0dMT3)7|Bn93hZ!7!?KSJRZ%vU$F=f}4FK0-e!=Y^53 zVKewu-&^`6#?9~vsP_)*z3vst3m?KeP<;j0I)CFFgL%(J9ld!^@m9bayDe;1Io`Ww z)1N^M)VsubA0+QFkTjL$HqI{+Z2Yp{`{&-`O&;HF51ViCYI>gd*)SJmca-Y^OwUV7 zTTR|(;L$fztC5!(yMyzH*Zk`>-|+d*a0Ikm{8N$w7r)B3gI3TK%5yHIzc*B4g*V|b2qYDMk-QD?GZgTh_j7@$4HsSd(zc^_hs}6A!DJ}!!k@#OB{T;u zpTR{6JV@Si@FvWGy_}!cI_hnU$@cgnziY;=b|!L9*aYYJ-@B0bE$|1ZSFfvGHFw2HnF?M%CEt6EY{(&DGaql+WRaK$CjM>s5Y$`UmUq~_Y32v=i@nZq zf~C8EcCg#&*u44Bu-WL8_hiecIYuaUO|K8AOpadrQ?!~$Et;+6fVUT@qSJGPf%vQ@8##A zB?VfN*8y&an?bxfuHBg8jf@JLPL6jx@z20A(DL#%lipGbX#0=_XM^iKnBq;04x8bQ zw+ZoWp$n+@e(RNbxSRa3a6h=-LC$_4^$-~wHZvXXBg8)k3qieHf=QNlH+csku#j;X zOV>Njwg;`>;6q{Bl>hu>W!5)uC=XCp&FK#M)N{knBh0Q{|di?IPl>HO>gO;~ZvU=$s z$a@?l&0s0VEp2D1$HT}=jOXy`emsx(m9QGr+tPY3TgLGPB#n{3&*QnPi~VDOxb-|T zI)`!iJl{K!`14OIW}arL-n*^$b@JjMX$?zvd~~e5tR%;m;M}mucD(C}ul*MLKB)Kc zq>1-4kv9}1#b%W{p*J!wY+5$Co!Z1*;_77*SU_JK+_ zYp2vh@SU*v46oKhocQxrQZ7*Mdv?D#eKm83@9`N#pn$sFpX2Qh9Uk(o*U7xOw1>p@ zu*qNGdyB8(S~Xk->YXFUE9&=8@^atjybS7sl(*FH-gY}|@0-_o==gWk176)P1`|I6 zUIO**w%(IIpihDbQ~65M*&Yx`eqX9a(S%?)_9J-kT#m#`hw%jHK&fx>m%tMV~pJ*Wq+ zw-q;xNV#>th?dMT$yh&BvohW zmRIUPlGbm$OpfV@SL?S1@x9@8P;ajF-nM~xCioV<0=Isr+Vj(6^?OE+dDQXN`owDw z?O3Y!HtU^D-dflR+raf!TIsbn^#;$(F&{eKKZwuW$a^e6y;H1r>8D)#f{Q+5+y~{i z7_%|kYX@b&^_F@+Yn&IQpTEdIZWa=sfSsUT4r7u6RX=Ax21#{Uy5m%@cBx-JOZGe2 zIi{QAy`1>Y&<)hf6py69E95POO|TZ+_eIRo{+Gby@hvyUtir4P&Q9WUHc>86@1034 z=RaF`7aB~1iQtyE<+)xzsqG%l?du9-`5LSZZ%5mpL>p4nZg>94{cH=2r&h>jd8^sgJF(EubVnckf zM#Rj4y`bN7nCA)X{(|u$H2RWjk}zly4lXuN;k-6h#`~W7yKtsOj_Kl*ZyND$!Ox)O z8)3`$&{y;gumRRkzLwl?BJU7u+CI%BTIHDGcyv2dNpQS^%RtL_5?_N9c#^ysunZP} z+)q31B5!|RY`5>R^P4s~=6T1vmiQg;EvQ%OP`rV!xfTPGYO-|OjkZViM%vPD@ap)m z9`RQ~Cs1!Od%P0gqvSsceTJ7huH78e{)w1mdu*3uwmIH;tg{TZfO_@!Q^i|vJJ*(> zA-L_asomdo|A}_UG3DR%$KSn(zXu)z^`33ZdyqV{gY!Tr5B1q$^*-J5+`K7uA>;3= z)LXQ3j;Y~z>k)q)v@iXCNkYY+3+v}A#Z6$f@U0!#w+>U~=q$@>BRgmDABcB=Q2 zuSw}QV*_){ZoK(k@lED#?#YKdP_G{MpCE5Bd;x1g%3FO6b;-WJ$$D?%{C+C+6S+6X zlw0c0`~OIM@$a}U1?tt`m1s#`50KQCrFacv*Fv_BwkN$$GBzZ~MDS|;4k3ONJP7Ko zCx6fn%p-3dNZQ1*D6h7sf?+wPpW{ss{}&Y7<9lzi-fPIa8HU0DaJ~Igwp;Xm`Yp#h zk@)$r2(-Ms22)btAbDlJXZ{f?fwWV3-lQ+}Fge8=e}HinUhQWuCcYK40rgI>-WSM= z!{_iZxaD1-USg%+N{q@erI-2MJ;a;6I0ZhJ_CMEp!{pTmNmsFSy}I4>I9f0!$24-h z&57>;y+FN%*1MLx@1W!li~(7?-r2gp5-a63<8sVgyxJZ@tWzH%px*t~JC?keupAbG z>)ojJfKt2#6LL(#@qR}9A8-WJTe^f4fJeK2N?)1h<^v(1NFAEtL`F7J;<0 z-TinToc*|dinrkD9Mc1@wzD6IPydNIC{S;K^;RaY21vS?rQ3ep_8`Zbf~h&?5vRPD z5#Jixf_h~vN($UT-Y}3fmSvG%K1*)5XL8IEr@W64{~F8#_3CxvKglcqGh<<>4zBm0 zZ4YvtLdqMTmSgrh-X_F%hHjwV&9=PvkT(V-J<8JcYCRnD7UY=9Z~N^*>)~m~yZ3*n zhxl_jriJ5u9pBfGbHFd}QR_YLAn$U4JKz?Ob{1Ug^}T&k+C%iE9CJTjZ4ZlxPydDO z4q6X4+UuBIe&v}aSPgH3+}GKcb~c82x{3CDL;HvL{2a3uZ#Y?N%n|>_d;_!q_3HJ} zkICByCm*7ZfLO?%r<-caEBDR*h%2@z#~j65%X%9Se=7_E_3p6cT}j^OZ~(rCWx3p+ zoa5C)c`ho+wmaCi@J_z&h9U<#lbeQfsH3zo=nm@5V%v}cKaf|#WE#%gcqTN{tlGrb z<|fYTI3BOH?d**myfc9PDEb-a;ZAuQ6W3MbDAhs{Z zMDga^dN?JJX)b|VK+D_Adn7ziw^XKS1$V)%(6gf7e%IRe+w)yx_-9P~V2+vRl=p4o z&n}&5#(;Vsu--dQ&NQ#XS*K*0a_qXBnA=$5Mzawr*`u>n0-idg_Hohgk z4iI&`GAt(rx|4S|NV<=u94}J6?dgBzcpPb#YvwxMk;H!r4J!HNJu7K4fy!sIufZ+Q z1$r`H5q`_7--%&w9$US^n{rK|QxCg{{|;(Y@x8ZLueadcA$;}*$b6cXw|)n&ezhK= zZF0?CyxQ*^CB9-X(@X}f-+Qfhe$`B~95%pOm_pyH*NbY5^V)B9_KW1WqYc!6 zq(F~qnPwzRgD0R;Tl$C1-t&oNPvTxNg5>>wa$PdsIoCXkSCc%Scum*RW^yzC`NWBQ zNcg{cJ~0^0HLLMT{RZhb*HDfx;mqoOd8c~+Xy6_4eu1hXwgF84fcprJa*o3M)kgY< z_I$xQ)bB3h<2`asyH$TLZ}0Bj@1o0jO965Jw7g@eOG&|-bIs5qya!sQADa(&hPZ#~ z)#o&0cnk2BWnDQ>>&5rG2VMo;Zd;@PY_~dDndTqTl`;mwSE(LpTO%4 z5xCz3-+Xujw4KTMjnwaI@-~B{yVw7h-+|*Z>35<7a?JwAyOZ_y!hTTiW!8K4mFeb? z^-c}(3}rRub}F+!GC=o^LjLsuGceaod)6=S1-GY}^qfpn64d*G^-4K4)gjL9CsVyK zyjz^|o{X;&Tc`36vC+j$se>hnWchi0y?`YO}2fha_uRa&u zBbWUb9)mGZif6F;UhH`n*z0k}`t^HrP1X1Ov7lYSm{-@!Z8?@l)@IR~t@(>q2=-&OEPuDRd&zBSLw zG~=LjE&uz+uMA85el%|5TRlch>gA<=$jHCh$H@d4p0S(tn7r3L#K$Ywx4vIP7ZjB{gGN zR6Et*vk5*$|Lu5hAig7X0rk#wyd%k%G_YFH_iw5<@^r4*gjdr;toIl!0o`8Ldi78| zbYZ6H1N}kjAjUjAJUamJGJKaoz zRPP=>`voMe$tk)%^}N?SmutE^-V(Jrhk+`P>dhnXGH3=@gInGTwjR_Qc|O;S#;g0) z&zvI*UmB9-i40$3Yv|ObBFidF4+&f&40XCK0lE+fw$)S zetCxvD_LayN_off*<_IP49gRFV=v^Iws^Ij>3gu+Qh!pvX|xOb*}r-ZRs!#2yg?}h zDT=Qb^mV+bB?ShP_aHn2kHJnFQEl3=)NR;qx24VbO#p)9(>ZUz8&0muJPh&kU@2&M zb-$4JV67&93#^CzXZ!cxF0jWJnGZUf72-2;P3{MN{px$Lb`;?~(R;A+b$_EUavX@v z%;h&z{rW9ICm{FF?6KYwRD%63$F(zwaoex9voEYSiuW#X_UP;G! zCFVrl7~W-$cVhdJ<|(e#?{~cV9)Rcg>^Jfy&FAkEdEJ8%N8=cih~Y43X5tpIO>BD}R6@A*lS3H%#x zWETBd5#CE2Z=L_ao51^E5#Gxk?(?HT(mO(ym}e@$6GyVGJ)b3(f*(+oCV$g(}S>U&_CCnY@U>xZ8-RXJLmXNm#q;J*xHDYh(nggtFzrNYW=f6XVOZ@M9 zA?=G4=tJHlSOjxm7V|Kz_+5_R9`373IWJ7Sook+4=eL`8h%bbVp!KNlpL!~{xJi&N zsbk6XBF9B~{uW!FYt}m6Z&~k0_}TGR_lCxSKD>X&)b+dpmhO3>wny>G`F|u%JviP| zh!4W~pyj>DdV7=iAk2noAipcqw4Jx_46^&BdJ9%^zWK3#9DIxT&9EKR%PXKH1v2Vo znlqplWWnyBzyFM}Ubzp1DmSrJxu!2(x`br9g!mS41E_bQ^^PX*QIIs1Wm(#27_<&# zDbGzLuam9jxPrH3GMf1k;y-{-K)w22tJ3u|&FOF+WW!$iralZp#5cv3x5QukhKsn~ zXMBh^V!ipqw}yd&iw zz$?#juOna5W|kAFht&Bqd2UVWq2SY86T!>>O{TAi{{emiE$>w8EfHZp6(m)Ye;HeduQw^LgU4Tywiq-gAj>01ZLCv#qy1dHq4sLoBy(AluvJ`29_{TYNL^!SOyu z{8bI93sA4#7xWA#tg9fW5n~vbevs$)PEI##J}G7vbJLf!hZ(j#B)-cvKjPKn*t>m8 znq91O0My&2M6!s13U`(?7s9pB5ad48rd(&}Nx#0$9$)o17TlX_PWi<5=3dD;J#+^3 zcC+5aMhupYc9d7?YGKR^ns8A>K$smbLiOWkT0p@ z==9|80;KL2+RlReb4_Q*dnxNRhwB~hGVAR@-cXPafuP>!Ib4zgFOjzpK7@Cm zZyxO|hxrD%&(ZG3vcJi3Gw}!G?~Q(Ww-Wy&`~~W5;C-1ub`$2Cp&l%!VY=s~wNuI) z|1;P0cD&cHPHSij>TPMgcab+7B#mY1dZjKT_2x6_AEJkI%@oHwnfMv-5~$biGl4jH zn?Ta{EQ6QRKU~3grX%;PzBhIx*Sv>U+wTG5Gp@-r=Yo1GB~APeFL_VEI#>V9$7Rq5tt%5odHUYU25a@OYa{(N=`OSe57vh|?t zA%=IZR{Fz{$IQ?nU`Hu%8X2zcP%x~t7r8l@NRLuWAQx>&lKUEPTm}N12UPH zb<0~J#TzY^XEHzY>p{J5{Y!5+#hbue7q4wgW);3-Ul%teAhmu=leeDFB|W;eq^VKF ze2t7JlgH!Id8YgSfj63wXD0j~c!QaFX3_tFH-Y!-{{wG9nLLy6x!)cZTv5WD*)z@j zn&r*!%lWSC$Fg6n;Ip+LDYcy)+mHE7wp;L|JX6o{=08!2-^}884yo-ScMEfjeBK5A z)7AUk6Fm>kPi<#-`#Ij-`2K{nrhoTllJ_4t2j1S~jZ5@AxN)lY_v7d(dFE5R_LyLRF_5RJkQSvgIdG%0%Wy^*f+pao(o#^Ro(8BRvYrXBs zy9FfmV=41tLu&rLyiZ6#dG=$+JDB*9Fc!4D)g_MYHl4hMAn84p+gfuj^gCYXIIqXe z$QgNNo8$eM_|5P&sCTmLaMB){bF73ss0JOnGEedq_ZQ(EWVf4mliRIAo=M;Aj~^~1 zz5!eb>RoQVw~%)ijE9lXmuZ_2AjPV*Ew`FOJu3_v$L|JT_4!&kV*JOhz*nBt8$$1NHu7y;qRe0wi@} z8E0a8?zP9CXYqQz@qqN8bC(KIhKsY5kf|p7{l@>=#X$zc@^MnUkdtRt z;MM+NJMsJA0I0W-^-f~mH1j&<;GsOoJh48XKFfNw9wNDUrrcKFdk*mzKwVI;&dbUB z={k{rH{1a-UT@jN8L|_?;z{_jl8lq zWSTk6;=|JZvE@TiLReRy_LHa(#T2_)nMP|7aJCL|&B4JmX8ogigHI;4?= z5D;Zm5JVL0BA}}x)%OJ(iXtpxK?Fqw#eyyt)K?8CHd^+(=bU+VPfiNR@Bh30-}Qa( z*c^ep)AZy-#}POWGiO6c7UtZ?tkx zLo)m_0dB@a^87IB1m-q=^l)z~V(d{|cMdeNZs3*RJ_Sre_;O$YK)ko${xF8S;kOpp z0z3(*)As?C3!c6-e8X-d0mFrvcai()TXGTbLclZUR;VcLLv{?@PSazm<7q>PI;< zP>#R!^sCQdoZ>wV^BMs0^7jj4__+fXdoiAe2dn_;yH)VcfnN>4&FzqU zpQCqt98`Y!VPY4Hya#FQy8)F|32%GXOXHAg52nxCQG0l(t;*@>T?WEu%3X1>P_@ zG?sM`{zKqnfOx-Et{J|C-x+|LKOy;gJO6!Q^*ScKH#Ww|+J5DEZYdZG50>q1I zkQ+m5_(cKSbcL*LV*Y{Nn+?2!!At#;ox!cT4(OvW)C!6)&a3y(-=g*N_el@LuO^ zoWAQ+ywWxBTE-dKpeA^qR`K3&4ZIHU7J!$^#SZX|Lq}wniq|N39q=Qw6OBky?~V2? zO5=^}L6yGmBksq*rz&2v;QdC$`y1R%@lrmsgZE$)`u?TjO}++w*#slI*aWX`h9{r( zzXo0_czc{`oW6l7UduJ`I>0*(yi|^54<16CZT_(;-&mhsN$U{c>hU$uz^?qwI>~jcbL*mKfiz!A{4PL6(?@L49 z597)=RJ=HXlpDjU#a?U&u5+^svZZ?63f?E1;61G3#TI^U{t>SOyhoehJ*ML2{jGn> zD@`@B`X+e4Q1N0o`Hy*R;O+U1CqH}(zH`7|D&Cs~FWMMu0r3b8hst$?Sk)BC>^?EuKUS_dbUHwi=};T3@^cdx6n5a1-~VI zrRhdCLdE+!;(Z8wsp7@-n9Lh83v*TK7n;73ol`;kC{*vMnm!Y2cdySXI1#30_%iVHM%JIzLdoPWiz;6XUlgc;~8k)#q># z_my~^;0^lD^WI3`DitrydlDy?SK^gsVZBhrdlUG0|97Q|w~d(BSTo#rRd_3KUrVWxy#Zdz56>a|LEtbzyvGIa z@9+!EQ}pcsd1(svi6MQ}>kQOx+RKdWPZh6(@X0_wfOv6qIX8wH_^kvU10DiW`eK|c z=H*@%`Iqy`{mFS)FZ|w(d37dr__yh8-4s_XR=n)<;B-k~bqKN06L=PdH@jugDD;THw;0J;Kd-XAo)(#@DR0is9Z=ZjI8UAib6br z`MhWDpI&SX;_+<2=auikWn`bLT6Zc@@(#0scOrPH|1chW*}!yw^u_jTZVYqaHy_~U z&zU%>W-yMjv3)l@1FQz?Y-ec>1*a7%+a~f{-dn27mUk7+URq1;O@!lNa!#+^)B71XV z_#A%!5xid_OpEg{D>0vnIburRUlFhET&#Zpr0*|+_euD@3j7891YG(O`!XwZ@;c7% zR4$-^T;A4TeN*H!u9Q~^%EcmY76M7U>D&Q*H^aXJ{JH6Z$xU^6qjaErW&>}sO5Yg7 z>jU&x@s1L_3%W&!~9cK)mC?rvUNh3*Jtpm~RF$fPug&)Ma}BKJV%Gf>N&$ zuk@giwff2P-ew?tAy5erZ%uE4M4o_3*PhaBNJ5Ku%6_c+z_vAosoS9UaB7kqCV<> zlb*FkJmURS@DeANS2{1q4&Jsud*;_CF7;>az}Z2?iy;y>hFn~$1h_f;a>H|T6>VKE zI@ia#-pJBbywTtb=;OtVD&EfpuNi&=0B%M?HZ{)TynG$Sy1~f0i+u__{6vJ`cm`+4 zKvFt&p!4j|qi1n)`s{Q+>JuW0^z2Hu~P z?AQkaUaHSlVo%$|QNAny@rc*QN2W5!wy6r@if*qRlL~K7@Z1cnlzY(L{1%*aE-j0dD*+;9(QMYi!uBrgn&JHnQizOXHTk zhVb4fA3j2;MIsAHbTPmY4RuI>7sdN?%HcuT{JguOc0~Ytvziks0bd z`GL~mHx+O8wWPyVBTEFYHXSahcxPTqI)K*-UMk1FmFS~lp5Qu2dT+Ucw+H+ZfnmU4 zKwY1uXxdHdHthdZ@s34!D^Lay?_9yV5q>WM9|8vf-hVi;3*$nx$EzZgajd%>KZErw z74LTle+D=Q5HEd);#GxjYyoZ}A$k2!aRc_mG|?|{f;R&7Eu}+Ogii#90mOT&(Dxqr zJqkF0mjT`$?-_@iU>s`?R@Tu;U&{_7JE`LR7UAoF3jp!17Q7v+@jW9j2FL`S$-@4& z<7gYu9v{}EgY!9jA8^*A?@WX*0xAIFy+iOWhu?bOC13}@_c2X8r0}-QQTk}4uXPvt zB`V(i2>&4FISxY-@6&?!z`ykDOZap1EW)VsgSP&4g0~F3RR4aDcz*!rRlGX{Z`^!5 zKQIXx4XEqiVIrSV{mWj)ypc-ZG^o?-qAx2!Jks|S!7D2&EPifCi|r72-%#mW4Zgd8 z%_`mlg7-W4`PE>44LJWP`h1D#pP``gG)NTbOY;QI-B^E9=^KYQeSv`h=}W)o>NmiL zWx}7EE^zbo9VOx0#U}b^>{TPqHumHP>PL-J@qW@oIvfgZdA&sf?-Q!=aWy8jd`9}P zNh;nin&7?Z@)gn-yw9l0#p+5OyAEfrWUF{jHNiUz-#51O-mKuwR;9xX@SR7Wqe8{| zz2H58{ah>Ie=o4`Y{PNkL`}Jn_Mkpf@vcW4FZ5Hlt9UO7-rMf*We4E@F2KK|QkRRV zntGDGW@JZHydNRX^Fw{vmnz;cWqX2wpHucT{JEiX%C!9lD#v#4>VNa(2jV@a;_Y+| zyq3L27LEPYR8P`-(=G7i-(G@OR#aG5d~e_#pwjnkbPEjFaOQ zQSthNuN4rb;!P2}6W~_{ECm(;yuG0Gt=8lR<}k9yRJ>~t{!!owfXZ=(;N1_uqrg|d zs1Vc-dD!2WkG=`^ITmU1gS6ksPN;ZKBhD|t?*Q@A?*{Yy;8%-!2YBZ_?43ltL+3$1 zpwZU>-tcpt_ZEpbU4eLjc*hHUtKhd9umi?r3U6Ml(m#7a%X`4cGE}_(LY!T|et>v$ z1n-n~KI|m?e+E8w>XiMznMyqwgw4{tzNGx?cmwN0D&C8TECzQ?rszGY-vRlKVZ=Rv>@5bw=`cMtpy0-pk;@6mKc-%(n9-^O zE4^oAPpR}J-VG{VI^Vt}-h&!m2Y634!Mj7n`{q^XdqTr&ec#AB{NYJo(s#d#_uZ@D z{XxUajvCn%@KQhZBk+9=e68X=DtI5ogv_7t4_u7C0KnIAXnwNoY^7gK{Zt2dZ&C5K zMfga-2vE7er<&Xt#=`GLpc0q^j52!mZ71HRls9*O@&n9+gIAKHVtxnVHvqc<;{8GJ zUW8xZ&Db9d!~pzUiN)f(nLT12k;dJQkBsauOmtH_Pwnw=#3Np@BeTK$&Xw9@CwRY5 zy|>Ze5p3R0oHv`eWsoP^-=Ws*qh3y!=L%})->06F?3xL~IyrF{k zCHTDuoCdxGI4|#4^L4#M@!p76`q;>Zt9XAy_^u1|>^vl;L!{vC4}Y&)6n!%^{XRuo zmA>FzrsB)2L!4albzZ*CAc6M_@Jew1fqA43;7bPjsd&*<;Knc!e)#}5 ziy#-z#CKm4@U4$n=e-yH{Ct86NZY3vcmJgdzj6r1X7|-w^tqfS(KCCU6PXPY`J*9$LN5OZmZa674*AB{?+C zy+rsZAO;{_R4LpT^5C}&;AS0UI@0omzcC)bx*nx5&7awwMz&AI`xL_e3Y6PCyq9Dq zobz-W_G$ppx8r;t;N|%`mJ)|L>wum)&C)~*MV;aD19#v!kir99#ZkH5WL6W_Z7fRm%&#UzkzpV6TGKY zyvweE*ACtXRlH}xcLDHS>Pd%M!5a_1RA3q~7Ld}BA4VwUqFR#oox z@BqFsFavx&>t|7~Q+r{%gnfhOJ-qKA{71m&0P#w^;2}TU;D_I_f&T@dAKXWWqI_a6 zNG7!I2mKu$-UPw>Px6BUyepdE4N~#OT>~$xH?mh$yzRgjHPf3( zD&8)FHx7P-0dC%V*RMf-pmI$0gUyBcN$^trI}-8c0}lX{zI_Gn$mN(51y%qz0jtKN zJw`prIV0ax>IkZT9o{Aualw$6C+7Qr?LgZy{LW{-p8XJm zGm=IBf%IjqOl%@}CHd*FuLI$~2Yv&Hw~JVp4*kuC1+2t3|G=^|^mWi~()joRQ7+v5 z2k^GK=;7^*IAzR>^@Jo|OqFtDNPyo!fSbRbR(R=qQ%YarwYD~~@hV=fZzkf7Q}OaP z55~}vzAtF>mD-q?OU29eEe0x7yhj8t>3a*VY4!DcQF(u)uLHc6OP=z!3~}xS9#rur zh;%q~*q=QMe{Q~m`-}Ldzgy({g6wTgI4eity%qoOLA=AjQ5ElS!8_nKA66%L^>-=r z>v@R{+vAmJU?0YPt?f+gR`8Oc_Ba6X_~Y~aCF61VYTM&*LFEAN7Vx55B%2WMwF5c; zlphL&zBj-x9^mHvzP|GO*%w_Jw#W2clC`~wy`$pohj>GP41jpiW#Yzg?_+v4R`Aa0 zYiNS02s~K!4|$$Y=cfEV&=m z(ZoV8d&&j>e)E0A`3N9=+lqSqAAP?G-Za5`3VQMHEKh;+M-^|R;HB>@FXEc^JIiq7 z-_{66-z`c}CUz5e$?*K(wF+h9V{dnUh(Y*&njdW7-K|OoUvRbqx&V|8l5$hSNciOe zD}md9VQ7OA>y`ZQyQ&=X{-i}Ru|JyNU5j|cE9&MJdE4eH^)D~SoR@Vmv4nb0{ktE0 zCxKHcUJDP0e0CXrt?pLxZ)Zpo##y6qe$>$%W$ec5G^&5?T}`Y|#oHa>)A5}jB8E%E&1He`0tiTH<;L);H7f06X6}eI{@jMD|ml}U#oj?9stl2$a@|0od*ChkHM*))n;$0+o?||PX-~jL%Fdg|Jr3!0rC~ql(m(tf^G%=IQ^WF|4 z{7K+6K)ifB0%K^i8s~BWS-=Q@^R5uQ!!*41SQDG2;>||*VqhLXyqg5?o$y-^YzJ;N z807WMNA@W5FjF7}Ofb^A+A7TE{ckZmOiIoW6Q;5v#$p~=9sCc^x z-j?dgBD@53J!$D@V%ucRWS!)3Y;SNLh*f@%inp64@LqS7`!cEBw1c+}yfhBD9_wGp z;O(o@H$mvj&-dH}aHBonlj;cSue1Ip_8|IwTHaI@Z;Fcd);pEw+O@dp@7#&k3SN`0 zvA)AqyaQFdqwzdfqpt(J@2m7(Rj*^?z&TOHn$Px8}YEf{=jfek8NlXA_l1%A&12Y@}m8tgZs{X35cUcMjZ9)!0JGO>K{QaL_^ z@W+4?0F}37!TUY@{sjE*!x?nIiawrn*dloOd6}J%4%WdYwx>L#mmcaJ~)e1ywsoM<@jpLg$=xiF>axB;N@c46Mn2*#Y_3@pOgzHc;9S7-x?Kf zSCJ0?q~5U%F|qqq`cgXFtm5sd;=S5>#|~b-wkjZ{Ho?1G#XCfy`bWG@@ZJSp32{#WydAm=ocF7EGX-x;?a&X%XXQH$&I$Dt)t*oBpHr*ph*E z-pBLa__;H?!TFks7u&12`A6r@ScYO=1H6(Pm9dY&_YLQ~-&2nFDc1}o@VgV(59|i~ zFn9L55Bif>5BPbn(r4%606xyKj5M)T;HCQaYlJ@sTmq+IukiZqQpOiF4q)R=Y#n&Xj6(Q{z;uB3KzO;3l#BX2_^k%izr$dk zXksrRewZN8o}0_#D{3*rKRGwoGRefg`(NO7f;Z6M(YGA?-S}@6^4}q(bR>O0Tc&3< zxX#Vel`a2Hmvyp<6@b@Iq=WW%&?p^HzsULNYJUgK4&Fz=OYNBUchJf4)0PL5rkPl0KZTF~&+F~4F<&(T zlWqLXa6U}8UUj`q>tHtUj#BYvL5C&4Mu7Ab^8nuU@N4@p<{kj9=dc)@YxX@q$5hXp zGfeCj@X&jojxeRbJb-Jx&-1*7`{4H!z|9Mg{2axD7+lgAgi9)ywpk{&L&f_F!oLoj z1c(>gfw?j4y6n&D;UD-2%Kc9b_sxtF^X0^Av6@(-zenFrh;uz)0f;wA@aDj;1Xv8r z2h{seszp6byiV{|sCZW+{CePNfOx4to9V#$GVtFItZ_8_{h98X`pKSSVw+UF2NCB( z;2VH=hYEco)?)kzWCP;>ey;r4)5>|X4`}qY=9$=+;1y#zR)FwjKqbKQ6@PC_6kgwU zk76zXSX_*@FRkJGs^*7F!Pw`RSV(}UUU>rHw*vnHNY6JEKEpovy$5h}9Fl);#=jM; zK)XtL!To*bToW4sUdmr55&j3@3_!d`1TQ}y*k>KiIt2Ln!0PvvqDfa)Vq!KGZ+pbK z`w2bk3`xA-3f@%-J}egg+??3lFn_uA#kF>T6}+#3cNh;0lZ1GKfsra+6d!I3>*2Qr zI0!g^Rr%PDUZkYKDAWO*JO2-S0}O?vaufRkyl5U}a{}SN2L1p@Uo>&t7{bwpEyzF3`g}6ye7KQvu>l7rZ6#s|8j8w*y~DXji)^ zyu(ELa^5P0x6d=Nt}5R95q<-(1t8whg7THuuHluc(Z2vMwKMHDU_T7d4nOs11$+w- zFSc-VV=%mn-v@<1H<57jac)!VXcf3_UtnU>z)R(=9`V{fhPg0+cxm45of-bj2!Cz{ zK=S$Qk{L|y$MU?!jk|uVMLP~&N{4iW9|>du#M@nFVumU3D*(7Dg={GuYzs~76ID7? zBm7ce6+pZ_1#j3uFZMM2Ujd#2_&iN*52ar?RpejlAKMq1SY)tA-~9-G0yqf}uSg?9 z=f}YXa5EjU=qU2TA^cwO5zl^(uMvsAH|H%THUYd64-Aus@MS<1K)g_i8^b#IZ3np7 z4Vi^}*8M$YeppFe&-n#Tn~B+);N7p{#nK)(|BUxG6ZRG&A}8GrF?IVu>FLg|;H?5L)R)b}h_?mU zt>Q)1$Bm&5eqK*tp8#+ja5xL&Lv)__c&=JJ_hyXo_;+@es<)H1=tG^?=ry~@D$eRfI&bq(6%?)EhHcx zfBr7^7tr~RY>kO+#+jvLEFpS!BjV%&^!`zmaN}JHKO3+dP{02olvxLO-d6G4gD{T( zPXL_fbs&bbfaewX9Rf}OydPVFc~AbVwcxSbXJW?Ip65J;Fh2p;Z&aR>^B83se0~7G z#lRE5I$%8%{TYW}?cA?tVLy821$cS4J!E1FRJ`vX{9$~v^C={Mdd^!Tc)y3=Ie?pb zNIpM(7KOlxzBc7gNc;7$hZTrr^Jl* zO3TaEn%Gz14O8N>bcDYVumZ#ztXwm!f#37MyTF@(V+6`OGB3}cE0Cs~8(Cf%zppc~ zNo_pu`&)#s1O5i|2*cB%wZg0S--J0^fWK>-C=B-XCbksuB_#|q<9Z4(5Fot*lxv1e z_)P-1nGV@h`*9L;d-D6)U}6sN((~pa{G0gDHTi(@`zc&6{tPgNa$LJf@ZR1G?`Z_) zyq3q%zg9i(Eoe0FL7WExo-ad?h(4SZ`O=IHI%BYiYR5Ho{(b~$_+Rti6!>on{5J*u zn*#q$f&Zq!l~cea4K0^u&o3^?D=sVO=f}Gi4UAu5d3{nus`x*J`DFp6<#|^Z z(!YCNeocN!5C4F?{E8-`)Z|y@YqO>l49lBcHFtE{xSY(gp~+bVLn@2nM=nepmfeWAD5t8ZIJdmA zBCaU6gman|PIGEm$)Y(G#fdc;IaL$$$7Gfzl#UuvIB~*)YO^u9s-UWP;?R_Nxl@ML zCN|%}tH3sj5s`RFNA$b$(WQS=@rmvg&zBr9+L08RnL#OLHo!sw?N` zR?n}@=j2HW`JDXGRnvxNXT+KNR!td|vna85)~G&17bcINKYC7jLjH)!3+LzLCQVBy z%4hjW(xS9n2ngk@boFt|5%W@}XO{gv#IljCqDX(Jk$VsDW5;7;} zCC(l_wrEU#)||d+a|+XEr%bA9l-yMn1@XP(atiV*%ek_BW0QDFR8^0z7&~EFW>s9A z8B~3T<;_nkEh+9jbW%Y@W_f1s?D%nUIaBAvEtovI8OGe4s%q8KSI+4@Wl?r+eEigD zIm4%o&Kg;|AggckqPdwFWo4>?}7&rhx?PfMCTJ}EOLyLNcegycSR`W7dpBxFuX99L7GFuQbK*}T!&sp*+> zn_;ggD9I`0jAkWCix(OvXHFWMmKC34Oj(#&T^^TLS(uPEB5A&P;rQ|)eF~;6=$$^Y zCT_&k)MglKicuP59Vtsy^ld=|OjH)QhOqergL_+SOxCtqOwY(&!tT48`vM{bTu4*9)EAplCl6uc6NlP0( zZdz8}*zEc7MJYq(j;R^7C}m{fg6f?7gxs9M+@W!kb4shHjVBG&T-Eut$U|miO1XF@ zRLvPtIyNOYy(YURfBw|Iea5Gcs;VtnIH`72iE-$#@=>)zipS>-D=8V0L5fw(EsQNL ziz_ZGj;)F3&zLL}OD`;|H6|O&3Nnnt3l`0plren5nEZu#StE-2rcNC*rfSOUp;>)L zE=sE!OK+oGa4pO!Es3q^?O)RyZ#JGMSV8UN(zv0EQWs@RnKx?K{F>bA;eF#rPUu@y zG^Vt4%GmNL^UYHyW{;TACkH=C=f7nWf8gjE+;%aR3z`TFAjo6fxU z*O!oGtx^b*CsC63D;M$?C$E$rKSCZ_FPKs6J>dHqiZAo-_~w@ zJ1(;#m&n`jEn60B;s3KOCRy4H&l=?apEk<8zr~%41jy1W2NGeabC(Z*voG|iP0=!lC_=w{P+uNy9D`j zXZRm{^D2y8kM9)#ioX-*g1-yU{|qm9Ea3hh@%jVq|FM6n8$ka%5%*7Zd{Zp8Lz_)A z`KD+XGjjI`fWoJmAHvV3Y%o7AemsS3?X^|M;6_I`$7%q& z?!;!)zXAH+;&-E;j?MI&37Z=WzL9$rpzAh&9eW(0|E)-!5`g}97%rf^UN*RtQj0Za zga_z)7M^91>UkKRy_@R!tq8kB6`lp@*f40|4-4>`*b`L_7Th_w$w{TI@{ty~MD-is)Wz%OVOBnSi+{*vfm~w3I+tu~`uFC(fh3VK4fNF!&zoPsB#1|MI%u7mr zDE8aRMi;`)0Cat=*KRL~?Ty}xJj#vsf33dS>lg9SunQo*IE*jj=2zyF<&~Gpgbgh@ z7_ZxS{Y3Sq`hV``kOUxDG{CDq4t|Z#_e%n)ki0(40eC&j$8NcCRrw_aaXIsAYnVAc zp?6|Za-WpGsYBAzGcv1l3j4`DDfAjm31)LbKSWZQ|LA{0>GX+@i^u$T{65$XjlInu zZIHv;T!vk-ecyKN^{>6opfuS`=TKjqH@QTu;o-1tJ%W;ObnB5UTEV2)B zX8*|Hut!IZrCjO`;N12na-w7VFSzsB?dKcapM^b++~C|=4`%DOB_h|lqcdy!66Ex< z_7$)z+gFKP@40U7Rfv90d9MoCOL{Gl`#hejyxr=Hcb&>IVdt;{*bU7~Y`ND_eQ}$4 zNT1IlJ`<(L6J}ZX9mtR2F|jf2*gErisx>_Ue0_X%?4)m~A%T7E_qC`MJeO^;Yh!h6 zUF*RcdG8)~0*my`f>o%c8{yFx{}hQY0BOA#pEXEIu=Y@d~| z@Ag>@yUoS+7m*fZ0(C42;68mJ2Mae{J~~IoegXLPvyguXH(fV_F&E(1%ON>b?2NV2 zu|$CTB|{DsZi>&gC2vFhxNS7-tZmt_r*E4D+im=_{B>-Se=h6-|0S@UTU?^9m%|`O z#3m~IX2=xbcE=A!`vh=CGh|=krt22um`MP?J_T}?aMN`w(xXzONiF0OP5M~y|0Llz z6>^s5x(%gkKfw8Uz009`IyCq?miH_G&wR*2Kz;q&a{PCfjzyxAr-MAcs^N88`;#b> z&h|gTKHL60cSpF?r3jnoTLGN24dfupQ)5>?453KLL4BxGBC3|8Ed}cF3)o>kR4LQKWe^BnRgr zW4lhrUIe(`%aA99o30;4e)~b>xwDYxg`2K3Loj-Jp@tE#M;pe%w))LM8k4c%eY`B* zi39Q-&HHhnAMmT_ueu;PJh9OqLwdh0()=jor<(M)A-y(;G2N3PH67N%ws-g!Y{rJ`s(gF;EC^i~s%KBN z--z-(M=D4B9$k8N;n&A{&1w}EVr}(8`-#3Uw$GP#`sKyjT?5`b>-yWpug_wGC1W3 zD4$6fIYsNX{_Ik_luXO!N z{Em|i`RQRuPsb0~TmusWV48~YZnOos5wHR`0erqg+h3XmKaL!L_t&p<9YJJ6_oe^Y zql$jW&B)6-NiTUx-ja{xD;Xp|$sakJ=WCh1$@q>dyg%#uk#f9i&A*ntBK>~Uv5^4R zKMOKjxMxDn5^niM%~_}+IsiO=6r@qO&5(nIySb>cKiY@UqKz02SuWg5AUPVPtA@;? z)3JL19?lNQK1A(y6nz)S4B$%fooIW06K(wOkbemGMM#%$Yi`-#U)@g3{)j$Q7UX#0 zX20Riz?JULFq%k4E6BrHASVg86|zvc8{AOyPX$I`s{tPWKFH0&y%lnoaBHG8_}A{Q zV=n)Q9~pit+%3ho z1?kvx0FUp0{7twoK)Qsx#rWvI-z)m?Ya!PQ_g2Uq!rfAQc0$MQ`b@e1I>^U``w7S$ z!rfAQ8|Hepius=HkTmzR6Ygh)e@pQjkGI2I5oqaSTsOc@b!Ez}e)9~y*uT);uk`T^ zU)(xOY9;Ad``C--Z}qwL!LDsA-<5xb_?D1#Xz2)f1NMs%FX4^767k};i)(gm+r7<; zy}E7BwwCjc`Bxnq4)9P}kj27X0ePozH?KWo+gZ3&8r@NfgyzvwU#SDr$9khz;~yJ@ zUQJ}IB=>5XXK38tQTl^d*X!}{(!4qO*tRP5yJKzB?IeXG*(ko~KRLd*#`tvqYm86r zleQm6`jTw&{2!$|NlJg_KfZBbwU75wjF*>t z$6+4P7P$gFCSz1>)M)1HKar&SHkf8gpBWjxCE>0o!1XF?V2{%{`DJDdv8#Pj5OS z&pkB7;A=J@M2splOWZdacN=r*aoFceFJSKC!l$sCHtP8lUi&$(qF{U$1WG2fxFqCzz z9&URme5ABz@2Ku`%f_77UzbHOnvzuR=$dVZsP|q{@z(VCRn_*8yr9>OwO8P7Kv8J^9>Cp}nX%k^+`@tvaoPj_=#~^0A#Xor$A;1cNS!ca5o}BUSEruIhnpI zR?YzKu7Io-ZX0CU^&*Uhz#jHy7-mevj^M{}j)q-;`%;(-_L|67aL3mo_rYepuJ46a zjb6RP57IQCIHhAIfZx*$IZ(JQki&(04CGkhZV(s$ILi^ULdPVyb&!887kaM1_-UnZ z-;Fc^_&v0SkN>Lyek~PqxqR;fZ*x9?bkB|B`6*qr@$qF5@(u@Y`$DjmtE@fSAYHftoaVC* zCjq|99P9}DjD633$NLD?b<%Zj#K8Lw*LweZecndmANBbU>@z<6w4$hs$yl#Uxi|p! zpo^A^I4ksG8tn9onXrdm9IIZ^0F3!?s6n zhW&i>0kq}kqR+wI*iijT*QmayaRk-FwrBYaW@E$W&eev-Pwx6pv?Ii$4$Ixz_*DPW z{oV83uQc6`X!WQ2Q+&Fw^Yf;gLGAsu?H9$j>~H%1&Bdp9)DE$YR~cW7KODQ1@T8AL zGp|qS*xdas;(o-_+;~PCpTg5Rf#XY|_XkbuuT6i7uYHg9NwZ1i22vZ}9Z$4>^xT#( zK0DsnXyfA`7deo-{TAuwOdZ!aGJLf09b*2Rc-;3teRcWYCf*yR1HC_Ye$;5u-2EvX zs2||GSDAO$M0dAM#6!>R3|9Ibc9$}aclb8l57EAVCdw<7BhrI-wfEP?cRZn_KgDZQ zpJ)h3Z+HD8($5`VtVcLnY2H8P$bG~-xgTTzz+19F$Ry$42Qo#t2S5%6=zeSuRu}<( z-wMdZ!fk_GA>3;q*9!M~$j60SegvnE`2sw?A7r?2cZ7@)?kM$6!lP4BHI|XCCZ!i>hx}>$Jjh+Sj;DEc+6r`Z`xuc>p}Tf(F$|v&E-EaFXCu7 zNsdRBHoi9BQu(F&*Lq*Wc^z$hy1%ykQT-vk(6AoT#@F7T=20y)uR3HVsV+-x-;D0# zjz{gz!G`6UNE+S$$%f(RIo$Q=kK(ilLC`3^7=Kbc_w$JMz?#`m|3>k}b872dYKLv# zHtYv9dVX!Y`ybJs(0ra|eYDy5B0Sw!I2_F=&JP;4Bii_MA4)gkv54|-wKvRv)Sie@6wW_U?!#UX@>NCJ zJ1O^-B3r({yZnEu#G~}L91?sTl=!!X+=i8>r6G4<;J-X%CETk*o`U^!$Y%I#33&}} zWp(PUkc04fC*%lxj)r^+`-_mTV7F{~VQp-N&t4zac1VbCc$gI6*Gjq$^>h2!4p?96 z7u!Ep$1Jgt<}Y++v)x?5;_DMoOHZxOtq)|uu3%A1H-C?R;b#LT_~_(at&zSbefMK; z*4KU?=|aK-rOSpOiSJPADeq&lN_lV>$h(1D_2*p|*ag?cEAlhl6^&lU|Ge~G9NySo zYw*PY*vFvvH~9E@1&G5Tn|}oP3gw?h?_cyIDgQDtezERS>VLOdBk(rPBg5?Rg?{!jrge_Ch7+&uhc$To>QJr z+S&AYwE;Q)(WZ}9U$$M8GwQ#H{C}nVN%al2Z*(78SL5HBa1*8o)<#I$=ifp6e=FtI3WMD`s5|VQL49El3`&Qc8N|P38xb@b_N1W6u%`x1gKZ7Ug%z{~kX$m>2)+)0pQg}WT` zPT}4Pc|f?&)?qI_&{FzPvT5rFce}0`r&Imx?r$Bxw)$Dyeo;T3?o0f(`&;I>1+7Bq zxF={0?E8YYz}^=0JnR>PcEjEi^akv=f)2ty6m$gk@t}`ke;MQq(z8=R-@tu3=nU*% zgZR$A#-_Rc`2^`EsXMz%YTbFc?tju(@5-LUKINy_(|Aj(eFA+K2 zy&@Zss{YaHZxQXcyMHG7C+_E={;1HO-P82?H{GHUKaD4-zxf{}KT&>h=O-GEjc9os zM){KNL;VoxLWc7E!!5FOR4bBQ7^3`dO_QawMv?MAO<2TB_o4Kq{u%Z68TH#ly+_Yu zo!9dI1}#6$@4M4m?8mo>^stHhIK_LgKG*U%Ov~>c-_d)Z@dWM1qx*<{u=AULmjAWs z;}Cr8RZ(xerAYU<@BOChX`BD;sK=K1uY$eWe+}&W{kOp0=D!p6bN;(<=Kf3myW!sB z{|4;0{SU%^*Z)1(pZI^_@54^|f8~!ph5tA3IqhE$yP@%X|9)+A9XOffZ|p^AX2#>z zfZGG0f56?aR|nh+`~H9}u(t*5g#BE=^RQnG*bRG6z?-n&4tNLly8%aF9}RE@gt1cr z-@tu3;8)n^16;5hm{zV<*nwt_!wh_U{5|own$Rf$J-~!pxV?4pR`@*g6k7D1pS%V8 z-A^vUw!8MCwtwCAHta*L_hEnN`ULi8t}kG#&1LMJaO!pJ8+i6dKd}(~5Yt}#z9eKZ zz(d~zd7E%AgS<<)w?Y0(xN-16gYWh|_s}u?x|z(wzkItvxVuC46Yc?!1BH7qWcS>OwuO=p&7aWxl7se{eI?4RW}SiBBdY(1honI`=>Atbey4hs>RIcc zhU+@b@w@9E(I0U?4~^?ZyXm0$xP9WeVw!G;n@bPp!AI>prHf5mw;xsRLwb|c zrjPYeC7in*6yM8HdqC|n@l!ivAJK5#pgDfxq5cBJcRz z{6Nn^@00FN^}qZ6`$vZ;Jx(sT+F_Q;9* zQu(r+5c!Du4Apr&F_!gYv(dU+_?P;&G?D*oQ*tPw(F$`Wu#K8jc5O zzKUMDw!9LrQ}h!Zf}ipYJkT>f#-OHw~hlmmDAh;mH(Ziru-KJM`1J6`Sm zSe^1-n!VrFhUuf_w+X%6=}P@*s)xjNDsPmYluniovlZ1b$Kxx$WAld$0=#e~7_yD< zzYemUaEC)C33ngJ6yfGynr8}k7G$jJ#cWAOZAfI$IzHaK7i+(QF~!5$ef8uqw=>;OMDEnqs_GXo0XE)1xF`z+eJUjZdw z{txDw{>FS1_F^hLs(B~egFgZH_kr{k?jXoE!hIcNd*P0NOcL%C$bP~-7?M8?=gESc zD%}6)=6{+#cV!!U1#`bU^)I6j=g{wm?bLq@JHu;{R}wQt@p;zTsC7|Y*!rk_aL<#L zNFi*Ev|d6z6SE`+bz0XSu|IaP>1Gq^!%Z8oQ@>*K-dqn)SzDem#_oL^h`;xwtPaP*)9v@TsUn&1nJ4g2?e$s>P@75GG>(08_he?e75L6QF_>mn|c3U<@nNInfD!7M;Pfl319P9_>S{G zr62D<5i=1xJMi-ck4AnNsbj|?ov^=-`~mhak-tY8*x!-o;dVrwN4KO7SMLs8FY`&X7PmFqS!jj-*_|7isL+Kqw59c?U@uROd-np-DAnah@4zMGAC130x^&Jd%s_zKc zlYPr!&-48P_Lsgc*ja`pn8UaGy?~vtyZqjU{gK}(*x&f^Gbgex?#DL`$dX zX0N-tewivMWG8(uOyBj=K80`*kiH|PeGGICGVO0@r6ttyJ!3w;z6OJzpTB=VKww}{ zP;hWaNN8wSSgTg8TepE}3v(SzJDBz`;V=;}9bh^N6DdrTFr9>n))+}+wEAfN?|~W2 zM0PXlAG$YWVCedGvkaNiEm8`*NAmA-lRglqYDKf+Zu7h8*<0Pd?-s*;>~;q3r9B?$ zfn5YWK8Jm|N0-tw# z)S|cP9eU5f$EjTGw_x-Vov=sJ|&4pJux z=j};1qZHpQ`JogCbm@UoT-2=^CHKv4r%{T3=vD{!?L8hw`90C&GuW4UbVe!e8rvPE zcu1_D`7K?5ISi$^t+@m2DD&XUosYDyPpa?4`qZbP{0^_*ot zmp8t=nB9byp8a2>KGpNhwY%>2{d1*XAE17NyM5j!!XHwkw%<%h+C*9Zm zT&I-x=%D#x&AhI={ucdU=f$SmeQH0bwQ-LxMLg1r(u4YS?*6Fgr&`7R-Ou%k$Zz7h zP2?A=_}}@(2sw!?uPV~i{)97?`fP&=}Y|?kJNge%9g2yd$L-%`Z^x z_=Biu!n!FbY`;SZX&IuFB-=wGT~7U>Y^^%ju!#jTN`h=o8M%A`EPf0fm}JGHX|1|$=m$=E+?wHAMW(-^7cwxkPVGX zNMA}9nunHN6Z+6PyI8lgiT|nJO#N=^KWpcw9nGxEyZh7Bu8Q|#`?lr&wKq-Ni|4?} z6SDDX#^1LYe;xKFsEwE4(b2{>anbEh8GRDd=9YVM}obdD9NLHW3fT{A|FvZCHf)M4p8~gwnL6hN<7k=(udkxNz{|nPO+U6mFM|xf?CbSZtP$20(idn zfeaGvP{=UhZUfm}xO+mHg*ySVw{Ryx_7&~{kmDirLE8(-s>mImQdp!a7Q(mWFpY?LV zz9Fh-6n0oe<-jhGR|@w%u!lvDhMg5X1$K7ytY|&6M&As# zE&2u6yQ1HK{Z{lxus@Fe9QH|h9QIrE?{NPqkH&6@$=^QMU0ZsdBNeB{;7fO$wT!(^ z@>-^YeGK;r_9yJW8DG~_Ry0}E_0ZE4H68ZsDE>{!+^7Yx7e?)c%{sX{HC)~78Dm8H zC&Y}2iNyJ2{A4n#X$jUiJ8xc&QQ%#h_rZRB^C8%OY<9smZ=Z&h>9pU>9sJhRrVe zVjece)z5{IuWK6Y=FHi_%9XAbMP@6~vRaWV4k&WY-?FqVjZI}RM_cF0a_J`z%QFAS z5iX@!cKr}Yv`~GxeDZ+~rI42I)|;P%T+``|Js(3R-tfoVpfqN4_E~r!HI3O%ESr*u zO|A#W6qfGap2h~=YyEcWsWi)~7i*(-T$i48=If8Y?JzR^zT=~P-#=?h2d`{`ST~%V zGl;F$J?7=_m+Uv$@0_1^K-+-ufF&W@LS73?YURWv+Va+Sw!WwJW39d0^k@^`Cb3Pw zHq+a-jc6Z{9N~}OgV_>khzf}6A2ledAgVZOb<}-P0pmbrb5Q z)=jIMUN^JOT9;clx2~$Lw(jP-C3P$7Hr8#cbDTYTcH#NM=kLFWM`%5)HNKE(JsNga z>&dXEww{JVw{C1b18!?;C62qF-{I@5bYyBeZms{_J?P&cvLLO-SCfo;Ge+>IX zYhGuyZgU;%@HW$6&ydTwt<74vZM`1qg<1Pvn_zG0^>5fad+mb#a<9Fx9lhRyeX!Si zu#fio81{)?U&7XH_eEav-yQ-I z8&i*QzY9?OecpH9BfSlc*;nKl#C8T1D1XEpTk z8^rqh4fOM7gZ%RRZ_wrYj|ltDcVyV?HtoF%+Y}*H%i1Nif14$@_X*w_KFIKj*8+IYD- zWK-xSj6m?Kg5In~{%yebw!Dw}Gj8j_t!vpkTW4&0fX$SD@#XBcU$^PlPus`W7mlA? zKLvABI#&puJld7x;>Aue%K64t-(o!3S>N-p9fo)CWCi}^XeCbjpMhNvP>$UmrvuKw zE(k0SggfvIY~}kb<@=F>;PPPj%U^_Lg=B{ykI3JEOQAi`l32oqharcCt%a@pwu*8J zcBcHR4o4$C#cms$>em{wI%Xq1c6Qti+amuKQ&wa)(ni|U15bZc`E|0b{#)Uef63|W z*7I;HzjvejDwA?bGd(54Y@cHIyXHpQPjL6wUs3uI)Q_ie1@%9upG5r+8aG(Pyb|^I zsb53u%hd03k2k1abx66N<8#q}(R_bvqj4LJ=fplwd%V&1|IJ!(gO*4JS+ zu^RhheDOO)7T@pLcfP0bUVk_If%kgB(7{h)UH!Tv$IkQ53_0%oR>-BWWc?@Y)51%z zpRYFZ1Kq;Nn~~Nn@2yex)0Fp$i*+y`bG+Ha66F1V{mmQ9v)N3aS3H{8&zTlenWd-Ukh(`YntgVX$AVqxNBV>X-P@mpkWljt@{Ny#vMxJmJt zzHZY`HvKhbfW{2uW{}4Wb{k8RCbcOu#ADK~VAP4g-SV26))U^1z5YMtbN2tT`SpKn za1de(rj3`%bn)^^^!D~nSKU)ArRwmW0r!7y$N%!n{(n#Q`u}PE=Or8qfml~^F9G8B z^8)evdBOO)HWbT%typU;1-8XvU^~_x?O+7HrR|9IyeOPX8O#Cesy(DRAIa$!76zzR_!mJO3xA1odA#cErBoMt%?z3Rctg0anPmWxv@^YJ@= zg{+A26SL;B5?0E}aMEQ3o5w0y6{}|Raq8s)oS(T6W1$;y4(1H3*3Dv8mdb{(G?vaX z@OywmaYp8FHiGqx8HKN8#;~ziq8!J@vn9HTSgM@Nrm(3j8zZWlu)cRQR``}Qk>lN2 zUv{jy?Y7%i03?>W4g6Q&ioIDQM_J)$)_`|K!<#knUl_j&?z3Wr^R^X?JC`n9;lRC@ zI&Xt2&E0;5(5ktcyVd%?T>YI@RYlk6Y@zbQr7P8cM&!g+a$dw9U*rhB&igFN!Y5eW zmDrzNzP@34gRdX@Kk3qV>IKTV!$9;?gGl{wJBRDY7?v@BO^*^Ss|P{arFACzEtC=Q`(HdP?I>PHWDA zzo2;w{+%YT7(={$G(Px5pCz!2#`$akf8FOc@OIyQzAEz3H_sRKS^P3fG-39YI9LL4 zaV72pXP3wWCZ%Fa!Sk)uW#H?ja)6Dc@=9Ze?qA&>YkvRwz@>6J8Y@XU8@poNuFmtw zD?p0od14>cCa)cKP{V{eyxxEqQ?{0+eGw-%lyhOE?m?HMvCj+7|S}?5`Qe(B_hRsF(Qq(oFDo* z{p3u;^nvGhCFooV9sT^i(>C3`p;xE2oSLbddMT%pTjn9%!e?6p+nqk9v+d6AbV@(1 ztE{k3Ra8Hxo9uqF-jKx?bT@35p48mAq*FP2P1@ytMHe4i@x#+v*L03g%G_$!?GN1< z`SI@KhTYU9RK7%H`)=v%&&=}--g{ejZkVo?WXBy{H%g;sI@xnwuXnoCMMs|N`uFI#C2Qgf-7oUfQ*PCGDe84B z`kil|rFCSAWSV59gqO{f{UO)cw6{q^RoJo0WaTF14W(37N)@aMQB_cBRc%#cRnt|o zRmrMNs;#Ol)iF#%QgtbHusTHDPCZsVOT9$BRDD!!XIsFwlx+>$I<_rrr`gW3O}5=? zd&u^v?M>TkI5riqt6^8iF2-)G-DbOVyNh<0?Z()Tv!7zW+CIVlko{r%+71gH_Bfn$ z$a1VxutmXE(A#V(xVPZGf|m;xC=}yl=iJ*l+S$vsz1!!aExmsAYU9<;E6wYW*LAOV zUNgMs`*Q*91N;IL12+V258NAgIPi4f<-nVPi-W?kIhYabRpwN3UUG?4F113AHb<9J zHK#^SGh;X7K;y%_Z|_XL7H^z6rlzE*Ky4y^`Gr~qq#2iDy)Esg--YX*$FGz7sYI%^7 zO4A_|`%3V6SaZPGk($Diw%u5KPt(7MKKT#p8l2YkV!J{UV5x;>T}PAFwABIV4LJjP zMdYn(sWvVQEiJ&*2h>sn)4JZNb!|;rtF01%_P>QZCy&KkC)RO3GzUG^Fwj2Mv9j^d zy;^egMD~DA9AN6x6a4{{KZS_oJOJgb^TKD}`Louhb?v$A9JB*y{|M+*S^y~j3p6E` z+Ud1$e`*70dj{w}k*|XLQBAxjhd{GL{v_xP0JYQ6dhHdV?V}O_Sl4-~M#`I?TGSN(bW*{?|8Oe-h#xUcUY0NBUE;FB5$Sh%&!EgSl>nH$Ut70A40&F4Hh4n<@`(kWywlo{aa%?bL zfvwC|W$Uo@*+y&=wmI8|jbyvAJ=iF=A3Km8%noBmv7^~B>^OD;JBgjjPG@Jbv)Q@q ze0CMPj@`g+Vz;w9+1+dg{pn0cBs6t;fa(6efUOHac^Rme$ZJ50iF|R;5&&xcECpId zY!3mgAo7(!Ljk7e1GE-^3dA~~4aD|_pp5|ZvzmZ575V0%EdccTtw1{f=yf`Rb{6?= zpgjQey}dyDiTnW2!6H8tbcD$3L1O^)I-@}+iS1KBmx%ld&{ZP81~ggZQ$cr&{P*(- z{qOVlPo6&wcA9GJG%I7|hhje|C3?vOi4ywu12VM9-Q^A>zusM?fRs>tR6K+Bowun# zf^7uE6tsi(T@LO0ulDbxt?g|b))700f{>?m9qU1Ib`Ul3Pn|}RXHL%{)5 z&vSzn!#&RnwvrBco%4A<(;1&0rg2Oei=Tw(?_=@P2!AQ+w@-`uW{ZEuJ@MQU*LTHy zo++-QE%tQpf@c3oi$2`4j{nC0L-eculBXU2DLrm26hBAw7l{=8Jt8gsHliPZ#V_xR zKgcWb`|LE+Fa8XopGl_pev2PA5%&j~;(dr0;{m_u`M2cv^Yb-*yFc%rWnW|YeqY{i z(c6FJ=kl-a>n-vBwdAd_?2|0}FN=T67k^ICzwOKK`1SuS{=YxE@0S1H;%934{VaZz z7W;U$gwqG2-{P?Ek*}E=%&?NAWgV5qs#L+@W162klW9G&~WQnR`Mn zG!WXLQDi)sL}rnBn3tDeW=?>Oe3NNrK0vZCFJB~A$Te~k*;^hXI|`kT>1*$aOnF9!dAT}MlWD@VVR|q_n2DHymolrE&CE8;y6KpA_b~@h z)8q*1lAUBuGiRAUn1{?O<}LG)`HVT(D9*t)n1yZGf@~4ijrCxC*ix8(E3jI&8fM=H zrrEa{`wQEeZHF1SBio(r$@a(WI}(2Rv6y|Qv9s8P>=Jeb=G`@H5}ShAcQd<{-G(^k zU2HnL7gn1C@B=^09%V1Fx7a&~X@0~$XFstrBz_*)qN@cF8Z}+~Nl+()jbD zeEmT@ON{70?JfFkS>!^vsK45_O!Cj5o=NmfbrOA;hm zl4QwI^gM%}@6husdS-a-l4PT28p)JgLeE#|c>sT_(EB2K`)SVL>SrZyah8A{@#wu6 zy;h)QA+9n{Qczk(T38w)^^^)yjkJoin6#?2w6rc-V?08nqdf#^tVb2;7>}ybu^x4$ z<2^b`JK=AFM~p{7yjmEqdg4_LULA+OV(3vCuXdD9^r)K<>Dd8)OYj%zxy$?&Ry zZKH@HUV$bYzI!)oCH3jISYJVa}j+mX|93)Lvv4~Aon#kK0b`nM-Bb!R-ZJg zh4ne(<4W%M#QSD2D}2}c+K~;u+n|w6_ss;(@;wZE%=b9(Y2Wj}cYN>pvgD!fGw?D$ zxgYL{UsXSNf%$a;-`lSb@Sze}(A_>j{2GJEmxa*U{*L%H9pi4x48|Y4v z-wnD4K=-6HzTkk^ehBom$UgyMru-K^uyEW6)njJ_>ZA$WI2HA@V7p z`$hgB=uweB4odS3w}9fx2lVTF!^cUs%JX{pzZ%DJ=+TC z+g4iX+^UH>w`fqRcN>ofjOyNKz04s{!bF2w>Sq3xF0K-EarApqo!o*x3~7c{r?p;g z0(5ed|57i9H`7D<5As`IKwfVE{T?Bp4Me^>=xC9T16>B7<7heP8US4&Cx9l4dwz{F+k1hI6Zv@1og#k$^ts5}VBBfMF&GB=i^xZTP7?Vf&`goP1NvFyJus$1#PJmY z+DGJPf+mUlF;If>RvzPy0sT=Pahf~xKE@V}mv{hL3|@X=xY<6SB>?n()x^Bg7(n@* z7+1T*u~im&=nw#H?+=;@XaN2g=n1jC9L7y~aSS~MeIoMIN1pn^Q+@W2eBP@Th8`L~ z@9%!l0|5G2dyC++0F>7`VGRKo41PPPzcZeH@RgwDsVv$7w3y)p0PSB5^cG+#_z;Y% zS^yfWzX+7-eiG2BDr^GP0rZ)x0lEM{t8i!cfR`PBUWdoHDKCzp8GZlE+i#uki{>J= z^s}D9&hQdI`7@8;qYj|FbJoVXnX!69Br*hB=B(P z#Tmp(?*!hB7-?7nOjh)rVyyCGJPXfEQOW}(dWi~A$`jysFO%EK6~rCBu~HI_3Oh^5 z9q8g>Nf)Kg{;Kq%!|!-9avYyJWy`EJZ>)<1cVFgm-s6Y zJU#$__8{JJ3FEEyM%H-K>a?qO6!-zAHEN7$jT&#t2TnA;SYwpXlmZSA*PIQ&HxgqM zrhuQR@q_FOFJ2covbfm}-`^h^IsbXU3;fLy-c6yq%jR-8+$UZN4W690LHx2(jP|a8 zmM~riY>vK;=X3bh$aXk0crKY0ygV4sUGQCCZ&Q@Rs4}O^z%o>(W!YAwRoT3(c?RI`9SR0(7yx~BAm|X0 zpA0%h!g4YA+dzXSP7x|~4)GwK~w^Y+Sv}S$?=qQm-2Hha?pAqSj z2cZ2U?fxVpK>5m$DWL$$KfzP|T9hll z;u*Howa)Z{wi!VCSl2#`!Q46@K-+JfgJ(B@@{#B9TL373_z~_8fb!ALFhT*8UkAED zK>Ny(KVXwt@AJx)$Qr$uG{q5MK^MUlP=AnuQ2jqDyJ3;3#Tm*$~2!Vywl7Qj=!HK#GRWgG*6o# z+*meNC^2KSP}z2*&{{EAnB@>Hq!;fgWY+8=j2hTpxVf>FaO7h%p;&{4!sT_fg^O<0 z1jSsf(9X4@a4e;aAk+>N*1akr*d-Pde(7FR7*)d#9-e4CqV=<>BQ6E(8*$F~VuV`nJaWv$ z(2>1PwI12|k0B$+mz*=Qg?;Ks{*TO&6E9sDIWG9&$R{2jN3P0L=syci`Uz=1dV`kN z?|%`hAAGH*zHN~v`Yoxy>OZ7*(gzglrI))7(7P-iuK&C)R^O@3Bz?WLGxRyD=IM*q zS)zX#AFsFDxJG|qSc?9Qbc4Qh(=GZnUAF66Ro$&OJju|jI_}pWOg^Nqa`1@0%a-H% z=R;2Eqn*y`J5D>VFL?8!eyi>8`Zms2^)hl@KmG6@`n`Q_>TA8frO#-0N1vQ@SKt4_ zJ^i3N_x112J?4Rgs1wYYuFZV>B>h?q*ee1EF z9sgKAQT14F)BBOW$J&Sb-wr>}$EDxbcbj}qpBr>n-y-R@o_l*!|JmV&{>sN|`njoB z^wWx8)~|1WLEon3S$%uuDgE(Y$MkoGXX#%A?bo}F+@mkoW`}-Y=4QQj+**B!n``vT z2QAY()t|55RehSiZ1@;`N#`N@vWt4^-6pryKVRBFKdgVKo}22Yf2Xt8w@rC9vftFx zBR$;`M&`u#8@b>XKQeXel@V?Zkt43FlZOw|^c!}+^QFNdtDf_#d#kxR$0~87I{(V; z?l*wjUS}NFUp|BDd13+g;o@>GvThXWm%C)VWy6A4MT9JKRxl>u(fkr2|-{Q}5 za}HhNE*!YVIW51%rTu!Ji~sbP>#Bdj)qeV#t5x*_7cee|o0XQw4S2%vy4MnZ|7#gP z>6wBrcuUD&IH~3i`Pj0}c_(=UfAv}mUYgd5KR&B9-=kk!-m^t}zC?HjJ}a;jU)8${ z|G>E$Zz%j5f6cikf6==)UzhL8FRmHQ2X^ky51cfRf4FThFMB?eZy7LxA2d+UkLn!5 zpPe(BcQ_i$$4kfZA8L-{XUrVWzrHoNfRKmeV)sNc&Gk*9ty z*8ns=`VUa*`$GFr{}(NQ@?Y=G8;Sb_>%Dnfv}FNkRP#RU9jtv|s$t(iuM-K{OXRKn zVL~zAQ=b^zB0}xPmOR3D!0WJYpb_ffpfv&XI*UOqelp9zTkqd%V9h}LM1j&hJmszZ zXY#OypnLgfYb=&-veH$^3g!|EvEA&r*CNz4_5298oFSK*4>AZG` zi4Y5oS!iyL65np2#CeRVV^V@SW1xj*?wM|Ccic_=9N`5iQcL@0H&ZjQ(D3Y$<_5=b z6CJc(%qQ~IdHe*kUCU+75>r2Kkv1M0XF87*X?W~%)47F4?K7YMh$e)aKYwCH@q27E zf4-um_z#QcF++x!uAAA)+|M#rEi}HAxqla$NC1b0hSxH;Q<+5%3pJnp*JI1~`=_5I zQHClj52Bj8w5-JJ|2-CJ5}>YM<7St(Hk5J5%vmSa>Is!+05l?nc+ z>NxVYpHQ*t@;oIuNEHDgkD7~T(ek^g+Tv@wH{b;a9VFi<2Y<)4B)~D)QAR2{hB`_}m}7*a8)@O#(NRr0 zId;Zu+Rd>y@EFIjz!My&0?%+XK0 z*I?kXt~5J7%_0f8>(;`JB^}&40e5!m?WQDs-1?zi>R!%0n1s4(-B}{IS3$gPHTUYk zvFdhwfVP#Qhog7w)g!rR0r!agSi)>){V672;72_%<{?PGTJ(pQPeR z(B>q?B()-=leQ+6C22_q(9$%ySu*~kPTYatp z-|_iVrxs_*vrkNR)*U80>we!4u%{A}^)$+_8|xiFySt877d-0FUZ@ILeS0Gk@7s%%?T#m+|1xv!O*H$ z>Ep~brAn8nRR-5A6IsTQbSN_l{NyqlfiuheshgX*I%_p@7bN-Pc`Kh(0k~4q;1q!! zk}?!ek-=~;?;-Oj?>RCQyvWN%?f}CNHER~hW`l@3Us3{oj%5)sR~J!jZ4oio3z2Z+ z$P_Xc-pHGgndKP#obD6&G!hk40DevWOeLloQ-i6?G+-LT&zO1{N1MEhW0?ueWM(>i zix)9#;7yzce~2^8dFC2CiJ!vn;RAe_hlI_jv;hRJ~lNPfp z;ghtE-3X7QUGN3o&t|bF*bD46_5qvCzGXkK2GlE;NaPY5iCR)b;vy*_@t5$DvXTmt zFi90jElEpBcS#@k6^xdQNA8t{@QFx;r^F$6LfnzOki0=?fK;lKs-zF==_~0wX|B{LWn@yBjjVvIh^(m0R~9I%B-Cu=T?ly#Fu$%e~fWwT_< zWT~>PvK_L+veUAwvb(a!vRAUt$e?Q@FDx&L+||DFAbDANxV)acxxAgcgS@AFfILP% zO}<#3B;O$4BHu3GCEqLGFF!0lCO<3x9a*g(%Ad%e%d_S0<+*a1!bYK1*eePsTompK zZ$)WEpdwfiuBfkQtoTLIO3_ZyQPE8ir5LUlt(c&grkJCMQ!H1kR3s=;6zdgR6}uFB z75f$E6jv126}J`l6;Bnf74H?F6%rejje|`g8;wnIn-VtuHk?fvo2oX=kgue*O2dOwY0|-(`vtIy+5Lo>lxX$ zR|Q_RTGGgM!|GVwY?sl!uU>5Dky@3NtXi0&_&uXPrGf|PL(~^lQ*_WYgS;) z)rp@5rQYoNqG=Ohp<|h?fxWYWlXRM#g-1$AHr}&;nQ?ejtG)YYBx&EMZ)N!=s^-+1 zm3XmltmIacPRHa?ee6};N|h>{%blw^PPM&+-%-Cd6*cZb&r2WtHMe&_gPU9CEiGhM zvDuAI8>Texuj-Ptd2rZnRgXar)<3Tmbaemd&~mYb#|8A8-C6Rg{)$I?S2BFn^m<+0 zl4dRVcqVE}z5RSfbNQ+!y$-uHeR;|C(d@I1$z6UaE?;!1w0Criapmma?l`-I{jw-!L>^y)n0NtEq!B1r(cgA+G6Wb>G6R@|Sa@XRp^=?b>+L>eNEhk~xYzP1R8Af3 zK6a$k=iT6ICFc}B96mhtSef*UqeWC1%fjm0ImR9AR1P%3y12L)_2K`D>bUs zv(J|*r}jPG-nnJ1x>H@N_sXB&c01S^&3|bOatC83;TK*_){4 zXpGcI#!4qhv5Ui)tw?6eRzTyhO11}huWX-;CHrLuf$Pbe%CRPrw*tAI^Tu@U&GDZhn_jjIjKGj9YAQ#Mc*AWck_3Zj+i%6jCaGECK%G*G1jpHvxC zJTaOo5{99kT>;dyJE<{Nku5FmguCyM}K(`TCVU2Rz=oU;ix$OZTg0+<+>FM4dtAiBx zRN(T+PXtSWDPzYOtJ(`6OtlxxIXn&)Jq-)xJ5wD7gQ*U~9m3kAq3K zl03-mq*s_r{gZ>RQfrpHB{`C0Cf`r?CBsujVqV>wvLE<;O6$}v$WTQq^8A+C6Zl!` zb70RLZzC(w7&%zJ%(;v$cCNd5)xQ>qU!9xtZ&`9~-JrS*cnY(m419%IQi-VrTo-=A zEE$T(9hQt{Vi|^vWyXV_z)S+3%uqYnbVTzYGbd(UtSp#?z;W;^hTa5`J<#AFvWF#! zOfv9VW<4;C@?ptlW(!_TW442*-p5jt4`Kgg z@E_ojjFl!+hGj`*%;V5!u>x=v_#m^SI$INbZMGr!8j>i9Kj|kKB#|OJ+IWeAOw5-T zZ5FJwv&HOasThN&CBGxW;wolpmb{gGfH&YL$!D}1Bpk+Lq%=l~|5};}ybp6QOU_7x zFcO1h5g42Cj)(B{9(FwGC@1lS-r>2O>9Gq>;2w{?z{GQ|CkxL_Be0E^19Vm9ENdmb zIPev{bin3ZYvwF#-M#vvWun&%;Duhxfs?#80PpZh2R`C;0{C}R#wxfthC{0+^h#h!Ou}N|Vu?YCcs3II01r(Z39L^X4?HDt8t}}-*}(G?Q-D(w z*C)b9F>x#Kw!{py>`y!hd?@iST8<{ZOAHV*t9|uAes%i2=kx#8lX;Snkkk2|#R86+8nr|Wz9`M!M)&*9lSFS&qc@Av;UPvZ`+-KJ;n_&3j94qD8z?RmqcrpXg&TGm73!>NS7>z*4|G=lzoVhR!{@A6-Eiq?d9;7J4aF9`D znF_#_ncBehusdPNFh&nN3bhKbQ%4jeOC~Z?A@^o8^YAP!Viu!)8M6ZXD(qg68J}6l z$jC-!EBb6>cA|X`vls2u&l?f|{@t*@!?PQ^XXZNE|6pDMQx9*sC;8xfNv7`<5LWrMYyMXVC$PE^?X?x+-zHBsj z8b>K1G>$_;Vi8FR-3j6-QK5!i%BsmSwuU5;&?pR+43-Rsyd7c6Nx4?C0nhLz$tmD7 z@V2JD)|Y{=NM536Hg-h#wvrq??Yy)-WNZiQc_3A!dx7^$PXV8na*(kdWaA-Y&p3XD zj5Rps0e>uHfQ*gtm59qklSAOy`-d}W~`<> z;RD)1T6PHN5+EgA1A0MP_74~YDLOjfF8F5wFM!`5NenXS1^Na;TZ3dBw3 zgeAZ}i5%o%*~GrU!xBdTk3wcjmP}2Yl_(=~66ZorE=Wv9OB!-jB2QuB5wssmd=JUl zEHx^%D2Yzpi`oCLGgFca`TcIGKOp8IlTRS^2c-N;(4X-O{2AZezvClFeRls{A3^Hl zYw^vs_VfGNPuJq}_qCs{#sBYXKV6G2;Mab-7Qeu+{dB2+F1?4RKrJ!uNU>zrn+w$em5Fgwps{cV&UBtPvrU-Sl80#92JV+jdRwTNsv>_zBicNG38<_OByqe|Nr$y$mr$)GAz5Ci^J0jC#6xVHXqcmH?dO zwhs7L_ektwa^3TQLp}bCuFdo~42gH%!^yjv#M#^1TS+wD<~l7Ez0p&w)=~|8E$=44 z&Afl{W=Vvpa?7WHT*xkCKpt=u(pb&Jl3yMqBZ?rKAY{`CvJa9Fhae~LEhv19 zIkDTdiu3)L^cj1f+@zr7GRV`}KA9)`l22kEbR+pDa2r$P?~Rn3*a2B`b~+k;n-(xS zVZY;QME}Bypgcy^M|yqG@6|P?zRlqP>JwiT^ekWo_;aA= z0rWdx2fZos_dqLQT+%A_EkIiWXrBe397g0qoCu)F0Moq!-3p-BpA0PnRwt(Zb3o^c z{Cv=Np715Wd*6dL=?i~VlnH4HIsrhhZ|xV|K)$#Yq&OsPD*VOGvX=TdTk;M3D$3f)kgpk#xLA+;Uy!(!9sE#9 zO$%8&&f$zhJ#zLhr7tPm$Egpy#3>HX%F}PM8dzlTKaswU-dc&JJ{Fa=HAGq44!m`w zpp7Z^t`w@hK^mdj+rNsI`<{e0%Uzl~!CK1NpduXXUZz@bJg>0?XTvbeI9blz$fXOebG$GT8Rf)_Y?b~TnR4? zA;EvSJBpM|#OVCd?uZoihn%tG%wJ4pk7ul?9B9T2Mn97f9-u|~jU@VC4k0$XYXd;qV~*lVQ30dccZ!f7gL zWQd8?YGD00#l-$--xVFuAA79<*nMHo8894c8uK3PUcj>e8}cIHO#tSFzubfIiNV-w zl}(JsE~{VS5b*i;W7E+-D{&6++{Af!)x0a)keHSzC)>Z-n|)5?Q_D+&P1OVI}nX3sD%5l!I-m?`)E>Q(m2m<7=*;ZiA(zp_qck0PSBTm-B{tk^PGCyE0f&D-# z#-03JrM&l&XkxM4&%pB`H)VTN%k8l){?>|bROBh}t0>d$KE zvuzvMogqW*boN>Q5xf31=RQoh>kZdsm|wrP?*EJq{@a|DmUtHi&&~Hd16o$e{0bf0SqN@5T*T>ukbr!#@sST5I3=GcTca zY>{=2!v9p9k#(-a?<{{v1&j$DfPSx`pp!&?D(G~Pp9vZ#^6{W&06hAi1hKn{KS1o zDbUU$-vhLl$d3UXEAmr8lSO_#=p&IQ=P)AzOrHfx&eQlx7$QL<0H)9S9s0E^X1>Bz z#HIphdvDMIB0mUpjL44z9WU~YZetF820J@8yFt(Ku54Og7S{*$2hi*ApmRh%9(29P zZvx#b^7}wfi~L#8cOq~1iXrO&^g0hf+1F;?5j0ff!$E6{d}GiiA|DCbMdZmF%((!1 z9T+*u<@aX(7U(mP&j!sEd6+;+e*o<56lZs&j&xoqak zfi@EPzMzvtJ{k0Y$dljy*?7x?4BdzyijKRD0P3|)#~#fQxgYJXK9 zXHW#%@bKGfXVb$b-sZ5)d7G)q8OoW;Im*q-ZOWbSL^`OXKIzAmr<9lRcU^f``9Nt@ zGAfnILFK3_q^hI}Q&m;fQq@+~Q#DXE!Cxy?J5^WJAk}EqPIxb!RGq=!E!ADs1Jx_l zCzY+*LG7q6q^_h6Q&)%II`vv_p#BA3>uuDX)Ll{QFIGKSJzYIdy-2-Wy-K}Woup1t zuUGF>XTY013w}>$@OK%153mm+wv}wPwhe55vHjIH(zcT=%``OFb|?IzPTEr6^&7T# zZ6DaaMu~|=cFpZN*>$y>Z@1WPk6or+mfbP@orb?U%|G#73NlrSRacoeqF>0Dc7MxaaCTf`NK-ID%1&b7-Rmy0M zGFqXG`kPRDC@CE06z}vAz8rixF|LbD?>Ryj_O4 z#JHrmY;<{t(ii@&JUpwy@mJlow`-K^0M{7TRM(BJM_tdjUd2Am-OUp|SEEpgYNp#F zw|H16Ho9e^Tt+?j#_-6Faew2U>t4Yl6cwo&z#>aMU-rOGamE9g3W^r-qP{M)o*?yb zX$%`{47354P$}>=Dg-*hdcngw5#=3?JV|lhbRT!dJKLLRrf6tp0-Bc~vUq?0LH=(7 zJ_S%~YG5EA*e$ScU{v5J)MbkgY#I~;4`}NDY|2l-&*vBMdAtny2C{>5my`IZtEunu znbrOY;jlmu?AvMeKlq^}(HsNeut&rs9ZEWd+F7@fn!yS&A~^=Nvu-4pPYF+HkV0!` zwSgDbwUqZMw4xiW=SHi!dBYDY3SL;Wsuo$h>hi|RS(lGr&bdrJ_5K|7`O0Uy>!*AE zqS!l~&(Rqg8)g`08x9+?v5O+eUf>OVS(Gsswuy|q{dtG;j^&-sJC}Dk?`qz4WGSFN z)P}#ztzJX2QPz{)^o?KOA&fzmILh5%@v0|p0o+R79ym&VN#2!QhSx4)3gq{IAIcvA zKbIF!6o@EweDteaH1z>Hb~ErozFj_Y8Q<2vg4z!4bf_&ylx zu*hIchmpPCiBci9r3hn+QV~p1Dm86u+hT`lTOarr+X&!}8149v#ORfS;IqWIl@s92 zaVvK)`Z1}A(JR#vlafDrrK24pQ0zwAd6HPWF?jW~-38!FcE8)PZOKd)G%cW>3=v>GdwixHKz)c}JV4s2Ppb;@N3TB+kco(eVUA$cf z6O9-PL!)4v-Q3-16ihqd4sHX0_d+t@KDbNWVR><{1{~ua3%tTT8F;PxI^c)yuYikt zl!t}nVbQnHNp3SmN!$v|3&i>{VR!26$`oUf}!5rBbSs(kbOr5OLBvP@mpK+ z0;S@2TnjK=8F!xA87W^8w1&ukZF98P8A$>32hjc{K+A|cwLMb1BW;fXrS?b4Q~M*e zJ5rw798ZfpwLOLaXnO@v0YF3HZh}4%+esn(UjW*N+8KXjTdXhk`77I^#hzFV_Cab> zq}QZ&MQSgkJhd67iS|KiE2K6;+I}7M50R%fLuwbK?ct!Q0BUQacEU8Vy(pg5(g50r z+61XBkn+?X_&qxy^(PJkn63#*ZGqILN$r7`#dezM&)N>i;Q20!J}jsTK;K&ql-dU= z9||gnd=t>tB0m{)fyh&vA$|I3|B9g0c1Zczpot<+ZHe1NJ{V)9Jk{N!Pi4?B0R5g? zP@Tw!gH{31KGi^L0qFYM+Wt5bZL`Ea)D}r?khK3B*aD~xlJbrEnr)Hv`qs8cny+a# zfcCMrOD;=C%PmM5AB+W1Ie_-D0d*01cTkPU`+yb~c|Xw7B46t<^cSy?dkha^FlZeB zy-s7$-$XtNbdt#9r5_*Ae^}!8t#yso`$B8|3DuogbSAf9v$5p$p)ufh#s4`T|K}305iPx*6uN^6}c&0OIP@WR;9fQ|x~#vL7drXxnjm5$Pt z9oJPSE!kc-#HN+*Vp=oZ&bJM9(^u5hd910atNya8uE_wMZlHgd?wVaCotsm6-FaPE zU7rcO?&;$|-NDZOy0h;}>dG(i)3t0?TzAr=n6A}(FWsFRMRmO|y6fDoxazzfJL|Hf zPP*Ux3+tlW6x2m5aMUfjX0OXCX{YP2SL=l9O5L$4HoAlB<+|&|WV&NZCAwN(tj;Ns z=(2w^3cY6K2o(-~6rM2eh0=B32yt=Q!n2Rhg%jxD7DtQB_ZQ-l#~ zlY|{N5`|woKU7B~B=nwph^HEE1C2FAx^*nkQ6qoh!^8 zK3j;nJyZBtcZTqC`!u0t$*Dq#xXD7pLX(68(MYQ^yKJ9LET27mP-}s2E{( zyOBcZsA0mHHG_rla|49I(tbk6u)e~pp}m9xdwvr(%eo2sn{^h-CUy|s(lV>|Y2!jOwCPuOX@8B`uI(GJRr}_~M(xc7>$E{FQnbH& zBx)}|TBY^f9k1OpXQ_5kzs1_EEf#2%)#hsFgv`=52$-%7DLqA7J!qnKXvJ~b)3sx@ z<1_TyH6Mm(--Y$p_M6^Y>+-Cd_U3l+?B|6w|UYPwg`oSFLBI!rE0`9JJ$>skCSA%CvLJG1_e< zK7|c1ybK%j>_M3N-5+5UoG*q|Y<427TJnLg8Lqp-+N|Cj_PkC?*mTv(uvrflg*Cb{ zE6o4(q_COAV#8kE91wOitxMSX!x3T4oNI?|UsEY;;Q;@ztZ_xd8eMY;n>CmXo4M;r zXd|z)p`VNI2+g>#JoIU$iJ@_aI)>IhSU$AvD%;T1wnrjm%L}jTIbMA; zr1y@ulh+M?r+rlP{n+gr-uGX_e`qpj)rW1ZRUenSbo0K)Y>`k)BHujpFfU^{M@nf)XxoV(mo$4f9hj6lyXCIrZY+H-_tdTzxuH)#=Ei5ThE_UT z!|JA2x#9K7)&}<)9Sudcb~jvo z)yGha3^aJ(9%d*wKgO`td%R&>>=eVh^qGcsXXhEz`xYC@Pg`!Vsj%9xY;Tf5UUHqG zO7tc}&A2p!A$g~v=8`>z_fh){zxy9DtUYnW5ZL^LL4Dw~;ic<&!?0GD3^ih}81B!# zZg?>3rs34kI|i=?_YF;L9~o|Je_{w}{M?Xn@ulHz?bil*%3H(OPwx%eDtt1$?VMwn zHrik~GcC_xGnp|C8zeFIY9=#!XcWeyH*JimGgQVL-q!f+fSqwuZ3p9^y^hA;N)|M3 z9aG3S;%s5#!vao5ry9=2(mh>_!dO>h)J!+yr5WzVNwFTrCEbe}y{mc}{T#fE>8HJn z&&PNh5BO`0H4bZxLn4Y9+g~YW%xUCfth>v{SjVNf@%3-TjbR$BNtH%=++Ya9^b zYdl=b*BI5%*Z6B~Ut^DQzQ*xIe2p{kdgt}UjkmiNH{L8z+!(UK$GBDSF$QE7GxjW7 z%vf=u#@Ov~d2e8zy)o3y&NiGq|JRm&Q;ih3$iR*@we!m-%KAkt@ zEVOXO1 znA>{N!(8wE7jv(r?9XjibbW5a=L>Q#JQ$Vx=0um=jxFls9^p#oy1r24?kjXB$4#~) zX9$^;v!+1v92s%Ri48gbdC=@JpUZ^$ef9|4{%Pe3{*zDkq>twYr+u*P68AovFY+$T z{`l**n_j*+-RJ6qE+y2#&kn{0&Q7}&xNebcPzC2wK@-PT4VsbFDk!UK-=Nr=ql2!D zpAu9gb8b-WxTQhsOC|&z>bpM3X4tl%z6~>ij=w$>BW?nCn;+{Ml=+=4#t-12^& zT+L_=ceh7z?m+tzTyW#kT)(hDE~_}t^;DMSmOLrPO+8YPi(VDVjTkO)*BV#hcKTH3 zs=ckrE!$s*dp*5A*SS?A&Z$^a&i`?9ZvXlgTyDQ#x%cJTawk8u=a%m1$c-M-g_~QU zJD2^g2ba2~H+L&4id!AnpL2LJkgJd|gbVICoGaw1=RWm{;j)j7=024i!+A~^%XPm$ zj=NoL0ylf*L~aZ-ncEvVg=>&Gm8;-Aof{W3gVWuf$@Qr^n{!(|hpR82$Ekmt&vig< zyXO2N?)lusT)EFnxH6GTxffZ>xTv6bZtwgR-2J?j+@s%Cb7wEC;gZ4=xdH2vIKe%I zv!9&GJ^i$nyV+wsmwkN$SEBJIZrZ`kT&c=iIq9Y}&ac#VZqdpeT&JSDxEYIfbH$za zaQ^c%xb;q%+_r`LxOyH3xIrrpa#c%aaXU61=5AF!%4KC8@C;o={v6W_77a^@t?RgEpxc? zK?crSk;kP+6F#v6!?$h5@(*fC_=aIpKEAAszaJpy{YxtN;l4Kf-Qr5Vub+w!D6Qs8 z@V0#KigvtRHG95DV+Vd-dq;jrbOFA?_=5cKrG@yx+Y9r;g(Cc|H%@$iCl}r(%$48P z*^Qq$)16WnTj-NE43V)0|k+qsQ~%(zNq;((1;rpPByN@*%UjUUn3p} zEqE)~vfwRla~t@ss1XlSLYHI8wAADqU3j`OL&=i8uyXyW5kCq3veK*(H!9tsOQf2_ zFqMF;OS*h|@djxBRxh58Tur!UKJEBP^t5Ql^QivOq#X}K_9k32pN_l%^y1VS_E$Rc zlX&$qY+qDIE`^3WzmB{CTE5khr`u-O;#-+AJXtj5C(-j;O?jwY7&N1TowdHa0a{wv zeXTF2_A?nWKmBX1c`f^f(5`N>-wHi?nn`PZ1QxdMMP_3!A> z+nTZ#6od_qYSTl2t+nY}#cT#@mmp#bTio|G>r^Xgtyz!Em+|0F{W{Hi03E0)?}0_j zPW9^#V3DKxb(#a=jK?|P3*Y2G$Ta0W$T8(TpcXgei#BC87!`Ocumibm(!`e*^BXMY z5eJ&k5Bm54ru+tG-F$Y!E0cy^o+KseB%dS~Qrx7c4}e9j`Iih;hoG~+Wy*4pm*kgR zf|N)OOr|<}nzPERv)^LMQ}y?C_Ip#HKZfSM^cT%NY;@#qD%IRuG9(b=9hNaVz)#)V zlqbQgI{+5t2hFtc-$Q<|kOY;LVUQ42l(oS(P&QFYNz;5%BwZOw_L=0zNyv;Mu%ek| z28&T1rmCWn5o#TmAv<_I6|%FzM*g+Th($}fY9IRS7i9+Z3OlK~qr%lxpHXT&l??_rU!T z`agDmjy!ZPP4>9}kFt;)=1eLUDRK)fcdTT|M^iqP{IbNlI@XWmN+2Z4BHk=l1|-PH zz#qyL-y}EUmlTjBCkJ7t|Gq3~Vv;4Xz*~~HA@kk#U3h*?> z(Nf>U+U6JvyCSW3V(Jh2Bl{z*heG>&ZGY^Fb{c=z4YZfoCkk|c$kW(IS|^3Rw;d?8 zM>Yjd;~XtDQ@*xKTI#2KZI`6>NO~P=lce=jC{JyXw5|%}sV&k{SLLs4k(PQZG&a#< zi=?$zs6CQqYNhds)^^ETIH%XA@rmEFOO}OH_?}&|7TT$8Qib<61+}(OF2Xsz=GQh# z8ih>T|EZ0V)`p?iq4r5?o2&+Y3aBMU@@pF1M6ULrpbbS%ID?MpzH zi|s2wH;6p7smcNLy?@u1%HPK40_c1Hst(SV+Bb|nc?mFmXT0aXgZx5CTa(=y2jGivdmwUO@W{mx%Raz+lJT5;j^}bW{CZ*Wf}FI;2^6a(T4{O z2GILO{U~UyCTcJL+Lz)k+Nllx9;mg9V?-HbE#tz`MrD>C`u|8~RfKHP0qEz_I#1O_ zp2{&Q!(7n51$2klz6*3OfW}B?g3@|W^m|hIwi$jEFKK^Ji|<7`_&uV(g>}6sYk5}| z@~yHcY{O3iyox`W-fdZV~x3(7)^dVJ%y! z9Ibp>3wg*>HxAK`fKOi+ve2bG~zZtfK2X1BA* z?ghEo9n>N>f2Lm7{|mAbx90!B1K9wP_fAImV7bDkjIwM9mI~@}?utFEh2vlgjcr*6Iaq(Q?*jhi%W*8G zHQVIBa$79d2(lMMqPauIPMz($bnVuim`YSQI2I^asBjS{XXJ`piFe-rJ=`1TEZzis+gEt%hT*th=xIrwe!&$JvuC-Hk_{h>$x@~L0|I~Yx==ddpu0{u0%4R>#_A|&#s5FTA~A*OfS`qlMI{QHsnoW1 z_9hue<*(fIx~YJLO@V?13l}lJ;ioW_kuI(faz#DFQRw#NCkf*C;4)>!!Xor)<;oMf z1~(rSNu|o6VOnG^(1jB!z9GFKyiv*(uVXbpk3YqDi-?E_$nl8QZQ8a2i=%x+L}Ww< z+AAWWV<%Hn=PnUA?Mk|l?!Wcu*$ZvG`;fj-Xp8RGf51R8$W*43zU9CApx@&M#}Lc} zbS|I*d=!K?f%G0Xo(gWHtDpLVH~m!ewCVPyV}`vwM4>$-A)%s>EQnaR2xKuamr%)f ztvDP@0n6gzmdDc*94jbVxhih;nz*=xMC6cw~F-y;fJ_MTW&?%zH|59 zeJI`NbDHmX7||=@(c>piNyM{==MgVnW=BN4di~XBy!q<<@1B11ekE1Zn6h?3Z2=kZ z)dd~@)8}t-$Yip2l>R%%zxqCf@^|>V-#`DmzjKy?C)|1@V`U-IQrQ7~ zKV=N?IOSAe8vlq0bY&87igF_`jfIqw?TCk@m0(XHQ~P!0AK-5)Zv$s5UjgSTWhy1& zOjOVa)5u8FSy7b)F0JB$%c#l%ms6Dou85dPSgKWRfZM71sS1<+ssZ4~sipzXP|X6K zqe=o!QEdd?tl9#chGOeH>1T@n~>55Q&AWr52f z&JzDAVk^B6bKf48qeyiJv_z}Ns0;po?0pAZ6Up2EEF}pc2_Zm&4HXp;1wumaMQP_L zVn;BQAl!#K5A}AmNcI^G^XFajtot~Z@%m10pL^*$V@7=Gy@B4q< ze7^I2W-_}wyE{9(JI^!EplBFr34MH;sSu{Yh)eih*35=5M>7v{;?b9C2#>#1L!~eV z6Gr00C``~^YN~Ur5QD=3oe_`2hfu&VhR_7YV#2;SV>n&VSQw89XPz?|!U#?@M;*m* z5w!=FJG9C#E^-9ZC3m&mrURv-S z5930?Be+%~gotkfJzg$+KX?rq#vciC0Dl66lljy5;FXpi%4eau{CSYFh>!cplKDt` z0iv|Mp%2Pe@GXRXf>98T5d;WS&^Q=f3TICc2Vp#nG6la*f+`5BVYDgqBMF)z+$-1* zIS;_tQ}8`3xCr580Uvs*1Uh;U;<2c3=5g`6;U6?#-)^eX(@SqMEdJvxtoP`!&3bY6pC z)GAnxbdf_?(WMf?hAyoTqOQH5zvbJmLm>?4x){QTznOXaC8WIVYSq(0&AO*;PZ+5J zqflXAFa{Nl(X&hu4gwd_A zY-7sB~vVGzQ!v}NFlzpN7E?PWVbt}WYDrivQMnjmE_ zjIvch*UEkX`BqsQgwJ5atrk*&QMcgh2gcokoeqq=g{!&M2twnnW)SY(dIv&00vFCa zjKPJ`p)d*;QeYe|)CU-e3;m7l-P=`Ak9OmBI5X|m5ZbmoLg?J?3h8d`9uN*}_k_@^ zeLJL|Z+ChRH3~-TLhAuzcH#VkO(ksY!*^gu5QazXqTr8nKf-Z+%!N=6V|bxw6-M!b zZweU43tmQGBrk>VSY9Z}A1qMUpvTV-fPFDW0Nw%+1%0Ui<(MTrUJ3hn!Twz^@Hi#h zHy;7I#TAw16Tl90$2;k0^|UcbD<-68sO2t5rAsIUI2bV;Q7(9 zzE$a$3HxNi^KRnydpq4$!~f7Wivf84%_;z%AN>~KB>?MU@m!pEu5|313F~0@0nPv( z0Db|y0bsp_7r+k?28aOQ`P31#xmaf!0l@RN;uad~6O{g%u-=pd&;sC=SqFgirCtDU zz&8M_C-o!1x>Ae@0PF`A>m9I;RH+|DpdXkFhyWZ0oB>?HaiS~0V>I!&Oa!g^K!6`$ zEMO7LY*w?Y0I12N;ht#{K=C z0HrS}ImpF;G63%H$73|H4irHUDMk8BD6_s8Qt zcGL~(H2{yT#Cl1kZ>mWkZve;vrGQ(|XZ{*c)m;JXs|x#p!Sl~%^@8p62K_Q10^rdH z;$rYiYY99M%I^t01CA#I?jOKRKqz1?;0)krz%PIo05l8A3-ALh2CM|609-@i?E`@3 z!u<`v`cCXC7WdKT18xCu-@I~sCYlG{u45s89NhPbz)5hA0l?8L>Zl?2BIMkG=@xQULn`*ckvk0lon2_Z|Cu$72Jr4=+3)FV>x6eJR$J z;<2W9oGBhpif)77TL9LBIsue^zJ`E|{X*@%qww{G{ncQg2NXI8I1IQ5Ko8-b0r&yN z0s;Ye&fiaC5Pyd40 zeNbWlQ`paxa!lgAr|?{O2KP1q`<7DrmGT1_`;=1plfu5F@OVR|?4V4Nq_6t=7z&@d{KPc??X%ay3goXMJveMU61jyLWQz`)a zc&Y+m|4w@W*te6?w+!~_g#9=v$NYg-4qb=Y5fFIWw5(G>u7Ga!DyRow(<$)L3b^$M z{(lYWZ*kX{D)Q974L0mbp9PV|) z3;p>G46elJh3<|7iSCgE<|&eCeLfbIAGFGjN@WM7^1ByQW%Q!#vlEiIh%naU;-!;< zXkSiP>_XyQ3FC3-crj2AJzf%vJxIJKVMD^b2=^x3hp-XhzJ!el_akgVxIf_mgiQ&X z5jH0*CTu}iLRd;z*}I7K?Rc?P(5HSzTN1Y;Y){yMup?n7!p?+U2)hz?BkWGtgYZDY zg9v*P_9E;}*oQFmZ_*3yr=`FCrX9crjtDdc(_71)*hxmlIw=cqQR*!m9{J5S9^+BpgL}HQ{K&F@$3Y z#}QsbIG%6<;Y7kogp&!U5Kbk$mT(&3b%fUwPA8l}IFs-O!dZl~32!8vLpYak9^rh# za>APk7ZBb|cnje|!bOCO36~HqC0s^$E8%T~%L!Kyt|VMVcst>0!Zn0<5Z+0+mT(>6 zdcwO1HxS-UxRG!Z;by{n2=67lkMMrN2M8Y|e28!h;lqTF5I#!y7~$iDPY^yy_!QyO zgwGH@OZXh&^Mt=Ae1Y&q!j}kNCVYkPRl?T@|3LUU;Twc+623+FHsL#jeiyHo}hx|3vs_!jB0*A^Z#Br-Yvo{*~}^!Y>HFB>al-Yr<~`za`vG_#NT* zgg+4eNLVp{++=7s;2Qz$gy(hx+6zzledr>jTqZMi?Nb5!Y?ZSR-cq>>;ZG`$!KeE? z)$ia7IZSmigv;o8tbT9yz)kS)X4MxEzEYK`LEjn7R0X{@^lX4*Vdh;X%vweJW&cf& z^WXM0w=($X9`rb~{*E5!=k%POZ<&b2Kos5k+!^M_Wg}yjD@z}_{pFtM`CogY|4;Np zd-9++_8;nrZUL`^LUjFK+#fCH3(%$xGiEC0E_lcPPxMeLX6IDQANQ~7t-d7sL8Okb zPeu4r{-^t?i#w}#2}F#)qqllxSJ*E-7hcC%M}M#X8g+vfquUIw{tt-c}SIWJ6r?#7CjrOa&8AaC+Yki zt9tNIDtLB;@7JEpp6W2$gHF#so*fd;{{X#*WOhg&kcae)>S={m!+fSI$b6=XIrt_G zxH|y)`C!I9=sAMf9^i;N%=Vz@ou6wOVXBQ}|4<*jxtY57BE=9}i2Ean*h&oF-Oy_f z`a-(bK3AL%@+P|1{vG(6gx=4;)N8NkuYbPM7eYDRYcDG9 zUQ8jw;y4Hsz;h*hLxb;1=o$Ez_T!%}y;Z7>ZqvQ__x_|e|F8GsUoV6DK>G2YgN(gr z{&7FPn4ULd{MMO}XWn1v)9*N|#=oO~zvoB$k8rI&20$465BBeC!kY$MXXqoqHr)!@ z7}%c3j=)Ytb^*rv0GwZ`6Tq@kFF?!ihJyS2v8?R($1?8o?+(B+?)P^kvOBO3k+B{C z&ofSM2RN6=a$u|%!0A{waGJ<|@J5661N8Rcy$0(7u&mSv(CG|?E&$6)eE^n~IsrNl zOQ9FQGS&^S0V*JC0$Txax(zVa8DJUf4Y1BY6=YZ7ktBT*a2SyzfU!;i=f4H~jL6S{ zv2FpUBMoR{09ft;jCBlHR_Yh9+ze@ZNIGJ}y@&zn+Q2#hoJS8>MC4AuSObBK)f4~L12eU;uNvQiI$*LBrY=pyLtfQK zQUI2fx(7Os7KOS3u&mTWXn<@1X@f{Q)=3;BvQjUB^Q-c~#vXv>DBwyWD|Hie9&M<@ z04xs##ySdojj*0#0ZGUDiYNdV(pLjllk|PS2Z?+Y_y+*416Ze_4Zz#f0q##^tmB9w zvO+7Z$e#ddSU-*PrvT>?IUl%$$XG9OgUISS3Y`efuhfgs`+{_10G3UF#YC0>ONnd+ zY)51#V5~RMf&5rsGMS`f9f>6XZ^sMRm&g-=vF-$?WBo}bkq-hNA~M#gU|kCSzLf!2 z0C4`xz}JY3bt~oooQ`!YSf}EM^8=TWbgW~+x)pCor+~4J1?R_lmHq%MD|ISZ#(EX3 zQ^D7c3#3YCIBI^U26WImW4S=tgQs;v6W4+56lIJ$?k0cM)zi47W9uBYsfb-h} zW1Wl;DzZWu@MSmIo?yKeRkUq5r`$)&T_qu&mVo(0OLT`3GQm3NY6HU|FdHqVvpE z=zp;62Qt?4RDnzZV|@>uCr+XBq2(ln-iMZ}6uKWQEA>BER_cJTtkeV1`5P6wAUYjn ztPjGnQYVCErCx~65Be3Xd%-f+w_sh%0*LGbegvTNJW%LcXc=@NU+2w*7eY7>r2u?R zemifjLN`L6E21C4vQkHaWu=}3%Sv4douBASXc_K$tTR!__#Rd4>wn|>iPC<7K3;fF z!L|!nR@yJn$N2TVg+3?$UGFVQ8wz|aly(&Kb@}=}LqAWyzR&z)?=#p|mcp{ZOeLKZ2N-qVEdQbM8NdF)4Ui3ZK zgaB|kM*-&$IS&}yz~FSH4GexiSK7f~xeWf_M)Fhu?;`SU;3fcmKW_#;K++EZt6xxT zlL?G%Y4G;3J&i7rg}_~jYyfOWWCvhpBD(?)B(l;DM-8^~4W#*zbbnxMn}fHH?Q`}L zc|Y(~BL4vVmdNjbb-{iI=NAH764@Gf2$B7OLy0^OIF88iz$HX31Kv;MgTP9k;Y!;d zynP#Z|HSq`SpG}zq7R`?0dRh7|AXy&cESNuz+c}{|I_cNa1s7+fs3-Kqy)(-E0Ju+ z4kW9uUkmTIZ#?Cj`g>JYA$c9BlHvNv)6!^`ZOCO{D;~K_hUC%FNWNyxXz%#=McxSs zH>?vAUs@+6C3z<&p(rP1$m>QkUTaP$rBQgJSnNsCN=el&DyoKHtW_Qc}9kr zZD!_c8yG8Olbg%7&C5gb9Xl;;YisRo75kRTqTowR4e82cky6>})n>BjXr2tV2j!5; zQZqZtHf-o3%gX91%g!ESTTl>ayLoen?UpT5Z3_$M*%lQcc`>Ntc_`90A_A8?%r-I- zmv4nF-hXBg%8ER7Tw03cRaLK?w{J)CnwpQ!J9emMH8!$9C#x8x@TpZqhPZ=K0Ov*3c17-;t z=+^;o9kcK?jEQL<5F4v%8W%U+JU;%3X+nbHm=x=%!!_x+KTXs4_%4t~$5dIy%*^Yv zm`FVfu18i%3X*4KX}M%)&o$4}KQ&4^A@ zgX^>*%S^U&C)A0$0kU1tCB;X+Mp042jFOVZ7^S66G|J2jHpU7=0*A)7WWTmBQkY*0sh58RB zB`UB^W+t2mFuTF^MlOeYq|prS2V5Swe|Et6X^_Ho!S!8{j>`kr6Y9}I(};-Wrnp^+ zjEpjkBFDOQtC?)uHmR%}OkQxEE8D854@E`la3A6{d~BpGNTZ;vX0mj+hq5=C$#S4h z%jJ};0Pg4Vaw&b!*6&h-vRSJ|$Pknj(RH2+WlLR4$4Tx0CYq>(4l3Z@l49QNe@s zR)?hIpB!-g`uzXXDYy-dihAp?dNq>A#ZiuH*5LM$<(Qa=RO(o;`MhIUxf&dEvRY{wKKADWb8;|CWtCtegwGE?*ElYx&$%hIV-nfct(I^O z&EXt~WqAC)DyoHgSL?g8w$`_S&R^@BvKg<3WEF6KLR$m%4B<9b24$APeGlgXL48H^ zb%y&HUo#oB=Q3#P>FZtz=VS-eSG;e0-(aqSGT}NC6Qd6MSID^j%IUJ2$+pt%n>w^r zIKL{igP7In`asv0s?Tk0T|KlrgASJuT^#sI{sJwQN_WC!kh1-z`bSs1=@pEv1kS$KDbVg<9eGTcYz( zt6Yv+Htj~O(0;ZwDc8$Htx(5XvT9H(+!rl7mFX#{70y@7+O4P+j<=;;nI4N;*dsSr2mE_7pLoQq(HR&YpW=~_u-GFpagRq* z(nAl$^+B>Ng@{}aB-@yaBJ;@ghVsHWMezJYk=1aI<2uj?*HIPMp&~O`G2Az}&Zt59 znnc(J)B*gSPz%R^^U4wxyc60M7>VSYmtX6F@8ejLqLNgiM6Lj7!#R|q= zDeyWmu~J!FycyI@OK2CApx>eCG zGGP1A?qwAhCzw`Lq?^L~kbHZ!x~zt@dl3<;^m7~6=bbxMq5i2rIaFo%KE%%_<+BFw zCpI=8o-?H#o-cMR&~Od%DerYv`hLNA@iSZT&ZG|aykh-byHx3C7hFGj zKRb7}n%38=%doo*TzbmX-aOWG%a#Gqu2Qn%QVVF42FNO^ z;rRjeNdvB91ia%#uQ8Lw!*whxe>G_LZpyQ-@4sK)f4{!} zetrM_`u_X%{rBtp@7MR=ukXKK-+%wly#M}T$MDxb{zGSAJba(P7bN(vP{Ut&;FNPB z^k~4K6!;!uqe*BoZ3TwEsDjWG+A44=nudZQ=X82K#af>Wt6UfNiRpY!{!omVw53oRIChgN5%PA-otwm{|by$biBjNxKWugtx7Ym-J;C$#J zJ+Ph=frsZ#V8NC}yM@bv@xWcdNhWrY*$u`3%h4vhF?#8adY}SjbC9%*_8;%A}uf|Ct&p8oH9bOFXUDwazy%JB*< zUPaf?49znveThkt1wZGS1(Kbz^% zU)sP==x2mSzdrd*?qAST^bGxqo}(8q*7Oy6joyIIfVZd}y+iLmc@6l@Dt}kx1Ihi{ z^Y!uX+6H8X&O{3E=gSZ@l(u*NGUqU)Lcx#`m^TFsF#lx>7;gTXm*Hpx8i{Bx<7g}j zK;!F9krFHuC4~v*R$b$F4}#=hIsd^>~i;w8^b^ck>#G7t3%1gaZB0 zSDT5iHWOGs_`lX>LKXEjs;T)~y9rg~2D%Rco^L7-P zo(ek(q36HfjzXXcx?%hX_&;h-p#tBT9%$RPv#7j$5UQx~f%yUMLHjop)ig{*jg3!G zQ`2PB+&m3o-5nk!5fSgKwsvi`duC=gv}H?}eqmuymm(OgTUnV2^+VHm$BsOs+FCv1 zy1IG#jg1lR&CR%-w(b-gEA12)w@`o0nvMOyRtSM^5!%~zX#4hlXvZ!Qw9z4IyLUUl zKDEImcP{Kt1=`Y{C}NEW#m9%JB_ueY#6)eBlpKXpQxnkIwfQJ5Z97`GPK{c>el1E* z&qNtnn^1OkG0dHi-wA92V88!}Z3q*-;A47Xn~u*mAAe>OvJ8B1{fSM;7ObgcO_ zF>4;{#V4u=lakoN*|bD>+4NackP-=+pl2T0HytjDiWyVrQ4>Xik(rYc2^SGy?ZTcqPLNW zBBC~-=oAlV2jM**(pabx(mc@WXde_CKN2OapN=weqEKF)2ec19Xg54_)M1XXh}9EO zOw4o?pBjbIw!(9c-rg(}5gmnM@;$(CCkiz{nkw`?My&Hd>&v511)ZlDMZ|ibxJ^;0 zV7CWqr1N}(BGRK!Mx_U;+M^23rrlITM39jo^j1oBdpIw$Eb+)fokdL$Eb{q^HgT$6>7tV_f%Ha zV=6oQ5e45ERL-^ps=U0Es@M^vwsU7QRZFk;0~L`RsFsp)j7m*CPpw^hg-T0%Ppw<` z7@mWVsPyzODx)ZYDlRUiN-Bb&{comldAVT59}yR*wr0&SDn9-^m5^|SN=$rDB_%zk zl9L}%DJfx8syqS8TS^s_1gVvlHdAF#pRq09-)EnL-zlcRb9+Rm`1sgP2?+(A5)(^0 zB_*|VNlxC;DJ3PmQ(2j;)7Gu4J7K#*JjZ8hsxdq-<{E>|wXsa*WE>ee%s6WGIOFIT zFXPzQX~uDJ3p7(x+gNMY;`R&P8{ip$?=<{A^7Z@gtIhmZn|Z}^M`_0h?wZ!szWN+D;5>ePd`#E``0==k=Jd z7XD$YIm~Q&O#_(8p*wAD_3t^hc(5qL)0QTEVONIj$-046S_)W`VGFWUCk(ZL1_ z+h4(yq`$GY!Zv1o!2-(|e*FN4eq(3W0+wbLFj;91Ol5o&!W?vr4s+0PV%LMy{>twJ zItlqs0ZyYc5S|5#AY-rz!j?4(s~Uwpjlz}&TMAtVTbi5b7Hu(f8!TvkYc=%c(f{v` z!;r(TzYb^M#}4uzpBZdXrTq6EZAW&WSdw8or#AEmDQt(Hpue>iQm*&!;5T50^v^Es zV9E6V!w*|yeLx?(xf;Pm*P=c6d(T8rUaA@rAz;(ypDR5kdBKeeX0}Hnd$khH<@Nt^+kYDm{)_8Rr)Khi%RJgWSJ8_P-L7quJD)|6*&3cZyJIE;tsOPc48}U?JrG4tNp079Rb8M?EM; zJix^EFy5f!Sc5O$Ny4bb)RO;Ve_xh)DapHxTHax;6&>U+*Z6I`7lnT-sd*^;57t>l zMZiBY^6z|lTtwujyistZtEp(}I~XSsL&Z{IFu@?+!wt66dMf?Xetui(&oSlo|NA(jLtXj%*8ErH&Lkz+@ZVmNzyFA`{$pj% z{?qIKxhDK$l44}fMhcJY$)WJrp1*H9e|+|G|LtYRCH=Dne|ah_jWuEP5EH)kG~uTU zP>do{esy+a#mFKiJ*J2WUx9dy|Ea$`DxW^jati-8{YTDu#~Sj_o|hi~<}>?e_2ZxY zzwP6OM^fKchsI6JXmImgzE`VKc3kIBpw6RokK*y|YQD**`HQtBN@lt&s}=pdiID>sQj(AW%pslJ|q2#41E^=Jb%1t+r*aq@wqcR zC||p+O)i?2X*0)4-_BDBDLOTzonH}uwlSf!G5^)Jh|Ol(PrSo2XPDhK@7 z+fowZ(qEVAo_4~$Wk$rWL-S({H}$Zq?5n+bdtpZI{-!runB!vl$oe^EnuOf;U-s&n zbW2Fy(Rhc@p6jDlWQ`kks5Ii*%vZ;Mee&#pDyQei#};>Y7QGnWFUxZH5#GbI{F@Tp z5Hp|cXUAp*-EA7S)Hcj^aMtuG6&puR{$7u_Sbpx|!HhjkzxKEq5)(AEYER}hPvOQoawYp^KkQmU%I@WH?t3lDH-}wH~#Fa z!3)3NvE)tYmgM5T7NehrN4VFH-m9k>F;i?V0A5lTPrMB~L z8!p|JEF0*0{;J=hi(?qs84FIVuivw}sb9^HZo{IBJ?}ScAEj55<1=^08?{uqFYGT=M zxwmI#dMy9xibk8Z-{2F659AHI@T1N_tt>CiJL68B4!^~8X*TRsSAXVQ;pD?Bj&yG` z7UD3&5dV*y`H6*Dwt0o49`w%E zj~bn@B7cM~Qeor_XKk21Vp#R#vG3}2i?UWHd`$V((BH}ae*dBuw%&vLM@1(1-FR(2 z<8VIz1;^#k_^0Jv&l`=I<*K2+VBgz}M!x@i^ss&1d26c=YE0kuiW8w5$G3EHZB7#( zu1siKv*c3N&R>`t$GolgVc*dIMJwv){2?Oq>(SE-BI@StXb#%mYjRyt55uTKCwn(N zS=-B~#>lU3dHWf)?%9=HozC=pSkb8Q=9favZcFd zAGDFPpBy*bRkS?cxLTg_`f8I(j|r9S!&ZA86O^dljrZG{I=dzyF zs_ap7IWGO#F5Y=+#^Fv=$6d<1l=gnxgE7@ddd}!+@z8VmM|-D-A^q##B}P|SPuKo< zKi@I1qHup#yYvIkO~S$+&1JqncyHnTpDo&VKJlw~cWtb+_o_M9w0M@T_t(u&yWX;8 zVfPm)!KGc_hJG`Ay&LyZk3kDU_NJ)|IyDJTihsB`fHP*+prj}LR)=sKgT@EiJ*+Ps z@}2kXiq+#Ib)V>4-kEP-Co%BdYwUlp@7%{)o9>>w?xmupk=cQnNtPj#BLHc~#9ad^`i|NKqAB(~2EHkle#KBcPLhTKHo@Y*qx3vN!i zx&Nm})*l>CeVjVHu>YgGwP!_(xp|^@bF zXq6guJv|^`$C!n#+snmK{J~4YymqW&j9@-`{-8&fD|-*ux=!r-Ltm}sMb}@OE{s01 z`e3DvQLV+xgeaewqm#$1>MMTSopE!d?lx0(!}IA6E0)}iQ9HkE(AiVI-3_Np>VvHY zs53Ws?UIKV`wdqqIiDkZw?DkIJ1XustjfOc=w}}J^V?tDZSdYx|6ugxab3s$I)A4A z`U_We=eg&U#}9MSk4!#Mf52mK-OaSQqZ+zz*tXYd#G$fn%#_CCw*0uNi3=N=XOGw7R_wzX()t6fNH#c?lD>g-f?HdyZ&KbAE z;#u&q;AyINZR+kk9F|vqdd9}CBVs-09kuB5Rqy7EUsBaI_9ksD-%x&+v1Pq1a{EX(m+wA)-≧Y7pzE8QQ%V=j{&c zjq%w)RRr)hjI!P^`9x=Rr%FNfj@o6nXV3F}S~kzs{zm%I<6c%1M?H9WrCue-a@)0T z`fWb(Zl{JD?`kX_Za;UEXCIxif*|9g-%JVKcX7UaUE`^ck7>i&W|u}tT$l9@2$rQd z=m$)_yZ2ng;Qoe1_6=jcb;^sL(rSKuO;o|IyB`GU^_+sJCQi-dsu?? zT>ZhbKi8<+jb2VVzcF@~YRj3?!R`^Su8xV`D#;7#a&6U-+vYLC3${xy zp`XU~%@}3>=n{T(M* zUVObE{^8W`+?EV!bH1)(zIchh`-4@Pu0h@Ur+we~m-c>bLlR7K(vPXw4(D%Lact(5 z<-JEw@v)vIsV*KrmAPWo^65Xa3td|3FMHX|`|f?6eCe&kALQG+_gWl!w9Z{xE9@I_ z?~+ET-O1}e9qTl1Mqk};>((Zpo1K$0!k)`p+P-hCc5RpXrt{OoweP%K!+n==-tdu6 zRr|K^K^MNA_F`k^?QX}6CyXhc?J;5L6@5v}olEBj33E?7HW!;$oyc2$yST1<Tmj-x#i)N)^qWqLp;{}EA3;n z?gol(Hexfx32arLAhj9Mw#=;fz;38HvoktYs%kE{>hF$n&+y=r)rBZ{8oZrq*`7 z6Ro5D;kxtTo3WdV3U>XxwEg9wAC{dRb>Z-4<5_Ps`o0P|mE``*Ow*CV{b||FJ9g(x z==%KF%L<#J8%i&o4Imj#st@1{G^ZsSPkF;q2&oH}Kt_Zml!M*?N2| zc=P?d?jh&LAFt}W>qOhJyZl>I+$yfS+%h;?;y+>)?>HxO%m|Cg;fn^V^EJChCa@T* z-)Ns6c<|d<=97x+toy8bW3=f)j7Ylf+JdNgCrgiB9oBmUGvNLuwYAfXxtm(IRNkw9 zef&}H)LwmljgYR;VNG-oEY;WEEHUUG;W}A!YSYB7{hyw349_Uu)v)Tp8osI<%ekSZ zz01>C=eu&t53F)HFt%>SmFLxaRL-gUj9RpMaMWAtAQR1!TR+-Ib)H^d7?aeR^2j)D z(o)g=o}=@R_gB3k4F93E_c=lO_qT>cCfw_{nRT4C$aio5KDiR_BCFTYC7piCe3jMr zTmH|_!uFQi4-`$myZFvZt2MK89cwF?ODnC$T~oU?>r~&%Psd#`R@t+0O3m#)%Wqp$ z^x3sCJ;vGaIxu6o~*Rfi4Eg>$`vlAlKiCbqd( zX#aZBt4@?0^|qA9pl+>xcVb+kU-7mnZ`52?%gZ(wo`3XU%PXHZvv0b+zcDM;a7Erd z=FkPb_w6VOaC*k|+EbtUBCChhhJH@d(#JecJ)wQ}wei+X+>xr+EW7j{f5LqUTD@(( z^~O5ZfY3LqH7_jKllp@7==IWh>ld)pBYW1(o>_dsdfU-)ao^w0{IGOqT>b3#ch&s) zk?Vsfn_WWI(kG6irs*^rEh}y^F1fC&6O+<@dR&ESeO&>|)k1Q{p!CRj=bxt6%PADw zdVO8hn|&|uE{W1?{Am^|`S82BdozbE%6qN$%<{4N^xlJwgcl+gr5$$E@m#cJ`R$rJ zJIcm)(RSG!*vCUxnCw)LBRey&#`vlCw>`GnwHuzDU1puqYY)HQ_=b%WZ}GQPq#iT5 zt5sDyBKP=7t!1`TQyyqodr=d61ROLyQeT_=^NhpWdcF7HruBI?b*U^qpuDNi)&OeP zlbptIr-f}>Qtlf#ZZTZC=xj9a$DSW#w+=Z8CI=6hzLdW&=7;uOop-rp>aQ_LoO5jC zn0%Jvo!tss%JGpZ9RcUd!s< z2Lz{O-(7rgQ}>2|S+dVb{qD3N^^=|%z3xo-5Iyeaqv)7!y7->u-lm6EZKd1C7Y;tH zue)u+n5ehi?k}sox2I);-s<#-kQ+arXH72pF2XDEAZ6rZ-2U9Be%t+N*#_NbPu#ru zR*z=~28MHm+cNvQAJiLAt{rfpxio2;|BV67P5n6Sw!$-^-UVa)3R13jf4JQ5w0=+D zql`JNKDF<5J?qr0a{tNoGyKhS=FPajs?)_Cxl=V}0`q<5}eXyy2d)}h(N%JSoUg5Oc zAkBPcObTmOL&nl`AKKbXnyR<)xBhx#Kc}w$wc4uHg0B73J~oZJcJTX42EFC-RM|L} ziqn(A2fbX{Wvzk!`b3NI@(VvotL7I)SdJ`iXb((Zy693>%bAx)7x(oT5d3m~Pc4(i zjWL57cf{=XITw0ld+;5nL+%<6lD#t2yHwmWOPG9q?&7uy&h|`}OXd8~ZfCrf@II8a zAFPyhKk0gO3A1H>bMKxRA!;{k_jfxzTPuCtko9MnuA2?irXRl35;m>J(KlWEhXu~R z)PLEm7&q&siH?ghm))J_yQI^$tNxE(EnK0geV$p@?_i@#-&sZM5sLzjn2Lor?v7&5 zJMVhr-%ft@a^PUK>q|Uu4_k-h->lnkn}4gX0c2?>Ks3Uq1WP z%w<1JExX2cjCOfbd%-SwTD^C3^l|2|aVMnyYIi-Sk4k(lOVieNHt&D`-UX@0@(JZX zh6esPa1ZFu3EBt&B~EQ0>=$mGlxxi_x+mcpZXal#jy@J5BZ^Zl=g~5{j}cv zfY)7@s7&)3sJU-@&4dZbbq1vlK`-~{P0RUZ^KRpi`A@~>N10*IFO}!US}sXd%gdT~ zEj{y)cG2eeMS32Gzst6h%++=sJZJcs%<|Yn*~9%0j9v3=k+5_3-cfmzUo4rESpMqC zl-AQvO}c$^v{hi3>(af}X1S-6O8BgYkGGbGZGC$-Xja;l32#n^U0cwzXi0(n^dm<) zwQh~f3XgvAG)a5EWyEY9*V?d!Z_RIH7YsgAydnJl;%}>T^XF{x`Z+xX4*a3H>oe66fsf?= zuMYN5cUyTUt4rne1NE(P*S=#jXAf*I9P&=B=zgWwsxhJETUJLc*BLP4#&`qqa;)h~Y_n@%{@6YHY@6U5ZlU{A!)hV3GQJp$DWu&NE{-Jw&y)70k^|i7G zu}Srz!82lvEl=HFFp_z3?TGD>NsmS}Kk8gOZU16sp7Y%6*S&mVMlKyccEDXppQ&b6Cc^SYnixAR%Zv7wTFUB>zQ zZ@N2{_uZl-_Sv;7E~g(`Wj}nyiEG)8;TJ)`ryoxQiuzxd6!dn@wT z?>z>LoOb)J$U=8auWjCf-G|0R9b*3&(X{wwS<0$kw)9<)_0I2hRnCMH-X(4u?^YSi zXHQ*XcdVOy&%3Fs56}8&zLmWp@Sb~_-}Lcz&wowN7~HnXINtrGj|c{7uJ4(jm3CqA z(bp5#y}S}U>|kkEkCXz{7sWsEn};3Pe16!&3}a!$t)(w|8}}Gz`*3F~r=@DFuR%jQ zv%0L`m}xgk%xn`5C#l`Ied*@16Bz-+zjOE{aN)*Hqr+SJ?6t6G%kBQzezSjieMQGJ z-pn6&K`Zn8ZH|t+|J#3mn}U944;|P4Z$@7i*2lM@&0&%oB zUYsJn=!sAl3ug-ti(8(pp3fnM%%@UVM^Td_Xed3eS&BTS)aq%VTP4O>~=b`wm^jEQ(;>@xhWI>1x$a;$k&SGTUmJ zXaRQ_@pxDm4;Iq}AePX`T3hbiBnJ%gGiCELT~iTCTQ8 zw|r*7vU+8~waT@qu&lK>K_BaU@ybtU5bwX#)86Z>XOLHzow~ztyF2zzJR`j3+I_Ge zCkdm=hx2^7NV7iuWS=BO8q9YADN1Bnf=>{|&r&u3=GjpGOk^f9vn<8WB+KOUKR8YC z59Fnkzfb?emf?5E=a`Q)>$FdtuMO-=u}#H4SVk~z5&x9?lFAgNkjkuN*6>q?id?@J zDvx&|3M)XAQVHQD2lwtry_l4Gu|c!#}r$|p1vBNn`dK4bBA60iD*XG07WfO zTw!yl4;`1%ZQ@qNimoeWvI_GCNxk_&Nt5|e$$s-wk{@js z*k3chFKIP@DtT^>q;2LeB~Q%TB@DZCd#+uMy;$rhwGz8YyV#Z4+lxJ=KH`zm>Eeab zFma@Gws?tjxj0rDAx@OGh|ft4?Y7&W5#N?x6+e>R6~B;P^PKI~&#vD7y_jeDTC8EI zVxeQnw9vQYSah@OVPRouV&PzEXW?sUX)(xhu-!HL0K13wlkI-7pJDgPKGUOVjuIyBmS<8Z*v-=Wx|-g3LeVar1n*DUv1 zT(qPlA}hYc$VyYv)9RSrSckKAlN|IU{jEAn#8%xUR#v?w_Eu7fkCmBZpp~s;xRsM+ zjFr1&g4HC+a;v41EUP$4iB*!M+-j|~$#RHQJUmMte0rYLd-`}~n-@t^Yz^$=Y(@6D zwgc=lZ2Q<>u$^kZ)z;pAi>=gtm#w#bwXK`|54N-HPk2u75{Y|BRmED;r?wIHZMIA8 zKiVeSzqXCF*R|VhUn1TiZ4@7oe(+53`qm=Q(#EdEUTn9=evsYw_Re-E?d5jn4y)~S z99G(K9MbH1IwaV2cF3|bc6etYu)1OK+_K#+-r>1jl!J!-1_u@UwGMpyde$7*r?-{Qw?0ljBYg(>Oz_#~b=a%WyUDxU`;hle?~~r9-cs+= zPB)z{Io)@{`A>SC_xk9l<-~Ln(eXjv-*`{+S?M#!C)#I`Pm<3SubW;Mynpt-?)}2M z)%(5o1n(){=FVQuHqJwxU7SZdw|YJDGI#QFvT+*fh;QNqSIWb=}wF3?JxJ1d1pFTI_EprITt(cfjsZwEp8S37Yj&nTIZeRo$gcalk2n7 zr_iU#N7Y-yTivId57(!UkDiaIkCwNUM~StAhn=^ZM}xJO$7SnpJ$|ts?h)%f)&uXa z&S{U+Mz>vVg>DDjD&0=HJ#l>Hc;8js?WwDlTf1u~w~tOt=Syxc+-|#lbbI8c;ojY; zuTw8KH#bwaZ`^F$M!H>czUi#vZsFd|-NC)D`ylsBr+lZ0ZY$kpy2ZLJbX)6|W1V4L z>{MV~38n4peb|X(&9HuJrS2iHMlzT_5#}^%wtC{U!}=BcKg?UpS>IaIqqnuThuFHv zq1<7I!wKsaYmsyNKwQ>y)_tA5t=+Aytwm7w-46R5jykB=yt7{AtUBnfb(=NICdGM) z^#bc)>s}s{tgEd)x+|Ku!_GXL({SeUz3)4Zue{<9LzN;hzL6%;9-RZ{f@Qc8-h9W#(RvL-3a6BOS-nJjF4DW}JpMJ>PK&9Zzyx zPxD5{0_FaddnP%R(cfWthcrcQd7Wdk;~~crif!SvKi>*cl!)Gzyt@mM_XU^(Yyd6* zFTha1Xuw3kbiiD|Vi#CPz6zvRKnjj27kQ>jKBN`9R69j5rj{v4Cl4}7(fbM|40CRv1zy;t180re^$wz}U z5ilLcl#6_>>taY-`L4wfR=U=?Dl`2TEJunTdP0|VkLzLA)2^2kYszl| zFVp$Jxu{d16To}SxWh6NnhAOAAYD%lHv5_8Ijtb=Y{5kVTgN~*jH|+{;CX5V34C?K z^aRXWRy_9{FGJ9xSIb_;ixG6zG2%39-w_yU3b>tl23jV%{>(P!C{{8jl6#8xOlz5T zvY<$COy`+yk=}kiGkz%FNZV5ou6s&vh|Vz$XU!Y@JZ%*%Yksy)n{JCn8haVnj2FZc zYCCI}>H4$Ev|loxF|+w5+JS;<-4GoUP8c^p=Pe_couMhws@4i)IrD><%QUYt9&?L0 z0_|h0T8$4{!2)NU2JTy(dt7^tfgpfWp=HJ_V?Jh%;(p-2)b`a0)D2__G&-{-n)^B7 zJa>M!Zn)k#y*532)=N$i_p#0g_EpW7nlYSEUIQ;gE156R&d|Q06DnZnM(PS!&MYI1 zGTuwrhk<6Yraz~edzEjb<;;xK2xcE+XKT7^1!{$ACu;}m-qU@lE72RpjO6?4p3<$> z?95!o3}MH!tKleGc&D_M2|DW<3GZ==bgfwut}|D_^W_cED$_FI^R%7ys+kNB0vs5&)*%vv6+#v2tuCG?JR)F?f0YfK1_o{9TYY2~_af}zL z6))JYTcLMR&z@_-Yte4txA5EeowW*h!8+DVGl2n%$Kq+4abEIAu^GH)oHm^{L4~f7 zj)`VGGf)H9t7-`E&@MRNG7YuvY5DSl`62vp{s-O1`~}+Z{SPiSN9o|4Y+Y+z%;3XR zZ%eQK8YGk-^Sm7ipf-yr}tDGn;da)5Zzl z8u09SA-rbZ4W7T2gg=Boito=4;0N-9_+k8I{5*a&{}fySdu?~^QQG0!r?gcBDuNJ! zK*vNUP$x*INT*CkMVGC6L)TExUN29xr|2G(4$98B$1GwFVJ0&hn7*uFD1*I*uST#& zwZ?u823x>3V>`2rG|e;vHN!P4G+Q)lp-ji1RBTQVCzKP$$>ZGN2)IJ73Ac>f09PiE zHwsD_1LYL*@9>0LhFU>d;aUY+En3Im?6hgU)#CBle0zQ^l=dFqKwF|c1WGFr1PD$E zggS;$T6djMI-XGG03ClQcPNzmo{ms=h;FEE1C;)Qu0YRF&kT+sSPEgu*!84RYc(3cs&3}gl~LzxTUiiI(2)dPiT%nW8Wvz9qj z*q~m(+|L{sy z)vN|qGyR(*%;244U1cp0-eWyxy<{0^ur-7loiz+KOf<|itTmi9+~Mb|;jb}DBS<3# zYD&CDs79Cuk9AHXTO&`SKqEt=OruDnS!1#As>ThCdm7I)-f9ThD}*wkA=`*;!Zu(_ z*vHgQsoS&N;TIzeWCyW>*`e$NVHkTE+g~%1eNH_Y>RlPTh@CF1W@ihV*$wRd>~rjk z?2GF6*pJ!I*e}^v)$@fn)CHPC&CZ&Jn!)<^nx(>0;Z<#4O<&DB>L-MGq5#bx&3o!$ znlYO3nrWH^nvd1n)QdDLgk_q|n){&!?bkd9b?Bbv4b3~6ZBUb*X@1aD;dJI0awHs2 zPLt4`W6c@D8N~_V>=!QJ1aks8&(xQ3B02G#aL!BhY)%2^u<#T|g?ode!f4}sP=Bl5 z!aT-ga36Cjw1XMAE_UXcagDgQgbao|*P83k4dAv31G&E3U@n^x!VTpv;D&Rb2xGWB zMjH3IFoP>#6mTn`_BM0h2vdb0gg3aVqBia`?j7z2E{|ux6YzvQL!J?jC1UfOdG0(R zV-(My#}!%g7VrcjktmE84>dlL*O`&b%j0G9ig+W0wY;vP{X8SlMcy6WOJ08wTZ^Y9 z7Fmf*wCuGE7|vRT3`52!tpK_tUdE~09!EyDd;14TZfAtDoo8RMZgCQLSC89l~hPwr018j*Bh|ufg@cq5V=P6dDMIfG2Qg2?Rnx zXMv&MjL1M>B(N7a3rqy=f>F@^SPOgwLj?YU3!*N4>=!gcThJmnCO9XEWLy>85X3MZ3!VvHi#`ZcbmAF2oo4m- zA{G5)MjFE&+K5n{a2=+8nofpJg-(Nxw*C}hi_U(XQ#vz*S8>as-$ma@SE6gL+e6=3 zH$*o~cbV=2-5A|?-9Gvmx*3c-T@(Fm#zoy0_G4XheLMX;Mgc>p=d54E@X$Adb_P0% z^oQt`F#`2M^cLtX)2m>7tDme_rdO+1&8THG==tk6Fh=W-*PpC^L$8_fOz*AU2R(+6 zClm^2>HjO*AUD`Z0NGFv!jplQ0d9T#_z@>z-U*CxAEv6r3+BDR7jXoZ9(0JnSNmt* z?8>xTkoFSLaeJ>Jj(vZ3Ov5|FSPH-k%@jiB00d)>l@LQ5121-@j1~~b&?j-s5{TQ- z`97~}2XXH&(tIJl_=~h95XZnvEZOE#h=+fXZxzHbzW<;&SC}Ipj&VS-I?XbOW8meS zf>0#Hqv^EI<%@wh240jN@?#+$_eH)n5RWJMPAam)XcU-{`m0dWkxoL3Oa zgg6FX&MF9PfOr<2_IbbA5Xaa|@?g$^I0jyn+slPG23{^G2<1T>Ba*~1=R+I=FUmR$ zb|R>dPW!yyB8X$)<*I^EF~m#0$X5z+47@1wZG(9E7x^k6j?pn+CB&<~$hRHh)g<2) zMRrsJ@!Bu))j=EsFV_@=>LI@Ci+qg`Z~7u_55zH)9kQ4YLL37x_*Tc_AqX(wHuy;X zLMjn+h-2VIx$Y5&W8nYEU+5?Z7#-I=262pz>mG+VM#pteKpdmvx+fw2 z13=k6V7?A;Q4cFY-A-90M;C z$o8Bej)50rvaSonT>&o2IItVU-RXRv?*$KtW8lS!Y;PdMG4L`-L1+-fG4O&_j(G8e z_)t3S^Y;88j?ta$7xOTPV{|2HnEfG+VL;L_4~IC087T+m5fI0akTlGrAU+x(C25$) zLL9@Iq+uQhaSSVxhIu^1F@_c@jsf!|h+}lz-eibld_(eKo&s?U3$i`T(;$vvO!8q4 zhB(GRl7@K(#4*gtx|nA|9K)2PVGe;fM#pt$K^)^%KSh}_&xSaL8`%fuxe&+bxV`xh z$9PZH#k>IG82!n9F)xBRh6zc-yb|IV_sP1LBOs1pMDk&dggAx=DGTN(h+}lj7YlI= z6Os>e9KdSt(t^B|5P zAZeHfsVeaQ*n1ObD!c!0_&SEV%+lZ_BB`X}aF8K6WG+oo8q7-3ETPFU&+|Ob^E}TK zktw2(G$1N7MTyG0_jQhLxA*sdpY^Quu4h=!vs+)==X>_v*S_}tj{DrVeTuTo;Qy*e zkeh&K0cfR8-v!ue74JU44*}Uz`@-55U`Vjsp;U-7z>r|sNvRN5fZeIQ9aNqtz>r`e zVLyS-2iS+olc)0h0FI;b_^7-DfHPL{G69D4hPp1W&H^|GP#={C>pXy;0P3gmU|kC^ zqyZ`q)^z~4tZLT^Fr>%ScCda9a2uc}R35C`0fqz%N~w?+07I&!wu5yCz>uC%d9dyR z7*Yq72kUNtAvIHZu(>BJ0b042(*Q$Cr?!Lj48V|bsXSPJ1sKv=>U?4S z4PZ!~)ON6*1sD=6PpSMlfFZ?FF|2<8Jdd^e$9Db%7!oW$scjbkUR>4gH^58OcFR5m zp#wLZ0D|Q>r9#*N7NPR^s5}C|#{l(H$A|TCfb{{bd|v~A?EtM@D|divR`DJK3<(xC zN`*WDxNTLtc7P$xP@fCy7XXXU!%qLKfhfSIF&@YVsN)#|>D$gS8XDkfNwOSUUp@DUr&9 zwF|(I`lviuy8;ZU){XKGu=WMG91tv|S;`!%0IpfZv*7_b8z4G&N?TYz1Q^mMcx4bM zu=WNRk`%QaR&NFQ0-%-q8v!t+dg@-nIvQX|uqX^t<`N6=62|*SHozZ!Le>IWUUyid z0J8ytWqJMC0p7T(9UfqwRqgly-nFWoAiyH4+7STWzp9-S!1AlwkpNa+)lLmy%~kDA z01Rp6duRa+X(dk^U`Q)@X8?w@l6MwhNGsRiJiw4v@^k@)w34R}Fr<|{1At8dt$fC1 zfN!j7cN5@SfHWxGvHCW^mVi!Ed9c0o^WKLGe4 zphr|5tjPeo09rXeSAcy0!Llp|z5s`;Y8MJ{%&K;=0H>^KmkMyss&=^m=dEg205Bv5 z%A>Km6yP#Iuq@A|9N-Enub3+Pl>kG6k4sCC59>OBA+3ByBfu?yU|IHE ztpG!UWqG_80CxadxmK?M?xnU{p5GgQ`>4D~>RkE(9ssnm?=ZlSR{Fs&0FMBIWqG_& zfXApjU+Q?{07HUh*}r`Q7}Cmjn+NzOwH=w-cLCrm0fHrg zYDc2r{}nnC0!z>tQh&xExBz&EJvfXl$jO@M6yO;g*! z+5uoktld90tXKf}K|ru@Q7YsGz$1V@QTt-`UXTX?f`ve-5CXt@fS~__ELa-=Y>2h{ z=NU!-LxP2&o6^=8U`ViV0p|;A6M!MXvYFcMBEXQkx+ra6eF55$?& zzGQ$uu4*?1@Z>7qSAf5*;(?1|ksW|ysX7SjT>wK`$=e4oq?J5UGFSsZE7ye#aKtJe ze+uw3fL68>1Ng=&o(;ecR`DJJ3<;KBmXv*Z1hC7hb{+tGuHtzC3<;Lk=O}%B0S;Kz zE)ZZye`OD}4+c1GRl9V6A;D5f9WMi5NU-Eld6@u1f~APc%K{h@EHzYKHo%ZzSspJJ zU`Vh`QrqPL3<;KQDlZ>kNU)4ic?AGNf+dz3GZz9}gYo{6t6G5TR`H$!3<;KHovQ~J z5-e5JXEXo|36@6cemn!X8RPx)j5&b6ui|NC0KX5&;1^{tV0{zd8bE~06dtU%0gaWx zv=*EvVNU|K4B&HsR>txO9S+$A2o^zVJ3)Yt0eVff8?ep=_~oj0uK`|M)sD=JL-GN^ zLc)H6xEbKDfF4uFgLNz(htvRqg%A4)+5!9l(8~FduHz7WK(O#(Kf${LYzt^*J7fgh zCjtl-erh{@fDZwBPkrukP5pR9wHBctAP3`-kP!NT&}d$8rx}XG7URL4ktkAHgMhzx zih{ecc>3+^P{iI|g4V%7lh)DkBCV4XOTV)-inzG2^t-yEh?^Trzq>n%czCe%dwQaX zmlsRFw>OITfH9ch7&+=Rxw#L)eOhN}^7F6I6clKJ`?P{+i;AiSii>S%N=n>lN=s3s z47A4~D3J_mI*<#Jedq^#W1{F{b5L++4T7veoCe4~%Jja$BqSshMZ&`HNI0A`_>2)g z#~DZG;({Wsu6V@ForHLJ;t?+&61Z;-CHht2(dufHSOeNJA$XKbMu~Rzc+|lGB|19c zQSd%Q7Z(!Z>Vu-b=_Dj08%1*pNk|cB4{q3GB)g!@u3;!+IKZrMj@bApvzHgj=pBkO zhee=_k?AONMkdObm5Vax<)MuE`6zQiA<9@(f-;wup^W9AFCBuS7}J)GO> zKINz^Si`?_#MXoi_8x0bLa^sRc?v_3aJV1&C{j>C0(a5DJ|qN=kLiIk32|{lW!>Sv zd!qy&Ka}VnNCNlvf&GB}Lr_9!3<+G42j7VV?jb}8`2~2SkSaqAa4*OxVwZ~&foy>1 z%%BAYD6y~%mBseC8jtPS8cdFXEPCS+AGlsn#v@2bB$x*?{LGPrI60x0LTX0CGJ*L~9 zy7YhLupAHW=%OFM_8Ghf4!$F(>0ljALSka^d~tA10FMUpQt*7Kl;8Qt_IShr>jUNl zYRtw_WF2u|-VcgQAfcfoV5i_alE9o+*s9g-b4lPXNgx+RB%~PHU#bqnzbZ{8lMu`X zJCP7)Xy2B{2G0iiijbG}BZ!26HAO;~`EZZmdc@$tMU5n+3h;sb0e3Rufm{K3q0R^6 zVb4|WFRh};Joe6HAg`bgykVG}iAS=s!OdmZ*i=~#$Aj@nNYu)4((y<}E{f!pk}!LY ztljuU=-*n9tn*=!QE|8PN;j5 zMnck|9fEcRn*)@0u-49a8W$Hl;_CjG=&`)7ly#$lx&>}>qajn@6Wb?>T++BeTbzc{ zq(eWFL-Aek);BU-W6%%NV<=-WC^0r3B_t%H#FSK&kd{G0GILM@upLBThX@5w51}mr zebz!5gmU132lvJS{m+879*j-3FW4SY`cr)+c%B=HqHAG-;9gN63s5hxvA}1+C=vKj zLKyTT(7s?gLy=El#}RTMN}$*_Xsdy}pv+e`HWnoSJtYFaKuCbTCle)P<)g#`C|`g5 z>&juF9r6OD)*p0#Yfnqh{N(bB%y@l6qJ~nhDxQU zqp}$pC@~Yt8fAP0^V854QQ8oI443hfLS57RNYA22?u!ef4g8QINBCM&So*_~yzx4*^e;NZsU=oH85>|Dm`;_{H* z71{`&D0*M$A1kBi;d`?~IiSQTL|=bAxIY#p1}?u(Dhlo(#O8=(Q`QdX6-of{91+AH z;Eq~~p9Qi)Btuy*M~QH5m<@MP?gz0Cu*=YfDEEg(QFS9lxjz-kSqZQWpe-%*V?KDI zFVshXQ8*vy@1gH?#3N3wPXyecjmP!^*cs3UliiFNfy~U^JF>Fy;GSNa9XUC9J92aJ z*ckM1j2JSw3lERPWszYFgUK*vi&Nh*q^134NQZU>jD^{yWD=5s%?0%Hcp`}TG=Q;j z3Ldc*77FbyDvD+;hOz8&y9kBdk&$>LY8gX2LbdO-@cHn)VJwV|1LMp&THlx|*4S(k zxEq+F!>KGa#jXNPmQ zW9bL+29WJJkoW9f@8tAQ$=Uf~KPAWD=?AebxZ4@TgM~c(z(xVT&A?Y$`s6x@r7=H( z*-=W&0^?y>EN5~@i5?y(;<;=;G5Z4SVg@Rk34I;hOQ@TaxzUjGP#hMM!dQ|zH}I~| z_96Dr&VY6xt|9=NDGO{M(Fyu3FA$%>_lElqeGH5%U|d&@f|v)`D;V2SZ8f$gFdu<> zxl+zyKIDfIfbWzF2mrn~8jr+K*BZ0YFb;z{4{iUly(>crDe|=Gq^ZXaO5Bgv+64cX( zD5c2ABBiLPTf3v9uk~a3cxvzUG#H~pdChsQ1oL1zWI~DT!=mgPvrjoThea9ku$W?5 zrk4F0j47bq%s>g5nW*evTSb*GOlL41TVZeEyxsAL2Q}`%K|R21f~GR8X%S6Lav;m$ zprDCk!5Dv^Hif@Wm+a_u+R5p;t~1~RFK15n(Y)sC>vhd9W9E8h=EP0x`IyaPxs?mr z&?77s7xjLR@rFQEy6dMOkWPrFv>r)$TNCOEB97{SoxN z$yD15ePIQPR91m_mztkox&UPr>P{5!f1ocGw^98j=3k&pz&r@rPpW^x@*~Vn1KSe` z<6&THV@a4jq=V}RZ4%6b;IqJ(*t%owDDl?c7#`{>^nuj1$L0gaf_nsg4d{!>Fw`li z|Ip7u`vd2T#YhzYj`fQI^M^VM`9OaM_-hd50kTW|fUA%4fNuzk zM`+9rk67rNu+MjR(F8 z_yW)$TUV;iV4uVJz~{hz;B%l8C>DdepePmxxuK|g5s06QQM3fc+!ZKVS&7A*DD*Yp z{lM7>=EG6oV^LrSP^gb!Y!u7qlJRH?_1SCSp1?NwBm~$laNYvOEytrU76Nt%jDtsm zVN6U}KQtEVOEn&Q4mKXN!xeZG*g5Q62KXwJ3}w;}kNSf#fDNIXFTwT3asr@J&}PB2 zCAe0BC>j(3&Obs?Gz>l)#%EB*sIdZ&CzOoEet6Uu=8tf$m3S1!e_(AY1;*c*cyQ)~#Ybo^^{fk9UpW6{ z6iuOw#h44v$qG*m3BaFY{ zSqOG!266!?v($J5vm16K#2)HzDmdGM`a-qM)blpP0p^Aj`%MISmMrzm4$C7MVcd$v z-6#Q^hk)}S5%bnB9v;iNKx_K+a4|NJC}Qm-FkD{tWtK z>Yib7ksT@vVmKl=Ga_Iz1=k7sH@HsAXKV1i;29KrZX5}T2m6i1Bg=bOiV`UM2Vx3p z+yr79%30^~_;4Sb@Zii~#XeAF7MnYaYhcVl(RV`Wa-2k!9UymLJYd(M9gRSVk#HSW z&tv&K4aQg0ewduVewZA9vq9{=VB81%28<`c7+CHB^>JB_U=9o8pdwU?a^?rlo2cg) zm|cc>D(FXvOP0@&z`Db{AI26?Cb4`OJFfsT3(g8bd+a@zWnlRXa9QrDz5&ZA;F&&X z4{RwyhOrH_IaD7E#(??<{Tl(>H+bFwWo7xjuzr~RruYhY9t?PxO!=Y&KbQ|g+Zu)v z!y`}vhza4D1vp#8Bfy3sz=jbL6G=!C=!2~b)OC0^N{M5^SrmvlDf>;ykEh|I$!m`trFfjMG=d z)c?{$xaV*kVC)T_kL?>4BY}7xi;=MJPCy@cJ|pXhok9Qo&SW{)0O#M-{21CZ>fT^y zxA1!aN-j(ErPvEXKp;v4XH10PU{n^IF;UJ+mtzg^K2$%A#KOISdJW?(>bhZmCkNOD z>Ny0KFG3$f-7jp7srrZIf>_)M;#{iT!aj%o89WD*L+o=BZSG1vfO3b;1IQ_scT(dZ zELWn$G1wg8eo*`zF&Ca?LLCSFus8_YPs%w2CU4mJ-SQp+J%zRv+8ijGFs^{P8R(16 z5AG%QJN*ENSFkt^%kjf0XYasfAlUa%%XS*dKWLBnFz5>)AKGPVtbkJD9whc3T_9q* zfSox~zKg=13+J&shagIvi1DGEF7x4ffZzYVzdty4NI(&4eDF_LCsB~_GM1mi>9hu^bd-#Jla4&%dI7wQ=F zuT;GPd=&c*${CLWn@q&Miv{BYyUhsf0@2YOWx`@A80$j)i^8MJ-$h}zKNpX}b3-7< zDEaT%HCQt;9<`&+iK5#;SE(^0rrTKlOUYBQJPgLsa804!{yj&;#zE|$-uU7XKdQ`N z`{c8`7UMxZ#hwq^!gC++I~#JMkxY(jw6mLOw6|Aia&Yi#a&#PMa&i)Fc6PRFc5&%w zrkurYYw`6}Xz_#g3qBj#I?x}BDUa#f8aP6@(Axh4Oy#wZF!E>Q} z!*eKV?1-%&%zNP+p)4=Y8|pm#UIkzlsE05Y%~9aZ&20kbD_6jGoHii8I>B35XvkYs zbc?sR*p9cP#E-YMG>*3n$`t5_*_9|ttb_gjS0+~Ep4jsMhO!Oiak*bC%(3~v{%!j} zc9ZaScQ@?!h}8Cuii#VIj<@tqNKp8gn89M3nW-?8l@sKhn;SQjS6t*>Qf4?@UcS+% zqQY*t67*+BiUP=F+>D)bSAdJV;TsQ+Co`VG+JPY<+rEV+SOz90$IYgscLio-Y@5r> zoD0m#Qkcum*%*|YXE&E$P2z*L0h>E~fABk&^OH%mc6K1Pk0H^*{R8JHv@rJq|2+uy z-#5^}nySahe=J%<2G6fFigCKqaHFwZJ`0837x)ybY*~Zs*3ml-heaCZTcrAD@}686 z&|WjF_qgt7wC~B1kd#l>=f+f{@8-^4Fb)sstQPe3z<(R(*O&|?{vu1cOp4vfelL=m z@pgBOylmW>-Rbh{&UMTBcWcc~uB{hHJlp(CWB%gBEtd*)g4Dn7W0|hB(Y;%9Fy3|` zyZo(%4g21`uV=Mxw7Gu>J2!IW%VGD3Eo*H8>7NwuiGA(oIQagm{h(UNPnBDVl8r}; zcSLMLw{O|H*33UWx=IA9`8k4bG99Ckv(!ZQ=7oIxXDAVW{Z$OwZ?}4PV)m_%HC$N1>~QWX;J@ zi8fsgH^uea{+(Q}k_{qa zI2JB77xHTdh34|Py^yk34Jk!_=Spbn>R&I^wl~i6)U)7==5a_D|KYZ6%&796h@@|7 z{m}LLisz+Z%u6e?; zqxsP2%{7nj?!CT)QAuq^@Qj|B{~9`}=01}%&O*1vF|Ro9vu!k=;extW3Hb-ih=*vs(H+O8~0 zPP047yB;-|tJraLY&yVRW!mZJ*YAv_UxjkE?VOO>u5&eIAiI#|QqCM#`VGOgd#|f@ zXioSx#(4D}Z&tQ(>`QF5j}|y`B1fBTLgQ_tH1!Fst;`R9{|SDg-+GU& zVtwS7FFTICt*ri)XSI|$a>~=tFV8BE0sP6P_VgG|0kf&Hxu`B4Pg+YBhoEOXSxV-D z7W9XA+)(O#@$ueIv2n&jKTSU#wW>FBFlrl*kWYCY@IxVzzw55Dz#{HTE!(;$)|Mv^ znY+I_Jz+x=|1B-u+T3kDqeHjSX>m^l<9B*wI1IoU=Iw-7H^6Gv+_Y^TfX2w?;`xcjclvJIHuAYz=^I>k<^z-LZ!N#yp zgCG4(ZF^JXvSokS`eyOI@QSoj_|U%Yd6>px%xvf`r96kObv=hplSn)Z&qQrSgWlcV zVSZ^;LQw7GFK*kZgAd)?C+U%khs54ok{!~^@aE34H(N_O_^R5Mq!A@~I^X!UUp(EH zWF@O}myhxfS{^&-BH2P8|6=3DTQq~|=d?buq|qL9X;wOaj>REdTU7AEiI=s`fqxin zbiVkJyS9e)ayZ^jm9Ewdxo%Y4?|x~?hcn5CqjBFhImX40q5DWn7P@U=Oi`8Mmp(o4 zw&ixUy}UpsAALIZWQmvicFcCO7#is~KBJ;b`AfSJj=E$jsUC7^N-Z}+VwPqO^QZM} z+`M6AF|AO}pibWEMp098mQUubsF&L`r3%@!TlgQahZS(PJykO^P>ItLdbB6vlx=Jj z?)x>xUoA>^-Uu)D2Oe{zc@l ziUx>6T(<}Qx~s*Hkp-P=TGk{#_15fYH?!lGiPAZ0mxF!h&fC7B4OTqaw8rt;KAhe? zn=l_&2icd&_tD`-YrDDEJ+=kuCXBAW;Tl^Py9dPDpX(cR*{;zJkDdH_Vdrz(xPI9S zPFvMRAFHK{%-(qXq3N|oLGsQw0yA#{WoJBc&;0V{F?gYamUN?X^>@#-73Grvu5uJH1XVL~mh;i&Q8Mmk4K%xtTjs+F*3JiMG=iSNHf;gD1Cu={!%nuA=e# zew%rvUp;6#AXYXqd3OYJ{4-4g7U)Jt6Eb?ZQi#WXV&f`b#&V1f>cS^Uhb6WmbsG8J` z(O};+Epy9zYbV%@tIw@rN~$aj6l~x)tN!KX;uT<8|$F`E4F8P+_YX{&Pp}*t3 zUvDYMEh=pkQPQZvBXUndnfP z>mnoF*Q`_e)mQz?pvo%UceYMxpV~(4MgK|JvdoQLg)_4n+?x9~zT0A1|IK3`{W{Jt zUE^5mbFYj#i>D{8Rk|+Jh(BoDbjxkgc_>qeGn7$$Dppf2`;&z3E7r_=tTE2yAcnZs zvjz@#+&Io`?o>(bFF)KQe^V;4V^2?JjI&N>=t%p!T`CD{jPI{$-G0i-VaZRiE06O? zqbwI%vv;?)iEVL!Ml_Fpc{5-0q?Lu49Pd!%r2Xytg^x}hoD*_2at`o5l)n8~xMB2& zSH6VMqN!B=tHAL=WP#p9l(%m7r(MH)x_2+VNRCdB-yZg7t1n zsd{W=%09yo@lK#SOZKkkn$44Myn4Hb$&5WoM~0g?6Wd><&bu7p-S+%QdyHNsj~6ZD z%kOEtrdJTYI@P;-F5Yx(b-DA(qF(`-?H%7OE8o!h;Z>ufug*#27W?H{hIXrGoQ#V} zg_D;^UK{Lhwbp8vMYYf6N`&+Rlc zy$60eFS&Lpy{msP>;38M0sw%i%pBdD86T z=Wa2A_Xe3KPr`S#)O}KV8|NusnHT0dQ}%dXPli2X_i#zdMmB@F;Lp>=-_>4iyz@S3 zT^~nje&x0-6Y=xvTh^Us>-OWk^kGbVyc+3c$!iX3+ELLKV;-QGGD$jiLRW54cIry4 zi%KcS388ffNrlV{jOKI&yLCQg+%6w=`aG@r_EYU38`lq?(`;8Rnr@po8xU*J7tlXj zuve?@;FBwt38k*bJ4^9j`xn>CJi{w0Y_-t7?O<^%#B(7O{Tc1wG2A|S)a3Z~svPMW zjS`g~${!q(j2;SH&Fph1@fPze_b|VmqT3c+ci7G3qL{o$+VwTZ*3H>HD2&di`tyhN zz7}I+y!P$*2t(&?Nqzm1y?54BIa#_W<9@GqrrTe#U22`$-p?mTf)##+rqt6V?RDOG z?ni7&!mksuwjGQ7pZhE{L&Kk{eUe-6G-Y2t*5CQU;NX+FH~K6(mogGkcZRK{|LG-K z&{4uZDIeT=@}{l2iq*_--iG18k@kuuV)E34$7u1Nml15gXAHYy9{ZS&2q&5RX|&gR zaJ{_wS*}Gx!o9ZNa`%ldZ(+Pr_46otA(=U@dd>Mc-EVnLWq0s=$z2)q3w_r@x9hB*2`Q-fesKeXGx4Nb z^W&(KKooB!Cmq2nrC9Oaxm zjX%rza;+|H+&bJ78~jC>gXis?4Q-4D&&8&k1@!#NPYbN~53^$_B`>9?W)&4(xjGT@ zeQALGlR-@v$L8%HpBT?>U6A)`_K6Is&zPF?%72iTJnuuODscE+9Bgip_r6c}#rJ{- znXyBaCJ$6zyfaUeQM@<(+s<-%TQ?7KHZ3C4c}$b>S~XAvGXix*ofQP zSQomzESEl^BXs*iTZ_TW;TCpDM?u$%lZ8h^YX6i@Z2c2>C`oMe&u$}rIg5k4(vs!w z1-9v*lt1@SVh!q2y4&?qE4ST`o$a}AYu7fX?i3dyFB!)bP1C#!C~*6AlJG>_V5zcc zF!RtWYrf11(+4vOQu2F$u^dTvJREqq>+yu-ZikeJsC6G+UDUIQW)w|x{ATP&Q{S~o zW2uN!Mf2gyi_?`7hrTNx^{(k?JA7O?QGQb}ZZxcW;FgGUt=^EdS9`>woyp@P=Z;qF zvbd}3db7^{Ui`!98}sa4^J~pyw0D;Kc{&{p_K?(O{NYCDHkuredDm=&!V&lT>lNjiIIDBj=ho_ewU>^RSySDz;Xo zzm0P7Jv+Q_JBNn7N?J_uXj<*5g)=@sGlJjphX$ycTs-w{WPV@4kJFU_dmdSzt$MWk zrhwJY59f-t5A+=!J0m%@x#8~UqQ}g3b0&ZOPZPA}u~r*~7qTbDmAxf1^hcgLxdxq$ zE_<_~a12k=(zh-`%kuXRnnKsjaXVvbt4?;?rFQ-*q8&)rSD#iPUi*AF{^Z&R2})sI zefv%`lM-*;|>13HX+wtc|TD(h#OJk}&B&VdPtWQMv9_8=kO<9{2@}g0Y z+4BgEqCIfxasdmkq<(vd({5+(Hw<|K_ApZC#nXV%Y7$h4@;9 z3}4f(uUxN8n_^s^zfIcAU|w!eAHvu4q{3wcImKqsLO)VkTy4r^R*$btV~wzn^l$XH!dd0;%up{f~gu@(_Q0*xdUEx#%~&Sh@E`Lca=$SkTpx{ z+#|KfGx}QYf!o)f^*ZsoVLIxZ!@m7rGHu4ya&j+v&tFv*9hz6-$A|9P()V^rXNyTo zwD%VCjchgZ)2O?=2*2DTmD_{$Z#pL>_jzQpRhYH%yk!*_IG@!sQdk?qp*j*e zS{^uhvZB>lz^FjACv>}f(uj1@u2I|6EScENEVkp`tR}ABc|$RsnF4f#%k5g5-41U2 zIXRi&(6f*JfMQ*${vPjhCF!G{iJCTRS~zC?_ZN$bUew-^`}_sdP_@VFiota?2lcf% zy~$5mqq4Kx%+7aTXDtzm%8Ru;sdVm~z4BKN#!eGUy7!G7rd`w1gWZ$DUTdoToi;9- z8#o1bYpQ6=;hz@Yx0r}@F5P+H$UsQ?k*$`A=UxatO}#`o9Mdb;_2Htw<}Etn+-}kz zZ`xFq;SAgRFB%5r!-y}cZquC%eIKkJ?r7cTQ$td^=HqnfVDN(g2; zoe#g~UgrIB>)HMJQq$Vp4Kt+86Q=pDmqhB{t6Vit*e~p-{{{D9W2~I);mqyZ8wM-O zWkn4=xKI{Gy^!$?t1Va4+#gD3Z`1Jgl&Ja~tj+&SYvS#*-c!PFtQ5MBKeDvEaB9OS zx9dpRi>?l);dh<>7FWUq1kz2uC>?G%su$#9^`fq3U)HOG>zJlwXUY8br8dIziQYeP2k^~mIq2JXKl@E?`gZ~64*XUp8a*`@ZN$pJ1-i| zG#iH5=Fj3*q5U9U5Ao#CKtxWwF#&gNfQuK4Rw%^obxh{M++m){S?wcAbN z^{mt$_4}1{+=-5|6Qcd2AsO^0O6Ts5H5?6e{BsUf?;K=K)K9+5b_xEWC}DFu*v$Xw zNm)y!=NqcS1ME534$zla?sE4JLc*^-kurYA;n5(VmACgtIT>l1q19_1+w|-E%gOt1 z?i`Qh32~gOOy;hbbsgne=Wl`zR}PC^eerQbbWf6DQ1L^Jt>f)6hm3^9mSooI^7wmC z`Uljyyjm#xQ_Y}Wm?$ZhZdF>4=4NxbTKLHM0nMk?fkB_x8NVOK?T=#X&CHeg@qouS z(DPgL6Gulaw$~RJB;E=Xmfgr*^EK(B;Cj}=!;0&L2VN=*E0ws&|7>wReuJU4(o?NR zdSlWRpC5nH1zMPv#&Wi3x}IZIvM8$Vny6~~^Qn(O2%2|gyet}$R4A#Sf74CwLAm4} zmfGLH+6*1nS+!;y*>Z*MuCJI}rQ*HeuE3gZw!9~`>f!Rqz_I7hSM7J!;<-(HOKxY| z?x?y&HM2e?HSs8EyTs5HjO-LeGr7;1$bLBH6>^=!A>pPRW6z2ot*gqa zLtXMJ9J>lPuEGod#-zx9VIKD^T~hVpEN-$F{$KG`AW>5 z^yEcDsYZv`gL@_i~=fn!C}^gph^bTv&|yjS3Q;mY{De=rF|bWHF6!C&0ywm)!z9}S z7uH>s31(U!j$!tg!v!1HHr;Ovd5qy#&RhBV)GD}YtEM3)D{WXm>&jAeJnU{T#If4F zoT6jL2NUHtR6>kqwCn!fG0f$CZ1Whz!_9H$s`t0QDD9Z?2apskr!kX7PfNe6A)^G~ z7xd2~uWf#Is3Er`co^XL?TG!*jSHjq+r%FEfTy|dCC9(>_%_64U!z-qAbeT-`Ix${ z6QbjcL?rqVM7))McBiuPdzz#uxow`{|Gc%`lXo+?JLnKAz1Qv>gtSio?mOlKNAABm zp)&pL4bo_~c!kk5iS4<-w>@`XyCV0L@6oZ0dTSw*Q^f(S8RXa9p~}9Aw=a`NG7_aa zyN;_m+wOUjtg0}5YwVJ7f|Ee6seZAqZ`g^eN0Uhhm{YE`EByFaIJI=!QG^knKj+;!we|#?n?o~AE!71~HbMD-AEN1ReSxKjireb$GIcjQ}|5^U~l#4EI z{hc0N{f>LG#^y!FTw`XnTaB%pn2EAS0wNZ7m_NH^UUQ%;xqV5U*ShxJl(O_ul_?K* z-#T0FU7NmT7PWkw_OJ{&E%T=R*6WE7&V*|2iOG|4zZOB)lx+>H-Bg6ciYhq&ddY+<=eG`uk1P3>4$at<9u46J7 zf8bR6FwfRs#Jf{B(7&X`?YUF%|3U!Q^9L(>uS}5f8Lkw6)wwMGjhL4?+)?p;*U2jKKDNNB;1;i zs}PL6^83w~!m!L~XXducETdxR)5>+*`5*UWruyRQd=upv=k|1G2<5W8?p)}%dDCFJ z)28oY2A4Pb%t7ib-mesQ^UO*4({XvtrHRfr^on-U9GTeJp248^`_uD6`tzbXcE?Ux z8!|PV)5|4qdzL4cZD@R@TiV-d#`10Kh}72Sn`J6#k2K!ux)!j$Y5TK_q*%2KI(?Zo z4Rvds#k-O6f+j3uM)!vvx9vO385QVoOswifl59B7EybTax=(FPK0X>(@@YmcvIJON zyffFb^=SKgkFZC4`d=!{YA%O8O5RrYdO|+>%iTdU<*C}5t?Z-Uj*hg~$8U(J-;_}> z#i4Oqr(-6rVtAY^JE`#^DCDhow(@m%Aznel<}_WUimCuHt{#Scb31SUJg~uX?9yqJ>c}w!%E1LdS9jushMLcc@55%`y)%6#vngp>$E?#507v@o?JsUcdsaNHu zP$i%`F26s#DD;E(nc}_Ue&Z85pV{h>kB>s~CqC{sEjHaPGNASSafF`ShdYz@NN2xI z)z#TBoo(lxJ=Ucskk_1jJ??VrarVfJX?9RxE1%j8)-NMoH@QqEac|zewcX%F&mfww zAINcQryNmKZIai064~z-QYW%6?n!v!_9|UZ)5nhH4-4;GGkon=kqj;` zAA1e7tyR5tqbwiLJ;kFom*y{VU9&3*#Pq;9sT5?Fg#C%_^#-a zgPuON!av$|AL|W`;PR9|bLCp_F3cXXym?pGM3ILxZrj^bEp8hP^)+VYkJN8x(*?Qt zUpD59>T{vH^1hGtjq*Z9vEl(;$Idim+HQaU<301;`Dx1K{@dM|YU?A;`#Ya^-nyaZ zvQ_3)Z?O{luacL)rtIuxJ`~imR&2>+dyW##R7dIBFX~mFlx%r+^jTzb1zi|1^GOi8NZ!s2zU4Rm*fmU^s< z9B-#xi7eN+yxD2}+#i;n!5!`E9qX>>*6Lr<$$!-0d48%Ee{t6EUhks3mB-GgU?ZtFj=OqoD#mQ=^c88x@Lghh@rZu|4<>`|ShF|aBIT!dYKQ?6HLZML5 z(9g;6b+>*7esGnOzGG-vu3MUpJNq+ z^RJ)fF8FlMWOHX;#kcHUZ~f*QAN6Cys$x{$pVDDbE4%-G$D}MBxqJJ#yID4Scna6) zoDmIrzSg}dS#)m#$tU9WY)On-Be?W~y;l*{o$gdx^mXQ^vsnsHchShDVbGNl2H^*~5f2=Le6KumC|fwR!&ACX zyfz}KVwP5K$nn_C5{ETRVh(*iYyGq&I(U-zJxh$P zoXZBoo54jFRVqhQv^&-mF{hoiVgALxbY|?UYnP(HObWy67MFLHOPc~j#@w~8O{`;X zs~$O}Rr9uFA?aFbSStD_xYXJj7l9$sTo@%f>R%Co?Um?yX(Zer=_3 zgC2jc0?rNhXSD_^oXoU$Nqhac+3!8xYJKNgP=HZT>7mka70>)#NJvNHJ*kTFF7jc>Mf`wN*I4Y_eq*6|n zSL1pli387^dahibU(;bB&S|JZ^LRY6U?+|8`9ynPobJyan(1AR2DyrxZfhpYDir?k zq8%4avcB*#qK&Wh*2y@_TXd$6+JcFViZr{IoL@SQG#DXl3J3YBuEg2ITt+`7Sl@qq zvP1Lo-lq&Y&+Oelw4M&XnWAiHzh8n`_@`en6X~u&vTMtOJjJ+Yl@St&tS%Gy9527lM?e|KTdzsxao0^c<*-Id#!Evzn$9@df|xh*~j=}ce+zY z&gRZ+skZoFb7T6w(K_b!CO5e!<0n%0WGbI-dFTGw<6uL_E2ltzNzR@<2ZOE+2)FHD zqmfd!pYC02vDZRlSoxEB7w&am;`td#{-KdPu^YnrUga_R9nN5WQCv;Cqw%aQhlZYJ z5l=Upqe-@sund7W3j&WU-lyG4^itK|>vAx4$DJ%)_R|}@S@Jep z{SZ9LA<}`j3^Wg$IsWcOdU)?m^D29hrUM_Bf={|LY2(;68?GAPUu1e)bKrC4(RAFY z{vWCb&MmOMoMPJc`WB;|`1nHRMe7SAA1zZhxUgu(DWpi_ZG#IwUeN03O+6mVz_Cv4 z{niJu+~TRq>@UUWR5BPRGy*h-{P^7Vj5^3Wah}#p<(W6oExv4CJe25tDJsK&V~1qf z>_^2lLp*Jp4HV5E?CE*(&AM&GA-j{zJI~>K{`--90;l4Tz`3%1d~Nn<9m7I-r!2*!v)2@u>5pL69J?car;;HK?#c)Zi|mvhuIVGe@)HQFj}^ zr+s;MOt0jyXUFTbxR3V~&F!8_?T@?GoOzM6ru$p6U)VRHmpY6Lzd7aKU2n~0|6Y?j zw|45t;a~5(1KpS227a6J{%Nw2J*P^eH?o+QQEonHW`8x;E3Ru%Y)XkKM~>XBn5e(D z&CRgUalN)zhyDkx(ZYzK!np&##rA5?4@Q{Z@sF$J;U{`l%3GNg_t`sx6Ln(JsC-Ta z+eZ3C|LtG8hFD1{UtKg?cJFgYmfe&`@58}kwZmK>P1EoD zUh%5@A?pv`r+(BHyS?DziX;_Jd1rX!?Jlwq$aIY3t9y}z#PteLcfXU%ox{ zJk56Cjlb)~dk>OD9^Jw(at6CybS)YE6S~E>;+@y~pHYirkJ2wD9kk`YBcv^Q+S+L$ zd25&cE*GC5SDCK&66OIH1c^@jXD)v$7jknyO{-FB@zpljY2TsTE0%lq?R7kp%s$2Y z!s6F%R-@grkrDadP0i-k+xy%v^eg|S?x3hYi>v<{8gCK4O)~8!x4?RuEVtJ{x2(C#dX^7EDNzSfG`eM96w<)^o#oL4Q4Ttj7+6Et-Exg~rNFV6! zToU;1jop^FH{!VFcRFxyF8unSSy0q(WH^yMVmiT?*HDD}_w9#s#=LE>o{W1QFqM`y zu55q%^*{)m^w|PG?l%dIdSv*tS$a=t(Vc8y>j7PZGQTCm1elN>bZ;T)~%#Cg}Xm2&FgVm7v4rO zw%9h(jii=YurjOmjKgZm}L+wbs@Q z?+NwC-PNzs&e}TPIk!}E`s?KjH$5lSHxPJJ*NHCO7#DW1@Dwq-u=&@{&WuM(^;*A0 z8%uO+dwq0u9JKXpOHv;kEZ;FF_Tt+e;lwcs{o&3nZGt!Q<)0EbWS$q;oo_epAlo># zr`*#!tVHHD6057EALzMMcVe@oo_1`?!k=$@RC~Qh;>j^}MP`jB%Kl7$4?UK5{E3f? zxUtj1OJdCF@S2Y6ov+JYA$kFkjfm;YsXx-_mPsWU@{d?bK(vpU@)!fOv+W)In2XDP0l6Fh71NxW0+k+iG;Zw@5@CkhrE^Sc#?eIW=@5AvC1@I*c z5Ap4hN1e|%-SO!3J2^6+H6*{jpGVb>`-HG+aq@Pn-gj(xo#D_piuT@@QI79oqH|hyCq~DaQPiNddZJ$*UlenKTOLwWcS|w$HK0h9J)n6 zLpDWc;dLIyML%c4`|54JO9yoBy4RIe$#0!)cXB`e4l4C5@3ls6(MBc~zW{z8HF^i` z8_(KY`1>@ETS|@Phc_gA)Uc^d8#`f`=)WdeU!l}9GK!P}n@t z91--YFMm-P$G0g>ev8p(NeH8hxH@UQapTEZvwk1NTx2f6zGc|7IQ@VRWKmB~iNLlx=b2WRFsza@xUH|uGB zVkjEzZwS84w_Z+R)5GF^{Ub&@!mKNOzMS#wIL|%w+Ui63^_t+Zvopm%jLQ7HKc}~d zC+$BNkeiiQRIy9)c3jXOJMVgyQtn=sg!H_+HU`;8{9h&4eacJulEipSX4|JBZ|yU+ z%|1~bM#r8Hx~B0)e-)azT~$EuESo^yG8T}coMV~Vp4neVq`yR%xn1e%;icY$yXsj; zcD8+x7z>B>y9!pGqb+_I!wC4HIzH*6ts<%&1aqW z4PHOmZ9KXcQx?-YI==?pI&5mGbj76bU=l%5VSm&;Qf{>q!0aU-zVZ z^55#ea;*R1zyF_bKfJ-_iOv7{e)#+?GTd;|%N*Z*Jl!z*uA+uXJJ|K1Nzy&?X8f&1Yr6)D@k|L^XDzg?~9uk=6Tet0m2 zSn4$X)@Rf#)!s{fm-JEtf5R5{5|@M9erWfh-?%XxwdH?D)r*_N!TWDKaLc#vr2T7@ z|9e0E%EdJ0S&1mW|8txA@^Alp-cRq&vzbqu?>OK8`wjowoaHzF&-b!}zfS$X?fvvu z5Od@P;(*K{^T;MTC&Uf$0Dm@jEshZfz6wM_kO-t7i2*m+anWt1i$l_o3}h$W9$Xe8 zME3;u6!#4G8;8&YAW49q1$6Z(&^E~VuUC}q|Kqd&y4UJY77-T&hkJ!E;=B+R96N3k zjvL2|+aoRY3Ivw13ToGc3Gr^ex z+X8oV_3l!zq}?9yi4eB4|9Rj4d%5CvV&I>!9k^Y|P6B(XuwAxDxmc;lQ?V+MCb3$P zHnERVw`KZ7K8p>D%!tj3AjDCT?_yITi(+e}gJf8wBV`DL14Ide0&$CUx{M4#g{V%@ zCYll~h<6G0#H$2r;(dY(kxcL;HV`_A{L*vnY=^pQxy~kf^M%ZYk<4j;e;KW=qS-dW*)0hl-|&bE>AQ7D+3~R!Se1t&=_}n<82&o+tWDyk4|V z{IO`aI8KaHf?aH<1e4e{iDv1uvK`U}vKz(rNN|Y}BzVOnBm~4{B#2__62f9i5>jGX z5^`cX5{hEF5(Z-TC2YjPBwWQ(CA`G4B>ad~;zuRiB|dGLquOsk5nDkot(k(R(loRK2S zj7r(aEJ=CG%uBh*Y>-ZnNhK5#D+!InKPo<|nxcB*`=uLX2+}n&%F?f74oW|liIo@QIciT9$j;)~Mmva`|-vJ5hzvNSS&vg|T3vZ`W6 z5;w$rB+SH|Bur`>DWw3*;K7H16vzCOf4qq0Y93CH@72Y}X zpEEmV-I(?DtUI%=&H825%d=jaH6dhX$dr)hL#Bni7;*06Zt4$HdqX+Itxz%XQ>dKyHP|xb z0&$1vCVnNpCHSOUuy?R0K@fh#bHo&49&sV$pCPv7MAC(Pmh>j4lUss!1;0Y9CSr(G z;$0$_*d9<2urIhIpbBWcXMGlI9l#B^KbfPF2J9ryGk20l$-=Pjf)C?Ad*OFTW{E=_ z1FTeI0wk&@1B%1;g;j=q9&jqaA>^kp3hTK5?~qvmWI#ZG1F+YH9S{3Bj5X!wfVCm) z=~n};2k@qB40%6bML=|br|Q*!%&@#L9P0Rd79yH*7LnUEt2g9N0WPZb0TWa?0deGR ztm4Z~SDa=t7UG)!rqgXFEuOu9_yTAFqY&*cGd9U7Yf+5X7)x|S)%MEU zoGQ^Ck8&ffY^eN2hL)VJ`(?UJ#&e9>X!#5Fa7UIC%ax_XZp~oqbov&1^@q&e%xDW# zb)RtE-oJ^FZ)nivPkV%V{EvsTN3q8^k5Z2&kJBFh9$$C_d3@q=-s2x0EzU16UY3_T zMa!2ls^#aM=D5Vj;}|F8T}}(&KOBBHF|Ny9o&O`RV7#H2>%7?IuDqJ@reeNxA$IU| zoL%rsG*gijkC{qc2aZQNiK5I_?@drom^pP0Wx06X)R%Pm zYg1!&In_p)j+^?vuAVh@vo7B@wZ!1x;8`zes1A}Bo3zo=#Yd+$P5pH0=d>-VZDcDZ zMn+%sWQ=8aGkh51@k0$07!w&!F_InA95WrW9djKwJ8p3-a@^rq>{#ZwT(Ls2Qn5<0 zMvOIjwO@bV_l`aLRVNuXvzfIdPo?P9i6%lf9F|$<@ij$;-*t$=_*`Q-D*D zQ-~AkG{Y&vX^zuer}<6`ofbK%7}Tl^*R9FtvBFeKL6>kkMgICHc=e6)o@!EKod8_!@{5Jj-{&oIM z{sX>3Fhej`utKm#kSIvO?{Jq0+5}yKD}w8S`vR7gz$(Bh$cnU@VKv8UzE!kUqSbvX zk+sx1&$__6+`7{Gh;@_oDeH6A_pJp&S7ElW2*1aEMA#xcEo>8>6P_1#3G+l;MSNGRuyM8Vu$f_#Vv}K0 zZqs1XVspiYD~XWIl|)NcNLEP_B`J~&Nr|LX(jqx6IVU+UxgxnPxhc6Vxi5Jj*(t4& z_DHYecbi>py=?t$18i5=uEZ}jC)%di*4Q4gZL&RQd*1f8?S0z^wjOq*-F&-+c8l$@ z?egqO>`vL8v%6w<-;O2Y$^Kz*E4}z%#+mheEITMU-9vFQsaRPx0HK@1bpNXe!c;p<9sd3f+gaD)eZmL1>t~ zm_ZZcJ01R$p`V4G4ZT2X7XLH!tXC}CpFN2kz+S@+Vu!Fv_6&9edk%Xpdp>(1dlCDq z@UHN0!h6F19ez9f$M6T?77>C7n+W>|=LnC8aS{FzPe%krghtGW_(Q}g_F{H4`#Sq3 z`!@S7`#$>tn`N<_&9x9%tYEKXuVN>%Q`i~oY<3>IfL+Ai$u41+vdh_(>>BnFw#Y(i z(ZFtEx3EvM+t}yW=h(M$ z8T+WZ7P`Oc9_{{?`wI8>-PgFUch7LoaW8P+?q1@)-~B1?sovAQ=Xk&9{i=72_X_V1 zytBLuymxu;_pbI{?_EFszAuAO>3+(+!Cj>M-2J-yVfU-y&m% zcjYt6CzSJ*EM~#ExqdnV|?ZNid&0>&l{*1FX!GDVX zH2<0Y&-=gV|BC-o|M&dY`ltGD^xxvY%m2E6jsM&J_#HZZY&|S%EKhSQEk%|YJOQ=W zU>Cyi%s*#6M<^1`v3bDbiZg5%+sxqQ+3XZ61X8<1%SzsTp|5O)<$24ULV9j43vTlg zc?$(|1UJQ`|lJj-v zd(J!;2Ny4w$u40odCEP?Bgz-$0_ThJN~bo9^A?vadMs{Q+_t!Dao^&B1&hPw2sk2+ zlw;3Pa9lZF9AAzlW|CVu@anmNW_#7BlH}2#(t73OZepZx=eWAH(~rP->Y8!6Q1*# z=X22a6`vTNcYV^w*ZY3!_1Y8r{0qmQ^8JVZYM)e}FMV%&edAj;{+`#$CvtsGIJY~0 zt&NG}JIJqeN zoo{-uJh#ieoEw};&gY%4IscC{+ePZ4ba~Qcn#%^|PURtGi?U7GrR-7ORz6S)JZ5;z z^;qN)>#@=!(Id?x+hemwk;g%g8V`HtRkjbT&)b&RE)?D5Ug7!M``e2Ii|uCc1%lgF z=fsO8Mbh(9fvv0EN+C;BDViZ(ERC>RDU(_r;bjQVi3+5rWJd(6L@82*t(SF^8zs+(RFUbt)8oM^x9NW|U z5Ua~JJ0&b}fK8F@b-PpiJi#iVzi6?@UJ@cHx0}l=m)y0yZCPaFD_JD1v5U3!wO%P) zXnUUB(4#!q@b| zWx3@|%lX0wHg_cvwu|f*@uawJnPk;sy+%aZ6xpqjos(Uc1@Z1$mkMv%J`i+S-L*=w zUM^}7#fr0SCP@k;mu;6zxps+mQeFtpi(f9f3m>jl*;aF{YlK}kUg8kTM1Hj3w4lg} z6fY7lmt;$#?RxC)+D($pw@kE|Yu9F1W2LZMWf?2T5Y%84r$lYyRZ@kWmwk_Qsa*hX zk}yOl6-9{Vh|9&kHX=!gtj3aSeZ(%-vQjWfbj3E-s=;c8aFV#mPQhdGiv;JbJ%o#e zcZCt+Ch<+UYAzddD;3}WmqoaQ+sg@(ks?f>At0hxJMje6KxY~ zv&QCu-A$Vn68xs96u+-%OZ5xv0_><9zojjkFIy;UlKI=6wp(bq#xl=x4sRi^h&P8H z%U{8-ZVnZ^=a$t)(eHMq99SMs7Z8LG*>*yW{%B#o4Ga%Z5G)q zwpnSj%4VlcjZGV7AV@+==1bN{+9WI~OBySc+WOiqvR!OjYFlp0vJ=={w)2n$$#z;P z9eRKc*ttEHrIvFnvn?AeBY4rk5X6t*NAqj=Eqty(D)1MC2)wNPtrl6Wv8uE>WpxCY zP6L&|da?C#>y_3!t*=;1h4w;UT#q(jW)_L&17!+u+S^P> z@qMw#Mqm?Ua|CF6Y+NOiBy)gvl60Z8O=@rJ0kov;eA^koywG+oa4!e$9$S06Id;qK z8i4+RomA!_^T!ynW&ZZZ>}&0>*$cRnxB=Xy4x1gU9ToPz_SCq3ug@j!-Qd0(`~1} zqFSPQQx&ILtx8g*tMXObaM!L;Rj6uJ^{P)%{yVr`bph$us(&H7ldnmSlC9cIx~&7$cji>3w^O&_y9 zW_<)Y1v&xx9MlTBsHe*;ny#{F>Soc@%j#ua*Hdy>a@hAQnr^UYvSM4Y*M_atJ-aZ* z?Qu$%STx;Z-DBMa{S2Dt&SJCJ|6%=y^(%Iy$y#Y!~XkjNRz6*`?5BzspgV<1WoEr(FK-(&eIcx#{vB7nZBU z)!x;~)!lW1>(j0(*IBN!U0-sIa*cL<$Mv9Vqw8tcv#wvcUUt3VdfS!h#&xrDQ@FXg z`MW*k_KaJw8|gOF?GJ8|Zu8y#;`XZB61P~lx845gmf*I=Ey*p*EzfO>+jh57w*zi< zZVhfH-9B+^b!&6`((R(#*KYrI`^k;r&T$vGi{0(qUEMw1$GJ~&pW*(T`;@TYuy?~w zhqZ@Y4EtwTPuPvH&&Pg=adhiOveRWZ#!;ag$rmmi7{@<#Bl*$g7mUSHHyR2RjmUt7 zMsWxTuDJEW_br|GcfyVPKWly_^)N4)D+*B!3Zn6_gKcipDA6YfsaJ*SVK z{)6k!t~PEmw=r%$ZmV3^x|X=^a}9J2aUJXG>pIuk1ZP;I<|C7+}N$~ zv~#uWSw#c7Ndi&GYholGUn-@*9ft%{MT zzLkzMEJ%yBjJ5b(bz87E6O))H*-eS@8HjAbeESln3G`-KF=>rx` zYgja?Sv0L@(Ui)fDT75*7Ap(qf*jT+JvsP0_+wM{_Xef8rMb}|QsdoYvhG=MCL@cn zk&%lh#`$>fScqrCJMh$6!`O|ti~DqM9xE7CjA}+LqYm>}kC{BdSY@#WtAm=s6pKpS zPoB0oXVGPG#p1ffa?VQ58jc62hV$RLgDvN5jL64x7kjpXJvYLY{pW~95gu$WJPUX| zA~xckh?Nl^MkGcI|9ppzf$38os>Sq44^=mP+C$apCq7gOzm3XhVf>x(0r@w^r;G@! z;pG-{EaqCww^(Sg!eXUvP1ABirPRBGr3~sV@G`syj$^!wHwce2BVRLa>s+j4Cg8oo zT4o|MnVH7SWM(sSnVXqgm_^JT%woK6C`DTt^B}&{QNyfb9>cq0HjB$zWN{krVmtBf z_$I#P!Dm^sC}T>-!%w$=?>6cfdk#koehC=I${ZXEo3OssSktLEZdPFJM`PVD#IZ9S z$6X|js~8+7@vH(|d!1z!LXXmCFfw$A=O7(SAHO%P*Jm(dAQP{XHp~g7Pk(5A21AV& z+CP468vZGLN+J@eLBAK}hyBy|84Pp$=Kg8?`0Z_2FpNI~N2_7{lz(&mhsUo6jO^j~ zJ&OK^jtP!y9d|o^=J>6nSneoym5-78>fUqF9`Y0giXz2MMTw$RQLd;|)F_T98Wc^6 z7R4#WX+@jjoZ`HqOL19oMbV?UuDGeVt+=Zg?>!T%dYb$w>j>)>ZW~u*cUf?qdz%+xeZI7K#0N3;8qjcd87=1MXce z*AkC(Ef-oYvW&J|Zn*+?tSc>#a2DC;Sr%9pSst-`-oAlTV%cK3!2X*%IwSRyCe}-5mr|?pWE+rSZKA_s)w`ED#a?pD$lCK>L%wpr_`#_zTB$G zss(q@Emr4n58Y#R+3Jebb=*ncwt8U2vQ}7oSWmK^VSU1$v<|SIV?EzG*1E-hg>|&` zBJ10nRo02t8P;p8?{bQ)ORPV$Z?k3zFI%&?*R3CL?sHCAp0?x)Z(3JMqPf()xI*YJ z^b&q!&*hTB0O4HWLg97$MZySSv{1l}6)qR95Uvq^XP+Vzar1=#V_zVYa!Z7jxO;CB z-m}lKe_(%E$ac6cye+&Ud>|BwTt!lmy~so4CE_^a*wF%;eaNlz9vhl~01d_ZzGTtI(SItbNwX&k{ObP+}#fQ9Tssb92QAx9AYIa@jT+F!*Pc^ zNwY(dq}_fow?=YA63cCn1PD$!{N3Ta{UyxzWyxLJ<#<5Cm5QV!Pb#&SDx@CLFC1KP zBN-$Ok@`wW>3lqY36Mre=Sb&DI~@M$(B-g#yF$8Bx<>jRheYXBhn3t_T&=@Rhc(<1 zJo_t`R!SSBN2D#%COiu{B|R-YCr#vbNiR!NxHs{h?MH_PQkHE7S7h77`Ne_dn9a@O z2H_dWa=dl3bj-6Yu&uOhu$4HzW`D}I#kS4%4f`(Y$%&(rqnF(zyC6Gv#}K<%yOnmU z>{i&N*k#y_bu6$e;O?~Zbu8kZw>u@cX*au}bN4O2LxsDCo7ad=6jB>mzYvSIP-IqO(aqUI+_V#Z& z4&19Ar*38V@GNJB9bn^+#qM~WxY8uGe-%*Xt2bRU60 zXkj7b3eDzI_=ulDk<<36)Plo-LF-2}`gr1cC>;Irgj;J}Q7G)+K3GFo9s%H>gQOdW zF!*~kn|K{y?h&TF-w2aQ9na9T9!i@MHLgUeMAwFrAEceq!Dj$m;UJR3HVxDtMV$g~ z^5K}22Q3bDK#tIEjbDSp$6!)dHrA;s{jt`G8EOyZ!}mTUZrafA-_SUyt%3e640q+o zp)j!9U~3e)-ajQtSwSSI((sB8$>`#zM=_}G0DuPclskMz@;4kB3bW3PLCE0W%%xey zAZd~tluVi)p=hRURvFR=eKNM7&q0*R=+p+YM+K1j=mKe|P*oFQvr2zE4Z`d^Xs*^T zIk>)|d-z_1)Sx-73e^2*`wOP>#%|Nr{_>zY{k@M+Fc{Ls@)7hNQ50^dA>%_S8jc3K zWrU$VqNl;djsDHN(EtWld7M@=;{y#)N4<5BZ;Xd1c~mV6dqVNRU1ut5ceag>Gu_6BT3Tz zqZAv`nC?p+gZHkA9lU*n){zE1a{urS9-h+S(mAIW8O|1ffxWiocCjWxNEo;{cub?=nd&RsP!}2wKkle!TU_2GemK4J^JV#qHh$< z#tBBL|Ab*2IR;OC&@&2SW+JqrNov;n=oK2qqv`2Krw2dkA@qYb^=7g#Oq)&0G(yOs zVAA|ZMM@b8zsZK_G!Bh~0@*)M9dvz-!mG!xgJLL~2|r4OcJoMK7$~fJ5N6VdW5lGU zdlWT7oxwML@Ys!^yR#kaP~%&Qs1KKV8mD_4XClNc$}p*!75VhDJW7==QLn-1X9#Sz zpeRFMrdsH_8D3O${vIJ2aRvrBK*T7(W_y@1tn^s$n2aI{jfplLYn_CyRcA(LjMmcY znrIALggDi2s{4PY%pN$sqk=(QO%5w)wnm1H#ArK*cK7>7aY#%iAO@8&=^wUee6D6J z4QlYQ8;5m2s?OgMR%(41X@EPkwK1SiR~=H5>RlCEl+jRLl(8zd%QxsWl~Z+{-s2~f z$C0#0mKfZ^$Vd6;BR#6+K*OL!u|4WF^w377KeUj++K>_>?Z<;h$h6fk_oi*bmWRYL zSjW(oMn4Bb+ZepZ6vxOCrqbpshw8!mJ>7}J5G86&8p=A`{p!?AKwnp<&o$Ht`@07g z@Wh|$99m$Y!Xwvprga!cNFLd;L1CET8AJx=1ECD;H?0pBK2tff@&E^>eN>le{l8cq zrK=I~JcM_^@J3txeTMqqj~{gqnY^B7-2txQvVpt z*Ia+|XbNzr^Z2N4O0J2jE^7&lNCr_~MXm&oJ}<+bdSs*mMs>aNYIa_>$sZx z4J!}NPcV9Hwn(WDqkm3xRXp)A+et^Wn9XH$W(*0s3`Jc|)y>6!-`XgSCu`&F^h2e` z2cuhyI`#eo@4r)^zGX7}2T-UlFi{^0)$qc`UcKn(+qQu6KhweQwfab_DAyCf(*m zsGB#8qDHywzjzs?0ZPaCV15)%h7mDC{22IQS_el5soxJ>Gqc^__xly7DCn+%Xp7hMq-odsD>7ew@rokW4oGwz72EB$ylpk4uc28RzS$cR03Kk_X z+!PLPVTfMci1kZjMC0^`sH1!cYY#OWHH2`V74_*Oz!}!)L!CzZROz8^ zH0UJ;Wc}?FvcVMxGxl&BZI|*xThi5kzcrwPre9bOJO5o;MjpN4pr_uu8p{3oZ^J-` z>+x;qr*$X;gRY37ga>J-%n#E1Tbcxqzc_$}x?lS(-u1es!!q0g>O+a~>Py4>p@bfm z(EX2x-*A)HzpTs)4?BAFmd8i+|69$6ZgEF!Ff4*c%&FOUL=}_eGhiJJs2XNkXMdm< zL#H9vgBU1AEmdO|T{NgXc1{@_plmVleoXIlVDqr`$I&qu9C(9hXdi7pP=BQQz$bp@ zhwbn+Dt5z5(7mQH9w7gafq@1G)(7b8t40qd2Z*lE*fVJ9@plG2utBYkw(&8%(*qvb z!Qk;RK5;bbhnZpPrk#41gEX0e8Q5=Hf0VMps8NS*G1iAKJ*+>NJT-oU1L(yQvP#9)rPDUdSwDn$}mNt)BVc#I(fBe<#qb?#H&8LHWGT`~~$o<{2hskFs;ksE?W{ zX_*xL!j$2!SWd@Z;)!Qb@{~T62kZ0ICiT(H8xMciXfOVzB!#;Je;4xijxC2hS{%mF z@>#m^uzgr`n_&eTCCp2Pekw1*-^}b{-DfHA_tL3)1$zOzlNrPQR97=f@^q`+SRbnN zHT!Ee@2NZN1h&wE_tZf8=%JQ@5+l_O@g8eI$B8=HOAs@PTG+uBhNC}&agIH&d!B_~ zcW}2~cPQg)b|_<+MKZL8-yL^Y?0^j_H7D~34qp>vZ46GIep6?0#^S^`cfR@Mn;qZO zLC!Fq(dO4IlDo6Iv63ym#tc#Gx1*cVG$^czils+afdw|h4PG~J4Si^sjg(48Pk#@FVrfO;mC93;g4YPc-DFn zAg5V?oFZe7p=Cg>vtZgrSrC}|8lepL13wr6km)TyrN_YYv52%tu+UiO>>EAO{tP&c zx#?KY3TxKpNJ0@Gvla>l*0D(|WerE#LqvP0c~0o$%k+~i8hL! z)urY!eyY`i$qD4damuhQ%ej$UU2Jtxr>?FZromgyU10o8aj(lp+=8WKNq@I9TI5JZ2S`~sn!@>s<#N=#_{+21D1YF&(f`Qi$Nlkp|R|=l<+7k z;aGpBWQwA{OpT6?3yw@vX+v4J{sxSn)-a63koVghBF^So25DN`)CT2QhstdJsd4sW z(apb3Zcxky?0Tz)s11UPntP)(ZBgfiii=JUsczL7@EUTxtWMj|Hk#aYq?9~eH*M8f zrq@5^yB`T;bV%r&r=NcVdYv5Ri6%9#p4xqA(v73PW@y#r)bVe+{tf!3IV|f@8pcQW z(lw)9V=L80x0|+6WrL2fY_Ms}X&uN?v#g6gJ#IP@Xs07G$oS3e_xl)T{03iiZW;-? z3{*M<5ATykUqj6aA6V)%0`I*{=h9`ZkHsPzvuasryUy{Uw8xA-|>X!SxHs z#NY2)4rH{8v?3nko`^4&izkZ1S%i22D^k3G9VLzv^Y9EvEiM$tu*$^s;sjP8qgC83 zuH$G$l>9xh#Ky;FBBUb4QDVZTld-_&4Cf4|P)teJapG*!ZLV<&ZK`crZMtpl*$}W( zFHX0iS|k#xW$01)NQUkkeGeg7Ac>KvB|bKVk}^rNq*HQB!j~$gzi>mAoe4u}WO)963nCagb$#{Gkr6>tgHulgZqc&aQF%|%295@}U0oQ}u!CE`YK2tVP z7A4D-HOp?vl=hMK1M6!0YWr?`i38yf=b&+DcNkb_I!?sjM$N_VvfXl2;&-bC)+tnK zd9}P#PVFpA1%+w}cY$5Cd<}P^VkftW8=**0lquR3RR2B2*W5U}JKS`;GKDXGvogbp z9#y@QAr_Rr&{6~J=bTv1lbq@PD1FXDbf$kZ*0SAh_BX4X&#}v$DZP4Ut+T|1vLEOY zY*}w7<7n-)&hznCo2QpT#>J6w%f-jlptTC6BM({2b1ipm>6bCc8uQKpeFDZudQZq{-&ES~Ka@?l5%~GV zP)4L%lv|ve+AY^j<5uI=VcFt#4!?5}Cnnrl@z>`Q2K3+1_lM$HHecMyh+*Hu4rbWB z3dNnwGM!a=4>jV$7~M>3BbT}O``HU5({V2y%}e1)Y#bSTdDL!66W^T>W8cIxMn^`R zSm{pLD-;L1)4!ZR)xzCBr-PVzjpwA=4x$aug0*NEA^TmadP(~ESQ0Ct3-sye| z79APaczk6wc1ymJ!#7~Or`vm}UE0t>o&S}}NTpg?uhc5#9^oDd9%UY#9(>P0<}_ z&sNWSo`hIA#)Tg^Cfz1-OfWwNzqS#>E*tYQADAWgMA*I2zgpkFqrd+|f4{+(d2TY7 z##tS-^ziI4@hd+Qy~4esyb`=}y~@0ry*j;adAZ_ut`_09S$7JW1eXO51g=&B?@8VZ zy%W95z0Y~y_x2bUF>b}UqH&}39HRThteyCq-gSbOS=6~Kffd6}XSLftjt=n% zYmnYQ9yble?ttCZr$dzPL)kEWKhP~!OIyVR&bO2d{T{*SX8|kSM&ncOGw^)yxOMZp z9NqJM%B${LiLz;&SM!x7^PcQI&pX~b-@6XK4|B&`Hg58`dE?^8<>OZ%JI37^C-a$% z-)D^X$@i)AG1~b3O4JV7?n7asV`Gl)@oI)EJ;x_Ouxy~Q-Hwb7pF2J>U&z?j-`p(m`$&)9~n;btme{$XAj>&f>%K|0` z%nOJQ$PcIsXnlqm*b(5!xDz0oGI`3pDe+VCr_@d9m~v-|?3u~W%zGyOnfzz!p6Phz z&NH&W$$|3%;{)>p>jFCh?*z(%CI`(6iVw;Ustf7}x)UUOcJj0Ho{fJt|Ji(L-LoCf z-g#Cwb@J4CQ{$)BdFD^8n;IAx85k3&4lE3;4r~qV4!jpA3GxXdf))hD1*HdRf?9)a z1<9W!o{f1n_u2YqyPxGx4V)S?wQy?3)at2srpki-f~N<+92^gNIXEl0!*Xx%iQtal z8^N3qmypRJvqP4ItPaT!sQ`Tn`Wkd6L^y5iwBTv;K+ANLJZ;Ccx@l*?*QWh4EqR(O z)K5pPQ<=dr!R^6;A?YEvLWpU((`wPlH#r>)IPd@V!=C#g~&o7+M zd@=CF`WJ7#xZuytf0itWT2Q?}zA$p3W+DGC#9x~KB6%tBrKp$EU#fno^CjlXJ}*bU zoba;d<@T4EizY6LT9mt}dC{#!%2y&^QNL3CO7|<0SBY1rhsM2{{_2uY&8zjVw!fMj znjETql^GQn6&F<&)g2YSIBN0U(1gXgi^~=_FYa9YY3QxR^4BK5b}jT;X!vVUuO+<3 zA;uEZi6ulbk^5TNYt659zIN-iy#)VtMlL;l9ZH^SeD zdL#FZ<~Ou&NMZtGqGHlxs$)81n6W;w3u4n_>tnUC@;AfZOn9^G&CWOZZw0;;^H$+o zt#93X%V*hwW$DZ6muZ*DmyZp5-2Hwuder_;y-x%6-!&WdMk=Rv!O_?mOhzLLU#_#I z-?txc_c83k=6lZ2wTHb>vV-9>v{4#{^8bnamv07Qrrs-3=jZ8z&OIFws=rfrr*6Rf zDC3A)?qky|Nm#Cw@))_x%a#X9mkjDlXM2g?lG#g^Ey-F^vE8%u=Ie$lg|mqlkq zS42}j&mg^_D+!nSEuFn|+0v|~6-&=7y|GmIhTj`J#%%C1Fuv#TMujei&Ko!05XSh$ z%#K+WlND1Db0+3Sj4;+Oc6RKt*sR!!*fX&=Vuf$|y*c~MWpAEYbz_zA1HTVuf3WO> ztPd(aIP<}c4}>53eK`BWWgljJD1V!HJLc_*56^sf)-BvTe#Y9_3wA}5z64d zqkJduo!P6Gt&V&r@|~e9$GnsKPW?OG@9^V{5)rVP^Ihg&eg2C3u)ik!RrA-@zurPw9v{je;$x8J z#@8e5j_0qOxN^Zt^~$o9?JMuCRK6GfUK}W0Pn!2=s(+8B_V;MgzDE=DeVXL&(=_pY zn!?|wDe8Ti65gjN_kEhm-Yz_06O^DpJw+za6q7)cI)SFbgu;YsJ+&sZ zCUooRUII;$RgzUcpuyj68e5Gq9jZjEqG`dZ1*_sf=^(tzU8Px74{8T#^~C&u`2l{& z`vU?L1Ih)}gStWd4=I|cqXi$*6rK{7Qkc@5qD_&c2Bt=(rl(e?cBV4Ze9|J*64Eqj zt!cN?V0~xtgCfF)Lxsf-KFN)-~#^vMl-9_AFv;%-UN?^7Xmv>(_U$S0|Sx zwN>5d0hi50G#bs08+cOHYo3r^D+HA^i+=qo9N;Wos7`RcgI&gK=>h#r7 z8<}f-)t(GwQ5OXU}Ab= zbz)~CGs!0@GASWRlhm3-tdCjGPo9{(Aeq9VOrc}axzP|2Lo}EElvm8HSX|j%Nss-br-morsx0icK~*j6h^mEE6|2t- z*nLf}Ck88rGH$FEu8FORt)iYct*XkX@>?@|&9XIqYqHiJKyL@f-+RC+*PHdHL)tR+aELzw>@E=iiW39o?8R#@rov!Mts&Ug+-LDcHYHV$Pho#x&?>)*YS9B)`c>buTvk&URQRga$WnOwsrRo-CU=v4zG>^QJYvU zs0`Gsr_Som>RWok&xO}0^%Ph`Q)CTIF*P))YiKI0DXggmwSu}q_w*#GrOBt3CZd+6 z1+_HA)zXw+OOvLSrutf%+G}aj*3!g0Oq2XDO%o5(6n>bdsKZf*sogN)Fip9Ka}U>p zxZxHw)ug(HDk^HHtH?Skx>Q7ctF%?^K6C2^dp=05hWk}5Zh}LYkwcI3 zgr=xUaj3j%ab0Xxx%1=buc}&6mr<2iCsg~X+kIxMXRDW~v(y#pGwK^^VWMB+?8Ie> zS&0>iXA*BD3X}YjW+yF6%1Ww8I+JuGNx0r`{p|HO)XUaqt)HD(vHr~Z8|#J1e#x_w zmnCN<3zI9rXFxYV!j##`ekrq4{8E-7%>q?`&VXj8%vRq>5vGPR{8DG9E=$bVpvdbXech z|J@zxdpr34j_!L-REfvqqs2gmZ}{-dC)hJ3L%%WCeP77%Ju!nl zDmQ%J2qmL5RWjH!Z#C8&t@T7<81M}dqm-ef+q3Am&$xy)B}#&-8*Lzb+f6wRDk2juB2K6kRnz4zxcQMr4 zWvUj3cOBF_l2FD_&(cE~)H@OLH_~X+y;m7Z=fC~To{9mUzUbc#P~$MZEgyV5)Vrz2 zd!JzH$2g~m7ratr9)rjC^S|+~<8fo~|FAvY+WEgVZtV@)25Rjx8|m+b$Qvg%hBx}y zO;kiRCN$VtaGc;Tqo|h9JZqxyYYP! zzH(&!|L1e)`S`ytwzz)jv@_3MG{Z98Cv--gP;LPC6I*Yo2 z-{?17tBxwC?(rgV$A<3+9PY-Q+=AMK!`fOV?x`jozE_iudoLf{ceU0?YL&R}Q{%pl zzFJJs5x=^gz*i)l@qKck0!EdaZ_SbNmEPHl_u6nkCWud#U~R_ zmYi%kdF3SQBae^Bj~0KF_)*D6EgxO^h}EoY#<$a0WzkX1)c?hN^nE^|S-T{+nXoHs zZiR(Mr|#x^&61YU=@BgnE!8c?Xbvp3x7=!xd_3{v$dBVb&i%OheeaAXA?h* z{4DOX+|Q~%Yya%lXOh27{F}i~)Zf*A*Zh56X7k^>|IYke`8n}<)aUBYHJ>+s9-rC$ zIrEJ23~?quGwO``OztOjnVK`rXS&ZY+mvk`nM7Muo4QTY*4%dMv+g$LS>;*cY}8rx zSCG)F594NC)%Uh)$N-0=JxJ(<~ij#;#|}@ z^*Ifw`CRuo=9kJZi7%tRRDY@YviZyIFPUE{zaqYh`bzzk=Bwtfy1$ydf!U$#AUfhc zj_Oc%%-ayZLDSLP(cQs3uRKqj4|R_^uLk9B(422R-+i8Wp>Bin0&xND7t|Lt7n(10 zUtnJB*r2?4X9ICD>Z1Ch=3?{3?u*P$Whc=Y)v4~3WobH_JG(oXUCOS>Swz>otoW>` zE;UHgm7i6Y)!fzH#k{1vL|lrxq`suN)O@M?67wG&S;~J9|A_jB8m#$8^FO-(!TehJ zHSu-S*Xpk|UpIf<{WbHl@-lJxPFB=q^<~ZF=F8oeW!cPsGJBLgL{C(Yx<}J9d1G@= zcMr2y*-P|B_0HR{Ip;eNlbtK22Y9U){#;zK)GdZK%6aOK79C zcQ&fE8m%m6a!#|hTg$wzyiS0kuB)$Wt~X!rzRvts`R%+M;@kL~sBiOg)Zf6m4do5uMqO^yjgH(qx#}C5 z8_hSmZ!m8vZ_4r}=grFtbti7d=SAIA-_+d9&uhNfeUtf}@;l^CMC z5ci|*tMAV%(A;mn-+iC?lkz9xr>LLe3)DYpero%3p|IqJB~TqWPuym+oICZ(%-AJ|G@MJy1W;Jeaqo`9b`a z{4I4`x*srqRsKr+8uhFCSIw`@zjkaf97De)XAtg$lJFori7|N3?L~MK;|L$Zml#hx zLHH5=#026=Vj?k#c#3$Mm`nr^Q;27XKq82EmY7Ne6Zpyi5lRpQNvMc0yd|GO%p_(J z;Y0-S9PtNYHZg~Ip7prQ|33$WN-tPcz9+H<72Z$x}JxsRQKSO31$* zC0ldI)?BhRk8Iscw&s(qg=FhCvUNMzx{GYpkgdDP*1cqFDcQQ8Y%L>O%gNRQWNQW4 zT1B=VB3rA;)*7<4mTWytw$_oY$H>-tvbB*sttL+=lBbi%)9K{t4Dxg)d3pnRI*UA= zL!QnhPv?=R^U2dY$kV&X)AeLqF4>kxwrwKYHj{1nWLp8*wuNllO12e}ZAE0;HnMFy z*|vjh+ex`Wp%*OQ&eWM>N5nM!u1k)8O?Ne0^w<8BmZ`3!pbpr4)8bQ&d;# zG^&5CQ-c%1Y2b8l1~?PE0h|TS25$uCfOEll;LYHCZ~=IW>R*YllUM@Y4c-IZ3oZrk z1Mdfyfy==Mz!l&sa5cCVTn9c1t_L@QPk>LV{*?q=NlD=K;1n?MB>`I!uq6Ro60ju! zTN1D(0aFt2By9z61MdXy0vCgUEeY6?fGr8wl7KA<*ph%P3D}Z=EeY6?fGz1D82FNa zFX<2%7?Wziz?lSWNyk8ZRe_jS?oj>f5U^KcJcr@y2;$lRxrSq^e;vnoP99fX#r#}d zw-sEkx~fi5T}>=dUB#HLVvSzKTwhJwr@ER^th%~E4L+>8npLQ}x-lP&JSS6iHTQt( z>Sl2M4zLD{@|G=N*xOpCx?0qvy1Fe@b+r^a`$|<;%PPS~R9DMuR96qys;*XLtFG2k zTme3&x>^VS$JT-2?^qHz9h?D%uVYzY_&o+Y$M%Dva}0Kl!QL_G9)r(gC%`9FSL>l) z57~O)YQQ)elED~X!v^qXFvird2Mjz74XUe+@Y#sIMzkG=?(tmJ)f13uLVFYRn&7_) zvQ3TPld5Z2+t=0|P+e0usIDazs;*(ZTuUkf?^9h{Uk-*0j_qs7$>1#TX7C>HUNB^m z_k+v8u#sE=KB~Hw0{Il!O@Ta)w`(c+-~#X#FnpvyKLzqB2f=k<=%l8DH-NW;cY=$- z=u3mGv?OpU82V{D!0?v_ylIW9Yw0Oq_(`t;!%hb5WNZWP2G@cQtFC22Hxuodz>*2u zned+p+nM!X*x7)wZGfE(z_|fFHemc4j)7r+1IC}F2CoN0E(>0m07UZ&kHw$>O z4uRn>3wE(IL<~0~4jZe$)nMr707njFb1jn%4L-MH-nOH@9hkRcj5{+`*LG!t zAy*8H#lT&R*lS=O5d z$F+mNaIi^rtpahW0R9T}RRUur=CBg=D$Ge0Y*azF3b?9ZvkGyp!n_>v_HO5|p7}Ubpvry?WTFhyMo1Hz0Nmz}bNLYs5Ni zMBEzlz?;DE--viLLa!0_jw5ckX1I17eaGSR1aO@|`2;YWpz82*0ys~=9`=N5O<0#r zh)WaZpb33V6{>3|F`knc-$}HeL|jkSt9o#L>shy5)uXOc^(3mnn^iqYso=Ku<~)xJK23Bt5yo1S3x@w9 z)VHO8p}&nP!}fN>V>@KFLmtOr&vwLQJL0?@wGLL{(2I@a==lew6paW;yx}AU^Z!$AsfBDUVpI#?xW?-_44uOm*I~#X#$40^dmZMc4mj)Jw+`{a zHDAwB_&JJsI*RtAz;X=bW092 zaHXm@WxJ{u*R#E;IjUZ)=U%Mm-n9MTaxiSA)q#(I8^I@4z3Hi7$fd(pI%LyJ!0?^1 z4xA4@2(D7~W}=RD-n#*IaK7oyYEboNuLnav8@{tM!F$0qs@{#jk8?_I4%)H4dvhU^ z3tU*^y}8w@-aO#VLtoxjRqrN@aTEGBm8yC-LuWJEHtz!O0R#7DjD0g~ZmtC*2AhF< zGvbsFy!r5#kNyJqF33~$V$Jt%#aOoP0K-OMA{agkG2TMNt_bld!kD+gC(bp!+jfKZ zfzgh&-@9E626mixdUs&FJ0OR1Pw!61?1KC**vA_0)gZna#Ij@qI9JuX8*;l*-VJPf z%E5@u9>i)7aN<1DyBA~K3tW2(z`(W_KK26pUSKJO&(bU~Y?f{W154>KFm(69F3vf< z``~LoVpIl9WoRpdTp93|!B08#%MsH9zui*e#O=*6{U?_ua32Ij*U^I^e_L+OfAD^LrdIKMt7_h|dYk-wEJ40lZD^oq#jrGrNMsMdNAy#K@P`7U)nBJUwS1N_HixOmwpUfuj=cPD~3 zf`MuGPB3J5BNn@%w+H_ALT@i{?L~}nkJ?v?_>={GN;NvQ7;zn>Tc(Y22`&=#V zX|=c?)h3-#Y4LnRyMCKWi+xy&dlqeSxk`)s4sFU|l{Pg6ya5dTRLJ4lLYoHr>F|{f zyO~?STUFW(>s8t;_}o~p(&pr=wE0I>+Jbf9OmGDl^{v~%l`3r^+OQt9g>_)qDukUP z_$dPRBG@g0Y!TXvU~5|vxCD&8ZTrFK--iC}sBg#EcBFxU3+Hq#>46kllfC?}88P zd)i&aVED)0r`>f@rNuhZ7AJ$zUku#EkS%UhX>lE{#ra*k8#=iD*6xO#-Bn;<+k9)QgQ&_9?5-V26}gTQ$Zb}EX%s8=H{ z)mv0roV&HPh<_dI9YI`=HmJ16fTJF9!8NS50WuA+)d0B$U~EJz8WFcf%pcCl+D62u z5&F1()gH%~j-wstXf3W`wa0<=IL3~(qCEk<6PTM5z|;i&Cdf5mE}CGwsaSP=`##n6 z9aXC92al?*SLB6#U%b8q$>!};vKL8yCX%fUNQ&1Z*}W6V{)0#=c87hh*|Y~q(S9V` z%8~3#LvnB{lEYBb9Hn}XmWF*_l9EIvyO3GC9lO_|x;x_- zk}L@C&fY{Nz_NQI4D8;Rk0iGONfDgyF4>2qJPXMI;M-ku9LZte+ufLpw`LuZ+8iWJDPiB2rb4bX4Ph!xPeqamd!-wi zkZhtlHUnR20oA(`21<7VTIoU9E2W^7)?(15bue0b9APhQLYVd?0q(wyh}FJAXzVM& z*!JxOpnWy4vabP1E`2d5ETqK z>Lnv4KoL|_6ak5n6$4&#Lc}aa%wlBBI)+!Ls*Z21-McW4H}8G>TW9U_?-T3P>8k4P zx|h4gWji8?-Hu37upQCFWXDcYrX4xEjLQ-ONY05tq{NBAB!k3I5-Kr#9U<#TlZh$m z#$`!n{L+Yy`>GzQIH6#NAX^^@! zXpl76PLgIzM#hry5XpF)Wb7@ONs`$@$=pUVA0?SPN#@>?g@t4>M6$4xEJjHdW2B*y zG<2vm)Jn1(B3aIqtR%_GNU}1PtZXH#QIgeYY1j~H*i32IEXl@PvaywH93isvQ{AL#k~Gahn&v7^Bj?_d<0xtR zbZNS?G~HF2?k3G}ker<*=b4hTyW~7ia$X?043=C*NiL%$7bnTZRdR8YTs$S$nUbrU zk^=#irj zIr@@AU&Bb7*!AmYU}RumU}Q8)!^m{-7$Y-tZzD4s2O|p$3nR;s#zvNhb{Sa_nH7;) z6($tQ^_&c$l+AJ(G-U{MpJvuB8QjJR0mh1 zsczcj&@q}ua2i3!IZj5?r#q9w)yRqHXOQ^L&dx?IB%TX7cOiBz#Lk7Z={n2F$d%;b z=ImzGF0j3U?G0>iVD*6216B{%KEUHvJ6Ow@zo^oNCJ-}@JIrWB=ATAk0kI&0*@r{NCJ;! z@JI%`WUxyHyJWCS2D@aiO9s0X2$}-g6p*EWEERlHL6!=#RFI{CEDem)K#>NDG*D!L zA`28*kXjZrnFS_U&`=iGWr1Bb*kyxVHrQo@T{hTdgIzY*WrJM~nB;&-4w&SCNe*ap zK${Cua=|1QOme{_7ff=&Bo|C}fp!0~w*aNaXAln17Jw#UQ zLu7=c0!br;XbD*cglK(1;R`Zfkokhl?`i@N;^qfhKXCIa_6I`j{J_o+?EJybAME_W z&L8aj!Ni}`fDmHm4|V}y7XWqvU>5*(0bmyZCIMg)2--l<27)$_6oQaULclJNTxmi` z&_M7A1dkx_2m);o$bvu?Oon4|2q;1zR0xC$flwh3Dg=x}AXEs13IVqea0?-B*Mo|) zO}dZ|QM&^5rPPno07?TX4We`zrOPQ@LFp<=S5q2FX&9y9gpvhP`WCL9ZTJrG%(9o4Y!}bB)xDjad7NDu|gpvskG&-14 zXpw9R0*y%mnhw#(mKD%tc|bQp>trJYXdLABC=S{sujiCz0nOYBGz%&~UXQw(Xp%Kd z$3#n$GzK&}m{78wm}tSe1{5T)vYBYX(gqYHu(+9M!RkgRJ%^>uL<^QR6D?TR2&Lz+ zsF`TNf@Y!xD;lBn9F{W^Em+D-v|ueGl%A7(v`t`TC0P-wOKERP^(gH_XId1})t?1DB zIy5VwL{4a56J2`Vn@~LypnXmHP&)W-aD=`y`aR@LGF2Fn;wAzA)_BMTq^S?(B66XpkVlL%pUGDxFP3??u=O<`FD4gff2 zNq`EO326p&q!|zb5RR;-5R(81$+8L!k%g6Uv~{w$QXz{;I7pDJuHa7ASH{t1$?|%Y zWJUmlWMPHS1i&%}mKzG!!vUxXSy({`KupLA3w~rN1wR6u107jQfg`Ia0`UWm=*V&k zLI5HJ2r-4Fln7xl1V0jLnVNjONC0u|C0 z{8>x_U`a{^EdZoZ06)Sp9aI<0nGiZnIC7_>z=Tk8NC<$exe$y1=m1FT08~e#kQJE; zX|O=z2PVv&ti2GL0JxJ?7yQV&OMwfSWk~Vbs|iF$fH(k8EiEz*}Jl24-xK{ zm*nRV@GZ&TMPLPkFb3-wY^0DMN-gul85hl9D}#6j$pCldndBdV9P-cfZg4XBM<9*- zGri}t_nyyk(|f+b_k2SLq>^t-5Xd6`DEI}NlJ9AduS*aJA>Ym*u#s_F$agFVmqfm9 zK_G>EGsBd8g8v|Vg(>+Ulzi4=`XDchd?aT2FlyDq%)JCsiO!5X)WWi1M!s+|f_&k` z9ByoP0=9OA6JI>>!;=6!3B;2iJXwY(%kgBzKb)k|fU8il8c#y;Bn(f&=?PCu+x%(* zd8!}}ig4mj{ug9^HG@1?1sD61lj|!$Y7TQ6=Abzt{^YU;nX|Edb*Fi8Ffk@m!h+SD zP;v%kC;u#1TJ5xW?2mP}2P$XN#XQY~>z zCfAv@Av}?-rt$pAS@?G?Iom)+7m-Df zp+j@=i=wjqL>5I`0}nFHSoZu3JT}vKq(|fo+E~rbNZLEe8R;eWAiX4=2alaB7t8P0 zgPd4?zYyfalA4kpMv(735oQPNIN|pZh6E;kB6A|^J44E`nKF<&bdxc}h7=ThQmM~! zWc=d3Yj#o%af=~lBr)Pc@?A-o9OxH_Ae{r$461KQdI*&PGk?Oc(lIm0H;H&l_tzaYDPK-KD3xL55jE0j7U%Ywz9Z19q1NxlQG1VCP8{ip4lGk zTYZ1u2J(0|jLcp#4-?5(^zHkC7AJ~lI*%~BRs4-->(+o zbJ$p;iNsjbI?xWnLX%8*;<*z_MXxyFNzcfrV&j~|hw(xByo-D%jGPdDD_%@k%Lq?8 zLW)Xi2xE5m_w>mc5_cysxvMQ+M=}EV^`Ih>B(zJM;4-4<9|}f9|65PXmPJLRLEpXL z2sx(O(hkuJOQbM2gNZ1d_F)^jRIJ`a#1iy_p7@fUBoh&=yVRZ414N`I5CUc`q?YBt zo;uWU4O7E~N)6Yink5NACGq)HC?-S_ObseY0iIy$I*uSu3oqFTxHGUM4fF&VAH?{~ z10`7zM4lD+zY+X%0!y;No?s66=L9i+*ZPuOTdLH&BagcyPa~KTa3>`PFo@$aj>|c& z@v9s+tWntUXtJI-=_9fk}TBiiMwYp?iNHb&OaRn>R7#n*7ody&hoDz!H za9qnVBF~iF`l=9wJ0Bq2_yFO)2MD)4K)CAx!c7kl?s**30O8gL2sb=HxZeT7?G6y` zc7SlRt3p;qJ{uZYQr9#ZFuMvaUUb=OL^v|2$RvTOML52^!ZP2;nl*JNa2M@EVihuD z$+#v<4w-Z?{u>binSAUX!v$=%!y-inGgz=m%ZKjzMr5AsfU!>kK(n+VHU-Ff#1~s| zBm<57^Q{udie9DKfP&pMsu=(o2xM@9{0t#JK>UFC16c-S1(4N1!hpo(5wat(np6;U zhLG4iLNfBI8G)}+fiDoEFakGYI5TEv#Ll=NA(4<&I3pe=(4+~tnLv{!1%W__he<&& z5Yo5__?kfDCeXMEv}*zZObXKTs+oeZ83ZtccFiDXGl*iw6vWpInluNkImpZ*vN;4b zhs4d9HZ8B31>|A@p)A1I0ur)-coq=P0(>nXAq()efP^d{Aq$9N0a;le1#0Emy!kH~QBPOZ*+D{f1tCC4R(24;4w|%sChZ`U zUBPxBq=DCqep(2j8AEI~BrD1;tcwn+9jo*cq{#2Bn(@{hbCLj?kndxH&?Tj!-&B@Nk60 z9ieeY@O6a79ieeYXx9+}I6}dugRv6?aDsN7AZI6t;=~lh*9n@O0ooZLn*ot$K+qYG z_zb2cb72M~jmw4 zK`1Yn6<$zIFX)>W)N~$ne;#P(L(usUbUp-~54p^TT;@a2`CzgDWD7vH5R4as@j@_O z2vHWowOj}$3z-Q?Xd(D61Yd73_6B2bFo7E~Ayko(SN+hA0(l`&AE0M^3#%UvBo09R z35}xX@tlHWH=G|mKtfeNwu{87ekvSjVHimaDA5v1EC~$+dM4mz^}-0MjiA~{dLGHn zsdhb;tf!Lo)OS7gT~E4Gy>JWFZlT((1#5{Uj!NRFB#zq0QTsS*pGdWdRGUcSXHc6A zYLh`FIn*YH+U%l|JSxefl00gkNA2^@_>vY6Q0)QGp7kkMLn+DRYyij!1$h8?5lVV} zHUPZNE`!Kt!>KkLaw`g?G!$%#Lh1P$&=%495DM}LDqly>*U|GxN~55yq9|yEP_T@m z@(nb?W_lh=wXswi%O%T+Wdc18#-7o9_ zn+u6R>Ek0%QgcEh@~V>!333iwPG_oL_n|bL(g;Fp3@-2`!`bgfys)&(1(Spcfr$bxNT!8R7e z?jbswi*>;ch-u4`7(xCvp6e(ySe6frJJip#g|HzzP7`ECAKf zW`QGp03gjeuxr%i+jc z03cBSNDBa@1xHph0IH)UaAcRmnf1t(Rbm#40zfPQNE84PWfm(40O>mbsmm-D8h|>` zbZ4=2XR*2fP#vuca5NaL%PiKFS?qGmVM)womt!uw9CL|~Tn;bRx)*7PH0woLAeRGx zga#lf0g%h##hL}6I@&C7q*(xRIqu|><*bkbF(DjT_G{cZkWYmKKzJY@gyb*q$O{F5 za0Y8B1TkR{69zG1upiY02QygCAeKQKgMAd1G0SBEjAIVVRx)lYgY68M-?B``WiiNQ zu#3SS274Ls7WPvv#FqhUFC>t0K@7qeus(!rW84k~i42k%u+~FZ>mk`pm_wi@xy7wH z6L1S~Eyaj}HKd3&$?c9T>lD{=el6uAxqT$JU(f9U!JZ%~J0SA|Wb(CCzJ=QZf_w|N z0|Y*f^MIVEeu=!@MBZ)&S;isn46JcqXj2=Q`wd_drL@i@D9oL#(~ zT|CY%9w(0u*qVia;75?=mB-@)GCAvi9&ZPb$yxsoaC<3K>5A6^+ zy)G1)oVG)FT4#z(PTM)VjP;8ktq(z3AA#(xSC@a$2A;b+Y9U?Ig)KN%ESI8$Tx8$yOxwE`xz9; zCMrd;|4WhVCs3q25X6t*2Jp}1a)Ol4;XFag@8&!~%EQhb_z?u&m$whQ=^$qtCIn&c z7kJ(t-H!vF?21r1Z-;Gw5INcGpmHAHcR%N0%aQo``Ec~-7|4k+&@(cs zzMr9%j4Uc6YXH~68PmeLfLin=Ys7ag`jUCfec_Dx!rW%QWOjeoqA$#Nrp@^73unxi zoPF1#FIfY=Ytfg?YaSWSm@hfwzGSw4*P<`10JL40J4{Q@s4tyQsO7#ew^(F2W4>i! zzU#@cr#{(-^xgRVERLQ@hq9{}sSy`K{DAla2>=oZBnU__kPsltfvf?t7Dz%OAv=I% z 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­=6=&@?yZO`JsRf& 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

    U+*qpn!Qx; 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

    yB2caaZ#lN_+m~Nufr>^(C_Bq1XI

    rgqhgNA3 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

    kP@>6@vV>` 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
    1`rUgYPTDukbQgPV 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
    3DVL3)`&gD)9(PPuS1_C8zB9!VFWv4F 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 z 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≠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

    ?027Db-EmsqVofd!JzfRV~g3ahPwBTZ!|pHxP; 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 KhXw3) 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%0A(LTTZws`U9YguInksr* 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

    Gb)|QhCR`oqn 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

    {@8n{T11nep42~{m`lq?{ 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 z\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

    brx*mSBU2$k>eIH!>a^ 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�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¬EDo=T-@RD=FSrij55M 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 &b&#g^NODFnmZ-_`IgT9>PXYVlkY9BMg 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 b_H3)&DxU6Y?(>Fe*|BUlf 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

    6xg%rOH5PO|7)D- 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

    SnWcb>pP+OTB%Q3@LZ#H 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%0AJ0?W~)#g@U_4dHzUF-@SH}qe(q7 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�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 z zvFjTVfDHHE={nyP!aE~OSn(cD*DAJ9we%iTGO{zWFt}JMY0{5z2Y5hdNN~I)lcnr#)qU z0}F*^3U(3ZqWaO}dP%yy<&T0XE_0mj0+By$i_Jab@)xL;qZniGpgqCj#pYyi=(MCq z(DKXm;0r3+|MQHdrbZb)gPNY;i=1==o>bB+2rEpw^|Sd8SzP32?6(_Z_7QgcBXV z5&KX?Kk%1WQkig<^^Y3<6xk;!gNjd+ZE>)75B|n%rOC^!cHxKEt{+j2q+7B#mcz-! zCclS?ak`-sK))B>QE&f?a8F{@G*ot0w7U(*mo(G%5uLgdmn?k2pL4_Ymd0+FQb!wr zPY-|HD?c@A3jPZd2c|@6J0MgYXkX=8!RG!jiw*DXfAik0EZ;Dqi_5YGXMzY1f@RvN z(LV|u>6;3&Za_lgBMI>aF;)^MiIttjG}})YN9y9NDl~)92G?7nqtC z#fff{PIdQPaZ4WkTV5vJ7I&?E$;ZIrO!GWlVBGb`q9Ze0>q3_`g?bqFBRY>S(~uhl zmqJ^8uRID_CM^!m^r2?XAzB9z7W0L6tMlv1Jz)-N1#F(PqrpOEe7Q`1$qX_&#CJv+I};9YC${Jx zx-#^RWQ>uzmqe(S`PO|^{Y2eip1bm_d*!?Gaj(tA*5%cmIC{+D{l0 zo7X|>gmJ1j9?Xx-Iej}I9%;oTT{Ms+Yte9}(Za>>_PWB^3wvx@6mEc_mMM7?zesc0 zHZ%oo@^At)onoe~U=o*zm$n37W>q@El?Fppx+M9Qpd>tM6G;>(MUM@ zrSY#sYIQ=hOwF5X0Z)pgPQFZgRrvZ5-L(HoN%;-|gu9#Odebf+El<7{n~_R7EIRsJ zT)tEHxX?4#%UwQnx8;RrO`1j=efE>xYW$1Q<2?gFu_A zpJ00Q$&!q-=eZMj{VW&^fH{6i*FvA6pV2%2UV$xaat9%rzH|Q6x{}0oD#ffzyA5V+ z0kPh*4!y%eiJOSGrg02g?@j@xaFVhHrd?g8SxeriV(*%ue^CtTwr1{ObY5ldvD^=_ zCQftm4fe?Kqx=AmDN^{=mJh90`O5G{9VYYT{|F342uxT#)FSjYu zTl67n%yNqY2q4cIQu(8lv0?vKO1Xc7=Eb2eX?slf>bmL3Sfs{h01MbS`C8cHT&qfU z6*d;`7UMVK+ZKqYT#1DluB3W*J{nGb74U<^I^0nLP3Bg{ChiJKYsL8htHtPn(r>it zHDJai^jMkXBJk05?2`{?J^ziB%@*|9A4x>oxJ+ zwK5!hqjZ5UuI*nXiQ1RX5-M*316+7eyf?J+#-HFI6*8bDS1e%iIX2MDXJ-0$EeS_7|5xdJ5sAA>S)`J%lKC#li%+ z0j=-iXxI*;bGkVi-a{yITSGYN7;pI2%g_!yyt`{EStuY%n!C$zdGzp-YLHyR00r5h zR&Iv~qQ|0KAvnCSwhRR~zmPB!MM0HGUm-_}?1sa17vQ&`9WbFM&6%Y0tT6LP{Ogeb zKR{Z56aJ@rPGogh%JBINj^U;l!rW5Pk-`5m&&)Vxpa7xb{hRO-Fm7mQc$HK$KN>#D zjdYdu3>AI!W{_ko@Qz_-B0fp#-pa6DWHDjD($gOLw9(!T%42TH`f|dx2d3#}8_{jA zs#cf{LVu0<++@WEk6zMm0t03tC!=f#F(2aFv%)|0jW}9!X3I(1I|UZjBHY{-l1AV4 z`s&tlcb#rc`I1a{006&pm^hQa_Hzw9;^1+Jz>gO)$dF&RMT1m3QG#jp-udxt;!mU? zHu`}q_vmka!DQB)kH}FUEl;^YnNXxddg+E`VKaMgrN=wlfU`I=ShHC(p;O`}1a7XP zo0r-Zqx_3vYo=>h?lUbZc@=&=JmqWm$;<^l{e~aJJvAkNnpytw2uF6_kIn*SlVzjs z{BFr3Wg)Bz2cUy<*~idP+3Yj;UzdPXO&x$1PjuTGs7SB8u?k>tr&k&%1hOTy@H<)&Dl_{}|HwCMqOv4Eg@f zpS!fK%J`yDiktZgBHr%E*lQ7E+_TPd@0!DQJRezrs)VyEAeaW`90IQ3<>Zxza^NMK z;K3-sBjl5@@C^3ighxuP_8rlZR*=q0a#uV6-<9cC?)j^=r%nXY|&an3O0SwmiD zn)s^BS8iJ%D{~+n(Wn#dTDA$~O+8SLZcT^3kXug?8LY4n6*KQ5H+{XiC1E#{jJ(S1 zGgj(gNpck5@QkAjls3g#X832JF9O_bAx#)4>YPml-x{}^8ofM`gXQkP`aBNSbb{l( zwBjj!@0s3pJeFx$Uz%o+Q+SJX1C`5({)1^7oH!2O`!mrWN+Q{B7Y+rYVChwTyLu1! zyQt5&weghuN?(pH_%7XLa)3<&yra3)-%rds)$|a?qK-KNH~cvAw8(>+*rXYF@6;^m z3Cxy6tWCJfJ;WeOD#MjA&1g{$PxR3P0B3;+&J4~Rp85Lf-h?8kGMdAdm$PIRR7He} zExXB=gg94rWL(-uAssW=K?b`=UiBe4M#Eou4)v=l75?S>_#B%O71OGUSE1lJ?4Zo2 zJJHc}ym6}032s&+Hi!*?jn(Ywl^InYRkTX`sUj#q_DHKTtwQMmYv76}N6p5AW+!+9|(klNV1T+#=qx{|j&G@ysRR^#Ne# zPt@%`i1Aeh^?D9>{!c%oBeovFwhCrNH)rf&6gM%gDkZT&mPIi*%}QU%aB~y3$3}al z4SFT^9A2^$&!1JkmTp7G!9R5~2Ce?)Im}6t-LCYi7=@Gnl3y>TJ&s>Dn`8w}3J}54 zu)G)3>>)q3OezaSe)_ZA4Kr1Y6j%%XWU{Fjmua|Pjg%k?mNJ#TioS$yWhAs5vW3%f zPQ9J*v#`RhC*dlrc`)wj^F3Cz<`Akm2cL@-qBBwfYj=@!TcPQO1id3E z8lEUY405^%CZ|)QweLN~GKtGHK?GoYv(f4p{wR8Gi$xH%@kpPjVMxj-MXUU5uWcF8 z^O%PmyjC0_&045E0+Q_q67*RxF{J~tWnlFFWm3x*=zMUE^ZrVCRRjJPd`|;>QBg4t zB6FOwOc|m~DS{*`eJy$4{NdN+pAi)=zLJ+oh0CBx#=l1R>;@pn$@E8b>n*!s@CmsM zFiXq5fqj6smHVLst4vOP-S;IiJtpi&2TQtUEgpXrCq@5AEwiTnCpdsaz4oJp3jt-A7B&BDm0IX?`J z+U1nZFw`8z-m~I!YAFH&)@`xROKwE^gW%3sS%uN(1Q*`mBA5uo^B~k@C%CW#3{Eha zESH_okUuOLdj<0@+8EZu0cVF>G9d`dP(*h4-o8J?t}ZV;9N+Vv=eh6Sb015S-8&=zrxKs@CJSxT=x`eF(mSC_ zx@^aU%?}MLZ_wAevFv5g&r;_%4ul=rvMV0_iT&I5!da&zn*?l*iy~=fUz*%ieNuf~ z9Zs4%P{FRQ>)-VZ?;(zSn`QY~wWy2wQ8OgOOjflyZ?I4$P|~=XQ-*zSe-lh`nC`fl zni*WyG)?@RDSQ#f-{(eX@i=CHm5Mh(KETVF!n~3XMN1O zzk3cZYjas_I2sHqH*!{zOy9kIf2x2(KQq&agM3-vFs9j3-lj+KO?!3+(L-tGxyYa^ zjIShSLSL|as90L*ui#9uf0FIEyozQw7tOGx&VD@TF>_4k3_8^gd5jz#;oP04Y75`r zHP)GOO_fNu5YB|AK~}6irjk`7hJP%-ah=Va5d<^b4armf7X(Ep+jmWM#k1z-9$50b zz|%u4c&>Lm#C_4IV`m7L|14QccS(c1Nyo)y-zNqgsnf-zIXR!k-`d%BsP-s*O+lGG zreo9?BY-nEw1m+b4lz;A+e;K>OJ$!YQbIRZ@i*{x4L~pO0Os_8?f}0x_TI0T%tM^e zLqo!*7rw7XRS`=JJ3FZ78>P;NO&z2A3mntNn2jo+;ye7HFZ6z*SA2R}sfsAN#`s(5 zX5!z`n${W$B-epj^6uao9M|#!g5nUD0|o3n0X^wPyyvts)d7xs&&F#_1+9{bPTBhc zVf1YD*F>?(YHZbJ>|&;Pe4#iKw99M6*rdq%m2&Zjqj#e98v3>H7KlsR4PAGDv?> z6ONq2oNZdvnL;QNJe|It_q_|L5PaK}$sPV#r+-1%3>*xC<_X^~Z`_ZQJ(Qh0J~Y?& zp5(`%3uD(aY!lmM99(evS%O4eF2Kl#8)9bPdfU{JdRK+w|B0FJ zGgbgs{XTt-a38i9Ww=Qz$Z=eCL=YE(zR=!`dB*5Yv3iE-N_op`ip}_>?g;fb&XOIg zQpPUvqWT#ATqZ8;rapFpLWT%RRRNu5@F!Va@Y7cC`;oPI{XKm>{gggk|E@fBY5qoz z@spHSt$tsKH~pcV`yky&IY-*rW%##b7T%14zb*OpY@99L>M@jKj+x>x6>lk=4vP8% z@Ye3cA)WhJ9HC$++h=H~JHH*#Ft-SQp+Sim+J7G@Rvsm8lNpb9MJ7r81-3e~iOH>; zgM079KBoNEDQMT7dVBQ1ePg$ArAe!6b7s>_L0&uVjN6Q}4aKT?$3B-?0m~72-fV(2 z8bBYl5cwLt9OME2Nm|D}`rS&`kpz@q63JrY_lY6i@c_PmFf$|Hfy-;WZ+lBY~A^0ct{U|!Q*f`bKF_-2Ea8{(x1R49q z%V7dg%9atrBc@KlnIiQ2Nkq>keD7S~zz$bjy@a0uO*1Xn&bX#MiF4MB=?2JD?rsvN zCdP%MYaZZm>Mc1sKL9(33 zIP9P{x@!hHq*}YfaO66tS#gUqUUs|;D+dotf5eUKc3hx!-(z!-LH~X?X^<6Y`dNgx zPXf=TnYlo@-_S@N_3`)(%A>aA39gC#*gqj0OV$vr?JgPF8>fUN1`|+plQw9pLOxIq z#S^557^C~o6COi9*3!c-W+@Lqx|7=EgZGV{>uwp(qy7`7J0G^v!d(xFg)0r7en@*f z_Cxe!DkD20=o#~&+kMZMvmM`OW7-txAIO>h^srQ|+xZLz=HN3=`Urhl|0LTlMZ0N| z{XMMWWVm+0zO$O%Pi9a;754n!Pn`k1z{}KbxokdySW@b2_~PO84w|4mM;fn<#RyLP zP+%Nom|o{Lxc@{q-??uMDCmTJWv66Q{?5buEtu3dms!A5={DhsRpt@92g@VF-T;l$~I;lx1n777nrJp|xfHQ>lRZNaf>JJ2s#NW=x>jni|Q>yQ!*^)K`y0$9u=fPGOBIBozqV=e$qoA zsgpnW*%S{7@hD+_PJpuyZkZUrlq3C~s-C_b54bIOgR;rktXyJ%U0HV5r%9T$&aK`( zy7_ilK_693iZ?ftgvK+NpRvz4z#BXg1RYl$!H(G2L7_~R;lN*186sm`URhg(dQMG| zd;@?1>cmeaLhRZ_iJY)i@BF>o;R%FoFfj5v9caIaf0VbviIZNXCtn>e?6?5FO`5tq z6cOnB5*hZzrhI3gqrdf_b{*U_BW=UKOJAJdWqWJG+FgfQ7TOn6xA7KTymMsJhu=>B zvv%#au#Wpj7o6;FMJ3OFwCQcVReVE_QYRCUa19E9Zf_U?5>dF=r~%p}HBfp|8WhTx z21!ryw78D*sS=w-$VTd`A`g=hd;LObbL3^kY9B*_Mv3wg)w7KkdSCC#r*7F#UYy@d zo~|lg0O1;N{vg=JKD{VFT2&p&ANHkt4DfiyGk4p;q zcW!6@|{Z@g@^O{m-kzr;ucn=g&Oz- zaok$eT#jWdv+Z+Ne(ue;Fzsiw>2{*3CUeT2kpCTb?%QPLNexLoAh4*Z@I6-&8cv zq{@WXi8|N}mwzYBK~GDm$*=8x;HA?Za$r{vNZlq@WWegPH+z3pCg|?(`7dNP%APiz zHalp#VSk-xb^V!kXfTpiR@IzmZ#3g%YVL8r(K@fDCg3iIzRki_ud6Anz9{!9w|BU~ zl+7a1)l<}7q`lp3QSyGE;HY1H3ylaEQ6xNN6wU8)z#(ov1)zm+WG(@(?_qpU36q(!`#%%J$;AeW&H*6 zTsa?jJz;7x$w6Ncv@$nX-uU67W^=p~%8G-a+0tybdw<#d;pWf`)>MET&B9s`U;4E& zr(&ldzg}62tEFGYU#E!fY@6jUn>oYrjmcF<@8Lr7$TDW$zx0W{-3Rj~C*UK(peLM_ zZ!oWRaI6x)3UB>X(A}{&-$K|}cm^@6%K6(UWxjBzEn=Ch$A-OLXh^d)GtDlltGX$C zXMu9yEM!$?^(rr>ViuL`f11(oz-XJO1Zi#S&A=pNVO&eAhK=?BVJ=_&wj z;`%H>wT}~m=~L~2AEZ?}j-wSTAkz}#20f)q_34lRaq}%NGE<1wZEAiv8wcWfRvy8p z<^5RTd`%a5^It z>?6+P+(wcyqP|CK@PJy=$NYfLfJfG&YDq28pmnTPswtC;w{@9m)@V<&#d!_ZT^9gz0I-i z?s>D5%<+s$pmh|n1hrtqf>py%<(twKS?d(`67mX~XZUBhr<&o5z9U8VRrU23k2#~9 zS<%pPx(YRgn=SV+Iv9J=M+^wZO}K%$Bw9ZMk&g^O41Daos$-i9mYHf@iR|#SYYnwxzy~&HqdX#Xo+AxLmJ8Fs1JsuVB zGV;DRtVnqIB3$1@zA{-kOL_h<$%hm}T1T?&D!;R{9J3JPU|blMlPj$#sv~X=e{V^f zMO!SmMSgj)|FwK~vE*y>Pc2VwM>;%Eak4+KAKjO9`)oW=f%qiHwukCGh&Tl zixg+Dmp%Ft`yKmS`f-~XJ=4Rl6R#)M<=07S())+x`Q+5_DTJA@In#`Zz+Gl0;;&IQ zJHK0BxwaRHvBa3urWw~&u27t{tpoa5t$DSm?{2UzJ;)m2^1nSQdo5R4!? zdQ{^RS&6yC=)j*lXu=zj0a(&%)EvxQ0B7aGRl=I+z6v?B-vz*K3pr)^b%@&38e9$9 z%~8}QUmIariK*PwYa>`FumYbl2Yznfw`;OY`+696KHwUiN0Y1=kMRI9w2!iF_(98V zDxcp>caT+jSLK@N0yZS>8W6^j7Aa+3r1kN3@gBX;8BRM4Zy2;2q0*s~0sc6b{`W5! ztKLG&%bOiYIjVsY`Ljx1QWj*!qtq4U1$-(UJ1vPetP#+gYD23T(jl7cj3yAevw@r{ zo64LkoLcs#C~j%IYdosAo-(=uNZPLD=J4xXdE?(w*EZEDofRymz%$oW^;u=pw>}k@ z28;Vr3*$TcD=yAr&SfGXGv^e3!fMkVuH>|lwm5!eyzNN&vqCOckvvhSbwc#2-`|Wk zu8|l=vge@~W5u+6H`~jK$Lr^f<(yUx4VJxGuGErT(#u*D?C*#d+ls&I>+xIm|8=?prO4Ixz(CZA|3wt&E9T zMM{NBcrtCMxy|k?b=1eYlUdKt|0)I$Vc?iHmdm2#GFqP zeE7{WS!*;I9fAV>TK`i$s^J85%5W(ep9Wlyy`-YIk(XC3eU9CinL1V_^BwIodi1k_ zTnbaQ58gwt&vbmEX{MA8tq_YfBbhziLGxZBs4Tha2lZEdP)ZGe>~zq<^H| zIiuzq5CE*wp@>aXMt$B^r|Y_W!VYLm*y}7@jk&ICU!S$BTd_o&YtzE?f?9Sp0xxg= z@d2_c>j#FvkA7&lO!9rPv8OZGR$%`^LST@P)0orh>PB76moPtC30OP*SBP3w`e zUh5*cK`Yi>?M(#}c;frZAPe~R!G6bJNrK?V`$pt`YR{d%@M1%OA;GA1K1^$_n|rD^ z-HW1nLR+7pr&r$_JN}6!sjYwrcH{LH{#M|mGXms%xeC;OA(=^5(zgIRH*z+f+P%NuZFxVP*;hKTvX=0t< zFr>S?Fptlg`3nZNll8)tV}SueOP5f*q5TN+L?)bc^asbgfovf=%0aj+k~}FKm*rx5rG>YQ456ShlaO|9{)@8Zp$s|sPD*5`XgbXj93pHkX=4XF7Ac+Gm#Y3i#jP>M@(zDO4v+;&tLbAGiKh0h#T$%$m>>n}a$ z4{rZLwRe{S!H~Rn5f5rvnghp%e3_AF=jV<~GUgNGN6X`9PGh9sJ;X8eE`!{~rz%6Z z>n81dMGs2TAVSTCi7l^+B@JKu(elLup1s&2Q<4x4-HhBgg)s-Rq$emB^3Dr_?a!?o z@N|4_CAWHMs-j(M*i6To(dK$@U7I?0wT)y`Qpu(qVRH6BMYAbfT)I+RYNn68$JCKf z+-EHc^%)yxqVRmCsU`!`>G_U*?nRMX-~GpMIAGYykdTV_j+cIieYqRjQ!!F}rsQ>o z^m{}mT=KG{%7S$p+J_`f(eEbhA0GS7RjL9h*Qy)5YrHEiSFQaZ?C|)Paot*Rni%Ad zr6z1}<`$TQ<7;uv+OuTCH2}YCU^%xShH>gy$}iCb-~1pyp*E_jSebwLy++?^C52+w z|6{M_Os&2+vea_3si(T33Ac}pD=+y{()Xj?%e;F%G-H}}E``Kvh zmHZk;>S^@mT)^bs(Y8Hj0Nr;-PqGs8$k=JSU#DaXUH8{h9J0XRpwh#*oy*gnsuY0J z)0-4MOzYmTTD2=*zu_ZI0#OkajAM(P4eyr0@im0KgJdIK0IFOkRjSvJhlh%vm3UM1kZoK8N&xc6_)7wejv`P$VD%Q;+lhiQq_PK z;|fR|r7&}Riy%|6#q*Dl-klPdAR%%?(aEt{-!Mu_O2d_2`Ybp%1k7l`Hv$^5t-CcX zD^v@n|~fx&{2vQQp9U^HG1Gn{u_e4rfF{yaP$$)d@wq*Wmw`8tV_2D zux;p4?L$mtdoSPW?(Bcysc~y<9R(yA==^={l`N<{JdC|fAn*K_ZH&S2Cet}Cxn*NH zuXa5P=~ca$Xik|35N<>BVyqts)(#fzP(X+{+r4dCCJs|kC1ogPA*4meKvB;Q0<}PKNs()dRH4r|bB^x+r1O zqo0aduEAt5k=YH|hJ10A7s2!^;}LxKG_4X}fuuaV2VcO*xTVtUF3@?|g-q6S{uUoB zJ6y4HGqowkV}x({E(dgbqd~(B*zy|KTT-J`pdQ2rB6PViD~DW-C$r-&80_mxBV~cG zaT~->ROyS&FFn0AnWNFInAF*ily~bFXZ5D!Njl8&kqP;enIwcc|d$WFBbcyCxBJ$ULDfEowOA-mo~*XO>rc#=H|=P^CnqW z#eb7UDfWS-MC{1Oi>i7L%&jC%5ba;-t^uC0YwRv9{TJun*|vBD5jPVw`=SWZ?(OUF z9f;l=_CV=IHwzb;AV1A@8Ig9a>RGlICH0BW-6s4v=LJ*eF!|gC6ev&|>D<>w)_$nF zR{z7|2_Wd7!EU#7kMjLA+x8M&Uxeg`yPFU=G9^r;wti5 z;%Q(b0u?7n74WCVCaot!nLahbymI;EKfcRk4{mclE75<#{K^V(Rdt>Bl`)wtCAYRZ_eITH{XVY4~8D6ZR&hfmSA4H|BaK*eB>};nat0QtlYK^ z+B{@+1B+ldyEf@Wu}k?AQGV&P`EDiEeWW-yyb_I)CzE_%d0Q zg-1y3*G88m61b+EJm>!>*KP-``TDOn!7wH~(>QVSbBD_A!9rT^#woGb_8kFIyp&v7 z#2Vt3+Y9d{)-_aT)iyILXrlPEv105;;@ik}UvanLCL{g4-6e@lfT!CH9h%z}El2UX zqDN5Xt?I+|R}P-l91}+eEADArALw(;Y_Zkln9=A>qiIr?QJcY2cB8b$kN2^16njC1 z!%WzcZh@Hr)_Eqb;rS7IZzryc-92;Gpl8lt2Gaj08tQ`4JUoi&1pG3WTa~)qh7{5w zo%3mZu9wDo$b7_RRH6-5uOV5XYy`=Z?!On^!au9>-89Nx!Z9;CiV8k1LcW}exT3m& zyMjx!et?CeQ8AmMxSMF?dB!P%`(xG5c4ozldr%7OA<|KT_*?Wr ziKc0gh3Y>CCo9%WL~Xbt%}b~HtBBow({Sh4Jxlkf;BDbZ;`}uPDC%$mZ6%N$mqS;_ zCg#fd#gUCjahzwjxEUN!Ps-8oS>w9eJRpq~#yPKW7jxIb>)3~HeBE{lVdo6=# zN|W3VzjaM_+@3pk0GN~AuN$aCqay0<$V8)|{%E_iczV4Ju^J3EVMNt=eb)VLebK=x zGKtgk>p1z)OJs^@w`wopGT%a0!1Qm#HmtE-eu{iDg&}1=Z{@wzb5{I^{JN+pxvr1Y z6WQvf=ewF=pf!4$o4Bu{=H^?W+EN>XzVfFwv{^zloEG$VDE~H=&tvF&jHVWBtY-qoEUuwi38qSlh z(mF3;?ZN)Z+c^P!pIcRwwd!F9i`jm4m}?jtwb_QZkcFCPpG_x!N~U#5#-{N`m$$Q8 zU1wQj5K)0z|(&I8?w@qm208sarwb}t-Wd68#G}W2ASml6LZ6FR-7?e`be8hYX0Z(QIq&1=S)QnX*DA1 z6|=xlE7VXAGqNLhPrxVd38~2V%uop;jHxv{rtv?|G|sDEW3b~Y=C}qM-HX<1qVd^^ zIh3QLJNxI!3yLMjbc}%HOUJ=NW{3wdX51d7-q(Q3@!SiL#b|rHDIa;5b2EblyeRPo z8_Bx$iJRUs51u#wC6XS+-gg2*iN2LH$yQ>OjT%PL znJOMhAiROQrtDGXlnUi+LsLpd-BR^=PDs#Y7m@CiziUgFu{UJQbivrmR4kbNV^Npn z;ivI2H_n&nk>P0eb;;kof)|o@=r(u1$4g&;^e7uIl?X_nTJiTwMR}6x!}nqx*E8Ss z?AOUXc3|l$%_5gCuBRlAK2a^+EpJGz7oNZE^D9cV_dP4%vAJ#C!sV3E^MK8sl? zX%l{-)|u89bm3vY|hqga%3 zA$4I%MJM)C5uN+)fWpUb zYve~e+uH=z!SAwj|H0Ptz7g7^f28!mqggH-XzcGKM9lB-I)ltf%yu{DKhNTtO$+b(wbd1Rb!i?W|Y;kfH?XKB5JK_YL% ztVPgab~NTA_0Y|BLKTm|cGScm!yfMwD16?pHR0w*AerJ(V)xRKO^h?kWMdd+w($ID z(>E@P*_Mn#il&L9OB{F=&PA1_JFLQ1r=am19QB)(C|tK*Qagqexyrz_c*}5%ney$4)t*6clWGD zD+xCol(L3W+7!=-i*{d%o`u-;=I|mo+tMbN2F{a8Ic9=elyndj2FK)f-6`^;>}GvPvbz7hCcQ;IlNW8D|=2He(L% zI{P6<*-C!5V08#HLFAx{akY|DLg%RHb7LX4qVMJxlYj3Wc!o^wruyOLj+I8M+-#Zc zuG2B97m^GwT|D*zcTZQac37Ahg?r929w-pjUy-B5@2eFVLhLC~nY*(Lv!dsb?oJLb zM&D1HDhwr_f_KW77b|$I$Xr=9DY9M@flQ-G&MYpYjNTtx!T3q!+V=b#TRa1Zoeyf~ zZaF1{^VZljeO3i!rW>-v8J{Lb2WGa}?r^VPa}<(Zx!E2P5XnQwO^@!1xn)y6dJ_#e&p!^{4{8``bx3j?et*8c>cDE@ z5xlD=1-pPO*^#tmY_`RF0&G@9Kj85i&Hotlm#!Tqz4Oy(drvbJ?)Ci<*yoWN>u0P= zVNFp_IYX)fNSlGS+4xSeN!zwEgY|XYq!cQ{xQx#7AUr|heNf*rHM^O@oAt!Xhp|83 z)Bd7#Y zhrj)AJU=bGWW3a+Nznq;s0Zt>t30s5M(L+~ z^i(XjRM%1@(q244KOtJ@*ct>Ewh>Z71flce(O?<{|6t7hZ-uV+mU3!S!=<2AXl@%h zHI&;iMy;}iWuJ>_H>i7E(ljNQB`PYmyD;*N_YbXISIllz;IOKXNLtob!gqtks7l%Z z@PEAx#~6S8iJb@S|KbU97Q`T7%162R*UR=_FDrhzh=B#pzXn`(HTrhwu8nVivy2~L zBF{G^FZX>)+$vuEkSgaOBhm)Z+haj2rmJ4sv4 z1k4rLdtfj2S^#WY+aWC<#7x&4L4|+M9^7Z*tiV{f&4vv^RhBWV$kDxdqw$$=ampE# z%_o((X~kK)goYs|BO%Z;%J{MTOrauP33sPSYvjga#Q{u~wc7A|SGfnnSE_m_39oFV zx*^U}8#P|S(4sSQ^MU|boS4g+$my}s7<|-oN#`33@}2U$Vo6!)cu*wYHI2)9Q8|B& za5ep%3V90B{Nm~?<8P{%y7a7Prr{Z?D>6x}go>JOoU8XGEzm!*e!x+lFxfXnZWUkX zeW)mBOgCA_3jbU;>A1P-MeJ!0HCk33H%cS|dY{)33#KZc^*k2@Yk@_M@zLT`lDU$4vtZppk+8!1p%=A2dW)dTq1{&02kNh^ z4U;5HhKSC+r$D(GdM11)^)9@o38EZ5pnYJd(pBe}E^%=HAk?@lCjF)d4!2G z)Fi-mbY0QH>M!sto*Ux_T(rdl{~Y?~v4R|&s`yLm_nmgp1;jxZ23*72!+BYzYB(Cy z2POJkA!wO+$-nM2PUc&zqU->ND_tulKfpr!`Ko>lLL@7?5+tf{XO6hH*=Te-ighzk zl4GV}wuTMc807Ed20Jeb+PB4ksITfE{BWN*aK)ofN)nnDjW(!P9KI)5KFGF1*C!r^ zBqv{e+imEk95t)z&W>YWfQ&?K%zJJn%79p|fZd-OH#KK#tAGv5Y@>fmp?cRJ&fp^+ znd+8~;=l;^Nkoz}Y2>d)HX|gUwrH50d?^_@h#E=PgPP!2X(3qkrR-geY~~M-_J;Jn zHo)8{Gmqp2z%E6_!t0akMjf|UU6GQs_N$ISU~lx4Ar|JxvmVodqw2;XbY98Dj#I$6 zr5jzQ;k;X}cmPCcq#AR{Py@?HCOr9?C z>GFPQ?kl$g(t6BALmDdNi#i`%C7tV(9Wi8yAE6%8V2iJ}GCT%9Ad%5F8)EHY5KAOG zIx^%LH-Lu<49_9p(Q1}3k3(PAnrb=^?$?TiCqt-84}V=UYlP&{avq`0A-*%ZwEFrm zJ+up(v}t{@5%ezQpQ;T>pqQWhrQ-2jhEU~385`6A4}h&iFuaeIoTT3X9{?kK*N)(B zixdFVlikXqSUnT16m0`kfNt(jqzKH#cwnQ=RJervx|>F$)&)z+B<(ANMD&@)C8`H#3l5sJiOq{b#^X zE0as*)gJAm^p~9y*{wLjRBhN9pCIm!0UH#ujv4}dU@#>qmYVG|9XY=DLaro%1X!uni+vO zFYHpuVLNmE17oY2uU+XL9u1{Qzu_N4TZ}JsUpSv(Ne#pCT);n~)u?76^M+{-WX`Is zG+c-vlp|g;dqx9ng+mcVbTiXJ!3|^BtoTJagYiKbWsw(XyXgZ&rj);B2nxC(Ovrj{ z^0P7iZfJ~>9{}B>B%U2hH`C!RH`Ha-@akxZtjl0*Wr!ZL3<6!$+Xmfw8^su9T!GTN zhv~nX{zIO$!5|p3v9qxj@DBPWI}8H2%}YRo=p!}vQDV}x*%xiVEf=lQ)4u;dLMJxu z*T$3ai>v%aSjK^|&vX9_A(cJ;*|s3mnG(4Ivi1Ei7S|D zLaJ?Ko^GXbXSC@)yqstKmIvb?^WM}v`=WJf#-+eNxLN*L#vrKlh0lKSL<(l~12!hs)w7nv#Ud<=$YU{l1rq$O8*Vo8X4)uLy2dtju7lpWa0p zE?cd@Hb>_+C~?86(5KLeWlFZ7El^tuZyE{f1aBF54WrptWIa$eDL%reuh9IVvUSdD z(HuCf{@Vyce;F<+cbK#ZiXF`jjm-$Kpw5kq=d9t9FWIjG0zl4Pqf@VZgPJ;ApxX=j z;HrQ_L}S;&ql!G5im6n@yjJY*uBkpc6l-!eQLS_}8*| zTbr*+18%lw#jW>MuE-!T{YN5Acg8m7z{;GmUH2-DGXn3Gq1l8wgV*TMcXSu0Vnq@C zNp3lo=EumR1&kIh{tBn}EiRVqdsVAyI}Q#>7nv`KZeelb?Y%Jb&%tkqqFt zDedM5-g9y4#ualV;65^{*fRQGq}>a>vp;@~l5eQ!+#;IeUeqE~og0awOY0YiUl{{G zUzP|4=|3pzgN+%)-0|4(94lX$>iJz4tNqK`u-D@Ky_<i)D~~{$^#vUdGkLgX>Z{v_pk65V(?l-sEnV5m zmbHlDZX2Uh8aT~D>jJC_7vsZePRR*cQM@V)6{{+ceSt?qqOf-q7dVLlHvV(ifzbYc z=uM7|DgW&m@^G493)IL5oS~q7f7P44(mFg>tse5nPNZ+eJXH+T`$sVYYV{y;Q!1M~ z3y`K8f<_+s@#Z*>sK1d)EZUg=R*qevMCXmsWiHmao{}s4Z2TVAPXyp8nK=|<`Wc^~y9HoPzZYHkScV}x^1}av|0oMJ3o0HV z!rUrSq_l5n4SVQqG=COvzAq|RD{IP}*nndm#ZGVJnG%658ns&h|EBVBOOaEH=#PxA z>P;Qok7Id~K*s~DbDFyXNkxs()AZbWFl7E3R*rC!|I&Og;^-lW5`0mA+%^Hq7VXHy zzhjCoS;B&5>5%y|VS?t8@oB=PXw<2Ig9cP{{_-*XVJ@PRJ~q|J@Y10rZLWnWO~@K6 z6=Kjt(C?Dj9(4Dt)4FU6#f7qtAmg#$oqF@7oVsh8!vdX*X^+df{-5zm@<7S;F^46= z+r{bM7~OFzv7M<=KGKQh$G}4!QezJ@4LM2yyc>dEK`Gg`{fAc#_dGb{R(IKds^Taf z`gw|CEW+-kkHiX3E)z%VUt!-V)Y_G9Dc#czmJfsOVI+UNzd#?BzKHL+@l>yOYR7(6 zdpENj*Fz}>Z&ga3kM6B-P1zb01%wyL0jOy_``!dEMDQUxaROdk3y+p{B1aAh{Ll0Q zUT={3FT=L)bIwl1Y`{J;-*~fUNWb*d0K2G>jr~RZN{)*HO9%i<-d`TUD3;W%46x@CNm1ffF-C9w#A0_R@XhpIp&%EQ2WYX zy!2qrMO;xfeb16^S05r#N7|ZqbrTU$h&s3~&yVY1i3byNbTi~`v}P?Z!zYB_f75*J zAKgdrA6a6>;!a&k?Z4Q!vu}AHp}J}{u4!AECi_OOoqC&^Aa`{2JU6QnfdZ_I5flF@ z=?ePOlSK1}(=!PCR}+rf4K7+^G>30k52|;Kqnk0NQl`otTGh_Ol!J9xYCPnI12i0m zl14Os&}6}_%>iW~VANP(xt5h95{2&lrpk@1e!DJha%*cy!24Z|wjl3%!g18Eu}!@- z1;NLTd###t0I$i2W;p67l70|Zs1A57S**_=jv(l7b>7g`mepxrjeeo5P1EKwBalDl z&N`5Q4hcPGqjU?33~C$m^iW1QPyEvOzwT;w&7vU}L0$1L00ueP{}dI-9j6RUot{Gk zkilz08qxGrWM`PRXEVd=NoAzBA!UO7Yc3ngz7&+0T=&jSbXC#!s8VHJ0Ee^}diE(v zm;%C(({LNTT{9E99mcbeJs=%ggV*^$J9B)aO^+29nr(v;Y7>JE>p?mBG1ioB@4HGFuWZLu?B2Bqk_ zaBS3kv(u0Dqg!a#Xmf6UNgYeG6)%4j-w^y1rEgx6Y^cY( zh8d!RR)W2H#1tfmMg#9Dp7luwuxNJ^Olt&rn9)WGS@m>f1_8_Z#10P*z&2QFA(F!l z#Y?c}DmgGhnlC!bEHM^#B6+3O!z?C#q?Gy1o0$zC)aAWUZUuNFH@Yv(bJDU%>W-V3 zGxI%i#iOc=HVY}(7vny7;ypq``DvDPxA;Zpch+~LEul$ux>jGvmB5(48Xnd2qV%Ud z-U-2Y3vgp$8_QB&tjM*IcFYtC=}`D;n&Ts5Ch~W~J4@wzhiCLM$%;WZ4WOI;rz(AP zYg7&8-apj6(ew!>7y-a=x}>^x^0}UyGCz-o%~oLO8!`uvT3RPZWjg11R)OLxC)f}f zpc=0dkx$k$OHHo>9ow;Eckj}9I|B2Y^o6V!*rRxmncIEsG|Olw9y@z$i+y0Y+vj6YPYB(i((qgn#3(I~0-}_G!@ZkM{4S*JY$51)rk07MG6`*H(_2UGw!#az zi|MzGqc2i7xGXeipSptmcxA)&uN>?JmjwpCGG00e7mb7G$WUYisA3Ry()knCXal)X z4(;WU&E_Nq_dz>O6;i=k*{}Xj);ZcCr1`hNltxud=YGQy6twnH)o`10{iLMwo#+d^ z(dbK9rd;gX<+@vY)A@>n!L1elQK`J9?Rl1|C-QXfm5#e1V^tA-`x1nk=}g69+%j+m z%WS~sH2OaS$J0R@9xTI}oG5<@;d+j=TnAv0?zlfP%;!x&eNEys?9_AuJqkSHNp;|syBrmB`wyMbzU*A)79$gJnPc?{QHyF>Z{(u_WH)n zRaXWVPbY3O?8Gk0+-vc(lqWcDj?UKC~P_%(V2)G1KMdJeXiRk>9IHub2{JgPaG z4j>*@Z%MCdYUMvZ+UWg;2;^hMyV14?%;sS22F0yPT6PL<#6`&kjUMIcCx4^gsJ02P z$)u7`Y=#t7tdJEU7x{hyy{`@1dw?^C+ZF|7=;$+i$=wsD20REU+!>U1(5wEOpmmTW}b+uOyd@hD7GK zrKcGkkB)4)cmMQ1IG-<@R(Ah4ao;-n%cd2Hht7OmQt;#0?k@!oZ~b_F_u*f2cPubJ zc;@)-n`42}GAy&?I3!aDxNdIll~RLI5vU`NO1tZ-5<_7M9BLwT@Y5r~LAq4(<4ro^ zMVJ5oyH_tZZR@uLd5CQJ`VlO&fHBAULrptPK3)Ac$zx7BA7Gj`{b_bNC#ncHiY$-U)|(MZ<>S{U*-uz0)Z;LEJT$gtBYVsIJ>%e`2%U zFkhO=i&ytfXHAi)BNsyy!c*10-e%a16ISaw9$0>%lFXF+eWvpBn8cgL!-u4JCT_N} zH%q;aON_4E2h~W6 zq}3y8(xQIremiF*u-y9Xu%4U49S{xB5sqKIaza9Pn(@HSsSf4&diyto7#nFsOh%uM);p{2}9(gBe4+fI`%U5N=T=m zYd-sQNO`02eob`AsgN(`&ND-qPYkbDP1e`Tk4JPbFB{jLb(N*tzxH?^%Ct)ejB*b+ z$6B9kc#W#G(r<8;JvgJL{w-T9A*|apN{r#e&Jm5BaFtkpeXFXGZ|sIY%GUwd_Z~Xi zOEDoGGUBV#IJ5fdl!7se!j3*A~h3C2U2~?MblbqJ* zS@>zDIo>*WUDw5KO5wa9+fHK}r;PwaQapu#8+kWRURNx&usKzBo=aw3o$S~;{79h+ z>awKvl?BTZUyTA{G@+;Zpx0rZl|U-ymF7U$>y|@A|T@ zeHZ(K<*U2K#unG6B=#J^+nK^wjF3XmQSsTi8YxQ7`v=(^B6-XVn&R*mC6;sllQv6w zPOx)J2Km0k?p4-pIgLIYmw-sbTMo%eO&lic+)dH$Xy!dUxiT1BD4=rY6u^wr`FV%`wnyej#b z#E(JPiuUtPE?O6~tKwaavU4%^tp3GoE7!R+`|t*bHmm&}FAAmLSr4W!@Rw)w-wgG! z5k7GQafLY`>&gTuC9P@OopFq68kbnD33|Kkt!)6W&AaGig8~iqedP~$H}yoe_Rs?1 zJrr?n??3wFqBG1Laq}M_nN2b9OG!~e*%@KEcTWcy3`uXfeu;M*!irAa%hexc>|ca$ zTXwD?8Km1ci?kxkmyU5xahqd7a2A=Sq&fuLjBKZvaaX;BHbFpxn~XKOpz9%w!kXu- za*SW3--KE>gaUD?MvM5Bz5mdRM_Vb&hrCZ1OP@CBF41G?4(-gVlFi^|x0FSn4zcK0 zFRPp!GYBW20cYfsg#1lgyatv~_g+u1!*lx!ZVQO;Q3wC7`JKEsiZS%oqSHY zi=l2(em|S|DKp50I|0^;T2Wnl=!XjOX8hIbpBUV9n;_$Wwq9y z2m_Fd<{=`;!TYRsf*HL;)WhsA3)bcBo!F^pg{=}0H&U;HjI`_dbzAxt_@yqIK_N&& zuKAv$2LA>)cpLq8{Wkr?oGUUUE)Q8b#kjK9iujF7=4KoGl4*@bscY?|ui0SM2s3;| zrLEx`qu9XRGqEMQjX7~Wq?%bvX~QR7hP>&omxY-k785YS(OFz?bd=tM0aAXIU&aVd!^z6uUnJ zF2ClTzs#)X)nqm0?U@Es)ACf;HsDK-jr`TR+Dfg53ax1-)ev^K|$c?q^AF~|%dL5))-FsUTiziJPsWjAz_ovV-95>UQUk7db_qN%|{?8!t zv;^$ymq^E*XnG`wc}9Yos6k#R*LV4X@J8px&r!zvQR+FE1U+-cuVT!+q&a#jYH?6P z%mATIc*Rh(HADV~d=bbFKH3G-%vLw#_3!W7HNcI0nm^#DqG32-W3r zvtIJ0m4*#8Vorxute^-P(hw*+-N1jfh>%#@++$BHO}7upP4p-lsMKXA6{eIlv+YA{ z&cw&`wui@puXmi@>xOtNYDTPGpi_NIq6PHTwRpA7A1AOW!FKkROsf!TWN%Jtfqm|erk-sP+On!+#wz$+%E7X+L{FK+1R zYw9!q1?!U2*~Cwa4<2+5EG6;o35Q-fL!EgbbLw$y4p3ivbNx#Yl= z;Htd@+`#VX0v!AJaueVa07 zAfn;p=&``Dsf79Mv$Qzcn!c=~o?gH3W-%Pur$WcJc9=GDJf#N*7m5(SMTH-ykDVU- z6+El<5NuyLY8QY67A`x-*pqY1=)4v8*r?MF7&cYZqwnbo6kImM7n8~9+RDaTb?Q2j zlzhY%*-#Y>$+j}s3mW4;>reXF-9ssdrnQEABLQ_raFdK898dtS)Oj16hI0-qcsWD; z(>v47`R)NfI~U%WbB+xZvLW@7AE&y`fDaQi`k(9qyRY;5HDAT2OqW4o2D5i-#5)N< zu~fzkWOzQdE}kkkf{)OJnjDQi`;Nm4h`6r#<{~T!3gumsXu4GaX2yC;dQX7S(W?6K zK}+{pOwuxOm44VPu;t=`SCp!?{y^3TOS9Cd0_+7oo6IWI+bdXYT1ELMTHJhf=6dcv zQ;xQo+j^IgXuRB%0UElJe&{m3qi#CR9d-Z(S=2!568qox%UGYr%CLcRydm=51$5=a z<<_2keD(kRpldEKhm9j8j58?%`W2CuEWNjosdPU~UkARCuo?RGN}EG;=?q!!oYezR ztYHmPMxQoM5#pCQ5^Y%HiJE#@?f67O-Ox3{myg&Nz#Bh^w`K0fYU&O;88PjWe`!Iw z+-`g7I}Jb(AXXXIV&UZq!7lV!uq?kRNw(2WKI2=GXQu;5(}(C)Lt{W$s@Y>?FQ(Vy zH(ExQ?lHT~>OjBU+cuE1KGGNpkbCF4emdB{au@TnK%Dok3uJ1>X3_Q*`41mHLbve$ z>e0lG%>zk7#IUA#RI;KYfsxU3f0!{my@NWl+zxEk96+(r2Iun3bk(yig0=g&Is3ML z=1*n^)nvCTV_?ro8V9df*7?-*D}B%V+3o2gG{>R4U1QeWV<*4k^L;Z%^dIIVFe+#E zwe=?SHH;IczKM5rkdwLqtPTnw`H8^Nf{;#`rsm$n&WybRt4fi5;b5oE3c=uIa3}`n zlBfIgp(WjJ54j}bH1^9U@*4@LL86?<#P@9DuWEOPKoK5C2w%403SWbY6wto518u1% zx*w_@i*e1-b_v<2J3~O2Gp*VoHW201Q`28zyjR?Tyts9~mI0e)9dk9gRCdD!+T=Fm z0<+IZmfgS-A(4px++rzh0KD+VwIjZ<%JO!TK=9=E=dKVb#{#$I>@sMGn@!)~_xvAV z@2iYfu5!BbIwSRt^@VXZLwS^jn20>}ho29eSs4`(#N#wbqk~Oi&Mb ztdd*|OvU;R{l>YAH>4)KfnVm1N@t8-`mAB5h%iOTPyqHo{g5h zqALO@l9nfRF?3(aEpEsLptxeL`*mgdNUX-`9jN-CvPL4lQdes=+SK-}T#iT(h(6L_4~DRNO`m$pV_{us9t{jp{LbI0OoL)2dfN%!?7 zfl@qF;8;y|oCXj@6epForocH$0D9SDQY}eA;TC{RZ3BLoo zepBsLVyymJ3}W({BvldNT@nIaUdb@^ol_$(|2w=^jObHm*Jts3qIp>908L_NXF`1 z4@;50w60j#jkM6}>twlAtmp9p$2{Ke{Rz|+c&=2-QdNyf?V)6{2Dbma9}!vz=8;uW)S zzaTFA11C;-4YsOe1jbG0OdhnDGn2=w<3g&0Rqjs_`2UdH?VtWrIpIY=dh90q*1#uO1D;#Ho4{3GIe}be(hM!oCj|TpFYe z&7S$%F9AM#vB1|hT`K)|c*pQZKwI8CsKI`~12_|uQeN%Wxk&7Uat3+#WL8QG8am!s zuvEo?-UpBuQKbs6IA! zs9#VMc~f{Zc@uf_A}%Ey2&j5J{JU6myhDGtPD`5&Ml{iBitjv}i?r+N*k?LMDaoAD zy0{#CO#~bHcCYKao+3dufh4U%-B_AFOY#&8X0@Q3ChtK@y3GtSz3$v+wo@O{t7zFl zzUhU2n`Oe-hB1`(g=eNQcC(5K)_iAQk-Jm>NBhGA!*2NpVU_1&3|L6$SI0NJjeYCj z_X}?hsMUMI`|U^PakwA7k1)wN&I)YF483fjFDHbIZT;V0_p-LaA=*x-b^JI+`;#&o zOgyXEzaPNR<_so_he^OoSvWXHfNTJxsX~`Kstkscw!%a1^G#$Q#OEF8ALhu=YLNcG z1839RQPq?VIIzeU6olcmzN#8>*8kwxex;^seW&_ZKnY!39a^R8()d0!JxuSl9v<6E zaG-co<`1IKqB!S1yuPc#$+C#wg`w^x?C1pK?VY9kb-j*#+l~vdrMA3zmW}2K;5xk6 zGM6#im*v?#36Ua9rvHMShMmaTYAQjJXah$(KW^&Sh^Ubkn`{j{WQK(-R$2=o@)YS6 z<*3M(H``*>J=FToI)D{jO{oqZ>N~{nMKHdNzL}<@O(ra$tRKW*?`yS^h9XxFZQ<9Z zo=^MvBR!xxa7g82+!x1phdwNknjykxa$ zV5Cl41I&+$@W6qB{_|$s?xegupxPrU+%ekrg@kt8xs#ZFJ@rmVV_exw=D2Av4j41v zX=b06yp^5q&Hsa#J%IW}j}cy>{8bCb<^)w?llA;e+>98sD%~-s&U`n6v0AXR#rujj{W5(D z8}X4GM{j`iHJGZxmJF6nMzR3lfQKz!4a-NEhn<9!Plm$Pa=jUn?( zqv6Y}Kz4%lw!}jy*N$1w9~^JtENCn@1+{#@rnKXJ@5f*N%>uH6*Zo#Mfe^kkI$F725>n47mA zR$woaTAbTao&OHYhUXX4zLst47CuGq7xldROZ?V@GmEm?Z(?i;bUE4;s{!gt_BIzy zOE3(UjI?R`j|!G7WjbRLTL`+6y5%M>1S#SZRSXW&iVVVj>oE5@MzypAJ|khX{_+wI z2tJaUn~ziD_{W0HUGp%t%sTTo$m~SaXYqCdCKFDRXPS`x)H*f|Q2n3+$#uE@G61x$ zVljJW5yVgxel8D@Fe-~WREbjk1JmW(6H(j6Im?XhP4yrXkQs$S4 zdq$Z>uA2_c1}fEb6LJrIGfTs!4UPj43JQ&YFRs^{c$m%m>GK#GuoV>q3yH|fm*i37 zXN0r*!O$m?uZ^y-X{4F-UH@i#t#uRP&__wzNV8Ez=W4|LqIE>=Usb_O*GqKtLdf4&F%&NWzPzL8VGk?l!fo^ z$xcH50-l>BxUOV&y){|BqS|P{=j}adW-j%#hjGpwabWrj3L22;W}V{q5)LKOf{5^E zf}1emy8;xV8n=AQu+h~VY-5(W2Q@=})tX144+L-~7~&${)v@{i#Rbtb8@GXRvgptc z4_ZSI8!X&4^&YO+&{O?Cx^9+tzgzO~Stx(yj21~HDOI9LZIoz5KafXhkoXSmk4&SV z>lrS={<5WxH8o_Q@b!p(Ac51$Y(AvrO(4_OMH*YnS0RpI91uMrKfJZ8sjuMxU z&57~Rxs(O#)ka;D`%SsOGSYyunw@oc3j3#E-$gl*EU7^d5Wt?xe=9#x@$ONVkrtS2 zEZKnEwrFpLa>^>m(7e50KqS@Uj?ANL@P8HgWr6$IDoKwzh{u){Q1A_`^U{MfvHd?lX!jR=6H>%{>{p-*83Lc&pGm&IZLTx&@K1h_F9OTe7U2Hp&ZTo6l_)* zg$w$b(H~M1je>{(Uh4^d#t&M_0KU4p(p0@!dNl_+c;}xMcT<~3CjNFYDxhJOA@T|M1i>JketndMi&e{RQ zCt|X!kRJ{U75sg^0%*<*ohLO+t7Lw%bm;C^d}58hOe!<&WIkms`hrTO&6i#qal8_S zmthO6$MTX;>F`l;2za79eVm-$fS+qw2Ttu0LX{@YnBNA9Qe`^-2l>lPPUAj7hU&53 zVHsDO!k>zp3Al5YsTmR}GW`n3hAmQaBVk|d(r)KXmWRn67UUQ*bL13q@GRt)MX1nwA3~u*MIsMx%7|#qO}*eEZLky+sz=cYQ9`gUnn89iF#VGtIqT9Q z>al!M55`)bQ1B*KS)o`O*qV{s+Xb+btBU1;*cF3haC7pT3}!S&y4e7_IAZ#4SiNb& zu|o47cdf4q!oL*gIw&hP(2+gp3Vx>^P%f>(@NHRFo8^X%ncJD&dFV z5n-bVo(Uj(Z^aikGTVVqyl(83zbFWIQVFCY^p-|QEtYau%5ML>gMD7g3L+l&8>Fp+ zFB-X@Oc(%KSc|wA%%TO_y^!b#@>50S3Qurs&=3jSb0JgqoG~x;k=eUpZu}LoX&P!C zZwk1=S>E>0;}P*H0cbgoA5Ca*fl#7xv-TJ2S<@p|;9xqj+?uUf;rE=r6AsMi#mh&G z6{Qhv+xVBk14arhIM$w^)t`ss!&|6h#5u@JWBppr;Sel1~bEHpGf!|NsIljH)RxZjG5Qvsg>|QZ{vZqUCDLv(XREycYs9PChum`yN z$B?tku~n0eT%G9!?J4-fyjV%OslvL;{454lFQh(9Q-HA9K-X-p;Dc*TcCPHCkL@%5 zDdsIYM2&a8tm`JpEALA)^)r6je4-xEWTtPgjV7BzKFUeQgN@h~eT^cqE6C$IfwK*V zbSe&mEm5FOgts~$oW=TeP)l3~`B&{W=>5(8JfhVF_$XV3Y+lpBBoXoGj%dys=LBm3 z9F=7mog84)(&PQ3< z3NB-|O5VXgvPwPpxNcBiwjUYtoyHLuuym7f9u1+|VU&*pHsOE3{{kbrJ zzQ}yVW*OH|>>)VdHszS4kf0EbKN&MY%IBbCXx$fcm;4Rqu$+d6#73ljHcicq8Mdr8*RR(A4;sP;Faz(W!$C)q$m{#)m5})ZtZK*VXgTU(aT?g`>T`|ez~*4;yWGz? zN%!;%D_H;rP!g6W;$6O^=>oKo{|<_;Yc9cQ;5X;9SzWqu>?>=nF$^0Y@hU$?qht6g zqqkBWL*`REu?3n3%6Q|Oy(_WoXLatMCyNVZsA2GGmCzT}B!FOWSm-hbY`jxZJ~(!| z=`wC-c8*Dn#Pv~XEK8bRSSxSw5(y8I&*npIiG;3lC7OY`fE7YF^-j6TBW2;(6VL6L zdesqU#Yg>$d53zOJ1%ZZ6;fk!Tha?^N)Bly_3ZRm?nNp%P4^H58$}hZImMhipi6Sl znVZr=xrc!HARMB3)G8;6ck0?=SIa`%=x%$7Y*p@hs-jSVUfd>%OW4iSOcI<2Or@y% z>yh=M1}2H?egr)c4BzhbbY^&)-16Xa&gd=4!_r)ECvW&T@-Zpg+iDG7g#)#0QTz~J zF%U-$B-!f-5u3|j3vRzz<M!zRe(I&OjBk<$ zf|xYE8P#jBg@}u8IKc!!wNx%GVtL^%a9T6&Nm};G9d6(fYK%2H@$<`O-bBiTSNxkT z)5|}Isu=pO?rqhtf++Jxd7e;O$3GGrINh0RJb*==vzKO7!vC0?MfdB=AZ~vW<|QuHQkzR?;qkLEhNX?Dx}x7z!1+-Vns8 zeLAFqg(vM8Ku;pH`5X4V8)&fOCPe@*awDjaf8ZSZ^)J10vG9v@MSFl zbL*TBcyy49Iqu3g(3gt_UQ#bNGS{mYn5}BBE@*+7+CHoaQB)^pa5zQ6_KYTmdw(O!(-dW96C&A zSStpR6Enbt3T?yxMb4eb?Qm68v~GVUBEQ7RKCBf06+l+PHV~NRPyK5mNu5kL-3Mr4 zQRo=8Gl8HIUPK22mS_6dI>pDs#s7PSj9&P%%mxiP%fGQ z=%3#}89~{FEbFlbAv|B@|2cl|Nm`-$TMxyYOsO0H7kn%oCAuxtp4W(aYk8|pOIMHa zftkLC`kWi4xT=(>3KE<%<^S{`P^n1_P#TW0o=*2P{txF17xBH}>h@toFS5_0FX6bn z%`v&4hJF=az|8}@Scy$Y8lqolC^L!QcH7?L7xfpe?n%9YA)0mzdRpr6TMg|4Pid!_ zUC_F%$OTgX;}=~f_E6|2>l-Tg1k*IoemNh0Hs-XqfVAifQ?e$AnM4Qyxm1rxVj2HH zeHW;bBoE}YKnsk-IOixA-GH@TcR=*CZ5$1G^j6XjZdIXO5uO4VgZx(CVgO#O{?a`#0LQ~!7R@I@gUpf*_GYXqy)lNqKaQ7pQ zv(Vkk`K$Yg$_#Op;7x6M9p;L6PBk1BGQR@dP!$wFO~-_{MSFW5OAj7Ten(Rj%54_; zW&2Cvt`Nox2*4^njMFPdPnk$TCN;2Dr%cW!wvydf!sha&43xRS!4o|e zM|k!vf#Y8_6Zp{r9?jvLCqmt1;LNhW5Awji*4=keI*`&xd;}y?Lp0%cY4}xjlklbK z0mxroB)eaM5AwgtQFlR$NA_BojCM?~XER%wn&F@7*M*tn>@{4AmXK}BZs+7<^e zmHV@F2x{;^%n`|=w5O~-{pJ7rGn@avk15+@^t0)s$tRydgnrGa#Kx@b+a7J&fgLd( zDkP%f4ja3+T-a(zPYfWvY-gVscBv01$FBL#kKag` zZeC&jV~~2CJ8bi2E@wK&mg6%Bmln(mY$c;{BN1=Snurh$3;X${Im1PA&&nS*`Cs6w zf1agGabD zOUgVZ_hCy@C6QsGcx3%a@7VW<2>SHY8^V~irJ>V)e?ZRxXgcKYEl1-u8Q}D#fLnlb z(1`~IQUCW3sNt>SU$T35aBw70xK>mIf^NTBmO0U{SHD%{@v>iE?_2c5?51@VFMfu; zmpt$y|Crk2icL2?0THPW`kB(4cuX{ukG-)hLfV4Mqy^h8v|=(v8MkPHK?I;1`ATm} zVn`lEYo~)M!wG6-)wbRduyo+kePtQ`w6$SRS+W~+$h6*~;vr-j>S=uib4es|wWLS? zkb>c6w3m=ZsSf*)n7edo0=fxsT&yVlJP?N`9;ioWpx}Ng5EPAO)R5o6Aw@!)=}&ZL z&MLYqN%eP+1YGkuLe2FSfQ=rPa`{t)vy<^x$E#8eoP*AT@)k(wxe5c#ev8)RMW+#f zYA^5qVUPjA);P<#ar66yqg@Mu&nDMRL@x96ZCMCTDtP0FWOi=)_Ik-)ALdoiMtB9d zWs{+*IehyF8#akbSlK;EGD$MW^<}f>l)&=_B@DccH;GfGqi6A_gviKV2IS1xYhc?v z^}R6i)Yv}YA@|ZJ4oQhXndOo(2DmMng3ar zc98$%y7LN+YNT^D*=G*u?|NmwIH-shJsy1pJMa+wHnLkabU-|7&>Qw8B81hn5OPj& z(nCl9M{BH@|FQdLS%lU|=(AMoAmq_Q?}y}eL^VAAWxi8cYv8g4!J$nvUzSGf-1yIw z3@Y_*^FQ3|>2F#ev^tq=R|m}x7z&M<@%N)+t!|Ifc=S98)Pteppa}ivWs6=*(EPC5 zCa*?mSdp?jUE_6qx$;E8$nQQx@m+K53^H?<%aA9JYdOoHU!;Da65#2-eH4F=wxRPE zCoyi-X+4-?a@kxs6r`U7N8Cz4W)kG3a>&jYMEwXx=>zk>8y%KA%JhCNze->uFd;B7y!Ib?vrJd*9kBkZhBqqouwhQwfpp&rm@V z1wKE5P7=OZ%6jTELi$Y2)2RxkvD7C@ahgtp&bF0XY_Rf{o*!^UqA!QY5u@Hs}|8JX@klw&l#R0 zyvJpyqj^}B+=uaprDF;$=lR>{odt4awC6!ddDS!1ufj%8%YO;MJY9_6O^V5J_eo0+ zc5D%(Bn=yjH8_dfn_%ULAb&qLpE^e~}vAbSv&R zQwuLUS$F$Qk2fkVzt@K*uiz#R;8BOwIO}=JACLj&-++7pYgnX=kQ;2egJ{bre{yz8 z_E!Aff~Q|tDf?+~k#-Lh&}M)nU+qReEW&q=*9|js8o8)RXD5Qg`JS}KbEVD#fo9~K zZ>h87Z$24Px%pwPj$g>RY<@Z*$bWTY})rwMNq;!nIN3O_TLh+!OTA8a;K+nD4N@mst~1?O9V^ zO-ivaMtfy&^ew( z{#y-meq7H!M(vhzIyBj}OTzO<>9bzZ54h+SBZiNOw?RFd0KS{$XQM#&Ucc4&y?FH1 ze+ivY-POsXtx0RV6aD(RHe&aCmQO`EP`DwT0XsNIh&<8QaBb?I=d8q&Z!lK8^a?xh zw0SJipb`nFms{mt4+_)_nzvFDiwv10$;%3CA9hlQy9@<%3g`&*{|>&RT_`H^5lWM0x=T2Rn2 zl0H&%W6clbMAHb*aT0Te>mpgS9qn}33x*TUR#jbaT{EW%qye4L$YFA zbVpTJizURP?KKxH5_qrjBgreps*m_@ZBG5z+fx2sbW0Fldi2BZLe4w zl1TTL_gTI8wZcF6s-@JYE_{UsU;9Px&~TuRoRKM=3V+3Zw_;P$a!hNCS53VIk#MhV zHgoiJiafNeX6)SCB%o6zk)hPEtPI~`Ur;5zG=RGH6T;8`orADlFr{7qj{#;7_dT?P z?EXrAD=l<`)3soEVrRzc(ZgJKmHQ%r56E+Rpx(f*q?;sGP;Scm?HPxImXI-Nn0`w0 zSi(CyY2+Y?@e_efO1j;&RCJ1y(xXv{CAX56w@NlBoOAFz)@W$$cpo!ePJCTb$AbTX z@5ra9IRIOg7Gw48tk56cC;O%Y{PxF=G=6D~Wp8`Yc129PO8&;jyGKQ}S$m)Jb^kpgE}`{SK9e8JrvqM0c(?w`$k6m3 z$msj)xka}FNNM%av!`SvgBeW`<6HK#g(eDi#F4D;HGcfX4A0nYZ!~^_sWVy%^A9)2 zoaF0bC^PtAZyD|94PDc*`-u_4&`Mm4dBRYlBbI(jZZF-{LAo!g(uA<});c=MOL?hM;H4Smt?3=s^xNpkXcs{VyADd%}}0Ww&9KKc&89AWrO zW6X+Df9g9Sq^@!7&5snVq2L@t7JGgp55D}azaN2X*?pIp?NNX;Jcn9VJGbN>khLVX zYu7pJsK;bcB#)PrPNADDD(p8{cB5s`n~^+(Axfg8?gUAN^aI!|VNhw##(X>jbP>03 z)0|1^=%EYruL*M+)~f%Bkp;g zJrF4m@EptkV()o^lIM!;F1pH&`vT`{Qp6cy%WM8-Nr8@+E51RJ#K?2hN0TRo{hHJx z&^0B?x|#w&m|gr-a*d;xdqH36Dq3f%e0Ml@1mz++diXDKRNho+!a|luq-CFEq+DYo zb%g$YAPt4xTN(v#g7`hFeE|e`WQZ$oh_Ac2Hs?mbUp$>?pLP>cCz96;#=N&?-4zcI zolgamhH~zJ`kYj`GgtpHfez+3i>G-rJ$)zX-9yKp?h0Zba|8tGwm&PN-;$h%V5o@K z7!Y8|#})0aRxyp?@zi$e?_Er3|LvQ;Q{Oq`^XqjkqI@EQwguOq5z5)e+ig zt`2<9x8tO>Kzzd%_6Es}mKZ)zzx63&`K#!!+XTBoLceG&{~~uAva#GDdbvU!GM^}l zYLoJ|8zlVKUGD>L?V=hdda*9@eRR2!?OCXyn8TI@wikNNtQ8vFD^)*Cg-niV8yLzQ zv3s63nY$8!S1B|wScB6C+XfrYA%fN6qC4ib+a{${$!mB56`z2(r%W6r19m@Ow(+sH zFvJ@2jk2tn_mTq0KkPSmn9_;*sXF@C3>QFu8kr0x%2-fQr@1Q|aCZ=}GZdBo$PwVu zAffZgXMl}9x2%O=iC@aLdnSrcSS5K~SFYUPJABTX^SlAGQk@QkOKuIh+a?;iu2bmX z4foo#Em-onF`~X4euN(osaC3u(eJTQ<}j$C1jWTKIpChb{+D-cSl+}EjICw}#aUM8 ziRCr&8hkZds>iRTQ3|T;LC5pA5y)YJ`(&1l^Hf|KT|PS8I6NNR3Ve^Yix}H#8Gr27#Qm)~DVm{+YN9XCG@i5P$r+|^_l!AIp`AiW zdQV|?^Dl-;X>T>r@W7@M+@;@!76$1hMP4uI{3qM9Q}i21h;PBuf7(QI<_eo${|y6RIQ%91YLaWKX!P(4K600JV+UbU?I%fk z(oe%+vhghR8@0CO0vtDmgh<9*!lVeQji-o+e*mvuZ7nKaY{k$UUzn}uI=&$`rQgw~ zy!uZP&eStf!^cb!!x?=y^ih zriC|z@79kJA}G_rbx(QsprX)OR=#$S*ylV9_GY@V@OolKI+O`_DepkP0`;`h^&?73 z?L^79H=3ltb0j>tbK2Fh%O;$Df4VzZeCnON1lRfgs`J1hRXh3ErT7gNX$E1FsI%qBW!jnXbg&iT$$NB5@#s(QPZSA= z>ENUj_u2&Ysp@kr6BH#=+Zo`pFuG3mLh}8nc|U)qP`>PbmS^m#t%gp&D6eK+{kn;Wg7t@V%_L?9|`&E4d5uJh6%fH!yG-fta{^PI1 zCWo9*_jLN}oV8#vUw)KIe@L-Qq^^4kXGJ_a%w(P^P?{RavE@Dch2kLKWh+{IXh6d# z1bfY#)uWaC$gsYn#SMwqfw6w_b&^TeKo&UfS; zk@G%`(O4?+}km(==+3HehFv z`0*CcV)7iR35^scl6h^qf3_=>FOcij%qQQ$rX|O7GS|bM^?(SKE5CpEQBOya-74!m zxN4VCboDs&+QUur%?$gE*^ZIMP@q$5_t^3duT?-c0%d#DTHK~s7CaW9^yNt&G&6@cfk&lvKT6C#k+)s?Wm&UjZF$V6av9)Ut`)icSSLzWzmCZo z?W2~|2A4W~rh}!#k{uD&h0@a<5xT3*{4;Zh8fo2{Z{xKNq1rB7B`wnYb)+>~9HgB< zXQmkMId5|MdDd?+<|l;#{ja+WK;Gsgi~dfj%B}9Iv9GBGEu0n(1WT5qkE*hjQFo&8 z0D2_L(cRSn&|S%!hNQ2h=4nrHe>({6qUQ* zu$l;M7V+4eA|dWde!4wgPJQWvizJD==r$w@9qKb2I0ESW5(!yVGuB)bu!z;BqX|7d z3$ax3)&9!AO4Qzny7+x}`RQK*VC_@Cyqp0mcbbgnHb{fY38PN`ZDMd!lI(d_&zjmk z`W?BX3Y0>QR$yd4ah<0s#h!TsBs#QczGmdz>j0uxtj5Vx@I_@^z7``3cmHh2*Dvu# z+}&BRxZvF3`X=J196}P3vV~!Pnaf=F5V@`^+e|3J<7r-#k{m#CvdRJTlH8u>f%+o$Pa z`%vz+7E>=+YVfdwiEx$aTfUWXg$Keojh%+HK}waONb?L7C#oJR^V1jme|0u5Dsn*I zL@R~ljdXwd=xWe=?+7Hy)#tjuqMn#`5axMh8jdm~1DNu8!u0E#FoR={w zMdg?p)8#K!1w);$JLH_N@HWwPUFZdPI98qW9Q4BUYX?~Ul~Iq1aD*m#<-Zn?Is1t{ zPr0AAG6Nv<{QoQvYARKx6|Es%B|j6)QtuU_H5|{c#LBouAu_hOULQ002tE5XkvAXY zplcTn`{KPMHjprhZzWh%)U&nM;*mSqz?C;JmS57-Pb#4uR=I*Q3Z3s9?+oWo3y0OC z=`8Z};k|B_yv4n6hY@h>dr9y6{&zR2K(F*7Hj)t$$hY{eHF$%o{znIrfRcN=2|tZ8^_3&257m}|V#VzWYqIlC=uvl69axhiz>OY^M=U#osCPBh(f^Km zH0%dJ&&dT8vCDw3ySsppxKgN$ksw7rP0?2+)~+iOba?iYj;%4C`@vc z(B85Q=Qklu>qI@>d^K-I!$(6S<4y~h_cR{%fQE#)l#c`EKDGgvMU?^>wF&WooXiQ4 zdo|j@zl^suqomuO@oF;lCBz} z%>nmxHU~=hlU~k?mXi4h%AbQ=6QuFWgnGHdryFw|5E-(ty)F$R-R-}IBs00L;8F;o znw#zji|QO_f}Kc^I#(9wKzE+SpBai`4xghF9c8Uk`BUh>umUR1{}T?JnxkLRC`*BE zEBARoi}FToY^?r55tigHZ;p_LkljMiGfV)G9>R4UXEA4h$@+GK{-f7=@nb3SywTAY zRnD|5ga(!l2Mu=tmCeIZC{WnrDitsOEhvJEOg=(A`A5aTUqalt@d9amAYm(W#Wg?u zkeP;|Sno~MubuYJxf@{`c#0DBS&^cX-8a%f?qvHhAvbiY4+vyAO4s9WrKuOn3OKQ)*pScAN-s^fmgg^WS zT4SyPl-&29agW^4MRlPWjRk21kE}N>9~d5cT6OtBT5q>afdoaOrO$`7l%q~L*f%ug z@FI=@ZJE&8LVx*$C3&M4`p^^eTTBbzSp^EqGw9nRVcY}VV{B%epKT)fCLS3`@9$e4 znuy*Ai;+U`i3t)uI>8>@Iq|f@d{y)U*BVo^!nF7aRC!H`mfNWc2SN(bAAhZ#EY2yN z4(o1d3mU2#YJx57eu1`I9`Ahe;12lEC+sDTviFN3f#YRMG(BY~G^W3}puPDmuTZg3 z3C6FtjwiV*4x+mDy}J!gQ1_hC7<8X^vFp6&3h1C1_JslWKSNpj0xdm4Y}{hiw-DU@ za6zXqro!cD9@f|wic*Cr(cekEOKyZ@T(Se1=d1)yFMhlA2sC-YRe+XlKh3Y5rw_|j z&PQmhw+UF&AB@;*o|pJG;7wv9LAbsg^o+&0jxLhZcYXt;m9-gbDvvs`Gp)$u4ZuIP z&;~b)R{&VGRgCKi;kD%Z-6F>tv*xd{`Meq$zU#R#ymwn)6DTA#A(JS_2JSKAJXWF& z5wu*ro1`YhU~=v~dX%;6BvD4Dc?^Bf|Cq-J*#_M&PFi-5-bRL~QAO9WfuzpNU9h3& zD}9shFLoOaH)*II+U3&H0DWCK*rwWEFWhYko8UCn1R$W6vot!AG7l2Y2MapO^lZy6?Gqu4Q&K!KQGwmA?@5NSAK(Pi>&DB+MxRM4M(pw=N8HCh=m|%28s6+EyvG6usgu9e zTZr>v1+K*A9;?@f(R!hrzw&+<-T>u9@|AUR?xao`@$G8*^q~V{FTeKdL;L7k^dD`{ zV6(t69O}js8twn`z9$5J4$1@mC0aqS(($}=jPHHJO{SrNF4(dp7OJ^es-b{hN z;v@C)L6L1I&RBajjwgk$s`&32&(ZqCCz=VM$+$LQ#N5Ov^>2AmFTeLBsuJ7@?>?n` z>X+KkY|gn?sD5&n6oE4=pQ4lt$jrF*m2;JX2&Xck-+ZAi8rzq&_5;_=MA+bK7%q@n+Ud2UJ8hn%6(2K&L6^g zJ`!EDeZfC~%y@_jr-x1eDYt^Wp(pN!q&$fFLA3^(7BK{}xck25$U2{g6N|oH1ek*R zk2wex`=?Nj%7qK{{R{YYnlIll?{SYMucbb)fP&FEdqk92unYv|376sQ8OR>NNVe}s z-w0n-4i-e_&vvCzQuF66WRP_fv&KaZQ;gt1=+d9~CR#W22(Hj07G(6m>miZa=?b+; z4nI^~S74Ri(&W*1jp2iBl2+Y8fn#U>E~4P6;tyuOKRdTfAR*2nm(ATqpx-wer#<;n-cH ze4&jbzPy`)09vCdz9|QOBbg=eXXq20``3#Ln=WjH9j^l>U33?;AX@14_b9rkg+#w= znm$7(%3f{kk>EL_YX&RrL9*fP#Y_>Vis~x($Uu}b!>&TY{RH0*THFSqaZO%TWiaUG z>*h`zb(*2XD5!U9T{pzOmtXax|0G5Vfmuab!4tlO?Z#rs2&l(TVgq36R3u{Wh?;ner4?_?$IiK$uTPNo;eZR`#yr{|_6 zd3oj)!)2_4&E=9|@(**JMGVKmpMc;H$0glq!6mHMl`I4>r}SBs>-c|t!q&QLxQ*~y z{ZS57KZX=1$h>pPio1x{EMqFV57Y5*u*G`9G%bp0TK%O{37@F-7$zehH=f=Qn>- z`s28&#vi7OfB<7Y4V@lr!dW&j!XfLcAM)Somp4Qot&buT{Jk<|QuC)chSGLn^kM!E zQ5Sm1aC@latmP#8{p(NW5Uv31#VGD?dt5<`pa*nRyvFkM>DYWZDML4Fy4x-*XPW7B zYOClIKFSLc*q_GXs)LS8r{o8E=LUkMY3!MrSOs&d4_t>S88{=4taF~>jBsrh?~L#F z1(uH$PiZ%TAk<~4y_6mPaZHpD;kw`AdjOTX(}<)Gn0H#YK)Gr-k@;D3f$_Krv%~5v zz!s4UVB?ELo@(U}Y1f5*;YhOlrpT396s`NyYBUfK<*+8MBW`ux=mMOGJY#V_HUU1X zT%lar(51eZ@7K_x4z=-JhlYcSEJ}P_<*{;`o-m6 z-*0+{mF@-Baml+UkYTy7ixeR?Xr{G_-V~dr8@Ggik)&aUy!Q&Pef~gJClUh9Cy(`R z@06PxOx;?WGbiPjpCqjIn}f37q`GbT&2t2AD%&w2yb;n=TQcG^r1NB=*X z&OM&#_W$E|=}rnODwSC2prchPr`hhJTcxNZmBTvTO9zLYQ9q{3FIRLUxH z$PNxgAxjQ(+^k`k*=)Ai`FHhwJbwS+!DBY_`CQlae!pL@=gZr0hs9j2U@oIujO$Kq zu0IUoW@3AqQ;AyI5g4rw{kYr&tZLd!{Bq)AKZgD*Rk$jh6lFE~Afk5aQyfgeC#Gl@ zY5HA>d)J|Q3%*u4A@ZO*H}bYU{VFmF40RbJTP-iwPGzf@`&H%HMKa{;^i888ql7M8 z-7}dg-OiNE3xJr3!+WbnoGB^9-ugAFgmlB^Kw)^huyTc}Hw1bO0di+IK_%z==gd&y zN(BT1v-{6+8G+`0ko@viqz+A+%*g5ef zAI`JDPiSXQpf}U2CTFqzYf$Hxm#>A-;m$NTjaMe>alnsbugt4o1?McG_M3b7xhGF* zk56yv0!gJZ_)^0k_R8n7zs<*ku>|ZAxD~Kv&P3QS=P(yj{$TyV(JW%<`N;$4`Mabk z(nH`6jRWTQ=hD^Kg{E0K(^vPQPhihu4`My1MIcWjOxh}aFMTLgNH^YIq^H%uHic18 zH%X@cH;^~c=)Zt2V*&OLx`Pgg&fwNq*2q} z|8rxT!WR&i6K77`L?!W(d5OlkA}kzc`Bh#s4|K>a1{O#S(lqJu3TvV@aUKz3_=7Un zxU@KWAnsTN1a8^~q0FN|CLl0#$o1g=z5Y|vy;2n)TFa>`uVLMUUZ%1f*`3Znkb^!Xle$zof!if*H1ArS1wAp7(V! zSva^HhJ`e_-GNNG*t6wALGqEORI<%}w}fL2^BNSJmDIV$q6P@-lkgKsz zv+9I`v?G>Ovg3ZY<~M@0FC)-UWLQ>oqcX~&VO5jjh~cQ_xrnblEi7VbAyn#`54z3N zKOdrrox{|$W*$o$AJCFx2pIMuqODFC`$O4U|BY<#`_!TLcJg5k|6wdbzg_=aKI%Oz ziK`E$(u7(6J>rVo09Ws|;x+#b^7|W6U|KU(N%chx7v>?~DoVY3RFV%UzUvkt*;p)M z6U(hmu=@Lr>P7M>jvOf(!pz}eI1=jcux@=eje44?EBk6(LJ8CSeY&9toaRSeNa`!2$+q#F)6&dp>=D)fd+=u4eGSjy&4N*iazEt>`X zlbk}bB&X669jhfZP@q#S*>vP*s4WPl{{xWSX2F*dO^7y>?D*gXVK&@3+{N4(_CSsn zEJ@?umsn>>HUfEFFm%0Ytt@~~>Eyt(IOyl}E9C_jSPiv>)rEEF>a}; z#Ofh+s!6?pCy%TJm97krOH^lR|4VCkDN)y~{>j~dT-snUp>;fh(tJ4%S@q}*dFtL_ zKjb~{7c|uOQrLYIai$1;Z?8INm~S%$MI{N7t=CiaH+hr2>WS@IJJch|RSZjzRtnQ! z%gBgjgNj0#1BnnKD>s_| zGu`<&rrTw=0Z&)+ZSYeF-~=eM|3|Jdyw-es!HWrmFB$U8xsb3@u>`U$bJSM#rDAL2 zC@KFCbDlOxU`mPUT}tXD40wkc&})qKtu7ILesi#qXLqYxd~eeYKPe^4eLvM-+7E0y zPro`JeB1C!&J18@u0BGUVAw<16_33Z9HmB!;Wnq27kZDC69cHi)pu;pFK4_^piamn zxGnlGA z7k*)bh{*;)1H(!CPE_Xw?({l-&=2EcP;WHi5aYNh^UwacKf9*4zJ23so~TM9%|%)8 z{-AxH{%4MEj?NUjfo`QNo*QXGH3KFC6QnuPB3I%)tTK_w_b8v(Brytswx_d7*z=}g zQSKXm6<@)kZNTWiLM^IbGfC$*`gCn{#iW*zvD0}rx)BD<`fY(oSVKW^; zCD|7OgaxMcUfVJ#LNc8Cj}9ToS!N0>ZUI#NKmLm6`SoiKczDvf$FX%Xpqk4r?<+0J zw7Y-Sp$VpNGramQlJ&fuHaQ8WMI_KFu_P;yP^LN=7fd{}k2m?na`m}B1UncfX@O5g zrhW1p5xq^Q_ucAO3ewYj!k51t8dVkjx^#&*)rtO;_^uAmrkg5ROB?ParVHX1v0ZBK z$2c?vG3wV;Jh&$GX2ai&f^ceuJ5(VeyyXq5$#?wWIhR>wj)H$pP6?1}ws}gPNbN66 zYUp>T;6mdc03dM*q=LEp#6vWmD6~89bop(Nq)uwnQH-rK>rM%r)pl-FmNv|>op%+} z8krEpu8ByyK6x69rMLlu$N|%(sr*Z&iQbKnVbd2P+-c!qV3oArG%CnA5}W}owha1? z?6uz@+bG4eO|<<}^y26@uP0U=qE7DZ5LKR#oZkO{+Oz5l1t*e@ zEM#CCy%3oEST5WmAu7EA=`+?saRdM>45~v-zwEYqMZtSBX z8FQlM)6mcxpS8`b(eeVJ>-16V-_Oy@p@Nn4I>cATxV7gz(0a6Fe>e30_fCD_oFNY# z=fa?UL7XWW6(@seEz_FR+H_gYsMs3-N=fy;J1y@`USq&ihcvm4e8E!3^c%D!XcEIz z?9mKyxeNhv@HrMW9&$nbGdT$2Y9m)^9?mj+D4LGF{m6!rnQXC z<$x^oF`za$kB9DMl-1M?42AO& z!MAw1u~fo9706N2@@M3&lIO+u=IxQs!7fbLl(4vO2Fl$3CN&jx13Gx-P2oVl@NZWGE>R86G}>oe5&UGJ*G=M zYVit!82Gkc+>;15JQHX;-sl4becnCy1TT@!8Dn+W^$mwXozk+0Eb}M;(FGZTpOy`= zX<5jO$yC9+=qVo?FbSoN<;3)X zw{~OQrMlFbhH6f2dCRf?@weNJ4cv#RBDZ|4@$HdiKiluFeHqvG;>9uFjow*r7X-{t zI(qaBhrKZE)sd{bp_@;7&G*axF>&nUnU_Z{Zpv+2adT?E_ns@^;pXc*=AYFYj#Jrj zY9$agss6&}ixP}oJP}S6!xM#xPRKuTPQqc|6S{__8B+T@sSztskZ1W*uurTZ^=9=dkAeaAsTI<4*CcxlOL|VebmpRxB+Tr@vzYcN3;qv4|;Bl z&brOr0P(n6+)(RS+cq$709mIjh#L#Os&kUMR+Kk3aX*)o3$*8d9cFWT|MhWbk{7l6 z>==8J%2!L}Q4Gz6fbky`?-aD_31j-|ytPwrO@dK7mOnw$8vNU2U zMw#pnh&1>}r5=tnhh3*8Yk!bOO?l?L*`!QdQkr!2v=!E#ZqBPC9s(Ad!&=GbmQogl zp*p29i7HTn$`^Xd=LJm}DE*1XZ_U}ei z*)bo*O)Unl0CDQ&UHAv$Qw~GfB@{N%hY=U%Vf~6Ud$JMRxe-0w>-)7KtsNC;SrP*5 zOT$I4uYw_Qpc;`WJHbAWbjp-_k|;c(;(q>0hQutFVT ztRdg^FKTJqkuU_u#Mw;gk;jogopGJ8)+np|$>7)6&l$D$oKc32;;3e2aWJn=9&~|> zNrl~z+z@WH56+$>IMe|Iit9qe3~T1tVj}ZQuP8;t!1@NKOfukQ0qaS9#XGNqqdqRbnHu*tH&RV;m zWKL4mBQ7Sh_=Tzsp37~z%Ovn8UKoR)VFC?JQwm~|APp607!6OTw`K!W%$2XE#^7IP z2~lQ~?nOCm_%%Ow$k~9v0T@|Nci|&e89RSmGKj;chwHr73)@~AKOhoVP31!lAS>;Y znAJ!W8CR(@(n>LYkTy;X^er-IWr(P$xF=>ikMWvGy$KwMyv3!3+S QPXt$e3tE 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 UVaciP?=L(>*~o1KZn6CRf8PTyAOHXW From 845d6ae7d3170b5470cb50321e45c33fa332e39e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 4 May 2023 10:46:59 +0200 Subject: [PATCH 114/467] add binary to git ignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c64eca2e..860e46b7 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,5 @@ node* .vscode # binary output -badaas \ No newline at end of file +badaas +badgen \ No newline at end of file From c28c25cfb261435ae7a954b7fd8280334d926546 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 4 May 2023 11:07:47 +0200 Subject: [PATCH 115/467] fix docker folders --- tools/badgen/docker/.dockerignore | 2 +- tools/badgen/docker/api/Dockerfile | 12 +++++------- tools/badgen/docker/api/docker-compose.yml | 6 +++--- tools/badgen/docker/cockroachdb/docker-compose.yml | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/tools/badgen/docker/.dockerignore b/tools/badgen/docker/.dockerignore index 6fa68e74..452177e8 100644 --- a/tools/badgen/docker/.dockerignore +++ b/tools/badgen/docker/.dockerignore @@ -1 +1 @@ -badaas/ \ No newline at end of file +badaas/docker/db \ No newline at end of file diff --git a/tools/badgen/docker/api/Dockerfile b/tools/badgen/docker/api/Dockerfile index 4ba5ed52..742e9cae 100644 --- a/tools/badgen/docker/api/Dockerfile +++ b/tools/badgen/docker/api/Dockerfile @@ -1,11 +1,9 @@ # builder image FROM golang:1.19-alpine AS builder RUN apk add build-base -# TODO WORKDIR /app -COPY badaas/ ../badaas -COPY example/ . -RUN CGO_ENABLED=1 go build -a -o badaas . +COPY . . +RUN CGO_ENABLED=1 go build -o badaas_service -a . # final image for end users @@ -13,7 +11,7 @@ FROM alpine:3.16.2 RUN addgroup -S badaas \ && adduser -S badaas -G badaas USER badaas -COPY --from=builder /app/badaas . -COPY example/badaas/docker/api/badaas.yml . +COPY --from=builder /app/badaas_service . +COPY ./badaas/docker/api/badaas.yml . EXPOSE 8000 -ENTRYPOINT ["./badaas", "--config_path", "badaas.yml"] \ No newline at end of file +ENTRYPOINT ["./badaas_service", "--config_path", "badaas.yml"] \ No newline at end of file diff --git a/tools/badgen/docker/api/docker-compose.yml b/tools/badgen/docker/api/docker-compose.yml index 80d85684..6fc11871 100644 --- a/tools/badgen/docker/api/docker-compose.yml +++ b/tools/badgen/docker/api/docker-compose.yml @@ -2,10 +2,10 @@ version: '3.5' services: api: + image: badaas-api:latest build: - # TODO - context: ../../../.. - dockerfile: ./example/badaas/docker/api/Dockerfile + context: ../../.. + dockerfile: ./badaas/docker/api/Dockerfile container_name: "badaas-api" ports: - "8000:8000" diff --git a/tools/badgen/docker/cockroachdb/docker-compose.yml b/tools/badgen/docker/cockroachdb/docker-compose.yml index 14da23d2..fc9cef32 100644 --- a/tools/badgen/docker/cockroachdb/docker-compose.yml +++ b/tools/badgen/docker/cockroachdb/docker-compose.yml @@ -9,7 +9,7 @@ services: - "8080:8080" # Web based dashboard command: start-single-node --insecure volumes: - - "${PWD}/badaas/.cockroach-data:/cockroach/cockroach-data" + - "${PWD}/badaas/docker/db/.cockroach-data:/cockroach/cockroach-data" environment: - COCKROACH_USER=root - COCKROACH_DATABASE=badaas_db From dbd7e55290dac46b477f1ea7c3946b6d85948495 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 4 May 2023 14:05:03 +0200 Subject: [PATCH 116/467] badgen with embed files to work on go install --- tools/badgen/{ => cmd}/docker/.dockerignore | 0 tools/badgen/{ => cmd}/docker/api/Dockerfile | 0 tools/badgen/{ => cmd}/docker/api/badaas.yml | 0 .../{ => cmd}/docker/api/docker-compose.yml | 0 .../docker/cockroachdb/docker-compose.yml | 0 .../docker/postgres/docker-compose.yml | 0 .../badgen/{ => cmd}/docker/postgres/init.sql | 0 tools/badgen/cmd/gen.go | 62 ++++++++++++------- tools/badgen/{ => cmd}/scripts/run.sh | 0 9 files changed, 39 insertions(+), 23 deletions(-) rename tools/badgen/{ => cmd}/docker/.dockerignore (100%) rename tools/badgen/{ => cmd}/docker/api/Dockerfile (100%) rename tools/badgen/{ => cmd}/docker/api/badaas.yml (100%) rename tools/badgen/{ => cmd}/docker/api/docker-compose.yml (100%) rename tools/badgen/{ => cmd}/docker/cockroachdb/docker-compose.yml (100%) rename tools/badgen/{ => cmd}/docker/postgres/docker-compose.yml (100%) rename tools/badgen/{ => cmd}/docker/postgres/init.sql (100%) rename tools/badgen/{ => cmd}/scripts/run.sh (100%) diff --git a/tools/badgen/docker/.dockerignore b/tools/badgen/cmd/docker/.dockerignore similarity index 100% rename from tools/badgen/docker/.dockerignore rename to tools/badgen/cmd/docker/.dockerignore diff --git a/tools/badgen/docker/api/Dockerfile b/tools/badgen/cmd/docker/api/Dockerfile similarity index 100% rename from tools/badgen/docker/api/Dockerfile rename to tools/badgen/cmd/docker/api/Dockerfile diff --git a/tools/badgen/docker/api/badaas.yml b/tools/badgen/cmd/docker/api/badaas.yml similarity index 100% rename from tools/badgen/docker/api/badaas.yml rename to tools/badgen/cmd/docker/api/badaas.yml diff --git a/tools/badgen/docker/api/docker-compose.yml b/tools/badgen/cmd/docker/api/docker-compose.yml similarity index 100% rename from tools/badgen/docker/api/docker-compose.yml rename to tools/badgen/cmd/docker/api/docker-compose.yml diff --git a/tools/badgen/docker/cockroachdb/docker-compose.yml b/tools/badgen/cmd/docker/cockroachdb/docker-compose.yml similarity index 100% rename from tools/badgen/docker/cockroachdb/docker-compose.yml rename to tools/badgen/cmd/docker/cockroachdb/docker-compose.yml diff --git a/tools/badgen/docker/postgres/docker-compose.yml b/tools/badgen/cmd/docker/postgres/docker-compose.yml similarity index 100% rename from tools/badgen/docker/postgres/docker-compose.yml rename to tools/badgen/cmd/docker/postgres/docker-compose.yml diff --git a/tools/badgen/docker/postgres/init.sql b/tools/badgen/cmd/docker/postgres/init.sql similarity index 100% rename from tools/badgen/docker/postgres/init.sql rename to tools/badgen/cmd/docker/postgres/init.sql diff --git a/tools/badgen/cmd/gen.go b/tools/badgen/cmd/gen.go index 37bef1b5..9aae60c9 100644 --- a/tools/badgen/cmd/gen.go +++ b/tools/badgen/cmd/gen.go @@ -1,9 +1,8 @@ package cmd import ( - "log" + "embed" "os" - "os/exec" "path/filepath" "github.com/ditrit/verdeter" @@ -12,6 +11,10 @@ import ( "github.com/spf13/viper" ) +//go:embed docker/* +//go:embed scripts/* +var embedFS embed.FS + // genCmd represents the run command var genCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Use: "gen", @@ -37,47 +40,60 @@ func init() { } func generateDockerFiles(cmd *cobra.Command, args []string) { - executablePath, err := os.Executable() - if err != nil { - log.Fatal(err) - } - executableDir := filepath.Dir(executablePath) + sourceDockerDir := "docker" + destBadaasDir := "badaas" + destDockerDir := filepath.Join(destBadaasDir, "docker") - dbProvider := viper.GetString(DBProviderKey) - copyFolder( - filepath.Join(executableDir, "docker", "api"), - filepath.Join("badaas", "docker", "api"), + copyDir( + filepath.Join(sourceDockerDir, "api"), + filepath.Join(destDockerDir, "api"), ) - copyFolder( - filepath.Join(executableDir, "docker", dbProvider), - filepath.Join("badaas", "docker", "db"), + + dbProvider := viper.GetString(DBProviderKey) + copyDir( + filepath.Join(sourceDockerDir, dbProvider), + filepath.Join(destDockerDir, "db"), ) copyFile( - filepath.Join(executableDir, "scripts", "run.sh"), - "badaas", + filepath.Join("scripts", "run.sh"), + filepath.Join(destBadaasDir, "run.sh"), ) + copyFile( - filepath.Join(executableDir, "docker", ".dockerignore"), - ".", + filepath.Join(sourceDockerDir, ".dockerignore"), + ".dockerignore", ) } func copyFile(sourcePath, destPath string) { - err := exec.Command("cp", "-f", sourcePath, destPath).Run() + fileContent, err := embedFS.ReadFile(sourcePath) if err != nil { panic(err) } + + if err := os.WriteFile(destPath, fileContent, 0o0666); err != nil { + panic(err) + } } -func copyFolder(sourcePath, destPath string) { - err := exec.Command("mkdir", "-p", destPath).Run() +func copyDir(sourceDir, destDir string) { + files, err := embedFS.ReadDir(sourceDir) if err != nil { panic(err) } - err = exec.Command("cp", "-rf", sourcePath+"/.", destPath).Run() - if err != nil { + _, err = os.Stat(destDir) + if os.IsNotExist(err) { + os.MkdirAll(destDir, os.ModePerm) + } else if err != nil { panic(err) } + + for _, file := range files { + copyFile( + filepath.Join(sourceDir, file.Name()), + filepath.Join(destDir, file.Name()), + ) + } } diff --git a/tools/badgen/scripts/run.sh b/tools/badgen/cmd/scripts/run.sh similarity index 100% rename from tools/badgen/scripts/run.sh rename to tools/badgen/cmd/scripts/run.sh From bef1116ac583497f963db7c221b5b1507013769a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 4 May 2023 16:13:55 +0200 Subject: [PATCH 117/467] change name to badctl and add doc --- .gitignore | 2 +- README.md | 103 ++++++++++++------ tools/badctl/README.md | 83 ++++++++++++++ .../cmd/docker/.dockerignore | 0 .../cmd/docker/api/Dockerfile | 0 .../cmd/docker/api/badaas.yml | 0 .../cmd/docker/api/docker-compose.yml | 0 .../cmd/docker/cockroachdb/docker-compose.yml | 0 .../cmd/docker/postgres/docker-compose.yml | 0 .../cmd/docker/postgres/init.sql | 0 tools/{badgen => badctl}/cmd/gen.go | 17 ++- tools/{badgen => badctl}/cmd/root.go | 6 +- tools/badctl/cmd/run.go | 38 +++++++ tools/{badgen => badctl}/go.mod | 4 +- tools/{badgen => badctl}/go.sum | 0 tools/badctl/main.go | 7 ++ tools/badgen/Makefile | 5 - tools/badgen/README.md | 1 - tools/badgen/cmd/scripts/run.sh | 3 - tools/badgen/main.go | 7 -- 20 files changed, 211 insertions(+), 65 deletions(-) create mode 100644 tools/badctl/README.md rename tools/{badgen => badctl}/cmd/docker/.dockerignore (100%) rename tools/{badgen => badctl}/cmd/docker/api/Dockerfile (100%) rename tools/{badgen => badctl}/cmd/docker/api/badaas.yml (100%) rename tools/{badgen => badctl}/cmd/docker/api/docker-compose.yml (100%) rename tools/{badgen => badctl}/cmd/docker/cockroachdb/docker-compose.yml (100%) rename tools/{badgen => badctl}/cmd/docker/postgres/docker-compose.yml (100%) rename tools/{badgen => badctl}/cmd/docker/postgres/init.sql (100%) rename tools/{badgen => badctl}/cmd/gen.go (83%) rename tools/{badgen => badctl}/cmd/root.go (70%) create mode 100644 tools/badctl/cmd/run.go rename tools/{badgen => badctl}/go.mod (91%) rename tools/{badgen => badctl}/go.sum (100%) create mode 100644 tools/badctl/main.go delete mode 100644 tools/badgen/Makefile delete mode 100644 tools/badgen/README.md delete mode 100755 tools/badgen/cmd/scripts/run.sh delete mode 100644 tools/badgen/main.go diff --git a/.gitignore b/.gitignore index 860e46b7..b3e2525d 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,4 @@ node* # binary output badaas -badgen \ No newline at end of file +badctl \ No newline at end of file diff --git a/README.md b/README.md index 2a524a53..93c8aa32 100644 --- a/README.md +++ b/README.md @@ -12,70 +12,107 @@ Badaas provides several key features: - **Posix compliant**: Badaas strives towards being a good unix citizen and respecting commonly accepted norms. (see [Configuration](#configuration)) - **Advanced logs management**: Badaas provides an interface to interact with the logs produced by the clusters. Logs are formatted in json by default. -To quickly get badaas up and running, please head to the [miniblog tutorial]() - - [BADAAS: Backend And Distribution As A Service](#badaas-backend-and-distribution-as-a-service) - [Quickstart](#quickstart) - - [Docker install](#docker-install) - - [Examples](#examples) - - [Build from sources](#build-from-sources) - - [Prerequisites](#prerequisites) - - [Configuration](#configuration) + - [Example](#example) + - [Step-by-step instructions](#step-by-step-instructions) + - [Configuration](#configuration) - [Contributing](#contributing) - [License](#license) ## Quickstart -You can either use the [Docker Install](#docker-install) (recommended) or [Build from sources](#build-from-sources). +### Example + +To quickly get badaas up and running, you can head to the [miniblog example](https://github.com/ditrit/badaas-example). This example will help you to see how to use badaas and as a template to start your own project + +### Step-by-step instructions + +Once you have started your project with `go init`, you must add the dependency to badaas. Also, to use badaas, your project must also use [`fx`](https://github.com/uber-go/fx) and [`verdeter`](https://github.com/ditrit/verdeter): + + +```bash +go get -u github.com/ditrit/badaas@dbd7e55 +go get -u github.com/uber-go/fx +go get -u github.com/ditrit/verdeter +``` + +Then, your application must be defined as a `verdeter command` and you have to call the configuration of this command: -## Docker install +```go +var command = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "badaas", + Short: "Backend and Distribution as a Service", + Run: runCommandFunc, +}) -You can build the image, run a CockroachDB and the api using `make badaas`. The api will be available at . +func main() { + badaas.ConfigCommandParameters(command) + command.Execute() +} +``` -## Examples +Then, in the Run function of your command, you must use `fx` and start the badaas functions: -Some example apps are available, visit [Examples](./examples/README.md) for details. +```go +func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, -## Build from sources + // Here you can add the functionalities provided by badaas + // Here you can start the rest of the modules that your project uses. + ).Run() +} +``` -### Prerequisites +You are free to choose which badaas functionalities you wish to use. To add them, you must initialise the corresponding module: -Get the sources of the project, either by visiting the [releases](https://github.com/ditrit/badaas/releases) page and downloading an archive or clone the main branch (please be aware that is it not a stable version). +```go +func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, -To build the project: + // add routes provided by badaas + fx.Invoke(router.AddInfoRoutes), + fx.Invoke(router.AddLoginRoutes), + fx.Invoke(router.AddCRUDRoutes), + // Here you can start the rest of the modules that your project uses. + ).Run() +} +``` -- [Install go](https://go.dev/dl/#go1.18.4) v1.18 -- Install project dependencies +Once you have defined the functionalities of your project (an http api for example), you can generate everything you need to run your application using `badctl`. +For installing it, use: + + ```bash -go get +go install github.com/ditrit/badaas/tools/badctl@dbd7e55 ``` -- Run build command +Then generate files to make this project work with `cockroach` as database: ```bash -go build . +badctl gen --db_provider cockroachdb ``` -Well done, you have a binary `badaas` at the root of the project. +For more information about `badctl` refer to [BadGen Docs](https://github.com/ditrit/badaas/tools/badctl). -Then you can launch Badaas directly with: +Finally, you can run the api with: ```bash -export BADAAS_DATABASE_PORT= -export BADAAS_DATABASE_HOST= -export BADAAS_DATABASE_DBNAME= -export BADAAS_DATABASE_SSLMODE= -export BADAAS_DATABASE_USERNAME= -export BADAAS_DATABASE_PASSWORD= -./badaas +badctl run ``` +The api will be available at . + ### Configuration -Badaas use [verdeter](https://github.com/ditrit/verdeter) to manage it's configuration. So Badaas is POSIX compliant by default. +Badaas use [verdeter](https://github.com/ditrit/verdeter) to manage it's configuration, so Badaas is POSIX compliant by default. + +Badgen automatically generates a default configuration in `badaas/docker/api/badaas.yml`, but you are free to modify it if you need to. -Badaas can be configured using environment variables, configuration files or CLI flags. +This can be done using environment variables, configuration files or CLI flags. CLI flags take priority on the environment variables and the environment variables take priority on the content of the configuration file. As an example we will define the `database.port` configuration key using the 3 methods: @@ -87,7 +124,7 @@ As an example we will define the `database.port` configuration key using the 3 m ```yml # /etc/badaas/badaas.yml database: - port: 1222 + port: 1222 ``` The config file can be placed at `/etc/badaas/badaas.yml` or `$HOME/.config/badaas/badaas.yml` or in the same folder as the badaas binary `./badaas.yml`. diff --git a/tools/badctl/README.md b/tools/badctl/README.md new file mode 100644 index 00000000..7686d85f --- /dev/null +++ b/tools/badctl/README.md @@ -0,0 +1,83 @@ +# badctl: the BadAas controller + +`badctl` is the command line tool that makes it possible to configure and run your BadAas applications easily. + +## Install with go install + +For simply installing it, use: + + +```bash +go install github.com/ditrit/badaas/tools/badctl@dbd7e55 +``` + +Or you can build it from sources. + +## Build from sources + +Get the sources of the project, either by visiting the [releases](https://github.com/ditrit/badaas/releases) page and downloading an archive or clone the main branch (please be aware that is it not a stable version). + +To build the project: + +- [Install go](https://go.dev/dl/#go1.18.4) v1.18 +- `cd tools/badctl` +- Install project dependencies + + ```bash + go get + ``` + +- Run build command + + ```bash + go build . + ``` + +Well done, you have a binary `badctl` at the root of the project. + +## Commands + +You can see the available commands by running: + +```bash +$ badctl help +badctl is a command line tool that makes it possible to configure and run your BadAas applications easily + +Usage: + badctl [command] + +Available Commands: + completion Generate the autocompletion script for the specified shell + gen Generate files and configurations necessary to use BadAss + help Help about any command +``` + +For more information about the functionality provided and how to use each command use: + +```bash +badctl help [command] +``` + +### gen + +gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way. + +Depending of the `db_provider` chosen `gen` will generate the docker and configuration files needed to run the application in the `badaas` folder. All these files can be modified in case you need different values than those provided by default. + +### run + +`run` is the command that will allow you to run your application once you have generated the necessary files with gen + +## Contributing + +You can make modifications to the badctl source code and compile it locally with: + +```bash +go build . +``` + +You can then run the badctl executable directly or add a link in your $GOPATH to run it from a project: + +```bash +ln -sf badctl $GOPATH/bin/badctl +``` diff --git a/tools/badgen/cmd/docker/.dockerignore b/tools/badctl/cmd/docker/.dockerignore similarity index 100% rename from tools/badgen/cmd/docker/.dockerignore rename to tools/badctl/cmd/docker/.dockerignore diff --git a/tools/badgen/cmd/docker/api/Dockerfile b/tools/badctl/cmd/docker/api/Dockerfile similarity index 100% rename from tools/badgen/cmd/docker/api/Dockerfile rename to tools/badctl/cmd/docker/api/Dockerfile diff --git a/tools/badgen/cmd/docker/api/badaas.yml b/tools/badctl/cmd/docker/api/badaas.yml similarity index 100% rename from tools/badgen/cmd/docker/api/badaas.yml rename to tools/badctl/cmd/docker/api/badaas.yml diff --git a/tools/badgen/cmd/docker/api/docker-compose.yml b/tools/badctl/cmd/docker/api/docker-compose.yml similarity index 100% rename from tools/badgen/cmd/docker/api/docker-compose.yml rename to tools/badctl/cmd/docker/api/docker-compose.yml diff --git a/tools/badgen/cmd/docker/cockroachdb/docker-compose.yml b/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml similarity index 100% rename from tools/badgen/cmd/docker/cockroachdb/docker-compose.yml rename to tools/badctl/cmd/docker/cockroachdb/docker-compose.yml diff --git a/tools/badgen/cmd/docker/postgres/docker-compose.yml b/tools/badctl/cmd/docker/postgres/docker-compose.yml similarity index 100% rename from tools/badgen/cmd/docker/postgres/docker-compose.yml rename to tools/badctl/cmd/docker/postgres/docker-compose.yml diff --git a/tools/badgen/cmd/docker/postgres/init.sql b/tools/badctl/cmd/docker/postgres/init.sql similarity index 100% rename from tools/badgen/cmd/docker/postgres/init.sql rename to tools/badctl/cmd/docker/postgres/init.sql diff --git a/tools/badgen/cmd/gen.go b/tools/badctl/cmd/gen.go similarity index 83% rename from tools/badgen/cmd/gen.go rename to tools/badctl/cmd/gen.go index 9aae60c9..375016b9 100644 --- a/tools/badgen/cmd/gen.go +++ b/tools/badctl/cmd/gen.go @@ -2,6 +2,7 @@ package cmd import ( "embed" + "fmt" "os" "path/filepath" @@ -12,14 +13,12 @@ import ( ) //go:embed docker/* -//go:embed scripts/* var embedFS embed.FS -// genCmd represents the run command var genCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Use: "gen", - Short: "TODO", - Long: `TODO`, + Short: "Generate files and configurations necessary to use BadAss", + Long: `gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way.`, Run: generateDockerFiles, }) @@ -32,7 +31,10 @@ const ( func init() { rootCmd.AddSubCommand(genCmd) - genCmd.LKey(DBProviderKey, verdeter.IsStr, "p", "Database provider") + genCmd.LKey( + DBProviderKey, verdeter.IsStr, "p", + fmt.Sprintf("Database provider (%s|%s)", Cockroachdb, Postgres), + ) genCmd.SetRequired(DBProviderKey) providerValidator := validators.AuthorizedValues(Cockroachdb, Postgres) @@ -55,11 +57,6 @@ func generateDockerFiles(cmd *cobra.Command, args []string) { filepath.Join(destDockerDir, "db"), ) - copyFile( - filepath.Join("scripts", "run.sh"), - filepath.Join(destBadaasDir, "run.sh"), - ) - copyFile( filepath.Join(sourceDockerDir, ".dockerignore"), ".dockerignore", diff --git a/tools/badgen/cmd/root.go b/tools/badctl/cmd/root.go similarity index 70% rename from tools/badgen/cmd/root.go rename to tools/badctl/cmd/root.go index ec30d227..ebaaf720 100644 --- a/tools/badgen/cmd/root.go +++ b/tools/badctl/cmd/root.go @@ -6,9 +6,9 @@ import ( // rootCmd represents the base command when called without any subcommands var rootCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ - Use: "badgen", - Short: "Code generator for Badaas", - Long: `TODO`, + Use: "badctl", + Short: "the BadAas controller", + Long: `badctl is the command line tool that makes it possible to configure and run your BadAas applications easily.`, }) // Execute adds all child commands to the root command and sets flags appropriately. diff --git a/tools/badctl/cmd/run.go b/tools/badctl/cmd/run.go new file mode 100644 index 00000000..109cb209 --- /dev/null +++ b/tools/badctl/cmd/run.go @@ -0,0 +1,38 @@ +package cmd + +import ( + "log" + "os" + "os/exec" + + "github.com/ditrit/verdeter" + "github.com/spf13/cobra" +) + +var runCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "run", + Short: "Run your BadAss application", + Long: `run is the command that will allow you to run your application once you have generated the necessary files with gen.`, + Run: runApp, +}) + +func init() { + rootCmd.AddSubCommand(runCmd) +} + +func runApp(cmd *cobra.Command, args []string) { + dockerCommand := exec.Command( + "docker", "compose", + "-f", "badaas/docker/db/docker-compose.yml", + "-f", "badaas/docker/api/docker-compose.yml", + "up", "--build", "-d", + ) + dockerCommand.Stdout = os.Stdout + + err := dockerCommand.Run() + if err != nil { + panic(err) + } + + log.Println("Your api is available at http://localhost:8000") +} diff --git a/tools/badgen/go.mod b/tools/badctl/go.mod similarity index 91% rename from tools/badgen/go.mod rename to tools/badctl/go.mod index 3bef4625..0b605fa4 100644 --- a/tools/badgen/go.mod +++ b/tools/badctl/go.mod @@ -1,4 +1,4 @@ -module github.com/ditrit/badaas/tools/badgen +module github.com/ditrit/badaas/tools/badctl go 1.18 @@ -6,7 +6,6 @@ require ( github.com/ditrit/verdeter v0.4.0 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 - gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -25,4 +24,5 @@ require ( golang.org/x/sys v0.7.0 // indirect golang.org/x/text v0.9.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/tools/badgen/go.sum b/tools/badctl/go.sum similarity index 100% rename from tools/badgen/go.sum rename to tools/badctl/go.sum diff --git a/tools/badctl/main.go b/tools/badctl/main.go new file mode 100644 index 00000000..7d838876 --- /dev/null +++ b/tools/badctl/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/ditrit/badaas/tools/badctl/cmd" + +func main() { + cmd.Execute() +} diff --git a/tools/badgen/Makefile b/tools/badgen/Makefile deleted file mode 100644 index 00f57549..00000000 --- a/tools/badgen/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -build: - go build . - -link: - ln -sf ./tools/badgen/badgen /home/user/go/bin/badgen \ No newline at end of file diff --git a/tools/badgen/README.md b/tools/badgen/README.md deleted file mode 100644 index 46409041..00000000 --- a/tools/badgen/README.md +++ /dev/null @@ -1 +0,0 @@ -# TODO diff --git a/tools/badgen/cmd/scripts/run.sh b/tools/badgen/cmd/scripts/run.sh deleted file mode 100755 index 18797f0b..00000000 --- a/tools/badgen/cmd/scripts/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -docker compose -f "badaas/docker/db/docker-compose.yml" -f "badaas/docker/api/docker-compose.yml" up --build -d diff --git a/tools/badgen/main.go b/tools/badgen/main.go deleted file mode 100644 index c71e28c3..00000000 --- a/tools/badgen/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import "github.com/ditrit/badaas/tools/badgen/cmd" - -func main() { - cmd.Execute() -} From d91f293f5da9dc115f76af4f29acce6247132dd4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 4 May 2023 16:19:17 +0200 Subject: [PATCH 118/467] update doc to new version --- README.md | 2 +- tools/badctl/README.md | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 93c8aa32..c4c54e73 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ For installing it, use: ```bash -go install github.com/ditrit/badaas/tools/badctl@dbd7e55 +go install github.com/ditrit/badaas/tools/badctl@bef1116 ``` Then generate files to make this project work with `cockroach` as database: diff --git a/tools/badctl/README.md b/tools/badctl/README.md index 7686d85f..79b32b4e 100644 --- a/tools/badctl/README.md +++ b/tools/badctl/README.md @@ -2,13 +2,21 @@ `badctl` is the command line tool that makes it possible to configure and run your BadAas applications easily. +- [badctl: the BadAas controller](#badctl-the-badaas-controller) + - [Install with go install](#install-with-go-install) + - [Build from sources](#build-from-sources) + - [Commands](#commands) + - [gen](#gen) + - [run](#run) + - [Contributing](#contributing) + ## Install with go install For simply installing it, use: ```bash -go install github.com/ditrit/badaas/tools/badctl@dbd7e55 +go install github.com/ditrit/badaas/tools/badctl@bef1116 ``` Or you can build it from sources. From e1c2f2805b93cba71e0d9d71e1e4c6dea5125e21 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 4 May 2023 16:54:51 +0200 Subject: [PATCH 119/467] change port in config according to db provider --- README.md | 2 +- .../cmd/{docker/api => config}/badaas.yml | 2 - tools/badctl/cmd/docker/api/Dockerfile | 2 +- .../cmd/docker/cockroachdb/docker-compose.yml | 1 - .../cmd/docker/postgres/docker-compose.yml | 2 - tools/badctl/cmd/gen.go | 45 ++++++++++++++++++- tools/badctl/go.mod | 2 +- 7 files changed, 47 insertions(+), 9 deletions(-) rename tools/badctl/cmd/{docker/api => config}/badaas.yml (59%) diff --git a/README.md b/README.md index c4c54e73..abf71f21 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ The api will be available at . Badaas use [verdeter](https://github.com/ditrit/verdeter) to manage it's configuration, so Badaas is POSIX compliant by default. -Badgen automatically generates a default configuration in `badaas/docker/api/badaas.yml`, but you are free to modify it if you need to. +Badgen automatically generates a default configuration in `badaas/config/badaas.yml`, but you are free to modify it if you need to. This can be done using environment variables, configuration files or CLI flags. CLI flags take priority on the environment variables and the environment variables take priority on the content of the configuration file. diff --git a/tools/badctl/cmd/docker/api/badaas.yml b/tools/badctl/cmd/config/badaas.yml similarity index 59% rename from tools/badctl/cmd/docker/api/badaas.yml rename to tools/badctl/cmd/config/badaas.yml index 3f97bd5e..0bdfb26e 100644 --- a/tools/badctl/cmd/docker/api/badaas.yml +++ b/tools/badctl/cmd/config/badaas.yml @@ -1,7 +1,5 @@ database: host: badaas-db - # TODO must be modified according to the db_provider - port: 26257 sslmode: disable username: root password: postgres diff --git a/tools/badctl/cmd/docker/api/Dockerfile b/tools/badctl/cmd/docker/api/Dockerfile index 742e9cae..1ea62ae9 100644 --- a/tools/badctl/cmd/docker/api/Dockerfile +++ b/tools/badctl/cmd/docker/api/Dockerfile @@ -12,6 +12,6 @@ RUN addgroup -S badaas \ && adduser -S badaas -G badaas USER badaas COPY --from=builder /app/badaas_service . -COPY ./badaas/docker/api/badaas.yml . +COPY ./badaas/config/badaas.yml . EXPOSE 8000 ENTRYPOINT ["./badaas_service", "--config_path", "badaas.yml"] \ No newline at end of file diff --git a/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml b/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml index fc9cef32..4e09731d 100644 --- a/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml +++ b/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml @@ -5,7 +5,6 @@ services: image: cockroachdb/cockroach:latest container_name: badaas-db ports: - - "26257:26257" - "8080:8080" # Web based dashboard command: start-single-node --insecure volumes: diff --git a/tools/badctl/cmd/docker/postgres/docker-compose.yml b/tools/badctl/cmd/docker/postgres/docker-compose.yml index 80d69523..9c40bc35 100644 --- a/tools/badctl/cmd/docker/postgres/docker-compose.yml +++ b/tools/badctl/cmd/docker/postgres/docker-compose.yml @@ -11,6 +11,4 @@ services: PGDATA: /data/postgres volumes: - .:/docker-entrypoint-initdb.d/ - ports: - - "5432:5432" restart: unless-stopped \ No newline at end of file diff --git a/tools/badctl/cmd/gen.go b/tools/badctl/cmd/gen.go index 375016b9..c5f279ae 100644 --- a/tools/badctl/cmd/gen.go +++ b/tools/badctl/cmd/gen.go @@ -10,9 +10,11 @@ import ( "github.com/ditrit/verdeter/validators" "github.com/spf13/cobra" "github.com/spf13/viper" + "gopkg.in/yaml.v3" ) //go:embed docker/* +//go:embed config/* var embedFS embed.FS var genCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ @@ -22,12 +24,19 @@ var genCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Run: generateDockerFiles, }) +const destBadaasDir = "badaas" + const ( DBProviderKey = "db_provider" Cockroachdb = "cockroachdb" Postgres = "postgres" ) +var DBPorts = map[string]int{ + Cockroachdb: 26257, + Postgres: 5432, +} + func init() { rootCmd.AddSubCommand(genCmd) @@ -43,7 +52,6 @@ func init() { func generateDockerFiles(cmd *cobra.Command, args []string) { sourceDockerDir := "docker" - destBadaasDir := "badaas" destDockerDir := filepath.Join(destBadaasDir, "docker") copyDir( @@ -61,6 +69,41 @@ func generateDockerFiles(cmd *cobra.Command, args []string) { filepath.Join(sourceDockerDir, ".dockerignore"), ".dockerignore", ) + + copyBadaasConfig(dbProvider) +} + +func copyBadaasConfig(dbProvider string) { + configFile, err := embedFS.ReadFile( + filepath.Join("config", "badaas.yml"), + ) + if err != nil { + panic(err) + } + + configData := map[string]any{} + err = yaml.Unmarshal(configFile, &configData) + if err != nil { + panic(err) + } + + configData["database"].(map[string]any)["port"] = DBPorts[dbProvider] + + configBytes, err := yaml.Marshal(&configData) + if err != nil { + panic(err) + } + + destConfigDir := filepath.Join(destBadaasDir, "config") + os.MkdirAll(destConfigDir, os.ModePerm) + + err = os.WriteFile( + filepath.Join(destConfigDir, "badaas.yml"), + configBytes, 0o0666, + ) + if err != nil { + panic(err) + } } func copyFile(sourcePath, destPath string) { diff --git a/tools/badctl/go.mod b/tools/badctl/go.mod index 0b605fa4..55260d3d 100644 --- a/tools/badctl/go.mod +++ b/tools/badctl/go.mod @@ -6,6 +6,7 @@ require ( github.com/ditrit/verdeter v0.4.0 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -24,5 +25,4 @@ require ( golang.org/x/sys v0.7.0 // indirect golang.org/x/text v0.9.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) From cbe153f029c654e0b127e66bb99077077d2e4f47 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 09:58:35 +0200 Subject: [PATCH 120/467] remove unnecesary config_path flag --- tools/badctl/cmd/docker/api/Dockerfile | 2 +- tools/badctl/cmd/run.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/badctl/cmd/docker/api/Dockerfile b/tools/badctl/cmd/docker/api/Dockerfile index 1ea62ae9..d2486624 100644 --- a/tools/badctl/cmd/docker/api/Dockerfile +++ b/tools/badctl/cmd/docker/api/Dockerfile @@ -14,4 +14,4 @@ USER badaas COPY --from=builder /app/badaas_service . COPY ./badaas/config/badaas.yml . EXPOSE 8000 -ENTRYPOINT ["./badaas_service", "--config_path", "badaas.yml"] \ No newline at end of file +ENTRYPOINT ["./badaas_service"] \ No newline at end of file diff --git a/tools/badctl/cmd/run.go b/tools/badctl/cmd/run.go index 109cb209..8107cece 100644 --- a/tools/badctl/cmd/run.go +++ b/tools/badctl/cmd/run.go @@ -28,6 +28,7 @@ func runApp(cmd *cobra.Command, args []string) { "up", "--build", "-d", ) dockerCommand.Stdout = os.Stdout + dockerCommand.Stderr = os.Stderr err := dockerCommand.Run() if err != nil { From 792d48f0f1f96cf6820937a85bcdb411a747ff87 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 10:18:27 +0200 Subject: [PATCH 121/467] update readme --- README.md | 4 ++-- tools/badctl/cmd/docker/.dockerignore | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index abf71f21..d304af14 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ To quickly get badaas up and running, you can head to the [miniblog example](htt ### Step-by-step instructions -Once you have started your project with `go init`, you must add the dependency to badaas. Also, to use badaas, your project must also use [`fx`](https://github.com/uber-go/fx) and [`verdeter`](https://github.com/ditrit/verdeter): +Once you have started your project with `go init`, you must add the dependency to badaas. To use badaas, your project must also use [`fx`](https://github.com/uber-go/fx) and [`verdeter`](https://github.com/ditrit/verdeter): ```bash @@ -96,7 +96,7 @@ Then generate files to make this project work with `cockroach` as database: badctl gen --db_provider cockroachdb ``` -For more information about `badctl` refer to [BadGen Docs](https://github.com/ditrit/badaas/tools/badctl). +For more information about `badctl` refer to [badctl docs](https://github.com/ditrit/badaas/tools/badctl/README.md). Finally, you can run the api with: diff --git a/tools/badctl/cmd/docker/.dockerignore b/tools/badctl/cmd/docker/.dockerignore index 452177e8..62e2b989 100644 --- a/tools/badctl/cmd/docker/.dockerignore +++ b/tools/badctl/cmd/docker/.dockerignore @@ -1 +1 @@ -badaas/docker/db \ No newline at end of file +badaas/docker \ No newline at end of file From 924be1902df0976f2115844813fa29eeb83a6fc8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 10:25:50 +0200 Subject: [PATCH 122/467] fix tests e2e? --- test_e2e/go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_e2e/go.mod b/test_e2e/go.mod index 7a1b2148..6a229dac 100644 --- a/test_e2e/go.mod +++ b/test_e2e/go.mod @@ -7,6 +7,7 @@ require ( github.com/cucumber/godog v0.12.5 github.com/ditrit/verdeter v0.4.0 github.com/google/uuid v1.3.0 + github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 github.com/jackc/pgconn v1.13.0 github.com/magiconair/properties v1.8.6 @@ -23,7 +24,6 @@ require ( github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/elliotchance/pie/v2 v2.5.2 gotest.tools v2.2.0+incompatible - github.com/gorilla/handlers v1.5.1 ) require ( From 1461d8ad7d20d50eb9fc28d8f041f84221bcf6e1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 12:40:10 +0200 Subject: [PATCH 123/467] add routes unit tests --- controllers/info.go | 6 +-- router/routes.go | 4 +- router/routes_test.go | 99 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 7 deletions(-) diff --git a/controllers/info.go b/controllers/info.go index 02ebdb65..52ac9861 100644 --- a/controllers/info.go +++ b/controllers/info.go @@ -27,12 +27,10 @@ type infoControllerImpl struct{} // Return the badaas server information func (*infoControllerImpl) Info(response http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - - infos := &BadaasServerInfo{ + return &BadaasServerInfo{ Status: "OK", Version: Version, - } - return infos, nil + }, nil } type BadaasServerInfo struct { diff --git a/router/routes.go b/router/routes.go index aae67ca1..9b06964a 100644 --- a/router/routes.go +++ b/router/routes.go @@ -15,13 +15,11 @@ func AddInfoRoutes( router *mux.Router, jsonController middlewares.JSONController, infoController controllers.InformationController, -) *mux.Router { +) { router.HandleFunc( "/info", jsonController.Wrap(infoController.Info), ).Methods("GET") - - return router } // Adds to the "router" the routes for handling authentication: diff --git a/router/routes_test.go b/router/routes_test.go index 17cb83b6..ded02859 100644 --- a/router/routes_test.go +++ b/router/routes_test.go @@ -2,11 +2,18 @@ package router import ( "errors" + "net/http" + "net/http/httptest" "testing" + "github.com/ditrit/badaas/controllers" mocks "github.com/ditrit/badaas/mocks/configuration" + mockControllers "github.com/ditrit/badaas/mocks/controllers" + mockMiddlewares "github.com/ditrit/badaas/mocks/router/middlewares" mockUserServices "github.com/ditrit/badaas/mocks/services/userservice" + "github.com/ditrit/badaas/router/middlewares" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "go.uber.org/zap" "go.uber.org/zap/zaptest/observer" @@ -66,3 +73,95 @@ func TestCreateSuperUser_UserServiceError(t *testing.T) { require.Equal(t, 1, logs.Len()) } + +func TestAddInfoRoutes(t *testing.T) { + jsonController := middlewares.NewJSONController(nil) + informationController := controllers.NewInfoController() + + router := NewRouter() + AddInfoRoutes( + router, + jsonController, + informationController, + ) + + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/info", + nil, + ) + + router.ServeHTTP(response, request) + assert.Equal(t, response.Code, http.StatusOK) + assert.Equal(t, response.Body.String(), "{\"status\":\"OK\",\"version\":\"UNRELEASED\"}") +} + +func TestAddLoginRoutes(t *testing.T) { + jsonController := middlewares.NewJSONController(nil) + + initializationConfig := mocks.NewInitializationConfiguration(t) + initializationConfig. + On("GetAdminPassword").Return("adminpassword") + + userService := mockUserServices.NewUserService(t) + userService. + On("NewUser", "admin", "admin-no-reply@badaas.com", "adminpassword"). + Return(nil, nil) + + basicAuthenticationController := mockControllers.NewBasicAuthenticationController(t) + basicAuthenticationController. + On("BasicLoginHandler", mock.Anything, mock.Anything). + Return(map[string]string{"login": "called"}, nil) + + authenticationMiddleware := mockMiddlewares.NewAuthenticationMiddleware(t) + + router := NewRouter() + AddLoginRoutes( + nil, + router, + authenticationMiddleware, + basicAuthenticationController, + jsonController, + initializationConfig, + userService, + ) + + response := httptest.NewRecorder() + request := httptest.NewRequest( + "POST", + "/login", + nil, + ) + + router.ServeHTTP(response, request) + assert.Equal(t, response.Code, http.StatusOK) + assert.Equal(t, response.Body.String(), "{\"login\":\"called\"}") +} + +func TestAddCRUDRoutes(t *testing.T) { + jsonController := middlewares.NewJSONController(nil) + + eavController := mockControllers.NewEAVController(t) + eavController. + On("GetObjects", mock.Anything, mock.Anything). + Return(map[string]string{"GetObjects": "called"}, nil) + + router := NewRouter() + AddCRUDRoutes( + router, + eavController, + jsonController, + ) + + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/posts", + nil, + ) + + router.ServeHTTP(response, request) + assert.Equal(t, response.Code, http.StatusOK) + assert.Equal(t, response.Body.String(), "{\"GetObjects\":\"called\"}") +} From 15db0ea9f6f03ff78461f5c882d3bf3c3ffa4c11 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 13:20:36 +0200 Subject: [PATCH 124/467] fix tests e2e --- docker/test_api/Dockerfile | 4 ++-- sonar-project.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/test_api/Dockerfile b/docker/test_api/Dockerfile index e505e744..43279fee 100644 --- a/docker/test_api/Dockerfile +++ b/docker/test_api/Dockerfile @@ -4,8 +4,8 @@ RUN addgroup -S badaas \ && adduser -S badaas -G badaas USER badaas WORKDIR /badaas -COPY go.mod . -COPY go.sum . +COPY test_e2e/go.mod . +COPY test_e2e/go.sum . RUN go mod download ENV CGO_ENABLED=0 ENV GOOS=linux diff --git a/sonar-project.properties b/sonar-project.properties index 3c34734d..f2836946 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.organization=ditrit sonar.projectName=badaas sonar.host.url=https://sonarcloud.io sonar.sources=. -sonar.exclusions=**/*_test.go,mocks/***,vendor/***,test_integration/***,test_e2e/***,examples/*** +sonar.exclusions=**/*_test.go,mocks/***,vendor/***,test_integration/***,test_e2e/*** sonar.tests=. sonar.test.inclusions=**/*_test.go sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_int.out/coverage_int.out From 5782fac591d02ea27450d4598b8f8137d5afedc9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 13:35:51 +0200 Subject: [PATCH 125/467] fix test e2e? --- docker/test_api/Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/docker/test_api/Dockerfile b/docker/test_api/Dockerfile index 43279fee..fbeba3a2 100644 --- a/docker/test_api/Dockerfile +++ b/docker/test_api/Dockerfile @@ -4,9 +4,6 @@ RUN addgroup -S badaas \ && adduser -S badaas -G badaas USER badaas WORKDIR /badaas -COPY test_e2e/go.mod . -COPY test_e2e/go.sum . -RUN go mod download ENV CGO_ENABLED=0 ENV GOOS=linux ENV GOARCH=amd64 From 2cf2af0e471642f3f772e15015e950f644caed2a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 13:58:25 +0200 Subject: [PATCH 126/467] add go.work to make e2e test work --- .gitignore | 2 +- go.work | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 go.work diff --git a/.gitignore b/.gitignore index b3e2525d..a24b613e 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,7 @@ vendor/ # Go workspace file -go.work +# go.work # cockroach files node* diff --git a/go.work b/go.work new file mode 100644 index 00000000..03a368ba --- /dev/null +++ b/go.work @@ -0,0 +1,7 @@ +go 1.20 + +use ( + . + ./test_e2e + ./tools/badctl +) From a6a373281e95c0f5f0bf5c1efc5fc39d4d8da857 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 14:00:24 +0200 Subject: [PATCH 127/467] go min version to 1.18 --- go.work | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.work b/go.work index 03a368ba..9a8f5a12 100644 --- a/go.work +++ b/go.work @@ -1,4 +1,4 @@ -go 1.20 +go 1.18 use ( . From 89aa9d539396acf3cc91a7de92d5a5bccf514480 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 14:40:01 +0200 Subject: [PATCH 128/467] fix gosec --- badaas.go | 153 ++++++++++++++++++++++++++++++++-------- test_e2e/test_api.go | 7 +- tools/badctl/cmd/gen.go | 38 ++++++---- 3 files changed, 153 insertions(+), 45 deletions(-) diff --git a/badaas.go b/badaas.go index 3afd1b0b..54144380 100644 --- a/badaas.go +++ b/badaas.go @@ -22,84 +22,175 @@ var BadaasModule = fx.Module( services.ServicesModule, ) -func ConfigCommandParameters(command *verdeter.VerdeterCommand) { - command.GKey("config_path", verdeter.IsStr, "", "Path to the config file/directory") +func ConfigCommandParameters(command *verdeter.VerdeterCommand) error { + err := command.GKey("config_path", verdeter.IsStr, "", "Path to the config file/directory") + if err != nil { + return err + } command.SetDefault("config_path", ".") - configServerParameters(command) - configLoggerParameters(command) - configDatabaseParameters(command) - configInitialisationParameters(command) - configSessionParameters(command) + err = configServerParameters(command) + if err != nil { + return err + } + + err = configLoggerParameters(command) + if err != nil { + return err + } + + err = configDatabaseParameters(command) + if err != nil { + return err + } + + err = configInitialisationParameters(command) + if err != nil { + return err + } + + err = configSessionParameters(command) + if err != nil { + return err + } + + return nil } -func configDatabaseParameters(cfg *verdeter.VerdeterCommand) { - cfg.GKey(configuration.DatabasePortKey, verdeter.IsInt, "", "The port of the database server") +func configDatabaseParameters(cfg *verdeter.VerdeterCommand) error { + err := cfg.GKey(configuration.DatabasePortKey, verdeter.IsInt, "", "The port of the database server") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabasePortKey) - cfg.GKey(configuration.DatabaseHostKey, verdeter.IsStr, "", "The host of the database server") + err = cfg.GKey(configuration.DatabaseHostKey, verdeter.IsStr, "", "The host of the database server") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabaseHostKey) - cfg.GKey(configuration.DatabaseNameKey, verdeter.IsStr, "", "The name of the database to use") + err = cfg.GKey(configuration.DatabaseNameKey, verdeter.IsStr, "", "The name of the database to use") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabaseNameKey) - cfg.GKey(configuration.DatabaseUsernameKey, verdeter.IsStr, "", "The username of the account on the database server") + err = cfg.GKey(configuration.DatabaseUsernameKey, verdeter.IsStr, "", "The username of the account on the database server") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabaseUsernameKey) - cfg.GKey(configuration.DatabasePasswordKey, verdeter.IsStr, "", "The password of the account one the database server") + err = cfg.GKey(configuration.DatabasePasswordKey, verdeter.IsStr, "", "The password of the account one the database server") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabasePasswordKey) - cfg.GKey(configuration.DatabaseSslmodeKey, verdeter.IsStr, "", "The sslmode to use when connecting to the database server") + err = cfg.GKey(configuration.DatabaseSslmodeKey, verdeter.IsStr, "", "The sslmode to use when connecting to the database server") + if err != nil { + return err + } cfg.SetRequired(configuration.DatabaseSslmodeKey) - cfg.GKey(configuration.DatabaseRetryKey, verdeter.IsUint, "", "The number of times badaas tries to establish a connection with the database") + err = cfg.GKey(configuration.DatabaseRetryKey, verdeter.IsUint, "", "The number of times badaas tries to establish a connection with the database") + if err != nil { + return err + } cfg.SetDefault(configuration.DatabaseRetryKey, uint(10)) - cfg.GKey(configuration.DatabaseRetryDurationKey, verdeter.IsUint, "", "The duration in seconds badaas wait between connection attempts") + err = cfg.GKey(configuration.DatabaseRetryDurationKey, verdeter.IsUint, "", "The duration in seconds badaas wait between connection attempts") + if err != nil { + return err + } cfg.SetDefault(configuration.DatabaseRetryDurationKey, uint(5)) + + return nil } -func configInitialisationParameters(cfg *verdeter.VerdeterCommand) { - cfg.GKey(configuration.InitializationDefaultAdminPasswordKey, verdeter.IsStr, "", +func configInitialisationParameters(cfg *verdeter.VerdeterCommand) error { + err := cfg.GKey(configuration.InitializationDefaultAdminPasswordKey, verdeter.IsStr, "", "Set the default admin password is the admin user is not created yet.") + if err != nil { + return err + } cfg.SetDefault(configuration.InitializationDefaultAdminPasswordKey, "admin") + + return nil } -func configLoggerParameters(cfg *verdeter.VerdeterCommand) { - cfg.GKey(configuration.LoggerModeKey, verdeter.IsStr, "", "The logger mode (default to \"prod\")") +func configLoggerParameters(cfg *verdeter.VerdeterCommand) error { + err := cfg.GKey(configuration.LoggerModeKey, verdeter.IsStr, "", "The logger mode (default to \"prod\")") + if err != nil { + return err + } cfg.SetDefault(configuration.LoggerModeKey, "prod") cfg.AddValidator(configuration.LoggerModeKey, validators.AuthorizedValues("prod", "dev")) - cfg.GKey(configuration.LoggerRequestTemplateKey, verdeter.IsStr, "", "Template message for all request logs") + err = cfg.GKey(configuration.LoggerRequestTemplateKey, verdeter.IsStr, "", "Template message for all request logs") + if err != nil { + return err + } cfg.SetDefault(configuration.LoggerRequestTemplateKey, "Receive {{method}} request on {{url}}") + + return nil } -func configServerParameters(cfg *verdeter.VerdeterCommand) { - cfg.GKey(configuration.ServerTimeoutKey, verdeter.IsInt, "", "Maximum timeout of the http server in second (default is 15s)") +func configServerParameters(cfg *verdeter.VerdeterCommand) error { + err := cfg.GKey(configuration.ServerTimeoutKey, verdeter.IsInt, "", "Maximum timeout of the http server in second (default is 15s)") + if err != nil { + return err + } cfg.SetDefault(configuration.ServerTimeoutKey, 15) - cfg.GKey(configuration.ServerHostKey, verdeter.IsStr, "", "Address to bind (default is 0.0.0.0)") + err = cfg.GKey(configuration.ServerHostKey, verdeter.IsStr, "", "Address to bind (default is 0.0.0.0)") + if err != nil { + return err + } cfg.SetDefault(configuration.ServerHostKey, "0.0.0.0") - cfg.GKey(configuration.ServerPortKey, verdeter.IsInt, "p", "Port to bind (default is 8000)") + err = cfg.GKey(configuration.ServerPortKey, verdeter.IsInt, "p", "Port to bind (default is 8000)") + if err != nil { + return err + } cfg.AddValidator(configuration.ServerPortKey, validators.CheckTCPHighPort) cfg.SetDefault(configuration.ServerPortKey, 8000) - cfg.GKey(configuration.ServerPaginationMaxElemPerPage, verdeter.IsUint, "", "The max number of records returned per page") + err = cfg.GKey(configuration.ServerPaginationMaxElemPerPage, verdeter.IsUint, "", "The max number of records returned per page") + if err != nil { + return err + } cfg.SetDefault(configuration.ServerPaginationMaxElemPerPage, 100) - cfg.GKey(configuration.ServerExampleKey, verdeter.IsStr, "", "Example server to exec (birds | posts)") + err = cfg.GKey(configuration.ServerExampleKey, verdeter.IsStr, "", "Example server to exec (birds | posts)") + if err != nil { + return err + } cfg.SetDefault(configuration.ServerExampleKey, "") + + return nil } -func configSessionParameters(cfg *verdeter.VerdeterCommand) { - cfg.LKey(configuration.SessionDurationKey, verdeter.IsUint, "", "The duration of a user session in seconds.") +func configSessionParameters(cfg *verdeter.VerdeterCommand) error { + err := cfg.LKey(configuration.SessionDurationKey, verdeter.IsUint, "", "The duration of a user session in seconds.") + if err != nil { + return err + } cfg.SetDefault(configuration.SessionDurationKey, uint(3600*4)) // 4 hours by default - cfg.LKey(configuration.SessionPullIntervalKey, + err = cfg.LKey(configuration.SessionPullIntervalKey, verdeter.IsUint, "", "The refresh interval in seconds. Badaas refresh it's internal session cache periodically.") + if err != nil { + return err + } cfg.SetDefault(configuration.SessionPullIntervalKey, uint(30)) // 30 seconds by default - cfg.LKey(configuration.SessionRollIntervalKey, verdeter.IsUint, "", "The interval in which the user can renew it's session by making a request.") + err = cfg.LKey(configuration.SessionRollIntervalKey, verdeter.IsUint, "", "The interval in which the user can renew it's session by making a request.") + if err != nil { + return err + } cfg.SetDefault(configuration.SessionRollIntervalKey, uint(3600)) // 1 hour by default + + return nil } diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index c5281a66..5f9e18d8 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -25,7 +25,10 @@ var rootCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ }) func main() { - badaas.ConfigCommandParameters(rootCfg) + err := badaas.ConfigCommandParameters(rootCfg) + if err != nil { + panic(err) + } rootCfg.Execute() } @@ -87,7 +90,7 @@ func NewHTTPServer( }, OnStop: func(ctx context.Context) error { // Flush the logger - logger.Sync() + _ = logger.Sync() return srv.Shutdown(ctx) }, }) diff --git a/tools/badctl/cmd/gen.go b/tools/badctl/cmd/gen.go index c5f279ae..1e624132 100644 --- a/tools/badctl/cmd/gen.go +++ b/tools/badctl/cmd/gen.go @@ -32,6 +32,8 @@ const ( Postgres = "postgres" ) +var dbProviders = []string{Cockroachdb, Postgres} + var DBPorts = map[string]int{ Cockroachdb: 26257, Postgres: 5432, @@ -40,14 +42,18 @@ var DBPorts = map[string]int{ func init() { rootCmd.AddSubCommand(genCmd) - genCmd.LKey( + err := genCmd.LKey( DBProviderKey, verdeter.IsStr, "p", - fmt.Sprintf("Database provider (%s|%s)", Cockroachdb, Postgres), + fmt.Sprintf("Database provider %v", dbProviders), ) + if err != nil { + panic(err) + } genCmd.SetRequired(DBProviderKey) - - providerValidator := validators.AuthorizedValues(Cockroachdb, Postgres) - genCmd.AddValidator(DBProviderKey, providerValidator) + genCmd.AddValidator( + DBProviderKey, + validators.AuthorizedValues(dbProviders...), + ) } func generateDockerFiles(cmd *cobra.Command, args []string) { @@ -95,11 +101,14 @@ func copyBadaasConfig(dbProvider string) { } destConfigDir := filepath.Join(destBadaasDir, "config") - os.MkdirAll(destConfigDir, os.ModePerm) + err = os.MkdirAll(destConfigDir, os.ModePerm) + if err != nil { + panic(err) + } err = os.WriteFile( filepath.Join(destConfigDir, "badaas.yml"), - configBytes, 0o0666, + configBytes, 0o0600, ) if err != nil { panic(err) @@ -112,7 +121,7 @@ func copyFile(sourcePath, destPath string) { panic(err) } - if err := os.WriteFile(destPath, fileContent, 0o0666); err != nil { + if err := os.WriteFile(destPath, fileContent, 0o0600); err != nil { panic(err) } } @@ -124,10 +133,15 @@ func copyDir(sourceDir, destDir string) { } _, err = os.Stat(destDir) - if os.IsNotExist(err) { - os.MkdirAll(destDir, os.ModePerm) - } else if err != nil { - panic(err) + if err != nil { + if !os.IsNotExist(err) { + panic(err) + } + + err = os.MkdirAll(destDir, os.ModePerm) + if err != nil { + panic(err) + } } for _, file := range files { From d0f5d83249fee2ad400d31575ad87138dd5e8cb5 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 15:39:53 +0200 Subject: [PATCH 129/467] badctl add more doc --- .dockerignore | 22 +++++++++++++--------- .github/workflows/CI.yml | 3 +-- badaas.example.yml | 7 ++----- changelog.md | 2 ++ configuration.md | 8 +++----- tools/badctl/README.md | 8 ++++++-- tools/badctl/cmd/config/badaas.yml | 25 +++++++++++++++++++++++-- tools/badctl/cmd/docker/.dockerignore | 12 +++++++++++- tools/badctl/cmd/gen.go | 13 +++++++++---- 9 files changed, 70 insertions(+), 30 deletions(-) diff --git a/.dockerignore b/.dockerignore index 65959251..9bf3003b 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,21 +1,25 @@ .editorconfig .git +.gitignore .github sonar-project.properties -AUTHORS.md -CONTRIBUTING.md +*.md LICENSE Makefile NOTICE -README.md arm/ powerpc/ mips/ .golangci.yml -_temp .vscode -node1 -node2 -node3 -.gitignore -changelog.md +go.work +go.work.sum +tools/ +test_integration/ +test_e2e/ +!test_e2e/test_api.go +!test_e2e/go.mod +!test_e2e/go.sum +mocks/ +docker/ +**/*_test.go \ No newline at end of file diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 341f1ccf..a0a13547 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -148,5 +148,4 @@ jobs: uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file diff --git a/badaas.example.yml b/badaas.example.yml index a845cc51..ba862d34 100644 --- a/badaas.example.yml +++ b/badaas.example.yml @@ -34,7 +34,7 @@ database: server: # The address to bind badaas to. # default ("0.0.0.0") - host: "" + host: "" # The port badaas should use. # default (8000) @@ -42,7 +42,7 @@ server: # The maximum timeout for the http server in seconds. # default (15) - timeout: 15 + timeout: 15 # The settings for the pagination. pagination: @@ -51,9 +51,6 @@ server: # default (100) max: 100 - # Example server to exec (birds | posts) - example: "" - # The settings for the logger. logger: # Either `dev` or `prod` diff --git a/changelog.md b/changelog.md index e61c5f4f..30786d79 100644 --- a/changelog.md +++ b/changelog.md @@ -35,5 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add some examples of data models. - Add transaction executor to run services that lead to multiples queries. - Add repositories to manage querying to the database. +- Transform BadAas into a library. +- Add BadCtl tool. [unreleased]: https://github.com/ditrit/badaas/blob/main/changelog.md#unreleased diff --git a/configuration.md b/configuration.md index 189a55c1..c92161dc 100644 --- a/configuration.md +++ b/configuration.md @@ -1,6 +1,6 @@ # Configuration -To see a complete example of a working config file: head to [`badaas.example.yml`](./badaas.example.yml) +To see a complete example of a working config file: head to [`badaas.example.yml`](./badaas.example.yml). As said in the README: @@ -9,7 +9,7 @@ As said in the README: In this documentation file, we will mainly focus our attention on config files but we won't forget that we can use environment variables and CLI flags to change Badaas' config. -The config file can be formatted in any syntax that [github.com/spf13/viper](https://github.com/spf13/viper) supports but we will only use YAML syntax in our docs. +The config file can be formatted in any syntax that [`viper`](https://github.com/spf13/viper) supports but we will only use YAML syntax in our docs. - [Configuration](#configuration) - [Database](#database) @@ -20,8 +20,6 @@ The config file can be formatted in any syntax that [github.com/spf13/viper](htt ## Database -We use CockroachDB as a database. It is Postgres compatible, so the information we need to provide will not be a surprise to Postgres users. - ```yml # The settings for the database. database: @@ -60,7 +58,7 @@ Please note that the init section `init:` is not mandatory. Badaas is suited wit ## Logger -Badaas use a structured logger that can output json logs in production and user adapted logs for debug using the `logger.mode` key. +Badaas use a structured logger that can output json logs in production and user adapted logs for debug using the `logger.mode` key. Badaas offers the possibility to change the log message of the Middleware Logger but provides a sane default. It is formatted using the Jinja syntax. The values available are `method`, `url` and `protocol`. diff --git a/tools/badctl/README.md b/tools/badctl/README.md index 79b32b4e..8ea2c014 100644 --- a/tools/badctl/README.md +++ b/tools/badctl/README.md @@ -70,11 +70,15 @@ badctl help [command] gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way. -Depending of the `db_provider` chosen `gen` will generate the docker and configuration files needed to run the application in the `badaas` folder. All these files can be modified in case you need different values than those provided by default. +Depending of the `db_provider` chosen `gen` will generate the docker and configuration files needed to run the application in the `badaas/docker/db` and `badaas/config` folders respectively. It will also generate docker files to run a http api in `badaas/docker/api`. + +The possible values for `db_provider` are `cockroachdb` and `postgres`. CockroachDB is recommended since it's a distributed database from its conception and postgres compatible. + +All these files can be modified in case you need different values than those provided by default. For more information about the configuration head to [configuration docs](../../configuration.md). ### run -`run` is the command that will allow you to run your application once you have generated the necessary files with gen +`run` is the command that will allow you to run your application once you have generated the necessary files with gen. ## Contributing diff --git a/tools/badctl/cmd/config/badaas.yml b/tools/badctl/cmd/config/badaas.yml index 0bdfb26e..8533c573 100644 --- a/tools/badctl/cmd/config/badaas.yml +++ b/tools/badctl/cmd/config/badaas.yml @@ -1,6 +1,27 @@ database: host: badaas-db + name: badaas_db + password: postgres sslmode: disable username: root - password: postgres - name: badaas_db \ No newline at end of file + init: + retry: 10 + retryTime: 5 +server: + host: "" + port: 8000 + timeout: 15 + pagination: + page: + max: 100 +logger: + mode: prod + request: + template: "Receive {{method}} request on {{url}}" +session: + duration: 14400 + pullInterval: 30 + rollDuration: 3600 +default: + admin: + password: admin \ No newline at end of file diff --git a/tools/badctl/cmd/docker/.dockerignore b/tools/badctl/cmd/docker/.dockerignore index 62e2b989..f7db6083 100644 --- a/tools/badctl/cmd/docker/.dockerignore +++ b/tools/badctl/cmd/docker/.dockerignore @@ -1 +1,11 @@ -badaas/docker \ No newline at end of file +# general +.editorconfig +.git +.gitignore +.github +*.md +LICENSE +.vscode + +# badaas +badaas/docker diff --git a/tools/badctl/cmd/gen.go b/tools/badctl/cmd/gen.go index 1e624132..3417b7d9 100644 --- a/tools/badctl/cmd/gen.go +++ b/tools/badctl/cmd/gen.go @@ -5,6 +5,7 @@ import ( "fmt" "os" "path/filepath" + "strings" "github.com/ditrit/verdeter" "github.com/ditrit/verdeter/validators" @@ -32,7 +33,7 @@ const ( Postgres = "postgres" ) -var dbProviders = []string{Cockroachdb, Postgres} +var DBProviders = []string{Cockroachdb, Postgres} var DBPorts = map[string]int{ Cockroachdb: 26257, @@ -44,15 +45,19 @@ func init() { err := genCmd.LKey( DBProviderKey, verdeter.IsStr, "p", - fmt.Sprintf("Database provider %v", dbProviders), + fmt.Sprintf( + "Database provider (%s), default: %s", + strings.Join(DBProviders, "|"), + Cockroachdb, + ), ) if err != nil { panic(err) } - genCmd.SetRequired(DBProviderKey) + genCmd.SetDefault(DBProviderKey, Cockroachdb) genCmd.AddValidator( DBProviderKey, - validators.AuthorizedValues(dbProviders...), + validators.AuthorizedValues(DBProviders...), ) } From 5427c1d0728e5092cfeb39b5fe46b8aac0869d67 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 15:45:05 +0200 Subject: [PATCH 130/467] update pr template --- .github/pull_request_template.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c2d7558b..2c29b492 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,5 +1,6 @@ :information_source: Don't forget to modify the changelog.md before merging this branch. :information_source: Don't forget to modify config files: -- `badaas.example.yml`: the example file. -- `/scripts/e2e/api/ci-conf.yml`: otherwise you will probably break the CI. (*For local testing please use [act](https://github.com/nektos/act)*). \ No newline at end of file + +- `badaas.example.yml`: the example file. +- `tools/badctl/cmd/config/badaas.yml`: the default config file generated by badctl. From ba731ed4acd875a11194bede36b1edbde6a43573 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 15:48:14 +0200 Subject: [PATCH 131/467] fix md problems --- .github/ISSUE_TEMPLATE/bug_report.md | 15 +++++++++------ .github/ISSUE_TEMPLATE/user_story.md | 3 +-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 31914924..9cc652d2 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -5,30 +5,33 @@ title: '' labels: Bug --- -**Describe the bug** +## Describe the bug A clear and concise description of what the bug is. -**To Reproduce** +## To Reproduce Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error -**Expected behavior** +## Expected behavior A clear and concise description of what you expected to happen. -**Screenshots** +## Screenshots If applicable, add screenshots to help explain your problem. -**Application (please complete the following information):** +## Application + +Please complete the following information: - badaas version [X.X.X] or commit hash -**Additional context** +## Additional context Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/user_story.md b/.github/ISSUE_TEMPLATE/user_story.md index ec61755b..1112fab2 100644 --- a/.github/ISSUE_TEMPLATE/user_story.md +++ b/.github/ISSUE_TEMPLATE/user_story.md @@ -26,7 +26,7 @@ labels: User Story, To be verify `[Put all others constraints here, like list of acceptances values or other]` -## Resources: +## Resources `[Put all your resources here, like mockups, diagrams or other here]` @@ -37,4 +37,3 @@ labels: User Story, To be verify ## Links `[Only use by the team, to link this feature with epic, technical tasks or bugs]` - From ac5560d9686c37264439d55cb97439f274b5ee26 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 15:55:11 +0200 Subject: [PATCH 132/467] add again config_path to badctl --- tools/badctl/cmd/docker/api/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/badctl/cmd/docker/api/Dockerfile b/tools/badctl/cmd/docker/api/Dockerfile index d2486624..1ea62ae9 100644 --- a/tools/badctl/cmd/docker/api/Dockerfile +++ b/tools/badctl/cmd/docker/api/Dockerfile @@ -14,4 +14,4 @@ USER badaas COPY --from=builder /app/badaas_service . COPY ./badaas/config/badaas.yml . EXPOSE 8000 -ENTRYPOINT ["./badaas_service"] \ No newline at end of file +ENTRYPOINT ["./badaas_service", "--config_path", "badaas.yml"] \ No newline at end of file From 2774cec48cde0860fb77d5c86a34f0d1f158372b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 16:50:07 +0200 Subject: [PATCH 133/467] fix only log error when error is not nul --- router/middlewares/middlewareJson.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/router/middlewares/middlewareJson.go b/router/middlewares/middlewareJson.go index b60760f5..d539efc2 100644 --- a/router/middlewares/middlewareJson.go +++ b/router/middlewares/middlewareJson.go @@ -49,9 +49,11 @@ func (controller *jsonControllerImpl) Wrap(handler JSONHandler) func(response ht } response.Header().Set("Content-Type", "application/json") _, err = response.Write(payload) - controller.logger.Error( - "Error while writing http response", - zap.String("error", err.Error()), - ) + if err != nil { + controller.logger.Error( + "Error while writing http response", + zap.String("error", err.Error()), + ) + } } } From cbd4c9e035709de25df59ec17e4b302b3a7b9931 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 17:12:32 +0200 Subject: [PATCH 134/467] allow user to set api version --- badaas.go | 2 -- controllers/ModuleFx.go | 16 ++++++++++++--- controllers/info.go | 21 +++++++++++--------- {router => controllers}/routes.go | 13 ++++++------- {router => controllers}/routes_test.go | 27 ++++++++++++++------------ go.mod | 1 + test_e2e/features/api_info.feature | 2 +- test_e2e/test_api.go | 14 +++++++++---- test_integration/integration_test.go | 13 +------------ 9 files changed, 59 insertions(+), 50 deletions(-) rename {router => controllers}/routes.go (89%) rename {router => controllers}/routes_test.go (88%) diff --git a/badaas.go b/badaas.go index 54144380..7b74b751 100644 --- a/badaas.go +++ b/badaas.go @@ -2,7 +2,6 @@ package badaas import ( "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/logger" "github.com/ditrit/badaas/persistence" "github.com/ditrit/badaas/router" @@ -16,7 +15,6 @@ var BadaasModule = fx.Module( "badaas", configuration.ConfigurationModule, router.RouterModule, - controllers.ControllerModule, logger.LoggerModule, persistence.PersistanceModule, services.ServicesModule, diff --git a/controllers/ModuleFx.go b/controllers/ModuleFx.go index ed5af211..a025dec4 100644 --- a/controllers/ModuleFx.go +++ b/controllers/ModuleFx.go @@ -2,10 +2,20 @@ package controllers import "go.uber.org/fx" -// ControllerModule for fx -var ControllerModule = fx.Module( - "controllers", +var InfoControllerModule = fx.Module( + "infoController", fx.Provide(NewInfoController), + fx.Invoke(AddInfoRoutes), +) + +var AuthControllerModule = fx.Module( + "authController", fx.Provide(NewBasicAuthenticationController), + fx.Invoke(AddAuthRoutes), +) + +var EAVControllerModule = fx.Module( + "eavController", fx.Provide(NewEAVController), + fx.Invoke(AddEAVCRUDRoutes), ) diff --git a/controllers/info.go b/controllers/info.go index 52ac9861..50e58ad3 100644 --- a/controllers/info.go +++ b/controllers/info.go @@ -3,11 +3,10 @@ package controllers import ( "net/http" + "github.com/Masterminds/semver/v3" "github.com/ditrit/badaas/httperrors" ) -const Version = "UNRELEASED" - // The information controller type InformationController interface { // Return the badaas server information @@ -17,19 +16,23 @@ type InformationController interface { // check interface compliance var _ InformationController = (*infoControllerImpl)(nil) -// The InformationController constructor -func NewInfoController() InformationController { - return &infoControllerImpl{} +// The concrete implementation of the InformationController +type infoControllerImpl struct { + Version *semver.Version } -// The concrete implementation of the InformationController -type infoControllerImpl struct{} +// The InformationController constructor +func NewInfoController(version *semver.Version) InformationController { + return &infoControllerImpl{ + Version: version, + } +} // Return the badaas server information -func (*infoControllerImpl) Info(response http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +func (c *infoControllerImpl) Info(response http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { return &BadaasServerInfo{ Status: "OK", - Version: Version, + Version: c.Version.String(), }, nil } diff --git a/router/routes.go b/controllers/routes.go similarity index 89% rename from router/routes.go rename to controllers/routes.go index 9b06964a..a81b370b 100644 --- a/router/routes.go +++ b/controllers/routes.go @@ -1,10 +1,9 @@ -package router +package controllers import ( "strings" "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/router/middlewares" "github.com/ditrit/badaas/services/userservice" "github.com/gorilla/mux" @@ -14,7 +13,7 @@ import ( func AddInfoRoutes( router *mux.Router, jsonController middlewares.JSONController, - infoController controllers.InformationController, + infoController InformationController, ) { router.HandleFunc( "/info", @@ -26,11 +25,11 @@ func AddInfoRoutes( // /login // /logout // And creates a very first user -func AddLoginRoutes( +func AddAuthRoutes( logger *zap.Logger, router *mux.Router, authenticationMiddleware middlewares.AuthenticationMiddleware, - basicAuthenticationController controllers.BasicAuthenticationController, + basicAuthenticationController BasicAuthenticationController, jsonController middlewares.JSONController, config configuration.InitializationConfiguration, userService userservice.UserService, @@ -69,9 +68,9 @@ func createSuperUser( return nil } -func AddCRUDRoutes( +func AddEAVCRUDRoutes( router *mux.Router, - eavController controllers.EAVController, + eavController EAVController, jsonController middlewares.JSONController, ) { // Objects CRUD diff --git a/router/routes_test.go b/controllers/routes_test.go similarity index 88% rename from router/routes_test.go rename to controllers/routes_test.go index ded02859..4ac4096c 100644 --- a/router/routes_test.go +++ b/controllers/routes_test.go @@ -1,4 +1,4 @@ -package router +package controllers import ( "errors" @@ -6,11 +6,12 @@ import ( "net/http/httptest" "testing" - "github.com/ditrit/badaas/controllers" + "github.com/Masterminds/semver/v3" mocks "github.com/ditrit/badaas/mocks/configuration" mockControllers "github.com/ditrit/badaas/mocks/controllers" mockMiddlewares "github.com/ditrit/badaas/mocks/router/middlewares" mockUserServices "github.com/ditrit/badaas/mocks/services/userservice" + "github.com/ditrit/badaas/router" "github.com/ditrit/badaas/router/middlewares" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -74,11 +75,13 @@ func TestCreateSuperUser_UserServiceError(t *testing.T) { require.Equal(t, 1, logs.Len()) } +var logger, _ = zap.NewDevelopment() + func TestAddInfoRoutes(t *testing.T) { - jsonController := middlewares.NewJSONController(nil) - informationController := controllers.NewInfoController() + jsonController := middlewares.NewJSONController(logger) + informationController := NewInfoController(semver.MustParse("1.0.1")) - router := NewRouter() + router := router.NewRouter() AddInfoRoutes( router, jsonController, @@ -94,11 +97,11 @@ func TestAddInfoRoutes(t *testing.T) { router.ServeHTTP(response, request) assert.Equal(t, response.Code, http.StatusOK) - assert.Equal(t, response.Body.String(), "{\"status\":\"OK\",\"version\":\"UNRELEASED\"}") + assert.Equal(t, response.Body.String(), "{\"status\":\"OK\",\"version\":\"1.0.1\"}") } func TestAddLoginRoutes(t *testing.T) { - jsonController := middlewares.NewJSONController(nil) + jsonController := middlewares.NewJSONController(logger) initializationConfig := mocks.NewInitializationConfiguration(t) initializationConfig. @@ -116,8 +119,8 @@ func TestAddLoginRoutes(t *testing.T) { authenticationMiddleware := mockMiddlewares.NewAuthenticationMiddleware(t) - router := NewRouter() - AddLoginRoutes( + router := router.NewRouter() + AddAuthRoutes( nil, router, authenticationMiddleware, @@ -140,15 +143,15 @@ func TestAddLoginRoutes(t *testing.T) { } func TestAddCRUDRoutes(t *testing.T) { - jsonController := middlewares.NewJSONController(nil) + jsonController := middlewares.NewJSONController(logger) eavController := mockControllers.NewEAVController(t) eavController. On("GetObjects", mock.Anything, mock.Anything). Return(map[string]string{"GetObjects": "called"}, nil) - router := NewRouter() - AddCRUDRoutes( + router := router.NewRouter() + AddEAVCRUDRoutes( router, eavController, jsonController, diff --git a/go.mod b/go.mod index 267ca212..f50a00b0 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.18 require ( github.com/DATA-DOG/go-sqlmock v1.5.0 + github.com/Masterminds/semver/v3 v3.1.1 github.com/Masterminds/squirrel v1.5.3 github.com/ditrit/verdeter v0.4.0 github.com/elliotchance/pie/v2 v2.5.2 diff --git a/test_e2e/features/api_info.feature b/test_e2e/features/api_info.feature index d992db54..b14da5b7 100644 --- a/test_e2e/features/api_info.feature +++ b/test_e2e/features/api_info.feature @@ -4,4 +4,4 @@ Scenario: Server should return ok and current project version When I request "/info" Then status code is "200" And response field "status" is "OK" - And response field "version" is "UNRELEASED" + And response field "version" is "0.0.0-unreleased" diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index 5f9e18d8..5ceb66ab 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -5,9 +5,10 @@ import ( "net" "net/http" + "github.com/Masterminds/semver/v3" "github.com/ditrit/badaas" "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/router" + "github.com/ditrit/badaas/controllers" "github.com/ditrit/verdeter" "github.com/gorilla/handlers" "github.com/gorilla/mux" @@ -44,10 +45,11 @@ func runHTTPServer(cmd *cobra.Command, args []string) { return &fxevent.ZapLogger{Logger: logger} }), + fx.Provide(NewAPIVersion), // add routes provided by badaas - fx.Invoke(router.AddInfoRoutes), - fx.Invoke(router.AddLoginRoutes), - fx.Invoke(router.AddCRUDRoutes), + controllers.InfoControllerModule, + controllers.AuthControllerModule, + controllers.EAVControllerModule, // create httpServer fx.Provide(NewHTTPServer), @@ -57,6 +59,10 @@ func runHTTPServer(cmd *cobra.Command, args []string) { ).Run() } +func NewAPIVersion() *semver.Version { + return semver.MustParse("0.0.0-unreleased") +} + func NewHTTPServer( lc fx.Lifecycle, logger *zap.Logger, diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index 17e23823..9698eadc 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -7,12 +7,6 @@ import ( "testing" "github.com/ditrit/badaas" - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/controllers" - "github.com/ditrit/badaas/logger" - "github.com/ditrit/badaas/persistence" - "github.com/ditrit/badaas/router" - "github.com/ditrit/badaas/services" "github.com/ditrit/verdeter" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -47,12 +41,7 @@ func TestAll(t *testing.T) { func injectDependencies(cmd *cobra.Command, args []string) { fx.New( // Modules - configuration.ConfigurationModule, - router.RouterModule, - controllers.ControllerModule, - logger.LoggerModule, - persistence.PersistanceModule, - services.ServicesModule, + badaas.BadaasModule, // logger for fx fx.WithLogger(func(logger *zap.Logger) fxevent.Logger { From 9e5cec5cda2118d02a3974ab9130a01e61768290 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 5 May 2023 17:33:15 +0200 Subject: [PATCH 135/467] add docs about the controllers --- README.md | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d304af14..6eb76c2d 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Once you have started your project with `go init`, you must add the dependency t ```bash -go get -u github.com/ditrit/badaas@dbd7e55 +go get -u github.com/ditrit/badaas@cbd4c9e035709de25df59ec17e4b302b3a7b9931 go get -u github.com/uber-go/fx go get -u github.com/ditrit/verdeter ``` @@ -72,13 +72,18 @@ func runCommandFunc(cmd *cobra.Command, args []string) { fx.New( badaas.BadaasModule, + fx.Provide(NewAPIVersion), // add routes provided by badaas - fx.Invoke(router.AddInfoRoutes), - fx.Invoke(router.AddLoginRoutes), - fx.Invoke(router.AddCRUDRoutes), + badaasControllers.InfoControllerModule, + badaasControllers.AuthControllerModule, + badaasControllers.EAVControllerModule, // Here you can start the rest of the modules that your project uses. ).Run() } + +func NewAPIVersion() *semver.Version { + return semver.MustParse("0.0.0-unreleased") +} ``` Once you have defined the functionalities of your project (an http api for example), you can generate everything you need to run your application using `badctl`. @@ -87,7 +92,7 @@ For installing it, use: ```bash -go install github.com/ditrit/badaas/tools/badctl@bef1116 +go install github.com/ditrit/badaas/tools/badctl@cbd4c9e035709de25df59ec17e4b302b3a7b9931 ``` Then generate files to make this project work with `cockroach` as database: @@ -106,6 +111,59 @@ badctl run The api will be available at . +### Provided functionalities + +#### InfoControllerModule + +`InfoControllerModule` adds the path `/info`, where the api version will be answered. To set the version we want to be responded to we must provide the version using fx: + +```go +func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + // provide api version + fx.Provide(NewAPIVersion), + // add /info route provided by badaas + badaasControllers.InfoControllerModule, + ).Run() +} + +func NewAPIVersion() *semver.Version { + return semver.MustParse("0.0.0-unreleased") +} +``` + +#### AuthControllerModule + +`AuthControllerModule` adds `/login` and `/logout`, which allow us to add authentication to our application in a simple way: + +```go +func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + // add /login and /logout routes provided by badaas + badaasControllers.AuthControllerModule, + ).Run() +} +``` + +#### EAVControllerModule + +`EAVControllerModule` adds `/objects/{type}` and `/objects/{type}/{id}`, where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to create, read, update and remove objects. For more information on how to use them, see the [miniblog example](https://github.com/ditrit/badaas-example). + +```go +func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + // add /login and /logout routes provided by badaas + badaasControllers.EAVControllerModule, + ).Run() +} +``` + ### Configuration Badaas use [verdeter](https://github.com/ditrit/verdeter) to manage it's configuration, so Badaas is POSIX compliant by default. From 83b120f0853bce9dccb32fd27e858aa0fd71d0e6 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 9 May 2023 21:28:52 +0200 Subject: [PATCH 136/467] first version with lots of todos --- controllers/crud.go | 176 +++++++++ controllers/eav.go | 14 +- controllers/generalCrud.go | 102 ++++++ controllers/routes.go | 19 +- go.mod | 1 + go.sum | 2 + persistence/models/Product.go | 55 +++ persistence/models/Tabler.go | 5 + services/crud.go | 194 ++++++++++ test_e2e/features/object_storage.feature | 2 +- test_e2e/http_support_test.go | 12 +- test_integration/asserts.go | 37 +- test_integration/crudservice.go | 448 +++++++++++++++++++++++ test_integration/integration_test.go | 8 + test_integration/setup.go | 4 + 15 files changed, 1044 insertions(+), 35 deletions(-) create mode 100644 controllers/crud.go create mode 100644 controllers/generalCrud.go create mode 100644 persistence/models/Product.go create mode 100644 services/crud.go create mode 100644 test_integration/crudservice.go diff --git a/controllers/crud.go b/controllers/crud.go new file mode 100644 index 00000000..a18dee99 --- /dev/null +++ b/controllers/crud.go @@ -0,0 +1,176 @@ +package controllers + +import ( + "encoding/json" + "errors" + "io" + "net/http" + + "github.com/ditrit/badaas/httperrors" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services" + "github.com/google/uuid" + "github.com/gorilla/mux" + "go.uber.org/zap" + "gorm.io/gorm" +) + +type CRUDController interface { + GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) +} + +// TODO un monton de codigo duplicado + +// check interface compliance +var _ CRUDController = (*crudControllerImpl[models.User])(nil) + +func NewCRUDController[T models.Tabler, ID any]( + logger *zap.Logger, + crudService services.CRUDService[T, uuid.UUID], +) CRUDController { + return &crudControllerImpl[T]{ // TODO ver este uuid hardcode + logger: logger, + crudService: crudService, + } +} + +// The concrete implementation of the EAVController +type crudControllerImpl[T models.Tabler] struct { + logger *zap.Logger + crudService services.CRUDService[T, uuid.UUID] +} + +// The handler responsible of the retrieval of one objects +func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityID, herr := controller.getEntityIDFromRequest(r) + if herr != nil { + return nil, herr + } + + entity, err := controller.crudService.GetEntity(entityID) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } + return nil, ErrDBQueryFailed(err) + } + + return entity, nil +} + +// The handler responsible of the retrieval of multiple objects +func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + params, herr := controller.decodeJSON(r) + if herr != nil { + return nil, herr + } + + entities, err := controller.crudService.GetEntities(params) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityTypeNotFound + } + return nil, ErrDBQueryFailed(err) + } + + return entities, nil +} + +// The handler responsible of the creation of a object +func (controller *crudControllerImpl[T]) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + attrs, herr := controller.decodeJSON(r) + if herr != nil { + return nil, herr + } + + entity, err := controller.crudService.CreateEntity(attrs) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityTypeNotFound + } + return nil, ErrDBQueryFailed(err) + } + + // TODO ver como hacer esto + // w.Header().Add("Location", buildLocationString(entity)) + w.WriteHeader(http.StatusCreated) + + return entity, nil +} + +// The handler responsible for the updates of one object +func (controller *crudControllerImpl[T]) UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityID, herr := controller.getEntityIDFromRequest(r) + if herr != nil { + return nil, herr + } + + attrs, herr := controller.decodeJSON(r) + if herr != nil { + return nil, herr + } + + entity, err := controller.crudService.UpdateEntity(entityID, attrs) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } + return nil, ErrDBQueryFailed(err) + } + + return entity, nil +} + +// The handler responsible for the deletion of a object +func (controller *crudControllerImpl[T]) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityID, herr := controller.getEntityIDFromRequest(r) + if herr != nil { + return nil, herr + } + + err := controller.crudService.DeleteEntity(entityID) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } + return nil, ErrDBQueryFailed(err) + } + + return nil, nil +} + +// TODO codigo duplicado + +// Extract the "id" parameter from url +func (controller *crudControllerImpl[T]) getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { + id, present := mux.Vars(r)["id"] + if !present { + return uuid.Nil, ErrEntityNotFound + } + + uid, err := uuid.Parse(id) + if err != nil { + return uuid.Nil, ErrIDNotAnUUID + } + + return uid, nil +} + +// Decode json present in request body +func (controller *crudControllerImpl[T]) decodeJSON(r *http.Request) (map[string]any, httperrors.HTTPError) { + var attrs map[string]any + err := json.NewDecoder(r.Body).Decode(&attrs) + switch { + case err == io.EOF: + // empty body + return map[string]any{}, nil + case err != nil: + return nil, httperrors.NewBadRequestError("json decoding failed", "please use a correct json payload") + } + + return attrs, nil +} diff --git a/controllers/eav.go b/controllers/eav.go index 1c5983e8..0734a785 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -25,21 +25,13 @@ var ( } ) -type EAVController interface { - GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) -} - // check interface compliance -var _ EAVController = (*eavControllerImpl)(nil) +var _ CRUDController = (*eavControllerImpl)(nil) func NewEAVController( logger *zap.Logger, eavService services.EAVService, -) EAVController { +) CRUDController { return &eavControllerImpl{ logger: logger, eavService: eavService, @@ -120,7 +112,7 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http } func buildLocationString(et *models.Entity) string { - return fmt.Sprintf("/objects/%s/%s", et.EntityType.Name, et.ID.String()) + return fmt.Sprintf("eav/objects/%s/%s", et.EntityType.Name, et.ID.String()) } // The handler responsible for the updates of one object diff --git a/controllers/generalCrud.go b/controllers/generalCrud.go new file mode 100644 index 00000000..ef0ca3eb --- /dev/null +++ b/controllers/generalCrud.go @@ -0,0 +1,102 @@ +package controllers + +import ( + "net/http" + + "github.com/ditrit/badaas/httperrors" + "github.com/gorilla/mux" + "go.uber.org/zap" +) + +// check interface compliance +var _ CRUDController = (*GeneralCRUDController)(nil) + +func NewGeneralCRUDController( + logger *zap.Logger, + entityMapping map[string]CRUDController, +) *GeneralCRUDController { + return &GeneralCRUDController{ + logger: logger, + entityMapping: entityMapping, + } +} + +// The concrete implementation of the EAVController +type GeneralCRUDController struct { + logger *zap.Logger + entityMapping map[string]CRUDController +} + +// The handler responsible of the retrieval of one objects +func (controller *GeneralCRUDController) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + crudController, herr := controller.getEntityCRUDController(r) + if herr != nil { + return nil, herr + } + + return crudController.GetObject(w, r) +} + +// The handler responsible of the retrieval of multiple objects +func (controller *GeneralCRUDController) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + crudController, herr := controller.getEntityCRUDController(r) + if herr != nil { + return nil, herr + } + + return crudController.GetObjects(w, r) +} + +// The handler responsible of the creation of a object +func (controller *GeneralCRUDController) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + crudController, herr := controller.getEntityCRUDController(r) + if herr != nil { + return nil, herr + } + + return crudController.CreateObject(w, r) +} + +// The handler responsible for the updates of one object +func (controller *GeneralCRUDController) UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + crudController, herr := controller.getEntityCRUDController(r) + if herr != nil { + return nil, herr + } + + return crudController.UpdateObject(w, r) +} + +// The handler responsible for the deletion of a object +func (controller *GeneralCRUDController) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + crudController, herr := controller.getEntityCRUDController(r) + if herr != nil { + return nil, herr + } + + return crudController.DeleteObject(w, r) +} + +func (controller *GeneralCRUDController) getEntityCRUDController(r *http.Request) (CRUDController, httperrors.HTTPError) { + entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) + if herr != nil { + return nil, herr + } + + crudController, isPresent := controller.entityMapping[entityTypeName] + if !isPresent { + return nil, ErrEntityTypeNotFound + } + + return crudController, nil +} + +// Extract the "type" parameter from url +func (controller *GeneralCRUDController) getEntityTypeNameFromRequest(r *http.Request) (string, httperrors.HTTPError) { + entityTypeName, present := mux.Vars(r)["type"] + if !present { + return "", ErrEntityTypeNotFound + } + + return entityTypeName, nil +} diff --git a/controllers/routes.go b/controllers/routes.go index a81b370b..56bd2c3a 100644 --- a/controllers/routes.go +++ b/controllers/routes.go @@ -70,11 +70,11 @@ func createSuperUser( func AddEAVCRUDRoutes( router *mux.Router, - eavController EAVController, + eavController CRUDController, jsonController middlewares.JSONController, ) { // Objects CRUD - objectsBase := "/objects/{type}" + objectsBase := "/eav/objects/{type}" objectsWithID := objectsBase + "/{id}" router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.GetObject)).Methods("GET") router.HandleFunc(objectsBase, jsonController.Wrap(eavController.GetObjects)).Methods("GET") @@ -82,3 +82,18 @@ func AddEAVCRUDRoutes( router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.UpdateObject)).Methods("PUT") router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.DeleteObject)).Methods("DELETE") } + +func AddCRUDRoutes( + router *mux.Router, + generalCRUDController GeneralCRUDController, + jsonController middlewares.JSONController, +) { + // Objects CRUD + objectsBase := "/objects/{type}" + objectsWithID := objectsBase + "/{id}" + router.HandleFunc(objectsWithID, jsonController.Wrap(generalCRUDController.GetObject)).Methods("GET") + router.HandleFunc(objectsBase, jsonController.Wrap(generalCRUDController.GetObjects)).Methods("GET") + router.HandleFunc(objectsBase, jsonController.Wrap(generalCRUDController.CreateObject)).Methods("POST") + router.HandleFunc(objectsWithID, jsonController.Wrap(generalCRUDController.UpdateObject)).Methods("PUT") + router.HandleFunc(objectsWithID, jsonController.Wrap(generalCRUDController.DeleteObject)).Methods("DELETE") +} diff --git a/go.mod b/go.mod index f50a00b0..13b0c7f6 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/gertd/go-pluralize v0.2.1 github.com/google/go-cmp v0.5.9 // indirect github.com/goph/emperror v0.17.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect diff --git a/go.sum b/go.sum index 2e8b9d51..ca39b114 100644 --- a/go.sum +++ b/go.sum @@ -83,6 +83,8 @@ github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/gertd/go-pluralize v0.2.1 h1:M3uASbVjMnTsPb0PNqg+E/24Vwigyo/tvyMTtAlLgiA= +github.com/gertd/go-pluralize v0.2.1/go.mod h1:rbYaKDbsXxmRfr8uygAEKhOWsjyrrqrkHVpZvoOp8zk= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= diff --git a/persistence/models/Product.go b/persistence/models/Product.go new file mode 100644 index 00000000..d9d110ea --- /dev/null +++ b/persistence/models/Product.go @@ -0,0 +1,55 @@ +package models + +import "github.com/google/uuid" + +// TODO esto no deberia estar aca +type Company struct { + BaseModel + + Name string + Sellers []Seller +} + +type Product struct { + BaseModel + + String string + Int int + Float float64 + Bool bool +} + +type Seller struct { + BaseModel + + Name string + CompanyID *uuid.UUID +} + +type Sale struct { + BaseModel + + // belongsTo Product + Product *Product + ProductID uuid.UUID + + // belongsTo Seller + Seller *Seller + SellerID uuid.UUID +} + +func (Product) TableName() string { + return "products" +} + +func (Sale) TableName() string { + return "sales" +} + +func (m Product) Equal(other Product) bool { + return m.ID == other.ID +} + +func (m Sale) Equal(other Sale) bool { + return m.ID == other.ID +} diff --git a/persistence/models/Tabler.go b/persistence/models/Tabler.go index 6dfe07fd..5a09a68e 100644 --- a/persistence/models/Tabler.go +++ b/persistence/models/Tabler.go @@ -7,6 +7,11 @@ var ListOfTables = []any{ Entity{}, Value{}, Attribute{}, + // TODO esto deberia poder ser seteado por el usuario + Company{}, + Product{}, + Seller{}, + Sale{}, } // The interface "type" need to implement to be considered models diff --git a/services/crud.go b/services/crud.go new file mode 100644 index 00000000..cae895fe --- /dev/null +++ b/services/crud.go @@ -0,0 +1,194 @@ +package services + +import ( + "fmt" + + "github.com/ditrit/badaas/persistence/models" + pluralize "github.com/gertd/go-pluralize" + "github.com/google/uuid" + "github.com/mitchellh/mapstructure" + "go.uber.org/zap" + "golang.org/x/exp/maps" + "gorm.io/gorm" +) + +type CRUDService[T models.Tabler, ID any] interface { + GetEntity(id ID) (*T, error) + GetEntities(conditions map[string]any) ([]*T, error) + CreateEntity(attributeValues map[string]any) (*T, error) + UpdateEntity(entityID ID, newValues map[string]any) (*T, error) + DeleteEntity(entityID ID) error +} + +// check interface compliance +var _ CRUDService[models.User, uuid.UUID] = (*crudServiceImpl[models.User, uuid.UUID])(nil) + +// Implementation of the Generic CRUD Repository +type crudServiceImpl[T models.Tabler, ID any] struct { + CRUDService[T, ID] + logger *zap.Logger + db *gorm.DB +} + +func NewCRUDService[T models.Tabler]( + logger *zap.Logger, + db *gorm.DB, +) CRUDService[T, uuid.UUID] { // TODO ver este UUID hardcodeado aca + return &crudServiceImpl[T, uuid.UUID]{ + logger: logger, + db: db, + } +} + +// TODO todo el codigo duplicado con CRUD repository +// Get the Entity of type with name "entityTypeName" that has the "id" +func (service *crudServiceImpl[T, ID]) GetEntity(id uuid.UUID) (*T, error) { + var entity T + err := service.db.First(&entity, "id = ?", id).Error + if err != nil { + return nil, err + } + + return &entity, nil +} + +// Get entities of type with name "entityTypeName" that match all "conditions" +// +// "conditions" is in {"attributeName": expectedValue} format +// in case of join "conditions" can have the format: +// +// {"relationAttributeName": {"attributeName": expectedValue}} +func (service *crudServiceImpl[T, ID]) GetEntities(conditions map[string]any) ([]*T, error) { + thisEntityConditions := map[string]any{} + joinConditions := map[string]map[string]any{} + + // only entities that match the conditions + for attributeName, expectedValue := range conditions { + switch typedExpectedValue := expectedValue.(type) { + case float64, bool, string, nil: + thisEntityConditions[attributeName] = expectedValue + case map[string]any: + joinConditions[attributeName] = typedExpectedValue + default: + return nil, fmt.Errorf("unsupported type") + } + } + + query := service.db.Where(thisEntityConditions) + + var entity T + // only entities that match the conditions + for joinAttributeName, joinConditions := range joinConditions { + // TODO +s no necesariamente, hay plurales que cambian + err := service.addJoinToQuery(query, entity.TableName(), joinAttributeName, joinConditions) + if err != nil { + return nil, err + } + } + + // execute query + var entities []*T + err := query.Find(&entities).Error + + return entities, err +} + +// Adds a join to the "query" by the "attributeName" that must be relation type +// then, adds the verification that the values for the joined entity are "expectedValues" + +// "expectedValues" is in {"attributeName": expectedValue} format +func (service *crudServiceImpl[T, ID]) addJoinToQuery( + query *gorm.DB, previousTable, joinAttributeName string, conditions map[string]any, +) error { + // TODO codigo duplicado + thisEntityConditions := map[string]any{} + joinConditions := map[string]map[string]any{} + + for attributeName, expectedValue := range conditions { + switch typedExpectedValue := expectedValue.(type) { + case float64, bool, string, nil: + thisEntityConditions[attributeName] = expectedValue + case map[string]any: + joinConditions[attributeName] = typedExpectedValue + default: + return fmt.Errorf("unsupported type") + } + } + + pluralize := pluralize.NewClient() + tableName := pluralize.Plural(joinAttributeName) + tableWithSuffix := tableName + "_" + previousTable + stringQuery := fmt.Sprintf( + `JOIN %[1]s %[2]s ON + %[2]s.id = %[3]s.%[4]s_id + `, + tableName, + tableWithSuffix, + previousTable, + joinAttributeName, + // TODO ver que pase si attributeName no existe como tabla + ) + + for _, attributeName := range maps.Keys(thisEntityConditions) { + stringQuery += fmt.Sprintf( + `AND %[1]s.%[2]s = ? + `, + tableWithSuffix, attributeName, + ) + } + + query.Joins(stringQuery, maps.Values(thisEntityConditions)...) + + // only entities that match the conditions + // TODO codigo duplicado + for joinAttributeName, joinConditions := range joinConditions { + err := service.addJoinToQuery(query, tableWithSuffix, joinAttributeName, joinConditions) + if err != nil { + return err + } + } + + return nil +} + +// Creates a Entity of type "entityType" and its Values from the information provided in "attributeValues" +// not specified values are set with the default value (if exists) or a null value. +// entries in "attributeValues" that do not correspond to any attribute of "entityType" are ignored +// +// "attributeValues" are in {"attributeName": value} format +func (service *crudServiceImpl[T, ID]) CreateEntity(attributeValues map[string]any) (*T, error) { + var entity T + // TODO ver si dejo esto o desencodeo el json directo en la entidad + // TODO testear lo de que se le pueden agregar relaciones a esto + err := mapstructure.Decode(attributeValues, &entity) + if err != nil { + return nil, err // TODO ver que errores puede haber aca + } + + err = service.db.Create(&entity).Error + if err != nil { + return nil, err + } + + // TODO eliminar esto + // err := service.db.Model(&entity).Create(attributeValues).Error + // if err != nil { + // return nil, err + // } + // entity.ID = attributeValues["id"] + + return &entity, nil +} + +// Updates entity with type "entityTypeName" and "id" Values to the new values provided in "newValues" +// entries in "newValues" that do not correspond to any attribute of the EntityType are ignored +// +// "newValues" are in {"attributeName": newValue} format +func (service *crudServiceImpl[T, ID]) UpdateEntity(entityID uuid.UUID, newValues map[string]any) (*T, error) { + return nil, nil +} + +// Deletes Entity with type "entityTypeName" and id "entityID" and its values +func (service *crudServiceImpl[T, ID]) DeleteEntity(entityID uuid.UUID) error { + return nil +} diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/object_storage.feature index fac0de2c..798e03e8 100644 --- a/test_e2e/features/object_storage.feature +++ b/test_e2e/features/object_storage.feature @@ -1,6 +1,6 @@ Feature: Saving and querying objects in the database using the EAV Model Scenario: Objects can be created with CreateObject - When I request "/objects/profile" with method "POST" with json + When I request "/eav/objects/profile" with method "POST" with json | key | value | type | | displayName | Jean Dupont | string | | yearOfBirth | 1997 | integer | diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index cd1711c1..083689c1 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -220,7 +220,7 @@ func checkMethod(method string) (string, error) { func (t *TestContext) objectExists(entityType string, jsonTable *godog.Table) error { err := t.request( - "/objects/"+entityType, + "/eav/objects/"+entityType, http.MethodPost, nil, jsonTable, @@ -266,7 +266,7 @@ func (t *TestContext) queryWithObjectID(entityType string) error { } err := t.requestGet( - "/objects/" + entityType + "/" + id.(string), + "/eav/objects/" + entityType + "/" + id.(string), ) if err != nil { return err @@ -282,7 +282,7 @@ func (t *TestContext) queryWithObjectID(entityType string) error { func (t *TestContext) queryObjectsWithConditions(entityType string, jsonTable *godog.Table) error { err := t.requestWithJson( - "/objects/"+entityType, + "/eav/objects/"+entityType, http.MethodGet, jsonTable, ) @@ -300,7 +300,7 @@ func (t *TestContext) queryObjectsWithConditions(entityType string, jsonTable *g func (t *TestContext) queryAllObjects(entityType string) error { err := t.requestGet( - "/objects/" + entityType, + "/eav/objects/" + entityType, ) if err != nil { return err @@ -359,7 +359,7 @@ func (t *TestContext) deleteWithObjectID(entityType string) error { } err := t.request( - "/objects/"+entityType+"/"+id.(string), + "/eav/objects/"+entityType+"/"+id.(string), http.MethodDelete, nil, nil, @@ -383,7 +383,7 @@ func (t *TestContext) modifyWithAttributes(entityType string, jsonTable *godog.T } err := t.request( - "/objects/"+entityType+"/"+id.(string), + "/eav/objects/"+entityType+"/"+id.(string), http.MethodPut, nil, jsonTable, diff --git a/test_integration/asserts.go b/test_integration/asserts.go index b4bffec2..f26ae5d2 100644 --- a/test_integration/asserts.go +++ b/test_integration/asserts.go @@ -1,7 +1,7 @@ package integrationtests import ( - "reflect" + "log" "sort" "github.com/ditrit/badaas/persistence/models" @@ -10,21 +10,28 @@ import ( is "gotest.tools/assert/cmp" ) -func EqualList(ts *suite.Suite, expected, actual any) { - v := reflect.ValueOf(expected) - v2 := reflect.ValueOf(actual) - - ts.Len(actual, v.Len()) - - for i := 0; i < v.Len(); i++ { - j := 0 - for ; j < v.Len(); j++ { - if is.DeepEqual(v2.Index(j).Interface(), v.Index(i).Interface())().Success() { - break +func EqualList[T any](ts *suite.Suite, expectedList, actualList []T) { + expectedLen := len(expectedList) + equalLen := ts.Len(actualList, expectedLen) + + if equalLen { + for i := 0; i < expectedLen; i++ { + j := 0 + for ; j < expectedLen; j++ { + if is.DeepEqual( + actualList[j], + expectedList[i], + )().Success() { + break + } + } + if j == expectedLen { + // TODO mejorar esto + ts.Fail("Lists not equal", "element %v not in list %v", expectedList[i], actualList) + for _, element := range actualList { + log.Println(element) + } } - } - if j == v.Len() { - ts.Fail("element %v not in list %v", v.Index(i).Interface(), actual) } } } diff --git a/test_integration/crudservice.go b/test_integration/crudservice.go new file mode 100644 index 00000000..a7c79f91 --- /dev/null +++ b/test_integration/crudservice.go @@ -0,0 +1,448 @@ +package integrationtests + +import ( + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services" + "github.com/google/uuid" + "github.com/stretchr/testify/suite" + "go.uber.org/zap" + "gorm.io/gorm" +) + +type CRUDServiceIntTestSuite struct { + suite.Suite + logger *zap.Logger + db *gorm.DB + crudProductService services.CRUDService[models.Product, uuid.UUID] + crudSaleService services.CRUDService[models.Sale, uuid.UUID] +} + +func NewCRUDServiceIntTestSuite( + logger *zap.Logger, + db *gorm.DB, + crudProductService services.CRUDService[models.Product, uuid.UUID], + crudSaleService services.CRUDService[models.Sale, uuid.UUID], +) *CRUDServiceIntTestSuite { + return &CRUDServiceIntTestSuite{ + logger: logger, + db: db, + crudProductService: crudProductService, + crudSaleService: crudSaleService, + } +} + +func (ts *CRUDServiceIntTestSuite) SetupTest() { + CleanDB(ts.db) +} + +// ------------------------- GetEntities -------------------------------- + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { + entities, err := ts.crudProductService.GetEntities(map[string]any{}) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { + match := ts.createProduct(map[string]any{}) + + entities, err := ts.crudProductService.GetEntities(map[string]any{}) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { + match1 := ts.createProduct(map[string]any{}) + match2 := ts.createProduct(map[string]any{}) + match3 := ts.createProduct(map[string]any{}) + + entities, err := ts.crudProductService.GetEntities(map[string]any{}) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { + params := map[string]any{ + "string": "not_created", + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{}, entities) +} + +// TODO mirar esto, el string del where se pone sin tabla, puede generar problemas cuando haya join +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { + ts.createProduct(map[string]any{ + "string": "something_else", + }) + + params := map[string]any{ + "string": "not_match", + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { + match := ts.createProduct(map[string]any{ + "string": "match", + }) + ts.createProduct(map[string]any{ + "string": "something_else", + }) + + params := map[string]any{ + "string": "match", + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { + match1 := ts.createProduct(map[string]any{ + "string": "match", + }) + match2 := ts.createProduct(map[string]any{ + "string": "match", + }) + ts.createProduct(map[string]any{ + "string": "something_else", + }) + + params := map[string]any{ + "string": "match", + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +// TODO ver caso en el que la columna no existe +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsEmpty() { +// ts.createProduct(map[string]any{ +// "string": "match", +// }) +// ts.createProduct(map[string]any{ +// "string": "match", +// }) +// ts.createProduct(map[string]any{ +// "string": "match", +// }) + +// params := map[string]any{ +// "not_exists": "not_exists", +// } +// entities, err := ts.crudProductService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Product{}, entities) +// } + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { + match := ts.createProduct(map[string]any{ + "string": "match", + "int": 1, + }) + ts.createProduct(map[string]any{ + "string": "not_match", + "int": 2, + }) + + params := map[string]any{ + "int": 1.0, + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +// TODO ver este caso +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeReturnsEmptyList() { +// ts.createProduct(map[string]any{ +// "string": "not_match", +// "int": 1, +// }) + +// params := map[string]any{ +// "int": "not_an_int", +// } +// entities, err := ts.crudProductService.GetEntities(params) +// ts.Nil(err) +// ts.Len(entities, 0) +// } + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { + match := ts.createProduct(map[string]any{ + "string": "match", + "float": 1.1, + }) + ts.createProduct(map[string]any{ + "string": "not_match", + "float": 2.0, + }) + + params := map[string]any{ + "float": 1.1, + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { + match := ts.createProduct(map[string]any{ + "string": "match", + "bool": true, + }) + ts.createProduct(map[string]any{ + "string": "not_match", + "bool": false, + }) + + params := map[string]any{ + "bool": true, + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +// TODO testear la creacion directo con entidades +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { + product1 := ts.createProduct(map[string]any{}) + product2 := ts.createProduct(map[string]any{}) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(product1, seller1) + ts.createSale(product2, seller2) + + params := map[string]any{ + "product_id": product1.ID.String(), + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +// TODO ver esto +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionFilterByNull() { +// match := ts.createProduct(map[string]any{}) +// ts.createProduct(map[string]any{ +// "string": "something", +// }) + +// params := map[string]any{ +// "string": nil, +// } +// entities, err := ts.crudProductService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { + match1 := ts.createProduct(map[string]any{ + "string": "match", + "int": 1, + "bool": true, + }) + match2 := ts.createProduct(map[string]any{ + "string": "match", + "int": 1, + "bool": true, + }) + + ts.createProduct(map[string]any{ + "string": "not_match", + "int": 1, + "bool": true, + }) + ts.createProduct(map[string]any{ + "string": "match", + "int": 2, + "bool": true, + }) + + params := map[string]any{ + "string": "match", + "int": 1.0, + "bool": true, + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoins() { + product1 := ts.createProduct(map[string]any{ + "int": 1, + }) + product2 := ts.createProduct(map[string]any{ + "int": 2, + }) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(product1, seller1) + ts.createSale(product2, seller2) + + params := map[string]any{ + "product": map[string]any{ + "int": 1.0, + }, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { + product1 := ts.createProduct(map[string]any{ + "int": 1, + "string": "match", + }) + product2 := ts.createProduct(map[string]any{ + "int": 2, + "string": "match", + }) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(product1, seller1) + ts.createSale(product2, seller2) + + params := map[string]any{ + "product": map[string]any{ + "int": 1.0, + "string": "match", + }, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +// // TODO aca deberia agregar casos en lo que 1 matchea pero el otro no +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { + product1 := ts.createProduct(map[string]any{ + "int": 1, + }) + product2 := ts.createProduct(map[string]any{ + "int": 2, + }) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(product1, seller1) + ts.createSale(product2, seller2) + + params := map[string]any{ + "product": map[string]any{ + "int": 1.0, + }, + "seller": map[string]any{ + "name": "franco", + }, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { + product1 := ts.createProduct(map[string]any{}) + product2 := ts.createProduct(map[string]any{}) + + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + seller1 := ts.createSeller("franco", company1) + seller2 := ts.createSeller("agustin", company2) + + match := ts.createSale(product1, seller1) + ts.createSale(product2, seller2) + + params := map[string]any{ + // TODO meter algo aca tambien, que sea join y mio + "seller": map[string]any{ + "name": "franco", + "company": map[string]any{ + "name": "ditrit", + }, + }, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +// TODO falta test de que joinea dos veces con la misma entidad +// TODO faltan test para otros tipos de relaciones + +// ------------------------- utils ------------------------- + +func (ts *CRUDServiceIntTestSuite) createProduct(values map[string]any) *models.Product { + entity, err := ts.crudProductService.CreateEntity(values) + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceIntTestSuite) createSale(product *models.Product, seller *models.Seller) *models.Sale { + entity := &models.Sale{ + Product: product, + Seller: seller, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceIntTestSuite) createSeller(name string, company *models.Company) *models.Seller { + var companyID *uuid.UUID + if company != nil { + companyID = &company.ID + } + entity := &models.Seller{ + Name: name, + CompanyID: companyID, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceIntTestSuite) createCompany(name string) *models.Company { + entity := &models.Company{ + Name: name, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index 9698eadc..2ed51cc1 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -7,6 +7,8 @@ import ( "testing" "github.com/ditrit/badaas" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services" "github.com/ditrit/verdeter" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -50,14 +52,20 @@ func injectDependencies(cmd *cobra.Command, args []string) { fx.Provide(NewEAVServiceIntTestSuite), + fx.Provide(services.NewCRUDService[models.Product]), + fx.Provide(services.NewCRUDService[models.Sale]), + fx.Provide(NewCRUDServiceIntTestSuite), + fx.Invoke(runTestSuites), ).Run() } func runTestSuites( ts1 *EAVServiceIntTestSuite, + ts2 *CRUDServiceIntTestSuite, shutdowner fx.Shutdowner, ) { suite.Run(tGlobal, ts1) + suite.Run(tGlobal, ts2) shutdowner.Shutdown() } diff --git a/test_integration/setup.go b/test_integration/setup.go index b4aee8bc..57ae1c9c 100644 --- a/test_integration/setup.go +++ b/test_integration/setup.go @@ -14,6 +14,10 @@ var ListOfTables = []any{ models.Entity{}, models.Attribute{}, models.EntityType{}, + models.Sale{}, + models.Seller{}, + models.Company{}, + models.Product{}, } func CleanDB(db *gorm.DB) { From e4bc083c32502cd3f0ebbe9508d6894050820be5 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 9 May 2023 21:43:07 +0200 Subject: [PATCH 137/467] add crud controller module --- controllers/ModuleFx.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/controllers/ModuleFx.go b/controllers/ModuleFx.go index a025dec4..5e0b3bf7 100644 --- a/controllers/ModuleFx.go +++ b/controllers/ModuleFx.go @@ -19,3 +19,9 @@ var EAVControllerModule = fx.Module( fx.Provide(NewEAVController), fx.Invoke(AddEAVCRUDRoutes), ) + +var CRUDControllerModule = fx.Module( + "crudController", + fx.Provide(NewGeneralCRUDController), + fx.Invoke(AddCRUDRoutes), +) From b2a62ed65371e50f44959596d1ded1c54f0a360d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 9 May 2023 21:57:10 +0200 Subject: [PATCH 138/467] add anotate to eavController --- controllers/ModuleFx.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/controllers/ModuleFx.go b/controllers/ModuleFx.go index 5e0b3bf7..46733716 100644 --- a/controllers/ModuleFx.go +++ b/controllers/ModuleFx.go @@ -16,7 +16,12 @@ var AuthControllerModule = fx.Module( var EAVControllerModule = fx.Module( "eavController", - fx.Provide(NewEAVController), + fx.Provide( + fx.Annotate( + NewEAVController, + fx.ResultTags(`name:"eavController"`), + ), + ), fx.Invoke(AddEAVCRUDRoutes), ) From 03b08e142c13df3128911f39894401515b03c118 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 9 May 2023 22:14:30 +0200 Subject: [PATCH 139/467] fix generalcrudController providing --- controllers/routes.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/routes.go b/controllers/routes.go index 56bd2c3a..d563203d 100644 --- a/controllers/routes.go +++ b/controllers/routes.go @@ -85,7 +85,7 @@ func AddEAVCRUDRoutes( func AddCRUDRoutes( router *mux.Router, - generalCRUDController GeneralCRUDController, + generalCRUDController *GeneralCRUDController, jsonController middlewares.JSONController, ) { // Objects CRUD From e2e9f8693c51cde744b6a9f55580b4b6ffef0033 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 9 May 2023 22:49:47 +0200 Subject: [PATCH 140/467] use eav controller annotation + getCrudModule --- controllers/ModuleFx.go | 35 +++++++++++++++++++++++++++++++++-- controllers/routes.go | 2 +- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/controllers/ModuleFx.go b/controllers/ModuleFx.go index 46733716..9d9b83e9 100644 --- a/controllers/ModuleFx.go +++ b/controllers/ModuleFx.go @@ -1,6 +1,12 @@ package controllers -import "go.uber.org/fx" +import ( + "fmt" + + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services" + "go.uber.org/fx" +) var InfoControllerModule = fx.Module( "infoController", @@ -22,7 +28,12 @@ var EAVControllerModule = fx.Module( fx.ResultTags(`name:"eavController"`), ), ), - fx.Invoke(AddEAVCRUDRoutes), + fx.Invoke( + fx.Annotate( + AddEAVCRUDRoutes, + fx.ParamTags(`name:"eavController"`), + ), + ), ) var CRUDControllerModule = fx.Module( @@ -30,3 +41,23 @@ var CRUDControllerModule = fx.Module( fx.Provide(NewGeneralCRUDController), fx.Invoke(AddCRUDRoutes), ) + +func GetCRUDModule[T models.Tabler, ID any]() fx.Option { + return fx.Module( + "crudModule", + fx.Provide( + fx.Annotate( + NewCRUDController[T, ID], + fx.ResultTags( + fmt.Sprintf( + `name:"%TCRUDController"`, + *new(T), + ), + ), + ), + ), + fx.Provide( + services.NewCRUDService[T], + ), + ) +} diff --git a/controllers/routes.go b/controllers/routes.go index d563203d..d8627f2c 100644 --- a/controllers/routes.go +++ b/controllers/routes.go @@ -69,8 +69,8 @@ func createSuperUser( } func AddEAVCRUDRoutes( - router *mux.Router, eavController CRUDController, + router *mux.Router, jsonController middlewares.JSONController, ) { // Objects CRUD From 7dc26368c5ba67606d654e0bb9b870fd14b7c86d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 10 May 2023 10:24:34 +0200 Subject: [PATCH 141/467] db port export again --- controllers/routes_test.go | 2 +- tools/badctl/cmd/docker/cockroachdb/docker-compose.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/controllers/routes_test.go b/controllers/routes_test.go index 4ac4096c..2253365d 100644 --- a/controllers/routes_test.go +++ b/controllers/routes_test.go @@ -152,8 +152,8 @@ func TestAddCRUDRoutes(t *testing.T) { router := router.NewRouter() AddEAVCRUDRoutes( - router, eavController, + router, jsonController, ) diff --git a/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml b/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml index 4e09731d..3dee027d 100644 --- a/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml +++ b/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml @@ -5,6 +5,7 @@ services: image: cockroachdb/cockroach:latest container_name: badaas-db ports: + - "26257:26257" # TODO ver si mantener esto o no, necesario en dev para conectarme a la base - "8080:8080" # Web based dashboard command: start-single-node --insecure volumes: From ddbcf3a8a233cfde74f7b3206d339cad4cd0cbb5 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 10 May 2023 10:42:55 +0200 Subject: [PATCH 142/467] check that joined objects are not deleted --- services/crud.go | 1 + 1 file changed, 1 insertion(+) diff --git a/services/crud.go b/services/crud.go index cae895fe..962477ff 100644 --- a/services/crud.go +++ b/services/crud.go @@ -121,6 +121,7 @@ func (service *crudServiceImpl[T, ID]) addJoinToQuery( stringQuery := fmt.Sprintf( `JOIN %[1]s %[2]s ON %[2]s.id = %[3]s.%[4]s_id + AND %[2]s.deleted_at IS NULL `, tableName, tableWithSuffix, From be747346f875eef483173ac10211572aad436072 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 10 May 2023 16:53:15 +0200 Subject: [PATCH 143/467] crud service uses crud repository + adapt session and user services to new crud repository --- controllers/ModuleFx.go | 11 +- controllers/basicAuth.go | 80 ++++- controllers/basicAuth_test.go | 9 +- controllers/crud.go | 37 +- controllers/eav.go | 36 +- controllers/eav_test.go | 4 +- controllers/routes_test.go | 6 +- controllers/utils.go | 45 +++ go.mod | 4 +- httperrors/httperrors.go | 5 + mocks/controllers/CRUDController.go | 170 ++++++++++ mocks/persistence/repository/BadaasID.go | 25 ++ .../persistence/repository/CRUDRepository.go | 223 ++++++------ mocks/services/CRUDService.go | 148 ++++++++ .../services/sessionservice/SessionService.go | 38 ++- mocks/services/userservice/UserService.go | 14 +- persistence/gormdatabase/helpers.go | 2 +- persistence/models/Session.go | 10 +- persistence/repository/CRUDRepository.go | 30 +- persistence/repository/CRUDRepositoryImpl.go | 319 ++++++++++-------- .../repository/CRUDRepositoryImpl_test.go | 52 --- services/crud.go | 137 ++------ services/sessionservice/session.go | 98 +++--- services/sessionservice/session_test.go | 127 +++---- services/userservice/userservice.go | 48 +-- services/userservice/userservice_test.go | 108 +++--- test_integration/integration_test.go | 6 +- 27 files changed, 1046 insertions(+), 746 deletions(-) create mode 100644 controllers/utils.go create mode 100644 mocks/controllers/CRUDController.go create mode 100644 mocks/persistence/repository/BadaasID.go create mode 100644 mocks/services/CRUDService.go delete mode 100644 persistence/repository/CRUDRepositoryImpl_test.go diff --git a/controllers/ModuleFx.go b/controllers/ModuleFx.go index 9d9b83e9..ca697abc 100644 --- a/controllers/ModuleFx.go +++ b/controllers/ModuleFx.go @@ -4,7 +4,9 @@ import ( "fmt" "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services" + "github.com/google/uuid" "go.uber.org/fx" ) @@ -42,12 +44,14 @@ var CRUDControllerModule = fx.Module( fx.Invoke(AddCRUDRoutes), ) -func GetCRUDModule[T models.Tabler, ID any]() fx.Option { +func GetCRUDModule[T models.Tabler]() fx.Option { return fx.Module( "crudModule", + fx.Provide(repository.NewCRUDRepository[T, uuid.UUID]), + fx.Provide(services.NewCRUDService[T, uuid.UUID]), fx.Provide( fx.Annotate( - NewCRUDController[T, ID], + NewCRUDController[T], fx.ResultTags( fmt.Sprintf( `name:"%TCRUDController"`, @@ -56,8 +60,5 @@ func GetCRUDModule[T models.Tabler, ID any]() fx.Option { ), ), ), - fx.Provide( - services.NewCRUDService[T], - ), ) } diff --git a/controllers/basicAuth.go b/controllers/basicAuth.go index 3a65cfb5..c701c739 100644 --- a/controllers/basicAuth.go +++ b/controllers/basicAuth.go @@ -1,25 +1,23 @@ package controllers import ( - "encoding/json" + "errors" + "fmt" "net/http" + "time" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models/dto" + "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" "go.uber.org/zap" ) var ( - // Sent when the request is malformed - HTTPErrRequestMalformed httperrors.HTTPError = httperrors.NewHTTPError( - http.StatusBadRequest, - "Request malformed", - "The schema of the received data is not correct", - nil, - false, - ) + HERRAccessToken = func(err error) httperrors.HTTPError { + return httperrors.NewInternalServerError("access token error", "unable to create access token", err) + } ) type BasicAuthenticationController interface { @@ -52,20 +50,36 @@ func NewBasicAuthenticationController( // Log In with username and password func (basicAuthController *basicAuthenticationController) BasicLoginHandler(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { var loginJSONStruct dto.UserLoginDTO - err := json.NewDecoder(r.Body).Decode(&loginJSONStruct) - if err != nil { - return nil, HTTPErrRequestMalformed - } - user, herr := basicAuthController.userService.GetUser(loginJSONStruct) + herr := decodeJSON(r, &loginJSONStruct) if herr != nil { return nil, herr } + user, err := basicAuthController.userService.GetUser(loginJSONStruct) + if err != nil { + if errors.Is(err, repository.ErrObjectNotFound) { + return nil, httperrors.NewErrorNotFound( + "user", + fmt.Sprintf("no user found with email %q", loginJSONStruct.Email), + ) + } else if errors.Is(err, userservice.ErrWrongPassword) { + return nil, httperrors.NewUnauthorizedError( + "wrong password", "the provided password is incorrect", + ) + } + + return nil, httperrors.NewDBError(err) + } + // On valid password, generate a session and return it's uuid to the client - herr = basicAuthController.sessionService.LogUserIn(user, w) - if herr != nil { - return nil, herr + session, err := basicAuthController.sessionService.LogUserIn(user) + if err != nil { + return nil, httperrors.NewDBError(err) + } + err = createAndSetAccessTokenCookie(w, session.ID.String()) + if err != nil { + return nil, HERRAccessToken(err) } return dto.DTOLoginSuccess{ @@ -77,5 +91,35 @@ func (basicAuthController *basicAuthenticationController) BasicLoginHandler(w ht // Log Out the user func (basicAuthController *basicAuthenticationController) Logout(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - return nil, basicAuthController.sessionService.LogUserOut(sessionservice.GetSessionClaimsFromContext(r.Context()), w) + herr := basicAuthController.sessionService.LogUserOut(sessionservice.GetSessionClaimsFromContext(r.Context())) + if herr != nil { + return nil, herr + } + + err := createAndSetAccessTokenCookie(w, "") + if err != nil { + return nil, HERRAccessToken(err) + } + + return nil, nil +} + +// Create an access token and send it in a cookie +func createAndSetAccessTokenCookie(w http.ResponseWriter, sessionUUID string) error { + accessToken := &http.Cookie{ + Name: "access_token", + Path: "/", + Value: sessionUUID, + HttpOnly: true, + SameSite: http.SameSiteNoneMode, // TODO change to http.SameSiteStrictMode in prod + Secure: false, // TODO change to true in prod + Expires: time.Now().Add(48 * time.Hour), + } + err := accessToken.Valid() + if err != nil { + return err + } + + http.SetCookie(w, accessToken) + return nil } diff --git a/controllers/basicAuth_test.go b/controllers/basicAuth_test.go index d388a421..99cb32cd 100644 --- a/controllers/basicAuth_test.go +++ b/controllers/basicAuth_test.go @@ -4,6 +4,7 @@ import ( "net/http/httptest" "strings" "testing" + "time" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/httperrors" @@ -104,8 +105,8 @@ func Test_BasicLoginHandler_LoginFailed(t *testing.T) { Return(user, nil) sessionService := mocksSessionService.NewSessionService(t) sessionService. - On("LogUserIn", user, response). - Return(httperrors.AnError) + On("LogUserIn", user). + Return(nil, httperrors.AnError) controller := controllers.NewBasicAuthenticationController( logger, @@ -149,8 +150,8 @@ func Test_BasicLoginHandler_LoginSuccess(t *testing.T) { Return(user, nil) sessionService := mocksSessionService.NewSessionService(t) sessionService. - On("LogUserIn", user, response). - Return(nil) + On("LogUserIn", user). + Return(models.NewSession(user.ID, time.Duration(5)), nil) controller := controllers.NewBasicAuthenticationController( logger, diff --git a/controllers/crud.go b/controllers/crud.go index a18dee99..af60aefe 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -1,9 +1,7 @@ package controllers import ( - "encoding/json" "errors" - "io" "net/http" "github.com/ditrit/badaas/httperrors" @@ -28,11 +26,11 @@ type CRUDController interface { // check interface compliance var _ CRUDController = (*crudControllerImpl[models.User])(nil) -func NewCRUDController[T models.Tabler, ID any]( +func NewCRUDController[T models.Tabler]( logger *zap.Logger, crudService services.CRUDService[T, uuid.UUID], ) CRUDController { - return &crudControllerImpl[T]{ // TODO ver este uuid hardcode + return &crudControllerImpl[T]{ logger: logger, crudService: crudService, } @@ -56,7 +54,7 @@ func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *htt if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound } - return nil, ErrDBQueryFailed(err) + return nil, httperrors.NewDBError(err) } return entity, nil @@ -64,7 +62,7 @@ func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *htt // The handler responsible of the retrieval of multiple objects func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - params, herr := controller.decodeJSON(r) + params, herr := decodeJSONOptional(r) if herr != nil { return nil, herr } @@ -74,7 +72,7 @@ func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *ht if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityTypeNotFound } - return nil, ErrDBQueryFailed(err) + return nil, httperrors.NewDBError(err) } return entities, nil @@ -82,7 +80,7 @@ func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *ht // The handler responsible of the creation of a object func (controller *crudControllerImpl[T]) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - attrs, herr := controller.decodeJSON(r) + attrs, herr := decodeJSONOptional(r) if herr != nil { return nil, herr } @@ -92,7 +90,7 @@ func (controller *crudControllerImpl[T]) CreateObject(w http.ResponseWriter, r * if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityTypeNotFound } - return nil, ErrDBQueryFailed(err) + return nil, httperrors.NewDBError(err) } // TODO ver como hacer esto @@ -109,7 +107,7 @@ func (controller *crudControllerImpl[T]) UpdateObject(w http.ResponseWriter, r * return nil, herr } - attrs, herr := controller.decodeJSON(r) + attrs, herr := decodeJSONOptional(r) if herr != nil { return nil, herr } @@ -119,7 +117,7 @@ func (controller *crudControllerImpl[T]) UpdateObject(w http.ResponseWriter, r * if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound } - return nil, ErrDBQueryFailed(err) + return nil, httperrors.NewDBError(err) } return entity, nil @@ -137,7 +135,7 @@ func (controller *crudControllerImpl[T]) DeleteObject(w http.ResponseWriter, r * if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound } - return nil, ErrDBQueryFailed(err) + return nil, httperrors.NewDBError(err) } return nil, nil @@ -159,18 +157,3 @@ func (controller *crudControllerImpl[T]) getEntityIDFromRequest(r *http.Request) return uid, nil } - -// Decode json present in request body -func (controller *crudControllerImpl[T]) decodeJSON(r *http.Request) (map[string]any, httperrors.HTTPError) { - var attrs map[string]any - err := json.NewDecoder(r.Body).Decode(&attrs) - switch { - case err == io.EOF: - // empty body - return map[string]any{}, nil - case err != nil: - return nil, httperrors.NewBadRequestError("json decoding failed", "please use a correct json payload") - } - - return attrs, nil -} diff --git a/controllers/eav.go b/controllers/eav.go index 0734a785..d788ebe6 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -1,10 +1,8 @@ package controllers import ( - "encoding/json" "errors" "fmt" - "io" "net/http" "github.com/ditrit/badaas/httperrors" @@ -20,9 +18,6 @@ var ( ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid object id") ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists") ErrIDNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") - ErrDBQueryFailed = func(err error) httperrors.HTTPError { - return httperrors.NewInternalServerError("db error", "database query failed", err) - } ) // check interface compliance @@ -56,7 +51,7 @@ func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Re if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound } - return nil, ErrDBQueryFailed(err) + return nil, httperrors.NewDBError(err) } return entity, nil @@ -69,7 +64,7 @@ func (controller *eavControllerImpl) GetObjects(w http.ResponseWriter, r *http.R return nil, herr } - params, herr := controller.decodeJSON(r) + params, herr := decodeJSONOptional(r) if herr != nil { return nil, herr } @@ -79,7 +74,7 @@ func (controller *eavControllerImpl) GetObjects(w http.ResponseWriter, r *http.R if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityTypeNotFound } - return nil, ErrDBQueryFailed(err) + return nil, httperrors.NewDBError(err) } return entities, nil @@ -92,7 +87,7 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http return nil, herr } - attrs, herr := controller.decodeJSON(r) + attrs, herr := decodeJSONOptional(r) if herr != nil { return nil, herr } @@ -102,7 +97,7 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityTypeNotFound } - return nil, ErrDBQueryFailed(err) + return nil, httperrors.NewDBError(err) } w.Header().Add("Location", buildLocationString(entity)) @@ -122,7 +117,7 @@ func (controller *eavControllerImpl) UpdateObject(w http.ResponseWriter, r *http return nil, herr } - attrs, herr := controller.decodeJSON(r) + attrs, herr := decodeJSONOptional(r) if herr != nil { return nil, herr } @@ -132,7 +127,7 @@ func (controller *eavControllerImpl) UpdateObject(w http.ResponseWriter, r *http if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound } - return nil, ErrDBQueryFailed(err) + return nil, httperrors.NewDBError(err) } return entity, nil @@ -150,7 +145,7 @@ func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrEntityNotFound } - return nil, ErrDBQueryFailed(err) + return nil, httperrors.NewDBError(err) } return nil, nil @@ -195,18 +190,3 @@ func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Reques return entityTypeName, entityID, nil } - -// Decode json present in request body -func (controller *eavControllerImpl) decodeJSON(r *http.Request) (map[string]any, httperrors.HTTPError) { - var attrs map[string]any - err := json.NewDecoder(r.Body).Decode(&attrs) - switch { - case err == io.EOF: - // empty body - return map[string]any{}, nil - case err != nil: - return nil, httperrors.NewBadRequestError("json decoding failed", "please use a correct json payload") - } - - return attrs, nil -} diff --git a/controllers/eav_test.go b/controllers/eav_test.go index 7c0c0923..bf494434 100644 --- a/controllers/eav_test.go +++ b/controllers/eav_test.go @@ -480,7 +480,7 @@ func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) _, err := controller.CreateObject(response, request) - assert.ErrorContains(t, err, "json decoding failed") + assert.ErrorContains(t, err, "The schema of the received data is not correct") } func TestCreateOfNotExistentTypeReturnsError(t *testing.T) { @@ -607,7 +607,7 @@ func TestUpdateObjectWithBadJSONReturnsError(t *testing.T) { request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) _, err := controller.UpdateObject(response, request) - assert.ErrorContains(t, err, "json decoding failed") + assert.ErrorContains(t, err, "The schema of the received data is not correct") } func TestModifyOfNotExistentTypeReturnsError(t *testing.T) { diff --git a/controllers/routes_test.go b/controllers/routes_test.go index 2253365d..1c9bdde0 100644 --- a/controllers/routes_test.go +++ b/controllers/routes_test.go @@ -160,11 +160,11 @@ func TestAddCRUDRoutes(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( "GET", - "/objects/posts", + "/eav/objects/posts", nil, ) router.ServeHTTP(response, request) - assert.Equal(t, response.Code, http.StatusOK) - assert.Equal(t, response.Body.String(), "{\"GetObjects\":\"called\"}") + assert.Equal(t, http.StatusOK, response.Code) + assert.Equal(t, "{\"GetObjects\":\"called\"}", response.Body.String()) } diff --git a/controllers/utils.go b/controllers/utils.go new file mode 100644 index 00000000..fbccc3cf --- /dev/null +++ b/controllers/utils.go @@ -0,0 +1,45 @@ +package controllers + +import ( + "encoding/json" + "io" + "net/http" + + "github.com/ditrit/badaas/httperrors" +) + +var ( + // Sent when the request is malformed + HTTPErrRequestMalformed httperrors.HTTPError = httperrors.NewHTTPError( + http.StatusBadRequest, + "Request malformed", + "The schema of the received data is not correct", + nil, + false, + ) +) + +// Decode json present in request body +func decodeJSON(r *http.Request, to any) httperrors.HTTPError { + err := json.NewDecoder(r.Body).Decode(to) + if err != nil { + return HTTPErrRequestMalformed + } + + return nil +} + +// Decode json present in request body +func decodeJSONOptional(r *http.Request) (map[string]any, httperrors.HTTPError) { + to := map[string]any{} + err := json.NewDecoder(r.Body).Decode(&to) + switch { + case err == io.EOF: + // empty body + return to, nil + case err != nil: + return nil, HTTPErrRequestMalformed + } + + return to, nil +} diff --git a/go.mod b/go.mod index 13b0c7f6..76b5dff3 100644 --- a/go.mod +++ b/go.mod @@ -44,7 +44,7 @@ require ( github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -59,7 +59,7 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.15.0 // indirect go.uber.org/multierr v1.8.0 // indirect - golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect + golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 golang.org/x/sys v0.1.0 // indirect golang.org/x/text v0.4.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/httperrors/httperrors.go b/httperrors/httperrors.go index ad3b563c..ca43c4f1 100644 --- a/httperrors/httperrors.go +++ b/httperrors/httperrors.go @@ -115,6 +115,11 @@ func NewInternalServerError(errorName string, msg string, err error) HTTPError { ) } +// Constructor for an HttpError "DB Error", a internal server error produced by a query +func NewDBError(err error) HTTPError { + return NewInternalServerError("db error", "database query failed", err) +} + // A constructor for an HttpError "Unauthorized Error" func NewUnauthorizedError(errorName string, msg string) HTTPError { return NewHTTPError( diff --git a/mocks/controllers/CRUDController.go b/mocks/controllers/CRUDController.go new file mode 100644 index 00000000..83fc6f61 --- /dev/null +++ b/mocks/controllers/CRUDController.go @@ -0,0 +1,170 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + http "net/http" + + httperrors "github.com/ditrit/badaas/httperrors" + mock "github.com/stretchr/testify/mock" +) + +// CRUDController is an autogenerated mock type for the CRUDController type +type CRUDController struct { + mock.Mock +} + +// CreateObject provides a mock function with given fields: w, r +func (_m *CRUDController) CreateObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// DeleteObject provides a mock function with given fields: w, r +func (_m *CRUDController) DeleteObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// GetObject provides a mock function with given fields: w, r +func (_m *CRUDController) GetObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// GetObjects provides a mock function with given fields: w, r +func (_m *CRUDController) GetObjects(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// UpdateObject provides a mock function with given fields: w, r +func (_m *CRUDController) UpdateObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +type mockConstructorTestingTNewCRUDController interface { + mock.TestingT + Cleanup(func()) +} + +// NewCRUDController creates a new instance of CRUDController. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewCRUDController(t mockConstructorTestingTNewCRUDController) *CRUDController { + mock := &CRUDController{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/persistence/repository/BadaasID.go b/mocks/persistence/repository/BadaasID.go new file mode 100644 index 00000000..cf2c0098 --- /dev/null +++ b/mocks/persistence/repository/BadaasID.go @@ -0,0 +1,25 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// BadaasID is an autogenerated mock type for the BadaasID type +type BadaasID struct { + mock.Mock +} + +type mockConstructorTestingTNewBadaasID interface { + mock.TestingT + Cleanup(func()) +} + +// NewBadaasID creates a new instance of BadaasID. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewBadaasID(t mockConstructorTestingTNewBadaasID) *BadaasID { + mock := &BadaasID{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/persistence/repository/CRUDRepository.go b/mocks/persistence/repository/CRUDRepository.go index eeaecbbb..7a771570 100644 --- a/mocks/persistence/repository/CRUDRepository.go +++ b/mocks/persistence/repository/CRUDRepository.go @@ -3,10 +3,9 @@ package mocks import ( - httperrors "github.com/ditrit/badaas/httperrors" - mock "github.com/stretchr/testify/mock" - models "github.com/ditrit/badaas/persistence/models" + mock "github.com/stretchr/testify/mock" + gorm "gorm.io/gorm" pagination "github.com/ditrit/badaas/persistence/pagination" @@ -16,203 +15,215 @@ import ( ) // CRUDRepository is an autogenerated mock type for the CRUDRepository type -type CRUDRepository[T models.Tabler, ID interface{}] struct { +type CRUDRepository[T models.Tabler, ID repository.BadaasID] struct { mock.Mock } -// Count provides a mock function with given fields: _a0 -func (_m *CRUDRepository[T, ID]) Count(_a0 squirrel.Sqlizer) (uint, httperrors.HTTPError) { - ret := _m.Called(_a0) - - var r0 uint - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(squirrel.Sqlizer) (uint, httperrors.HTTPError)); ok { - return rf(_a0) - } - if rf, ok := ret.Get(0).(func(squirrel.Sqlizer) uint); ok { - r0 = rf(_a0) - } else { - r0 = ret.Get(0).(uint) - } +// Create provides a mock function with given fields: tx, entity +func (_m *CRUDRepository[T, ID]) Create(tx *gorm.DB, entity *T) error { + ret := _m.Called(tx, entity) - if rf, ok := ret.Get(1).(func(squirrel.Sqlizer) httperrors.HTTPError); ok { - r1 = rf(_a0) + var r0 error + if rf, ok := ret.Get(0).(func(*gorm.DB, *T) error); ok { + r0 = rf(tx, entity) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } + r0 = ret.Error(0) } - return r0, r1 + return r0 } -// Create provides a mock function with given fields: _a0 -func (_m *CRUDRepository[T, ID]) Create(_a0 *T) httperrors.HTTPError { - ret := _m.Called(_a0) +// Delete provides a mock function with given fields: tx, entity +func (_m *CRUDRepository[T, ID]) Delete(tx *gorm.DB, entity *T) error { + ret := _m.Called(tx, entity) - var r0 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(*T) httperrors.HTTPError); ok { - r0 = rf(_a0) + var r0 error + if rf, ok := ret.Get(0).(func(*gorm.DB, *T) error); ok { + r0 = rf(tx, entity) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(httperrors.HTTPError) - } + r0 = ret.Error(0) } return r0 } -// Delete provides a mock function with given fields: _a0 -func (_m *CRUDRepository[T, ID]) Delete(_a0 *T) httperrors.HTTPError { - ret := _m.Called(_a0) +// Find provides a mock function with given fields: tx, filters, _a2, sort +func (_m *CRUDRepository[T, ID]) Find(tx *gorm.DB, filters squirrel.Sqlizer, _a2 pagination.Paginator, sort repository.SortOption) (*pagination.Page[T], error) { + ret := _m.Called(tx, filters, _a2, sort) - var r0 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(*T) httperrors.HTTPError); ok { - r0 = rf(_a0) + var r0 *pagination.Page[T] + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, repository.SortOption) (*pagination.Page[T], error)); ok { + return rf(tx, filters, _a2, sort) + } + if rf, ok := ret.Get(0).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, repository.SortOption) *pagination.Page[T]); ok { + r0 = rf(tx, filters, _a2, sort) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(httperrors.HTTPError) + r0 = ret.Get(0).(*pagination.Page[T]) } } - return r0 + if rf, ok := ret.Get(1).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, repository.SortOption) error); ok { + r1 = rf(tx, filters, _a2, sort) + } else { + r1 = ret.Error(1) + } + + return r0, r1 } -// Find provides a mock function with given fields: _a0, _a1, _a2 -func (_m *CRUDRepository[T, ID]) Find(_a0 squirrel.Sqlizer, _a1 pagination.Paginator, _a2 repository.SortOption) (*pagination.Page[T], httperrors.HTTPError) { - ret := _m.Called(_a0, _a1, _a2) +// Get provides a mock function with given fields: tx, conditions +func (_m *CRUDRepository[T, ID]) Get(tx *gorm.DB, conditions map[string]interface{}) (*T, error) { + ret := _m.Called(tx, conditions) - var r0 *pagination.Page[T] - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(squirrel.Sqlizer, pagination.Paginator, repository.SortOption) (*pagination.Page[T], httperrors.HTTPError)); ok { - return rf(_a0, _a1, _a2) + var r0 *T + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) (*T, error)); ok { + return rf(tx, conditions) } - if rf, ok := ret.Get(0).(func(squirrel.Sqlizer, pagination.Paginator, repository.SortOption) *pagination.Page[T]); ok { - r0 = rf(_a0, _a1, _a2) + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) *T); ok { + r0 = rf(tx, conditions) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*pagination.Page[T]) + r0 = ret.Get(0).(*T) } } - if rf, ok := ret.Get(1).(func(squirrel.Sqlizer, pagination.Paginator, repository.SortOption) httperrors.HTTPError); ok { - r1 = rf(_a0, _a1, _a2) + if rf, ok := ret.Get(1).(func(*gorm.DB, map[string]interface{}) error); ok { + r1 = rf(tx, conditions) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } + r1 = ret.Error(1) } return r0, r1 } -// GetAll provides a mock function with given fields: _a0 -func (_m *CRUDRepository[T, ID]) GetAll(_a0 repository.SortOption) ([]*T, httperrors.HTTPError) { - ret := _m.Called(_a0) +// GetAll provides a mock function with given fields: tx +func (_m *CRUDRepository[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { + ret := _m.Called(tx) var r0 []*T - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(repository.SortOption) ([]*T, httperrors.HTTPError)); ok { - return rf(_a0) + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB) ([]*T, error)); ok { + return rf(tx) } - if rf, ok := ret.Get(0).(func(repository.SortOption) []*T); ok { - r0 = rf(_a0) + if rf, ok := ret.Get(0).(func(*gorm.DB) []*T); ok { + r0 = rf(tx) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*T) } } - if rf, ok := ret.Get(1).(func(repository.SortOption) httperrors.HTTPError); ok { - r1 = rf(_a0) + if rf, ok := ret.Get(1).(func(*gorm.DB) error); ok { + r1 = rf(tx) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } + r1 = ret.Error(1) } return r0, r1 } -// GetByID provides a mock function with given fields: _a0 -func (_m *CRUDRepository[T, ID]) GetByID(_a0 ID) (*T, httperrors.HTTPError) { - ret := _m.Called(_a0) +// GetByID provides a mock function with given fields: tx, id +func (_m *CRUDRepository[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, error) { + ret := _m.Called(tx, id) var r0 *T - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(ID) (*T, httperrors.HTTPError)); ok { - return rf(_a0) + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, ID) (*T, error)); ok { + return rf(tx, id) } - if rf, ok := ret.Get(0).(func(ID) *T); ok { - r0 = rf(_a0) + if rf, ok := ret.Get(0).(func(*gorm.DB, ID) *T); ok { + r0 = rf(tx, id) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*T) } } - if rf, ok := ret.Get(1).(func(ID) httperrors.HTTPError); ok { - r1 = rf(_a0) + if rf, ok := ret.Get(1).(func(*gorm.DB, ID) error); ok { + r1 = rf(tx, id) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } + r1 = ret.Error(1) } return r0, r1 } -// Save provides a mock function with given fields: _a0 -func (_m *CRUDRepository[T, ID]) Save(_a0 *T) httperrors.HTTPError { - ret := _m.Called(_a0) +// GetMultiple provides a mock function with given fields: tx, conditions +func (_m *CRUDRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]interface{}) ([]*T, error) { + ret := _m.Called(tx, conditions) - var r0 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(*T) httperrors.HTTPError); ok { - r0 = rf(_a0) + var r0 []*T + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) ([]*T, error)); ok { + return rf(tx, conditions) + } + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) []*T); ok { + r0 = rf(tx, conditions) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(httperrors.HTTPError) + r0 = ret.Get(0).([]*T) } } - return r0 + if rf, ok := ret.Get(1).(func(*gorm.DB, map[string]interface{}) error); ok { + r1 = rf(tx, conditions) + } else { + r1 = ret.Error(1) + } + + return r0, r1 } -// Transaction provides a mock function with given fields: fn -func (_m *CRUDRepository[T, ID]) Transaction(fn func(repository.CRUDRepository[T, ID]) (interface{}, error)) (interface{}, httperrors.HTTPError) { - ret := _m.Called(fn) +// GetOptional provides a mock function with given fields: tx, conditions +func (_m *CRUDRepository[T, ID]) GetOptional(tx *gorm.DB, conditions map[string]interface{}) (*T, error) { + ret := _m.Called(tx, conditions) - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(func(repository.CRUDRepository[T, ID]) (interface{}, error)) (interface{}, httperrors.HTTPError)); ok { - return rf(fn) + var r0 *T + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) (*T, error)); ok { + return rf(tx, conditions) } - if rf, ok := ret.Get(0).(func(func(repository.CRUDRepository[T, ID]) (interface{}, error)) interface{}); ok { - r0 = rf(fn) + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) *T); ok { + r0 = rf(tx, conditions) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) + r0 = ret.Get(0).(*T) } } - if rf, ok := ret.Get(1).(func(func(repository.CRUDRepository[T, ID]) (interface{}, error)) httperrors.HTTPError); ok { - r1 = rf(fn) + if rf, ok := ret.Get(1).(func(*gorm.DB, map[string]interface{}) error); ok { + r1 = rf(tx, conditions) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } + r1 = ret.Error(1) } return r0, r1 } +// Save provides a mock function with given fields: tx, entity +func (_m *CRUDRepository[T, ID]) Save(tx *gorm.DB, entity *T) error { + ret := _m.Called(tx, entity) + + var r0 error + if rf, ok := ret.Get(0).(func(*gorm.DB, *T) error); ok { + r0 = rf(tx, entity) + } else { + r0 = ret.Error(0) + } + + return r0 +} + type mockConstructorTestingTNewCRUDRepository interface { mock.TestingT Cleanup(func()) } // NewCRUDRepository creates a new instance of CRUDRepository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDRepository[T models.Tabler, ID interface{}](t mockConstructorTestingTNewCRUDRepository) *CRUDRepository[T, ID] { +func NewCRUDRepository[T models.Tabler, ID repository.BadaasID](t mockConstructorTestingTNewCRUDRepository) *CRUDRepository[T, ID] { mock := &CRUDRepository[T, ID]{} mock.Mock.Test(t) diff --git a/mocks/services/CRUDService.go b/mocks/services/CRUDService.go new file mode 100644 index 00000000..38b684af --- /dev/null +++ b/mocks/services/CRUDService.go @@ -0,0 +1,148 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + models "github.com/ditrit/badaas/persistence/models" + mock "github.com/stretchr/testify/mock" + + repository "github.com/ditrit/badaas/persistence/repository" +) + +// CRUDService is an autogenerated mock type for the CRUDService type +type CRUDService[T models.Tabler, ID repository.BadaasID] struct { + mock.Mock +} + +// CreateEntity provides a mock function with given fields: attributeValues +func (_m *CRUDService[T, ID]) CreateEntity(attributeValues map[string]interface{}) (*T, error) { + ret := _m.Called(attributeValues) + + var r0 *T + var r1 error + if rf, ok := ret.Get(0).(func(map[string]interface{}) (*T, error)); ok { + return rf(attributeValues) + } + if rf, ok := ret.Get(0).(func(map[string]interface{}) *T); ok { + r0 = rf(attributeValues) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*T) + } + } + + if rf, ok := ret.Get(1).(func(map[string]interface{}) error); ok { + r1 = rf(attributeValues) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteEntity provides a mock function with given fields: entityID +func (_m *CRUDService[T, ID]) DeleteEntity(entityID ID) error { + ret := _m.Called(entityID) + + var r0 error + if rf, ok := ret.Get(0).(func(ID) error); ok { + r0 = rf(entityID) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetEntities provides a mock function with given fields: conditions +func (_m *CRUDService[T, ID]) GetEntities(conditions map[string]interface{}) ([]*T, error) { + ret := _m.Called(conditions) + + var r0 []*T + var r1 error + if rf, ok := ret.Get(0).(func(map[string]interface{}) ([]*T, error)); ok { + return rf(conditions) + } + if rf, ok := ret.Get(0).(func(map[string]interface{}) []*T); ok { + r0 = rf(conditions) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*T) + } + } + + if rf, ok := ret.Get(1).(func(map[string]interface{}) error); ok { + r1 = rf(conditions) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetEntity provides a mock function with given fields: id +func (_m *CRUDService[T, ID]) GetEntity(id ID) (*T, error) { + ret := _m.Called(id) + + var r0 *T + var r1 error + if rf, ok := ret.Get(0).(func(ID) (*T, error)); ok { + return rf(id) + } + if rf, ok := ret.Get(0).(func(ID) *T); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*T) + } + } + + if rf, ok := ret.Get(1).(func(ID) error); ok { + r1 = rf(id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UpdateEntity provides a mock function with given fields: entityID, newValues +func (_m *CRUDService[T, ID]) UpdateEntity(entityID ID, newValues map[string]interface{}) (*T, error) { + ret := _m.Called(entityID, newValues) + + var r0 *T + var r1 error + if rf, ok := ret.Get(0).(func(ID, map[string]interface{}) (*T, error)); ok { + return rf(entityID, newValues) + } + if rf, ok := ret.Get(0).(func(ID, map[string]interface{}) *T); ok { + r0 = rf(entityID, newValues) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*T) + } + } + + if rf, ok := ret.Get(1).(func(ID, map[string]interface{}) error); ok { + r1 = rf(entityID, newValues) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type mockConstructorTestingTNewCRUDService interface { + mock.TestingT + Cleanup(func()) +} + +// NewCRUDService creates a new instance of CRUDService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewCRUDService[T models.Tabler, ID repository.BadaasID](t mockConstructorTestingTNewCRUDService) *CRUDService[T, ID] { + mock := &CRUDService[T, ID]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/services/sessionservice/SessionService.go b/mocks/services/sessionservice/SessionService.go index 101cfba9..d485a95b 100644 --- a/mocks/services/sessionservice/SessionService.go +++ b/mocks/services/sessionservice/SessionService.go @@ -3,8 +3,6 @@ package mocks import ( - http "net/http" - httperrors "github.com/ditrit/badaas/httperrors" mock "github.com/stretchr/testify/mock" @@ -46,29 +44,39 @@ func (_m *SessionService) IsValid(sessionUUID uuid.UUID) (bool, *sessionservice. return r0, r1 } -// LogUserIn provides a mock function with given fields: user, response -func (_m *SessionService) LogUserIn(user *models.User, response http.ResponseWriter) httperrors.HTTPError { - ret := _m.Called(user, response) +// LogUserIn provides a mock function with given fields: user +func (_m *SessionService) LogUserIn(user *models.User) (*models.Session, error) { + ret := _m.Called(user) - var r0 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(*models.User, http.ResponseWriter) httperrors.HTTPError); ok { - r0 = rf(user, response) + var r0 *models.Session + var r1 error + if rf, ok := ret.Get(0).(func(*models.User) (*models.Session, error)); ok { + return rf(user) + } + if rf, ok := ret.Get(0).(func(*models.User) *models.Session); ok { + r0 = rf(user) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(httperrors.HTTPError) + r0 = ret.Get(0).(*models.Session) } } - return r0 + if rf, ok := ret.Get(1).(func(*models.User) error); ok { + r1 = rf(user) + } else { + r1 = ret.Error(1) + } + + return r0, r1 } -// LogUserOut provides a mock function with given fields: sessionClaims, response -func (_m *SessionService) LogUserOut(sessionClaims *sessionservice.SessionClaims, response http.ResponseWriter) httperrors.HTTPError { - ret := _m.Called(sessionClaims, response) +// LogUserOut provides a mock function with given fields: sessionClaims +func (_m *SessionService) LogUserOut(sessionClaims *sessionservice.SessionClaims) httperrors.HTTPError { + ret := _m.Called(sessionClaims) var r0 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(*sessionservice.SessionClaims, http.ResponseWriter) httperrors.HTTPError); ok { - r0 = rf(sessionClaims, response) + if rf, ok := ret.Get(0).(func(*sessionservice.SessionClaims) httperrors.HTTPError); ok { + r0 = rf(sessionClaims) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(httperrors.HTTPError) diff --git a/mocks/services/userservice/UserService.go b/mocks/services/userservice/UserService.go index bd6bb257..6ecc1e6b 100644 --- a/mocks/services/userservice/UserService.go +++ b/mocks/services/userservice/UserService.go @@ -3,9 +3,7 @@ package mocks import ( - httperrors "github.com/ditrit/badaas/httperrors" dto "github.com/ditrit/badaas/persistence/models/dto" - mock "github.com/stretchr/testify/mock" models "github.com/ditrit/badaas/persistence/models" @@ -17,12 +15,12 @@ type UserService struct { } // GetUser provides a mock function with given fields: _a0 -func (_m *UserService) GetUser(_a0 dto.UserLoginDTO) (*models.User, httperrors.HTTPError) { +func (_m *UserService) GetUser(_a0 dto.UserLoginDTO) (*models.User, error) { ret := _m.Called(_a0) var r0 *models.User - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(dto.UserLoginDTO) (*models.User, httperrors.HTTPError)); ok { + var r1 error + if rf, ok := ret.Get(0).(func(dto.UserLoginDTO) (*models.User, error)); ok { return rf(_a0) } if rf, ok := ret.Get(0).(func(dto.UserLoginDTO) *models.User); ok { @@ -33,12 +31,10 @@ func (_m *UserService) GetUser(_a0 dto.UserLoginDTO) (*models.User, httperrors.H } } - if rf, ok := ret.Get(1).(func(dto.UserLoginDTO) httperrors.HTTPError); ok { + if rf, ok := ret.Get(1).(func(dto.UserLoginDTO) error); ok { r1 = rf(_a0) } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } + r1 = ret.Error(1) } return r0, r1 diff --git a/persistence/gormdatabase/helpers.go b/persistence/gormdatabase/helpers.go index c71650a5..885cc51e 100644 --- a/persistence/gormdatabase/helpers.go +++ b/persistence/gormdatabase/helpers.go @@ -11,7 +11,7 @@ func isPostgresError(err error, errCode string) bool { postgresError, ok := err.(*pgconn.PgError) if ok { return postgresError.Code == errCode - } + return false } diff --git a/persistence/models/Session.go b/persistence/models/Session.go index 89bdb1b7..cf6d0a22 100644 --- a/persistence/models/Session.go +++ b/persistence/models/Session.go @@ -13,6 +13,14 @@ type Session struct { ExpiresAt time.Time `gorm:"not null"` } +// Create a new session +func NewSession(userID uuid.UUID, sessionDuration time.Duration) *Session { + return &Session{ + UserID: userID, + ExpiresAt: time.Now().Add(sessionDuration), + } +} + // Return true is expired func (session *Session) IsExpired() bool { return time.Now().After(session.ExpiresAt) @@ -25,7 +33,7 @@ func (session *Session) CanBeRolled(rollInterval time.Duration) bool { // Return the pluralized table name // -// Satisfie the Tabler interface +// Satisfy the Tabler interface func (Session) TableName() string { return "sessions" } diff --git a/persistence/repository/CRUDRepository.go b/persistence/repository/CRUDRepository.go index e3c45662..039762e6 100644 --- a/persistence/repository/CRUDRepository.go +++ b/persistence/repository/CRUDRepository.go @@ -2,19 +2,29 @@ package repository import ( "github.com/Masterminds/squirrel" - "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/pagination" + "github.com/google/uuid" + "gorm.io/gorm" ) +type BadaasID interface { + int | uuid.UUID +} + // Generic CRUD Repository -type CRUDRepository[T models.Tabler, ID any] interface { - Create(*T) httperrors.HTTPError - Delete(*T) httperrors.HTTPError - Save(*T) httperrors.HTTPError - GetByID(ID) (*T, httperrors.HTTPError) - GetAll(SortOption) ([]*T, httperrors.HTTPError) - Count(squirrel.Sqlizer) (uint, httperrors.HTTPError) - Find(squirrel.Sqlizer, pagination.Paginator, SortOption) (*pagination.Page[T], httperrors.HTTPError) - Transaction(fn func(CRUDRepository[T, ID]) (any, error)) (any, httperrors.HTTPError) +type CRUDRepository[T models.Tabler, ID BadaasID] interface { + // create + Create(tx *gorm.DB, entity *T) error + // read + GetByID(tx *gorm.DB, id ID) (*T, error) + Get(tx *gorm.DB, conditions map[string]any) (*T, error) + GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) + GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) + GetAll(tx *gorm.DB) ([]*T, error) + Find(tx *gorm.DB, filters squirrel.Sqlizer, pagination pagination.Paginator, sort SortOption) (*pagination.Page[T], error) + // update + Save(tx *gorm.DB, entity *T) error + // delete + Delete(tx *gorm.DB, entity *T) error } diff --git a/persistence/repository/CRUDRepositoryImpl.go b/persistence/repository/CRUDRepositoryImpl.go index a0586ec9..666389be 100644 --- a/persistence/repository/CRUDRepositoryImpl.go +++ b/persistence/repository/CRUDRepositoryImpl.go @@ -1,196 +1,228 @@ package repository import ( + "errors" "fmt" - "net/http" "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/httperrors" - "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/pagination" + "github.com/gertd/go-pluralize" "go.uber.org/zap" + "golang.org/x/exp/maps" "gorm.io/gorm" "gorm.io/gorm/clause" ) -// Return a database error -func DatabaseError(message string, golangError error) httperrors.HTTPError { - return httperrors.NewInternalServerError( - "database error", - message, - golangError, - ) -} +var ( + ErrMoreThanOneObjectFound = errors.New("found more that one object that meet the requested conditions") + ErrObjectNotFound = errors.New("no object exists that meets the requested conditions") +) // Implementation of the Generic CRUD Repository -type CRUDRepositoryImpl[T models.Tabler, ID any] struct { +type CRUDRepositoryImpl[T models.Tabler, ID BadaasID] struct { CRUDRepository[T, ID] - gormDatabase *gorm.DB logger *zap.Logger paginationConfiguration configuration.PaginationConfiguration } // Constructor of the Generic CRUD Repository -func NewCRUDRepository[T models.Tabler, ID any]( - database *gorm.DB, +func NewCRUDRepository[T models.Tabler, ID BadaasID]( logger *zap.Logger, paginationConfiguration configuration.PaginationConfiguration, ) CRUDRepository[T, ID] { return &CRUDRepositoryImpl[T, ID]{ - gormDatabase: database, logger: logger, paginationConfiguration: paginationConfiguration, } } -// Run the function passed as parameter, if it returns the error and rollback the transaction. -// If no error is returned, it commits the transaction and return the interface{} value. -func (repository *CRUDRepositoryImpl[T, ID]) Transaction(transactionFunction func(CRUDRepository[T, ID]) (any, error)) (any, httperrors.HTTPError) { - transaction := repository.gormDatabase.Begin() - defer func() { - if recoveredError := recover(); recoveredError != nil { - transaction.Rollback() - } - }() - returnValue, err := transactionFunction(&CRUDRepositoryImpl[T, ID]{gormDatabase: transaction}) - if err != nil { - transaction.Rollback() - return nil, DatabaseError("transaction failed", err) - } - err = transaction.Commit().Error - if err != nil { - return nil, DatabaseError("transaction failed to commit", err) - } - return returnValue, nil -} - // Create an entity of a Model -func (repository *CRUDRepositoryImpl[T, ID]) Create(entity *T) httperrors.HTTPError { - err := repository.gormDatabase.Create(entity).Error +func (repository *CRUDRepositoryImpl[T, ID]) Create(tx *gorm.DB, entity *T) error { + err := tx.Create(entity).Error if err != nil { - if gormdatabase.IsDuplicateKeyError(err) { - return httperrors.NewHTTPError( - http.StatusConflict, - fmt.Sprintf("%T already exist in database", entity), - "", - nil, false) - } - return DatabaseError( - fmt.Sprintf("could not create %v in %s", entity, (*entity).TableName()), - err, - ) - + return err } + return nil } // Delete an entity of a Model -func (repository *CRUDRepositoryImpl[T, ID]) Delete(entity *T) httperrors.HTTPError { - err := repository.gormDatabase.Delete(entity).Error +func (repository *CRUDRepositoryImpl[T, ID]) Delete(tx *gorm.DB, entity *T) error { + err := tx.Delete(entity).Error if err != nil { - return DatabaseError( - fmt.Sprintf("could not delete %v in %s", entity, (*entity).TableName()), - err, - ) + return err } + return nil } // Save an entity of a Model -func (repository *CRUDRepositoryImpl[T, ID]) Save(entity *T) httperrors.HTTPError { - err := repository.gormDatabase.Save(entity).Error +func (repository *CRUDRepositoryImpl[T, ID]) Save(tx *gorm.DB, entity *T) error { + err := tx.Save(entity).Error if err != nil { - return DatabaseError( - fmt.Sprintf("could not save user %v in %s", entity, (*entity).TableName()), - err, - ) + return err } + return nil } // Get an entity of a Model By ID -func (repository *CRUDRepositoryImpl[T, ID]) GetByID(id ID) (*T, httperrors.HTTPError) { +func (repository *CRUDRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, error) { var entity T - transaction := repository.gormDatabase.First(&entity, "id = ?", id) - if transaction.Error != nil { - return nil, DatabaseError( - fmt.Sprintf("could not get %s by id %v", entity.TableName(), id), - transaction.Error, - ) + err := tx.First(&entity, "id = ?", id).Error + if err != nil { + return nil, err } + return &entity, nil } -// Get all entities of a Model -func (repository *CRUDRepositoryImpl[T, ID]) GetAll(sortOption SortOption) ([]*T, httperrors.HTTPError) { - var entities []*T - transaction := repository.gormDatabase - if sortOption != nil { - transaction = transaction.Order(buildClauseFromSortOption(sortOption)) - } - transaction.Find(&entities) - if transaction.Error != nil { - var emptyInstanceForError T - return nil, DatabaseError( - fmt.Sprintf("could not get %s", emptyInstanceForError.TableName()), - transaction.Error, - ) +func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions map[string]any) (*T, error) { + entity, err := repository.GetOptional(tx, conditions) + if err != nil { + return nil, err } - return entities, nil + + if entity == nil { + return nil, ErrObjectNotFound + } + + return entity, nil } -// Build a gorm order clause from a SortOption -func buildClauseFromSortOption(sortOption SortOption) clause.OrderByColumn { - return clause.OrderByColumn{Column: clause.Column{Name: sortOption.Column()}, Desc: sortOption.Desc()} +func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) { + entities, err := repository.GetMultiple(tx, conditions) + if err != nil { + return nil, err + } + + if len(entities) > 1 { + return nil, ErrMoreThanOneObjectFound + } else if len(entities) == 1 { + return entities[0], nil + } + + return nil, nil } -// Count entities of a models -func (repository *CRUDRepositoryImpl[T, ID]) Count(filters squirrel.Sqlizer) (uint, httperrors.HTTPError) { - whereClause, values, httpError := repository.compileSQL(filters) - if httpError != nil { - return 0, httpError +// Get all entities of a Model +func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) { + thisEntityConditions := map[string]any{} + joinConditions := map[string]map[string]any{} + + // only entities that match the conditions + for attributeName, expectedValue := range conditions { + switch typedExpectedValue := expectedValue.(type) { + case float64, bool, string, nil: + thisEntityConditions[attributeName] = expectedValue + case map[string]any: + joinConditions[attributeName] = typedExpectedValue + default: + return nil, fmt.Errorf("unsupported type") + } } - return repository.count(whereClause, values) + + query := tx.Where(thisEntityConditions) + + var entity T + // only entities that match the conditions + for joinAttributeName, joinConditions := range joinConditions { + err := repository.addJoinToQuery(query, entity.TableName(), joinAttributeName, joinConditions) + if err != nil { + return nil, err + } + } + + // execute query + var entities []*T + err := query.Find(&entities).Error + + return entities, err } -// Count the number of record that match the where clause with the provided values on the db -func (repository *CRUDRepositoryImpl[T, ID]) count(whereClause string, values []interface{}) (uint, httperrors.HTTPError) { - var entity *T - var count int64 - transaction := repository.gormDatabase.Model(entity).Where(whereClause, values).Count(&count) - if transaction.Error != nil { - var emptyInstanceForError T - return 0, DatabaseError( - fmt.Sprintf("could not count data from %s with condition %q", emptyInstanceForError.TableName(), whereClause), - transaction.Error, +func (repository *CRUDRepositoryImpl[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { + return repository.GetMultiple(tx, map[string]any{}) +} + +// Adds a join to the "query" by the "attributeName" that must be relation type +// then, adds the verification that the values for the joined entity are "expectedValues" + +// "expectedValues" is in {"attributeName": expectedValue} format +func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( + query *gorm.DB, previousTable, joinAttributeName string, conditions map[string]any, +) error { + // TODO codigo duplicado + thisEntityConditions := map[string]any{} + joinConditions := map[string]map[string]any{} + + for attributeName, expectedValue := range conditions { + switch typedExpectedValue := expectedValue.(type) { + case float64, bool, string, nil: + thisEntityConditions[attributeName] = expectedValue + case map[string]any: + joinConditions[attributeName] = typedExpectedValue + default: + return fmt.Errorf("unsupported type") + } + } + + pluralize := pluralize.NewClient() + // TODO me gustaria poder no hacer esto, en caso de que hayan difinido otra cosa + tableName := pluralize.Plural(joinAttributeName) + // TODO creo que deberia ser al revez + tableWithSuffix := tableName + "_" + previousTable + stringQuery := fmt.Sprintf( + `JOIN %[1]s %[2]s ON + %[2]s.id = %[3]s.%[4]s_id + AND %[2]s.deleted_at IS NULL + `, + tableName, + tableWithSuffix, + previousTable, + joinAttributeName, + // TODO que pasa si el atributo no existe + // TODO ver que pase si attributeName no existe como tabla + ) + + for _, attributeName := range maps.Keys(thisEntityConditions) { + stringQuery += fmt.Sprintf( + `AND %[1]s.%[2]s = ? + `, + tableWithSuffix, attributeName, ) } - return uint(count), nil + + query.Joins(stringQuery, maps.Values(thisEntityConditions)...) + + // only entities that match the conditions + // TODO codigo duplicado + for joinAttributeName, joinConditions := range joinConditions { + err := repository.addJoinToQuery(query, tableWithSuffix, joinAttributeName, joinConditions) + if err != nil { + return err + } + } + + return nil } // Find entities of a Model func (repository *CRUDRepositoryImpl[T, ID]) Find( + tx *gorm.DB, filters squirrel.Sqlizer, page pagination.Paginator, sortOption SortOption, -) (*pagination.Page[T], httperrors.HTTPError) { - transaction := repository.gormDatabase.Begin() - defer func() { - if recoveredError := recover(); recoveredError != nil { - transaction.Rollback() - - } - }() +) (*pagination.Page[T], error) { var instances []*T - whereClause, values, httpError := repository.compileSQL(filters) - - if httpError != nil { - return nil, httpError + whereClause, values, err := filters.ToSql() + if err != nil { + return nil, err } + if page != nil { - transaction = transaction. + tx = tx. Offset( int((page.Offset() - 1) * page.Limit()), ). @@ -200,41 +232,38 @@ func (repository *CRUDRepositoryImpl[T, ID]) Find( } else { page = pagination.NewPaginator(0, repository.paginationConfiguration.GetMaxElemPerPage()) } + if sortOption != nil { - transaction = transaction.Order(buildClauseFromSortOption(sortOption)) - } - transaction = transaction.Where(whereClause, values...).Find(&instances) - if transaction.Error != nil { - transaction.Rollback() - var emptyInstanceForError T - return nil, DatabaseError( - fmt.Sprintf("could not get data from %s with condition %q", emptyInstanceForError.TableName(), whereClause), - transaction.Error, - ) + tx = tx.Order(buildClauseFromSortOption(sortOption)) } - // Get Count - nbElem, httpError := repository.count(whereClause, values) - if httpError != nil { - transaction.Rollback() - return nil, httpError + + err = tx.Where(whereClause, values...).Find(&instances).Error + if err != nil { + return nil, err } - err := transaction.Commit().Error + + // Get Count + nbElem, err := repository.count(tx, whereClause, values) if err != nil { - return nil, DatabaseError( - "transaction failed to commit", err) + return nil, err } + return pagination.NewPage(instances, page.Offset(), page.Limit(), nbElem), nil } -// compile the sql where clause -func (repository *CRUDRepositoryImpl[T, ID]) compileSQL(filters squirrel.Sqlizer) (string, []interface{}, httperrors.HTTPError) { - compiledSQLString, values, err := filters.ToSql() +// Count the number of record that match the where clause with the provided values on the db +func (repository *CRUDRepositoryImpl[T, ID]) count(tx *gorm.DB, whereClause string, values []interface{}) (uint, error) { + var entity *T + var count int64 + err := tx.Model(entity).Where(whereClause, values).Count(&count).Error if err != nil { - return "", []interface{}{}, httperrors.NewInternalServerError( - "sql error", - fmt.Sprintf("Failed to build the sql request (condition=%v)", filters), - err, - ) + return 0, err } - return compiledSQLString, values, nil + + return uint(count), nil +} + +// Build a gorm order clause from a SortOption +func buildClauseFromSortOption(sortOption SortOption) clause.OrderByColumn { + return clause.OrderByColumn{Column: clause.Column{Name: sortOption.Column()}, Desc: sortOption.Desc()} } diff --git a/persistence/repository/CRUDRepositoryImpl_test.go b/persistence/repository/CRUDRepositoryImpl_test.go deleted file mode 100644 index 1dac5dbd..00000000 --- a/persistence/repository/CRUDRepositoryImpl_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package repository - -import ( - "testing" - - "github.com/Masterminds/squirrel" - mocks "github.com/ditrit/badaas/mocks/configuration" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.uber.org/zap" -) - -func TestDatabaseError(t *testing.T) { - err := DatabaseError("test err", assert.AnError) - require.NotNil(t, err) - assert.True(t, err.Log()) -} - -type dumbModel struct{} - -func (dumbModel) TableName() string { - return "dumb_models" -} - -func TestNewRepository(t *testing.T) { - paginationConfiguration := mocks.NewPaginationConfiguration(t) - dumbModelRepository := NewCRUDRepository[dumbModel, uint](nil, zap.L(), paginationConfiguration) - assert.NotNil(t, dumbModelRepository) -} - -func TestCompileSql_NoError(t *testing.T) { - paginationConfiguration := mocks.NewPaginationConfiguration(t) - dumbModelRepository := &CRUDRepositoryImpl[dumbModel, uint]{ - gormDatabase: nil, - logger: zap.L(), - paginationConfiguration: paginationConfiguration, - } - _, _, err := dumbModelRepository.compileSQL(squirrel.Eq{"name": "qsdqsd"}) - assert.Nil(t, err) -} - -func TestCompileSql_Err(t *testing.T) { - paginationConfiguration := mocks.NewPaginationConfiguration(t) - dumbModelRepository := &CRUDRepositoryImpl[dumbModel, uint]{ - gormDatabase: nil, - logger: zap.L(), - paginationConfiguration: paginationConfiguration, - } - _, _, err := dumbModelRepository.compileSQL(squirrel.GtOrEq{"name": nil}) - - assert.Error(t, err) -} diff --git a/services/crud.go b/services/crud.go index 962477ff..b0df1f94 100644 --- a/services/crud.go +++ b/services/crud.go @@ -1,18 +1,15 @@ package services import ( - "fmt" - "github.com/ditrit/badaas/persistence/models" - pluralize "github.com/gertd/go-pluralize" + "github.com/ditrit/badaas/persistence/repository" "github.com/google/uuid" "github.com/mitchellh/mapstructure" "go.uber.org/zap" - "golang.org/x/exp/maps" "gorm.io/gorm" ) -type CRUDService[T models.Tabler, ID any] interface { +type CRUDService[T models.Tabler, ID repository.BadaasID] interface { GetEntity(id ID) (*T, error) GetEntities(conditions map[string]any) ([]*T, error) CreateEntity(attributeValues map[string]any) (*T, error) @@ -24,32 +21,28 @@ type CRUDService[T models.Tabler, ID any] interface { var _ CRUDService[models.User, uuid.UUID] = (*crudServiceImpl[models.User, uuid.UUID])(nil) // Implementation of the Generic CRUD Repository -type crudServiceImpl[T models.Tabler, ID any] struct { +type crudServiceImpl[T models.Tabler, ID repository.BadaasID] struct { CRUDService[T, ID] - logger *zap.Logger - db *gorm.DB + logger *zap.Logger + db *gorm.DB + repository repository.CRUDRepository[T, ID] } -func NewCRUDService[T models.Tabler]( +func NewCRUDService[T models.Tabler, ID repository.BadaasID]( logger *zap.Logger, db *gorm.DB, -) CRUDService[T, uuid.UUID] { // TODO ver este UUID hardcodeado aca - return &crudServiceImpl[T, uuid.UUID]{ - logger: logger, - db: db, + repository repository.CRUDRepository[T, ID], +) CRUDService[T, ID] { + return &crudServiceImpl[T, ID]{ + logger: logger, + db: db, + repository: repository, } } -// TODO todo el codigo duplicado con CRUD repository // Get the Entity of type with name "entityTypeName" that has the "id" -func (service *crudServiceImpl[T, ID]) GetEntity(id uuid.UUID) (*T, error) { - var entity T - err := service.db.First(&entity, "id = ?", id).Error - if err != nil { - return nil, err - } - - return &entity, nil +func (service *crudServiceImpl[T, ID]) GetEntity(id ID) (*T, error) { + return service.repository.GetByID(service.db, id) } // Get entities of type with name "entityTypeName" that match all "conditions" @@ -59,97 +52,7 @@ func (service *crudServiceImpl[T, ID]) GetEntity(id uuid.UUID) (*T, error) { // // {"relationAttributeName": {"attributeName": expectedValue}} func (service *crudServiceImpl[T, ID]) GetEntities(conditions map[string]any) ([]*T, error) { - thisEntityConditions := map[string]any{} - joinConditions := map[string]map[string]any{} - - // only entities that match the conditions - for attributeName, expectedValue := range conditions { - switch typedExpectedValue := expectedValue.(type) { - case float64, bool, string, nil: - thisEntityConditions[attributeName] = expectedValue - case map[string]any: - joinConditions[attributeName] = typedExpectedValue - default: - return nil, fmt.Errorf("unsupported type") - } - } - - query := service.db.Where(thisEntityConditions) - - var entity T - // only entities that match the conditions - for joinAttributeName, joinConditions := range joinConditions { - // TODO +s no necesariamente, hay plurales que cambian - err := service.addJoinToQuery(query, entity.TableName(), joinAttributeName, joinConditions) - if err != nil { - return nil, err - } - } - - // execute query - var entities []*T - err := query.Find(&entities).Error - - return entities, err -} - -// Adds a join to the "query" by the "attributeName" that must be relation type -// then, adds the verification that the values for the joined entity are "expectedValues" - -// "expectedValues" is in {"attributeName": expectedValue} format -func (service *crudServiceImpl[T, ID]) addJoinToQuery( - query *gorm.DB, previousTable, joinAttributeName string, conditions map[string]any, -) error { - // TODO codigo duplicado - thisEntityConditions := map[string]any{} - joinConditions := map[string]map[string]any{} - - for attributeName, expectedValue := range conditions { - switch typedExpectedValue := expectedValue.(type) { - case float64, bool, string, nil: - thisEntityConditions[attributeName] = expectedValue - case map[string]any: - joinConditions[attributeName] = typedExpectedValue - default: - return fmt.Errorf("unsupported type") - } - } - - pluralize := pluralize.NewClient() - tableName := pluralize.Plural(joinAttributeName) - tableWithSuffix := tableName + "_" + previousTable - stringQuery := fmt.Sprintf( - `JOIN %[1]s %[2]s ON - %[2]s.id = %[3]s.%[4]s_id - AND %[2]s.deleted_at IS NULL - `, - tableName, - tableWithSuffix, - previousTable, - joinAttributeName, - // TODO ver que pase si attributeName no existe como tabla - ) - - for _, attributeName := range maps.Keys(thisEntityConditions) { - stringQuery += fmt.Sprintf( - `AND %[1]s.%[2]s = ? - `, - tableWithSuffix, attributeName, - ) - } - - query.Joins(stringQuery, maps.Values(thisEntityConditions)...) - - // only entities that match the conditions - // TODO codigo duplicado - for joinAttributeName, joinConditions := range joinConditions { - err := service.addJoinToQuery(query, tableWithSuffix, joinAttributeName, joinConditions) - if err != nil { - return err - } - } - - return nil + return service.repository.GetMultiple(service.db, conditions) } // Creates a Entity of type "entityType" and its Values from the information provided in "attributeValues" @@ -166,7 +69,7 @@ func (service *crudServiceImpl[T, ID]) CreateEntity(attributeValues map[string]a return nil, err // TODO ver que errores puede haber aca } - err = service.db.Create(&entity).Error + err = service.repository.Create(service.db, &entity) if err != nil { return nil, err } @@ -185,11 +88,13 @@ func (service *crudServiceImpl[T, ID]) CreateEntity(attributeValues map[string]a // entries in "newValues" that do not correspond to any attribute of the EntityType are ignored // // "newValues" are in {"attributeName": newValue} format -func (service *crudServiceImpl[T, ID]) UpdateEntity(entityID uuid.UUID, newValues map[string]any) (*T, error) { +func (service *crudServiceImpl[T, ID]) UpdateEntity(entityID ID, newValues map[string]any) (*T, error) { + // TODO return nil, nil } // Deletes Entity with type "entityTypeName" and id "entityID" and its values -func (service *crudServiceImpl[T, ID]) DeleteEntity(entityID uuid.UUID) error { +func (service *crudServiceImpl[T, ID]) DeleteEntity(entityID ID) error { + // TODO return nil } diff --git a/services/sessionservice/session.go b/services/sessionservice/session.go index 9c41818f..f3a13307 100644 --- a/services/sessionservice/session.go +++ b/services/sessionservice/session.go @@ -2,17 +2,16 @@ package sessionservice import ( "fmt" - "net/http" "sync" "time" - "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/google/uuid" "go.uber.org/zap" + "gorm.io/gorm" ) // Errors @@ -26,9 +25,10 @@ var ( // SessionService handle sessions type SessionService interface { IsValid(sessionUUID uuid.UUID) (bool, *SessionClaims) + // TODO services should not work with httperrors RollSession(uuid.UUID) httperrors.HTTPError - LogUserIn(user *models.User, response http.ResponseWriter) httperrors.HTTPError - LogUserOut(sessionClaims *SessionClaims, response http.ResponseWriter) httperrors.HTTPError + LogUserIn(user *models.User) (*models.Session, error) + LogUserOut(sessionClaims *SessionClaims) httperrors.HTTPError } // Check interface compliance @@ -41,6 +41,7 @@ type sessionServiceImpl struct { mutex sync.Mutex logger *zap.Logger sessionConfiguration configuration.SessionConfiguration + db *gorm.DB } // The SessionService constructor @@ -48,25 +49,19 @@ func NewSessionService( logger *zap.Logger, sessionRepository repository.CRUDRepository[models.Session, uuid.UUID], sessionConfiguration configuration.SessionConfiguration, + db *gorm.DB, ) SessionService { sessionService := &sessionServiceImpl{ cache: make(map[uuid.UUID]*models.Session), logger: logger, sessionRepository: sessionRepository, sessionConfiguration: sessionConfiguration, + db: db, } sessionService.init() return sessionService } -// Create a new session -func newSession(userID uuid.UUID, sessionDuration time.Duration) *models.Session { - return &models.Session{ - UserID: userID, - ExpiresAt: time.Now().Add(sessionDuration), - } -} - // Return true if the session exists and is still valid. // A instance of SessionClaims is returned to be added to the request context if the conditions previously mentioned are met. func (sessionService *sessionServiceImpl) IsValid(sessionUUID uuid.UUID) (bool, *SessionClaims) { @@ -82,30 +77,36 @@ func (sessionService *sessionServiceImpl) IsValid(sessionUUID uuid.UUID) (bool, func (sessionService *sessionServiceImpl) get(sessionUUID uuid.UUID) *models.Session { sessionService.mutex.Lock() defer sessionService.mutex.Unlock() + session, ok := sessionService.cache[sessionUUID] if ok { return session } - sessionsFoundWithUUID, databaseError := sessionService.sessionRepository.Find(squirrel.Eq{"uuid": sessionUUID.String()}, nil, nil) - if databaseError != nil { + + session, err := sessionService.sessionRepository.GetOptional( + sessionService.db, + map[string]any{"uuid": sessionUUID.String()}, + ) + if err != nil { return nil } - if !sessionsFoundWithUUID.HasContent { - return nil // no sessions found in database - } - return sessionsFoundWithUUID.Ressources[0] + + return session } // Add a session to the cache -func (sessionService *sessionServiceImpl) add(session *models.Session) httperrors.HTTPError { +func (sessionService *sessionServiceImpl) add(session *models.Session) error { sessionService.mutex.Lock() defer sessionService.mutex.Unlock() - herr := sessionService.sessionRepository.Create(session) - if herr != nil { - return herr + + err := sessionService.sessionRepository.Create(sessionService.db, session) + if err != nil { + return err } + sessionService.cache[session.ID] = session sessionService.logger.Debug("Added session", zap.String("uuid", session.ID.String())) + return nil } @@ -127,10 +128,12 @@ func (sessionService *sessionServiceImpl) init() { func (sessionService *sessionServiceImpl) pullFromDB() { sessionService.mutex.Lock() defer sessionService.mutex.Unlock() - sessionsFromDatabase, err := sessionService.sessionRepository.GetAll(nil) + + sessionsFromDatabase, err := sessionService.sessionRepository.GetAll(sessionService.db) if err != nil { panic(err) } + newSessionCache := make(map[uuid.UUID]*models.Session) for _, sessionFromDatabase := range sessionsFromDatabase { newSessionCache[sessionFromDatabase.ID] = sessionFromDatabase @@ -146,11 +149,12 @@ func (sessionService *sessionServiceImpl) pullFromDB() { func (sessionService *sessionServiceImpl) removeExpired() { sessionService.mutex.Lock() defer sessionService.mutex.Unlock() + var i int for sessionUUID, session := range sessionService.cache { if session.IsExpired() { // Delete the session in the database - err := sessionService.sessionRepository.Delete(session) + err := sessionService.sessionRepository.Delete(sessionService.db, session) if err != nil { panic(err) } @@ -171,8 +175,9 @@ func (sessionService *sessionServiceImpl) removeExpired() { func (sessionService *sessionServiceImpl) delete(session *models.Session) httperrors.HTTPError { sessionService.mutex.Lock() defer sessionService.mutex.Unlock() + sessionUUID := session.ID - err := sessionService.sessionRepository.Delete(session) + err := sessionService.sessionRepository.Delete(sessionService.db, session) if err != nil { return httperrors.NewInternalServerError( "session error", @@ -193,64 +198,51 @@ func (sessionService *sessionServiceImpl) RollSession(sessionUUID uuid.UUID) htt // no session to roll, no error return nil } + if session.IsExpired() { return HERRSessionExpired } + if session.CanBeRolled(rollInterval) { sessionService.mutex.Lock() defer sessionService.mutex.Unlock() + session.ExpiresAt = session.ExpiresAt.Add(sessionDuration) - herr := sessionService.sessionRepository.Save(session) - if herr != nil { - return herr + err := sessionService.sessionRepository.Save(sessionService.db, session) + if err != nil { + return httperrors.NewDBError(err) } + sessionService.logger.Warn("Rolled session", zap.String("userID", session.UserID.String()), zap.String("sessionID", session.ID.String())) } + return nil } // Log in a user -func (sessionService *sessionServiceImpl) LogUserIn(user *models.User, response http.ResponseWriter) httperrors.HTTPError { +func (sessionService *sessionServiceImpl) LogUserIn(user *models.User) (*models.Session, error) { sessionDuration := sessionService.sessionConfiguration.GetSessionDuration() - session := newSession(user.ID, sessionDuration) + session := models.NewSession(user.ID, sessionDuration) err := sessionService.add(session) if err != nil { - return err + return nil, err } - CreateAndSetAccessTokenCookie(response, session.ID.String()) - return nil + return session, nil } // Log out a user. -func (sessionService *sessionServiceImpl) LogUserOut(sessionClaims *SessionClaims, response http.ResponseWriter) httperrors.HTTPError { +func (sessionService *sessionServiceImpl) LogUserOut(sessionClaims *SessionClaims) httperrors.HTTPError { session := sessionService.get(sessionClaims.SessionUUID) if session == nil { return httperrors.NewUnauthorizedError("Authentication Error", "not authenticated") } + err := sessionService.delete(session) if err != nil { return err } - CreateAndSetAccessTokenCookie(response, "") - return nil -} -// Create an access token and send it in a cookie -func CreateAndSetAccessTokenCookie(w http.ResponseWriter, sessionUUID string) { - accessToken := &http.Cookie{ - Name: "access_token", - Path: "/", - Value: sessionUUID, - HttpOnly: true, - SameSite: http.SameSiteNoneMode, // TODO change to http.SameSiteStrictMode in prod - Secure: false, // TODO change to true in prod - Expires: time.Now().Add(48 * time.Hour), - } - err := accessToken.Valid() - if err != nil { - panic(err) - } - http.SetCookie(w, accessToken) + return nil } diff --git a/services/sessionservice/session_test.go b/services/sessionservice/session_test.go index 422b831f..1c34bd04 100644 --- a/services/sessionservice/session_test.go +++ b/services/sessionservice/session_test.go @@ -1,16 +1,14 @@ package sessionservice import ( - "net/http/httptest" + "errors" "testing" "time" - "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/httperrors" - configurationmocks "github.com/ditrit/badaas/mocks/configuration" - repositorymocks "github.com/ditrit/badaas/mocks/persistence/repository" + configurationMocks "github.com/ditrit/badaas/mocks/configuration" + repositoryMocks "github.com/ditrit/badaas/mocks/persistence/repository" "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/pagination" "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -18,66 +16,72 @@ import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" + "gorm.io/gorm" ) -func TestNewSession(t *testing.T) { - sessionInstance := newSession(uuid.Nil, time.Second) - assert.NotNil(t, sessionInstance) - assert.Equal(t, uuid.Nil, sessionInstance.UserID) -} - -func TestLogInUser(t *testing.T) { - sessionRepositoryMock, service, logs, sessionConfigurationMock := setupTest(t) - sessionRepositoryMock.On("Create", mock.Anything).Return(nil) - sessionConfigurationMock.On("GetSessionDuration").Return(time.Minute) - response := httptest.NewRecorder() - user := &models.User{ - Username: "bob", - Email: "bob@email.com", - } - err := service.LogUserIn(user, response) - require.NoError(t, err) - assert.Len(t, service.cache, 1) - assert.Equal(t, 1, logs.Len()) - log := logs.All()[0] - assert.Equal(t, "Added session", log.Message) - require.Len(t, log.Context, 1) -} +var gormDB *gorm.DB // make values for test func setupTest( t *testing.T, ) ( - *repositorymocks.CRUDRepository[models.Session, uuid.UUID], + *repositoryMocks.CRUDRepository[models.Session, uuid.UUID], *sessionServiceImpl, *observer.ObservedLogs, - *configurationmocks.SessionConfiguration, + *configurationMocks.SessionConfiguration, ) { core, logs := observer.New(zap.DebugLevel) logger := zap.New(core) - sessionRepositoryMock := repositorymocks.NewCRUDRepository[models.Session, uuid.UUID](t) - sessionConfiguration := configurationmocks.NewSessionConfiguration(t) + sessionRepositoryMock := repositoryMocks.NewCRUDRepository[models.Session, uuid.UUID](t) + sessionConfiguration := configurationMocks.NewSessionConfiguration(t) service := &sessionServiceImpl{ sessionRepository: sessionRepositoryMock, logger: logger, cache: make(map[uuid.UUID]*models.Session), sessionConfiguration: sessionConfiguration, + db: gormDB, } return sessionRepositoryMock, service, logs, sessionConfiguration } +func TestNewSession(t *testing.T) { + sessionInstance := models.NewSession(uuid.Nil, time.Second) + assert.NotNil(t, sessionInstance) + assert.Equal(t, uuid.Nil, sessionInstance.UserID) +} + +func TestLogInUser(t *testing.T) { + sessionRepositoryMock, service, logs, sessionConfigurationMock := setupTest(t) + sessionRepositoryMock.On("Create", gormDB, mock.Anything).Return(nil) + + sessionConfigurationMock.On("GetSessionDuration").Return(time.Minute) + user := &models.User{ + Username: "bob", + Email: "bob@email.com", + } + _, err := service.LogUserIn(user) + require.NoError(t, err) + assert.Len(t, service.cache, 1) + assert.Equal(t, 1, logs.Len()) + log := logs.All()[0] + assert.Equal(t, "Added session", log.Message) + require.Len(t, log.Context, 1) +} + func TestLogInUserDbError(t *testing.T) { sessionRepositoryMock, service, logs, sessionConfigurationMock := setupTest(t) - sessionRepositoryMock.On("Create", mock.Anything).Return(httperrors.NewInternalServerError("db err", "nil", nil)) + sessionRepositoryMock. + On("Create", gormDB, mock.Anything). + Return(errors.New("db err")) + sessionConfigurationMock.On("GetSessionDuration").Return(time.Minute) - response := httptest.NewRecorder() user := &models.User{ Username: "bob", Email: "bob@email.com", } - err := service.LogUserIn(user, response) + _, err := service.LogUserIn(user) require.Error(t, err) assert.Len(t, service.cache, 0) assert.Equal(t, 0, logs.Len()) @@ -85,7 +89,7 @@ func TestLogInUserDbError(t *testing.T) { func TestIsValid(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) - sessionRepositoryMock.On("Create", mock.Anything).Return(nil) + sessionRepositoryMock.On("Create", gormDB, mock.Anything).Return(nil) uuidSample := uuid.New() session := &models.Session{ BaseModel: models.BaseModel{ @@ -109,18 +113,16 @@ func TestIsValid(t *testing.T) { func TestIsValid_SessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) sessionRepositoryMock. - On("Find", mock.Anything, mock.Anything, mock.Anything). - Return(pagination.NewPage([]*models.Session{}, 0, 125, 1236), nil) + On("GetOptional", gormDB, mock.Anything). + Return(nil, nil) uuidSample := uuid.New() isValid, _ := service.IsValid(uuidSample) require.False(t, isValid) - // } func TestLogOutUser(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) - sessionRepositoryMock.On("Delete", mock.Anything).Return(nil) - response := httptest.NewRecorder() + sessionRepositoryMock.On("Delete", gormDB, mock.Anything).Return(nil) uuidSample := uuid.New() session := &models.Session{ BaseModel: models.BaseModel{ @@ -130,15 +132,17 @@ func TestLogOutUser(t *testing.T) { ExpiresAt: time.Now().Add(time.Hour), } service.cache[uuidSample] = session - err := service.LogUserOut(makeSessionClaims(session), response) + err := service.LogUserOut(makeSessionClaims(session)) require.NoError(t, err) assert.Len(t, service.cache, 0) } func TestLogOutUserDbError(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) - sessionRepositoryMock.On("Delete", mock.Anything).Return(httperrors.NewInternalServerError("db errors", "oh we failed to delete the session", nil)) - response := httptest.NewRecorder() + sessionRepositoryMock. + On("Delete", gormDB, mock.Anything). + Return(errors.New("db errors")) + uuidSample := uuid.New() session := &models.Session{ BaseModel: models.BaseModel{ @@ -148,7 +152,7 @@ func TestLogOutUserDbError(t *testing.T) { ExpiresAt: time.Now().Add(time.Hour), } service.cache[uuidSample] = session - err := service.LogUserOut(makeSessionClaims(session), response) + err := service.LogUserOut(makeSessionClaims(session)) require.Error(t, err) assert.Len(t, service.cache, 1) } @@ -156,9 +160,9 @@ func TestLogOutUserDbError(t *testing.T) { func TestLogOutUser_SessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) sessionRepositoryMock. - On("Find", mock.Anything, nil, nil). - Return(nil, httperrors.NewInternalServerError("db errors", "oh we failed to delete the session", nil)) - response := httptest.NewRecorder() + On("GetOptional", gormDB, mock.Anything). + Return(nil, errors.New("db errors")) + uuidSample := uuid.New() session := &models.Session{ BaseModel: models.BaseModel{ @@ -170,14 +174,14 @@ func TestLogOutUser_SessionNotFound(t *testing.T) { service.cache[uuidSample] = session sessionClaims := makeSessionClaims(session) sessionClaims.SessionUUID = uuid.Nil - err := service.LogUserOut(sessionClaims, response) + err := service.LogUserOut(sessionClaims) require.Error(t, err) assert.Len(t, service.cache, 1) } func TestRollSession(t *testing.T) { sessionRepositoryMock, service, _, sessionConfigurationMock := setupTest(t) - sessionRepositoryMock.On("Save", mock.Anything).Return(nil) + sessionRepositoryMock.On("Save", gormDB, mock.Anything).Return(nil) sessionDuration := time.Minute sessionConfigurationMock.On("GetSessionDuration").Return(sessionDuration) sessionConfigurationMock.On("GetRollDuration").Return(sessionDuration / 4) @@ -231,7 +235,11 @@ func TestRollSession_falseUUID(t *testing.T) { ExpiresAt: originalExpirationTime, } service.cache[uuidSample] = session - repoSession.On("Find", mock.Anything, nil, nil).Return(pagination.NewPage([]*models.Session{}, 0, 2, 5), nil) + + repoSession. + On("GetOptional", gormDB, mock.Anything). + Return(nil, nil) + err := service.RollSession(uuid.New()) require.NoError(t, err) } @@ -239,9 +247,8 @@ func TestRollSession_falseUUID(t *testing.T) { func TestRollSession_sessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, sessionConfigurationMock := setupTest(t) sessionRepositoryMock. - On("Find", squirrel.Eq{"uuid": "00000000-0000-0000-0000-000000000000"}, nil, nil). - Return( - pagination.NewPage([]*models.Session{}, 0, 10, 0), nil) + On("GetOptional", gormDB, map[string]any{"uuid": "00000000-0000-0000-0000-000000000000"}). + Return(nil, nil) sessionDuration := time.Minute sessionConfigurationMock.On("GetSessionDuration").Return(sessionDuration) @@ -260,7 +267,7 @@ func Test_pullFromDB(t *testing.T) { UserID: uuid.Nil, ExpiresAt: time.Now().Add(time.Hour), } - sessionRepositoryMock.On("GetAll", nil).Return([]*models.Session{session}, nil) + sessionRepositoryMock.On("GetAll", gormDB).Return([]*models.Session{session}, nil) service.pullFromDB() assert.Len(t, service.cache, 1) @@ -274,7 +281,7 @@ func Test_pullFromDB(t *testing.T) { func Test_pullFromDB_repoError(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) - sessionRepositoryMock.On("GetAll", nil).Return(nil, httperrors.AnError) + sessionRepositoryMock.On("GetAll", gormDB).Return(nil, httperrors.AnError) assert.PanicsWithError(t, httperrors.AnError.Error(), func() { service.pullFromDB() }) } @@ -289,7 +296,7 @@ func Test_removeExpired(t *testing.T) { ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. - On("Delete", session). + On("Delete", gormDB, session). Return(nil) service.cache[uuidSample] = session @@ -314,7 +321,7 @@ func Test_removeExpired_RepositoryError(t *testing.T) { ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. - On("Delete", session). + On("Delete", gormDB, session). Return(httperrors.AnError) service.cache[uuidSample] = session @@ -332,8 +339,8 @@ func Test_get(t *testing.T) { ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. - On("Find", mock.Anything, nil, nil). - Return(pagination.NewPage([]*models.Session{session}, 0, 12, 13), nil) + On("GetOptional", gormDB, mock.Anything). + Return(session, nil) sessionFound := service.get(uuidSample) assert.Equal(t, sessionFound, session) diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index 3f3da399..4b8a2ed0 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -1,10 +1,9 @@ package userservice import ( + "errors" "fmt" - "github.com/Masterminds/squirrel" - "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" "github.com/ditrit/badaas/persistence/repository" @@ -12,14 +11,19 @@ import ( validator "github.com/ditrit/badaas/validators" "github.com/google/uuid" "go.uber.org/zap" + "gorm.io/gorm" ) // UserService provide functions related to Users type UserService interface { NewUser(username, email, password string) (*models.User, error) - GetUser(dto.UserLoginDTO) (*models.User, httperrors.HTTPError) + GetUser(dto.UserLoginDTO) (*models.User, error) } +var ( + ErrWrongPassword = errors.New("password is incorrect") +) + // Check interface compliance var _ UserService = (*userServiceImpl)(nil) @@ -27,16 +31,19 @@ var _ UserService = (*userServiceImpl)(nil) type userServiceImpl struct { userRepository repository.CRUDRepository[models.User, uuid.UUID] logger *zap.Logger + db *gorm.DB } // UserService constructor func NewUserService( logger *zap.Logger, userRepository repository.CRUDRepository[models.User, uuid.UUID], + db *gorm.DB, ) UserService { return &userServiceImpl{ logger: logger, userRepository: userRepository, + db: db, } } @@ -46,37 +53,40 @@ func (userService *userServiceImpl) NewUser(username, email, password string) (* if err != nil { return nil, fmt.Errorf("the provided email is not valid") } + u := &models.User{ Username: username, Email: sanitizedEmail, Password: basicauth.SaltAndHashPassword(password), } - httpError := userService.userRepository.Create(u) - if httpError != nil { - return nil, httpError + err = userService.userRepository.Create(userService.db, u) + if err != nil { + return nil, err } - userService.logger.Info("Successfully created a new user", - zap.String("email", sanitizedEmail), zap.String("username", username)) + + userService.logger.Info( + "Successfully created a new user", + zap.String("email", sanitizedEmail), + zap.String("username", username), + ) return u, nil } // Get user if the email and password provided are correct, return an error if not. -func (userService *userServiceImpl) GetUser(userLoginDTO dto.UserLoginDTO) (*models.User, httperrors.HTTPError) { - users, herr := userService.userRepository.Find(squirrel.Eq{"email": userLoginDTO.Email}, nil, nil) - if herr != nil { - return nil, herr - } - if !users.HasContent { - return nil, httperrors.NewErrorNotFound("user", - fmt.Sprintf("no user found with email %q", userLoginDTO.Email)) +func (userService *userServiceImpl) GetUser(userLoginDTO dto.UserLoginDTO) (*models.User, error) { + user, err := userService.userRepository.Get( + userService.db, + map[string]any{"email": userLoginDTO.Email}, + ) + if err != nil { + return nil, err } - user := users.Ressources[0] - // Check password if !basicauth.CheckUserPassword(user.Password, userLoginDTO.Password) { - return nil, httperrors.NewUnauthorizedError("wrong password", "the provided password is incorrect") + return nil, ErrWrongPassword } + return user, nil } diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index df435ed8..2bbf0e7e 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -1,13 +1,13 @@ package userservice_test import ( + "errors" "testing" - "github.com/ditrit/badaas/httperrors" - repositorymocks "github.com/ditrit/badaas/mocks/persistence/repository" + repositoryMocks "github.com/ditrit/badaas/mocks/persistence/repository" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" - "github.com/ditrit/badaas/persistence/pagination" + "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/userservice" "github.com/google/uuid" "github.com/stretchr/testify/assert" @@ -16,16 +16,20 @@ import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" + "gorm.io/gorm" ) +var gormDB *gorm.DB + func TestNewUserService(t *testing.T) { // creating logger observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRespositoryMock := repositorymocks.NewCRUDRepository[models.User, uuid.UUID](t) - userRespositoryMock.On("Create", mock.Anything).Return(nil) - userService := userservice.NewUserService(observedLogger, userRespositoryMock) + userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock.On("Create", gormDB, mock.Anything).Return(nil) + + userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) user, err := userService.NewUser("bob", "bob@email.com", "1234") assert.NoError(t, err) assert.NotNil(t, user) @@ -49,13 +53,13 @@ func TestNewUserServiceDatabaseError(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRespositoryMock := repositorymocks.NewCRUDRepository[models.User, uuid.UUID](t) - userRespositoryMock.On( - "Create", mock.Anything, + userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock.On( + "Create", gormDB, mock.Anything, ).Return( - httperrors.NewInternalServerError("database error", "test error", nil), + errors.New("database error"), ) - userService := userservice.NewUserService(observedLogger, userRespositoryMock) + userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) user, err := userService.NewUser("bob", "bob@email.com", "1234") assert.Error(t, err) assert.Nil(t, user) @@ -69,9 +73,9 @@ func TestNewUserServiceEmailNotValid(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRespositoryMock := repositorymocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) - userService := userservice.NewUserService(observedLogger, userRespositoryMock) + userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) user, err := userService.NewUser("bob", "bob@", "1234") assert.Error(t, err) assert.Nil(t, user) @@ -85,20 +89,19 @@ func TestGetUser(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRespositoryMock := repositorymocks.NewCRUDRepository[models.User, uuid.UUID](t) - userService := userservice.NewUserService(observedLogger, userRespositoryMock) - userRespositoryMock.On( - "Create", mock.Anything, - ).Return( - nil, - ) + userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) + userRepositoryMock.On( + "Create", gormDB, mock.Anything, + ).Return(nil) + user, err := userService.NewUser("bob", "bob@email.com", "1234") require.NoError(t, err) - userRespositoryMock.On( - "Find", mock.Anything, nil, nil, + userRepositoryMock.On( + "Get", gormDB, map[string]any{"email": "bob@email.com"}, ).Return( - pagination.NewPage([]*models.User{user}, 1, 10, 50), + user, nil, ) @@ -121,13 +124,13 @@ func TestGetUserNoUserFound(t *testing.T) { observedZapCore, _ := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRespositoryMock := repositorymocks.NewCRUDRepository[models.User, uuid.UUID](t) - userService := userservice.NewUserService(observedLogger, userRespositoryMock) - userRespositoryMock.On( - "Find", mock.Anything, nil, nil, + userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) + userRepositoryMock.On( + "Get", gormDB, map[string]any{"email": "bobnotfound@email.com"}, ).Return( nil, - httperrors.NewErrorNotFound("user", "user with email bobnotfound@email.com"), + repository.ErrObjectNotFound, ) userFound, err := userService.GetUser(dto.UserLoginDTO{Email: "bobnotfound@email.com", Password: "1234"}) @@ -136,53 +139,24 @@ func TestGetUserNoUserFound(t *testing.T) { } // Check what happen if the pass word is not correct -func TestGetUserNotCorrect(t *testing.T) { +func TestGetUserWrongPassword(t *testing.T) { // creating logger observedZapCore, _ := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRespositoryMock := repositorymocks.NewCRUDRepository[models.User, uuid.UUID](t) - userRespositoryMock.On( - "Create", mock.Anything, - ).Return( - nil, - ) - userService := userservice.NewUserService(observedLogger, userRespositoryMock) - user, err := userService.NewUser("bob", "bob@email.com", "1234") + userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock.On( + "Create", gormDB, mock.Anything, + ).Return(nil) - require.NoError(t, err) - userRespositoryMock.On( - "Find", mock.Anything, nil, nil, - ).Return( - pagination.NewPage([]*models.User{user}, 1, 10, 50), - nil, - ) - - userFound, err := userService.GetUser(dto.UserLoginDTO{Email: "bob@email.com", Password: " Date: Thu, 11 May 2023 14:37:38 +0200 Subject: [PATCH 144/467] let user define models --- badaas.go | 2 - controllers/ModuleFx.go | 29 +++++-- persistence/ModuleFx.go | 14 ---- persistence/gormdatabase/db.go | 28 ++----- persistence/models/Product.go | 55 ------------- persistence/models/ProductInfo.go | 7 -- persistence/models/Tabler.go | 14 ---- router/ModuleFx.go | 1 - services/ModuleFx.go | 61 +++++++++++++- test_integration/crudservice.go | 118 ++++++++++++++++++++------- test_integration/integration_test.go | 10 ++- test_integration/setup.go | 10 +-- 12 files changed, 189 insertions(+), 160 deletions(-) delete mode 100644 persistence/models/Product.go delete mode 100644 persistence/models/ProductInfo.go diff --git a/badaas.go b/badaas.go index 7b74b751..d3287f97 100644 --- a/badaas.go +++ b/badaas.go @@ -5,7 +5,6 @@ import ( "github.com/ditrit/badaas/logger" "github.com/ditrit/badaas/persistence" "github.com/ditrit/badaas/router" - "github.com/ditrit/badaas/services" "github.com/ditrit/verdeter" "github.com/ditrit/verdeter/validators" "go.uber.org/fx" @@ -17,7 +16,6 @@ var BadaasModule = fx.Module( router.RouterModule, logger.LoggerModule, persistence.PersistanceModule, - services.ServicesModule, ) func ConfigCommandParameters(command *verdeter.VerdeterCommand) error { diff --git a/controllers/ModuleFx.go b/controllers/ModuleFx.go index ca697abc..caccf2c3 100644 --- a/controllers/ModuleFx.go +++ b/controllers/ModuleFx.go @@ -4,32 +4,46 @@ import ( "fmt" "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/repository" + "github.com/ditrit/badaas/router/middlewares" "github.com/ditrit/badaas/services" - "github.com/google/uuid" "go.uber.org/fx" ) var InfoControllerModule = fx.Module( "infoController", + // controller fx.Provide(NewInfoController), + // routes fx.Invoke(AddInfoRoutes), ) var AuthControllerModule = fx.Module( "authController", + // service + services.AuthServiceModule, + + // controller fx.Provide(NewBasicAuthenticationController), + + // routes + fx.Provide(middlewares.NewAuthenticationMiddleware), fx.Invoke(AddAuthRoutes), ) var EAVControllerModule = fx.Module( "eavController", + // service + services.EAVServiceModule, + + // controller fx.Provide( fx.Annotate( NewEAVController, fx.ResultTags(`name:"eavController"`), ), ), + + // routes fx.Invoke( fx.Annotate( AddEAVCRUDRoutes, @@ -40,15 +54,18 @@ var EAVControllerModule = fx.Module( var CRUDControllerModule = fx.Module( "crudController", + // TODO cambiar el nombre de esto fx.Provide(NewGeneralCRUDController), fx.Invoke(AddCRUDRoutes), ) -func GetCRUDModule[T models.Tabler]() fx.Option { +func GetCRUDControllerModule[T models.Tabler]() fx.Option { return fx.Module( - "crudModule", - fx.Provide(repository.NewCRUDRepository[T, uuid.UUID]), - fx.Provide(services.NewCRUDService[T, uuid.UUID]), + "crudControllerModule", + // service + services.GetCRUDServiceModule[T](), + + // controller fx.Provide( fx.Annotate( NewCRUDController[T], diff --git a/persistence/ModuleFx.go b/persistence/ModuleFx.go index 4496fe2d..c51c53e6 100644 --- a/persistence/ModuleFx.go +++ b/persistence/ModuleFx.go @@ -1,11 +1,7 @@ package persistence import ( - "github.com/google/uuid" - "github.com/ditrit/badaas/persistence/gormdatabase" - "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/repository" "go.uber.org/fx" ) @@ -14,18 +10,8 @@ import ( // Provides: // // - The database connection -// -// - The repositories var PersistanceModule = fx.Module( "persistence", // Database connection fx.Provide(gormdatabase.SetupDatabaseConnection), - - // repositories - fx.Provide(repository.NewCRUDRepository[models.Session, uuid.UUID]), - fx.Provide(repository.NewCRUDRepository[models.User, uuid.UUID]), - - fx.Provide(repository.NewValueRepository), - fx.Provide(repository.NewEntityRepository), - fx.Provide(repository.NewEntityTypeRepository), ) diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index c342a065..1a43b086 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -6,12 +6,13 @@ import ( "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/persistence/gormdatabase/gormzap" - "github.com/ditrit/badaas/persistence/models" "go.uber.org/zap" "gorm.io/driver/postgres" "gorm.io/gorm" ) +var ListOfTables = []any{} + // Create the dsn string from the configuration func createDsnFromConf(databaseConfiguration configuration.DatabaseConfiguration) string { dsn := createDsn( @@ -33,13 +34,16 @@ func createDsn(host, username, password, sslmode, dbname string, port int) strin } // Creates the database object with using the database configuration and exec the setup -func SetupDatabaseConnection(logger *zap.Logger, databaseConfiguration configuration.DatabaseConfiguration) (*gorm.DB, error) { +func SetupDatabaseConnection( + logger *zap.Logger, + databaseConfiguration configuration.DatabaseConfiguration, +) (*gorm.DB, error) { db, err := CreateDatabaseConnectionFromConfiguration(logger, databaseConfiguration) if err != nil { return nil, err } - err = AutoMigrate(logger, db) + err = db.AutoMigrate(ListOfTables...) if err != nil { logger.Error("migration failed") return nil, err @@ -91,21 +95,3 @@ func initializeDBFromDsn(dsn string, logger *zap.Logger) (*gorm.DB, error) { } return database, nil } - -// Migrate the database using gorm [https://gorm.io/docs/migration.html#Auto-Migration] -func autoMigrate(database *gorm.DB, listOfDatabaseTables []any) error { - err := database.AutoMigrate(listOfDatabaseTables...) - if err != nil { - return err - } - return nil -} - -// Run the automigration -func AutoMigrate(logger *zap.Logger, database *gorm.DB) error { - err := autoMigrate(database, models.ListOfTables) - if err != nil { - return err - } - return nil -} diff --git a/persistence/models/Product.go b/persistence/models/Product.go deleted file mode 100644 index d9d110ea..00000000 --- a/persistence/models/Product.go +++ /dev/null @@ -1,55 +0,0 @@ -package models - -import "github.com/google/uuid" - -// TODO esto no deberia estar aca -type Company struct { - BaseModel - - Name string - Sellers []Seller -} - -type Product struct { - BaseModel - - String string - Int int - Float float64 - Bool bool -} - -type Seller struct { - BaseModel - - Name string - CompanyID *uuid.UUID -} - -type Sale struct { - BaseModel - - // belongsTo Product - Product *Product - ProductID uuid.UUID - - // belongsTo Seller - Seller *Seller - SellerID uuid.UUID -} - -func (Product) TableName() string { - return "products" -} - -func (Sale) TableName() string { - return "sales" -} - -func (m Product) Equal(other Product) bool { - return m.ID == other.ID -} - -func (m Sale) Equal(other Sale) bool { - return m.ID == other.ID -} diff --git a/persistence/models/ProductInfo.go b/persistence/models/ProductInfo.go deleted file mode 100644 index 42040ce5..00000000 --- a/persistence/models/ProductInfo.go +++ /dev/null @@ -1,7 +0,0 @@ -package models - -// Describe the current BADAAS instance -type BadaasServerInfo struct { - Status string `json:"status"` - Version string `json:"version"` -} diff --git a/persistence/models/Tabler.go b/persistence/models/Tabler.go index 5a09a68e..4c31f112 100644 --- a/persistence/models/Tabler.go +++ b/persistence/models/Tabler.go @@ -1,19 +1,5 @@ package models -var ListOfTables = []any{ - User{}, - Session{}, - EntityType{}, - Entity{}, - Value{}, - Attribute{}, - // TODO esto deberia poder ser seteado por el usuario - Company{}, - Product{}, - Seller{}, - Sale{}, -} - // The interface "type" need to implement to be considered models type Tabler interface { // pluralized name diff --git a/router/ModuleFx.go b/router/ModuleFx.go index e5561dc2..1f01e98d 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -12,6 +12,5 @@ var RouterModule = fx.Module( // middlewares fx.Provide(middlewares.NewJSONController), fx.Provide(middlewares.NewMiddlewareLogger), - fx.Provide(middlewares.NewAuthenticationMiddleware), fx.Invoke(middlewares.AddLoggerMiddleware), ) diff --git a/services/ModuleFx.go b/services/ModuleFx.go index 59d997aa..6d6d7cf7 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -1,14 +1,71 @@ package services import ( + "github.com/ditrit/badaas/persistence/gormdatabase" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" + "github.com/google/uuid" "go.uber.org/fx" ) -var ServicesModule = fx.Module( - "services", +var AuthServiceModule = fx.Module( + "authService", + // models + fx.Invoke(addAuthModels), + // repositories + fx.Provide(repository.NewCRUDRepository[models.Session, uuid.UUID]), + fx.Provide(repository.NewCRUDRepository[models.User, uuid.UUID]), + + // services fx.Provide(userservice.NewUserService), fx.Provide(sessionservice.NewSessionService), +) + +func addAuthModels() { + gormdatabase.ListOfTables = append(gormdatabase.ListOfTables, + models.User{}, + models.Session{}, + ) +} + +var EAVServiceModule = fx.Module( + "eavService", + // models + fx.Invoke(addEAVModels), + // repositories + fx.Provide(repository.NewValueRepository), + fx.Provide(repository.NewEntityRepository), + fx.Provide(repository.NewEntityTypeRepository), + + // service fx.Provide(NewEAVService), ) + +func addEAVModels() { + gormdatabase.ListOfTables = append(gormdatabase.ListOfTables, + models.EntityType{}, + models.Entity{}, + models.Value{}, + models.Attribute{}, + ) +} + +func GetCRUDServiceModule[T models.Tabler]() fx.Option { + return fx.Module( + "crudServiceModule", + // models + fx.Invoke(addCRUDModel[T]), + // repository + fx.Provide(repository.NewCRUDRepository[T, uuid.UUID]), + // service + fx.Provide(NewCRUDService[T, uuid.UUID]), + ) +} + +func addCRUDModel[T models.Tabler]() { + gormdatabase.ListOfTables = append(gormdatabase.ListOfTables, + *new(T), + ) +} diff --git a/test_integration/crudservice.go b/test_integration/crudservice.go index a7c79f91..09650bee 100644 --- a/test_integration/crudservice.go +++ b/test_integration/crudservice.go @@ -9,19 +9,78 @@ import ( "gorm.io/gorm" ) +type Company struct { + models.BaseModel + + Name string + Sellers []Seller +} + +type Product struct { + models.BaseModel + + String string + Int int + Float float64 + Bool bool +} + +type Seller struct { + models.BaseModel + + Name string + CompanyID *uuid.UUID +} + +type Sale struct { + models.BaseModel + + // belongsTo Product + Product *Product + ProductID uuid.UUID + + // belongsTo Seller + Seller *Seller + SellerID uuid.UUID +} + +func (Product) TableName() string { + return "products" +} + +func (Sale) TableName() string { + return "sales" +} + +func (Company) TableName() string { + return "companies" +} + +func (Seller) TableName() string { + return "sellers" +} + +func (m Product) Equal(other Product) bool { + return m.ID == other.ID +} + +func (m Sale) Equal(other Sale) bool { + return m.ID == other.ID +} + type CRUDServiceIntTestSuite struct { suite.Suite logger *zap.Logger db *gorm.DB - crudProductService services.CRUDService[models.Product, uuid.UUID] - crudSaleService services.CRUDService[models.Sale, uuid.UUID] + crudProductService services.CRUDService[Product, uuid.UUID] + crudSaleService services.CRUDService[Sale, uuid.UUID] } func NewCRUDServiceIntTestSuite( logger *zap.Logger, db *gorm.DB, - crudProductService services.CRUDService[models.Product, uuid.UUID], - crudSaleService services.CRUDService[models.Sale, uuid.UUID], + crudProductService services.CRUDService[Product, uuid.UUID], + crudSaleService services.CRUDService[Sale, uuid.UUID], ) *CRUDServiceIntTestSuite { return &CRUDServiceIntTestSuite{ logger: logger, @@ -41,7 +100,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyI entities, err := ts.crudProductService.GetEntities(map[string]any{}) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{}, entities) + EqualList(&ts.Suite, []*Product{}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { @@ -50,7 +109,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnl entities, err := ts.crudProductService.GetEntities(map[string]any{}) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) + EqualList(&ts.Suite, []*Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { @@ -61,7 +120,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheLis entities, err := ts.crudProductService.GetEntities(map[string]any{}) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) + EqualList(&ts.Suite, []*Product{match1, match2, match3}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { @@ -71,7 +130,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNo entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{}, entities) + EqualList(&ts.Suite, []*Product{}, entities) } // TODO mirar esto, el string del where se pone sin tabla, puede generar problemas cuando haya join @@ -86,7 +145,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNo entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{}, entities) + EqualList(&ts.Suite, []*Product{}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { @@ -103,7 +162,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnly entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) + EqualList(&ts.Suite, []*Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { @@ -123,7 +182,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleI entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + EqualList(&ts.Suite, []*Product{match1, match2}, entities) } // TODO ver caso en el que la columna no existe @@ -144,7 +203,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleI // entities, err := ts.crudProductService.GetEntities(params) // ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{}, entities) +// EqualList(&ts.Suite, []*Product{}, entities) // } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { @@ -163,7 +222,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) + EqualList(&ts.Suite, []*Product{match}, entities) } // TODO ver este caso @@ -197,7 +256,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) + EqualList(&ts.Suite, []*Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { @@ -216,7 +275,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) + EqualList(&ts.Suite, []*Product{match}, entities) } // TODO testear la creacion directo con entidades @@ -231,12 +290,13 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() ts.createSale(product2, seller2) params := map[string]any{ + // TODO ver esto, es un poco confuso que lo muestra como ProductID pero para queries es product_id "product_id": product1.ID.String(), } entities, err := ts.crudSaleService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Sale{match}, entities) + EqualList(&ts.Suite, []*Sale{match}, entities) } // TODO ver esto @@ -252,7 +312,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() // entities, err := ts.crudProductService.GetEntities(params) // ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) +// EqualList(&ts.Suite, []*Product{match}, entities) // } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { @@ -286,7 +346,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDiffer entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + EqualList(&ts.Suite, []*Product{match1, match2}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoins() { @@ -311,7 +371,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoins() { entities, err := ts.crudSaleService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Sale{match}, entities) + EqualList(&ts.Suite, []*Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { @@ -339,7 +399,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffer entities, err := ts.crudSaleService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Sale{match}, entities) + EqualList(&ts.Suite, []*Sale{match}, entities) } // // TODO aca deberia agregar casos en lo que 1 matchea pero el otro no @@ -368,7 +428,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferen entities, err := ts.crudSaleService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Sale{match}, entities) + EqualList(&ts.Suite, []*Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { @@ -396,7 +456,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultiple entities, err := ts.crudSaleService.GetEntities(params) ts.Nil(err) - EqualList(&ts.Suite, []*models.Sale{match}, entities) + EqualList(&ts.Suite, []*Sale{match}, entities) } // TODO falta test de que joinea dos veces con la misma entidad @@ -404,15 +464,15 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultiple // ------------------------- utils ------------------------- -func (ts *CRUDServiceIntTestSuite) createProduct(values map[string]any) *models.Product { +func (ts *CRUDServiceIntTestSuite) createProduct(values map[string]any) *Product { entity, err := ts.crudProductService.CreateEntity(values) ts.Nil(err) return entity } -func (ts *CRUDServiceIntTestSuite) createSale(product *models.Product, seller *models.Seller) *models.Sale { - entity := &models.Sale{ +func (ts *CRUDServiceIntTestSuite) createSale(product *Product, seller *Seller) *Sale { + entity := &Sale{ Product: product, Seller: seller, } @@ -422,12 +482,12 @@ func (ts *CRUDServiceIntTestSuite) createSale(product *models.Product, seller *m return entity } -func (ts *CRUDServiceIntTestSuite) createSeller(name string, company *models.Company) *models.Seller { +func (ts *CRUDServiceIntTestSuite) createSeller(name string, company *Company) *Seller { var companyID *uuid.UUID if company != nil { companyID = &company.ID } - entity := &models.Seller{ + entity := &Seller{ Name: name, CompanyID: companyID, } @@ -437,8 +497,8 @@ func (ts *CRUDServiceIntTestSuite) createSeller(name string, company *models.Com return entity } -func (ts *CRUDServiceIntTestSuite) createCompany(name string) *models.Company { - entity := &models.Company{ +func (ts *CRUDServiceIntTestSuite) createCompany(name string) *Company { + entity := &Company{ Name: name, } err := ts.db.Create(entity).Error diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index c1326994..a40992ea 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -7,8 +7,7 @@ import ( "testing" "github.com/ditrit/badaas" - "github.com/ditrit/badaas/controllers" - "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services" "github.com/ditrit/verdeter" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -50,10 +49,13 @@ func injectDependencies(cmd *cobra.Command, args []string) { return &fxevent.ZapLogger{Logger: logger} }), + services.EAVServiceModule, fx.Provide(NewEAVServiceIntTestSuite), - controllers.GetCRUDModule[models.Product](), - controllers.GetCRUDModule[models.Sale](), + services.GetCRUDServiceModule[Company](), + services.GetCRUDServiceModule[Seller](), + services.GetCRUDServiceModule[Product](), + services.GetCRUDServiceModule[Sale](), fx.Provide(NewCRUDServiceIntTestSuite), fx.Invoke(runTestSuites), diff --git a/test_integration/setup.go b/test_integration/setup.go index 57ae1c9c..693e85b2 100644 --- a/test_integration/setup.go +++ b/test_integration/setup.go @@ -11,13 +11,13 @@ var ListOfTables = []any{ models.Session{}, models.User{}, models.Value{}, - models.Entity{}, models.Attribute{}, + models.Entity{}, models.EntityType{}, - models.Sale{}, - models.Seller{}, - models.Company{}, - models.Product{}, + Sale{}, + Product{}, + Seller{}, + Company{}, } func CleanDB(db *gorm.DB) { From 25c49a6c0087a5ee1c74516c6b8ebe73b556eb2b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 11 May 2023 15:50:14 +0200 Subject: [PATCH 145/467] fix dependencies order independient + each test removes its models --- controllers/ModuleFx.go | 10 +++---- persistence/ModuleFx.go | 7 ++++- persistence/gormdatabase/db.go | 5 ++-- services/ModuleFx.go | 48 ++++++++++++++++------------------ test_e2e/badaas_e2e_test.go | 11 +++++++- test_integration/setup.go | 8 +++--- 6 files changed, 49 insertions(+), 40 deletions(-) diff --git a/controllers/ModuleFx.go b/controllers/ModuleFx.go index caccf2c3..3230990c 100644 --- a/controllers/ModuleFx.go +++ b/controllers/ModuleFx.go @@ -60,8 +60,9 @@ var CRUDControllerModule = fx.Module( ) func GetCRUDControllerModule[T models.Tabler]() fx.Option { + typeName := fmt.Sprintf("%T", *new(T)) return fx.Module( - "crudControllerModule", + typeName+"CRUDControllerModule", // service services.GetCRUDServiceModule[T](), @@ -69,12 +70,7 @@ func GetCRUDControllerModule[T models.Tabler]() fx.Option { fx.Provide( fx.Annotate( NewCRUDController[T], - fx.ResultTags( - fmt.Sprintf( - `name:"%TCRUDController"`, - *new(T), - ), - ), + fx.ResultTags(`name:"`+typeName+`CRUDController"`), ), ), ) diff --git a/persistence/ModuleFx.go b/persistence/ModuleFx.go index c51c53e6..03b8eec8 100644 --- a/persistence/ModuleFx.go +++ b/persistence/ModuleFx.go @@ -13,5 +13,10 @@ import ( var PersistanceModule = fx.Module( "persistence", // Database connection - fx.Provide(gormdatabase.SetupDatabaseConnection), + fx.Provide( + fx.Annotate( + gormdatabase.SetupDatabaseConnection, + fx.ParamTags(`group:"modelTables"`), + ), + ), ) diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index 1a43b086..1bfdc0c0 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -11,8 +11,6 @@ import ( "gorm.io/gorm" ) -var ListOfTables = []any{} - // Create the dsn string from the configuration func createDsnFromConf(databaseConfiguration configuration.DatabaseConfiguration) string { dsn := createDsn( @@ -35,6 +33,7 @@ func createDsn(host, username, password, sslmode, dbname string, port int) strin // Creates the database object with using the database configuration and exec the setup func SetupDatabaseConnection( + listOfTables []any, logger *zap.Logger, databaseConfiguration configuration.DatabaseConfiguration, ) (*gorm.DB, error) { @@ -43,7 +42,7 @@ func SetupDatabaseConnection( return nil, err } - err = db.AutoMigrate(ListOfTables...) + err = db.AutoMigrate(listOfTables...) if err != nil { logger.Error("migration failed") return nil, err diff --git a/services/ModuleFx.go b/services/ModuleFx.go index 6d6d7cf7..063ef49f 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -1,7 +1,8 @@ package services import ( - "github.com/ditrit/badaas/persistence/gormdatabase" + "fmt" + "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/sessionservice" @@ -13,7 +14,8 @@ import ( var AuthServiceModule = fx.Module( "authService", // models - fx.Invoke(addAuthModels), + fx.Provide(addModel[models.User]), + fx.Provide(addModel[models.Session]), // repositories fx.Provide(repository.NewCRUDRepository[models.Session, uuid.UUID]), fx.Provide(repository.NewCRUDRepository[models.User, uuid.UUID]), @@ -23,17 +25,13 @@ var AuthServiceModule = fx.Module( fx.Provide(sessionservice.NewSessionService), ) -func addAuthModels() { - gormdatabase.ListOfTables = append(gormdatabase.ListOfTables, - models.User{}, - models.Session{}, - ) -} - var EAVServiceModule = fx.Module( "eavService", // models - fx.Invoke(addEAVModels), + fx.Provide(addModel[models.EntityType]), + fx.Provide(addModel[models.Entity]), + fx.Provide(addModel[models.Value]), + fx.Provide(addModel[models.Attribute]), // repositories fx.Provide(repository.NewValueRepository), fx.Provide(repository.NewEntityRepository), @@ -43,20 +41,14 @@ var EAVServiceModule = fx.Module( fx.Provide(NewEAVService), ) -func addEAVModels() { - gormdatabase.ListOfTables = append(gormdatabase.ListOfTables, - models.EntityType{}, - models.Entity{}, - models.Value{}, - models.Attribute{}, - ) -} - func GetCRUDServiceModule[T models.Tabler]() fx.Option { return fx.Module( - "crudServiceModule", + fmt.Sprintf( + "%TCRUDServiceModule", + *new(T), + ), // models - fx.Invoke(addCRUDModel[T]), + fx.Provide(addModel[T]), // repository fx.Provide(repository.NewCRUDRepository[T, uuid.UUID]), // service @@ -64,8 +56,14 @@ func GetCRUDServiceModule[T models.Tabler]() fx.Option { ) } -func addCRUDModel[T models.Tabler]() { - gormdatabase.ListOfTables = append(gormdatabase.ListOfTables, - *new(T), - ) +type addModelResult struct { + fx.Out + + Model any `group:"modelTables"` +} + +func addModel[T any]() addModelResult { + return addModelResult{ + Model: *new(T), + } } diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index ffdb22e0..2902ead6 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -67,6 +67,15 @@ func TestMain(_ *testing.M) { os.Exit(status) } +var ListOfTables = []any{ + models.Session{}, + models.User{}, + models.Value{}, + models.Attribute{}, + models.Entity{}, + models.EntityType{}, +} + func InitializeScenario(ctx *godog.ScenarioContext) { t := &TestContext{} jar, err := cookiejar.New(nil) @@ -81,7 +90,7 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { // clean db before each scenario - integrationtests.CleanDB(db) + integrationtests.CleanDBTables(db, ListOfTables) adminUser := &models.User{ Username: "admin", diff --git a/test_integration/setup.go b/test_integration/setup.go index 693e85b2..f5348236 100644 --- a/test_integration/setup.go +++ b/test_integration/setup.go @@ -8,8 +8,6 @@ import ( ) var ListOfTables = []any{ - models.Session{}, - models.User{}, models.Value{}, models.Attribute{}, models.Entity{}, @@ -21,8 +19,12 @@ var ListOfTables = []any{ } func CleanDB(db *gorm.DB) { + CleanDBTables(db, ListOfTables) +} + +func CleanDBTables(db *gorm.DB, listOfTables []any) { // clean database to ensure independency between tests - for _, table := range ListOfTables { + for _, table := range listOfTables { err := db.Unscoped().Where("1 = 1").Delete(table).Error if err != nil { log.Fatalln("could not clean database: ", err) From 94825cebe50ba3e04e8675c3f05ea5e65bf9039d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 11 May 2023 16:00:05 +0200 Subject: [PATCH 146/467] create only necesary crud services --- persistence/ModuleFx.go | 12 ++++++++++++ services/ModuleFx.go | 27 ++++++++------------------- test_integration/integration_test.go | 5 +++-- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/persistence/ModuleFx.go b/persistence/ModuleFx.go index 03b8eec8..0abbf6d3 100644 --- a/persistence/ModuleFx.go +++ b/persistence/ModuleFx.go @@ -20,3 +20,15 @@ var PersistanceModule = fx.Module( ), ), ) + +type AddModelResult struct { + fx.Out + + Model any `group:"modelTables"` +} + +func AddModel[T any]() AddModelResult { + return AddModelResult{ + Model: *new(T), + } +} diff --git a/services/ModuleFx.go b/services/ModuleFx.go index 063ef49f..2f4981ed 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -3,6 +3,7 @@ package services import ( "fmt" + "github.com/ditrit/badaas/persistence" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/sessionservice" @@ -14,8 +15,8 @@ import ( var AuthServiceModule = fx.Module( "authService", // models - fx.Provide(addModel[models.User]), - fx.Provide(addModel[models.Session]), + fx.Provide(persistence.AddModel[models.User]), + fx.Provide(persistence.AddModel[models.Session]), // repositories fx.Provide(repository.NewCRUDRepository[models.Session, uuid.UUID]), fx.Provide(repository.NewCRUDRepository[models.User, uuid.UUID]), @@ -28,10 +29,10 @@ var AuthServiceModule = fx.Module( var EAVServiceModule = fx.Module( "eavService", // models - fx.Provide(addModel[models.EntityType]), - fx.Provide(addModel[models.Entity]), - fx.Provide(addModel[models.Value]), - fx.Provide(addModel[models.Attribute]), + fx.Provide(persistence.AddModel[models.EntityType]), + fx.Provide(persistence.AddModel[models.Entity]), + fx.Provide(persistence.AddModel[models.Value]), + fx.Provide(persistence.AddModel[models.Attribute]), // repositories fx.Provide(repository.NewValueRepository), fx.Provide(repository.NewEntityRepository), @@ -48,22 +49,10 @@ func GetCRUDServiceModule[T models.Tabler]() fx.Option { *new(T), ), // models - fx.Provide(addModel[T]), + fx.Provide(persistence.AddModel[T]), // repository fx.Provide(repository.NewCRUDRepository[T, uuid.UUID]), // service fx.Provide(NewCRUDService[T, uuid.UUID]), ) } - -type addModelResult struct { - fx.Out - - Model any `group:"modelTables"` -} - -func addModel[T any]() addModelResult { - return addModelResult{ - Model: *new(T), - } -} diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index a40992ea..1d1c23f0 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/ditrit/badaas" + "github.com/ditrit/badaas/persistence" "github.com/ditrit/badaas/services" "github.com/ditrit/verdeter" "github.com/spf13/cobra" @@ -52,8 +53,8 @@ func injectDependencies(cmd *cobra.Command, args []string) { services.EAVServiceModule, fx.Provide(NewEAVServiceIntTestSuite), - services.GetCRUDServiceModule[Company](), - services.GetCRUDServiceModule[Seller](), + fx.Provide(persistence.AddModel[Company]), + fx.Provide(persistence.AddModel[Seller]), services.GetCRUDServiceModule[Product](), services.GetCRUDServiceModule[Sale](), fx.Provide(NewCRUDServiceIntTestSuite), From 3e48271b92ba65053674780e1bf5619e9d90f857 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 11 May 2023 16:29:26 +0200 Subject: [PATCH 147/467] remove generalCrudController --- controllers/ModuleFx.go | 77 ------------------- controllers/crud.go | 19 ++++- controllers/generalCrud.go | 102 ------------------------- router/ModuleFx.go | 71 +++++++++++++++++ {controllers => router}/routes.go | 48 ++++++++---- {controllers => router}/routes_test.go | 12 +-- test_e2e/test_api.go | 8 +- 7 files changed, 131 insertions(+), 206 deletions(-) delete mode 100644 controllers/ModuleFx.go delete mode 100644 controllers/generalCrud.go rename {controllers => router}/routes.go (70%) rename {controllers => router}/routes_test.go (95%) diff --git a/controllers/ModuleFx.go b/controllers/ModuleFx.go deleted file mode 100644 index 3230990c..00000000 --- a/controllers/ModuleFx.go +++ /dev/null @@ -1,77 +0,0 @@ -package controllers - -import ( - "fmt" - - "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/router/middlewares" - "github.com/ditrit/badaas/services" - "go.uber.org/fx" -) - -var InfoControllerModule = fx.Module( - "infoController", - // controller - fx.Provide(NewInfoController), - // routes - fx.Invoke(AddInfoRoutes), -) - -var AuthControllerModule = fx.Module( - "authController", - // service - services.AuthServiceModule, - - // controller - fx.Provide(NewBasicAuthenticationController), - - // routes - fx.Provide(middlewares.NewAuthenticationMiddleware), - fx.Invoke(AddAuthRoutes), -) - -var EAVControllerModule = fx.Module( - "eavController", - // service - services.EAVServiceModule, - - // controller - fx.Provide( - fx.Annotate( - NewEAVController, - fx.ResultTags(`name:"eavController"`), - ), - ), - - // routes - fx.Invoke( - fx.Annotate( - AddEAVCRUDRoutes, - fx.ParamTags(`name:"eavController"`), - ), - ), -) - -var CRUDControllerModule = fx.Module( - "crudController", - // TODO cambiar el nombre de esto - fx.Provide(NewGeneralCRUDController), - fx.Invoke(AddCRUDRoutes), -) - -func GetCRUDControllerModule[T models.Tabler]() fx.Option { - typeName := fmt.Sprintf("%T", *new(T)) - return fx.Module( - typeName+"CRUDControllerModule", - // service - services.GetCRUDServiceModule[T](), - - // controller - fx.Provide( - fx.Annotate( - NewCRUDController[T], - fx.ResultTags(`name:"`+typeName+`CRUDController"`), - ), - ), - ) -} diff --git a/controllers/crud.go b/controllers/crud.go index af60aefe..64f5f41e 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -2,7 +2,9 @@ package controllers import ( "errors" + "fmt" "net/http" + "strings" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" @@ -26,14 +28,23 @@ type CRUDController interface { // check interface compliance var _ CRUDController = (*crudControllerImpl[models.User])(nil) +type CRUDRoute struct { + TypeName string + Controller CRUDController +} + func NewCRUDController[T models.Tabler]( logger *zap.Logger, crudService services.CRUDService[T, uuid.UUID], -) CRUDController { - return &crudControllerImpl[T]{ - logger: logger, - crudService: crudService, +) CRUDRoute { + return CRUDRoute{ + TypeName: strings.ToLower(fmt.Sprintf("%T", *new(T))), + Controller: &crudControllerImpl[T]{ + logger: logger, + crudService: crudService, + }, } + } // The concrete implementation of the EAVController diff --git a/controllers/generalCrud.go b/controllers/generalCrud.go deleted file mode 100644 index ef0ca3eb..00000000 --- a/controllers/generalCrud.go +++ /dev/null @@ -1,102 +0,0 @@ -package controllers - -import ( - "net/http" - - "github.com/ditrit/badaas/httperrors" - "github.com/gorilla/mux" - "go.uber.org/zap" -) - -// check interface compliance -var _ CRUDController = (*GeneralCRUDController)(nil) - -func NewGeneralCRUDController( - logger *zap.Logger, - entityMapping map[string]CRUDController, -) *GeneralCRUDController { - return &GeneralCRUDController{ - logger: logger, - entityMapping: entityMapping, - } -} - -// The concrete implementation of the EAVController -type GeneralCRUDController struct { - logger *zap.Logger - entityMapping map[string]CRUDController -} - -// The handler responsible of the retrieval of one objects -func (controller *GeneralCRUDController) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - crudController, herr := controller.getEntityCRUDController(r) - if herr != nil { - return nil, herr - } - - return crudController.GetObject(w, r) -} - -// The handler responsible of the retrieval of multiple objects -func (controller *GeneralCRUDController) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - crudController, herr := controller.getEntityCRUDController(r) - if herr != nil { - return nil, herr - } - - return crudController.GetObjects(w, r) -} - -// The handler responsible of the creation of a object -func (controller *GeneralCRUDController) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - crudController, herr := controller.getEntityCRUDController(r) - if herr != nil { - return nil, herr - } - - return crudController.CreateObject(w, r) -} - -// The handler responsible for the updates of one object -func (controller *GeneralCRUDController) UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - crudController, herr := controller.getEntityCRUDController(r) - if herr != nil { - return nil, herr - } - - return crudController.UpdateObject(w, r) -} - -// The handler responsible for the deletion of a object -func (controller *GeneralCRUDController) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - crudController, herr := controller.getEntityCRUDController(r) - if herr != nil { - return nil, herr - } - - return crudController.DeleteObject(w, r) -} - -func (controller *GeneralCRUDController) getEntityCRUDController(r *http.Request) (CRUDController, httperrors.HTTPError) { - entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) - if herr != nil { - return nil, herr - } - - crudController, isPresent := controller.entityMapping[entityTypeName] - if !isPresent { - return nil, ErrEntityTypeNotFound - } - - return crudController, nil -} - -// Extract the "type" parameter from url -func (controller *GeneralCRUDController) getEntityTypeNameFromRequest(r *http.Request) (string, httperrors.HTTPError) { - entityTypeName, present := mux.Vars(r)["type"] - if !present { - return "", ErrEntityTypeNotFound - } - - return entityTypeName, nil -} diff --git a/router/ModuleFx.go b/router/ModuleFx.go index 1f01e98d..71833769 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -1,7 +1,12 @@ package router import ( + "fmt" + + "github.com/ditrit/badaas/controllers" + "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/router/middlewares" + "github.com/ditrit/badaas/services" "go.uber.org/fx" ) @@ -9,8 +14,74 @@ import ( var RouterModule = fx.Module( "router", fx.Provide(NewRouter), + fx.Invoke( + fx.Annotate( + AddCRUDRoutes, + fx.ParamTags(`group:"crudControllers"`), + ), + ), // middlewares fx.Provide(middlewares.NewJSONController), fx.Provide(middlewares.NewMiddlewareLogger), fx.Invoke(middlewares.AddLoggerMiddleware), ) + +var InfoRouteModule = fx.Module( + "infoRoute", + // controller + fx.Provide(controllers.NewInfoController), + // routes + fx.Invoke(AddInfoRoutes), +) + +var AuthRoutesModule = fx.Module( + "authRoutes", + // service + services.AuthServiceModule, + + // controller + fx.Provide(controllers.NewBasicAuthenticationController), + + // routes + fx.Provide(middlewares.NewAuthenticationMiddleware), + fx.Invoke(AddAuthRoutes), +) + +var EAVRoutesModule = fx.Module( + "eavRoutes", + // service + services.EAVServiceModule, + + // controller + fx.Provide( + fx.Annotate( + controllers.NewEAVController, + fx.ResultTags(`name:"eavController"`), + ), + ), + + // routes + fx.Invoke( + fx.Annotate( + AddEAVCRUDRoutes, + fx.ParamTags(`name:"eavController"`), + ), + ), +) + +func GetCRUDRoutesModule[T models.Tabler]() fx.Option { + typeName := fmt.Sprintf("%T", *new(T)) + return fx.Module( + typeName+"CRUDRoutesModule", + // service + services.GetCRUDServiceModule[T](), + + // controller + fx.Provide( + fx.Annotate( + controllers.NewCRUDController[T], + fx.ResultTags(`group:"crudControllers"`), + ), + ), + ) +} diff --git a/controllers/routes.go b/router/routes.go similarity index 70% rename from controllers/routes.go rename to router/routes.go index d8627f2c..9673a5fc 100644 --- a/controllers/routes.go +++ b/router/routes.go @@ -1,9 +1,10 @@ -package controllers +package router import ( "strings" "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/router/middlewares" "github.com/ditrit/badaas/services/userservice" "github.com/gorilla/mux" @@ -13,7 +14,7 @@ import ( func AddInfoRoutes( router *mux.Router, jsonController middlewares.JSONController, - infoController InformationController, + infoController controllers.InformationController, ) { router.HandleFunc( "/info", @@ -29,7 +30,7 @@ func AddAuthRoutes( logger *zap.Logger, router *mux.Router, authenticationMiddleware middlewares.AuthenticationMiddleware, - basicAuthenticationController BasicAuthenticationController, + basicAuthenticationController controllers.BasicAuthenticationController, jsonController middlewares.JSONController, config configuration.InitializationConfiguration, userService userservice.UserService, @@ -69,7 +70,7 @@ func createSuperUser( } func AddEAVCRUDRoutes( - eavController CRUDController, + eavController controllers.CRUDController, router *mux.Router, jsonController middlewares.JSONController, ) { @@ -84,16 +85,37 @@ func AddEAVCRUDRoutes( } func AddCRUDRoutes( + crudRoutes []controllers.CRUDRoute, router *mux.Router, - generalCRUDController *GeneralCRUDController, jsonController middlewares.JSONController, ) { - // Objects CRUD - objectsBase := "/objects/{type}" - objectsWithID := objectsBase + "/{id}" - router.HandleFunc(objectsWithID, jsonController.Wrap(generalCRUDController.GetObject)).Methods("GET") - router.HandleFunc(objectsBase, jsonController.Wrap(generalCRUDController.GetObjects)).Methods("GET") - router.HandleFunc(objectsBase, jsonController.Wrap(generalCRUDController.CreateObject)).Methods("POST") - router.HandleFunc(objectsWithID, jsonController.Wrap(generalCRUDController.UpdateObject)).Methods("PUT") - router.HandleFunc(objectsWithID, jsonController.Wrap(generalCRUDController.DeleteObject)).Methods("DELETE") + for _, crudRoute := range crudRoutes { + // Objects CRUD + objectsBase := "/objects/" + crudRoute.TypeName + objectsWithID := objectsBase + "/{id}" + // create + router.HandleFunc( + objectsBase, + jsonController.Wrap(crudRoute.Controller.CreateObject), + ).Methods("POST") + // read + router.HandleFunc( + objectsWithID, + jsonController.Wrap(crudRoute.Controller.GetObject), + ).Methods("GET") + router.HandleFunc( + objectsBase, + jsonController.Wrap(crudRoute.Controller.GetObjects), + ).Methods("GET") + // update + router.HandleFunc( + objectsWithID, + jsonController.Wrap(crudRoute.Controller.UpdateObject), + ).Methods("PUT") + // delete + router.HandleFunc( + objectsWithID, + jsonController.Wrap(crudRoute.Controller.DeleteObject), + ).Methods("DELETE") + } } diff --git a/controllers/routes_test.go b/router/routes_test.go similarity index 95% rename from controllers/routes_test.go rename to router/routes_test.go index 1c9bdde0..37b758ed 100644 --- a/controllers/routes_test.go +++ b/router/routes_test.go @@ -1,4 +1,4 @@ -package controllers +package router import ( "errors" @@ -7,11 +7,11 @@ import ( "testing" "github.com/Masterminds/semver/v3" + "github.com/ditrit/badaas/controllers" mocks "github.com/ditrit/badaas/mocks/configuration" mockControllers "github.com/ditrit/badaas/mocks/controllers" mockMiddlewares "github.com/ditrit/badaas/mocks/router/middlewares" mockUserServices "github.com/ditrit/badaas/mocks/services/userservice" - "github.com/ditrit/badaas/router" "github.com/ditrit/badaas/router/middlewares" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" @@ -79,9 +79,9 @@ var logger, _ = zap.NewDevelopment() func TestAddInfoRoutes(t *testing.T) { jsonController := middlewares.NewJSONController(logger) - informationController := NewInfoController(semver.MustParse("1.0.1")) + informationController := controllers.NewInfoController(semver.MustParse("1.0.1")) - router := router.NewRouter() + router := NewRouter() AddInfoRoutes( router, jsonController, @@ -119,7 +119,7 @@ func TestAddLoginRoutes(t *testing.T) { authenticationMiddleware := mockMiddlewares.NewAuthenticationMiddleware(t) - router := router.NewRouter() + router := NewRouter() AddAuthRoutes( nil, router, @@ -150,7 +150,7 @@ func TestAddCRUDRoutes(t *testing.T) { On("GetObjects", mock.Anything, mock.Anything). Return(map[string]string{"GetObjects": "called"}, nil) - router := router.NewRouter() + router := NewRouter() AddEAVCRUDRoutes( eavController, router, diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index 5ceb66ab..85de78c8 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -8,7 +8,7 @@ import ( "github.com/Masterminds/semver/v3" "github.com/ditrit/badaas" "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/controllers" + "github.com/ditrit/badaas/router" "github.com/ditrit/verdeter" "github.com/gorilla/handlers" "github.com/gorilla/mux" @@ -47,9 +47,9 @@ func runHTTPServer(cmd *cobra.Command, args []string) { fx.Provide(NewAPIVersion), // add routes provided by badaas - controllers.InfoControllerModule, - controllers.AuthControllerModule, - controllers.EAVControllerModule, + router.InfoRouteModule, + router.AuthRoutesModule, + router.EAVRoutesModule, // create httpServer fx.Provide(NewHTTPServer), From 27b5e05ff2dc9458f30f4828fbca36068e8b6221 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 11 May 2023 16:40:56 +0200 Subject: [PATCH 148/467] add logs to debug --- router/routes.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/router/routes.go b/router/routes.go index 9673a5fc..c424c2e0 100644 --- a/router/routes.go +++ b/router/routes.go @@ -1,6 +1,7 @@ package router import ( + "log" "strings" "github.com/ditrit/badaas/configuration" @@ -89,7 +90,9 @@ func AddCRUDRoutes( router *mux.Router, jsonController middlewares.JSONController, ) { + log.Println(crudRoutes) for _, crudRoute := range crudRoutes { + log.Println(crudRoute) // Objects CRUD objectsBase := "/objects/" + crudRoute.TypeName objectsWithID := objectsBase + "/{id}" From 2c2cc0428f0ee62fb511664a484944ac28f9c66d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 11 May 2023 16:46:09 +0200 Subject: [PATCH 149/467] fix remove package from type name --- controllers/crud.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/controllers/crud.go b/controllers/crud.go index 64f5f41e..90c9a3f0 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -9,6 +9,7 @@ import ( "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/services" + "github.com/elliotchance/pie/v2" "github.com/google/uuid" "github.com/gorilla/mux" "go.uber.org/zap" @@ -37,8 +38,12 @@ func NewCRUDController[T models.Tabler]( logger *zap.Logger, crudService services.CRUDService[T, uuid.UUID], ) CRUDRoute { + fullTypeName := strings.ToLower(fmt.Sprintf("%T", *new(T))) + // remove the package name of the type + typeName := pie.Last(strings.Split(fullTypeName, ".")) + return CRUDRoute{ - TypeName: strings.ToLower(fmt.Sprintf("%T", *new(T))), + TypeName: typeName, Controller: &crudControllerImpl[T]{ logger: logger, crudService: crudService, From d42166a7cde5878802c3c2753f0c943a5f3e8b38 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 11 May 2023 16:48:43 +0200 Subject: [PATCH 150/467] remove debug logs --- router/routes.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/router/routes.go b/router/routes.go index c424c2e0..9673a5fc 100644 --- a/router/routes.go +++ b/router/routes.go @@ -1,7 +1,6 @@ package router import ( - "log" "strings" "github.com/ditrit/badaas/configuration" @@ -90,9 +89,7 @@ func AddCRUDRoutes( router *mux.Router, jsonController middlewares.JSONController, ) { - log.Println(crudRoutes) for _, crudRoute := range crudRoutes { - log.Println(crudRoute) // Objects CRUD objectsBase := "/objects/" + crudRoute.TypeName objectsWithID := objectsBase + "/{id}" From 3d787985aaa362690b009e2c24a8f7a32902cd2d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 12 May 2023 10:31:50 +0200 Subject: [PATCH 151/467] badorm to a package --- badorm/ModuleFx.go | 45 +++++++++++++++++++ badorm/README.md | 3 ++ .../repository => badorm}/SortOption.go | 2 +- .../repository => badorm}/SortOption_test.go | 6 +-- badorm/autoMigrate.go | 17 +++++++ .../crudRepository.go | 32 ++++++++++--- services/crud.go => badorm/crudService.go | 14 +++--- {persistence => badorm}/pagination/Page.go | 8 ++-- .../pagination/Page_test.go | 2 +- .../pagination/Paginator.go | 0 .../pagination/Paginator_test.go | 2 +- .../models => badorm/tabler}/Tabler.go | 3 +- controllers/basicAuth.go | 4 +- controllers/crud.go | 11 ++--- .../repository => badorm}/BadaasID.go | 0 .../repository => badorm}/CRUDRepository.go | 21 ++++----- mocks/{services => badorm}/CRUDService.go | 8 ++-- .../repository => badorm}/SortOption.go | 0 .../pagination/Paginator.go | 0 mocks/badorm/tabler/Tabler.go | 39 ++++++++++++++++ persistence/ModuleFx.go | 23 +++------- persistence/gormdatabase/db.go | 19 -------- persistence/repository/CRUDRepository.go | 30 ------------- router/ModuleFx.go | 8 ++-- services/ModuleFx.go | 35 ++++----------- services/sessionservice/session.go | 6 +-- services/sessionservice/session_test.go | 6 +-- services/userservice/userservice.go | 6 +-- services/userservice/userservice_test.go | 18 ++++---- test_e2e/badaas_e2e_test.go | 5 ++- .../{crudservice.go => crudService.go} | 10 ++--- .../{eavservice.go => eavService.go} | 0 test_integration/integration_test.go | 16 ++++--- 33 files changed, 231 insertions(+), 168 deletions(-) create mode 100644 badorm/ModuleFx.go create mode 100644 badorm/README.md rename {persistence/repository => badorm}/SortOption.go (96%) rename {persistence/repository => badorm}/SortOption_test.go (59%) create mode 100644 badorm/autoMigrate.go rename persistence/repository/CRUDRepositoryImpl.go => badorm/crudRepository.go (88%) rename services/crud.go => badorm/crudService.go (89%) rename {persistence => badorm}/pagination/Page.go (86%) rename {persistence => badorm}/pagination/Page_test.go (98%) rename {persistence => badorm}/pagination/Paginator.go (100%) rename {persistence => badorm}/pagination/Paginator_test.go (91%) rename {persistence/models => badorm/tabler}/Tabler.go (65%) rename mocks/{persistence/repository => badorm}/BadaasID.go (100%) rename mocks/{persistence/repository => badorm}/CRUDRepository.go (88%) rename mocks/{services => badorm}/CRUDService.go (91%) rename mocks/{persistence/repository => badorm}/SortOption.go (100%) rename mocks/{persistence => badorm}/pagination/Paginator.go (100%) create mode 100644 mocks/badorm/tabler/Tabler.go delete mode 100644 persistence/repository/CRUDRepository.go rename test_integration/{crudservice.go => crudService.go} (97%) rename test_integration/{eavservice.go => eavService.go} (100%) diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go new file mode 100644 index 00000000..079562a2 --- /dev/null +++ b/badorm/ModuleFx.go @@ -0,0 +1,45 @@ +package badorm + +import ( + "fmt" + + "github.com/ditrit/badaas/badorm/tabler" + "go.uber.org/fx" +) + +var BaDORMModule = fx.Module( + "BaDORM", + fx.Invoke( + fx.Annotate( + autoMigrate, + fx.ParamTags(`group:"modelTables"`), + ), + ), +) + +func GetCRUDServiceModule[T tabler.Tabler, ID BadaasID]() fx.Option { + return fx.Module( + fmt.Sprintf( + "%TCRUDServiceModule", + *new(T), + ), + // models + fx.Provide(AddModel[T]), + // repository + fx.Provide(NewCRUDRepository[T, ID]), + // service + fx.Provide(NewCRUDService[T, ID]), + ) +} + +type AddModelResult struct { + fx.Out + + Model any `group:"modelTables"` +} + +func AddModel[T any]() AddModelResult { + return AddModelResult{ + Model: *new(T), + } +} diff --git a/badorm/README.md b/badorm/README.md new file mode 100644 index 00000000..3e5b685e --- /dev/null +++ b/badorm/README.md @@ -0,0 +1,3 @@ +# BaDORM: the ORM for BaDaaS + + \ No newline at end of file diff --git a/persistence/repository/SortOption.go b/badorm/SortOption.go similarity index 96% rename from persistence/repository/SortOption.go rename to badorm/SortOption.go index 0fda0c40..4447b745 100644 --- a/persistence/repository/SortOption.go +++ b/badorm/SortOption.go @@ -1,4 +1,4 @@ -package repository +package badorm type SortOption interface { Column() string diff --git a/persistence/repository/SortOption_test.go b/badorm/SortOption_test.go similarity index 59% rename from persistence/repository/SortOption_test.go rename to badorm/SortOption_test.go index 89eba6c7..8078e1ff 100644 --- a/persistence/repository/SortOption_test.go +++ b/badorm/SortOption_test.go @@ -1,14 +1,14 @@ -package repository_test +package badorm_test import ( "testing" - "github.com/ditrit/badaas/persistence/repository" + "github.com/ditrit/badaas/badorm" "github.com/stretchr/testify/assert" ) func TestNewSortOption(t *testing.T) { - sortOption := repository.NewSortOption("a", true) + sortOption := badorm.NewSortOption("a", true) assert.Equal(t, "a", sortOption.Column()) assert.True(t, sortOption.Desc()) } diff --git a/badorm/autoMigrate.go b/badorm/autoMigrate.go new file mode 100644 index 00000000..87a8cc12 --- /dev/null +++ b/badorm/autoMigrate.go @@ -0,0 +1,17 @@ +package badorm + +import ( + "go.uber.org/zap" + "gorm.io/gorm" +) + +func autoMigrate(listOfTables []any, db *gorm.DB, logger *zap.Logger) error { + err := db.AutoMigrate(listOfTables...) + if err != nil { + logger.Error("migration failed") + return err + } + + logger.Info("AutoMigration was executed successfully") + return nil +} diff --git a/persistence/repository/CRUDRepositoryImpl.go b/badorm/crudRepository.go similarity index 88% rename from persistence/repository/CRUDRepositoryImpl.go rename to badorm/crudRepository.go index 666389be..4b84b896 100644 --- a/persistence/repository/CRUDRepositoryImpl.go +++ b/badorm/crudRepository.go @@ -1,34 +1,56 @@ -package repository +package badorm import ( "errors" "fmt" "github.com/Masterminds/squirrel" + "github.com/ditrit/badaas/badorm/pagination" + "github.com/ditrit/badaas/badorm/tabler" "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/pagination" "github.com/gertd/go-pluralize" + "github.com/google/uuid" "go.uber.org/zap" "golang.org/x/exp/maps" "gorm.io/gorm" "gorm.io/gorm/clause" ) +type BadaasID interface { + int | uuid.UUID +} + +// Generic CRUD Repository +type CRUDRepository[T tabler.Tabler, ID BadaasID] interface { + // create + Create(tx *gorm.DB, entity *T) error + // read + GetByID(tx *gorm.DB, id ID) (*T, error) + Get(tx *gorm.DB, conditions map[string]any) (*T, error) + GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) + GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) + GetAll(tx *gorm.DB) ([]*T, error) + Find(tx *gorm.DB, filters squirrel.Sqlizer, pagination pagination.Paginator, sort SortOption) (*pagination.Page[T], error) + // update + Save(tx *gorm.DB, entity *T) error + // delete + Delete(tx *gorm.DB, entity *T) error +} + var ( ErrMoreThanOneObjectFound = errors.New("found more that one object that meet the requested conditions") ErrObjectNotFound = errors.New("no object exists that meets the requested conditions") ) // Implementation of the Generic CRUD Repository -type CRUDRepositoryImpl[T models.Tabler, ID BadaasID] struct { +type CRUDRepositoryImpl[T tabler.Tabler, ID BadaasID] struct { CRUDRepository[T, ID] logger *zap.Logger paginationConfiguration configuration.PaginationConfiguration } // Constructor of the Generic CRUD Repository -func NewCRUDRepository[T models.Tabler, ID BadaasID]( +func NewCRUDRepository[T tabler.Tabler, ID BadaasID]( logger *zap.Logger, paginationConfiguration configuration.PaginationConfiguration, ) CRUDRepository[T, ID] { diff --git a/services/crud.go b/badorm/crudService.go similarity index 89% rename from services/crud.go rename to badorm/crudService.go index b0df1f94..31a0d0dd 100644 --- a/services/crud.go +++ b/badorm/crudService.go @@ -1,15 +1,15 @@ -package services +package badorm import ( + "github.com/ditrit/badaas/badorm/tabler" "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/repository" "github.com/google/uuid" "github.com/mitchellh/mapstructure" "go.uber.org/zap" "gorm.io/gorm" ) -type CRUDService[T models.Tabler, ID repository.BadaasID] interface { +type CRUDService[T tabler.Tabler, ID BadaasID] interface { GetEntity(id ID) (*T, error) GetEntities(conditions map[string]any) ([]*T, error) CreateEntity(attributeValues map[string]any) (*T, error) @@ -21,17 +21,17 @@ type CRUDService[T models.Tabler, ID repository.BadaasID] interface { var _ CRUDService[models.User, uuid.UUID] = (*crudServiceImpl[models.User, uuid.UUID])(nil) // Implementation of the Generic CRUD Repository -type crudServiceImpl[T models.Tabler, ID repository.BadaasID] struct { +type crudServiceImpl[T tabler.Tabler, ID BadaasID] struct { CRUDService[T, ID] logger *zap.Logger db *gorm.DB - repository repository.CRUDRepository[T, ID] + repository CRUDRepository[T, ID] } -func NewCRUDService[T models.Tabler, ID repository.BadaasID]( +func NewCRUDService[T tabler.Tabler, ID BadaasID]( logger *zap.Logger, db *gorm.DB, - repository repository.CRUDRepository[T, ID], + repository CRUDRepository[T, ID], ) CRUDService[T, ID] { return &crudServiceImpl[T, ID]{ logger: logger, diff --git a/persistence/pagination/Page.go b/badorm/pagination/Page.go similarity index 86% rename from persistence/pagination/Page.go rename to badorm/pagination/Page.go index 2d76a050..94bdae2b 100644 --- a/persistence/pagination/Page.go +++ b/badorm/pagination/Page.go @@ -1,9 +1,11 @@ package pagination -import "github.com/ditrit/badaas/persistence/models" +import ( + "github.com/ditrit/badaas/badorm/tabler" +) // A page hold ressources and data regarding the pagination -type Page[T models.Tabler] struct { +type Page[T tabler.Tabler] struct { Ressources []*T `json:"ressources"` // max d'element par page Limit uint `json:"limit"` @@ -21,7 +23,7 @@ type Page[T models.Tabler] struct { } // Create a new page -func NewPage[T models.Tabler](records []*T, offset, size, nbElemTotal uint) *Page[T] { +func NewPage[T tabler.Tabler](records []*T, offset, size, nbElemTotal uint) *Page[T] { nbPage := nbElemTotal / size p := Page[T]{ Ressources: records, diff --git a/persistence/pagination/Page_test.go b/badorm/pagination/Page_test.go similarity index 98% rename from persistence/pagination/Page_test.go rename to badorm/pagination/Page_test.go index 999e5201..f46b49f8 100644 --- a/persistence/pagination/Page_test.go +++ b/badorm/pagination/Page_test.go @@ -3,7 +3,7 @@ package pagination_test import ( "testing" - "github.com/ditrit/badaas/persistence/pagination" + "github.com/ditrit/badaas/badorm/pagination" "github.com/stretchr/testify/assert" ) diff --git a/persistence/pagination/Paginator.go b/badorm/pagination/Paginator.go similarity index 100% rename from persistence/pagination/Paginator.go rename to badorm/pagination/Paginator.go diff --git a/persistence/pagination/Paginator_test.go b/badorm/pagination/Paginator_test.go similarity index 91% rename from persistence/pagination/Paginator_test.go rename to badorm/pagination/Paginator_test.go index 8fc58329..a2b6137f 100644 --- a/persistence/pagination/Paginator_test.go +++ b/badorm/pagination/Paginator_test.go @@ -3,7 +3,7 @@ package pagination_test import ( "testing" - "github.com/ditrit/badaas/persistence/pagination" + "github.com/ditrit/badaas/badorm/pagination" "github.com/stretchr/testify/assert" ) diff --git a/persistence/models/Tabler.go b/badorm/tabler/Tabler.go similarity index 65% rename from persistence/models/Tabler.go rename to badorm/tabler/Tabler.go index 4c31f112..4a33064b 100644 --- a/persistence/models/Tabler.go +++ b/badorm/tabler/Tabler.go @@ -1,6 +1,7 @@ -package models +package tabler // The interface "type" need to implement to be considered models +// TODO ver esto y los nombres de tabla que pone gorm type Tabler interface { // pluralized name TableName() string diff --git a/controllers/basicAuth.go b/controllers/basicAuth.go index c701c739..5e87e9f1 100644 --- a/controllers/basicAuth.go +++ b/controllers/basicAuth.go @@ -6,9 +6,9 @@ import ( "net/http" "time" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models/dto" - "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" "go.uber.org/zap" @@ -57,7 +57,7 @@ func (basicAuthController *basicAuthenticationController) BasicLoginHandler(w ht user, err := basicAuthController.userService.GetUser(loginJSONStruct) if err != nil { - if errors.Is(err, repository.ErrObjectNotFound) { + if errors.Is(err, badorm.ErrObjectNotFound) { return nil, httperrors.NewErrorNotFound( "user", fmt.Sprintf("no user found with email %q", loginJSONStruct.Email), diff --git a/controllers/crud.go b/controllers/crud.go index 90c9a3f0..6214dff0 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -6,9 +6,10 @@ import ( "net/http" "strings" + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/tabler" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/services" "github.com/elliotchance/pie/v2" "github.com/google/uuid" "github.com/gorilla/mux" @@ -34,9 +35,9 @@ type CRUDRoute struct { Controller CRUDController } -func NewCRUDController[T models.Tabler]( +func NewCRUDController[T tabler.Tabler]( logger *zap.Logger, - crudService services.CRUDService[T, uuid.UUID], + crudService badorm.CRUDService[T, uuid.UUID], ) CRUDRoute { fullTypeName := strings.ToLower(fmt.Sprintf("%T", *new(T))) // remove the package name of the type @@ -53,9 +54,9 @@ func NewCRUDController[T models.Tabler]( } // The concrete implementation of the EAVController -type crudControllerImpl[T models.Tabler] struct { +type crudControllerImpl[T tabler.Tabler] struct { logger *zap.Logger - crudService services.CRUDService[T, uuid.UUID] + crudService badorm.CRUDService[T, uuid.UUID] } // The handler responsible of the retrieval of one objects diff --git a/mocks/persistence/repository/BadaasID.go b/mocks/badorm/BadaasID.go similarity index 100% rename from mocks/persistence/repository/BadaasID.go rename to mocks/badorm/BadaasID.go diff --git a/mocks/persistence/repository/CRUDRepository.go b/mocks/badorm/CRUDRepository.go similarity index 88% rename from mocks/persistence/repository/CRUDRepository.go rename to mocks/badorm/CRUDRepository.go index 7a771570..3cbccb91 100644 --- a/mocks/persistence/repository/CRUDRepository.go +++ b/mocks/badorm/CRUDRepository.go @@ -3,19 +3,20 @@ package mocks import ( - models "github.com/ditrit/badaas/persistence/models" - mock "github.com/stretchr/testify/mock" + badorm "github.com/ditrit/badaas/badorm" gorm "gorm.io/gorm" - pagination "github.com/ditrit/badaas/persistence/pagination" + mock "github.com/stretchr/testify/mock" - repository "github.com/ditrit/badaas/persistence/repository" + pagination "github.com/ditrit/badaas/badorm/pagination" squirrel "github.com/Masterminds/squirrel" + + tabler "github.com/ditrit/badaas/badorm/tabler" ) // CRUDRepository is an autogenerated mock type for the CRUDRepository type -type CRUDRepository[T models.Tabler, ID repository.BadaasID] struct { +type CRUDRepository[T tabler.Tabler, ID badorm.BadaasID] struct { mock.Mock } @@ -48,15 +49,15 @@ func (_m *CRUDRepository[T, ID]) Delete(tx *gorm.DB, entity *T) error { } // Find provides a mock function with given fields: tx, filters, _a2, sort -func (_m *CRUDRepository[T, ID]) Find(tx *gorm.DB, filters squirrel.Sqlizer, _a2 pagination.Paginator, sort repository.SortOption) (*pagination.Page[T], error) { +func (_m *CRUDRepository[T, ID]) Find(tx *gorm.DB, filters squirrel.Sqlizer, _a2 pagination.Paginator, sort badorm.SortOption) (*pagination.Page[T], error) { ret := _m.Called(tx, filters, _a2, sort) var r0 *pagination.Page[T] var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, repository.SortOption) (*pagination.Page[T], error)); ok { + if rf, ok := ret.Get(0).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, badorm.SortOption) (*pagination.Page[T], error)); ok { return rf(tx, filters, _a2, sort) } - if rf, ok := ret.Get(0).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, repository.SortOption) *pagination.Page[T]); ok { + if rf, ok := ret.Get(0).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, badorm.SortOption) *pagination.Page[T]); ok { r0 = rf(tx, filters, _a2, sort) } else { if ret.Get(0) != nil { @@ -64,7 +65,7 @@ func (_m *CRUDRepository[T, ID]) Find(tx *gorm.DB, filters squirrel.Sqlizer, _a2 } } - if rf, ok := ret.Get(1).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, repository.SortOption) error); ok { + if rf, ok := ret.Get(1).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, badorm.SortOption) error); ok { r1 = rf(tx, filters, _a2, sort) } else { r1 = ret.Error(1) @@ -223,7 +224,7 @@ type mockConstructorTestingTNewCRUDRepository interface { } // NewCRUDRepository creates a new instance of CRUDRepository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDRepository[T models.Tabler, ID repository.BadaasID](t mockConstructorTestingTNewCRUDRepository) *CRUDRepository[T, ID] { +func NewCRUDRepository[T tabler.Tabler, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDRepository) *CRUDRepository[T, ID] { mock := &CRUDRepository[T, ID]{} mock.Mock.Test(t) diff --git a/mocks/services/CRUDService.go b/mocks/badorm/CRUDService.go similarity index 91% rename from mocks/services/CRUDService.go rename to mocks/badorm/CRUDService.go index 38b684af..f87df45f 100644 --- a/mocks/services/CRUDService.go +++ b/mocks/badorm/CRUDService.go @@ -3,14 +3,14 @@ package mocks import ( - models "github.com/ditrit/badaas/persistence/models" + badorm "github.com/ditrit/badaas/badorm" mock "github.com/stretchr/testify/mock" - repository "github.com/ditrit/badaas/persistence/repository" + tabler "github.com/ditrit/badaas/badorm/tabler" ) // CRUDService is an autogenerated mock type for the CRUDService type -type CRUDService[T models.Tabler, ID repository.BadaasID] struct { +type CRUDService[T tabler.Tabler, ID badorm.BadaasID] struct { mock.Mock } @@ -138,7 +138,7 @@ type mockConstructorTestingTNewCRUDService interface { } // NewCRUDService creates a new instance of CRUDService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDService[T models.Tabler, ID repository.BadaasID](t mockConstructorTestingTNewCRUDService) *CRUDService[T, ID] { +func NewCRUDService[T tabler.Tabler, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDService) *CRUDService[T, ID] { mock := &CRUDService[T, ID]{} mock.Mock.Test(t) diff --git a/mocks/persistence/repository/SortOption.go b/mocks/badorm/SortOption.go similarity index 100% rename from mocks/persistence/repository/SortOption.go rename to mocks/badorm/SortOption.go diff --git a/mocks/persistence/pagination/Paginator.go b/mocks/badorm/pagination/Paginator.go similarity index 100% rename from mocks/persistence/pagination/Paginator.go rename to mocks/badorm/pagination/Paginator.go diff --git a/mocks/badorm/tabler/Tabler.go b/mocks/badorm/tabler/Tabler.go new file mode 100644 index 00000000..6a50e56e --- /dev/null +++ b/mocks/badorm/tabler/Tabler.go @@ -0,0 +1,39 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// Tabler is an autogenerated mock type for the Tabler type +type Tabler struct { + mock.Mock +} + +// TableName provides a mock function with given fields: +func (_m *Tabler) TableName() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +type mockConstructorTestingTNewTabler interface { + mock.TestingT + Cleanup(func()) +} + +// NewTabler creates a new instance of Tabler. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewTabler(t mockConstructorTestingTNewTabler) *Tabler { + mock := &Tabler{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/persistence/ModuleFx.go b/persistence/ModuleFx.go index 0abbf6d3..bca155d3 100644 --- a/persistence/ModuleFx.go +++ b/persistence/ModuleFx.go @@ -1,6 +1,7 @@ package persistence import ( + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/gormdatabase" "go.uber.org/fx" ) @@ -10,25 +11,11 @@ import ( // Provides: // // - The database connection +// - BaDORM var PersistanceModule = fx.Module( "persistence", // Database connection - fx.Provide( - fx.Annotate( - gormdatabase.SetupDatabaseConnection, - fx.ParamTags(`group:"modelTables"`), - ), - ), + fx.Provide(gormdatabase.SetupDatabaseConnection), + // activate BaDORM + badorm.BaDORMModule, ) - -type AddModelResult struct { - fx.Out - - Model any `group:"modelTables"` -} - -func AddModel[T any]() AddModelResult { - return AddModelResult{ - Model: *new(T), - } -} diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index 1bfdc0c0..dae21ba9 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -33,28 +33,9 @@ func createDsn(host, username, password, sslmode, dbname string, port int) strin // Creates the database object with using the database configuration and exec the setup func SetupDatabaseConnection( - listOfTables []any, logger *zap.Logger, databaseConfiguration configuration.DatabaseConfiguration, ) (*gorm.DB, error) { - db, err := CreateDatabaseConnectionFromConfiguration(logger, databaseConfiguration) - if err != nil { - return nil, err - } - - err = db.AutoMigrate(listOfTables...) - if err != nil { - logger.Error("migration failed") - return nil, err - } - logger.Info("AutoMigration was executed successfully") - - return db, nil -} - -// Creates the database object with using the database configuration -// Should not be using directly -func CreateDatabaseConnectionFromConfiguration(logger *zap.Logger, databaseConfiguration configuration.DatabaseConfiguration) (*gorm.DB, error) { dsn := createDsnFromConf(databaseConfiguration) var err error var database *gorm.DB diff --git a/persistence/repository/CRUDRepository.go b/persistence/repository/CRUDRepository.go deleted file mode 100644 index 039762e6..00000000 --- a/persistence/repository/CRUDRepository.go +++ /dev/null @@ -1,30 +0,0 @@ -package repository - -import ( - "github.com/Masterminds/squirrel" - "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/pagination" - "github.com/google/uuid" - "gorm.io/gorm" -) - -type BadaasID interface { - int | uuid.UUID -} - -// Generic CRUD Repository -type CRUDRepository[T models.Tabler, ID BadaasID] interface { - // create - Create(tx *gorm.DB, entity *T) error - // read - GetByID(tx *gorm.DB, id ID) (*T, error) - Get(tx *gorm.DB, conditions map[string]any) (*T, error) - GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) - GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) - GetAll(tx *gorm.DB) ([]*T, error) - Find(tx *gorm.DB, filters squirrel.Sqlizer, pagination pagination.Paginator, sort SortOption) (*pagination.Page[T], error) - // update - Save(tx *gorm.DB, entity *T) error - // delete - Delete(tx *gorm.DB, entity *T) error -} diff --git a/router/ModuleFx.go b/router/ModuleFx.go index 71833769..2d98f9c2 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -3,10 +3,12 @@ package router import ( "fmt" + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/tabler" "github.com/ditrit/badaas/controllers" - "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/router/middlewares" "github.com/ditrit/badaas/services" + "github.com/google/uuid" "go.uber.org/fx" ) @@ -69,12 +71,12 @@ var EAVRoutesModule = fx.Module( ), ) -func GetCRUDRoutesModule[T models.Tabler]() fx.Option { +func GetCRUDRoutesModule[T tabler.Tabler]() fx.Option { typeName := fmt.Sprintf("%T", *new(T)) return fx.Module( typeName+"CRUDRoutesModule", // service - services.GetCRUDServiceModule[T](), + badorm.GetCRUDServiceModule[T, uuid.UUID](), // controller fx.Provide( diff --git a/services/ModuleFx.go b/services/ModuleFx.go index 2f4981ed..73b6e389 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -1,9 +1,7 @@ package services import ( - "fmt" - - "github.com/ditrit/badaas/persistence" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/sessionservice" @@ -15,11 +13,11 @@ import ( var AuthServiceModule = fx.Module( "authService", // models - fx.Provide(persistence.AddModel[models.User]), - fx.Provide(persistence.AddModel[models.Session]), + fx.Provide(badorm.AddModel[models.User]), + fx.Provide(badorm.AddModel[models.Session]), // repositories - fx.Provide(repository.NewCRUDRepository[models.Session, uuid.UUID]), - fx.Provide(repository.NewCRUDRepository[models.User, uuid.UUID]), + fx.Provide(badorm.NewCRUDRepository[models.Session, uuid.UUID]), + fx.Provide(badorm.NewCRUDRepository[models.User, uuid.UUID]), // services fx.Provide(userservice.NewUserService), @@ -29,10 +27,10 @@ var AuthServiceModule = fx.Module( var EAVServiceModule = fx.Module( "eavService", // models - fx.Provide(persistence.AddModel[models.EntityType]), - fx.Provide(persistence.AddModel[models.Entity]), - fx.Provide(persistence.AddModel[models.Value]), - fx.Provide(persistence.AddModel[models.Attribute]), + fx.Provide(badorm.AddModel[models.EntityType]), + fx.Provide(badorm.AddModel[models.Entity]), + fx.Provide(badorm.AddModel[models.Value]), + fx.Provide(badorm.AddModel[models.Attribute]), // repositories fx.Provide(repository.NewValueRepository), fx.Provide(repository.NewEntityRepository), @@ -41,18 +39,3 @@ var EAVServiceModule = fx.Module( // service fx.Provide(NewEAVService), ) - -func GetCRUDServiceModule[T models.Tabler]() fx.Option { - return fx.Module( - fmt.Sprintf( - "%TCRUDServiceModule", - *new(T), - ), - // models - fx.Provide(persistence.AddModel[T]), - // repository - fx.Provide(repository.NewCRUDRepository[T, uuid.UUID]), - // service - fx.Provide(NewCRUDService[T, uuid.UUID]), - ) -} diff --git a/services/sessionservice/session.go b/services/sessionservice/session.go index f3a13307..c7548478 100644 --- a/services/sessionservice/session.go +++ b/services/sessionservice/session.go @@ -5,10 +5,10 @@ import ( "sync" "time" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/repository" "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" @@ -36,7 +36,7 @@ var _ SessionService = (*sessionServiceImpl)(nil) // The SessionService concrete interface type sessionServiceImpl struct { - sessionRepository repository.CRUDRepository[models.Session, uuid.UUID] + sessionRepository badorm.CRUDRepository[models.Session, uuid.UUID] cache map[uuid.UUID]*models.Session mutex sync.Mutex logger *zap.Logger @@ -47,7 +47,7 @@ type sessionServiceImpl struct { // The SessionService constructor func NewSessionService( logger *zap.Logger, - sessionRepository repository.CRUDRepository[models.Session, uuid.UUID], + sessionRepository badorm.CRUDRepository[models.Session, uuid.UUID], sessionConfiguration configuration.SessionConfiguration, db *gorm.DB, ) SessionService { diff --git a/services/sessionservice/session_test.go b/services/sessionservice/session_test.go index 1c34bd04..fb31d83e 100644 --- a/services/sessionservice/session_test.go +++ b/services/sessionservice/session_test.go @@ -6,8 +6,8 @@ import ( "time" "github.com/ditrit/badaas/httperrors" + badormMocks "github.com/ditrit/badaas/mocks/badorm" configurationMocks "github.com/ditrit/badaas/mocks/configuration" - repositoryMocks "github.com/ditrit/badaas/mocks/persistence/repository" "github.com/ditrit/badaas/persistence/models" "github.com/google/uuid" "github.com/stretchr/testify/assert" @@ -25,14 +25,14 @@ var gormDB *gorm.DB func setupTest( t *testing.T, ) ( - *repositoryMocks.CRUDRepository[models.Session, uuid.UUID], + *badormMocks.CRUDRepository[models.Session, uuid.UUID], *sessionServiceImpl, *observer.ObservedLogs, *configurationMocks.SessionConfiguration, ) { core, logs := observer.New(zap.DebugLevel) logger := zap.New(core) - sessionRepositoryMock := repositoryMocks.NewCRUDRepository[models.Session, uuid.UUID](t) + sessionRepositoryMock := badormMocks.NewCRUDRepository[models.Session, uuid.UUID](t) sessionConfiguration := configurationMocks.NewSessionConfiguration(t) service := &sessionServiceImpl{ sessionRepository: sessionRepositoryMock, diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index 4b8a2ed0..72faad37 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -4,9 +4,9 @@ import ( "errors" "fmt" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" - "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/auth/protocols/basicauth" validator "github.com/ditrit/badaas/validators" "github.com/google/uuid" @@ -29,7 +29,7 @@ var _ UserService = (*userServiceImpl)(nil) // The UserService concrete implementation type userServiceImpl struct { - userRepository repository.CRUDRepository[models.User, uuid.UUID] + userRepository badorm.CRUDRepository[models.User, uuid.UUID] logger *zap.Logger db *gorm.DB } @@ -37,7 +37,7 @@ type userServiceImpl struct { // UserService constructor func NewUserService( logger *zap.Logger, - userRepository repository.CRUDRepository[models.User, uuid.UUID], + userRepository badorm.CRUDRepository[models.User, uuid.UUID], db *gorm.DB, ) UserService { return &userServiceImpl{ diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index 2bbf0e7e..009d92e8 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -4,10 +4,10 @@ import ( "errors" "testing" - repositoryMocks "github.com/ditrit/badaas/mocks/persistence/repository" + "github.com/ditrit/badaas/badorm" + badormMocks "github.com/ditrit/badaas/mocks/badorm" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" - "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/userservice" "github.com/google/uuid" "github.com/stretchr/testify/assert" @@ -26,7 +26,7 @@ func TestNewUserService(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) userRepositoryMock.On("Create", gormDB, mock.Anything).Return(nil) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) @@ -53,7 +53,7 @@ func TestNewUserServiceDatabaseError(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) userRepositoryMock.On( "Create", gormDB, mock.Anything, ).Return( @@ -73,7 +73,7 @@ func TestNewUserServiceEmailNotValid(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) user, err := userService.NewUser("bob", "bob@", "1234") @@ -89,7 +89,7 @@ func TestGetUser(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) userRepositoryMock.On( "Create", gormDB, mock.Anything, @@ -124,13 +124,13 @@ func TestGetUserNoUserFound(t *testing.T) { observedZapCore, _ := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) userRepositoryMock.On( "Get", gormDB, map[string]any{"email": "bobnotfound@email.com"}, ).Return( nil, - repository.ErrObjectNotFound, + badorm.ErrObjectNotFound, ) userFound, err := userService.GetUser(dto.UserLoginDTO{Email: "bobnotfound@email.com", Password: "1234"}) @@ -144,7 +144,7 @@ func TestGetUserWrongPassword(t *testing.T) { observedZapCore, _ := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := repositoryMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) userRepositoryMock.On( "Create", gormDB, mock.Anything, ).Return(nil) diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index 2902ead6..da7a4579 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -50,7 +50,7 @@ func TestMain(_ *testing.M) { viper.Set(configuration.DatabaseSslmodeKey, "disable") viper.Set(configuration.DatabaseRetryKey, 10) viper.Set(configuration.DatabaseRetryDurationKey, 5) - db, err = gormdatabase.CreateDatabaseConnectionFromConfiguration( + db, err = gormdatabase.SetupDatabaseConnection( logger, configuration.NewDatabaseConfiguration(), ) @@ -64,6 +64,9 @@ func TestMain(_ *testing.M) { Options: &opts, }.Run() + // let db cleaned + integrationtests.CleanDBTables(db, ListOfTables) + os.Exit(status) } diff --git a/test_integration/crudservice.go b/test_integration/crudService.go similarity index 97% rename from test_integration/crudservice.go rename to test_integration/crudService.go index 09650bee..7b8763d3 100644 --- a/test_integration/crudservice.go +++ b/test_integration/crudService.go @@ -1,8 +1,8 @@ package integrationtests import ( + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/services" "github.com/google/uuid" "github.com/stretchr/testify/suite" "go.uber.org/zap" @@ -72,15 +72,15 @@ type CRUDServiceIntTestSuite struct { suite.Suite logger *zap.Logger db *gorm.DB - crudProductService services.CRUDService[Product, uuid.UUID] - crudSaleService services.CRUDService[Sale, uuid.UUID] + crudProductService badorm.CRUDService[Product, uuid.UUID] + crudSaleService badorm.CRUDService[Sale, uuid.UUID] } func NewCRUDServiceIntTestSuite( logger *zap.Logger, db *gorm.DB, - crudProductService services.CRUDService[Product, uuid.UUID], - crudSaleService services.CRUDService[Sale, uuid.UUID], + crudProductService badorm.CRUDService[Product, uuid.UUID], + crudSaleService badorm.CRUDService[Sale, uuid.UUID], ) *CRUDServiceIntTestSuite { return &CRUDServiceIntTestSuite{ logger: logger, diff --git a/test_integration/eavservice.go b/test_integration/eavService.go similarity index 100% rename from test_integration/eavservice.go rename to test_integration/eavService.go diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index 1d1c23f0..1f82dd0d 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -7,15 +7,17 @@ import ( "testing" "github.com/ditrit/badaas" - "github.com/ditrit/badaas/persistence" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/services" "github.com/ditrit/verdeter" + "github.com/google/uuid" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/stretchr/testify/suite" "go.uber.org/fx" "go.uber.org/fx/fxevent" "go.uber.org/zap" + "gorm.io/gorm" ) var tGlobal *testing.T @@ -53,10 +55,10 @@ func injectDependencies(cmd *cobra.Command, args []string) { services.EAVServiceModule, fx.Provide(NewEAVServiceIntTestSuite), - fx.Provide(persistence.AddModel[Company]), - fx.Provide(persistence.AddModel[Seller]), - services.GetCRUDServiceModule[Product](), - services.GetCRUDServiceModule[Sale](), + fx.Provide(badorm.AddModel[Company]), + fx.Provide(badorm.AddModel[Seller]), + badorm.GetCRUDServiceModule[Product, uuid.UUID](), + badorm.GetCRUDServiceModule[Sale, uuid.UUID](), fx.Provide(NewCRUDServiceIntTestSuite), fx.Invoke(runTestSuites), @@ -66,9 +68,13 @@ func injectDependencies(cmd *cobra.Command, args []string) { func runTestSuites( ts1 *EAVServiceIntTestSuite, ts2 *CRUDServiceIntTestSuite, + db *gorm.DB, shutdowner fx.Shutdowner, ) { suite.Run(tGlobal, ts1) suite.Run(tGlobal, ts2) + + // let db cleaned + CleanDB(db) shutdowner.Shutdown() } From 42dff10ea08de0839d958c436e223a1abcc77d5b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 12 May 2023 10:33:53 +0200 Subject: [PATCH 152/467] add unique index to entity-attibute of a value --- persistence/models/Value.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence/models/Value.go b/persistence/models/Value.go index e14724fc..a89ac34e 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -18,8 +18,8 @@ type Value struct { RelationVal uuid.UUID `gorm:"type:uuid;foreignKey:Entity;index:fk_relation_val_entity"` // GORM relations - EntityID uuid.UUID - AttributeID uuid.UUID + EntityID uuid.UUID `gorm:"uniqueIndex:unique_entity_attribute"` + AttributeID uuid.UUID `gorm:"uniqueIndex:unique_entity_attribute"` Attribute *Attribute } From b67eb5240d69b16922c8efd18e452d6395d32ce6 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 12 May 2023 11:16:29 +0200 Subject: [PATCH 153/467] remove neccesity to implement tabler --- badorm/ModuleFx.go | 3 +-- badorm/crudRepository.go | 29 +++++++++++++++++++--------- badorm/crudService.go | 7 +++---- badorm/pagination/Page.go | 8 ++------ badorm/tabler/Tabler.go | 8 -------- controllers/crud.go | 5 ++--- go.mod | 2 +- mocks/badorm/CRUDRepository.go | 6 ++---- mocks/badorm/CRUDService.go | 6 ++---- router/ModuleFx.go | 3 +-- test_integration/crudService.go | 16 --------------- test_integration/integration_test.go | 8 ++++---- 12 files changed, 38 insertions(+), 63 deletions(-) delete mode 100644 badorm/tabler/Tabler.go diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index 079562a2..9bdaf82f 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -3,7 +3,6 @@ package badorm import ( "fmt" - "github.com/ditrit/badaas/badorm/tabler" "go.uber.org/fx" ) @@ -17,7 +16,7 @@ var BaDORMModule = fx.Module( ), ) -func GetCRUDServiceModule[T tabler.Tabler, ID BadaasID]() fx.Option { +func GetCRUDServiceModule[T any, ID BadaasID]() fx.Option { return fx.Module( fmt.Sprintf( "%TCRUDServiceModule", diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 4b84b896..17653a7d 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -3,17 +3,17 @@ package badorm import ( "errors" "fmt" + "sync" "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/badorm/pagination" - "github.com/ditrit/badaas/badorm/tabler" "github.com/ditrit/badaas/configuration" "github.com/gertd/go-pluralize" "github.com/google/uuid" "go.uber.org/zap" - "golang.org/x/exp/maps" "gorm.io/gorm" "gorm.io/gorm/clause" + "gorm.io/gorm/schema" ) type BadaasID interface { @@ -21,7 +21,7 @@ type BadaasID interface { } // Generic CRUD Repository -type CRUDRepository[T tabler.Tabler, ID BadaasID] interface { +type CRUDRepository[T any, ID BadaasID] interface { // create Create(tx *gorm.DB, entity *T) error // read @@ -43,14 +43,14 @@ var ( ) // Implementation of the Generic CRUD Repository -type CRUDRepositoryImpl[T tabler.Tabler, ID BadaasID] struct { +type CRUDRepositoryImpl[T any, ID BadaasID] struct { CRUDRepository[T, ID] logger *zap.Logger paginationConfiguration configuration.PaginationConfiguration } // Constructor of the Generic CRUD Repository -func NewCRUDRepository[T tabler.Tabler, ID BadaasID]( +func NewCRUDRepository[T any, ID BadaasID]( logger *zap.Logger, paginationConfiguration configuration.PaginationConfiguration, ) CRUDRepository[T, ID] { @@ -151,7 +151,16 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions var entity T // only entities that match the conditions for joinAttributeName, joinConditions := range joinConditions { - err := repository.addJoinToQuery(query, entity.TableName(), joinAttributeName, joinConditions) + schemaName, err := schema.Parse(entity, &sync.Map{}, tx.NamingStrategy) + if err != nil { + return nil, err + } + err = repository.addJoinToQuery( + query, + schemaName.Table, + joinAttributeName, + joinConditions, + ) if err != nil { return nil, err } @@ -191,7 +200,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( } pluralize := pluralize.NewClient() - // TODO me gustaria poder no hacer esto, en caso de que hayan difinido otra cosa + // TODO poder no hacer esto, en caso de que hayan difinido otra cosa tableName := pluralize.Plural(joinAttributeName) // TODO creo que deberia ser al revez tableWithSuffix := tableName + "_" + previousTable @@ -208,15 +217,17 @@ func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( // TODO ver que pase si attributeName no existe como tabla ) - for _, attributeName := range maps.Keys(thisEntityConditions) { + conditionsValues := []any{} + for attributeName, conditionValue := range thisEntityConditions { stringQuery += fmt.Sprintf( `AND %[1]s.%[2]s = ? `, tableWithSuffix, attributeName, ) + conditionsValues = append(conditionsValues, conditionValue) } - query.Joins(stringQuery, maps.Values(thisEntityConditions)...) + query.Joins(stringQuery, conditionsValues...) // only entities that match the conditions // TODO codigo duplicado diff --git a/badorm/crudService.go b/badorm/crudService.go index 31a0d0dd..1be9c326 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -1,7 +1,6 @@ package badorm import ( - "github.com/ditrit/badaas/badorm/tabler" "github.com/ditrit/badaas/persistence/models" "github.com/google/uuid" "github.com/mitchellh/mapstructure" @@ -9,7 +8,7 @@ import ( "gorm.io/gorm" ) -type CRUDService[T tabler.Tabler, ID BadaasID] interface { +type CRUDService[T any, ID BadaasID] interface { GetEntity(id ID) (*T, error) GetEntities(conditions map[string]any) ([]*T, error) CreateEntity(attributeValues map[string]any) (*T, error) @@ -21,14 +20,14 @@ type CRUDService[T tabler.Tabler, ID BadaasID] interface { var _ CRUDService[models.User, uuid.UUID] = (*crudServiceImpl[models.User, uuid.UUID])(nil) // Implementation of the Generic CRUD Repository -type crudServiceImpl[T tabler.Tabler, ID BadaasID] struct { +type crudServiceImpl[T any, ID BadaasID] struct { CRUDService[T, ID] logger *zap.Logger db *gorm.DB repository CRUDRepository[T, ID] } -func NewCRUDService[T tabler.Tabler, ID BadaasID]( +func NewCRUDService[T any, ID BadaasID]( logger *zap.Logger, db *gorm.DB, repository CRUDRepository[T, ID], diff --git a/badorm/pagination/Page.go b/badorm/pagination/Page.go index 94bdae2b..c2c83402 100644 --- a/badorm/pagination/Page.go +++ b/badorm/pagination/Page.go @@ -1,11 +1,7 @@ package pagination -import ( - "github.com/ditrit/badaas/badorm/tabler" -) - // A page hold ressources and data regarding the pagination -type Page[T tabler.Tabler] struct { +type Page[T any] struct { Ressources []*T `json:"ressources"` // max d'element par page Limit uint `json:"limit"` @@ -23,7 +19,7 @@ type Page[T tabler.Tabler] struct { } // Create a new page -func NewPage[T tabler.Tabler](records []*T, offset, size, nbElemTotal uint) *Page[T] { +func NewPage[T any](records []*T, offset, size, nbElemTotal uint) *Page[T] { nbPage := nbElemTotal / size p := Page[T]{ Ressources: records, diff --git a/badorm/tabler/Tabler.go b/badorm/tabler/Tabler.go deleted file mode 100644 index 4a33064b..00000000 --- a/badorm/tabler/Tabler.go +++ /dev/null @@ -1,8 +0,0 @@ -package tabler - -// The interface "type" need to implement to be considered models -// TODO ver esto y los nombres de tabla que pone gorm -type Tabler interface { - // pluralized name - TableName() string -} diff --git a/controllers/crud.go b/controllers/crud.go index 6214dff0..a5f69e57 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -7,7 +7,6 @@ import ( "strings" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/tabler" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/elliotchance/pie/v2" @@ -35,7 +34,7 @@ type CRUDRoute struct { Controller CRUDController } -func NewCRUDController[T tabler.Tabler]( +func NewCRUDController[T any]( logger *zap.Logger, crudService badorm.CRUDService[T, uuid.UUID], ) CRUDRoute { @@ -54,7 +53,7 @@ func NewCRUDController[T tabler.Tabler]( } // The concrete implementation of the EAVController -type crudControllerImpl[T tabler.Tabler] struct { +type crudControllerImpl[T any] struct { logger *zap.Logger crudService badorm.CRUDService[T, uuid.UUID] } diff --git a/go.mod b/go.mod index 76b5dff3..a20a23dd 100644 --- a/go.mod +++ b/go.mod @@ -59,7 +59,7 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.15.0 // indirect go.uber.org/multierr v1.8.0 // indirect - golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 + golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect golang.org/x/sys v0.1.0 // indirect golang.org/x/text v0.4.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/mocks/badorm/CRUDRepository.go b/mocks/badorm/CRUDRepository.go index 3cbccb91..37428daa 100644 --- a/mocks/badorm/CRUDRepository.go +++ b/mocks/badorm/CRUDRepository.go @@ -11,12 +11,10 @@ import ( pagination "github.com/ditrit/badaas/badorm/pagination" squirrel "github.com/Masterminds/squirrel" - - tabler "github.com/ditrit/badaas/badorm/tabler" ) // CRUDRepository is an autogenerated mock type for the CRUDRepository type -type CRUDRepository[T tabler.Tabler, ID badorm.BadaasID] struct { +type CRUDRepository[T interface{}, ID badorm.BadaasID] struct { mock.Mock } @@ -224,7 +222,7 @@ type mockConstructorTestingTNewCRUDRepository interface { } // NewCRUDRepository creates a new instance of CRUDRepository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDRepository[T tabler.Tabler, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDRepository) *CRUDRepository[T, ID] { +func NewCRUDRepository[T interface{}, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDRepository) *CRUDRepository[T, ID] { mock := &CRUDRepository[T, ID]{} mock.Mock.Test(t) diff --git a/mocks/badorm/CRUDService.go b/mocks/badorm/CRUDService.go index f87df45f..a2da4c8c 100644 --- a/mocks/badorm/CRUDService.go +++ b/mocks/badorm/CRUDService.go @@ -5,12 +5,10 @@ package mocks import ( badorm "github.com/ditrit/badaas/badorm" mock "github.com/stretchr/testify/mock" - - tabler "github.com/ditrit/badaas/badorm/tabler" ) // CRUDService is an autogenerated mock type for the CRUDService type -type CRUDService[T tabler.Tabler, ID badorm.BadaasID] struct { +type CRUDService[T interface{}, ID badorm.BadaasID] struct { mock.Mock } @@ -138,7 +136,7 @@ type mockConstructorTestingTNewCRUDService interface { } // NewCRUDService creates a new instance of CRUDService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDService[T tabler.Tabler, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDService) *CRUDService[T, ID] { +func NewCRUDService[T interface{}, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDService) *CRUDService[T, ID] { mock := &CRUDService[T, ID]{} mock.Mock.Test(t) diff --git a/router/ModuleFx.go b/router/ModuleFx.go index 2d98f9c2..9ba0914f 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/tabler" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/router/middlewares" "github.com/ditrit/badaas/services" @@ -71,7 +70,7 @@ var EAVRoutesModule = fx.Module( ), ) -func GetCRUDRoutesModule[T tabler.Tabler]() fx.Option { +func GetCRUDRoutesModule[T any]() fx.Option { typeName := fmt.Sprintf("%T", *new(T)) return fx.Module( typeName+"CRUDRoutesModule", diff --git a/test_integration/crudService.go b/test_integration/crudService.go index 7b8763d3..4fc07872 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -44,22 +44,6 @@ type Sale struct { SellerID uuid.UUID } -func (Product) TableName() string { - return "products" -} - -func (Sale) TableName() string { - return "sales" -} - -func (Company) TableName() string { - return "companies" -} - -func (Seller) TableName() string { - return "sellers" -} - func (m Product) Equal(other Product) bool { return m.ID == other.ID } diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index 1f82dd0d..b097d869 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -66,13 +66,13 @@ func injectDependencies(cmd *cobra.Command, args []string) { } func runTestSuites( - ts1 *EAVServiceIntTestSuite, - ts2 *CRUDServiceIntTestSuite, + tsEAV *EAVServiceIntTestSuite, + tsCRUD *CRUDServiceIntTestSuite, db *gorm.DB, shutdowner fx.Shutdowner, ) { - suite.Run(tGlobal, ts1) - suite.Run(tGlobal, ts2) + suite.Run(tGlobal, tsEAV) + suite.Run(tGlobal, tsCRUD) // let db cleaned CleanDB(db) From 581d5d87634a28c17224391892142530a57f39df Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 12 May 2023 16:37:37 +0200 Subject: [PATCH 154/467] use correct table name for joins --- badorm/ModuleFx.go | 9 +- badorm/crudRepository.go | 133 ++++++++++-- go.mod | 1 - go.sum | 2 - test_integration/crudService.go | 294 ++++++++++++++++++++++++--- test_integration/integration_test.go | 7 +- test_integration/setup.go | 5 + 7 files changed, 401 insertions(+), 50 deletions(-) diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index 9bdaf82f..12288f58 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -2,6 +2,7 @@ package badorm import ( "fmt" + "reflect" "go.uber.org/fx" ) @@ -31,6 +32,8 @@ func GetCRUDServiceModule[T any, ID BadaasID]() fx.Option { ) } +var modelsMapping = map[string]reflect.Type{} + type AddModelResult struct { fx.Out @@ -38,7 +41,11 @@ type AddModelResult struct { } func AddModel[T any]() AddModelResult { + entity := *new(T) + entityType := reflect.TypeOf(entity) + modelsMapping[entityType.Name()] = entityType + return AddModelResult{ - Model: *new(T), + Model: entity, } } diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 17653a7d..7aa6020f 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -3,12 +3,12 @@ package badorm import ( "errors" "fmt" + "reflect" "sync" "github.com/Masterminds/squirrel" "github.com/ditrit/badaas/badorm/pagination" "github.com/ditrit/badaas/configuration" - "github.com/gertd/go-pluralize" "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" @@ -40,6 +40,12 @@ type CRUDRepository[T any, ID BadaasID] interface { var ( ErrMoreThanOneObjectFound = errors.New("found more that one object that meet the requested conditions") ErrObjectNotFound = errors.New("no object exists that meets the requested conditions") + ErrObjectsNotRelated = func(typeName, attributeName string) error { + return fmt.Errorf("%[1]s has not attribute named %[2]s or %[2]sID", typeName, attributeName) + } + ErrModelNotRegistered = func(typeName, attributeName string) error { + return fmt.Errorf("%[1]s has an attribute named %[2]s or %[2]sID but %[2]s is not registered as model (use AddModel)", typeName, attributeName) + } ) // Implementation of the Generic CRUD Repository @@ -148,16 +154,18 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions query := tx.Where(thisEntityConditions) - var entity T + entity := new(T) // only entities that match the conditions for joinAttributeName, joinConditions := range joinConditions { - schemaName, err := schema.Parse(entity, &sync.Map{}, tx.NamingStrategy) + tableName, err := getTableName(tx, entity) if err != nil { return nil, err } + err = repository.addJoinToQuery( query, - schemaName.Table, + entity, + tableName, joinAttributeName, joinConditions, ) @@ -173,6 +181,15 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions return entities, err } +func getTableName(db *gorm.DB, entity any) (string, error) { + schemaName, err := schema.Parse(entity, &sync.Map{}, db.NamingStrategy) + if err != nil { + return "", err + } + + return schemaName.Table, nil +} + func (repository *CRUDRepositoryImpl[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { return repository.GetMultiple(tx, map[string]any{}) } @@ -181,8 +198,12 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { // then, adds the verification that the values for the joined entity are "expectedValues" // "expectedValues" is in {"attributeName": expectedValue} format +// TODO support ManyToMany relations +// previousEntity is pointer func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( - query *gorm.DB, previousTable, joinAttributeName string, conditions map[string]any, + query *gorm.DB, previousEntity any, + previousTableName, joinAttributeName string, + conditions map[string]any, ) error { // TODO codigo duplicado thisEntityConditions := map[string]any{} @@ -199,23 +220,47 @@ func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( } } - pluralize := pluralize.NewClient() - // TODO poder no hacer esto, en caso de que hayan difinido otra cosa - tableName := pluralize.Plural(joinAttributeName) - // TODO creo que deberia ser al revez - tableWithSuffix := tableName + "_" + previousTable - stringQuery := fmt.Sprintf( - `JOIN %[1]s %[2]s ON - %[2]s.id = %[3]s.%[4]s_id - AND %[2]s.deleted_at IS NULL - `, - tableName, - tableWithSuffix, - previousTable, + relatedObject, relationIDIsInPreviousTable, err := getRelatedObject( + previousEntity, joinAttributeName, - // TODO que pasa si el atributo no existe - // TODO ver que pase si attributeName no existe como tabla ) + if err != nil { + return err + } + + joinTableName, err := getTableName(query, relatedObject) + if err != nil { + return err + } + + tableWithSuffix := joinTableName + "_" + previousTableName + + var stringQuery string + if relationIDIsInPreviousTable { + stringQuery = fmt.Sprintf( + `JOIN %[1]s %[2]s ON + %[2]s.id = %[3]s.%[4]s_id + AND %[2]s.deleted_at IS NULL + `, + joinTableName, + tableWithSuffix, + previousTableName, + joinAttributeName, + ) + } else { + // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) + previousAttribute := reflect.TypeOf(previousEntity).Elem().Name() + stringQuery = fmt.Sprintf( + `JOIN %[1]s %[2]s ON + %[2]s.%[4]s_id = %[3]s.id + AND %[2]s.deleted_at IS NULL + `, + joinTableName, + tableWithSuffix, + previousTableName, + previousAttribute, + ) + } conditionsValues := []any{} for attributeName, conditionValue := range thisEntityConditions { @@ -223,16 +268,22 @@ func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( `AND %[1]s.%[2]s = ? `, tableWithSuffix, attributeName, + // TODO que pasa si el atributo no existe ) conditionsValues = append(conditionsValues, conditionValue) } query.Joins(stringQuery, conditionsValues...) - // only entities that match the conditions // TODO codigo duplicado for joinAttributeName, joinConditions := range joinConditions { - err := repository.addJoinToQuery(query, tableWithSuffix, joinAttributeName, joinConditions) + err := repository.addJoinToQuery( + query, + relatedObject, + tableWithSuffix, + joinAttributeName, + joinConditions, + ) if err != nil { return err } @@ -241,6 +292,44 @@ func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( return nil } +// entity can be a pointer of not, now only works with pointer +func getRelatedObject(entity any, relationName string) (any, bool, error) { + entityType := reflect.TypeOf(entity) + + // entityType will be a pointer if the relation can be nullable + if entityType.Kind() == reflect.Pointer { + entityType = entityType.Elem() + } + + field, isPresent := entityType.FieldByName(relationName) + if !isPresent { + // some gorm relations dont have a direct relation in the model, only the id + return getRelatedObjectByID(entityType, relationName) + } + + _, isIDPresent := entityType.FieldByName(relationName + "ID") + + return createObject(field.Type), isIDPresent, nil +} + +func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, bool, error) { + _, isPresent := entityType.FieldByName(relationName + "ID") + if !isPresent { + return nil, false, ErrObjectsNotRelated(entityType.Name(), relationName) + } + + fieldType, isPresent := modelsMapping[relationName] + if !isPresent { + return nil, false, ErrModelNotRegistered(entityType.Name(), relationName) + } + + return createObject(fieldType), true, nil +} + +func createObject(entityType reflect.Type) any { + return reflect.New(entityType).Elem().Interface() +} + // Find entities of a Model func (repository *CRUDRepositoryImpl[T, ID]) Find( tx *gorm.DB, diff --git a/go.mod b/go.mod index a20a23dd..6646df1f 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,6 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/gertd/go-pluralize v0.2.1 github.com/google/go-cmp v0.5.9 // indirect github.com/goph/emperror v0.17.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect diff --git a/go.sum b/go.sum index ca39b114..2e8b9d51 100644 --- a/go.sum +++ b/go.sum @@ -83,8 +83,6 @@ github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/gertd/go-pluralize v0.2.1 h1:M3uASbVjMnTsPb0PNqg+E/24Vwigyo/tvyMTtAlLgiA= -github.com/gertd/go-pluralize v0.2.1/go.mod h1:rbYaKDbsXxmRfr8uygAEKhOWsjyrrqrkHVpZvoOp8zk= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= diff --git a/test_integration/crudService.go b/test_integration/crudService.go index 4fc07872..447a6c3c 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -13,7 +13,7 @@ type Company struct { models.BaseModel Name string - Sellers []Seller + Sellers []Seller // Company HasMany Sellers (Company 1 -> 0..* Seller) } type Product struct { @@ -29,19 +29,19 @@ type Seller struct { models.BaseModel Name string - CompanyID *uuid.UUID + CompanyID *uuid.UUID // Company HasMany Sellers (Company 1 -> 0..* Seller) } type Sale struct { models.BaseModel - // belongsTo Product - Product *Product + // Sale belongsTo Product (Sale 0..* -> 1 Product) + Product Product ProductID uuid.UUID - // belongsTo Seller + // Sale HasOne Seller (Sale 0..* -> 0..1 Seller) Seller *Seller - SellerID uuid.UUID + SellerID *uuid.UUID } func (m Product) Equal(other Product) bool { @@ -52,12 +52,78 @@ func (m Sale) Equal(other Sale) bool { return m.ID == other.ID } +func (m Seller) Equal(other Seller) bool { + return m.Name == other.Name +} + +type Country struct { + models.BaseModel + + Name string + Capital City // Country HasOne City (Country 1 -> 1 City) +} + +type City struct { + models.BaseModel + + Name string + CountryID uuid.UUID // Country HasOne City (Country 1 -> 1 City) +} + +func (m Country) Equal(other Country) bool { + return m.Name == other.Name +} + +func (m City) Equal(other City) bool { + return m.Name == other.Name +} + +type Employee struct { + models.BaseModel + + Name string + Boss *Employee // Self-Referential Has One (Employee 0..* -> 0..1 Employee) + BossID *uuid.UUID +} + +func (m Employee) Equal(other Employee) bool { + return m.Name == other.Name +} + +type Person struct { + models.BaseModel + + Name string +} + +func (m Person) TableName() string { + return "persons_and_more_name" +} + +type Bicycle struct { + models.BaseModel + + Name string + // Bicycle BelongsTo Person (Bicycle 0..* -> 1 Person) + Owner Person + OwnerID uuid.UUID +} + +func (m Bicycle) Equal(other Bicycle) bool { + return m.Name == other.Name +} + type CRUDServiceIntTestSuite struct { suite.Suite - logger *zap.Logger - db *gorm.DB - crudProductService badorm.CRUDService[Product, uuid.UUID] - crudSaleService badorm.CRUDService[Sale, uuid.UUID] + logger *zap.Logger + db *gorm.DB + crudProductService badorm.CRUDService[Product, uuid.UUID] + crudSaleService badorm.CRUDService[Sale, uuid.UUID] + crudSellerService badorm.CRUDService[Seller, uuid.UUID] + crudCountryService badorm.CRUDService[Country, uuid.UUID] + crudCityService badorm.CRUDService[City, uuid.UUID] + crudEmployeeService badorm.CRUDService[Employee, uuid.UUID] + crudBicycleService badorm.CRUDService[Bicycle, uuid.UUID] } func NewCRUDServiceIntTestSuite( @@ -65,12 +131,22 @@ func NewCRUDServiceIntTestSuite( db *gorm.DB, crudProductService badorm.CRUDService[Product, uuid.UUID], crudSaleService badorm.CRUDService[Sale, uuid.UUID], + crudSellerService badorm.CRUDService[Seller, uuid.UUID], + crudCountryService badorm.CRUDService[Country, uuid.UUID], + crudCityService badorm.CRUDService[City, uuid.UUID], + crudEmployeeService badorm.CRUDService[Employee, uuid.UUID], + crudBicycleService badorm.CRUDService[Bicycle, uuid.UUID], ) *CRUDServiceIntTestSuite { return &CRUDServiceIntTestSuite{ - logger: logger, - db: db, - crudProductService: crudProductService, - crudSaleService: crudSaleService, + logger: logger, + db: db, + crudProductService: crudProductService, + crudSaleService: crudSaleService, + crudSellerService: crudSellerService, + crudCountryService: crudCountryService, + crudCityService: crudCityService, + crudEmployeeService: crudEmployeeService, + crudBicycleService: crudBicycleService, } } @@ -333,7 +409,29 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDiffer EqualList(&ts.Suite, []*Product{match1, match2}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoins() { +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { + product1 := ts.createProduct(map[string]any{ + "int": 1, + }) + product2 := ts.createProduct(map[string]any{ + "int": 2, + }) + + match := ts.createSale(product1, nil) + ts.createSale(product2, nil) + + params := map[string]any{ + "Product": map[string]any{ + "int": 1.0, + }, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { product1 := ts.createProduct(map[string]any{ "int": 1, }) @@ -348,8 +446,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoins() { ts.createSale(product2, seller2) params := map[string]any{ - "product": map[string]any{ - "int": 1.0, + "Seller": map[string]any{ + "name": "franco", }, } entities, err := ts.crudSaleService.GetEntities(params) @@ -358,6 +456,122 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoins() { EqualList(&ts.Suite, []*Sale{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { + boss1 := &Employee{ + Name: "Xavier", + } + boss2 := &Employee{ + Name: "Vincent", + } + + match := ts.createEmployee("franco", boss1) + ts.createEmployee("pierre", boss2) + + params := map[string]any{ + "Boss": map[string]any{ + "name": "Xavier", + }, + } + entities, err := ts.crudEmployeeService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*Employee{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { + capital1 := City{ + Name: "Buenos Aires", + } + capital2 := City{ + Name: "Paris", + } + + ts.createCountry("Argentina", capital1) + ts.createCountry("France", capital2) + + params := map[string]any{ + "Country": map[string]any{ + "name": "Argentina", + }, + } + entities, err := ts.crudCityService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*City{&capital1}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { + capital1 := City{ + Name: "Buenos Aires", + } + capital2 := City{ + Name: "Paris", + } + + country1 := ts.createCountry("Argentina", capital1) + ts.createCountry("France", capital2) + + params := map[string]any{ + "Capital": map[string]any{ + "name": "Buenos Aires", + }, + } + entities, err := ts.crudCountryService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*Country{country1}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsReturnsErrorIfNoRelation() { + params := map[string]any{ + "NotExists": map[string]any{ + "int": 1.0, + }, + } + _, err := ts.crudSaleService.GetEntities(params) + ts.ErrorContains(err, "Sale has not attribute named NotExists or NotExistsID") +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { + person1 := Person{ + Name: "franco", + } + person2 := Person{ + Name: "xavier", + } + + match := ts.createBicycle("BMX", person1) + ts.createBicycle("Shimano", person2) + + params := map[string]any{ + "Owner": map[string]any{ + "name": "franco", + }, + } + entities, err := ts.crudBicycleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*Bicycle{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + match := ts.createSeller("franco", company1) + ts.createSeller("agustin", company2) + + params := map[string]any{ + "Company": map[string]any{ + "name": "ditrit", + }, + } + entities, err := ts.crudSellerService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*Seller{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { product1 := ts.createProduct(map[string]any{ "int": 1, @@ -375,7 +589,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffer ts.createSale(product2, seller2) params := map[string]any{ - "product": map[string]any{ + "Product": map[string]any{ "int": 1.0, "string": "match", }, @@ -402,10 +616,10 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferen ts.createSale(product2, seller2) params := map[string]any{ - "product": map[string]any{ + "Product": map[string]any{ "int": 1.0, }, - "seller": map[string]any{ + "Seller": map[string]any{ "name": "franco", }, } @@ -430,9 +644,9 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultiple params := map[string]any{ // TODO meter algo aca tambien, que sea join y mio - "seller": map[string]any{ + "Seller": map[string]any{ "name": "franco", - "company": map[string]any{ + "Company": map[string]any{ "name": "ditrit", }, }, @@ -443,6 +657,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultiple EqualList(&ts.Suite, []*Sale{match}, entities) } +// TODO test de que hay que poner el mismo nombre que el atributo y no como en la base de datos, aunque es lo mismo que el de product_id // TODO falta test de que joinea dos veces con la misma entidad // TODO faltan test para otros tipos de relaciones @@ -457,7 +672,7 @@ func (ts *CRUDServiceIntTestSuite) createProduct(values map[string]any) *Product func (ts *CRUDServiceIntTestSuite) createSale(product *Product, seller *Seller) *Sale { entity := &Sale{ - Product: product, + Product: *product, Seller: seller, } err := ts.db.Create(entity).Error @@ -490,3 +705,36 @@ func (ts *CRUDServiceIntTestSuite) createCompany(name string) *Company { return entity } + +func (ts *CRUDServiceIntTestSuite) createCountry(name string, capital City) *Country { + entity := &Country{ + Name: name, + Capital: capital, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceIntTestSuite) createEmployee(name string, boss *Employee) *Employee { + entity := &Employee{ + Name: name, + Boss: boss, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceIntTestSuite) createBicycle(name string, owner Person) *Bicycle { + entity := &Bicycle{ + Name: name, + Owner: owner, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index b097d869..2475be52 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -56,9 +56,14 @@ func injectDependencies(cmd *cobra.Command, args []string) { fx.Provide(NewEAVServiceIntTestSuite), fx.Provide(badorm.AddModel[Company]), - fx.Provide(badorm.AddModel[Seller]), + badorm.GetCRUDServiceModule[Seller, uuid.UUID](), badorm.GetCRUDServiceModule[Product, uuid.UUID](), badorm.GetCRUDServiceModule[Sale, uuid.UUID](), + badorm.GetCRUDServiceModule[City, uuid.UUID](), + badorm.GetCRUDServiceModule[Country, uuid.UUID](), + badorm.GetCRUDServiceModule[Employee, uuid.UUID](), + fx.Provide(badorm.AddModel[Person]), + badorm.GetCRUDServiceModule[Bicycle, uuid.UUID](), fx.Provide(NewCRUDServiceIntTestSuite), fx.Invoke(runTestSuites), diff --git a/test_integration/setup.go b/test_integration/setup.go index f5348236..9c528557 100644 --- a/test_integration/setup.go +++ b/test_integration/setup.go @@ -16,6 +16,11 @@ var ListOfTables = []any{ Product{}, Seller{}, Company{}, + City{}, + Country{}, + Employee{}, + Bicycle{}, + Person{}, } func CleanDB(db *gorm.DB) { From e121ca484fb688c593a63602470be98766581c47 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 10:44:11 +0200 Subject: [PATCH 155/467] get returns a entity, not a pointer --- badorm/crudRepository.go | 11 ++++++----- mocks/badorm/CRUDRepository.go | 12 +++++------- services/userservice/userservice.go | 2 +- services/userservice/userservice_test.go | 6 +++--- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 7aa6020f..76bbd9e2 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -26,7 +26,7 @@ type CRUDRepository[T any, ID BadaasID] interface { Create(tx *gorm.DB, entity *T) error // read GetByID(tx *gorm.DB, id ID) (*T, error) - Get(tx *gorm.DB, conditions map[string]any) (*T, error) + Get(tx *gorm.DB, conditions map[string]any) (T, error) GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) GetAll(tx *gorm.DB) ([]*T, error) @@ -107,17 +107,18 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, er return &entity, nil } -func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions map[string]any) (*T, error) { +func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions map[string]any) (T, error) { entity, err := repository.GetOptional(tx, conditions) + var nilValue T if err != nil { - return nil, err + return nilValue, err } if entity == nil { - return nil, ErrObjectNotFound + return nilValue, ErrObjectNotFound } - return entity, nil + return *entity, nil } func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) { diff --git a/mocks/badorm/CRUDRepository.go b/mocks/badorm/CRUDRepository.go index 37428daa..f073c4e0 100644 --- a/mocks/badorm/CRUDRepository.go +++ b/mocks/badorm/CRUDRepository.go @@ -73,20 +73,18 @@ func (_m *CRUDRepository[T, ID]) Find(tx *gorm.DB, filters squirrel.Sqlizer, _a2 } // Get provides a mock function with given fields: tx, conditions -func (_m *CRUDRepository[T, ID]) Get(tx *gorm.DB, conditions map[string]interface{}) (*T, error) { +func (_m *CRUDRepository[T, ID]) Get(tx *gorm.DB, conditions map[string]interface{}) (T, error) { ret := _m.Called(tx, conditions) - var r0 *T + var r0 T var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) (*T, error)); ok { + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) (T, error)); ok { return rf(tx, conditions) } - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) *T); ok { + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) T); ok { r0 = rf(tx, conditions) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*T) - } + r0 = ret.Get(0).(T) } if rf, ok := ret.Get(1).(func(*gorm.DB, map[string]interface{}) error); ok { diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index 72faad37..984eb536 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -88,5 +88,5 @@ func (userService *userServiceImpl) GetUser(userLoginDTO dto.UserLoginDTO) (*mod return nil, ErrWrongPassword } - return user, nil + return &user, nil } diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index 009d92e8..507e0dd7 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -101,7 +101,7 @@ func TestGetUser(t *testing.T) { userRepositoryMock.On( "Get", gormDB, map[string]any{"email": "bob@email.com"}, ).Return( - user, + *user, nil, ) @@ -129,7 +129,7 @@ func TestGetUserNoUserFound(t *testing.T) { userRepositoryMock.On( "Get", gormDB, map[string]any{"email": "bobnotfound@email.com"}, ).Return( - nil, + models.User{}, badorm.ErrObjectNotFound, ) @@ -156,7 +156,7 @@ func TestGetUserWrongPassword(t *testing.T) { userRepositoryMock.On( "Get", gormDB, map[string]any{"email": "bob@email.com"}, ).Return( - user, + *user, nil, ) From 262bc19443cdb4815ab999f215fabf935bcb7c89 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 10:51:20 +0200 Subject: [PATCH 156/467] refactor remove duplicated code --- badorm/crudRepository.go | 55 ++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 76bbd9e2..09c56f1d 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -138,19 +138,9 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions // Get all entities of a Model func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) { - thisEntityConditions := map[string]any{} - joinConditions := map[string]map[string]any{} - - // only entities that match the conditions - for attributeName, expectedValue := range conditions { - switch typedExpectedValue := expectedValue.(type) { - case float64, bool, string, nil: - thisEntityConditions[attributeName] = expectedValue - case map[string]any: - joinConditions[attributeName] = typedExpectedValue - default: - return nil, fmt.Errorf("unsupported type") - } + thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) + if err != nil { + return nil, err } query := tx.Where(thisEntityConditions) @@ -177,7 +167,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions // execute query var entities []*T - err := query.Find(&entities).Error + err = query.Find(&entities).Error return entities, err } @@ -206,19 +196,9 @@ func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( previousTableName, joinAttributeName string, conditions map[string]any, ) error { - // TODO codigo duplicado - thisEntityConditions := map[string]any{} - joinConditions := map[string]map[string]any{} - - for attributeName, expectedValue := range conditions { - switch typedExpectedValue := expectedValue.(type) { - case float64, bool, string, nil: - thisEntityConditions[attributeName] = expectedValue - case map[string]any: - joinConditions[attributeName] = typedExpectedValue - default: - return fmt.Errorf("unsupported type") - } + thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) + if err != nil { + return err } relatedObject, relationIDIsInPreviousTable, err := getRelatedObject( @@ -276,7 +256,6 @@ func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( query.Joins(stringQuery, conditionsValues...) - // TODO codigo duplicado for joinAttributeName, joinConditions := range joinConditions { err := repository.addJoinToQuery( query, @@ -293,6 +272,26 @@ func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( return nil } +func divideConditionsByEntity( + conditions map[string]any, +) (map[string]any, map[string]map[string]any, error) { + thisEntityConditions := map[string]any{} + joinConditions := map[string]map[string]any{} + + for attributeName, expectedValue := range conditions { + switch typedExpectedValue := expectedValue.(type) { + case float64, bool, string, nil: + thisEntityConditions[attributeName] = expectedValue + case map[string]any: + joinConditions[attributeName] = typedExpectedValue + default: + return nil, nil, fmt.Errorf("unsupported type") + } + } + + return thisEntityConditions, joinConditions, nil +} + // entity can be a pointer of not, now only works with pointer func getRelatedObject(entity any, relationName string) (any, bool, error) { entityType := reflect.TypeOf(entity) From 1db00d326acd1c1b43f076366823df0a44058139 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 11:53:51 +0200 Subject: [PATCH 157/467] add tests about db errors --- badorm/crudRepository.go | 20 ++-- persistence/gormdatabase/helpers.go | 4 +- test_integration/crudService.go | 139 ++++++++++++++-------------- 3 files changed, 83 insertions(+), 80 deletions(-) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 09c56f1d..f5e35dab 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -189,7 +189,6 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { // then, adds the verification that the values for the joined entity are "expectedValues" // "expectedValues" is in {"attributeName": expectedValue} format -// TODO support ManyToMany relations // previousEntity is pointer func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( query *gorm.DB, previousEntity any, @@ -249,7 +248,6 @@ func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( `AND %[1]s.%[2]s = ? `, tableWithSuffix, attributeName, - // TODO que pasa si el atributo no existe ) conditionsValues = append(conditionsValues, conditionValue) } @@ -294,12 +292,7 @@ func divideConditionsByEntity( // entity can be a pointer of not, now only works with pointer func getRelatedObject(entity any, relationName string) (any, bool, error) { - entityType := reflect.TypeOf(entity) - - // entityType will be a pointer if the relation can be nullable - if entityType.Kind() == reflect.Pointer { - entityType = entityType.Elem() - } + entityType := getEntityType(entity) field, isPresent := entityType.FieldByName(relationName) if !isPresent { @@ -312,6 +305,17 @@ func getRelatedObject(entity any, relationName string) (any, bool, error) { return createObject(field.Type), isIDPresent, nil } +func getEntityType(entity any) reflect.Type { + entityType := reflect.TypeOf(entity) + + // entityType will be a pointer if the relation can be nullable + if entityType.Kind() == reflect.Pointer { + entityType = entityType.Elem() + } + + return entityType +} + func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, bool, error) { _, isPresent := entityType.FieldByName(relationName + "ID") if !isPresent { diff --git a/persistence/gormdatabase/helpers.go b/persistence/gormdatabase/helpers.go index 885cc51e..96223928 100644 --- a/persistence/gormdatabase/helpers.go +++ b/persistence/gormdatabase/helpers.go @@ -4,10 +4,10 @@ import "github.com/jackc/pgconn" func IsDuplicateKeyError(err error) bool { // unique_violation code is equals to 23505 - return isPostgresError(err, "23505") + return IsPostgresError(err, "23505") } -func isPostgresError(err error, errCode string) bool { +func IsPostgresError(err error, errCode string) bool { postgresError, ok := err.(*pgconn.PgError) if ok { return postgresError.Code == errCode diff --git a/test_integration/crudService.go b/test_integration/crudService.go index 447a6c3c..063612e5 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -2,6 +2,7 @@ package integrationtests import ( "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/ditrit/badaas/persistence/models" "github.com/google/uuid" "github.com/stretchr/testify/suite" @@ -35,6 +36,8 @@ type Seller struct { type Sale struct { models.BaseModel + Code int + // Sale belongsTo Product (Sale 0..* -> 1 Product) Product Product ProductID uuid.UUID @@ -193,7 +196,6 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNo EqualList(&ts.Suite, []*Product{}, entities) } -// TODO mirar esto, el string del where se pone sin tabla, puede generar problemas cuando haya join func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { ts.createProduct(map[string]any{ "string": "something_else", @@ -245,26 +247,18 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleI EqualList(&ts.Suite, []*Product{match1, match2}, entities) } -// TODO ver caso en el que la columna no existe -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsEmpty() { -// ts.createProduct(map[string]any{ -// "string": "match", -// }) -// ts.createProduct(map[string]any{ -// "string": "match", -// }) -// ts.createProduct(map[string]any{ -// "string": "match", -// }) - -// params := map[string]any{ -// "not_exists": "not_exists", -// } -// entities, err := ts.crudProductService.GetEntities(params) -// ts.Nil(err) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsDBError() { + ts.createProduct(map[string]any{ + "string": "match", + }) -// EqualList(&ts.Suite, []*Product{}, entities) -// } + params := map[string]any{ + "not_exists": "not_exists", + } + _, err := ts.crudProductService.GetEntities(params) + ts.NotNil(err) + ts.True(gormdatabase.IsPostgresError(err, "42703")) +} func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { match := ts.createProduct(map[string]any{ @@ -285,20 +279,19 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { EqualList(&ts.Suite, []*Product{match}, entities) } -// TODO ver este caso -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeReturnsEmptyList() { -// ts.createProduct(map[string]any{ -// "string": "not_match", -// "int": 1, -// }) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeReturnsDBError() { + ts.createProduct(map[string]any{ + "string": "not_match", + "int": 1, + }) -// params := map[string]any{ -// "int": "not_an_int", -// } -// entities, err := ts.crudProductService.GetEntities(params) -// ts.Nil(err) -// ts.Len(entities, 0) -// } + params := map[string]any{ + "int": "not_an_int", + } + _, err := ts.crudProductService.GetEntities(params) + ts.NotNil(err) + ts.True(gormdatabase.IsPostgresError(err, "22P02")) +} func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { match := ts.createProduct(map[string]any{ @@ -338,7 +331,6 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { EqualList(&ts.Suite, []*Product{match}, entities) } -// TODO testear la creacion directo con entidades func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { product1 := ts.createProduct(map[string]any{}) product2 := ts.createProduct(map[string]any{}) @@ -346,11 +338,10 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) - match := ts.createSale(product1, seller1) - ts.createSale(product2, seller2) + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) params := map[string]any{ - // TODO ver esto, es un poco confuso que lo muestra como ProductID pero para queries es product_id "product_id": product1.ID.String(), } entities, err := ts.crudSaleService.GetEntities(params) @@ -359,22 +350,6 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() EqualList(&ts.Suite, []*Sale{match}, entities) } -// TODO ver esto -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionFilterByNull() { -// match := ts.createProduct(map[string]any{}) -// ts.createProduct(map[string]any{ -// "string": "something", -// }) - -// params := map[string]any{ -// "string": nil, -// } -// entities, err := ts.crudProductService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Product{match}, entities) -// } - func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { match1 := ts.createProduct(map[string]any{ "string": "match", @@ -417,8 +392,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsT "int": 2, }) - match := ts.createSale(product1, nil) - ts.createSale(product2, nil) + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, nil) params := map[string]any{ "Product": map[string]any{ @@ -442,8 +417,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOp seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) - match := ts.createSale(product1, seller1) - ts.createSale(product2, seller2) + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) params := map[string]any{ "Seller": map[string]any{ @@ -585,8 +560,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffer seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) - match := ts.createSale(product1, seller1) - ts.createSale(product2, seller2) + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) params := map[string]any{ "Product": map[string]any{ @@ -600,7 +575,33 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffer EqualList(&ts.Suite, []*Sale{match}, entities) } -// // TODO aca deberia agregar casos en lo que 1 matchea pero el otro no +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { + product1 := ts.createProduct(map[string]any{ + "int": 1, + }) + product2 := ts.createProduct(map[string]any{ + "int": 2, + }) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(1, product1, seller1) + ts.createSale(2, product2, seller2) + ts.createSale(2, product1, seller2) + + params := map[string]any{ + "Product": map[string]any{ + "int": 1.0, + }, + "code": 1.0, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { product1 := ts.createProduct(map[string]any{ "int": 1, @@ -612,8 +613,10 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferen seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) - match := ts.createSale(product1, seller1) - ts.createSale(product2, seller2) + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + ts.createSale(0, product1, seller2) + ts.createSale(0, product2, seller1) params := map[string]any{ "Product": map[string]any{ @@ -639,11 +642,10 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultiple seller1 := ts.createSeller("franco", company1) seller2 := ts.createSeller("agustin", company2) - match := ts.createSale(product1, seller1) - ts.createSale(product2, seller2) + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) params := map[string]any{ - // TODO meter algo aca tambien, que sea join y mio "Seller": map[string]any{ "name": "franco", "Company": map[string]any{ @@ -657,10 +659,6 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultiple EqualList(&ts.Suite, []*Sale{match}, entities) } -// TODO test de que hay que poner el mismo nombre que el atributo y no como en la base de datos, aunque es lo mismo que el de product_id -// TODO falta test de que joinea dos veces con la misma entidad -// TODO faltan test para otros tipos de relaciones - // ------------------------- utils ------------------------- func (ts *CRUDServiceIntTestSuite) createProduct(values map[string]any) *Product { @@ -670,8 +668,9 @@ func (ts *CRUDServiceIntTestSuite) createProduct(values map[string]any) *Product return entity } -func (ts *CRUDServiceIntTestSuite) createSale(product *Product, seller *Seller) *Sale { +func (ts *CRUDServiceIntTestSuite) createSale(code int, product *Product, seller *Seller) *Sale { entity := &Sale{ + Code: code, Product: *product, Seller: seller, } From 614610d6e16432e9c8d61a9c5363f775cccba6ea Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 11:54:07 +0200 Subject: [PATCH 158/467] filter by null not supported yet --- badorm/crudRepository.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index f5e35dab..ec66db84 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -278,7 +278,7 @@ func divideConditionsByEntity( for attributeName, expectedValue := range conditions { switch typedExpectedValue := expectedValue.(type) { - case float64, bool, string, nil: + case float64, bool, string: thisEntityConditions[attributeName] = expectedValue case map[string]any: joinConditions[attributeName] = typedExpectedValue From 4b7a260d3d724c1e5a6e00fcd8f685e7ef8f1f61 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 11:58:37 +0200 Subject: [PATCH 159/467] remove duplicated code from crud controller --- controllers/crud.go | 26 +++----------------------- controllers/eav.go | 17 +---------------- controllers/utils.go | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 39 deletions(-) diff --git a/controllers/crud.go b/controllers/crud.go index a5f69e57..f6ecf329 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -11,7 +11,6 @@ import ( "github.com/ditrit/badaas/persistence/models" "github.com/elliotchance/pie/v2" "github.com/google/uuid" - "github.com/gorilla/mux" "go.uber.org/zap" "gorm.io/gorm" ) @@ -24,8 +23,6 @@ type CRUDController interface { DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) } -// TODO un monton de codigo duplicado - // check interface compliance var _ CRUDController = (*crudControllerImpl[models.User])(nil) @@ -60,7 +57,7 @@ type crudControllerImpl[T any] struct { // The handler responsible of the retrieval of one objects func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityID, herr := controller.getEntityIDFromRequest(r) + entityID, herr := getEntityIDFromRequest(r) if herr != nil { return nil, herr } @@ -118,7 +115,7 @@ func (controller *crudControllerImpl[T]) CreateObject(w http.ResponseWriter, r * // The handler responsible for the updates of one object func (controller *crudControllerImpl[T]) UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityID, herr := controller.getEntityIDFromRequest(r) + entityID, herr := getEntityIDFromRequest(r) if herr != nil { return nil, herr } @@ -141,7 +138,7 @@ func (controller *crudControllerImpl[T]) UpdateObject(w http.ResponseWriter, r * // The handler responsible for the deletion of a object func (controller *crudControllerImpl[T]) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityID, herr := controller.getEntityIDFromRequest(r) + entityID, herr := getEntityIDFromRequest(r) if herr != nil { return nil, herr } @@ -156,20 +153,3 @@ func (controller *crudControllerImpl[T]) DeleteObject(w http.ResponseWriter, r * return nil, nil } - -// TODO codigo duplicado - -// Extract the "id" parameter from url -func (controller *crudControllerImpl[T]) getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { - id, present := mux.Vars(r)["id"] - if !present { - return uuid.Nil, ErrEntityNotFound - } - - uid, err := uuid.Parse(id) - if err != nil { - return uuid.Nil, ErrIDNotAnUUID - } - - return uid, nil -} diff --git a/controllers/eav.go b/controllers/eav.go index d788ebe6..cdfcca11 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -161,21 +161,6 @@ func (controller *eavControllerImpl) getEntityTypeNameFromRequest(r *http.Reques return entityTypeName, nil } -// Extract the "id" parameter from url -func (controller *eavControllerImpl) getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { - id, present := mux.Vars(r)["id"] - if !present { - return uuid.Nil, ErrEntityNotFound - } - - uid, err := uuid.Parse(id) - if err != nil { - return uuid.Nil, ErrIDNotAnUUID - } - - return uid, nil -} - // Extract the "type" and "id" parameters from url func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Request) (string, uuid.UUID, httperrors.HTTPError) { entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) @@ -183,7 +168,7 @@ func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Reques return "", uuid.Nil, herr } - entityID, herr := controller.getEntityIDFromRequest(r) + entityID, herr := getEntityIDFromRequest(r) if herr != nil { return "", uuid.Nil, herr } diff --git a/controllers/utils.go b/controllers/utils.go index fbccc3cf..7732caf6 100644 --- a/controllers/utils.go +++ b/controllers/utils.go @@ -6,6 +6,8 @@ import ( "net/http" "github.com/ditrit/badaas/httperrors" + "github.com/google/uuid" + "github.com/gorilla/mux" ) var ( @@ -43,3 +45,18 @@ func decodeJSONOptional(r *http.Request) (map[string]any, httperrors.HTTPError) return to, nil } + +// Extract the "id" parameter from url +func getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { + id, present := mux.Vars(r)["id"] + if !present { + return uuid.Nil, ErrEntityNotFound + } + + uid, err := uuid.Parse(id) + if err != nil { + return uuid.Nil, ErrIDNotAnUUID + } + + return uid, nil +} From 36852d3d371e8a1e8fca57e8da9d81cec10680cb Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 12:03:56 +0200 Subject: [PATCH 160/467] add todo for location header --- controllers/crud.go | 3 +-- controllers/eav.go | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/controllers/crud.go b/controllers/crud.go index f6ecf329..1930a744 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -106,8 +106,7 @@ func (controller *crudControllerImpl[T]) CreateObject(w http.ResponseWriter, r * return nil, httperrors.NewDBError(err) } - // TODO ver como hacer esto - // w.Header().Add("Location", buildLocationString(entity)) + // TODO add location header w.WriteHeader(http.StatusCreated) return entity, nil diff --git a/controllers/eav.go b/controllers/eav.go index cdfcca11..80be391e 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -100,13 +100,13 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http return nil, httperrors.NewDBError(err) } - w.Header().Add("Location", buildLocationString(entity)) + w.Header().Add("Location", buildEAVLocationString(entity)) w.WriteHeader(http.StatusCreated) return entity, nil } -func buildLocationString(et *models.Entity) string { +func buildEAVLocationString(et *models.Entity) string { return fmt.Sprintf("eav/objects/%s/%s", et.EntityType.Name, et.ID.String()) } From 419af78742316bd5cfba7894d4a6c194e94a69d1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 12:08:15 +0200 Subject: [PATCH 161/467] delete pagination from repository until necessary --- badorm/crudRepository.go | 64 ---------- badorm/pagination/Page.go | 38 ------ badorm/pagination/Page_test.go | 145 ----------------------- badorm/pagination/Paginator.go | 36 ------ badorm/pagination/Paginator_test.go | 22 ---- mocks/badorm/CRUDRepository.go | 30 ----- persistence/gormdatabase/helpers_test.go | 6 +- 7 files changed, 3 insertions(+), 338 deletions(-) delete mode 100644 badorm/pagination/Page.go delete mode 100644 badorm/pagination/Page_test.go delete mode 100644 badorm/pagination/Paginator.go delete mode 100644 badorm/pagination/Paginator_test.go diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index ec66db84..6f70d636 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -6,13 +6,10 @@ import ( "reflect" "sync" - "github.com/Masterminds/squirrel" - "github.com/ditrit/badaas/badorm/pagination" "github.com/ditrit/badaas/configuration" "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" - "gorm.io/gorm/clause" "gorm.io/gorm/schema" ) @@ -30,7 +27,6 @@ type CRUDRepository[T any, ID BadaasID] interface { GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) GetAll(tx *gorm.DB) ([]*T, error) - Find(tx *gorm.DB, filters squirrel.Sqlizer, pagination pagination.Paginator, sort SortOption) (*pagination.Page[T], error) // update Save(tx *gorm.DB, entity *T) error // delete @@ -333,63 +329,3 @@ func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, bo func createObject(entityType reflect.Type) any { return reflect.New(entityType).Elem().Interface() } - -// Find entities of a Model -func (repository *CRUDRepositoryImpl[T, ID]) Find( - tx *gorm.DB, - filters squirrel.Sqlizer, - page pagination.Paginator, - sortOption SortOption, -) (*pagination.Page[T], error) { - var instances []*T - whereClause, values, err := filters.ToSql() - if err != nil { - return nil, err - } - - if page != nil { - tx = tx. - Offset( - int((page.Offset() - 1) * page.Limit()), - ). - Limit( - int(page.Limit()), - ) - } else { - page = pagination.NewPaginator(0, repository.paginationConfiguration.GetMaxElemPerPage()) - } - - if sortOption != nil { - tx = tx.Order(buildClauseFromSortOption(sortOption)) - } - - err = tx.Where(whereClause, values...).Find(&instances).Error - if err != nil { - return nil, err - } - - // Get Count - nbElem, err := repository.count(tx, whereClause, values) - if err != nil { - return nil, err - } - - return pagination.NewPage(instances, page.Offset(), page.Limit(), nbElem), nil -} - -// Count the number of record that match the where clause with the provided values on the db -func (repository *CRUDRepositoryImpl[T, ID]) count(tx *gorm.DB, whereClause string, values []interface{}) (uint, error) { - var entity *T - var count int64 - err := tx.Model(entity).Where(whereClause, values).Count(&count).Error - if err != nil { - return 0, err - } - - return uint(count), nil -} - -// Build a gorm order clause from a SortOption -func buildClauseFromSortOption(sortOption SortOption) clause.OrderByColumn { - return clause.OrderByColumn{Column: clause.Column{Name: sortOption.Column()}, Desc: sortOption.Desc()} -} diff --git a/badorm/pagination/Page.go b/badorm/pagination/Page.go deleted file mode 100644 index c2c83402..00000000 --- a/badorm/pagination/Page.go +++ /dev/null @@ -1,38 +0,0 @@ -package pagination - -// A page hold ressources and data regarding the pagination -type Page[T any] struct { - Ressources []*T `json:"ressources"` - // max d'element par page - Limit uint `json:"limit"` - // page courante - Offset uint `json:"offset"` - // total d'element en base - Total uint `json:"total"` - // total de pages - TotalPages uint `json:"totalPages"` - HasNextPage bool `json:"hasNextpage"` - HasPreviousPage bool `json:"hasPreviousPage"` - IsFirstPage bool `json:"isFirstPage"` - IsLastPage bool `json:"isLastPage"` - HasContent bool `json:"hasContent"` -} - -// Create a new page -func NewPage[T any](records []*T, offset, size, nbElemTotal uint) *Page[T] { - nbPage := nbElemTotal / size - p := Page[T]{ - Ressources: records, - Limit: size, - Offset: offset, - Total: nbElemTotal, - TotalPages: nbPage, - - HasNextPage: nbElemTotal > (offset+1)*size, - HasPreviousPage: offset >= 1, - IsFirstPage: offset == 0, - IsLastPage: offset == (nbPage - 1), - HasContent: len(records) != 0, - } - return &p -} diff --git a/badorm/pagination/Page_test.go b/badorm/pagination/Page_test.go deleted file mode 100644 index f46b49f8..00000000 --- a/badorm/pagination/Page_test.go +++ /dev/null @@ -1,145 +0,0 @@ -package pagination_test - -import ( - "testing" - - "github.com/ditrit/badaas/badorm/pagination" - "github.com/stretchr/testify/assert" -) - -type Whatever struct { - DumbData int -} - -func (Whatever) TableName() string { - return "whatevers" -} - -var ( - // test fixture - ressources = []*Whatever{ - {10}, - {11}, - {12}, - {13}, - {14}, - {15}, - {16}, - {17}, - {18}, - {19}, - } -) - -func TestNewPage(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.ElementsMatch(t, ressources, p.Ressources) - assert.Equal(t, uint(10), p.Limit) - assert.Equal(t, uint(1), p.Offset) - assert.Equal(t, uint(5), p.TotalPages) -} - -func TestPageHasNextPageFalse(t *testing.T) { - p := pagination.NewPage( - ressources, - 4, // page 4: last page - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.False(t, p.HasNextPage) -} - -func TestPageHasNextPageTrue(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.True(t, p.HasNextPage) -} - -func TestPageIsLastPageFalse(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.False(t, p.IsLastPage) -} - -func TestPageIsLastPageTrue(t *testing.T) { - p := pagination.NewPage( - ressources, - 4, // page 4: last page - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.True(t, p.IsLastPage) -} - -func TestPageHasPreviousPageFalse(t *testing.T) { - p := pagination.NewPage( - ressources, - 0, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.False(t, p.HasPreviousPage) -} - -func TestPageHasPreviousPageTrue(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.True(t, p.HasPreviousPage) -} - -func TestPageIsFirstPageFalse(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.False(t, p.IsFirstPage) -} - -func TestPageIsFirstPageTrue(t *testing.T) { - p := pagination.NewPage( - ressources, - 0, // page 0: first page - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.True(t, p.IsFirstPage) -} - -func TestPageHasContentFalse(t *testing.T) { - p := pagination.NewPage( - []*Whatever{}, // no content - 0, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.False(t, p.HasPreviousPage) -} - -func TestPageHasContentTrue(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.True(t, p.HasContent) -} diff --git a/badorm/pagination/Paginator.go b/badorm/pagination/Paginator.go deleted file mode 100644 index e2811a72..00000000 --- a/badorm/pagination/Paginator.go +++ /dev/null @@ -1,36 +0,0 @@ -package pagination - -// Handle pagination -type Paginator interface { - Offset() uint - Limit() uint -} - -type paginatorImpl struct { - offset uint - limit uint -} - -// Constructor of Paginator -func NewPaginator(page, limit uint) Paginator { - if page == 0 { - page = 1 - } - if limit == 0 { - limit = 1 - } - return &paginatorImpl{ - offset: page, - limit: limit, - } -} - -// Return the page number -func (p *paginatorImpl) Offset() uint { - return p.offset -} - -// Return the max number of records for one page -func (p *paginatorImpl) Limit() uint { - return p.limit -} diff --git a/badorm/pagination/Paginator_test.go b/badorm/pagination/Paginator_test.go deleted file mode 100644 index a2b6137f..00000000 --- a/badorm/pagination/Paginator_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package pagination_test - -import ( - "testing" - - "github.com/ditrit/badaas/badorm/pagination" - "github.com/stretchr/testify/assert" -) - -func TestPaginator(t *testing.T) { - paginator := pagination.NewPaginator(uint(0), uint(12)) - assert.NotNil(t, paginator) - assert.Equal(t, uint(12), paginator.Limit()) - - paginator = pagination.NewPaginator(uint(2), uint(12)) - assert.NotNil(t, paginator) - assert.Equal(t, uint(12), paginator.Limit()) - - paginator = pagination.NewPaginator(uint(2), uint(0)) - assert.NotNil(t, paginator) - assert.Equal(t, uint(1), paginator.Limit()) -} diff --git a/mocks/badorm/CRUDRepository.go b/mocks/badorm/CRUDRepository.go index f073c4e0..dd8f20fb 100644 --- a/mocks/badorm/CRUDRepository.go +++ b/mocks/badorm/CRUDRepository.go @@ -7,10 +7,6 @@ import ( gorm "gorm.io/gorm" mock "github.com/stretchr/testify/mock" - - pagination "github.com/ditrit/badaas/badorm/pagination" - - squirrel "github.com/Masterminds/squirrel" ) // CRUDRepository is an autogenerated mock type for the CRUDRepository type @@ -46,32 +42,6 @@ func (_m *CRUDRepository[T, ID]) Delete(tx *gorm.DB, entity *T) error { return r0 } -// Find provides a mock function with given fields: tx, filters, _a2, sort -func (_m *CRUDRepository[T, ID]) Find(tx *gorm.DB, filters squirrel.Sqlizer, _a2 pagination.Paginator, sort badorm.SortOption) (*pagination.Page[T], error) { - ret := _m.Called(tx, filters, _a2, sort) - - var r0 *pagination.Page[T] - var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, badorm.SortOption) (*pagination.Page[T], error)); ok { - return rf(tx, filters, _a2, sort) - } - if rf, ok := ret.Get(0).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, badorm.SortOption) *pagination.Page[T]); ok { - r0 = rf(tx, filters, _a2, sort) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*pagination.Page[T]) - } - } - - if rf, ok := ret.Get(1).(func(*gorm.DB, squirrel.Sqlizer, pagination.Paginator, badorm.SortOption) error); ok { - r1 = rf(tx, filters, _a2, sort) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // Get provides a mock function with given fields: tx, conditions func (_m *CRUDRepository[T, ID]) Get(tx *gorm.DB, conditions map[string]interface{}) (T, error) { ret := _m.Called(tx, conditions) diff --git a/persistence/gormdatabase/helpers_test.go b/persistence/gormdatabase/helpers_test.go index 59cb2d6e..dd464993 100644 --- a/persistence/gormdatabase/helpers_test.go +++ b/persistence/gormdatabase/helpers_test.go @@ -20,14 +20,14 @@ func TestIsDuplicateError(t *testing.T) { func Test_isPostgresError(t *testing.T) { var postgresErrorAsError error = &pgconn.PgError{Code: "1234"} - assert.True(t, isPostgresError( + assert.True(t, IsPostgresError( postgresErrorAsError, "1234", )) postgresErrorAsError = &pgconn.PgError{Code: ""} - assert.False(t, isPostgresError( + assert.False(t, IsPostgresError( postgresErrorAsError, "1234", )) - assert.False(t, isPostgresError(errors.New("a classic error"), "1234")) + assert.False(t, IsPostgresError(errors.New("a classic error"), "1234")) } From aa003f8fbe3d575ca51f94a33d24280ef015ca2b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 14:53:55 +0200 Subject: [PATCH 162/467] remove update, create and delete endpoints --- badorm/crudService.go | 48 ---------- controllers/crud.go | 65 -------------- controllers/eav.go | 12 ++- router/routes.go | 20 +---- test_integration/asserts.go | 1 - test_integration/crudService.go | 155 +++++++++----------------------- 6 files changed, 58 insertions(+), 243 deletions(-) diff --git a/badorm/crudService.go b/badorm/crudService.go index 1be9c326..b64fc48b 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -3,7 +3,6 @@ package badorm import ( "github.com/ditrit/badaas/persistence/models" "github.com/google/uuid" - "github.com/mitchellh/mapstructure" "go.uber.org/zap" "gorm.io/gorm" ) @@ -11,9 +10,6 @@ import ( type CRUDService[T any, ID BadaasID] interface { GetEntity(id ID) (*T, error) GetEntities(conditions map[string]any) ([]*T, error) - CreateEntity(attributeValues map[string]any) (*T, error) - UpdateEntity(entityID ID, newValues map[string]any) (*T, error) - DeleteEntity(entityID ID) error } // check interface compliance @@ -53,47 +49,3 @@ func (service *crudServiceImpl[T, ID]) GetEntity(id ID) (*T, error) { func (service *crudServiceImpl[T, ID]) GetEntities(conditions map[string]any) ([]*T, error) { return service.repository.GetMultiple(service.db, conditions) } - -// Creates a Entity of type "entityType" and its Values from the information provided in "attributeValues" -// not specified values are set with the default value (if exists) or a null value. -// entries in "attributeValues" that do not correspond to any attribute of "entityType" are ignored -// -// "attributeValues" are in {"attributeName": value} format -func (service *crudServiceImpl[T, ID]) CreateEntity(attributeValues map[string]any) (*T, error) { - var entity T - // TODO ver si dejo esto o desencodeo el json directo en la entidad - // TODO testear lo de que se le pueden agregar relaciones a esto - err := mapstructure.Decode(attributeValues, &entity) - if err != nil { - return nil, err // TODO ver que errores puede haber aca - } - - err = service.repository.Create(service.db, &entity) - if err != nil { - return nil, err - } - - // TODO eliminar esto - // err := service.db.Model(&entity).Create(attributeValues).Error - // if err != nil { - // return nil, err - // } - // entity.ID = attributeValues["id"] - - return &entity, nil -} - -// Updates entity with type "entityTypeName" and "id" Values to the new values provided in "newValues" -// entries in "newValues" that do not correspond to any attribute of the EntityType are ignored -// -// "newValues" are in {"attributeName": newValue} format -func (service *crudServiceImpl[T, ID]) UpdateEntity(entityID ID, newValues map[string]any) (*T, error) { - // TODO - return nil, nil -} - -// Deletes Entity with type "entityTypeName" and id "entityID" and its values -func (service *crudServiceImpl[T, ID]) DeleteEntity(entityID ID) error { - // TODO - return nil -} diff --git a/controllers/crud.go b/controllers/crud.go index 1930a744..3f64442e 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -18,9 +18,6 @@ import ( type CRUDController interface { GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) } // check interface compliance @@ -90,65 +87,3 @@ func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *ht return entities, nil } - -// The handler responsible of the creation of a object -func (controller *crudControllerImpl[T]) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - attrs, herr := decodeJSONOptional(r) - if herr != nil { - return nil, herr - } - - entity, err := controller.crudService.CreateEntity(attrs) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityTypeNotFound - } - return nil, httperrors.NewDBError(err) - } - - // TODO add location header - w.WriteHeader(http.StatusCreated) - - return entity, nil -} - -// The handler responsible for the updates of one object -func (controller *crudControllerImpl[T]) UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityID, herr := getEntityIDFromRequest(r) - if herr != nil { - return nil, herr - } - - attrs, herr := decodeJSONOptional(r) - if herr != nil { - return nil, herr - } - - entity, err := controller.crudService.UpdateEntity(entityID, attrs) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound - } - return nil, httperrors.NewDBError(err) - } - - return entity, nil -} - -// The handler responsible for the deletion of a object -func (controller *crudControllerImpl[T]) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityID, herr := getEntityIDFromRequest(r) - if herr != nil { - return nil, herr - } - - err := controller.crudService.DeleteEntity(entityID) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound - } - return nil, httperrors.NewDBError(err) - } - - return nil, nil -} diff --git a/controllers/eav.go b/controllers/eav.go index 80be391e..1b4d2fe1 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -20,13 +20,21 @@ var ( ErrIDNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") ) +type EAVController interface { + GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) +} + // check interface compliance -var _ CRUDController = (*eavControllerImpl)(nil) +var _ EAVController = (*eavControllerImpl)(nil) func NewEAVController( logger *zap.Logger, eavService services.EAVService, -) CRUDController { +) EAVController { return &eavControllerImpl{ logger: logger, eavService: eavService, diff --git a/router/routes.go b/router/routes.go index 9673a5fc..ae93120f 100644 --- a/router/routes.go +++ b/router/routes.go @@ -70,7 +70,7 @@ func createSuperUser( } func AddEAVCRUDRoutes( - eavController controllers.CRUDController, + eavController controllers.EAVController, router *mux.Router, jsonController middlewares.JSONController, ) { @@ -93,11 +93,7 @@ func AddCRUDRoutes( // Objects CRUD objectsBase := "/objects/" + crudRoute.TypeName objectsWithID := objectsBase + "/{id}" - // create - router.HandleFunc( - objectsBase, - jsonController.Wrap(crudRoute.Controller.CreateObject), - ).Methods("POST") + // TODO create // read router.HandleFunc( objectsWithID, @@ -107,15 +103,7 @@ func AddCRUDRoutes( objectsBase, jsonController.Wrap(crudRoute.Controller.GetObjects), ).Methods("GET") - // update - router.HandleFunc( - objectsWithID, - jsonController.Wrap(crudRoute.Controller.UpdateObject), - ).Methods("PUT") - // delete - router.HandleFunc( - objectsWithID, - jsonController.Wrap(crudRoute.Controller.DeleteObject), - ).Methods("DELETE") + // TODO update + // TODO delete } } diff --git a/test_integration/asserts.go b/test_integration/asserts.go index f26ae5d2..9fe5d015 100644 --- a/test_integration/asserts.go +++ b/test_integration/asserts.go @@ -26,7 +26,6 @@ func EqualList[T any](ts *suite.Suite, expectedList, actualList []T) { } } if j == expectedLen { - // TODO mejorar esto ts.Fail("Lists not equal", "element %v not in list %v", expectedList[i], actualList) for _, element := range actualList { log.Println(element) diff --git a/test_integration/crudService.go b/test_integration/crudService.go index 063612e5..69a906f1 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -167,7 +167,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyI } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { - match := ts.createProduct(map[string]any{}) + match := ts.createProduct("", 0, 0, false) entities, err := ts.crudProductService.GetEntities(map[string]any{}) ts.Nil(err) @@ -176,9 +176,9 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnl } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { - match1 := ts.createProduct(map[string]any{}) - match2 := ts.createProduct(map[string]any{}) - match3 := ts.createProduct(map[string]any{}) + match1 := ts.createProduct("", 0, 0, false) + match2 := ts.createProduct("", 0, 0, false) + match3 := ts.createProduct("", 0, 0, false) entities, err := ts.crudProductService.GetEntities(map[string]any{}) ts.Nil(err) @@ -197,9 +197,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNo } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { - ts.createProduct(map[string]any{ - "string": "something_else", - }) + ts.createProduct("something_else", 0, 0, false) params := map[string]any{ "string": "not_match", @@ -211,12 +209,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNo } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { - match := ts.createProduct(map[string]any{ - "string": "match", - }) - ts.createProduct(map[string]any{ - "string": "something_else", - }) + match := ts.createProduct("match", 0, 0, false) + ts.createProduct("not_match", 0, 0, false) params := map[string]any{ "string": "match", @@ -228,15 +222,9 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnly } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { - match1 := ts.createProduct(map[string]any{ - "string": "match", - }) - match2 := ts.createProduct(map[string]any{ - "string": "match", - }) - ts.createProduct(map[string]any{ - "string": "something_else", - }) + match1 := ts.createProduct("match", 0, 0, false) + match2 := ts.createProduct("match", 0, 0, false) + ts.createProduct("not_match", 0, 0, false) params := map[string]any{ "string": "match", @@ -248,9 +236,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleI } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsDBError() { - ts.createProduct(map[string]any{ - "string": "match", - }) + ts.createProduct("match", 0, 0, false) params := map[string]any{ "not_exists": "not_exists", @@ -261,14 +247,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistR } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { - match := ts.createProduct(map[string]any{ - "string": "match", - "int": 1, - }) - ts.createProduct(map[string]any{ - "string": "not_match", - "int": 2, - }) + match := ts.createProduct("match", 1, 0, false) + ts.createProduct("not_match", 2, 0, false) params := map[string]any{ "int": 1.0, @@ -280,10 +260,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeReturnsDBError() { - ts.createProduct(map[string]any{ - "string": "not_match", - "int": 1, - }) + ts.createProduct("not_match", 1, 0, false) params := map[string]any{ "int": "not_an_int", @@ -294,14 +271,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeRe } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { - match := ts.createProduct(map[string]any{ - "string": "match", - "float": 1.1, - }) - ts.createProduct(map[string]any{ - "string": "not_match", - "float": 2.0, - }) + match := ts.createProduct("match", 0, 1.1, false) + ts.createProduct("not_match", 0, 2.2, false) params := map[string]any{ "float": 1.1, @@ -313,14 +284,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { - match := ts.createProduct(map[string]any{ - "string": "match", - "bool": true, - }) - ts.createProduct(map[string]any{ - "string": "not_match", - "bool": false, - }) + match := ts.createProduct("match", 0, 0.0, true) + ts.createProduct("not_match", 0, 0.0, false) params := map[string]any{ "bool": true, @@ -332,8 +297,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { - product1 := ts.createProduct(map[string]any{}) - product2 := ts.createProduct(map[string]any{}) + product1 := ts.createProduct("", 0, 0.0, false) + product2 := ts.createProduct("", 0, 0.0, false) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -351,27 +316,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { - match1 := ts.createProduct(map[string]any{ - "string": "match", - "int": 1, - "bool": true, - }) - match2 := ts.createProduct(map[string]any{ - "string": "match", - "int": 1, - "bool": true, - }) + match1 := ts.createProduct("match", 1, 0.0, true) + match2 := ts.createProduct("match", 1, 0.0, true) - ts.createProduct(map[string]any{ - "string": "not_match", - "int": 1, - "bool": true, - }) - ts.createProduct(map[string]any{ - "string": "match", - "int": 2, - "bool": true, - }) + ts.createProduct("not_match", 1, 0.0, true) + ts.createProduct("match", 2, 0.0, true) params := map[string]any{ "string": "match", @@ -385,12 +334,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDiffer } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { - product1 := ts.createProduct(map[string]any{ - "int": 1, - }) - product2 := ts.createProduct(map[string]any{ - "int": 2, - }) + product1 := ts.createProduct("", 1, 0.0, false) + product2 := ts.createProduct("", 2, 0.0, false) match := ts.createSale(0, product1, nil) ts.createSale(0, product2, nil) @@ -407,12 +352,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsT } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { - product1 := ts.createProduct(map[string]any{ - "int": 1, - }) - product2 := ts.createProduct(map[string]any{ - "int": 2, - }) + product1 := ts.createProduct("", 1, 0.0, false) + product2 := ts.createProduct("", 2, 0.0, false) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -548,14 +489,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMan } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { - product1 := ts.createProduct(map[string]any{ - "int": 1, - "string": "match", - }) - product2 := ts.createProduct(map[string]any{ - "int": 2, - "string": "match", - }) + product1 := ts.createProduct("match", 1, 0.0, false) + product2 := ts.createProduct("match", 2, 0.0, false) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -576,12 +511,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffer } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { - product1 := ts.createProduct(map[string]any{ - "int": 1, - }) - product2 := ts.createProduct(map[string]any{ - "int": 2, - }) + product1 := ts.createProduct("", 1, 0.0, false) + product2 := ts.createProduct("", 2, 0.0, false) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -603,12 +534,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFilte } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { - product1 := ts.createProduct(map[string]any{ - "int": 1, - }) - product2 := ts.createProduct(map[string]any{ - "int": 2, - }) + product1 := ts.createProduct("", 1, 0.0, false) + product2 := ts.createProduct("", 2, 0.0, false) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -633,8 +560,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferen } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { - product1 := ts.createProduct(map[string]any{}) - product2 := ts.createProduct(map[string]any{}) + product1 := ts.createProduct("", 0, 0.0, false) + product2 := ts.createProduct("", 0, 0.0, false) company1 := ts.createCompany("ditrit") company2 := ts.createCompany("orness") @@ -661,8 +588,14 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultiple // ------------------------- utils ------------------------- -func (ts *CRUDServiceIntTestSuite) createProduct(values map[string]any) *Product { - entity, err := ts.crudProductService.CreateEntity(values) +func (ts *CRUDServiceIntTestSuite) createProduct(stringV string, intV int, floatV float64, boolV bool) *Product { + entity := &Product{ + String: stringV, + Int: intV, + Float: floatV, + Bool: boolV, + } + err := ts.db.Create(entity).Error ts.Nil(err) return entity From eb9f99fdd9e0be3366a8235111f853145ab79b95 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 15:39:30 +0200 Subject: [PATCH 163/467] better function comments --- badorm/crudRepository.go | 73 +++++++++++++++++++++++++++++++--------- badorm/crudService.go | 7 ++-- controllers/crud.go | 4 +-- 3 files changed, 64 insertions(+), 20 deletions(-) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 6f70d636..0783b469 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -13,11 +13,13 @@ import ( "gorm.io/gorm/schema" ) +// supported types for model identifier type BadaasID interface { int | uuid.UUID } // Generic CRUD Repository +// T can be any model whose identifier attribute is of type ID type CRUDRepository[T any, ID BadaasID] interface { // create Create(tx *gorm.DB, entity *T) error @@ -62,7 +64,7 @@ func NewCRUDRepository[T any, ID BadaasID]( } } -// Create an entity of a Model +// Create object "entity" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) Create(tx *gorm.DB, entity *T) error { err := tx.Create(entity).Error if err != nil { @@ -72,7 +74,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) Create(tx *gorm.DB, entity *T) erro return nil } -// Delete an entity of a Model +// Delete object "entity" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) Delete(tx *gorm.DB, entity *T) error { err := tx.Delete(entity).Error if err != nil { @@ -82,7 +84,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) Delete(tx *gorm.DB, entity *T) erro return nil } -// Save an entity of a Model +// Save object "entity" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) Save(tx *gorm.DB, entity *T) error { err := tx.Save(entity).Error if err != nil { @@ -92,7 +94,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) Save(tx *gorm.DB, entity *T) error return nil } -// Get an entity of a Model By ID +// Get an object by "id" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, error) { var entity T err := tx.First(&entity, "id = ?", id).Error @@ -103,6 +105,11 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, er return &entity, nil } +// Get an object that matches "conditions" inside transaction "tx" +// "conditions" is in {"attributeName": expectedValue} format +// in case of join "conditions" can have the format: +// +// {"relationAttributeName": {"attributeName": expectedValue}} func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions map[string]any) (T, error) { entity, err := repository.GetOptional(tx, conditions) var nilValue T @@ -117,6 +124,11 @@ func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions map[str return *entity, nil } +// Get an object or nil that matches "conditions" inside transaction "tx" +// "conditions" is in {"attributeName": expectedValue} format +// in case of join "conditions" can have the format: +// +// {"relationAttributeName": {"attributeName": expectedValue}} func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) { entities, err := repository.GetMultiple(tx, conditions) if err != nil { @@ -132,7 +144,11 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions return nil, nil } -// Get all entities of a Model +// Get the list of objects that match "conditions" inside transaction "tx" +// "conditions" is in {"attributeName": expectedValue} format +// in case of join "conditions" can have the format: +// +// {"relationAttributeName": {"attributeName": expectedValue}} func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) { thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) if err != nil { @@ -168,6 +184,9 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions return entities, err } +// Get the name of the table in "db" in which the data for "entity" is saved +// returns error is table name can not be found by gorm, +// probably because the type of "entity" is not registered using AddModel func getTableName(db *gorm.DB, entity any) (string, error) { schemaName, err := schema.Parse(entity, &sync.Map{}, db.NamingStrategy) if err != nil { @@ -177,15 +196,17 @@ func getTableName(db *gorm.DB, entity any) (string, error) { return schemaName.Table, nil } +// Get the list of objects of type T func (repository *CRUDRepositoryImpl[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { return repository.GetMultiple(tx, map[string]any{}) } -// Adds a join to the "query" by the "attributeName" that must be relation type -// then, adds the verification that the values for the joined entity are "expectedValues" +// Adds a join to the "query" by the "joinAttributeName" +// then, adds the verification that the joined values match "conditions" -// "expectedValues" is in {"attributeName": expectedValue} format -// previousEntity is pointer +// "conditions" is in {"attributeName": expectedValue} format +// "previousEntity" is a pointer to a object from where we navigate the relationship +// "previousTableName" is the name of the table where the previous object is saved and from we the join will we done func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( query *gorm.DB, previousEntity any, previousTableName, joinAttributeName string, @@ -266,6 +287,16 @@ func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( return nil } +// Given a map of "conditions" that is in {"attributeName": expectedValue} format +// and in case of join "conditions" can have the format: +// +// {"relationAttributeName": {"attributeName": expectedValue}} +// +// it divides the map in two: +// the conditions that will be applied to the current entity ({"attributeName": expectedValue} format) +// the conditions that will generate a join with another entity ({"relationAttributeName": {"attributeName": expectedValue}} format) +// +// Returns error if any expectedValue is not of a supported type func divideConditionsByEntity( conditions map[string]any, ) (map[string]any, map[string]map[string]any, error) { @@ -286,14 +317,22 @@ func divideConditionsByEntity( return thisEntityConditions, joinConditions, nil } -// entity can be a pointer of not, now only works with pointer +// Returns an object of the type of the "entity" attribute called "relationName" +// and a boolean value indicating whether the id attribute that relates them +// in the database is in the "entity"'s table. +// Returns error if "entity" not a relation called "relationName". func getRelatedObject(entity any, relationName string) (any, bool, error) { entityType := getEntityType(entity) field, isPresent := entityType.FieldByName(relationName) if !isPresent { // some gorm relations dont have a direct relation in the model, only the id - return getRelatedObjectByID(entityType, relationName) + relatedObject, err := getRelatedObjectByID(entityType, relationName) + if err != nil { + return nil, false, err + } + + return relatedObject, true, nil } _, isIDPresent := entityType.FieldByName(relationName + "ID") @@ -301,6 +340,7 @@ func getRelatedObject(entity any, relationName string) (any, bool, error) { return createObject(field.Type), isIDPresent, nil } +// Get the reflect.Type of any entity or pointer to entity func getEntityType(entity any) reflect.Type { entityType := reflect.TypeOf(entity) @@ -312,20 +352,23 @@ func getEntityType(entity any) reflect.Type { return entityType } -func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, bool, error) { +// Returns an object of the type of the "entity" attribute called "relationName" + "ID" +// Returns error if "entity" not a relation called "relationName" + "ID" +func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, error) { _, isPresent := entityType.FieldByName(relationName + "ID") if !isPresent { - return nil, false, ErrObjectsNotRelated(entityType.Name(), relationName) + return nil, ErrObjectsNotRelated(entityType.Name(), relationName) } fieldType, isPresent := modelsMapping[relationName] if !isPresent { - return nil, false, ErrModelNotRegistered(entityType.Name(), relationName) + return nil, ErrModelNotRegistered(entityType.Name(), relationName) } - return createObject(fieldType), true, nil + return createObject(fieldType), nil } +// Creates an object of type reflect.Type using reflection func createObject(entityType reflect.Type) any { return reflect.New(entityType).Elem().Interface() } diff --git a/badorm/crudService.go b/badorm/crudService.go index b64fc48b..539e7688 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -7,6 +7,7 @@ import ( "gorm.io/gorm" ) +// T can be any model whose identifier attribute is of type ID type CRUDService[T any, ID BadaasID] interface { GetEntity(id ID) (*T, error) GetEntities(conditions map[string]any) ([]*T, error) @@ -15,7 +16,7 @@ type CRUDService[T any, ID BadaasID] interface { // check interface compliance var _ CRUDService[models.User, uuid.UUID] = (*crudServiceImpl[models.User, uuid.UUID])(nil) -// Implementation of the Generic CRUD Repository +// Implementation of the CRUD Service type crudServiceImpl[T any, ID BadaasID] struct { CRUDService[T, ID] logger *zap.Logger @@ -35,12 +36,12 @@ func NewCRUDService[T any, ID BadaasID]( } } -// Get the Entity of type with name "entityTypeName" that has the "id" +// Get the object of type T that has the "id" func (service *crudServiceImpl[T, ID]) GetEntity(id ID) (*T, error) { return service.repository.GetByID(service.db, id) } -// Get entities of type with name "entityTypeName" that match all "conditions" +// Get entities of type T that match all "conditions" // // "conditions" is in {"attributeName": expectedValue} format // in case of join "conditions" can have the format: diff --git a/controllers/crud.go b/controllers/crud.go index 3f64442e..9f21b553 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -46,13 +46,13 @@ func NewCRUDController[T any]( } -// The concrete implementation of the EAVController +// The concrete implementation of the CRUDController type crudControllerImpl[T any] struct { logger *zap.Logger crudService badorm.CRUDService[T, uuid.UUID] } -// The handler responsible of the retrieval of one objects +// The handler responsible of the retrieval of one object func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityID, herr := getEntityIDFromRequest(r) if herr != nil { From 305d1798eee5d972215dabd38f1f0eefaa57a384 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 16:09:21 +0200 Subject: [PATCH 164/467] BaseModel to badorm --- CONTRIBUTING.md | 2 +- README.md | 2 +- .../BaseModel.go => badorm/baseModels.go | 13 ++++++++--- badorm/crudRepository.go | 6 ----- badorm/crudService.go | 3 +-- controllers/basicAuth_test.go | 5 ++-- persistence/models/Attribute.go | 3 ++- persistence/models/Entity.go | 3 ++- persistence/models/EntityType.go | 4 +++- persistence/models/Entity_test.go | 13 ++++++----- persistence/models/Session.go | 3 ++- persistence/models/User.go | 4 +++- persistence/models/Value.go | 3 ++- persistence/models/Value_test.go | 9 ++++---- services/sessionservice/session_test.go | 23 ++++++++++--------- test_integration/crudService.go | 19 ++++++++------- 16 files changed, 63 insertions(+), 52 deletions(-) rename persistence/models/BaseModel.go => badorm/baseModels.go (68%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9959373d..42f0fa3e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -63,7 +63,7 @@ This is the directory structure we use for the project: - `logger/` *(Go code)*: Contains the logger creation logic. Please don't call it from your own services and code, use the dependency injection system. - `persistance/` *(Go code)*: - `gormdatabase/` *(Go code)*: Contains the logic to create a database. Also contains a go package named `gormzap`: it is a compatibility layer between *gorm.io/gorm* and *github.com/uber-go/zap*. - - `models/` *(Go code)*: Contains the models. (For a structure to me considered a valid model, it has to embed `models.BaseModel` and satisfy the `models.Tabler` interface. This interface returns the name of the sql table.). + - `models/` *(Go code)*: Contains the models. (For a structure to me considered a valid model, it has to embed `badorm.UUIDModel` and satisfy the `models.Tabler` interface. This interface returns the name of the sql table.). - `dto/` *(Go code)*: Contains the Data Transfer Objects. They are used mainly to decode json payloads. - `pagination/` *(Go code)*: Contains the pagination logic. - `repository/` *(Go code)*: Contains the repository interfaces and implementations to manage queries to the database. diff --git a/README.md b/README.md index 6eb76c2d..7a7ab7f2 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ Badaas provides several key features: ### Example -To quickly get badaas up and running, you can head to the [miniblog example](https://github.com/ditrit/badaas-example). This example will help you to see how to use badaas and as a template to start your own project +To quickly get badaas up and running, you can head to the [miniblog example](https://github.com/ditrit/badaas-example). This example will help you to see how to use badaas and as a template to start your own project. ### Step-by-step instructions diff --git a/persistence/models/BaseModel.go b/badorm/baseModels.go similarity index 68% rename from persistence/models/BaseModel.go rename to badorm/baseModels.go index cf2beb2c..fad0d382 100644 --- a/persistence/models/BaseModel.go +++ b/badorm/baseModels.go @@ -1,4 +1,4 @@ -package models +package badorm import ( "time" @@ -8,13 +8,20 @@ import ( "gorm.io/gorm" ) +// supported types for model identifier +type BadaasID interface { + uint | uuid.UUID +} + // Base Model for gorm // -// Every model intended to be saved in the database must embed this BaseModel +// Every model intended to be saved in the database must embed this badorm.UUIDModel // reference: https://gorm.io/docs/models.html#gorm-Model -type BaseModel struct { +type UUIDModel struct { ID uuid.UUID `gorm:"primarykey;type:uuid;default:uuid_generate_v4()"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` } + +type UIntModel gorm.Model diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 0783b469..58733829 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -7,17 +7,11 @@ import ( "sync" "github.com/ditrit/badaas/configuration" - "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" "gorm.io/gorm/schema" ) -// supported types for model identifier -type BadaasID interface { - int | uuid.UUID -} - // Generic CRUD Repository // T can be any model whose identifier attribute is of type ID type CRUDRepository[T any, ID BadaasID] interface { diff --git a/badorm/crudService.go b/badorm/crudService.go index 539e7688..4d3f0606 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -1,7 +1,6 @@ package badorm import ( - "github.com/ditrit/badaas/persistence/models" "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" @@ -14,7 +13,7 @@ type CRUDService[T any, ID BadaasID] interface { } // check interface compliance -var _ CRUDService[models.User, uuid.UUID] = (*crudServiceImpl[models.User, uuid.UUID])(nil) +var _ CRUDService[UUIDModel, uuid.UUID] = (*crudServiceImpl[UUIDModel, uuid.UUID])(nil) // Implementation of the CRUD Service type crudServiceImpl[T any, ID BadaasID] struct { diff --git a/controllers/basicAuth_test.go b/controllers/basicAuth_test.go index 99cb32cd..3c7fc076 100644 --- a/controllers/basicAuth_test.go +++ b/controllers/basicAuth_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/httperrors" mocksSessionService "github.com/ditrit/badaas/mocks/services/sessionservice" @@ -95,7 +96,7 @@ func Test_BasicLoginHandler_LoginFailed(t *testing.T) { ) userService := mocksUserService.NewUserService(t) user := &models.User{ - BaseModel: models.BaseModel{}, + UUIDModel: badorm.UUIDModel{}, Username: "bob", Email: "bob@email.com", Password: []byte("hash of 1234"), @@ -138,7 +139,7 @@ func Test_BasicLoginHandler_LoginSuccess(t *testing.T) { ) userService := mocksUserService.NewUserService(t) user := &models.User{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuid.Nil, }, Username: "bob", diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index 6aa01898..d12ef473 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" + "github.com/ditrit/badaas/badorm" "github.com/google/uuid" ) @@ -20,7 +21,7 @@ const ( // Describe the attribute of a en EntityType type Attribute struct { - BaseModel + badorm.UUIDModel Name string `gorm:"uniqueIndex:unique_name_entity_type"` Unique bool // TODO validate this Required bool diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 61078097..44516e8b 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -3,12 +3,13 @@ package models import ( "encoding/json" + "github.com/ditrit/badaas/badorm" "github.com/google/uuid" ) // Describe an instance of an EntityType type Entity struct { - BaseModel + badorm.UUIDModel Fields []*Value // GORM relations diff --git a/persistence/models/EntityType.go b/persistence/models/EntityType.go index 327b8e35..6bd6406a 100644 --- a/persistence/models/EntityType.go +++ b/persistence/models/EntityType.go @@ -1,8 +1,10 @@ package models +import "github.com/ditrit/badaas/badorm" + // Describe an object type type EntityType struct { - BaseModel + badorm.UUIDModel Name string `gorm:"unique;not null"` // GORM relations diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go index 4e2d2005..742e993b 100644 --- a/persistence/models/Entity_test.go +++ b/persistence/models/Entity_test.go @@ -3,6 +3,7 @@ package models import ( "testing" + "github.com/ditrit/badaas/badorm" "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -10,11 +11,11 @@ import ( func TestMarshall(t *testing.T) { id := uuid.MustParse("11e1d4b8-701d-47cc-852f-6d36922bcc75") ett := &EntityType{ - BaseModel: BaseModel{ID: id}, + UUIDModel: badorm.UUIDModel{ID: id}, Name: "bird", Attributes: []*Attribute{ { - BaseModel: BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: id, }, Name: "color", @@ -23,7 +24,7 @@ func TestMarshall(t *testing.T) { EntityTypeID: id, }, { - BaseModel: BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: id, }, Name: "heigh", @@ -34,12 +35,12 @@ func TestMarshall(t *testing.T) { } et := &Entity{ - BaseModel: BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: id, }, Fields: []*Value{ { - BaseModel: BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: id, }, @@ -50,7 +51,7 @@ func TestMarshall(t *testing.T) { Attribute: ett.Attributes[0], }, { - BaseModel: BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: id, }, diff --git a/persistence/models/Session.go b/persistence/models/Session.go index cf6d0a22..fec4ec3e 100644 --- a/persistence/models/Session.go +++ b/persistence/models/Session.go @@ -3,12 +3,13 @@ package models import ( "time" + "github.com/ditrit/badaas/badorm" "github.com/google/uuid" ) // Represent a user session type Session struct { - BaseModel + badorm.UUIDModel UserID uuid.UUID `gorm:"not null"` ExpiresAt time.Time `gorm:"not null"` } diff --git a/persistence/models/User.go b/persistence/models/User.go index d65aa425..24543248 100644 --- a/persistence/models/User.go +++ b/persistence/models/User.go @@ -1,8 +1,10 @@ package models +import "github.com/ditrit/badaas/badorm" + // Represents a user type User struct { - BaseModel + badorm.UUIDModel Username string `gorm:"not null"` Email string `gorm:"unique;not null"` diff --git a/persistence/models/Value.go b/persistence/models/Value.go index e14724fc..b8fdd4ae 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -4,12 +4,13 @@ import ( "errors" "fmt" + "github.com/ditrit/badaas/badorm" "github.com/google/uuid" ) // Describe the attribute value of an Entity type Value struct { - BaseModel + badorm.UUIDModel IsNull bool StringVal string FloatVal float64 diff --git a/persistence/models/Value_test.go b/persistence/models/Value_test.go index b79aa326..76f64ddd 100644 --- a/persistence/models/Value_test.go +++ b/persistence/models/Value_test.go @@ -4,6 +4,7 @@ import ( "fmt" "testing" + "github.com/ditrit/badaas/badorm" "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -28,14 +29,14 @@ func TestRelationValueEntityHasToBeTheTargetOfTheAttribute(t *testing.T) { carEttID := uuid.New() brandEtt := &EntityType{ - BaseModel: BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: brandEttID, }, Name: "brand", } carEtt := &EntityType{ - BaseModel: BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: carEttID, }, Name: "car", @@ -60,14 +61,14 @@ func TestRelationValueEntityHasToBeTheTargetOfTheAttribute(t *testing.T) { func TestRelationValueWithCorrespondingEntity(t *testing.T) { brandEtt := &EntityType{ - BaseModel: BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuid.New(), }, Name: "brand", } carEtt := &EntityType{ - BaseModel: BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuid.New(), }, Name: "car", diff --git a/services/sessionservice/session_test.go b/services/sessionservice/session_test.go index fb31d83e..5d2c3830 100644 --- a/services/sessionservice/session_test.go +++ b/services/sessionservice/session_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" badormMocks "github.com/ditrit/badaas/mocks/badorm" configurationMocks "github.com/ditrit/badaas/mocks/configuration" @@ -92,7 +93,7 @@ func TestIsValid(t *testing.T) { sessionRepositoryMock.On("Create", gormDB, mock.Anything).Return(nil) uuidSample := uuid.New() session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, UserID: uuid.Nil, @@ -125,7 +126,7 @@ func TestLogOutUser(t *testing.T) { sessionRepositoryMock.On("Delete", gormDB, mock.Anything).Return(nil) uuidSample := uuid.New() session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, UserID: uuid.Nil, @@ -145,7 +146,7 @@ func TestLogOutUserDbError(t *testing.T) { uuidSample := uuid.New() session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, UserID: uuid.Nil, @@ -165,7 +166,7 @@ func TestLogOutUser_SessionNotFound(t *testing.T) { uuidSample := uuid.New() session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuid.Nil, }, UserID: uuid.Nil, @@ -188,7 +189,7 @@ func TestRollSession(t *testing.T) { uuidSample := uuid.New() originalExpirationTime := time.Now().Add(sessionDuration / 5) session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuid.Nil, }, UserID: uuid.Nil, @@ -208,7 +209,7 @@ func TestRollSession_Expired(t *testing.T) { uuidSample := uuid.New() originalExpirationTime := time.Now().Add(-time.Hour) session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, UserID: uuid.Nil, @@ -228,7 +229,7 @@ func TestRollSession_falseUUID(t *testing.T) { uuidSample := uuid.New() originalExpirationTime := time.Now().Add(-time.Hour) session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuid.Nil, }, UserID: uuid.Nil, @@ -261,7 +262,7 @@ func TestRollSession_sessionNotFound(t *testing.T) { func Test_pullFromDB(t *testing.T) { sessionRepositoryMock, service, logs, _ := setupTest(t) session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuid.Nil, }, UserID: uuid.Nil, @@ -289,7 +290,7 @@ func Test_removeExpired(t *testing.T) { sessionRepositoryMock, service, logs, _ := setupTest(t) uuidSample := uuid.New() session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuid.Nil, }, UserID: uuid.Nil, @@ -314,7 +315,7 @@ func Test_removeExpired_RepositoryError(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) uuidSample := uuid.New() session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuid.Nil, }, UserID: uuid.Nil, @@ -332,7 +333,7 @@ func Test_get(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) uuidSample := uuid.New() session := &models.Session{ - BaseModel: models.BaseModel{ + UUIDModel: badorm.UUIDModel{ ID: uuid.Nil, }, UserID: uuid.Nil, diff --git a/test_integration/crudService.go b/test_integration/crudService.go index 69a906f1..13c17da5 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -3,7 +3,6 @@ package integrationtests import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/gormdatabase" - "github.com/ditrit/badaas/persistence/models" "github.com/google/uuid" "github.com/stretchr/testify/suite" "go.uber.org/zap" @@ -11,14 +10,14 @@ import ( ) type Company struct { - models.BaseModel + badorm.UUIDModel Name string Sellers []Seller // Company HasMany Sellers (Company 1 -> 0..* Seller) } type Product struct { - models.BaseModel + badorm.UUIDModel String string Int int @@ -27,14 +26,14 @@ type Product struct { } type Seller struct { - models.BaseModel + badorm.UUIDModel Name string CompanyID *uuid.UUID // Company HasMany Sellers (Company 1 -> 0..* Seller) } type Sale struct { - models.BaseModel + badorm.UUIDModel Code int @@ -60,14 +59,14 @@ func (m Seller) Equal(other Seller) bool { } type Country struct { - models.BaseModel + badorm.UUIDModel Name string Capital City // Country HasOne City (Country 1 -> 1 City) } type City struct { - models.BaseModel + badorm.UUIDModel Name string CountryID uuid.UUID // Country HasOne City (Country 1 -> 1 City) @@ -82,7 +81,7 @@ func (m City) Equal(other City) bool { } type Employee struct { - models.BaseModel + badorm.UUIDModel Name string Boss *Employee // Self-Referential Has One (Employee 0..* -> 0..1 Employee) @@ -94,7 +93,7 @@ func (m Employee) Equal(other Employee) bool { } type Person struct { - models.BaseModel + badorm.UUIDModel Name string } @@ -104,7 +103,7 @@ func (m Person) TableName() string { } type Bicycle struct { - models.BaseModel + badorm.UUIDModel Name string // Bicycle BelongsTo Person (Bicycle 0..* -> 1 Person) From 3a4b50effc827487187f3ce40ee01a6ac02b5d6a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 15 May 2023 17:19:18 +0200 Subject: [PATCH 165/467] remove pagination configuration from repository until necesary --- badorm/crudRepository.go | 8 ++------ persistence/gormdatabase/db.go | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 58733829..8c040fa6 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -6,7 +6,6 @@ import ( "reflect" "sync" - "github.com/ditrit/badaas/configuration" "go.uber.org/zap" "gorm.io/gorm" "gorm.io/gorm/schema" @@ -43,18 +42,15 @@ var ( // Implementation of the Generic CRUD Repository type CRUDRepositoryImpl[T any, ID BadaasID] struct { CRUDRepository[T, ID] - logger *zap.Logger - paginationConfiguration configuration.PaginationConfiguration + logger *zap.Logger } // Constructor of the Generic CRUD Repository func NewCRUDRepository[T any, ID BadaasID]( logger *zap.Logger, - paginationConfiguration configuration.PaginationConfiguration, ) CRUDRepository[T, ID] { return &CRUDRepositoryImpl[T, ID]{ - logger: logger, - paginationConfiguration: paginationConfiguration, + logger: logger, } } diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index dae21ba9..5b8d4450 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -43,7 +43,7 @@ func SetupDatabaseConnection( database, err = initializeDBFromDsn(dsn, logger) if err == nil { logger.Sugar().Debugf("Database connection is active") - return database, err + return database, nil } logger.Sugar().Debugf("Database connection failed with error %q", err.Error()) logger.Sugar().Debugf("Retrying database connection %d/%d in %s", From 7fae89e5f2c37b65f1094c67b3cd513c0e8ab2fc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 09:49:21 +0200 Subject: [PATCH 166/467] support ints again --- badorm/crudRepository.go | 2 +- test_integration/crudService.go | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 8c040fa6..99ca16c0 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -295,7 +295,7 @@ func divideConditionsByEntity( for attributeName, expectedValue := range conditions { switch typedExpectedValue := expectedValue.(type) { - case float64, bool, string: + case float64, bool, string, int: thisEntityConditions[attributeName] = expectedValue case map[string]any: joinConditions[attributeName] = typedExpectedValue diff --git a/test_integration/crudService.go b/test_integration/crudService.go index 13c17da5..97cc0eab 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -250,7 +250,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { ts.createProduct("not_match", 2, 0, false) params := map[string]any{ - "int": 1.0, + "int": 1, } entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) @@ -323,7 +323,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDiffer params := map[string]any{ "string": "match", - "int": 1.0, + "int": 1, "bool": true, } entities, err := ts.crudProductService.GetEntities(params) @@ -341,7 +341,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsT params := map[string]any{ "Product": map[string]any{ - "int": 1.0, + "int": 1, }, } entities, err := ts.crudSaleService.GetEntities(params) @@ -440,7 +440,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsReturnsErrorIfNoRelation() { params := map[string]any{ "NotExists": map[string]any{ - "int": 1.0, + "int": 1, }, } _, err := ts.crudSaleService.GetEntities(params) @@ -499,7 +499,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffer params := map[string]any{ "Product": map[string]any{ - "int": 1.0, + "int": 1, "string": "match", }, } @@ -522,9 +522,9 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFilte params := map[string]any{ "Product": map[string]any{ - "int": 1.0, + "int": 1, }, - "code": 1.0, + "code": 1, } entities, err := ts.crudSaleService.GetEntities(params) ts.Nil(err) @@ -546,7 +546,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferen params := map[string]any{ "Product": map[string]any{ - "int": 1.0, + "int": 1, }, "Seller": map[string]any{ "name": "franco", From 97ebc34856aa63bb7c792c5b34ac4c12487b20b6 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 10:23:49 +0200 Subject: [PATCH 167/467] add badorm docs2 --- README.md | 36 +++++++++++++++---------- badorm/README.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 88 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 7a7ab7f2..2bf370f4 100644 --- a/README.md +++ b/README.md @@ -2,29 +2,39 @@ Badaas enables the effortless construction of ***distributed, resilient, highly available and secure applications by design***, while ensuring very simple deployment and management (NoOps). -Badaas provides several key features: - -- **Authentication**: Badaas can authenticate users using its internal authentication scheme or externally by using protocols such as OIDC, SAML, Oauth2... -- **Authorization**: On resource access, Badaas will check if the user is authorized using a RBAC model. -- **Distribution**: Badaas is built to run in clusters by default. Communications between nodes are TLS encrypted using [shoset](https://github.com/ditrit/shoset). -- **Persistence**: Applicative objects are persisted as well as user files. Those resources are shared across the clusters to increase resiliency. -- **Querying Resources**: Resources are accessible via a REST API. -- **Posix compliant**: Badaas strives towards being a good unix citizen and respecting commonly accepted norms. (see [Configuration](#configuration)) -- **Advanced logs management**: Badaas provides an interface to interact with the logs produced by the clusters. Logs are formatted in json by default. +> **Warning** +> BaDaaS is still under development. Each of its components can have a different state of evolution that you can consult in [Features and components](#features-and-components) - [BADAAS: Backend And Distribution As A Service](#badaas-backend-and-distribution-as-a-service) + - [Features and components](#features-and-components) - [Quickstart](#quickstart) - [Example](#example) - [Step-by-step instructions](#step-by-step-instructions) - - [Configuration](#configuration) + - [Provided functionalities](#provided-functionalities) + - [InfoControllerModule](#infocontrollermodule) + - [AuthControllerModule](#authcontrollermodule) + - [EAVControllerModule](#eavcontrollermodule) + - [Configuration](#configuration) - [Contributing](#contributing) - [License](#license) +## Features and components + +Badaas provides several key features, each provided by a component that can be used independently and has a different state of evolution: + +- **Authentication**(unstable): Badaas can authenticate users using its internal authentication scheme or externally by using protocols such as OIDC, SAML, Oauth2... +- **Authorization**(wip_unstable): On resource access, Badaas will check if the user is authorized using a RBAC model. +- **Distribution**(todo): Badaas is built to run in clusters by default. Communications between nodes are TLS encrypted using [shoset](https://github.com/ditrit/shoset). +- **Persistence**(wip_unstable): Applicative objects are persisted as well as user files. Those resources are shared across the clusters to increase resiliency. To achieve this, BaDaaS uses the [BaDorm](https://github.com/ditrit/badaas/badorm) component. +- **Querying Resources**(unstable): Resources are accessible via a REST API. +- **Posix compliant**(stable): Badaas strives towards being a good unix citizen and respecting commonly accepted norms. (see [Configuration](#configuration)) +- **Advanced logs management**(todo): Badaas provides an interface to interact with the logs produced by the clusters. Logs are formatted in json by default. + ## Quickstart ### Example -To quickly get badaas up and running, you can head to the [miniblog example](https://github.com/ditrit/badaas-example). This example will help you to see how to use badaas and as a template to start your own project. +To quickly get badaas up and running, you can head to the [example](https://github.com/ditrit/badaas-example). This example will help you to see how to use badaas and as a template to start your own project. ### Step-by-step instructions @@ -32,9 +42,7 @@ Once you have started your project with `go init`, you must add the dependency t ```bash -go get -u github.com/ditrit/badaas@cbd4c9e035709de25df59ec17e4b302b3a7b9931 -go get -u github.com/uber-go/fx -go get -u github.com/ditrit/verdeter +go get -u github.com/ditrit/badaas@83b120f0853bce9dccb32fd27e858aa0fd71d0e6 github.com/uber-go/fx github.com/ditrit/verdeter ``` Then, your application must be defined as a `verdeter command` and you have to call the configuration of this command: diff --git a/badorm/README.md b/badorm/README.md index 3e5b685e..af1113ee 100644 --- a/badorm/README.md +++ b/badorm/README.md @@ -1,3 +1,67 @@ -# BaDORM: the ORM for BaDaaS +# BaDorm: Backend and Distribution ORM (Object Relational Mapping) - \ No newline at end of file +BaDorm is the BaDaaS component that allows for easy persistence and querying of objects. It is built on top of gorm and adds for each entity a service and a repository that allows complex queries without any extra effort. + +BaDorm can be used both within a BaDaaS application and as a stand-alone application. + +- [BaDorm: Backend and Distribution ORM (Object Relational Mapping)](#badorm-backend-and-distribution-orm-object-relational-mapping) + - [Quickstart](#quickstart) + - [Stand-alone Example](#stand-alone-example) + - [BaDaaS Example](#badaas-example) + - [Step-by-step instructions](#step-by-step-instructions) + +## Quickstart + +### Stand-alone Example + +To quickly understand the features provided by BaDorm, you can head to the [example](https://github.com/ditrit/badorm-example). This example will help you to see how to use BaDorm and as a template to start your own project. + +### BaDaaS Example + +If you are interested in using BaDorm within a BaDaaS application you can consult the [example](https://github.com/ditrit/badaas-example) in which besides using the services and repositories provided by BaDorm, BaDaaS adds a controller that allows the query of objects via an http api. + +### Step-by-step instructions + +Once you have started your project with `go init`, you must add the dependency to BaDaaS: + + +```bash +go get -u github.com/ditrit/badaas@7fae89e +``` + +In order to use BaDorm you will also need to use the following libraries: + +```bash +go get -u github.com/uber-go/fx github.com/uber-go/zap gorm.io/gorm +``` + +First of all, you will need to start your application with `fx`: + +```go +func main() { + fx.New( + fx.Provide(NewLogger), + + // DB modules + fx.Provide(NewGORMDBConnection), + // activate BaDORM + badorm.BaDORMModule, + // start example data + badorm.GetCRUDServiceModule[models.Company, uuid.UUID](), + badorm.GetCRUDServiceModule[models.Product, uuid.UUID](), + badorm.GetCRUDServiceModule[models.Seller, uuid.UUID](), + badorm.GetCRUDServiceModule[models.Sale, uuid.UUID](), + fx.Provide(CreateCRUDObjects), + fx.Invoke(QueryCRUDObjects), + ).Run() +} +``` + +There are some things you need to provide to the BaDorm module: + +- `NewLogger` is the function that provides a zap logger to the BaDorm components. +- `NewGORMDBConnection` if the function that establish the connection to the database where you data will be saved. + +After that, you can start the `badorm.BaDORMModule` and crete the CRUD services to your models using `badorm.GetCRUDServiceModule`. + +Finally, you can call your application functions as `CreateCRUDObjects` and `QueryCRUDObjects` where created CRUDServices can be injected to create, read, update and delete your models easily. From 418074df518d16a63e95224896199d1caafc23de Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 10:26:52 +0200 Subject: [PATCH 168/467] remove TODO --- tools/badctl/cmd/docker/cockroachdb/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml b/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml index 3dee027d..fc9cef32 100644 --- a/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml +++ b/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml @@ -5,7 +5,7 @@ services: image: cockroachdb/cockroach:latest container_name: badaas-db ports: - - "26257:26257" # TODO ver si mantener esto o no, necesario en dev para conectarme a la base + - "26257:26257" - "8080:8080" # Web based dashboard command: start-single-node --insecure volumes: From c96d09ab784cb351517011783fbc47618785c157 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 10:35:53 +0200 Subject: [PATCH 169/467] run ci in all prs --- .github/workflows/CI.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 341f1ccf..2a2a2220 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -5,8 +5,7 @@ on: - main pull_request: types: [opened, synchronize, reopened] - branches: - - master + jobs: branch-naming-rules: name: Check branch name From 537821738f9f0b48985373d03c13f3c20d77a1d7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 11:22:12 +0200 Subject: [PATCH 170/467] wait until db is ready for int tests --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index fef745b1..789a7e96 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ test_unit_and_cover: test_db: docker compose -f "docker/test_db/docker-compose.yml" up -d + ./docker/wait_for_api.sh 8080/health test_integration: test_db go test ./test_integration -v From 0fb6996edddff3e0e5676c967a86186b3ea40c75 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 11:35:00 +0200 Subject: [PATCH 171/467] remove sortOption until it is necessary --- badorm/SortOption.go | 27 --------------------------- badorm/SortOption_test.go | 14 -------------- 2 files changed, 41 deletions(-) delete mode 100644 badorm/SortOption.go delete mode 100644 badorm/SortOption_test.go diff --git a/badorm/SortOption.go b/badorm/SortOption.go deleted file mode 100644 index 4447b745..00000000 --- a/badorm/SortOption.go +++ /dev/null @@ -1,27 +0,0 @@ -package badorm - -type SortOption interface { - Column() string - Desc() bool -} - -// SortOption constructor -func NewSortOption(column string, desc bool) SortOption { - return &sortOption{column, desc} -} - -// Sorting option for the repository -type sortOption struct { - column string - desc bool -} - -// return the column name to sort on -func (sortOption *sortOption) Column() string { - return sortOption.column -} - -// return true for descending sort and false for ascending -func (sortOption *sortOption) Desc() bool { - return sortOption.desc -} diff --git a/badorm/SortOption_test.go b/badorm/SortOption_test.go deleted file mode 100644 index 8078e1ff..00000000 --- a/badorm/SortOption_test.go +++ /dev/null @@ -1,14 +0,0 @@ -package badorm_test - -import ( - "testing" - - "github.com/ditrit/badaas/badorm" - "github.com/stretchr/testify/assert" -) - -func TestNewSortOption(t *testing.T) { - sortOption := badorm.NewSortOption("a", true) - assert.Equal(t, "a", sortOption.Column()) - assert.True(t, sortOption.Desc()) -} From 1a9209543c0fd14debe59e8dcfa2a305bada884a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 11:43:27 +0200 Subject: [PATCH 172/467] add getEntity tests --- test_integration/crudService.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test_integration/crudService.go b/test_integration/crudService.go index 97cc0eab..03dd103d 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/suite" "go.uber.org/zap" "gorm.io/gorm" + "gotest.tools/assert" ) type Company struct { @@ -156,6 +157,29 @@ func (ts *CRUDServiceIntTestSuite) SetupTest() { CleanDB(ts.db) } +// ------------------------- GetEntity -------------------------------- + +func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { + _, err := ts.crudProductService.GetEntity(uuid.Nil) + ts.Error(err, gorm.ErrRecordNotFound) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { + ts.createProduct("", 0, 0, false) + + _, err := ts.crudProductService.GetEntity(uuid.New()) + ts.Error(err, gorm.ErrRecordNotFound) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsTheEntityIfItIsCreate() { + match := ts.createProduct("", 0, 0, false) + + entity, err := ts.crudProductService.GetEntity(match.ID) + ts.Nil(err) + + assert.DeepEqual(ts.T(), match, entity) +} + // ------------------------- GetEntities -------------------------------- func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { From c7d09b632955467d15694a181c1801ac0e0e82db Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 12:29:38 +0200 Subject: [PATCH 173/467] add e2e tests --- test_e2e/badaas_e2e_test.go | 12 ++- test_e2e/features/badorm.feature | 38 ++++++++++ .../{object_storage.feature => eav.feature} | 0 test_e2e/http_support_test.go | 73 ++++++++++++++++--- test_e2e/test_api.go | 7 ++ test_integration/crudService.go | 3 +- 6 files changed, 122 insertions(+), 11 deletions(-) create mode 100644 test_e2e/features/badorm.feature rename test_e2e/features/{object_storage.feature => eav.feature} (100%) diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index da7a4579..a140956d 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -26,6 +26,7 @@ type TestContext struct { statusCode int json any httpClient *http.Client + db *gorm.DB } var opts = godog.Options{Output: colors.Colored(os.Stdout)} @@ -77,10 +78,16 @@ var ListOfTables = []any{ models.Attribute{}, models.Entity{}, models.EntityType{}, + integrationtests.Sale{}, + integrationtests.Product{}, + integrationtests.Seller{}, + integrationtests.Company{}, } func InitializeScenario(ctx *godog.ScenarioContext) { - t := &TestContext{} + t := &TestContext{ + db: db, + } jar, err := cookiejar.New(nil) if err != nil { panic(err) @@ -166,4 +173,7 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^I delete a "(.+)" with the object id$`, t.deleteWithObjectID) ctx.Step(`^I modify a "(.+)" with attributes$`, t.modifyWithAttributes) ctx.Step(`^a "(.+)" object exists with property "(.+)" related to last object and properties$`, t.objectExistsWithRelation) + ctx.Step(`^a sale object exists for product "(\d+)", code "(\d+)" and description "(.+)"$`, t.saleExists) + ctx.Step(`^I query all sale objects with conditions$`, t.querySalesWithConditions) + ctx.Step(`^there is a sale object with attributes$`, t.thereIsSaleWithAttributes) } diff --git a/test_e2e/features/badorm.feature b/test_e2e/features/badorm.feature new file mode 100644 index 00000000..edf3db28 --- /dev/null +++ b/test_e2e/features/badorm.feature @@ -0,0 +1,38 @@ +Feature: Saving and querying objects in the database using the BaDorm + Scenario: Created objects can be queried by a property + Given a sale object exists for product "1", code "1" and description "sale1" + And a sale object exists for product "2", code "2" and description "sale2" + When I query all sale objects with conditions + | key | value | type | + | code | 1 | integer | + Then there are "1" "sale" objects + And there is a sale object with attributes + | key | value | type | + | Code | 1 | float | + | Description | sale1 | string | + + Scenario: Created objects can be queried by multiple properties + Given a sale object exists for product "1", code "1" and description "sale1" + And a sale object exists for product "2", code "2" and description "sale2" + When I query all sale objects with conditions + | key | value | type | + | code | 1 | integer | + | description | sale1 | string | + Then there are "1" "sale" objects + And there is a sale object with attributes + | key | value | type | + | Code | 1 | float | + | Description | sale1 | string | + + Scenario: Created objects can be queried doing joins + Given a sale object exists for product "1", code "1" and description "sale1" + And a sale object exists for product "2", code "2" and description "sale2" + When I query all sale objects with conditions + | key | value | type | + | code | 1 | integer | + | Product | {"int": "1"} | json | + Then there are "1" "sale" objects + And there is a sale object with attributes + | key | value | type | + | Code | 1 | float | + | Description | sale1 | string | \ No newline at end of file diff --git a/test_e2e/features/object_storage.feature b/test_e2e/features/eav.feature similarity index 100% rename from test_e2e/features/object_storage.feature rename to test_e2e/features/eav.feature diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 083689c1..07640d6c 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -11,6 +11,7 @@ import ( "github.com/cucumber/godog" "github.com/cucumber/messages-go/v16" + integrationtests "github.com/ditrit/badaas/test_integration" "github.com/elliotchance/pie/v2" ) @@ -335,15 +336,7 @@ func (t *TestContext) thereIsObjectWithAttributes(expectedEntityType string, jso objectAttrs := objectMap["attrs"].(map[string]any) if objectMap["type"] == expectedEntityType { - allEqual := true - for attributeName, expectedValue := range expectedValues { - actualValue, isPresent := objectAttrs[attributeName] - if !isPresent || actualValue != expectedValue { - allEqual = false - } - } - - if allEqual { + if t.areAllAttributesEqual(objectAttrs, expectedValues) { return nil } } @@ -399,3 +392,65 @@ func (t *TestContext) modifyWithAttributes(entityType string, jsonTable *godog.T return nil } + +func (t *TestContext) saleExists(productInt int, code int, description string) { + product := &integrationtests.Product{ + Int: productInt, + } + + sale := &integrationtests.Sale{ + Code: code, + Description: description, + Product: *product, + } + err := t.db.Create(sale).Error + if err != nil { + log.Fatalln(err) + } +} + +func (t *TestContext) querySalesWithConditions(jsonTable *godog.Table) error { + err := t.requestWithJson( + "/objects/sale", + http.MethodGet, + jsonTable, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(http.StatusOK) + if err != nil { + return err + } + + return nil +} + +func (t *TestContext) thereIsSaleWithAttributes(jsonTable *godog.Table) error { + objectList := t.json.([]any) + expectedValues, err := buildMapFromTable(jsonTable) + if err != nil { + log.Fatalln(err) + } + + for _, object := range objectList { + if t.areAllAttributesEqual(object.(map[string]any), expectedValues) { + return nil + } + } + + return fmt.Errorf("object with attributes %v not found in %v", expectedValues, objectList) +} + +func (t *TestContext) areAllAttributesEqual(objectMap, expectedValues map[string]any) bool { + allEqual := true + for attributeName, expectedValue := range expectedValues { + actualValue, isPresent := objectMap[attributeName] + if !isPresent || actualValue != expectedValue { + allEqual = false + } + } + + return allEqual +} diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index 85de78c8..ea569e2e 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -7,8 +7,10 @@ import ( "github.com/Masterminds/semver/v3" "github.com/ditrit/badaas" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/router" + integrationtests "github.com/ditrit/badaas/test_integration" "github.com/ditrit/verdeter" "github.com/gorilla/handlers" "github.com/gorilla/mux" @@ -51,6 +53,11 @@ func runHTTPServer(cmd *cobra.Command, args []string) { router.AuthRoutesModule, router.EAVRoutesModule, + fx.Provide(badorm.AddModel[integrationtests.Company]), + fx.Provide(badorm.AddModel[integrationtests.Seller]), + fx.Provide(badorm.AddModel[integrationtests.Product]), + router.GetCRUDRoutesModule[integrationtests.Sale](), + // create httpServer fx.Provide(NewHTTPServer), diff --git a/test_integration/crudService.go b/test_integration/crudService.go index 03dd103d..abbd852f 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -36,7 +36,8 @@ type Seller struct { type Sale struct { badorm.UUIDModel - Code int + Code int + Description string // Sale belongsTo Product (Sale 0..* -> 1 Product) Product Product From a88810c7c84162df99d78ff355414f09d670cd1b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 13:48:09 +0200 Subject: [PATCH 174/467] add log of registered models --- badorm/autoMigrate.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/badorm/autoMigrate.go b/badorm/autoMigrate.go index 87a8cc12..29c875a1 100644 --- a/badorm/autoMigrate.go +++ b/badorm/autoMigrate.go @@ -1,11 +1,30 @@ package badorm import ( + "log" + "reflect" + + "github.com/elliotchance/pie/v2" "go.uber.org/zap" + "gorm.io/driver/postgres" "gorm.io/gorm" ) func autoMigrate(listOfTables []any, db *gorm.DB, logger *zap.Logger) error { + registeredModels := pie.Map(listOfTables, func(model any) string { + return reflect.TypeOf(model).String() + }) + logger.Sugar().Debug( + "Registered models: ", + registeredModels, + ) + + // TODO delete + listOrdered := db.Migrator().(postgres.Migrator).ReorderModels(listOfTables, true) + for _, element := range listOrdered { + log.Println(reflect.TypeOf(element).String()) + } + err := db.AutoMigrate(listOfTables...) if err != nil { logger.Error("migration failed") From 629891a23650d089de917bd8c29eab4cf4a7db55 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 13:55:10 +0200 Subject: [PATCH 175/467] fix lint --- Makefile | 3 +++ commands/initServerCommands.go | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 85d35935..7e3a0b77 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,8 @@ PATHS = $(shell go list ./... | tail -n +2 | grep -v test_integration | grep -v test_e2e) +lint: + golangci-lint run + test_unit: go test $(PATHS) -v diff --git a/commands/initServerCommands.go b/commands/initServerCommands.go index 8c40229e..edf42806 100644 --- a/commands/initServerCommands.go +++ b/commands/initServerCommands.go @@ -14,6 +14,9 @@ func initServerCommands(cfg *verdeter.VerdeterCommand) error { cfg.SetDefault(configuration.ServerTimeoutKey, 15) err = cfg.GKey(configuration.ServerHostKey, verdeter.IsStr, "", "Address to bind (default is 0.0.0.0)") + if err != nil { + return err + } cfg.SetDefault(configuration.ServerHostKey, "0.0.0.0") err = cfg.GKey(configuration.ServerPortKey, verdeter.IsInt, "p", "Port to bind (default is 8000)") From c3cb1fd836fefdcb661bf48ead1166b60a35d6d7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 14:30:18 +0200 Subject: [PATCH 176/467] add crud controller unit tests --- controllers/crud.go | 20 +-- controllers/crud_test.go | 219 ++++++++++++++++++++++++++++ controllers/eav.go | 49 ++----- controllers/utils.go | 16 ++ mocks/badorm/CRUDService.go | 66 --------- mocks/controllers/CRUDController.go | 84 ----------- 6 files changed, 249 insertions(+), 205 deletions(-) create mode 100644 controllers/crud_test.go diff --git a/controllers/crud.go b/controllers/crud.go index 9f21b553..4abbe43a 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -1,7 +1,6 @@ package controllers import ( - "errors" "fmt" "net/http" "strings" @@ -12,7 +11,6 @@ import ( "github.com/elliotchance/pie/v2" "github.com/google/uuid" "go.uber.org/zap" - "gorm.io/gorm" ) type CRUDController interface { @@ -60,14 +58,7 @@ func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *htt } entity, err := controller.crudService.GetEntity(entityID) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound - } - return nil, httperrors.NewDBError(err) - } - - return entity, nil + return entity, mapServiceError(err) } // The handler responsible of the retrieval of multiple objects @@ -78,12 +69,5 @@ func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *ht } entities, err := controller.crudService.GetEntities(params) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityTypeNotFound - } - return nil, httperrors.NewDBError(err) - } - - return entities, nil + return entities, mapServiceError(err) } diff --git a/controllers/crud_test.go b/controllers/crud_test.go new file mode 100644 index 00000000..21c713b4 --- /dev/null +++ b/controllers/crud_test.go @@ -0,0 +1,219 @@ +package controllers_test + +import ( + "errors" + "net/http/httptest" + "strings" + "testing" + + "github.com/ditrit/badaas/controllers" + mockBadorm "github.com/ditrit/badaas/mocks/badorm" + "github.com/google/uuid" + "github.com/gorilla/mux" + "github.com/stretchr/testify/assert" + "gorm.io/gorm" +) + +// ----------------------- GetObject ----------------------- + +type Model struct { + ID uuid.UUID +} + +func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { + crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + + route := controllers.NewCRUDController[Model]( + logger, + crudService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/exists/", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{}) + + _, err := route.Controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + +func TestCRUDGetWithEntityIDNotUUIDReturnsError(t *testing.T) { + crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + + route := controllers.NewCRUDController[Model]( + logger, + crudService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/exists/", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"id": "not-uuid"}) + + _, err := route.Controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrIDNotAnUUID) +} + +func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { + crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + + uuid := uuid.New() + + crudService. + On("GetEntity", uuid). + Return(nil, gorm.ErrRecordNotFound) + + route := controllers.NewCRUDController[Model]( + logger, + crudService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/exists/", + strings.NewReader(""), + ) + + request = mux.SetURLVars(request, map[string]string{"id": uuid.String()}) + + _, err := route.Controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + +func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { + crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + + uuid := uuid.New() + + crudService. + On("GetEntity", uuid). + Return(nil, errors.New("db error")) + + route := controllers.NewCRUDController[Model]( + logger, + crudService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/exists/", + strings.NewReader(""), + ) + + request = mux.SetURLVars(request, map[string]string{"id": uuid.String()}) + + _, err := route.Controller.GetObject(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { + crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + + uuid := uuid.New() + entity := Model{} + + crudService. + On("GetEntity", uuid). + Return(&entity, nil) + + route := controllers.NewCRUDController[Model]( + logger, + crudService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/exists/", + strings.NewReader(""), + ) + + request = mux.SetURLVars(request, map[string]string{"id": uuid.String()}) + entityReturned, err := route.Controller.GetObject(response, request) + assert.Nil(t, err) + assert.Equal(t, &entity, entityReturned) +} + +// ----------------------- GetEntities ----------------------- + +func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { + crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + + crudService. + On("GetEntities", map[string]any{}). + Return(nil, errors.New("db error")) + + route := controllers.NewCRUDController[Model]( + logger, + crudService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/exists/", + strings.NewReader(""), + ) + + request = mux.SetURLVars(request, map[string]string{}) + _, err := route.Controller.GetObjects(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestGetEntitiesWithoutParams(t *testing.T) { + crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + + entity1 := &Model{} + entity2 := &Model{} + + crudService. + On("GetEntities", map[string]any{}). + Return([]*Model{entity1, entity2}, nil) + + route := controllers.NewCRUDController[Model]( + logger, + crudService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/exists/", + strings.NewReader(""), + ) + + request = mux.SetURLVars(request, map[string]string{}) + entitiesReturned, err := route.Controller.GetObjects(response, request) + assert.Nil(t, err) + assert.Len(t, entitiesReturned, 2) + assert.Contains(t, entitiesReturned, entity1) + assert.Contains(t, entitiesReturned, entity2) +} + +func TestGetEntitiesWithParams(t *testing.T) { + crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + + entity1 := &Model{} + + crudService. + On("GetEntities", map[string]any{"param1": "something"}). + Return([]*Model{entity1}, nil) + + route := controllers.NewCRUDController[Model]( + logger, + crudService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/exists/", + strings.NewReader("{\"param1\": \"something\"}"), + ) + + request = mux.SetURLVars(request, map[string]string{}) + entitiesReturned, err := route.Controller.GetObjects(response, request) + assert.Nil(t, err) + assert.Len(t, entitiesReturned, 1) + assert.Contains(t, entitiesReturned, entity1) +} diff --git a/controllers/eav.go b/controllers/eav.go index 1b4d2fe1..dcf30880 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -14,12 +14,6 @@ import ( "gorm.io/gorm" ) -var ( - ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid object id") - ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists") - ErrIDNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") -) - type EAVController interface { GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) @@ -55,14 +49,7 @@ func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Re } entity, err := controller.eavService.GetEntity(entityTypeName, entityID) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound - } - return nil, httperrors.NewDBError(err) - } - - return entity, nil + return entity, mapServiceError(err) } // The handler responsible of the retrieval of multiple objects @@ -78,14 +65,7 @@ func (controller *eavControllerImpl) GetObjects(w http.ResponseWriter, r *http.R } entities, err := controller.eavService.GetEntities(entityTypeName, params) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityTypeNotFound - } - return nil, httperrors.NewDBError(err) - } - - return entities, nil + return entities, mapEAVServiceError(err) } // The handler responsible of the creation of a object @@ -102,10 +82,7 @@ func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http entity, err := controller.eavService.CreateEntity(entityTypeName, attrs) if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityTypeNotFound - } - return nil, httperrors.NewDBError(err) + return nil, mapEAVServiceError(err) } w.Header().Add("Location", buildEAVLocationString(entity)) @@ -131,14 +108,7 @@ func (controller *eavControllerImpl) UpdateObject(w http.ResponseWriter, r *http } entity, err := controller.eavService.UpdateEntity(entityTypeName, entityID, attrs) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound - } - return nil, httperrors.NewDBError(err) - } - - return entity, nil + return entity, mapServiceError(err) } // The handler responsible for the deletion of a object @@ -149,14 +119,19 @@ func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http } err := controller.eavService.DeleteEntity(entityTypeName, entityID) + return nil, mapServiceError(err) +} + +func mapEAVServiceError(err error) httperrors.HTTPError { if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound + return ErrEntityTypeNotFound } - return nil, httperrors.NewDBError(err) + + return mapServiceError(err) } - return nil, nil + return nil } // Extract the "type" parameter from url diff --git a/controllers/utils.go b/controllers/utils.go index 7732caf6..5f6b87f4 100644 --- a/controllers/utils.go +++ b/controllers/utils.go @@ -2,12 +2,14 @@ package controllers import ( "encoding/json" + "errors" "io" "net/http" "github.com/ditrit/badaas/httperrors" "github.com/google/uuid" "github.com/gorilla/mux" + "gorm.io/gorm" ) var ( @@ -19,6 +21,9 @@ var ( nil, false, ) + ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid object id") + ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists") + ErrIDNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") ) // Decode json present in request body @@ -60,3 +65,14 @@ func getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { return uid, nil } + +func mapServiceError(err error) httperrors.HTTPError { + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return ErrEntityNotFound + } + return httperrors.NewDBError(err) + } + + return nil +} diff --git a/mocks/badorm/CRUDService.go b/mocks/badorm/CRUDService.go index a2da4c8c..cbf09b22 100644 --- a/mocks/badorm/CRUDService.go +++ b/mocks/badorm/CRUDService.go @@ -12,46 +12,6 @@ type CRUDService[T interface{}, ID badorm.BadaasID] struct { mock.Mock } -// CreateEntity provides a mock function with given fields: attributeValues -func (_m *CRUDService[T, ID]) CreateEntity(attributeValues map[string]interface{}) (*T, error) { - ret := _m.Called(attributeValues) - - var r0 *T - var r1 error - if rf, ok := ret.Get(0).(func(map[string]interface{}) (*T, error)); ok { - return rf(attributeValues) - } - if rf, ok := ret.Get(0).(func(map[string]interface{}) *T); ok { - r0 = rf(attributeValues) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*T) - } - } - - if rf, ok := ret.Get(1).(func(map[string]interface{}) error); ok { - r1 = rf(attributeValues) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// DeleteEntity provides a mock function with given fields: entityID -func (_m *CRUDService[T, ID]) DeleteEntity(entityID ID) error { - ret := _m.Called(entityID) - - var r0 error - if rf, ok := ret.Get(0).(func(ID) error); ok { - r0 = rf(entityID) - } else { - r0 = ret.Error(0) - } - - return r0 -} - // GetEntities provides a mock function with given fields: conditions func (_m *CRUDService[T, ID]) GetEntities(conditions map[string]interface{}) ([]*T, error) { ret := _m.Called(conditions) @@ -104,32 +64,6 @@ func (_m *CRUDService[T, ID]) GetEntity(id ID) (*T, error) { return r0, r1 } -// UpdateEntity provides a mock function with given fields: entityID, newValues -func (_m *CRUDService[T, ID]) UpdateEntity(entityID ID, newValues map[string]interface{}) (*T, error) { - ret := _m.Called(entityID, newValues) - - var r0 *T - var r1 error - if rf, ok := ret.Get(0).(func(ID, map[string]interface{}) (*T, error)); ok { - return rf(entityID, newValues) - } - if rf, ok := ret.Get(0).(func(ID, map[string]interface{}) *T); ok { - r0 = rf(entityID, newValues) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*T) - } - } - - if rf, ok := ret.Get(1).(func(ID, map[string]interface{}) error); ok { - r1 = rf(entityID, newValues) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - type mockConstructorTestingTNewCRUDService interface { mock.TestingT Cleanup(func()) diff --git a/mocks/controllers/CRUDController.go b/mocks/controllers/CRUDController.go index 83fc6f61..93da4656 100644 --- a/mocks/controllers/CRUDController.go +++ b/mocks/controllers/CRUDController.go @@ -14,62 +14,6 @@ type CRUDController struct { mock.Mock } -// CreateObject provides a mock function with given fields: w, r -func (_m *CRUDController) CreateObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(w, r) - - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { - return rf(w, r) - } - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(w, r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(w, r) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - -// DeleteObject provides a mock function with given fields: w, r -func (_m *CRUDController) DeleteObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(w, r) - - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { - return rf(w, r) - } - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(w, r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(w, r) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - // GetObject provides a mock function with given fields: w, r func (_m *CRUDController) GetObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { ret := _m.Called(w, r) @@ -126,34 +70,6 @@ func (_m *CRUDController) GetObjects(w http.ResponseWriter, r *http.Request) (in return r0, r1 } -// UpdateObject provides a mock function with given fields: w, r -func (_m *CRUDController) UpdateObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(w, r) - - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { - return rf(w, r) - } - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(w, r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(w, r) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - type mockConstructorTestingTNewCRUDController interface { mock.TestingT Cleanup(func()) From 11473d50fb665275943435b696037b91d5199e90 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 14:37:22 +0200 Subject: [PATCH 177/467] add crud routes unit tests --- router/routes_test.go | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/router/routes_test.go b/router/routes_test.go index 37b758ed..28e35379 100644 --- a/router/routes_test.go +++ b/router/routes_test.go @@ -142,7 +142,7 @@ func TestAddLoginRoutes(t *testing.T) { assert.Equal(t, response.Body.String(), "{\"login\":\"called\"}") } -func TestAddCRUDRoutes(t *testing.T) { +func TestAddEAVRoutes(t *testing.T) { jsonController := middlewares.NewJSONController(logger) eavController := mockControllers.NewEAVController(t) @@ -168,3 +168,35 @@ func TestAddCRUDRoutes(t *testing.T) { assert.Equal(t, http.StatusOK, response.Code) assert.Equal(t, "{\"GetObjects\":\"called\"}", response.Body.String()) } + +func TestAddCRUDRoutes(t *testing.T) { + jsonController := middlewares.NewJSONController(logger) + + crudController := mockControllers.NewCRUDController(t) + crudController. + On("GetObjects", mock.Anything, mock.Anything). + Return(map[string]string{"GetObjects": "called"}, nil) + + router := NewRouter() + AddCRUDRoutes( + []controllers.CRUDRoute{ + { + TypeName: "model", + Controller: crudController, + }, + }, + router, + jsonController, + ) + + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/model", + nil, + ) + + router.ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) + assert.Equal(t, "{\"GetObjects\":\"called\"}", response.Body.String()) +} From 5c93deba96c790cb51dd39594023a76f80e311db Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 14:56:37 +0200 Subject: [PATCH 178/467] add unit test to bad json --- controllers/crud_test.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/controllers/crud_test.go b/controllers/crud_test.go index 21c713b4..cba76a28 100644 --- a/controllers/crud_test.go +++ b/controllers/crud_test.go @@ -33,7 +33,6 @@ func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { "/objects/exists/", strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{}) _, err := route.Controller.GetObject(response, request) assert.ErrorIs(t, err, controllers.ErrEntityNotFound) @@ -157,7 +156,6 @@ func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{}) _, err := route.Controller.GetObjects(response, request) assert.ErrorContains(t, err, "db error") } @@ -183,7 +181,6 @@ func TestGetEntitiesWithoutParams(t *testing.T) { strings.NewReader(""), ) - request = mux.SetURLVars(request, map[string]string{}) entitiesReturned, err := route.Controller.GetObjects(response, request) assert.Nil(t, err) assert.Len(t, entitiesReturned, 2) @@ -211,9 +208,26 @@ func TestGetEntitiesWithParams(t *testing.T) { strings.NewReader("{\"param1\": \"something\"}"), ) - request = mux.SetURLVars(request, map[string]string{}) entitiesReturned, err := route.Controller.GetObjects(response, request) assert.Nil(t, err) assert.Len(t, entitiesReturned, 1) assert.Contains(t, entitiesReturned, entity1) } + +func TestGetEntitiesWithParamsNotJsonReturnsError(t *testing.T) { + crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + + route := controllers.NewCRUDController[Model]( + logger, + crudService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + "GET", + "/objects/exists/", + strings.NewReader("bad json"), + ) + + _, err := route.Controller.GetObjects(response, request) + assert.ErrorIs(t, err, controllers.HTTPErrRequestMalformed) +} From 90b87eb8d450566e1c0b54de4caf608ad8e9ba97 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 14:57:19 +0200 Subject: [PATCH 179/467] simplify crud repo methods --- badorm/crudRepository.go | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 99ca16c0..8fe60eac 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -18,7 +18,7 @@ type CRUDRepository[T any, ID BadaasID] interface { Create(tx *gorm.DB, entity *T) error // read GetByID(tx *gorm.DB, id ID) (*T, error) - Get(tx *gorm.DB, conditions map[string]any) (T, error) + Get(tx *gorm.DB, conditions map[string]any) (*T, error) GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) GetAll(tx *gorm.DB) ([]*T, error) @@ -56,32 +56,17 @@ func NewCRUDRepository[T any, ID BadaasID]( // Create object "entity" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) Create(tx *gorm.DB, entity *T) error { - err := tx.Create(entity).Error - if err != nil { - return err - } - - return nil + return tx.Create(entity).Error } // Delete object "entity" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) Delete(tx *gorm.DB, entity *T) error { - err := tx.Delete(entity).Error - if err != nil { - return err - } - - return nil + return tx.Delete(entity).Error } // Save object "entity" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) Save(tx *gorm.DB, entity *T) error { - err := tx.Save(entity).Error - if err != nil { - return err - } - - return nil + return tx.Save(entity).Error } // Get an object by "id" inside transaction "tx" @@ -100,18 +85,17 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, er // in case of join "conditions" can have the format: // // {"relationAttributeName": {"attributeName": expectedValue}} -func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions map[string]any) (T, error) { +func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions map[string]any) (*T, error) { entity, err := repository.GetOptional(tx, conditions) - var nilValue T if err != nil { - return nilValue, err + return nil, err } if entity == nil { - return nilValue, ErrObjectNotFound + return nil, ErrObjectNotFound } - return *entity, nil + return entity, nil } // Get an object or nil that matches "conditions" inside transaction "tx" From 79753846af16103f27f8f96ffec8c424ca42493b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 14:59:16 +0200 Subject: [PATCH 180/467] fix mocks --- mocks/badorm/CRUDRepository.go | 12 +++++++----- services/userservice/userservice.go | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/mocks/badorm/CRUDRepository.go b/mocks/badorm/CRUDRepository.go index dd8f20fb..25d47f8a 100644 --- a/mocks/badorm/CRUDRepository.go +++ b/mocks/badorm/CRUDRepository.go @@ -43,18 +43,20 @@ func (_m *CRUDRepository[T, ID]) Delete(tx *gorm.DB, entity *T) error { } // Get provides a mock function with given fields: tx, conditions -func (_m *CRUDRepository[T, ID]) Get(tx *gorm.DB, conditions map[string]interface{}) (T, error) { +func (_m *CRUDRepository[T, ID]) Get(tx *gorm.DB, conditions map[string]interface{}) (*T, error) { ret := _m.Called(tx, conditions) - var r0 T + var r0 *T var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) (T, error)); ok { + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) (*T, error)); ok { return rf(tx, conditions) } - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) T); ok { + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) *T); ok { r0 = rf(tx, conditions) } else { - r0 = ret.Get(0).(T) + if ret.Get(0) != nil { + r0 = ret.Get(0).(*T) + } } if rf, ok := ret.Get(1).(func(*gorm.DB, map[string]interface{}) error); ok { diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index 984eb536..72faad37 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -88,5 +88,5 @@ func (userService *userServiceImpl) GetUser(userLoginDTO dto.UserLoginDTO) (*mod return nil, ErrWrongPassword } - return &user, nil + return user, nil } From 0447e65424ae324dd327bda94dd4e74f71f2a136 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 15:19:08 +0200 Subject: [PATCH 181/467] add crud repo tests --- test_integration/crudRepository.go | 128 +++++++++++++++++++++++++++ test_integration/integration_test.go | 3 + 2 files changed, 131 insertions(+) create mode 100644 test_integration/crudRepository.go diff --git a/test_integration/crudRepository.go b/test_integration/crudRepository.go new file mode 100644 index 00000000..62efdba6 --- /dev/null +++ b/test_integration/crudRepository.go @@ -0,0 +1,128 @@ +package integrationtests + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/google/uuid" + "github.com/stretchr/testify/suite" + "go.uber.org/zap" + "gorm.io/gorm" + "gotest.tools/assert" +) + +type CRUDRepositoryIntTestSuite struct { + suite.Suite + logger *zap.Logger + db *gorm.DB + crudProductRepository badorm.CRUDRepository[Product, uuid.UUID] +} + +func NewCRUDRepositoryIntTestSuite( + logger *zap.Logger, + db *gorm.DB, + crudProductRepository badorm.CRUDRepository[Product, uuid.UUID], +) *CRUDRepositoryIntTestSuite { + return &CRUDRepositoryIntTestSuite{ + logger: logger, + db: db, + crudProductRepository: crudProductRepository, + } +} + +func (ts *CRUDRepositoryIntTestSuite) SetupTest() { + CleanDB(ts.db) +} + +// ------------------------- GetByID -------------------------------- + +func (ts *CRUDRepositoryIntTestSuite) TestGetByIDReturnsErrorIfIDDontMatch() { + ts.createProduct(0) + _, err := ts.crudProductRepository.GetByID(ts.db, uuid.Nil) + ts.Error(err, gorm.ErrRecordNotFound) +} + +func (ts *CRUDRepositoryIntTestSuite) TestGetByIDReturnsEntityIfIDMatch() { + product := ts.createProduct(0) + ts.createProduct(0) + productReturned, err := ts.crudProductRepository.GetByID(ts.db, product.ID) + ts.Nil(err) + + assert.DeepEqual(ts.T(), product, productReturned) +} + +// ------------------------- Get -------------------------------- + +func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsErrorIfConditionsDontMatch() { + ts.createProduct(0) + _, err := ts.crudProductRepository.Get(ts.db, map[string]any{ + "int": 1, + }) + ts.Error(err, gorm.ErrRecordNotFound) +} + +func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsEntityIfConditionsMatch() { + product := ts.createProduct(1) + productReturned, err := ts.crudProductRepository.Get(ts.db, map[string]any{ + "int": 1, + }) + ts.Nil(err) + + assert.DeepEqual(ts.T(), product, productReturned) +} + +// ------------------------- GetOptional -------------------------------- + +func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsNilIfConditionsDontMatch() { + ts.createProduct(0) + productReturned, err := ts.crudProductRepository.GetOptional(ts.db, map[string]any{ + "int": 1, + }) + ts.Nil(err) + ts.Nil(productReturned) +} + +func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsEntityIfConditionsMatch() { + product := ts.createProduct(0) + productReturned, err := ts.crudProductRepository.GetOptional(ts.db, map[string]any{ + "int": 0, + }) + ts.Nil(err) + + assert.DeepEqual(ts.T(), product, productReturned) +} + +func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsErrorIfMoreThanOneMatchConditions() { + ts.createProduct(0) + ts.createProduct(0) + _, err := ts.crudProductRepository.GetOptional(ts.db, map[string]any{ + "int": 0, + }) + ts.Error(err, badorm.ErrMoreThanOneObjectFound) +} + +// ------------------------- GetAll -------------------------------- + +func (ts *CRUDRepositoryIntTestSuite) TestGetAllReturnsEmptyIfNotEntitiesCreated() { + productsReturned, err := ts.crudProductRepository.GetAll(ts.db) + ts.Nil(err) + EqualList(&ts.Suite, []*Product{}, productsReturned) +} + +func (ts *CRUDRepositoryIntTestSuite) TestGetAllReturnsAllEntityIfConditionsMatch() { + product1 := ts.createProduct(0) + product2 := ts.createProduct(0) + productsReturned, err := ts.crudProductRepository.GetAll(ts.db) + ts.Nil(err) + EqualList(&ts.Suite, []*Product{product1, product2}, productsReturned) +} + +// ------------------------- utils ------------------------- + +func (ts *CRUDRepositoryIntTestSuite) createProduct(intV int) *Product { + entity := &Product{ + Int: intV, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index 2475be52..b0a50a1c 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -65,6 +65,7 @@ func injectDependencies(cmd *cobra.Command, args []string) { fx.Provide(badorm.AddModel[Person]), badorm.GetCRUDServiceModule[Bicycle, uuid.UUID](), fx.Provide(NewCRUDServiceIntTestSuite), + fx.Provide(NewCRUDRepositoryIntTestSuite), fx.Invoke(runTestSuites), ).Run() @@ -73,11 +74,13 @@ func injectDependencies(cmd *cobra.Command, args []string) { func runTestSuites( tsEAV *EAVServiceIntTestSuite, tsCRUD *CRUDServiceIntTestSuite, + tsCRUDRepository *CRUDRepositoryIntTestSuite, db *gorm.DB, shutdowner fx.Shutdowner, ) { suite.Run(tGlobal, tsEAV) suite.Run(tGlobal, tsCRUD) + suite.Run(tGlobal, tsCRUDRepository) // let db cleaned CleanDB(db) From e02ac634325c8ff35142ce742a3b89481d29bc01 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 15:22:25 +0200 Subject: [PATCH 182/467] delete unused code --- badorm/autoMigrate.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/badorm/autoMigrate.go b/badorm/autoMigrate.go index 29c875a1..3cdacca5 100644 --- a/badorm/autoMigrate.go +++ b/badorm/autoMigrate.go @@ -1,12 +1,10 @@ package badorm import ( - "log" "reflect" "github.com/elliotchance/pie/v2" "go.uber.org/zap" - "gorm.io/driver/postgres" "gorm.io/gorm" ) @@ -19,12 +17,6 @@ func autoMigrate(listOfTables []any, db *gorm.DB, logger *zap.Logger) error { registeredModels, ) - // TODO delete - listOrdered := db.Migrator().(postgres.Migrator).ReorderModels(listOfTables, true) - for _, element := range listOrdered { - log.Println(reflect.TypeOf(element).String()) - } - err := db.AutoMigrate(listOfTables...) if err != nil { logger.Error("migration failed") From a095e7d8dd2f242c13e7550951946d1fba9dfaa7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 15:25:37 +0200 Subject: [PATCH 183/467] fix uint tests --- go.mod | 2 +- services/userservice/userservice_test.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 6646df1f..f50a00b0 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index 507e0dd7..9c0ae3e5 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -101,7 +101,7 @@ func TestGetUser(t *testing.T) { userRepositoryMock.On( "Get", gormDB, map[string]any{"email": "bob@email.com"}, ).Return( - *user, + user, nil, ) @@ -129,7 +129,7 @@ func TestGetUserNoUserFound(t *testing.T) { userRepositoryMock.On( "Get", gormDB, map[string]any{"email": "bobnotfound@email.com"}, ).Return( - models.User{}, + &models.User{}, badorm.ErrObjectNotFound, ) @@ -156,7 +156,7 @@ func TestGetUserWrongPassword(t *testing.T) { userRepositoryMock.On( "Get", gormDB, map[string]any{"email": "bob@email.com"}, ).Return( - *user, + user, nil, ) From b339ee25cfca40f9de8a684008fb50af6450359b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 16:06:56 +0200 Subject: [PATCH 184/467] update dir struct --- CONTRIBUTING.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 42f0fa3e..34d03c60 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,7 +54,6 @@ We use uber's [zap](https://pkg.go.dev/go.uber.org/zap) to log stuff, please tak This is the directory structure we use for the project: -- `commands/` *(Go code)*: Contains all the CLI commands. This package relies heavily on github.com/ditrit/verdeter. - `configuration/` *(Go code)*: Contains all the configuration holders. Please only use the interfaces, they are all mocked for easy testing. - `controllers/` *(Go code)*: Contains all the http controllers, they handle http requests and consume services. - `docs/`: Contains the documentation. @@ -63,12 +62,10 @@ This is the directory structure we use for the project: - `logger/` *(Go code)*: Contains the logger creation logic. Please don't call it from your own services and code, use the dependency injection system. - `persistance/` *(Go code)*: - `gormdatabase/` *(Go code)*: Contains the logic to create a database. Also contains a go package named `gormzap`: it is a compatibility layer between *gorm.io/gorm* and *github.com/uber-go/zap*. - - `models/` *(Go code)*: Contains the models. (For a structure to me considered a valid model, it has to embed `badorm.UUIDModel` and satisfy the `models.Tabler` interface. This interface returns the name of the sql table.). + - `models/` *(Go code)*: Contains the models. (For a structure to me considered a valid model, it has to embed `badorm.UUIDModel` or `badorm.UIntModel`.). - `dto/` *(Go code)*: Contains the Data Transfer Objects. They are used mainly to decode json payloads. - - `pagination/` *(Go code)*: Contains the pagination logic. - `repository/` *(Go code)*: Contains the repository interfaces and implementations to manage queries to the database. -- `resources/` *(Go code)*: Contains the resources shared with the rest of the codebase (ex: API version). -- `router/` *(Go code)*: Contains http router of badaas. +- `router/` *(Go code)*: Contains http router of badaas and the routes that can be added by the user. - `middlewares/` *(Go code)*: Contains the various http middlewares that we use. - `docker/` : Contains the docker, docker-compose file and configuration files for different environments. - `api/` : Contains the Dockerfile to build badaas with a dedicated config file. @@ -81,6 +78,7 @@ This is the directory structure we use for the project: - `sessionservice/` *(Go code)*: Handle sessions and their lifecycle. - `userservice/` *(Go code)*: Handle users. - `validators/` *(Go code)*: Contains validators such as an email validator. +- `badorm/` *(Go code)*: Contains the code of the orm used by badaas. At the root of the project, you will find: From 7dc9fe081cc855440e6c30c64ac2992133c7fd12 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 16:19:14 +0200 Subject: [PATCH 185/467] more docs --- README.md | 18 ++++++++++++++++-- badorm/README.md | 16 ++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2bf370f4..b01242fd 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Badaas enables the effortless construction of ***distributed, resilient, highly - [InfoControllerModule](#infocontrollermodule) - [AuthControllerModule](#authcontrollermodule) - [EAVControllerModule](#eavcontrollermodule) + - [CRUDControllerModule](#crudcontrollermodule) - [Configuration](#configuration) - [Contributing](#contributing) - [License](#license) @@ -159,19 +160,32 @@ func runCommandFunc(cmd *cobra.Command, args []string) { #### EAVControllerModule -`EAVControllerModule` adds `/objects/{type}` and `/objects/{type}/{id}`, where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to create, read, update and remove objects. For more information on how to use them, see the [miniblog example](https://github.com/ditrit/badaas-example). +`EAVControllerModule` adds `/eav/objects/{type}` and `/eav/objects/{type}/{id}`, where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to create, read, update and remove objects using an EAV model. For more information on how to use them, see the [example](https://github.com/ditrit/badaas-example). ```go func runCommandFunc(cmd *cobra.Command, args []string) { fx.New( badaas.BadaasModule, - // add /login and /logout routes provided by badaas badaasControllers.EAVControllerModule, ).Run() } ``` +#### CRUDControllerModule + +`CRUDControllerModule` adds `/objects/{type}` and `/objects/{type}/{id}`, where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to read objects. For more information on how to use them, see the [example](https://github.com/ditrit/badaas-example). + +```go +func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + router.GetCRUDRoutesModule[models.Company](), + ).Run() +} +``` + ### Configuration Badaas use [verdeter](https://github.com/ditrit/verdeter) to manage it's configuration, so Badaas is POSIX compliant by default. diff --git a/badorm/README.md b/badorm/README.md index af1113ee..3456f4a0 100644 --- a/badorm/README.md +++ b/badorm/README.md @@ -9,6 +9,9 @@ BaDorm can be used both within a BaDaaS application and as a stand-alone applica - [Stand-alone Example](#stand-alone-example) - [BaDaaS Example](#badaas-example) - [Step-by-step instructions](#step-by-step-instructions) + - [Provided functionalities](#provided-functionalities) + - [CRUDServiceModule](#crudservicemodule) + - [AddModel](#addmodel) ## Quickstart @@ -65,3 +68,16 @@ There are some things you need to provide to the BaDorm module: After that, you can start the `badorm.BaDORMModule` and crete the CRUD services to your models using `badorm.GetCRUDServiceModule`. Finally, you can call your application functions as `CreateCRUDObjects` and `QueryCRUDObjects` where created CRUDServices can be injected to create, read, update and delete your models easily. + +## Provided functionalities + +### CRUDServiceModule + +`CRUDServiceModule` provides you a CRUDService, a CRUDRepository for your model class and registers it. After calling it as, for example, `badorm.GetCRUDServiceModule[models.Company, uuid.UUID](),` the following can be used by dependency injection: + +- `crudCompanyService badorm.CRUDService[models.Company, uuid.UUID]` +- `crudCompanyRepository badorm.CRUDRepository[models.Company, uuid.UUID]` + +### AddModel + +`AddModel` registers a class as model (it is called automatically by CRUDServiceModule). This makes `gorm` to apply the migrations required to maintain to database schema up to data with this models. From f817ef4afecb67454c6ec1a3f7f2e38cca5528ca Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 16 May 2023 16:31:00 +0200 Subject: [PATCH 186/467] remove old mocks --- mocks/badorm/SortOption.go | 53 ---------------------------- mocks/badorm/pagination/Paginator.go | 53 ---------------------------- mocks/badorm/tabler/Tabler.go | 39 -------------------- 3 files changed, 145 deletions(-) delete mode 100644 mocks/badorm/SortOption.go delete mode 100644 mocks/badorm/pagination/Paginator.go delete mode 100644 mocks/badorm/tabler/Tabler.go diff --git a/mocks/badorm/SortOption.go b/mocks/badorm/SortOption.go deleted file mode 100644 index 807bd26c..00000000 --- a/mocks/badorm/SortOption.go +++ /dev/null @@ -1,53 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import mock "github.com/stretchr/testify/mock" - -// SortOption is an autogenerated mock type for the SortOption type -type SortOption struct { - mock.Mock -} - -// Column provides a mock function with given fields: -func (_m *SortOption) Column() string { - ret := _m.Called() - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// Desc provides a mock function with given fields: -func (_m *SortOption) Desc() bool { - ret := _m.Called() - - var r0 bool - if rf, ok := ret.Get(0).(func() bool); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -type mockConstructorTestingTNewSortOption interface { - mock.TestingT - Cleanup(func()) -} - -// NewSortOption creates a new instance of SortOption. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewSortOption(t mockConstructorTestingTNewSortOption) *SortOption { - mock := &SortOption{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/mocks/badorm/pagination/Paginator.go b/mocks/badorm/pagination/Paginator.go deleted file mode 100644 index ef2c6359..00000000 --- a/mocks/badorm/pagination/Paginator.go +++ /dev/null @@ -1,53 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import mock "github.com/stretchr/testify/mock" - -// Paginator is an autogenerated mock type for the Paginator type -type Paginator struct { - mock.Mock -} - -// Limit provides a mock function with given fields: -func (_m *Paginator) Limit() uint { - ret := _m.Called() - - var r0 uint - if rf, ok := ret.Get(0).(func() uint); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(uint) - } - - return r0 -} - -// Offset provides a mock function with given fields: -func (_m *Paginator) Offset() uint { - ret := _m.Called() - - var r0 uint - if rf, ok := ret.Get(0).(func() uint); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(uint) - } - - return r0 -} - -type mockConstructorTestingTNewPaginator interface { - mock.TestingT - Cleanup(func()) -} - -// NewPaginator creates a new instance of Paginator. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewPaginator(t mockConstructorTestingTNewPaginator) *Paginator { - mock := &Paginator{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/mocks/badorm/tabler/Tabler.go b/mocks/badorm/tabler/Tabler.go deleted file mode 100644 index 6a50e56e..00000000 --- a/mocks/badorm/tabler/Tabler.go +++ /dev/null @@ -1,39 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import mock "github.com/stretchr/testify/mock" - -// Tabler is an autogenerated mock type for the Tabler type -type Tabler struct { - mock.Mock -} - -// TableName provides a mock function with given fields: -func (_m *Tabler) TableName() string { - ret := _m.Called() - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -type mockConstructorTestingTNewTabler interface { - mock.TestingT - Cleanup(func()) -} - -// NewTabler creates a new instance of Tabler. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewTabler(t mockConstructorTestingTNewTabler) *Tabler { - mock := &Tabler{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} From b53385f4399f997e325b664341957c5a616a1c22 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 17 May 2023 10:03:20 +0200 Subject: [PATCH 187/467] models defined by user --- badorm/ModuleFx.go | 22 +++++++---------- badorm/README.md | 5 ---- badorm/crudRepository.go | 1 + services/ModuleFx.go | 12 +++++----- test_e2e/badaas_e2e_test.go | 17 ++------------ test_e2e/test_api.go | 8 +++---- test_integration/{setup.go => db_models.go} | 26 ++++++++++++++------- test_integration/integration_test.go | 6 ++--- 8 files changed, 43 insertions(+), 54 deletions(-) rename test_integration/{setup.go => db_models.go} (71%) diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index 12288f58..6d2db857 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -7,12 +7,18 @@ import ( "go.uber.org/fx" ) +type GetModelsResult struct { + fx.Out + + Models []any `name:"modelsTables"` +} + var BaDORMModule = fx.Module( "BaDORM", fx.Invoke( fx.Annotate( autoMigrate, - fx.ParamTags(`group:"modelTables"`), + fx.ParamTags(`name:"modelsTables"`), ), ), ) @@ -24,7 +30,7 @@ func GetCRUDServiceModule[T any, ID BadaasID]() fx.Option { *new(T), ), // models - fx.Provide(AddModel[T]), + fx.Invoke(AddModel[T]), // repository fx.Provide(NewCRUDRepository[T, ID]), // service @@ -34,18 +40,8 @@ func GetCRUDServiceModule[T any, ID BadaasID]() fx.Option { var modelsMapping = map[string]reflect.Type{} -type AddModelResult struct { - fx.Out - - Model any `group:"modelTables"` -} - -func AddModel[T any]() AddModelResult { +func AddModel[T any]() { entity := *new(T) entityType := reflect.TypeOf(entity) modelsMapping[entityType.Name()] = entityType - - return AddModelResult{ - Model: entity, - } } diff --git a/badorm/README.md b/badorm/README.md index 3456f4a0..7f7fe11c 100644 --- a/badorm/README.md +++ b/badorm/README.md @@ -11,7 +11,6 @@ BaDorm can be used both within a BaDaaS application and as a stand-alone applica - [Step-by-step instructions](#step-by-step-instructions) - [Provided functionalities](#provided-functionalities) - [CRUDServiceModule](#crudservicemodule) - - [AddModel](#addmodel) ## Quickstart @@ -77,7 +76,3 @@ Finally, you can call your application functions as `CreateCRUDObjects` and `Que - `crudCompanyService badorm.CRUDService[models.Company, uuid.UUID]` - `crudCompanyRepository badorm.CRUDRepository[models.Company, uuid.UUID]` - -### AddModel - -`AddModel` registers a class as model (it is called automatically by CRUDServiceModule). This makes `gorm` to apply the migrations required to maintain to database schema up to data with this models. diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 8fe60eac..b7ba3aac 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -334,6 +334,7 @@ func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, er return nil, ErrObjectsNotRelated(entityType.Name(), relationName) } + // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) fieldType, isPresent := modelsMapping[relationName] if !isPresent { return nil, ErrModelNotRegistered(entityType.Name(), relationName) diff --git a/services/ModuleFx.go b/services/ModuleFx.go index 73b6e389..fc2118a3 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -13,8 +13,8 @@ import ( var AuthServiceModule = fx.Module( "authService", // models - fx.Provide(badorm.AddModel[models.User]), - fx.Provide(badorm.AddModel[models.Session]), + fx.Invoke(badorm.AddModel[models.User]), + fx.Invoke(badorm.AddModel[models.Session]), // repositories fx.Provide(badorm.NewCRUDRepository[models.Session, uuid.UUID]), fx.Provide(badorm.NewCRUDRepository[models.User, uuid.UUID]), @@ -27,10 +27,10 @@ var AuthServiceModule = fx.Module( var EAVServiceModule = fx.Module( "eavService", // models - fx.Provide(badorm.AddModel[models.EntityType]), - fx.Provide(badorm.AddModel[models.Entity]), - fx.Provide(badorm.AddModel[models.Value]), - fx.Provide(badorm.AddModel[models.Attribute]), + fx.Invoke(badorm.AddModel[models.EntityType]), + fx.Invoke(badorm.AddModel[models.Entity]), + fx.Invoke(badorm.AddModel[models.Value]), + fx.Invoke(badorm.AddModel[models.Attribute]), // repositories fx.Provide(repository.NewValueRepository), fx.Provide(repository.NewEntityRepository), diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index a140956d..90a4ed8c 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -66,24 +66,11 @@ func TestMain(_ *testing.M) { }.Run() // let db cleaned - integrationtests.CleanDBTables(db, ListOfTables) + integrationtests.CleanDB(db) os.Exit(status) } -var ListOfTables = []any{ - models.Session{}, - models.User{}, - models.Value{}, - models.Attribute{}, - models.Entity{}, - models.EntityType{}, - integrationtests.Sale{}, - integrationtests.Product{}, - integrationtests.Seller{}, - integrationtests.Company{}, -} - func InitializeScenario(ctx *godog.ScenarioContext) { t := &TestContext{ db: db, @@ -100,7 +87,7 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { // clean db before each scenario - integrationtests.CleanDBTables(db, ListOfTables) + integrationtests.CleanDB(db) adminUser := &models.User{ Username: "admin", diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index ea569e2e..0f4ca5b4 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -39,7 +39,7 @@ func main() { // Run the http server for badaas func runHTTPServer(cmd *cobra.Command, args []string) { fx.New( - // Modules + fx.Provide(integrationtests.GetModels), badaas.BadaasModule, // logger for fx @@ -53,9 +53,9 @@ func runHTTPServer(cmd *cobra.Command, args []string) { router.AuthRoutesModule, router.EAVRoutesModule, - fx.Provide(badorm.AddModel[integrationtests.Company]), - fx.Provide(badorm.AddModel[integrationtests.Seller]), - fx.Provide(badorm.AddModel[integrationtests.Product]), + fx.Invoke(badorm.AddModel[integrationtests.Company]), + fx.Invoke(badorm.AddModel[integrationtests.Seller]), + fx.Invoke(badorm.AddModel[integrationtests.Product]), router.GetCRUDRoutesModule[integrationtests.Sale](), // create httpServer diff --git a/test_integration/setup.go b/test_integration/db_models.go similarity index 71% rename from test_integration/setup.go rename to test_integration/db_models.go index 9c528557..23105d95 100644 --- a/test_integration/setup.go +++ b/test_integration/db_models.go @@ -3,28 +3,38 @@ package integrationtests import ( "log" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" + "github.com/elliotchance/pie/v2" "gorm.io/gorm" ) var ListOfTables = []any{ - models.Value{}, - models.Attribute{}, - models.Entity{}, + models.Session{}, + models.User{}, models.EntityType{}, - Sale{}, + models.Entity{}, + models.Attribute{}, + models.Value{}, Product{}, - Seller{}, Company{}, - City{}, + Seller{}, + Sale{}, Country{}, + City{}, Employee{}, - Bicycle{}, Person{}, + Bicycle{}, +} + +func GetModels() badorm.GetModelsResult { + return badorm.GetModelsResult{ + Models: ListOfTables, + } } func CleanDB(db *gorm.DB) { - CleanDBTables(db, ListOfTables) + CleanDBTables(db, pie.Reverse(ListOfTables)) } func CleanDBTables(db *gorm.DB, listOfTables []any) { diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index b0a50a1c..73ff4b75 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -44,7 +44,7 @@ func TestAll(t *testing.T) { func injectDependencies(cmd *cobra.Command, args []string) { fx.New( - // Modules + fx.Provide(GetModels), badaas.BadaasModule, // logger for fx @@ -55,14 +55,14 @@ func injectDependencies(cmd *cobra.Command, args []string) { services.EAVServiceModule, fx.Provide(NewEAVServiceIntTestSuite), - fx.Provide(badorm.AddModel[Company]), + fx.Invoke(badorm.AddModel[Company]), badorm.GetCRUDServiceModule[Seller, uuid.UUID](), badorm.GetCRUDServiceModule[Product, uuid.UUID](), badorm.GetCRUDServiceModule[Sale, uuid.UUID](), badorm.GetCRUDServiceModule[City, uuid.UUID](), badorm.GetCRUDServiceModule[Country, uuid.UUID](), badorm.GetCRUDServiceModule[Employee, uuid.UUID](), - fx.Provide(badorm.AddModel[Person]), + fx.Invoke(badorm.AddModel[Person]), badorm.GetCRUDServiceModule[Bicycle, uuid.UUID](), fx.Provide(NewCRUDServiceIntTestSuite), fx.Provide(NewCRUDRepositoryIntTestSuite), From e5c49476f4e6e034afa80de005e95c6e3c5bc9f7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 17 May 2023 10:35:04 +0200 Subject: [PATCH 188/467] badaas models added only if necesary --- badorm/ModuleFx.go | 4 ++-- badorm/autoMigrate.go | 7 ++++--- services/ModuleFx.go | 22 ++++++++++++++++++++++ test_e2e/badaas_e2e_test.go | 19 +++++++++++++++++-- test_integration/db_models.go | 16 +++++++++------- 5 files changed, 54 insertions(+), 14 deletions(-) diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index 6d2db857..f658887c 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -10,7 +10,7 @@ import ( type GetModelsResult struct { fx.Out - Models []any `name:"modelsTables"` + Models []any `group:"modelsTables"` } var BaDORMModule = fx.Module( @@ -18,7 +18,7 @@ var BaDORMModule = fx.Module( fx.Invoke( fx.Annotate( autoMigrate, - fx.ParamTags(`name:"modelsTables"`), + fx.ParamTags(`group:"modelsTables"`), ), ), ) diff --git a/badorm/autoMigrate.go b/badorm/autoMigrate.go index 3cdacca5..12bcc7b8 100644 --- a/badorm/autoMigrate.go +++ b/badorm/autoMigrate.go @@ -8,8 +8,9 @@ import ( "gorm.io/gorm" ) -func autoMigrate(listOfTables []any, db *gorm.DB, logger *zap.Logger) error { - registeredModels := pie.Map(listOfTables, func(model any) string { +func autoMigrate(modelsLists [][]any, db *gorm.DB, logger *zap.Logger) error { + allModels := pie.Flat(modelsLists) + registeredModels := pie.Map(allModels, func(model any) string { return reflect.TypeOf(model).String() }) logger.Sugar().Debug( @@ -17,7 +18,7 @@ func autoMigrate(listOfTables []any, db *gorm.DB, logger *zap.Logger) error { registeredModels, ) - err := db.AutoMigrate(listOfTables...) + err := db.AutoMigrate(allModels...) if err != nil { logger.Error("migration failed") return err diff --git a/services/ModuleFx.go b/services/ModuleFx.go index fc2118a3..130e202a 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -13,6 +13,7 @@ import ( var AuthServiceModule = fx.Module( "authService", // models + fx.Provide(getAuthModels), fx.Invoke(badorm.AddModel[models.User]), fx.Invoke(badorm.AddModel[models.Session]), // repositories @@ -24,9 +25,19 @@ var AuthServiceModule = fx.Module( fx.Provide(sessionservice.NewSessionService), ) +func getAuthModels() badorm.GetModelsResult { + return badorm.GetModelsResult{ + Models: []any{ + models.Session{}, + models.User{}, + }, + } +} + var EAVServiceModule = fx.Module( "eavService", // models + fx.Provide(getEAVModels), fx.Invoke(badorm.AddModel[models.EntityType]), fx.Invoke(badorm.AddModel[models.Entity]), fx.Invoke(badorm.AddModel[models.Value]), @@ -39,3 +50,14 @@ var EAVServiceModule = fx.Module( // service fx.Provide(NewEAVService), ) + +func getEAVModels() badorm.GetModelsResult { + return badorm.GetModelsResult{ + Models: []any{ + models.EntityType{}, + models.Entity{}, + models.Attribute{}, + models.Value{}, + }, + } +} diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index 90a4ed8c..968c2f51 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -16,6 +16,7 @@ import ( "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/services/auth/protocols/basicauth" integrationtests "github.com/ditrit/badaas/test_integration" + "github.com/elliotchance/pie/v2" "github.com/spf13/pflag" "github.com/spf13/viper" "go.uber.org/zap" @@ -66,7 +67,7 @@ func TestMain(_ *testing.M) { }.Run() // let db cleaned - integrationtests.CleanDB(db) + CleanDB(db) os.Exit(status) } @@ -87,7 +88,7 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { // clean db before each scenario - integrationtests.CleanDB(db) + CleanDB(db) adminUser := &models.User{ Username: "admin", @@ -164,3 +165,17 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^I query all sale objects with conditions$`, t.querySalesWithConditions) ctx.Step(`^there is a sale object with attributes$`, t.thereIsSaleWithAttributes) } + +func CleanDB(db *gorm.DB) { + integrationtests.CleanDBTables(db, append( + pie.Reverse(integrationtests.ListOfTables), + []any{ + models.Session{}, + models.User{}, + models.Value{}, + models.Attribute{}, + models.Entity{}, + models.EntityType{}, + }..., + )) +} diff --git a/test_integration/db_models.go b/test_integration/db_models.go index 23105d95..b770eed6 100644 --- a/test_integration/db_models.go +++ b/test_integration/db_models.go @@ -10,12 +10,6 @@ import ( ) var ListOfTables = []any{ - models.Session{}, - models.User{}, - models.EntityType{}, - models.Entity{}, - models.Attribute{}, - models.Value{}, Product{}, Company{}, Seller{}, @@ -34,7 +28,15 @@ func GetModels() badorm.GetModelsResult { } func CleanDB(db *gorm.DB) { - CleanDBTables(db, pie.Reverse(ListOfTables)) + CleanDBTables(db, append( + pie.Reverse(ListOfTables), + []any{ + models.Value{}, + models.Attribute{}, + models.Entity{}, + models.EntityType{}, + }..., + )) } func CleanDBTables(db *gorm.DB, listOfTables []any) { From 0827a1002b974bf372923015a4870f0dbf8aa5e4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 17 May 2023 12:58:37 +0200 Subject: [PATCH 189/467] add conditions that allow query on object --- badorm/crudRepository.go | 102 ++-- badorm/crudService.go | 10 +- controllers/crud.go | 13 +- mocks/badorm/CRUDRepository.go | 95 +++- mocks/badorm/CRUDService.go | 22 +- persistence/models/Session.go | 7 - persistence/models/Session_test.go | 4 - persistence/models/User.go | 10 +- services/sessionservice/session.go | 4 +- services/sessionservice/session_test.go | 10 +- services/userservice/userservice.go | 2 +- services/userservice/userservice_test.go | 6 +- test_integration/crudRepository.go | 20 +- test_integration/crudService.go | 641 ++++++++++++----------- 14 files changed, 509 insertions(+), 437 deletions(-) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index b7ba3aac..70c81d13 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -11,6 +11,11 @@ import ( "gorm.io/gorm/schema" ) +type Condition[T any] struct { + Field string + Value any +} + // Generic CRUD Repository // T can be any model whose identifier attribute is of type ID type CRUDRepository[T any, ID BadaasID] interface { @@ -18,9 +23,10 @@ type CRUDRepository[T any, ID BadaasID] interface { Create(tx *gorm.DB, entity *T) error // read GetByID(tx *gorm.DB, id ID) (*T, error) - Get(tx *gorm.DB, conditions map[string]any) (*T, error) - GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) - GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) + GetOptionalByID(tx *gorm.DB, id ID) (*T, error) + Get(tx *gorm.DB, conditions ...Condition[T]) (*T, error) + GetOptional(tx *gorm.DB, conditions ...Condition[T]) (*T, error) + GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) GetAll(tx *gorm.DB) ([]*T, error) // update Save(tx *gorm.DB, entity *T) error @@ -80,13 +86,23 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, er return &entity, nil } +// Get an object by "id" inside transaction "tx" +func (repository *CRUDRepositoryImpl[T, ID]) GetOptionalByID(tx *gorm.DB, id ID) (*T, error) { + entity, err := repository.GetByID(tx, id) + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } + + return entity, nil +} + // Get an object that matches "conditions" inside transaction "tx" // "conditions" is in {"attributeName": expectedValue} format // in case of join "conditions" can have the format: // // {"relationAttributeName": {"attributeName": expectedValue}} -func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions map[string]any) (*T, error) { - entity, err := repository.GetOptional(tx, conditions) +func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Condition[T]) (*T, error) { + entity, err := repository.GetOptional(tx, conditions...) if err != nil { return nil, err } @@ -103,8 +119,8 @@ func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions map[str // in case of join "conditions" can have the format: // // {"relationAttributeName": {"attributeName": expectedValue}} -func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions map[string]any) (*T, error) { - entities, err := repository.GetMultiple(tx, conditions) +func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions ...Condition[T]) (*T, error) { + entities, err := repository.GetMultiple(tx, conditions...) if err != nil { return nil, err } @@ -123,37 +139,53 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions // in case of join "conditions" can have the format: // // {"relationAttributeName": {"attributeName": expectedValue}} -func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) { - thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) - if err != nil { - return nil, err - } - - query := tx.Where(thisEntityConditions) - - entity := new(T) - // only entities that match the conditions - for joinAttributeName, joinConditions := range joinConditions { - tableName, err := getTableName(tx, entity) - if err != nil { - return nil, err - } - - err = repository.addJoinToQuery( - query, - entity, - tableName, - joinAttributeName, - joinConditions, - ) - if err != nil { - return nil, err - } +func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { + // thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) + // if err != nil { + // return nil, err + // } + + // query := tx.Where(thisEntityConditions) + + // entity := new(T) + // // only entities that match the conditions + // for joinAttributeName, joinConditions := range joinConditions { + // tableName, err := getTableName(tx, entity) + // if err != nil { + // return nil, err + // } + + // err = repository.addJoinToQuery( + // query, + // entity, + // tableName, + // joinAttributeName, + // joinConditions, + // ) + // if err != nil { + // return nil, err + // } + // } + + // query := tx.Model(*new(T)) + // whereQuery := utils.Reduce(conditions, func(whereQuery string, condition Condition[T]) string { + // return whereQuery + " AND " + condition.Query + // }) + // whereValues := pie.Map(conditions, func(condition Condition[T]) any { + // return condition.Value + // }) + // + // query.Where(whereQuery, whereValues...) + + // TODO verificar que no se repitan + whereParams := map[string]interface{}{} + for _, condition := range conditions { + whereParams[condition.Field] = condition.Value } // execute query var entities []*T - err = query.Find(&entities).Error + err := tx.Where(whereParams).Find(&entities).Error return entities, err } @@ -172,7 +204,7 @@ func getTableName(db *gorm.DB, entity any) (string, error) { // Get the list of objects of type T func (repository *CRUDRepositoryImpl[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { - return repository.GetMultiple(tx, map[string]any{}) + return repository.GetMultiple(tx) } // Adds a join to the "query" by the "joinAttributeName" diff --git a/badorm/crudService.go b/badorm/crudService.go index 4d3f0606..ae2e1c52 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -9,7 +9,8 @@ import ( // T can be any model whose identifier attribute is of type ID type CRUDService[T any, ID BadaasID] interface { GetEntity(id ID) (*T, error) - GetEntities(conditions map[string]any) ([]*T, error) + // GetEntities(conditions map[string]any) ([]*T, error) + GetEntities(conditions ...Condition[T]) ([]*T, error) } // check interface compliance @@ -46,6 +47,9 @@ func (service *crudServiceImpl[T, ID]) GetEntity(id ID) (*T, error) { // in case of join "conditions" can have the format: // // {"relationAttributeName": {"attributeName": expectedValue}} -func (service *crudServiceImpl[T, ID]) GetEntities(conditions map[string]any) ([]*T, error) { - return service.repository.GetMultiple(service.db, conditions) +// +// TODO +// func (service *crudServiceImpl[T, ID]) GetEntities(conditions map[string]any) ([]*T, error) { +func (service *crudServiceImpl[T, ID]) GetEntities(conditions ...Condition[T]) ([]*T, error) { + return service.repository.GetMultiple(service.db, conditions...) } diff --git a/controllers/crud.go b/controllers/crud.go index 4abbe43a..ea055ca4 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -63,11 +63,12 @@ func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *htt // The handler responsible of the retrieval of multiple objects func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - params, herr := decodeJSONOptional(r) - if herr != nil { - return nil, herr - } + // params, herr := decodeJSONOptional(r) + // if herr != nil { + // return nil, herr + // } - entities, err := controller.crudService.GetEntities(params) - return entities, mapServiceError(err) + // entities, err := controller.crudService.GetEntities(params) + // return entities, mapServiceError(err) + return nil, nil } diff --git a/mocks/badorm/CRUDRepository.go b/mocks/badorm/CRUDRepository.go index 25d47f8a..630a22fe 100644 --- a/mocks/badorm/CRUDRepository.go +++ b/mocks/badorm/CRUDRepository.go @@ -43,24 +43,31 @@ func (_m *CRUDRepository[T, ID]) Delete(tx *gorm.DB, entity *T) error { } // Get provides a mock function with given fields: tx, conditions -func (_m *CRUDRepository[T, ID]) Get(tx *gorm.DB, conditions map[string]interface{}) (*T, error) { - ret := _m.Called(tx, conditions) +func (_m *CRUDRepository[T, ID]) Get(tx *gorm.DB, conditions ...badorm.Condition[T]) (*T, error) { + _va := make([]interface{}, len(conditions)) + for _i := range conditions { + _va[_i] = conditions[_i] + } + var _ca []interface{} + _ca = append(_ca, tx) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) var r0 *T var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) (*T, error)); ok { - return rf(tx, conditions) + if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) (*T, error)); ok { + return rf(tx, conditions...) } - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) *T); ok { - r0 = rf(tx, conditions) + if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) *T); ok { + r0 = rf(tx, conditions...) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*T) } } - if rf, ok := ret.Get(1).(func(*gorm.DB, map[string]interface{}) error); ok { - r1 = rf(tx, conditions) + if rf, ok := ret.Get(1).(func(*gorm.DB, ...badorm.Condition[T]) error); ok { + r1 = rf(tx, conditions...) } else { r1 = ret.Error(1) } @@ -121,24 +128,31 @@ func (_m *CRUDRepository[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, error) { } // GetMultiple provides a mock function with given fields: tx, conditions -func (_m *CRUDRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]interface{}) ([]*T, error) { - ret := _m.Called(tx, conditions) +func (_m *CRUDRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions ...badorm.Condition[T]) ([]*T, error) { + _va := make([]interface{}, len(conditions)) + for _i := range conditions { + _va[_i] = conditions[_i] + } + var _ca []interface{} + _ca = append(_ca, tx) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) var r0 []*T var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) ([]*T, error)); ok { - return rf(tx, conditions) + if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) ([]*T, error)); ok { + return rf(tx, conditions...) } - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) []*T); ok { - r0 = rf(tx, conditions) + if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) []*T); ok { + r0 = rf(tx, conditions...) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*T) } } - if rf, ok := ret.Get(1).(func(*gorm.DB, map[string]interface{}) error); ok { - r1 = rf(tx, conditions) + if rf, ok := ret.Get(1).(func(*gorm.DB, ...badorm.Condition[T]) error); ok { + r1 = rf(tx, conditions...) } else { r1 = ret.Error(1) } @@ -147,24 +161,57 @@ func (_m *CRUDRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string] } // GetOptional provides a mock function with given fields: tx, conditions -func (_m *CRUDRepository[T, ID]) GetOptional(tx *gorm.DB, conditions map[string]interface{}) (*T, error) { - ret := _m.Called(tx, conditions) +func (_m *CRUDRepository[T, ID]) GetOptional(tx *gorm.DB, conditions ...badorm.Condition[T]) (*T, error) { + _va := make([]interface{}, len(conditions)) + for _i := range conditions { + _va[_i] = conditions[_i] + } + var _ca []interface{} + _ca = append(_ca, tx) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) var r0 *T var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) (*T, error)); ok { - return rf(tx, conditions) + if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) (*T, error)); ok { + return rf(tx, conditions...) } - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) *T); ok { - r0 = rf(tx, conditions) + if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) *T); ok { + r0 = rf(tx, conditions...) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*T) } } - if rf, ok := ret.Get(1).(func(*gorm.DB, map[string]interface{}) error); ok { - r1 = rf(tx, conditions) + if rf, ok := ret.Get(1).(func(*gorm.DB, ...badorm.Condition[T]) error); ok { + r1 = rf(tx, conditions...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetOptionalByID provides a mock function with given fields: tx, id +func (_m *CRUDRepository[T, ID]) GetOptionalByID(tx *gorm.DB, id ID) (*T, error) { + ret := _m.Called(tx, id) + + var r0 *T + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, ID) (*T, error)); ok { + return rf(tx, id) + } + if rf, ok := ret.Get(0).(func(*gorm.DB, ID) *T); ok { + r0 = rf(tx, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*T) + } + } + + if rf, ok := ret.Get(1).(func(*gorm.DB, ID) error); ok { + r1 = rf(tx, id) } else { r1 = ret.Error(1) } diff --git a/mocks/badorm/CRUDService.go b/mocks/badorm/CRUDService.go index cbf09b22..9b6d258b 100644 --- a/mocks/badorm/CRUDService.go +++ b/mocks/badorm/CRUDService.go @@ -13,24 +13,30 @@ type CRUDService[T interface{}, ID badorm.BadaasID] struct { } // GetEntities provides a mock function with given fields: conditions -func (_m *CRUDService[T, ID]) GetEntities(conditions map[string]interface{}) ([]*T, error) { - ret := _m.Called(conditions) +func (_m *CRUDService[T, ID]) GetEntities(conditions ...badorm.Condition[T]) ([]*T, error) { + _va := make([]interface{}, len(conditions)) + for _i := range conditions { + _va[_i] = conditions[_i] + } + var _ca []interface{} + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) var r0 []*T var r1 error - if rf, ok := ret.Get(0).(func(map[string]interface{}) ([]*T, error)); ok { - return rf(conditions) + if rf, ok := ret.Get(0).(func(...badorm.Condition[T]) ([]*T, error)); ok { + return rf(conditions...) } - if rf, ok := ret.Get(0).(func(map[string]interface{}) []*T); ok { - r0 = rf(conditions) + if rf, ok := ret.Get(0).(func(...badorm.Condition[T]) []*T); ok { + r0 = rf(conditions...) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*T) } } - if rf, ok := ret.Get(1).(func(map[string]interface{}) error); ok { - r1 = rf(conditions) + if rf, ok := ret.Get(1).(func(...badorm.Condition[T]) error); ok { + r1 = rf(conditions...) } else { r1 = ret.Error(1) } diff --git a/persistence/models/Session.go b/persistence/models/Session.go index fec4ec3e..6f455584 100644 --- a/persistence/models/Session.go +++ b/persistence/models/Session.go @@ -31,10 +31,3 @@ func (session *Session) IsExpired() bool { func (session *Session) CanBeRolled(rollInterval time.Duration) bool { return time.Now().After(session.ExpiresAt.Add(-rollInterval)) } - -// Return the pluralized table name -// -// Satisfy the Tabler interface -func (Session) TableName() string { - return "sessions" -} diff --git a/persistence/models/Session_test.go b/persistence/models/Session_test.go index a1fdd240..1610d26b 100644 --- a/persistence/models/Session_test.go +++ b/persistence/models/Session_test.go @@ -26,7 +26,3 @@ func TestCanBeRolled(t *testing.T) { time.Sleep(400 * time.Millisecond) assert.True(t, sessionInstance.CanBeRolled(sessionDuration)) } - -func TestTableName(t *testing.T) { - assert.Equal(t, "sessions", models.Session{}.TableName()) -} diff --git a/persistence/models/User.go b/persistence/models/User.go index 24543248..cdb4a54e 100644 --- a/persistence/models/User.go +++ b/persistence/models/User.go @@ -12,9 +12,9 @@ type User struct { Password []byte `gorm:"not null"` } -// Return the pluralized table name -// -// Satisfie the Tabler interface -func (User) TableName() string { - return "users" +func UserEmailCondition(email string) badorm.Condition[User] { + return badorm.Condition[User]{ + Field: "email", + Value: email, + } } diff --git a/services/sessionservice/session.go b/services/sessionservice/session.go index c7548478..73069292 100644 --- a/services/sessionservice/session.go +++ b/services/sessionservice/session.go @@ -83,9 +83,9 @@ func (sessionService *sessionServiceImpl) get(sessionUUID uuid.UUID) *models.Ses return session } - session, err := sessionService.sessionRepository.GetOptional( + session, err := sessionService.sessionRepository.GetOptionalByID( sessionService.db, - map[string]any{"uuid": sessionUUID.String()}, + sessionUUID, ) if err != nil { return nil diff --git a/services/sessionservice/session_test.go b/services/sessionservice/session_test.go index 5d2c3830..90dc25b9 100644 --- a/services/sessionservice/session_test.go +++ b/services/sessionservice/session_test.go @@ -114,7 +114,7 @@ func TestIsValid(t *testing.T) { func TestIsValid_SessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) sessionRepositoryMock. - On("GetOptional", gormDB, mock.Anything). + On("GetOptionalByID", gormDB, mock.Anything). Return(nil, nil) uuidSample := uuid.New() isValid, _ := service.IsValid(uuidSample) @@ -161,7 +161,7 @@ func TestLogOutUserDbError(t *testing.T) { func TestLogOutUser_SessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) sessionRepositoryMock. - On("GetOptional", gormDB, mock.Anything). + On("GetOptionalByID", gormDB, mock.Anything). Return(nil, errors.New("db errors")) uuidSample := uuid.New() @@ -238,7 +238,7 @@ func TestRollSession_falseUUID(t *testing.T) { service.cache[uuidSample] = session repoSession. - On("GetOptional", gormDB, mock.Anything). + On("GetOptionalByID", gormDB, mock.Anything). Return(nil, nil) err := service.RollSession(uuid.New()) @@ -248,7 +248,7 @@ func TestRollSession_falseUUID(t *testing.T) { func TestRollSession_sessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, sessionConfigurationMock := setupTest(t) sessionRepositoryMock. - On("GetOptional", gormDB, map[string]any{"uuid": "00000000-0000-0000-0000-000000000000"}). + On("GetOptionalByID", gormDB, uuid.Nil). Return(nil, nil) sessionDuration := time.Minute @@ -340,7 +340,7 @@ func Test_get(t *testing.T) { ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. - On("GetOptional", gormDB, mock.Anything). + On("GetOptionalByID", gormDB, mock.Anything). Return(session, nil) sessionFound := service.get(uuidSample) diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index 72faad37..69ef4665 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -77,7 +77,7 @@ func (userService *userServiceImpl) NewUser(username, email, password string) (* func (userService *userServiceImpl) GetUser(userLoginDTO dto.UserLoginDTO) (*models.User, error) { user, err := userService.userRepository.Get( userService.db, - map[string]any{"email": userLoginDTO.Email}, + models.UserEmailCondition(userLoginDTO.Email), ) if err != nil { return nil, err diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index 9c0ae3e5..a27f0b52 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -99,7 +99,7 @@ func TestGetUser(t *testing.T) { require.NoError(t, err) userRepositoryMock.On( - "Get", gormDB, map[string]any{"email": "bob@email.com"}, + "Get", gormDB, models.UserEmailCondition("bob@email.com"), ).Return( user, nil, @@ -127,7 +127,7 @@ func TestGetUserNoUserFound(t *testing.T) { userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) userRepositoryMock.On( - "Get", gormDB, map[string]any{"email": "bobnotfound@email.com"}, + "Get", gormDB, models.UserEmailCondition("bobnotfound@email.com"), ).Return( &models.User{}, badorm.ErrObjectNotFound, @@ -154,7 +154,7 @@ func TestGetUserWrongPassword(t *testing.T) { require.NoError(t, err) userRepositoryMock.On( - "Get", gormDB, map[string]any{"email": "bob@email.com"}, + "Get", gormDB, models.UserEmailCondition("bob@email.com"), ).Return( user, nil, diff --git a/test_integration/crudRepository.go b/test_integration/crudRepository.go index 62efdba6..95b0eb31 100644 --- a/test_integration/crudRepository.go +++ b/test_integration/crudRepository.go @@ -53,17 +53,13 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetByIDReturnsEntityIfIDMatch() { func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsErrorIfConditionsDontMatch() { ts.createProduct(0) - _, err := ts.crudProductRepository.Get(ts.db, map[string]any{ - "int": 1, - }) + _, err := ts.crudProductRepository.Get(ts.db, ProductIntCondition(1)) ts.Error(err, gorm.ErrRecordNotFound) } func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsEntityIfConditionsMatch() { product := ts.createProduct(1) - productReturned, err := ts.crudProductRepository.Get(ts.db, map[string]any{ - "int": 1, - }) + productReturned, err := ts.crudProductRepository.Get(ts.db, ProductIntCondition(1)) ts.Nil(err) assert.DeepEqual(ts.T(), product, productReturned) @@ -73,18 +69,14 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsEntityIfConditionsMatch() { func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsNilIfConditionsDontMatch() { ts.createProduct(0) - productReturned, err := ts.crudProductRepository.GetOptional(ts.db, map[string]any{ - "int": 1, - }) + productReturned, err := ts.crudProductRepository.GetOptional(ts.db, ProductIntCondition(1)) ts.Nil(err) ts.Nil(productReturned) } func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsEntityIfConditionsMatch() { product := ts.createProduct(0) - productReturned, err := ts.crudProductRepository.GetOptional(ts.db, map[string]any{ - "int": 0, - }) + productReturned, err := ts.crudProductRepository.GetOptional(ts.db, ProductIntCondition(0)) ts.Nil(err) assert.DeepEqual(ts.T(), product, productReturned) @@ -93,9 +85,7 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsEntityIfConditionsMa func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsErrorIfMoreThanOneMatchConditions() { ts.createProduct(0) ts.createProduct(0) - _, err := ts.crudProductRepository.GetOptional(ts.db, map[string]any{ - "int": 0, - }) + _, err := ts.crudProductRepository.GetOptional(ts.db, ProductIntCondition(0)) ts.Error(err, badorm.ErrMoreThanOneObjectFound) } diff --git a/test_integration/crudService.go b/test_integration/crudService.go index abbd852f..9ac8b1aa 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -2,7 +2,6 @@ package integrationtests import ( "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/google/uuid" "github.com/stretchr/testify/suite" "go.uber.org/zap" @@ -26,6 +25,34 @@ type Product struct { Bool bool } +func ProductIntCondition(intV int) badorm.Condition[Product] { + return badorm.Condition[Product]{ + Field: "int", + Value: intV, + } +} + +func ProductStringCondition(stringV string) badorm.Condition[Product] { + return badorm.Condition[Product]{ + Field: "string", + Value: stringV, + } +} + +func ProductFloatCondition(floatV float64) badorm.Condition[Product] { + return badorm.Condition[Product]{ + Field: "float", + Value: floatV, + } +} + +func ProductBoolCondition(boolV bool) badorm.Condition[Product] { + return badorm.Condition[Product]{ + Field: "bool", + Value: boolV, + } +} + type Seller struct { badorm.UUIDModel @@ -48,6 +75,13 @@ type Sale struct { SellerID *uuid.UUID } +func SaleProductIDCondition(id uuid.UUID) badorm.Condition[Sale] { + return badorm.Condition[Sale]{ + Field: "product_id", + Value: id.String(), + } +} + func (m Product) Equal(other Product) bool { return m.ID == other.ID } @@ -184,7 +218,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsTheEntityIfItIsCreate() { // ------------------------- GetEntities -------------------------------- func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.crudProductService.GetEntities(map[string]any{}) + entities, err := ts.crudProductService.GetEntities() ts.Nil(err) EqualList(&ts.Suite, []*Product{}, entities) @@ -193,7 +227,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyI func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { match := ts.createProduct("", 0, 0, false) - entities, err := ts.crudProductService.GetEntities(map[string]any{}) + entities, err := ts.crudProductService.GetEntities() ts.Nil(err) EqualList(&ts.Suite, []*Product{match}, entities) @@ -204,17 +238,16 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheLis match2 := ts.createProduct("", 0, 0, false) match3 := ts.createProduct("", 0, 0, false) - entities, err := ts.crudProductService.GetEntities(map[string]any{}) + entities, err := ts.crudProductService.GetEntities() ts.Nil(err) EqualList(&ts.Suite, []*Product{match1, match2, match3}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { - params := map[string]any{ - "string": "not_created", - } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.GetEntities( + ProductStringCondition("not_created"), + ) ts.Nil(err) EqualList(&ts.Suite, []*Product{}, entities) @@ -223,10 +256,9 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNo func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { ts.createProduct("something_else", 0, 0, false) - params := map[string]any{ - "string": "not_match", - } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.GetEntities( + ProductStringCondition("not_match"), + ) ts.Nil(err) EqualList(&ts.Suite, []*Product{}, entities) @@ -236,10 +268,9 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnly match := ts.createProduct("match", 0, 0, false) ts.createProduct("not_match", 0, 0, false) - params := map[string]any{ - "string": "match", - } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.GetEntities( + ProductStringCondition("match"), + ) ts.Nil(err) EqualList(&ts.Suite, []*Product{match}, entities) @@ -250,58 +281,33 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleI match2 := ts.createProduct("match", 0, 0, false) ts.createProduct("not_match", 0, 0, false) - params := map[string]any{ - "string": "match", - } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.GetEntities( + ProductStringCondition("match"), + ) ts.Nil(err) EqualList(&ts.Suite, []*Product{match1, match2}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsDBError() { - ts.createProduct("match", 0, 0, false) - - params := map[string]any{ - "not_exists": "not_exists", - } - _, err := ts.crudProductService.GetEntities(params) - ts.NotNil(err) - ts.True(gormdatabase.IsPostgresError(err, "42703")) -} - func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { match := ts.createProduct("match", 1, 0, false) ts.createProduct("not_match", 2, 0, false) - params := map[string]any{ - "int": 1, - } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.GetEntities( + ProductIntCondition(1), + ) ts.Nil(err) EqualList(&ts.Suite, []*Product{match}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeReturnsDBError() { - ts.createProduct("not_match", 1, 0, false) - - params := map[string]any{ - "int": "not_an_int", - } - _, err := ts.crudProductService.GetEntities(params) - ts.NotNil(err) - ts.True(gormdatabase.IsPostgresError(err, "22P02")) -} - func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { match := ts.createProduct("match", 0, 1.1, false) ts.createProduct("not_match", 0, 2.2, false) - params := map[string]any{ - "float": 1.1, - } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.GetEntities( + ProductFloatCondition(1.1), + ) ts.Nil(err) EqualList(&ts.Suite, []*Product{match}, entities) @@ -311,34 +317,14 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { match := ts.createProduct("match", 0, 0.0, true) ts.createProduct("not_match", 0, 0.0, false) - params := map[string]any{ - "bool": true, - } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.GetEntities( + ProductBoolCondition(true), + ) ts.Nil(err) EqualList(&ts.Suite, []*Product{match}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { - product1 := ts.createProduct("", 0, 0.0, false) - product2 := ts.createProduct("", 0, 0.0, false) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - params := map[string]any{ - "product_id": product1.ID.String(), - } - entities, err := ts.crudSaleService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*Sale{match}, entities) -} - func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { match1 := ts.createProduct("match", 1, 0.0, true) match2 := ts.createProduct("match", 1, 0.0, true) @@ -346,175 +332,19 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDiffer ts.createProduct("not_match", 1, 0.0, true) ts.createProduct("match", 2, 0.0, true) - params := map[string]any{ - "string": "match", - "int": 1, - "bool": true, - } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.GetEntities( + ProductStringCondition("match"), + ProductIntCondition(1), + ProductBoolCondition(true), + ) ts.Nil(err) EqualList(&ts.Suite, []*Product{match1, match2}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { - product1 := ts.createProduct("", 1, 0.0, false) - product2 := ts.createProduct("", 2, 0.0, false) - - match := ts.createSale(0, product1, nil) - ts.createSale(0, product2, nil) - - params := map[string]any{ - "Product": map[string]any{ - "int": 1, - }, - } - entities, err := ts.crudSaleService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { - product1 := ts.createProduct("", 1, 0.0, false) - product2 := ts.createProduct("", 2, 0.0, false) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - params := map[string]any{ - "Seller": map[string]any{ - "name": "franco", - }, - } - entities, err := ts.crudSaleService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { - boss1 := &Employee{ - Name: "Xavier", - } - boss2 := &Employee{ - Name: "Vincent", - } - - match := ts.createEmployee("franco", boss1) - ts.createEmployee("pierre", boss2) - - params := map[string]any{ - "Boss": map[string]any{ - "name": "Xavier", - }, - } - entities, err := ts.crudEmployeeService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*Employee{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { - capital1 := City{ - Name: "Buenos Aires", - } - capital2 := City{ - Name: "Paris", - } - - ts.createCountry("Argentina", capital1) - ts.createCountry("France", capital2) - - params := map[string]any{ - "Country": map[string]any{ - "name": "Argentina", - }, - } - entities, err := ts.crudCityService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*City{&capital1}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { - capital1 := City{ - Name: "Buenos Aires", - } - capital2 := City{ - Name: "Paris", - } - - country1 := ts.createCountry("Argentina", capital1) - ts.createCountry("France", capital2) - - params := map[string]any{ - "Capital": map[string]any{ - "name": "Buenos Aires", - }, - } - entities, err := ts.crudCountryService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*Country{country1}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsReturnsErrorIfNoRelation() { - params := map[string]any{ - "NotExists": map[string]any{ - "int": 1, - }, - } - _, err := ts.crudSaleService.GetEntities(params) - ts.ErrorContains(err, "Sale has not attribute named NotExists or NotExistsID") -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { - person1 := Person{ - Name: "franco", - } - person2 := Person{ - Name: "xavier", - } - - match := ts.createBicycle("BMX", person1) - ts.createBicycle("Shimano", person2) - - params := map[string]any{ - "Owner": map[string]any{ - "name": "franco", - }, - } - entities, err := ts.crudBicycleService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*Bicycle{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { - company1 := ts.createCompany("ditrit") - company2 := ts.createCompany("orness") - - match := ts.createSeller("franco", company1) - ts.createSeller("agustin", company2) - - params := map[string]any{ - "Company": map[string]any{ - "name": "ditrit", - }, - } - entities, err := ts.crudSellerService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*Seller{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { - product1 := ts.createProduct("match", 1, 0.0, false) - product2 := ts.createProduct("match", 2, 0.0, false) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { + product1 := ts.createProduct("", 0, 0.0, false) + product2 := ts.createProduct("", 0, 0.0, false) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -522,93 +352,266 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffer match := ts.createSale(0, product1, seller1) ts.createSale(0, product2, seller2) - params := map[string]any{ - "Product": map[string]any{ - "int": 1, - "string": "match", - }, - } - entities, err := ts.crudSaleService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { - product1 := ts.createProduct("", 1, 0.0, false) - product2 := ts.createProduct("", 2, 0.0, false) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(1, product1, seller1) - ts.createSale(2, product2, seller2) - ts.createSale(2, product1, seller2) - - params := map[string]any{ - "Product": map[string]any{ - "int": 1, - }, - "code": 1, - } - entities, err := ts.crudSaleService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { - product1 := ts.createProduct("", 1, 0.0, false) - product2 := ts.createProduct("", 2, 0.0, false) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - ts.createSale(0, product1, seller2) - ts.createSale(0, product2, seller1) - - params := map[string]any{ - "Product": map[string]any{ - "int": 1, - }, - "Seller": map[string]any{ - "name": "franco", - }, - } - entities, err := ts.crudSaleService.GetEntities(params) + entities, err := ts.crudSaleService.GetEntities( + SaleProductIDCondition(product1.ID), + ) ts.Nil(err) EqualList(&ts.Suite, []*Sale{match}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { - product1 := ts.createProduct("", 0, 0.0, false) - product2 := ts.createProduct("", 0, 0.0, false) - - company1 := ts.createCompany("ditrit") - company2 := ts.createCompany("orness") - - seller1 := ts.createSeller("franco", company1) - seller2 := ts.createSeller("agustin", company2) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - params := map[string]any{ - "Seller": map[string]any{ - "name": "franco", - "Company": map[string]any{ - "name": "ditrit", - }, - }, - } - entities, err := ts.crudSaleService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*Sale{match}, entities) -} +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { +// product1 := ts.createProduct("", 1, 0.0, false) +// product2 := ts.createProduct("", 2, 0.0, false) + +// match := ts.createSale(0, product1, nil) +// ts.createSale(0, product2, nil) + +// params := map[string]any{ +// "Product": map[string]any{ +// "int": 1, +// }, +// } +// entities, err := ts.crudSaleService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { +// product1 := ts.createProduct("", 1, 0.0, false) +// product2 := ts.createProduct("", 2, 0.0, false) + +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) + +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) + +// params := map[string]any{ +// "Seller": map[string]any{ +// "name": "franco", +// }, +// } +// entities, err := ts.crudSaleService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { +// boss1 := &Employee{ +// Name: "Xavier", +// } +// boss2 := &Employee{ +// Name: "Vincent", +// } + +// match := ts.createEmployee("franco", boss1) +// ts.createEmployee("pierre", boss2) + +// params := map[string]any{ +// "Boss": map[string]any{ +// "name": "Xavier", +// }, +// } +// entities, err := ts.crudEmployeeService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*Employee{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { +// capital1 := City{ +// Name: "Buenos Aires", +// } +// capital2 := City{ +// Name: "Paris", +// } + +// ts.createCountry("Argentina", capital1) +// ts.createCountry("France", capital2) + +// params := map[string]any{ +// "Country": map[string]any{ +// "name": "Argentina", +// }, +// } +// entities, err := ts.crudCityService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*City{&capital1}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { +// capital1 := City{ +// Name: "Buenos Aires", +// } +// capital2 := City{ +// Name: "Paris", +// } + +// country1 := ts.createCountry("Argentina", capital1) +// ts.createCountry("France", capital2) + +// params := map[string]any{ +// "Capital": map[string]any{ +// "name": "Buenos Aires", +// }, +// } +// entities, err := ts.crudCountryService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*Country{country1}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsReturnsErrorIfNoRelation() { +// params := map[string]any{ +// "NotExists": map[string]any{ +// "int": 1, +// }, +// } +// _, err := ts.crudSaleService.GetEntities(params) +// ts.ErrorContains(err, "Sale has not attribute named NotExists or NotExistsID") +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { +// person1 := Person{ +// Name: "franco", +// } +// person2 := Person{ +// Name: "xavier", +// } + +// match := ts.createBicycle("BMX", person1) +// ts.createBicycle("Shimano", person2) + +// params := map[string]any{ +// "Owner": map[string]any{ +// "name": "franco", +// }, +// } +// entities, err := ts.crudBicycleService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*Bicycle{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { +// company1 := ts.createCompany("ditrit") +// company2 := ts.createCompany("orness") + +// match := ts.createSeller("franco", company1) +// ts.createSeller("agustin", company2) + +// params := map[string]any{ +// "Company": map[string]any{ +// "name": "ditrit", +// }, +// } +// entities, err := ts.crudSellerService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*Seller{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { +// product1 := ts.createProduct("match", 1, 0.0, false) +// product2 := ts.createProduct("match", 2, 0.0, false) + +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) + +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) + +// params := map[string]any{ +// "Product": map[string]any{ +// "int": 1, +// "string": "match", +// }, +// } +// entities, err := ts.crudSaleService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { +// product1 := ts.createProduct("", 1, 0.0, false) +// product2 := ts.createProduct("", 2, 0.0, false) + +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) + +// match := ts.createSale(1, product1, seller1) +// ts.createSale(2, product2, seller2) +// ts.createSale(2, product1, seller2) + +// params := map[string]any{ +// "Product": map[string]any{ +// "int": 1, +// }, +// "code": 1, +// } +// entities, err := ts.crudSaleService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { +// product1 := ts.createProduct("", 1, 0.0, false) +// product2 := ts.createProduct("", 2, 0.0, false) + +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) + +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) +// ts.createSale(0, product1, seller2) +// ts.createSale(0, product2, seller1) + +// params := map[string]any{ +// "Product": map[string]any{ +// "int": 1, +// }, +// "Seller": map[string]any{ +// "name": "franco", +// }, +// } +// entities, err := ts.crudSaleService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { +// product1 := ts.createProduct("", 0, 0.0, false) +// product2 := ts.createProduct("", 0, 0.0, false) + +// company1 := ts.createCompany("ditrit") +// company2 := ts.createCompany("orness") + +// seller1 := ts.createSeller("franco", company1) +// seller2 := ts.createSeller("agustin", company2) + +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) + +// params := map[string]any{ +// "Seller": map[string]any{ +// "name": "franco", +// "Company": map[string]any{ +// "name": "ditrit", +// }, +// }, +// } +// entities, err := ts.crudSaleService.GetEntities(params) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*Sale{match}, entities) +// } // ------------------------- utils ------------------------- From 2998c77ced61da8bc66871fcf51fde48f1a7c2e4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 17 May 2023 16:24:07 +0200 Subject: [PATCH 190/467] allow joins --- badorm/condition.go | 150 ++++++++ badorm/crudRepository.go | 265 +++----------- go.mod | 1 + go.sum | 2 + persistence/models/User.go | 2 +- test_integration/crudService.go | 607 ++++++++++++++++++-------------- 6 files changed, 557 insertions(+), 470 deletions(-) create mode 100644 badorm/condition.go diff --git a/badorm/condition.go b/badorm/condition.go new file mode 100644 index 00000000..3bc03bf1 --- /dev/null +++ b/badorm/condition.go @@ -0,0 +1,150 @@ +package badorm + +import ( + "fmt" + "reflect" + + "github.com/ettle/strcase" + "gorm.io/gorm" +) + +type Condition[T any] interface { + // WhereCondition[T] | JoinCondition[T, any] + ApplyTo(query *gorm.DB, tableName string) error +} + +type WhereCondition[T any] struct { + Field string + Value any +} + +func (condition WhereCondition[T1]) ApplyTo(query *gorm.DB, tableName string) error { + return nil +} + +type JoinCondition[T1 any, T2 any] struct { + Field string + Conditions []Condition[T2] +} + +func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName string) error { + // relatedObject, relationIDIsInPreviousTable, err := getRelatedObject( + // previousEntity, + // joinAttributeName, + // ) + // if err != nil { + // return err + // } + + // joinTableName, err := getTableName(query, relatedObject) + // if err != nil { + // return err + // } + + joinTableName, err := getTableName(query, *new(T2)) + if err != nil { + return err + } + + tableWithSuffix := joinTableName + "_" + previousTableName + + var stringQuery string + if isIDPresentInObject[T1](condition.Field) { + stringQuery = fmt.Sprintf( + `JOIN %[1]s %[2]s ON + %[2]s.id = %[3]s.%[4]s_id + AND %[2]s.deleted_at IS NULL + `, + joinTableName, + tableWithSuffix, + previousTableName, + condition.Field, + ) + } else { + // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) + previousAttribute := reflect.TypeOf(*new(T1)).Name() + stringQuery = fmt.Sprintf( + `JOIN %[1]s %[2]s ON + %[2]s.%[4]s_id = %[3]s.id + AND %[2]s.deleted_at IS NULL + `, + joinTableName, + tableWithSuffix, + previousTableName, + previousAttribute, + ) + } + + thisEntityConditions, joinConditions := divideConditionsByEntity(condition.Conditions) + + conditionsValues := []any{} + for _, condition := range thisEntityConditions { + stringQuery += fmt.Sprintf( + `AND %[1]s.%[2]s = ? + `, + tableWithSuffix, condition.Field, + ) + conditionsValues = append(conditionsValues, condition.Value) + } + + query.Joins(stringQuery, conditionsValues...) + + for _, joinCondition := range joinConditions { + err := joinCondition.ApplyTo(query, tableWithSuffix) + if err != nil { + return err + } + } + + return nil +} + +func isIDPresentInObject[T any](relationName string) bool { + entityType := getEntityType(*new(T)) + _, isIDPresent := entityType.FieldByName( + strcase.ToPascal(relationName) + "ID", + ) + return isIDPresent +} + +// Given a map of "conditions" that is in {"attributeName": expectedValue} format +// and in case of join "conditions" can have the format: +// +// {"relationAttributeName": {"attributeName": expectedValue}} +// +// it divides the map in two: +// the conditions that will be applied to the current entity ({"attributeName": expectedValue} format) +// the conditions that will generate a join with another entity ({"relationAttributeName": {"attributeName": expectedValue}} format) +// +// Returns error if any expectedValue is not of a supported type +func divideConditionsByEntity[T any]( + conditions []Condition[T], +) (thisEntityConditions []WhereCondition[T], joinConditions []Condition[T]) { + for _, condition := range conditions { + switch typedCondition := condition.(type) { + case WhereCondition[T]: + thisEntityConditions = append(thisEntityConditions, typedCondition) + // case JoinCondition[T, any]: + // joinConditions = append(joinConditions, typedCondition) + default: + joinConditions = append(joinConditions, typedCondition) + // log.Println(reflect.TypeOf(typedCondition)) + // log.Println(reflect.TypeOf(any(condition))) + // log.Println(condition.(JoinCondition[T, any])) + } + } + + return +} + +// Get the reflect.Type of any entity or pointer to entity +func getEntityType(entity any) reflect.Type { + entityType := reflect.TypeOf(entity) + + // entityType will be a pointer if the relation can be nullable + if entityType.Kind() == reflect.Pointer { + entityType = entityType.Elem() + } + + return entityType +} diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 70c81d13..52534ee2 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -3,7 +3,6 @@ package badorm import ( "errors" "fmt" - "reflect" "sync" "go.uber.org/zap" @@ -11,11 +10,6 @@ import ( "gorm.io/gorm/schema" ) -type Condition[T any] struct { - Field string - Value any -} - // Generic CRUD Repository // T can be any model whose identifier attribute is of type ID type CRUDRepository[T any, ID BadaasID] interface { @@ -140,56 +134,39 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions // // {"relationAttributeName": {"attributeName": expectedValue}} func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { - // thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) - // if err != nil { - // return nil, err - // } - - // query := tx.Where(thisEntityConditions) - - // entity := new(T) - // // only entities that match the conditions - // for joinAttributeName, joinConditions := range joinConditions { - // tableName, err := getTableName(tx, entity) - // if err != nil { - // return nil, err - // } - - // err = repository.addJoinToQuery( - // query, - // entity, - // tableName, - // joinAttributeName, - // joinConditions, - // ) - // if err != nil { - // return nil, err - // } - // } - - // query := tx.Model(*new(T)) - // whereQuery := utils.Reduce(conditions, func(whereQuery string, condition Condition[T]) string { - // return whereQuery + " AND " + condition.Query - // }) - // whereValues := pie.Map(conditions, func(condition Condition[T]) any { - // return condition.Value - // }) - // - // query.Where(whereQuery, whereValues...) + thisEntityConditions, joinConditions := divideConditionsByEntity(conditions) - // TODO verificar que no se repitan - whereParams := map[string]interface{}{} - for _, condition := range conditions { - whereParams[condition.Field] = condition.Value + query := tx.Where(getWhereParams(thisEntityConditions)) + + initialTableName, err := getTableName(query, *new(T)) + if err != nil { + return nil, err + } + + for _, condition := range joinConditions { + err := condition.ApplyTo(query, initialTableName) + if err != nil { + return nil, err + } } // execute query var entities []*T - err := tx.Where(whereParams).Find(&entities).Error + err = query.Find(&entities).Error return entities, err } +func getWhereParams[T any](conditions []WhereCondition[T]) map[string]any { + // TODO verificar que no se repitan + whereParams := map[string]any{} + for _, condition := range conditions { + whereParams[condition.Field] = condition.Value + } + + return whereParams +} + // Get the name of the table in "db" in which the data for "entity" is saved // returns error is table name can not be found by gorm, // probably because the type of "entity" is not registered using AddModel @@ -207,175 +184,47 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { return repository.GetMultiple(tx) } -// Adds a join to the "query" by the "joinAttributeName" -// then, adds the verification that the joined values match "conditions" - -// "conditions" is in {"attributeName": expectedValue} format -// "previousEntity" is a pointer to a object from where we navigate the relationship -// "previousTableName" is the name of the table where the previous object is saved and from we the join will we done -func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( - query *gorm.DB, previousEntity any, - previousTableName, joinAttributeName string, - conditions map[string]any, -) error { - thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) - if err != nil { - return err - } - - relatedObject, relationIDIsInPreviousTable, err := getRelatedObject( - previousEntity, - joinAttributeName, - ) - if err != nil { - return err - } - - joinTableName, err := getTableName(query, relatedObject) - if err != nil { - return err - } - - tableWithSuffix := joinTableName + "_" + previousTableName - - var stringQuery string - if relationIDIsInPreviousTable { - stringQuery = fmt.Sprintf( - `JOIN %[1]s %[2]s ON - %[2]s.id = %[3]s.%[4]s_id - AND %[2]s.deleted_at IS NULL - `, - joinTableName, - tableWithSuffix, - previousTableName, - joinAttributeName, - ) - } else { - // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) - previousAttribute := reflect.TypeOf(previousEntity).Elem().Name() - stringQuery = fmt.Sprintf( - `JOIN %[1]s %[2]s ON - %[2]s.%[4]s_id = %[3]s.id - AND %[2]s.deleted_at IS NULL - `, - joinTableName, - tableWithSuffix, - previousTableName, - previousAttribute, - ) - } - - conditionsValues := []any{} - for attributeName, conditionValue := range thisEntityConditions { - stringQuery += fmt.Sprintf( - `AND %[1]s.%[2]s = ? - `, - tableWithSuffix, attributeName, - ) - conditionsValues = append(conditionsValues, conditionValue) - } - - query.Joins(stringQuery, conditionsValues...) - - for joinAttributeName, joinConditions := range joinConditions { - err := repository.addJoinToQuery( - query, - relatedObject, - tableWithSuffix, - joinAttributeName, - joinConditions, - ) - if err != nil { - return err - } - } - - return nil -} - -// Given a map of "conditions" that is in {"attributeName": expectedValue} format -// and in case of join "conditions" can have the format: -// -// {"relationAttributeName": {"attributeName": expectedValue}} -// -// it divides the map in two: -// the conditions that will be applied to the current entity ({"attributeName": expectedValue} format) -// the conditions that will generate a join with another entity ({"relationAttributeName": {"attributeName": expectedValue}} format) -// -// Returns error if any expectedValue is not of a supported type -func divideConditionsByEntity( - conditions map[string]any, -) (map[string]any, map[string]map[string]any, error) { - thisEntityConditions := map[string]any{} - joinConditions := map[string]map[string]any{} - - for attributeName, expectedValue := range conditions { - switch typedExpectedValue := expectedValue.(type) { - case float64, bool, string, int: - thisEntityConditions[attributeName] = expectedValue - case map[string]any: - joinConditions[attributeName] = typedExpectedValue - default: - return nil, nil, fmt.Errorf("unsupported type") - } - } - - return thisEntityConditions, joinConditions, nil -} - // Returns an object of the type of the "entity" attribute called "relationName" // and a boolean value indicating whether the id attribute that relates them // in the database is in the "entity"'s table. // Returns error if "entity" not a relation called "relationName". -func getRelatedObject(entity any, relationName string) (any, bool, error) { - entityType := getEntityType(entity) +// func getRelatedObject(entity any, relationName string) (any, bool, error) { +// entityType := getEntityType(entity) - field, isPresent := entityType.FieldByName(relationName) - if !isPresent { - // some gorm relations dont have a direct relation in the model, only the id - relatedObject, err := getRelatedObjectByID(entityType, relationName) - if err != nil { - return nil, false, err - } - - return relatedObject, true, nil - } +// field, isPresent := entityType.FieldByName(relationName) +// if !isPresent { +// // some gorm relations dont have a direct relation in the model, only the id +// relatedObject, err := getRelatedObjectByID(entityType, relationName) +// if err != nil { +// return nil, false, err +// } - _, isIDPresent := entityType.FieldByName(relationName + "ID") +// return relatedObject, true, nil +// } - return createObject(field.Type), isIDPresent, nil -} - -// Get the reflect.Type of any entity or pointer to entity -func getEntityType(entity any) reflect.Type { - entityType := reflect.TypeOf(entity) - - // entityType will be a pointer if the relation can be nullable - if entityType.Kind() == reflect.Pointer { - entityType = entityType.Elem() - } +// _, isIDPresent := entityType.FieldByName(relationName + "ID") - return entityType -} +// return createObject(field.Type), isIDPresent, nil +// } // Returns an object of the type of the "entity" attribute called "relationName" + "ID" // Returns error if "entity" not a relation called "relationName" + "ID" -func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, error) { - _, isPresent := entityType.FieldByName(relationName + "ID") - if !isPresent { - return nil, ErrObjectsNotRelated(entityType.Name(), relationName) - } - - // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) - fieldType, isPresent := modelsMapping[relationName] - if !isPresent { - return nil, ErrModelNotRegistered(entityType.Name(), relationName) - } - - return createObject(fieldType), nil -} - -// Creates an object of type reflect.Type using reflection -func createObject(entityType reflect.Type) any { - return reflect.New(entityType).Elem().Interface() -} +// func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, error) { +// _, isPresent := entityType.FieldByName(relationName + "ID") +// if !isPresent { +// return nil, ErrObjectsNotRelated(entityType.Name(), relationName) +// } + +// // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) +// fieldType, isPresent := modelsMapping[relationName] +// if !isPresent { +// return nil, ErrModelNotRegistered(entityType.Name(), relationName) +// } + +// return createObject(fieldType), nil +// } + +// // Creates an object of type reflect.Type using reflection +// func createObject(entityType reflect.Type) any { +// return reflect.New(entityType).Elem().Interface() +// } diff --git a/go.mod b/go.mod index f50a00b0..5805db0e 100644 --- a/go.mod +++ b/go.mod @@ -26,6 +26,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ettle/strcase v0.1.1 github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/goph/emperror v0.17.2 // indirect diff --git a/go.sum b/go.sum index 2e8b9d51..f4090f42 100644 --- a/go.sum +++ b/go.sum @@ -79,6 +79,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= diff --git a/persistence/models/User.go b/persistence/models/User.go index cdb4a54e..c704eb77 100644 --- a/persistence/models/User.go +++ b/persistence/models/User.go @@ -13,7 +13,7 @@ type User struct { } func UserEmailCondition(email string) badorm.Condition[User] { - return badorm.Condition[User]{ + return badorm.WhereCondition[User]{ Field: "email", Value: email, } diff --git a/test_integration/crudService.go b/test_integration/crudService.go index 9ac8b1aa..b9431947 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -16,6 +16,13 @@ type Company struct { Sellers []Seller // Company HasMany Sellers (Company 1 -> 0..* Seller) } +func CompanyNameCondition(name string) badorm.WhereCondition[Company] { + return badorm.WhereCondition[Company]{ + Field: "name", + Value: name, + } +} + type Product struct { badorm.UUIDModel @@ -25,29 +32,29 @@ type Product struct { Bool bool } -func ProductIntCondition(intV int) badorm.Condition[Product] { - return badorm.Condition[Product]{ +func ProductIntCondition(intV int) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ Field: "int", Value: intV, } } -func ProductStringCondition(stringV string) badorm.Condition[Product] { - return badorm.Condition[Product]{ +func ProductStringCondition(stringV string) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ Field: "string", Value: stringV, } } -func ProductFloatCondition(floatV float64) badorm.Condition[Product] { - return badorm.Condition[Product]{ +func ProductFloatCondition(floatV float64) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ Field: "float", Value: floatV, } } -func ProductBoolCondition(boolV bool) badorm.Condition[Product] { - return badorm.Condition[Product]{ +func ProductBoolCondition(boolV bool) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ Field: "bool", Value: boolV, } @@ -60,6 +67,21 @@ type Seller struct { CompanyID *uuid.UUID // Company HasMany Sellers (Company 1 -> 0..* Seller) } +func SellerNameCondition(name string) badorm.WhereCondition[Seller] { + return badorm.WhereCondition[Seller]{ + Field: "name", + Value: name, + } +} + +// TODO lo que returna aca tampoco se verifica, claramente la verificacion de interfaces genericas no anda +func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { + return badorm.JoinCondition[Seller, Company]{ + Field: "company", + Conditions: conditions, + } +} + type Sale struct { badorm.UUIDModel @@ -76,12 +98,34 @@ type Sale struct { } func SaleProductIDCondition(id uuid.UUID) badorm.Condition[Sale] { - return badorm.Condition[Sale]{ + return badorm.WhereCondition[Sale]{ Field: "product_id", Value: id.String(), } } +func SaleProductCondition(conditions ...badorm.Condition[Product]) badorm.Condition[Sale] { + return badorm.JoinCondition[Sale, Product]{ + Field: "product", + Conditions: conditions, + } +} + +// TODO como esto no se verifica seguro que tambien pueda meter cualquier mierda +func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Condition[Seller] { + return badorm.JoinCondition[Sale, Seller]{ + Field: "seller", + Conditions: conditions, + } +} + +func SaleCodeCondition(code int) badorm.WhereCondition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "code", + Value: code, + } +} + func (m Product) Equal(other Product) bool { return m.ID == other.ID } @@ -116,6 +160,34 @@ func (m City) Equal(other City) bool { return m.Name == other.Name } +func CityCountryCondition(conditions ...badorm.Condition[Country]) badorm.Condition[City] { + return badorm.JoinCondition[City, Country]{ + Field: "country", + Conditions: conditions, + } +} + +func CountryNameCondition(name string) badorm.WhereCondition[Country] { + return badorm.WhereCondition[Country]{ + Field: "name", + Value: name, + } +} + +func CountryCapitalCondition(conditions ...badorm.Condition[City]) badorm.Condition[Country] { + return badorm.JoinCondition[Country, City]{ + Field: "capital", + Conditions: conditions, + } +} + +func CapitalNameCondition(name string) badorm.WhereCondition[City] { + return badorm.WhereCondition[City]{ + Field: "name", + Value: name, + } +} + type Employee struct { badorm.UUIDModel @@ -124,6 +196,20 @@ type Employee struct { BossID *uuid.UUID } +func EmployeeBossCondition(conditions ...badorm.Condition[Employee]) badorm.Condition[Employee] { + return badorm.JoinCondition[Employee, Employee]{ + Field: "boss", + Conditions: conditions, + } +} + +func EmployeeNameCondition(name string) badorm.WhereCondition[Employee] { + return badorm.WhereCondition[Employee]{ + Field: "name", + Value: name, + } +} + func (m Employee) Equal(other Employee) bool { return m.Name == other.Name } @@ -147,6 +233,20 @@ type Bicycle struct { OwnerID uuid.UUID } +func BicycleOwnerCondition(conditions ...badorm.Condition[Person]) badorm.Condition[Bicycle] { + return badorm.JoinCondition[Bicycle, Person]{ + Field: "owner", + Conditions: conditions, + } +} + +func PersonNameCondition(name string) badorm.WhereCondition[Person] { + return badorm.WhereCondition[Person]{ + Field: "name", + Value: name, + } +} + func (m Bicycle) Equal(other Bicycle) bool { return m.Name == other.Name } @@ -192,6 +292,8 @@ func (ts *CRUDServiceIntTestSuite) SetupTest() { CleanDB(ts.db) } +// TODO nombres complejos, diferencia entre _ y mayusculas + // ------------------------- GetEntity -------------------------------- func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { @@ -360,258 +462,241 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() EqualList(&ts.Suite, []*Sale{match}, entities) } -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { -// product1 := ts.createProduct("", 1, 0.0, false) -// product2 := ts.createProduct("", 2, 0.0, false) - -// match := ts.createSale(0, product1, nil) -// ts.createSale(0, product2, nil) - -// params := map[string]any{ -// "Product": map[string]any{ -// "int": 1, -// }, -// } -// entities, err := ts.crudSaleService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { -// product1 := ts.createProduct("", 1, 0.0, false) -// product2 := ts.createProduct("", 2, 0.0, false) - -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) - -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) - -// params := map[string]any{ -// "Seller": map[string]any{ -// "name": "franco", -// }, -// } -// entities, err := ts.crudSaleService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { -// boss1 := &Employee{ -// Name: "Xavier", -// } -// boss2 := &Employee{ -// Name: "Vincent", -// } - -// match := ts.createEmployee("franco", boss1) -// ts.createEmployee("pierre", boss2) - -// params := map[string]any{ -// "Boss": map[string]any{ -// "name": "Xavier", -// }, -// } -// entities, err := ts.crudEmployeeService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Employee{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { -// capital1 := City{ -// Name: "Buenos Aires", -// } -// capital2 := City{ -// Name: "Paris", -// } - -// ts.createCountry("Argentina", capital1) -// ts.createCountry("France", capital2) - -// params := map[string]any{ -// "Country": map[string]any{ -// "name": "Argentina", -// }, -// } -// entities, err := ts.crudCityService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*City{&capital1}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { -// capital1 := City{ -// Name: "Buenos Aires", -// } -// capital2 := City{ -// Name: "Paris", -// } - -// country1 := ts.createCountry("Argentina", capital1) -// ts.createCountry("France", capital2) - -// params := map[string]any{ -// "Capital": map[string]any{ -// "name": "Buenos Aires", -// }, -// } -// entities, err := ts.crudCountryService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Country{country1}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsReturnsErrorIfNoRelation() { -// params := map[string]any{ -// "NotExists": map[string]any{ -// "int": 1, -// }, -// } -// _, err := ts.crudSaleService.GetEntities(params) -// ts.ErrorContains(err, "Sale has not attribute named NotExists or NotExistsID") -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { -// person1 := Person{ -// Name: "franco", -// } -// person2 := Person{ -// Name: "xavier", -// } - -// match := ts.createBicycle("BMX", person1) -// ts.createBicycle("Shimano", person2) - -// params := map[string]any{ -// "Owner": map[string]any{ -// "name": "franco", -// }, -// } -// entities, err := ts.crudBicycleService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Bicycle{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { -// company1 := ts.createCompany("ditrit") -// company2 := ts.createCompany("orness") - -// match := ts.createSeller("franco", company1) -// ts.createSeller("agustin", company2) - -// params := map[string]any{ -// "Company": map[string]any{ -// "name": "ditrit", -// }, -// } -// entities, err := ts.crudSellerService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Seller{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { -// product1 := ts.createProduct("match", 1, 0.0, false) -// product2 := ts.createProduct("match", 2, 0.0, false) - -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) - -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) - -// params := map[string]any{ -// "Product": map[string]any{ -// "int": 1, -// "string": "match", -// }, -// } -// entities, err := ts.crudSaleService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { -// product1 := ts.createProduct("", 1, 0.0, false) -// product2 := ts.createProduct("", 2, 0.0, false) - -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) - -// match := ts.createSale(1, product1, seller1) -// ts.createSale(2, product2, seller2) -// ts.createSale(2, product1, seller2) - -// params := map[string]any{ -// "Product": map[string]any{ -// "int": 1, -// }, -// "code": 1, -// } -// entities, err := ts.crudSaleService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { -// product1 := ts.createProduct("", 1, 0.0, false) -// product2 := ts.createProduct("", 2, 0.0, false) - -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) - -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) -// ts.createSale(0, product1, seller2) -// ts.createSale(0, product2, seller1) - -// params := map[string]any{ -// "Product": map[string]any{ -// "int": 1, -// }, -// "Seller": map[string]any{ -// "name": "franco", -// }, -// } -// entities, err := ts.crudSaleService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { -// product1 := ts.createProduct("", 0, 0.0, false) -// product2 := ts.createProduct("", 0, 0.0, false) - -// company1 := ts.createCompany("ditrit") -// company2 := ts.createCompany("orness") - -// seller1 := ts.createSeller("franco", company1) -// seller2 := ts.createSeller("agustin", company2) - -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) - -// params := map[string]any{ -// "Seller": map[string]any{ -// "name": "franco", -// "Company": map[string]any{ -// "name": "ditrit", -// }, -// }, -// } -// entities, err := ts.crudSaleService.GetEntities(params) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*Sale{match}, entities) -// } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { + product1 := ts.createProduct("", 1, 0.0, false) + product2 := ts.createProduct("", 2, 0.0, false) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + SaleProductCondition( + ProductIntCondition(1), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { + product1 := ts.createProduct("", 1, 0.0, false) + product2 := ts.createProduct("", 2, 0.0, false) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(1, product1, seller1) + ts.createSale(2, product2, seller2) + ts.createSale(2, product1, seller2) + + entities, err := ts.crudSaleService.GetEntities( + SaleCodeCondition(1), + SaleProductCondition( + ProductIntCondition(1), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { + product1 := ts.createProduct("", 1, 0.0, false) + product2 := ts.createProduct("", 2, 0.0, false) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + SaleSellerCondition( + SellerNameCondition("franco"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { + boss1 := &Employee{ + Name: "Xavier", + } + boss2 := &Employee{ + Name: "Vincent", + } + + match := ts.createEmployee("franco", boss1) + ts.createEmployee("pierre", boss2) + + entities, err := ts.crudEmployeeService.GetEntities( + EmployeeBossCondition( + EmployeeNameCondition("Xavier"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Employee{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { + capital1 := City{ + Name: "Buenos Aires", + } + capital2 := City{ + Name: "Paris", + } + + ts.createCountry("Argentina", capital1) + ts.createCountry("France", capital2) + + entities, err := ts.crudCityService.GetEntities( + CityCountryCondition( + CountryNameCondition("Argentina"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*City{&capital1}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { + capital1 := City{ + Name: "Buenos Aires", + } + capital2 := City{ + Name: "Paris", + } + + country1 := ts.createCountry("Argentina", capital1) + ts.createCountry("France", capital2) + + entities, err := ts.crudCountryService.GetEntities( + // TODO ver porque si meto esto igual compila + // CityCountryCondition( + // CountryNameCondition("Argentina"), + // ), + CountryCapitalCondition( + CapitalNameCondition("Buenos Aires"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Country{country1}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { + person1 := Person{ + Name: "franco", + } + person2 := Person{ + Name: "xavier", + } + + match := ts.createBicycle("BMX", person1) + ts.createBicycle("Shimano", person2) + + entities, err := ts.crudBicycleService.GetEntities( + BicycleOwnerCondition( + PersonNameCondition("franco"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Bicycle{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + match := ts.createSeller("franco", company1) + ts.createSeller("agustin", company2) + + entities, err := ts.crudSellerService.GetEntities( + SellerCompanyCondition( + CompanyNameCondition("ditrit"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Seller{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { + product1 := ts.createProduct("match", 1, 0.0, false) + product2 := ts.createProduct("match", 2, 0.0, false) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + SaleProductCondition( + ProductIntCondition(1), + ProductStringCondition("match"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { + product1 := ts.createProduct("", 1, 0.0, false) + product2 := ts.createProduct("", 2, 0.0, false) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + ts.createSale(0, product1, seller2) + ts.createSale(0, product2, seller1) + + entities, err := ts.crudSaleService.GetEntities( + SaleProductCondition( + ProductIntCondition(1), + ), + SaleSellerCondition( + SellerNameCondition("franco"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { + product1 := ts.createProduct("", 0, 0.0, false) + product2 := ts.createProduct("", 0, 0.0, false) + + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + seller1 := ts.createSeller("franco", company1) + seller2 := ts.createSeller("agustin", company2) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + SaleSellerCondition( + SellerNameCondition("franco"), + SellerCompanyCondition( + CompanyNameCondition("ditrit"), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} // ------------------------- utils ------------------------- From d6b03fec310e4b9f96f2bce03c0c0dc62f54c88d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 17 May 2023 17:13:45 +0200 Subject: [PATCH 191/467] make both conditions respect condition interface --- badorm/condition.go | 43 ++++++++++++++++----------------- badorm/crudRepository.go | 21 +++------------- test_integration/crudService.go | 12 +++------ 3 files changed, 28 insertions(+), 48 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 3bc03bf1..473be439 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -9,8 +9,13 @@ import ( ) type Condition[T any] interface { - // WhereCondition[T] | JoinCondition[T, any] - ApplyTo(query *gorm.DB, tableName string) error + ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) + + // this method is necessary to get the compiler to verify + // that an object is of type Condition[T], + // since if no method receives by parameter a type T, + // any other Condition[T2] would also be considered a Condition[T]. + interfaceVerificationMethod(T) } type WhereCondition[T any] struct { @@ -18,8 +23,13 @@ type WhereCondition[T any] struct { Value any } -func (condition WhereCondition[T1]) ApplyTo(query *gorm.DB, tableName string) error { - return nil +func (condition WhereCondition[T]) interfaceVerificationMethod(t T) {} + +func (condition WhereCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { + return query.Where( + fmt.Sprintf("%s = ?", condition.Field), + condition.Value, + ), nil } type JoinCondition[T1 any, T2 any] struct { @@ -27,23 +37,12 @@ type JoinCondition[T1 any, T2 any] struct { Conditions []Condition[T2] } -func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName string) error { - // relatedObject, relationIDIsInPreviousTable, err := getRelatedObject( - // previousEntity, - // joinAttributeName, - // ) - // if err != nil { - // return err - // } - - // joinTableName, err := getTableName(query, relatedObject) - // if err != nil { - // return err - // } +func (condition JoinCondition[T1, T2]) interfaceVerificationMethod(t T1) {} +func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName string) (*gorm.DB, error) { joinTableName, err := getTableName(query, *new(T2)) if err != nil { - return err + return nil, err } tableWithSuffix := joinTableName + "_" + previousTableName @@ -87,16 +86,16 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName conditionsValues = append(conditionsValues, condition.Value) } - query.Joins(stringQuery, conditionsValues...) + query = query.Joins(stringQuery, conditionsValues...) for _, joinCondition := range joinConditions { - err := joinCondition.ApplyTo(query, tableWithSuffix) + query, err = joinCondition.ApplyTo(query, tableWithSuffix) if err != nil { - return err + return nil, err } } - return nil + return query, nil } func isIDPresentInObject[T any](relationName string) bool { diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 52534ee2..33c1b88c 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -134,17 +134,14 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions // // {"relationAttributeName": {"attributeName": expectedValue}} func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { - thisEntityConditions, joinConditions := divideConditionsByEntity(conditions) - - query := tx.Where(getWhereParams(thisEntityConditions)) - - initialTableName, err := getTableName(query, *new(T)) + initialTableName, err := getTableName(tx, *new(T)) if err != nil { return nil, err } - for _, condition := range joinConditions { - err := condition.ApplyTo(query, initialTableName) + query := tx + for _, condition := range conditions { + query, err = condition.ApplyTo(query, initialTableName) if err != nil { return nil, err } @@ -157,16 +154,6 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions return entities, err } -func getWhereParams[T any](conditions []WhereCondition[T]) map[string]any { - // TODO verificar que no se repitan - whereParams := map[string]any{} - for _, condition := range conditions { - whereParams[condition.Field] = condition.Value - } - - return whereParams -} - // Get the name of the table in "db" in which the data for "entity" is saved // returns error is table name can not be found by gorm, // probably because the type of "entity" is not registered using AddModel diff --git a/test_integration/crudService.go b/test_integration/crudService.go index b9431947..fdf9cf96 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -74,7 +74,6 @@ func SellerNameCondition(name string) badorm.WhereCondition[Seller] { } } -// TODO lo que returna aca tampoco se verifica, claramente la verificacion de interfaces genericas no anda func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { return badorm.JoinCondition[Seller, Company]{ Field: "company", @@ -111,8 +110,7 @@ func SaleProductCondition(conditions ...badorm.Condition[Product]) badorm.Condit } } -// TODO como esto no se verifica seguro que tambien pueda meter cualquier mierda -func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Condition[Seller] { +func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Condition[Sale] { return badorm.JoinCondition[Sale, Seller]{ Field: "seller", Conditions: conditions, @@ -181,7 +179,7 @@ func CountryCapitalCondition(conditions ...badorm.Condition[City]) badorm.Condit } } -func CapitalNameCondition(name string) badorm.WhereCondition[City] { +func CityNameCondition(name string) badorm.WhereCondition[City] { return badorm.WhereCondition[City]{ Field: "name", Value: name, @@ -575,12 +573,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne ts.createCountry("France", capital2) entities, err := ts.crudCountryService.GetEntities( - // TODO ver porque si meto esto igual compila - // CityCountryCondition( - // CountryNameCondition("Argentina"), - // ), CountryCapitalCondition( - CapitalNameCondition("Buenos Aires"), + CityNameCondition("Buenos Aires"), ), ) ts.Nil(err) From 65dabdacd973c5e939ccdd01918a044a64c28ea0 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 22 May 2023 10:38:55 +0200 Subject: [PATCH 192/467] function comments --- badorm/condition.go | 123 ++++++++++++++++++-------------- badorm/crudRepository.go | 12 ---- test_integration/crudService.go | 2 - 3 files changed, 68 insertions(+), 69 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 473be439..988489cd 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -9,9 +9,12 @@ import ( ) type Condition[T any] interface { + // Applies the condition to the "query" + // using the "tableName" as name for the table holding + // the data for object of type T ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) - // this method is necessary to get the compiler to verify + // This method is necessary to get the compiler to verify // that an object is of type Condition[T], // since if no method receives by parameter a type T, // any other Condition[T2] would also be considered a Condition[T]. @@ -25,13 +28,23 @@ type WhereCondition[T any] struct { func (condition WhereCondition[T]) interfaceVerificationMethod(t T) {} +// Returns a gorm Where condition that can be used +// to filter that the Field as a value of Value func (condition WhereCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { return query.Where( - fmt.Sprintf("%s = ?", condition.Field), + condition.GetSQL(tableName), condition.Value, ), nil } +func (condition WhereCondition[T]) GetSQL(tableName string) string { + return fmt.Sprintf( + "%s.%s = ?", + tableName, + condition.Field, + ) +} + type JoinCondition[T1 any, T2 any] struct { Field string Conditions []Condition[T2] @@ -39,57 +52,38 @@ type JoinCondition[T1 any, T2 any] struct { func (condition JoinCondition[T1, T2]) interfaceVerificationMethod(t T1) {} +// Applies a join between the tables of T1 and T2 +// previousTableName is the name of the table of T1 +// It also applies the nested conditions func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName string) (*gorm.DB, error) { - joinTableName, err := getTableName(query, *new(T2)) + // get the name of the table for T2 + toBeJoinedTableName, err := getTableName(query, *new(T2)) if err != nil { return nil, err } - tableWithSuffix := joinTableName + "_" + previousTableName + // add a suffix to avoid tables with the same name when joining + // the same table more than once + nextTableName := toBeJoinedTableName + "_" + previousTableName - var stringQuery string - if isIDPresentInObject[T1](condition.Field) { - stringQuery = fmt.Sprintf( - `JOIN %[1]s %[2]s ON - %[2]s.id = %[3]s.%[4]s_id - AND %[2]s.deleted_at IS NULL - `, - joinTableName, - tableWithSuffix, - previousTableName, - condition.Field, - ) - } else { - // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) - previousAttribute := reflect.TypeOf(*new(T1)).Name() - stringQuery = fmt.Sprintf( - `JOIN %[1]s %[2]s ON - %[2]s.%[4]s_id = %[3]s.id - AND %[2]s.deleted_at IS NULL - `, - joinTableName, - tableWithSuffix, - previousTableName, - previousAttribute, - ) - } + // get the sql to do the join with T2 + joinQuery := condition.getSQLJoin(toBeJoinedTableName, nextTableName, previousTableName) - thisEntityConditions, joinConditions := divideConditionsByEntity(condition.Conditions) + whereConditions, joinConditions := divideConditionsByType(condition.Conditions) + // apply WhereConditions to join in "on" clause conditionsValues := []any{} - for _, condition := range thisEntityConditions { - stringQuery += fmt.Sprintf( - `AND %[1]s.%[2]s = ? - `, - tableWithSuffix, condition.Field, - ) + for _, condition := range whereConditions { + joinQuery += "AND " + condition.GetSQL(nextTableName) conditionsValues = append(conditionsValues, condition.Value) } - query = query.Joins(stringQuery, conditionsValues...) + // add the join to the query + query = query.Joins(joinQuery, conditionsValues...) + // apply nested joins for _, joinCondition := range joinConditions { - query, err = joinCondition.ApplyTo(query, tableWithSuffix) + query, err = joinCondition.ApplyTo(query, nextTableName) if err != nil { return nil, err } @@ -98,6 +92,39 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName return query, nil } +// Returns the SQL string to do a join between T1 and T2 +// taking into account that the ID attribute necessary to do it +// can be either in T1's or T2's table. +func (condition JoinCondition[T1, T2]) getSQLJoin(toBeJoinedTableName, nextTableName, previousTableName string) string { + if isIDPresentInObject[T1](condition.Field) { + // T1 has the id attribute + return fmt.Sprintf( + `JOIN %[1]s %[2]s ON + %[2]s.id = %[3]s.%[4]s_id + AND %[2]s.deleted_at IS NULL + `, + toBeJoinedTableName, + nextTableName, + previousTableName, + condition.Field, + ) + } + // T2 has the id attribute + // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) + previousAttribute := reflect.TypeOf(*new(T1)).Name() + return fmt.Sprintf( + `JOIN %[1]s %[2]s ON + %[2]s.%[4]s_id = %[3]s.id + AND %[2]s.deleted_at IS NULL + `, + toBeJoinedTableName, + nextTableName, + previousTableName, + previousAttribute, + ) +} + +// Returns true if object T has an attribute called "relationName"ID func isIDPresentInObject[T any](relationName string) bool { entityType := getEntityType(*new(T)) _, isIDPresent := entityType.FieldByName( @@ -106,30 +133,16 @@ func isIDPresentInObject[T any](relationName string) bool { return isIDPresent } -// Given a map of "conditions" that is in {"attributeName": expectedValue} format -// and in case of join "conditions" can have the format: -// -// {"relationAttributeName": {"attributeName": expectedValue}} -// -// it divides the map in two: -// the conditions that will be applied to the current entity ({"attributeName": expectedValue} format) -// the conditions that will generate a join with another entity ({"relationAttributeName": {"attributeName": expectedValue}} format) -// -// Returns error if any expectedValue is not of a supported type -func divideConditionsByEntity[T any]( +// Divides a list of conditions by its type: WhereConditions and JoinConditions +func divideConditionsByType[T any]( conditions []Condition[T], ) (thisEntityConditions []WhereCondition[T], joinConditions []Condition[T]) { for _, condition := range conditions { switch typedCondition := condition.(type) { case WhereCondition[T]: thisEntityConditions = append(thisEntityConditions, typedCondition) - // case JoinCondition[T, any]: - // joinConditions = append(joinConditions, typedCondition) default: joinConditions = append(joinConditions, typedCondition) - // log.Println(reflect.TypeOf(typedCondition)) - // log.Println(reflect.TypeOf(any(condition))) - // log.Println(condition.(JoinCondition[T, any])) } } diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 33c1b88c..70496948 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -91,10 +91,6 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetOptionalByID(tx *gorm.DB, id ID) } // Get an object that matches "conditions" inside transaction "tx" -// "conditions" is in {"attributeName": expectedValue} format -// in case of join "conditions" can have the format: -// -// {"relationAttributeName": {"attributeName": expectedValue}} func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Condition[T]) (*T, error) { entity, err := repository.GetOptional(tx, conditions...) if err != nil { @@ -109,10 +105,6 @@ func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Cond } // Get an object or nil that matches "conditions" inside transaction "tx" -// "conditions" is in {"attributeName": expectedValue} format -// in case of join "conditions" can have the format: -// -// {"relationAttributeName": {"attributeName": expectedValue}} func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions ...Condition[T]) (*T, error) { entities, err := repository.GetMultiple(tx, conditions...) if err != nil { @@ -129,10 +121,6 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions } // Get the list of objects that match "conditions" inside transaction "tx" -// "conditions" is in {"attributeName": expectedValue} format -// in case of join "conditions" can have the format: -// -// {"relationAttributeName": {"attributeName": expectedValue}} func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { initialTableName, err := getTableName(tx, *new(T)) if err != nil { diff --git a/test_integration/crudService.go b/test_integration/crudService.go index fdf9cf96..6cde7507 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -290,8 +290,6 @@ func (ts *CRUDServiceIntTestSuite) SetupTest() { CleanDB(ts.db) } -// TODO nombres complejos, diferencia entre _ y mayusculas - // ------------------------- GetEntity -------------------------------- func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { From 5b2052ec013790b5fb528956f7f1bc111eb8aa4a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 22 May 2023 11:37:14 +0200 Subject: [PATCH 193/467] use go generate instead of make for mock generation --- Makefile | 2 +- badaas.go | 2 + mocks/badorm/Condition.go | 59 ++++++++++++++++++++++++++++++ mocks/persistence/models/Tabler.go | 39 -------------------- 4 files changed, 62 insertions(+), 40 deletions(-) create mode 100644 mocks/badorm/Condition.go delete mode 100644 mocks/persistence/models/Tabler.go diff --git a/Makefile b/Makefile index 789a7e96..55760a21 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ test_e2e: go test ./test_e2e -v test_generate_mocks: - mockery --all --keeptree + go generate .PHONY: test_unit test_integration test_e2e diff --git a/badaas.go b/badaas.go index d3287f97..34abcd92 100644 --- a/badaas.go +++ b/badaas.go @@ -1,5 +1,7 @@ package badaas +//go:generate mockery --all --keeptree + import ( "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/logger" diff --git a/mocks/badorm/Condition.go b/mocks/badorm/Condition.go new file mode 100644 index 00000000..2d214a05 --- /dev/null +++ b/mocks/badorm/Condition.go @@ -0,0 +1,59 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + mock "github.com/stretchr/testify/mock" + gorm "gorm.io/gorm" +) + +// Condition is an autogenerated mock type for the Condition type +type Condition[T interface{}] struct { + mock.Mock +} + +// ApplyTo provides a mock function with given fields: query, tableName +func (_m *Condition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { + ret := _m.Called(query, tableName) + + var r0 *gorm.DB + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, string) (*gorm.DB, error)); ok { + return rf(query, tableName) + } + if rf, ok := ret.Get(0).(func(*gorm.DB, string) *gorm.DB); ok { + r0 = rf(query, tableName) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*gorm.DB) + } + } + + if rf, ok := ret.Get(1).(func(*gorm.DB, string) error); ok { + r1 = rf(query, tableName) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// interfaceVerificationMethod provides a mock function with given fields: _a0 +func (_m *Condition[T]) interfaceVerificationMethod(_a0 T) { + _m.Called(_a0) +} + +type mockConstructorTestingTNewCondition interface { + mock.TestingT + Cleanup(func()) +} + +// NewCondition creates a new instance of Condition. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewCondition[T interface{}](t mockConstructorTestingTNewCondition) *Condition[T] { + mock := &Condition[T]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/persistence/models/Tabler.go b/mocks/persistence/models/Tabler.go deleted file mode 100644 index 6a50e56e..00000000 --- a/mocks/persistence/models/Tabler.go +++ /dev/null @@ -1,39 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import mock "github.com/stretchr/testify/mock" - -// Tabler is an autogenerated mock type for the Tabler type -type Tabler struct { - mock.Mock -} - -// TableName provides a mock function with given fields: -func (_m *Tabler) TableName() string { - ret := _m.Called() - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -type mockConstructorTestingTNewTabler interface { - mock.TestingT - Cleanup(func()) -} - -// NewTabler creates a new instance of Tabler. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewTabler(t mockConstructorTestingTNewTabler) *Tabler { - mock := &Tabler{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} From 54907b79cf3fa2d42aaf3f58360989640513dc88 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 22 May 2023 17:17:29 +0200 Subject: [PATCH 194/467] automatic generation of where conditions --- controllers/crud.go | 1 + go.work.sum | 2 + test_integration/conditions.go | 4 + test_integration/conditions_bicycle_gen.go | 11 + test_integration/conditions_city_gen.go | 11 + test_integration/conditions_company_gen.go | 11 + test_integration/conditions_country_gen.go | 11 + test_integration/conditions_employee_gen.go | 11 + test_integration/conditions_person_gen.go | 11 + test_integration/conditions_product_gen.go | 29 +++ test_integration/conditions_sale_gen.go | 17 ++ test_integration/conditions_seller_gen.go | 11 + test_integration/crudService.go | 240 ------------------ test_integration/models.go | 181 +++++++++++++ tools/badctl/cmd/gen/conditions.go | 219 ++++++++++++++++ tools/badctl/cmd/{ => gen}/config/badaas.yml | 0 tools/badctl/cmd/{gen.go => gen/docker.go} | 16 +- .../badctl/cmd/{ => gen}/docker/.dockerignore | 0 .../cmd/{ => gen}/docker/api/Dockerfile | 0 .../{ => gen}/docker/api/docker-compose.yml | 0 .../docker/cockroachdb/docker-compose.yml | 0 .../docker/postgres/docker-compose.yml | 0 .../cmd/{ => gen}/docker/postgres/init.sql | 0 tools/badctl/cmd/gen/gen.go | 16 ++ tools/badctl/cmd/root.go | 6 + tools/badctl/cmd/run.go | 4 - tools/badctl/go.mod | 3 + tools/badctl/go.sum | 7 + 28 files changed, 569 insertions(+), 253 deletions(-) create mode 100644 test_integration/conditions.go create mode 100644 test_integration/conditions_bicycle_gen.go create mode 100644 test_integration/conditions_city_gen.go create mode 100644 test_integration/conditions_company_gen.go create mode 100644 test_integration/conditions_country_gen.go create mode 100644 test_integration/conditions_employee_gen.go create mode 100644 test_integration/conditions_person_gen.go create mode 100644 test_integration/conditions_product_gen.go create mode 100644 test_integration/conditions_sale_gen.go create mode 100644 test_integration/conditions_seller_gen.go create mode 100644 test_integration/models.go create mode 100644 tools/badctl/cmd/gen/conditions.go rename tools/badctl/cmd/{ => gen}/config/badaas.yml (100%) rename tools/badctl/cmd/{gen.go => gen/docker.go} (92%) rename tools/badctl/cmd/{ => gen}/docker/.dockerignore (100%) rename tools/badctl/cmd/{ => gen}/docker/api/Dockerfile (100%) rename tools/badctl/cmd/{ => gen}/docker/api/docker-compose.yml (100%) rename tools/badctl/cmd/{ => gen}/docker/cockroachdb/docker-compose.yml (100%) rename tools/badctl/cmd/{ => gen}/docker/postgres/docker-compose.yml (100%) rename tools/badctl/cmd/{ => gen}/docker/postgres/init.sql (100%) create mode 100644 tools/badctl/cmd/gen/gen.go diff --git a/controllers/crud.go b/controllers/crud.go index ea055ca4..76a06800 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -63,6 +63,7 @@ func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *htt // The handler responsible of the retrieval of multiple objects func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + // TODO // params, herr := decodeJSONOptional(r) // if herr != nil { // return nil, herr diff --git a/go.work.sum b/go.work.sum index ea9222b5..4914804d 100644 --- a/go.work.sum +++ b/go.work.sum @@ -308,6 +308,7 @@ golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -408,6 +409,7 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= diff --git a/test_integration/conditions.go b/test_integration/conditions.go new file mode 100644 index 00000000..21864bd1 --- /dev/null +++ b/test_integration/conditions.go @@ -0,0 +1,4 @@ +package integrationtests + +// TODO sacar el local +//go:generate ../tools/badctl/badctl gen conditions . diff --git a/test_integration/conditions_bicycle_gen.go b/test_integration/conditions_bicycle_gen.go new file mode 100644 index 00000000..1a7b1ab5 --- /dev/null +++ b/test_integration/conditions_bicycle_gen.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package integrationtests + +import badorm "github.com/ditrit/badaas/badorm" + +func BicycleNameCondition(v string) badorm.WhereCondition[Bicycle] { + return badorm.WhereCondition[Bicycle]{ + Field: "name", + Value: v, + } +} diff --git a/test_integration/conditions_city_gen.go b/test_integration/conditions_city_gen.go new file mode 100644 index 00000000..bf6e3219 --- /dev/null +++ b/test_integration/conditions_city_gen.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package integrationtests + +import badorm "github.com/ditrit/badaas/badorm" + +func CityNameCondition(v string) badorm.WhereCondition[City] { + return badorm.WhereCondition[City]{ + Field: "name", + Value: v, + } +} diff --git a/test_integration/conditions_company_gen.go b/test_integration/conditions_company_gen.go new file mode 100644 index 00000000..11835092 --- /dev/null +++ b/test_integration/conditions_company_gen.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package integrationtests + +import badorm "github.com/ditrit/badaas/badorm" + +func CompanyNameCondition(v string) badorm.WhereCondition[Company] { + return badorm.WhereCondition[Company]{ + Field: "name", + Value: v, + } +} diff --git a/test_integration/conditions_country_gen.go b/test_integration/conditions_country_gen.go new file mode 100644 index 00000000..967830b7 --- /dev/null +++ b/test_integration/conditions_country_gen.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package integrationtests + +import badorm "github.com/ditrit/badaas/badorm" + +func CountryNameCondition(v string) badorm.WhereCondition[Country] { + return badorm.WhereCondition[Country]{ + Field: "name", + Value: v, + } +} diff --git a/test_integration/conditions_employee_gen.go b/test_integration/conditions_employee_gen.go new file mode 100644 index 00000000..807d45d0 --- /dev/null +++ b/test_integration/conditions_employee_gen.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package integrationtests + +import badorm "github.com/ditrit/badaas/badorm" + +func EmployeeNameCondition(v string) badorm.WhereCondition[Employee] { + return badorm.WhereCondition[Employee]{ + Field: "name", + Value: v, + } +} diff --git a/test_integration/conditions_person_gen.go b/test_integration/conditions_person_gen.go new file mode 100644 index 00000000..7bc1a036 --- /dev/null +++ b/test_integration/conditions_person_gen.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package integrationtests + +import badorm "github.com/ditrit/badaas/badorm" + +func PersonNameCondition(v string) badorm.WhereCondition[Person] { + return badorm.WhereCondition[Person]{ + Field: "name", + Value: v, + } +} diff --git a/test_integration/conditions_product_gen.go b/test_integration/conditions_product_gen.go new file mode 100644 index 00000000..8c945c42 --- /dev/null +++ b/test_integration/conditions_product_gen.go @@ -0,0 +1,29 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package integrationtests + +import badorm "github.com/ditrit/badaas/badorm" + +func ProductStringCondition(v string) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "string", + Value: v, + } +} +func ProductIntCondition(v int) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "int", + Value: v, + } +} +func ProductFloatCondition(v float64) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "float", + Value: v, + } +} +func ProductBoolCondition(v bool) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "bool", + Value: v, + } +} diff --git a/test_integration/conditions_sale_gen.go b/test_integration/conditions_sale_gen.go new file mode 100644 index 00000000..06da2179 --- /dev/null +++ b/test_integration/conditions_sale_gen.go @@ -0,0 +1,17 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package integrationtests + +import badorm "github.com/ditrit/badaas/badorm" + +func SaleCodeCondition(v int) badorm.WhereCondition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "code", + Value: v, + } +} +func SaleDescriptionCondition(v string) badorm.WhereCondition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "description", + Value: v, + } +} diff --git a/test_integration/conditions_seller_gen.go b/test_integration/conditions_seller_gen.go new file mode 100644 index 00000000..5c95b260 --- /dev/null +++ b/test_integration/conditions_seller_gen.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package integrationtests + +import badorm "github.com/ditrit/badaas/badorm" + +func SellerNameCondition(v string) badorm.WhereCondition[Seller] { + return badorm.WhereCondition[Seller]{ + Field: "name", + Value: v, + } +} diff --git a/test_integration/crudService.go b/test_integration/crudService.go index 6cde7507..835672b5 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -9,246 +9,6 @@ import ( "gotest.tools/assert" ) -type Company struct { - badorm.UUIDModel - - Name string - Sellers []Seller // Company HasMany Sellers (Company 1 -> 0..* Seller) -} - -func CompanyNameCondition(name string) badorm.WhereCondition[Company] { - return badorm.WhereCondition[Company]{ - Field: "name", - Value: name, - } -} - -type Product struct { - badorm.UUIDModel - - String string - Int int - Float float64 - Bool bool -} - -func ProductIntCondition(intV int) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "int", - Value: intV, - } -} - -func ProductStringCondition(stringV string) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "string", - Value: stringV, - } -} - -func ProductFloatCondition(floatV float64) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "float", - Value: floatV, - } -} - -func ProductBoolCondition(boolV bool) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "bool", - Value: boolV, - } -} - -type Seller struct { - badorm.UUIDModel - - Name string - CompanyID *uuid.UUID // Company HasMany Sellers (Company 1 -> 0..* Seller) -} - -func SellerNameCondition(name string) badorm.WhereCondition[Seller] { - return badorm.WhereCondition[Seller]{ - Field: "name", - Value: name, - } -} - -func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { - return badorm.JoinCondition[Seller, Company]{ - Field: "company", - Conditions: conditions, - } -} - -type Sale struct { - badorm.UUIDModel - - Code int - Description string - - // Sale belongsTo Product (Sale 0..* -> 1 Product) - Product Product - ProductID uuid.UUID - - // Sale HasOne Seller (Sale 0..* -> 0..1 Seller) - Seller *Seller - SellerID *uuid.UUID -} - -func SaleProductIDCondition(id uuid.UUID) badorm.Condition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "product_id", - Value: id.String(), - } -} - -func SaleProductCondition(conditions ...badorm.Condition[Product]) badorm.Condition[Sale] { - return badorm.JoinCondition[Sale, Product]{ - Field: "product", - Conditions: conditions, - } -} - -func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Condition[Sale] { - return badorm.JoinCondition[Sale, Seller]{ - Field: "seller", - Conditions: conditions, - } -} - -func SaleCodeCondition(code int) badorm.WhereCondition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "code", - Value: code, - } -} - -func (m Product) Equal(other Product) bool { - return m.ID == other.ID -} - -func (m Sale) Equal(other Sale) bool { - return m.ID == other.ID -} - -func (m Seller) Equal(other Seller) bool { - return m.Name == other.Name -} - -type Country struct { - badorm.UUIDModel - - Name string - Capital City // Country HasOne City (Country 1 -> 1 City) -} - -type City struct { - badorm.UUIDModel - - Name string - CountryID uuid.UUID // Country HasOne City (Country 1 -> 1 City) -} - -func (m Country) Equal(other Country) bool { - return m.Name == other.Name -} - -func (m City) Equal(other City) bool { - return m.Name == other.Name -} - -func CityCountryCondition(conditions ...badorm.Condition[Country]) badorm.Condition[City] { - return badorm.JoinCondition[City, Country]{ - Field: "country", - Conditions: conditions, - } -} - -func CountryNameCondition(name string) badorm.WhereCondition[Country] { - return badorm.WhereCondition[Country]{ - Field: "name", - Value: name, - } -} - -func CountryCapitalCondition(conditions ...badorm.Condition[City]) badorm.Condition[Country] { - return badorm.JoinCondition[Country, City]{ - Field: "capital", - Conditions: conditions, - } -} - -func CityNameCondition(name string) badorm.WhereCondition[City] { - return badorm.WhereCondition[City]{ - Field: "name", - Value: name, - } -} - -type Employee struct { - badorm.UUIDModel - - Name string - Boss *Employee // Self-Referential Has One (Employee 0..* -> 0..1 Employee) - BossID *uuid.UUID -} - -func EmployeeBossCondition(conditions ...badorm.Condition[Employee]) badorm.Condition[Employee] { - return badorm.JoinCondition[Employee, Employee]{ - Field: "boss", - Conditions: conditions, - } -} - -func EmployeeNameCondition(name string) badorm.WhereCondition[Employee] { - return badorm.WhereCondition[Employee]{ - Field: "name", - Value: name, - } -} - -func (m Employee) Equal(other Employee) bool { - return m.Name == other.Name -} - -type Person struct { - badorm.UUIDModel - - Name string -} - -func (m Person) TableName() string { - return "persons_and_more_name" -} - -type Bicycle struct { - badorm.UUIDModel - - Name string - // Bicycle BelongsTo Person (Bicycle 0..* -> 1 Person) - Owner Person - OwnerID uuid.UUID -} - -func BicycleOwnerCondition(conditions ...badorm.Condition[Person]) badorm.Condition[Bicycle] { - return badorm.JoinCondition[Bicycle, Person]{ - Field: "owner", - Conditions: conditions, - } -} - -func PersonNameCondition(name string) badorm.WhereCondition[Person] { - return badorm.WhereCondition[Person]{ - Field: "name", - Value: name, - } -} - -func (m Bicycle) Equal(other Bicycle) bool { - return m.Name == other.Name -} - type CRUDServiceIntTestSuite struct { suite.Suite logger *zap.Logger diff --git a/test_integration/models.go b/test_integration/models.go new file mode 100644 index 00000000..ab36cfaf --- /dev/null +++ b/test_integration/models.go @@ -0,0 +1,181 @@ +package integrationtests + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/google/uuid" +) + +// TODO gorm +// column +// embedded +// embeddedPrefix +// todas las clases tienen sus conditions, repository and service menos las que esten embeded en otras +// aunque tambien podria ser que: +// haya embeded que tambien tengan su propia tabla +// haya cosas en el modelo que no van a terminar en una tabla, que son solo clases para llamar a metodos y eso + +// podria meter alguna anotacion para que esa si vaya a modelos? +// directamente las clases que tienen un base model metido adentro son las que quiero + +type Company struct { + badorm.UUIDModel + + Name string + Sellers []Seller // Company HasMany Sellers (Company 1 -> 0..* Seller) +} + +type Product struct { + badorm.UUIDModel + + String string + Int int + Float float64 + Bool bool +} + +type Seller struct { + badorm.UUIDModel + + Name string + CompanyID *uuid.UUID // Company HasMany Sellers (Company 1 -> 0..* Seller) +} + +func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { + return badorm.JoinCondition[Seller, Company]{ + Field: "company", + Conditions: conditions, + } +} + +type Sale struct { + badorm.UUIDModel + + Code int + Description string + + // Sale belongsTo Product (Sale 0..* -> 1 Product) + Product Product + ProductID uuid.UUID + + // Sale HasOne Seller (Sale 0..* -> 0..1 Seller) + Seller *Seller + SellerID *uuid.UUID +} + +func SaleProductIDCondition(id uuid.UUID) badorm.Condition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "product_id", + Value: id.String(), + } +} + +func SaleProductCondition(conditions ...badorm.Condition[Product]) badorm.Condition[Sale] { + return badorm.JoinCondition[Sale, Product]{ + Field: "product", + Conditions: conditions, + } +} + +func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Condition[Sale] { + return badorm.JoinCondition[Sale, Seller]{ + Field: "seller", + Conditions: conditions, + } +} + +func (m Product) Equal(other Product) bool { + return m.ID == other.ID +} + +func (m Sale) Equal(other Sale) bool { + return m.ID == other.ID +} + +func (m Seller) Equal(other Seller) bool { + return m.Name == other.Name +} + +type Country struct { + badorm.UUIDModel + + Name string + Capital City // Country HasOne City (Country 1 -> 1 City) +} + +type City struct { + badorm.UUIDModel + + Name string + CountryID uuid.UUID // Country HasOne City (Country 1 -> 1 City) +} + +func (m Country) Equal(other Country) bool { + return m.Name == other.Name +} + +func (m City) Equal(other City) bool { + return m.Name == other.Name +} + +func CityCountryCondition(conditions ...badorm.Condition[Country]) badorm.Condition[City] { + return badorm.JoinCondition[City, Country]{ + Field: "country", + Conditions: conditions, + } +} + +func CountryCapitalCondition(conditions ...badorm.Condition[City]) badorm.Condition[Country] { + return badorm.JoinCondition[Country, City]{ + Field: "capital", + Conditions: conditions, + } +} + +type Employee struct { + badorm.UUIDModel + + Name string + Boss *Employee // Self-Referential Has One (Employee 0..* -> 0..1 Employee) + BossID *uuid.UUID +} + +func EmployeeBossCondition(conditions ...badorm.Condition[Employee]) badorm.Condition[Employee] { + return badorm.JoinCondition[Employee, Employee]{ + Field: "boss", + Conditions: conditions, + } +} + +func (m Employee) Equal(other Employee) bool { + return m.Name == other.Name +} + +type Person struct { + badorm.UUIDModel + + Name string +} + +func (m Person) TableName() string { + return "persons_and_more_name" +} + +type Bicycle struct { + badorm.UUIDModel + + Name string + // Bicycle BelongsTo Person (Bicycle 0..* -> 1 Person) + Owner Person + OwnerID uuid.UUID +} + +func BicycleOwnerCondition(conditions ...badorm.Condition[Person]) badorm.Condition[Bicycle] { + return badorm.JoinCondition[Bicycle, Person]{ + Field: "owner", + Conditions: conditions, + } +} + +func (m Bicycle) Equal(other Bicycle) bool { + return m.Name == other.Name +} diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go new file mode 100644 index 00000000..db98e11d --- /dev/null +++ b/tools/badctl/cmd/gen/conditions.go @@ -0,0 +1,219 @@ +package gen + +import ( + "errors" + "fmt" + "go/types" + "log" + "os" + "path/filepath" + "strings" + + "github.com/dave/jennifer/jen" + "github.com/ditrit/verdeter" + "github.com/elliotchance/pie/v2" + "github.com/ettle/strcase" + "github.com/spf13/cobra" + + "golang.org/x/tools/go/packages" +) + +var genConditionsCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "conditions", + Short: "Generate conditions to query your objects using BaDORM", + Long: `gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way.`, + Run: generateConditions, + Args: cobra.MinimumNArgs(1), +}) + +// badorm/baseModels.go +var badORMModels = []string{"UUIDModel", "UIntModel"} + +func generateConditions(cmd *cobra.Command, args []string) { + log.Println(args) + + // Inspect package and use type checker to infer imported types + pkgs := loadPackages(args) + + for _, pkg := range pkgs { + log.Println(pkg.Types.Path()) + log.Println(pkg.Types.Name()) + + for _, name := range pkg.Types.Scope().Names() { + structType := getStructType(pkg, name) + if structType != nil && isBadORMModel(structType) { + log.Println(name) + + // Generate code using jennifer + err := generate(name, structType) + if err != nil { + failErr(err) + } + } + } + } +} + +func getStructType(pkg *packages.Package, name string) *types.Struct { + obj := pkg.Types.Scope().Lookup(name) + if obj == nil { + failErr(fmt.Errorf("%s not found in declared types of %s", + name, pkg)) + } + + // Generate only if it is a declared type + if _, ok := obj.(*types.TypeName); !ok { + return nil + } + // Generate only when underlying type is a struct + // (ignore const, var, func, etc.) + structType, ok := obj.Type().Underlying().(*types.Struct) + if !ok { + return nil + } + + return structType +} + +func isBadORMModel(structType *types.Struct) bool { + for i := 0; i < structType.NumFields(); i++ { + field := structType.Field(i) + + // TODO quizas se puede hacer con el type en lugar del nombre + if field.Embedded() && pie.Contains(badORMModels, field.Name()) { + return true + } + } + + return false +} + +func generate(structTypeName string, structType *types.Struct) error { + // Get the package of the file with go:generate comment + goPackage := os.Getenv("GOPACKAGE") + if goPackage == "" { + failErr(errors.New("this command should be called using go generate")) + } + + // Start a new file in this package + f := jen.NewFile(goPackage) + + // Add a package comment, so IDEs detect files as generated + // TODO version configurable + f.PackageComment("Code generated by badctl v0.0.0, DO NOT EDIT.") + + // Iterate over struct fields + for i := 0; i < structType.NumFields(); i++ { + field := structType.Field(i) + // TODO tagValue := structType.Tag(i) + + log.Println(field.Name()) + generateConditionForField(f, structTypeName, field.Name(), field.Type()) + } + + // Build the target file name + goFile := os.Getenv("GOFILE") + ext := filepath.Ext(goFile) + baseFilename := goFile[0 : len(goFile)-len(ext)] + targetFilename := baseFilename + "_" + strings.ToLower(structTypeName) + "_gen.go" + + // Write generated file + return f.Save(targetFilename) +} + +func generateConditionForField(f *jen.File, structName, fieldName string, fieldType types.Type) error { + switch v := fieldType.(type) { + case *types.Basic: + generateWhereCondition( + f, structName, fieldName, + typeKindToJenStatement[v.Kind()], + ) + case *types.Named: + // typeName := v.Obj() + log.Println("named") + log.Println(v.String()) + // log.Println(typeName.String()) + // Qual automatically imports packages + // code.Op("*").Qual( + // typeName.Pkg().Path(), + // typeName.Name(), + // ) + case *types.Pointer: + log.Println("pointer") + if v.String() == "*github.com/google/uuid.UUID" { + log.Println(v.String()) + } else { + generateConditionForField(f, structName, fieldName, v.Elem()) + } + // case *types.Slice: + // log.Printf("slices not supported yet: %s.%s", structTypeName, field.Name()) + default: + log.Printf("struct field type not hanled: %T", v) + } + + return nil +} + +var param = jen.Id("v") + +var typeKindToJenStatement = map[types.BasicKind]*jen.Statement{ + types.Bool: param.Clone().Bool(), + types.Int: param.Clone().Int(), + types.Int8: param.Clone().Int8(), + types.Int16: param.Clone().Int16(), + types.Int32: param.Clone().Int32(), + types.Int64: param.Clone().Int64(), + types.Uint: param.Clone().Uint(), + types.Uint8: param.Clone().Uint8(), + types.Uint16: param.Clone().Uint16(), + types.Uint32: param.Clone().Uint32(), + types.Uint64: param.Clone().Uint64(), + types.Uintptr: param.Clone().Uintptr(), + types.Float32: param.Clone().Float32(), + types.Float64: param.Clone().Float64(), + types.Complex64: param.Clone().Complex64(), + types.Complex128: param.Clone().Complex128(), + types.String: param.Clone().String(), +} + +func generateWhereCondition(f *jen.File, structName, fieldName string, param *jen.Statement) { + whereCondition := jen.Qual( + // TODO deberia tener el paquete pero solo si es el destino es un paquete distinto + "github.com/ditrit/badaas/badorm", "WhereCondition["+strcase.ToPascal(structName)+"]", + ) + f.Func().Id( + strcase.ToPascal(structName) + strcase.ToPascal(fieldName) + "Condition", + ).Params( + param, + ).Add( + whereCondition.Clone(), + ).Block( + jen.Return( + whereCondition.Clone().Values(jen.Dict{ + // TODO gorm column redefinition + jen.Id("Field"): jen.Lit(strcase.ToSnake(fieldName)), + jen.Id("Value"): jen.Id("v"), + }), + ), + ) +} + +func loadPackages(paths []string) []*packages.Package { + cfg := &packages.Config{Mode: packages.NeedTypes} + pkgs, err := packages.Load(cfg, paths...) + if err != nil { + failErr(fmt.Errorf("loading packages for inspection: %v", err)) + } + if packages.PrintErrors(pkgs) > 0 { + os.Exit(1) + } + + return pkgs +} + +func failErr(err error) { + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v\n", err) + os.Exit(1) + } +} diff --git a/tools/badctl/cmd/config/badaas.yml b/tools/badctl/cmd/gen/config/badaas.yml similarity index 100% rename from tools/badctl/cmd/config/badaas.yml rename to tools/badctl/cmd/gen/config/badaas.yml diff --git a/tools/badctl/cmd/gen.go b/tools/badctl/cmd/gen/docker.go similarity index 92% rename from tools/badctl/cmd/gen.go rename to tools/badctl/cmd/gen/docker.go index 3417b7d9..aab54973 100644 --- a/tools/badctl/cmd/gen.go +++ b/tools/badctl/cmd/gen/docker.go @@ -1,4 +1,4 @@ -package cmd +package gen import ( "embed" @@ -18,9 +18,9 @@ import ( //go:embed config/* var embedFS embed.FS -var genCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ - Use: "gen", - Short: "Generate files and configurations necessary to use BadAss", +var genDockerCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "docker", + Short: "Generate files and configurations necessary to use BadAss over Docker", Long: `gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way.`, Run: generateDockerFiles, }) @@ -41,9 +41,7 @@ var DBPorts = map[string]int{ } func init() { - rootCmd.AddSubCommand(genCmd) - - err := genCmd.LKey( + err := genDockerCmd.LKey( DBProviderKey, verdeter.IsStr, "p", fmt.Sprintf( "Database provider (%s), default: %s", @@ -54,8 +52,8 @@ func init() { if err != nil { panic(err) } - genCmd.SetDefault(DBProviderKey, Cockroachdb) - genCmd.AddValidator( + genDockerCmd.SetDefault(DBProviderKey, Cockroachdb) + genDockerCmd.AddValidator( DBProviderKey, validators.AuthorizedValues(DBProviders...), ) diff --git a/tools/badctl/cmd/docker/.dockerignore b/tools/badctl/cmd/gen/docker/.dockerignore similarity index 100% rename from tools/badctl/cmd/docker/.dockerignore rename to tools/badctl/cmd/gen/docker/.dockerignore diff --git a/tools/badctl/cmd/docker/api/Dockerfile b/tools/badctl/cmd/gen/docker/api/Dockerfile similarity index 100% rename from tools/badctl/cmd/docker/api/Dockerfile rename to tools/badctl/cmd/gen/docker/api/Dockerfile diff --git a/tools/badctl/cmd/docker/api/docker-compose.yml b/tools/badctl/cmd/gen/docker/api/docker-compose.yml similarity index 100% rename from tools/badctl/cmd/docker/api/docker-compose.yml rename to tools/badctl/cmd/gen/docker/api/docker-compose.yml diff --git a/tools/badctl/cmd/docker/cockroachdb/docker-compose.yml b/tools/badctl/cmd/gen/docker/cockroachdb/docker-compose.yml similarity index 100% rename from tools/badctl/cmd/docker/cockroachdb/docker-compose.yml rename to tools/badctl/cmd/gen/docker/cockroachdb/docker-compose.yml diff --git a/tools/badctl/cmd/docker/postgres/docker-compose.yml b/tools/badctl/cmd/gen/docker/postgres/docker-compose.yml similarity index 100% rename from tools/badctl/cmd/docker/postgres/docker-compose.yml rename to tools/badctl/cmd/gen/docker/postgres/docker-compose.yml diff --git a/tools/badctl/cmd/docker/postgres/init.sql b/tools/badctl/cmd/gen/docker/postgres/init.sql similarity index 100% rename from tools/badctl/cmd/docker/postgres/init.sql rename to tools/badctl/cmd/gen/docker/postgres/init.sql diff --git a/tools/badctl/cmd/gen/gen.go b/tools/badctl/cmd/gen/gen.go new file mode 100644 index 00000000..d1644a6e --- /dev/null +++ b/tools/badctl/cmd/gen/gen.go @@ -0,0 +1,16 @@ +package gen + +import ( + "github.com/ditrit/verdeter" +) + +var GenCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "gen", + Short: "Files and configurations generator", + Long: `gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way.`, +}) + +func init() { + GenCmd.AddSubCommand(genDockerCmd) + GenCmd.AddSubCommand(genConditionsCmd) +} diff --git a/tools/badctl/cmd/root.go b/tools/badctl/cmd/root.go index ebaaf720..7ff26e65 100644 --- a/tools/badctl/cmd/root.go +++ b/tools/badctl/cmd/root.go @@ -1,6 +1,7 @@ package cmd import ( + "github.com/ditrit/badaas/tools/badctl/cmd/gen" "github.com/ditrit/verdeter" ) @@ -16,3 +17,8 @@ var rootCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ func Execute() { rootCmd.Execute() } + +func init() { + rootCmd.AddSubCommand(runCmd) + rootCmd.AddSubCommand(gen.GenCmd) +} diff --git a/tools/badctl/cmd/run.go b/tools/badctl/cmd/run.go index 8107cece..8709b464 100644 --- a/tools/badctl/cmd/run.go +++ b/tools/badctl/cmd/run.go @@ -16,10 +16,6 @@ var runCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Run: runApp, }) -func init() { - rootCmd.AddSubCommand(runCmd) -} - func runApp(cmd *cobra.Command, args []string) { dockerCommand := exec.Command( "docker", "compose", diff --git a/tools/badctl/go.mod b/tools/badctl/go.mod index 55260d3d..6820a995 100644 --- a/tools/badctl/go.mod +++ b/tools/badctl/go.mod @@ -3,9 +3,11 @@ module github.com/ditrit/badaas/tools/badctl go 1.18 require ( + github.com/dave/jennifer v1.6.1 github.com/ditrit/verdeter v0.4.0 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 + golang.org/x/tools v0.6.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -22,6 +24,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect + golang.org/x/mod v0.8.0 // indirect golang.org/x/sys v0.7.0 // indirect golang.org/x/text v0.9.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/tools/badctl/go.sum b/tools/badctl/go.sum index 99e12ce2..79c949bc 100644 --- a/tools/badctl/go.sum +++ b/tools/badctl/go.sum @@ -47,6 +47,8 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/dave/jennifer v1.6.1 h1:T4T/67t6RAA5AIV6+NP8Uk/BIsXgDoqEowgycdQQLuk= +github.com/dave/jennifer v1.6.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -227,6 +229,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -278,6 +282,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -377,6 +382,8 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 3898005101f9b30683c9dfbe6bf44a9ec2498802 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 23 May 2023 10:45:50 +0200 Subject: [PATCH 195/467] generate join conditions + rename package --- test_e2e/badaas_e2e_test.go | 6 +- test_e2e/http_support_test.go | 6 +- test_e2e/test_api.go | 12 ++-- test_integration/conditions_sale_gen.go | 17 ----- .../asserts.go | 2 +- .../conditions.go | 2 +- .../conditions_bicycle_gen.go | 8 ++- .../conditions_city_gen.go | 2 +- .../conditions_company_gen.go | 2 +- .../conditions_country_gen.go | 8 ++- .../conditions_employee_gen.go | 8 ++- .../conditions_person_gen.go | 2 +- .../conditions_product_gen.go | 2 +- testintegration/conditions_sale_gen.go | 29 ++++++++ .../conditions_seller_gen.go | 2 +- .../crudRepository.go | 2 +- .../crudService.go | 2 +- .../db_models.go | 2 +- .../eavService.go | 2 +- .../int_test_config.yml | 0 .../integration_test.go | 2 +- .../models.go | 47 ++----------- tools/badctl/cmd/gen/conditions.go | 67 +++++++++++++++---- tools/badctl/go.mod | 3 + tools/badctl/go.sum | 6 ++ 25 files changed, 144 insertions(+), 97 deletions(-) delete mode 100644 test_integration/conditions_sale_gen.go rename {test_integration => testintegration}/asserts.go (98%) rename {test_integration => testintegration}/conditions.go (75%) rename {test_integration => testintegration}/conditions_bicycle_gen.go (52%) rename {test_integration => testintegration}/conditions_city_gen.go (90%) rename {test_integration => testintegration}/conditions_company_gen.go (90%) rename {test_integration => testintegration}/conditions_country_gen.go (52%) rename {test_integration => testintegration}/conditions_employee_gen.go (52%) rename {test_integration => testintegration}/conditions_person_gen.go (90%) rename {test_integration => testintegration}/conditions_product_gen.go (96%) create mode 100644 testintegration/conditions_sale_gen.go rename {test_integration => testintegration}/conditions_seller_gen.go (90%) rename {test_integration => testintegration}/crudRepository.go (99%) rename {test_integration => testintegration}/crudService.go (99%) rename {test_integration => testintegration}/db_models.go (97%) rename {test_integration => testintegration}/eavService.go (99%) rename {test_integration => testintegration}/int_test_config.yml (100%) rename {test_integration => testintegration}/integration_test.go (98%) rename {test_integration => testintegration}/models.go (70%) diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index 968c2f51..f63b87bc 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -15,7 +15,7 @@ import ( "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/services/auth/protocols/basicauth" - integrationtests "github.com/ditrit/badaas/test_integration" + "github.com/ditrit/badaas/testintegration" "github.com/elliotchance/pie/v2" "github.com/spf13/pflag" "github.com/spf13/viper" @@ -167,8 +167,8 @@ func InitializeScenario(ctx *godog.ScenarioContext) { } func CleanDB(db *gorm.DB) { - integrationtests.CleanDBTables(db, append( - pie.Reverse(integrationtests.ListOfTables), + testintegration.CleanDBTables(db, append( + pie.Reverse(testintegration.ListOfTables), []any{ models.Session{}, models.User{}, diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 07640d6c..9a4553fd 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -11,7 +11,7 @@ import ( "github.com/cucumber/godog" "github.com/cucumber/messages-go/v16" - integrationtests "github.com/ditrit/badaas/test_integration" + "github.com/ditrit/badaas/testintegration" "github.com/elliotchance/pie/v2" ) @@ -394,11 +394,11 @@ func (t *TestContext) modifyWithAttributes(entityType string, jsonTable *godog.T } func (t *TestContext) saleExists(productInt int, code int, description string) { - product := &integrationtests.Product{ + product := &testintegration.Product{ Int: productInt, } - sale := &integrationtests.Sale{ + sale := &testintegration.Sale{ Code: code, Description: description, Product: *product, diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index 0f4ca5b4..69eace6a 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -10,7 +10,7 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/router" - integrationtests "github.com/ditrit/badaas/test_integration" + "github.com/ditrit/badaas/testintegration" "github.com/ditrit/verdeter" "github.com/gorilla/handlers" "github.com/gorilla/mux" @@ -39,7 +39,7 @@ func main() { // Run the http server for badaas func runHTTPServer(cmd *cobra.Command, args []string) { fx.New( - fx.Provide(integrationtests.GetModels), + fx.Provide(testintegration.GetModels), badaas.BadaasModule, // logger for fx @@ -53,10 +53,10 @@ func runHTTPServer(cmd *cobra.Command, args []string) { router.AuthRoutesModule, router.EAVRoutesModule, - fx.Invoke(badorm.AddModel[integrationtests.Company]), - fx.Invoke(badorm.AddModel[integrationtests.Seller]), - fx.Invoke(badorm.AddModel[integrationtests.Product]), - router.GetCRUDRoutesModule[integrationtests.Sale](), + fx.Invoke(badorm.AddModel[testintegration.Company]), + fx.Invoke(badorm.AddModel[testintegration.Seller]), + fx.Invoke(badorm.AddModel[testintegration.Product]), + router.GetCRUDRoutesModule[testintegration.Sale](), // create httpServer fx.Provide(NewHTTPServer), diff --git a/test_integration/conditions_sale_gen.go b/test_integration/conditions_sale_gen.go deleted file mode 100644 index 06da2179..00000000 --- a/test_integration/conditions_sale_gen.go +++ /dev/null @@ -1,17 +0,0 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. -package integrationtests - -import badorm "github.com/ditrit/badaas/badorm" - -func SaleCodeCondition(v int) badorm.WhereCondition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "code", - Value: v, - } -} -func SaleDescriptionCondition(v string) badorm.WhereCondition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "description", - Value: v, - } -} diff --git a/test_integration/asserts.go b/testintegration/asserts.go similarity index 98% rename from test_integration/asserts.go rename to testintegration/asserts.go index 9fe5d015..8df7d14b 100644 --- a/test_integration/asserts.go +++ b/testintegration/asserts.go @@ -1,4 +1,4 @@ -package integrationtests +package testintegration import ( "log" diff --git a/test_integration/conditions.go b/testintegration/conditions.go similarity index 75% rename from test_integration/conditions.go rename to testintegration/conditions.go index 21864bd1..b1bf0da5 100644 --- a/test_integration/conditions.go +++ b/testintegration/conditions.go @@ -1,4 +1,4 @@ -package integrationtests +package testintegration // TODO sacar el local //go:generate ../tools/badctl/badctl gen conditions . diff --git a/test_integration/conditions_bicycle_gen.go b/testintegration/conditions_bicycle_gen.go similarity index 52% rename from test_integration/conditions_bicycle_gen.go rename to testintegration/conditions_bicycle_gen.go index 1a7b1ab5..1a8bf5ae 100644 --- a/test_integration/conditions_bicycle_gen.go +++ b/testintegration/conditions_bicycle_gen.go @@ -1,5 +1,5 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. -package integrationtests +package testintegration import badorm "github.com/ditrit/badaas/badorm" @@ -9,3 +9,9 @@ func BicycleNameCondition(v string) badorm.WhereCondition[Bicycle] { Value: v, } } +func BicycleOwnerCondition(conditions ...badorm.Condition[Person]) badorm.Condition[Bicycle] { + return badorm.JoinCondition[Bicycle, Person]{ + Conditions: conditions, + Field: "owner", + } +} diff --git a/test_integration/conditions_city_gen.go b/testintegration/conditions_city_gen.go similarity index 90% rename from test_integration/conditions_city_gen.go rename to testintegration/conditions_city_gen.go index bf6e3219..b1590cdf 100644 --- a/test_integration/conditions_city_gen.go +++ b/testintegration/conditions_city_gen.go @@ -1,5 +1,5 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. -package integrationtests +package testintegration import badorm "github.com/ditrit/badaas/badorm" diff --git a/test_integration/conditions_company_gen.go b/testintegration/conditions_company_gen.go similarity index 90% rename from test_integration/conditions_company_gen.go rename to testintegration/conditions_company_gen.go index 11835092..14f0ba69 100644 --- a/test_integration/conditions_company_gen.go +++ b/testintegration/conditions_company_gen.go @@ -1,5 +1,5 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. -package integrationtests +package testintegration import badorm "github.com/ditrit/badaas/badorm" diff --git a/test_integration/conditions_country_gen.go b/testintegration/conditions_country_gen.go similarity index 52% rename from test_integration/conditions_country_gen.go rename to testintegration/conditions_country_gen.go index 967830b7..fe9a4b19 100644 --- a/test_integration/conditions_country_gen.go +++ b/testintegration/conditions_country_gen.go @@ -1,5 +1,5 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. -package integrationtests +package testintegration import badorm "github.com/ditrit/badaas/badorm" @@ -9,3 +9,9 @@ func CountryNameCondition(v string) badorm.WhereCondition[Country] { Value: v, } } +func CountryCapitalCondition(conditions ...badorm.Condition[City]) badorm.Condition[Country] { + return badorm.JoinCondition[Country, City]{ + Conditions: conditions, + Field: "capital", + } +} diff --git a/test_integration/conditions_employee_gen.go b/testintegration/conditions_employee_gen.go similarity index 52% rename from test_integration/conditions_employee_gen.go rename to testintegration/conditions_employee_gen.go index 807d45d0..772463cb 100644 --- a/test_integration/conditions_employee_gen.go +++ b/testintegration/conditions_employee_gen.go @@ -1,5 +1,5 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. -package integrationtests +package testintegration import badorm "github.com/ditrit/badaas/badorm" @@ -9,3 +9,9 @@ func EmployeeNameCondition(v string) badorm.WhereCondition[Employee] { Value: v, } } +func EmployeeBossCondition(conditions ...badorm.Condition[Employee]) badorm.Condition[Employee] { + return badorm.JoinCondition[Employee, Employee]{ + Conditions: conditions, + Field: "boss", + } +} diff --git a/test_integration/conditions_person_gen.go b/testintegration/conditions_person_gen.go similarity index 90% rename from test_integration/conditions_person_gen.go rename to testintegration/conditions_person_gen.go index 7bc1a036..370cafb8 100644 --- a/test_integration/conditions_person_gen.go +++ b/testintegration/conditions_person_gen.go @@ -1,5 +1,5 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. -package integrationtests +package testintegration import badorm "github.com/ditrit/badaas/badorm" diff --git a/test_integration/conditions_product_gen.go b/testintegration/conditions_product_gen.go similarity index 96% rename from test_integration/conditions_product_gen.go rename to testintegration/conditions_product_gen.go index 8c945c42..d57b6a34 100644 --- a/test_integration/conditions_product_gen.go +++ b/testintegration/conditions_product_gen.go @@ -1,5 +1,5 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. -package integrationtests +package testintegration import badorm "github.com/ditrit/badaas/badorm" diff --git a/testintegration/conditions_sale_gen.go b/testintegration/conditions_sale_gen.go new file mode 100644 index 00000000..554144e8 --- /dev/null +++ b/testintegration/conditions_sale_gen.go @@ -0,0 +1,29 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package testintegration + +import badorm "github.com/ditrit/badaas/badorm" + +func SaleCodeCondition(v int) badorm.WhereCondition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "code", + Value: v, + } +} +func SaleDescriptionCondition(v string) badorm.WhereCondition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "description", + Value: v, + } +} +func SaleProductCondition(conditions ...badorm.Condition[Product]) badorm.Condition[Sale] { + return badorm.JoinCondition[Sale, Product]{ + Conditions: conditions, + Field: "product", + } +} +func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Condition[Sale] { + return badorm.JoinCondition[Sale, Seller]{ + Conditions: conditions, + Field: "seller", + } +} diff --git a/test_integration/conditions_seller_gen.go b/testintegration/conditions_seller_gen.go similarity index 90% rename from test_integration/conditions_seller_gen.go rename to testintegration/conditions_seller_gen.go index 5c95b260..b9eca1b4 100644 --- a/test_integration/conditions_seller_gen.go +++ b/testintegration/conditions_seller_gen.go @@ -1,5 +1,5 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. -package integrationtests +package testintegration import badorm "github.com/ditrit/badaas/badorm" diff --git a/test_integration/crudRepository.go b/testintegration/crudRepository.go similarity index 99% rename from test_integration/crudRepository.go rename to testintegration/crudRepository.go index 95b0eb31..2a3791e3 100644 --- a/test_integration/crudRepository.go +++ b/testintegration/crudRepository.go @@ -1,4 +1,4 @@ -package integrationtests +package testintegration import ( "github.com/ditrit/badaas/badorm" diff --git a/test_integration/crudService.go b/testintegration/crudService.go similarity index 99% rename from test_integration/crudService.go rename to testintegration/crudService.go index 835672b5..12cebe53 100644 --- a/test_integration/crudService.go +++ b/testintegration/crudService.go @@ -1,4 +1,4 @@ -package integrationtests +package testintegration import ( "github.com/ditrit/badaas/badorm" diff --git a/test_integration/db_models.go b/testintegration/db_models.go similarity index 97% rename from test_integration/db_models.go rename to testintegration/db_models.go index b770eed6..1743fdec 100644 --- a/test_integration/db_models.go +++ b/testintegration/db_models.go @@ -1,4 +1,4 @@ -package integrationtests +package testintegration import ( "log" diff --git a/test_integration/eavService.go b/testintegration/eavService.go similarity index 99% rename from test_integration/eavService.go rename to testintegration/eavService.go index 8d15f146..bca53f3e 100644 --- a/test_integration/eavService.go +++ b/testintegration/eavService.go @@ -1,4 +1,4 @@ -package integrationtests +package testintegration import ( "fmt" diff --git a/test_integration/int_test_config.yml b/testintegration/int_test_config.yml similarity index 100% rename from test_integration/int_test_config.yml rename to testintegration/int_test_config.yml diff --git a/test_integration/integration_test.go b/testintegration/integration_test.go similarity index 98% rename from test_integration/integration_test.go rename to testintegration/integration_test.go index 73ff4b75..f65f1ec1 100644 --- a/test_integration/integration_test.go +++ b/testintegration/integration_test.go @@ -1,4 +1,4 @@ -package integrationtests +package testintegration import ( "path" diff --git a/test_integration/models.go b/testintegration/models.go similarity index 70% rename from test_integration/models.go rename to testintegration/models.go index ab36cfaf..76278941 100644 --- a/test_integration/models.go +++ b/testintegration/models.go @@ -1,4 +1,4 @@ -package integrationtests +package testintegration import ( "github.com/ditrit/badaas/badorm" @@ -21,7 +21,7 @@ type Company struct { badorm.UUIDModel Name string - Sellers []Seller // Company HasMany Sellers (Company 1 -> 0..* Seller) + Sellers []Seller // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } type Product struct { @@ -37,14 +37,7 @@ type Seller struct { badorm.UUIDModel Name string - CompanyID *uuid.UUID // Company HasMany Sellers (Company 1 -> 0..* Seller) -} - -func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { - return badorm.JoinCondition[Seller, Company]{ - Field: "company", - Conditions: conditions, - } + CompanyID *uuid.UUID // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } type Sale struct { @@ -69,16 +62,9 @@ func SaleProductIDCondition(id uuid.UUID) badorm.Condition[Sale] { } } -func SaleProductCondition(conditions ...badorm.Condition[Product]) badorm.Condition[Sale] { - return badorm.JoinCondition[Sale, Product]{ - Field: "product", - Conditions: conditions, - } -} - -func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Condition[Sale] { - return badorm.JoinCondition[Sale, Seller]{ - Field: "seller", +func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { + return badorm.JoinCondition[Seller, Company]{ + Field: "company", Conditions: conditions, } } @@ -124,13 +110,6 @@ func CityCountryCondition(conditions ...badorm.Condition[Country]) badorm.Condit } } -func CountryCapitalCondition(conditions ...badorm.Condition[City]) badorm.Condition[Country] { - return badorm.JoinCondition[Country, City]{ - Field: "capital", - Conditions: conditions, - } -} - type Employee struct { badorm.UUIDModel @@ -139,13 +118,6 @@ type Employee struct { BossID *uuid.UUID } -func EmployeeBossCondition(conditions ...badorm.Condition[Employee]) badorm.Condition[Employee] { - return badorm.JoinCondition[Employee, Employee]{ - Field: "boss", - Conditions: conditions, - } -} - func (m Employee) Equal(other Employee) bool { return m.Name == other.Name } @@ -169,13 +141,6 @@ type Bicycle struct { OwnerID uuid.UUID } -func BicycleOwnerCondition(conditions ...badorm.Condition[Person]) badorm.Condition[Bicycle] { - return badorm.JoinCondition[Bicycle, Person]{ - Field: "owner", - Conditions: conditions, - } -} - func (m Bicycle) Equal(other Bicycle) bool { return m.Name == other.Name } diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index db98e11d..ca396753 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -129,15 +129,10 @@ func generateConditionForField(f *jen.File, structName, fieldName string, fieldT typeKindToJenStatement[v.Kind()], ) case *types.Named: - // typeName := v.Obj() - log.Println("named") - log.Println(v.String()) - // log.Println(typeName.String()) - // Qual automatically imports packages - // code.Op("*").Qual( - // typeName.Pkg().Path(), - // typeName.Name(), - // ) + // TODO aca tambien esta el github.com/ditrit/badaas/badorm.UUIDModel + generateJoinCondition( + f, structName, fieldName, v, + ) case *types.Pointer: log.Println("pointer") if v.String() == "*github.com/google/uuid.UUID" { @@ -176,11 +171,14 @@ var typeKindToJenStatement = map[types.BasicKind]*jen.Statement{ types.String: param.Clone().String(), } +const badORMPath = "github.com/ditrit/badaas/badorm" + func generateWhereCondition(f *jen.File, structName, fieldName string, param *jen.Statement) { whereCondition := jen.Qual( - // TODO deberia tener el paquete pero solo si es el destino es un paquete distinto - "github.com/ditrit/badaas/badorm", "WhereCondition["+strcase.ToPascal(structName)+"]", - ) + badORMPath, "WhereCondition", + ).Types(jen.Qual("", structName)) + // TODO deberia tener el paquete pero solo si es el destino es un paquete distinto + // quizas esto se puede hacer con el qual del struct directo f.Func().Id( strcase.ToPascal(structName) + strcase.ToPascal(fieldName) + "Condition", ).Params( @@ -198,6 +196,51 @@ func generateWhereCondition(f *jen.File, structName, fieldName string, param *je ) } +func generateJoinCondition(f *jen.File, structName, fieldName string, v *types.Named) { + // TODO + if v.String() != "github.com/ditrit/badaas/badorm.UUIDModel" && v.String() != "github.com/google/uuid.UUID" { + typeName := v.Obj() + log.Println(v.String()) + // log.Println(typeName.String()) + + // TODO deberia tener el paquete pero solo si es el destino es un paquete distinto + t1 := jen.Qual("", structName) + // TODO deberia tener el paquete pero solo si es el destino es un paquete distinto + t2 := jen.Qual( + // typeName.Pkg().Path(), + "", + typeName.Name(), + ) + + badormT1Condition := jen.Qual( + badORMPath, "Condition", + ).Types(t1) + badormT2Condition := jen.Qual( + badORMPath, "Condition", + ).Types(t2) + badormJoinCondition := jen.Qual( + badORMPath, "JoinCondition", + ).Types( + t1, t2, + ) + f.Func().Id( + strcase.ToPascal(structName) + strcase.ToPascal(fieldName) + "Condition", + ).Params( + jen.Id("conditions").Op("...").Add(badormT2Condition), + ).Add( + badormT1Condition, + ).Block( + jen.Return( + badormJoinCondition.Values(jen.Dict{ + // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) + jen.Id("Field"): jen.Lit(strcase.ToSnake(fieldName)), + jen.Id("Conditions"): jen.Id("conditions"), + }), + ), + ) + } +} + func loadPackages(paths []string) []*packages.Package { cfg := &packages.Config{Mode: packages.NeedTypes} pkgs, err := packages.Load(cfg, paths...) diff --git a/tools/badctl/go.mod b/tools/badctl/go.mod index 6820a995..b8ed5a52 100644 --- a/tools/badctl/go.mod +++ b/tools/badctl/go.mod @@ -5,6 +5,8 @@ go 1.18 require ( github.com/dave/jennifer v1.6.1 github.com/ditrit/verdeter v0.4.0 + github.com/elliotchance/pie/v2 v2.5.2 + github.com/ettle/strcase v0.1.1 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 golang.org/x/tools v0.6.0 @@ -24,6 +26,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect + golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect golang.org/x/mod v0.8.0 // indirect golang.org/x/sys v0.7.0 // indirect golang.org/x/text v0.9.0 // indirect diff --git a/tools/badctl/go.sum b/tools/badctl/go.sum index 79c949bc..706c3062 100644 --- a/tools/badctl/go.sum +++ b/tools/badctl/go.sum @@ -54,12 +54,16 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/ditrit/verdeter v0.4.0 h1:DzEOFauuXEGNQYP6OgYtHwEyb3w9riem99u0xE/l7+o= github.com/ditrit/verdeter v0.4.0/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= +github.com/elliotchance/pie/v2 v2.5.2 h1:jRENMmysCljhUmyT8ITKV0Atp6Lukm3XpeqaI87POsM= +github.com/elliotchance/pie/v2 v2.5.2/go.mod h1:18t0dgGFH006g4eVdDtWfgFZPQEgl10IoEO8YWEq3Og= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= +github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= @@ -206,6 +210,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 h1:ba9YlqfDGTTQ5aZ2fwOoQ1hf32QySyQkR6ODGDzHlnE= +golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= From db795172cc56b55a342aaa6f494ce64c973bf2d2 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 23 May 2023 11:16:53 +0200 Subject: [PATCH 196/467] change generated files names + work even if code not compiling --- ...s_bicycle_gen.go => bicycle_conditions.go} | 0 ...ditions_city_gen.go => city_conditions.go} | 0 ...s_company_gen.go => company_conditions.go} | 0 ...s_country_gen.go => country_conditions.go} | 0 ...employee_gen.go => employee_conditions.go} | 0 ...ons_person_gen.go => person_conditions.go} | 0 ...s_product_gen.go => product_conditions.go} | 0 ...ditions_sale_gen.go => sale_conditions.go} | 0 ...ons_seller_gen.go => seller_conditions.go} | 0 tools/badctl/cmd/gen/conditions.go | 38 +++++++++---------- 10 files changed, 18 insertions(+), 20 deletions(-) rename testintegration/{conditions_bicycle_gen.go => bicycle_conditions.go} (100%) rename testintegration/{conditions_city_gen.go => city_conditions.go} (100%) rename testintegration/{conditions_company_gen.go => company_conditions.go} (100%) rename testintegration/{conditions_country_gen.go => country_conditions.go} (100%) rename testintegration/{conditions_employee_gen.go => employee_conditions.go} (100%) rename testintegration/{conditions_person_gen.go => person_conditions.go} (100%) rename testintegration/{conditions_product_gen.go => product_conditions.go} (100%) rename testintegration/{conditions_sale_gen.go => sale_conditions.go} (100%) rename testintegration/{conditions_seller_gen.go => seller_conditions.go} (100%) diff --git a/testintegration/conditions_bicycle_gen.go b/testintegration/bicycle_conditions.go similarity index 100% rename from testintegration/conditions_bicycle_gen.go rename to testintegration/bicycle_conditions.go diff --git a/testintegration/conditions_city_gen.go b/testintegration/city_conditions.go similarity index 100% rename from testintegration/conditions_city_gen.go rename to testintegration/city_conditions.go diff --git a/testintegration/conditions_company_gen.go b/testintegration/company_conditions.go similarity index 100% rename from testintegration/conditions_company_gen.go rename to testintegration/company_conditions.go diff --git a/testintegration/conditions_country_gen.go b/testintegration/country_conditions.go similarity index 100% rename from testintegration/conditions_country_gen.go rename to testintegration/country_conditions.go diff --git a/testintegration/conditions_employee_gen.go b/testintegration/employee_conditions.go similarity index 100% rename from testintegration/conditions_employee_gen.go rename to testintegration/employee_conditions.go diff --git a/testintegration/conditions_person_gen.go b/testintegration/person_conditions.go similarity index 100% rename from testintegration/conditions_person_gen.go rename to testintegration/person_conditions.go diff --git a/testintegration/conditions_product_gen.go b/testintegration/product_conditions.go similarity index 100% rename from testintegration/conditions_product_gen.go rename to testintegration/product_conditions.go diff --git a/testintegration/conditions_sale_gen.go b/testintegration/sale_conditions.go similarity index 100% rename from testintegration/conditions_sale_gen.go rename to testintegration/sale_conditions.go diff --git a/testintegration/conditions_seller_gen.go b/testintegration/seller_conditions.go similarity index 100% rename from testintegration/conditions_seller_gen.go rename to testintegration/seller_conditions.go diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index ca396753..31153942 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -6,7 +6,6 @@ import ( "go/types" "log" "os" - "path/filepath" "strings" "github.com/dave/jennifer/jen" @@ -35,6 +34,15 @@ func generateConditions(cmd *cobra.Command, args []string) { // Inspect package and use type checker to infer imported types pkgs := loadPackages(args) + // Get the package of the file with go:generate comment + destPackage := os.Getenv("GOPACKAGE") + if destPackage == "" { + // TODO que tambien se pueda usar solo + failErr(errors.New("this command should be called using go generate")) + } + // se puede llamar igual el package pero estar en otro path, lo que quiero comparar es el path + log.Println(destPackage) + for _, pkg := range pkgs { log.Println(pkg.Types.Path()) log.Println(pkg.Types.Name()) @@ -45,7 +53,7 @@ func generateConditions(cmd *cobra.Command, args []string) { log.Println(name) // Generate code using jennifer - err := generate(name, structType) + err := generate(destPackage, name, structType) if err != nil { failErr(err) } @@ -88,15 +96,11 @@ func isBadORMModel(structType *types.Struct) bool { return false } -func generate(structTypeName string, structType *types.Struct) error { - // Get the package of the file with go:generate comment - goPackage := os.Getenv("GOPACKAGE") - if goPackage == "" { - failErr(errors.New("this command should be called using go generate")) - } +// TODO add logs - // Start a new file in this package - f := jen.NewFile(goPackage) +func generate(destPackage, structTypeName string, structType *types.Struct) error { + // Start a new file in destination package + f := jen.NewFile(destPackage) // Add a package comment, so IDEs detect files as generated // TODO version configurable @@ -111,14 +115,8 @@ func generate(structTypeName string, structType *types.Struct) error { generateConditionForField(f, structTypeName, field.Name(), field.Type()) } - // Build the target file name - goFile := os.Getenv("GOFILE") - ext := filepath.Ext(goFile) - baseFilename := goFile[0 : len(goFile)-len(ext)] - targetFilename := baseFilename + "_" + strings.ToLower(structTypeName) + "_gen.go" - // Write generated file - return f.Save(targetFilename) + return f.Save(strings.ToLower(structTypeName) + "_conditions.go") } func generateConditionForField(f *jen.File, structName, fieldName string, fieldType types.Type) error { @@ -247,9 +245,9 @@ func loadPackages(paths []string) []*packages.Package { if err != nil { failErr(fmt.Errorf("loading packages for inspection: %v", err)) } - if packages.PrintErrors(pkgs) > 0 { - os.Exit(1) - } + + // print compilation errors of source packages + packages.PrintErrors(pkgs) return pkgs } From 9ed508a5fca48721da06849025bdacf84d6ff58d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 23 May 2023 11:19:36 +0200 Subject: [PATCH 197/467] fix makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 55760a21..92b896af 100644 --- a/Makefile +++ b/Makefile @@ -11,10 +11,10 @@ test_db: ./docker/wait_for_api.sh 8080/health test_integration: test_db - go test ./test_integration -v + go test ./testintegration -v test_integration_and_cover: test_db - go test ./test_integration -coverpkg=./... -coverprofile=coverage_int.out -v + go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v test_e2e: docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" up -d From 2b4fcbfd4431b31d19dee65551959bda504ddbe7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 23 May 2023 12:03:00 +0200 Subject: [PATCH 198/467] avoid importing the dest package + refactor --- tools/badctl/cmd/gen/conditions.go | 119 ++++++++++++++++++++--------- 1 file changed, 84 insertions(+), 35 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 31153942..a16ca1f9 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -35,13 +35,12 @@ func generateConditions(cmd *cobra.Command, args []string) { pkgs := loadPackages(args) // Get the package of the file with go:generate comment - destPackage := os.Getenv("GOPACKAGE") - if destPackage == "" { + destPkg := os.Getenv("GOPACKAGE") + if destPkg == "" { // TODO que tambien se pueda usar solo failErr(errors.New("this command should be called using go generate")) } - // se puede llamar igual el package pero estar en otro path, lo que quiero comparar es el path - log.Println(destPackage) + log.Println(destPkg) for _, pkg := range pkgs { log.Println(pkg.Types.Path()) @@ -53,7 +52,10 @@ func generateConditions(cmd *cobra.Command, args []string) { log.Println(name) // Generate code using jennifer - err := generate(destPackage, name, structType) + err := generate( + pkg.Types, destPkg, + name, structType, + ) if err != nil { failErr(err) } @@ -98,9 +100,9 @@ func isBadORMModel(structType *types.Struct) bool { // TODO add logs -func generate(destPackage, structTypeName string, structType *types.Struct) error { +func generate(srcPkg *types.Package, destPkg, structName string, structType *types.Struct) error { // Start a new file in destination package - f := jen.NewFile(destPackage) + f := jen.NewFile(destPkg) // Add a package comment, so IDEs detect files as generated // TODO version configurable @@ -112,38 +114,58 @@ func generate(destPackage, structTypeName string, structType *types.Struct) erro // TODO tagValue := structType.Tag(i) log.Println(field.Name()) - generateConditionForField(f, structTypeName, field.Name(), field.Type()) + generateConditionForField( + f, + srcPkg, destPkg, + structName, + field.Name(), field.Type(), + ) } // Write generated file - return f.Save(strings.ToLower(structTypeName) + "_conditions.go") + return f.Save(strings.ToLower(structName) + "_conditions.go") } -func generateConditionForField(f *jen.File, structName, fieldName string, fieldType types.Type) error { +func generateConditionForField(f *jen.File, srcPkg *types.Package, destPkg, structName, fieldName string, fieldType types.Type) error { switch v := fieldType.(type) { case *types.Basic: - generateWhereCondition( - f, structName, fieldName, - typeKindToJenStatement[v.Kind()], + f.Add( + generateWhereCondition( + srcPkg, destPkg, + structName, + fieldName, + typeKindToJenStatement[v.Kind()], + ), ) case *types.Named: // TODO aca tambien esta el github.com/ditrit/badaas/badorm.UUIDModel - generateJoinCondition( - f, structName, fieldName, v, + f.Add( + generateJoinCondition( + srcPkg, destPkg, + structName, + fieldName, v, + ), ) case *types.Pointer: log.Println("pointer") if v.String() == "*github.com/google/uuid.UUID" { log.Println(v.String()) } else { - generateConditionForField(f, structName, fieldName, v.Elem()) + generateConditionForField( + f, + srcPkg, destPkg, + structName, + fieldName, v.Elem(), + ) } + // TODO // case *types.Slice: // log.Printf("slices not supported yet: %s.%s", structTypeName, field.Name()) default: log.Printf("struct field type not hanled: %T", v) } + // TODO ver este error return nil } @@ -169,16 +191,25 @@ var typeKindToJenStatement = map[types.BasicKind]*jen.Statement{ types.String: param.Clone().String(), } -const badORMPath = "github.com/ditrit/badaas/badorm" +const ( + badORMPath = "github.com/ditrit/badaas/badorm" + badORMCondition = "Condition" + badORMWhereCondition = "WhereCondition" + badORMJoinCondition = "JoinCondition" +) -func generateWhereCondition(f *jen.File, structName, fieldName string, param *jen.Statement) { +func generateWhereCondition(srcPkg *types.Package, destPkg, structName, fieldName string, param *jen.Statement) *jen.Statement { whereCondition := jen.Qual( - badORMPath, "WhereCondition", - ).Types(jen.Qual("", structName)) - // TODO deberia tener el paquete pero solo si es el destino es un paquete distinto - // quizas esto se puede hacer con el qual del struct directo - f.Func().Id( - strcase.ToPascal(structName) + strcase.ToPascal(fieldName) + "Condition", + badORMPath, badORMWhereCondition, + ).Types( + jen.Qual( + getRelativePackagePath(srcPkg, destPkg), + structName, + ), + ) + + return jen.Func().Id( + getConditionName(structName, fieldName), ).Params( param, ).Add( @@ -194,35 +225,38 @@ func generateWhereCondition(f *jen.File, structName, fieldName string, param *je ) } -func generateJoinCondition(f *jen.File, structName, fieldName string, v *types.Named) { +func generateJoinCondition(srcPkg *types.Package, destPkg, structName, fieldName string, v *types.Named) *jen.Statement { // TODO if v.String() != "github.com/ditrit/badaas/badorm.UUIDModel" && v.String() != "github.com/google/uuid.UUID" { + // TODO ver que nombre ponerle a este v typeName := v.Obj() log.Println(v.String()) // log.Println(typeName.String()) - // TODO deberia tener el paquete pero solo si es el destino es un paquete distinto - t1 := jen.Qual("", structName) - // TODO deberia tener el paquete pero solo si es el destino es un paquete distinto + t1 := jen.Qual( + getRelativePackagePath(srcPkg, destPkg), + structName, + ) + t2 := jen.Qual( - // typeName.Pkg().Path(), - "", + getRelativePackagePath(typeName.Pkg(), destPkg), typeName.Name(), ) badormT1Condition := jen.Qual( - badORMPath, "Condition", + badORMPath, badORMCondition, ).Types(t1) badormT2Condition := jen.Qual( - badORMPath, "Condition", + badORMPath, badORMCondition, ).Types(t2) badormJoinCondition := jen.Qual( - badORMPath, "JoinCondition", + badORMPath, badORMJoinCondition, ).Types( t1, t2, ) - f.Func().Id( - strcase.ToPascal(structName) + strcase.ToPascal(fieldName) + "Condition", + + return jen.Func().Id( + getConditionName(structName, fieldName), ).Params( jen.Id("conditions").Op("...").Add(badormT2Condition), ).Add( @@ -237,6 +271,21 @@ func generateJoinCondition(f *jen.File, structName, fieldName string, v *types.N ), ) } + + return nil +} + +func getConditionName(structName, fieldName string) string { + return strcase.ToPascal(structName) + strcase.ToPascal(fieldName) + badORMCondition +} + +// TODO testear esto +func getRelativePackagePath(srcPkg *types.Package, destPkg string) string { + if srcPkg.Name() == destPkg { + return "" + } + + return srcPkg.Path() } func loadPackages(paths []string) []*packages.Package { From 528e5a044466a242ca0553b362ec926d10f4ce29 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 23 May 2023 13:42:36 +0200 Subject: [PATCH 199/467] generate also id, createdAt, updatedAt conditions --- testintegration/bicycle_conditions.go | 30 ++++- testintegration/city_conditions.go | 30 ++++- testintegration/company_conditions.go | 24 +++- testintegration/country_conditions.go | 24 +++- testintegration/crudService.go | 26 +++- testintegration/employee_conditions.go | 24 +++- testintegration/models.go | 7 - testintegration/person_conditions.go | 24 +++- testintegration/product_conditions.go | 24 +++- testintegration/sale_conditions.go | 30 ++++- testintegration/seller_conditions.go | 24 +++- tools/badctl/cmd/gen/conditions.go | 169 +++++++++++++++---------- 12 files changed, 353 insertions(+), 83 deletions(-) diff --git a/testintegration/bicycle_conditions.go b/testintegration/bicycle_conditions.go index 1a8bf5ae..84a68153 100644 --- a/testintegration/bicycle_conditions.go +++ b/testintegration/bicycle_conditions.go @@ -1,8 +1,30 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. package testintegration -import badorm "github.com/ditrit/badaas/badorm" +import ( + badorm "github.com/ditrit/badaas/badorm" + uuid "github.com/google/uuid" + "time" +) +func BicycleIdCondition(v uuid.UUID) badorm.WhereCondition[Bicycle] { + return badorm.WhereCondition[Bicycle]{ + Field: "id", + Value: v, + } +} +func BicycleCreatedAtCondition(v time.Time) badorm.WhereCondition[Bicycle] { + return badorm.WhereCondition[Bicycle]{ + Field: "created_at", + Value: v, + } +} +func BicycleUpdatedAtCondition(v time.Time) badorm.WhereCondition[Bicycle] { + return badorm.WhereCondition[Bicycle]{ + Field: "updated_at", + Value: v, + } +} func BicycleNameCondition(v string) badorm.WhereCondition[Bicycle] { return badorm.WhereCondition[Bicycle]{ Field: "name", @@ -15,3 +37,9 @@ func BicycleOwnerCondition(conditions ...badorm.Condition[Person]) badorm.Condit Field: "owner", } } +func BicycleOwnerIdCondition(v uuid.UUID) badorm.WhereCondition[Bicycle] { + return badorm.WhereCondition[Bicycle]{ + Field: "owner_id", + Value: v, + } +} diff --git a/testintegration/city_conditions.go b/testintegration/city_conditions.go index b1590cdf..4f460843 100644 --- a/testintegration/city_conditions.go +++ b/testintegration/city_conditions.go @@ -1,11 +1,39 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. package testintegration -import badorm "github.com/ditrit/badaas/badorm" +import ( + badorm "github.com/ditrit/badaas/badorm" + uuid "github.com/google/uuid" + "time" +) +func CityIdCondition(v uuid.UUID) badorm.WhereCondition[City] { + return badorm.WhereCondition[City]{ + Field: "id", + Value: v, + } +} +func CityCreatedAtCondition(v time.Time) badorm.WhereCondition[City] { + return badorm.WhereCondition[City]{ + Field: "created_at", + Value: v, + } +} +func CityUpdatedAtCondition(v time.Time) badorm.WhereCondition[City] { + return badorm.WhereCondition[City]{ + Field: "updated_at", + Value: v, + } +} func CityNameCondition(v string) badorm.WhereCondition[City] { return badorm.WhereCondition[City]{ Field: "name", Value: v, } } +func CityCountryIdCondition(v uuid.UUID) badorm.WhereCondition[City] { + return badorm.WhereCondition[City]{ + Field: "country_id", + Value: v, + } +} diff --git a/testintegration/company_conditions.go b/testintegration/company_conditions.go index 14f0ba69..0fa9a3aa 100644 --- a/testintegration/company_conditions.go +++ b/testintegration/company_conditions.go @@ -1,8 +1,30 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. package testintegration -import badorm "github.com/ditrit/badaas/badorm" +import ( + badorm "github.com/ditrit/badaas/badorm" + uuid "github.com/google/uuid" + "time" +) +func CompanyIdCondition(v uuid.UUID) badorm.WhereCondition[Company] { + return badorm.WhereCondition[Company]{ + Field: "id", + Value: v, + } +} +func CompanyCreatedAtCondition(v time.Time) badorm.WhereCondition[Company] { + return badorm.WhereCondition[Company]{ + Field: "created_at", + Value: v, + } +} +func CompanyUpdatedAtCondition(v time.Time) badorm.WhereCondition[Company] { + return badorm.WhereCondition[Company]{ + Field: "updated_at", + Value: v, + } +} func CompanyNameCondition(v string) badorm.WhereCondition[Company] { return badorm.WhereCondition[Company]{ Field: "name", diff --git a/testintegration/country_conditions.go b/testintegration/country_conditions.go index fe9a4b19..dd3625af 100644 --- a/testintegration/country_conditions.go +++ b/testintegration/country_conditions.go @@ -1,8 +1,30 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. package testintegration -import badorm "github.com/ditrit/badaas/badorm" +import ( + badorm "github.com/ditrit/badaas/badorm" + uuid "github.com/google/uuid" + "time" +) +func CountryIdCondition(v uuid.UUID) badorm.WhereCondition[Country] { + return badorm.WhereCondition[Country]{ + Field: "id", + Value: v, + } +} +func CountryCreatedAtCondition(v time.Time) badorm.WhereCondition[Country] { + return badorm.WhereCondition[Country]{ + Field: "created_at", + Value: v, + } +} +func CountryUpdatedAtCondition(v time.Time) badorm.WhereCondition[Country] { + return badorm.WhereCondition[Country]{ + Field: "updated_at", + Value: v, + } +} func CountryNameCondition(v string) badorm.WhereCondition[Country] { return badorm.WhereCondition[Country]{ Field: "name", diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 12cebe53..180dca0f 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -200,6 +200,30 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDiffer EqualList(&ts.Suite, []*Product{match1, match2}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfId() { + match := ts.createProduct("", 0, 0.0, false) + ts.createProduct("", 0, 0.0, false) + + entities, err := ts.crudProductService.GetEntities( + ProductIdCondition(match.ID), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { + match := ts.createProduct("", 0, 0.0, false) + ts.createProduct("", 0, 0.0, false) + + entities, err := ts.crudProductService.GetEntities( + ProductCreatedAtCondition(match.CreatedAt), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { product1 := ts.createProduct("", 0, 0.0, false) product2 := ts.createProduct("", 0, 0.0, false) @@ -211,7 +235,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() ts.createSale(0, product2, seller2) entities, err := ts.crudSaleService.GetEntities( - SaleProductIDCondition(product1.ID), + SaleProductIdCondition(product1.ID), ) ts.Nil(err) diff --git a/testintegration/employee_conditions.go b/testintegration/employee_conditions.go index 772463cb..641a90c9 100644 --- a/testintegration/employee_conditions.go +++ b/testintegration/employee_conditions.go @@ -1,8 +1,30 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. package testintegration -import badorm "github.com/ditrit/badaas/badorm" +import ( + badorm "github.com/ditrit/badaas/badorm" + uuid "github.com/google/uuid" + "time" +) +func EmployeeIdCondition(v uuid.UUID) badorm.WhereCondition[Employee] { + return badorm.WhereCondition[Employee]{ + Field: "id", + Value: v, + } +} +func EmployeeCreatedAtCondition(v time.Time) badorm.WhereCondition[Employee] { + return badorm.WhereCondition[Employee]{ + Field: "created_at", + Value: v, + } +} +func EmployeeUpdatedAtCondition(v time.Time) badorm.WhereCondition[Employee] { + return badorm.WhereCondition[Employee]{ + Field: "updated_at", + Value: v, + } +} func EmployeeNameCondition(v string) badorm.WhereCondition[Employee] { return badorm.WhereCondition[Employee]{ Field: "name", diff --git a/testintegration/models.go b/testintegration/models.go index 76278941..3bbfc3ed 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -55,13 +55,6 @@ type Sale struct { SellerID *uuid.UUID } -func SaleProductIDCondition(id uuid.UUID) badorm.Condition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "product_id", - Value: id.String(), - } -} - func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { return badorm.JoinCondition[Seller, Company]{ Field: "company", diff --git a/testintegration/person_conditions.go b/testintegration/person_conditions.go index 370cafb8..b61c630f 100644 --- a/testintegration/person_conditions.go +++ b/testintegration/person_conditions.go @@ -1,8 +1,30 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. package testintegration -import badorm "github.com/ditrit/badaas/badorm" +import ( + badorm "github.com/ditrit/badaas/badorm" + uuid "github.com/google/uuid" + "time" +) +func PersonIdCondition(v uuid.UUID) badorm.WhereCondition[Person] { + return badorm.WhereCondition[Person]{ + Field: "id", + Value: v, + } +} +func PersonCreatedAtCondition(v time.Time) badorm.WhereCondition[Person] { + return badorm.WhereCondition[Person]{ + Field: "created_at", + Value: v, + } +} +func PersonUpdatedAtCondition(v time.Time) badorm.WhereCondition[Person] { + return badorm.WhereCondition[Person]{ + Field: "updated_at", + Value: v, + } +} func PersonNameCondition(v string) badorm.WhereCondition[Person] { return badorm.WhereCondition[Person]{ Field: "name", diff --git a/testintegration/product_conditions.go b/testintegration/product_conditions.go index d57b6a34..754813f7 100644 --- a/testintegration/product_conditions.go +++ b/testintegration/product_conditions.go @@ -1,8 +1,30 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. package testintegration -import badorm "github.com/ditrit/badaas/badorm" +import ( + badorm "github.com/ditrit/badaas/badorm" + uuid "github.com/google/uuid" + "time" +) +func ProductIdCondition(v uuid.UUID) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "id", + Value: v, + } +} +func ProductCreatedAtCondition(v time.Time) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "created_at", + Value: v, + } +} +func ProductUpdatedAtCondition(v time.Time) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "updated_at", + Value: v, + } +} func ProductStringCondition(v string) badorm.WhereCondition[Product] { return badorm.WhereCondition[Product]{ Field: "string", diff --git a/testintegration/sale_conditions.go b/testintegration/sale_conditions.go index 554144e8..40d4997f 100644 --- a/testintegration/sale_conditions.go +++ b/testintegration/sale_conditions.go @@ -1,8 +1,30 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. package testintegration -import badorm "github.com/ditrit/badaas/badorm" +import ( + badorm "github.com/ditrit/badaas/badorm" + uuid "github.com/google/uuid" + "time" +) +func SaleIdCondition(v uuid.UUID) badorm.WhereCondition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "id", + Value: v, + } +} +func SaleCreatedAtCondition(v time.Time) badorm.WhereCondition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "created_at", + Value: v, + } +} +func SaleUpdatedAtCondition(v time.Time) badorm.WhereCondition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "updated_at", + Value: v, + } +} func SaleCodeCondition(v int) badorm.WhereCondition[Sale] { return badorm.WhereCondition[Sale]{ Field: "code", @@ -21,6 +43,12 @@ func SaleProductCondition(conditions ...badorm.Condition[Product]) badorm.Condit Field: "product", } } +func SaleProductIdCondition(v uuid.UUID) badorm.WhereCondition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "product_id", + Value: v, + } +} func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Condition[Sale] { return badorm.JoinCondition[Sale, Seller]{ Conditions: conditions, diff --git a/testintegration/seller_conditions.go b/testintegration/seller_conditions.go index b9eca1b4..c0a7213b 100644 --- a/testintegration/seller_conditions.go +++ b/testintegration/seller_conditions.go @@ -1,8 +1,30 @@ // Code generated by badctl v0.0.0, DO NOT EDIT. package testintegration -import badorm "github.com/ditrit/badaas/badorm" +import ( + badorm "github.com/ditrit/badaas/badorm" + uuid "github.com/google/uuid" + "time" +) +func SellerIdCondition(v uuid.UUID) badorm.WhereCondition[Seller] { + return badorm.WhereCondition[Seller]{ + Field: "id", + Value: v, + } +} +func SellerCreatedAtCondition(v time.Time) badorm.WhereCondition[Seller] { + return badorm.WhereCondition[Seller]{ + Field: "created_at", + Value: v, + } +} +func SellerUpdatedAtCondition(v time.Time) badorm.WhereCondition[Seller] { + return badorm.WhereCondition[Seller]{ + Field: "updated_at", + Value: v, + } +} func SellerNameCondition(v string) badorm.WhereCondition[Seller] { return badorm.WhereCondition[Seller]{ Field: "name", diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index a16ca1f9..88f943fc 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -28,9 +28,15 @@ var genConditionsCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ // badorm/baseModels.go var badORMModels = []string{"UUIDModel", "UIntModel"} -func generateConditions(cmd *cobra.Command, args []string) { - log.Println(args) +const ( + badORMPath = "github.com/ditrit/badaas/badorm" + // badorm/condition.go + badORMCondition = "Condition" + badORMWhereCondition = "WhereCondition" + badORMJoinCondition = "JoinCondition" +) +func generateConditions(cmd *cobra.Command, args []string) { // Inspect package and use type checker to infer imported types pkgs := loadPackages(args) @@ -89,7 +95,6 @@ func isBadORMModel(structType *types.Struct) bool { for i := 0; i < structType.NumFields(); i++ { field := structType.Field(i) - // TODO quizas se puede hacer con el type en lugar del nombre if field.Embedded() && pie.Contains(badORMModels, field.Name()) { return true } @@ -127,48 +132,95 @@ func generate(srcPkg *types.Package, destPkg, structName string, structType *typ } func generateConditionForField(f *jen.File, srcPkg *types.Package, destPkg, structName, fieldName string, fieldType types.Type) error { - switch v := fieldType.(type) { + switch fieldTypeTyped := fieldType.(type) { case *types.Basic: f.Add( generateWhereCondition( srcPkg, destPkg, structName, fieldName, - typeKindToJenStatement[v.Kind()], + typeKindToJenStatement[fieldTypeTyped.Kind()], ), ) case *types.Named: - // TODO aca tambien esta el github.com/ditrit/badaas/badorm.UUIDModel - f.Add( - generateJoinCondition( + fieldTypeName := fieldTypeTyped.Obj() + if pie.Contains(badORMModels, fieldTypeName.Name()) { + generateBaseModelConditions( + f, srcPkg, destPkg, structName, - fieldName, v, - ), - ) + fieldTypeTyped, + ) + // TODO + } else if fieldTypeName.Name() == "UUID" || fieldTypeTyped.String() == "time.Time" { + f.Add( + generateWhereCondition( + srcPkg, destPkg, + structName, + fieldName, + param.Clone().Qual( + getRelativePackagePath(fieldTypeName.Pkg(), destPkg), + fieldTypeName.Name(), + ), + ), + ) + // TODO DeletedAt + } else if fieldTypeTyped.String() != "gorm.io/gorm.DeletedAt" { + f.Add( + generateJoinCondition( + srcPkg, destPkg, + structName, + fieldName, fieldTypeName, + ), + ) + } case *types.Pointer: + // TODO pointers deberian permitir nuallables log.Println("pointer") - if v.String() == "*github.com/google/uuid.UUID" { - log.Println(v.String()) + if fieldTypeTyped.String() == "*github.com/google/uuid.UUID" { + log.Println(fieldTypeTyped.String()) } else { generateConditionForField( f, srcPkg, destPkg, structName, - fieldName, v.Elem(), + fieldName, fieldTypeTyped.Elem(), ) } // TODO // case *types.Slice: // log.Printf("slices not supported yet: %s.%s", structTypeName, field.Name()) default: - log.Printf("struct field type not hanled: %T", v) + log.Printf("struct field type not hanled: %T", fieldTypeTyped) } // TODO ver este error return nil } +// TODO esto podria ser para cualquier embeded +func generateBaseModelConditions(f *jen.File, srcPkg *types.Package, destPkg, structName string, fieldType *types.Named) { + structType, ok := fieldType.Underlying().(*types.Struct) + if !ok { + failErr(errors.New("unreacheable! base models are allways structs")) + } + log.Println(structType.String()) + + // Iterate over struct fields + // TODO codigo repetido + for i := 0; i < structType.NumFields(); i++ { + field := structType.Field(i) + + log.Println(field.Name()) + generateConditionForField( + f, + srcPkg, destPkg, + structName, + field.Name(), field.Type(), + ) + } +} + var param = jen.Id("v") var typeKindToJenStatement = map[types.BasicKind]*jen.Statement{ @@ -191,13 +243,6 @@ var typeKindToJenStatement = map[types.BasicKind]*jen.Statement{ types.String: param.Clone().String(), } -const ( - badORMPath = "github.com/ditrit/badaas/badorm" - badORMCondition = "Condition" - badORMWhereCondition = "WhereCondition" - badORMJoinCondition = "JoinCondition" -) - func generateWhereCondition(srcPkg *types.Package, destPkg, structName, fieldName string, param *jen.Statement) *jen.Statement { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, @@ -225,54 +270,46 @@ func generateWhereCondition(srcPkg *types.Package, destPkg, structName, fieldNam ) } -func generateJoinCondition(srcPkg *types.Package, destPkg, structName, fieldName string, v *types.Named) *jen.Statement { - // TODO - if v.String() != "github.com/ditrit/badaas/badorm.UUIDModel" && v.String() != "github.com/google/uuid.UUID" { - // TODO ver que nombre ponerle a este v - typeName := v.Obj() - log.Println(v.String()) - // log.Println(typeName.String()) - - t1 := jen.Qual( - getRelativePackagePath(srcPkg, destPkg), - structName, - ) +func generateJoinCondition(srcPkg *types.Package, destPkg, structName, fieldName string, fieldTypeName *types.TypeName) *jen.Statement { + log.Println(fieldTypeName.String()) - t2 := jen.Qual( - getRelativePackagePath(typeName.Pkg(), destPkg), - typeName.Name(), - ) + t1 := jen.Qual( + getRelativePackagePath(srcPkg, destPkg), + structName, + ) - badormT1Condition := jen.Qual( - badORMPath, badORMCondition, - ).Types(t1) - badormT2Condition := jen.Qual( - badORMPath, badORMCondition, - ).Types(t2) - badormJoinCondition := jen.Qual( - badORMPath, badORMJoinCondition, - ).Types( - t1, t2, - ) + t2 := jen.Qual( + getRelativePackagePath(fieldTypeName.Pkg(), destPkg), + fieldTypeName.Name(), + ) - return jen.Func().Id( - getConditionName(structName, fieldName), - ).Params( - jen.Id("conditions").Op("...").Add(badormT2Condition), - ).Add( - badormT1Condition, - ).Block( - jen.Return( - badormJoinCondition.Values(jen.Dict{ - // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) - jen.Id("Field"): jen.Lit(strcase.ToSnake(fieldName)), - jen.Id("Conditions"): jen.Id("conditions"), - }), - ), - ) - } + badormT1Condition := jen.Qual( + badORMPath, badORMCondition, + ).Types(t1) + badormT2Condition := jen.Qual( + badORMPath, badORMCondition, + ).Types(t2) + badormJoinCondition := jen.Qual( + badORMPath, badORMJoinCondition, + ).Types( + t1, t2, + ) - return nil + return jen.Func().Id( + getConditionName(structName, fieldName), + ).Params( + jen.Id("conditions").Op("...").Add(badormT2Condition), + ).Add( + badormT1Condition, + ).Block( + jen.Return( + badormJoinCondition.Values(jen.Dict{ + // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) + jen.Id("Field"): jen.Lit(strcase.ToSnake(fieldName)), + jen.Id("Conditions"): jen.Id("conditions"), + }), + ), + ) } func getConditionName(structName, fieldName string) string { From a8a45c0349723cecc2f93f8b85f78a7fb4a1d3c3 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 23 May 2023 14:46:42 +0200 Subject: [PATCH 200/467] add conditions for pointers + allow filter by nil --- badorm/condition.go | 24 +++- testintegration/crudService.go | 174 ++++++++++++++++++------- testintegration/employee_conditions.go | 6 + testintegration/models.go | 9 +- testintegration/product_conditions.go | 6 + testintegration/sale_conditions.go | 6 + testintegration/seller_conditions.go | 6 + tools/badctl/cmd/gen/conditions.go | 136 +++++++++---------- 8 files changed, 245 insertions(+), 122 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 988489cd..4f66f38f 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -31,18 +31,29 @@ func (condition WhereCondition[T]) interfaceVerificationMethod(t T) {} // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value func (condition WhereCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { + sql, values := condition.GetSQL(tableName) return query.Where( - condition.GetSQL(tableName), - condition.Value, + sql, + values..., ), nil } -func (condition WhereCondition[T]) GetSQL(tableName string) string { +func (condition WhereCondition[T]) GetSQL(tableName string) (string, []any) { + val := condition.Value + // avoid nil is not nil behavior of go + if val == nil || (reflect.ValueOf(val).Kind() == reflect.Ptr && reflect.ValueOf(val).IsNil()) { + return fmt.Sprintf( + "%s.%s IS NULL", + tableName, + condition.Field, + ), []any{} + } + return fmt.Sprintf( "%s.%s = ?", tableName, condition.Field, - ) + ), []any{val} } type JoinCondition[T1 any, T2 any] struct { @@ -74,8 +85,9 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // apply WhereConditions to join in "on" clause conditionsValues := []any{} for _, condition := range whereConditions { - joinQuery += "AND " + condition.GetSQL(nextTableName) - conditionsValues = append(conditionsValues, condition.Value) + sql, values := condition.GetSQL(nextTableName) + joinQuery += "AND " + sql + conditionsValues = append(conditionsValues, values...) } // add the join to the query diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 180dca0f..60534030 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -58,14 +58,14 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() } func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { - ts.createProduct("", 0, 0, false) + ts.createProduct("", 0, 0, false, nil) _, err := ts.crudProductService.GetEntity(uuid.New()) ts.Error(err, gorm.ErrRecordNotFound) } func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsTheEntityIfItIsCreate() { - match := ts.createProduct("", 0, 0, false) + match := ts.createProduct("", 0, 0, false, nil) entity, err := ts.crudProductService.GetEntity(match.ID) ts.Nil(err) @@ -83,7 +83,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyI } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { - match := ts.createProduct("", 0, 0, false) + match := ts.createProduct("", 0, 0, false, nil) entities, err := ts.crudProductService.GetEntities() ts.Nil(err) @@ -92,9 +92,9 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnl } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { - match1 := ts.createProduct("", 0, 0, false) - match2 := ts.createProduct("", 0, 0, false) - match3 := ts.createProduct("", 0, 0, false) + match1 := ts.createProduct("", 0, 0, false, nil) + match2 := ts.createProduct("", 0, 0, false, nil) + match3 := ts.createProduct("", 0, 0, false, nil) entities, err := ts.crudProductService.GetEntities() ts.Nil(err) @@ -112,7 +112,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNo } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { - ts.createProduct("something_else", 0, 0, false) + ts.createProduct("something_else", 0, 0, false, nil) entities, err := ts.crudProductService.GetEntities( ProductStringCondition("not_match"), @@ -123,8 +123,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNo } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { - match := ts.createProduct("match", 0, 0, false) - ts.createProduct("not_match", 0, 0, false) + match := ts.createProduct("match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) entities, err := ts.crudProductService.GetEntities( ProductStringCondition("match"), @@ -135,9 +135,9 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnly } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { - match1 := ts.createProduct("match", 0, 0, false) - match2 := ts.createProduct("match", 0, 0, false) - ts.createProduct("not_match", 0, 0, false) + match1 := ts.createProduct("match", 0, 0, false, nil) + match2 := ts.createProduct("match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) entities, err := ts.crudProductService.GetEntities( ProductStringCondition("match"), @@ -148,8 +148,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleI } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { - match := ts.createProduct("match", 1, 0, false) - ts.createProduct("not_match", 2, 0, false) + match := ts.createProduct("match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) entities, err := ts.crudProductService.GetEntities( ProductIntCondition(1), @@ -160,8 +160,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { - match := ts.createProduct("match", 0, 1.1, false) - ts.createProduct("not_match", 0, 2.2, false) + match := ts.createProduct("match", 0, 1.1, false, nil) + ts.createProduct("not_match", 0, 2.2, false, nil) entities, err := ts.crudProductService.GetEntities( ProductFloatCondition(1.1), @@ -172,8 +172,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { - match := ts.createProduct("match", 0, 0.0, true) - ts.createProduct("not_match", 0, 0.0, false) + match := ts.createProduct("match", 0, 0.0, true, nil) + ts.createProduct("not_match", 0, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( ProductBoolCondition(true), @@ -184,11 +184,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { - match1 := ts.createProduct("match", 1, 0.0, true) - match2 := ts.createProduct("match", 1, 0.0, true) + match1 := ts.createProduct("match", 1, 0.0, true, nil) + match2 := ts.createProduct("match", 1, 0.0, true, nil) - ts.createProduct("not_match", 1, 0.0, true) - ts.createProduct("match", 2, 0.0, true) + ts.createProduct("not_match", 1, 0.0, true, nil) + ts.createProduct("match", 2, 0.0, true, nil) entities, err := ts.crudProductService.GetEntities( ProductStringCondition("match"), @@ -200,9 +200,9 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDiffer EqualList(&ts.Suite, []*Product{match1, match2}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfId() { - match := ts.createProduct("", 0, 0.0, false) - ts.createProduct("", 0, 0.0, false) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfID() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( ProductIdCondition(match.ID), @@ -213,8 +213,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfId() { } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { - match := ts.createProduct("", 0, 0.0, false) - ts.createProduct("", 0, 0.0, false) + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( ProductCreatedAtCondition(match.CreatedAt), @@ -224,9 +224,37 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { EqualList(&ts.Suite, []*Product{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWithValue() { + intMatch := 1 + match := ts.createProduct("match", 1, 0, false, &intMatch) + intNotMatch := 2 + ts.createProduct("not_match", 2, 0, false, &intNotMatch) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + ProductIntPointerCondition(&intMatch), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeByNil() { + match := ts.createProduct("match", 1, 0, false, nil) + intNotMatch := 2 + ts.createProduct("not_match", 2, 0, false, &intNotMatch) + + entities, err := ts.crudProductService.GetEntities( + ProductIntPointerCondition(nil), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { - product1 := ts.createProduct("", 0, 0.0, false) - product2 := ts.createProduct("", 0, 0.0, false) + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -242,9 +270,44 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() EqualList(&ts.Suite, []*Sale{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalWithValue() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + SaleSellerIdCondition(&seller1.ID), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalByNil() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + SaleSellerIdCondition(nil), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { - product1 := ts.createProduct("", 1, 0.0, false) - product2 := ts.createProduct("", 2, 0.0, false) + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) match := ts.createSale(0, product1, nil) ts.createSale(0, product2, nil) @@ -260,8 +323,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsT } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { - product1 := ts.createProduct("", 1, 0.0, false) - product2 := ts.createProduct("", 2, 0.0, false) + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -282,8 +345,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFilte } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { - product1 := ts.createProduct("", 1, 0.0, false) - product2 := ts.createProduct("", 2, 0.0, false) + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -403,8 +466,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMan } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { - product1 := ts.createProduct("match", 1, 0.0, false) - product2 := ts.createProduct("match", 2, 0.0, false) + product1 := ts.createProduct("match", 1, 0.0, false, nil) + product2 := ts.createProduct("match", 2, 0.0, false, nil) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -423,9 +486,27 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffer EqualList(&ts.Suite, []*Sale{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersByNil() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + intProduct2 := 2 + product2 := ts.createProduct("", 2, 0.0, false, &intProduct2) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + SaleProductCondition( + ProductIntPointerCondition(nil), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Sale{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { - product1 := ts.createProduct("", 1, 0.0, false) - product2 := ts.createProduct("", 2, 0.0, false) + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) seller1 := ts.createSeller("franco", nil) seller2 := ts.createSeller("agustin", nil) @@ -449,8 +530,8 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferen } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { - product1 := ts.createProduct("", 0, 0.0, false) - product2 := ts.createProduct("", 0, 0.0, false) + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) company1 := ts.createCompany("ditrit") company2 := ts.createCompany("orness") @@ -476,12 +557,13 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultiple // ------------------------- utils ------------------------- -func (ts *CRUDServiceIntTestSuite) createProduct(stringV string, intV int, floatV float64, boolV bool) *Product { +func (ts *CRUDServiceIntTestSuite) createProduct(stringV string, intV int, floatV float64, boolV bool, intP *int) *Product { entity := &Product{ - String: stringV, - Int: intV, - Float: floatV, - Bool: boolV, + String: stringV, + Int: intV, + Float: floatV, + Bool: boolV, + IntPointer: intP, } err := ts.db.Create(entity).Error ts.Nil(err) diff --git a/testintegration/employee_conditions.go b/testintegration/employee_conditions.go index 641a90c9..b2b7ef7b 100644 --- a/testintegration/employee_conditions.go +++ b/testintegration/employee_conditions.go @@ -37,3 +37,9 @@ func EmployeeBossCondition(conditions ...badorm.Condition[Employee]) badorm.Cond Field: "boss", } } +func EmployeeBossIdCondition(v *uuid.UUID) badorm.WhereCondition[Employee] { + return badorm.WhereCondition[Employee]{ + Field: "boss_id", + Value: v, + } +} diff --git a/testintegration/models.go b/testintegration/models.go index 3bbfc3ed..4d4d5202 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -27,10 +27,11 @@ type Company struct { type Product struct { badorm.UUIDModel - String string - Int int - Float float64 - Bool bool + String string + Int int + IntPointer *int + Float float64 + Bool bool } type Seller struct { diff --git a/testintegration/product_conditions.go b/testintegration/product_conditions.go index 754813f7..ad1ca759 100644 --- a/testintegration/product_conditions.go +++ b/testintegration/product_conditions.go @@ -37,6 +37,12 @@ func ProductIntCondition(v int) badorm.WhereCondition[Product] { Value: v, } } +func ProductIntPointerCondition(v *int) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "int_pointer", + Value: v, + } +} func ProductFloatCondition(v float64) badorm.WhereCondition[Product] { return badorm.WhereCondition[Product]{ Field: "float", diff --git a/testintegration/sale_conditions.go b/testintegration/sale_conditions.go index 40d4997f..99ec3a61 100644 --- a/testintegration/sale_conditions.go +++ b/testintegration/sale_conditions.go @@ -55,3 +55,9 @@ func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Conditio Field: "seller", } } +func SaleSellerIdCondition(v *uuid.UUID) badorm.WhereCondition[Sale] { + return badorm.WhereCondition[Sale]{ + Field: "seller_id", + Value: v, + } +} diff --git a/testintegration/seller_conditions.go b/testintegration/seller_conditions.go index c0a7213b..ac883832 100644 --- a/testintegration/seller_conditions.go +++ b/testintegration/seller_conditions.go @@ -31,3 +31,9 @@ func SellerNameCondition(v string) badorm.WhereCondition[Seller] { Value: v, } } +func SellerCompanyIdCondition(v *uuid.UUID) badorm.WhereCondition[Seller] { + return badorm.WhereCondition[Seller]{ + Field: "company_id", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 88f943fc..db5d8b81 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -119,7 +119,7 @@ func generate(srcPkg *types.Package, destPkg, structName string, structType *typ // TODO tagValue := structType.Tag(i) log.Println(field.Name()) - generateConditionForField( + addConditionForField( f, srcPkg, destPkg, structName, @@ -131,62 +131,63 @@ func generate(srcPkg *types.Package, destPkg, structName string, structType *typ return f.Save(strings.ToLower(structName) + "_conditions.go") } -func generateConditionForField(f *jen.File, srcPkg *types.Package, destPkg, structName, fieldName string, fieldType types.Type) error { +var basicParam = jen.Id("v") + +func addConditionForField(f *jen.File, srcPkg *types.Package, destPkg, structName, fieldName string, fieldType types.Type) { + conditions := generateConditionForField( + srcPkg, destPkg, + structName, fieldName, fieldType, + basicParam.Clone(), + ) + + for _, condition := range conditions { + f.Add(condition) + } +} + +func generateConditionForField(srcPkg *types.Package, destPkg, structName, fieldName string, fieldType types.Type, param *jen.Statement) []jen.Code { switch fieldTypeTyped := fieldType.(type) { case *types.Basic: - f.Add( - generateWhereCondition( - srcPkg, destPkg, - structName, - fieldName, - typeKindToJenStatement[fieldTypeTyped.Kind()], - ), - ) + return []jen.Code{generateWhereCondition( + srcPkg, destPkg, + structName, + fieldName, + typeKindToJenStatement[fieldTypeTyped.Kind()](param), + )} case *types.Named: fieldTypeName := fieldTypeTyped.Obj() if pie.Contains(badORMModels, fieldTypeName.Name()) { - generateBaseModelConditions( - f, + return generateBaseModelConditions( srcPkg, destPkg, structName, fieldTypeTyped, ) - // TODO + // TODO UUID tambien tiene que generar el join si otro no lo genera } else if fieldTypeName.Name() == "UUID" || fieldTypeTyped.String() == "time.Time" { - f.Add( - generateWhereCondition( - srcPkg, destPkg, - structName, - fieldName, - param.Clone().Qual( - getRelativePackagePath(fieldTypeName.Pkg(), destPkg), - fieldTypeName.Name(), - ), + return []jen.Code{generateWhereCondition( + srcPkg, destPkg, + structName, + fieldName, + param.Clone().Qual( + getRelativePackagePath(fieldTypeName.Pkg(), destPkg), + fieldTypeName.Name(), ), - ) + )} // TODO DeletedAt } else if fieldTypeTyped.String() != "gorm.io/gorm.DeletedAt" { - f.Add( - generateJoinCondition( - srcPkg, destPkg, - structName, - fieldName, fieldTypeName, - ), - ) - } - case *types.Pointer: - // TODO pointers deberian permitir nuallables - log.Println("pointer") - if fieldTypeTyped.String() == "*github.com/google/uuid.UUID" { - log.Println(fieldTypeTyped.String()) - } else { - generateConditionForField( - f, + return []jen.Code{generateJoinCondition( srcPkg, destPkg, structName, - fieldName, fieldTypeTyped.Elem(), - ) + fieldName, fieldTypeName, + )} } + case *types.Pointer: + return generateConditionForField( + srcPkg, destPkg, + structName, + fieldName, fieldTypeTyped.Elem(), + param.Clone().Op("*"), + ) // TODO // case *types.Slice: // log.Printf("slices not supported yet: %s.%s", structTypeName, field.Name()) @@ -195,52 +196,55 @@ func generateConditionForField(f *jen.File, srcPkg *types.Package, destPkg, stru } // TODO ver este error - return nil + return []jen.Code{} } // TODO esto podria ser para cualquier embeded -func generateBaseModelConditions(f *jen.File, srcPkg *types.Package, destPkg, structName string, fieldType *types.Named) { +// TODO ver diferencia entre embeded de go y embeded de gorm +func generateBaseModelConditions(srcPkg *types.Package, destPkg, structName string, fieldType *types.Named) []jen.Code { structType, ok := fieldType.Underlying().(*types.Struct) if !ok { failErr(errors.New("unreacheable! base models are allways structs")) } log.Println(structType.String()) + conditions := []jen.Code{} + // Iterate over struct fields // TODO codigo repetido for i := 0; i < structType.NumFields(); i++ { field := structType.Field(i) log.Println(field.Name()) - generateConditionForField( - f, + conditions = append(conditions, generateConditionForField( srcPkg, destPkg, structName, field.Name(), field.Type(), - ) + basicParam, + )...) } + + return conditions } -var param = jen.Id("v") - -var typeKindToJenStatement = map[types.BasicKind]*jen.Statement{ - types.Bool: param.Clone().Bool(), - types.Int: param.Clone().Int(), - types.Int8: param.Clone().Int8(), - types.Int16: param.Clone().Int16(), - types.Int32: param.Clone().Int32(), - types.Int64: param.Clone().Int64(), - types.Uint: param.Clone().Uint(), - types.Uint8: param.Clone().Uint8(), - types.Uint16: param.Clone().Uint16(), - types.Uint32: param.Clone().Uint32(), - types.Uint64: param.Clone().Uint64(), - types.Uintptr: param.Clone().Uintptr(), - types.Float32: param.Clone().Float32(), - types.Float64: param.Clone().Float64(), - types.Complex64: param.Clone().Complex64(), - types.Complex128: param.Clone().Complex128(), - types.String: param.Clone().String(), +var typeKindToJenStatement = map[types.BasicKind]func(*jen.Statement) *jen.Statement{ + types.Bool: func(param *jen.Statement) *jen.Statement { return param.Bool() }, + types.Int: func(param *jen.Statement) *jen.Statement { return param.Int() }, + types.Int8: func(param *jen.Statement) *jen.Statement { return param.Int8() }, + types.Int16: func(param *jen.Statement) *jen.Statement { return param.Int16() }, + types.Int32: func(param *jen.Statement) *jen.Statement { return param.Int32() }, + types.Int64: func(param *jen.Statement) *jen.Statement { return param.Int64() }, + types.Uint: func(param *jen.Statement) *jen.Statement { return param.Uint() }, + types.Uint8: func(param *jen.Statement) *jen.Statement { return param.Uint8() }, + types.Uint16: func(param *jen.Statement) *jen.Statement { return param.Uint16() }, + types.Uint32: func(param *jen.Statement) *jen.Statement { return param.Uint32() }, + types.Uint64: func(param *jen.Statement) *jen.Statement { return param.Uint64() }, + types.Uintptr: func(param *jen.Statement) *jen.Statement { return param.Uintptr() }, + types.Float32: func(param *jen.Statement) *jen.Statement { return param.Float32() }, + types.Float64: func(param *jen.Statement) *jen.Statement { return param.Float64() }, + types.Complex64: func(param *jen.Statement) *jen.Statement { return param.Complex64() }, + types.Complex128: func(param *jen.Statement) *jen.Statement { return param.Complex128() }, + types.String: func(param *jen.Statement) *jen.Statement { return param.String() }, } func generateWhereCondition(srcPkg *types.Package, destPkg, structName, fieldName string, param *jen.Statement) *jen.Statement { From ebe92dfcf6da7be45e77253e301b6396e80d5a45 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 23 May 2023 16:25:03 +0200 Subject: [PATCH 201/467] autogenerate inverse join condition --- testintegration/country_conditions.go | 6 + testintegration/models.go | 7 -- tools/badctl/cmd/gen/conditions.go | 171 +++++++++++++++++--------- 3 files changed, 118 insertions(+), 66 deletions(-) diff --git a/testintegration/country_conditions.go b/testintegration/country_conditions.go index dd3625af..408dd1e5 100644 --- a/testintegration/country_conditions.go +++ b/testintegration/country_conditions.go @@ -37,3 +37,9 @@ func CountryCapitalCondition(conditions ...badorm.Condition[City]) badorm.Condit Field: "capital", } } +func CityCountryCondition(conditions ...badorm.Condition[Country]) badorm.Condition[City] { + return badorm.JoinCondition[City, Country]{ + Conditions: conditions, + Field: "country", + } +} diff --git a/testintegration/models.go b/testintegration/models.go index 4d4d5202..dd3cccfb 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -97,13 +97,6 @@ func (m City) Equal(other City) bool { return m.Name == other.Name } -func CityCountryCondition(conditions ...badorm.Condition[Country]) badorm.Condition[City] { - return badorm.JoinCondition[City, Country]{ - Field: "country", - Conditions: conditions, - } -} - type Employee struct { badorm.UUIDModel diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index db5d8b81..5abd34be 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -53,14 +53,14 @@ func generateConditions(cmd *cobra.Command, args []string) { log.Println(pkg.Types.Name()) for _, name := range pkg.Types.Scope().Names() { - structType := getStructType(pkg, name) - if structType != nil && isBadORMModel(structType) { + structName := getTypeName(pkg, name) + if structName != nil { log.Println(name) // Generate code using jennifer err := generate( - pkg.Types, destPkg, - name, structType, + destPkg, + structName, ) if err != nil { failErr(err) @@ -70,7 +70,7 @@ func generateConditions(cmd *cobra.Command, args []string) { } } -func getStructType(pkg *packages.Package, name string) *types.Struct { +func getTypeName(pkg *packages.Package, name string) *types.TypeName { obj := pkg.Types.Scope().Lookup(name) if obj == nil { failErr(fmt.Errorf("%s not found in declared types of %s", @@ -78,34 +78,29 @@ func getStructType(pkg *packages.Package, name string) *types.Struct { } // Generate only if it is a declared type - if _, ok := obj.(*types.TypeName); !ok { - return nil - } - // Generate only when underlying type is a struct - // (ignore const, var, func, etc.) - structType, ok := obj.Type().Underlying().(*types.Struct) + structName, ok := obj.(*types.TypeName) if !ok { return nil } - return structType + return structName } -func isBadORMModel(structType *types.Struct) bool { - for i := 0; i < structType.NumFields(); i++ { - field := structType.Field(i) - - if field.Embedded() && pie.Contains(badORMModels, field.Name()) { - return true - } - } +// TODO add logs - return false +type Field struct { + Name string + Type types.Type + Tag string } -// TODO add logs +func generate(destPkg string, structName *types.TypeName) error { + // Iterate over struct fields + fields := getFields(structName) + if len(fields) == 0 { + return nil + } -func generate(srcPkg *types.Package, destPkg, structName string, structType *types.Struct) error { // Start a new file in destination package f := jen.NewFile(destPkg) @@ -113,30 +108,62 @@ func generate(srcPkg *types.Package, destPkg, structName string, structType *typ // TODO version configurable f.PackageComment("Code generated by badctl v0.0.0, DO NOT EDIT.") - // Iterate over struct fields - for i := 0; i < structType.NumFields(); i++ { - field := structType.Field(i) - // TODO tagValue := structType.Tag(i) - - log.Println(field.Name()) + for _, field := range fields { + log.Println(field.Name) addConditionForField( f, - srcPkg, destPkg, + destPkg, structName, - field.Name(), field.Type(), + field, ) } // Write generated file - return f.Save(strings.ToLower(structName) + "_conditions.go") + return f.Save(strings.ToLower(structName.Name()) + "_conditions.go") +} + +func getFields(structName *types.TypeName) []Field { + // Generate only when underlying type is a struct + // (ignore const, var, func, etc.) + structType, ok := structName.Type().Underlying().(*types.Struct) + if !ok || !isBadORMModel(structType) { + return nil + } + + fields := []Field{} + + // Iterate over struct fields + for i := 0; i < structType.NumFields(); i++ { + field := structType.Field(i) + fields = append(fields, Field{ + Name: field.Name(), + Type: field.Type(), + // TODO verificar que pasa si hay menos tags, osea que algunos atributos no tienen tags + Tag: structType.Tag(i), + }) + } + + return fields +} + +func isBadORMModel(structType *types.Struct) bool { + for i := 0; i < structType.NumFields(); i++ { + field := structType.Field(i) + + if field.Embedded() && pie.Contains(badORMModels, field.Name()) { + return true + } + } + + return false } var basicParam = jen.Id("v") -func addConditionForField(f *jen.File, srcPkg *types.Package, destPkg, structName, fieldName string, fieldType types.Type) { +func addConditionForField(f *jen.File, destPkg string, structName *types.TypeName, field Field) { conditions := generateConditionForField( - srcPkg, destPkg, - structName, fieldName, fieldType, + destPkg, + structName, field, basicParam.Clone(), ) @@ -145,29 +172,29 @@ func addConditionForField(f *jen.File, srcPkg *types.Package, destPkg, structNam } } -func generateConditionForField(srcPkg *types.Package, destPkg, structName, fieldName string, fieldType types.Type, param *jen.Statement) []jen.Code { - switch fieldTypeTyped := fieldType.(type) { +func generateConditionForField(destPkg string, structName *types.TypeName, field Field, param *jen.Statement) []jen.Code { + switch fieldTypeTyped := field.Type.(type) { case *types.Basic: return []jen.Code{generateWhereCondition( - srcPkg, destPkg, + destPkg, structName, - fieldName, + field.Name, typeKindToJenStatement[fieldTypeTyped.Kind()](param), )} case *types.Named: fieldTypeName := fieldTypeTyped.Obj() if pie.Contains(badORMModels, fieldTypeName.Name()) { return generateBaseModelConditions( - srcPkg, destPkg, + destPkg, structName, fieldTypeTyped, ) // TODO UUID tambien tiene que generar el join si otro no lo genera } else if fieldTypeName.Name() == "UUID" || fieldTypeTyped.String() == "time.Time" { return []jen.Code{generateWhereCondition( - srcPkg, destPkg, + destPkg, structName, - fieldName, + field.Name, param.Clone().Qual( getRelativePackagePath(fieldTypeName.Pkg(), destPkg), fieldTypeName.Name(), @@ -175,17 +202,39 @@ func generateConditionForField(srcPkg *types.Package, destPkg, structName, field )} // TODO DeletedAt } else if fieldTypeTyped.String() != "gorm.io/gorm.DeletedAt" { - return []jen.Code{generateJoinCondition( - srcPkg, destPkg, + joinCondition := generateJoinCondition( + destPkg, structName, - fieldName, fieldTypeName, - )} + field.Name, fieldTypeName, + ) + + fields := getFields(structName) + if !pie.Any(fields, func(otherField Field) bool { + // TODO posible override? + return otherField.Name == field.Name+"ID" + }) { + return []jen.Code{ + joinCondition, + generateJoinCondition( + destPkg, + fieldTypeName, + // TODO Override Foreign Key + structName.Name(), structName, + ), + } + } + + return []jen.Code{joinCondition} } case *types.Pointer: return generateConditionForField( - srcPkg, destPkg, + destPkg, structName, - fieldName, fieldTypeTyped.Elem(), + Field{ + Name: field.Name, + Type: fieldTypeTyped.Elem(), + Tag: field.Tag, + }, param.Clone().Op("*"), ) // TODO @@ -201,7 +250,7 @@ func generateConditionForField(srcPkg *types.Package, destPkg, structName, field // TODO esto podria ser para cualquier embeded // TODO ver diferencia entre embeded de go y embeded de gorm -func generateBaseModelConditions(srcPkg *types.Package, destPkg, structName string, fieldType *types.Named) []jen.Code { +func generateBaseModelConditions(destPkg string, structName *types.TypeName, fieldType *types.Named) []jen.Code { structType, ok := fieldType.Underlying().(*types.Struct) if !ok { failErr(errors.New("unreacheable! base models are allways structs")) @@ -217,9 +266,13 @@ func generateBaseModelConditions(srcPkg *types.Package, destPkg, structName stri log.Println(field.Name()) conditions = append(conditions, generateConditionForField( - srcPkg, destPkg, + destPkg, structName, - field.Name(), field.Type(), + Field{ + Name: field.Name(), + Type: field.Type(), + // TODO ver como obtener los tags de los embeded + }, basicParam, )...) } @@ -247,13 +300,13 @@ var typeKindToJenStatement = map[types.BasicKind]func(*jen.Statement) *jen.State types.String: func(param *jen.Statement) *jen.Statement { return param.String() }, } -func generateWhereCondition(srcPkg *types.Package, destPkg, structName, fieldName string, param *jen.Statement) *jen.Statement { +func generateWhereCondition(destPkg string, structName *types.TypeName, fieldName string, param *jen.Statement) *jen.Statement { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, ).Types( jen.Qual( - getRelativePackagePath(srcPkg, destPkg), - structName, + getRelativePackagePath(structName.Pkg(), destPkg), + structName.Name(), ), ) @@ -274,12 +327,12 @@ func generateWhereCondition(srcPkg *types.Package, destPkg, structName, fieldNam ) } -func generateJoinCondition(srcPkg *types.Package, destPkg, structName, fieldName string, fieldTypeName *types.TypeName) *jen.Statement { +func generateJoinCondition(destPkg string, structName *types.TypeName, fieldName string, fieldTypeName *types.TypeName) *jen.Statement { log.Println(fieldTypeName.String()) t1 := jen.Qual( - getRelativePackagePath(srcPkg, destPkg), - structName, + getRelativePackagePath(structName.Pkg(), destPkg), + structName.Name(), ) t2 := jen.Qual( @@ -316,8 +369,8 @@ func generateJoinCondition(srcPkg *types.Package, destPkg, structName, fieldName ) } -func getConditionName(structName, fieldName string) string { - return strcase.ToPascal(structName) + strcase.ToPascal(fieldName) + badORMCondition +func getConditionName(structName *types.TypeName, fieldName string) string { + return strcase.ToPascal(structName.Name()) + strcase.ToPascal(fieldName) + badORMCondition } // TODO testear esto From 29ed9aa1b4fe4f8747c2a7dbe1e4d6eac4a77811 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 23 May 2023 16:36:02 +0200 Subject: [PATCH 202/467] add configurable version to badctl --- go.mod | 2 +- go.work.sum | 14 ++++++++++---- test_e2e/go.mod | 2 +- tools/badctl/cmd/gen/conditions.go | 3 ++- tools/badctl/cmd/root.go | 8 +++++--- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 5805db0e..575bb354 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/Masterminds/squirrel v1.5.3 github.com/ditrit/verdeter v0.4.0 github.com/elliotchance/pie/v2 v2.5.2 + github.com/ettle/strcase v0.1.1 github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/jackc/pgconn v1.13.0 @@ -26,7 +27,6 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/ettle/strcase v0.1.1 github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/goph/emperror v0.17.2 // indirect diff --git a/go.work.sum b/go.work.sum index 4914804d..b286f9c0 100644 --- a/go.work.sum +++ b/go.work.sum @@ -156,8 +156,11 @@ github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+ github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= @@ -184,6 +187,7 @@ github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3K github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -250,6 +254,7 @@ github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= @@ -265,15 +270,19 @@ github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSg github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= @@ -308,8 +317,6 @@ golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -409,8 +416,6 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= @@ -521,6 +526,7 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/test_e2e/go.mod b/test_e2e/go.mod index 6a229dac..949db584 100644 --- a/test_e2e/go.mod +++ b/test_e2e/go.mod @@ -5,6 +5,7 @@ go 1.18 require ( github.com/Masterminds/squirrel v1.5.3 github.com/cucumber/godog v0.12.5 + github.com/cucumber/messages-go/v16 v16.0.1 github.com/ditrit/verdeter v0.4.0 github.com/google/uuid v1.3.0 github.com/gorilla/handlers v1.5.1 @@ -30,7 +31,6 @@ require ( github.com/felixge/httpsnoop v1.0.1 // indirect golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect - github.com/cucumber/messages-go/v16 v16.0.1 github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/gofrs/uuid v4.0.0+incompatible // indirect diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 5abd34be..c4d81a6a 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -9,6 +9,7 @@ import ( "strings" "github.com/dave/jennifer/jen" + "github.com/ditrit/badaas/tools/badctl/cmd/version" "github.com/ditrit/verdeter" "github.com/elliotchance/pie/v2" "github.com/ettle/strcase" @@ -106,7 +107,7 @@ func generate(destPkg string, structName *types.TypeName) error { // Add a package comment, so IDEs detect files as generated // TODO version configurable - f.PackageComment("Code generated by badctl v0.0.0, DO NOT EDIT.") + f.PackageComment("Code generated by badctl v" + version.Version + ", DO NOT EDIT.") for _, field := range fields { log.Println(field.Name) diff --git a/tools/badctl/cmd/root.go b/tools/badctl/cmd/root.go index 7ff26e65..c95f14e4 100644 --- a/tools/badctl/cmd/root.go +++ b/tools/badctl/cmd/root.go @@ -2,14 +2,16 @@ package cmd import ( "github.com/ditrit/badaas/tools/badctl/cmd/gen" + "github.com/ditrit/badaas/tools/badctl/cmd/version" "github.com/ditrit/verdeter" ) // rootCmd represents the base command when called without any subcommands var rootCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ - Use: "badctl", - Short: "the BadAas controller", - Long: `badctl is the command line tool that makes it possible to configure and run your BadAas applications easily.`, + Use: "badctl", + Short: "the BadAas controller", + Long: `badctl is the command line tool that makes it possible to configure and run your BadAas applications easily.`, + Version: version.Version, }) // Execute adds all child commands to the root command and sets flags appropriately. From fd6bb5851afed3352c94882f353f4b2d1d708f12 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 23 May 2023 16:50:33 +0200 Subject: [PATCH 203/467] autogenerate inverse condition for slices --- testintegration/company_conditions.go | 6 ++++++ testintegration/models.go | 7 ------- tools/badctl/cmd/gen/conditions.go | 21 ++++++++++++++++++--- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/testintegration/company_conditions.go b/testintegration/company_conditions.go index 0fa9a3aa..b5b78c3c 100644 --- a/testintegration/company_conditions.go +++ b/testintegration/company_conditions.go @@ -31,3 +31,9 @@ func CompanyNameCondition(v string) badorm.WhereCondition[Company] { Value: v, } } +func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { + return badorm.JoinCondition[Seller, Company]{ + Conditions: conditions, + Field: "company", + } +} diff --git a/testintegration/models.go b/testintegration/models.go index dd3cccfb..00818600 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -56,13 +56,6 @@ type Sale struct { SellerID *uuid.UUID } -func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { - return badorm.JoinCondition[Seller, Company]{ - Field: "company", - Conditions: conditions, - } -} - func (m Product) Equal(other Product) bool { return m.ID == other.ID } diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index c4d81a6a..35967698 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -238,9 +238,24 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field }, param.Clone().Op("*"), ) - // TODO - // case *types.Slice: - // log.Printf("slices not supported yet: %s.%s", structTypeName, field.Name()) + case *types.Slice: + elemType := fieldTypeTyped.Elem() + elemTypeTyped, ok := elemType.(*types.Named) + if !ok { + // TODO ver que pasa si quiero guardar una list de strings o algo asi + return []jen.Code{} + } + + elemTypeName := elemTypeTyped.Obj() + log.Println(elemTypeName.Name()) + return []jen.Code{ + generateJoinCondition( + destPkg, + elemTypeName, + // TODO Override Foreign Key + structName.Name(), structName, + ), + } default: log.Printf("struct field type not hanled: %T", fieldTypeTyped) } From 4536e72792cb2fe91de37a580feae5725de5e15c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 09:52:00 +0200 Subject: [PATCH 204/467] verify that named relation is badorm model --- tools/badctl/cmd/gen/conditions.go | 40 ++++++++++++++++++------------ 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 35967698..529bd2ee 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -124,27 +124,34 @@ func generate(destPkg string, structName *types.TypeName) error { } func getFields(structName *types.TypeName) []Field { + fields := []Field{} + // Generate only when underlying type is a struct // (ignore const, var, func, etc.) - structType, ok := structName.Type().Underlying().(*types.Struct) - if !ok || !isBadORMModel(structType) { - return nil + structType := getBadORMModelStruct(structName) + if structType != nil { + // Iterate over struct fields + for i := 0; i < structType.NumFields(); i++ { + field := structType.Field(i) + fields = append(fields, Field{ + Name: field.Name(), + Type: field.Type(), + // TODO verificar que pasa si hay menos tags, osea que algunos atributos no tienen tags + Tag: structType.Tag(i), + }) + } } - fields := []Field{} + return fields +} - // Iterate over struct fields - for i := 0; i < structType.NumFields(); i++ { - field := structType.Field(i) - fields = append(fields, Field{ - Name: field.Name(), - Type: field.Type(), - // TODO verificar que pasa si hay menos tags, osea que algunos atributos no tienen tags - Tag: structType.Tag(i), - }) +func getBadORMModelStruct(structName *types.TypeName) *types.Struct { + structType, ok := structName.Type().Underlying().(*types.Struct) + if !ok || !isBadORMModel(structType) { + return nil } - return fields + return structType } func isBadORMModel(structType *types.Struct) bool { @@ -201,8 +208,9 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field fieldTypeName.Name(), ), )} - // TODO DeletedAt - } else if fieldTypeTyped.String() != "gorm.io/gorm.DeletedAt" { + // TODO DeletedAt fieldTypeTyped.String() == "gorm.io/gorm.DeletedAt" + } else if getBadORMModelStruct(fieldTypeName) != nil { + // TODO que pasa si esta en otro package? se importa solo? joinCondition := generateJoinCondition( destPkg, structName, From 44674b18809541027ea7b3c36d604fd9f22e7fcc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 10:28:14 +0200 Subject: [PATCH 205/467] verify badorm model in lists --- tools/badctl/cmd/gen/conditions.go | 36 +++++++++++++++++------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 529bd2ee..4f9ede43 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -199,15 +199,17 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field ) // TODO UUID tambien tiene que generar el join si otro no lo genera } else if fieldTypeName.Name() == "UUID" || fieldTypeTyped.String() == "time.Time" { - return []jen.Code{generateWhereCondition( - destPkg, - structName, - field.Name, - param.Clone().Qual( - getRelativePackagePath(fieldTypeName.Pkg(), destPkg), - fieldTypeName.Name(), + return []jen.Code{ + generateWhereCondition( + destPkg, + structName, + field.Name, + param.Clone().Qual( + getRelativePackagePath(fieldTypeName.Pkg(), destPkg), + fieldTypeName.Name(), + ), ), - )} + } // TODO DeletedAt fieldTypeTyped.String() == "gorm.io/gorm.DeletedAt" } else if getBadORMModelStruct(fieldTypeName) != nil { // TODO que pasa si esta en otro package? se importa solo? @@ -255,14 +257,16 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field } elemTypeName := elemTypeTyped.Obj() - log.Println(elemTypeName.Name()) - return []jen.Code{ - generateJoinCondition( - destPkg, - elemTypeName, - // TODO Override Foreign Key - structName.Name(), structName, - ), + if getBadORMModelStruct(elemTypeName) != nil { + log.Println(elemTypeName.Name()) + return []jen.Code{ + generateJoinCondition( + destPkg, + elemTypeName, + // TODO Override Foreign Key + structName.Name(), structName, + ), + } } default: log.Printf("struct field type not hanled: %T", fieldTypeTyped) From f52d8528b6192b4f5dd6f57767e23a98a48136cc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 11:08:13 +0200 Subject: [PATCH 206/467] support lists of basic types (only works for []byte because of gorm) --- badorm/condition.go | 12 +++++- testintegration/crudService.go | 58 +++++++++++++++++++++++++++ testintegration/models.go | 9 +++-- testintegration/product_conditions.go | 6 +++ tools/badctl/cmd/gen/conditions.go | 44 ++++++++++++-------- 5 files changed, 108 insertions(+), 21 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 4f66f38f..85d5311c 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -4,6 +4,7 @@ import ( "fmt" "reflect" + "github.com/elliotchance/pie/v2" "github.com/ettle/strcase" "gorm.io/gorm" ) @@ -38,10 +39,19 @@ func (condition WhereCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*g ), nil } +var nullableKinds = []reflect.Kind{ + reflect.Chan, reflect.Func, + reflect.Map, reflect.Pointer, + reflect.UnsafePointer, reflect.Interface, + reflect.Slice, +} + func (condition WhereCondition[T]) GetSQL(tableName string) (string, []any) { val := condition.Value + reflectVal := reflect.ValueOf(val) + isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) // avoid nil is not nil behavior of go - if val == nil || (reflect.ValueOf(val).Kind() == reflect.Ptr && reflect.ValueOf(val).IsNil()) { + if val == nil || (isNullableKind && reflectVal.IsNil()) { return fmt.Sprintf( "%s.%s IS NULL", tableName, diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 60534030..79830ece 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -252,6 +252,64 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeByNi EqualList(&ts.Suite, []*Product{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayWithContent() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + match.ByteArray = []byte{1, 2} + notMatch1.ByteArray = []byte{2, 3} + + err := ts.db.Save(match).Error + ts.Nil(err) + + err = ts.db.Save(notMatch1).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + ProductByteArrayCondition([]byte{1, 2}), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayEmpty() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + match.ByteArray = []byte{} + notMatch1.ByteArray = []byte{2, 3} + + err := ts.db.Save(match).Error + ts.Nil(err) + + err = ts.db.Save(notMatch1).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + ProductByteArrayCondition([]byte{}), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + notMatch1.ByteArray = []byte{2, 3} + + err := ts.db.Save(notMatch1).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + ProductByteArrayCondition(nil), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { product1 := ts.createProduct("", 0, 0.0, false, nil) product2 := ts.createProduct("", 0, 0.0, false, nil) diff --git a/testintegration/models.go b/testintegration/models.go index 00818600..a700d749 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -32,6 +32,11 @@ type Product struct { IntPointer *int Float float64 Bool bool + ByteArray []byte +} + +func (m Product) Equal(other Product) bool { + return m.ID == other.ID } type Seller struct { @@ -56,10 +61,6 @@ type Sale struct { SellerID *uuid.UUID } -func (m Product) Equal(other Product) bool { - return m.ID == other.ID -} - func (m Sale) Equal(other Sale) bool { return m.ID == other.ID } diff --git a/testintegration/product_conditions.go b/testintegration/product_conditions.go index ad1ca759..78d64843 100644 --- a/testintegration/product_conditions.go +++ b/testintegration/product_conditions.go @@ -55,3 +55,9 @@ func ProductBoolCondition(v bool) badorm.WhereCondition[Product] { Value: v, } } +func ProductByteArrayCondition(v []uint8) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "byte_array", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 4f9ede43..d525e10d 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -250,23 +250,35 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field ) case *types.Slice: elemType := fieldTypeTyped.Elem() - elemTypeTyped, ok := elemType.(*types.Named) - if !ok { - // TODO ver que pasa si quiero guardar una list de strings o algo asi - return []jen.Code{} - } - - elemTypeName := elemTypeTyped.Obj() - if getBadORMModelStruct(elemTypeName) != nil { - log.Println(elemTypeName.Name()) - return []jen.Code{ - generateJoinCondition( - destPkg, - elemTypeName, - // TODO Override Foreign Key - structName.Name(), structName, - ), + switch elemTypeTyped := elemType.(type) { + case *types.Basic: + // una list de strings o algo asi + return generateConditionForField( + destPkg, + structName, + Field{ + Name: field.Name, + Type: elemTypeTyped, + Tag: field.Tag, + }, + param.Clone().Index(), + ) + case *types.Named: + elemTypeName := elemTypeTyped.Obj() + if getBadORMModelStruct(elemTypeName) != nil { + log.Println(elemTypeName.Name()) + return []jen.Code{ + generateJoinCondition( + destPkg, + elemTypeName, + // TODO Override Foreign Key + structName.Name(), structName, + ), + } } + // TODO tambien pueden ser pointers + default: + log.Printf("struct field list elem type not hanled: %T", elemTypeTyped) } default: log.Printf("struct field type not hanled: %T", fieldTypeTyped) From 0163063d249ff6e96d5659deff81a1feab01f38d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 12:09:49 +0200 Subject: [PATCH 207/467] add gorm custom types support --- testintegration/crudService.go | 21 +++++++++++ testintegration/models.go | 39 ++++++++++++++++--- testintegration/product_conditions.go | 6 +++ tools/badctl/cmd/gen/conditions.go | 54 ++++++++++++++++++++++----- 4 files changed, 105 insertions(+), 15 deletions(-) diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 79830ece..9a208cdf 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -310,6 +310,27 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() EqualList(&ts.Suite, []*Product{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + match.MultiString = MultiString{"salut", "hola"} + notMatch1.MultiString = MultiString{"salut", "hola", "hello"} + + err := ts.db.Save(match).Error + ts.Nil(err) + + err = ts.db.Save(notMatch1).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + ProductMultiStringCondition(MultiString{"salut", "hola"}), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { product1 := ts.createProduct("", 0, 0.0, false, nil) product2 := ts.createProduct("", 0, 0.0, false, nil) diff --git a/testintegration/models.go b/testintegration/models.go index a700d749..10c54bc3 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -1,6 +1,10 @@ package testintegration import ( + "database/sql/driver" + "errors" + "strings" + "github.com/ditrit/badaas/badorm" "github.com/google/uuid" ) @@ -24,15 +28,38 @@ type Company struct { Sellers []Seller // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } +type MultiString []string + +func (s *MultiString) Scan(src interface{}) error { + str, ok := src.(string) + if !ok { + return errors.New("failed to scan multistring field - source is not a string") + } + *s = strings.Split(str, ",") + return nil +} + +func (s MultiString) Value() (driver.Value, error) { + if len(s) == 0 { + return nil, nil + } + return strings.Join(s, ","), nil +} + +func (MultiString) GormDataType() string { + return "text" +} + type Product struct { badorm.UUIDModel - String string - Int int - IntPointer *int - Float float64 - Bool bool - ByteArray []byte + String string + Int int + IntPointer *int + Float float64 + Bool bool + ByteArray []byte + MultiString MultiString } func (m Product) Equal(other Product) bool { diff --git a/testintegration/product_conditions.go b/testintegration/product_conditions.go index 78d64843..a3f9d4b0 100644 --- a/testintegration/product_conditions.go +++ b/testintegration/product_conditions.go @@ -61,3 +61,9 @@ func ProductByteArrayCondition(v []uint8) badorm.WhereCondition[Product] { Value: v, } } +func ProductMultiStringCondition(v MultiString) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "multi_string", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index d525e10d..c0532534 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -6,6 +6,7 @@ import ( "go/types" "log" "os" + "regexp" "strings" "github.com/dave/jennifer/jen" @@ -183,12 +184,14 @@ func addConditionForField(f *jen.File, destPkg string, structName *types.TypeNam func generateConditionForField(destPkg string, structName *types.TypeName, field Field, param *jen.Statement) []jen.Code { switch fieldTypeTyped := field.Type.(type) { case *types.Basic: - return []jen.Code{generateWhereCondition( - destPkg, - structName, - field.Name, - typeKindToJenStatement[fieldTypeTyped.Kind()](param), - )} + return []jen.Code{ + generateWhereCondition( + destPkg, + structName, + field.Name, + typeKindToJenStatement[fieldTypeTyped.Kind()](param), + ), + } case *types.Named: fieldTypeName := fieldTypeTyped.Obj() if pie.Contains(badORMModels, fieldTypeName.Name()) { @@ -210,7 +213,6 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field ), ), } - // TODO DeletedAt fieldTypeTyped.String() == "gorm.io/gorm.DeletedAt" } else if getBadORMModelStruct(fieldTypeName) != nil { // TODO que pasa si esta en otro package? se importa solo? joinCondition := generateJoinCondition( @@ -236,6 +238,21 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field } return []jen.Code{joinCondition} + // TODO DeletedAt + } else if isGormCustomType(fieldTypeTyped) && fieldTypeTyped.String() != "gorm.io/gorm.DeletedAt" { + return []jen.Code{ + generateWhereCondition( + destPkg, + structName, + field.Name, + param.Qual( + getRelativePackagePath(structName.Pkg(), destPkg), + fieldTypeName.Name(), + ), + ), + } + } else { + log.Printf("struct field type not handled: %s", fieldTypeTyped.String()) } case *types.Pointer: return generateConditionForField( @@ -278,16 +295,35 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field } // TODO tambien pueden ser pointers default: - log.Printf("struct field list elem type not hanled: %T", elemTypeTyped) + log.Printf("struct field list elem type not handled: %T", elemTypeTyped) } default: - log.Printf("struct field type not hanled: %T", fieldTypeTyped) + log.Printf("struct field type not handled: %T", fieldTypeTyped) } // TODO ver este error return []jen.Code{} } +var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) +var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) + +func isGormCustomType(typeNamed *types.Named) bool { + hasScanMethod := false + hasValueMethod := false + for i := 0; i < typeNamed.NumMethods(); i++ { + methodSignature := typeNamed.Method(i).String() + + if !hasScanMethod && scanMethod.MatchString(methodSignature) { + hasScanMethod = true + } else if !hasValueMethod && valueMethod.MatchString(methodSignature) { + hasValueMethod = true + } + } + + return hasScanMethod && hasValueMethod +} + // TODO esto podria ser para cualquier embeded // TODO ver diferencia entre embeded de go y embeded de gorm func generateBaseModelConditions(destPkg string, structName *types.TypeName, fieldType *types.Named) []jen.Code { From d253da2dcb48c2911b1a9927a4cd3f1e87c12bcf Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 12:16:26 +0200 Subject: [PATCH 208/467] join similar branches --- tools/badctl/cmd/gen/conditions.go | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index c0532534..351c9f67 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -200,19 +200,6 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field structName, fieldTypeTyped, ) - // TODO UUID tambien tiene que generar el join si otro no lo genera - } else if fieldTypeName.Name() == "UUID" || fieldTypeTyped.String() == "time.Time" { - return []jen.Code{ - generateWhereCondition( - destPkg, - structName, - field.Name, - param.Clone().Qual( - getRelativePackagePath(fieldTypeName.Pkg(), destPkg), - fieldTypeName.Name(), - ), - ), - } } else if getBadORMModelStruct(fieldTypeName) != nil { // TODO que pasa si esta en otro package? se importa solo? joinCondition := generateJoinCondition( @@ -239,14 +226,14 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field return []jen.Code{joinCondition} // TODO DeletedAt - } else if isGormCustomType(fieldTypeTyped) && fieldTypeTyped.String() != "gorm.io/gorm.DeletedAt" { + } else if (isGormCustomType(fieldTypeTyped) || fieldTypeTyped.String() == "time.Time") && fieldTypeTyped.String() != "gorm.io/gorm.DeletedAt" { return []jen.Code{ generateWhereCondition( destPkg, structName, field.Name, - param.Qual( - getRelativePackagePath(structName.Pkg(), destPkg), + param.Clone().Qual( + getRelativePackagePath(fieldTypeName.Pkg(), destPkg), fieldTypeName.Name(), ), ), From 8eb5a66173594a8dd7a9651ed73609e36e284309 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 12:33:05 +0200 Subject: [PATCH 209/467] support slice of pointers --- tools/badctl/cmd/gen/conditions.go | 78 ++++++++++++++++++------------ 1 file changed, 47 insertions(+), 31 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 351c9f67..9a9c40f4 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -253,37 +253,11 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field param.Clone().Op("*"), ) case *types.Slice: - elemType := fieldTypeTyped.Elem() - switch elemTypeTyped := elemType.(type) { - case *types.Basic: - // una list de strings o algo asi - return generateConditionForField( - destPkg, - structName, - Field{ - Name: field.Name, - Type: elemTypeTyped, - Tag: field.Tag, - }, - param.Clone().Index(), - ) - case *types.Named: - elemTypeName := elemTypeTyped.Obj() - if getBadORMModelStruct(elemTypeName) != nil { - log.Println(elemTypeName.Name()) - return []jen.Code{ - generateJoinCondition( - destPkg, - elemTypeName, - // TODO Override Foreign Key - structName.Name(), structName, - ), - } - } - // TODO tambien pueden ser pointers - default: - log.Printf("struct field list elem type not handled: %T", elemTypeTyped) - } + return generateConditionForSlice( + destPkg, structName, + field, fieldTypeTyped.Elem(), + param.Clone().Index(), + ) default: log.Printf("struct field type not handled: %T", fieldTypeTyped) } @@ -292,6 +266,48 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field return []jen.Code{} } +func generateConditionForSlice(destPkg string, structName *types.TypeName, field Field, elemType types.Type, param *jen.Statement) []jen.Code { + switch elemTypeTyped := elemType.(type) { + case *types.Basic: + // una list de strings o algo asi + return generateConditionForField( + destPkg, + structName, + Field{ + Name: field.Name, + Type: elemTypeTyped, + Tag: field.Tag, + }, + param, + ) + case *types.Named: + elemTypeName := elemTypeTyped.Obj() + // inverse relation condition + if getBadORMModelStruct(elemTypeName) != nil { + log.Println(elemTypeName.Name()) + return []jen.Code{ + generateJoinCondition( + destPkg, + elemTypeName, + // TODO Override Foreign Key + structName.Name(), structName, + ), + } + } + case *types.Pointer: + // slice de pointers, solo testeado temporalmente porque despues gorm no lo soporta + return generateConditionForSlice( + destPkg, structName, + field, elemTypeTyped.Elem(), + param.Op("*"), + ) + default: + log.Printf("struct field list elem type not handled: %T", elemTypeTyped) + } + + return []jen.Code{} +} + var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) From 982a2e9f6f87f53b5e453af7660fcdd43b3de27d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 13:26:46 +0200 Subject: [PATCH 210/467] add test to check that pq arrays work --- go.mod | 1 + testintegration/crudService.go | 22 ++++++++++++++++++++++ testintegration/models.go | 2 ++ testintegration/product_conditions.go | 7 +++++++ 4 files changed, 32 insertions(+) diff --git a/go.mod b/go.mod index 575bb354..5190bdb8 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/jackc/pgconn v1.13.0 + github.com/lib/pq v1.10.2 github.com/magiconair/properties v1.8.6 github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61 github.com/spf13/cobra v1.5.0 diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 9a208cdf..1407f931 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -3,6 +3,7 @@ package testintegration import ( "github.com/ditrit/badaas/badorm" "github.com/google/uuid" + "github.com/lib/pq" "github.com/stretchr/testify/suite" "go.uber.org/zap" "gorm.io/gorm" @@ -310,6 +311,27 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() EqualList(&ts.Suite, []*Product{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPQArray() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + match.StringArray = pq.StringArray{"salut", "hola"} + notMatch1.StringArray = pq.StringArray{"salut", "hola", "hello"} + + err := ts.db.Save(match).Error + ts.Nil(err) + + err = ts.db.Save(notMatch1).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + ProductStringArrayCondition(pq.StringArray{"salut", "hola"}), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { match := ts.createProduct("match", 1, 0, false, nil) notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) diff --git a/testintegration/models.go b/testintegration/models.go index 10c54bc3..c2746791 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -7,6 +7,7 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/google/uuid" + "github.com/lib/pq" ) // TODO gorm @@ -60,6 +61,7 @@ type Product struct { Bool bool ByteArray []byte MultiString MultiString + StringArray pq.StringArray `gorm:"type:text[]"` } func (m Product) Equal(other Product) bool { diff --git a/testintegration/product_conditions.go b/testintegration/product_conditions.go index a3f9d4b0..cfe97ad3 100644 --- a/testintegration/product_conditions.go +++ b/testintegration/product_conditions.go @@ -4,6 +4,7 @@ package testintegration import ( badorm "github.com/ditrit/badaas/badorm" uuid "github.com/google/uuid" + pq "github.com/lib/pq" "time" ) @@ -67,3 +68,9 @@ func ProductMultiStringCondition(v MultiString) badorm.WhereCondition[Product] { Value: v, } } +func ProductStringArrayCondition(v pq.StringArray) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "string_array", + Value: v, + } +} From 494636a6fe98a96ee0788e1b59d7ee615cfdd07d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 14:31:58 +0200 Subject: [PATCH 211/467] support any embedded struct --- testintegration/crudService.go | 16 +++ testintegration/models.go | 8 +- testintegration/product_conditions.go | 6 + tools/badctl/cmd/gen/conditions.go | 171 +++++++++++++------------- 4 files changed, 113 insertions(+), 88 deletions(-) diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 1407f931..c842ca6e 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -225,6 +225,22 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { EqualList(&ts.Suite, []*Product{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) + match.EmbeddedInt = 1 + + err := ts.db.Save(match).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + ProductEmbeddedIntCondition(1), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWithValue() { intMatch := 1 match := ts.createProduct("match", 1, 0, false, &intMatch) diff --git a/testintegration/models.go b/testintegration/models.go index c2746791..c5c4aa66 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -19,9 +19,6 @@ import ( // haya embeded que tambien tengan su propia tabla // haya cosas en el modelo que no van a terminar en una tabla, que son solo clases para llamar a metodos y eso -// podria meter alguna anotacion para que esa si vaya a modelos? -// directamente las clases que tienen un base model metido adentro son las que quiero - type Company struct { badorm.UUIDModel @@ -51,6 +48,10 @@ func (MultiString) GormDataType() string { return "text" } +type ToBeEmbedded struct { + EmbeddedInt int +} + type Product struct { badorm.UUIDModel @@ -62,6 +63,7 @@ type Product struct { ByteArray []byte MultiString MultiString StringArray pq.StringArray `gorm:"type:text[]"` + ToBeEmbedded } func (m Product) Equal(other Product) bool { diff --git a/testintegration/product_conditions.go b/testintegration/product_conditions.go index cfe97ad3..2b60d8b3 100644 --- a/testintegration/product_conditions.go +++ b/testintegration/product_conditions.go @@ -74,3 +74,9 @@ func ProductStringArrayCondition(v pq.StringArray) badorm.WhereCondition[Product Value: v, } } +func ProductEmbeddedIntCondition(v int) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "embedded_int", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 9a9c40f4..3aa3639e 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -60,7 +60,7 @@ func generateConditions(cmd *cobra.Command, args []string) { log.Println(name) // Generate code using jennifer - err := generate( + err := generateConditionsFile( destPkg, structName, ) @@ -91,14 +91,21 @@ func getTypeName(pkg *packages.Package, name string) *types.TypeName { // TODO add logs type Field struct { - Name string - Type types.Type - Tag string + Name string + Type types.Type + Tag string + Embedded bool } -func generate(destPkg string, structName *types.TypeName) error { - // Iterate over struct fields - fields := getFields(structName) +func generateConditionsFile(destPkg string, structName *types.TypeName) error { + // Generate only when underlying type is a struct + // (ignore const, var, func, etc.) + structType := getBadORMModelStruct(structName) + if structType == nil { + return nil + } + + fields := getFields(structType) if len(fields) == 0 { return nil } @@ -107,45 +114,14 @@ func generate(destPkg string, structName *types.TypeName) error { f := jen.NewFile(destPkg) // Add a package comment, so IDEs detect files as generated - // TODO version configurable f.PackageComment("Code generated by badctl v" + version.Version + ", DO NOT EDIT.") - for _, field := range fields { - log.Println(field.Name) - addConditionForField( - f, - destPkg, - structName, - field, - ) - } + addConditionForEachField(f, fields, destPkg, structName) // Write generated file return f.Save(strings.ToLower(structName.Name()) + "_conditions.go") } -func getFields(structName *types.TypeName) []Field { - fields := []Field{} - - // Generate only when underlying type is a struct - // (ignore const, var, func, etc.) - structType := getBadORMModelStruct(structName) - if structType != nil { - // Iterate over struct fields - for i := 0; i < structType.NumFields(); i++ { - field := structType.Field(i) - fields = append(fields, Field{ - Name: field.Name(), - Type: field.Type(), - // TODO verificar que pasa si hay menos tags, osea que algunos atributos no tienen tags - Tag: structType.Tag(i), - }) - } - } - - return fields -} - func getBadORMModelStruct(structName *types.TypeName) *types.Struct { structType, ok := structName.Type().Underlying().(*types.Struct) if !ok || !isBadORMModel(structType) { @@ -167,10 +143,70 @@ func isBadORMModel(structType *types.Struct) bool { return false } +func getFields(structType *types.Struct) []Field { + fields := []Field{} + + // Iterate over struct fields + for i := 0; i < structType.NumFields(); i++ { + field := structType.Field(i) + fields = append(fields, Field{ + Name: field.Name(), + Type: field.Type(), + // TODO verificar que pasa si hay menos tags, osea que algunos atributos no tienen tags + Tag: structType.Tag(i), + Embedded: field.Embedded(), + }) + } + + return fields +} + +func addConditionForEachField(f *jen.File, fields []Field, destPkg string, structName *types.TypeName) { + for _, field := range fields { + log.Println(field.Name) + if field.Embedded { + addEmbeddedConditions( + f, + destPkg, + structName, + field, + ) + } else { + addConditionsForField( + f, + destPkg, + structName, + field, + ) + } + } +} + +// TODO ver diferencia entre embeded de go y embeded de gorm +func addEmbeddedConditions(f *jen.File, destPkg string, structName *types.TypeName, field Field) { + embededFieldType, ok := field.Type.(*types.Named) + if !ok { + failErr(errors.New("unreacheable! embeddeds are allways of type Named")) + } + embededStructType, ok := embededFieldType.Underlying().(*types.Struct) + if !ok { + failErr(errors.New("unreacheable! embeddeds are allways structs")) + } + + addConditionForEachField( + f, + getFields(embededStructType), + destPkg, + structName, + ) +} + var basicParam = jen.Id("v") -func addConditionForField(f *jen.File, destPkg string, structName *types.TypeName, field Field) { - conditions := generateConditionForField( +// TODO pasar typeName a object para que todo sea mas claro + +func addConditionsForField(f *jen.File, destPkg string, structName *types.TypeName, field Field) { + conditions := generateConditionsForField( destPkg, structName, field, basicParam.Clone(), @@ -181,7 +217,7 @@ func addConditionForField(f *jen.File, destPkg string, structName *types.TypeNam } } -func generateConditionForField(destPkg string, structName *types.TypeName, field Field, param *jen.Statement) []jen.Code { +func generateConditionsForField(destPkg string, structName *types.TypeName, field Field, param *jen.Statement) []jen.Code { switch fieldTypeTyped := field.Type.(type) { case *types.Basic: return []jen.Code{ @@ -194,13 +230,8 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field } case *types.Named: fieldTypeName := fieldTypeTyped.Obj() - if pie.Contains(badORMModels, fieldTypeName.Name()) { - return generateBaseModelConditions( - destPkg, - structName, - fieldTypeTyped, - ) - } else if getBadORMModelStruct(fieldTypeName) != nil { + fieldModelStruct := getBadORMModelStruct(fieldTypeName) + if fieldModelStruct != nil { // TODO que pasa si esta en otro package? se importa solo? joinCondition := generateJoinCondition( destPkg, @@ -208,7 +239,8 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field field.Name, fieldTypeName, ) - fields := getFields(structName) + // inversed join condition + fields := getFields(getBadORMModelStruct(structName)) if !pie.Any(fields, func(otherField Field) bool { // TODO posible override? return otherField.Name == field.Name+"ID" @@ -242,7 +274,7 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field log.Printf("struct field type not handled: %s", fieldTypeTyped.String()) } case *types.Pointer: - return generateConditionForField( + return generateConditionsForField( destPkg, structName, Field{ @@ -269,8 +301,9 @@ func generateConditionForField(destPkg string, structName *types.TypeName, field func generateConditionForSlice(destPkg string, structName *types.TypeName, field Field, elemType types.Type, param *jen.Statement) []jen.Code { switch elemTypeTyped := elemType.(type) { case *types.Basic: - // una list de strings o algo asi - return generateConditionForField( + // una list de strings o algo asi, + // por el momento solo anda con []byte porque el resto gorm no lo sabe encodear + return generateConditionsForField( destPkg, structName, Field{ @@ -327,38 +360,6 @@ func isGormCustomType(typeNamed *types.Named) bool { return hasScanMethod && hasValueMethod } -// TODO esto podria ser para cualquier embeded -// TODO ver diferencia entre embeded de go y embeded de gorm -func generateBaseModelConditions(destPkg string, structName *types.TypeName, fieldType *types.Named) []jen.Code { - structType, ok := fieldType.Underlying().(*types.Struct) - if !ok { - failErr(errors.New("unreacheable! base models are allways structs")) - } - log.Println(structType.String()) - - conditions := []jen.Code{} - - // Iterate over struct fields - // TODO codigo repetido - for i := 0; i < structType.NumFields(); i++ { - field := structType.Field(i) - - log.Println(field.Name()) - conditions = append(conditions, generateConditionForField( - destPkg, - structName, - Field{ - Name: field.Name(), - Type: field.Type(), - // TODO ver como obtener los tags de los embeded - }, - basicParam, - )...) - } - - return conditions -} - var typeKindToJenStatement = map[types.BasicKind]func(*jen.Statement) *jen.Statement{ types.Bool: func(param *jen.Statement) *jen.Statement { return param.Bool() }, types.Int: func(param *jen.Statement) *jen.Statement { return param.Int() }, From 0180ac3689959caf786681512bda678bd21195ea Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 15:38:01 +0200 Subject: [PATCH 212/467] support gorm embedded tag --- testintegration/crudService.go | 16 ++++++ testintegration/models.go | 14 +++--- testintegration/product_conditions.go | 6 +++ tools/badctl/cmd/gen/conditions.go | 72 ++++++++++++++++++++++----- tools/badctl/go.mod | 1 + tools/badctl/go.sum | 2 + 6 files changed, 92 insertions(+), 19 deletions(-) diff --git a/testintegration/crudService.go b/testintegration/crudService.go index c842ca6e..d3bb576c 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -241,6 +241,22 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { EqualList(&ts.Suite, []*Product{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfGormEmbedded() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) + match.GormEmbedded.Int = 1 + + err := ts.db.Save(match).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + ProductGormEmbeddedIntCondition(1), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*Product{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWithValue() { intMatch := 1 match := ts.createProduct("match", 1, 0, false, &intMatch) diff --git a/testintegration/models.go b/testintegration/models.go index c5c4aa66..bb7b0132 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -10,14 +10,11 @@ import ( "github.com/lib/pq" ) +// TODO testear tambien en otras bases de datos + // TODO gorm // column -// embedded -// embeddedPrefix -// todas las clases tienen sus conditions, repository and service menos las que esten embeded en otras -// aunque tambien podria ser que: -// haya embeded que tambien tengan su propia tabla -// haya cosas en el modelo que no van a terminar en una tabla, que son solo clases para llamar a metodos y eso +// todas las clases badorm tienen sus conditions, repository and service type Company struct { badorm.UUIDModel @@ -52,6 +49,10 @@ type ToBeEmbedded struct { EmbeddedInt int } +type ToBeGormEmbedded struct { + Int int +} + type Product struct { badorm.UUIDModel @@ -64,6 +65,7 @@ type Product struct { MultiString MultiString StringArray pq.StringArray `gorm:"type:text[]"` ToBeEmbedded + GormEmbedded ToBeGormEmbedded `gorm:"embedded;embeddedPrefix:gorm_embedded_"` } func (m Product) Equal(other Product) bool { diff --git a/testintegration/product_conditions.go b/testintegration/product_conditions.go index 2b60d8b3..fb72f12e 100644 --- a/testintegration/product_conditions.go +++ b/testintegration/product_conditions.go @@ -80,3 +80,9 @@ func ProductEmbeddedIntCondition(v int) badorm.WhereCondition[Product] { Value: v, } } +func ProductGormEmbeddedIntCondition(v int) badorm.WhereCondition[Product] { + return badorm.WhereCondition[Product]{ + Field: "gorm_embedded_int", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 3aa3639e..52658ca7 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -14,6 +14,7 @@ import ( "github.com/ditrit/verdeter" "github.com/elliotchance/pie/v2" "github.com/ettle/strcase" + "github.com/fatih/structtag" "github.com/spf13/cobra" "golang.org/x/tools/go/packages" @@ -90,11 +91,27 @@ func getTypeName(pkg *packages.Package, name string) *types.TypeName { // TODO add logs +type GormTags map[string]string + +func (tags GormTags) getEmbeddedPrefix() string { + embeddedPrefix, isPresent := tags["embeddedPrefix"] + if !isPresent { + return "" + } + + return embeddedPrefix +} + +func (tags GormTags) hasEmbedded() bool { + _, isPresent := tags["embedded"] + return isPresent +} + type Field struct { Name string Type types.Type - Tag string Embedded bool + Tags GormTags } func generateConditionsFile(destPkg string, structName *types.TypeName) error { @@ -105,7 +122,7 @@ func generateConditionsFile(destPkg string, structName *types.TypeName) error { return nil } - fields := getFields(structType) + fields := getFields(structType, "") if len(fields) == 0 { return nil } @@ -143,24 +160,50 @@ func isBadORMModel(structType *types.Struct) bool { return false } -func getFields(structType *types.Struct) []Field { +func getFields(structType *types.Struct, prefix string) []Field { fields := []Field{} // Iterate over struct fields for i := 0; i < structType.NumFields(); i++ { field := structType.Field(i) + gormTags := getGormTags(structType.Tag(i)) fields = append(fields, Field{ - Name: field.Name(), - Type: field.Type(), - // TODO verificar que pasa si hay menos tags, osea que algunos atributos no tienen tags - Tag: structType.Tag(i), - Embedded: field.Embedded(), + Name: prefix + field.Name(), + Type: field.Type(), + Embedded: field.Embedded() || gormTags.hasEmbedded(), + Tags: gormTags, }) } return fields } +func getGormTags(tag string) GormTags { + tagMap := GormTags{} + + allTags, err := structtag.Parse(tag) + if err != nil { + return tagMap + } + + gormTag, err := allTags.Get("gorm") + if err != nil { + return tagMap + } + + gormTags := strings.Split(gormTag.Name, ";") + for _, tag := range gormTags { + spplited := strings.Split(tag, ":") + if len(spplited) == 1 { + tagMap[spplited[0]] = "" + } else { + tagMap[spplited[0]] = spplited[1] + } + } + + return tagMap +} + func addConditionForEachField(f *jen.File, fields []Field, destPkg string, structName *types.TypeName) { for _, field := range fields { log.Println(field.Name) @@ -182,7 +225,6 @@ func addConditionForEachField(f *jen.File, fields []Field, destPkg string, struc } } -// TODO ver diferencia entre embeded de go y embeded de gorm func addEmbeddedConditions(f *jen.File, destPkg string, structName *types.TypeName, field Field) { embededFieldType, ok := field.Type.(*types.Named) if !ok { @@ -195,7 +237,7 @@ func addEmbeddedConditions(f *jen.File, destPkg string, structName *types.TypeNa addConditionForEachField( f, - getFields(embededStructType), + getFields(embededStructType, field.Tags.getEmbeddedPrefix()), destPkg, structName, ) @@ -240,7 +282,11 @@ func generateConditionsForField(destPkg string, structName *types.TypeName, fiel ) // inversed join condition - fields := getFields(getBadORMModelStruct(structName)) + fields := getFields( + getBadORMModelStruct(structName), + // TODO testear esto + field.Tags.getEmbeddedPrefix(), + ) if !pie.Any(fields, func(otherField Field) bool { // TODO posible override? return otherField.Name == field.Name+"ID" @@ -280,7 +326,7 @@ func generateConditionsForField(destPkg string, structName *types.TypeName, fiel Field{ Name: field.Name, Type: fieldTypeTyped.Elem(), - Tag: field.Tag, + Tags: field.Tags, }, param.Clone().Op("*"), ) @@ -309,7 +355,7 @@ func generateConditionForSlice(destPkg string, structName *types.TypeName, field Field{ Name: field.Name, Type: elemTypeTyped, - Tag: field.Tag, + Tags: field.Tags, }, param, ) diff --git a/tools/badctl/go.mod b/tools/badctl/go.mod index b8ed5a52..62f909ae 100644 --- a/tools/badctl/go.mod +++ b/tools/badctl/go.mod @@ -14,6 +14,7 @@ require ( ) require ( + github.com/fatih/structtag v1.2.0 github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect diff --git a/tools/badctl/go.sum b/tools/badctl/go.sum index 706c3062..bea8633b 100644 --- a/tools/badctl/go.sum +++ b/tools/badctl/go.sum @@ -64,6 +64,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= From 6faba4b73edb36aa3ba1bf127941801e694c7d72 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 15:56:46 +0200 Subject: [PATCH 213/467] support go column tag --- testintegration/models.go | 6 ++-- testintegration/product_conditions.go | 2 +- tools/badctl/cmd/gen/conditions.go | 43 +++++++++++++++++++-------- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/testintegration/models.go b/testintegration/models.go index bb7b0132..5e68dc6c 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -12,9 +12,7 @@ import ( // TODO testear tambien en otras bases de datos -// TODO gorm -// column -// todas las clases badorm tienen sus conditions, repository and service +// TODO todas las clases badorm tienen sus conditions, repository and service type Company struct { badorm.UUIDModel @@ -56,7 +54,7 @@ type ToBeGormEmbedded struct { type Product struct { badorm.UUIDModel - String string + String string `gorm:"column:string_something_else"` Int int IntPointer *int Float float64 diff --git a/testintegration/product_conditions.go b/testintegration/product_conditions.go index fb72f12e..33b964f2 100644 --- a/testintegration/product_conditions.go +++ b/testintegration/product_conditions.go @@ -28,7 +28,7 @@ func ProductUpdatedAtCondition(v time.Time) badorm.WhereCondition[Product] { } func ProductStringCondition(v string) badorm.WhereCondition[Product] { return badorm.WhereCondition[Product]{ - Field: "string", + Field: "string_something_else", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 52658ca7..20c80e51 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -91,10 +91,18 @@ func getTypeName(pkg *packages.Package, name string) *types.TypeName { // TODO add logs -type GormTags map[string]string +type GormTag string + +const ( + embeddedTag GormTag = "embedded" + embeddedPrefixTag GormTag = "embeddedPrefix" + columnTag GormTag = "column" +) + +type GormTags map[GormTag]string func (tags GormTags) getEmbeddedPrefix() string { - embeddedPrefix, isPresent := tags["embeddedPrefix"] + embeddedPrefix, isPresent := tags[embeddedPrefixTag] if !isPresent { return "" } @@ -103,7 +111,7 @@ func (tags GormTags) getEmbeddedPrefix() string { } func (tags GormTags) hasEmbedded() bool { - _, isPresent := tags["embedded"] + _, isPresent := tags[embeddedTag] return isPresent } @@ -114,6 +122,15 @@ type Field struct { Tags GormTags } +func (field Field) getColumnName() string { + columnTag, isPresent := field.Tags[columnTag] + if isPresent { + return columnTag + } + + return strcase.ToSnake(field.Name) +} + func generateConditionsFile(destPkg string, structName *types.TypeName) error { // Generate only when underlying type is a struct // (ignore const, var, func, etc.) @@ -193,11 +210,12 @@ func getGormTags(tag string) GormTags { gormTags := strings.Split(gormTag.Name, ";") for _, tag := range gormTags { - spplited := strings.Split(tag, ":") - if len(spplited) == 1 { - tagMap[spplited[0]] = "" + splitted := strings.Split(tag, ":") + tagName := GormTag(splitted[0]) + if len(splitted) == 1 { + tagMap[tagName] = "" } else { - tagMap[spplited[0]] = spplited[1] + tagMap[tagName] = splitted[1] } } @@ -266,7 +284,7 @@ func generateConditionsForField(destPkg string, structName *types.TypeName, fiel generateWhereCondition( destPkg, structName, - field.Name, + field, typeKindToJenStatement[fieldTypeTyped.Kind()](param), ), } @@ -309,7 +327,7 @@ func generateConditionsForField(destPkg string, structName *types.TypeName, fiel generateWhereCondition( destPkg, structName, - field.Name, + field, param.Clone().Qual( getRelativePackagePath(fieldTypeName.Pkg(), destPkg), fieldTypeName.Name(), @@ -426,7 +444,7 @@ var typeKindToJenStatement = map[types.BasicKind]func(*jen.Statement) *jen.State types.String: func(param *jen.Statement) *jen.Statement { return param.String() }, } -func generateWhereCondition(destPkg string, structName *types.TypeName, fieldName string, param *jen.Statement) *jen.Statement { +func generateWhereCondition(destPkg string, structName *types.TypeName, field Field, param *jen.Statement) *jen.Statement { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, ).Types( @@ -437,7 +455,7 @@ func generateWhereCondition(destPkg string, structName *types.TypeName, fieldNam ) return jen.Func().Id( - getConditionName(structName, fieldName), + getConditionName(structName, field.Name), ).Params( param, ).Add( @@ -445,8 +463,7 @@ func generateWhereCondition(destPkg string, structName *types.TypeName, fieldNam ).Block( jen.Return( whereCondition.Clone().Values(jen.Dict{ - // TODO gorm column redefinition - jen.Id("Field"): jen.Lit(strcase.ToSnake(fieldName)), + jen.Id("Field"): jen.Lit(field.getColumnName()), jen.Id("Value"): jen.Id("v"), }), ), From 33851aa2ac423b3648372159389c37d5035b14a0 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 24 May 2023 16:40:41 +0200 Subject: [PATCH 214/467] fix gitignore + add version file + refactor gen conditions --- .gitignore | 3 +- tools/badctl/cmd/gen/conditions.go | 86 ----------------------------- tools/badctl/cmd/gen/field.go | 41 ++++++++++++++ tools/badctl/cmd/gen/gormTag.go | 58 +++++++++++++++++++ tools/badctl/cmd/version/version.go | 3 + 5 files changed, 104 insertions(+), 87 deletions(-) create mode 100644 tools/badctl/cmd/gen/field.go create mode 100644 tools/badctl/cmd/gen/gormTag.go create mode 100644 tools/badctl/cmd/version/version.go diff --git a/.gitignore b/.gitignore index a24b613e..f78f7b44 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,5 @@ node* # binary output badaas -badctl \ No newline at end of file +badctl +!tools/badctl/ \ No newline at end of file diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 20c80e51..8d8bf0ee 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -14,7 +14,6 @@ import ( "github.com/ditrit/verdeter" "github.com/elliotchance/pie/v2" "github.com/ettle/strcase" - "github.com/fatih/structtag" "github.com/spf13/cobra" "golang.org/x/tools/go/packages" @@ -91,46 +90,6 @@ func getTypeName(pkg *packages.Package, name string) *types.TypeName { // TODO add logs -type GormTag string - -const ( - embeddedTag GormTag = "embedded" - embeddedPrefixTag GormTag = "embeddedPrefix" - columnTag GormTag = "column" -) - -type GormTags map[GormTag]string - -func (tags GormTags) getEmbeddedPrefix() string { - embeddedPrefix, isPresent := tags[embeddedPrefixTag] - if !isPresent { - return "" - } - - return embeddedPrefix -} - -func (tags GormTags) hasEmbedded() bool { - _, isPresent := tags[embeddedTag] - return isPresent -} - -type Field struct { - Name string - Type types.Type - Embedded bool - Tags GormTags -} - -func (field Field) getColumnName() string { - columnTag, isPresent := field.Tags[columnTag] - if isPresent { - return columnTag - } - - return strcase.ToSnake(field.Name) -} - func generateConditionsFile(destPkg string, structName *types.TypeName) error { // Generate only when underlying type is a struct // (ignore const, var, func, etc.) @@ -177,51 +136,6 @@ func isBadORMModel(structType *types.Struct) bool { return false } -func getFields(structType *types.Struct, prefix string) []Field { - fields := []Field{} - - // Iterate over struct fields - for i := 0; i < structType.NumFields(); i++ { - field := structType.Field(i) - gormTags := getGormTags(structType.Tag(i)) - fields = append(fields, Field{ - Name: prefix + field.Name(), - Type: field.Type(), - Embedded: field.Embedded() || gormTags.hasEmbedded(), - Tags: gormTags, - }) - } - - return fields -} - -func getGormTags(tag string) GormTags { - tagMap := GormTags{} - - allTags, err := structtag.Parse(tag) - if err != nil { - return tagMap - } - - gormTag, err := allTags.Get("gorm") - if err != nil { - return tagMap - } - - gormTags := strings.Split(gormTag.Name, ";") - for _, tag := range gormTags { - splitted := strings.Split(tag, ":") - tagName := GormTag(splitted[0]) - if len(splitted) == 1 { - tagMap[tagName] = "" - } else { - tagMap[tagName] = splitted[1] - } - } - - return tagMap -} - func addConditionForEachField(f *jen.File, fields []Field, destPkg string, structName *types.TypeName) { for _, field := range fields { log.Println(field.Name) diff --git a/tools/badctl/cmd/gen/field.go b/tools/badctl/cmd/gen/field.go new file mode 100644 index 00000000..fe107242 --- /dev/null +++ b/tools/badctl/cmd/gen/field.go @@ -0,0 +1,41 @@ +package gen + +import ( + "go/types" + + "github.com/ettle/strcase" +) + +type Field struct { + Name string + Type types.Type + Embedded bool + Tags GormTags +} + +func (field Field) getColumnName() string { + columnTag, isPresent := field.Tags[columnTagName] + if isPresent { + return columnTag + } + + return strcase.ToSnake(field.Name) +} + +func getFields(structType *types.Struct, prefix string) []Field { + fields := []Field{} + + // Iterate over struct fields + for i := 0; i < structType.NumFields(); i++ { + field := structType.Field(i) + gormTags := getGormTags(structType.Tag(i)) + fields = append(fields, Field{ + Name: prefix + field.Name(), + Type: field.Type(), + Embedded: field.Embedded() || gormTags.hasEmbedded(), + Tags: gormTags, + }) + } + + return fields +} diff --git a/tools/badctl/cmd/gen/gormTag.go b/tools/badctl/cmd/gen/gormTag.go new file mode 100644 index 00000000..dbfe7f4c --- /dev/null +++ b/tools/badctl/cmd/gen/gormTag.go @@ -0,0 +1,58 @@ +package gen + +import ( + "strings" + + "github.com/fatih/structtag" +) + +type GormTag string + +const ( + embeddedTagName GormTag = "embedded" + embeddedPrefixTagName GormTag = "embeddedPrefix" + columnTagName GormTag = "column" +) + +type GormTags map[GormTag]string + +func (tags GormTags) getEmbeddedPrefix() string { + embeddedPrefix, isPresent := tags[embeddedPrefixTagName] + if !isPresent { + return "" + } + + return embeddedPrefix +} + +func (tags GormTags) hasEmbedded() bool { + _, isPresent := tags[embeddedTagName] + return isPresent +} + +func getGormTags(tag string) GormTags { + tagMap := GormTags{} + + allTags, err := structtag.Parse(tag) + if err != nil { + return tagMap + } + + gormTag, err := allTags.Get("gorm") + if err != nil { + return tagMap + } + + gormTags := strings.Split(gormTag.Name, ";") + for _, tag := range gormTags { + splitted := strings.Split(tag, ":") + tagName := GormTag(splitted[0]) + if len(splitted) == 1 { + tagMap[tagName] = "" + } else { + tagMap[tagName] = splitted[1] + } + } + + return tagMap +} diff --git a/tools/badctl/cmd/version/version.go b/tools/badctl/cmd/version/version.go new file mode 100644 index 00000000..415100dc --- /dev/null +++ b/tools/badctl/cmd/version/version.go @@ -0,0 +1,3 @@ +package version + +var Version = "0.0.0" From 164f725628090eb7dc2786d1fe9c7207b37f258f Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 10:45:13 +0200 Subject: [PATCH 215/467] support foreigKey and references tags --- badorm/condition.go | 48 +------ testintegration/bicycle_conditions.go | 7 +- testintegration/company_conditions.go | 3 +- testintegration/country_conditions.go | 6 +- testintegration/employee_conditions.go | 3 +- testintegration/models.go | 4 +- testintegration/sale_conditions.go | 6 +- tools/badctl/cmd/gen/conditions.go | 189 ++++++++++++++++++------- tools/badctl/cmd/gen/field.go | 30 ++++ tools/badctl/cmd/gen/gormTag.go | 2 + 10 files changed, 190 insertions(+), 108 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 85d5311c..33c12c2e 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -5,7 +5,6 @@ import ( "reflect" "github.com/elliotchance/pie/v2" - "github.com/ettle/strcase" "gorm.io/gorm" ) @@ -67,7 +66,8 @@ func (condition WhereCondition[T]) GetSQL(tableName string) (string, []any) { } type JoinCondition[T1 any, T2 any] struct { - Field string + T1Field string + T2Field string Conditions []Condition[T2] } @@ -118,41 +118,17 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // taking into account that the ID attribute necessary to do it // can be either in T1's or T2's table. func (condition JoinCondition[T1, T2]) getSQLJoin(toBeJoinedTableName, nextTableName, previousTableName string) string { - if isIDPresentInObject[T1](condition.Field) { - // T1 has the id attribute - return fmt.Sprintf( - `JOIN %[1]s %[2]s ON - %[2]s.id = %[3]s.%[4]s_id - AND %[2]s.deleted_at IS NULL - `, - toBeJoinedTableName, - nextTableName, - previousTableName, - condition.Field, - ) - } - // T2 has the id attribute - // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) - previousAttribute := reflect.TypeOf(*new(T1)).Name() return fmt.Sprintf( `JOIN %[1]s %[2]s ON - %[2]s.%[4]s_id = %[3]s.id - AND %[2]s.deleted_at IS NULL + %[2]s.deleted_at IS NULL + AND %[2]s.%[3]s = %[4]s.%[5]s `, toBeJoinedTableName, nextTableName, + condition.T2Field, previousTableName, - previousAttribute, - ) -} - -// Returns true if object T has an attribute called "relationName"ID -func isIDPresentInObject[T any](relationName string) bool { - entityType := getEntityType(*new(T)) - _, isIDPresent := entityType.FieldByName( - strcase.ToPascal(relationName) + "ID", + condition.T1Field, ) - return isIDPresent } // Divides a list of conditions by its type: WhereConditions and JoinConditions @@ -170,15 +146,3 @@ func divideConditionsByType[T any]( return } - -// Get the reflect.Type of any entity or pointer to entity -func getEntityType(entity any) reflect.Type { - entityType := reflect.TypeOf(entity) - - // entityType will be a pointer if the relation can be nullable - if entityType.Kind() == reflect.Pointer { - entityType = entityType.Elem() - } - - return entityType -} diff --git a/testintegration/bicycle_conditions.go b/testintegration/bicycle_conditions.go index 84a68153..b36dc501 100644 --- a/testintegration/bicycle_conditions.go +++ b/testintegration/bicycle_conditions.go @@ -34,12 +34,13 @@ func BicycleNameCondition(v string) badorm.WhereCondition[Bicycle] { func BicycleOwnerCondition(conditions ...badorm.Condition[Person]) badorm.Condition[Bicycle] { return badorm.JoinCondition[Bicycle, Person]{ Conditions: conditions, - Field: "owner", + T1Field: "owner_name", + T2Field: "name", } } -func BicycleOwnerIdCondition(v uuid.UUID) badorm.WhereCondition[Bicycle] { +func BicycleOwnerNameCondition(v string) badorm.WhereCondition[Bicycle] { return badorm.WhereCondition[Bicycle]{ - Field: "owner_id", + Field: "owner_name", Value: v, } } diff --git a/testintegration/company_conditions.go b/testintegration/company_conditions.go index b5b78c3c..b2223cd5 100644 --- a/testintegration/company_conditions.go +++ b/testintegration/company_conditions.go @@ -34,6 +34,7 @@ func CompanyNameCondition(v string) badorm.WhereCondition[Company] { func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { return badorm.JoinCondition[Seller, Company]{ Conditions: conditions, - Field: "company", + T1Field: "company_id", + T2Field: "id", } } diff --git a/testintegration/country_conditions.go b/testintegration/country_conditions.go index 408dd1e5..2458f995 100644 --- a/testintegration/country_conditions.go +++ b/testintegration/country_conditions.go @@ -34,12 +34,14 @@ func CountryNameCondition(v string) badorm.WhereCondition[Country] { func CountryCapitalCondition(conditions ...badorm.Condition[City]) badorm.Condition[Country] { return badorm.JoinCondition[Country, City]{ Conditions: conditions, - Field: "capital", + T1Field: "id", + T2Field: "country_id", } } func CityCountryCondition(conditions ...badorm.Condition[Country]) badorm.Condition[City] { return badorm.JoinCondition[City, Country]{ Conditions: conditions, - Field: "country", + T1Field: "country_id", + T2Field: "id", } } diff --git a/testintegration/employee_conditions.go b/testintegration/employee_conditions.go index b2b7ef7b..d2350c46 100644 --- a/testintegration/employee_conditions.go +++ b/testintegration/employee_conditions.go @@ -34,7 +34,8 @@ func EmployeeNameCondition(v string) badorm.WhereCondition[Employee] { func EmployeeBossCondition(conditions ...badorm.Condition[Employee]) badorm.Condition[Employee] { return badorm.JoinCondition[Employee, Employee]{ Conditions: conditions, - Field: "boss", + T1Field: "boss_id", + T2Field: "id", } } func EmployeeBossIdCondition(v *uuid.UUID) badorm.WhereCondition[Employee] { diff --git a/testintegration/models.go b/testintegration/models.go index 5e68dc6c..797a45d7 100644 --- a/testintegration/models.go +++ b/testintegration/models.go @@ -149,8 +149,8 @@ type Bicycle struct { Name string // Bicycle BelongsTo Person (Bicycle 0..* -> 1 Person) - Owner Person - OwnerID uuid.UUID + Owner Person `gorm:"references:Name;foreignKey:OwnerName"` + OwnerName string } func (m Bicycle) Equal(other Bicycle) bool { diff --git a/testintegration/sale_conditions.go b/testintegration/sale_conditions.go index 99ec3a61..54617af5 100644 --- a/testintegration/sale_conditions.go +++ b/testintegration/sale_conditions.go @@ -40,7 +40,8 @@ func SaleDescriptionCondition(v string) badorm.WhereCondition[Sale] { func SaleProductCondition(conditions ...badorm.Condition[Product]) badorm.Condition[Sale] { return badorm.JoinCondition[Sale, Product]{ Conditions: conditions, - Field: "product", + T1Field: "product_id", + T2Field: "id", } } func SaleProductIdCondition(v uuid.UUID) badorm.WhereCondition[Sale] { @@ -52,7 +53,8 @@ func SaleProductIdCondition(v uuid.UUID) badorm.WhereCondition[Sale] { func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Condition[Sale] { return badorm.JoinCondition[Sale, Seller]{ Conditions: conditions, - Field: "seller", + T1Field: "seller_id", + T2Field: "id", } } func SaleSellerIdCondition(v *uuid.UUID) badorm.WhereCondition[Sale] { diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 8d8bf0ee..ea51973b 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -203,54 +203,11 @@ func generateConditionsForField(destPkg string, structName *types.TypeName, fiel ), } case *types.Named: - fieldTypeName := fieldTypeTyped.Obj() - fieldModelStruct := getBadORMModelStruct(fieldTypeName) - if fieldModelStruct != nil { - // TODO que pasa si esta en otro package? se importa solo? - joinCondition := generateJoinCondition( - destPkg, - structName, - field.Name, fieldTypeName, - ) - - // inversed join condition - fields := getFields( - getBadORMModelStruct(structName), - // TODO testear esto - field.Tags.getEmbeddedPrefix(), - ) - if !pie.Any(fields, func(otherField Field) bool { - // TODO posible override? - return otherField.Name == field.Name+"ID" - }) { - return []jen.Code{ - joinCondition, - generateJoinCondition( - destPkg, - fieldTypeName, - // TODO Override Foreign Key - structName.Name(), structName, - ), - } - } - - return []jen.Code{joinCondition} - // TODO DeletedAt - } else if (isGormCustomType(fieldTypeTyped) || fieldTypeTyped.String() == "time.Time") && fieldTypeTyped.String() != "gorm.io/gorm.DeletedAt" { - return []jen.Code{ - generateWhereCondition( - destPkg, - structName, - field, - param.Clone().Qual( - getRelativePackagePath(fieldTypeName.Pkg(), destPkg), - fieldTypeName.Name(), - ), - ), - } - } else { - log.Printf("struct field type not handled: %s", fieldTypeTyped.String()) - } + return generateConditionsForNamedType( + destPkg, structName, + field, fieldTypeTyped, + param, + ) case *types.Pointer: return generateConditionsForField( destPkg, @@ -276,6 +233,70 @@ func generateConditionsForField(destPkg string, structName *types.TypeName, fiel return []jen.Code{} } +func generateConditionsForNamedType(destPkg string, structName *types.TypeName, field Field, fieldType *types.Named, param *jen.Statement) []jen.Code { + fieldTypeName := fieldType.Obj() + fieldModelStruct := getBadORMModelStruct(fieldTypeName) + if fieldModelStruct != nil { + // TODO que pasa si esta en otro package? se importa solo? + fields := getFields( + getBadORMModelStruct(structName), + // TODO testear esto + field.Tags.getEmbeddedPrefix(), + ) + thisEntityHasTheFK := pie.Any(fields, func(otherField Field) bool { + return otherField.Name == field.getJoinFromColumn() + }) + + log.Println(field.getJoinFromColumn()) + log.Println(thisEntityHasTheFK) + + if thisEntityHasTheFK { + // belongsTo relation + return []jen.Code{ + generateJoinCondition( + destPkg, + structName, + field, fieldTypeName, + ), + } + } + + // hasOne or hasMany relation + inverseJoinCondition := generateInverseJoinCondition( + destPkg, + structName, + field, fieldTypeName, + ) + + return []jen.Code{ + inverseJoinCondition, + generateOppositeJoinCondition( + destPkg, + structName, + field, + fieldTypeName, + ), + } + + // TODO DeletedAt + } else if (isGormCustomType(fieldType) || fieldType.String() == "time.Time") && fieldType.String() != "gorm.io/gorm.DeletedAt" { + return []jen.Code{ + generateWhereCondition( + destPkg, + structName, + field, + param.Clone().Qual( + getRelativePackagePath(fieldTypeName.Pkg(), destPkg), + fieldTypeName.Name(), + ), + ), + } + } + + log.Printf("struct field type not handled: %s", fieldType.String()) + return []jen.Code{} +} + func generateConditionForSlice(destPkg string, structName *types.TypeName, field Field, elemType types.Type, param *jen.Statement) []jen.Code { switch elemTypeTyped := elemType.(type) { case *types.Basic: @@ -297,11 +318,11 @@ func generateConditionForSlice(destPkg string, structName *types.TypeName, field if getBadORMModelStruct(elemTypeName) != nil { log.Println(elemTypeName.Name()) return []jen.Code{ - generateJoinCondition( + generateOppositeJoinCondition( destPkg, + structName, + field, elemTypeName, - // TODO Override Foreign Key - structName.Name(), structName, ), } } @@ -384,7 +405,65 @@ func generateWhereCondition(destPkg string, structName *types.TypeName, field Fi ) } -func generateJoinCondition(destPkg string, structName *types.TypeName, fieldName string, fieldTypeName *types.TypeName) *jen.Statement { +func generateOppositeJoinCondition(destPkg string, structTypeName *types.TypeName, field Field, fieldTypeName *types.TypeName) *jen.Statement { + return generateJoinCondition( + destPkg, + fieldTypeName, + // TODO testear los Override Foreign Key + Field{ + Name: structTypeName.Name(), + Type: structTypeName.Type(), + Tags: field.Tags, + }, + structTypeName, + ) +} + +func generateJoinCondition(destPkg string, structName *types.TypeName, field Field, fieldTypeName *types.TypeName) *jen.Statement { + log.Println(fieldTypeName.String()) + + t1 := jen.Qual( + getRelativePackagePath(structName.Pkg(), destPkg), + structName.Name(), + ) + + t2 := jen.Qual( + getRelativePackagePath(fieldTypeName.Pkg(), destPkg), + fieldTypeName.Name(), + ) + + badormT1Condition := jen.Qual( + badORMPath, badORMCondition, + ).Types(t1) + badormT2Condition := jen.Qual( + badORMPath, badORMCondition, + ).Types(t2) + badormJoinCondition := jen.Qual( + badORMPath, badORMJoinCondition, + ).Types( + t1, t2, + ) + + return jen.Func().Id( + getConditionName(structName, field.Name), + ).Params( + jen.Id("conditions").Op("...").Add(badormT2Condition), + ).Add( + badormT1Condition, + ).Block( + jen.Return( + badormJoinCondition.Values(jen.Dict{ + jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinFromColumn())), + jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), + jen.Id("Conditions"): jen.Id("conditions"), + }), + ), + ) +} + +// TODO codigo duplicado +// TODO probablemente se puede hacer con el mismo metodo pero con el orden inverso +func generateInverseJoinCondition(destPkg string, structName *types.TypeName, field Field, fieldTypeName *types.TypeName) *jen.Statement { log.Println(fieldTypeName.String()) t1 := jen.Qual( @@ -410,7 +489,7 @@ func generateJoinCondition(destPkg string, structName *types.TypeName, fieldName ) return jen.Func().Id( - getConditionName(structName, fieldName), + getConditionName(structName, field.Name), ).Params( jen.Id("conditions").Op("...").Add(badormT2Condition), ).Add( @@ -418,8 +497,8 @@ func generateJoinCondition(destPkg string, structName *types.TypeName, fieldName ).Block( jen.Return( badormJoinCondition.Values(jen.Dict{ - // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) - jen.Id("Field"): jen.Lit(strcase.ToSnake(fieldName)), + jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), + jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.NoSePonerNombre(structName.Name()))), jen.Id("Conditions"): jen.Id("conditions"), }), ), diff --git a/tools/badctl/cmd/gen/field.go b/tools/badctl/cmd/gen/field.go index fe107242..0dd57354 100644 --- a/tools/badctl/cmd/gen/field.go +++ b/tools/badctl/cmd/gen/field.go @@ -22,6 +22,36 @@ func (field Field) getColumnName() string { return strcase.ToSnake(field.Name) } +func (field Field) getJoinFromColumn() string { + foreignKeyTag, isPresent := field.Tags[foreignKeyTagName] + if isPresent { + return foreignKeyTag + } + + return field.Name + "ID" +} + +func (field Field) getJoinToColumn() string { + referencesTag, isPresent := field.Tags[referencesTagName] + // TODO testear cuando hay redefinicion en la inversa + if isPresent { + return referencesTag + } + + return "ID" +} + +// TODO +func (field Field) NoSePonerNombre(structName string) string { + // TODO testear cuando hay redefinicion + foreignKeyTag, isPresent := field.Tags[foreignKeyTagName] + if isPresent { + return foreignKeyTag + } + + return structName + "ID" +} + func getFields(structType *types.Struct, prefix string) []Field { fields := []Field{} diff --git a/tools/badctl/cmd/gen/gormTag.go b/tools/badctl/cmd/gen/gormTag.go index dbfe7f4c..9f482b19 100644 --- a/tools/badctl/cmd/gen/gormTag.go +++ b/tools/badctl/cmd/gen/gormTag.go @@ -12,6 +12,8 @@ const ( embeddedTagName GormTag = "embedded" embeddedPrefixTagName GormTag = "embeddedPrefix" columnTagName GormTag = "column" + foreignKeyTagName GormTag = "foreignKey" + referencesTagName GormTag = "references" ) type GormTags map[GormTag]string From 84a4a48688831d85dd1274e8bbb3b4211ce1b9e4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 15:08:42 +0200 Subject: [PATCH 216/467] refactor field --- tools/badctl/cmd/gen/conditions.go | 30 +++++++++++------------------- tools/badctl/cmd/gen/field.go | 30 +++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index ea51973b..8cf84cf3 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -158,7 +158,7 @@ func addConditionForEachField(f *jen.File, fields []Field, destPkg string, struc } func addEmbeddedConditions(f *jen.File, destPkg string, structName *types.TypeName, field Field) { - embededFieldType, ok := field.Type.(*types.Named) + embededFieldType, ok := field.Type.Type().(*types.Named) if !ok { failErr(errors.New("unreacheable! embeddeds are allways of type Named")) } @@ -192,7 +192,7 @@ func addConditionsForField(f *jen.File, destPkg string, structName *types.TypeNa } func generateConditionsForField(destPkg string, structName *types.TypeName, field Field, param *jen.Statement) []jen.Code { - switch fieldTypeTyped := field.Type.(type) { + switch fieldTypeTyped := field.Type.Type().(type) { case *types.Basic: return []jen.Code{ generateWhereCondition( @@ -212,11 +212,7 @@ func generateConditionsForField(destPkg string, structName *types.TypeName, fiel return generateConditionsForField( destPkg, structName, - Field{ - Name: field.Name, - Type: fieldTypeTyped.Elem(), - Tags: field.Tags, - }, + field.ChangeType(fieldTypeTyped.Elem()), param.Clone().Op("*"), ) case *types.Slice: @@ -256,7 +252,7 @@ func generateConditionsForNamedType(destPkg string, structName *types.TypeName, generateJoinCondition( destPkg, structName, - field, fieldTypeName, + field, ), } } @@ -305,11 +301,7 @@ func generateConditionForSlice(destPkg string, structName *types.TypeName, field return generateConditionsForField( destPkg, structName, - Field{ - Name: field.Name, - Type: elemTypeTyped, - Tags: field.Tags, - }, + field.ChangeType(elemTypeTyped), param, ) case *types.Named: @@ -412,24 +404,24 @@ func generateOppositeJoinCondition(destPkg string, structTypeName *types.TypeNam // TODO testear los Override Foreign Key Field{ Name: structTypeName.Name(), - Type: structTypeName.Type(), + Type: structTypeName, Tags: field.Tags, }, - structTypeName, ) } -func generateJoinCondition(destPkg string, structName *types.TypeName, field Field, fieldTypeName *types.TypeName) *jen.Statement { - log.Println(fieldTypeName.String()) +func generateJoinCondition(destPkg string, structName *types.TypeName, field Field) *jen.Statement { + log.Println(field.Type.Name()) t1 := jen.Qual( getRelativePackagePath(structName.Pkg(), destPkg), structName.Name(), ) + // TODO field.Type.Name me da lo mismo que field.Name t2 := jen.Qual( - getRelativePackagePath(fieldTypeName.Pkg(), destPkg), - fieldTypeName.Name(), + getRelativePackagePath(field.Type.Pkg(), destPkg), + field.TypeName(), ) badormT1Condition := jen.Qual( diff --git a/tools/badctl/cmd/gen/field.go b/tools/badctl/cmd/gen/field.go index 0dd57354..91129170 100644 --- a/tools/badctl/cmd/gen/field.go +++ b/tools/badctl/cmd/gen/field.go @@ -2,13 +2,15 @@ package gen import ( "go/types" + "strings" + "github.com/elliotchance/pie/v2" "github.com/ettle/strcase" ) type Field struct { Name string - Type types.Type + Type types.Object Embedded bool Tags GormTags } @@ -52,17 +54,35 @@ func (field Field) NoSePonerNombre(structName string) string { return structName + "ID" } +func (field Field) TypeName() string { + return pie.Last(strings.Split(field.Type.Type().String(), ".")) +} + +func (field Field) ChangeType(newType types.Type) Field { + return Field{ + Name: field.Name, + Type: types.NewTypeName( + field.Type.Pos(), + field.Type.Pkg(), + field.Type.Name(), + newType, + ), + Tags: field.Tags, + } +} + func getFields(structType *types.Struct, prefix string) []Field { fields := []Field{} // Iterate over struct fields for i := 0; i < structType.NumFields(); i++ { - field := structType.Field(i) + fieldType := structType.Field(i) gormTags := getGormTags(structType.Tag(i)) fields = append(fields, Field{ - Name: prefix + field.Name(), - Type: field.Type(), - Embedded: field.Embedded() || gormTags.hasEmbedded(), + // TODO el Name se podria sacar si meto este prefix adentro del tipo + Name: prefix + fieldType.Name(), + Type: fieldType, + Embedded: fieldType.Embedded() || gormTags.hasEmbedded(), Tags: gormTags, }) } From af533a07b868720880f3a565f100772bde947d0d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 15:20:27 +0200 Subject: [PATCH 217/467] refactor: use object interface --- tools/badctl/cmd/gen/conditions.go | 127 ++++++++++++++--------------- 1 file changed, 63 insertions(+), 64 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 8cf84cf3..404b9935 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -55,14 +55,14 @@ func generateConditions(cmd *cobra.Command, args []string) { log.Println(pkg.Types.Name()) for _, name := range pkg.Types.Scope().Names() { - structName := getTypeName(pkg, name) - if structName != nil { + object := getObject(pkg, name) + if object != nil { log.Println(name) // Generate code using jennifer err := generateConditionsFile( destPkg, - structName, + object, ) if err != nil { failErr(err) @@ -72,7 +72,7 @@ func generateConditions(cmd *cobra.Command, args []string) { } } -func getTypeName(pkg *packages.Package, name string) *types.TypeName { +func getObject(pkg *packages.Package, name string) types.Object { obj := pkg.Types.Scope().Lookup(name) if obj == nil { failErr(fmt.Errorf("%s not found in declared types of %s", @@ -80,20 +80,20 @@ func getTypeName(pkg *packages.Package, name string) *types.TypeName { } // Generate only if it is a declared type - structName, ok := obj.(*types.TypeName) + object, ok := obj.(*types.TypeName) if !ok { return nil } - return structName + return object } // TODO add logs -func generateConditionsFile(destPkg string, structName *types.TypeName) error { +func generateConditionsFile(destPkg string, object types.Object) error { // Generate only when underlying type is a struct // (ignore const, var, func, etc.) - structType := getBadORMModelStruct(structName) + structType := getBadORMModelStruct(object) if structType == nil { return nil } @@ -109,14 +109,14 @@ func generateConditionsFile(destPkg string, structName *types.TypeName) error { // Add a package comment, so IDEs detect files as generated f.PackageComment("Code generated by badctl v" + version.Version + ", DO NOT EDIT.") - addConditionForEachField(f, fields, destPkg, structName) + addConditionForEachField(f, fields, destPkg, object) // Write generated file - return f.Save(strings.ToLower(structName.Name()) + "_conditions.go") + return f.Save(strings.ToLower(object.Name()) + "_conditions.go") } -func getBadORMModelStruct(structName *types.TypeName) *types.Struct { - structType, ok := structName.Type().Underlying().(*types.Struct) +func getBadORMModelStruct(object types.Object) *types.Struct { + structType, ok := object.Type().Underlying().(*types.Struct) if !ok || !isBadORMModel(structType) { return nil } @@ -136,28 +136,28 @@ func isBadORMModel(structType *types.Struct) bool { return false } -func addConditionForEachField(f *jen.File, fields []Field, destPkg string, structName *types.TypeName) { +func addConditionForEachField(f *jen.File, fields []Field, destPkg string, object types.Object) { for _, field := range fields { log.Println(field.Name) if field.Embedded { addEmbeddedConditions( f, destPkg, - structName, + object, field, ) } else { addConditionsForField( f, destPkg, - structName, + object, field, ) } } } -func addEmbeddedConditions(f *jen.File, destPkg string, structName *types.TypeName, field Field) { +func addEmbeddedConditions(f *jen.File, destPkg string, object types.Object, field Field) { embededFieldType, ok := field.Type.Type().(*types.Named) if !ok { failErr(errors.New("unreacheable! embeddeds are allways of type Named")) @@ -171,18 +171,16 @@ func addEmbeddedConditions(f *jen.File, destPkg string, structName *types.TypeNa f, getFields(embededStructType, field.Tags.getEmbeddedPrefix()), destPkg, - structName, + object, ) } var basicParam = jen.Id("v") -// TODO pasar typeName a object para que todo sea mas claro - -func addConditionsForField(f *jen.File, destPkg string, structName *types.TypeName, field Field) { +func addConditionsForField(f *jen.File, destPkg string, object types.Object, field Field) { conditions := generateConditionsForField( destPkg, - structName, field, + object, field, basicParam.Clone(), ) @@ -191,33 +189,33 @@ func addConditionsForField(f *jen.File, destPkg string, structName *types.TypeNa } } -func generateConditionsForField(destPkg string, structName *types.TypeName, field Field, param *jen.Statement) []jen.Code { +func generateConditionsForField(destPkg string, object types.Object, field Field, param *jen.Statement) []jen.Code { switch fieldTypeTyped := field.Type.Type().(type) { case *types.Basic: return []jen.Code{ generateWhereCondition( destPkg, - structName, + object, field, typeKindToJenStatement[fieldTypeTyped.Kind()](param), ), } case *types.Named: return generateConditionsForNamedType( - destPkg, structName, + destPkg, object, field, fieldTypeTyped, param, ) case *types.Pointer: return generateConditionsForField( destPkg, - structName, + object, field.ChangeType(fieldTypeTyped.Elem()), param.Clone().Op("*"), ) case *types.Slice: return generateConditionForSlice( - destPkg, structName, + destPkg, object, field, fieldTypeTyped.Elem(), param.Clone().Index(), ) @@ -229,13 +227,14 @@ func generateConditionsForField(destPkg string, structName *types.TypeName, fiel return []jen.Code{} } -func generateConditionsForNamedType(destPkg string, structName *types.TypeName, field Field, fieldType *types.Named, param *jen.Statement) []jen.Code { - fieldTypeName := fieldType.Obj() - fieldModelStruct := getBadORMModelStruct(fieldTypeName) +func generateConditionsForNamedType(destPkg string, object types.Object, field Field, fieldType *types.Named, param *jen.Statement) []jen.Code { + // TODO quizas aca se puede eliminar el fieldType + fieldObject := fieldType.Obj() + fieldModelStruct := getBadORMModelStruct(fieldObject) if fieldModelStruct != nil { // TODO que pasa si esta en otro package? se importa solo? fields := getFields( - getBadORMModelStruct(structName), + getBadORMModelStruct(object), // TODO testear esto field.Tags.getEmbeddedPrefix(), ) @@ -251,7 +250,7 @@ func generateConditionsForNamedType(destPkg string, structName *types.TypeName, return []jen.Code{ generateJoinCondition( destPkg, - structName, + object, field, ), } @@ -260,17 +259,17 @@ func generateConditionsForNamedType(destPkg string, structName *types.TypeName, // hasOne or hasMany relation inverseJoinCondition := generateInverseJoinCondition( destPkg, - structName, - field, fieldTypeName, + object, + field, fieldObject, ) return []jen.Code{ inverseJoinCondition, generateOppositeJoinCondition( destPkg, - structName, + object, field, - fieldTypeName, + fieldObject, ), } @@ -279,11 +278,11 @@ func generateConditionsForNamedType(destPkg string, structName *types.TypeName, return []jen.Code{ generateWhereCondition( destPkg, - structName, + object, field, param.Clone().Qual( - getRelativePackagePath(fieldTypeName.Pkg(), destPkg), - fieldTypeName.Name(), + getRelativePackagePath(fieldObject.Pkg(), destPkg), + fieldObject.Name(), ), ), } @@ -293,14 +292,14 @@ func generateConditionsForNamedType(destPkg string, structName *types.TypeName, return []jen.Code{} } -func generateConditionForSlice(destPkg string, structName *types.TypeName, field Field, elemType types.Type, param *jen.Statement) []jen.Code { +func generateConditionForSlice(destPkg string, object types.Object, field Field, elemType types.Type, param *jen.Statement) []jen.Code { switch elemTypeTyped := elemType.(type) { case *types.Basic: // una list de strings o algo asi, // por el momento solo anda con []byte porque el resto gorm no lo sabe encodear return generateConditionsForField( destPkg, - structName, + object, field.ChangeType(elemTypeTyped), param, ) @@ -312,7 +311,7 @@ func generateConditionForSlice(destPkg string, structName *types.TypeName, field return []jen.Code{ generateOppositeJoinCondition( destPkg, - structName, + object, field, elemTypeName, ), @@ -321,7 +320,7 @@ func generateConditionForSlice(destPkg string, structName *types.TypeName, field case *types.Pointer: // slice de pointers, solo testeado temporalmente porque despues gorm no lo soporta return generateConditionForSlice( - destPkg, structName, + destPkg, object, field, elemTypeTyped.Elem(), param.Op("*"), ) @@ -371,18 +370,18 @@ var typeKindToJenStatement = map[types.BasicKind]func(*jen.Statement) *jen.State types.String: func(param *jen.Statement) *jen.Statement { return param.String() }, } -func generateWhereCondition(destPkg string, structName *types.TypeName, field Field, param *jen.Statement) *jen.Statement { +func generateWhereCondition(destPkg string, object types.Object, field Field, param *jen.Statement) *jen.Statement { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, ).Types( jen.Qual( - getRelativePackagePath(structName.Pkg(), destPkg), - structName.Name(), + getRelativePackagePath(object.Pkg(), destPkg), + object.Name(), ), ) return jen.Func().Id( - getConditionName(structName, field.Name), + getConditionName(object, field.Name), ).Params( param, ).Add( @@ -397,25 +396,25 @@ func generateWhereCondition(destPkg string, structName *types.TypeName, field Fi ) } -func generateOppositeJoinCondition(destPkg string, structTypeName *types.TypeName, field Field, fieldTypeName *types.TypeName) *jen.Statement { +func generateOppositeJoinCondition(destPkg string, object types.Object, field Field, fieldObject types.Object) *jen.Statement { return generateJoinCondition( destPkg, - fieldTypeName, + fieldObject, // TODO testear los Override Foreign Key Field{ - Name: structTypeName.Name(), - Type: structTypeName, + Name: object.Name(), + Type: object, Tags: field.Tags, }, ) } -func generateJoinCondition(destPkg string, structName *types.TypeName, field Field) *jen.Statement { +func generateJoinCondition(destPkg string, object types.Object, field Field) *jen.Statement { log.Println(field.Type.Name()) t1 := jen.Qual( - getRelativePackagePath(structName.Pkg(), destPkg), - structName.Name(), + getRelativePackagePath(object.Pkg(), destPkg), + object.Name(), ) // TODO field.Type.Name me da lo mismo que field.Name @@ -437,7 +436,7 @@ func generateJoinCondition(destPkg string, structName *types.TypeName, field Fie ) return jen.Func().Id( - getConditionName(structName, field.Name), + getConditionName(object, field.Name), ).Params( jen.Id("conditions").Op("...").Add(badormT2Condition), ).Add( @@ -455,17 +454,17 @@ func generateJoinCondition(destPkg string, structName *types.TypeName, field Fie // TODO codigo duplicado // TODO probablemente se puede hacer con el mismo metodo pero con el orden inverso -func generateInverseJoinCondition(destPkg string, structName *types.TypeName, field Field, fieldTypeName *types.TypeName) *jen.Statement { - log.Println(fieldTypeName.String()) +func generateInverseJoinCondition(destPkg string, object types.Object, field Field, fieldObject types.Object) *jen.Statement { + log.Println(fieldObject.String()) t1 := jen.Qual( - getRelativePackagePath(structName.Pkg(), destPkg), - structName.Name(), + getRelativePackagePath(object.Pkg(), destPkg), + object.Name(), ) t2 := jen.Qual( - getRelativePackagePath(fieldTypeName.Pkg(), destPkg), - fieldTypeName.Name(), + getRelativePackagePath(fieldObject.Pkg(), destPkg), + fieldObject.Name(), ) badormT1Condition := jen.Qual( @@ -481,7 +480,7 @@ func generateInverseJoinCondition(destPkg string, structName *types.TypeName, fi ) return jen.Func().Id( - getConditionName(structName, field.Name), + getConditionName(object, field.Name), ).Params( jen.Id("conditions").Op("...").Add(badormT2Condition), ).Add( @@ -490,15 +489,15 @@ func generateInverseJoinCondition(destPkg string, structName *types.TypeName, fi jen.Return( badormJoinCondition.Values(jen.Dict{ jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), - jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.NoSePonerNombre(structName.Name()))), + jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.NoSePonerNombre(object.Name()))), jen.Id("Conditions"): jen.Id("conditions"), }), ), ) } -func getConditionName(structName *types.TypeName, fieldName string) string { - return strcase.ToPascal(structName.Name()) + strcase.ToPascal(fieldName) + badORMCondition +func getConditionName(object types.Object, fieldName string) string { + return strcase.ToPascal(object.Name()) + strcase.ToPascal(fieldName) + badORMCondition } // TODO testear esto From 306f3bccaf0dfee86186e7d24dd6c9175941509c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 15:28:30 +0200 Subject: [PATCH 218/467] remove destPkg as parameter --- tools/badctl/cmd/gen/conditions.go | 73 ++++++++++++------------------ 1 file changed, 29 insertions(+), 44 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 404b9935..445282ae 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -38,17 +38,18 @@ const ( badORMJoinCondition = "JoinCondition" ) +var destPkg string + func generateConditions(cmd *cobra.Command, args []string) { // Inspect package and use type checker to infer imported types pkgs := loadPackages(args) // Get the package of the file with go:generate comment - destPkg := os.Getenv("GOPACKAGE") + destPkg = os.Getenv("GOPACKAGE") if destPkg == "" { // TODO que tambien se pueda usar solo failErr(errors.New("this command should be called using go generate")) } - log.Println(destPkg) for _, pkg := range pkgs { log.Println(pkg.Types.Path()) @@ -60,10 +61,7 @@ func generateConditions(cmd *cobra.Command, args []string) { log.Println(name) // Generate code using jennifer - err := generateConditionsFile( - destPkg, - object, - ) + err := generateConditionsFile(object) if err != nil { failErr(err) } @@ -90,7 +88,7 @@ func getObject(pkg *packages.Package, name string) types.Object { // TODO add logs -func generateConditionsFile(destPkg string, object types.Object) error { +func generateConditionsFile(object types.Object) error { // Generate only when underlying type is a struct // (ignore const, var, func, etc.) structType := getBadORMModelStruct(object) @@ -109,7 +107,7 @@ func generateConditionsFile(destPkg string, object types.Object) error { // Add a package comment, so IDEs detect files as generated f.PackageComment("Code generated by badctl v" + version.Version + ", DO NOT EDIT.") - addConditionForEachField(f, fields, destPkg, object) + addConditionForEachField(f, object, fields) // Write generated file return f.Save(strings.ToLower(object.Name()) + "_conditions.go") @@ -136,20 +134,18 @@ func isBadORMModel(structType *types.Struct) bool { return false } -func addConditionForEachField(f *jen.File, fields []Field, destPkg string, object types.Object) { +func addConditionForEachField(f *jen.File, object types.Object, fields []Field) { for _, field := range fields { log.Println(field.Name) if field.Embedded { addEmbeddedConditions( f, - destPkg, object, field, ) } else { addConditionsForField( f, - destPkg, object, field, ) @@ -157,29 +153,27 @@ func addConditionForEachField(f *jen.File, fields []Field, destPkg string, objec } } -func addEmbeddedConditions(f *jen.File, destPkg string, object types.Object, field Field) { - embededFieldType, ok := field.Type.Type().(*types.Named) +func addEmbeddedConditions(f *jen.File, object types.Object, field Field) { + embeddedFieldType, ok := field.Type.Type().(*types.Named) if !ok { failErr(errors.New("unreacheable! embeddeds are allways of type Named")) } - embededStructType, ok := embededFieldType.Underlying().(*types.Struct) + embeddedStructType, ok := embeddedFieldType.Underlying().(*types.Struct) if !ok { failErr(errors.New("unreacheable! embeddeds are allways structs")) } addConditionForEachField( f, - getFields(embededStructType, field.Tags.getEmbeddedPrefix()), - destPkg, object, + getFields(embeddedStructType, field.Tags.getEmbeddedPrefix()), ) } var basicParam = jen.Id("v") -func addConditionsForField(f *jen.File, destPkg string, object types.Object, field Field) { +func addConditionsForField(f *jen.File, object types.Object, field Field) { conditions := generateConditionsForField( - destPkg, object, field, basicParam.Clone(), ) @@ -189,12 +183,11 @@ func addConditionsForField(f *jen.File, destPkg string, object types.Object, fie } } -func generateConditionsForField(destPkg string, object types.Object, field Field, param *jen.Statement) []jen.Code { +func generateConditionsForField(object types.Object, field Field, param *jen.Statement) []jen.Code { switch fieldTypeTyped := field.Type.Type().(type) { case *types.Basic: return []jen.Code{ generateWhereCondition( - destPkg, object, field, typeKindToJenStatement[fieldTypeTyped.Kind()](param), @@ -202,20 +195,19 @@ func generateConditionsForField(destPkg string, object types.Object, field Field } case *types.Named: return generateConditionsForNamedType( - destPkg, object, + object, field, fieldTypeTyped, param, ) case *types.Pointer: return generateConditionsForField( - destPkg, object, field.ChangeType(fieldTypeTyped.Elem()), param.Clone().Op("*"), ) case *types.Slice: return generateConditionForSlice( - destPkg, object, + object, field, fieldTypeTyped.Elem(), param.Clone().Index(), ) @@ -227,7 +219,7 @@ func generateConditionsForField(destPkg string, object types.Object, field Field return []jen.Code{} } -func generateConditionsForNamedType(destPkg string, object types.Object, field Field, fieldType *types.Named, param *jen.Statement) []jen.Code { +func generateConditionsForNamedType(object types.Object, field Field, fieldType *types.Named, param *jen.Statement) []jen.Code { // TODO quizas aca se puede eliminar el fieldType fieldObject := fieldType.Obj() fieldModelStruct := getBadORMModelStruct(fieldObject) @@ -249,7 +241,6 @@ func generateConditionsForNamedType(destPkg string, object types.Object, field F // belongsTo relation return []jen.Code{ generateJoinCondition( - destPkg, object, field, ), @@ -258,7 +249,6 @@ func generateConditionsForNamedType(destPkg string, object types.Object, field F // hasOne or hasMany relation inverseJoinCondition := generateInverseJoinCondition( - destPkg, object, field, fieldObject, ) @@ -266,7 +256,6 @@ func generateConditionsForNamedType(destPkg string, object types.Object, field F return []jen.Code{ inverseJoinCondition, generateOppositeJoinCondition( - destPkg, object, field, fieldObject, @@ -277,11 +266,10 @@ func generateConditionsForNamedType(destPkg string, object types.Object, field F } else if (isGormCustomType(fieldType) || fieldType.String() == "time.Time") && fieldType.String() != "gorm.io/gorm.DeletedAt" { return []jen.Code{ generateWhereCondition( - destPkg, object, field, param.Clone().Qual( - getRelativePackagePath(fieldObject.Pkg(), destPkg), + getRelativePackagePath(fieldObject.Pkg()), fieldObject.Name(), ), ), @@ -292,13 +280,12 @@ func generateConditionsForNamedType(destPkg string, object types.Object, field F return []jen.Code{} } -func generateConditionForSlice(destPkg string, object types.Object, field Field, elemType types.Type, param *jen.Statement) []jen.Code { +func generateConditionForSlice(object types.Object, field Field, elemType types.Type, param *jen.Statement) []jen.Code { switch elemTypeTyped := elemType.(type) { case *types.Basic: // una list de strings o algo asi, // por el momento solo anda con []byte porque el resto gorm no lo sabe encodear return generateConditionsForField( - destPkg, object, field.ChangeType(elemTypeTyped), param, @@ -310,7 +297,6 @@ func generateConditionForSlice(destPkg string, object types.Object, field Field, log.Println(elemTypeName.Name()) return []jen.Code{ generateOppositeJoinCondition( - destPkg, object, field, elemTypeName, @@ -320,7 +306,7 @@ func generateConditionForSlice(destPkg string, object types.Object, field Field, case *types.Pointer: // slice de pointers, solo testeado temporalmente porque despues gorm no lo soporta return generateConditionForSlice( - destPkg, object, + object, field, elemTypeTyped.Elem(), param.Op("*"), ) @@ -370,12 +356,12 @@ var typeKindToJenStatement = map[types.BasicKind]func(*jen.Statement) *jen.State types.String: func(param *jen.Statement) *jen.Statement { return param.String() }, } -func generateWhereCondition(destPkg string, object types.Object, field Field, param *jen.Statement) *jen.Statement { +func generateWhereCondition(object types.Object, field Field, param *jen.Statement) *jen.Statement { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, ).Types( jen.Qual( - getRelativePackagePath(object.Pkg(), destPkg), + getRelativePackagePath(object.Pkg()), object.Name(), ), ) @@ -396,9 +382,8 @@ func generateWhereCondition(destPkg string, object types.Object, field Field, pa ) } -func generateOppositeJoinCondition(destPkg string, object types.Object, field Field, fieldObject types.Object) *jen.Statement { +func generateOppositeJoinCondition(object types.Object, field Field, fieldObject types.Object) *jen.Statement { return generateJoinCondition( - destPkg, fieldObject, // TODO testear los Override Foreign Key Field{ @@ -409,17 +394,17 @@ func generateOppositeJoinCondition(destPkg string, object types.Object, field Fi ) } -func generateJoinCondition(destPkg string, object types.Object, field Field) *jen.Statement { +func generateJoinCondition(object types.Object, field Field) *jen.Statement { log.Println(field.Type.Name()) t1 := jen.Qual( - getRelativePackagePath(object.Pkg(), destPkg), + getRelativePackagePath(object.Pkg()), object.Name(), ) // TODO field.Type.Name me da lo mismo que field.Name t2 := jen.Qual( - getRelativePackagePath(field.Type.Pkg(), destPkg), + getRelativePackagePath(field.Type.Pkg()), field.TypeName(), ) @@ -454,16 +439,16 @@ func generateJoinCondition(destPkg string, object types.Object, field Field) *je // TODO codigo duplicado // TODO probablemente se puede hacer con el mismo metodo pero con el orden inverso -func generateInverseJoinCondition(destPkg string, object types.Object, field Field, fieldObject types.Object) *jen.Statement { +func generateInverseJoinCondition(object types.Object, field Field, fieldObject types.Object) *jen.Statement { log.Println(fieldObject.String()) t1 := jen.Qual( - getRelativePackagePath(object.Pkg(), destPkg), + getRelativePackagePath(object.Pkg()), object.Name(), ) t2 := jen.Qual( - getRelativePackagePath(fieldObject.Pkg(), destPkg), + getRelativePackagePath(fieldObject.Pkg()), fieldObject.Name(), ) @@ -501,7 +486,7 @@ func getConditionName(object types.Object, fieldName string) string { } // TODO testear esto -func getRelativePackagePath(srcPkg *types.Package, destPkg string) string { +func getRelativePackagePath(srcPkg *types.Package) string { if srcPkg.Name() == destPkg { return "" } From 55dcd2066f5e82aca7fec0091da6bdab95711522 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 15:32:44 +0200 Subject: [PATCH 219/467] fix typos --- tools/badctl/cmd/gen/conditions.go | 44 +++++++++++++++--------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions.go index 445282ae..15c14971 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions.go @@ -70,6 +70,26 @@ func generateConditions(cmd *cobra.Command, args []string) { } } +func loadPackages(paths []string) []*packages.Package { + cfg := &packages.Config{Mode: packages.NeedTypes} + pkgs, err := packages.Load(cfg, paths...) + if err != nil { + failErr(fmt.Errorf("loading packages for inspection: %v", err)) + } + + // print compilation errors of source packages + packages.PrintErrors(pkgs) + + return pkgs +} + +func failErr(err error) { + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v\n", err) + os.Exit(1) + } +} + func getObject(pkg *packages.Package, name string) types.Object { obj := pkg.Types.Scope().Lookup(name) if obj == nil { @@ -156,11 +176,11 @@ func addConditionForEachField(f *jen.File, object types.Object, fields []Field) func addEmbeddedConditions(f *jen.File, object types.Object, field Field) { embeddedFieldType, ok := field.Type.Type().(*types.Named) if !ok { - failErr(errors.New("unreacheable! embeddeds are allways of type Named")) + failErr(errors.New("unreachable! embedded objects are always of type Named")) } embeddedStructType, ok := embeddedFieldType.Underlying().(*types.Struct) if !ok { - failErr(errors.New("unreacheable! embeddeds are allways structs")) + failErr(errors.New("unreachable! embedded objects are always structs")) } addConditionForEachField( @@ -493,23 +513,3 @@ func getRelativePackagePath(srcPkg *types.Package) string { return srcPkg.Path() } - -func loadPackages(paths []string) []*packages.Package { - cfg := &packages.Config{Mode: packages.NeedTypes} - pkgs, err := packages.Load(cfg, paths...) - if err != nil { - failErr(fmt.Errorf("loading packages for inspection: %v", err)) - } - - // print compilation errors of source packages - packages.PrintErrors(pkgs) - - return pkgs -} - -func failErr(err error) { - if err != nil { - fmt.Fprintf(os.Stderr, "Error: %v\n", err) - os.Exit(1) - } -} From 2b99ec2a28c15a5bb4316d05a0c7d2bf6a3eed45 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 16:42:57 +0200 Subject: [PATCH 220/467] refactor: conditions to folder and 2 files --- tools/badctl/cmd/gen/conditions/conditions.go | 102 ++++++++ .../badctl/cmd/gen/{ => conditions}/field.go | 14 +- .../gen/{conditions.go => conditions/file.go} | 237 +++++++----------- .../cmd/gen/{ => conditions}/gormTag.go | 2 +- tools/badctl/cmd/gen/gen.go | 3 +- 5 files changed, 206 insertions(+), 152 deletions(-) create mode 100644 tools/badctl/cmd/gen/conditions/conditions.go rename tools/badctl/cmd/gen/{ => conditions}/field.go (86%) rename tools/badctl/cmd/gen/{conditions.go => conditions/file.go} (75%) rename tools/badctl/cmd/gen/{ => conditions}/gormTag.go (98%) diff --git a/tools/badctl/cmd/gen/conditions/conditions.go b/tools/badctl/cmd/gen/conditions/conditions.go new file mode 100644 index 00000000..833ecdb5 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/conditions.go @@ -0,0 +1,102 @@ +package conditions + +import ( + "errors" + "fmt" + "go/types" + "log" + "os" + "strings" + + "github.com/ditrit/verdeter" + "github.com/spf13/cobra" + + "golang.org/x/tools/go/packages" +) + +var GenConditionsCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "conditions", + Short: "Generate conditions to query your objects using BaDORM", + Long: `gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way.`, + Run: generateConditions, + Args: cobra.MinimumNArgs(1), +}) + +var destPkg string + +func generateConditions(cmd *cobra.Command, args []string) { + // Inspect package and use type checker to infer imported types + pkgs := loadPackages(args) + + // Get the package of the file with go:generate comment + destPkg = os.Getenv("GOPACKAGE") + if destPkg == "" { + // TODO que tambien se pueda usar solo + failErr(errors.New("this command should be called using go generate")) + } + + for _, pkg := range pkgs { + log.Println(pkg.Types.Path()) + log.Println(pkg.Types.Name()) + + for _, name := range pkg.Types.Scope().Names() { + object := getObject(pkg, name) + if object != nil { + log.Println(name) + + file := NewConditionsFile( + destPkg, + strings.ToLower(object.Name())+"_conditions.go", + ) + + err := file.AddConditionsFor(object) + if err != nil { + continue + } + + err = file.Save() + if err != nil { + failErr(err) + } + } + } + } +} + +func loadPackages(paths []string) []*packages.Package { + cfg := &packages.Config{Mode: packages.NeedTypes} + pkgs, err := packages.Load(cfg, paths...) + if err != nil { + failErr(fmt.Errorf("loading packages for inspection: %v", err)) + } + + // print compilation errors of source packages + packages.PrintErrors(pkgs) + + return pkgs +} + +func failErr(err error) { + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v\n", err) + os.Exit(1) + } +} + +func getObject(pkg *packages.Package, name string) types.Object { + obj := pkg.Types.Scope().Lookup(name) + if obj == nil { + failErr(fmt.Errorf("%s not found in declared types of %s", + name, pkg)) + } + + // Generate only if it is a declared type + object, ok := obj.(*types.TypeName) + if !ok { + return nil + } + + return object +} + +// TODO add logs diff --git a/tools/badctl/cmd/gen/field.go b/tools/badctl/cmd/gen/conditions/field.go similarity index 86% rename from tools/badctl/cmd/gen/field.go rename to tools/badctl/cmd/gen/conditions/field.go index 91129170..6214dccd 100644 --- a/tools/badctl/cmd/gen/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -1,6 +1,7 @@ -package gen +package conditions import ( + "errors" "go/types" "strings" @@ -71,11 +72,16 @@ func (field Field) ChangeType(newType types.Type) Field { } } -func getFields(structType *types.Struct, prefix string) []Field { +func getFields(structType *types.Struct, prefix string) ([]Field, error) { + numFields := structType.NumFields() + if numFields == 0 { + return nil, errors.New("Struct has 0 fields") + } + fields := []Field{} // Iterate over struct fields - for i := 0; i < structType.NumFields(); i++ { + for i := 0; i < numFields; i++ { fieldType := structType.Field(i) gormTags := getGormTags(structType.Tag(i)) fields = append(fields, Field{ @@ -87,5 +93,5 @@ func getFields(structType *types.Struct, prefix string) []Field { }) } - return fields + return fields, nil } diff --git a/tools/badctl/cmd/gen/conditions.go b/tools/badctl/cmd/gen/conditions/file.go similarity index 75% rename from tools/badctl/cmd/gen/conditions.go rename to tools/badctl/cmd/gen/conditions/file.go index 15c14971..a9e801b2 100644 --- a/tools/badctl/cmd/gen/conditions.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -1,145 +1,105 @@ -package gen +package conditions import ( "errors" - "fmt" "go/types" "log" - "os" "regexp" - "strings" "github.com/dave/jennifer/jen" "github.com/ditrit/badaas/tools/badctl/cmd/version" - "github.com/ditrit/verdeter" "github.com/elliotchance/pie/v2" "github.com/ettle/strcase" - "github.com/spf13/cobra" - - "golang.org/x/tools/go/packages" ) -var genConditionsCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ - Use: "conditions", - Short: "Generate conditions to query your objects using BaDORM", - Long: `gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way.`, - Run: generateConditions, - Args: cobra.MinimumNArgs(1), -}) - -// badorm/baseModels.go -var badORMModels = []string{"UUIDModel", "UIntModel"} - -const ( - badORMPath = "github.com/ditrit/badaas/badorm" - // badorm/condition.go - badORMCondition = "Condition" - badORMWhereCondition = "WhereCondition" - badORMJoinCondition = "JoinCondition" -) - -var destPkg string - -func generateConditions(cmd *cobra.Command, args []string) { - // Inspect package and use type checker to infer imported types - pkgs := loadPackages(args) - - // Get the package of the file with go:generate comment - destPkg = os.Getenv("GOPACKAGE") - if destPkg == "" { - // TODO que tambien se pueda usar solo - failErr(errors.New("this command should be called using go generate")) - } +type File struct { + destPkg string + jenFile *jen.File + name string +} - for _, pkg := range pkgs { - log.Println(pkg.Types.Path()) - log.Println(pkg.Types.Name()) +func NewConditionsFile(destPkg string, name string) *File { + // Start a new file in destination package + f := jen.NewFile(destPkg) - for _, name := range pkg.Types.Scope().Names() { - object := getObject(pkg, name) - if object != nil { - log.Println(name) + // Add a package comment, so IDEs detect files as generated + f.PackageComment("Code generated by badctl v" + version.Version + ", DO NOT EDIT.") - // Generate code using jennifer - err := generateConditionsFile(object) - if err != nil { - failErr(err) - } - } - } + return &File{ + destPkg: destPkg, + name: name, + jenFile: f, } } -func loadPackages(paths []string) []*packages.Package { - cfg := &packages.Config{Mode: packages.NeedTypes} - pkgs, err := packages.Load(cfg, paths...) +func (file File) AddConditionsFor(object types.Object) error { + // Generate only when underlying type is a struct + // (ignore const, var, func, etc.) + structType, err := getBadORMModelStruct(object) if err != nil { - failErr(fmt.Errorf("loading packages for inspection: %v", err)) + return err } - // print compilation errors of source packages - packages.PrintErrors(pkgs) - - return pkgs -} - -func failErr(err error) { + fields, err := getFields(structType, "") if err != nil { - fmt.Fprintf(os.Stderr, "Error: %v\n", err) - os.Exit(1) + return err } + + file.addConditionsForEachField(object, fields) + return nil } -func getObject(pkg *packages.Package, name string) types.Object { - obj := pkg.Types.Scope().Lookup(name) - if obj == nil { - failErr(fmt.Errorf("%s not found in declared types of %s", - name, pkg)) - } +func (file File) addConditionsForEachField(object types.Object, fields []Field) { + conditions := generateConditionsForEachField(object, fields) - // Generate only if it is a declared type - object, ok := obj.(*types.TypeName) - if !ok { - return nil + for _, condition := range conditions { + file.jenFile.Add(condition) } +} - return object +// Write generated file +func (file File) Save() error { + return file.jenFile.Save(file.name) } -// TODO add logs +// badorm/baseModels.go +var badORMModels = []string{"UUIDModel", "UIntModel"} -func generateConditionsFile(object types.Object) error { - // Generate only when underlying type is a struct - // (ignore const, var, func, etc.) - structType := getBadORMModelStruct(object) - if structType == nil { - return nil - } +const ( + badORMPath = "github.com/ditrit/badaas/badorm" + // badorm/condition.go + badORMCondition = "Condition" + badORMWhereCondition = "WhereCondition" + badORMJoinCondition = "JoinCondition" +) - fields := getFields(structType, "") - if len(fields) == 0 { - return nil +func generateConditionsForEachField(object types.Object, fields []Field) []jen.Code { + conditions := []jen.Code{} + for _, field := range fields { + log.Println(field.Name) + if field.Embedded { + conditions = append(conditions, generateEmbeddedConditions( + object, + field, + )...) + } else { + conditions = append(conditions, generateConditionsForField( + object, field, + basicParam.Clone(), + )...) + } } - // Start a new file in destination package - f := jen.NewFile(destPkg) - - // Add a package comment, so IDEs detect files as generated - f.PackageComment("Code generated by badctl v" + version.Version + ", DO NOT EDIT.") - - addConditionForEachField(f, object, fields) - - // Write generated file - return f.Save(strings.ToLower(object.Name()) + "_conditions.go") + return conditions } -func getBadORMModelStruct(object types.Object) *types.Struct { +func getBadORMModelStruct(object types.Object) (*types.Struct, error) { structType, ok := object.Type().Underlying().(*types.Struct) if !ok || !isBadORMModel(structType) { - return nil + return nil, errors.New("object is not a BaDORM model") } - return structType + return structType, nil } func isBadORMModel(structType *types.Struct) bool { @@ -154,26 +114,7 @@ func isBadORMModel(structType *types.Struct) bool { return false } -func addConditionForEachField(f *jen.File, object types.Object, fields []Field) { - for _, field := range fields { - log.Println(field.Name) - if field.Embedded { - addEmbeddedConditions( - f, - object, - field, - ) - } else { - addConditionsForField( - f, - object, - field, - ) - } - } -} - -func addEmbeddedConditions(f *jen.File, object types.Object, field Field) { +func generateEmbeddedConditions(object types.Object, field Field) []jen.Code { embeddedFieldType, ok := field.Type.Type().(*types.Named) if !ok { failErr(errors.New("unreachable! embedded objects are always of type Named")) @@ -183,26 +124,17 @@ func addEmbeddedConditions(f *jen.File, object types.Object, field Field) { failErr(errors.New("unreachable! embedded objects are always structs")) } - addConditionForEachField( - f, - object, - getFields(embeddedStructType, field.Tags.getEmbeddedPrefix()), - ) + fields, err := getFields(embeddedStructType, field.Tags.getEmbeddedPrefix()) + if err != nil { + // TODO ver esto + return []jen.Code{} + } + + return generateConditionsForEachField(object, fields) } var basicParam = jen.Id("v") -func addConditionsForField(f *jen.File, object types.Object, field Field) { - conditions := generateConditionsForField( - object, field, - basicParam.Clone(), - ) - - for _, condition := range conditions { - f.Add(condition) - } -} - func generateConditionsForField(object types.Object, field Field, param *jen.Statement) []jen.Code { switch fieldTypeTyped := field.Type.Type().(type) { case *types.Basic: @@ -242,14 +174,26 @@ func generateConditionsForField(object types.Object, field Field, param *jen.Sta func generateConditionsForNamedType(object types.Object, field Field, fieldType *types.Named, param *jen.Statement) []jen.Code { // TODO quizas aca se puede eliminar el fieldType fieldObject := fieldType.Obj() - fieldModelStruct := getBadORMModelStruct(fieldObject) - if fieldModelStruct != nil { + // TODO esta linea de aca quedo rara + _, err := getBadORMModelStruct(fieldObject) + log.Println(err) + + if err == nil { + objectStruct, err := getBadORMModelStruct(object) + if err != nil { + // TODO ver esto + return []jen.Code{} + } // TODO que pasa si esta en otro package? se importa solo? - fields := getFields( - getBadORMModelStruct(object), - // TODO testear esto + fields, err := getFields( + objectStruct, + // TODO testear esto si esta bien aca field.Tags.getEmbeddedPrefix(), ) + if err != nil { + // TODO ver esto + return []jen.Code{} + } thisEntityHasTheFK := pie.Any(fields, func(otherField Field) bool { return otherField.Name == field.getJoinFromColumn() }) @@ -311,15 +255,16 @@ func generateConditionForSlice(object types.Object, field Field, elemType types. param, ) case *types.Named: - elemTypeName := elemTypeTyped.Obj() + elemObject := elemTypeTyped.Obj() // inverse relation condition - if getBadORMModelStruct(elemTypeName) != nil { - log.Println(elemTypeName.Name()) + _, err := getBadORMModelStruct(elemObject) + if err == nil { + log.Println(elemObject.Name()) return []jen.Code{ generateOppositeJoinCondition( object, field, - elemTypeName, + elemObject, ), } } diff --git a/tools/badctl/cmd/gen/gormTag.go b/tools/badctl/cmd/gen/conditions/gormTag.go similarity index 98% rename from tools/badctl/cmd/gen/gormTag.go rename to tools/badctl/cmd/gen/conditions/gormTag.go index 9f482b19..6df96aae 100644 --- a/tools/badctl/cmd/gen/gormTag.go +++ b/tools/badctl/cmd/gen/conditions/gormTag.go @@ -1,4 +1,4 @@ -package gen +package conditions import ( "strings" diff --git a/tools/badctl/cmd/gen/gen.go b/tools/badctl/cmd/gen/gen.go index d1644a6e..7d0ffd3a 100644 --- a/tools/badctl/cmd/gen/gen.go +++ b/tools/badctl/cmd/gen/gen.go @@ -1,6 +1,7 @@ package gen import ( + "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions" "github.com/ditrit/verdeter" ) @@ -12,5 +13,5 @@ var GenCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ func init() { GenCmd.AddSubCommand(genDockerCmd) - GenCmd.AddSubCommand(genConditionsCmd) + GenCmd.AddSubCommand(conditions.GenConditionsCmd) } From e74ae1f4f6c4faf75904c088b85644adb4a57241 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 16:44:22 +0200 Subject: [PATCH 221/467] rename file --- tools/badctl/cmd/gen/conditions/{conditions.go => main.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tools/badctl/cmd/gen/conditions/{conditions.go => main.go} (100%) diff --git a/tools/badctl/cmd/gen/conditions/conditions.go b/tools/badctl/cmd/gen/conditions/main.go similarity index 100% rename from tools/badctl/cmd/gen/conditions/conditions.go rename to tools/badctl/cmd/gen/conditions/main.go From a21196eac802f9160adbeee3bcdefe4efadc306a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 17:12:47 +0200 Subject: [PATCH 222/467] refactor: condition type --- tools/badctl/cmd/gen/conditions/condition.go | 340 ++++++++++++++++++ tools/badctl/cmd/gen/conditions/file.go | 346 +------------------ 2 files changed, 350 insertions(+), 336 deletions(-) create mode 100644 tools/badctl/cmd/gen/conditions/condition.go diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go new file mode 100644 index 00000000..73ab57e1 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -0,0 +1,340 @@ +package conditions + +import ( + "go/types" + "log" + "regexp" + + "github.com/dave/jennifer/jen" + "github.com/elliotchance/pie/v2" + "github.com/ettle/strcase" +) + +type Condition struct { + codes []jen.Code + param *jen.Statement +} + +func NewCondition(object types.Object, field Field) *Condition { + condition := &Condition{ + param: jen.Id("v"), + } + condition.generateCode(object, field) + return condition +} + +func (condition *Condition) generateCode(object types.Object, field Field) { + switch fieldTypeTyped := field.Type.Type().(type) { + case *types.Basic: + condition.codes = []jen.Code{generateWhereCondition( + object, + field, + typeKindToJenStatement[fieldTypeTyped.Kind()](condition.param), + )} + case *types.Named: + condition.codes = generateConditionsForNamedType( + object, + field, fieldTypeTyped, + condition.param, + ) + case *types.Pointer: + condition.param = condition.param.Op("*") + condition.generateCode( + object, + field.ChangeType(fieldTypeTyped.Elem()), + ) + case *types.Slice: + condition.param = condition.param.Index() + condition.generateCodeForSlice( + object, + field, fieldTypeTyped.Elem(), + ) + default: + log.Printf("struct field type not handled: %T", fieldTypeTyped) + } +} + +func (condition *Condition) generateCodeForSlice(object types.Object, field Field, elemType types.Type) { + switch elemTypeTyped := elemType.(type) { + case *types.Basic: + // una list de strings o algo asi, + // por el momento solo anda con []byte porque el resto gorm no lo sabe encodear + condition.generateCode( + object, + field.ChangeType(elemTypeTyped), + ) + case *types.Named: + elemObject := elemTypeTyped.Obj() + // inverse relation condition + _, err := getBadORMModelStruct(elemObject) + if err == nil { + log.Println(elemObject.Name()) + condition.codes = []jen.Code{ + generateOppositeJoinCondition( + object, + field, + elemObject, + ), + } + } + case *types.Pointer: + condition.param = condition.param.Op("*") + // slice de pointers, solo testeado temporalmente porque despues gorm no lo soporta + condition.generateCodeForSlice( + object, + field, elemTypeTyped.Elem(), + ) + default: + log.Printf("struct field list elem type not handled: %T", elemTypeTyped) + } +} + +func generateConditionsForNamedType(object types.Object, field Field, fieldType *types.Named, param *jen.Statement) []jen.Code { + // TODO quizas aca se puede eliminar el fieldType + fieldObject := fieldType.Obj() + // TODO esta linea de aca quedo rara + _, err := getBadORMModelStruct(fieldObject) + log.Println(err) + + if err == nil { + objectStruct, err := getBadORMModelStruct(object) + if err != nil { + // TODO ver esto + return []jen.Code{} + } + // TODO que pasa si esta en otro package? se importa solo? + fields, err := getFields( + objectStruct, + // TODO testear esto si esta bien aca + field.Tags.getEmbeddedPrefix(), + ) + if err != nil { + // TODO ver esto + return []jen.Code{} + } + thisEntityHasTheFK := pie.Any(fields, func(otherField Field) bool { + return otherField.Name == field.getJoinFromColumn() + }) + + log.Println(field.getJoinFromColumn()) + log.Println(thisEntityHasTheFK) + + if thisEntityHasTheFK { + // belongsTo relation + return []jen.Code{ + generateJoinCondition( + object, + field, + ), + } + } + + // hasOne or hasMany relation + inverseJoinCondition := generateInverseJoinCondition( + object, + field, fieldObject, + ) + + return []jen.Code{ + inverseJoinCondition, + generateOppositeJoinCondition( + object, + field, + fieldObject, + ), + } + + // TODO DeletedAt + } else if (isGormCustomType(fieldType) || fieldType.String() == "time.Time") && fieldType.String() != "gorm.io/gorm.DeletedAt" { + return []jen.Code{ + generateWhereCondition( + object, + field, + param.Clone().Qual( + getRelativePackagePath(fieldObject.Pkg()), + fieldObject.Name(), + ), + ), + } + } + + log.Printf("struct field type not handled: %s", fieldType.String()) + return []jen.Code{} +} + +var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) +var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) + +func isGormCustomType(typeNamed *types.Named) bool { + hasScanMethod := false + hasValueMethod := false + for i := 0; i < typeNamed.NumMethods(); i++ { + methodSignature := typeNamed.Method(i).String() + + if !hasScanMethod && scanMethod.MatchString(methodSignature) { + hasScanMethod = true + } else if !hasValueMethod && valueMethod.MatchString(methodSignature) { + hasValueMethod = true + } + } + + return hasScanMethod && hasValueMethod +} + +var typeKindToJenStatement = map[types.BasicKind]func(*jen.Statement) *jen.Statement{ + types.Bool: func(param *jen.Statement) *jen.Statement { return param.Bool() }, + types.Int: func(param *jen.Statement) *jen.Statement { return param.Int() }, + types.Int8: func(param *jen.Statement) *jen.Statement { return param.Int8() }, + types.Int16: func(param *jen.Statement) *jen.Statement { return param.Int16() }, + types.Int32: func(param *jen.Statement) *jen.Statement { return param.Int32() }, + types.Int64: func(param *jen.Statement) *jen.Statement { return param.Int64() }, + types.Uint: func(param *jen.Statement) *jen.Statement { return param.Uint() }, + types.Uint8: func(param *jen.Statement) *jen.Statement { return param.Uint8() }, + types.Uint16: func(param *jen.Statement) *jen.Statement { return param.Uint16() }, + types.Uint32: func(param *jen.Statement) *jen.Statement { return param.Uint32() }, + types.Uint64: func(param *jen.Statement) *jen.Statement { return param.Uint64() }, + types.Uintptr: func(param *jen.Statement) *jen.Statement { return param.Uintptr() }, + types.Float32: func(param *jen.Statement) *jen.Statement { return param.Float32() }, + types.Float64: func(param *jen.Statement) *jen.Statement { return param.Float64() }, + types.Complex64: func(param *jen.Statement) *jen.Statement { return param.Complex64() }, + types.Complex128: func(param *jen.Statement) *jen.Statement { return param.Complex128() }, + types.String: func(param *jen.Statement) *jen.Statement { return param.String() }, +} + +func generateWhereCondition(object types.Object, field Field, param *jen.Statement) *jen.Statement { + whereCondition := jen.Qual( + badORMPath, badORMWhereCondition, + ).Types( + jen.Qual( + getRelativePackagePath(object.Pkg()), + object.Name(), + ), + ) + + return jen.Func().Id( + getConditionName(object, field.Name), + ).Params( + param, + ).Add( + whereCondition.Clone(), + ).Block( + jen.Return( + whereCondition.Clone().Values(jen.Dict{ + jen.Id("Field"): jen.Lit(field.getColumnName()), + jen.Id("Value"): jen.Id("v"), + }), + ), + ) +} + +func generateOppositeJoinCondition(object types.Object, field Field, fieldObject types.Object) *jen.Statement { + return generateJoinCondition( + fieldObject, + // TODO testear los Override Foreign Key + Field{ + Name: object.Name(), + Type: object, + Tags: field.Tags, + }, + ) +} + +func generateJoinCondition(object types.Object, field Field) *jen.Statement { + log.Println(field.Type.Name()) + + t1 := jen.Qual( + getRelativePackagePath(object.Pkg()), + object.Name(), + ) + + // TODO field.Type.Name me da lo mismo que field.Name + t2 := jen.Qual( + getRelativePackagePath(field.Type.Pkg()), + field.TypeName(), + ) + + badormT1Condition := jen.Qual( + badORMPath, badORMCondition, + ).Types(t1) + badormT2Condition := jen.Qual( + badORMPath, badORMCondition, + ).Types(t2) + badormJoinCondition := jen.Qual( + badORMPath, badORMJoinCondition, + ).Types( + t1, t2, + ) + + return jen.Func().Id( + getConditionName(object, field.Name), + ).Params( + jen.Id("conditions").Op("...").Add(badormT2Condition), + ).Add( + badormT1Condition, + ).Block( + jen.Return( + badormJoinCondition.Values(jen.Dict{ + jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinFromColumn())), + jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), + jen.Id("Conditions"): jen.Id("conditions"), + }), + ), + ) +} + +// TODO codigo duplicado +// TODO probablemente se puede hacer con el mismo metodo pero con el orden inverso +func generateInverseJoinCondition(object types.Object, field Field, fieldObject types.Object) *jen.Statement { + log.Println(fieldObject.String()) + + t1 := jen.Qual( + getRelativePackagePath(object.Pkg()), + object.Name(), + ) + + t2 := jen.Qual( + getRelativePackagePath(fieldObject.Pkg()), + fieldObject.Name(), + ) + + badormT1Condition := jen.Qual( + badORMPath, badORMCondition, + ).Types(t1) + badormT2Condition := jen.Qual( + badORMPath, badORMCondition, + ).Types(t2) + badormJoinCondition := jen.Qual( + badORMPath, badORMJoinCondition, + ).Types( + t1, t2, + ) + + return jen.Func().Id( + getConditionName(object, field.Name), + ).Params( + jen.Id("conditions").Op("...").Add(badormT2Condition), + ).Add( + badormT1Condition, + ).Block( + jen.Return( + badormJoinCondition.Values(jen.Dict{ + jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), + jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.NoSePonerNombre(object.Name()))), + jen.Id("Conditions"): jen.Id("conditions"), + }), + ), + ) +} + +func getConditionName(object types.Object, fieldName string) string { + return strcase.ToPascal(object.Name()) + strcase.ToPascal(fieldName) + badORMCondition +} + +// TODO testear esto +func getRelativePackagePath(srcPkg *types.Package) string { + if srcPkg.Name() == destPkg { + return "" + } + + return srcPkg.Path() +} diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index a9e801b2..466a3c4e 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -4,12 +4,10 @@ import ( "errors" "go/types" "log" - "regexp" "github.com/dave/jennifer/jen" "github.com/ditrit/badaas/tools/badctl/cmd/version" "github.com/elliotchance/pie/v2" - "github.com/ettle/strcase" ) type File struct { @@ -53,7 +51,10 @@ func (file File) addConditionsForEachField(object types.Object, fields []Field) conditions := generateConditionsForEachField(object, fields) for _, condition := range conditions { - file.jenFile.Add(condition) + // TODO esto no me gusta mucho que este aca + for _, code := range condition.codes { + file.jenFile.Add(code) + } } } @@ -73,8 +74,8 @@ const ( badORMJoinCondition = "JoinCondition" ) -func generateConditionsForEachField(object types.Object, fields []Field) []jen.Code { - conditions := []jen.Code{} +func generateConditionsForEachField(object types.Object, fields []Field) []*Condition { + conditions := []*Condition{} for _, field := range fields { log.Println(field.Name) if field.Embedded { @@ -83,10 +84,9 @@ func generateConditionsForEachField(object types.Object, fields []Field) []jen.C field, )...) } else { - conditions = append(conditions, generateConditionsForField( + conditions = append(conditions, NewCondition( object, field, - basicParam.Clone(), - )...) + )) } } @@ -114,7 +114,7 @@ func isBadORMModel(structType *types.Struct) bool { return false } -func generateEmbeddedConditions(object types.Object, field Field) []jen.Code { +func generateEmbeddedConditions(object types.Object, field Field) []*Condition { embeddedFieldType, ok := field.Type.Type().(*types.Named) if !ok { failErr(errors.New("unreachable! embedded objects are always of type Named")) @@ -127,334 +127,8 @@ func generateEmbeddedConditions(object types.Object, field Field) []jen.Code { fields, err := getFields(embeddedStructType, field.Tags.getEmbeddedPrefix()) if err != nil { // TODO ver esto - return []jen.Code{} + return []*Condition{} } return generateConditionsForEachField(object, fields) } - -var basicParam = jen.Id("v") - -func generateConditionsForField(object types.Object, field Field, param *jen.Statement) []jen.Code { - switch fieldTypeTyped := field.Type.Type().(type) { - case *types.Basic: - return []jen.Code{ - generateWhereCondition( - object, - field, - typeKindToJenStatement[fieldTypeTyped.Kind()](param), - ), - } - case *types.Named: - return generateConditionsForNamedType( - object, - field, fieldTypeTyped, - param, - ) - case *types.Pointer: - return generateConditionsForField( - object, - field.ChangeType(fieldTypeTyped.Elem()), - param.Clone().Op("*"), - ) - case *types.Slice: - return generateConditionForSlice( - object, - field, fieldTypeTyped.Elem(), - param.Clone().Index(), - ) - default: - log.Printf("struct field type not handled: %T", fieldTypeTyped) - } - - // TODO ver este error - return []jen.Code{} -} - -func generateConditionsForNamedType(object types.Object, field Field, fieldType *types.Named, param *jen.Statement) []jen.Code { - // TODO quizas aca se puede eliminar el fieldType - fieldObject := fieldType.Obj() - // TODO esta linea de aca quedo rara - _, err := getBadORMModelStruct(fieldObject) - log.Println(err) - - if err == nil { - objectStruct, err := getBadORMModelStruct(object) - if err != nil { - // TODO ver esto - return []jen.Code{} - } - // TODO que pasa si esta en otro package? se importa solo? - fields, err := getFields( - objectStruct, - // TODO testear esto si esta bien aca - field.Tags.getEmbeddedPrefix(), - ) - if err != nil { - // TODO ver esto - return []jen.Code{} - } - thisEntityHasTheFK := pie.Any(fields, func(otherField Field) bool { - return otherField.Name == field.getJoinFromColumn() - }) - - log.Println(field.getJoinFromColumn()) - log.Println(thisEntityHasTheFK) - - if thisEntityHasTheFK { - // belongsTo relation - return []jen.Code{ - generateJoinCondition( - object, - field, - ), - } - } - - // hasOne or hasMany relation - inverseJoinCondition := generateInverseJoinCondition( - object, - field, fieldObject, - ) - - return []jen.Code{ - inverseJoinCondition, - generateOppositeJoinCondition( - object, - field, - fieldObject, - ), - } - - // TODO DeletedAt - } else if (isGormCustomType(fieldType) || fieldType.String() == "time.Time") && fieldType.String() != "gorm.io/gorm.DeletedAt" { - return []jen.Code{ - generateWhereCondition( - object, - field, - param.Clone().Qual( - getRelativePackagePath(fieldObject.Pkg()), - fieldObject.Name(), - ), - ), - } - } - - log.Printf("struct field type not handled: %s", fieldType.String()) - return []jen.Code{} -} - -func generateConditionForSlice(object types.Object, field Field, elemType types.Type, param *jen.Statement) []jen.Code { - switch elemTypeTyped := elemType.(type) { - case *types.Basic: - // una list de strings o algo asi, - // por el momento solo anda con []byte porque el resto gorm no lo sabe encodear - return generateConditionsForField( - object, - field.ChangeType(elemTypeTyped), - param, - ) - case *types.Named: - elemObject := elemTypeTyped.Obj() - // inverse relation condition - _, err := getBadORMModelStruct(elemObject) - if err == nil { - log.Println(elemObject.Name()) - return []jen.Code{ - generateOppositeJoinCondition( - object, - field, - elemObject, - ), - } - } - case *types.Pointer: - // slice de pointers, solo testeado temporalmente porque despues gorm no lo soporta - return generateConditionForSlice( - object, - field, elemTypeTyped.Elem(), - param.Op("*"), - ) - default: - log.Printf("struct field list elem type not handled: %T", elemTypeTyped) - } - - return []jen.Code{} -} - -var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) -var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) - -func isGormCustomType(typeNamed *types.Named) bool { - hasScanMethod := false - hasValueMethod := false - for i := 0; i < typeNamed.NumMethods(); i++ { - methodSignature := typeNamed.Method(i).String() - - if !hasScanMethod && scanMethod.MatchString(methodSignature) { - hasScanMethod = true - } else if !hasValueMethod && valueMethod.MatchString(methodSignature) { - hasValueMethod = true - } - } - - return hasScanMethod && hasValueMethod -} - -var typeKindToJenStatement = map[types.BasicKind]func(*jen.Statement) *jen.Statement{ - types.Bool: func(param *jen.Statement) *jen.Statement { return param.Bool() }, - types.Int: func(param *jen.Statement) *jen.Statement { return param.Int() }, - types.Int8: func(param *jen.Statement) *jen.Statement { return param.Int8() }, - types.Int16: func(param *jen.Statement) *jen.Statement { return param.Int16() }, - types.Int32: func(param *jen.Statement) *jen.Statement { return param.Int32() }, - types.Int64: func(param *jen.Statement) *jen.Statement { return param.Int64() }, - types.Uint: func(param *jen.Statement) *jen.Statement { return param.Uint() }, - types.Uint8: func(param *jen.Statement) *jen.Statement { return param.Uint8() }, - types.Uint16: func(param *jen.Statement) *jen.Statement { return param.Uint16() }, - types.Uint32: func(param *jen.Statement) *jen.Statement { return param.Uint32() }, - types.Uint64: func(param *jen.Statement) *jen.Statement { return param.Uint64() }, - types.Uintptr: func(param *jen.Statement) *jen.Statement { return param.Uintptr() }, - types.Float32: func(param *jen.Statement) *jen.Statement { return param.Float32() }, - types.Float64: func(param *jen.Statement) *jen.Statement { return param.Float64() }, - types.Complex64: func(param *jen.Statement) *jen.Statement { return param.Complex64() }, - types.Complex128: func(param *jen.Statement) *jen.Statement { return param.Complex128() }, - types.String: func(param *jen.Statement) *jen.Statement { return param.String() }, -} - -func generateWhereCondition(object types.Object, field Field, param *jen.Statement) *jen.Statement { - whereCondition := jen.Qual( - badORMPath, badORMWhereCondition, - ).Types( - jen.Qual( - getRelativePackagePath(object.Pkg()), - object.Name(), - ), - ) - - return jen.Func().Id( - getConditionName(object, field.Name), - ).Params( - param, - ).Add( - whereCondition.Clone(), - ).Block( - jen.Return( - whereCondition.Clone().Values(jen.Dict{ - jen.Id("Field"): jen.Lit(field.getColumnName()), - jen.Id("Value"): jen.Id("v"), - }), - ), - ) -} - -func generateOppositeJoinCondition(object types.Object, field Field, fieldObject types.Object) *jen.Statement { - return generateJoinCondition( - fieldObject, - // TODO testear los Override Foreign Key - Field{ - Name: object.Name(), - Type: object, - Tags: field.Tags, - }, - ) -} - -func generateJoinCondition(object types.Object, field Field) *jen.Statement { - log.Println(field.Type.Name()) - - t1 := jen.Qual( - getRelativePackagePath(object.Pkg()), - object.Name(), - ) - - // TODO field.Type.Name me da lo mismo que field.Name - t2 := jen.Qual( - getRelativePackagePath(field.Type.Pkg()), - field.TypeName(), - ) - - badormT1Condition := jen.Qual( - badORMPath, badORMCondition, - ).Types(t1) - badormT2Condition := jen.Qual( - badORMPath, badORMCondition, - ).Types(t2) - badormJoinCondition := jen.Qual( - badORMPath, badORMJoinCondition, - ).Types( - t1, t2, - ) - - return jen.Func().Id( - getConditionName(object, field.Name), - ).Params( - jen.Id("conditions").Op("...").Add(badormT2Condition), - ).Add( - badormT1Condition, - ).Block( - jen.Return( - badormJoinCondition.Values(jen.Dict{ - jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinFromColumn())), - jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), - jen.Id("Conditions"): jen.Id("conditions"), - }), - ), - ) -} - -// TODO codigo duplicado -// TODO probablemente se puede hacer con el mismo metodo pero con el orden inverso -func generateInverseJoinCondition(object types.Object, field Field, fieldObject types.Object) *jen.Statement { - log.Println(fieldObject.String()) - - t1 := jen.Qual( - getRelativePackagePath(object.Pkg()), - object.Name(), - ) - - t2 := jen.Qual( - getRelativePackagePath(fieldObject.Pkg()), - fieldObject.Name(), - ) - - badormT1Condition := jen.Qual( - badORMPath, badORMCondition, - ).Types(t1) - badormT2Condition := jen.Qual( - badORMPath, badORMCondition, - ).Types(t2) - badormJoinCondition := jen.Qual( - badORMPath, badORMJoinCondition, - ).Types( - t1, t2, - ) - - return jen.Func().Id( - getConditionName(object, field.Name), - ).Params( - jen.Id("conditions").Op("...").Add(badormT2Condition), - ).Add( - badormT1Condition, - ).Block( - jen.Return( - badormJoinCondition.Values(jen.Dict{ - jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), - jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.NoSePonerNombre(object.Name()))), - jen.Id("Conditions"): jen.Id("conditions"), - }), - ), - ) -} - -func getConditionName(object types.Object, fieldName string) string { - return strcase.ToPascal(object.Name()) + strcase.ToPascal(fieldName) + badORMCondition -} - -// TODO testear esto -func getRelativePackagePath(srcPkg *types.Package) string { - if srcPkg.Name() == destPkg { - return "" - } - - return srcPkg.Path() -} From 080837fa67fda143e0cb67b02bf5b8edeba31373 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 17:17:20 +0200 Subject: [PATCH 223/467] refactor: field type -> field object --- tools/badctl/cmd/gen/conditions/condition.go | 22 ++++++++++---------- tools/badctl/cmd/gen/conditions/field.go | 14 ++++++------- tools/badctl/cmd/gen/conditions/file.go | 2 +- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 73ab57e1..390bd245 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -24,33 +24,33 @@ func NewCondition(object types.Object, field Field) *Condition { } func (condition *Condition) generateCode(object types.Object, field Field) { - switch fieldTypeTyped := field.Type.Type().(type) { + switch fieldType := field.Object.Type().(type) { case *types.Basic: condition.codes = []jen.Code{generateWhereCondition( object, field, - typeKindToJenStatement[fieldTypeTyped.Kind()](condition.param), + typeKindToJenStatement[fieldType.Kind()](condition.param), )} case *types.Named: condition.codes = generateConditionsForNamedType( object, - field, fieldTypeTyped, + field, fieldType, condition.param, ) case *types.Pointer: condition.param = condition.param.Op("*") condition.generateCode( object, - field.ChangeType(fieldTypeTyped.Elem()), + field.ChangeType(fieldType.Elem()), ) case *types.Slice: condition.param = condition.param.Index() condition.generateCodeForSlice( object, - field, fieldTypeTyped.Elem(), + field, fieldType.Elem(), ) default: - log.Printf("struct field type not handled: %T", fieldTypeTyped) + log.Printf("struct field type not handled: %T", fieldType) } } @@ -232,15 +232,15 @@ func generateOppositeJoinCondition(object types.Object, field Field, fieldObject fieldObject, // TODO testear los Override Foreign Key Field{ - Name: object.Name(), - Type: object, - Tags: field.Tags, + Name: object.Name(), + Object: object, + Tags: field.Tags, }, ) } func generateJoinCondition(object types.Object, field Field) *jen.Statement { - log.Println(field.Type.Name()) + log.Println(field.Object.Name()) t1 := jen.Qual( getRelativePackagePath(object.Pkg()), @@ -249,7 +249,7 @@ func generateJoinCondition(object types.Object, field Field) *jen.Statement { // TODO field.Type.Name me da lo mismo que field.Name t2 := jen.Qual( - getRelativePackagePath(field.Type.Pkg()), + getRelativePackagePath(field.Object.Pkg()), field.TypeName(), ) diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index 6214dccd..7c797e77 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -11,7 +11,7 @@ import ( type Field struct { Name string - Type types.Object + Object types.Object Embedded bool Tags GormTags } @@ -56,16 +56,16 @@ func (field Field) NoSePonerNombre(structName string) string { } func (field Field) TypeName() string { - return pie.Last(strings.Split(field.Type.Type().String(), ".")) + return pie.Last(strings.Split(field.Object.Type().String(), ".")) } func (field Field) ChangeType(newType types.Type) Field { return Field{ Name: field.Name, - Type: types.NewTypeName( - field.Type.Pos(), - field.Type.Pkg(), - field.Type.Name(), + Object: types.NewTypeName( + field.Object.Pos(), + field.Object.Pkg(), + field.Object.Name(), newType, ), Tags: field.Tags, @@ -87,7 +87,7 @@ func getFields(structType *types.Struct, prefix string) ([]Field, error) { fields = append(fields, Field{ // TODO el Name se podria sacar si meto este prefix adentro del tipo Name: prefix + fieldType.Name(), - Type: fieldType, + Object: fieldType, Embedded: fieldType.Embedded() || gormTags.hasEmbedded(), Tags: gormTags, }) diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 466a3c4e..39373ac9 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -115,7 +115,7 @@ func isBadORMModel(structType *types.Struct) bool { } func generateEmbeddedConditions(object types.Object, field Field) []*Condition { - embeddedFieldType, ok := field.Type.Type().(*types.Named) + embeddedFieldType, ok := field.Object.Type().(*types.Named) if !ok { failErr(errors.New("unreachable! embedded objects are always of type Named")) } From 16c3329bcf502b9e1025deddc4a06714e8cf71ea Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 17:30:48 +0200 Subject: [PATCH 224/467] refactor: more code to methods --- tools/badctl/cmd/gen/conditions/condition.go | 98 ++++++++++---------- 1 file changed, 48 insertions(+), 50 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 390bd245..02c1fc3e 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -26,16 +26,15 @@ func NewCondition(object types.Object, field Field) *Condition { func (condition *Condition) generateCode(object types.Object, field Field) { switch fieldType := field.Object.Type().(type) { case *types.Basic: - condition.codes = []jen.Code{generateWhereCondition( + condition.param = typeKindToJenStatement[fieldType.Kind()](condition.param) + condition.generateWhereCondition( object, field, - typeKindToJenStatement[fieldType.Kind()](condition.param), - )} + ) case *types.Named: - condition.codes = generateConditionsForNamedType( + condition.generateCodeForNamedType( object, field, fieldType, - condition.param, ) case *types.Pointer: condition.param = condition.param.Op("*") @@ -89,7 +88,7 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel } } -func generateConditionsForNamedType(object types.Object, field Field, fieldType *types.Named, param *jen.Statement) []jen.Code { +func (condition *Condition) generateCodeForNamedType(object types.Object, field Field, fieldType *types.Named) { // TODO quizas aca se puede eliminar el fieldType fieldObject := fieldType.Obj() // TODO esta linea de aca quedo rara @@ -100,7 +99,7 @@ func generateConditionsForNamedType(object types.Object, field Field, fieldType objectStruct, err := getBadORMModelStruct(object) if err != nil { // TODO ver esto - return []jen.Code{} + return } // TODO que pasa si esta en otro package? se importa solo? fields, err := getFields( @@ -110,7 +109,7 @@ func generateConditionsForNamedType(object types.Object, field Field, fieldType ) if err != nil { // TODO ver esto - return []jen.Code{} + return } thisEntityHasTheFK := pie.Any(fields, func(otherField Field) bool { return otherField.Name == field.getJoinFromColumn() @@ -121,45 +120,41 @@ func generateConditionsForNamedType(object types.Object, field Field, fieldType if thisEntityHasTheFK { // belongsTo relation - return []jen.Code{ + condition.codes = []jen.Code{ generateJoinCondition( object, field, ), } - } - - // hasOne or hasMany relation - inverseJoinCondition := generateInverseJoinCondition( - object, - field, fieldObject, - ) - - return []jen.Code{ - inverseJoinCondition, - generateOppositeJoinCondition( + } else { + // hasOne or hasMany relation + inverseJoinCondition := generateInverseJoinCondition( object, - field, - fieldObject, - ), - } + field, fieldObject, + ) - // TODO DeletedAt - } else if (isGormCustomType(fieldType) || fieldType.String() == "time.Time") && fieldType.String() != "gorm.io/gorm.DeletedAt" { - return []jen.Code{ - generateWhereCondition( - object, - field, - param.Clone().Qual( - getRelativePackagePath(fieldObject.Pkg()), - fieldObject.Name(), + condition.codes = []jen.Code{ + inverseJoinCondition, + generateOppositeJoinCondition( + object, + field, + fieldObject, ), - ), + } } + } else if (isGormCustomType(fieldType) || fieldType.String() == "time.Time") && fieldType.String() != "gorm.io/gorm.DeletedAt" { + // TODO DeletedAt + condition.param = condition.param.Qual( + getRelativePackagePath(fieldObject.Pkg()), + fieldObject.Name(), + ) + condition.generateWhereCondition( + object, + field, + ) + } else { + log.Printf("struct field type not handled: %s", fieldType.String()) } - - log.Printf("struct field type not handled: %s", fieldType.String()) - return []jen.Code{} } var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) @@ -201,7 +196,7 @@ var typeKindToJenStatement = map[types.BasicKind]func(*jen.Statement) *jen.State types.String: func(param *jen.Statement) *jen.Statement { return param.String() }, } -func generateWhereCondition(object types.Object, field Field, param *jen.Statement) *jen.Statement { +func (condition *Condition) generateWhereCondition(object types.Object, field Field) { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, ).Types( @@ -211,18 +206,21 @@ func generateWhereCondition(object types.Object, field Field, param *jen.Stateme ), ) - return jen.Func().Id( - getConditionName(object, field.Name), - ).Params( - param, - ).Add( - whereCondition.Clone(), - ).Block( - jen.Return( - whereCondition.Clone().Values(jen.Dict{ - jen.Id("Field"): jen.Lit(field.getColumnName()), - jen.Id("Value"): jen.Id("v"), - }), + condition.codes = append( + condition.codes, + jen.Func().Id( + getConditionName(object, field.Name), + ).Params( + condition.param, + ).Add( + whereCondition.Clone(), + ).Block( + jen.Return( + whereCondition.Clone().Values(jen.Dict{ + jen.Id("Field"): jen.Lit(field.getColumnName()), + jen.Id("Value"): jen.Id("v"), + }), + ), ), ) } From ab5b597b6c809e32e8b83b91c0955934142a6449 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 17:36:34 +0200 Subject: [PATCH 225/467] refactor: more code to methods 2 --- tools/badctl/cmd/gen/conditions/condition.go | 104 +++++++++---------- tools/badctl/cmd/gen/conditions/field.go | 2 +- 2 files changed, 52 insertions(+), 54 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 02c1fc3e..ac90cc60 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -68,13 +68,11 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel _, err := getBadORMModelStruct(elemObject) if err == nil { log.Println(elemObject.Name()) - condition.codes = []jen.Code{ - generateOppositeJoinCondition( - object, - field, - elemObject, - ), - } + condition.generateOppositeJoinCondition( + object, + field, + elemObject, + ) } case *types.Pointer: condition.param = condition.param.Op("*") @@ -120,27 +118,22 @@ func (condition *Condition) generateCodeForNamedType(object types.Object, field if thisEntityHasTheFK { // belongsTo relation - condition.codes = []jen.Code{ - generateJoinCondition( - object, - field, - ), - } + condition.generateJoinCondition( + object, + field, + ) } else { // hasOne or hasMany relation - inverseJoinCondition := generateInverseJoinCondition( + condition.generateInverseJoinCondition( object, field, fieldObject, ) - condition.codes = []jen.Code{ - inverseJoinCondition, - generateOppositeJoinCondition( - object, - field, - fieldObject, - ), - } + condition.generateOppositeJoinCondition( + object, + field, + fieldObject, + ) } } else if (isGormCustomType(fieldType) || fieldType.String() == "time.Time") && fieldType.String() != "gorm.io/gorm.DeletedAt" { // TODO DeletedAt @@ -225,8 +218,8 @@ func (condition *Condition) generateWhereCondition(object types.Object, field Fi ) } -func generateOppositeJoinCondition(object types.Object, field Field, fieldObject types.Object) *jen.Statement { - return generateJoinCondition( +func (condition *Condition) generateOppositeJoinCondition(object types.Object, field Field, fieldObject types.Object) { + condition.generateJoinCondition( fieldObject, // TODO testear los Override Foreign Key Field{ @@ -237,7 +230,7 @@ func generateOppositeJoinCondition(object types.Object, field Field, fieldObject ) } -func generateJoinCondition(object types.Object, field Field) *jen.Statement { +func (condition *Condition) generateJoinCondition(object types.Object, field Field) { log.Println(field.Object.Name()) t1 := jen.Qual( @@ -245,7 +238,6 @@ func generateJoinCondition(object types.Object, field Field) *jen.Statement { object.Name(), ) - // TODO field.Type.Name me da lo mismo que field.Name t2 := jen.Qual( getRelativePackagePath(field.Object.Pkg()), field.TypeName(), @@ -263,26 +255,29 @@ func generateJoinCondition(object types.Object, field Field) *jen.Statement { t1, t2, ) - return jen.Func().Id( - getConditionName(object, field.Name), - ).Params( - jen.Id("conditions").Op("...").Add(badormT2Condition), - ).Add( - badormT1Condition, - ).Block( - jen.Return( - badormJoinCondition.Values(jen.Dict{ - jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinFromColumn())), - jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), - jen.Id("Conditions"): jen.Id("conditions"), - }), + condition.codes = append( + condition.codes, + jen.Func().Id( + getConditionName(object, field.Name), + ).Params( + jen.Id("conditions").Op("...").Add(badormT2Condition), + ).Add( + badormT1Condition, + ).Block( + jen.Return( + badormJoinCondition.Values(jen.Dict{ + jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinFromColumn())), + jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), + jen.Id("Conditions"): jen.Id("conditions"), + }), + ), ), ) } // TODO codigo duplicado // TODO probablemente se puede hacer con el mismo metodo pero con el orden inverso -func generateInverseJoinCondition(object types.Object, field Field, fieldObject types.Object) *jen.Statement { +func (condition *Condition) generateInverseJoinCondition(object types.Object, field Field, fieldObject types.Object) { log.Println(fieldObject.String()) t1 := jen.Qual( @@ -307,19 +302,22 @@ func generateInverseJoinCondition(object types.Object, field Field, fieldObject t1, t2, ) - return jen.Func().Id( - getConditionName(object, field.Name), - ).Params( - jen.Id("conditions").Op("...").Add(badormT2Condition), - ).Add( - badormT1Condition, - ).Block( - jen.Return( - badormJoinCondition.Values(jen.Dict{ - jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), - jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.NoSePonerNombre(object.Name()))), - jen.Id("Conditions"): jen.Id("conditions"), - }), + condition.codes = append( + condition.codes, + jen.Func().Id( + getConditionName(object, field.Name), + ).Params( + jen.Id("conditions").Op("...").Add(badormT2Condition), + ).Add( + badormT1Condition, + ).Block( + jen.Return( + badormJoinCondition.Values(jen.Dict{ + jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), + jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.NoSePonerNombre(object.Name()))), + jen.Id("Conditions"): jen.Id("conditions"), + }), + ), ), ) } diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index 7c797e77..a934e72c 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -75,7 +75,7 @@ func (field Field) ChangeType(newType types.Type) Field { func getFields(structType *types.Struct, prefix string) ([]Field, error) { numFields := structType.NumFields() if numFields == 0 { - return nil, errors.New("Struct has 0 fields") + return nil, errors.New("struct has 0 fields") } fields := []Field{} From 428ae2028c804ee3bee346f365b36ae433ca59ca Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 17:45:40 +0200 Subject: [PATCH 226/467] refactor: remove duplicated code --- tools/badctl/cmd/gen/conditions/condition.go | 67 ++++++-------------- 1 file changed, 19 insertions(+), 48 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index ac90cc60..2d857652 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -126,7 +126,7 @@ func (condition *Condition) generateCodeForNamedType(object types.Object, field // hasOne or hasMany relation condition.generateInverseJoinCondition( object, - field, fieldObject, + field, ) condition.generateOppositeJoinCondition( @@ -231,54 +231,25 @@ func (condition *Condition) generateOppositeJoinCondition(object types.Object, f } func (condition *Condition) generateJoinCondition(object types.Object, field Field) { - log.Println(field.Object.Name()) - - t1 := jen.Qual( - getRelativePackagePath(object.Pkg()), - object.Name(), - ) - - t2 := jen.Qual( - getRelativePackagePath(field.Object.Pkg()), - field.TypeName(), - ) - - badormT1Condition := jen.Qual( - badORMPath, badORMCondition, - ).Types(t1) - badormT2Condition := jen.Qual( - badORMPath, badORMCondition, - ).Types(t2) - badormJoinCondition := jen.Qual( - badORMPath, badORMJoinCondition, - ).Types( - t1, t2, + condition.generateJoinFromAndTo( + object, + field, + field.getJoinFromColumn(), + field.getJoinToColumn(), ) +} - condition.codes = append( - condition.codes, - jen.Func().Id( - getConditionName(object, field.Name), - ).Params( - jen.Id("conditions").Op("...").Add(badormT2Condition), - ).Add( - badormT1Condition, - ).Block( - jen.Return( - badormJoinCondition.Values(jen.Dict{ - jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinFromColumn())), - jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), - jen.Id("Conditions"): jen.Id("conditions"), - }), - ), - ), +func (condition *Condition) generateInverseJoinCondition(object types.Object, field Field) { + condition.generateJoinFromAndTo( + object, + field, + field.getJoinToColumn(), + field.NoSePonerNombre(object.Name()), ) } -// TODO codigo duplicado -// TODO probablemente se puede hacer con el mismo metodo pero con el orden inverso -func (condition *Condition) generateInverseJoinCondition(object types.Object, field Field, fieldObject types.Object) { - log.Println(fieldObject.String()) +func (condition *Condition) generateJoinFromAndTo(object types.Object, field Field, from, to string) { + log.Println(field.Object.Name()) t1 := jen.Qual( getRelativePackagePath(object.Pkg()), @@ -286,8 +257,8 @@ func (condition *Condition) generateInverseJoinCondition(object types.Object, fi ) t2 := jen.Qual( - getRelativePackagePath(fieldObject.Pkg()), - fieldObject.Name(), + getRelativePackagePath(field.Object.Pkg()), + field.TypeName(), ) badormT1Condition := jen.Qual( @@ -313,8 +284,8 @@ func (condition *Condition) generateInverseJoinCondition(object types.Object, fi ).Block( jen.Return( badormJoinCondition.Values(jen.Dict{ - jen.Id("T1Field"): jen.Lit(strcase.ToSnake(field.getJoinToColumn())), - jen.Id("T2Field"): jen.Lit(strcase.ToSnake(field.NoSePonerNombre(object.Name()))), + jen.Id("T1Field"): jen.Lit(strcase.ToSnake(from)), + jen.Id("T2Field"): jen.Lit(strcase.ToSnake(to)), jen.Id("Conditions"): jen.Id("conditions"), }), ), From 6b2fa04c3cd3f0f028125a98e0cffeebfd959276 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 25 May 2023 17:52:21 +0200 Subject: [PATCH 227/467] refactor map to method --- tools/badctl/cmd/gen/conditions/condition.go | 58 +++++++++++++------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 2d857652..a1487d9f 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -26,7 +26,7 @@ func NewCondition(object types.Object, field Field) *Condition { func (condition *Condition) generateCode(object types.Object, field Field) { switch fieldType := field.Object.Type().(type) { case *types.Basic: - condition.param = typeKindToJenStatement[fieldType.Kind()](condition.param) + condition.adaptParamByKind(fieldType) condition.generateWhereCondition( object, field, @@ -169,26 +169,46 @@ func isGormCustomType(typeNamed *types.Named) bool { return hasScanMethod && hasValueMethod } -var typeKindToJenStatement = map[types.BasicKind]func(*jen.Statement) *jen.Statement{ - types.Bool: func(param *jen.Statement) *jen.Statement { return param.Bool() }, - types.Int: func(param *jen.Statement) *jen.Statement { return param.Int() }, - types.Int8: func(param *jen.Statement) *jen.Statement { return param.Int8() }, - types.Int16: func(param *jen.Statement) *jen.Statement { return param.Int16() }, - types.Int32: func(param *jen.Statement) *jen.Statement { return param.Int32() }, - types.Int64: func(param *jen.Statement) *jen.Statement { return param.Int64() }, - types.Uint: func(param *jen.Statement) *jen.Statement { return param.Uint() }, - types.Uint8: func(param *jen.Statement) *jen.Statement { return param.Uint8() }, - types.Uint16: func(param *jen.Statement) *jen.Statement { return param.Uint16() }, - types.Uint32: func(param *jen.Statement) *jen.Statement { return param.Uint32() }, - types.Uint64: func(param *jen.Statement) *jen.Statement { return param.Uint64() }, - types.Uintptr: func(param *jen.Statement) *jen.Statement { return param.Uintptr() }, - types.Float32: func(param *jen.Statement) *jen.Statement { return param.Float32() }, - types.Float64: func(param *jen.Statement) *jen.Statement { return param.Float64() }, - types.Complex64: func(param *jen.Statement) *jen.Statement { return param.Complex64() }, - types.Complex128: func(param *jen.Statement) *jen.Statement { return param.Complex128() }, - types.String: func(param *jen.Statement) *jen.Statement { return param.String() }, +func (condition *Condition) adaptParamByKind(basicType *types.Basic) { + switch basicType.Kind() { + case types.Bool: + condition.param = condition.param.Bool() + case types.Int: + condition.param = condition.param.Int() + case types.Int8: + condition.param = condition.param.Int8() + case types.Int16: + condition.param = condition.param.Int16() + case types.Int32: + condition.param = condition.param.Int32() + case types.Int64: + condition.param = condition.param.Int64() + case types.Uint: + condition.param = condition.param.Uint() + case types.Uint8: + condition.param = condition.param.Uint8() + case types.Uint16: + condition.param = condition.param.Uint16() + case types.Uint32: + condition.param = condition.param.Uint32() + case types.Uint64: + condition.param = condition.param.Uint64() + case types.Uintptr: + condition.param = condition.param.Uintptr() + case types.Float32: + condition.param = condition.param.Float32() + case types.Float64: + condition.param = condition.param.Float64() + case types.Complex64: + condition.param = condition.param.Complex64() + case types.Complex128: + condition.param = condition.param.Complex128() + case types.String: + condition.param = condition.param.String() + } } +// TODO sacar condition del nombre func (condition *Condition) generateWhereCondition(object types.Object, field Field) { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, From 99274ffc5b81c46de96e57649b13ab79bbbab3fe Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 09:55:10 +0200 Subject: [PATCH 228/467] refactor: replace some fieldObject by field.Object --- tools/badctl/cmd/gen/conditions/condition.go | 75 +++++++++----------- tools/badctl/cmd/gen/conditions/field.go | 44 +++++++++++- 2 files changed, 74 insertions(+), 45 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index a1487d9f..ef7fdf62 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -3,7 +3,7 @@ package conditions import ( "go/types" "log" - "regexp" + "strings" "github.com/dave/jennifer/jen" "github.com/elliotchance/pie/v2" @@ -34,7 +34,7 @@ func (condition *Condition) generateCode(object types.Object, field Field) { case *types.Named: condition.generateCodeForNamedType( object, - field, fieldType, + field, ) case *types.Pointer: condition.param = condition.param.Op("*") @@ -67,11 +67,11 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel // inverse relation condition _, err := getBadORMModelStruct(elemObject) if err == nil { + // slice of BadORM models log.Println(elemObject.Name()) condition.generateOppositeJoinCondition( object, - field, - elemObject, + field.ChangeType(elemObject.Type()), ) } case *types.Pointer: @@ -86,11 +86,9 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel } } -func (condition *Condition) generateCodeForNamedType(object types.Object, field Field, fieldType *types.Named) { - // TODO quizas aca se puede eliminar el fieldType - fieldObject := fieldType.Obj() +func (condition *Condition) generateCodeForNamedType(object types.Object, field Field) { // TODO esta linea de aca quedo rara - _, err := getBadORMModelStruct(fieldObject) + _, err := getBadORMModelStruct(field.Object) log.Println(err) if err == nil { @@ -132,41 +130,23 @@ func (condition *Condition) generateCodeForNamedType(object types.Object, field condition.generateOppositeJoinCondition( object, field, - fieldObject, ) } - } else if (isGormCustomType(fieldType) || fieldType.String() == "time.Time") && fieldType.String() != "gorm.io/gorm.DeletedAt" { - // TODO DeletedAt - condition.param = condition.param.Qual( - getRelativePackagePath(fieldObject.Pkg()), - fieldObject.Name(), - ) - condition.generateWhereCondition( - object, - field, - ) } else { - log.Printf("struct field type not handled: %s", fieldType.String()) - } -} - -var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) -var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) - -func isGormCustomType(typeNamed *types.Named) bool { - hasScanMethod := false - hasValueMethod := false - for i := 0; i < typeNamed.NumMethods(); i++ { - methodSignature := typeNamed.Method(i).String() - - if !hasScanMethod && scanMethod.MatchString(methodSignature) { - hasScanMethod = true - } else if !hasValueMethod && valueMethod.MatchString(methodSignature) { - hasValueMethod = true + if (field.IsGormCustomType() || field.TypeString() == "time.Time") && field.TypeString() != "gorm.io/gorm.DeletedAt" { + // TODO DeletedAt + condition.param = condition.param.Qual( + getRelativePackagePath(field.TypePkg()), + field.TypeName(), + ) + condition.generateWhereCondition( + object, + field, + ) + } else { + log.Printf("struct field type not handled: %s", field.TypeString()) } } - - return hasScanMethod && hasValueMethod } func (condition *Condition) adaptParamByKind(basicType *types.Basic) { @@ -238,9 +218,9 @@ func (condition *Condition) generateWhereCondition(object types.Object, field Fi ) } -func (condition *Condition) generateOppositeJoinCondition(object types.Object, field Field, fieldObject types.Object) { +func (condition *Condition) generateOppositeJoinCondition(object types.Object, field Field) { condition.generateJoinCondition( - fieldObject, + field.Object, // TODO testear los Override Foreign Key Field{ Name: object.Name(), @@ -273,7 +253,7 @@ func (condition *Condition) generateJoinFromAndTo(object types.Object, field Fie t1 := jen.Qual( getRelativePackagePath(object.Pkg()), - object.Name(), + getObjectTypeName(object), ) t2 := jen.Qual( @@ -313,8 +293,19 @@ func (condition *Condition) generateJoinFromAndTo(object types.Object, field Fie ) } +func getObjectTypeName(object types.Object) string { + fieldType := object.Type() + switch fieldTypeTyped := fieldType.(type) { + case *types.Named: + return fieldTypeTyped.Obj().Name() + // TODO ver el resto si al hacerlo me simplificaria algo + default: + return pie.Last(strings.Split(object.Type().String(), ".")) + } +} + func getConditionName(object types.Object, fieldName string) string { - return strcase.ToPascal(object.Name()) + strcase.ToPascal(fieldName) + badORMCondition + return getObjectTypeName(object) + strcase.ToPascal(fieldName) + badORMCondition } // TODO testear esto diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index a934e72c..c600421c 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -3,9 +3,8 @@ package conditions import ( "errors" "go/types" - "strings" + "regexp" - "github.com/elliotchance/pie/v2" "github.com/ettle/strcase" ) @@ -55,8 +54,23 @@ func (field Field) NoSePonerNombre(structName string) string { return structName + "ID" } +func (field Field) TypeString() string { + return field.Object.Type().String() +} + func (field Field) TypeName() string { - return pie.Last(strings.Split(field.Object.Type().String(), ".")) + return getObjectTypeName(field.Object) +} + +func (field Field) TypePkg() *types.Package { + fieldType := field.Object.Type() + switch fieldTypeTyped := fieldType.(type) { + case *types.Named: + return fieldTypeTyped.Obj().Pkg() + // TODO ver el resto si al hacerlo me simplificaria algo + default: + return nil + } } func (field Field) ChangeType(newType types.Type) Field { @@ -72,6 +86,30 @@ func (field Field) ChangeType(newType types.Type) Field { } } +var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) +var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) + +func (field Field) IsGormCustomType() bool { + typeNamed, isNamedType := field.Object.Type().(*types.Named) + if !isNamedType { + return false + } + + hasScanMethod := false + hasValueMethod := false + for i := 0; i < typeNamed.NumMethods(); i++ { + methodSignature := typeNamed.Method(i).String() + + if !hasScanMethod && scanMethod.MatchString(methodSignature) { + hasScanMethod = true + } else if !hasValueMethod && valueMethod.MatchString(methodSignature) { + hasValueMethod = true + } + } + + return hasScanMethod && hasValueMethod +} + func getFields(structType *types.Struct, prefix string) ([]Field, error) { numFields := structType.NumFields() if numFields == 0 { From be3353263286474b675aca4937e7de3e2fe12e22 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 10:05:57 +0200 Subject: [PATCH 229/467] refactor: elemType to fieldType --- tools/badctl/cmd/gen/conditions/condition.go | 17 +++++++++-------- tools/badctl/cmd/gen/conditions/field.go | 8 ++++++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index ef7fdf62..f3880742 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -46,32 +46,33 @@ func (condition *Condition) generateCode(object types.Object, field Field) { condition.param = condition.param.Index() condition.generateCodeForSlice( object, - field, fieldType.Elem(), + field.ChangeType(fieldType.Elem()), ) default: log.Printf("struct field type not handled: %T", fieldType) } } -func (condition *Condition) generateCodeForSlice(object types.Object, field Field, elemType types.Type) { - switch elemTypeTyped := elemType.(type) { +func (condition *Condition) generateCodeForSlice(object types.Object, field Field) { + switch elemType := field.Type().(type) { case *types.Basic: // una list de strings o algo asi, // por el momento solo anda con []byte porque el resto gorm no lo sabe encodear condition.generateCode( object, - field.ChangeType(elemTypeTyped), + field, ) case *types.Named: - elemObject := elemTypeTyped.Obj() + elemObject := elemType.Obj() // inverse relation condition + // TODO muchas veces los usos de esto se pueden hacer directo sobre el field.Object _, err := getBadORMModelStruct(elemObject) if err == nil { // slice of BadORM models log.Println(elemObject.Name()) condition.generateOppositeJoinCondition( object, - field.ChangeType(elemObject.Type()), + field, ) } case *types.Pointer: @@ -79,10 +80,10 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel // slice de pointers, solo testeado temporalmente porque despues gorm no lo soporta condition.generateCodeForSlice( object, - field, elemTypeTyped.Elem(), + field.ChangeType(elemType.Elem()), ) default: - log.Printf("struct field list elem type not handled: %T", elemTypeTyped) + log.Printf("struct field list elem type not handled: %T", elemType) } } diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index c600421c..a8610851 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -54,8 +54,12 @@ func (field Field) NoSePonerNombre(structName string) string { return structName + "ID" } +func (field Field) Type() types.Type { + return field.Object.Type() +} + func (field Field) TypeString() string { - return field.Object.Type().String() + return field.Type().String() } func (field Field) TypeName() string { @@ -63,7 +67,7 @@ func (field Field) TypeName() string { } func (field Field) TypePkg() *types.Package { - fieldType := field.Object.Type() + fieldType := field.Type() switch fieldTypeTyped := fieldType.(type) { case *types.Named: return fieldTypeTyped.Obj().Pkg() From 1ec7f00b0fdbac7dcfdebbd749ce82ee4ae9585a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 10:08:14 +0200 Subject: [PATCH 230/467] refactor use field methods --- tools/badctl/cmd/gen/conditions/condition.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index f3880742..37aef5c9 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -24,7 +24,7 @@ func NewCondition(object types.Object, field Field) *Condition { } func (condition *Condition) generateCode(object types.Object, field Field) { - switch fieldType := field.Object.Type().(type) { + switch fieldType := field.Type().(type) { case *types.Basic: condition.adaptParamByKind(fieldType) condition.generateWhereCondition( @@ -258,7 +258,7 @@ func (condition *Condition) generateJoinFromAndTo(object types.Object, field Fie ) t2 := jen.Qual( - getRelativePackagePath(field.Object.Pkg()), + getRelativePackagePath(field.TypePkg()), field.TypeName(), ) From 67805d66714607f06cc65926c8d9f96b4af77ac1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 10:17:51 +0200 Subject: [PATCH 231/467] named type to field.Object --- tools/badctl/cmd/gen/conditions/condition.go | 6 ++---- tools/badctl/cmd/run.go | 2 ++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 37aef5c9..cd254d97 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -63,13 +63,11 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel field, ) case *types.Named: - elemObject := elemType.Obj() // inverse relation condition - // TODO muchas veces los usos de esto se pueden hacer directo sobre el field.Object - _, err := getBadORMModelStruct(elemObject) + _, err := getBadORMModelStruct(field.Object) if err == nil { // slice of BadORM models - log.Println(elemObject.Name()) + log.Println(field.Object.Name()) condition.generateOppositeJoinCondition( object, field, diff --git a/tools/badctl/cmd/run.go b/tools/badctl/cmd/run.go index 8709b464..001458b7 100644 --- a/tools/badctl/cmd/run.go +++ b/tools/badctl/cmd/run.go @@ -31,5 +31,7 @@ func runApp(cmd *cobra.Command, args []string) { panic(err) } + // TODO add wait for api + log.Println("Your api is available at http://localhost:8000") } From dcbc622fa46378b1c7387cea49eab89d85b08e19 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 10:36:05 +0200 Subject: [PATCH 232/467] field object to field type --- tools/badctl/cmd/gen/conditions/condition.go | 71 ++++++++++++-------- tools/badctl/cmd/gen/conditions/field.go | 36 +++------- tools/badctl/cmd/gen/conditions/file.go | 9 +-- 3 files changed, 57 insertions(+), 59 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index cd254d97..8ac28fde 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -24,7 +24,7 @@ func NewCondition(object types.Object, field Field) *Condition { } func (condition *Condition) generateCode(object types.Object, field Field) { - switch fieldType := field.Type().(type) { + switch fieldType := field.Type.(type) { case *types.Basic: condition.adaptParamByKind(fieldType) condition.generateWhereCondition( @@ -54,7 +54,7 @@ func (condition *Condition) generateCode(object types.Object, field Field) { } func (condition *Condition) generateCodeForSlice(object types.Object, field Field) { - switch elemType := field.Type().(type) { + switch elemType := field.Type.(type) { case *types.Basic: // una list de strings o algo asi, // por el momento solo anda con []byte porque el resto gorm no lo sabe encodear @@ -64,10 +64,10 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel ) case *types.Named: // inverse relation condition - _, err := getBadORMModelStruct(field.Object) + _, err := getBadORMModelStruct(field.Type) if err == nil { // slice of BadORM models - log.Println(field.Object.Name()) + log.Println(field.TypeName()) condition.generateOppositeJoinCondition( object, field, @@ -87,11 +87,11 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel func (condition *Condition) generateCodeForNamedType(object types.Object, field Field) { // TODO esta linea de aca quedo rara - _, err := getBadORMModelStruct(field.Object) + _, err := getBadORMModelStruct(field.Type) log.Println(err) if err == nil { - objectStruct, err := getBadORMModelStruct(object) + objectStruct, err := getBadORMModelStruct(object.Type()) if err != nil { // TODO ver esto return @@ -116,13 +116,13 @@ func (condition *Condition) generateCodeForNamedType(object types.Object, field if thisEntityHasTheFK { // belongsTo relation condition.generateJoinCondition( - object, + object.Type(), field, ) } else { // hasOne or hasMany relation condition.generateInverseJoinCondition( - object, + object.Type(), field, ) @@ -201,7 +201,7 @@ func (condition *Condition) generateWhereCondition(object types.Object, field Fi condition.codes = append( condition.codes, jen.Func().Id( - getConditionName(object, field.Name), + getConditionName(object.Type(), field.Name), ).Params( condition.param, ).Add( @@ -219,40 +219,40 @@ func (condition *Condition) generateWhereCondition(object types.Object, field Fi func (condition *Condition) generateOppositeJoinCondition(object types.Object, field Field) { condition.generateJoinCondition( - field.Object, + field.Type, // TODO testear los Override Foreign Key Field{ - Name: object.Name(), - Object: object, - Tags: field.Tags, + Name: object.Name(), + Type: object.Type(), + Tags: field.Tags, }, ) } -func (condition *Condition) generateJoinCondition(object types.Object, field Field) { +func (condition *Condition) generateJoinCondition(objectType types.Type, field Field) { condition.generateJoinFromAndTo( - object, + objectType, field, field.getJoinFromColumn(), field.getJoinToColumn(), ) } -func (condition *Condition) generateInverseJoinCondition(object types.Object, field Field) { +func (condition *Condition) generateInverseJoinCondition(objectType types.Type, field Field) { condition.generateJoinFromAndTo( - object, + objectType, field, field.getJoinToColumn(), - field.NoSePonerNombre(object.Name()), + field.NoSePonerNombre(getTypeName(objectType)), ) } -func (condition *Condition) generateJoinFromAndTo(object types.Object, field Field, from, to string) { - log.Println(field.Object.Name()) +func (condition *Condition) generateJoinFromAndTo(objectType types.Type, field Field, from, to string) { + log.Println(field.Name) t1 := jen.Qual( - getRelativePackagePath(object.Pkg()), - getObjectTypeName(object), + getRelativePackagePath(getTypePkg(objectType)), + getTypeName(objectType), ) t2 := jen.Qual( @@ -275,7 +275,7 @@ func (condition *Condition) generateJoinFromAndTo(object types.Object, field Fie condition.codes = append( condition.codes, jen.Func().Id( - getConditionName(object, field.Name), + getConditionName(objectType, field.Name), ).Params( jen.Id("conditions").Op("...").Add(badormT2Condition), ).Add( @@ -293,18 +293,31 @@ func (condition *Condition) generateJoinFromAndTo(object types.Object, field Fie } func getObjectTypeName(object types.Object) string { - fieldType := object.Type() - switch fieldTypeTyped := fieldType.(type) { + return getTypeName(object.Type()) +} + +func getTypeName(typeV types.Type) string { + switch typeTyped := typeV.(type) { + case *types.Named: + return typeTyped.Obj().Name() + // TODO ver el resto si al hacerlo me simplificaria algo + default: + return pie.Last(strings.Split(typeV.String(), ".")) + } +} + +func getTypePkg(typeV types.Type) *types.Package { + switch typeTyped := typeV.(type) { case *types.Named: - return fieldTypeTyped.Obj().Name() + return typeTyped.Obj().Pkg() // TODO ver el resto si al hacerlo me simplificaria algo default: - return pie.Last(strings.Split(object.Type().String(), ".")) + return nil } } -func getConditionName(object types.Object, fieldName string) string { - return getObjectTypeName(object) + strcase.ToPascal(fieldName) + badORMCondition +func getConditionName(typeV types.Type, fieldName string) string { + return getTypeName(typeV) + strcase.ToPascal(fieldName) + badORMCondition } // TODO testear esto diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index a8610851..f07d0f41 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -10,7 +10,7 @@ import ( type Field struct { Name string - Object types.Object + Type types.Type Embedded bool Tags GormTags } @@ -54,38 +54,22 @@ func (field Field) NoSePonerNombre(structName string) string { return structName + "ID" } -func (field Field) Type() types.Type { - return field.Object.Type() -} - func (field Field) TypeString() string { - return field.Type().String() + return field.Type.String() } func (field Field) TypeName() string { - return getObjectTypeName(field.Object) + return getTypeName(field.Type) } func (field Field) TypePkg() *types.Package { - fieldType := field.Type() - switch fieldTypeTyped := fieldType.(type) { - case *types.Named: - return fieldTypeTyped.Obj().Pkg() - // TODO ver el resto si al hacerlo me simplificaria algo - default: - return nil - } + return getTypePkg(field.Type) } func (field Field) ChangeType(newType types.Type) Field { return Field{ Name: field.Name, - Object: types.NewTypeName( - field.Object.Pos(), - field.Object.Pkg(), - field.Object.Name(), - newType, - ), + Type: newType, Tags: field.Tags, } } @@ -94,7 +78,7 @@ var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interfa var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) func (field Field) IsGormCustomType() bool { - typeNamed, isNamedType := field.Object.Type().(*types.Named) + typeNamed, isNamedType := field.Type.(*types.Named) if !isNamedType { return false } @@ -124,13 +108,13 @@ func getFields(structType *types.Struct, prefix string) ([]Field, error) { // Iterate over struct fields for i := 0; i < numFields; i++ { - fieldType := structType.Field(i) + fieldObject := structType.Field(i) gormTags := getGormTags(structType.Tag(i)) fields = append(fields, Field{ // TODO el Name se podria sacar si meto este prefix adentro del tipo - Name: prefix + fieldType.Name(), - Object: fieldType, - Embedded: fieldType.Embedded() || gormTags.hasEmbedded(), + Name: prefix + fieldObject.Name(), + Type: fieldObject.Type(), + Embedded: fieldObject.Embedded() || gormTags.hasEmbedded(), Tags: gormTags, }) } diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 39373ac9..9317fe56 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -33,7 +33,7 @@ func NewConditionsFile(destPkg string, name string) *File { func (file File) AddConditionsFor(object types.Object) error { // Generate only when underlying type is a struct // (ignore const, var, func, etc.) - structType, err := getBadORMModelStruct(object) + structType, err := getBadORMModelStruct(object.Type()) if err != nil { return err } @@ -93,8 +93,8 @@ func generateConditionsForEachField(object types.Object, fields []Field) []*Cond return conditions } -func getBadORMModelStruct(object types.Object) (*types.Struct, error) { - structType, ok := object.Type().Underlying().(*types.Struct) +func getBadORMModelStruct(typeV types.Type) (*types.Struct, error) { + structType, ok := typeV.Underlying().(*types.Struct) if !ok || !isBadORMModel(structType) { return nil, errors.New("object is not a BaDORM model") } @@ -114,8 +114,9 @@ func isBadORMModel(structType *types.Struct) bool { return false } +// TODO quizas esto no deberia estar aca func generateEmbeddedConditions(object types.Object, field Field) []*Condition { - embeddedFieldType, ok := field.Object.Type().(*types.Named) + embeddedFieldType, ok := field.Type.(*types.Named) if !ok { failErr(errors.New("unreachable! embedded objects are always of type Named")) } From 27ad1270949585b2869a4119185217e4285524ff Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 10:38:35 +0200 Subject: [PATCH 233/467] object to type --- tools/badctl/cmd/gen/conditions/condition.go | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 8ac28fde..22fbffeb 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -69,7 +69,7 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel // slice of BadORM models log.Println(field.TypeName()) condition.generateOppositeJoinCondition( - object, + object.Type(), field, ) } @@ -127,7 +127,7 @@ func (condition *Condition) generateCodeForNamedType(object types.Object, field ) condition.generateOppositeJoinCondition( - object, + object.Type(), field, ) } @@ -217,13 +217,13 @@ func (condition *Condition) generateWhereCondition(object types.Object, field Fi ) } -func (condition *Condition) generateOppositeJoinCondition(object types.Object, field Field) { +func (condition *Condition) generateOppositeJoinCondition(objectType types.Type, field Field) { condition.generateJoinCondition( field.Type, // TODO testear los Override Foreign Key Field{ - Name: object.Name(), - Type: object.Type(), + Name: getTypeName(objectType), + Type: objectType, Tags: field.Tags, }, ) @@ -292,10 +292,6 @@ func (condition *Condition) generateJoinFromAndTo(objectType types.Type, field F ) } -func getObjectTypeName(object types.Object) string { - return getTypeName(object.Type()) -} - func getTypeName(typeV types.Type) string { switch typeTyped := typeV.(type) { case *types.Named: From 1a97a64d877b69f335c9e732cf4f2c23d6161cc1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 10:40:39 +0200 Subject: [PATCH 234/467] object to type --- tools/badctl/cmd/gen/conditions/condition.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 22fbffeb..a7605d9e 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -28,7 +28,7 @@ func (condition *Condition) generateCode(object types.Object, field Field) { case *types.Basic: condition.adaptParamByKind(fieldType) condition.generateWhereCondition( - object, + object.Type(), field, ) case *types.Named: @@ -139,7 +139,7 @@ func (condition *Condition) generateCodeForNamedType(object types.Object, field field.TypeName(), ) condition.generateWhereCondition( - object, + object.Type(), field, ) } else { @@ -188,20 +188,20 @@ func (condition *Condition) adaptParamByKind(basicType *types.Basic) { } // TODO sacar condition del nombre -func (condition *Condition) generateWhereCondition(object types.Object, field Field) { +func (condition *Condition) generateWhereCondition(objectType types.Type, field Field) { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, ).Types( jen.Qual( - getRelativePackagePath(object.Pkg()), - object.Name(), + getRelativePackagePath(getTypePkg(objectType)), + getTypeName(objectType), ), ) condition.codes = append( condition.codes, jen.Func().Id( - getConditionName(object.Type(), field.Name), + getConditionName(objectType, field.Name), ).Params( condition.param, ).Add( From 4e174b735c7f1ca4c4b92b95c93e920d76872b02 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 10:44:04 +0200 Subject: [PATCH 235/467] object to type --- tools/badctl/cmd/gen/conditions/condition.go | 34 ++++++++++---------- tools/badctl/cmd/gen/conditions/file.go | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index a7605d9e..c69e1863 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -15,37 +15,37 @@ type Condition struct { param *jen.Statement } -func NewCondition(object types.Object, field Field) *Condition { +func NewCondition(objectType types.Type, field Field) *Condition { condition := &Condition{ param: jen.Id("v"), } - condition.generateCode(object, field) + condition.generateCode(objectType, field) return condition } -func (condition *Condition) generateCode(object types.Object, field Field) { +func (condition *Condition) generateCode(objectType types.Type, field Field) { switch fieldType := field.Type.(type) { case *types.Basic: condition.adaptParamByKind(fieldType) condition.generateWhereCondition( - object.Type(), + objectType, field, ) case *types.Named: condition.generateCodeForNamedType( - object, + objectType, field, ) case *types.Pointer: condition.param = condition.param.Op("*") condition.generateCode( - object, + objectType, field.ChangeType(fieldType.Elem()), ) case *types.Slice: condition.param = condition.param.Index() condition.generateCodeForSlice( - object, + objectType, field.ChangeType(fieldType.Elem()), ) default: @@ -53,13 +53,13 @@ func (condition *Condition) generateCode(object types.Object, field Field) { } } -func (condition *Condition) generateCodeForSlice(object types.Object, field Field) { +func (condition *Condition) generateCodeForSlice(objectType types.Type, field Field) { switch elemType := field.Type.(type) { case *types.Basic: // una list de strings o algo asi, // por el momento solo anda con []byte porque el resto gorm no lo sabe encodear condition.generateCode( - object, + objectType, field, ) case *types.Named: @@ -69,7 +69,7 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel // slice of BadORM models log.Println(field.TypeName()) condition.generateOppositeJoinCondition( - object.Type(), + objectType, field, ) } @@ -77,7 +77,7 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel condition.param = condition.param.Op("*") // slice de pointers, solo testeado temporalmente porque despues gorm no lo soporta condition.generateCodeForSlice( - object, + objectType, field.ChangeType(elemType.Elem()), ) default: @@ -85,13 +85,13 @@ func (condition *Condition) generateCodeForSlice(object types.Object, field Fiel } } -func (condition *Condition) generateCodeForNamedType(object types.Object, field Field) { +func (condition *Condition) generateCodeForNamedType(objectType types.Type, field Field) { // TODO esta linea de aca quedo rara _, err := getBadORMModelStruct(field.Type) log.Println(err) if err == nil { - objectStruct, err := getBadORMModelStruct(object.Type()) + objectStruct, err := getBadORMModelStruct(objectType) if err != nil { // TODO ver esto return @@ -116,18 +116,18 @@ func (condition *Condition) generateCodeForNamedType(object types.Object, field if thisEntityHasTheFK { // belongsTo relation condition.generateJoinCondition( - object.Type(), + objectType, field, ) } else { // hasOne or hasMany relation condition.generateInverseJoinCondition( - object.Type(), + objectType, field, ) condition.generateOppositeJoinCondition( - object.Type(), + objectType, field, ) } @@ -139,7 +139,7 @@ func (condition *Condition) generateCodeForNamedType(object types.Object, field field.TypeName(), ) condition.generateWhereCondition( - object.Type(), + objectType, field, ) } else { diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 9317fe56..78d03583 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -85,7 +85,7 @@ func generateConditionsForEachField(object types.Object, fields []Field) []*Cond )...) } else { conditions = append(conditions, NewCondition( - object, field, + object.Type(), field, )) } } From 913f2fb74f7a309433f30c52db48a6b40c301a75 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 10:47:53 +0200 Subject: [PATCH 236/467] move funcs to another file --- tools/badctl/cmd/gen/conditions/condition.go | 21 --------------- tools/badctl/cmd/gen/conditions/type.go | 28 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 21 deletions(-) create mode 100644 tools/badctl/cmd/gen/conditions/type.go diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index c69e1863..2c929b01 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -3,7 +3,6 @@ package conditions import ( "go/types" "log" - "strings" "github.com/dave/jennifer/jen" "github.com/elliotchance/pie/v2" @@ -292,26 +291,6 @@ func (condition *Condition) generateJoinFromAndTo(objectType types.Type, field F ) } -func getTypeName(typeV types.Type) string { - switch typeTyped := typeV.(type) { - case *types.Named: - return typeTyped.Obj().Name() - // TODO ver el resto si al hacerlo me simplificaria algo - default: - return pie.Last(strings.Split(typeV.String(), ".")) - } -} - -func getTypePkg(typeV types.Type) *types.Package { - switch typeTyped := typeV.(type) { - case *types.Named: - return typeTyped.Obj().Pkg() - // TODO ver el resto si al hacerlo me simplificaria algo - default: - return nil - } -} - func getConditionName(typeV types.Type, fieldName string) string { return getTypeName(typeV) + strcase.ToPascal(fieldName) + badORMCondition } diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go new file mode 100644 index 00000000..40aef736 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -0,0 +1,28 @@ +package conditions + +import ( + "go/types" + "strings" + + "github.com/elliotchance/pie/v2" +) + +func getTypeName(typeV types.Type) string { + switch typeTyped := typeV.(type) { + case *types.Named: + return typeTyped.Obj().Name() + // TODO ver el resto si al hacerlo me simplificaria algo + default: + return pie.Last(strings.Split(typeV.String(), ".")) + } +} + +func getTypePkg(typeV types.Type) *types.Package { + switch typeTyped := typeV.(type) { + case *types.Named: + return typeTyped.Obj().Pkg() + // TODO ver el resto si al hacerlo me simplificaria algo + default: + return nil + } +} From 34df3b9e833315c88aa2bea8e048126857e57215 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 11:42:43 +0200 Subject: [PATCH 237/467] more refactor --- tools/badctl/cmd/gen/conditions/condition.go | 48 ++++++++------------ tools/badctl/cmd/gen/conditions/field.go | 14 +++++- tools/badctl/cmd/gen/conditions/file.go | 48 ++++---------------- tools/badctl/cmd/gen/conditions/type.go | 39 +++++++++++++++- 4 files changed, 79 insertions(+), 70 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 2c929b01..cee5a12b 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -5,7 +5,6 @@ import ( "log" "github.com/dave/jennifer/jen" - "github.com/elliotchance/pie/v2" "github.com/ettle/strcase" ) @@ -14,15 +13,19 @@ type Condition struct { param *jen.Statement } -func NewCondition(objectType types.Type, field Field) *Condition { +func NewCondition(objectType types.Type, field Field) (*Condition, error) { condition := &Condition{ param: jen.Id("v"), } - condition.generateCode(objectType, field) - return condition + err := condition.generateCode(objectType, field) + if err != nil { + return nil, err + } + + return condition, nil } -func (condition *Condition) generateCode(objectType types.Type, field Field) { +func (condition *Condition) generateCode(objectType types.Type, field Field) error { switch fieldType := field.Type.(type) { case *types.Basic: condition.adaptParamByKind(fieldType) @@ -31,7 +34,7 @@ func (condition *Condition) generateCode(objectType types.Type, field Field) { field, ) case *types.Named: - condition.generateCodeForNamedType( + return condition.generateCodeForNamedType( objectType, field, ) @@ -50,6 +53,8 @@ func (condition *Condition) generateCode(objectType types.Type, field Field) { default: log.Printf("struct field type not handled: %T", fieldType) } + + return nil } func (condition *Condition) generateCodeForSlice(objectType types.Type, field Field) { @@ -84,35 +89,19 @@ func (condition *Condition) generateCodeForSlice(objectType types.Type, field Fi } } -func (condition *Condition) generateCodeForNamedType(objectType types.Type, field Field) { - // TODO esta linea de aca quedo rara +func (condition *Condition) generateCodeForNamedType(objectType types.Type, field Field) error { _, err := getBadORMModelStruct(field.Type) - log.Println(err) if err == nil { - objectStruct, err := getBadORMModelStruct(objectType) - if err != nil { - // TODO ver esto - return - } + // field is a BaDORM Model // TODO que pasa si esta en otro package? se importa solo? - fields, err := getFields( - objectStruct, - // TODO testear esto si esta bien aca - field.Tags.getEmbeddedPrefix(), - ) + + hasFK, err := hasFK(objectType, field) if err != nil { - // TODO ver esto - return + return err } - thisEntityHasTheFK := pie.Any(fields, func(otherField Field) bool { - return otherField.Name == field.getJoinFromColumn() - }) - log.Println(field.getJoinFromColumn()) - log.Println(thisEntityHasTheFK) - - if thisEntityHasTheFK { + if hasFK { // belongsTo relation condition.generateJoinCondition( objectType, @@ -131,6 +120,7 @@ func (condition *Condition) generateCodeForNamedType(objectType types.Type, fiel ) } } else { + // field is not a BaDORM Model if (field.IsGormCustomType() || field.TypeString() == "time.Time") && field.TypeString() != "gorm.io/gorm.DeletedAt" { // TODO DeletedAt condition.param = condition.param.Qual( @@ -145,6 +135,8 @@ func (condition *Condition) generateCodeForNamedType(objectType types.Type, fiel log.Printf("struct field type not handled: %s", field.TypeString()) } } + + return nil } func (condition *Condition) adaptParamByKind(basicType *types.Basic) { diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index f07d0f41..6b75e892 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -98,7 +98,18 @@ func (field Field) IsGormCustomType() bool { return hasScanMethod && hasValueMethod } -func getFields(structType *types.Struct, prefix string) ([]Field, error) { +func getFields(objectType types.Type, prefix string) ([]Field, error) { + // The underlying type has to be a struct and a BaDORM Model + // (ignore const, var, func, etc.) + structType, err := getBadORMModelStruct(objectType) + if err != nil { + return nil, err + } + + return getStructFields(structType, prefix) +} + +func getStructFields(structType *types.Struct, prefix string) ([]Field, error) { numFields := structType.NumFields() if numFields == 0 { return nil, errors.New("struct has 0 fields") @@ -111,7 +122,6 @@ func getFields(structType *types.Struct, prefix string) ([]Field, error) { fieldObject := structType.Field(i) gormTags := getGormTags(structType.Tag(i)) fields = append(fields, Field{ - // TODO el Name se podria sacar si meto este prefix adentro del tipo Name: prefix + fieldObject.Name(), Type: fieldObject.Type(), Embedded: fieldObject.Embedded() || gormTags.hasEmbedded(), diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 78d03583..83c35b73 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -7,7 +7,6 @@ import ( "github.com/dave/jennifer/jen" "github.com/ditrit/badaas/tools/badctl/cmd/version" - "github.com/elliotchance/pie/v2" ) type File struct { @@ -31,14 +30,7 @@ func NewConditionsFile(destPkg string, name string) *File { } func (file File) AddConditionsFor(object types.Object) error { - // Generate only when underlying type is a struct - // (ignore const, var, func, etc.) - structType, err := getBadORMModelStruct(object.Type()) - if err != nil { - return err - } - - fields, err := getFields(structType, "") + fields, err := getFields(object.Type(), "") if err != nil { return err } @@ -84,48 +76,28 @@ func generateConditionsForEachField(object types.Object, fields []Field) []*Cond field, )...) } else { - conditions = append(conditions, NewCondition( + newCondition, err := NewCondition( object.Type(), field, - )) - } - } - - return conditions -} + ) + if err != nil { + failErr(err) + } -func getBadORMModelStruct(typeV types.Type) (*types.Struct, error) { - structType, ok := typeV.Underlying().(*types.Struct) - if !ok || !isBadORMModel(structType) { - return nil, errors.New("object is not a BaDORM model") - } - - return structType, nil -} - -func isBadORMModel(structType *types.Struct) bool { - for i := 0; i < structType.NumFields(); i++ { - field := structType.Field(i) - - if field.Embedded() && pie.Contains(badORMModels, field.Name()) { - return true + conditions = append(conditions, newCondition) } } - return false + return conditions } // TODO quizas esto no deberia estar aca func generateEmbeddedConditions(object types.Object, field Field) []*Condition { - embeddedFieldType, ok := field.Type.(*types.Named) - if !ok { - failErr(errors.New("unreachable! embedded objects are always of type Named")) - } - embeddedStructType, ok := embeddedFieldType.Underlying().(*types.Struct) + embeddedStructType, ok := field.Type.Underlying().(*types.Struct) if !ok { failErr(errors.New("unreachable! embedded objects are always structs")) } - fields, err := getFields(embeddedStructType, field.Tags.getEmbeddedPrefix()) + fields, err := getStructFields(embeddedStructType, field.Tags.getEmbeddedPrefix()) if err != nil { // TODO ver esto return []*Condition{} diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index 40aef736..27c4c41b 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -1,17 +1,18 @@ package conditions import ( + "fmt" "go/types" "strings" "github.com/elliotchance/pie/v2" ) +// TODO me gustaria que esten en una clase func getTypeName(typeV types.Type) string { switch typeTyped := typeV.(type) { case *types.Named: return typeTyped.Obj().Name() - // TODO ver el resto si al hacerlo me simplificaria algo default: return pie.Last(strings.Split(typeV.String(), ".")) } @@ -21,8 +22,42 @@ func getTypePkg(typeV types.Type) *types.Package { switch typeTyped := typeV.(type) { case *types.Named: return typeTyped.Obj().Pkg() - // TODO ver el resto si al hacerlo me simplificaria algo default: return nil } } + +func getBadORMModelStruct(typeV types.Type) (*types.Struct, error) { + structType, ok := typeV.Underlying().(*types.Struct) + if !ok || !isBadORMModel(structType) { + return nil, fmt.Errorf("type %s is not a BaDORM Model", typeV.String()) + } + + return structType, nil +} + +func isBadORMModel(structType *types.Struct) bool { + for i := 0; i < structType.NumFields(); i++ { + field := structType.Field(i) + + if field.Embedded() && pie.Contains(badORMModels, field.Name()) { + return true + } + } + + return false +} + +func hasFK(typeV types.Type, field Field) (bool, error) { + objectFields, err := getFields( + typeV, + // TODO testear esto si esta bien aca + field.Tags.getEmbeddedPrefix(), + ) + if err != nil { + return false, err + } + return pie.Any(objectFields, func(otherField Field) bool { + return otherField.Name == field.getJoinFromColumn() + }), nil +} From d1cd0f7294fd775d6817628503290e4f1552af38 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 12:04:46 +0200 Subject: [PATCH 238/467] better method names --- tools/badctl/cmd/gen/conditions/condition.go | 40 ++++++++++---------- tools/badctl/cmd/gen/conditions/field.go | 7 ++-- tools/badctl/cmd/gen/conditions/type.go | 2 +- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index cee5a12b..8e16371a 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -67,12 +67,11 @@ func (condition *Condition) generateCodeForSlice(objectType types.Type, field Fi field, ) case *types.Named: - // inverse relation condition _, err := getBadORMModelStruct(field.Type) if err == nil { - // slice of BadORM models + // slice of BadORM models -> hasMany relation log.Println(field.TypeName()) - condition.generateOppositeJoinCondition( + condition.generateInverseJoin( objectType, field, ) @@ -103,18 +102,18 @@ func (condition *Condition) generateCodeForNamedType(objectType types.Type, fiel if hasFK { // belongsTo relation - condition.generateJoinCondition( + condition.generateJoinWithFK( objectType, field, ) } else { - // hasOne or hasMany relation - condition.generateInverseJoinCondition( + // hasOne relation + condition.generateJoinWithoutFK( objectType, field, ) - condition.generateOppositeJoinCondition( + condition.generateInverseJoin( objectType, field, ) @@ -178,7 +177,6 @@ func (condition *Condition) adaptParamByKind(basicType *types.Basic) { } } -// TODO sacar condition del nombre func (condition *Condition) generateWhereCondition(objectType types.Type, field Field) { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, @@ -208,8 +206,8 @@ func (condition *Condition) generateWhereCondition(objectType types.Type, field ) } -func (condition *Condition) generateOppositeJoinCondition(objectType types.Type, field Field) { - condition.generateJoinCondition( +func (condition *Condition) generateInverseJoin(objectType types.Type, field Field) { + condition.generateJoinWithFK( field.Type, // TODO testear los Override Foreign Key Field{ @@ -220,25 +218,25 @@ func (condition *Condition) generateOppositeJoinCondition(objectType types.Type, ) } -func (condition *Condition) generateJoinCondition(objectType types.Type, field Field) { - condition.generateJoinFromAndTo( +func (condition *Condition) generateJoinWithFK(objectType types.Type, field Field) { + condition.generateJoin( objectType, field, - field.getJoinFromColumn(), - field.getJoinToColumn(), + field.getFKAttribute(), + field.getFKReferencesAttribute(), ) } -func (condition *Condition) generateInverseJoinCondition(objectType types.Type, field Field) { - condition.generateJoinFromAndTo( +func (condition *Condition) generateJoinWithoutFK(objectType types.Type, field Field) { + condition.generateJoin( objectType, field, - field.getJoinToColumn(), - field.NoSePonerNombre(getTypeName(objectType)), + field.getFKReferencesAttribute(), + field.getRelatedTypeFKAttribute(getTypeName(objectType)), ) } -func (condition *Condition) generateJoinFromAndTo(objectType types.Type, field Field, from, to string) { +func (condition *Condition) generateJoin(objectType types.Type, field Field, t1Field, t2Field string) { log.Println(field.Name) t1 := jen.Qual( @@ -274,8 +272,8 @@ func (condition *Condition) generateJoinFromAndTo(objectType types.Type, field F ).Block( jen.Return( badormJoinCondition.Values(jen.Dict{ - jen.Id("T1Field"): jen.Lit(strcase.ToSnake(from)), - jen.Id("T2Field"): jen.Lit(strcase.ToSnake(to)), + jen.Id("T1Field"): jen.Lit(strcase.ToSnake(t1Field)), + jen.Id("T2Field"): jen.Lit(strcase.ToSnake(t2Field)), jen.Id("Conditions"): jen.Id("conditions"), }), ), diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index 6b75e892..cc249ba9 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -24,7 +24,7 @@ func (field Field) getColumnName() string { return strcase.ToSnake(field.Name) } -func (field Field) getJoinFromColumn() string { +func (field Field) getFKAttribute() string { foreignKeyTag, isPresent := field.Tags[foreignKeyTagName] if isPresent { return foreignKeyTag @@ -33,7 +33,7 @@ func (field Field) getJoinFromColumn() string { return field.Name + "ID" } -func (field Field) getJoinToColumn() string { +func (field Field) getFKReferencesAttribute() string { referencesTag, isPresent := field.Tags[referencesTagName] // TODO testear cuando hay redefinicion en la inversa if isPresent { @@ -43,8 +43,7 @@ func (field Field) getJoinToColumn() string { return "ID" } -// TODO -func (field Field) NoSePonerNombre(structName string) string { +func (field Field) getRelatedTypeFKAttribute(structName string) string { // TODO testear cuando hay redefinicion foreignKeyTag, isPresent := field.Tags[foreignKeyTagName] if isPresent { diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index 27c4c41b..9908552f 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -58,6 +58,6 @@ func hasFK(typeV types.Type, field Field) (bool, error) { return false, err } return pie.Any(objectFields, func(otherField Field) bool { - return otherField.Name == field.getJoinFromColumn() + return otherField.Name == field.getFKAttribute() }), nil } From 07472552942621168fb94b67ef3a987961408bc6 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 12:28:50 +0200 Subject: [PATCH 239/467] jen param to another file --- tools/badctl/cmd/gen/conditions/condition.go | 58 +++------------ tools/badctl/cmd/gen/conditions/jenParam.go | 75 ++++++++++++++++++++ 2 files changed, 83 insertions(+), 50 deletions(-) create mode 100644 tools/badctl/cmd/gen/conditions/jenParam.go diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 8e16371a..add44696 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -10,12 +10,12 @@ import ( type Condition struct { codes []jen.Code - param *jen.Statement + param *JenParam } func NewCondition(objectType types.Type, field Field) (*Condition, error) { condition := &Condition{ - param: jen.Id("v"), + param: NewJenParam(), } err := condition.generateCode(objectType, field) if err != nil { @@ -28,7 +28,7 @@ func NewCondition(objectType types.Type, field Field) (*Condition, error) { func (condition *Condition) generateCode(objectType types.Type, field Field) error { switch fieldType := field.Type.(type) { case *types.Basic: - condition.adaptParamByKind(fieldType) + condition.param.ToBasicKind(fieldType) condition.generateWhereCondition( objectType, field, @@ -39,13 +39,13 @@ func (condition *Condition) generateCode(objectType types.Type, field Field) err field, ) case *types.Pointer: - condition.param = condition.param.Op("*") + condition.param.ToPointer() condition.generateCode( objectType, field.ChangeType(fieldType.Elem()), ) case *types.Slice: - condition.param = condition.param.Index() + condition.param.ToList() condition.generateCodeForSlice( objectType, field.ChangeType(fieldType.Elem()), @@ -77,8 +77,8 @@ func (condition *Condition) generateCodeForSlice(objectType types.Type, field Fi ) } case *types.Pointer: - condition.param = condition.param.Op("*") // slice de pointers, solo testeado temporalmente porque despues gorm no lo soporta + condition.param.ToPointer() condition.generateCodeForSlice( objectType, field.ChangeType(elemType.Elem()), @@ -122,10 +122,7 @@ func (condition *Condition) generateCodeForNamedType(objectType types.Type, fiel // field is not a BaDORM Model if (field.IsGormCustomType() || field.TypeString() == "time.Time") && field.TypeString() != "gorm.io/gorm.DeletedAt" { // TODO DeletedAt - condition.param = condition.param.Qual( - getRelativePackagePath(field.TypePkg()), - field.TypeName(), - ) + condition.param.ToCustomType(field.Type) condition.generateWhereCondition( objectType, field, @@ -138,45 +135,6 @@ func (condition *Condition) generateCodeForNamedType(objectType types.Type, fiel return nil } -func (condition *Condition) adaptParamByKind(basicType *types.Basic) { - switch basicType.Kind() { - case types.Bool: - condition.param = condition.param.Bool() - case types.Int: - condition.param = condition.param.Int() - case types.Int8: - condition.param = condition.param.Int8() - case types.Int16: - condition.param = condition.param.Int16() - case types.Int32: - condition.param = condition.param.Int32() - case types.Int64: - condition.param = condition.param.Int64() - case types.Uint: - condition.param = condition.param.Uint() - case types.Uint8: - condition.param = condition.param.Uint8() - case types.Uint16: - condition.param = condition.param.Uint16() - case types.Uint32: - condition.param = condition.param.Uint32() - case types.Uint64: - condition.param = condition.param.Uint64() - case types.Uintptr: - condition.param = condition.param.Uintptr() - case types.Float32: - condition.param = condition.param.Float32() - case types.Float64: - condition.param = condition.param.Float64() - case types.Complex64: - condition.param = condition.param.Complex64() - case types.Complex128: - condition.param = condition.param.Complex128() - case types.String: - condition.param = condition.param.String() - } -} - func (condition *Condition) generateWhereCondition(objectType types.Type, field Field) { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, @@ -192,7 +150,7 @@ func (condition *Condition) generateWhereCondition(objectType types.Type, field jen.Func().Id( getConditionName(objectType, field.Name), ).Params( - condition.param, + condition.param.Statement(), ).Add( whereCondition.Clone(), ).Block( diff --git a/tools/badctl/cmd/gen/conditions/jenParam.go b/tools/badctl/cmd/gen/conditions/jenParam.go new file mode 100644 index 00000000..e9ced021 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/jenParam.go @@ -0,0 +1,75 @@ +package conditions + +import ( + "go/types" + + "github.com/dave/jennifer/jen" +) + +type JenParam struct { + statement *jen.Statement +} + +func NewJenParam() *JenParam { + return &JenParam{ + statement: jen.Id("v"), + } +} + +func (param JenParam) Statement() *jen.Statement { + return param.statement +} + +func (param JenParam) ToBasicKind(basicType *types.Basic) { + switch basicType.Kind() { + case types.Bool: + param.statement.Bool() + case types.Int: + param.statement.Int() + case types.Int8: + param.statement.Int8() + case types.Int16: + param.statement.Int16() + case types.Int32: + param.statement.Int32() + case types.Int64: + param.statement.Int64() + case types.Uint: + param.statement.Uint() + case types.Uint8: + param.statement.Uint8() + case types.Uint16: + param.statement.Uint16() + case types.Uint32: + param.statement.Uint32() + case types.Uint64: + param.statement.Uint64() + case types.Uintptr: + param.statement.Uintptr() + case types.Float32: + param.statement.Float32() + case types.Float64: + param.statement.Float64() + case types.Complex64: + param.statement.Complex64() + case types.Complex128: + param.statement.Complex128() + case types.String: + param.statement.String() + } +} + +func (param JenParam) ToPointer() { + param.statement.Op("*") +} + +func (param JenParam) ToList() { + param.statement.Index() +} + +func (param JenParam) ToCustomType(typeV types.Type) { + param.statement.Qual( + getRelativePackagePath(getTypePkg(typeV)), + getTypeName(typeV), + ) +} From 3b052242df0a01d5284a610aaa741aeb45e3c2f1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 15:13:27 +0200 Subject: [PATCH 240/467] remove global variable destPg --- tools/badctl/cmd/gen/conditions/condition.go | 68 +++++++++++++------- tools/badctl/cmd/gen/conditions/field.go | 4 -- tools/badctl/cmd/gen/conditions/file.go | 12 ++-- tools/badctl/cmd/gen/conditions/jenParam.go | 6 +- tools/badctl/cmd/gen/conditions/main.go | 4 +- 5 files changed, 53 insertions(+), 41 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index add44696..f00f459e 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -9,15 +9,17 @@ import ( ) type Condition struct { - codes []jen.Code - param *JenParam + codes []jen.Code + param *JenParam + destPkg string } -func NewCondition(objectType types.Type, field Field) (*Condition, error) { +func NewCondition(destPkg string, objectType types.Type, field Field) (*Condition, error) { condition := &Condition{ - param: NewJenParam(), + param: NewJenParam(), + destPkg: destPkg, } - err := condition.generateCode(objectType, field) + err := condition.generate(objectType, field) if err != nil { return nil, err } @@ -25,28 +27,36 @@ func NewCondition(objectType types.Type, field Field) (*Condition, error) { return condition, nil } -func (condition *Condition) generateCode(objectType types.Type, field Field) error { +func (condition *Condition) generate(objectType types.Type, field Field) error { switch fieldType := field.Type.(type) { case *types.Basic: + // the field is a basic type (string, int, etc) + // adapt param to that type and generate a WhereCondition condition.param.ToBasicKind(fieldType) - condition.generateWhereCondition( + condition.generateWhere( objectType, field, ) case *types.Named: - return condition.generateCodeForNamedType( + // the field is a named type (user defined structs) + return condition.generateForNamedType( objectType, field, ) case *types.Pointer: + // the field is a pointer + // adapt param to pointer and generate code for the pointed type condition.param.ToPointer() - condition.generateCode( + condition.generate( objectType, field.ChangeType(fieldType.Elem()), ) case *types.Slice: - condition.param.ToList() - condition.generateCodeForSlice( + // the field is a slice + // adapt param to slice and + // generate code for the type of the elements of the slice + condition.param.ToSlice() + condition.generateForSlice( objectType, field.ChangeType(fieldType.Elem()), ) @@ -57,16 +67,18 @@ func (condition *Condition) generateCode(objectType types.Type, field Field) err return nil } -func (condition *Condition) generateCodeForSlice(objectType types.Type, field Field) { +func (condition *Condition) generateForSlice(objectType types.Type, field Field) { switch elemType := field.Type.(type) { case *types.Basic: - // una list de strings o algo asi, - // por el momento solo anda con []byte porque el resto gorm no lo sabe encodear - condition.generateCode( + // slice of basic types ([]string, []int, etc.) + // the only one supported directly by gorm is []byte + // but the others can be used after configuration in some dbs + condition.generate( objectType, field, ) case *types.Named: + // slice of named types (user defined types) _, err := getBadORMModelStruct(field.Type) if err == nil { // slice of BadORM models -> hasMany relation @@ -77,9 +89,11 @@ func (condition *Condition) generateCodeForSlice(objectType types.Type, field Fi ) } case *types.Pointer: - // slice de pointers, solo testeado temporalmente porque despues gorm no lo soporta + // TODO pointer solo testeado temporalmente porque despues gorm no lo soporta + // slice of pointers, generate code for a slice of the pointed type + // after changing the param condition.param.ToPointer() - condition.generateCodeForSlice( + condition.generateForSlice( objectType, field.ChangeType(elemType.Elem()), ) @@ -88,7 +102,7 @@ func (condition *Condition) generateCodeForSlice(objectType types.Type, field Fi } } -func (condition *Condition) generateCodeForNamedType(objectType types.Type, field Field) error { +func (condition *Condition) generateForNamedType(objectType types.Type, field Field) error { _, err := getBadORMModelStruct(field.Type) if err == nil { @@ -122,8 +136,10 @@ func (condition *Condition) generateCodeForNamedType(objectType types.Type, fiel // field is not a BaDORM Model if (field.IsGormCustomType() || field.TypeString() == "time.Time") && field.TypeString() != "gorm.io/gorm.DeletedAt" { // TODO DeletedAt - condition.param.ToCustomType(field.Type) - condition.generateWhereCondition( + // field is a Gorm Custom type (implements Scanner and Valuer interfaces) + // or a named type supported by gorm (time.Time, gorm.DeletedAt) + condition.param.ToCustomType(condition.destPkg, field.Type) + condition.generateWhere( objectType, field, ) @@ -135,12 +151,12 @@ func (condition *Condition) generateCodeForNamedType(objectType types.Type, fiel return nil } -func (condition *Condition) generateWhereCondition(objectType types.Type, field Field) { +func (condition *Condition) generateWhere(objectType types.Type, field Field) { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, ).Types( jen.Qual( - getRelativePackagePath(getTypePkg(objectType)), + getRelativePackagePath(condition.destPkg, objectType), getTypeName(objectType), ), ) @@ -198,12 +214,12 @@ func (condition *Condition) generateJoin(objectType types.Type, field Field, t1F log.Println(field.Name) t1 := jen.Qual( - getRelativePackagePath(getTypePkg(objectType)), + getRelativePackagePath(condition.destPkg, objectType), getTypeName(objectType), ) t2 := jen.Qual( - getRelativePackagePath(field.TypePkg()), + getRelativePackagePath(condition.destPkg, field.Type), field.TypeName(), ) @@ -244,7 +260,9 @@ func getConditionName(typeV types.Type, fieldName string) string { } // TODO testear esto -func getRelativePackagePath(srcPkg *types.Package) string { +// avoid importing the same package as the destination one +func getRelativePackagePath(destPkg string, typeV types.Type) string { + srcPkg := getTypePkg(typeV) if srcPkg.Name() == destPkg { return "" } diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index cc249ba9..5cffb2e3 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -61,10 +61,6 @@ func (field Field) TypeName() string { return getTypeName(field.Type) } -func (field Field) TypePkg() *types.Package { - return getTypePkg(field.Type) -} - func (field Field) ChangeType(newType types.Type) Field { return Field{ Name: field.Name, diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 83c35b73..04cb5383 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -40,7 +40,7 @@ func (file File) AddConditionsFor(object types.Object) error { } func (file File) addConditionsForEachField(object types.Object, fields []Field) { - conditions := generateConditionsForEachField(object, fields) + conditions := file.generateConditionsForEachField(object, fields) for _, condition := range conditions { // TODO esto no me gusta mucho que este aca @@ -66,18 +66,18 @@ const ( badORMJoinCondition = "JoinCondition" ) -func generateConditionsForEachField(object types.Object, fields []Field) []*Condition { +func (file File) generateConditionsForEachField(object types.Object, fields []Field) []*Condition { conditions := []*Condition{} for _, field := range fields { log.Println(field.Name) if field.Embedded { - conditions = append(conditions, generateEmbeddedConditions( + conditions = append(conditions, file.generateEmbeddedConditions( object, field, )...) } else { newCondition, err := NewCondition( - object.Type(), field, + file.destPkg, object.Type(), field, ) if err != nil { failErr(err) @@ -91,7 +91,7 @@ func generateConditionsForEachField(object types.Object, fields []Field) []*Cond } // TODO quizas esto no deberia estar aca -func generateEmbeddedConditions(object types.Object, field Field) []*Condition { +func (file File) generateEmbeddedConditions(object types.Object, field Field) []*Condition { embeddedStructType, ok := field.Type.Underlying().(*types.Struct) if !ok { failErr(errors.New("unreachable! embedded objects are always structs")) @@ -103,5 +103,5 @@ func generateEmbeddedConditions(object types.Object, field Field) []*Condition { return []*Condition{} } - return generateConditionsForEachField(object, fields) + return file.generateConditionsForEachField(object, fields) } diff --git a/tools/badctl/cmd/gen/conditions/jenParam.go b/tools/badctl/cmd/gen/conditions/jenParam.go index e9ced021..582a2627 100644 --- a/tools/badctl/cmd/gen/conditions/jenParam.go +++ b/tools/badctl/cmd/gen/conditions/jenParam.go @@ -63,13 +63,13 @@ func (param JenParam) ToPointer() { param.statement.Op("*") } -func (param JenParam) ToList() { +func (param JenParam) ToSlice() { param.statement.Index() } -func (param JenParam) ToCustomType(typeV types.Type) { +func (param JenParam) ToCustomType(destPkg string, typeV types.Type) { param.statement.Qual( - getRelativePackagePath(getTypePkg(typeV)), + getRelativePackagePath(destPkg, typeV), getTypeName(typeV), ) } diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 833ecdb5..e1c75c4b 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -22,14 +22,12 @@ var GenConditionsCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Args: cobra.MinimumNArgs(1), }) -var destPkg string - func generateConditions(cmd *cobra.Command, args []string) { // Inspect package and use type checker to infer imported types pkgs := loadPackages(args) // Get the package of the file with go:generate comment - destPkg = os.Getenv("GOPACKAGE") + destPkg := os.Getenv("GOPACKAGE") if destPkg == "" { // TODO que tambien se pueda usar solo failErr(errors.New("this command should be called using go generate")) From a17337acbe504dc79061ca4c489d5652254cb68c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 15:26:35 +0200 Subject: [PATCH 241/467] Type to type --- tools/badctl/cmd/gen/conditions/condition.go | 46 +++++++++--------- tools/badctl/cmd/gen/conditions/field.go | 37 +++------------ tools/badctl/cmd/gen/conditions/file.go | 4 +- tools/badctl/cmd/gen/conditions/jenParam.go | 4 +- tools/badctl/cmd/gen/conditions/type.go | 50 +++++++++++++++----- 5 files changed, 72 insertions(+), 69 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index f00f459e..8e01303c 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -14,7 +14,7 @@ type Condition struct { destPkg string } -func NewCondition(destPkg string, objectType types.Type, field Field) (*Condition, error) { +func NewCondition(destPkg string, objectType Type, field Field) (*Condition, error) { condition := &Condition{ param: NewJenParam(), destPkg: destPkg, @@ -27,8 +27,8 @@ func NewCondition(destPkg string, objectType types.Type, field Field) (*Conditio return condition, nil } -func (condition *Condition) generate(objectType types.Type, field Field) error { - switch fieldType := field.Type.(type) { +func (condition *Condition) generate(objectType Type, field Field) error { + switch fieldType := field.Type.Type.(type) { case *types.Basic: // the field is a basic type (string, int, etc) // adapt param to that type and generate a WhereCondition @@ -67,8 +67,8 @@ func (condition *Condition) generate(objectType types.Type, field Field) error { return nil } -func (condition *Condition) generateForSlice(objectType types.Type, field Field) { - switch elemType := field.Type.(type) { +func (condition *Condition) generateForSlice(objectType Type, field Field) { + switch elemType := field.Type.Type.(type) { case *types.Basic: // slice of basic types ([]string, []int, etc.) // the only one supported directly by gorm is []byte @@ -79,7 +79,7 @@ func (condition *Condition) generateForSlice(objectType types.Type, field Field) ) case *types.Named: // slice of named types (user defined types) - _, err := getBadORMModelStruct(field.Type) + _, err := field.Type.BadORMModelStruct() if err == nil { // slice of BadORM models -> hasMany relation log.Println(field.TypeName()) @@ -102,14 +102,14 @@ func (condition *Condition) generateForSlice(objectType types.Type, field Field) } } -func (condition *Condition) generateForNamedType(objectType types.Type, field Field) error { - _, err := getBadORMModelStruct(field.Type) +func (condition *Condition) generateForNamedType(objectType Type, field Field) error { + _, err := field.Type.BadORMModelStruct() if err == nil { // field is a BaDORM Model // TODO que pasa si esta en otro package? se importa solo? - hasFK, err := hasFK(objectType, field) + hasFK, err := objectType.HasFK(field) if err != nil { return err } @@ -134,7 +134,7 @@ func (condition *Condition) generateForNamedType(objectType types.Type, field Fi } } else { // field is not a BaDORM Model - if (field.IsGormCustomType() || field.TypeString() == "time.Time") && field.TypeString() != "gorm.io/gorm.DeletedAt" { + if (field.Type.IsGormCustomType() || field.TypeString() == "time.Time") && field.TypeString() != "gorm.io/gorm.DeletedAt" { // TODO DeletedAt // field is a Gorm Custom type (implements Scanner and Valuer interfaces) // or a named type supported by gorm (time.Time, gorm.DeletedAt) @@ -151,13 +151,13 @@ func (condition *Condition) generateForNamedType(objectType types.Type, field Fi return nil } -func (condition *Condition) generateWhere(objectType types.Type, field Field) { +func (condition *Condition) generateWhere(objectType Type, field Field) { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, ).Types( jen.Qual( getRelativePackagePath(condition.destPkg, objectType), - getTypeName(objectType), + objectType.Name(), ), ) @@ -180,19 +180,19 @@ func (condition *Condition) generateWhere(objectType types.Type, field Field) { ) } -func (condition *Condition) generateInverseJoin(objectType types.Type, field Field) { +func (condition *Condition) generateInverseJoin(objectType Type, field Field) { condition.generateJoinWithFK( field.Type, // TODO testear los Override Foreign Key Field{ - Name: getTypeName(objectType), + Name: objectType.Name(), Type: objectType, Tags: field.Tags, }, ) } -func (condition *Condition) generateJoinWithFK(objectType types.Type, field Field) { +func (condition *Condition) generateJoinWithFK(objectType Type, field Field) { condition.generateJoin( objectType, field, @@ -201,21 +201,21 @@ func (condition *Condition) generateJoinWithFK(objectType types.Type, field Fiel ) } -func (condition *Condition) generateJoinWithoutFK(objectType types.Type, field Field) { +func (condition *Condition) generateJoinWithoutFK(objectType Type, field Field) { condition.generateJoin( objectType, field, field.getFKReferencesAttribute(), - field.getRelatedTypeFKAttribute(getTypeName(objectType)), + field.getRelatedTypeFKAttribute(objectType.Name()), ) } -func (condition *Condition) generateJoin(objectType types.Type, field Field, t1Field, t2Field string) { +func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, t2Field string) { log.Println(field.Name) t1 := jen.Qual( getRelativePackagePath(condition.destPkg, objectType), - getTypeName(objectType), + objectType.Name(), ) t2 := jen.Qual( @@ -255,14 +255,14 @@ func (condition *Condition) generateJoin(objectType types.Type, field Field, t1F ) } -func getConditionName(typeV types.Type, fieldName string) string { - return getTypeName(typeV) + strcase.ToPascal(fieldName) + badORMCondition +func getConditionName(typeV Type, fieldName string) string { + return typeV.Name() + strcase.ToPascal(fieldName) + badORMCondition } // TODO testear esto // avoid importing the same package as the destination one -func getRelativePackagePath(destPkg string, typeV types.Type) string { - srcPkg := getTypePkg(typeV) +func getRelativePackagePath(destPkg string, typeV Type) string { + srcPkg := typeV.Pkg() if srcPkg.Name() == destPkg { return "" } diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index 5cffb2e3..cccad256 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -3,14 +3,13 @@ package conditions import ( "errors" "go/types" - "regexp" "github.com/ettle/strcase" ) type Field struct { Name string - Type types.Type + Type Type Embedded bool Tags GormTags } @@ -58,45 +57,21 @@ func (field Field) TypeString() string { } func (field Field) TypeName() string { - return getTypeName(field.Type) + return field.Type.Name() } func (field Field) ChangeType(newType types.Type) Field { return Field{ Name: field.Name, - Type: newType, + Type: Type{newType}, Tags: field.Tags, } } -var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) -var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) - -func (field Field) IsGormCustomType() bool { - typeNamed, isNamedType := field.Type.(*types.Named) - if !isNamedType { - return false - } - - hasScanMethod := false - hasValueMethod := false - for i := 0; i < typeNamed.NumMethods(); i++ { - methodSignature := typeNamed.Method(i).String() - - if !hasScanMethod && scanMethod.MatchString(methodSignature) { - hasScanMethod = true - } else if !hasValueMethod && valueMethod.MatchString(methodSignature) { - hasValueMethod = true - } - } - - return hasScanMethod && hasValueMethod -} - -func getFields(objectType types.Type, prefix string) ([]Field, error) { +func getFields(objectType Type, prefix string) ([]Field, error) { // The underlying type has to be a struct and a BaDORM Model // (ignore const, var, func, etc.) - structType, err := getBadORMModelStruct(objectType) + structType, err := objectType.BadORMModelStruct() if err != nil { return nil, err } @@ -118,7 +93,7 @@ func getStructFields(structType *types.Struct, prefix string) ([]Field, error) { gormTags := getGormTags(structType.Tag(i)) fields = append(fields, Field{ Name: prefix + fieldObject.Name(), - Type: fieldObject.Type(), + Type: Type{fieldObject.Type()}, Embedded: fieldObject.Embedded() || gormTags.hasEmbedded(), Tags: gormTags, }) diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 04cb5383..e6370a9c 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -30,7 +30,7 @@ func NewConditionsFile(destPkg string, name string) *File { } func (file File) AddConditionsFor(object types.Object) error { - fields, err := getFields(object.Type(), "") + fields, err := getFields(Type{object.Type()}, "") if err != nil { return err } @@ -77,7 +77,7 @@ func (file File) generateConditionsForEachField(object types.Object, fields []Fi )...) } else { newCondition, err := NewCondition( - file.destPkg, object.Type(), field, + file.destPkg, Type{object.Type()}, field, ) if err != nil { failErr(err) diff --git a/tools/badctl/cmd/gen/conditions/jenParam.go b/tools/badctl/cmd/gen/conditions/jenParam.go index 582a2627..f17a9318 100644 --- a/tools/badctl/cmd/gen/conditions/jenParam.go +++ b/tools/badctl/cmd/gen/conditions/jenParam.go @@ -67,9 +67,9 @@ func (param JenParam) ToSlice() { param.statement.Index() } -func (param JenParam) ToCustomType(destPkg string, typeV types.Type) { +func (param JenParam) ToCustomType(destPkg string, typeV Type) { param.statement.Qual( getRelativePackagePath(destPkg, typeV), - getTypeName(typeV), + typeV.Name(), ) } diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index 9908552f..21ca508b 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -3,23 +3,27 @@ package conditions import ( "fmt" "go/types" + "regexp" "strings" "github.com/elliotchance/pie/v2" ) -// TODO me gustaria que esten en una clase -func getTypeName(typeV types.Type) string { - switch typeTyped := typeV.(type) { +type Type struct { + types.Type +} + +func (t Type) Name() string { + switch typeTyped := t.Type.(type) { case *types.Named: return typeTyped.Obj().Name() default: - return pie.Last(strings.Split(typeV.String(), ".")) + return pie.Last(strings.Split(t.String(), ".")) } } -func getTypePkg(typeV types.Type) *types.Package { - switch typeTyped := typeV.(type) { +func (t Type) Pkg() *types.Package { + switch typeTyped := t.Type.(type) { case *types.Named: return typeTyped.Obj().Pkg() default: @@ -27,10 +31,10 @@ func getTypePkg(typeV types.Type) *types.Package { } } -func getBadORMModelStruct(typeV types.Type) (*types.Struct, error) { - structType, ok := typeV.Underlying().(*types.Struct) +func (t Type) BadORMModelStruct() (*types.Struct, error) { + structType, ok := t.Underlying().(*types.Struct) if !ok || !isBadORMModel(structType) { - return nil, fmt.Errorf("type %s is not a BaDORM Model", typeV.String()) + return nil, fmt.Errorf("type %s is not a BaDORM Model", t.String()) } return structType, nil @@ -48,9 +52,9 @@ func isBadORMModel(structType *types.Struct) bool { return false } -func hasFK(typeV types.Type, field Field) (bool, error) { +func (t Type) HasFK(field Field) (bool, error) { objectFields, err := getFields( - typeV, + t, // TODO testear esto si esta bien aca field.Tags.getEmbeddedPrefix(), ) @@ -61,3 +65,27 @@ func hasFK(typeV types.Type, field Field) (bool, error) { return otherField.Name == field.getFKAttribute() }), nil } + +var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) +var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) + +func (t Type) IsGormCustomType() bool { + typeNamed, isNamedType := t.Type.(*types.Named) + if !isNamedType { + return false + } + + hasScanMethod := false + hasValueMethod := false + for i := 0; i < typeNamed.NumMethods(); i++ { + methodSignature := typeNamed.Method(i).String() + + if !hasScanMethod && scanMethod.MatchString(methodSignature) { + hasScanMethod = true + } else if !hasValueMethod && valueMethod.MatchString(methodSignature) { + hasValueMethod = true + } + } + + return hasScanMethod && hasValueMethod +} From cf865ae0ad2c311ee3451d05f136f66548d36541 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 15:39:25 +0200 Subject: [PATCH 242/467] fail in the same way in all the commands --- tools/badctl/cmd/cmderrors/errors.go | 13 +++++++++++++ tools/badctl/cmd/gen/conditions/file.go | 5 +++-- tools/badctl/cmd/gen/conditions/main.go | 16 +++++----------- tools/badctl/cmd/gen/docker.go | 23 ++++++++++++----------- tools/badctl/cmd/run.go | 3 ++- 5 files changed, 35 insertions(+), 25 deletions(-) create mode 100644 tools/badctl/cmd/cmderrors/errors.go diff --git a/tools/badctl/cmd/cmderrors/errors.go b/tools/badctl/cmd/cmderrors/errors.go new file mode 100644 index 00000000..91b134e6 --- /dev/null +++ b/tools/badctl/cmd/cmderrors/errors.go @@ -0,0 +1,13 @@ +package cmderrors + +import ( + "fmt" + "os" +) + +func FailErr(err error) { + if err != nil { + fmt.Fprintf(os.Stderr, "Error: %v\n", err) + os.Exit(1) + } +} diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index e6370a9c..76b1c7eb 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -6,6 +6,7 @@ import ( "log" "github.com/dave/jennifer/jen" + "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/badaas/tools/badctl/cmd/version" ) @@ -80,7 +81,7 @@ func (file File) generateConditionsForEachField(object types.Object, fields []Fi file.destPkg, Type{object.Type()}, field, ) if err != nil { - failErr(err) + cmderrors.FailErr(err) } conditions = append(conditions, newCondition) @@ -94,7 +95,7 @@ func (file File) generateConditionsForEachField(object types.Object, fields []Fi func (file File) generateEmbeddedConditions(object types.Object, field Field) []*Condition { embeddedStructType, ok := field.Type.Underlying().(*types.Struct) if !ok { - failErr(errors.New("unreachable! embedded objects are always structs")) + cmderrors.FailErr(errors.New("unreachable! embedded objects are always structs")) } fields, err := getStructFields(embeddedStructType, field.Tags.getEmbeddedPrefix()) diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index e1c75c4b..be5598d7 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -8,6 +8,7 @@ import ( "os" "strings" + "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/verdeter" "github.com/spf13/cobra" @@ -30,7 +31,7 @@ func generateConditions(cmd *cobra.Command, args []string) { destPkg := os.Getenv("GOPACKAGE") if destPkg == "" { // TODO que tambien se pueda usar solo - failErr(errors.New("this command should be called using go generate")) + cmderrors.FailErr(errors.New("this command should be called using go generate")) } for _, pkg := range pkgs { @@ -54,7 +55,7 @@ func generateConditions(cmd *cobra.Command, args []string) { err = file.Save() if err != nil { - failErr(err) + cmderrors.FailErr(err) } } } @@ -65,7 +66,7 @@ func loadPackages(paths []string) []*packages.Package { cfg := &packages.Config{Mode: packages.NeedTypes} pkgs, err := packages.Load(cfg, paths...) if err != nil { - failErr(fmt.Errorf("loading packages for inspection: %v", err)) + cmderrors.FailErr(fmt.Errorf("loading packages for inspection: %v", err)) } // print compilation errors of source packages @@ -74,17 +75,10 @@ func loadPackages(paths []string) []*packages.Package { return pkgs } -func failErr(err error) { - if err != nil { - fmt.Fprintf(os.Stderr, "Error: %v\n", err) - os.Exit(1) - } -} - func getObject(pkg *packages.Package, name string) types.Object { obj := pkg.Types.Scope().Lookup(name) if obj == nil { - failErr(fmt.Errorf("%s not found in declared types of %s", + cmderrors.FailErr(fmt.Errorf("%s not found in declared types of %s", name, pkg)) } diff --git a/tools/badctl/cmd/gen/docker.go b/tools/badctl/cmd/gen/docker.go index aab54973..3217d338 100644 --- a/tools/badctl/cmd/gen/docker.go +++ b/tools/badctl/cmd/gen/docker.go @@ -7,6 +7,7 @@ import ( "path/filepath" "strings" + "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/verdeter" "github.com/ditrit/verdeter/validators" "github.com/spf13/cobra" @@ -50,7 +51,7 @@ func init() { ), ) if err != nil { - panic(err) + cmderrors.FailErr(err) } genDockerCmd.SetDefault(DBProviderKey, Cockroachdb) genDockerCmd.AddValidator( @@ -87,26 +88,26 @@ func copyBadaasConfig(dbProvider string) { filepath.Join("config", "badaas.yml"), ) if err != nil { - panic(err) + cmderrors.FailErr(err) } configData := map[string]any{} err = yaml.Unmarshal(configFile, &configData) if err != nil { - panic(err) + cmderrors.FailErr(err) } configData["database"].(map[string]any)["port"] = DBPorts[dbProvider] configBytes, err := yaml.Marshal(&configData) if err != nil { - panic(err) + cmderrors.FailErr(err) } destConfigDir := filepath.Join(destBadaasDir, "config") err = os.MkdirAll(destConfigDir, os.ModePerm) if err != nil { - panic(err) + cmderrors.FailErr(err) } err = os.WriteFile( @@ -114,36 +115,36 @@ func copyBadaasConfig(dbProvider string) { configBytes, 0o0600, ) if err != nil { - panic(err) + cmderrors.FailErr(err) } } func copyFile(sourcePath, destPath string) { fileContent, err := embedFS.ReadFile(sourcePath) if err != nil { - panic(err) + cmderrors.FailErr(err) } if err := os.WriteFile(destPath, fileContent, 0o0600); err != nil { - panic(err) + cmderrors.FailErr(err) } } func copyDir(sourceDir, destDir string) { files, err := embedFS.ReadDir(sourceDir) if err != nil { - panic(err) + cmderrors.FailErr(err) } _, err = os.Stat(destDir) if err != nil { if !os.IsNotExist(err) { - panic(err) + cmderrors.FailErr(err) } err = os.MkdirAll(destDir, os.ModePerm) if err != nil { - panic(err) + cmderrors.FailErr(err) } } diff --git a/tools/badctl/cmd/run.go b/tools/badctl/cmd/run.go index 001458b7..ed91d34e 100644 --- a/tools/badctl/cmd/run.go +++ b/tools/badctl/cmd/run.go @@ -5,6 +5,7 @@ import ( "os" "os/exec" + "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/verdeter" "github.com/spf13/cobra" ) @@ -28,7 +29,7 @@ func runApp(cmd *cobra.Command, args []string) { err := dockerCommand.Run() if err != nil { - panic(err) + cmderrors.FailErr(err) } // TODO add wait for api From 0b8fd131c9b147fda178354c1c23c12b8dc8846d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 15:48:09 +0200 Subject: [PATCH 243/467] allow using gen conditions without go generate --- tools/badctl/cmd/gen/conditions/main.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index be5598d7..77645394 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -11,6 +11,7 @@ import ( "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/verdeter" "github.com/spf13/cobra" + "github.com/spf13/viper" "golang.org/x/tools/go/packages" ) @@ -23,6 +24,18 @@ var GenConditionsCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Args: cobra.MinimumNArgs(1), }) +const DestPackageKey = "dest_package" + +func init() { + err := GenConditionsCmd.LKey( + DestPackageKey, verdeter.IsStr, "d", + "Destination package (not used if ran with go generate)", + ) + if err != nil { + cmderrors.FailErr(err) + } +} + func generateConditions(cmd *cobra.Command, args []string) { // Inspect package and use type checker to infer imported types pkgs := loadPackages(args) @@ -30,8 +43,10 @@ func generateConditions(cmd *cobra.Command, args []string) { // Get the package of the file with go:generate comment destPkg := os.Getenv("GOPACKAGE") if destPkg == "" { - // TODO que tambien se pueda usar solo - cmderrors.FailErr(errors.New("this command should be called using go generate")) + destPkg = viper.GetString(DestPackageKey) + if destPkg == "" { + cmderrors.FailErr(errors.New("config --dest_package or use go generate")) + } } for _, pkg := range pkgs { From bd5519f2071c63cdc84ac94840f9cfc2afe5c0ea Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 16:44:02 +0200 Subject: [PATCH 244/467] add logs to gen conditions --- tools/badctl/cmd/gen/conditions/condition.go | 21 ++++++++++-------- tools/badctl/cmd/gen/conditions/file.go | 6 +++-- tools/badctl/cmd/gen/conditions/main.go | 8 +++---- tools/badctl/cmd/logger/config.go | 23 ++++++++++++++++++++ tools/badctl/cmd/root.go | 11 ++++++++++ tools/badctl/go.mod | 3 ++- tools/badctl/go.sum | 3 +++ 7 files changed, 58 insertions(+), 17 deletions(-) create mode 100644 tools/badctl/cmd/logger/config.go diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 8e01303c..1e4b3728 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -2,9 +2,9 @@ package conditions import ( "go/types" - "log" "github.com/dave/jennifer/jen" + . "github.com/ditrit/badaas/tools/badctl/cmd/logger" "github.com/ettle/strcase" ) @@ -61,7 +61,7 @@ func (condition *Condition) generate(objectType Type, field Field) error { field.ChangeType(fieldType.Elem()), ) default: - log.Printf("struct field type not handled: %T", fieldType) + Logger.Debugf("struct field type not handled: %T", fieldType) } return nil @@ -82,7 +82,6 @@ func (condition *Condition) generateForSlice(objectType Type, field Field) { _, err := field.Type.BadORMModelStruct() if err == nil { // slice of BadORM models -> hasMany relation - log.Println(field.TypeName()) condition.generateInverseJoin( objectType, field, @@ -98,7 +97,7 @@ func (condition *Condition) generateForSlice(objectType Type, field Field) { field.ChangeType(elemType.Elem()), ) default: - log.Printf("struct field list elem type not handled: %T", elemType) + Logger.Debugf("struct field list elem type not handled: %T", elemType) } } @@ -144,7 +143,7 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) e field, ) } else { - log.Printf("struct field type not handled: %s", field.TypeString()) + Logger.Debugf("struct field type not handled: %s", field.TypeString()) } } @@ -161,10 +160,13 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { ), ) + conditionName := getConditionName(objectType, field.Name) + Logger.Debugf("Generated %q", conditionName) + condition.codes = append( condition.codes, jen.Func().Id( - getConditionName(objectType, field.Name), + conditionName, ).Params( condition.param.Statement(), ).Add( @@ -211,8 +213,6 @@ func (condition *Condition) generateJoinWithoutFK(objectType Type, field Field) } func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, t2Field string) { - log.Println(field.Name) - t1 := jen.Qual( getRelativePackagePath(condition.destPkg, objectType), objectType.Name(), @@ -223,6 +223,9 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, field.TypeName(), ) + conditionName := getConditionName(objectType, field.Name) + Logger.Debugf("Generated %q", conditionName) + badormT1Condition := jen.Qual( badORMPath, badORMCondition, ).Types(t1) @@ -238,7 +241,7 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, condition.codes = append( condition.codes, jen.Func().Id( - getConditionName(objectType, field.Name), + conditionName, ).Params( jen.Id("conditions").Op("...").Add(badormT2Condition), ).Add( diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 76b1c7eb..33843aff 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -3,10 +3,10 @@ package conditions import ( "errors" "go/types" - "log" "github.com/dave/jennifer/jen" "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" + . "github.com/ditrit/badaas/tools/badctl/cmd/logger" "github.com/ditrit/badaas/tools/badctl/cmd/version" ) @@ -36,6 +36,8 @@ func (file File) AddConditionsFor(object types.Object) error { return err } + Logger.Infof("Generating conditions for type %q in %s", object.Name(), file.name) + file.addConditionsForEachField(object, fields) return nil } @@ -70,7 +72,7 @@ const ( func (file File) generateConditionsForEachField(object types.Object, fields []Field) []*Condition { conditions := []*Condition{} for _, field := range fields { - log.Println(field.Name) + Logger.Debugf("Generating condition for field %q", field.Name) if field.Embedded { conditions = append(conditions, file.generateEmbeddedConditions( object, diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 77645394..38c45936 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -4,11 +4,11 @@ import ( "errors" "fmt" "go/types" - "log" "os" "strings" "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" + . "github.com/ditrit/badaas/tools/badctl/cmd/logger" "github.com/ditrit/verdeter" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -37,6 +37,7 @@ func init() { } func generateConditions(cmd *cobra.Command, args []string) { + SetLogLevel() // Inspect package and use type checker to infer imported types pkgs := loadPackages(args) @@ -50,14 +51,11 @@ func generateConditions(cmd *cobra.Command, args []string) { } for _, pkg := range pkgs { - log.Println(pkg.Types.Path()) - log.Println(pkg.Types.Name()) + Logger.Infof("Generating conditions for types in package %q", pkg.Types.Name()) for _, name := range pkg.Types.Scope().Names() { object := getObject(pkg, name) if object != nil { - log.Println(name) - file := NewConditionsFile( destPkg, strings.ToLower(object.Name())+"_conditions.go", diff --git a/tools/badctl/cmd/logger/config.go b/tools/badctl/cmd/logger/config.go new file mode 100644 index 00000000..95bfafb8 --- /dev/null +++ b/tools/badctl/cmd/logger/config.go @@ -0,0 +1,23 @@ +package logger + +import ( + "github.com/ditrit/badaas/tools/badctl/cmd/version" + log "github.com/sirupsen/logrus" + "github.com/spf13/viper" +) + +var Logger = log.WithField("version", version.Version) + +const VerboseKey = "verbose" + +func init() { + log.SetFormatter(&log.TextFormatter{}) + log.SetLevel(log.InfoLevel) +} + +func SetLogLevel() { + verbose := viper.GetBool(VerboseKey) + if verbose { + log.SetLevel(log.DebugLevel) + } +} diff --git a/tools/badctl/cmd/root.go b/tools/badctl/cmd/root.go index c95f14e4..db080bc0 100644 --- a/tools/badctl/cmd/root.go +++ b/tools/badctl/cmd/root.go @@ -1,7 +1,9 @@ package cmd import ( + "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/badaas/tools/badctl/cmd/gen" + "github.com/ditrit/badaas/tools/badctl/cmd/logger" "github.com/ditrit/badaas/tools/badctl/cmd/version" "github.com/ditrit/verdeter" ) @@ -23,4 +25,13 @@ func Execute() { func init() { rootCmd.AddSubCommand(runCmd) rootCmd.AddSubCommand(gen.GenCmd) + + err := rootCmd.GKey( + logger.VerboseKey, verdeter.IsBool, "v", + "Verbose logging", + ) + if err != nil { + cmderrors.FailErr(err) + } + rootCmd.SetDefault(logger.VerboseKey, false) } diff --git a/tools/badctl/go.mod b/tools/badctl/go.mod index 62f909ae..9f1871a4 100644 --- a/tools/badctl/go.mod +++ b/tools/badctl/go.mod @@ -7,6 +7,8 @@ require ( github.com/ditrit/verdeter v0.4.0 github.com/elliotchance/pie/v2 v2.5.2 github.com/ettle/strcase v0.1.1 + github.com/fatih/structtag v1.2.0 + github.com/sirupsen/logrus v1.9.2 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 golang.org/x/tools v0.6.0 @@ -14,7 +16,6 @@ require ( ) require ( - github.com/fatih/structtag v1.2.0 github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect diff --git a/tools/badctl/go.sum b/tools/badctl/go.sum index bea8633b..3f2f07d4 100644 --- a/tools/badctl/go.sum +++ b/tools/badctl/go.sum @@ -160,6 +160,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= +github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -326,6 +328,7 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= From 4215b5cb1aa7fccaed9b3c11130a6589fb9d5d06 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 16:48:00 +0200 Subject: [PATCH 245/467] avoid dot import --- tools/badctl/cmd/gen/conditions/condition.go | 12 ++++++------ tools/badctl/cmd/gen/conditions/file.go | 6 +++--- tools/badctl/cmd/gen/conditions/main.go | 8 +++----- tools/badctl/cmd/{logger => log}/config.go | 4 ++-- 4 files changed, 14 insertions(+), 16 deletions(-) rename tools/badctl/cmd/{logger => log}/config.go (91%) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 1e4b3728..d139cca8 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -4,7 +4,7 @@ import ( "go/types" "github.com/dave/jennifer/jen" - . "github.com/ditrit/badaas/tools/badctl/cmd/logger" + "github.com/ditrit/badaas/tools/badctl/cmd/log" "github.com/ettle/strcase" ) @@ -61,7 +61,7 @@ func (condition *Condition) generate(objectType Type, field Field) error { field.ChangeType(fieldType.Elem()), ) default: - Logger.Debugf("struct field type not handled: %T", fieldType) + log.Logger.Debugf("struct field type not handled: %T", fieldType) } return nil @@ -97,7 +97,7 @@ func (condition *Condition) generateForSlice(objectType Type, field Field) { field.ChangeType(elemType.Elem()), ) default: - Logger.Debugf("struct field list elem type not handled: %T", elemType) + log.Logger.Debugf("struct field list elem type not handled: %T", elemType) } } @@ -143,7 +143,7 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) e field, ) } else { - Logger.Debugf("struct field type not handled: %s", field.TypeString()) + log.Logger.Debugf("struct field type not handled: %s", field.TypeString()) } } @@ -161,7 +161,7 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { ) conditionName := getConditionName(objectType, field.Name) - Logger.Debugf("Generated %q", conditionName) + log.Logger.Debugf("Generated %q", conditionName) condition.codes = append( condition.codes, @@ -224,7 +224,7 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, ) conditionName := getConditionName(objectType, field.Name) - Logger.Debugf("Generated %q", conditionName) + log.Logger.Debugf("Generated %q", conditionName) badormT1Condition := jen.Qual( badORMPath, badORMCondition, diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 33843aff..69a8f5b8 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -6,7 +6,7 @@ import ( "github.com/dave/jennifer/jen" "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" - . "github.com/ditrit/badaas/tools/badctl/cmd/logger" + "github.com/ditrit/badaas/tools/badctl/cmd/log" "github.com/ditrit/badaas/tools/badctl/cmd/version" ) @@ -36,7 +36,7 @@ func (file File) AddConditionsFor(object types.Object) error { return err } - Logger.Infof("Generating conditions for type %q in %s", object.Name(), file.name) + log.Logger.Infof("Generating conditions for type %q in %s", object.Name(), file.name) file.addConditionsForEachField(object, fields) return nil @@ -72,7 +72,7 @@ const ( func (file File) generateConditionsForEachField(object types.Object, fields []Field) []*Condition { conditions := []*Condition{} for _, field := range fields { - Logger.Debugf("Generating condition for field %q", field.Name) + log.Logger.Debugf("Generating condition for field %q", field.Name) if field.Embedded { conditions = append(conditions, file.generateEmbeddedConditions( object, diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 38c45936..02cda60c 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -8,7 +8,7 @@ import ( "strings" "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" - . "github.com/ditrit/badaas/tools/badctl/cmd/logger" + "github.com/ditrit/badaas/tools/badctl/cmd/log" "github.com/ditrit/verdeter" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -37,7 +37,7 @@ func init() { } func generateConditions(cmd *cobra.Command, args []string) { - SetLogLevel() + log.SetLevel() // Inspect package and use type checker to infer imported types pkgs := loadPackages(args) @@ -51,7 +51,7 @@ func generateConditions(cmd *cobra.Command, args []string) { } for _, pkg := range pkgs { - Logger.Infof("Generating conditions for types in package %q", pkg.Types.Name()) + log.Logger.Infof("Generating conditions for types in package %q", pkg.Types.Name()) for _, name := range pkg.Types.Scope().Names() { object := getObject(pkg, name) @@ -103,5 +103,3 @@ func getObject(pkg *packages.Package, name string) types.Object { return object } - -// TODO add logs diff --git a/tools/badctl/cmd/logger/config.go b/tools/badctl/cmd/log/config.go similarity index 91% rename from tools/badctl/cmd/logger/config.go rename to tools/badctl/cmd/log/config.go index 95bfafb8..03025b2e 100644 --- a/tools/badctl/cmd/logger/config.go +++ b/tools/badctl/cmd/log/config.go @@ -1,4 +1,4 @@ -package logger +package log import ( "github.com/ditrit/badaas/tools/badctl/cmd/version" @@ -15,7 +15,7 @@ func init() { log.SetLevel(log.InfoLevel) } -func SetLogLevel() { +func SetLevel() { verbose := viper.GetBool(VerboseKey) if verbose { log.SetLevel(log.DebugLevel) From c8f9c18a450eb4edf7e9bb841ab53086d2820475 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 26 May 2023 17:27:42 +0200 Subject: [PATCH 246/467] add comments to functions --- tools/badctl/cmd/gen/conditions/condition.go | 15 +++++++++++++-- tools/badctl/cmd/gen/conditions/field.go | 20 ++++++++++++++++++++ tools/badctl/cmd/gen/conditions/file.go | 9 ++++++--- tools/badctl/cmd/gen/conditions/main.go | 8 +++++++- tools/badctl/cmd/gen/conditions/type.go | 8 ++++++++ 5 files changed, 54 insertions(+), 6 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index d139cca8..7844fac7 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -27,6 +27,7 @@ func NewCondition(destPkg string, objectType Type, field Field) (*Condition, err return condition, nil } +// Generate the condition between the object and the field func (condition *Condition) generate(objectType Type, field Field) error { switch fieldType := field.Type.Type.(type) { case *types.Basic: @@ -67,6 +68,7 @@ func (condition *Condition) generate(objectType Type, field Field) error { return nil } +// Generate condition between the object and the field when the field is a slice func (condition *Condition) generateForSlice(objectType Type, field Field) { switch elemType := field.Type.Type.(type) { case *types.Basic: @@ -101,13 +103,13 @@ func (condition *Condition) generateForSlice(objectType Type, field Field) { } } +// Generate condition between object and field when the field is a named type (user defined struct) func (condition *Condition) generateForNamedType(objectType Type, field Field) error { _, err := field.Type.BadORMModelStruct() if err == nil { // field is a BaDORM Model // TODO que pasa si esta en otro package? se importa solo? - hasFK, err := objectType.HasFK(field) if err != nil { return err @@ -150,6 +152,7 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) e return nil } +// Generate a WhereCondition between object and field func (condition *Condition) generateWhere(objectType Type, field Field) { whereCondition := jen.Qual( badORMPath, badORMWhereCondition, @@ -182,6 +185,7 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { ) } +// Generate a inverse JoinCondition, so from the field's object to the object func (condition *Condition) generateInverseJoin(objectType Type, field Field) { condition.generateJoinWithFK( field.Type, @@ -194,6 +198,8 @@ func (condition *Condition) generateInverseJoin(objectType Type, field Field) { ) } +// Generate a JoinCondition between the object and field's object +// when object has a foreign key to the field's object func (condition *Condition) generateJoinWithFK(objectType Type, field Field) { condition.generateJoin( objectType, @@ -203,6 +209,9 @@ func (condition *Condition) generateJoinWithFK(objectType Type, field Field) { ) } +// Generate a JoinCondition between the object and field's object +// when object has not a foreign key to the field's object +// (so the field's object has it) func (condition *Condition) generateJoinWithoutFK(objectType Type, field Field) { condition.generateJoin( objectType, @@ -212,6 +221,7 @@ func (condition *Condition) generateJoinWithoutFK(objectType Type, field Field) ) } +// Generate a JoinCondition func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, t2Field string) { t1 := jen.Qual( getRelativePackagePath(condition.destPkg, objectType), @@ -258,12 +268,13 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, ) } +// Generate condition names func getConditionName(typeV Type, fieldName string) string { return typeV.Name() + strcase.ToPascal(fieldName) + badORMCondition } // TODO testear esto -// avoid importing the same package as the destination one +// Avoid importing the same package as the destination one func getRelativePackagePath(destPkg string, typeV Type) string { srcPkg := typeV.Pkg() if srcPkg.Name() == destPkg { diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index cccad256..86202eda 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -14,52 +14,68 @@ type Field struct { Tags GormTags } +// Get the name of the column where the data for a field will be saved func (field Field) getColumnName() string { columnTag, isPresent := field.Tags[columnTagName] if isPresent { + // field has a gorm column tag, so the name of the column will be that tag return columnTag } + // column name generated automatically by gorm + // TODO support https://gorm.io/docs/conventions.html#NamingStrategy return strcase.ToSnake(field.Name) } +// Get name of the attribute of the object that is a foreign key to the field's object func (field Field) getFKAttribute() string { foreignKeyTag, isPresent := field.Tags[foreignKeyTagName] if isPresent { + // field has a foreign key tag, so the name will be that tag return foreignKeyTag } + // gorm default return field.Name + "ID" } +// Get name of the attribute of the field's object that is references by the foreign key func (field Field) getFKReferencesAttribute() string { referencesTag, isPresent := field.Tags[referencesTagName] // TODO testear cuando hay redefinicion en la inversa if isPresent { + // field has a references tag, so the name will be that tag return referencesTag } + // gorm default return "ID" } +// Get name of the attribute of field's object that is a foreign key to the object func (field Field) getRelatedTypeFKAttribute(structName string) string { // TODO testear cuando hay redefinicion foreignKeyTag, isPresent := field.Tags[foreignKeyTagName] if isPresent { + // field has a foreign key tag, so the name will that tag return foreignKeyTag } + // gorm default return structName + "ID" } +// Get field's type full string (pkg + name) func (field Field) TypeString() string { return field.Type.String() } +// Get field's type name func (field Field) TypeName() string { return field.Type.Name() } +// Create a new field with the same name and tags but a different type func (field Field) ChangeType(newType types.Type) Field { return Field{ Name: field.Name, @@ -68,6 +84,8 @@ func (field Field) ChangeType(newType types.Type) Field { } } +// Get fields of a BaDORM model +// Returns error is objectType is not a BaDORM model func getFields(objectType Type, prefix string) ([]Field, error) { // The underlying type has to be a struct and a BaDORM Model // (ignore const, var, func, etc.) @@ -79,6 +97,8 @@ func getFields(objectType Type, prefix string) ([]Field, error) { return getStructFields(structType, prefix) } +// Get fields of a struct +// Returns errors if the struct has not fields func getStructFields(structType *types.Struct, prefix string) ([]Field, error) { numFields := structType.NumFields() if numFields == 0 { diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 69a8f5b8..a99e4298 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -30,6 +30,7 @@ func NewConditionsFile(destPkg string, name string) *File { } } +// Add conditions for an object in the file func (file File) AddConditionsFor(object types.Object) error { fields, err := getFields(Type{object.Type()}, "") if err != nil { @@ -42,11 +43,11 @@ func (file File) AddConditionsFor(object types.Object) error { return nil } +// Add one condition for each field of the object func (file File) addConditionsForEachField(object types.Object, fields []Field) { conditions := file.generateConditionsForEachField(object, fields) for _, condition := range conditions { - // TODO esto no me gusta mucho que este aca for _, code := range condition.codes { file.jenFile.Add(code) } @@ -69,6 +70,7 @@ const ( badORMJoinCondition = "JoinCondition" ) +// Generate the conditions for each of the object's fields func (file File) generateConditionsForEachField(object types.Object, fields []Field) []*Condition { conditions := []*Condition{} for _, field := range fields { @@ -93,7 +95,8 @@ func (file File) generateConditionsForEachField(object types.Object, fields []Fi return conditions } -// TODO quizas esto no deberia estar aca +// Generate conditions for a embedded field +// it will generate a condition for each of the field of the embedded field's type func (file File) generateEmbeddedConditions(object types.Object, field Field) []*Condition { embeddedStructType, ok := field.Type.Underlying().(*types.Struct) if !ok { @@ -102,7 +105,7 @@ func (file File) generateEmbeddedConditions(object types.Object, field Field) [] fields, err := getStructFields(embeddedStructType, field.Tags.getEmbeddedPrefix()) if err != nil { - // TODO ver esto + // embedded field's type has not fields return []*Condition{} } diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 02cda60c..63942c9c 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -36,12 +36,13 @@ func init() { } } +// GenConditionsCmd Run func func generateConditions(cmd *cobra.Command, args []string) { log.SetLevel() // Inspect package and use type checker to infer imported types pkgs := loadPackages(args) - // Get the package of the file with go:generate comment + // Get the package of the file with go:generate comment or in command params destPkg := os.Getenv("GOPACKAGE") if destPkg == "" { destPkg = viper.GetString(DestPackageKey) @@ -50,9 +51,11 @@ func generateConditions(cmd *cobra.Command, args []string) { } } + // Generate conditions for each package for _, pkg := range pkgs { log.Logger.Infof("Generating conditions for types in package %q", pkg.Types.Name()) + // Generate a file with conditions for each BaDORM model in the package for _, name := range pkg.Types.Scope().Names() { object := getObject(pkg, name) if object != nil { @@ -63,6 +66,7 @@ func generateConditions(cmd *cobra.Command, args []string) { err := file.AddConditionsFor(object) if err != nil { + // object is not a BaDORM model, do not generate conditions continue } @@ -75,6 +79,7 @@ func generateConditions(cmd *cobra.Command, args []string) { } } +// Load package information from paths func loadPackages(paths []string) []*packages.Package { cfg := &packages.Config{Mode: packages.NeedTypes} pkgs, err := packages.Load(cfg, paths...) @@ -88,6 +93,7 @@ func loadPackages(paths []string) []*packages.Package { return pkgs } +// Get object by name in the package func getObject(pkg *packages.Package, name string) types.Object { obj := pkg.Types.Scope().Lookup(name) if obj == nil { diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index 21ca508b..8338bc74 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -13,6 +13,7 @@ type Type struct { types.Type } +// Get the name of the type depending of the internal type func (t Type) Name() string { switch typeTyped := t.Type.(type) { case *types.Named: @@ -22,6 +23,7 @@ func (t Type) Name() string { } } +// Get the package of the type depending of the internal type func (t Type) Pkg() *types.Package { switch typeTyped := t.Type.(type) { case *types.Named: @@ -31,6 +33,8 @@ func (t Type) Pkg() *types.Package { } } +// Get the struct under type if it is a BaDORM model +// Returns error if the type is not a BaDORM model func (t Type) BadORMModelStruct() (*types.Struct, error) { structType, ok := t.Underlying().(*types.Struct) if !ok || !isBadORMModel(structType) { @@ -40,6 +44,7 @@ func (t Type) BadORMModelStruct() (*types.Struct, error) { return structType, nil } +// Returns true if the type is a BaDORM model func isBadORMModel(structType *types.Struct) bool { for i := 0; i < structType.NumFields(); i++ { field := structType.Field(i) @@ -52,6 +57,8 @@ func isBadORMModel(structType *types.Struct) bool { return false } +// Returns true is the type has a foreign key to the field's object +// (another field that references that object) func (t Type) HasFK(field Field) (bool, error) { objectFields, err := getFields( t, @@ -69,6 +76,7 @@ func (t Type) HasFK(field Field) (bool, error) { var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) +// Returns true if the type is a Gorm Custom type (https://gorm.io/docs/data_types.html) func (t Type) IsGormCustomType() bool { typeNamed, isNamedType := t.Type.(*types.Named) if !isNamedType { From cddf7f16bcb6b22385e07aeb5a684f51d0f4f776 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 30 May 2023 11:45:56 +0200 Subject: [PATCH 247/467] fix import --- tools/badctl/cmd/root.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/badctl/cmd/root.go b/tools/badctl/cmd/root.go index db080bc0..ce2f822e 100644 --- a/tools/badctl/cmd/root.go +++ b/tools/badctl/cmd/root.go @@ -3,7 +3,7 @@ package cmd import ( "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/badaas/tools/badctl/cmd/gen" - "github.com/ditrit/badaas/tools/badctl/cmd/logger" + "github.com/ditrit/badaas/tools/badctl/cmd/log" "github.com/ditrit/badaas/tools/badctl/cmd/version" "github.com/ditrit/verdeter" ) @@ -27,11 +27,11 @@ func init() { rootCmd.AddSubCommand(gen.GenCmd) err := rootCmd.GKey( - logger.VerboseKey, verdeter.IsBool, "v", + log.VerboseKey, verdeter.IsBool, "v", "Verbose logging", ) if err != nil { cmderrors.FailErr(err) } - rootCmd.SetDefault(logger.VerboseKey, false) + rootCmd.SetDefault(log.VerboseKey, false) } From 6268f602079370162a30ae1a3955298a35341ab4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 30 May 2023 12:05:50 +0200 Subject: [PATCH 248/467] conditions to a different package --- testintegration/bicycle_conditions.go | 46 ---- testintegration/city_conditions.go | 39 --- testintegration/company_conditions.go | 40 --- testintegration/conditions.go | 4 - .../conditions/bicycle_conditions.go | 47 ++++ testintegration/conditions/city_conditions.go | 40 +++ .../conditions/company_conditions.go | 41 +++ testintegration/conditions/conditions.go | 4 + .../conditions/country_conditions.go | 48 ++++ .../conditions/employee_conditions.go | 47 ++++ .../conditions/person_conditions.go | 34 +++ .../conditions/product_conditions.go | 89 ++++++ testintegration/conditions/sale_conditions.go | 66 +++++ .../conditions/seller_conditions.go | 40 +++ testintegration/country_conditions.go | 47 ---- testintegration/crudRepository.go | 24 +- testintegration/crudService.go | 260 +++++++++--------- testintegration/db_models.go | 29 +- testintegration/employee_conditions.go | 46 ---- testintegration/integration_test.go | 19 +- testintegration/{ => models}/models.go | 2 +- testintegration/person_conditions.go | 33 --- testintegration/product_conditions.go | 88 ------ testintegration/sale_conditions.go | 65 ----- testintegration/seller_conditions.go | 39 --- tools/badctl/cmd/gen/conditions/condition.go | 2 +- 26 files changed, 627 insertions(+), 612 deletions(-) delete mode 100644 testintegration/bicycle_conditions.go delete mode 100644 testintegration/city_conditions.go delete mode 100644 testintegration/company_conditions.go delete mode 100644 testintegration/conditions.go create mode 100644 testintegration/conditions/bicycle_conditions.go create mode 100644 testintegration/conditions/city_conditions.go create mode 100644 testintegration/conditions/company_conditions.go create mode 100644 testintegration/conditions/conditions.go create mode 100644 testintegration/conditions/country_conditions.go create mode 100644 testintegration/conditions/employee_conditions.go create mode 100644 testintegration/conditions/person_conditions.go create mode 100644 testintegration/conditions/product_conditions.go create mode 100644 testintegration/conditions/sale_conditions.go create mode 100644 testintegration/conditions/seller_conditions.go delete mode 100644 testintegration/country_conditions.go delete mode 100644 testintegration/employee_conditions.go rename testintegration/{ => models}/models.go (99%) delete mode 100644 testintegration/person_conditions.go delete mode 100644 testintegration/product_conditions.go delete mode 100644 testintegration/sale_conditions.go delete mode 100644 testintegration/seller_conditions.go diff --git a/testintegration/bicycle_conditions.go b/testintegration/bicycle_conditions.go deleted file mode 100644 index b36dc501..00000000 --- a/testintegration/bicycle_conditions.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. -package testintegration - -import ( - badorm "github.com/ditrit/badaas/badorm" - uuid "github.com/google/uuid" - "time" -) - -func BicycleIdCondition(v uuid.UUID) badorm.WhereCondition[Bicycle] { - return badorm.WhereCondition[Bicycle]{ - Field: "id", - Value: v, - } -} -func BicycleCreatedAtCondition(v time.Time) badorm.WhereCondition[Bicycle] { - return badorm.WhereCondition[Bicycle]{ - Field: "created_at", - Value: v, - } -} -func BicycleUpdatedAtCondition(v time.Time) badorm.WhereCondition[Bicycle] { - return badorm.WhereCondition[Bicycle]{ - Field: "updated_at", - Value: v, - } -} -func BicycleNameCondition(v string) badorm.WhereCondition[Bicycle] { - return badorm.WhereCondition[Bicycle]{ - Field: "name", - Value: v, - } -} -func BicycleOwnerCondition(conditions ...badorm.Condition[Person]) badorm.Condition[Bicycle] { - return badorm.JoinCondition[Bicycle, Person]{ - Conditions: conditions, - T1Field: "owner_name", - T2Field: "name", - } -} -func BicycleOwnerNameCondition(v string) badorm.WhereCondition[Bicycle] { - return badorm.WhereCondition[Bicycle]{ - Field: "owner_name", - Value: v, - } -} diff --git a/testintegration/city_conditions.go b/testintegration/city_conditions.go deleted file mode 100644 index 4f460843..00000000 --- a/testintegration/city_conditions.go +++ /dev/null @@ -1,39 +0,0 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. -package testintegration - -import ( - badorm "github.com/ditrit/badaas/badorm" - uuid "github.com/google/uuid" - "time" -) - -func CityIdCondition(v uuid.UUID) badorm.WhereCondition[City] { - return badorm.WhereCondition[City]{ - Field: "id", - Value: v, - } -} -func CityCreatedAtCondition(v time.Time) badorm.WhereCondition[City] { - return badorm.WhereCondition[City]{ - Field: "created_at", - Value: v, - } -} -func CityUpdatedAtCondition(v time.Time) badorm.WhereCondition[City] { - return badorm.WhereCondition[City]{ - Field: "updated_at", - Value: v, - } -} -func CityNameCondition(v string) badorm.WhereCondition[City] { - return badorm.WhereCondition[City]{ - Field: "name", - Value: v, - } -} -func CityCountryIdCondition(v uuid.UUID) badorm.WhereCondition[City] { - return badorm.WhereCondition[City]{ - Field: "country_id", - Value: v, - } -} diff --git a/testintegration/company_conditions.go b/testintegration/company_conditions.go deleted file mode 100644 index b2223cd5..00000000 --- a/testintegration/company_conditions.go +++ /dev/null @@ -1,40 +0,0 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. -package testintegration - -import ( - badorm "github.com/ditrit/badaas/badorm" - uuid "github.com/google/uuid" - "time" -) - -func CompanyIdCondition(v uuid.UUID) badorm.WhereCondition[Company] { - return badorm.WhereCondition[Company]{ - Field: "id", - Value: v, - } -} -func CompanyCreatedAtCondition(v time.Time) badorm.WhereCondition[Company] { - return badorm.WhereCondition[Company]{ - Field: "created_at", - Value: v, - } -} -func CompanyUpdatedAtCondition(v time.Time) badorm.WhereCondition[Company] { - return badorm.WhereCondition[Company]{ - Field: "updated_at", - Value: v, - } -} -func CompanyNameCondition(v string) badorm.WhereCondition[Company] { - return badorm.WhereCondition[Company]{ - Field: "name", - Value: v, - } -} -func SellerCompanyCondition(conditions ...badorm.Condition[Company]) badorm.Condition[Seller] { - return badorm.JoinCondition[Seller, Company]{ - Conditions: conditions, - T1Field: "company_id", - T2Field: "id", - } -} diff --git a/testintegration/conditions.go b/testintegration/conditions.go deleted file mode 100644 index b1bf0da5..00000000 --- a/testintegration/conditions.go +++ /dev/null @@ -1,4 +0,0 @@ -package testintegration - -// TODO sacar el local -//go:generate ../tools/badctl/badctl gen conditions . diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go new file mode 100644 index 00000000..345998fc --- /dev/null +++ b/testintegration/conditions/bicycle_conditions.go @@ -0,0 +1,47 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + uuid "github.com/google/uuid" + "time" +) + +func BicycleId(v uuid.UUID) badorm.WhereCondition[models.Bicycle] { + return badorm.WhereCondition[models.Bicycle]{ + Field: "id", + Value: v, + } +} +func BicycleCreatedAt(v time.Time) badorm.WhereCondition[models.Bicycle] { + return badorm.WhereCondition[models.Bicycle]{ + Field: "created_at", + Value: v, + } +} +func BicycleUpdatedAt(v time.Time) badorm.WhereCondition[models.Bicycle] { + return badorm.WhereCondition[models.Bicycle]{ + Field: "updated_at", + Value: v, + } +} +func BicycleName(v string) badorm.WhereCondition[models.Bicycle] { + return badorm.WhereCondition[models.Bicycle]{ + Field: "name", + Value: v, + } +} +func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Condition[models.Bicycle] { + return badorm.JoinCondition[models.Bicycle, models.Person]{ + Conditions: conditions, + T1Field: "owner_name", + T2Field: "name", + } +} +func BicycleOwnerName(v string) badorm.WhereCondition[models.Bicycle] { + return badorm.WhereCondition[models.Bicycle]{ + Field: "owner_name", + Value: v, + } +} diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go new file mode 100644 index 00000000..eb95eb80 --- /dev/null +++ b/testintegration/conditions/city_conditions.go @@ -0,0 +1,40 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + uuid "github.com/google/uuid" + "time" +) + +func CityId(v uuid.UUID) badorm.WhereCondition[models.City] { + return badorm.WhereCondition[models.City]{ + Field: "id", + Value: v, + } +} +func CityCreatedAt(v time.Time) badorm.WhereCondition[models.City] { + return badorm.WhereCondition[models.City]{ + Field: "created_at", + Value: v, + } +} +func CityUpdatedAt(v time.Time) badorm.WhereCondition[models.City] { + return badorm.WhereCondition[models.City]{ + Field: "updated_at", + Value: v, + } +} +func CityName(v string) badorm.WhereCondition[models.City] { + return badorm.WhereCondition[models.City]{ + Field: "name", + Value: v, + } +} +func CityCountryId(v uuid.UUID) badorm.WhereCondition[models.City] { + return badorm.WhereCondition[models.City]{ + Field: "country_id", + Value: v, + } +} diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go new file mode 100644 index 00000000..7c63c897 --- /dev/null +++ b/testintegration/conditions/company_conditions.go @@ -0,0 +1,41 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + uuid "github.com/google/uuid" + "time" +) + +func CompanyId(v uuid.UUID) badorm.WhereCondition[models.Company] { + return badorm.WhereCondition[models.Company]{ + Field: "id", + Value: v, + } +} +func CompanyCreatedAt(v time.Time) badorm.WhereCondition[models.Company] { + return badorm.WhereCondition[models.Company]{ + Field: "created_at", + Value: v, + } +} +func CompanyUpdatedAt(v time.Time) badorm.WhereCondition[models.Company] { + return badorm.WhereCondition[models.Company]{ + Field: "updated_at", + Value: v, + } +} +func CompanyName(v string) badorm.WhereCondition[models.Company] { + return badorm.WhereCondition[models.Company]{ + Field: "name", + Value: v, + } +} +func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { + return badorm.JoinCondition[models.Seller, models.Company]{ + Conditions: conditions, + T1Field: "company_id", + T2Field: "id", + } +} diff --git a/testintegration/conditions/conditions.go b/testintegration/conditions/conditions.go new file mode 100644 index 00000000..ec41174c --- /dev/null +++ b/testintegration/conditions/conditions.go @@ -0,0 +1,4 @@ +package conditions + +// TODO sacar el local +//go:generate ../../tools/badctl/badctl gen conditions ../models diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go new file mode 100644 index 00000000..cdb46daf --- /dev/null +++ b/testintegration/conditions/country_conditions.go @@ -0,0 +1,48 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + uuid "github.com/google/uuid" + "time" +) + +func CountryId(v uuid.UUID) badorm.WhereCondition[models.Country] { + return badorm.WhereCondition[models.Country]{ + Field: "id", + Value: v, + } +} +func CountryCreatedAt(v time.Time) badorm.WhereCondition[models.Country] { + return badorm.WhereCondition[models.Country]{ + Field: "created_at", + Value: v, + } +} +func CountryUpdatedAt(v time.Time) badorm.WhereCondition[models.Country] { + return badorm.WhereCondition[models.Country]{ + Field: "updated_at", + Value: v, + } +} +func CountryName(v string) badorm.WhereCondition[models.Country] { + return badorm.WhereCondition[models.Country]{ + Field: "name", + Value: v, + } +} +func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.Condition[models.Country] { + return badorm.JoinCondition[models.Country, models.City]{ + Conditions: conditions, + T1Field: "id", + T2Field: "country_id", + } +} +func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.Condition[models.City] { + return badorm.JoinCondition[models.City, models.Country]{ + Conditions: conditions, + T1Field: "country_id", + T2Field: "id", + } +} diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go new file mode 100644 index 00000000..88a0a6fa --- /dev/null +++ b/testintegration/conditions/employee_conditions.go @@ -0,0 +1,47 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + uuid "github.com/google/uuid" + "time" +) + +func EmployeeId(v uuid.UUID) badorm.WhereCondition[models.Employee] { + return badorm.WhereCondition[models.Employee]{ + Field: "id", + Value: v, + } +} +func EmployeeCreatedAt(v time.Time) badorm.WhereCondition[models.Employee] { + return badorm.WhereCondition[models.Employee]{ + Field: "created_at", + Value: v, + } +} +func EmployeeUpdatedAt(v time.Time) badorm.WhereCondition[models.Employee] { + return badorm.WhereCondition[models.Employee]{ + Field: "updated_at", + Value: v, + } +} +func EmployeeName(v string) badorm.WhereCondition[models.Employee] { + return badorm.WhereCondition[models.Employee]{ + Field: "name", + Value: v, + } +} +func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condition[models.Employee] { + return badorm.JoinCondition[models.Employee, models.Employee]{ + Conditions: conditions, + T1Field: "boss_id", + T2Field: "id", + } +} +func EmployeeBossId(v *uuid.UUID) badorm.WhereCondition[models.Employee] { + return badorm.WhereCondition[models.Employee]{ + Field: "boss_id", + Value: v, + } +} diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go new file mode 100644 index 00000000..904d44a4 --- /dev/null +++ b/testintegration/conditions/person_conditions.go @@ -0,0 +1,34 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + uuid "github.com/google/uuid" + "time" +) + +func PersonId(v uuid.UUID) badorm.WhereCondition[models.Person] { + return badorm.WhereCondition[models.Person]{ + Field: "id", + Value: v, + } +} +func PersonCreatedAt(v time.Time) badorm.WhereCondition[models.Person] { + return badorm.WhereCondition[models.Person]{ + Field: "created_at", + Value: v, + } +} +func PersonUpdatedAt(v time.Time) badorm.WhereCondition[models.Person] { + return badorm.WhereCondition[models.Person]{ + Field: "updated_at", + Value: v, + } +} +func PersonName(v string) badorm.WhereCondition[models.Person] { + return badorm.WhereCondition[models.Person]{ + Field: "name", + Value: v, + } +} diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go new file mode 100644 index 00000000..fde73fd7 --- /dev/null +++ b/testintegration/conditions/product_conditions.go @@ -0,0 +1,89 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + uuid "github.com/google/uuid" + pq "github.com/lib/pq" + "time" +) + +func ProductId(v uuid.UUID) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "id", + Value: v, + } +} +func ProductCreatedAt(v time.Time) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "created_at", + Value: v, + } +} +func ProductUpdatedAt(v time.Time) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "updated_at", + Value: v, + } +} +func ProductString(v string) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "string_something_else", + Value: v, + } +} +func ProductInt(v int) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "int", + Value: v, + } +} +func ProductIntPointer(v *int) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "int_pointer", + Value: v, + } +} +func ProductFloat(v float64) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "float", + Value: v, + } +} +func ProductBool(v bool) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "bool", + Value: v, + } +} +func ProductByteArray(v []uint8) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "byte_array", + Value: v, + } +} +func ProductMultiString(v models.MultiString) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "multi_string", + Value: v, + } +} +func ProductStringArray(v pq.StringArray) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "string_array", + Value: v, + } +} +func ProductEmbeddedInt(v int) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "embedded_int", + Value: v, + } +} +func ProductGormEmbeddedInt(v int) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "gorm_embedded_int", + Value: v, + } +} diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go new file mode 100644 index 00000000..e7852b02 --- /dev/null +++ b/testintegration/conditions/sale_conditions.go @@ -0,0 +1,66 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + uuid "github.com/google/uuid" + "time" +) + +func SaleId(v uuid.UUID) badorm.WhereCondition[models.Sale] { + return badorm.WhereCondition[models.Sale]{ + Field: "id", + Value: v, + } +} +func SaleCreatedAt(v time.Time) badorm.WhereCondition[models.Sale] { + return badorm.WhereCondition[models.Sale]{ + Field: "created_at", + Value: v, + } +} +func SaleUpdatedAt(v time.Time) badorm.WhereCondition[models.Sale] { + return badorm.WhereCondition[models.Sale]{ + Field: "updated_at", + Value: v, + } +} +func SaleCode(v int) badorm.WhereCondition[models.Sale] { + return badorm.WhereCondition[models.Sale]{ + Field: "code", + Value: v, + } +} +func SaleDescription(v string) badorm.WhereCondition[models.Sale] { + return badorm.WhereCondition[models.Sale]{ + Field: "description", + Value: v, + } +} +func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Condition[models.Sale] { + return badorm.JoinCondition[models.Sale, models.Product]{ + Conditions: conditions, + T1Field: "product_id", + T2Field: "id", + } +} +func SaleProductId(v uuid.UUID) badorm.WhereCondition[models.Sale] { + return badorm.WhereCondition[models.Sale]{ + Field: "product_id", + Value: v, + } +} +func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[models.Sale] { + return badorm.JoinCondition[models.Sale, models.Seller]{ + Conditions: conditions, + T1Field: "seller_id", + T2Field: "id", + } +} +func SaleSellerId(v *uuid.UUID) badorm.WhereCondition[models.Sale] { + return badorm.WhereCondition[models.Sale]{ + Field: "seller_id", + Value: v, + } +} diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go new file mode 100644 index 00000000..93b59fee --- /dev/null +++ b/testintegration/conditions/seller_conditions.go @@ -0,0 +1,40 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + uuid "github.com/google/uuid" + "time" +) + +func SellerId(v uuid.UUID) badorm.WhereCondition[models.Seller] { + return badorm.WhereCondition[models.Seller]{ + Field: "id", + Value: v, + } +} +func SellerCreatedAt(v time.Time) badorm.WhereCondition[models.Seller] { + return badorm.WhereCondition[models.Seller]{ + Field: "created_at", + Value: v, + } +} +func SellerUpdatedAt(v time.Time) badorm.WhereCondition[models.Seller] { + return badorm.WhereCondition[models.Seller]{ + Field: "updated_at", + Value: v, + } +} +func SellerName(v string) badorm.WhereCondition[models.Seller] { + return badorm.WhereCondition[models.Seller]{ + Field: "name", + Value: v, + } +} +func SellerCompanyId(v *uuid.UUID) badorm.WhereCondition[models.Seller] { + return badorm.WhereCondition[models.Seller]{ + Field: "company_id", + Value: v, + } +} diff --git a/testintegration/country_conditions.go b/testintegration/country_conditions.go deleted file mode 100644 index 2458f995..00000000 --- a/testintegration/country_conditions.go +++ /dev/null @@ -1,47 +0,0 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. -package testintegration - -import ( - badorm "github.com/ditrit/badaas/badorm" - uuid "github.com/google/uuid" - "time" -) - -func CountryIdCondition(v uuid.UUID) badorm.WhereCondition[Country] { - return badorm.WhereCondition[Country]{ - Field: "id", - Value: v, - } -} -func CountryCreatedAtCondition(v time.Time) badorm.WhereCondition[Country] { - return badorm.WhereCondition[Country]{ - Field: "created_at", - Value: v, - } -} -func CountryUpdatedAtCondition(v time.Time) badorm.WhereCondition[Country] { - return badorm.WhereCondition[Country]{ - Field: "updated_at", - Value: v, - } -} -func CountryNameCondition(v string) badorm.WhereCondition[Country] { - return badorm.WhereCondition[Country]{ - Field: "name", - Value: v, - } -} -func CountryCapitalCondition(conditions ...badorm.Condition[City]) badorm.Condition[Country] { - return badorm.JoinCondition[Country, City]{ - Conditions: conditions, - T1Field: "id", - T2Field: "country_id", - } -} -func CityCountryCondition(conditions ...badorm.Condition[Country]) badorm.Condition[City] { - return badorm.JoinCondition[City, Country]{ - Conditions: conditions, - T1Field: "country_id", - T2Field: "id", - } -} diff --git a/testintegration/crudRepository.go b/testintegration/crudRepository.go index 2a3791e3..df80ff16 100644 --- a/testintegration/crudRepository.go +++ b/testintegration/crudRepository.go @@ -2,6 +2,8 @@ package testintegration import ( "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/testintegration/conditions" + "github.com/ditrit/badaas/testintegration/models" "github.com/google/uuid" "github.com/stretchr/testify/suite" "go.uber.org/zap" @@ -13,13 +15,13 @@ type CRUDRepositoryIntTestSuite struct { suite.Suite logger *zap.Logger db *gorm.DB - crudProductRepository badorm.CRUDRepository[Product, uuid.UUID] + crudProductRepository badorm.CRUDRepository[models.Product, uuid.UUID] } func NewCRUDRepositoryIntTestSuite( logger *zap.Logger, db *gorm.DB, - crudProductRepository badorm.CRUDRepository[Product, uuid.UUID], + crudProductRepository badorm.CRUDRepository[models.Product, uuid.UUID], ) *CRUDRepositoryIntTestSuite { return &CRUDRepositoryIntTestSuite{ logger: logger, @@ -53,13 +55,13 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetByIDReturnsEntityIfIDMatch() { func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsErrorIfConditionsDontMatch() { ts.createProduct(0) - _, err := ts.crudProductRepository.Get(ts.db, ProductIntCondition(1)) + _, err := ts.crudProductRepository.Get(ts.db, conditions.ProductInt(1)) ts.Error(err, gorm.ErrRecordNotFound) } func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsEntityIfConditionsMatch() { product := ts.createProduct(1) - productReturned, err := ts.crudProductRepository.Get(ts.db, ProductIntCondition(1)) + productReturned, err := ts.crudProductRepository.Get(ts.db, conditions.ProductInt(1)) ts.Nil(err) assert.DeepEqual(ts.T(), product, productReturned) @@ -69,14 +71,14 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsEntityIfConditionsMatch() { func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsNilIfConditionsDontMatch() { ts.createProduct(0) - productReturned, err := ts.crudProductRepository.GetOptional(ts.db, ProductIntCondition(1)) + productReturned, err := ts.crudProductRepository.GetOptional(ts.db, conditions.ProductInt(1)) ts.Nil(err) ts.Nil(productReturned) } func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsEntityIfConditionsMatch() { product := ts.createProduct(0) - productReturned, err := ts.crudProductRepository.GetOptional(ts.db, ProductIntCondition(0)) + productReturned, err := ts.crudProductRepository.GetOptional(ts.db, conditions.ProductInt(0)) ts.Nil(err) assert.DeepEqual(ts.T(), product, productReturned) @@ -85,7 +87,7 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsEntityIfConditionsMa func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsErrorIfMoreThanOneMatchConditions() { ts.createProduct(0) ts.createProduct(0) - _, err := ts.crudProductRepository.GetOptional(ts.db, ProductIntCondition(0)) + _, err := ts.crudProductRepository.GetOptional(ts.db, conditions.ProductInt(0)) ts.Error(err, badorm.ErrMoreThanOneObjectFound) } @@ -94,7 +96,7 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsErrorIfMoreThanOneMa func (ts *CRUDRepositoryIntTestSuite) TestGetAllReturnsEmptyIfNotEntitiesCreated() { productsReturned, err := ts.crudProductRepository.GetAll(ts.db) ts.Nil(err) - EqualList(&ts.Suite, []*Product{}, productsReturned) + EqualList(&ts.Suite, []*models.Product{}, productsReturned) } func (ts *CRUDRepositoryIntTestSuite) TestGetAllReturnsAllEntityIfConditionsMatch() { @@ -102,13 +104,13 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetAllReturnsAllEntityIfConditionsMatc product2 := ts.createProduct(0) productsReturned, err := ts.crudProductRepository.GetAll(ts.db) ts.Nil(err) - EqualList(&ts.Suite, []*Product{product1, product2}, productsReturned) + EqualList(&ts.Suite, []*models.Product{product1, product2}, productsReturned) } // ------------------------- utils ------------------------- -func (ts *CRUDRepositoryIntTestSuite) createProduct(intV int) *Product { - entity := &Product{ +func (ts *CRUDRepositoryIntTestSuite) createProduct(intV int) *models.Product { + entity := &models.Product{ Int: intV, } err := ts.db.Create(entity).Error diff --git a/testintegration/crudService.go b/testintegration/crudService.go index d3bb576c..418c144f 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -2,6 +2,8 @@ package testintegration import ( "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/testintegration/conditions" + "github.com/ditrit/badaas/testintegration/models" "github.com/google/uuid" "github.com/lib/pq" "github.com/stretchr/testify/suite" @@ -14,25 +16,25 @@ type CRUDServiceIntTestSuite struct { suite.Suite logger *zap.Logger db *gorm.DB - crudProductService badorm.CRUDService[Product, uuid.UUID] - crudSaleService badorm.CRUDService[Sale, uuid.UUID] - crudSellerService badorm.CRUDService[Seller, uuid.UUID] - crudCountryService badorm.CRUDService[Country, uuid.UUID] - crudCityService badorm.CRUDService[City, uuid.UUID] - crudEmployeeService badorm.CRUDService[Employee, uuid.UUID] - crudBicycleService badorm.CRUDService[Bicycle, uuid.UUID] + crudProductService badorm.CRUDService[models.Product, uuid.UUID] + crudSaleService badorm.CRUDService[models.Sale, uuid.UUID] + crudSellerService badorm.CRUDService[models.Seller, uuid.UUID] + crudCountryService badorm.CRUDService[models.Country, uuid.UUID] + crudCityService badorm.CRUDService[models.City, uuid.UUID] + crudEmployeeService badorm.CRUDService[models.Employee, uuid.UUID] + crudBicycleService badorm.CRUDService[models.Bicycle, uuid.UUID] } func NewCRUDServiceIntTestSuite( logger *zap.Logger, db *gorm.DB, - crudProductService badorm.CRUDService[Product, uuid.UUID], - crudSaleService badorm.CRUDService[Sale, uuid.UUID], - crudSellerService badorm.CRUDService[Seller, uuid.UUID], - crudCountryService badorm.CRUDService[Country, uuid.UUID], - crudCityService badorm.CRUDService[City, uuid.UUID], - crudEmployeeService badorm.CRUDService[Employee, uuid.UUID], - crudBicycleService badorm.CRUDService[Bicycle, uuid.UUID], + crudProductService badorm.CRUDService[models.Product, uuid.UUID], + crudSaleService badorm.CRUDService[models.Sale, uuid.UUID], + crudSellerService badorm.CRUDService[models.Seller, uuid.UUID], + crudCountryService badorm.CRUDService[models.Country, uuid.UUID], + crudCityService badorm.CRUDService[models.City, uuid.UUID], + crudEmployeeService badorm.CRUDService[models.Employee, uuid.UUID], + crudBicycleService badorm.CRUDService[models.Bicycle, uuid.UUID], ) *CRUDServiceIntTestSuite { return &CRUDServiceIntTestSuite{ logger: logger, @@ -80,7 +82,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyI entities, err := ts.crudProductService.GetEntities() ts.Nil(err) - EqualList(&ts.Suite, []*Product{}, entities) + EqualList(&ts.Suite, []*models.Product{}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { @@ -89,7 +91,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnl entities, err := ts.crudProductService.GetEntities() ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { @@ -100,27 +102,27 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheLis entities, err := ts.crudProductService.GetEntities() ts.Nil(err) - EqualList(&ts.Suite, []*Product{match1, match2, match3}, entities) + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { entities, err := ts.crudProductService.GetEntities( - ProductStringCondition("not_created"), + conditions.ProductString("not_created"), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{}, entities) + EqualList(&ts.Suite, []*models.Product{}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { ts.createProduct("something_else", 0, 0, false, nil) entities, err := ts.crudProductService.GetEntities( - ProductStringCondition("not_match"), + conditions.ProductString("not_match"), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{}, entities) + EqualList(&ts.Suite, []*models.Product{}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { @@ -128,11 +130,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnly ts.createProduct("not_match", 0, 0, false, nil) entities, err := ts.crudProductService.GetEntities( - ProductStringCondition("match"), + conditions.ProductString("match"), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { @@ -141,11 +143,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleI ts.createProduct("not_match", 0, 0, false, nil) entities, err := ts.crudProductService.GetEntities( - ProductStringCondition("match"), + conditions.ProductString("match"), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match1, match2}, entities) + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { @@ -153,11 +155,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { ts.createProduct("not_match", 2, 0, false, nil) entities, err := ts.crudProductService.GetEntities( - ProductIntCondition(1), + conditions.ProductInt(1), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { @@ -165,11 +167,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { ts.createProduct("not_match", 0, 2.2, false, nil) entities, err := ts.crudProductService.GetEntities( - ProductFloatCondition(1.1), + conditions.ProductFloat(1.1), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { @@ -177,11 +179,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { ts.createProduct("not_match", 0, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( - ProductBoolCondition(true), + conditions.ProductBool(true), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { @@ -192,13 +194,13 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDiffer ts.createProduct("match", 2, 0.0, true, nil) entities, err := ts.crudProductService.GetEntities( - ProductStringCondition("match"), - ProductIntCondition(1), - ProductBoolCondition(true), + conditions.ProductString("match"), + conditions.ProductInt(1), + conditions.ProductBool(true), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match1, match2}, entities) + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfID() { @@ -206,11 +208,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfID() { ts.createProduct("", 0, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( - ProductIdCondition(match.ID), + conditions.ProductId(match.ID), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { @@ -218,11 +220,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { ts.createProduct("", 0, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( - ProductCreatedAtCondition(match.CreatedAt), + conditions.ProductCreatedAt(match.CreatedAt), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { @@ -234,11 +236,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { ts.Nil(err) entities, err := ts.crudProductService.GetEntities( - ProductEmbeddedIntCondition(1), + conditions.ProductEmbeddedInt(1), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfGormEmbedded() { @@ -250,11 +252,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfGormEmbedded() ts.Nil(err) entities, err := ts.crudProductService.GetEntities( - ProductGormEmbeddedIntCondition(1), + conditions.ProductGormEmbeddedInt(1), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWithValue() { @@ -265,11 +267,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWith ts.createProduct("not_match", 2, 0, false, nil) entities, err := ts.crudProductService.GetEntities( - ProductIntPointerCondition(&intMatch), + conditions.ProductIntPointer(&intMatch), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeByNil() { @@ -278,11 +280,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeByNi ts.createProduct("not_match", 2, 0, false, &intNotMatch) entities, err := ts.crudProductService.GetEntities( - ProductIntPointerCondition(nil), + conditions.ProductIntPointer(nil), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayWithContent() { @@ -299,11 +301,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayWithCo ts.Nil(err) entities, err := ts.crudProductService.GetEntities( - ProductByteArrayCondition([]byte{1, 2}), + conditions.ProductByteArray([]byte{1, 2}), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayEmpty() { @@ -320,11 +322,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayEmpty( ts.Nil(err) entities, err := ts.crudProductService.GetEntities( - ProductByteArrayCondition([]byte{}), + conditions.ProductByteArray([]byte{}), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() { @@ -336,11 +338,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() ts.Nil(err) entities, err := ts.crudProductService.GetEntities( - ProductByteArrayCondition(nil), + conditions.ProductByteArray(nil), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPQArray() { @@ -357,19 +359,19 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPQArray() { ts.Nil(err) entities, err := ts.crudProductService.GetEntities( - ProductStringArrayCondition(pq.StringArray{"salut", "hola"}), + conditions.ProductStringArray(pq.StringArray{"salut", "hola"}), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { match := ts.createProduct("match", 1, 0, false, nil) notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - match.MultiString = MultiString{"salut", "hola"} - notMatch1.MultiString = MultiString{"salut", "hola", "hello"} + match.MultiString = models.MultiString{"salut", "hola"} + notMatch1.MultiString = models.MultiString{"salut", "hola", "hello"} err := ts.db.Save(match).Error ts.Nil(err) @@ -378,11 +380,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { ts.Nil(err) entities, err := ts.crudProductService.GetEntities( - ProductMultiStringCondition(MultiString{"salut", "hola"}), + conditions.ProductMultiString(models.MultiString{"salut", "hola"}), ) ts.Nil(err) - EqualList(&ts.Suite, []*Product{match}, entities) + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { @@ -396,11 +398,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() ts.createSale(0, product2, seller2) entities, err := ts.crudSaleService.GetEntities( - SaleProductIdCondition(product1.ID), + conditions.SaleProductId(product1.ID), ) ts.Nil(err) - EqualList(&ts.Suite, []*Sale{match}, entities) + EqualList(&ts.Suite, []*models.Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalWithValue() { @@ -414,11 +416,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOpt ts.createSale(0, product2, seller2) entities, err := ts.crudSaleService.GetEntities( - SaleSellerIdCondition(&seller1.ID), + conditions.SaleSellerId(&seller1.ID), ) ts.Nil(err) - EqualList(&ts.Suite, []*Sale{match}, entities) + EqualList(&ts.Suite, []*models.Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalByNil() { @@ -431,11 +433,11 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOpt ts.createSale(0, product2, seller2) entities, err := ts.crudSaleService.GetEntities( - SaleSellerIdCondition(nil), + conditions.SaleSellerId(nil), ) ts.Nil(err) - EqualList(&ts.Suite, []*Sale{match}, entities) + EqualList(&ts.Suite, []*models.Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { @@ -446,13 +448,13 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsT ts.createSale(0, product2, nil) entities, err := ts.crudSaleService.GetEntities( - SaleProductCondition( - ProductIntCondition(1), + conditions.SaleProduct( + conditions.ProductInt(1), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Sale{match}, entities) + EqualList(&ts.Suite, []*models.Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { @@ -467,14 +469,14 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFilte ts.createSale(2, product1, seller2) entities, err := ts.crudSaleService.GetEntities( - SaleCodeCondition(1), - SaleProductCondition( - ProductIntCondition(1), + conditions.SaleCode(1), + conditions.SaleProduct( + conditions.ProductInt(1), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Sale{match}, entities) + EqualList(&ts.Suite, []*models.Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { @@ -488,20 +490,20 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOp ts.createSale(0, product2, seller2) entities, err := ts.crudSaleService.GetEntities( - SaleSellerCondition( - SellerNameCondition("franco"), + conditions.SaleSeller( + conditions.SellerName("franco"), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Sale{match}, entities) + EqualList(&ts.Suite, []*models.Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { - boss1 := &Employee{ + boss1 := &models.Employee{ Name: "Xavier", } - boss2 := &Employee{ + boss2 := &models.Employee{ Name: "Vincent", } @@ -509,20 +511,20 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSe ts.createEmployee("pierre", boss2) entities, err := ts.crudEmployeeService.GetEntities( - EmployeeBossCondition( - EmployeeNameCondition("Xavier"), + conditions.EmployeeBoss( + conditions.EmployeeName("Xavier"), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Employee{match}, entities) + EqualList(&ts.Suite, []*models.Employee{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { - capital1 := City{ + capital1 := models.City{ Name: "Buenos Aires", } - capital2 := City{ + capital2 := models.City{ Name: "Paris", } @@ -530,20 +532,20 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne ts.createCountry("France", capital2) entities, err := ts.crudCityService.GetEntities( - CityCountryCondition( - CountryNameCondition("Argentina"), + conditions.CityCountry( + conditions.CountryName("Argentina"), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*City{&capital1}, entities) + EqualList(&ts.Suite, []*models.City{&capital1}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { - capital1 := City{ + capital1 := models.City{ Name: "Buenos Aires", } - capital2 := City{ + capital2 := models.City{ Name: "Paris", } @@ -551,20 +553,20 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne ts.createCountry("France", capital2) entities, err := ts.crudCountryService.GetEntities( - CountryCapitalCondition( - CityNameCondition("Buenos Aires"), + conditions.CountryCapital( + conditions.CityName("Buenos Aires"), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Country{country1}, entities) + EqualList(&ts.Suite, []*models.Country{country1}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { - person1 := Person{ + person1 := models.Person{ Name: "franco", } - person2 := Person{ + person2 := models.Person{ Name: "xavier", } @@ -572,13 +574,13 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEnti ts.createBicycle("Shimano", person2) entities, err := ts.crudBicycleService.GetEntities( - BicycleOwnerCondition( - PersonNameCondition("franco"), + conditions.BicycleOwner( + conditions.PersonName("franco"), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Bicycle{match}, entities) + EqualList(&ts.Suite, []*models.Bicycle{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { @@ -589,13 +591,13 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMan ts.createSeller("agustin", company2) entities, err := ts.crudSellerService.GetEntities( - SellerCompanyCondition( - CompanyNameCondition("ditrit"), + conditions.SellerCompany( + conditions.CompanyName("ditrit"), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Seller{match}, entities) + EqualList(&ts.Suite, []*models.Seller{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { @@ -609,14 +611,14 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffer ts.createSale(0, product2, seller2) entities, err := ts.crudSaleService.GetEntities( - SaleProductCondition( - ProductIntCondition(1), - ProductStringCondition("match"), + conditions.SaleProduct( + conditions.ProductInt(1), + conditions.ProductString("match"), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Sale{match}, entities) + EqualList(&ts.Suite, []*models.Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersByNil() { @@ -628,13 +630,13 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFilte ts.createSale(0, product2, nil) entities, err := ts.crudSaleService.GetEntities( - SaleProductCondition( - ProductIntPointerCondition(nil), + conditions.SaleProduct( + conditions.ProductIntPointer(nil), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Sale{match}, entities) + EqualList(&ts.Suite, []*models.Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { @@ -650,16 +652,16 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferen ts.createSale(0, product2, seller1) entities, err := ts.crudSaleService.GetEntities( - SaleProductCondition( - ProductIntCondition(1), + conditions.SaleProduct( + conditions.ProductInt(1), ), - SaleSellerCondition( - SellerNameCondition("franco"), + conditions.SaleSeller( + conditions.SellerName("franco"), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Sale{match}, entities) + EqualList(&ts.Suite, []*models.Sale{match}, entities) } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { @@ -676,22 +678,22 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultiple ts.createSale(0, product2, seller2) entities, err := ts.crudSaleService.GetEntities( - SaleSellerCondition( - SellerNameCondition("franco"), - SellerCompanyCondition( - CompanyNameCondition("ditrit"), + conditions.SaleSeller( + conditions.SellerName("franco"), + conditions.SellerCompany( + conditions.CompanyName("ditrit"), ), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*Sale{match}, entities) + EqualList(&ts.Suite, []*models.Sale{match}, entities) } // ------------------------- utils ------------------------- -func (ts *CRUDServiceIntTestSuite) createProduct(stringV string, intV int, floatV float64, boolV bool, intP *int) *Product { - entity := &Product{ +func (ts *CRUDServiceIntTestSuite) createProduct(stringV string, intV int, floatV float64, boolV bool, intP *int) *models.Product { + entity := &models.Product{ String: stringV, Int: intV, Float: floatV, @@ -704,8 +706,8 @@ func (ts *CRUDServiceIntTestSuite) createProduct(stringV string, intV int, float return entity } -func (ts *CRUDServiceIntTestSuite) createSale(code int, product *Product, seller *Seller) *Sale { - entity := &Sale{ +func (ts *CRUDServiceIntTestSuite) createSale(code int, product *models.Product, seller *models.Seller) *models.Sale { + entity := &models.Sale{ Code: code, Product: *product, Seller: seller, @@ -716,12 +718,12 @@ func (ts *CRUDServiceIntTestSuite) createSale(code int, product *Product, seller return entity } -func (ts *CRUDServiceIntTestSuite) createSeller(name string, company *Company) *Seller { +func (ts *CRUDServiceIntTestSuite) createSeller(name string, company *models.Company) *models.Seller { var companyID *uuid.UUID if company != nil { companyID = &company.ID } - entity := &Seller{ + entity := &models.Seller{ Name: name, CompanyID: companyID, } @@ -731,8 +733,8 @@ func (ts *CRUDServiceIntTestSuite) createSeller(name string, company *Company) * return entity } -func (ts *CRUDServiceIntTestSuite) createCompany(name string) *Company { - entity := &Company{ +func (ts *CRUDServiceIntTestSuite) createCompany(name string) *models.Company { + entity := &models.Company{ Name: name, } err := ts.db.Create(entity).Error @@ -741,8 +743,8 @@ func (ts *CRUDServiceIntTestSuite) createCompany(name string) *Company { return entity } -func (ts *CRUDServiceIntTestSuite) createCountry(name string, capital City) *Country { - entity := &Country{ +func (ts *CRUDServiceIntTestSuite) createCountry(name string, capital models.City) *models.Country { + entity := &models.Country{ Name: name, Capital: capital, } @@ -752,8 +754,8 @@ func (ts *CRUDServiceIntTestSuite) createCountry(name string, capital City) *Cou return entity } -func (ts *CRUDServiceIntTestSuite) createEmployee(name string, boss *Employee) *Employee { - entity := &Employee{ +func (ts *CRUDServiceIntTestSuite) createEmployee(name string, boss *models.Employee) *models.Employee { + entity := &models.Employee{ Name: name, Boss: boss, } @@ -763,8 +765,8 @@ func (ts *CRUDServiceIntTestSuite) createEmployee(name string, boss *Employee) * return entity } -func (ts *CRUDServiceIntTestSuite) createBicycle(name string, owner Person) *Bicycle { - entity := &Bicycle{ +func (ts *CRUDServiceIntTestSuite) createBicycle(name string, owner models.Person) *models.Bicycle { + entity := &models.Bicycle{ Name: name, Owner: owner, } diff --git a/testintegration/db_models.go b/testintegration/db_models.go index 1743fdec..f9af2cf0 100644 --- a/testintegration/db_models.go +++ b/testintegration/db_models.go @@ -4,21 +4,22 @@ import ( "log" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/models" + badaasModels "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/testintegration/models" "github.com/elliotchance/pie/v2" "gorm.io/gorm" ) var ListOfTables = []any{ - Product{}, - Company{}, - Seller{}, - Sale{}, - Country{}, - City{}, - Employee{}, - Person{}, - Bicycle{}, + models.Product{}, + models.Company{}, + models.Seller{}, + models.Sale{}, + models.Country{}, + models.City{}, + models.Employee{}, + models.Person{}, + models.Bicycle{}, } func GetModels() badorm.GetModelsResult { @@ -31,10 +32,10 @@ func CleanDB(db *gorm.DB) { CleanDBTables(db, append( pie.Reverse(ListOfTables), []any{ - models.Value{}, - models.Attribute{}, - models.Entity{}, - models.EntityType{}, + badaasModels.Value{}, + badaasModels.Attribute{}, + badaasModels.Entity{}, + badaasModels.EntityType{}, }..., )) } diff --git a/testintegration/employee_conditions.go b/testintegration/employee_conditions.go deleted file mode 100644 index d2350c46..00000000 --- a/testintegration/employee_conditions.go +++ /dev/null @@ -1,46 +0,0 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. -package testintegration - -import ( - badorm "github.com/ditrit/badaas/badorm" - uuid "github.com/google/uuid" - "time" -) - -func EmployeeIdCondition(v uuid.UUID) badorm.WhereCondition[Employee] { - return badorm.WhereCondition[Employee]{ - Field: "id", - Value: v, - } -} -func EmployeeCreatedAtCondition(v time.Time) badorm.WhereCondition[Employee] { - return badorm.WhereCondition[Employee]{ - Field: "created_at", - Value: v, - } -} -func EmployeeUpdatedAtCondition(v time.Time) badorm.WhereCondition[Employee] { - return badorm.WhereCondition[Employee]{ - Field: "updated_at", - Value: v, - } -} -func EmployeeNameCondition(v string) badorm.WhereCondition[Employee] { - return badorm.WhereCondition[Employee]{ - Field: "name", - Value: v, - } -} -func EmployeeBossCondition(conditions ...badorm.Condition[Employee]) badorm.Condition[Employee] { - return badorm.JoinCondition[Employee, Employee]{ - Conditions: conditions, - T1Field: "boss_id", - T2Field: "id", - } -} -func EmployeeBossIdCondition(v *uuid.UUID) badorm.WhereCondition[Employee] { - return badorm.WhereCondition[Employee]{ - Field: "boss_id", - Value: v, - } -} diff --git a/testintegration/integration_test.go b/testintegration/integration_test.go index f65f1ec1..83b5475a 100644 --- a/testintegration/integration_test.go +++ b/testintegration/integration_test.go @@ -9,6 +9,7 @@ import ( "github.com/ditrit/badaas" "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/services" + "github.com/ditrit/badaas/testintegration/models" "github.com/ditrit/verdeter" "github.com/google/uuid" "github.com/spf13/cobra" @@ -55,15 +56,15 @@ func injectDependencies(cmd *cobra.Command, args []string) { services.EAVServiceModule, fx.Provide(NewEAVServiceIntTestSuite), - fx.Invoke(badorm.AddModel[Company]), - badorm.GetCRUDServiceModule[Seller, uuid.UUID](), - badorm.GetCRUDServiceModule[Product, uuid.UUID](), - badorm.GetCRUDServiceModule[Sale, uuid.UUID](), - badorm.GetCRUDServiceModule[City, uuid.UUID](), - badorm.GetCRUDServiceModule[Country, uuid.UUID](), - badorm.GetCRUDServiceModule[Employee, uuid.UUID](), - fx.Invoke(badorm.AddModel[Person]), - badorm.GetCRUDServiceModule[Bicycle, uuid.UUID](), + fx.Invoke(badorm.AddModel[models.Company]), + badorm.GetCRUDServiceModule[models.Seller, uuid.UUID](), + badorm.GetCRUDServiceModule[models.Product, uuid.UUID](), + badorm.GetCRUDServiceModule[models.Sale, uuid.UUID](), + badorm.GetCRUDServiceModule[models.City, uuid.UUID](), + badorm.GetCRUDServiceModule[models.Country, uuid.UUID](), + badorm.GetCRUDServiceModule[models.Employee, uuid.UUID](), + fx.Invoke(badorm.AddModel[models.Person]), + badorm.GetCRUDServiceModule[models.Bicycle, uuid.UUID](), fx.Provide(NewCRUDServiceIntTestSuite), fx.Provide(NewCRUDRepositoryIntTestSuite), diff --git a/testintegration/models.go b/testintegration/models/models.go similarity index 99% rename from testintegration/models.go rename to testintegration/models/models.go index 797a45d7..8c9dc6f5 100644 --- a/testintegration/models.go +++ b/testintegration/models/models.go @@ -1,4 +1,4 @@ -package testintegration +package models import ( "database/sql/driver" diff --git a/testintegration/person_conditions.go b/testintegration/person_conditions.go deleted file mode 100644 index b61c630f..00000000 --- a/testintegration/person_conditions.go +++ /dev/null @@ -1,33 +0,0 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. -package testintegration - -import ( - badorm "github.com/ditrit/badaas/badorm" - uuid "github.com/google/uuid" - "time" -) - -func PersonIdCondition(v uuid.UUID) badorm.WhereCondition[Person] { - return badorm.WhereCondition[Person]{ - Field: "id", - Value: v, - } -} -func PersonCreatedAtCondition(v time.Time) badorm.WhereCondition[Person] { - return badorm.WhereCondition[Person]{ - Field: "created_at", - Value: v, - } -} -func PersonUpdatedAtCondition(v time.Time) badorm.WhereCondition[Person] { - return badorm.WhereCondition[Person]{ - Field: "updated_at", - Value: v, - } -} -func PersonNameCondition(v string) badorm.WhereCondition[Person] { - return badorm.WhereCondition[Person]{ - Field: "name", - Value: v, - } -} diff --git a/testintegration/product_conditions.go b/testintegration/product_conditions.go deleted file mode 100644 index 33b964f2..00000000 --- a/testintegration/product_conditions.go +++ /dev/null @@ -1,88 +0,0 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. -package testintegration - -import ( - badorm "github.com/ditrit/badaas/badorm" - uuid "github.com/google/uuid" - pq "github.com/lib/pq" - "time" -) - -func ProductIdCondition(v uuid.UUID) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "id", - Value: v, - } -} -func ProductCreatedAtCondition(v time.Time) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "created_at", - Value: v, - } -} -func ProductUpdatedAtCondition(v time.Time) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "updated_at", - Value: v, - } -} -func ProductStringCondition(v string) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "string_something_else", - Value: v, - } -} -func ProductIntCondition(v int) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "int", - Value: v, - } -} -func ProductIntPointerCondition(v *int) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "int_pointer", - Value: v, - } -} -func ProductFloatCondition(v float64) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "float", - Value: v, - } -} -func ProductBoolCondition(v bool) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "bool", - Value: v, - } -} -func ProductByteArrayCondition(v []uint8) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "byte_array", - Value: v, - } -} -func ProductMultiStringCondition(v MultiString) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "multi_string", - Value: v, - } -} -func ProductStringArrayCondition(v pq.StringArray) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "string_array", - Value: v, - } -} -func ProductEmbeddedIntCondition(v int) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "embedded_int", - Value: v, - } -} -func ProductGormEmbeddedIntCondition(v int) badorm.WhereCondition[Product] { - return badorm.WhereCondition[Product]{ - Field: "gorm_embedded_int", - Value: v, - } -} diff --git a/testintegration/sale_conditions.go b/testintegration/sale_conditions.go deleted file mode 100644 index 54617af5..00000000 --- a/testintegration/sale_conditions.go +++ /dev/null @@ -1,65 +0,0 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. -package testintegration - -import ( - badorm "github.com/ditrit/badaas/badorm" - uuid "github.com/google/uuid" - "time" -) - -func SaleIdCondition(v uuid.UUID) badorm.WhereCondition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "id", - Value: v, - } -} -func SaleCreatedAtCondition(v time.Time) badorm.WhereCondition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "created_at", - Value: v, - } -} -func SaleUpdatedAtCondition(v time.Time) badorm.WhereCondition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "updated_at", - Value: v, - } -} -func SaleCodeCondition(v int) badorm.WhereCondition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "code", - Value: v, - } -} -func SaleDescriptionCondition(v string) badorm.WhereCondition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "description", - Value: v, - } -} -func SaleProductCondition(conditions ...badorm.Condition[Product]) badorm.Condition[Sale] { - return badorm.JoinCondition[Sale, Product]{ - Conditions: conditions, - T1Field: "product_id", - T2Field: "id", - } -} -func SaleProductIdCondition(v uuid.UUID) badorm.WhereCondition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "product_id", - Value: v, - } -} -func SaleSellerCondition(conditions ...badorm.Condition[Seller]) badorm.Condition[Sale] { - return badorm.JoinCondition[Sale, Seller]{ - Conditions: conditions, - T1Field: "seller_id", - T2Field: "id", - } -} -func SaleSellerIdCondition(v *uuid.UUID) badorm.WhereCondition[Sale] { - return badorm.WhereCondition[Sale]{ - Field: "seller_id", - Value: v, - } -} diff --git a/testintegration/seller_conditions.go b/testintegration/seller_conditions.go deleted file mode 100644 index ac883832..00000000 --- a/testintegration/seller_conditions.go +++ /dev/null @@ -1,39 +0,0 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. -package testintegration - -import ( - badorm "github.com/ditrit/badaas/badorm" - uuid "github.com/google/uuid" - "time" -) - -func SellerIdCondition(v uuid.UUID) badorm.WhereCondition[Seller] { - return badorm.WhereCondition[Seller]{ - Field: "id", - Value: v, - } -} -func SellerCreatedAtCondition(v time.Time) badorm.WhereCondition[Seller] { - return badorm.WhereCondition[Seller]{ - Field: "created_at", - Value: v, - } -} -func SellerUpdatedAtCondition(v time.Time) badorm.WhereCondition[Seller] { - return badorm.WhereCondition[Seller]{ - Field: "updated_at", - Value: v, - } -} -func SellerNameCondition(v string) badorm.WhereCondition[Seller] { - return badorm.WhereCondition[Seller]{ - Field: "name", - Value: v, - } -} -func SellerCompanyIdCondition(v *uuid.UUID) badorm.WhereCondition[Seller] { - return badorm.WhereCondition[Seller]{ - Field: "company_id", - Value: v, - } -} diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 7844fac7..b682919e 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -270,7 +270,7 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, // Generate condition names func getConditionName(typeV Type, fieldName string) string { - return typeV.Name() + strcase.ToPascal(fieldName) + badORMCondition + return typeV.Name() + strcase.ToPascal(fieldName) } // TODO testear esto From 6b63cf39b0f7ebd1f381b8aa74094c141889d261 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 30 May 2023 12:09:11 +0200 Subject: [PATCH 249/467] move constants to correct files --- tools/badctl/cmd/gen/conditions/condition.go | 7 +++++++ tools/badctl/cmd/gen/conditions/file.go | 13 ++----------- tools/badctl/cmd/gen/conditions/type.go | 3 +++ 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index b682919e..70d7c286 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -8,6 +8,13 @@ import ( "github.com/ettle/strcase" ) +const ( + // badorm/condition.go + badORMCondition = "Condition" + badORMWhereCondition = "WhereCondition" + badORMJoinCondition = "JoinCondition" +) + type Condition struct { codes []jen.Code param *JenParam diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index a99e4298..452ef769 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -10,6 +10,8 @@ import ( "github.com/ditrit/badaas/tools/badctl/cmd/version" ) +const badORMPath = "github.com/ditrit/badaas/badorm" + type File struct { destPkg string jenFile *jen.File @@ -59,17 +61,6 @@ func (file File) Save() error { return file.jenFile.Save(file.name) } -// badorm/baseModels.go -var badORMModels = []string{"UUIDModel", "UIntModel"} - -const ( - badORMPath = "github.com/ditrit/badaas/badorm" - // badorm/condition.go - badORMCondition = "Condition" - badORMWhereCondition = "WhereCondition" - badORMJoinCondition = "JoinCondition" -) - // Generate the conditions for each of the object's fields func (file File) generateConditionsForEachField(object types.Object, fields []Field) []*Condition { conditions := []*Condition{} diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index 8338bc74..3529e5bc 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -9,6 +9,9 @@ import ( "github.com/elliotchance/pie/v2" ) +// badorm/baseModels.go +var badORMModels = []string{"UUIDModel", "UIntModel"} + type Type struct { types.Type } From 5f08ec188c21d7c9854bdaea04113644934e3777 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 30 May 2023 12:12:15 +0200 Subject: [PATCH 250/467] fix e2e imports --- test_e2e/http_support_test.go | 6 +++--- test_e2e/test_api.go | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 9a4553fd..e4a4452f 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -11,7 +11,7 @@ import ( "github.com/cucumber/godog" "github.com/cucumber/messages-go/v16" - "github.com/ditrit/badaas/testintegration" + "github.com/ditrit/badaas/testintegration/models" "github.com/elliotchance/pie/v2" ) @@ -394,11 +394,11 @@ func (t *TestContext) modifyWithAttributes(entityType string, jsonTable *godog.T } func (t *TestContext) saleExists(productInt int, code int, description string) { - product := &testintegration.Product{ + product := &models.Product{ Int: productInt, } - sale := &testintegration.Sale{ + sale := &models.Sale{ Code: code, Description: description, Product: *product, diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index 69eace6a..10fcb162 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -11,6 +11,7 @@ import ( "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/router" "github.com/ditrit/badaas/testintegration" + "github.com/ditrit/badaas/testintegration/models" "github.com/ditrit/verdeter" "github.com/gorilla/handlers" "github.com/gorilla/mux" @@ -53,10 +54,10 @@ func runHTTPServer(cmd *cobra.Command, args []string) { router.AuthRoutesModule, router.EAVRoutesModule, - fx.Invoke(badorm.AddModel[testintegration.Company]), - fx.Invoke(badorm.AddModel[testintegration.Seller]), - fx.Invoke(badorm.AddModel[testintegration.Product]), - router.GetCRUDRoutesModule[testintegration.Sale](), + fx.Invoke(badorm.AddModel[models.Company]), + fx.Invoke(badorm.AddModel[models.Seller]), + fx.Invoke(badorm.AddModel[models.Product]), + router.GetCRUDRoutesModule[models.Sale](), // create httpServer fx.Provide(NewHTTPServer), From 885b579462f6c9417dc27fee64d4ce5519b85beb Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 30 May 2023 15:17:36 +0200 Subject: [PATCH 251/467] add support for deletedAt quering --- badorm/condition.go | 24 +++++-- go.mod | 3 +- go.sum | 4 +- go.work.sum | 2 + .../conditions/bicycle_conditions.go | 7 ++ testintegration/conditions/city_conditions.go | 7 ++ .../conditions/company_conditions.go | 7 ++ .../conditions/country_conditions.go | 7 ++ .../conditions/employee_conditions.go | 7 ++ .../conditions/person_conditions.go | 7 ++ .../conditions/product_conditions.go | 7 ++ testintegration/conditions/sale_conditions.go | 7 ++ .../conditions/seller_conditions.go | 7 ++ testintegration/crudService.go | 72 +++++++++++++++++++ tools/badctl/cmd/gen/conditions/condition.go | 3 +- 15 files changed, 161 insertions(+), 10 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 33c12c2e..cd7d4cf0 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -8,6 +8,8 @@ import ( "gorm.io/gorm" ) +const DeletedAtField = "deleted_at" + type Condition[T any] interface { // Applies the condition to the "query" // using the "tableName" as name for the table holding @@ -32,6 +34,11 @@ func (condition WhereCondition[T]) interfaceVerificationMethod(t T) {} // to filter that the Field as a value of Value func (condition WhereCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { sql, values := condition.GetSQL(tableName) + + if condition.Field == DeletedAtField { + query = query.Unscoped() + } + return query.Where( sql, values..., @@ -94,12 +101,23 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // apply WhereConditions to join in "on" clause conditionsValues := []any{} + isDeletedAtConditionPresent := false for _, condition := range whereConditions { + if condition.Field == DeletedAtField { + isDeletedAtConditionPresent = true + } sql, values := condition.GetSQL(nextTableName) - joinQuery += "AND " + sql + joinQuery += " AND " + sql conditionsValues = append(conditionsValues, values...) } + if !isDeletedAtConditionPresent { + joinQuery += fmt.Sprintf( + " AND %s.deleted_at IS NULL", + nextTableName, + ) + } + // add the join to the query query = query.Joins(joinQuery, conditionsValues...) @@ -119,9 +137,7 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // can be either in T1's or T2's table. func (condition JoinCondition[T1, T2]) getSQLJoin(toBeJoinedTableName, nextTableName, previousTableName string) string { return fmt.Sprintf( - `JOIN %[1]s %[2]s ON - %[2]s.deleted_at IS NULL - AND %[2]s.%[3]s = %[4]s.%[5]s + `JOIN %[1]s %[2]s ON %[2]s.%[3]s = %[4]s.%[5]s `, toBeJoinedTableName, nextTableName, diff --git a/go.mod b/go.mod index 5190bdb8..28c6dd52 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,6 @@ require ( github.com/Masterminds/squirrel v1.5.3 github.com/ditrit/verdeter v0.4.0 github.com/elliotchance/pie/v2 v2.5.2 - github.com/ettle/strcase v0.1.1 github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/jackc/pgconn v1.13.0 @@ -22,7 +21,7 @@ require ( go.uber.org/zap v1.23.0 golang.org/x/crypto v0.1.0 gorm.io/driver/postgres v1.4.5 - gorm.io/gorm v1.24.1 + gorm.io/gorm v1.25.1 gotest.tools v2.2.0+incompatible ) diff --git a/go.sum b/go.sum index f4090f42..2ea44d8a 100644 --- a/go.sum +++ b/go.sum @@ -79,8 +79,6 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= @@ -695,6 +693,8 @@ gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnY gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= gorm.io/gorm v1.24.1 h1:CgvzRniUdG67hBAzsxDGOAuq4Te1osVMYsa1eQbd4fs= gorm.io/gorm v1.24.1/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= +gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/go.work.sum b/go.work.sum index b286f9c0..c91930df 100644 --- a/go.work.sum +++ b/go.work.sum @@ -532,4 +532,6 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= +gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index 345998fc..09527610 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -5,6 +5,7 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" uuid "github.com/google/uuid" + gorm "gorm.io/gorm" "time" ) @@ -26,6 +27,12 @@ func BicycleUpdatedAt(v time.Time) badorm.WhereCondition[models.Bicycle] { Value: v, } } +func BicycleDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Bicycle] { + return badorm.WhereCondition[models.Bicycle]{ + Field: "deleted_at", + Value: v, + } +} func BicycleName(v string) badorm.WhereCondition[models.Bicycle] { return badorm.WhereCondition[models.Bicycle]{ Field: "name", diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index eb95eb80..a3bf1dd4 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -5,6 +5,7 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" uuid "github.com/google/uuid" + gorm "gorm.io/gorm" "time" ) @@ -26,6 +27,12 @@ func CityUpdatedAt(v time.Time) badorm.WhereCondition[models.City] { Value: v, } } +func CityDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.City] { + return badorm.WhereCondition[models.City]{ + Field: "deleted_at", + Value: v, + } +} func CityName(v string) badorm.WhereCondition[models.City] { return badorm.WhereCondition[models.City]{ Field: "name", diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index 7c63c897..c76c9d66 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -5,6 +5,7 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" uuid "github.com/google/uuid" + gorm "gorm.io/gorm" "time" ) @@ -26,6 +27,12 @@ func CompanyUpdatedAt(v time.Time) badorm.WhereCondition[models.Company] { Value: v, } } +func CompanyDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Company] { + return badorm.WhereCondition[models.Company]{ + Field: "deleted_at", + Value: v, + } +} func CompanyName(v string) badorm.WhereCondition[models.Company] { return badorm.WhereCondition[models.Company]{ Field: "name", diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index cdb46daf..be4f9ac0 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -5,6 +5,7 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" uuid "github.com/google/uuid" + gorm "gorm.io/gorm" "time" ) @@ -26,6 +27,12 @@ func CountryUpdatedAt(v time.Time) badorm.WhereCondition[models.Country] { Value: v, } } +func CountryDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Country] { + return badorm.WhereCondition[models.Country]{ + Field: "deleted_at", + Value: v, + } +} func CountryName(v string) badorm.WhereCondition[models.Country] { return badorm.WhereCondition[models.Country]{ Field: "name", diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 88a0a6fa..078503c9 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -5,6 +5,7 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" uuid "github.com/google/uuid" + gorm "gorm.io/gorm" "time" ) @@ -26,6 +27,12 @@ func EmployeeUpdatedAt(v time.Time) badorm.WhereCondition[models.Employee] { Value: v, } } +func EmployeeDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Employee] { + return badorm.WhereCondition[models.Employee]{ + Field: "deleted_at", + Value: v, + } +} func EmployeeName(v string) badorm.WhereCondition[models.Employee] { return badorm.WhereCondition[models.Employee]{ Field: "name", diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index 904d44a4..4ae734f3 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -5,6 +5,7 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" uuid "github.com/google/uuid" + gorm "gorm.io/gorm" "time" ) @@ -26,6 +27,12 @@ func PersonUpdatedAt(v time.Time) badorm.WhereCondition[models.Person] { Value: v, } } +func PersonDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Person] { + return badorm.WhereCondition[models.Person]{ + Field: "deleted_at", + Value: v, + } +} func PersonName(v string) badorm.WhereCondition[models.Person] { return badorm.WhereCondition[models.Person]{ Field: "name", diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index fde73fd7..c55041e9 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -6,6 +6,7 @@ import ( models "github.com/ditrit/badaas/testintegration/models" uuid "github.com/google/uuid" pq "github.com/lib/pq" + gorm "gorm.io/gorm" "time" ) @@ -27,6 +28,12 @@ func ProductUpdatedAt(v time.Time) badorm.WhereCondition[models.Product] { Value: v, } } +func ProductDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Product] { + return badorm.WhereCondition[models.Product]{ + Field: "deleted_at", + Value: v, + } +} func ProductString(v string) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ Field: "string_something_else", diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index e7852b02..ff59f4cf 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -5,6 +5,7 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" uuid "github.com/google/uuid" + gorm "gorm.io/gorm" "time" ) @@ -26,6 +27,12 @@ func SaleUpdatedAt(v time.Time) badorm.WhereCondition[models.Sale] { Value: v, } } +func SaleDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Sale] { + return badorm.WhereCondition[models.Sale]{ + Field: "deleted_at", + Value: v, + } +} func SaleCode(v int) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ Field: "code", diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 93b59fee..9c1fccda 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -5,6 +5,7 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" uuid "github.com/google/uuid" + gorm "gorm.io/gorm" "time" ) @@ -26,6 +27,12 @@ func SellerUpdatedAt(v time.Time) badorm.WhereCondition[models.Seller] { Value: v, } } +func SellerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Seller] { + return badorm.WhereCondition[models.Seller]{ + Field: "deleted_at", + Value: v, + } +} func SellerName(v string) badorm.WhereCondition[models.Seller] { return badorm.WhereCondition[models.Seller]{ Field: "name", diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 418c144f..b628d221 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -227,6 +227,34 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { EqualList(&ts.Suite, []*models.Product{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesDeletedAtConditionIsAddedAutomatically() { + match := ts.createProduct("", 0, 0.0, false, nil) + deleted := ts.createProduct("", 0, 0.0, false, nil) + + ts.Nil(ts.db.Delete(deleted).Error) + + entities, err := ts.crudProductService.GetEntities() + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +// TODO DeletedAt with nil value but not automatic + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfDeletedAtNotNil() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) + + ts.Nil(ts.db.Delete(match).Error) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductDeletedAt(match.DeletedAt), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { match := ts.createProduct("", 0, 0.0, false, nil) ts.createProduct("", 0, 0.0, false, nil) @@ -621,6 +649,50 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffer EqualList(&ts.Suite, []*models.Sale{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAddsDeletedAtAutomatically() { + product1 := ts.createProduct("match", 1, 0.0, false, nil) + product2 := ts.createProduct("match", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + ts.Nil(ts.db.Delete(product2).Error) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductString("match"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDeletedAt() { + product1 := ts.createProduct("match", 1, 0.0, false, nil) + product2 := ts.createProduct("match", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + ts.Nil(ts.db.Delete(product1).Error) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductDeletedAt(product1.DeletedAt), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersByNil() { product1 := ts.createProduct("", 1, 0.0, false, nil) intProduct2 := 2 diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 70d7c286..f8ec47b6 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -142,8 +142,7 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) e } } else { // field is not a BaDORM Model - if (field.Type.IsGormCustomType() || field.TypeString() == "time.Time") && field.TypeString() != "gorm.io/gorm.DeletedAt" { - // TODO DeletedAt + if field.Type.IsGormCustomType() || field.TypeString() == "time.Time" { // field is a Gorm Custom type (implements Scanner and Valuer interfaces) // or a named type supported by gorm (time.Time, gorm.DeletedAt) condition.param.ToCustomType(condition.destPkg, field.Type) From b765da4b22a3fdd2c7a09c60383cf876efc79e3f Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 30 May 2023 15:54:02 +0200 Subject: [PATCH 252/467] export badorm automigrate --- badorm/autoMigrate.go | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/badorm/autoMigrate.go b/badorm/autoMigrate.go index 12bcc7b8..ce11852a 100644 --- a/badorm/autoMigrate.go +++ b/badorm/autoMigrate.go @@ -1,29 +1,21 @@ package badorm import ( - "reflect" - "github.com/elliotchance/pie/v2" - "go.uber.org/zap" "gorm.io/gorm" ) -func autoMigrate(modelsLists [][]any, db *gorm.DB, logger *zap.Logger) error { +func AutoMigrate(models []any, db *gorm.DB) error { + return autoMigrate([][]any{models}, db) +} + +func autoMigrate(modelsLists [][]any, db *gorm.DB) error { allModels := pie.Flat(modelsLists) - registeredModels := pie.Map(allModels, func(model any) string { - return reflect.TypeOf(model).String() - }) - logger.Sugar().Debug( - "Registered models: ", - registeredModels, - ) err := db.AutoMigrate(allModels...) if err != nil { - logger.Error("migration failed") return err } - logger.Info("AutoMigration was executed successfully") return nil } From 21471821e1acda777cbbe47a4b02faa791deed9e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 30 May 2023 16:10:46 +0200 Subject: [PATCH 253/467] add badorm in standalone mode --- badorm/ModuleFx.go | 9 --------- badorm/badorm.go | 23 +++++++++++++++++++++++ badorm/crudRepository.go | 10 ++-------- badorm/crudService.go | 4 ---- 4 files changed, 25 insertions(+), 21 deletions(-) create mode 100644 badorm/badorm.go diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index f658887c..d2268fe3 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -2,7 +2,6 @@ package badorm import ( "fmt" - "reflect" "go.uber.org/fx" ) @@ -37,11 +36,3 @@ func GetCRUDServiceModule[T any, ID BadaasID]() fx.Option { fx.Provide(NewCRUDService[T, ID]), ) } - -var modelsMapping = map[string]reflect.Type{} - -func AddModel[T any]() { - entity := *new(T) - entityType := reflect.TypeOf(entity) - modelsMapping[entityType.Name()] = entityType -} diff --git a/badorm/badorm.go b/badorm/badorm.go new file mode 100644 index 00000000..3d79f993 --- /dev/null +++ b/badorm/badorm.go @@ -0,0 +1,23 @@ +package badorm + +import ( + "reflect" + + "gorm.io/gorm" +) + +func GetCRUD[T any, ID BadaasID](db *gorm.DB) (CRUDService[T, ID], CRUDRepository[T, ID]) { + AddModel[T]() + repository := NewCRUDRepository[T, ID]() + return NewCRUDService(db, repository), repository +} + +// TODO verificar si esto va a seguir siendo util o no +var modelsMapping = map[string]reflect.Type{} + +// TODO no deberia ser exportado +func AddModel[T any]() { + entity := *new(T) + entityType := reflect.TypeOf(entity) + modelsMapping[entityType.Name()] = entityType +} diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 70496948..689573a0 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -5,7 +5,6 @@ import ( "fmt" "sync" - "go.uber.org/zap" "gorm.io/gorm" "gorm.io/gorm/schema" ) @@ -42,16 +41,11 @@ var ( // Implementation of the Generic CRUD Repository type CRUDRepositoryImpl[T any, ID BadaasID] struct { CRUDRepository[T, ID] - logger *zap.Logger } // Constructor of the Generic CRUD Repository -func NewCRUDRepository[T any, ID BadaasID]( - logger *zap.Logger, -) CRUDRepository[T, ID] { - return &CRUDRepositoryImpl[T, ID]{ - logger: logger, - } +func NewCRUDRepository[T any, ID BadaasID]() CRUDRepository[T, ID] { + return &CRUDRepositoryImpl[T, ID]{} } // Create object "entity" inside transaction "tx" diff --git a/badorm/crudService.go b/badorm/crudService.go index ae2e1c52..68914bd4 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -2,7 +2,6 @@ package badorm import ( "github.com/google/uuid" - "go.uber.org/zap" "gorm.io/gorm" ) @@ -19,18 +18,15 @@ var _ CRUDService[UUIDModel, uuid.UUID] = (*crudServiceImpl[UUIDModel, uuid.UUID // Implementation of the CRUD Service type crudServiceImpl[T any, ID BadaasID] struct { CRUDService[T, ID] - logger *zap.Logger db *gorm.DB repository CRUDRepository[T, ID] } func NewCRUDService[T any, ID BadaasID]( - logger *zap.Logger, db *gorm.DB, repository CRUDRepository[T, ID], ) CRUDService[T, ID] { return &crudServiceImpl[T, ID]{ - logger: logger, db: db, repository: repository, } From f5ca8db77a0dbc81928ca7396d058ac6dafe3f72 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 30 May 2023 16:25:22 +0200 Subject: [PATCH 254/467] remove unnecessary automigrate --- badorm/autoMigrate.go | 21 --------------------- badorm/badorm.go | 6 ++++++ 2 files changed, 6 insertions(+), 21 deletions(-) delete mode 100644 badorm/autoMigrate.go diff --git a/badorm/autoMigrate.go b/badorm/autoMigrate.go deleted file mode 100644 index ce11852a..00000000 --- a/badorm/autoMigrate.go +++ /dev/null @@ -1,21 +0,0 @@ -package badorm - -import ( - "github.com/elliotchance/pie/v2" - "gorm.io/gorm" -) - -func AutoMigrate(models []any, db *gorm.DB) error { - return autoMigrate([][]any{models}, db) -} - -func autoMigrate(modelsLists [][]any, db *gorm.DB) error { - allModels := pie.Flat(modelsLists) - - err := db.AutoMigrate(allModels...) - if err != nil { - return err - } - - return nil -} diff --git a/badorm/badorm.go b/badorm/badorm.go index 3d79f993..ec2efdc4 100644 --- a/badorm/badorm.go +++ b/badorm/badorm.go @@ -3,6 +3,7 @@ package badorm import ( "reflect" + "github.com/elliotchance/pie/v2" "gorm.io/gorm" ) @@ -21,3 +22,8 @@ func AddModel[T any]() { entityType := reflect.TypeOf(entity) modelsMapping[entityType.Name()] = entityType } + +func autoMigrate(modelsLists [][]any, db *gorm.DB) error { + allModels := pie.Flat(modelsLists) + return db.AutoMigrate(allModels...) +} From 277bfeac62f75d8881056f8151a2711756fbef69 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 30 May 2023 17:00:41 +0200 Subject: [PATCH 255/467] rename file --- testintegration/conditions/badorm.go | 3 +++ testintegration/conditions/conditions.go | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 testintegration/conditions/badorm.go delete mode 100644 testintegration/conditions/conditions.go diff --git a/testintegration/conditions/badorm.go b/testintegration/conditions/badorm.go new file mode 100644 index 00000000..8891ae4d --- /dev/null +++ b/testintegration/conditions/badorm.go @@ -0,0 +1,3 @@ +package conditions + +//go:generate badctl gen conditions ../models diff --git a/testintegration/conditions/conditions.go b/testintegration/conditions/conditions.go deleted file mode 100644 index ec41174c..00000000 --- a/testintegration/conditions/conditions.go +++ /dev/null @@ -1,4 +0,0 @@ -package conditions - -// TODO sacar el local -//go:generate ../../tools/badctl/badctl gen conditions ../models From 4d7f548e0a4aa9d2f16c0ee98ad57adb5b64b36e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 31 May 2023 10:59:20 +0200 Subject: [PATCH 256/467] add unsafe service with the previous version to work with http --- Makefile | 2 +- badorm/ModuleFx.go | 30 +- badorm/badorm.go | 13 - badorm/crudRepository.go | 52 --- badorm/crudService.go | 8 - badorm/crudUnsafeRepository.go | 248 ++++++++++++++ badorm/crudUnsafeService.go | 39 +++ controllers/crud.go | 25 +- controllers/crud_test.go | 24 +- mocks/badorm/CRUDUnsafeRepository.go | 56 ++++ mocks/badorm/CRUDUnsafeService.go | 54 +++ router/ModuleFx.go | 2 + services/ModuleFx.go | 6 - test_e2e/test_api.go | 4 - testintegration/crudService.go | 102 +----- testintegration/crudServiceCommon.go | 101 ++++++ testintegration/crudUnsafeService.go | 473 +++++++++++++++++++++++++++ testintegration/integration_test.go | 24 +- testintegration/models/models.go | 2 +- 19 files changed, 1059 insertions(+), 206 deletions(-) create mode 100644 badorm/crudUnsafeRepository.go create mode 100644 badorm/crudUnsafeService.go create mode 100644 mocks/badorm/CRUDUnsafeRepository.go create mode 100644 mocks/badorm/CRUDUnsafeService.go create mode 100644 testintegration/crudServiceCommon.go create mode 100644 testintegration/crudUnsafeService.go diff --git a/Makefile b/Makefile index 92b896af..ac909dad 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PATHS = $(shell go list ./... | tail -n +2 | grep -v test_integration | grep -v test_e2e) +PATHS = $(shell go list ./... | tail -n +2 | grep -v testintegration | grep -v test_e2e) test_unit: go test $(PATHS) -v diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index d2268fe3..1a974a69 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -2,6 +2,7 @@ package badorm import ( "fmt" + "reflect" "go.uber.org/fx" ) @@ -23,16 +24,41 @@ var BaDORMModule = fx.Module( ) func GetCRUDServiceModule[T any, ID BadaasID]() fx.Option { + // TODO verificar que sea un badorm module? + // TODO sacar solo cual es el id? return fx.Module( fmt.Sprintf( "%TCRUDServiceModule", *new(T), ), - // models - fx.Invoke(AddModel[T]), // repository fx.Provide(NewCRUDRepository[T, ID]), // service fx.Provide(NewCRUDService[T, ID]), ) } + +func GetCRUDUnsafeServiceModule[T any, ID BadaasID]() fx.Option { + // TODO verificar que sea un badorm module? + // TODO sacar solo cual es el id? + return fx.Module( + fmt.Sprintf( + "%TCRUDUnsafeServiceModule", + *new(T), + ), + // models + fx.Invoke(AddUnsafeModel[T]), + // repository + fx.Provide(NewCRUDUnsafeRepository[T, ID]), + // service + fx.Provide(NewCRUDUnsafeService[T, ID]), + ) +} + +var modelsMapping = map[string]reflect.Type{} + +func AddUnsafeModel[T any]() { + entity := *new(T) + entityType := reflect.TypeOf(entity) + modelsMapping[entityType.Name()] = entityType +} diff --git a/badorm/badorm.go b/badorm/badorm.go index ec2efdc4..2446ecbe 100644 --- a/badorm/badorm.go +++ b/badorm/badorm.go @@ -1,28 +1,15 @@ package badorm import ( - "reflect" - "github.com/elliotchance/pie/v2" "gorm.io/gorm" ) func GetCRUD[T any, ID BadaasID](db *gorm.DB) (CRUDService[T, ID], CRUDRepository[T, ID]) { - AddModel[T]() repository := NewCRUDRepository[T, ID]() return NewCRUDService(db, repository), repository } -// TODO verificar si esto va a seguir siendo util o no -var modelsMapping = map[string]reflect.Type{} - -// TODO no deberia ser exportado -func AddModel[T any]() { - entity := *new(T) - entityType := reflect.TypeOf(entity) - modelsMapping[entityType.Name()] = entityType -} - func autoMigrate(modelsLists [][]any, db *gorm.DB) error { allModels := pie.Flat(modelsLists) return db.AutoMigrate(allModels...) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 689573a0..e925930a 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -2,7 +2,6 @@ package badorm import ( "errors" - "fmt" "sync" "gorm.io/gorm" @@ -30,12 +29,6 @@ type CRUDRepository[T any, ID BadaasID] interface { var ( ErrMoreThanOneObjectFound = errors.New("found more that one object that meet the requested conditions") ErrObjectNotFound = errors.New("no object exists that meets the requested conditions") - ErrObjectsNotRelated = func(typeName, attributeName string) error { - return fmt.Errorf("%[1]s has not attribute named %[2]s or %[2]sID", typeName, attributeName) - } - ErrModelNotRegistered = func(typeName, attributeName string) error { - return fmt.Errorf("%[1]s has an attribute named %[2]s or %[2]sID but %[2]s is not registered as model (use AddModel)", typeName, attributeName) - } ) // Implementation of the Generic CRUD Repository @@ -152,48 +145,3 @@ func getTableName(db *gorm.DB, entity any) (string, error) { func (repository *CRUDRepositoryImpl[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { return repository.GetMultiple(tx) } - -// Returns an object of the type of the "entity" attribute called "relationName" -// and a boolean value indicating whether the id attribute that relates them -// in the database is in the "entity"'s table. -// Returns error if "entity" not a relation called "relationName". -// func getRelatedObject(entity any, relationName string) (any, bool, error) { -// entityType := getEntityType(entity) - -// field, isPresent := entityType.FieldByName(relationName) -// if !isPresent { -// // some gorm relations dont have a direct relation in the model, only the id -// relatedObject, err := getRelatedObjectByID(entityType, relationName) -// if err != nil { -// return nil, false, err -// } - -// return relatedObject, true, nil -// } - -// _, isIDPresent := entityType.FieldByName(relationName + "ID") - -// return createObject(field.Type), isIDPresent, nil -// } - -// Returns an object of the type of the "entity" attribute called "relationName" + "ID" -// Returns error if "entity" not a relation called "relationName" + "ID" -// func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, error) { -// _, isPresent := entityType.FieldByName(relationName + "ID") -// if !isPresent { -// return nil, ErrObjectsNotRelated(entityType.Name(), relationName) -// } - -// // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) -// fieldType, isPresent := modelsMapping[relationName] -// if !isPresent { -// return nil, ErrModelNotRegistered(entityType.Name(), relationName) -// } - -// return createObject(fieldType), nil -// } - -// // Creates an object of type reflect.Type using reflection -// func createObject(entityType reflect.Type) any { -// return reflect.New(entityType).Elem().Interface() -// } diff --git a/badorm/crudService.go b/badorm/crudService.go index 68914bd4..be17db7a 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -38,14 +38,6 @@ func (service *crudServiceImpl[T, ID]) GetEntity(id ID) (*T, error) { } // Get entities of type T that match all "conditions" -// -// "conditions" is in {"attributeName": expectedValue} format -// in case of join "conditions" can have the format: -// -// {"relationAttributeName": {"attributeName": expectedValue}} -// -// TODO -// func (service *crudServiceImpl[T, ID]) GetEntities(conditions map[string]any) ([]*T, error) { func (service *crudServiceImpl[T, ID]) GetEntities(conditions ...Condition[T]) ([]*T, error) { return service.repository.GetMultiple(service.db, conditions...) } diff --git a/badorm/crudUnsafeRepository.go b/badorm/crudUnsafeRepository.go new file mode 100644 index 00000000..a3960f39 --- /dev/null +++ b/badorm/crudUnsafeRepository.go @@ -0,0 +1,248 @@ +package badorm + +import ( + "fmt" + "reflect" + + "gorm.io/gorm" +) + +// Generic CRUD Repository +// T can be any model whose identifier attribute is of type ID +type CRUDUnsafeRepository[T any, ID BadaasID] interface { + GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) +} + +var ( + ErrObjectsNotRelated = func(typeName, attributeName string) error { + return fmt.Errorf("%[1]s has not attribute named %[2]s or %[2]sID", typeName, attributeName) + } + ErrModelNotRegistered = func(typeName, attributeName string) error { + return fmt.Errorf( + "%[1]s has an attribute named %[2]s or %[2]sID but %[2]s is not registered as model (use badorm.AddUnsafeModel or badorm.GetCRUDUnsafeServiceModule)", + typeName, attributeName, + ) + } +) + +// Implementation of the Generic CRUD Repository +type CRUDUnsafeRepositoryImpl[T any, ID BadaasID] struct { + CRUDUnsafeRepository[T, ID] +} + +// Constructor of the Generic CRUD Repository +func NewCRUDUnsafeRepository[T any, ID BadaasID]() CRUDUnsafeRepository[T, ID] { + return &CRUDUnsafeRepositoryImpl[T, ID]{} +} + +// Get the list of objects that match "conditions" inside transaction "tx" +// "conditions" is in {"attributeName": expectedValue} format +// in case of join "conditions" can have the format: +// {"relationAttributeName": {"attributeName": expectedValue}} +func (repository *CRUDUnsafeRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) { + thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) + if err != nil { + return nil, err + } + + query := tx.Where(thisEntityConditions) + + entity := new(T) + // only entities that match the conditions + for joinAttributeName, joinConditions := range joinConditions { + tableName, err := getTableName(tx, entity) + if err != nil { + return nil, err + } + + err = repository.addJoinToQuery( + query, + entity, + tableName, + joinAttributeName, + joinConditions, + ) + if err != nil { + return nil, err + } + } + + // execute query + var entities []*T + err = query.Find(&entities).Error + + return entities, err +} + +// Adds a join to the "query" by the "joinAttributeName" +// then, adds the verification that the joined values match "conditions" + +// "conditions" is in {"attributeName": expectedValue} format +// "previousEntity" is a pointer to a object from where we navigate the relationship +// "previousTableName" is the name of the table where the previous object is saved and from we the join will we done +func (repository *CRUDUnsafeRepositoryImpl[T, ID]) addJoinToQuery( + query *gorm.DB, previousEntity any, + previousTableName, joinAttributeName string, + conditions map[string]any, +) error { + thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) + if err != nil { + return err + } + + relatedObject, relationIDIsInPreviousTable, err := getRelatedObject( + previousEntity, + joinAttributeName, + ) + if err != nil { + return err + } + + joinTableName, err := getTableName(query, relatedObject) + if err != nil { + return err + } + + tableWithSuffix := joinTableName + "_" + previousTableName + + var stringQuery string + if relationIDIsInPreviousTable { + stringQuery = fmt.Sprintf( + `JOIN %[1]s %[2]s ON + %[2]s.id = %[3]s.%[4]s_id + AND %[2]s.deleted_at IS NULL + `, + joinTableName, + tableWithSuffix, + previousTableName, + joinAttributeName, + ) + } else { + // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) + previousAttribute := reflect.TypeOf(previousEntity).Elem().Name() + stringQuery = fmt.Sprintf( + `JOIN %[1]s %[2]s ON + %[2]s.%[4]s_id = %[3]s.id + AND %[2]s.deleted_at IS NULL + `, + joinTableName, + tableWithSuffix, + previousTableName, + previousAttribute, + ) + } + + conditionsValues := []any{} + for attributeName, conditionValue := range thisEntityConditions { + stringQuery += fmt.Sprintf( + `AND %[1]s.%[2]s = ? + `, + tableWithSuffix, attributeName, + ) + conditionsValues = append(conditionsValues, conditionValue) + } + + query.Joins(stringQuery, conditionsValues...) + + for joinAttributeName, joinConditions := range joinConditions { + err := repository.addJoinToQuery( + query, + relatedObject, + tableWithSuffix, + joinAttributeName, + joinConditions, + ) + if err != nil { + return err + } + } + + return nil +} + +// Given a map of "conditions" that is in {"attributeName": expectedValue} format +// and in case of join "conditions" can have the format: +// +// {"relationAttributeName": {"attributeName": expectedValue}} +// +// it divides the map in two: +// the conditions that will be applied to the current entity ({"attributeName": expectedValue} format) +// the conditions that will generate a join with another entity ({"relationAttributeName": {"attributeName": expectedValue}} format) +// +// Returns error if any expectedValue is not of a supported type +func divideConditionsByEntity( + conditions map[string]any, +) (map[string]any, map[string]map[string]any, error) { + thisEntityConditions := map[string]any{} + joinConditions := map[string]map[string]any{} + + for attributeName, expectedValue := range conditions { + switch typedExpectedValue := expectedValue.(type) { + case float64, bool, string, int: + thisEntityConditions[attributeName] = expectedValue + case map[string]any: + joinConditions[attributeName] = typedExpectedValue + default: + return nil, nil, fmt.Errorf("unsupported type") + } + } + + return thisEntityConditions, joinConditions, nil +} + +// Returns an object of the type of the "entity" attribute called "relationName" +// and a boolean value indicating whether the id attribute that relates them +// in the database is in the "entity"'s table. +// Returns error if "entity" not a relation called "relationName". +func getRelatedObject(entity any, relationName string) (any, bool, error) { + entityType := getEntityType(entity) + + field, isPresent := entityType.FieldByName(relationName) + if !isPresent { + // some gorm relations dont have a direct relation in the model, only the id + relatedObject, err := getRelatedObjectByID(entityType, relationName) + if err != nil { + return nil, false, err + } + + return relatedObject, true, nil + } + + _, isIDPresent := entityType.FieldByName(relationName + "ID") + + return createObject(field.Type), isIDPresent, nil +} + +// Get the reflect.Type of any entity or pointer to entity +func getEntityType(entity any) reflect.Type { + entityType := reflect.TypeOf(entity) + + // entityType will be a pointer if the relation can be nullable + if entityType.Kind() == reflect.Pointer { + entityType = entityType.Elem() + } + + return entityType +} + +// Returns an object of the type of the "entity" attribute called "relationName" + "ID" +// Returns error if "entity" not a relation called "relationName" + "ID" +func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, error) { + _, isPresent := entityType.FieldByName(relationName + "ID") + if !isPresent { + return nil, ErrObjectsNotRelated(entityType.Name(), relationName) + } + + // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) + fieldType, isPresent := modelsMapping[relationName] + if !isPresent { + return nil, ErrModelNotRegistered(entityType.Name(), relationName) + } + + return createObject(fieldType), nil +} + +// Creates an object of type reflect.Type using reflection +func createObject(entityType reflect.Type) any { + return reflect.New(entityType).Elem().Interface() +} diff --git a/badorm/crudUnsafeService.go b/badorm/crudUnsafeService.go new file mode 100644 index 00000000..2aedf696 --- /dev/null +++ b/badorm/crudUnsafeService.go @@ -0,0 +1,39 @@ +package badorm + +import ( + "github.com/google/uuid" + "gorm.io/gorm" +) + +// T can be any model whose identifier attribute is of type ID +type CRUDUnsafeService[T any, ID BadaasID] interface { + GetEntities(conditions map[string]any) ([]*T, error) +} + +// check interface compliance +var _ CRUDUnsafeService[UUIDModel, uuid.UUID] = (*crudUnsafeServiceImpl[UUIDModel, uuid.UUID])(nil) + +// Implementation of the CRUD Service +type crudUnsafeServiceImpl[T any, ID BadaasID] struct { + CRUDService[T, ID] + db *gorm.DB + repository CRUDUnsafeRepository[T, ID] +} + +func NewCRUDUnsafeService[T any, ID BadaasID]( + db *gorm.DB, + repository CRUDUnsafeRepository[T, ID], +) CRUDUnsafeService[T, ID] { + return &crudUnsafeServiceImpl[T, ID]{ + db: db, + repository: repository, + } +} + +// Get entities of type T that match all "conditions" +// "params" is in {"attributeName": expectedValue} format +// in case of join "params" can have the format: +// {"relationAttributeName": {"attributeName": expectedValue}} +func (service *crudUnsafeServiceImpl[T, ID]) GetEntities(conditions map[string]any) ([]*T, error) { + return service.repository.GetMultiple(service.db, conditions) +} diff --git a/controllers/crud.go b/controllers/crud.go index 76a06800..81d6ceee 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -29,6 +29,7 @@ type CRUDRoute struct { func NewCRUDController[T any]( logger *zap.Logger, crudService badorm.CRUDService[T, uuid.UUID], + crudUnsafeService badorm.CRUDUnsafeService[T, uuid.UUID], ) CRUDRoute { fullTypeName := strings.ToLower(fmt.Sprintf("%T", *new(T))) // remove the package name of the type @@ -37,8 +38,9 @@ func NewCRUDController[T any]( return CRUDRoute{ TypeName: typeName, Controller: &crudControllerImpl[T]{ - logger: logger, - crudService: crudService, + logger: logger, + crudService: crudService, + crudUnsafeService: crudUnsafeService, }, } @@ -46,8 +48,9 @@ func NewCRUDController[T any]( // The concrete implementation of the CRUDController type crudControllerImpl[T any] struct { - logger *zap.Logger - crudService badorm.CRUDService[T, uuid.UUID] + logger *zap.Logger + crudService badorm.CRUDService[T, uuid.UUID] + crudUnsafeService badorm.CRUDUnsafeService[T, uuid.UUID] } // The handler responsible of the retrieval of one object @@ -63,13 +66,11 @@ func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *htt // The handler responsible of the retrieval of multiple objects func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - // TODO - // params, herr := decodeJSONOptional(r) - // if herr != nil { - // return nil, herr - // } + params, herr := decodeJSONOptional(r) + if herr != nil { + return nil, herr + } - // entities, err := controller.crudService.GetEntities(params) - // return entities, mapServiceError(err) - return nil, nil + entities, err := controller.crudUnsafeService.GetEntities(params) + return entities, mapServiceError(err) } diff --git a/controllers/crud_test.go b/controllers/crud_test.go index cba76a28..549b20a8 100644 --- a/controllers/crud_test.go +++ b/controllers/crud_test.go @@ -22,10 +22,12 @@ type Model struct { func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) route := controllers.NewCRUDController[Model]( logger, crudService, + crudUnsafeService, ) response := httptest.NewRecorder() request := httptest.NewRequest( @@ -40,10 +42,12 @@ func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { func TestCRUDGetWithEntityIDNotUUIDReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) route := controllers.NewCRUDController[Model]( logger, crudService, + crudUnsafeService, ) response := httptest.NewRecorder() request := httptest.NewRequest( @@ -59,6 +63,7 @@ func TestCRUDGetWithEntityIDNotUUIDReturnsError(t *testing.T) { func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) uuid := uuid.New() @@ -69,6 +74,7 @@ func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { route := controllers.NewCRUDController[Model]( logger, crudService, + crudUnsafeService, ) response := httptest.NewRecorder() request := httptest.NewRequest( @@ -85,6 +91,7 @@ func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) uuid := uuid.New() @@ -95,6 +102,7 @@ func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { route := controllers.NewCRUDController[Model]( logger, crudService, + crudUnsafeService, ) response := httptest.NewRecorder() request := httptest.NewRequest( @@ -111,6 +119,7 @@ func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) uuid := uuid.New() entity := Model{} @@ -122,6 +131,7 @@ func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { route := controllers.NewCRUDController[Model]( logger, crudService, + crudUnsafeService, ) response := httptest.NewRecorder() request := httptest.NewRequest( @@ -140,14 +150,16 @@ func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) - crudService. + crudUnsafeService. On("GetEntities", map[string]any{}). Return(nil, errors.New("db error")) route := controllers.NewCRUDController[Model]( logger, crudService, + crudUnsafeService, ) response := httptest.NewRecorder() request := httptest.NewRequest( @@ -162,17 +174,19 @@ func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { func TestGetEntitiesWithoutParams(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) entity1 := &Model{} entity2 := &Model{} - crudService. + crudUnsafeService. On("GetEntities", map[string]any{}). Return([]*Model{entity1, entity2}, nil) route := controllers.NewCRUDController[Model]( logger, crudService, + crudUnsafeService, ) response := httptest.NewRecorder() request := httptest.NewRequest( @@ -190,16 +204,18 @@ func TestGetEntitiesWithoutParams(t *testing.T) { func TestGetEntitiesWithParams(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) entity1 := &Model{} - crudService. + crudUnsafeService. On("GetEntities", map[string]any{"param1": "something"}). Return([]*Model{entity1}, nil) route := controllers.NewCRUDController[Model]( logger, crudService, + crudUnsafeService, ) response := httptest.NewRecorder() request := httptest.NewRequest( @@ -216,10 +232,12 @@ func TestGetEntitiesWithParams(t *testing.T) { func TestGetEntitiesWithParamsNotJsonReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) route := controllers.NewCRUDController[Model]( logger, crudService, + crudUnsafeService, ) response := httptest.NewRecorder() request := httptest.NewRequest( diff --git a/mocks/badorm/CRUDUnsafeRepository.go b/mocks/badorm/CRUDUnsafeRepository.go new file mode 100644 index 00000000..d510ae40 --- /dev/null +++ b/mocks/badorm/CRUDUnsafeRepository.go @@ -0,0 +1,56 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + badorm "github.com/ditrit/badaas/badorm" + gorm "gorm.io/gorm" + + mock "github.com/stretchr/testify/mock" +) + +// CRUDUnsafeRepository is an autogenerated mock type for the CRUDUnsafeRepository type +type CRUDUnsafeRepository[T interface{}, ID badorm.BadaasID] struct { + mock.Mock +} + +// GetMultiple provides a mock function with given fields: tx, conditions +func (_m *CRUDUnsafeRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]interface{}) ([]*T, error) { + ret := _m.Called(tx, conditions) + + var r0 []*T + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) ([]*T, error)); ok { + return rf(tx, conditions) + } + if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) []*T); ok { + r0 = rf(tx, conditions) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*T) + } + } + + if rf, ok := ret.Get(1).(func(*gorm.DB, map[string]interface{}) error); ok { + r1 = rf(tx, conditions) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type mockConstructorTestingTNewCRUDUnsafeRepository interface { + mock.TestingT + Cleanup(func()) +} + +// NewCRUDUnsafeRepository creates a new instance of CRUDUnsafeRepository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewCRUDUnsafeRepository[T interface{}, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDUnsafeRepository) *CRUDUnsafeRepository[T, ID] { + mock := &CRUDUnsafeRepository[T, ID]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/badorm/CRUDUnsafeService.go b/mocks/badorm/CRUDUnsafeService.go new file mode 100644 index 00000000..b96a98dc --- /dev/null +++ b/mocks/badorm/CRUDUnsafeService.go @@ -0,0 +1,54 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + badorm "github.com/ditrit/badaas/badorm" + mock "github.com/stretchr/testify/mock" +) + +// CRUDUnsafeService is an autogenerated mock type for the CRUDUnsafeService type +type CRUDUnsafeService[T interface{}, ID badorm.BadaasID] struct { + mock.Mock +} + +// GetEntities provides a mock function with given fields: conditions +func (_m *CRUDUnsafeService[T, ID]) GetEntities(conditions map[string]interface{}) ([]*T, error) { + ret := _m.Called(conditions) + + var r0 []*T + var r1 error + if rf, ok := ret.Get(0).(func(map[string]interface{}) ([]*T, error)); ok { + return rf(conditions) + } + if rf, ok := ret.Get(0).(func(map[string]interface{}) []*T); ok { + r0 = rf(conditions) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*T) + } + } + + if rf, ok := ret.Get(1).(func(map[string]interface{}) error); ok { + r1 = rf(conditions) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type mockConstructorTestingTNewCRUDUnsafeService interface { + mock.TestingT + Cleanup(func()) +} + +// NewCRUDUnsafeService creates a new instance of CRUDUnsafeService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewCRUDUnsafeService[T interface{}, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDUnsafeService) *CRUDUnsafeService[T, ID] { + mock := &CRUDUnsafeService[T, ID]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/router/ModuleFx.go b/router/ModuleFx.go index 9ba0914f..bd70bce0 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -75,7 +75,9 @@ func GetCRUDRoutesModule[T any]() fx.Option { return fx.Module( typeName+"CRUDRoutesModule", // service + // TODO ver este uuid badorm.GetCRUDServiceModule[T, uuid.UUID](), + badorm.GetCRUDUnsafeServiceModule[T, uuid.UUID](), // controller fx.Provide( diff --git a/services/ModuleFx.go b/services/ModuleFx.go index 130e202a..ffeecfb1 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -14,8 +14,6 @@ var AuthServiceModule = fx.Module( "authService", // models fx.Provide(getAuthModels), - fx.Invoke(badorm.AddModel[models.User]), - fx.Invoke(badorm.AddModel[models.Session]), // repositories fx.Provide(badorm.NewCRUDRepository[models.Session, uuid.UUID]), fx.Provide(badorm.NewCRUDRepository[models.User, uuid.UUID]), @@ -38,10 +36,6 @@ var EAVServiceModule = fx.Module( "eavService", // models fx.Provide(getEAVModels), - fx.Invoke(badorm.AddModel[models.EntityType]), - fx.Invoke(badorm.AddModel[models.Entity]), - fx.Invoke(badorm.AddModel[models.Value]), - fx.Invoke(badorm.AddModel[models.Attribute]), // repositories fx.Provide(repository.NewValueRepository), fx.Provide(repository.NewEntityRepository), diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index 10fcb162..68f6112a 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -7,7 +7,6 @@ import ( "github.com/Masterminds/semver/v3" "github.com/ditrit/badaas" - "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/router" "github.com/ditrit/badaas/testintegration" @@ -54,9 +53,6 @@ func runHTTPServer(cmd *cobra.Command, args []string) { router.AuthRoutesModule, router.EAVRoutesModule, - fx.Invoke(badorm.AddModel[models.Company]), - fx.Invoke(badorm.AddModel[models.Seller]), - fx.Invoke(badorm.AddModel[models.Product]), router.GetCRUDRoutesModule[models.Sale](), // create httpServer diff --git a/testintegration/crudService.go b/testintegration/crudService.go index b628d221..1576a166 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -6,16 +6,12 @@ import ( "github.com/ditrit/badaas/testintegration/models" "github.com/google/uuid" "github.com/lib/pq" - "github.com/stretchr/testify/suite" - "go.uber.org/zap" "gorm.io/gorm" "gotest.tools/assert" ) type CRUDServiceIntTestSuite struct { - suite.Suite - logger *zap.Logger - db *gorm.DB + CRUDServiceCommonIntTestSuite crudProductService badorm.CRUDService[models.Product, uuid.UUID] crudSaleService badorm.CRUDService[models.Sale, uuid.UUID] crudSellerService badorm.CRUDService[models.Seller, uuid.UUID] @@ -26,7 +22,6 @@ type CRUDServiceIntTestSuite struct { } func NewCRUDServiceIntTestSuite( - logger *zap.Logger, db *gorm.DB, crudProductService badorm.CRUDService[models.Product, uuid.UUID], crudSaleService badorm.CRUDService[models.Sale, uuid.UUID], @@ -37,8 +32,9 @@ func NewCRUDServiceIntTestSuite( crudBicycleService badorm.CRUDService[models.Bicycle, uuid.UUID], ) *CRUDServiceIntTestSuite { return &CRUDServiceIntTestSuite{ - logger: logger, - db: db, + CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ + db: db, + }, crudProductService: crudProductService, crudSaleService: crudSaleService, crudSellerService: crudSellerService, @@ -49,10 +45,6 @@ func NewCRUDServiceIntTestSuite( } } -func (ts *CRUDServiceIntTestSuite) SetupTest() { - CleanDB(ts.db) -} - // ------------------------- GetEntity -------------------------------- func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { @@ -761,89 +753,3 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultiple EqualList(&ts.Suite, []*models.Sale{match}, entities) } - -// ------------------------- utils ------------------------- - -func (ts *CRUDServiceIntTestSuite) createProduct(stringV string, intV int, floatV float64, boolV bool, intP *int) *models.Product { - entity := &models.Product{ - String: stringV, - Int: intV, - Float: floatV, - Bool: boolV, - IntPointer: intP, - } - err := ts.db.Create(entity).Error - ts.Nil(err) - - return entity -} - -func (ts *CRUDServiceIntTestSuite) createSale(code int, product *models.Product, seller *models.Seller) *models.Sale { - entity := &models.Sale{ - Code: code, - Product: *product, - Seller: seller, - } - err := ts.db.Create(entity).Error - ts.Nil(err) - - return entity -} - -func (ts *CRUDServiceIntTestSuite) createSeller(name string, company *models.Company) *models.Seller { - var companyID *uuid.UUID - if company != nil { - companyID = &company.ID - } - entity := &models.Seller{ - Name: name, - CompanyID: companyID, - } - err := ts.db.Create(entity).Error - ts.Nil(err) - - return entity -} - -func (ts *CRUDServiceIntTestSuite) createCompany(name string) *models.Company { - entity := &models.Company{ - Name: name, - } - err := ts.db.Create(entity).Error - ts.Nil(err) - - return entity -} - -func (ts *CRUDServiceIntTestSuite) createCountry(name string, capital models.City) *models.Country { - entity := &models.Country{ - Name: name, - Capital: capital, - } - err := ts.db.Create(entity).Error - ts.Nil(err) - - return entity -} - -func (ts *CRUDServiceIntTestSuite) createEmployee(name string, boss *models.Employee) *models.Employee { - entity := &models.Employee{ - Name: name, - Boss: boss, - } - err := ts.db.Create(entity).Error - ts.Nil(err) - - return entity -} - -func (ts *CRUDServiceIntTestSuite) createBicycle(name string, owner models.Person) *models.Bicycle { - entity := &models.Bicycle{ - Name: name, - Owner: owner, - } - err := ts.db.Create(entity).Error - ts.Nil(err) - - return entity -} diff --git a/testintegration/crudServiceCommon.go b/testintegration/crudServiceCommon.go new file mode 100644 index 00000000..69a6a5aa --- /dev/null +++ b/testintegration/crudServiceCommon.go @@ -0,0 +1,101 @@ +package testintegration + +import ( + "github.com/ditrit/badaas/testintegration/models" + "github.com/google/uuid" + "github.com/stretchr/testify/suite" + "gorm.io/gorm" +) + +type CRUDServiceCommonIntTestSuite struct { + suite.Suite + db *gorm.DB +} + +func (ts *CRUDServiceCommonIntTestSuite) SetupTest() { + CleanDB(ts.db) +} + +func (ts *CRUDServiceCommonIntTestSuite) createProduct(stringV string, intV int, floatV float64, boolV bool, intP *int) *models.Product { + entity := &models.Product{ + String: stringV, + Int: intV, + Float: floatV, + Bool: boolV, + IntPointer: intP, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceCommonIntTestSuite) createSale(code int, product *models.Product, seller *models.Seller) *models.Sale { + entity := &models.Sale{ + Code: code, + Product: *product, + Seller: seller, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceCommonIntTestSuite) createSeller(name string, company *models.Company) *models.Seller { + var companyID *uuid.UUID + if company != nil { + companyID = &company.ID + } + entity := &models.Seller{ + Name: name, + CompanyID: companyID, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceCommonIntTestSuite) createCompany(name string) *models.Company { + entity := &models.Company{ + Name: name, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceCommonIntTestSuite) createCountry(name string, capital models.City) *models.Country { + entity := &models.Country{ + Name: name, + Capital: capital, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceCommonIntTestSuite) createEmployee(name string, boss *models.Employee) *models.Employee { + entity := &models.Employee{ + Name: name, + Boss: boss, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceCommonIntTestSuite) createBicycle(name string, owner models.Person) *models.Bicycle { + entity := &models.Bicycle{ + Name: name, + Owner: owner, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} diff --git a/testintegration/crudUnsafeService.go b/testintegration/crudUnsafeService.go new file mode 100644 index 00000000..204b0d09 --- /dev/null +++ b/testintegration/crudUnsafeService.go @@ -0,0 +1,473 @@ +package testintegration + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/persistence/gormdatabase" + "github.com/ditrit/badaas/testintegration/models" + "github.com/google/uuid" + "gorm.io/gorm" +) + +type CRUDUnsafeServiceIntTestSuite struct { + CRUDServiceCommonIntTestSuite + crudProductService badorm.CRUDUnsafeService[models.Product, uuid.UUID] + crudSaleService badorm.CRUDUnsafeService[models.Sale, uuid.UUID] + crudSellerService badorm.CRUDUnsafeService[models.Seller, uuid.UUID] + crudCountryService badorm.CRUDUnsafeService[models.Country, uuid.UUID] + crudCityService badorm.CRUDUnsafeService[models.City, uuid.UUID] + crudEmployeeService badorm.CRUDUnsafeService[models.Employee, uuid.UUID] + crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, uuid.UUID] +} + +func NewCRUDUnsafeServiceIntTestSuite( + db *gorm.DB, + crudProductService badorm.CRUDUnsafeService[models.Product, uuid.UUID], + crudSaleService badorm.CRUDUnsafeService[models.Sale, uuid.UUID], + crudSellerService badorm.CRUDUnsafeService[models.Seller, uuid.UUID], + crudCountryService badorm.CRUDUnsafeService[models.Country, uuid.UUID], + crudCityService badorm.CRUDUnsafeService[models.City, uuid.UUID], + crudEmployeeService badorm.CRUDUnsafeService[models.Employee, uuid.UUID], + crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, uuid.UUID], +) *CRUDUnsafeServiceIntTestSuite { + return &CRUDUnsafeServiceIntTestSuite{ + CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ + db: db, + }, + crudProductService: crudProductService, + crudSaleService: crudSaleService, + crudSellerService: crudSellerService, + crudCountryService: crudCountryService, + crudCityService: crudCityService, + crudEmployeeService: crudEmployeeService, + crudBicycleService: crudBicycleService, + } +} + +// ------------------------- GetEntities -------------------------------- + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { + entities, err := ts.crudProductService.GetEntities(map[string]any{}) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { + match := ts.createProduct("", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities(map[string]any{}) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsReturnsTheListWhenMultipleCreated() { + match1 := ts.createProduct("", 0, 0, false, nil) + match2 := ts.createProduct("", 0, 0, false, nil) + match3 := ts.createProduct("", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities(map[string]any{}) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsReturnsEmptyIfNotEntitiesCreated() { + params := map[string]any{ + "string": "not_created", + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsReturnsEmptyIfNothingMatch() { + ts.createProduct("something_else", 0, 0, false, nil) + + params := map[string]any{ + "string": "not_match", + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsReturnsOneIfOnlyOneMatch() { + match := ts.createProduct("match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) + + params := map[string]any{ + "string": "match", + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsReturnsMultipleIfMultipleMatch() { + match1 := ts.createProduct("match", 0, 0, false, nil) + match2 := ts.createProduct("match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) + + params := map[string]any{ + "string": "match", + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatDoesNotExistReturnsDBError() { + ts.createProduct("match", 0, 0, false, nil) + + params := map[string]any{ + "not_exists": "not_exists", + } + _, err := ts.crudProductService.GetEntities(params) + ts.NotNil(err) + ts.True(gormdatabase.IsPostgresError(err, "42703")) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfIntType() { + match := ts.createProduct("match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + params := map[string]any{ + "int": 1, + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfIncorrectTypeReturnsDBError() { + ts.createProduct("not_match", 1, 0, false, nil) + + params := map[string]any{ + "int": "not_an_int", + } + _, err := ts.crudProductService.GetEntities(params) + ts.NotNil(err) + ts.True(gormdatabase.IsPostgresError(err, "22P02")) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfFloatType() { + match := ts.createProduct("match", 0, 1.1, false, nil) + ts.createProduct("not_match", 0, 2.2, false, nil) + + params := map[string]any{ + "float": 1.1, + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfBoolType() { + match := ts.createProduct("match", 0, 0.0, true, nil) + ts.createProduct("not_match", 0, 0.0, false, nil) + + params := map[string]any{ + "bool": true, + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfRelationType() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + params := map[string]any{ + "product_id": product1.ID.String(), + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithMultipleConditionsOfDifferentTypesWorks() { + match1 := ts.createProduct("match", 1, 0.0, true, nil) + match2 := ts.createProduct("match", 1, 0.0, true, nil) + + ts.createProduct("not_match", 1, 0.0, true, nil) + ts.createProduct("match", 2, 0.0, true, nil) + + params := map[string]any{ + "string": "match", + "int": 1, + "bool": true, + } + entities, err := ts.crudProductService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsBelongsTo() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, nil) + + params := map[string]any{ + "Product": map[string]any{ + "int": 1, + }, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsHasOneOptional() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + params := map[string]any{ + "Seller": map[string]any{ + "name": "franco", + }, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsHasOneSelfReferential() { + boss1 := &models.Employee{ + Name: "Xavier", + } + boss2 := &models.Employee{ + Name: "Vincent", + } + + match := ts.createEmployee("franco", boss1) + ts.createEmployee("pierre", boss2) + + params := map[string]any{ + "Boss": map[string]any{ + "name": "Xavier", + }, + } + entities, err := ts.crudEmployeeService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Employee{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsOneToOne() { + capital1 := models.City{ + Name: "Buenos Aires", + } + capital2 := models.City{ + Name: "Paris", + } + + ts.createCountry("Argentina", capital1) + ts.createCountry("France", capital2) + + params := map[string]any{ + "Country": map[string]any{ + "name": "Argentina", + }, + } + entities, err := ts.crudCityService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.City{&capital1}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsOneToOneReversed() { + capital1 := models.City{ + Name: "Buenos Aires", + } + capital2 := models.City{ + Name: "Paris", + } + + country1 := ts.createCountry("Argentina", capital1) + ts.createCountry("France", capital2) + + params := map[string]any{ + "Capital": map[string]any{ + "name": "Buenos Aires", + }, + } + entities, err := ts.crudCountryService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Country{country1}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsReturnsErrorIfNoRelation() { + params := map[string]any{ + "NotExists": map[string]any{ + "int": 1, + }, + } + _, err := ts.crudSaleService.GetEntities(params) + ts.ErrorContains(err, "Sale has not attribute named NotExists or NotExistsID") +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsWithEntityThatDefinesTableName() { + person1 := models.Person{ + Name: "franco", + } + person2 := models.Person{ + Name: "xavier", + } + + match := ts.createBicycle("BMX", person1) + ts.createBicycle("Shimano", person2) + + params := map[string]any{ + "Owner": map[string]any{ + "name": "franco", + }, + } + entities, err := ts.crudBicycleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Bicycle{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsOnHasMany() { + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + match := ts.createSeller("franco", company1) + ts.createSeller("agustin", company2) + + params := map[string]any{ + "Company": map[string]any{ + "name": "ditrit", + }, + } + entities, err := ts.crudSellerService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Seller{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsOnDifferentAttributes() { + product1 := ts.createProduct("match", 1, 0.0, false, nil) + product2 := ts.createProduct("match", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + params := map[string]any{ + "Product": map[string]any{ + "int": 1, + "string": "match", + }, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsAndFiltersTheMainEntity() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(1, product1, seller1) + ts.createSale(2, product2, seller2) + ts.createSale(2, product1, seller2) + + params := map[string]any{ + "Product": map[string]any{ + "int": 1, + }, + "code": 1, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsDifferentEntities() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + ts.createSale(0, product1, seller2) + ts.createSale(0, product2, seller1) + + params := map[string]any{ + "Product": map[string]any{ + "int": 1, + }, + "Seller": map[string]any{ + "name": "franco", + }, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsMultipleTimes() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + seller1 := ts.createSeller("franco", company1) + seller2 := ts.createSeller("agustin", company2) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + params := map[string]any{ + "Seller": map[string]any{ + "name": "franco", + "Company": map[string]any{ + "name": "ditrit", + }, + }, + } + entities, err := ts.crudSaleService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} diff --git a/testintegration/integration_test.go b/testintegration/integration_test.go index 83b5475a..61a066e4 100644 --- a/testintegration/integration_test.go +++ b/testintegration/integration_test.go @@ -56,16 +56,26 @@ func injectDependencies(cmd *cobra.Command, args []string) { services.EAVServiceModule, fx.Provide(NewEAVServiceIntTestSuite), - fx.Invoke(badorm.AddModel[models.Company]), badorm.GetCRUDServiceModule[models.Seller, uuid.UUID](), badorm.GetCRUDServiceModule[models.Product, uuid.UUID](), badorm.GetCRUDServiceModule[models.Sale, uuid.UUID](), badorm.GetCRUDServiceModule[models.City, uuid.UUID](), badorm.GetCRUDServiceModule[models.Country, uuid.UUID](), badorm.GetCRUDServiceModule[models.Employee, uuid.UUID](), - fx.Invoke(badorm.AddModel[models.Person]), badorm.GetCRUDServiceModule[models.Bicycle, uuid.UUID](), + + badorm.GetCRUDUnsafeServiceModule[models.Company, uuid.UUID](), + badorm.GetCRUDUnsafeServiceModule[models.Seller, uuid.UUID](), + badorm.GetCRUDUnsafeServiceModule[models.Product, uuid.UUID](), + badorm.GetCRUDUnsafeServiceModule[models.Sale, uuid.UUID](), + badorm.GetCRUDUnsafeServiceModule[models.City, uuid.UUID](), + badorm.GetCRUDUnsafeServiceModule[models.Country, uuid.UUID](), + badorm.GetCRUDUnsafeServiceModule[models.Employee, uuid.UUID](), + badorm.GetCRUDUnsafeServiceModule[models.Person, uuid.UUID](), + badorm.GetCRUDUnsafeServiceModule[models.Bicycle, uuid.UUID](), + fx.Provide(NewCRUDServiceIntTestSuite), + fx.Provide(NewCRUDUnsafeServiceIntTestSuite), fx.Provide(NewCRUDRepositoryIntTestSuite), fx.Invoke(runTestSuites), @@ -73,15 +83,17 @@ func injectDependencies(cmd *cobra.Command, args []string) { } func runTestSuites( - tsEAV *EAVServiceIntTestSuite, - tsCRUD *CRUDServiceIntTestSuite, + tsEAVService *EAVServiceIntTestSuite, + tsCRUDService *CRUDServiceIntTestSuite, tsCRUDRepository *CRUDRepositoryIntTestSuite, + tsCRUDUnsafeService *CRUDRepositoryIntTestSuite, db *gorm.DB, shutdowner fx.Shutdowner, ) { - suite.Run(tGlobal, tsEAV) - suite.Run(tGlobal, tsCRUD) + suite.Run(tGlobal, tsEAVService) + suite.Run(tGlobal, tsCRUDService) suite.Run(tGlobal, tsCRUDRepository) + suite.Run(tGlobal, tsCRUDUnsafeService) // let db cleaned CleanDB(db) diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 8c9dc6f5..679bf57a 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -137,7 +137,7 @@ func (m Employee) Equal(other Employee) bool { type Person struct { badorm.UUIDModel - Name string + Name string `gorm:"unique"` } func (m Person) TableName() string { From ff51d3505d511038d325312fb35cb167dec41901 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 31 May 2023 11:28:33 +0200 Subject: [PATCH 257/467] autodetermine id type --- badorm/ModuleFx.go | 118 ++++++++++++++++++++++------ router/ModuleFx.go | 6 +- testintegration/integration_test.go | 35 ++++----- 3 files changed, 111 insertions(+), 48 deletions(-) diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index 1a974a69..81a41808 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -2,8 +2,10 @@ package badorm import ( "fmt" + "log" "reflect" + "github.com/google/uuid" "go.uber.org/fx" ) @@ -23,36 +25,100 @@ var BaDORMModule = fx.Module( ), ) -func GetCRUDServiceModule[T any, ID BadaasID]() fx.Option { - // TODO verificar que sea un badorm module? - // TODO sacar solo cual es el id? - return fx.Module( - fmt.Sprintf( - "%TCRUDServiceModule", - *new(T), - ), - // repository - fx.Provide(NewCRUDRepository[T, ID]), - // service - fx.Provide(NewCRUDService[T, ID]), +func GetCRUDServiceModule[T any]() fx.Option { + entity := *new(T) + + moduleName := fmt.Sprintf( + "%TCRUDServiceModule", + entity, ) + + kind := getBaDORMModelKind(entity) + switch kind { + case KindUUIDModel: + return fx.Module( + moduleName, + // repository + fx.Provide(NewCRUDRepository[T, uuid.UUID]), + // service + fx.Provide(NewCRUDService[T, uuid.UUID]), + ) + case KindUIntModel: + return fx.Module( + moduleName, + // repository + fx.Provide(NewCRUDRepository[T, uint]), + // service + fx.Provide(NewCRUDService[T, uint]), + ) + default: + log.Printf("type %T is not a BaDORM Module\n", entity) + return fx.Invoke(failNotBadORMModule()) + } } -func GetCRUDUnsafeServiceModule[T any, ID BadaasID]() fx.Option { - // TODO verificar que sea un badorm module? - // TODO sacar solo cual es el id? - return fx.Module( - fmt.Sprintf( - "%TCRUDUnsafeServiceModule", - *new(T), - ), - // models - fx.Invoke(AddUnsafeModel[T]), - // repository - fx.Provide(NewCRUDUnsafeRepository[T, ID]), - // service - fx.Provide(NewCRUDUnsafeService[T, ID]), +func failNotBadORMModule() error { + return fmt.Errorf("type is not a BaDORM Module") +} + +func GetCRUDUnsafeServiceModule[T any]() fx.Option { + entity := *new(T) + + moduleName := fmt.Sprintf( + "%TCRUDUnsafeServiceModule", + entity, ) + + kind := getBaDORMModelKind(entity) + switch kind { + case KindUUIDModel: + return fx.Module( + moduleName, + // models + fx.Invoke(AddUnsafeModel[T]), + // repository + fx.Provide(NewCRUDUnsafeRepository[T, uuid.UUID]), + // service + fx.Provide(NewCRUDUnsafeService[T, uuid.UUID]), + ) + case KindUIntModel: + return fx.Module( + moduleName, + // models + fx.Invoke(AddUnsafeModel[T]), + // repository + fx.Provide(NewCRUDUnsafeRepository[T, uint]), + // service + fx.Provide(NewCRUDUnsafeService[T, uint]), + ) + default: + log.Printf("type %T is not a BaDORM Module\n", entity) + return fx.Invoke(failNotBadORMModule()) + } +} + +type BadORMModelKind uint + +const ( + KindUUIDModel BadORMModelKind = iota + KindUIntModel + KindNotBaDORMModel +) + +func getBaDORMModelKind(entity any) BadORMModelKind { + entityType := getEntityType(entity) + + _, isUUIDModel := entityType.FieldByName("UUIDModel") + if isUUIDModel { + return KindUUIDModel + } + + _, isUIntModel := entityType.FieldByName("UIntModel") + if isUIntModel { + return KindUIntModel + } + + return KindNotBaDORMModel } var modelsMapping = map[string]reflect.Type{} diff --git a/router/ModuleFx.go b/router/ModuleFx.go index bd70bce0..90901ddb 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -7,7 +7,6 @@ import ( "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/router/middlewares" "github.com/ditrit/badaas/services" - "github.com/google/uuid" "go.uber.org/fx" ) @@ -75,9 +74,8 @@ func GetCRUDRoutesModule[T any]() fx.Option { return fx.Module( typeName+"CRUDRoutesModule", // service - // TODO ver este uuid - badorm.GetCRUDServiceModule[T, uuid.UUID](), - badorm.GetCRUDUnsafeServiceModule[T, uuid.UUID](), + badorm.GetCRUDServiceModule[T](), + badorm.GetCRUDUnsafeServiceModule[T](), // controller fx.Provide( diff --git a/testintegration/integration_test.go b/testintegration/integration_test.go index 61a066e4..991fb0b7 100644 --- a/testintegration/integration_test.go +++ b/testintegration/integration_test.go @@ -11,7 +11,6 @@ import ( "github.com/ditrit/badaas/services" "github.com/ditrit/badaas/testintegration/models" "github.com/ditrit/verdeter" - "github.com/google/uuid" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/stretchr/testify/suite" @@ -56,23 +55,23 @@ func injectDependencies(cmd *cobra.Command, args []string) { services.EAVServiceModule, fx.Provide(NewEAVServiceIntTestSuite), - badorm.GetCRUDServiceModule[models.Seller, uuid.UUID](), - badorm.GetCRUDServiceModule[models.Product, uuid.UUID](), - badorm.GetCRUDServiceModule[models.Sale, uuid.UUID](), - badorm.GetCRUDServiceModule[models.City, uuid.UUID](), - badorm.GetCRUDServiceModule[models.Country, uuid.UUID](), - badorm.GetCRUDServiceModule[models.Employee, uuid.UUID](), - badorm.GetCRUDServiceModule[models.Bicycle, uuid.UUID](), - - badorm.GetCRUDUnsafeServiceModule[models.Company, uuid.UUID](), - badorm.GetCRUDUnsafeServiceModule[models.Seller, uuid.UUID](), - badorm.GetCRUDUnsafeServiceModule[models.Product, uuid.UUID](), - badorm.GetCRUDUnsafeServiceModule[models.Sale, uuid.UUID](), - badorm.GetCRUDUnsafeServiceModule[models.City, uuid.UUID](), - badorm.GetCRUDUnsafeServiceModule[models.Country, uuid.UUID](), - badorm.GetCRUDUnsafeServiceModule[models.Employee, uuid.UUID](), - badorm.GetCRUDUnsafeServiceModule[models.Person, uuid.UUID](), - badorm.GetCRUDUnsafeServiceModule[models.Bicycle, uuid.UUID](), + badorm.GetCRUDServiceModule[models.Seller](), + badorm.GetCRUDServiceModule[models.Product](), + badorm.GetCRUDServiceModule[models.Sale](), + badorm.GetCRUDServiceModule[models.City](), + badorm.GetCRUDServiceModule[models.Country](), + badorm.GetCRUDServiceModule[models.Employee](), + badorm.GetCRUDServiceModule[models.Bicycle](), + + badorm.GetCRUDUnsafeServiceModule[models.Company](), + badorm.GetCRUDUnsafeServiceModule[models.Seller](), + badorm.GetCRUDUnsafeServiceModule[models.Product](), + badorm.GetCRUDUnsafeServiceModule[models.Sale](), + badorm.GetCRUDUnsafeServiceModule[models.City](), + badorm.GetCRUDUnsafeServiceModule[models.Country](), + badorm.GetCRUDUnsafeServiceModule[models.Employee](), + badorm.GetCRUDUnsafeServiceModule[models.Person](), + badorm.GetCRUDUnsafeServiceModule[models.Bicycle](), fx.Provide(NewCRUDServiceIntTestSuite), fx.Provide(NewCRUDUnsafeServiceIntTestSuite), From 3987b9ca671636f44e870ff0f22f9e3cecf3d4fa Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 31 May 2023 14:54:18 +0200 Subject: [PATCH 258/467] be able to choose between cockroach and postgresql for int tests --- .github/workflows/CI.yml | 11 +-- CONTRIBUTING.md | 3 - Makefile | 6 +- badorm/badorm.go | 52 ++++++++++++++ .../docker-compose.yml | 11 ++- docker/{test_db => cockroachdb}/logs.yaml | 0 docker/postgresql/docker-compose.yml | 20 ++++++ docker/postgresql/init.sql | 1 + docker/test_api/docker-compose.yml | 3 +- docker/test_db/init.sh | 32 --------- docker/wait_for_db.sh | 6 ++ go.sum | 2 - logger/log.go | 4 +- persistence/gormdatabase/db.go | 47 ++----------- testintegration/badaas_test.go | 70 +++++++++++++++++++ .../{integration_test.go => badorm_test.go} | 59 ++++++---------- testintegration/crudRepository.go | 4 -- testintegration/int_test_config.yml | 8 +-- 18 files changed, 201 insertions(+), 138 deletions(-) rename docker/{test_db => cockroachdb}/docker-compose.yml (53%) rename docker/{test_db => cockroachdb}/logs.yaml (100%) create mode 100644 docker/postgresql/docker-compose.yml create mode 100644 docker/postgresql/init.sql delete mode 100755 docker/test_db/init.sh create mode 100755 docker/wait_for_db.sh create mode 100644 testintegration/badaas_test.go rename testintegration/{integration_test.go => badorm_test.go} (64%) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 3848e23a..3235d52e 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -40,6 +40,7 @@ jobs: skip-build-cache: true go-sec: + needs: [branch-naming-rules] runs-on: ubuntu-latest env: GO111MODULE: on @@ -73,7 +74,7 @@ jobs: integration-tests: name: Integration tests - needs: [branch-naming-rules] + needs: [unit-tests] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -91,7 +92,7 @@ jobs: path: coverage_int.out - name: Stop containers if: always() - run: docker compose -f "docker/test_db/docker-compose.yml" down + run: docker stop badaas-test-db e2e-tests: name: E2E Tests @@ -106,7 +107,7 @@ jobs: go-version: '^1.18' cache: true - name: Start containers - run: docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" up -d --build + run: docker compose -f "docker/cockroachdb/docker-compose.yml" -f "docker/test_api/docker-compose.yml" up -d --build - name: Wait for API server to be up uses: mydea/action-wait-for-api@v1 with: @@ -116,10 +117,10 @@ jobs: run: go test ./test_e2e -v - name: Get logs if: always() - run: docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" logs --no-color 2>&1 | tee app.log & + run: docker compose -f "docker/cockroachdb/docker-compose.yml" -f "docker/test_api/docker-compose.yml" logs --no-color 2>&1 | tee app.log & - name: Stop containers if: always() - run: docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" down + run: docker compose -f "docker/cockroachdb/docker-compose.yml" -f "docker/test_api/docker-compose.yml" down - uses: actions/upload-artifact@v3 with: name: docker-compose-e2e-logs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 34d03c60..77748c45 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,9 +68,6 @@ This is the directory structure we use for the project: - `router/` *(Go code)*: Contains http router of badaas and the routes that can be added by the user. - `middlewares/` *(Go code)*: Contains the various http middlewares that we use. - `docker/` : Contains the docker, docker-compose file and configuration files for different environments. - - `api/` : Contains the Dockerfile to build badaas with a dedicated config file. - - `test_db/` : Contains the Dockerfile to build a development/test version of CockroachDB. - - `test_api/` : Contains files to build a development/test version of the api. - `services/` *(Go code)*: Contains services. - `auth/protocols/`: Contains the implementations of authentication clients for different protocols. - `basicauth/` *(Go code)*: Handle the authentication using email/password. diff --git a/Makefile b/Makefile index ac909dad..b7af4a25 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,8 @@ test_unit_and_cover: go test $(PATHS) -coverpkg=./... -coverprofile=coverage_unit.out -v test_db: - docker compose -f "docker/test_db/docker-compose.yml" up -d - ./docker/wait_for_api.sh 8080/health + docker compose -f "docker/postgresql/docker-compose.yml" up -d + ./docker/wait_for_db.sh test_integration: test_db go test ./testintegration -v @@ -17,7 +17,7 @@ test_integration_and_cover: test_db go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v test_e2e: - docker compose -f "docker/test_db/docker-compose.yml" -f "docker/test_api/docker-compose.yml" up -d + docker compose -f "docker/cockroachdb/docker-compose.yml" -f "docker/test_api/docker-compose.yml" up -d ./docker/wait_for_api.sh 8000/info go test ./test_e2e -v diff --git a/badorm/badorm.go b/badorm/badorm.go index 2446ecbe..3d39db98 100644 --- a/badorm/badorm.go +++ b/badorm/badorm.go @@ -1,7 +1,12 @@ package badorm import ( + "time" + + "github.com/ditrit/badaas/persistence/gormdatabase/gormzap" "github.com/elliotchance/pie/v2" + "go.uber.org/zap" + "gorm.io/driver/postgres" "gorm.io/gorm" ) @@ -14,3 +19,50 @@ func autoMigrate(modelsLists [][]any, db *gorm.DB) error { allModels := pie.Flat(modelsLists) return db.AutoMigrate(allModels...) } + +func ConnectToDSN( + logger *zap.Logger, + dsn string, + retryAmount uint, + retryTime time.Duration, +) (*gorm.DB, error) { + var err error + var database *gorm.DB + for numberRetry := uint(0); numberRetry < retryAmount; numberRetry++ { + database, err = initializeDBFromDsn(dsn, logger) + if err == nil { + logger.Sugar().Debugf("Database connection is active") + return database, nil + } + logger.Sugar().Debugf("Database connection failed with error %q", err.Error()) + logger.Sugar().Debugf( + "Retrying database connection %d/%d in %s", + numberRetry+1, retryAmount, retryTime.String(), + ) + time.Sleep(retryTime) + } + + return nil, err +} + +// Initialize the database with the dsn string +func initializeDBFromDsn(dsn string, logger *zap.Logger) (*gorm.DB, error) { + database, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ + Logger: gormzap.New(logger), + }) + + if err != nil { + return nil, err + } + + rawDatabase, err := database.DB() + if err != nil { + return nil, err + } + // ping the underlying database + err = rawDatabase.Ping() + if err != nil { + return nil, err + } + return database, nil +} diff --git a/docker/test_db/docker-compose.yml b/docker/cockroachdb/docker-compose.yml similarity index 53% rename from docker/test_db/docker-compose.yml rename to docker/cockroachdb/docker-compose.yml index b937793b..7b743183 100644 --- a/docker/test_db/docker-compose.yml +++ b/docker/cockroachdb/docker-compose.yml @@ -8,10 +8,15 @@ services: volumes: - .:/cockroach/files working_dir: /cockroach - entrypoint: ./files/init.sh + entrypoint: /cockroach/cockroach.sh start-single-node --insecure --log-config-file=files/logs.yaml ports: - - "26257:26257" + - "5000:26257" - "8080:8080" # Web based dashboard environment: - - COCKROACH_USER=root + - COCKROACH_USER=badaas - COCKROACH_DATABASE=badaas_db + healthcheck: + test: curl --fail http://localhost:8080 || exit 1 + interval: 10s + timeout: 5s + retries: 5 diff --git a/docker/test_db/logs.yaml b/docker/cockroachdb/logs.yaml similarity index 100% rename from docker/test_db/logs.yaml rename to docker/cockroachdb/logs.yaml diff --git a/docker/postgresql/docker-compose.yml b/docker/postgresql/docker-compose.yml new file mode 100644 index 00000000..201fe3ca --- /dev/null +++ b/docker/postgresql/docker-compose.yml @@ -0,0 +1,20 @@ +version: '3.5' + +services: + db: + container_name: "badaas-test-db" + image: postgres:latest + environment: + POSTGRES_USER: badaas + POSTGRES_PASSWORD: badaas + POSTGRES_DB: badaas_db + PGDATA: /data/postgres + ports: + - "5000:5432" + volumes: + - .:/docker-entrypoint-initdb.d/ + healthcheck: + test: ["CMD-SHELL", "pg_isready"] + interval: 10s + timeout: 5s + retries: 5 \ No newline at end of file diff --git a/docker/postgresql/init.sql b/docker/postgresql/init.sql new file mode 100644 index 00000000..982ad984 --- /dev/null +++ b/docker/postgresql/init.sql @@ -0,0 +1 @@ +CREATE EXTENSION "uuid-ossp"; \ No newline at end of file diff --git a/docker/test_api/docker-compose.yml b/docker/test_api/docker-compose.yml index 2a6e0173..6796447c 100644 --- a/docker/test_api/docker-compose.yml +++ b/docker/test_api/docker-compose.yml @@ -15,4 +15,5 @@ services: - "8000:8000" restart: always depends_on: - - db + db: + condition: service_healthy diff --git a/docker/test_db/init.sh b/docker/test_db/init.sh deleted file mode 100755 index 3f65962b..00000000 --- a/docker/test_db/init.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -set -e - -echo "******************************* Listing Env Variables..." -printenv -echo "******************************* Starting single cockroach node..." - -./cockroach start-single-node --insecure --log-config-file=files/logs.yaml --background - -echo "******************************* Init database" -echo "******************************* |=> Creating init.sql" - -cat > init.sql < Applying init.sql" - -./cockroach sql --insecure --file init.sql - -echo "******************************* To the moon" - -# tail logs to make them accesible with docker logs -tail -f cockroach-data/logs/cockroach.log \ No newline at end of file diff --git a/docker/wait_for_db.sh b/docker/wait_for_db.sh new file mode 100755 index 00000000..04263a18 --- /dev/null +++ b/docker/wait_for_db.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +until [ "`docker inspect -f {{.State.Health.Status}} badaas-test-db`"=="healthy" ]; do + printf '.'; + sleep 1; +done; \ No newline at end of file diff --git a/go.sum b/go.sum index 2ea44d8a..3d018bd6 100644 --- a/go.sum +++ b/go.sum @@ -691,8 +691,6 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc= gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg= gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.24.1 h1:CgvzRniUdG67hBAzsxDGOAuq4Te1osVMYsa1eQbd4fs= -gorm.io/gorm v1.24.1/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= diff --git a/logger/log.go b/logger/log.go index 9170f8e4..725daec2 100644 --- a/logger/log.go +++ b/logger/log.go @@ -18,17 +18,17 @@ func NewLogger(conf configuration.LoggerConfiguration) *zap.Logger { if conf.GetMode() == ProductionLogger { config = zap.NewProductionConfig() log.Printf("Log mode use: %s\n", ProductionLogger) - } else { config = zap.NewDevelopmentConfig() log.Printf("Log mode use: %s\n", DevelopmentLogger) - } + config.DisableStacktrace = true logger, err := config.Build() if err != nil { panic(err) } + logger.Info("The logger was successfully initialized") return logger } diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index 5b8d4450..2b21b501 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -2,12 +2,10 @@ package gormdatabase import ( "fmt" - "time" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/persistence/gormdatabase/gormzap" "go.uber.org/zap" - "gorm.io/driver/postgres" "gorm.io/gorm" ) @@ -37,41 +35,10 @@ func SetupDatabaseConnection( databaseConfiguration configuration.DatabaseConfiguration, ) (*gorm.DB, error) { dsn := createDsnFromConf(databaseConfiguration) - var err error - var database *gorm.DB - for numberRetry := uint(0); numberRetry < databaseConfiguration.GetRetry(); numberRetry++ { - database, err = initializeDBFromDsn(dsn, logger) - if err == nil { - logger.Sugar().Debugf("Database connection is active") - return database, nil - } - logger.Sugar().Debugf("Database connection failed with error %q", err.Error()) - logger.Sugar().Debugf("Retrying database connection %d/%d in %s", - numberRetry+1, databaseConfiguration.GetRetry(), databaseConfiguration.GetRetryTime().String()) - time.Sleep(databaseConfiguration.GetRetryTime()) - } - - return nil, err -} - -// Initialize the database with the dsn string -func initializeDBFromDsn(dsn string, logger *zap.Logger) (*gorm.DB, error) { - database, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ - Logger: gormzap.New(logger), - }) - - if err != nil { - return nil, err - } - - rawDatabase, err := database.DB() - if err != nil { - return nil, err - } - // ping the underlying database - err = rawDatabase.Ping() - if err != nil { - return nil, err - } - return database, nil + return badorm.ConnectToDSN( + logger, + dsn, + databaseConfiguration.GetRetry(), + databaseConfiguration.GetRetryTime(), + ) } diff --git a/testintegration/badaas_test.go b/testintegration/badaas_test.go new file mode 100644 index 00000000..389b40f7 --- /dev/null +++ b/testintegration/badaas_test.go @@ -0,0 +1,70 @@ +package testintegration + +import ( + "path" + "path/filepath" + "runtime" + "testing" + + "github.com/ditrit/badaas" + "github.com/ditrit/badaas/services" + "github.com/ditrit/verdeter" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/stretchr/testify/suite" + "go.uber.org/fx" + "go.uber.org/fx/fxevent" + "go.uber.org/zap" + "gorm.io/gorm" +) + +var tGlobal *testing.T + +var testsCommand = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Run: injectDependencies, +}) + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestBaDaaS(t *testing.T) { + _, b, _, _ := runtime.Caller(0) + basePath := filepath.Dir(b) + viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) + err := badaas.ConfigCommandParameters(testsCommand) + if err != nil { + panic(err) + } + + tGlobal = t + + testsCommand.Execute() +} + +func injectDependencies(cmd *cobra.Command, args []string) { + fx.New( + fx.Provide(GetModels), + badaas.BadaasModule, + + // logger for fx + fx.WithLogger(func(logger *zap.Logger) fxevent.Logger { + return &fxevent.ZapLogger{Logger: logger} + }), + + services.EAVServiceModule, + fx.Provide(NewEAVServiceIntTestSuite), + + fx.Invoke(runBaDaaSTestSuites), + ).Run() +} + +func runBaDaaSTestSuites( + tsEAVService *EAVServiceIntTestSuite, + db *gorm.DB, + shutdowner fx.Shutdowner, +) { + suite.Run(tGlobal, tsEAVService) + + // let db cleaned + CleanDB(db) + shutdowner.Shutdown() +} diff --git a/testintegration/integration_test.go b/testintegration/badorm_test.go similarity index 64% rename from testintegration/integration_test.go rename to testintegration/badorm_test.go index 991fb0b7..89ec33fa 100644 --- a/testintegration/integration_test.go +++ b/testintegration/badorm_test.go @@ -1,17 +1,13 @@ package testintegration import ( - "path" - "path/filepath" - "runtime" "testing" + "time" - "github.com/ditrit/badaas" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/services" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/logger" "github.com/ditrit/badaas/testintegration/models" - "github.com/ditrit/verdeter" - "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/stretchr/testify/suite" "go.uber.org/fx" @@ -20,41 +16,19 @@ import ( "gorm.io/gorm" ) -var tGlobal *testing.T - -var testsCommand = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ - Run: injectDependencies, -}) - -// In order for 'go test' to run this suite, we need to create -// a normal test function and pass our suite to suite.Run -func TestAll(t *testing.T) { - _, b, _, _ := runtime.Caller(0) - basePath := filepath.Dir(b) - viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) - err := badaas.ConfigCommandParameters(testsCommand) - if err != nil { - panic(err) - } - - tGlobal = t - - testsCommand.Execute() -} - -func injectDependencies(cmd *cobra.Command, args []string) { +func TestBaDORM(t *testing.T) { fx.New( + fx.Provide(NewLoggerConfiguration), + logger.LoggerModule, + fx.Provide(NewGormDBConnection), fx.Provide(GetModels), - badaas.BadaasModule, + badorm.BaDORMModule, // logger for fx fx.WithLogger(func(logger *zap.Logger) fxevent.Logger { return &fxevent.ZapLogger{Logger: logger} }), - services.EAVServiceModule, - fx.Provide(NewEAVServiceIntTestSuite), - badorm.GetCRUDServiceModule[models.Seller](), badorm.GetCRUDServiceModule[models.Product](), badorm.GetCRUDServiceModule[models.Sale](), @@ -77,19 +51,17 @@ func injectDependencies(cmd *cobra.Command, args []string) { fx.Provide(NewCRUDUnsafeServiceIntTestSuite), fx.Provide(NewCRUDRepositoryIntTestSuite), - fx.Invoke(runTestSuites), + fx.Invoke(runBaDORMTestSuites), ).Run() } -func runTestSuites( - tsEAVService *EAVServiceIntTestSuite, +func runBaDORMTestSuites( tsCRUDService *CRUDServiceIntTestSuite, tsCRUDRepository *CRUDRepositoryIntTestSuite, tsCRUDUnsafeService *CRUDRepositoryIntTestSuite, db *gorm.DB, shutdowner fx.Shutdowner, ) { - suite.Run(tGlobal, tsEAVService) suite.Run(tGlobal, tsCRUDService) suite.Run(tGlobal, tsCRUDRepository) suite.Run(tGlobal, tsCRUDUnsafeService) @@ -98,3 +70,14 @@ func runTestSuites( CleanDB(db) shutdowner.Shutdown() } + +func NewLoggerConfiguration() configuration.LoggerConfiguration { + viper.Set(configuration.LoggerModeKey, "dev") + return configuration.NewLoggerConfiguration() +} + +func NewGormDBConnection(logger *zap.Logger) (*gorm.DB, error) { + dsn := "user=badaas password=badaas host=localhost port=5000 sslmode=disable dbname=badaas_db" + // TODO codigo repetido en el ejemplo pero sin el logger + return badorm.ConnectToDSN(logger, dsn, 10, time.Duration(5)*time.Second) +} diff --git a/testintegration/crudRepository.go b/testintegration/crudRepository.go index df80ff16..ad89193f 100644 --- a/testintegration/crudRepository.go +++ b/testintegration/crudRepository.go @@ -6,25 +6,21 @@ import ( "github.com/ditrit/badaas/testintegration/models" "github.com/google/uuid" "github.com/stretchr/testify/suite" - "go.uber.org/zap" "gorm.io/gorm" "gotest.tools/assert" ) type CRUDRepositoryIntTestSuite struct { suite.Suite - logger *zap.Logger db *gorm.DB crudProductRepository badorm.CRUDRepository[models.Product, uuid.UUID] } func NewCRUDRepositoryIntTestSuite( - logger *zap.Logger, db *gorm.DB, crudProductRepository badorm.CRUDRepository[models.Product, uuid.UUID], ) *CRUDRepositoryIntTestSuite { return &CRUDRepositoryIntTestSuite{ - logger: logger, db: db, crudProductRepository: crudProductRepository, } diff --git a/testintegration/int_test_config.yml b/testintegration/int_test_config.yml index 8336400d..6d4e7d30 100644 --- a/testintegration/int_test_config.yml +++ b/testintegration/int_test_config.yml @@ -1,11 +1,9 @@ database: host: localhost - port: 26257 # cockroach - # port: 5432 # postgree + port: 5000 sslmode: disable - username: root # cockroach - # username: postgres # postgree - password: postgres + username: badaas + password: badaas name: badaas_db init: retry: 10 From 0a230beedcdb3e2340a4d564053654a300647610 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 12:23:40 +0200 Subject: [PATCH 259/467] make uuidModel usable on mysql (eav not working yet) --- Makefile | 26 +++++- badaas.go | 11 +++ badorm/ModuleFx.go | 9 +-- badorm/badorm.go | 52 ------------ badorm/baseModels.go | 74 ++++++++++++++++- badorm/crudService.go | 3 +- badorm/crudUnsafeService.go | 3 +- badorm/db.go | 67 ++++++++++++++++ badorm/db_test.go | 37 +++++++++ configuration/DatabaseConfiguration.go | 18 +++++ controllers/basicAuth_test.go | 2 +- controllers/crud.go | 9 +-- controllers/crud_test.go | 45 ++++++----- controllers/eav.go | 7 +- controllers/eav_test.go | 23 +++--- controllers/utils.go | 9 ++- docker/mysql/docker-compose.yml | 19 +++++ docker/postgresql/docker-compose.yml | 1 + docker/postgresql/init.sql | 2 +- go.mod | 3 +- go.sum | 4 + go.work.sum | 4 +- mocks/services/EAVService.go | 24 +++--- .../services/sessionservice/SessionService.go | 16 ++-- persistence/gormdatabase/db.go | 45 ++++++----- persistence/gormdatabase/db_test.go | 35 -------- persistence/models/Attribute.go | 7 +- persistence/models/Entity.go | 3 +- persistence/models/Entity_test.go | 2 +- persistence/models/Session.go | 7 +- persistence/models/Value.go | 13 ++- persistence/models/Value_test.go | 8 +- persistence/repository/EntityRepository.go | 23 +++--- .../repository/EntityRepository_test.go | 32 ++++---- .../repository/EntityTypeRepository.go | 4 +- persistence/repository/ValueRepository.go | 25 +++--- .../middlewares/middlewareAuthentication.go | 5 +- services/ModuleFx.go | 5 +- services/eav.go | 15 ++-- services/sessionservice/session.go | 23 +++--- services/sessionservice/session_test.go | 80 +++++++++---------- services/sessionservice/sessionctx.go | 6 +- services/sessionservice/sessionctx_test.go | 5 +- services/userservice/userservice.go | 5 +- services/userservice/userservice_test.go | 13 ++- testintegration/badaas_test.go | 5 +- testintegration/badorm_test.go | 38 +++++++-- .../conditions/bicycle_conditions.go | 3 +- testintegration/conditions/city_conditions.go | 5 +- .../conditions/company_conditions.go | 3 +- .../conditions/country_conditions.go | 3 +- .../conditions/employee_conditions.go | 5 +- .../conditions/person_conditions.go | 3 +- .../conditions/product_conditions.go | 10 +-- testintegration/conditions/sale_conditions.go | 7 +- .../conditions/seller_conditions.go | 5 +- testintegration/crudRepository.go | 10 ++- testintegration/crudService.go | 54 ++++--------- testintegration/crudServiceCommon.go | 8 +- testintegration/crudUnsafeService.go | 29 ++++--- testintegration/db_models.go | 25 +++--- testintegration/eavService.go | 35 +++++--- testintegration/models/models.go | 34 ++++---- tools/badctl/cmd/gen/docker/postgres/init.sql | 2 +- 64 files changed, 642 insertions(+), 471 deletions(-) create mode 100644 badorm/db.go create mode 100644 badorm/db_test.go create mode 100644 docker/mysql/docker-compose.yml delete mode 100644 persistence/gormdatabase/db_test.go diff --git a/Makefile b/Makefile index b7af4a25..f3be429a 100644 --- a/Makefile +++ b/Makefile @@ -6,13 +6,33 @@ test_unit: test_unit_and_cover: go test $(PATHS) -coverpkg=./... -coverprofile=coverage_unit.out -v -test_db: +rmdb: + docker stop badaas-test-db && docker rm badaas-test-db + +postgresql: docker compose -f "docker/postgresql/docker-compose.yml" up -d ./docker/wait_for_db.sh -test_integration: test_db - go test ./testintegration -v +cockroachdb: + docker compose -f "docker/cockroachdb/docker-compose.yml" up -d + ./docker/wait_for_db.sh + +mysql: + docker compose -f "docker/mysql/docker-compose.yml" up -d + ./docker/wait_for_db.sh + +test_integration_postgresql: postgresql + DB=postgresql go test ./testintegration -v + +test_integration_cockroachdb: cockroachdb + DB=postgresql go test ./testintegration -v + +test_integration_mysql: mysql + DB=mysql go test ./testintegration -v + +test_integration: test_integration_postgresql +# TODO test_integration_and_cover: test_db go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v diff --git a/badaas.go b/badaas.go index 34abcd92..4b81518b 100644 --- a/badaas.go +++ b/badaas.go @@ -104,6 +104,17 @@ func configDatabaseParameters(cfg *verdeter.VerdeterCommand) error { } cfg.SetDefault(configuration.DatabaseRetryDurationKey, uint(5)) + err = cfg.GKey(configuration.DatabaseDialectorKey, verdeter.IsStr, "", "The dialector to use to connect with the database server") + if err != nil { + return err + } + cfg.SetRequired(configuration.DatabaseDialectorKey) + // TODO + // cfg.AddValidator( + // configuration.DatabaseDialectorKey, + // validators.AuthorizedValues(configuration.DBDialectors...), + // ) + return nil } diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index 81a41808..46e33f86 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -5,7 +5,6 @@ import ( "log" "reflect" - "github.com/google/uuid" "go.uber.org/fx" ) @@ -39,9 +38,9 @@ func GetCRUDServiceModule[T any]() fx.Option { return fx.Module( moduleName, // repository - fx.Provide(NewCRUDRepository[T, uuid.UUID]), + fx.Provide(NewCRUDRepository[T, UUID]), // service - fx.Provide(NewCRUDService[T, uuid.UUID]), + fx.Provide(NewCRUDService[T, UUID]), ) case KindUIntModel: return fx.Module( @@ -77,9 +76,9 @@ func GetCRUDUnsafeServiceModule[T any]() fx.Option { // models fx.Invoke(AddUnsafeModel[T]), // repository - fx.Provide(NewCRUDUnsafeRepository[T, uuid.UUID]), + fx.Provide(NewCRUDUnsafeRepository[T, UUID]), // service - fx.Provide(NewCRUDUnsafeService[T, uuid.UUID]), + fx.Provide(NewCRUDUnsafeService[T, UUID]), ) case KindUIntModel: return fx.Module( diff --git a/badorm/badorm.go b/badorm/badorm.go index 3d39db98..2446ecbe 100644 --- a/badorm/badorm.go +++ b/badorm/badorm.go @@ -1,12 +1,7 @@ package badorm import ( - "time" - - "github.com/ditrit/badaas/persistence/gormdatabase/gormzap" "github.com/elliotchance/pie/v2" - "go.uber.org/zap" - "gorm.io/driver/postgres" "gorm.io/gorm" ) @@ -19,50 +14,3 @@ func autoMigrate(modelsLists [][]any, db *gorm.DB) error { allModels := pie.Flat(modelsLists) return db.AutoMigrate(allModels...) } - -func ConnectToDSN( - logger *zap.Logger, - dsn string, - retryAmount uint, - retryTime time.Duration, -) (*gorm.DB, error) { - var err error - var database *gorm.DB - for numberRetry := uint(0); numberRetry < retryAmount; numberRetry++ { - database, err = initializeDBFromDsn(dsn, logger) - if err == nil { - logger.Sugar().Debugf("Database connection is active") - return database, nil - } - logger.Sugar().Debugf("Database connection failed with error %q", err.Error()) - logger.Sugar().Debugf( - "Retrying database connection %d/%d in %s", - numberRetry+1, retryAmount, retryTime.String(), - ) - time.Sleep(retryTime) - } - - return nil, err -} - -// Initialize the database with the dsn string -func initializeDBFromDsn(dsn string, logger *zap.Logger) (*gorm.DB, error) { - database, err := gorm.Open(postgres.Open(dsn), &gorm.Config{ - Logger: gormzap.New(logger), - }) - - if err != nil { - return nil, err - } - - rawDatabase, err := database.DB() - if err != nil { - return nil, err - } - // ping the underlying database - err = rawDatabase.Ping() - if err != nil { - return nil, err - } - return database, nil -} diff --git a/badorm/baseModels.go b/badorm/baseModels.go index fad0d382..8cd01ee4 100644 --- a/badorm/baseModels.go +++ b/badorm/baseModels.go @@ -1,16 +1,18 @@ package badorm import ( + "database/sql/driver" "time" "github.com/google/uuid" "gorm.io/gorm" + "gorm.io/gorm/schema" ) // supported types for model identifier type BadaasID interface { - uint | uuid.UUID + uint | UUID } // Base Model for gorm @@ -18,10 +20,78 @@ type BadaasID interface { // Every model intended to be saved in the database must embed this badorm.UUIDModel // reference: https://gorm.io/docs/models.html#gorm-Model type UUIDModel struct { - ID uuid.UUID `gorm:"primarykey;type:uuid;default:uuid_generate_v4()"` + ID UUID `gorm:"primarykey;"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` } +func (model *UUIDModel) BeforeCreate(tx *gorm.DB) (err error) { + if model.ID == UUID(uuid.Nil) { + model.ID = UUID(uuid.New()) + } + return nil +} + type UIntModel gorm.Model + +type UUID uuid.UUID + +func (id UUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "mysql": + return "varchar(36)" + // return "binary(16)" + case "postgres": + return "uuid" + } + return "" +} + +func (id UUID) String() string { + return uuid.UUID(id).String() +} + +func (id UUID) URN() string { + return uuid.UUID(id).URN() +} + +func (id UUID) Variant() uuid.Variant { + return uuid.UUID(id).Variant() +} + +func (id UUID) Version() uuid.Version { + return uuid.UUID(id).Version() +} + +func (id UUID) MarshalText() ([]byte, error) { + return uuid.UUID(id).MarshalText() +} + +func (id *UUID) UnmarshalText(data []byte) error { + return (*uuid.UUID)(id).UnmarshalText(data) +} + +func (id UUID) MarshalBinary() ([]byte, error) { + return uuid.UUID(id).MarshalBinary() +} + +func (id *UUID) UnmarshalBinary(data []byte) error { + return (*uuid.UUID)(id).UnmarshalBinary(data) +} + +func (id *UUID) Scan(src interface{}) error { + return (*uuid.UUID)(id).Scan(src) +} + +func (id UUID) Value() (driver.Value, error) { + return uuid.UUID(id).Value() +} + +func (id UUID) Time() uuid.Time { + return uuid.UUID(id).Time() +} + +func (id UUID) ClockSequence() int { + return uuid.UUID(id).ClockSequence() +} diff --git a/badorm/crudService.go b/badorm/crudService.go index be17db7a..2b419979 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -1,7 +1,6 @@ package badorm import ( - "github.com/google/uuid" "gorm.io/gorm" ) @@ -13,7 +12,7 @@ type CRUDService[T any, ID BadaasID] interface { } // check interface compliance -var _ CRUDService[UUIDModel, uuid.UUID] = (*crudServiceImpl[UUIDModel, uuid.UUID])(nil) +var _ CRUDService[UUIDModel, UUID] = (*crudServiceImpl[UUIDModel, UUID])(nil) // Implementation of the CRUD Service type crudServiceImpl[T any, ID BadaasID] struct { diff --git a/badorm/crudUnsafeService.go b/badorm/crudUnsafeService.go index 2aedf696..4d8036d5 100644 --- a/badorm/crudUnsafeService.go +++ b/badorm/crudUnsafeService.go @@ -1,7 +1,6 @@ package badorm import ( - "github.com/google/uuid" "gorm.io/gorm" ) @@ -11,7 +10,7 @@ type CRUDUnsafeService[T any, ID BadaasID] interface { } // check interface compliance -var _ CRUDUnsafeService[UUIDModel, uuid.UUID] = (*crudUnsafeServiceImpl[UUIDModel, uuid.UUID])(nil) +var _ CRUDUnsafeService[UUIDModel, UUID] = (*crudUnsafeServiceImpl[UUIDModel, UUID])(nil) // Implementation of the CRUD Service type crudUnsafeServiceImpl[T any, ID BadaasID] struct { diff --git a/badorm/db.go b/badorm/db.go new file mode 100644 index 00000000..15fe81cd --- /dev/null +++ b/badorm/db.go @@ -0,0 +1,67 @@ +package badorm + +import ( + "fmt" + "time" + + "github.com/ditrit/badaas/persistence/gormdatabase/gormzap" + "go.uber.org/zap" + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/gorm" +) + +func CreatePostgreSQLDialector(host, username, password, sslmode, dbname string, port int) gorm.Dialector { + return postgres.Open(CreatePostgreSQLDSN( + host, username, password, sslmode, dbname, port, + )) +} + +func CreatePostgreSQLDSN(host, username, password, sslmode, dbname string, port int) string { + return fmt.Sprintf( + "user=%s password=%s host=%s port=%d sslmode=%s dbname=%s", + username, password, host, port, sslmode, dbname, + ) +} + +func CreateMySQLDialector(host, username, password, sslmode, dbname string, port int) gorm.Dialector { + return mysql.Open(CreateMySQLDSN( + host, username, password, sslmode, dbname, port, + )) +} + +func CreateMySQLDSN(host, username, password, sslmode, dbname string, port int) string { + return fmt.Sprintf( + "%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", + username, password, host, port, dbname, + ) +} + +func ConnectToDialector( + logger *zap.Logger, + dialector gorm.Dialector, + retryAmount uint, + retryTime time.Duration, +) (*gorm.DB, error) { + var err error + var database *gorm.DB + for numberRetry := uint(0); numberRetry < retryAmount; numberRetry++ { + database, err = gorm.Open(dialector, &gorm.Config{ + Logger: gormzap.New(logger), + }) + + if err == nil { + logger.Sugar().Debugf("Database connection is active") + return database, nil + } + + logger.Sugar().Debugf("Database connection failed with error %q", err.Error()) + logger.Sugar().Debugf( + "Retrying database connection %d/%d in %s", + numberRetry+1, retryAmount, retryTime.String(), + ) + time.Sleep(retryTime) + } + + return nil, err +} diff --git a/badorm/db_test.go b/badorm/db_test.go new file mode 100644 index 00000000..2353ca1f --- /dev/null +++ b/badorm/db_test.go @@ -0,0 +1,37 @@ +package badorm + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCreatePostgreDSN(t *testing.T) { + assert.Equal( + t, + "user=username password=password host=192.168.2.5 port=1225 sslmode=disable dbname=badaas_db", + CreatePostgreSQLDSN( + "192.168.2.5", + "username", + "password", + "disable", + "badaas_db", + 1225, + ), + ) +} + +func TestCreateMySQLDSN(t *testing.T) { + assert.Equal( + t, + "username:password@tcp(192.168.2.5:1225)/badaas_db?charset=utf8mb4&parseTime=True&loc=Local", + CreateMySQLDSN( + "192.168.2.5", + "username", + "password", + "disable", + "badaas_db", + 1225, + ), + ) +} diff --git a/configuration/DatabaseConfiguration.go b/configuration/DatabaseConfiguration.go index 6a950473..f813733a 100644 --- a/configuration/DatabaseConfiguration.go +++ b/configuration/DatabaseConfiguration.go @@ -18,8 +18,18 @@ const ( DatabaseSslmodeKey string = "database.sslmode" DatabaseRetryKey string = "database.init.retry" DatabaseRetryDurationKey string = "database.init.retryTime" + DatabaseDialectorKey string = "database.dialector" ) +type DBDialector string + +const ( + PostgreSQL DBDialector = "postgresql" + MySQL DBDialector = "mysql" +) + +var DBDialectors = []DBDialector{PostgreSQL, MySQL} + // Hold the configuration values for the database connection type DatabaseConfiguration interface { ConfigurationHolder @@ -31,6 +41,7 @@ type DatabaseConfiguration interface { GetSSLMode() string GetRetry() uint GetRetryTime() time.Duration + GetDialector() DBDialector } // Concrete implementation of the DatabaseConfiguration interface @@ -43,6 +54,7 @@ type databaseConfigurationImpl struct { sslmode string retry uint retryTime uint + dialector DBDialector } // Instantiate a new configuration holder for the database connection @@ -62,6 +74,7 @@ func (databaseConfiguration *databaseConfigurationImpl) Reload() { databaseConfiguration.sslmode = viper.GetString(DatabaseSslmodeKey) databaseConfiguration.retry = viper.GetUint(DatabaseRetryKey) databaseConfiguration.retryTime = viper.GetUint(DatabaseRetryDurationKey) + databaseConfiguration.dialector = DBDialector(viper.GetString(DatabaseDialectorKey)) } // Return the port of the database server @@ -104,6 +117,11 @@ func (databaseConfiguration *databaseConfigurationImpl) GetRetryTime() time.Dura return utils.IntToSecond(int(databaseConfiguration.retryTime)) } +// Return the dialector to be used to connect to database +func (databaseConfiguration *databaseConfigurationImpl) GetDialector() DBDialector { + return databaseConfiguration.dialector +} + // Log the values provided by the configuration holder func (databaseConfiguration *databaseConfigurationImpl) Log(logger *zap.Logger) { logger.Info("Database configuration", diff --git a/controllers/basicAuth_test.go b/controllers/basicAuth_test.go index 3c7fc076..5f174c9b 100644 --- a/controllers/basicAuth_test.go +++ b/controllers/basicAuth_test.go @@ -140,7 +140,7 @@ func Test_BasicLoginHandler_LoginSuccess(t *testing.T) { userService := mocksUserService.NewUserService(t) user := &models.User{ UUIDModel: badorm.UUIDModel{ - ID: uuid.Nil, + ID: badorm.UUID(uuid.Nil), }, Username: "bob", Email: "bob@email.com", diff --git a/controllers/crud.go b/controllers/crud.go index 81d6ceee..bf1c1dbb 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -9,7 +9,6 @@ import ( "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/elliotchance/pie/v2" - "github.com/google/uuid" "go.uber.org/zap" ) @@ -28,8 +27,8 @@ type CRUDRoute struct { func NewCRUDController[T any]( logger *zap.Logger, - crudService badorm.CRUDService[T, uuid.UUID], - crudUnsafeService badorm.CRUDUnsafeService[T, uuid.UUID], + crudService badorm.CRUDService[T, badorm.UUID], + crudUnsafeService badorm.CRUDUnsafeService[T, badorm.UUID], ) CRUDRoute { fullTypeName := strings.ToLower(fmt.Sprintf("%T", *new(T))) // remove the package name of the type @@ -49,8 +48,8 @@ func NewCRUDController[T any]( // The concrete implementation of the CRUDController type crudControllerImpl[T any] struct { logger *zap.Logger - crudService badorm.CRUDService[T, uuid.UUID] - crudUnsafeService badorm.CRUDUnsafeService[T, uuid.UUID] + crudService badorm.CRUDService[T, badorm.UUID] + crudUnsafeService badorm.CRUDUnsafeService[T, badorm.UUID] } // The handler responsible of the retrieval of one object diff --git a/controllers/crud_test.go b/controllers/crud_test.go index 549b20a8..4defea04 100644 --- a/controllers/crud_test.go +++ b/controllers/crud_test.go @@ -6,6 +6,7 @@ import ( "strings" "testing" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/controllers" mockBadorm "github.com/ditrit/badaas/mocks/badorm" "github.com/google/uuid" @@ -17,12 +18,12 @@ import ( // ----------------------- GetObject ----------------------- type Model struct { - ID uuid.UUID + ID badorm.UUID } func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) + crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) route := controllers.NewCRUDController[Model]( logger, @@ -41,8 +42,8 @@ func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { } func TestCRUDGetWithEntityIDNotUUIDReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) + crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) route := controllers.NewCRUDController[Model]( logger, @@ -62,10 +63,10 @@ func TestCRUDGetWithEntityIDNotUUIDReturnsError(t *testing.T) { } func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) + crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) crudService. On("GetEntity", uuid). @@ -90,10 +91,10 @@ func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { } func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) + crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) crudService. On("GetEntity", uuid). @@ -118,10 +119,10 @@ func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { } func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) + crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) entity := Model{} crudService. @@ -149,8 +150,8 @@ func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { // ----------------------- GetEntities ----------------------- func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) + crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) crudUnsafeService. On("GetEntities", map[string]any{}). @@ -173,8 +174,8 @@ func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { } func TestGetEntitiesWithoutParams(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) + crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) entity1 := &Model{} entity2 := &Model{} @@ -203,8 +204,8 @@ func TestGetEntitiesWithoutParams(t *testing.T) { } func TestGetEntitiesWithParams(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) + crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) entity1 := &Model{} @@ -231,8 +232,8 @@ func TestGetEntitiesWithParams(t *testing.T) { } func TestGetEntitiesWithParamsNotJsonReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, uuid.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, uuid.UUID](t) + crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) + crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) route := controllers.NewCRUDController[Model]( logger, diff --git a/controllers/eav.go b/controllers/eav.go index dcf30880..1b91b880 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -5,6 +5,7 @@ import ( "fmt" "net/http" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/services" @@ -145,15 +146,15 @@ func (controller *eavControllerImpl) getEntityTypeNameFromRequest(r *http.Reques } // Extract the "type" and "id" parameters from url -func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Request) (string, uuid.UUID, httperrors.HTTPError) { +func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Request) (string, badorm.UUID, httperrors.HTTPError) { entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) if herr != nil { - return "", uuid.Nil, herr + return "", badorm.UUID(uuid.Nil), herr } entityID, herr := getEntityIDFromRequest(r) if herr != nil { - return "", uuid.Nil, herr + return "", badorm.UUID(uuid.Nil), herr } return entityTypeName, entityID, nil diff --git a/controllers/eav_test.go b/controllers/eav_test.go index bf494434..6c5ef905 100644 --- a/controllers/eav_test.go +++ b/controllers/eav_test.go @@ -6,6 +6,7 @@ import ( "strings" "testing" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/controllers" mockServices "github.com/ditrit/badaas/mocks/services" "github.com/ditrit/badaas/persistence/models" @@ -41,7 +42,7 @@ func TestGetWithoutTypeReturnsError(t *testing.T) { func TestGetOfNotExistentTypeReturnsError(t *testing.T) { eavService := mockServices.NewEAVService(t) - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) eavService. On("GetEntity", "no-exists", uuid). Return(nil, gorm.ErrRecordNotFound) @@ -115,7 +116,7 @@ func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { Name: "entityType", } - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) eavService. On("GetEntity", entityType.Name, uuid). @@ -144,7 +145,7 @@ func TestGetWithErrorInDBReturnsError(t *testing.T) { Name: "entityType", } - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) eavService. On("GetEntity", entityType.Name, uuid). @@ -177,7 +178,7 @@ func TestGetWithCorrectIDReturnsObject(t *testing.T) { EntityType: entityType, } - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) eavService. On("GetEntity", entityType.Name, uuid). @@ -359,7 +360,7 @@ func TestDeleteWithoutTypeReturnsError(t *testing.T) { func TestDeleteOfNotExistentTypeReturnsError(t *testing.T) { eavService := mockServices.NewEAVService(t) - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) eavService. On("DeleteEntity", "no-exists", uuid). @@ -388,7 +389,7 @@ func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { Name: "entityType", } - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) eavService. On("DeleteEntity", entityType.Name, uuid). @@ -417,7 +418,7 @@ func TestDeleteObjectReturnsNil(t *testing.T) { Name: "entityType", } - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) eavService. On("DeleteEntity", entityType.Name, uuid). @@ -592,7 +593,7 @@ func TestUpdateObjectWithBadJSONReturnsError(t *testing.T) { Name: "entityType", } - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) controller := controllers.NewEAVController( logger, @@ -613,7 +614,7 @@ func TestUpdateObjectWithBadJSONReturnsError(t *testing.T) { func TestModifyOfNotExistentTypeReturnsError(t *testing.T) { eavService := mockServices.NewEAVService(t) - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) eavService. On("UpdateEntity", "no-exists", uuid, map[string]any{"1": "1"}). @@ -642,7 +643,7 @@ func TestUpdateObjectWithErrorInDBReturnsError(t *testing.T) { Name: "entityType", } - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) eavService. On("UpdateEntity", entityType.Name, uuid, map[string]any{"1": "1"}). @@ -671,7 +672,7 @@ func TestUpdateObjectReturnsObject(t *testing.T) { Name: "entityType", } - uuid := uuid.New() + uuid := badorm.UUID(uuid.New()) entity := &models.Entity{ EntityType: entityType, } diff --git a/controllers/utils.go b/controllers/utils.go index 5f6b87f4..a9b5bdc8 100644 --- a/controllers/utils.go +++ b/controllers/utils.go @@ -6,6 +6,7 @@ import ( "io" "net/http" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" "github.com/google/uuid" "github.com/gorilla/mux" @@ -52,18 +53,18 @@ func decodeJSONOptional(r *http.Request) (map[string]any, httperrors.HTTPError) } // Extract the "id" parameter from url -func getEntityIDFromRequest(r *http.Request) (uuid.UUID, httperrors.HTTPError) { +func getEntityIDFromRequest(r *http.Request) (badorm.UUID, httperrors.HTTPError) { id, present := mux.Vars(r)["id"] if !present { - return uuid.Nil, ErrEntityNotFound + return badorm.UUID(uuid.Nil), ErrEntityNotFound } uid, err := uuid.Parse(id) if err != nil { - return uuid.Nil, ErrIDNotAnUUID + return badorm.UUID(uuid.Nil), ErrIDNotAnUUID } - return uid, nil + return badorm.UUID(uid), nil } func mapServiceError(err error) httperrors.HTTPError { diff --git a/docker/mysql/docker-compose.yml b/docker/mysql/docker-compose.yml new file mode 100644 index 00000000..1fba01fc --- /dev/null +++ b/docker/mysql/docker-compose.yml @@ -0,0 +1,19 @@ +# DEVELOPMENT ONLY, DO NOT USE FOR PRODUCTION +version: '3.5' + +services: + db: + container_name: "badaas-test-db" + image: mysql:latest + environment: + MYSQL_ALLOW_EMPTY_PASSWORD: "true" + MYSQL_DATABASE: 'badaas_db' + MYSQL_USER: 'badaas' + MYSQL_PASSWORD: 'badaas' + ports: + - '5000:3306' + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] + interval: 10s + timeout: 5s + retries: 5 \ No newline at end of file diff --git a/docker/postgresql/docker-compose.yml b/docker/postgresql/docker-compose.yml index 201fe3ca..a24f3d51 100644 --- a/docker/postgresql/docker-compose.yml +++ b/docker/postgresql/docker-compose.yml @@ -1,3 +1,4 @@ +# DEVELOPMENT ONLY, DO NOT USE FOR PRODUCTION version: '3.5' services: diff --git a/docker/postgresql/init.sql b/docker/postgresql/init.sql index 982ad984..682131d3 100644 --- a/docker/postgresql/init.sql +++ b/docker/postgresql/init.sql @@ -1 +1 @@ -CREATE EXTENSION "uuid-ossp"; \ No newline at end of file +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; \ No newline at end of file diff --git a/go.mod b/go.mod index 28c6dd52..cd2fbb20 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,6 @@ require ( github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/jackc/pgconn v1.13.0 - github.com/lib/pq v1.10.2 github.com/magiconair/properties v1.8.6 github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61 github.com/spf13/cobra v1.5.0 @@ -20,6 +19,7 @@ require ( go.uber.org/fx v1.18.2 go.uber.org/zap v1.23.0 golang.org/x/crypto v0.1.0 + gorm.io/driver/mysql v1.5.1 gorm.io/driver/postgres v1.4.5 gorm.io/gorm v1.25.1 gotest.tools v2.2.0+incompatible @@ -28,6 +28,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/goph/emperror v0.17.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect diff --git a/go.sum b/go.sum index 3d018bd6..26bf454c 100644 --- a/go.sum +++ b/go.sum @@ -91,6 +91,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= @@ -688,6 +690,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= +gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc= gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg= gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= diff --git a/go.work.sum b/go.work.sum index c91930df..6a91a1be 100644 --- a/go.work.sum +++ b/go.work.sum @@ -180,6 +180,8 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -532,6 +534,4 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= -gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/mocks/services/EAVService.go b/mocks/services/EAVService.go index 55589188..20d3719f 100644 --- a/mocks/services/EAVService.go +++ b/mocks/services/EAVService.go @@ -3,10 +3,10 @@ package mocks import ( - models "github.com/ditrit/badaas/persistence/models" + badorm "github.com/ditrit/badaas/badorm" mock "github.com/stretchr/testify/mock" - uuid "github.com/google/uuid" + models "github.com/ditrit/badaas/persistence/models" ) // EAVService is an autogenerated mock type for the EAVService type @@ -41,11 +41,11 @@ func (_m *EAVService) CreateEntity(entityTypeName string, attributeValues map[st } // DeleteEntity provides a mock function with given fields: entityTypeName, entityID -func (_m *EAVService) DeleteEntity(entityTypeName string, entityID uuid.UUID) error { +func (_m *EAVService) DeleteEntity(entityTypeName string, entityID badorm.UUID) error { ret := _m.Called(entityTypeName, entityID) var r0 error - if rf, ok := ret.Get(0).(func(string, uuid.UUID) error); ok { + if rf, ok := ret.Get(0).(func(string, badorm.UUID) error); ok { r0 = rf(entityTypeName, entityID) } else { r0 = ret.Error(0) @@ -81,15 +81,15 @@ func (_m *EAVService) GetEntities(entityTypeName string, conditions map[string]i } // GetEntity provides a mock function with given fields: entityTypeName, id -func (_m *EAVService) GetEntity(entityTypeName string, id uuid.UUID) (*models.Entity, error) { +func (_m *EAVService) GetEntity(entityTypeName string, id badorm.UUID) (*models.Entity, error) { ret := _m.Called(entityTypeName, id) var r0 *models.Entity var r1 error - if rf, ok := ret.Get(0).(func(string, uuid.UUID) (*models.Entity, error)); ok { + if rf, ok := ret.Get(0).(func(string, badorm.UUID) (*models.Entity, error)); ok { return rf(entityTypeName, id) } - if rf, ok := ret.Get(0).(func(string, uuid.UUID) *models.Entity); ok { + if rf, ok := ret.Get(0).(func(string, badorm.UUID) *models.Entity); ok { r0 = rf(entityTypeName, id) } else { if ret.Get(0) != nil { @@ -97,7 +97,7 @@ func (_m *EAVService) GetEntity(entityTypeName string, id uuid.UUID) (*models.En } } - if rf, ok := ret.Get(1).(func(string, uuid.UUID) error); ok { + if rf, ok := ret.Get(1).(func(string, badorm.UUID) error); ok { r1 = rf(entityTypeName, id) } else { r1 = ret.Error(1) @@ -107,15 +107,15 @@ func (_m *EAVService) GetEntity(entityTypeName string, id uuid.UUID) (*models.En } // UpdateEntity provides a mock function with given fields: entityTypeName, entityID, newValues -func (_m *EAVService) UpdateEntity(entityTypeName string, entityID uuid.UUID, newValues map[string]interface{}) (*models.Entity, error) { +func (_m *EAVService) UpdateEntity(entityTypeName string, entityID badorm.UUID, newValues map[string]interface{}) (*models.Entity, error) { ret := _m.Called(entityTypeName, entityID, newValues) var r0 *models.Entity var r1 error - if rf, ok := ret.Get(0).(func(string, uuid.UUID, map[string]interface{}) (*models.Entity, error)); ok { + if rf, ok := ret.Get(0).(func(string, badorm.UUID, map[string]interface{}) (*models.Entity, error)); ok { return rf(entityTypeName, entityID, newValues) } - if rf, ok := ret.Get(0).(func(string, uuid.UUID, map[string]interface{}) *models.Entity); ok { + if rf, ok := ret.Get(0).(func(string, badorm.UUID, map[string]interface{}) *models.Entity); ok { r0 = rf(entityTypeName, entityID, newValues) } else { if ret.Get(0) != nil { @@ -123,7 +123,7 @@ func (_m *EAVService) UpdateEntity(entityTypeName string, entityID uuid.UUID, ne } } - if rf, ok := ret.Get(1).(func(string, uuid.UUID, map[string]interface{}) error); ok { + if rf, ok := ret.Get(1).(func(string, badorm.UUID, map[string]interface{}) error); ok { r1 = rf(entityTypeName, entityID, newValues) } else { r1 = ret.Error(1) diff --git a/mocks/services/sessionservice/SessionService.go b/mocks/services/sessionservice/SessionService.go index d485a95b..9b3ce411 100644 --- a/mocks/services/sessionservice/SessionService.go +++ b/mocks/services/sessionservice/SessionService.go @@ -3,14 +3,14 @@ package mocks import ( + badorm "github.com/ditrit/badaas/badorm" httperrors "github.com/ditrit/badaas/httperrors" + mock "github.com/stretchr/testify/mock" models "github.com/ditrit/badaas/persistence/models" sessionservice "github.com/ditrit/badaas/services/sessionservice" - - uuid "github.com/google/uuid" ) // SessionService is an autogenerated mock type for the SessionService type @@ -19,21 +19,21 @@ type SessionService struct { } // IsValid provides a mock function with given fields: sessionUUID -func (_m *SessionService) IsValid(sessionUUID uuid.UUID) (bool, *sessionservice.SessionClaims) { +func (_m *SessionService) IsValid(sessionUUID badorm.UUID) (bool, *sessionservice.SessionClaims) { ret := _m.Called(sessionUUID) var r0 bool var r1 *sessionservice.SessionClaims - if rf, ok := ret.Get(0).(func(uuid.UUID) (bool, *sessionservice.SessionClaims)); ok { + if rf, ok := ret.Get(0).(func(badorm.UUID) (bool, *sessionservice.SessionClaims)); ok { return rf(sessionUUID) } - if rf, ok := ret.Get(0).(func(uuid.UUID) bool); ok { + if rf, ok := ret.Get(0).(func(badorm.UUID) bool); ok { r0 = rf(sessionUUID) } else { r0 = ret.Get(0).(bool) } - if rf, ok := ret.Get(1).(func(uuid.UUID) *sessionservice.SessionClaims); ok { + if rf, ok := ret.Get(1).(func(badorm.UUID) *sessionservice.SessionClaims); ok { r1 = rf(sessionUUID) } else { if ret.Get(1) != nil { @@ -87,11 +87,11 @@ func (_m *SessionService) LogUserOut(sessionClaims *sessionservice.SessionClaims } // RollSession provides a mock function with given fields: _a0 -func (_m *SessionService) RollSession(_a0 uuid.UUID) httperrors.HTTPError { +func (_m *SessionService) RollSession(_a0 badorm.UUID) httperrors.HTTPError { ret := _m.Called(_a0) var r0 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(uuid.UUID) httperrors.HTTPError); ok { + if rf, ok := ret.Get(0).(func(badorm.UUID) httperrors.HTTPError); ok { r0 = rf(_a0) } else { if ret.Get(0) != nil { diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index 2b21b501..88e95b14 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -1,8 +1,6 @@ package gormdatabase import ( - "fmt" - "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/configuration" "go.uber.org/zap" @@ -10,23 +8,29 @@ import ( ) // Create the dsn string from the configuration -func createDsnFromConf(databaseConfiguration configuration.DatabaseConfiguration) string { - dsn := createDsn( - databaseConfiguration.GetHost(), - databaseConfiguration.GetUsername(), - databaseConfiguration.GetPassword(), - databaseConfiguration.GetSSLMode(), - databaseConfiguration.GetDBName(), - databaseConfiguration.GetPort(), - ) - return dsn -} +func createDialectorFromConf(databaseConfiguration configuration.DatabaseConfiguration) gorm.Dialector { + switch databaseConfiguration.GetDialector() { + case configuration.PostgreSQL: + return badorm.CreatePostgreSQLDialector( + databaseConfiguration.GetHost(), + databaseConfiguration.GetUsername(), + databaseConfiguration.GetPassword(), + databaseConfiguration.GetSSLMode(), + databaseConfiguration.GetDBName(), + databaseConfiguration.GetPort(), + ) + case configuration.MySQL: + return badorm.CreateMySQLDialector( + databaseConfiguration.GetHost(), + databaseConfiguration.GetUsername(), + databaseConfiguration.GetPassword(), + databaseConfiguration.GetSSLMode(), + databaseConfiguration.GetDBName(), + databaseConfiguration.GetPort(), + ) + } -// Create the dsn strings with the provided args -func createDsn(host, username, password, sslmode, dbname string, port int) string { - return fmt.Sprintf("user=%s password=%s host=%s port=%d sslmode=%s dbname=%s", - username, password, host, port, sslmode, dbname, - ) + return nil } // Creates the database object with using the database configuration and exec the setup @@ -34,10 +38,9 @@ func SetupDatabaseConnection( logger *zap.Logger, databaseConfiguration configuration.DatabaseConfiguration, ) (*gorm.DB, error) { - dsn := createDsnFromConf(databaseConfiguration) - return badorm.ConnectToDSN( + return badorm.ConnectToDialector( logger, - dsn, + createDialectorFromConf(databaseConfiguration), databaseConfiguration.GetRetry(), databaseConfiguration.GetRetryTime(), ) diff --git a/persistence/gormdatabase/db_test.go b/persistence/gormdatabase/db_test.go deleted file mode 100644 index 05eef996..00000000 --- a/persistence/gormdatabase/db_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package gormdatabase - -import ( - "testing" - - configurationmocks "github.com/ditrit/badaas/mocks/configuration" - "github.com/stretchr/testify/assert" -) - -func TestCreateDsnFromconf(t *testing.T) { - conf := configurationmocks.NewDatabaseConfiguration(t) - conf.On("GetPort").Return(1225) - conf.On("GetHost").Return("192.168.2.5") - conf.On("GetDBName").Return("badaas_db") - conf.On("GetUsername").Return("username") - conf.On("GetPassword").Return("password") - conf.On("GetSSLMode").Return("disable") - assert.Equal(t, "user=username password=password host=192.168.2.5 port=1225 sslmode=disable dbname=badaas_db", - createDsnFromConf(conf)) -} - -func TestCreateDsn(t *testing.T) { - assert.Equal(t, - "user=username password=password host=192.168.2.5 port=1225 sslmode=disable dbname=badaas_db", - createDsn( - "192.168.2.5", - "username", - "password", - "disable", - "badaas_db", - 1225, - ), - "no dsn should be empty", - ) -} diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index d12ef473..5cbc0c13 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/ditrit/badaas/badorm" - "github.com/google/uuid" ) // Describe the type of an attribute @@ -22,7 +21,7 @@ const ( // Describe the attribute of a en EntityType type Attribute struct { badorm.UUIDModel - Name string `gorm:"uniqueIndex:unique_name_entity_type"` + Name string `gorm:"uniqueIndex:unique_name_entity_type;type:varchar(255)"` Unique bool // TODO validate this Required bool @@ -36,10 +35,10 @@ type Attribute struct { ValueType ValueTypeT // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" // id of the EntityType to which a RelationValueType points to. Only if ValueType == RelationValueType - RelationTargetEntityTypeID uuid.UUID `gorm:"type:uuid;foreignKey:EntityType;index:fk_relation_target_entity_type"` + RelationTargetEntityTypeID badorm.UUID `gorm:"foreignKey:EntityType;index:fk_relation_target_entity_type"` // GORM relations - EntityTypeID uuid.UUID `gorm:"uniqueIndex:unique_name_entity_type"` + EntityTypeID badorm.UUID `gorm:"uniqueIndex:unique_name_entity_type"` } var ErrNoDefaultValueSet = errors.New("no default value found") diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 44516e8b..2638d75d 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -4,7 +4,6 @@ import ( "encoding/json" "github.com/ditrit/badaas/badorm" - "github.com/google/uuid" ) // Describe an instance of an EntityType @@ -13,7 +12,7 @@ type Entity struct { Fields []*Value // GORM relations - EntityTypeID uuid.UUID + EntityTypeID badorm.UUID EntityType *EntityType } diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go index 742e993b..f90a0806 100644 --- a/persistence/models/Entity_test.go +++ b/persistence/models/Entity_test.go @@ -9,7 +9,7 @@ import ( ) func TestMarshall(t *testing.T) { - id := uuid.MustParse("11e1d4b8-701d-47cc-852f-6d36922bcc75") + id := badorm.UUID(uuid.MustParse("11e1d4b8-701d-47cc-852f-6d36922bcc75")) ett := &EntityType{ UUIDModel: badorm.UUIDModel{ID: id}, Name: "bird", diff --git a/persistence/models/Session.go b/persistence/models/Session.go index 6f455584..2ca84797 100644 --- a/persistence/models/Session.go +++ b/persistence/models/Session.go @@ -4,18 +4,17 @@ import ( "time" "github.com/ditrit/badaas/badorm" - "github.com/google/uuid" ) // Represent a user session type Session struct { badorm.UUIDModel - UserID uuid.UUID `gorm:"not null"` - ExpiresAt time.Time `gorm:"not null"` + UserID badorm.UUID `gorm:"not null"` + ExpiresAt time.Time `gorm:"not null"` } // Create a new session -func NewSession(userID uuid.UUID, sessionDuration time.Duration) *Session { +func NewSession(userID badorm.UUID, sessionDuration time.Duration) *Session { return &Session{ UserID: userID, ExpiresAt: time.Now().Add(sessionDuration), diff --git a/persistence/models/Value.go b/persistence/models/Value.go index 424bfbe1..f57115aa 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -16,14 +16,19 @@ type Value struct { FloatVal float64 IntVal int BoolVal bool - RelationVal uuid.UUID `gorm:"type:uuid;foreignKey:Entity;index:fk_relation_val_entity"` + RelationVal badorm.UUID `gorm:"foreignKey:Entity;index:fk_relation_val_entity"` // GORM relations - EntityID uuid.UUID `gorm:"uniqueIndex:unique_entity_attribute"` - AttributeID uuid.UUID `gorm:"uniqueIndex:unique_entity_attribute"` + EntityID badorm.UUID `gorm:"uniqueIndex:unique_entity_attribute"` + AttributeID badorm.UUID `gorm:"uniqueIndex:unique_entity_attribute"` Attribute *Attribute } +func (Value) TableName() string { + // rename table as values can be a keyword (in MySQL for example) + return "values_" +} + var ErrAskingForWrongType = errors.New("attribute type doesn't match") // Create a new null value @@ -96,7 +101,7 @@ func (v *Value) SetNull() error { v.FloatVal = 0.0 v.StringVal = "" v.BoolVal = false - v.RelationVal = uuid.Nil + v.RelationVal = badorm.UUID(uuid.Nil) return nil } diff --git a/persistence/models/Value_test.go b/persistence/models/Value_test.go index 76f64ddd..42e4541c 100644 --- a/persistence/models/Value_test.go +++ b/persistence/models/Value_test.go @@ -25,8 +25,8 @@ func TestRelationValueNeedsEntity(t *testing.T) { } func TestRelationValueEntityHasToBeTheTargetOfTheAttribute(t *testing.T) { - brandEttID := uuid.New() - carEttID := uuid.New() + brandEttID := badorm.UUID(uuid.New()) + carEttID := badorm.UUID(uuid.New()) brandEtt := &EntityType{ UUIDModel: badorm.UUIDModel{ @@ -62,14 +62,14 @@ func TestRelationValueEntityHasToBeTheTargetOfTheAttribute(t *testing.T) { func TestRelationValueWithCorrespondingEntity(t *testing.T) { brandEtt := &EntityType{ UUIDModel: badorm.UUIDModel{ - ID: uuid.New(), + ID: badorm.UUID(uuid.New()), }, Name: "brand", } carEtt := &EntityType{ UUIDModel: badorm.UUIDModel{ - ID: uuid.New(), + ID: badorm.UUID(uuid.New()), }, Name: "car", } diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index 40cc5cf0..73e9835e 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -5,6 +5,7 @@ import ( "time" sq "github.com/Masterminds/squirrel" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" "github.com/elliotchance/pie/v2" "github.com/google/uuid" @@ -28,7 +29,7 @@ func NewEntityRepository( } // Get the Entity of type with name "entityTypeName" that has the "id" -func (r *EntityRepository) Get(tx *gorm.DB, entityTypeName string, id uuid.UUID) (*models.Entity, error) { +func (r *EntityRepository) Get(tx *gorm.DB, entityTypeName string, id badorm.UUID) (*models.Entity, error) { var entity models.Entity query := tx.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType") @@ -53,29 +54,24 @@ func (r *EntityRepository) Get(tx *gorm.DB, entityTypeName string, id uuid.UUID) func (r *EntityRepository) Create(tx *gorm.DB, entity *models.Entity) error { now := time.Now() + entity.ID = badorm.UUID(uuid.New()) + query, values, err := sq.Insert("entities"). - Columns("created_at", "updated_at", "entity_type_id"). - Values(now, now, entity.EntityType.ID). - Suffix("RETURNING \"id\""). + Columns("id", "created_at", "updated_at", "entity_type_id"). + Values(entity.ID, now, now, entity.EntityType.ID). PlaceholderFormat(sq.Dollar).ToSql() if err != nil { return err } - var result string - err = tx.Raw(query, values...).Scan(&result).Error - if err != nil { - return err - } - - uuid, err := uuid.Parse(result) + err = tx.Exec(query, values...).Error if err != nil { return err } pie.Each(entity.Fields, func(value *models.Value) { - value.EntityID = uuid + value.EntityID = entity.ID }) if len(entity.Fields) > 0 { @@ -85,7 +81,6 @@ func (r *EntityRepository) Create(tx *gorm.DB, entity *models.Entity) error { } } - entity.ID = uuid return nil } @@ -101,7 +96,7 @@ func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attribut `JOIN attributes attributes%[1]s ON attributes%[1]s.entity_type_id = entities%[2]s.entity_type_id AND attributes%[1]s.name = ? - JOIN values values%[1]s ON + JOIN values_ values%[1]s ON values%[1]s.attribute_id = attributes%[1]s.id AND values%[1]s.entity_id = entities%[2]s.id `, diff --git a/persistence/repository/EntityRepository_test.go b/persistence/repository/EntityRepository_test.go index 543b84c2..abff34e1 100644 --- a/persistence/repository/EntityRepository_test.go +++ b/persistence/repository/EntityRepository_test.go @@ -67,7 +67,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForString() { JOIN attributes attributes_attrName ON attributes_attrName.entity_type_id = entities.entity_type_id AND attributes_attrName.name = $1 - JOIN values values_attrName ON + JOIN values_ values_attrName ON values_attrName.attribute_id = attributes_attrName.id AND values_attrName.entity_id = entities.id AND attributes_attrName.value_type = 'string' AND @@ -88,7 +88,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForStringUUID() { JOIN attributes attributes_attrName ON attributes_attrName.entity_type_id = entities.entity_type_id AND attributes_attrName.name = $1 - JOIN values values_attrName ON + JOIN values_ values_attrName ON values_attrName.attribute_id = attributes_attrName.id AND values_attrName.entity_id = entities.id AND attributes_attrName.value_type = 'relation' AND @@ -109,7 +109,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForBool() { JOIN attributes attributes_attrName ON attributes_attrName.entity_type_id = entities.entity_type_id AND attributes_attrName.name = $1 - JOIN values values_attrName ON + JOIN values_ values_attrName ON values_attrName.attribute_id = attributes_attrName.id AND values_attrName.entity_id = entities.id AND attributes_attrName.value_type = 'bool' AND @@ -129,7 +129,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForNil() { JOIN attributes attributes_attrName ON attributes_attrName.entity_type_id = entities.entity_type_id AND attributes_attrName.name = $1 - JOIN values values_attrName ON + JOIN values_ values_attrName ON values_attrName.attribute_id = attributes_attrName.id AND values_attrName.entity_id = entities.id AND values_attrName.is_null = true @@ -149,7 +149,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckIntAndFloatForFlo JOIN attributes attributes_attrName ON attributes_attrName.entity_type_id = entities.entity_type_id AND attributes_attrName.name = $1 - JOIN values values_attrName ON + JOIN values_ values_attrName ON values_attrName.attribute_id = attributes_attrName.id AND values_attrName.entity_id = entities.id AND ((attributes_attrName.value_type = 'int' AND values_attrName.int_val = $2) OR @@ -171,7 +171,7 @@ func (s *EntityRepositorySuite) TestAddValueCheck2AddsValueCheckFor2Values() { JOIN attributes attributes_attrName1 ON attributes_attrName1.entity_type_id = entities.entity_type_id AND attributes_attrName1.name = $1 - JOIN values values_attrName1 ON + JOIN values_ values_attrName1 ON values_attrName1.attribute_id = attributes_attrName1.id AND values_attrName1.entity_id = entities.id AND attributes_attrName1.value_type = 'string' AND @@ -179,7 +179,7 @@ func (s *EntityRepositorySuite) TestAddValueCheck2AddsValueCheckFor2Values() { JOIN attributes attributes_attrName2 ON attributes_attrName2.entity_type_id = entities.entity_type_id AND attributes_attrName2.name = $3 - JOIN values values_attrName2 ON + JOIN values_ values_attrName2 ON values_attrName2.attribute_id = attributes_attrName2.id AND values_attrName2.entity_id = entities.id AND attributes_attrName2.value_type = 'bool' AND @@ -205,7 +205,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMap() { JOIN attributes attributes_attrName ON attributes_attrName.entity_type_id = entities.entity_type_id AND attributes_attrName.name = $1 - JOIN values values_attrName ON + JOIN values_ values_attrName ON values_attrName.attribute_id = attributes_attrName.id AND values_attrName.entity_id = entities.id AND attributes_attrName.value_type = 'relation' @@ -215,7 +215,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMap() { JOIN attributes attributes_attrName_innerAttrName ON attributes_attrName_innerAttrName.entity_type_id = entities_attrName.entity_type_id AND attributes_attrName_innerAttrName.name = $2 - JOIN values values_attrName_innerAttrName ON + JOIN values_ values_attrName_innerAttrName ON values_attrName_innerAttrName.attribute_id = attributes_attrName_innerAttrName.id AND values_attrName_innerAttrName.entity_id = entities_attrName.id AND attributes_attrName_innerAttrName.value_type = 'string' AND @@ -243,7 +243,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMapWith2 JOIN attributes attributes_attrName ON attributes_attrName.entity_type_id = entities.entity_type_id AND attributes_attrName.name = $1 - JOIN values values_attrName ON + JOIN values_ values_attrName ON values_attrName.attribute_id = attributes_attrName.id AND values_attrName.entity_id = entities.id AND attributes_attrName.value_type = 'relation' @@ -253,7 +253,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMapWith2 JOIN attributes attributes_attrName_innerAttrName1 ON attributes_attrName_innerAttrName1.entity_type_id = entities_attrName.entity_type_id AND attributes_attrName_innerAttrName1.name = $2 - JOIN values values_attrName_innerAttrName1 ON + JOIN values_ values_attrName_innerAttrName1 ON values_attrName_innerAttrName1.attribute_id = attributes_attrName_innerAttrName1.id AND values_attrName_innerAttrName1.entity_id = entities_attrName.id AND attributes_attrName_innerAttrName1.value_type = 'string' AND @@ -261,7 +261,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMapWith2 JOIN attributes attributes_attrName_innerAttrName2 ON attributes_attrName_innerAttrName2.entity_type_id = entities_attrName.entity_type_id AND attributes_attrName_innerAttrName2.name = $4 - JOIN values values_attrName_innerAttrName2 ON + JOIN values_ values_attrName_innerAttrName2 ON values_attrName_innerAttrName2.attribute_id = attributes_attrName_innerAttrName2.id AND values_attrName_innerAttrName2.entity_id = entities_attrName.id AND attributes_attrName_innerAttrName2.value_type = 'string' AND @@ -291,7 +291,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckAndJoinWithEntiti JOIN attributes attributes_attrName1 ON attributes_attrName1.entity_type_id = entities.entity_type_id AND attributes_attrName1.name = $1 - JOIN values values_attrName1 ON + JOIN values_ values_attrName1 ON values_attrName1.attribute_id = attributes_attrName1.id AND values_attrName1.entity_id = entities.id AND attributes_attrName1.value_type = 'relation' @@ -301,7 +301,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckAndJoinWithEntiti JOIN attributes attributes_attrName1_innerAttrName1 ON attributes_attrName1_innerAttrName1.entity_type_id = entities_attrName1.entity_type_id AND attributes_attrName1_innerAttrName1.name = $2 - JOIN values values_attrName1_innerAttrName1 ON + JOIN values_ values_attrName1_innerAttrName1 ON values_attrName1_innerAttrName1.attribute_id = attributes_attrName1_innerAttrName1.id AND values_attrName1_innerAttrName1.entity_id = entities_attrName1.id AND attributes_attrName1_innerAttrName1.value_type = 'string' AND @@ -309,7 +309,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckAndJoinWithEntiti JOIN attributes attributes_attrName1_innerAttrName2 ON attributes_attrName1_innerAttrName2.entity_type_id = entities_attrName1.entity_type_id AND attributes_attrName1_innerAttrName2.name = $4 - JOIN values values_attrName1_innerAttrName2 ON + JOIN values_ values_attrName1_innerAttrName2 ON values_attrName1_innerAttrName2.attribute_id = attributes_attrName1_innerAttrName2.id AND values_attrName1_innerAttrName2.entity_id = entities_attrName1.id AND attributes_attrName1_innerAttrName2.value_type = 'string' AND @@ -317,7 +317,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckAndJoinWithEntiti JOIN attributes attributes_attrName2 ON attributes_attrName2.entity_type_id = entities.entity_type_id AND attributes_attrName2.name = $6 - JOIN values values_attrName2 ON + JOIN values_ values_attrName2 ON values_attrName2.attribute_id = attributes_attrName2.id AND values_attrName2.entity_id = entities.id AND attributes_attrName2.value_type = 'string' AND diff --git a/persistence/repository/EntityTypeRepository.go b/persistence/repository/EntityTypeRepository.go index 545efdbf..52f17c07 100644 --- a/persistence/repository/EntityTypeRepository.go +++ b/persistence/repository/EntityTypeRepository.go @@ -1,8 +1,8 @@ package repository import ( + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" - "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" ) @@ -19,7 +19,7 @@ func NewEntityTypeRepository( } } -func (r *EntityTypeRepository) Get(tx *gorm.DB, id uuid.UUID) (*models.EntityType, error) { +func (r *EntityTypeRepository) Get(tx *gorm.DB, id badorm.UUID) (*models.EntityType, error) { var entityType models.EntityType err := tx.Preload("Attributes").First(&entityType, id).Error if err != nil { diff --git a/persistence/repository/ValueRepository.go b/persistence/repository/ValueRepository.go index 416900bd..6679af91 100644 --- a/persistence/repository/ValueRepository.go +++ b/persistence/repository/ValueRepository.go @@ -4,7 +4,9 @@ import ( "time" sq "github.com/Masterminds/squirrel" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" + "github.com/elliotchance/pie/v2" "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" @@ -29,38 +31,31 @@ func NewValueRepository( func (r *ValueRepository) Create(tx *gorm.DB, values []*models.Value) error { now := time.Now() - query := sq.Insert("values"). - Columns("created_at", "updated_at", "is_null", "string_val", "float_val", "int_val", + pie.Each(values, func(value *models.Value) { + value.ID = badorm.UUID(uuid.New()) + }) + + query := sq.Insert("values_"). + Columns("id", "created_at", "updated_at", "is_null", "string_val", "float_val", "int_val", "bool_val", "relation_val", "entity_id", "attribute_id") for _, value := range values { - query = query.Values(now, now, value.IsNull, value.StringVal, + query = query.Values(value.ID, now, now, value.IsNull, value.StringVal, value.FloatVal, value.IntVal, value.BoolVal, value.RelationVal, value.EntityID, value.Attribute.ID) } queryString, queryValues, err := query. - Suffix("RETURNING \"id\""). PlaceholderFormat(sq.Dollar). ToSql() if err != nil { return err } - var results []string - err = tx.Raw(queryString, queryValues...).Scan(&results).Error + err = tx.Exec(queryString, queryValues...).Error if err != nil { return err } - for i, result := range results { - uuid, err := uuid.Parse(result) - if err != nil { - return err - } - - values[i].ID = uuid - } - return nil } diff --git a/router/middlewares/middlewareAuthentication.go b/router/middlewares/middlewareAuthentication.go index b1560dd5..125ea789 100644 --- a/router/middlewares/middlewareAuthentication.go +++ b/router/middlewares/middlewareAuthentication.go @@ -3,6 +3,7 @@ package middlewares import ( "net/http" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/services/sessionservice" "github.com/google/uuid" @@ -48,12 +49,12 @@ func (authenticationMiddleware *authenticationMiddleware) Handle(next http.Handl NotAuthenticated.Write(response, authenticationMiddleware.logger) return } - ok, sessionClaims := authenticationMiddleware.sessionService.IsValid(extractedUUID) + ok, sessionClaims := authenticationMiddleware.sessionService.IsValid(badorm.UUID(extractedUUID)) if !ok { NotAuthenticated.Write(response, authenticationMiddleware.logger) return } - herr := authenticationMiddleware.sessionService.RollSession(extractedUUID) + herr := authenticationMiddleware.sessionService.RollSession(badorm.UUID(extractedUUID)) if herr != nil { herr.Write(response, authenticationMiddleware.logger) return diff --git a/services/ModuleFx.go b/services/ModuleFx.go index ffeecfb1..baaa151c 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -6,7 +6,6 @@ import ( "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" - "github.com/google/uuid" "go.uber.org/fx" ) @@ -15,8 +14,8 @@ var AuthServiceModule = fx.Module( // models fx.Provide(getAuthModels), // repositories - fx.Provide(badorm.NewCRUDRepository[models.Session, uuid.UUID]), - fx.Provide(badorm.NewCRUDRepository[models.User, uuid.UUID]), + fx.Provide(badorm.NewCRUDRepository[models.Session, badorm.UUID]), + fx.Provide(badorm.NewCRUDRepository[models.User, badorm.UUID]), // services fx.Provide(userservice.NewUserService), diff --git a/services/eav.go b/services/eav.go index 47551bbf..921ddec6 100644 --- a/services/eav.go +++ b/services/eav.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/utils" @@ -18,11 +19,11 @@ var ( // EAV service provide handle EAV objects type EAVService interface { - GetEntity(entityTypeName string, id uuid.UUID) (*models.Entity, error) + GetEntity(entityTypeName string, id badorm.UUID) (*models.Entity, error) GetEntities(entityTypeName string, conditions map[string]any) ([]*models.Entity, error) CreateEntity(entityTypeName string, attributeValues map[string]any) (*models.Entity, error) - UpdateEntity(entityTypeName string, entityID uuid.UUID, newValues map[string]any) (*models.Entity, error) - DeleteEntity(entityTypeName string, entityID uuid.UUID) error + UpdateEntity(entityTypeName string, entityID badorm.UUID, newValues map[string]any) (*models.Entity, error) + DeleteEntity(entityTypeName string, entityID badorm.UUID) error } type eavServiceImpl struct { @@ -47,7 +48,7 @@ func NewEAVService( } // Get the Entity of type with name "entityTypeName" that has the "id" -func (eavService *eavServiceImpl) GetEntity(entityTypeName string, id uuid.UUID) (*models.Entity, error) { +func (eavService *eavServiceImpl) GetEntity(entityTypeName string, id badorm.UUID) (*models.Entity, error) { return eavService.entityRepository.Get(eavService.db, entityTypeName, id) } @@ -153,7 +154,7 @@ func (eavService *eavServiceImpl) createValue(tx *gorm.DB, attribute *models.Att // entries in "newValues" that do not correspond to any attribute of the EntityType are ignored // // "newValues" are in {"attributeName": newValue} format -func (eavService *eavServiceImpl) UpdateEntity(entityTypeName string, entityID uuid.UUID, newValues map[string]any) (*models.Entity, error) { +func (eavService *eavServiceImpl) UpdateEntity(entityTypeName string, entityID badorm.UUID, newValues map[string]any) (*models.Entity, error) { return ExecWithTransaction( eavService.db, func(tx *gorm.DB) (*models.Entity, error) { @@ -219,7 +220,7 @@ func (eavService *eavServiceImpl) updateRelationValue(tx *gorm.DB, value *models return err } - relationEntity, err := eavService.entityRepository.Get(tx, relationEntityType.Name, uuidVal) + relationEntity, err := eavService.entityRepository.Get(tx, relationEntityType.Name, badorm.UUID(uuidVal)) if err != nil { return err } @@ -228,7 +229,7 @@ func (eavService *eavServiceImpl) updateRelationValue(tx *gorm.DB, value *models } // Deletes Entity with type "entityTypeName" and id "entityID" and its values -func (eavService *eavServiceImpl) DeleteEntity(entityTypeName string, entityID uuid.UUID) error { +func (eavService *eavServiceImpl) DeleteEntity(entityTypeName string, entityID badorm.UUID) error { return eavService.db.Transaction(func(tx *gorm.DB) error { entity, err := eavService.entityRepository.Get(tx, entityTypeName, entityID) if err != nil { diff --git a/services/sessionservice/session.go b/services/sessionservice/session.go index 73069292..7b3eb215 100644 --- a/services/sessionservice/session.go +++ b/services/sessionservice/session.go @@ -9,7 +9,6 @@ import ( "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" - "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" ) @@ -24,9 +23,9 @@ var ( // SessionService handle sessions type SessionService interface { - IsValid(sessionUUID uuid.UUID) (bool, *SessionClaims) + IsValid(sessionUUID badorm.UUID) (bool, *SessionClaims) // TODO services should not work with httperrors - RollSession(uuid.UUID) httperrors.HTTPError + RollSession(badorm.UUID) httperrors.HTTPError LogUserIn(user *models.User) (*models.Session, error) LogUserOut(sessionClaims *SessionClaims) httperrors.HTTPError } @@ -36,8 +35,8 @@ var _ SessionService = (*sessionServiceImpl)(nil) // The SessionService concrete interface type sessionServiceImpl struct { - sessionRepository badorm.CRUDRepository[models.Session, uuid.UUID] - cache map[uuid.UUID]*models.Session + sessionRepository badorm.CRUDRepository[models.Session, badorm.UUID] + cache map[badorm.UUID]*models.Session mutex sync.Mutex logger *zap.Logger sessionConfiguration configuration.SessionConfiguration @@ -47,12 +46,12 @@ type sessionServiceImpl struct { // The SessionService constructor func NewSessionService( logger *zap.Logger, - sessionRepository badorm.CRUDRepository[models.Session, uuid.UUID], + sessionRepository badorm.CRUDRepository[models.Session, badorm.UUID], sessionConfiguration configuration.SessionConfiguration, db *gorm.DB, ) SessionService { sessionService := &sessionServiceImpl{ - cache: make(map[uuid.UUID]*models.Session), + cache: make(map[badorm.UUID]*models.Session), logger: logger, sessionRepository: sessionRepository, sessionConfiguration: sessionConfiguration, @@ -64,7 +63,7 @@ func NewSessionService( // Return true if the session exists and is still valid. // A instance of SessionClaims is returned to be added to the request context if the conditions previously mentioned are met. -func (sessionService *sessionServiceImpl) IsValid(sessionUUID uuid.UUID) (bool, *SessionClaims) { +func (sessionService *sessionServiceImpl) IsValid(sessionUUID badorm.UUID) (bool, *SessionClaims) { sessionInstance := sessionService.get(sessionUUID) if sessionInstance == nil { return false, nil @@ -74,7 +73,7 @@ func (sessionService *sessionServiceImpl) IsValid(sessionUUID uuid.UUID) (bool, // Get a session from cache // return nil if not found -func (sessionService *sessionServiceImpl) get(sessionUUID uuid.UUID) *models.Session { +func (sessionService *sessionServiceImpl) get(sessionUUID badorm.UUID) *models.Session { sessionService.mutex.Lock() defer sessionService.mutex.Unlock() @@ -112,7 +111,7 @@ func (sessionService *sessionServiceImpl) add(session *models.Session) error { // Initialize the session service func (sessionService *sessionServiceImpl) init() { - sessionService.cache = make(map[uuid.UUID]*models.Session) + sessionService.cache = make(map[badorm.UUID]*models.Session) go func() { for { sessionService.removeExpired() @@ -134,7 +133,7 @@ func (sessionService *sessionServiceImpl) pullFromDB() { panic(err) } - newSessionCache := make(map[uuid.UUID]*models.Session) + newSessionCache := make(map[badorm.UUID]*models.Session) for _, sessionFromDatabase := range sessionsFromDatabase { newSessionCache[sessionFromDatabase.ID] = sessionFromDatabase } @@ -190,7 +189,7 @@ func (sessionService *sessionServiceImpl) delete(session *models.Session) httper } // Roll a session. If the session is close to expiration, extend its duration. -func (sessionService *sessionServiceImpl) RollSession(sessionUUID uuid.UUID) httperrors.HTTPError { +func (sessionService *sessionServiceImpl) RollSession(sessionUUID badorm.UUID) httperrors.HTTPError { rollInterval := sessionService.sessionConfiguration.GetRollDuration() sessionDuration := sessionService.sessionConfiguration.GetSessionDuration() session := sessionService.get(sessionUUID) diff --git a/services/sessionservice/session_test.go b/services/sessionservice/session_test.go index 90dc25b9..04fe6a1f 100644 --- a/services/sessionservice/session_test.go +++ b/services/sessionservice/session_test.go @@ -26,19 +26,19 @@ var gormDB *gorm.DB func setupTest( t *testing.T, ) ( - *badormMocks.CRUDRepository[models.Session, uuid.UUID], + *badormMocks.CRUDRepository[models.Session, badorm.UUID], *sessionServiceImpl, *observer.ObservedLogs, *configurationMocks.SessionConfiguration, ) { core, logs := observer.New(zap.DebugLevel) logger := zap.New(core) - sessionRepositoryMock := badormMocks.NewCRUDRepository[models.Session, uuid.UUID](t) + sessionRepositoryMock := badormMocks.NewCRUDRepository[models.Session, badorm.UUID](t) sessionConfiguration := configurationMocks.NewSessionConfiguration(t) service := &sessionServiceImpl{ sessionRepository: sessionRepositoryMock, logger: logger, - cache: make(map[uuid.UUID]*models.Session), + cache: make(map[badorm.UUID]*models.Session), sessionConfiguration: sessionConfiguration, db: gormDB, } @@ -47,9 +47,9 @@ func setupTest( } func TestNewSession(t *testing.T) { - sessionInstance := models.NewSession(uuid.Nil, time.Second) + sessionInstance := models.NewSession(badorm.UUID(uuid.Nil), time.Second) assert.NotNil(t, sessionInstance) - assert.Equal(t, uuid.Nil, sessionInstance.UserID) + assert.Equal(t, badorm.UUID(uuid.Nil), sessionInstance.UserID) } func TestLogInUser(t *testing.T) { @@ -91,22 +91,22 @@ func TestLogInUserDbError(t *testing.T) { func TestIsValid(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) sessionRepositoryMock.On("Create", gormDB, mock.Anything).Return(nil) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: time.Now().Add(time.Hour), } err := service.add(session) require.NoError(t, err) assert.Len(t, service.cache, 1) - assert.Equal(t, uuid.Nil, service.cache[uuidSample].UserID) + assert.Equal(t, badorm.UUID(uuid.Nil), service.cache[uuidSample].UserID) isValid, claims := service.IsValid(uuidSample) require.True(t, isValid) assert.Equal(t, *claims, SessionClaims{ - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), SessionUUID: uuidSample, }) } @@ -116,7 +116,7 @@ func TestIsValid_SessionNotFound(t *testing.T) { sessionRepositoryMock. On("GetOptionalByID", gormDB, mock.Anything). Return(nil, nil) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) isValid, _ := service.IsValid(uuidSample) require.False(t, isValid) } @@ -124,12 +124,12 @@ func TestIsValid_SessionNotFound(t *testing.T) { func TestLogOutUser(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) sessionRepositoryMock.On("Delete", gormDB, mock.Anything).Return(nil) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: time.Now().Add(time.Hour), } service.cache[uuidSample] = session @@ -144,12 +144,12 @@ func TestLogOutUserDbError(t *testing.T) { On("Delete", gormDB, mock.Anything). Return(errors.New("db errors")) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: time.Now().Add(time.Hour), } service.cache[uuidSample] = session @@ -164,17 +164,17 @@ func TestLogOutUser_SessionNotFound(t *testing.T) { On("GetOptionalByID", gormDB, mock.Anything). Return(nil, errors.New("db errors")) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: uuid.Nil, + ID: badorm.UUID(uuid.Nil), }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: time.Now().Add(time.Hour), } service.cache[uuidSample] = session sessionClaims := makeSessionClaims(session) - sessionClaims.SessionUUID = uuid.Nil + sessionClaims.SessionUUID = badorm.UUID(uuid.Nil) err := service.LogUserOut(sessionClaims) require.Error(t, err) assert.Len(t, service.cache, 1) @@ -186,13 +186,13 @@ func TestRollSession(t *testing.T) { sessionDuration := time.Minute sessionConfigurationMock.On("GetSessionDuration").Return(sessionDuration) sessionConfigurationMock.On("GetRollDuration").Return(sessionDuration / 4) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) originalExpirationTime := time.Now().Add(sessionDuration / 5) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: uuid.Nil, + ID: badorm.UUID(uuid.Nil), }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: originalExpirationTime, } service.cache[uuidSample] = session @@ -206,13 +206,13 @@ func TestRollSession_Expired(t *testing.T) { sessionDuration := time.Minute sessionConfigurationMock.On("GetSessionDuration").Return(sessionDuration) sessionConfigurationMock.On("GetRollDuration").Return(sessionDuration / 4) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) originalExpirationTime := time.Now().Add(-time.Hour) session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: originalExpirationTime, } service.cache[uuidSample] = session @@ -226,13 +226,13 @@ func TestRollSession_falseUUID(t *testing.T) { sessionConfigurationMock.On("GetSessionDuration").Return(sessionDuration) sessionConfigurationMock.On("GetRollDuration").Return(sessionDuration / 4) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) originalExpirationTime := time.Now().Add(-time.Hour) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: uuid.Nil, + ID: badorm.UUID(uuid.Nil), }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: originalExpirationTime, } service.cache[uuidSample] = session @@ -241,21 +241,21 @@ func TestRollSession_falseUUID(t *testing.T) { On("GetOptionalByID", gormDB, mock.Anything). Return(nil, nil) - err := service.RollSession(uuid.New()) + err := service.RollSession(badorm.UUID(uuid.New())) require.NoError(t, err) } func TestRollSession_sessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, sessionConfigurationMock := setupTest(t) sessionRepositoryMock. - On("GetOptionalByID", gormDB, uuid.Nil). + On("GetOptionalByID", gormDB, badorm.UUID(uuid.Nil)). Return(nil, nil) sessionDuration := time.Minute sessionConfigurationMock.On("GetSessionDuration").Return(sessionDuration) sessionConfigurationMock.On("GetRollDuration").Return(sessionDuration) - err := service.RollSession(uuid.Nil) + err := service.RollSession(badorm.UUID(uuid.Nil)) require.NoError(t, err) } @@ -263,9 +263,9 @@ func Test_pullFromDB(t *testing.T) { sessionRepositoryMock, service, logs, _ := setupTest(t) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: uuid.Nil, + ID: badorm.UUID(uuid.Nil), }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: time.Now().Add(time.Hour), } sessionRepositoryMock.On("GetAll", gormDB).Return([]*models.Session{session}, nil) @@ -288,12 +288,12 @@ func Test_pullFromDB_repoError(t *testing.T) { func Test_removeExpired(t *testing.T) { sessionRepositoryMock, service, logs, _ := setupTest(t) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: uuid.Nil, + ID: badorm.UUID(uuid.Nil), }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. @@ -313,12 +313,12 @@ func Test_removeExpired(t *testing.T) { func Test_removeExpired_RepositoryError(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: uuid.Nil, + ID: badorm.UUID(uuid.Nil), }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. @@ -331,12 +331,12 @@ func Test_removeExpired_RepositoryError(t *testing.T) { func Test_get(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) - uuidSample := uuid.New() + uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: uuid.Nil, + ID: badorm.UUID(uuid.Nil), }, - UserID: uuid.Nil, + UserID: badorm.UUID(uuid.Nil), ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. diff --git a/services/sessionservice/sessionctx.go b/services/sessionservice/sessionctx.go index 6710766a..a6c46b31 100644 --- a/services/sessionservice/sessionctx.go +++ b/services/sessionservice/sessionctx.go @@ -3,14 +3,14 @@ package sessionservice import ( "context" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" - "github.com/google/uuid" ) // The session claims passed in the request context type SessionClaims struct { - UserID uuid.UUID - SessionUUID uuid.UUID + UserID badorm.UUID + SessionUUID badorm.UUID } // Unique claim key type diff --git a/services/sessionservice/sessionctx_test.go b/services/sessionservice/sessionctx_test.go index 88b3f954..fe03bac0 100644 --- a/services/sessionservice/sessionctx_test.go +++ b/services/sessionservice/sessionctx_test.go @@ -4,16 +4,17 @@ import ( "context" "testing" + "github.com/ditrit/badaas/badorm" "github.com/google/uuid" "github.com/stretchr/testify/assert" ) func TestSessionCtx(t *testing.T) { ctx := context.Background() - sessionClaims := &SessionClaims{uuid.Nil, uuid.New()} + sessionClaims := &SessionClaims{badorm.UUID(uuid.Nil), badorm.UUID(uuid.New())} ctx = SetSessionClaimsContext(ctx, sessionClaims) claims := GetSessionClaimsFromContext(ctx) - assert.Equal(t, uuid.Nil, claims.UserID) + assert.Equal(t, badorm.UUID(uuid.Nil), claims.UserID) } func TestSessionCtxPanic(t *testing.T) { diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index 69ef4665..07805134 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -9,7 +9,6 @@ import ( "github.com/ditrit/badaas/persistence/models/dto" "github.com/ditrit/badaas/services/auth/protocols/basicauth" validator "github.com/ditrit/badaas/validators" - "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" ) @@ -29,7 +28,7 @@ var _ UserService = (*userServiceImpl)(nil) // The UserService concrete implementation type userServiceImpl struct { - userRepository badorm.CRUDRepository[models.User, uuid.UUID] + userRepository badorm.CRUDRepository[models.User, badorm.UUID] logger *zap.Logger db *gorm.DB } @@ -37,7 +36,7 @@ type userServiceImpl struct { // UserService constructor func NewUserService( logger *zap.Logger, - userRepository badorm.CRUDRepository[models.User, uuid.UUID], + userRepository badorm.CRUDRepository[models.User, badorm.UUID], db *gorm.DB, ) UserService { return &userServiceImpl{ diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index a27f0b52..d74dcdee 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -9,7 +9,6 @@ import ( "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" "github.com/ditrit/badaas/services/userservice" - "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -26,7 +25,7 @@ func TestNewUserService(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, badorm.UUID](t) userRepositoryMock.On("Create", gormDB, mock.Anything).Return(nil) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) @@ -53,7 +52,7 @@ func TestNewUserServiceDatabaseError(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, badorm.UUID](t) userRepositoryMock.On( "Create", gormDB, mock.Anything, ).Return( @@ -73,7 +72,7 @@ func TestNewUserServiceEmailNotValid(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, badorm.UUID](t) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) user, err := userService.NewUser("bob", "bob@", "1234") @@ -89,7 +88,7 @@ func TestGetUser(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, badorm.UUID](t) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) userRepositoryMock.On( "Create", gormDB, mock.Anything, @@ -124,7 +123,7 @@ func TestGetUserNoUserFound(t *testing.T) { observedZapCore, _ := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, badorm.UUID](t) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) userRepositoryMock.On( "Get", gormDB, models.UserEmailCondition("bobnotfound@email.com"), @@ -144,7 +143,7 @@ func TestGetUserWrongPassword(t *testing.T) { observedZapCore, _ := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - userRepositoryMock := badormMocks.NewCRUDRepository[models.User, uuid.UUID](t) + userRepositoryMock := badormMocks.NewCRUDRepository[models.User, badorm.UUID](t) userRepositoryMock.On( "Create", gormDB, mock.Anything, ).Return(nil) diff --git a/testintegration/badaas_test.go b/testintegration/badaas_test.go index 389b40f7..906df050 100644 --- a/testintegration/badaas_test.go +++ b/testintegration/badaas_test.go @@ -1,12 +1,14 @@ package testintegration import ( + "os" "path" "path/filepath" "runtime" "testing" "github.com/ditrit/badaas" + "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/services" "github.com/ditrit/verdeter" "github.com/spf13/cobra" @@ -30,6 +32,7 @@ func TestBaDaaS(t *testing.T) { _, b, _, _ := runtime.Caller(0) basePath := filepath.Dir(b) viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) + viper.Set(configuration.DatabaseDialectorKey, os.Getenv(dbTypeEnvKey)) err := badaas.ConfigCommandParameters(testsCommand) if err != nil { panic(err) @@ -64,7 +67,5 @@ func runBaDaaSTestSuites( ) { suite.Run(tGlobal, tsEAVService) - // let db cleaned - CleanDB(db) shutdowner.Shutdown() } diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index 89ec33fa..b550899a 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -1,6 +1,8 @@ package testintegration import ( + "fmt" + "os" "testing" "time" @@ -16,7 +18,20 @@ import ( "gorm.io/gorm" ) +const dbTypeEnvKey = "DB" + +const ( + username = "badaas" + password = "badaas" + host = "localhost" + port = 5000 + sslMode = "disable" + dbName = "badaas_db" +) + func TestBaDORM(t *testing.T) { + tGlobal = t + fx.New( fx.Provide(NewLoggerConfiguration), logger.LoggerModule, @@ -66,8 +81,6 @@ func runBaDORMTestSuites( suite.Run(tGlobal, tsCRUDRepository) suite.Run(tGlobal, tsCRUDUnsafeService) - // let db cleaned - CleanDB(db) shutdowner.Shutdown() } @@ -77,7 +90,22 @@ func NewLoggerConfiguration() configuration.LoggerConfiguration { } func NewGormDBConnection(logger *zap.Logger) (*gorm.DB, error) { - dsn := "user=badaas password=badaas host=localhost port=5000 sslmode=disable dbname=badaas_db" - // TODO codigo repetido en el ejemplo pero sin el logger - return badorm.ConnectToDSN(logger, dsn, 10, time.Duration(5)*time.Second) + dbType := configuration.DBDialector(os.Getenv(dbTypeEnvKey)) + switch dbType { + case configuration.PostgreSQL: + // TODO codigo repetido en el ejemplo pero sin el logger + return badorm.ConnectToDialector( + logger, + badorm.CreatePostgreSQLDialector(host, username, password, sslMode, dbName, port), + 10, time.Duration(5)*time.Second, + ) + case configuration.MySQL: + return badorm.ConnectToDialector( + logger, + badorm.CreateMySQLDialector(host, username, password, sslMode, dbName, port), + 10, time.Duration(5)*time.Second, + ) + default: + return nil, fmt.Errorf("unknown db %s", dbType) + } } diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index 09527610..d31a5775 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -4,12 +4,11 @@ package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - uuid "github.com/google/uuid" gorm "gorm.io/gorm" "time" ) -func BicycleId(v uuid.UUID) badorm.WhereCondition[models.Bicycle] { +func BicycleId(v badorm.UUID) badorm.WhereCondition[models.Bicycle] { return badorm.WhereCondition[models.Bicycle]{ Field: "id", Value: v, diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index a3bf1dd4..8f159442 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -4,12 +4,11 @@ package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - uuid "github.com/google/uuid" gorm "gorm.io/gorm" "time" ) -func CityId(v uuid.UUID) badorm.WhereCondition[models.City] { +func CityId(v badorm.UUID) badorm.WhereCondition[models.City] { return badorm.WhereCondition[models.City]{ Field: "id", Value: v, @@ -39,7 +38,7 @@ func CityName(v string) badorm.WhereCondition[models.City] { Value: v, } } -func CityCountryId(v uuid.UUID) badorm.WhereCondition[models.City] { +func CityCountryId(v badorm.UUID) badorm.WhereCondition[models.City] { return badorm.WhereCondition[models.City]{ Field: "country_id", Value: v, diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index c76c9d66..ebbfe1d7 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -4,12 +4,11 @@ package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - uuid "github.com/google/uuid" gorm "gorm.io/gorm" "time" ) -func CompanyId(v uuid.UUID) badorm.WhereCondition[models.Company] { +func CompanyId(v badorm.UUID) badorm.WhereCondition[models.Company] { return badorm.WhereCondition[models.Company]{ Field: "id", Value: v, diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index be4f9ac0..02657f66 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -4,12 +4,11 @@ package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - uuid "github.com/google/uuid" gorm "gorm.io/gorm" "time" ) -func CountryId(v uuid.UUID) badorm.WhereCondition[models.Country] { +func CountryId(v badorm.UUID) badorm.WhereCondition[models.Country] { return badorm.WhereCondition[models.Country]{ Field: "id", Value: v, diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 078503c9..431c9d7c 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -4,12 +4,11 @@ package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - uuid "github.com/google/uuid" gorm "gorm.io/gorm" "time" ) -func EmployeeId(v uuid.UUID) badorm.WhereCondition[models.Employee] { +func EmployeeId(v badorm.UUID) badorm.WhereCondition[models.Employee] { return badorm.WhereCondition[models.Employee]{ Field: "id", Value: v, @@ -46,7 +45,7 @@ func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condit T2Field: "id", } } -func EmployeeBossId(v *uuid.UUID) badorm.WhereCondition[models.Employee] { +func EmployeeBossId(v *badorm.UUID) badorm.WhereCondition[models.Employee] { return badorm.WhereCondition[models.Employee]{ Field: "boss_id", Value: v, diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index 4ae734f3..0a1a9676 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -4,12 +4,11 @@ package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - uuid "github.com/google/uuid" gorm "gorm.io/gorm" "time" ) -func PersonId(v uuid.UUID) badorm.WhereCondition[models.Person] { +func PersonId(v badorm.UUID) badorm.WhereCondition[models.Person] { return badorm.WhereCondition[models.Person]{ Field: "id", Value: v, diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index c55041e9..1147a724 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -4,13 +4,11 @@ package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - uuid "github.com/google/uuid" - pq "github.com/lib/pq" gorm "gorm.io/gorm" "time" ) -func ProductId(v uuid.UUID) badorm.WhereCondition[models.Product] { +func ProductId(v badorm.UUID) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ Field: "id", Value: v, @@ -76,12 +74,6 @@ func ProductMultiString(v models.MultiString) badorm.WhereCondition[models.Produ Value: v, } } -func ProductStringArray(v pq.StringArray) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "string_array", - Value: v, - } -} func ProductEmbeddedInt(v int) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ Field: "embedded_int", diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index ff59f4cf..817f33e0 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -4,12 +4,11 @@ package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - uuid "github.com/google/uuid" gorm "gorm.io/gorm" "time" ) -func SaleId(v uuid.UUID) badorm.WhereCondition[models.Sale] { +func SaleId(v badorm.UUID) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ Field: "id", Value: v, @@ -52,7 +51,7 @@ func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Conditio T2Field: "id", } } -func SaleProductId(v uuid.UUID) badorm.WhereCondition[models.Sale] { +func SaleProductId(v badorm.UUID) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ Field: "product_id", Value: v, @@ -65,7 +64,7 @@ func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[ T2Field: "id", } } -func SaleSellerId(v *uuid.UUID) badorm.WhereCondition[models.Sale] { +func SaleSellerId(v *badorm.UUID) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ Field: "seller_id", Value: v, diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 9c1fccda..5f6b1911 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -4,12 +4,11 @@ package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - uuid "github.com/google/uuid" gorm "gorm.io/gorm" "time" ) -func SellerId(v uuid.UUID) badorm.WhereCondition[models.Seller] { +func SellerId(v badorm.UUID) badorm.WhereCondition[models.Seller] { return badorm.WhereCondition[models.Seller]{ Field: "id", Value: v, @@ -39,7 +38,7 @@ func SellerName(v string) badorm.WhereCondition[models.Seller] { Value: v, } } -func SellerCompanyId(v *uuid.UUID) badorm.WhereCondition[models.Seller] { +func SellerCompanyId(v *badorm.UUID) badorm.WhereCondition[models.Seller] { return badorm.WhereCondition[models.Seller]{ Field: "company_id", Value: v, diff --git a/testintegration/crudRepository.go b/testintegration/crudRepository.go index ad89193f..83585b2e 100644 --- a/testintegration/crudRepository.go +++ b/testintegration/crudRepository.go @@ -13,12 +13,12 @@ import ( type CRUDRepositoryIntTestSuite struct { suite.Suite db *gorm.DB - crudProductRepository badorm.CRUDRepository[models.Product, uuid.UUID] + crudProductRepository badorm.CRUDRepository[models.Product, badorm.UUID] } func NewCRUDRepositoryIntTestSuite( db *gorm.DB, - crudProductRepository badorm.CRUDRepository[models.Product, uuid.UUID], + crudProductRepository badorm.CRUDRepository[models.Product, badorm.UUID], ) *CRUDRepositoryIntTestSuite { return &CRUDRepositoryIntTestSuite{ db: db, @@ -30,11 +30,15 @@ func (ts *CRUDRepositoryIntTestSuite) SetupTest() { CleanDB(ts.db) } +func (ts *CRUDRepositoryIntTestSuite) TearDownSuite() { + CleanDB(ts.db) +} + // ------------------------- GetByID -------------------------------- func (ts *CRUDRepositoryIntTestSuite) TestGetByIDReturnsErrorIfIDDontMatch() { ts.createProduct(0) - _, err := ts.crudProductRepository.GetByID(ts.db, uuid.Nil) + _, err := ts.crudProductRepository.GetByID(ts.db, badorm.UUID(uuid.Nil)) ts.Error(err, gorm.ErrRecordNotFound) } diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 1576a166..05e36d5b 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -5,31 +5,30 @@ import ( "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" "github.com/google/uuid" - "github.com/lib/pq" "gorm.io/gorm" "gotest.tools/assert" ) type CRUDServiceIntTestSuite struct { CRUDServiceCommonIntTestSuite - crudProductService badorm.CRUDService[models.Product, uuid.UUID] - crudSaleService badorm.CRUDService[models.Sale, uuid.UUID] - crudSellerService badorm.CRUDService[models.Seller, uuid.UUID] - crudCountryService badorm.CRUDService[models.Country, uuid.UUID] - crudCityService badorm.CRUDService[models.City, uuid.UUID] - crudEmployeeService badorm.CRUDService[models.Employee, uuid.UUID] - crudBicycleService badorm.CRUDService[models.Bicycle, uuid.UUID] + crudProductService badorm.CRUDService[models.Product, badorm.UUID] + crudSaleService badorm.CRUDService[models.Sale, badorm.UUID] + crudSellerService badorm.CRUDService[models.Seller, badorm.UUID] + crudCountryService badorm.CRUDService[models.Country, badorm.UUID] + crudCityService badorm.CRUDService[models.City, badorm.UUID] + crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID] + crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID] } func NewCRUDServiceIntTestSuite( db *gorm.DB, - crudProductService badorm.CRUDService[models.Product, uuid.UUID], - crudSaleService badorm.CRUDService[models.Sale, uuid.UUID], - crudSellerService badorm.CRUDService[models.Seller, uuid.UUID], - crudCountryService badorm.CRUDService[models.Country, uuid.UUID], - crudCityService badorm.CRUDService[models.City, uuid.UUID], - crudEmployeeService badorm.CRUDService[models.Employee, uuid.UUID], - crudBicycleService badorm.CRUDService[models.Bicycle, uuid.UUID], + crudProductService badorm.CRUDService[models.Product, badorm.UUID], + crudSaleService badorm.CRUDService[models.Sale, badorm.UUID], + crudSellerService badorm.CRUDService[models.Seller, badorm.UUID], + crudCountryService badorm.CRUDService[models.Country, badorm.UUID], + crudCityService badorm.CRUDService[models.City, badorm.UUID], + crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID], + crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID], ) *CRUDServiceIntTestSuite { return &CRUDServiceIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ @@ -48,14 +47,14 @@ func NewCRUDServiceIntTestSuite( // ------------------------- GetEntity -------------------------------- func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { - _, err := ts.crudProductService.GetEntity(uuid.Nil) + _, err := ts.crudProductService.GetEntity(badorm.UUID(uuid.Nil)) ts.Error(err, gorm.ErrRecordNotFound) } func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { ts.createProduct("", 0, 0, false, nil) - _, err := ts.crudProductService.GetEntity(uuid.New()) + _, err := ts.crudProductService.GetEntity(badorm.UUID(uuid.New())) ts.Error(err, gorm.ErrRecordNotFound) } @@ -365,27 +364,6 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPQArray() { - match := ts.createProduct("match", 1, 0, false, nil) - notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - match.StringArray = pq.StringArray{"salut", "hola"} - notMatch1.StringArray = pq.StringArray{"salut", "hola", "hello"} - - err := ts.db.Save(match).Error - ts.Nil(err) - - err = ts.db.Save(notMatch1).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductStringArray(pq.StringArray{"salut", "hola"}), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { match := ts.createProduct("match", 1, 0, false, nil) notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) diff --git a/testintegration/crudServiceCommon.go b/testintegration/crudServiceCommon.go index 69a6a5aa..88324eb8 100644 --- a/testintegration/crudServiceCommon.go +++ b/testintegration/crudServiceCommon.go @@ -1,8 +1,8 @@ package testintegration import ( + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/models" - "github.com/google/uuid" "github.com/stretchr/testify/suite" "gorm.io/gorm" ) @@ -16,6 +16,10 @@ func (ts *CRUDServiceCommonIntTestSuite) SetupTest() { CleanDB(ts.db) } +func (ts *CRUDServiceCommonIntTestSuite) TearDownSuite() { + CleanDB(ts.db) +} + func (ts *CRUDServiceCommonIntTestSuite) createProduct(stringV string, intV int, floatV float64, boolV bool, intP *int) *models.Product { entity := &models.Product{ String: stringV, @@ -43,7 +47,7 @@ func (ts *CRUDServiceCommonIntTestSuite) createSale(code int, product *models.Pr } func (ts *CRUDServiceCommonIntTestSuite) createSeller(name string, company *models.Company) *models.Seller { - var companyID *uuid.UUID + var companyID *badorm.UUID if company != nil { companyID = &company.ID } diff --git a/testintegration/crudUnsafeService.go b/testintegration/crudUnsafeService.go index 204b0d09..0b1fbf48 100644 --- a/testintegration/crudUnsafeService.go +++ b/testintegration/crudUnsafeService.go @@ -4,30 +4,29 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/ditrit/badaas/testintegration/models" - "github.com/google/uuid" "gorm.io/gorm" ) type CRUDUnsafeServiceIntTestSuite struct { CRUDServiceCommonIntTestSuite - crudProductService badorm.CRUDUnsafeService[models.Product, uuid.UUID] - crudSaleService badorm.CRUDUnsafeService[models.Sale, uuid.UUID] - crudSellerService badorm.CRUDUnsafeService[models.Seller, uuid.UUID] - crudCountryService badorm.CRUDUnsafeService[models.Country, uuid.UUID] - crudCityService badorm.CRUDUnsafeService[models.City, uuid.UUID] - crudEmployeeService badorm.CRUDUnsafeService[models.Employee, uuid.UUID] - crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, uuid.UUID] + crudProductService badorm.CRUDUnsafeService[models.Product, badorm.UUID] + crudSaleService badorm.CRUDUnsafeService[models.Sale, badorm.UUID] + crudSellerService badorm.CRUDUnsafeService[models.Seller, badorm.UUID] + crudCountryService badorm.CRUDUnsafeService[models.Country, badorm.UUID] + crudCityService badorm.CRUDUnsafeService[models.City, badorm.UUID] + crudEmployeeService badorm.CRUDUnsafeService[models.Employee, badorm.UUID] + crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, badorm.UUID] } func NewCRUDUnsafeServiceIntTestSuite( db *gorm.DB, - crudProductService badorm.CRUDUnsafeService[models.Product, uuid.UUID], - crudSaleService badorm.CRUDUnsafeService[models.Sale, uuid.UUID], - crudSellerService badorm.CRUDUnsafeService[models.Seller, uuid.UUID], - crudCountryService badorm.CRUDUnsafeService[models.Country, uuid.UUID], - crudCityService badorm.CRUDUnsafeService[models.City, uuid.UUID], - crudEmployeeService badorm.CRUDUnsafeService[models.Employee, uuid.UUID], - crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, uuid.UUID], + crudProductService badorm.CRUDUnsafeService[models.Product, badorm.UUID], + crudSaleService badorm.CRUDUnsafeService[models.Sale, badorm.UUID], + crudSellerService badorm.CRUDUnsafeService[models.Seller, badorm.UUID], + crudCountryService badorm.CRUDUnsafeService[models.Country, badorm.UUID], + crudCityService badorm.CRUDUnsafeService[models.City, badorm.UUID], + crudEmployeeService badorm.CRUDUnsafeService[models.Employee, badorm.UUID], + crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, badorm.UUID], ) *CRUDUnsafeServiceIntTestSuite { return &CRUDUnsafeServiceIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ diff --git a/testintegration/db_models.go b/testintegration/db_models.go index f9af2cf0..d4420a07 100644 --- a/testintegration/db_models.go +++ b/testintegration/db_models.go @@ -1,10 +1,10 @@ package testintegration import ( + "fmt" "log" "github.com/ditrit/badaas/badorm" - badaasModels "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/testintegration/models" "github.com/elliotchance/pie/v2" "gorm.io/gorm" @@ -29,23 +29,26 @@ func GetModels() badorm.GetModelsResult { } func CleanDB(db *gorm.DB) { - CleanDBTables(db, append( - pie.Reverse(ListOfTables), - []any{ - badaasModels.Value{}, - badaasModels.Attribute{}, - badaasModels.Entity{}, - badaasModels.EntityType{}, - }..., - )) + CleanDBTables(db, pie.Reverse(ListOfTables)) } func CleanDBTables(db *gorm.DB, listOfTables []any) { // clean database to ensure independency between tests for _, table := range listOfTables { - err := db.Unscoped().Where("1 = 1").Delete(table).Error + err := db.Exec( + fmt.Sprintf( + "DELETE FROM %s", + getTableName(db, table), + ), + ).Error if err != nil { log.Fatalln("could not clean database: ", err) } } } + +func getTableName(db *gorm.DB, entity any) string { + stmt := &gorm.Statement{DB: db} + stmt.Parse(entity) + return stmt.Schema.Table +} diff --git a/testintegration/eavService.go b/testintegration/eavService.go index bca53f3e..dd8401b8 100644 --- a/testintegration/eavService.go +++ b/testintegration/eavService.go @@ -3,6 +3,7 @@ package testintegration import ( "fmt" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services" @@ -10,13 +11,11 @@ import ( "github.com/elliotchance/pie/v2" "github.com/google/uuid" "github.com/stretchr/testify/suite" - "go.uber.org/zap" "gorm.io/gorm" ) type EAVServiceIntTestSuite struct { suite.Suite - logger *zap.Logger db *gorm.DB eavService services.EAVService entityRepository *repository.EntityRepository @@ -25,30 +24,44 @@ type EAVServiceIntTestSuite struct { } func NewEAVServiceIntTestSuite( - logger *zap.Logger, db *gorm.DB, eavService services.EAVService, entityRepository *repository.EntityRepository, ) *EAVServiceIntTestSuite { return &EAVServiceIntTestSuite{ - logger: logger, db: db, eavService: eavService, entityRepository: entityRepository, } } +func (ts *EAVServiceIntTestSuite) TearDownSuite() { + ts.cleanDB() +} + func (ts *EAVServiceIntTestSuite) SetupTest() { - CleanDB(ts.db) + ts.cleanDB() ts.entityType1 = ts.createEntityType("entityType1", nil) ts.entityType2 = ts.createEntityType("entityType2", ts.entityType1) } +func (ts *EAVServiceIntTestSuite) cleanDB() { + CleanDBTables( + ts.db, + []any{ + models.Value{}, + models.Attribute{}, + models.Entity{}, + models.EntityType{}, + }, + ) +} + // ------------------------- GetEntity -------------------------------- func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityDoesNotExist() { - _, err := ts.eavService.GetEntity(ts.entityType1.Name, uuid.New()) + _, err := ts.eavService.GetEntity(ts.entityType1.Name, badorm.UUID(uuid.New())) ts.ErrorContains(err, "record not found") } @@ -532,11 +545,11 @@ func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfRelationAttributePoint ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ Name: "relation2", ValueType: models.RelationValueType, - RelationTargetEntityTypeID: uuid.New(), + RelationTargetEntityTypeID: badorm.UUID(uuid.New()), }) params := map[string]any{ - "relation2": uuid.New().String(), + "relation2": badorm.UUID(uuid.New()).String(), } entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, params) ts.Nil(entity) @@ -626,7 +639,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGo } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfEntityDoesNotExist() { - _, err := ts.eavService.UpdateEntity(ts.entityType1.Name, uuid.New(), map[string]any{}) + _, err := ts.eavService.UpdateEntity(ts.entityType1.Name, badorm.UUID(uuid.New()), map[string]any{}) ts.ErrorIs(err, gorm.ErrRecordNotFound) } @@ -713,7 +726,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotExist entity := ts.createEntity(ts.entityType2, map[string]any{}) paramsUpdate := map[string]any{ - "relation": uuid.New().String(), + "relation": badorm.UUID(uuid.New()).String(), } _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, gorm.ErrRecordNotFound) @@ -758,7 +771,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFail // ------------------------- DeleteEntity ------------------------- func (ts *EAVServiceIntTestSuite) TestDeleteEntityReturnsErrorIfEntityDoesNotExist() { - err := ts.eavService.DeleteEntity(ts.entityType2.Name, uuid.New()) + err := ts.eavService.DeleteEntity(ts.entityType2.Name, badorm.UUID(uuid.New())) ts.ErrorIs(err, gorm.ErrRecordNotFound) } diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 679bf57a..684fddc7 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -2,12 +2,10 @@ package models import ( "database/sql/driver" - "errors" + "fmt" "strings" "github.com/ditrit/badaas/badorm" - "github.com/google/uuid" - "github.com/lib/pq" ) // TODO testear tambien en otras bases de datos @@ -24,12 +22,17 @@ type Company struct { type MultiString []string func (s *MultiString) Scan(src interface{}) error { - str, ok := src.(string) - if !ok { - return errors.New("failed to scan multistring field - source is not a string") + switch typedSrc := src.(type) { + case string: + *s = strings.Split(typedSrc, ",") + return nil + case []byte: + str := string(typedSrc) + *s = strings.Split(str, ",") + return nil + default: + return fmt.Errorf("failed to scan multistring field - source is not a string, is %T", src) } - *s = strings.Split(str, ",") - return nil } func (s MultiString) Value() (driver.Value, error) { @@ -61,7 +64,6 @@ type Product struct { Bool bool ByteArray []byte MultiString MultiString - StringArray pq.StringArray `gorm:"type:text[]"` ToBeEmbedded GormEmbedded ToBeGormEmbedded `gorm:"embedded;embeddedPrefix:gorm_embedded_"` } @@ -74,7 +76,7 @@ type Seller struct { badorm.UUIDModel Name string - CompanyID *uuid.UUID // Company HasMany Sellers (Company 0..1 -> 0..* Seller) + CompanyID *badorm.UUID // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } type Sale struct { @@ -85,11 +87,11 @@ type Sale struct { // Sale belongsTo Product (Sale 0..* -> 1 Product) Product Product - ProductID uuid.UUID + ProductID badorm.UUID // Sale HasOne Seller (Sale 0..* -> 0..1 Seller) Seller *Seller - SellerID *uuid.UUID + SellerID *badorm.UUID } func (m Sale) Equal(other Sale) bool { @@ -111,7 +113,7 @@ type City struct { badorm.UUIDModel Name string - CountryID uuid.UUID // Country HasOne City (Country 1 -> 1 City) + CountryID badorm.UUID // Country HasOne City (Country 1 -> 1 City) } func (m Country) Equal(other Country) bool { @@ -126,8 +128,8 @@ type Employee struct { badorm.UUIDModel Name string - Boss *Employee // Self-Referential Has One (Employee 0..* -> 0..1 Employee) - BossID *uuid.UUID + Boss *Employee `gorm:"constraint:OnDelete:SET NULL;"` // Self-Referential Has One (Employee 0..* -> 0..1 Employee) + BossID *badorm.UUID `gorm:"type:varchar(36)"` } func (m Employee) Equal(other Employee) bool { @@ -137,7 +139,7 @@ func (m Employee) Equal(other Employee) bool { type Person struct { badorm.UUIDModel - Name string `gorm:"unique"` + Name string `gorm:"unique;type:VARCHAR(255)"` } func (m Person) TableName() string { diff --git a/tools/badctl/cmd/gen/docker/postgres/init.sql b/tools/badctl/cmd/gen/docker/postgres/init.sql index 982ad984..682131d3 100644 --- a/tools/badctl/cmd/gen/docker/postgres/init.sql +++ b/tools/badctl/cmd/gen/docker/postgres/init.sql @@ -1 +1 @@ -CREATE EXTENSION "uuid-ossp"; \ No newline at end of file +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; \ No newline at end of file From 9b8e63360b7b5d13f0c32060421f22a34aeb7b77 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 14:40:36 +0200 Subject: [PATCH 260/467] pass tests for mysql --- persistence/repository/EntityRepository.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index 73e9835e..f726783d 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -10,6 +10,7 @@ import ( "github.com/elliotchance/pie/v2" "github.com/google/uuid" "go.uber.org/zap" + "gorm.io/driver/postgres" "gorm.io/gorm" ) @@ -47,11 +48,18 @@ func (r *EntityRepository) Get(tx *gorm.DB, entityTypeName string, id badorm.UUI return &entity, nil } +var postgresDialectorName string = postgres.Dialector{}.Name() + // Creates an entity and its values in the database // must be used in place of gorm's db.Save(entity) because of the bug // when using gorm with cockroachDB. For more info refer to: // https://github.com/FrancoLiberali/cockroachdb_gorm_bug func (r *EntityRepository) Create(tx *gorm.DB, entity *models.Entity) error { + if tx.Dialector.Name() != postgresDialectorName { + // in other than cockroachDB gorm's Save can be used normally + return tx.Save(entity).Error + } + now := time.Now() entity.ID = badorm.UUID(uuid.New()) From 496786820d4dcf584dbde0f0df754a84577155c1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 14:43:40 +0200 Subject: [PATCH 261/467] add validation of dialector --- badaas.go | 9 ++++----- configuration/DatabaseConfiguration.go | 5 ++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/badaas.go b/badaas.go index 4b81518b..a1ef2df6 100644 --- a/badaas.go +++ b/badaas.go @@ -109,11 +109,10 @@ func configDatabaseParameters(cfg *verdeter.VerdeterCommand) error { return err } cfg.SetRequired(configuration.DatabaseDialectorKey) - // TODO - // cfg.AddValidator( - // configuration.DatabaseDialectorKey, - // validators.AuthorizedValues(configuration.DBDialectors...), - // ) + cfg.AddValidator( + configuration.DatabaseDialectorKey, + validators.AuthorizedValues(configuration.DBDialectors...), + ) return nil } diff --git a/configuration/DatabaseConfiguration.go b/configuration/DatabaseConfiguration.go index f813733a..c86431d4 100644 --- a/configuration/DatabaseConfiguration.go +++ b/configuration/DatabaseConfiguration.go @@ -28,7 +28,10 @@ const ( MySQL DBDialector = "mysql" ) -var DBDialectors = []DBDialector{PostgreSQL, MySQL} +var DBDialectors = []string{ + string(PostgreSQL), + string(MySQL), +} // Hold the configuration values for the database connection type DatabaseConfiguration interface { From b2c1ad6ac7193d27188b6eec23fe0a832b143ca8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 15:09:06 +0200 Subject: [PATCH 262/467] add mysql support in docker generator --- badaas.example.yml | 16 ++++++++++------ tools/badctl/cmd/gen/config/badaas.yml | 4 ++-- tools/badctl/cmd/gen/docker.go | 12 +++++++++++- .../gen/docker/cockroachdb/docker-compose.yml | 3 +-- .../cmd/gen/docker/mysql/docker-compose.yml | 13 +++++++++++++ .../cmd/gen/docker/postgres/docker-compose.yml | 6 +++--- 6 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 tools/badctl/cmd/gen/docker/mysql/docker-compose.yml diff --git a/badaas.example.yml b/badaas.example.yml index ba862d34..bbd7306c 100644 --- a/badaas.example.yml +++ b/badaas.example.yml @@ -1,18 +1,18 @@ # The settings for the database. database: - # The host of the database server. + # The host of the database server. # (mandatory) host: e2e-db-1 - # The port of the database server. + # The port of the database server. # (mandatory) port: 26257 - # The sslmode of the connection to the database server. + # The sslmode of the connection to the database server. # (mandatory) sslmode: disable - # The username of the account on the database server. + # The username of the account on the database server. # (mandatory) username: root @@ -20,7 +20,7 @@ database: # (mandatory) password: postgres - # The settings for the initialization of the database server. + # The settings for the initialization of the database server. init: # Number of time badaas will try to establish a connection to the database server. # default (10) @@ -30,6 +30,10 @@ database: # default (5) retryTime: 5 + # dialector to use in communication with database (postgresql | mysql) + # (mandatory) + dialector: postgresql + # The settings for the http server. server: # The address to bind badaas to. @@ -47,7 +51,7 @@ server: # The settings for the pagination. pagination: page: - # The maximum number of record per page + # The maximum number of record per page. # default (100) max: 100 diff --git a/tools/badctl/cmd/gen/config/badaas.yml b/tools/badctl/cmd/gen/config/badaas.yml index 8533c573..aad03146 100644 --- a/tools/badctl/cmd/gen/config/badaas.yml +++ b/tools/badctl/cmd/gen/config/badaas.yml @@ -1,9 +1,9 @@ database: host: badaas-db name: badaas_db - password: postgres + password: badaas sslmode: disable - username: root + username: badaas init: retry: 10 retryTime: 5 diff --git a/tools/badctl/cmd/gen/docker.go b/tools/badctl/cmd/gen/docker.go index 3217d338..66bed4e0 100644 --- a/tools/badctl/cmd/gen/docker.go +++ b/tools/badctl/cmd/gen/docker.go @@ -7,6 +7,7 @@ import ( "path/filepath" "strings" + "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/verdeter" "github.com/ditrit/verdeter/validators" @@ -32,13 +33,21 @@ const ( DBProviderKey = "db_provider" Cockroachdb = "cockroachdb" Postgres = "postgres" + MySQL = "mysql" ) -var DBProviders = []string{Cockroachdb, Postgres} +var DBProviders = []string{Cockroachdb, Postgres, MySQL} var DBPorts = map[string]int{ Cockroachdb: 26257, Postgres: 5432, + MySQL: 3306, +} + +var DBDialectors = map[string]configuration.DBDialector{ + Cockroachdb: configuration.PostgreSQL, + Postgres: configuration.PostgreSQL, + MySQL: configuration.MySQL, } func init() { @@ -98,6 +107,7 @@ func copyBadaasConfig(dbProvider string) { } configData["database"].(map[string]any)["port"] = DBPorts[dbProvider] + configData["database"].(map[string]any)["dialector"] = string(DBDialectors[dbProvider]) configBytes, err := yaml.Marshal(&configData) if err != nil { diff --git a/tools/badctl/cmd/gen/docker/cockroachdb/docker-compose.yml b/tools/badctl/cmd/gen/docker/cockroachdb/docker-compose.yml index fc9cef32..c97e448a 100644 --- a/tools/badctl/cmd/gen/docker/cockroachdb/docker-compose.yml +++ b/tools/badctl/cmd/gen/docker/cockroachdb/docker-compose.yml @@ -5,11 +5,10 @@ services: image: cockroachdb/cockroach:latest container_name: badaas-db ports: - - "26257:26257" - "8080:8080" # Web based dashboard + # TODO make this container secure command: start-single-node --insecure volumes: - "${PWD}/badaas/docker/db/.cockroach-data:/cockroach/cockroach-data" environment: - - COCKROACH_USER=root - COCKROACH_DATABASE=badaas_db diff --git a/tools/badctl/cmd/gen/docker/mysql/docker-compose.yml b/tools/badctl/cmd/gen/docker/mysql/docker-compose.yml new file mode 100644 index 00000000..62dbef89 --- /dev/null +++ b/tools/badctl/cmd/gen/docker/mysql/docker-compose.yml @@ -0,0 +1,13 @@ +version: '3.5' + +services: + db: + image: mysql:latest + container_name: badaas-db + environment: + MYSQL_DATABASE: 'badaas_db' + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-badaas} + MYSQL_USER: ${MYSQL_USER:-badaas} + MYSQL_PASSWORD: ${MYSQL_PASSWORD:-badaas} + volumes: + - "${PWD}/badaas/docker/db/.mysql-data:/var/lib/mysql" \ No newline at end of file diff --git a/tools/badctl/cmd/gen/docker/postgres/docker-compose.yml b/tools/badctl/cmd/gen/docker/postgres/docker-compose.yml index 9c40bc35..c1d04315 100644 --- a/tools/badctl/cmd/gen/docker/postgres/docker-compose.yml +++ b/tools/badctl/cmd/gen/docker/postgres/docker-compose.yml @@ -5,10 +5,10 @@ services: image: postgres:latest container_name: badaas-db environment: - POSTGRES_USER: ${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} + POSTGRES_USER: ${POSTGRES_USER:-badaas} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-badaas} POSTGRES_DB: badaas_db PGDATA: /data/postgres volumes: - .:/docker-entrypoint-initdb.d/ - restart: unless-stopped \ No newline at end of file + - "${PWD}/badaas/docker/db/.postgres-data:/data/postgres" \ No newline at end of file From 505395351ba343b17db51a0b5a5aec7afe7fa903 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 15:58:44 +0200 Subject: [PATCH 263/467] use binary for mysql uuid --- badorm/baseModels.go | 19 +++++++++++++++++-- persistence/repository/EntityRepository.go | 3 ++- services/eav.go | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/badorm/baseModels.go b/badorm/baseModels.go index 8cd01ee4..459bb60e 100644 --- a/badorm/baseModels.go +++ b/badorm/baseModels.go @@ -1,12 +1,14 @@ package badorm import ( + "context" "database/sql/driver" "time" "github.com/google/uuid" "gorm.io/gorm" + "gorm.io/gorm/clause" "gorm.io/gorm/schema" ) @@ -40,8 +42,7 @@ type UUID uuid.UUID func (id UUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { switch db.Dialector.Name() { case "mysql": - return "varchar(36)" - // return "binary(16)" + return "binary(16)" case "postgres": return "uuid" } @@ -84,6 +85,20 @@ func (id *UUID) Scan(src interface{}) error { return (*uuid.UUID)(id).Scan(src) } +func (id UUID) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { + if len(id) == 0 { + return gorm.Expr("NULL") + } + + switch db.Dialector.Name() { + case "mysql": + binary, _ := id.MarshalBinary() + return gorm.Expr("?", binary) + } + + return gorm.Expr("?", id.String()) +} + func (id UUID) Value() (driver.Value, error) { return uuid.UUID(id).Value() } diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index f726783d..d0ef0f1a 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -121,8 +121,9 @@ func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attribut case bool: stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.BooleanValueType) case string: - _, err := uuid.Parse(expectedValueTyped) + uuid, err := uuid.Parse(expectedValueTyped) if err == nil { + expectedValue = badorm.UUID(uuid) stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.RelationValueType) } else { stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.StringValueType) diff --git a/services/eav.go b/services/eav.go index 921ddec6..0e5f9765 100644 --- a/services/eav.go +++ b/services/eav.go @@ -236,7 +236,7 @@ func (eavService *eavServiceImpl) DeleteEntity(entityTypeName string, entityID b return err } - err = tx.Where("entity_id = ?", entityID.String()).Delete(&models.Value{}).Error + err = tx.Where("entity_id = ?", entityID).Delete(&models.Value{}).Error if err != nil { return err } From 44e9fbc386164dac380b8ce5b0ac63683f8ae847 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 16:31:11 +0200 Subject: [PATCH 264/467] add strategy matrix to run int test with multiple dbs --- .github/workflows/CI.yml | 22 ++++++++++++++++------ Makefile | 4 ---- sonar-project.properties | 2 +- testintegration/badorm_test.go | 1 - 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 3235d52e..02d4797a 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -76,6 +76,9 @@ jobs: name: Integration tests needs: [unit-tests] runs-on: ubuntu-latest + strategy: + matrix: + db: [postgresql, cockroachdb, mysql] steps: - uses: actions/checkout@v3 with: @@ -84,12 +87,14 @@ jobs: with: go-version: '^1.18' cache: true + - name: Start containers + run: docker compose -f "docker/${{ matrix.db }}/docker-compose.yml" up -d - name: Run test - run: make test_integration_and_cover + run: DB=${{ matrix.db }} go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v - uses: actions/upload-artifact@v3 with: - name: coverage_int - path: coverage_int.out + name: coverage_int_${{ matrix.db }} + path: coverage_int_${{ matrix.db }}.out - name: Stop containers if: always() run: docker stop badaas-test-db @@ -139,11 +144,16 @@ jobs: with: name: coverage_unit path: coverage_unit.out - - name: Download int tests line coverage report + - name: Download postgresql int tests line coverage report + uses: actions/download-artifact@v3 + with: + name: coverage_int_postgresql + path: coverage_int_postgresql.out + - name: Download mysql int tests line coverage report uses: actions/download-artifact@v3 with: - name: coverage_int - path: coverage_int.out + name: coverage_int_mysql + path: coverage_int_mysql.out - name: SonarCloud Scan uses: sonarsource/sonarcloud-github-action@master env: diff --git a/Makefile b/Makefile index f3be429a..07e08169 100644 --- a/Makefile +++ b/Makefile @@ -32,10 +32,6 @@ test_integration_mysql: mysql test_integration: test_integration_postgresql -# TODO -test_integration_and_cover: test_db - go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v - test_e2e: docker compose -f "docker/cockroachdb/docker-compose.yml" -f "docker/test_api/docker-compose.yml" up -d ./docker/wait_for_api.sh 8000/info diff --git a/sonar-project.properties b/sonar-project.properties index f2836946..aee4d4ab 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -6,4 +6,4 @@ sonar.sources=. sonar.exclusions=**/*_test.go,mocks/***,vendor/***,test_integration/***,test_e2e/*** sonar.tests=. sonar.test.inclusions=**/*_test.go -sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_int.out/coverage_int.out +sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_int_postgresql.out/coverage_int_postgresql.out,coverage_int_mysql.out/coverage_int_mysql.out diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index b550899a..55461b74 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -93,7 +93,6 @@ func NewGormDBConnection(logger *zap.Logger) (*gorm.DB, error) { dbType := configuration.DBDialector(os.Getenv(dbTypeEnvKey)) switch dbType { case configuration.PostgreSQL: - // TODO codigo repetido en el ejemplo pero sin el logger return badorm.ConnectToDialector( logger, badorm.CreatePostgreSQLDialector(host, username, password, sslMode, dbName, port), From 047a9b89dbb67133723f845e061b32c09ac6ed5f Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 16:40:49 +0200 Subject: [PATCH 265/467] fix gosec --- testintegration/db_models.go | 2 +- tools/badctl/cmd/gen/conditions/condition.go | 26 ++++++-------------- tools/badctl/cmd/gen/conditions/file.go | 9 ++----- 3 files changed, 10 insertions(+), 27 deletions(-) diff --git a/testintegration/db_models.go b/testintegration/db_models.go index d4420a07..b9cc295d 100644 --- a/testintegration/db_models.go +++ b/testintegration/db_models.go @@ -49,6 +49,6 @@ func CleanDBTables(db *gorm.DB, listOfTables []any) { func getTableName(db *gorm.DB, entity any) string { stmt := &gorm.Statement{DB: db} - stmt.Parse(entity) + _ = stmt.Parse(entity) return stmt.Schema.Table } diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index f8ec47b6..f0a38caf 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -21,21 +21,17 @@ type Condition struct { destPkg string } -func NewCondition(destPkg string, objectType Type, field Field) (*Condition, error) { +func NewCondition(destPkg string, objectType Type, field Field) *Condition { condition := &Condition{ param: NewJenParam(), destPkg: destPkg, } - err := condition.generate(objectType, field) - if err != nil { - return nil, err - } - - return condition, nil + condition.generate(objectType, field) + return condition } // Generate the condition between the object and the field -func (condition *Condition) generate(objectType Type, field Field) error { +func (condition *Condition) generate(objectType Type, field Field) { switch fieldType := field.Type.Type.(type) { case *types.Basic: // the field is a basic type (string, int, etc) @@ -47,7 +43,7 @@ func (condition *Condition) generate(objectType Type, field Field) error { ) case *types.Named: // the field is a named type (user defined structs) - return condition.generateForNamedType( + condition.generateForNamedType( objectType, field, ) @@ -71,8 +67,6 @@ func (condition *Condition) generate(objectType Type, field Field) error { default: log.Logger.Debugf("struct field type not handled: %T", fieldType) } - - return nil } // Generate condition between the object and the field when the field is a slice @@ -111,17 +105,13 @@ func (condition *Condition) generateForSlice(objectType Type, field Field) { } // Generate condition between object and field when the field is a named type (user defined struct) -func (condition *Condition) generateForNamedType(objectType Type, field Field) error { +func (condition *Condition) generateForNamedType(objectType Type, field Field) { _, err := field.Type.BadORMModelStruct() if err == nil { // field is a BaDORM Model // TODO que pasa si esta en otro package? se importa solo? - hasFK, err := objectType.HasFK(field) - if err != nil { - return err - } - + hasFK, _ := objectType.HasFK(field) if hasFK { // belongsTo relation condition.generateJoinWithFK( @@ -154,8 +144,6 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) e log.Logger.Debugf("struct field type not handled: %s", field.TypeString()) } } - - return nil } // Generate a WhereCondition between object and field diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 452ef769..89087585 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -72,14 +72,9 @@ func (file File) generateConditionsForEachField(object types.Object, fields []Fi field, )...) } else { - newCondition, err := NewCondition( + conditions = append(conditions, NewCondition( file.destPkg, Type{object.Type()}, field, - ) - if err != nil { - cmderrors.FailErr(err) - } - - conditions = append(conditions, newCondition) + )) } } From f15b9bc2c935bf18391ec7cb86c37ec956575952 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 16:46:06 +0200 Subject: [PATCH 266/467] delete test that fails indeterministically --- .../repository/EntityRepository_test.go | 46 ------------------- 1 file changed, 46 deletions(-) diff --git a/persistence/repository/EntityRepository_test.go b/persistence/repository/EntityRepository_test.go index abff34e1..a7198dae 100644 --- a/persistence/repository/EntityRepository_test.go +++ b/persistence/repository/EntityRepository_test.go @@ -228,52 +228,6 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMap() { s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) } -func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMapWith2Values() { - attributeName := "attrName" - innerAttributeName1 := "innerAttrName1" - innerAttributeValue1 := "a string" - innerAttributeName2 := "innerAttrName2" - innerAttributeValue2 := "other string" - attributeValue := map[string]any{ - innerAttributeName1: innerAttributeValue1, - innerAttributeName2: innerAttributeValue2, - } - s.mock.ExpectQuery(regexp.QuoteMeta( - `SELECT entities.* FROM "entities" - JOIN attributes attributes_attrName ON - attributes_attrName.entity_type_id = entities.entity_type_id AND - attributes_attrName.name = $1 - JOIN values_ values_attrName ON - values_attrName.attribute_id = attributes_attrName.id AND - values_attrName.entity_id = entities.id AND - attributes_attrName.value_type = 'relation' - JOIN entities entities_attrName ON - entities_attrName.id = values_attrName.relation_val AND - entities_attrName.deleted_at IS NULL - JOIN attributes attributes_attrName_innerAttrName1 ON - attributes_attrName_innerAttrName1.entity_type_id = entities_attrName.entity_type_id AND - attributes_attrName_innerAttrName1.name = $2 - JOIN values_ values_attrName_innerAttrName1 ON - values_attrName_innerAttrName1.attribute_id = attributes_attrName_innerAttrName1.id AND - values_attrName_innerAttrName1.entity_id = entities_attrName.id AND - attributes_attrName_innerAttrName1.value_type = 'string' AND - values_attrName_innerAttrName1.string_val = $3 - JOIN attributes attributes_attrName_innerAttrName2 ON - attributes_attrName_innerAttrName2.entity_type_id = entities_attrName.entity_type_id AND - attributes_attrName_innerAttrName2.name = $4 - JOIN values_ values_attrName_innerAttrName2 ON - values_attrName_innerAttrName2.attribute_id = attributes_attrName_innerAttrName2.id AND - values_attrName_innerAttrName2.entity_id = entities_attrName.id AND - attributes_attrName_innerAttrName2.value_type = 'string' AND - values_attrName_innerAttrName2.string_val = $5 - WHERE entities.entity_type_id = $6 AND - "entities"."deleted_at" IS NULL`)). - WithArgs(attributeName, innerAttributeName1, innerAttributeValue1, innerAttributeName2, innerAttributeValue2, s.uuid). - WillReturnRows(sqlmock.NewRows(nil)) - - s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) -} - func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckAndJoinWithEntitiesForMapWith2Values() { attributeName1 := "attrName1" innerAttributeName1 := "innerAttrName1" From dda121eb66069933e65ec81625cd43f072117e98 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 16:52:24 +0200 Subject: [PATCH 267/467] fix db dialector for cockroach7 --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 02d4797a..d9a64df9 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -90,7 +90,7 @@ jobs: - name: Start containers run: docker compose -f "docker/${{ matrix.db }}/docker-compose.yml" up -d - name: Run test - run: DB=${{ matrix.db }} go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v + run: DB=${{ fromJson('{ "postgresql": "postgresql", "cockroachdb": "postgresql", "mysql": "mysql" }')[matrix.db] }} go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v - uses: actions/upload-artifact@v3 with: name: coverage_int_${{ matrix.db }} From 589fbff184b0447b46f1bda1fa6fa45b03d3400a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 16:59:36 +0200 Subject: [PATCH 268/467] fix github ci? --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index d9a64df9..6557fa96 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -90,7 +90,7 @@ jobs: - name: Start containers run: docker compose -f "docker/${{ matrix.db }}/docker-compose.yml" up -d - name: Run test - run: DB=${{ fromJson('{ "postgresql": "postgresql", "cockroachdb": "postgresql", "mysql": "mysql" }')[matrix.db] }} go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v + run: DB=${{ fromJson('{ \"postgresql\": \"postgresql\", \"cockroachdb\": \"postgresql\", \"mysql\": \"mysql\" }')[matrix.db] }} go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v - uses: actions/upload-artifact@v3 with: name: coverage_int_${{ matrix.db }} From a1258a70bfcf544573f82ec28ffe01cc3786d7a5 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 17:04:02 +0200 Subject: [PATCH 269/467] fix github ci? 2 --- .github/workflows/CI.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 6557fa96..090c7e44 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -89,8 +89,25 @@ jobs: cache: true - name: Start containers run: docker compose -f "docker/${{ matrix.db }}/docker-compose.yml" up -d + - uses: kanga333/variable-mapper@master + id: export + with: + key: ${{ [matrix.db] }} + map: | + { + "postgresql": { + "dialector": "postgresql" + }, + "cockroachdb": { + "dialector": "postgresql" + }, + "mysql": { + "dialector": "mysql" + } + } + export_to: env - name: Run test - run: DB=${{ fromJson('{ \"postgresql\": \"postgresql\", \"cockroachdb\": \"postgresql\", \"mysql\": \"mysql\" }')[matrix.db] }} go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v + run: DB=${{ env.dialector }} go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v - uses: actions/upload-artifact@v3 with: name: coverage_int_${{ matrix.db }} From e39352c1975bc3a14f6a1a7ff0e56b0774bd35d9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 17:04:57 +0200 Subject: [PATCH 270/467] fix github ci? 3 --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 090c7e44..c75501e6 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -92,7 +92,7 @@ jobs: - uses: kanga333/variable-mapper@master id: export with: - key: ${{ [matrix.db] }} + key: ${{ matrix.db }} map: | { "postgresql": { From 6c12325ca76925381658179a978310a69bc82322 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 17:08:02 +0200 Subject: [PATCH 271/467] go sec before sonarcloud --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index c75501e6..86f818dd 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -150,7 +150,7 @@ jobs: sonarcloud: name: SonarCloud - needs: [unit-tests, check-style, integration-tests] + needs: [check-style, go-sec, integration-tests] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From c960e9a1527b21ef140dda599dccf8f146fd36d8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 18:13:33 +0200 Subject: [PATCH 272/467] fix test_e2e --- docker/test_api/badaas.yml | 5 +++-- go.work.sum | 3 +-- persistence/gormdatabase/db.go | 18 ++++++++++++------ test_e2e/badaas_e2e_test.go | 13 ++++++++----- test_e2e/features/badorm.feature | 2 +- testintegration/db_models.go | 14 +------------- 6 files changed, 26 insertions(+), 29 deletions(-) diff --git a/docker/test_api/badaas.yml b/docker/test_api/badaas.yml index 71c3ab7e..cf36ff4a 100644 --- a/docker/test_api/badaas.yml +++ b/docker/test_api/badaas.yml @@ -10,12 +10,13 @@ database: host: badaas-test-db port: 26257 sslmode: disable - username: root - password: postgres + username: badaas + password: badaas name: badaas_db init: retry: 10 retryTime: 5 + dialector: postgresql logger: mode: dev diff --git a/go.work.sum b/go.work.sum index 6a91a1be..d01cd1df 100644 --- a/go.work.sum +++ b/go.work.sum @@ -180,8 +180,6 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -288,6 +286,7 @@ github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3x github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index 88e95b14..ae3407cc 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -1,6 +1,8 @@ package gormdatabase import ( + "fmt" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/configuration" "go.uber.org/zap" @@ -8,7 +10,7 @@ import ( ) // Create the dsn string from the configuration -func createDialectorFromConf(databaseConfiguration configuration.DatabaseConfiguration) gorm.Dialector { +func createDialectorFromConf(databaseConfiguration configuration.DatabaseConfiguration) (gorm.Dialector, error) { switch databaseConfiguration.GetDialector() { case configuration.PostgreSQL: return badorm.CreatePostgreSQLDialector( @@ -18,7 +20,7 @@ func createDialectorFromConf(databaseConfiguration configuration.DatabaseConfigu databaseConfiguration.GetSSLMode(), databaseConfiguration.GetDBName(), databaseConfiguration.GetPort(), - ) + ), nil case configuration.MySQL: return badorm.CreateMySQLDialector( databaseConfiguration.GetHost(), @@ -27,10 +29,10 @@ func createDialectorFromConf(databaseConfiguration configuration.DatabaseConfigu databaseConfiguration.GetSSLMode(), databaseConfiguration.GetDBName(), databaseConfiguration.GetPort(), - ) + ), nil + default: + return nil, fmt.Errorf("unknown dialector: %s", databaseConfiguration.GetDialector()) } - - return nil } // Creates the database object with using the database configuration and exec the setup @@ -38,9 +40,13 @@ func SetupDatabaseConnection( logger *zap.Logger, databaseConfiguration configuration.DatabaseConfiguration, ) (*gorm.DB, error) { + dialector, err := createDialectorFromConf(databaseConfiguration) + if err != nil { + return nil, err + } return badorm.ConnectToDialector( logger, - createDialectorFromConf(databaseConfiguration), + dialector, databaseConfiguration.GetRetry(), databaseConfiguration.GetRetryTime(), ) diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index f63b87bc..7ca9dd37 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -41,17 +41,20 @@ func TestMain(_ *testing.M) { pflag.Parse() opts.Paths = pflag.Args() - logger, _ := zap.NewDevelopment() - var err error + logger, err := zap.NewDevelopment() + if err != nil { + panic(err) + } - viper.Set(configuration.DatabasePortKey, 26257) + viper.Set(configuration.DatabasePortKey, 5000) viper.Set(configuration.DatabaseHostKey, "localhost") viper.Set(configuration.DatabaseNameKey, "badaas_db") - viper.Set(configuration.DatabaseUsernameKey, "root") - viper.Set(configuration.DatabasePasswordKey, "postgres") + viper.Set(configuration.DatabaseUsernameKey, "badaas") + viper.Set(configuration.DatabasePasswordKey, "badaas") viper.Set(configuration.DatabaseSslmodeKey, "disable") viper.Set(configuration.DatabaseRetryKey, 10) viper.Set(configuration.DatabaseRetryDurationKey, 5) + viper.Set(configuration.DatabaseDialectorKey, string(configuration.PostgreSQL)) db, err = gormdatabase.SetupDatabaseConnection( logger, configuration.NewDatabaseConfiguration(), diff --git a/test_e2e/features/badorm.feature b/test_e2e/features/badorm.feature index edf3db28..22061f47 100644 --- a/test_e2e/features/badorm.feature +++ b/test_e2e/features/badorm.feature @@ -1,4 +1,4 @@ -Feature: Saving and querying objects in the database using the BaDorm +Feature: Saving and querying objects in the database using BaDORM Scenario: Created objects can be queried by a property Given a sale object exists for product "1", code "1" and description "sale1" And a sale object exists for product "2", code "2" and description "sale2" diff --git a/testintegration/db_models.go b/testintegration/db_models.go index b9cc295d..4dd2bd84 100644 --- a/testintegration/db_models.go +++ b/testintegration/db_models.go @@ -1,7 +1,6 @@ package testintegration import ( - "fmt" "log" "github.com/ditrit/badaas/badorm" @@ -35,20 +34,9 @@ func CleanDB(db *gorm.DB) { func CleanDBTables(db *gorm.DB, listOfTables []any) { // clean database to ensure independency between tests for _, table := range listOfTables { - err := db.Exec( - fmt.Sprintf( - "DELETE FROM %s", - getTableName(db, table), - ), - ).Error + err := db.Unscoped().Where("1 = 1").Delete(table).Error if err != nil { log.Fatalln("could not clean database: ", err) } } } - -func getTableName(db *gorm.DB, entity any) string { - stmt := &gorm.Statement{DB: db} - _ = stmt.Parse(entity) - return stmt.Schema.Table -} From 24ebb495fd597c7acc1e012ae6cb66d755bfc64a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 18:17:29 +0200 Subject: [PATCH 273/467] fix coverage file names --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 86f818dd..41474286 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -107,7 +107,7 @@ jobs: } export_to: env - name: Run test - run: DB=${{ env.dialector }} go test ./testintegration -coverpkg=./... -coverprofile=coverage_int.out -v + run: DB=${{ env.dialector }} go test ./testintegration -coverpkg=./... -coverprofile=coverage_int_${{ matrix.db }}.out -v - uses: actions/upload-artifact@v3 with: name: coverage_int_${{ matrix.db }} From e6692668c161919229289751a91558f51284664d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 18:25:29 +0200 Subject: [PATCH 274/467] fix gitignore --- .gitignore | 3 ++- go.work.sum | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a24b613e..f78f7b44 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,5 @@ node* # binary output badaas -badctl \ No newline at end of file +badctl +!tools/badctl/ \ No newline at end of file diff --git a/go.work.sum b/go.work.sum index ea9222b5..83c00db5 100644 --- a/go.work.sum +++ b/go.work.sum @@ -277,6 +277,7 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/sagikazarmark/crypt v0.9.0/go.mod h1:RnH7sEhxfdnPm1z+XMgSLjWTEIjyK4z2dw6+4vHTMuo= @@ -308,6 +309,7 @@ golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -350,6 +352,7 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -408,6 +411,7 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= From ddaa65f74863e34cc501e1d3af8a4d6dc2ebaf01 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 18:43:17 +0200 Subject: [PATCH 275/467] fix execute ci on every pr --- .github/workflows/CI.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 341f1ccf..2a2a2220 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -5,8 +5,7 @@ on: - main pull_request: types: [opened, synchronize, reopened] - branches: - - master + jobs: branch-naming-rules: name: Check branch name From aebc4e8a5622f8e9914c908c31ca8a4089de6546 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 1 Jun 2023 19:00:21 +0200 Subject: [PATCH 276/467] fix lint --- commands/initServerCommands.go | 3 +++ go.mod | 2 +- go.sum | 3 --- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/commands/initServerCommands.go b/commands/initServerCommands.go index 8c40229e..edf42806 100644 --- a/commands/initServerCommands.go +++ b/commands/initServerCommands.go @@ -14,6 +14,9 @@ func initServerCommands(cfg *verdeter.VerdeterCommand) error { cfg.SetDefault(configuration.ServerTimeoutKey, 15) err = cfg.GKey(configuration.ServerHostKey, verdeter.IsStr, "", "Address to bind (default is 0.0.0.0)") + if err != nil { + return err + } cfg.SetDefault(configuration.ServerHostKey, "0.0.0.0") err = cfg.GKey(configuration.ServerPortKey, verdeter.IsInt, "p", "Port to bind (default is 8000)") diff --git a/go.mod b/go.mod index 0ee7fcec..e9ca74bd 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/elliotchance/pie/v2 v2.5.2 github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/gofrs/uuid v4.0.0+incompatible // indirect - github.com/google/go-cmp v0.5.9 + github.com/google/go-cmp v0.5.9 // indirect github.com/goph/emperror v0.17.2 // indirect github.com/gorilla/handlers v1.5.1 github.com/hashicorp/go-immutable-radix v1.3.1 // indirect diff --git a/go.sum b/go.sum index 022bd4c9..9150aa21 100644 --- a/go.sum +++ b/go.sum @@ -93,8 +93,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/ditrit/verdeter v0.3.2-0.20230118160022-0caba70148cd h1:r2NABj0IHkzEtp4ZGaKpWNxsWAhjQU4ezxyELvXObrk= -github.com/ditrit/verdeter v0.3.2-0.20230118160022-0caba70148cd/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= github.com/ditrit/verdeter v0.4.0 h1:DzEOFauuXEGNQYP6OgYtHwEyb3w9riem99u0xE/l7+o= github.com/ditrit/verdeter v0.4.0/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= github.com/elliotchance/pie/v2 v2.5.2 h1:jRENMmysCljhUmyT8ITKV0Atp6Lukm3XpeqaI87POsM= @@ -167,7 +165,6 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= From 5f93fe41f4a8b59b576002d616209828485ecdc7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 2 Jun 2023 11:45:31 +0200 Subject: [PATCH 277/467] refactor to reduce not tested err != nil --- commands/initDatabaseCommands.go | 58 ------------------- commands/initInitialisationCommands.go | 17 ------ commands/initLoggerCommands.go | 23 -------- commands/initServerCommands.go | 42 -------------- commands/initSessionCommands.go | 30 ---------- commands/rootCmd.go | 27 +-------- configuration/CommandsInitializer.go | 54 +++++++++++++++++ configuration/ConfigCommandsInitializer.go | 17 ++++++ configuration/DatabaseCommandsInitializer.go | 55 ++++++++++++++++++ .../InitializationCommandsInitializer.go | 19 ++++++ configuration/KeySetter.go | 45 ++++++++++++++ configuration/LoggerCommandsInitializer.go | 28 +++++++++ configuration/ServerCommandsInitializer.go | 45 ++++++++++++++ configuration/SessionCommandsInitializer.go | 31 ++++++++++ go.mod | 17 +++--- mocks/configuration/CommandsInitializer.go | 42 ++++++++++++++ mocks/configuration/KeySetter.go | 44 ++++++++++++++ test_integration/integration_test.go | 3 +- 18 files changed, 389 insertions(+), 208 deletions(-) delete mode 100644 commands/initDatabaseCommands.go delete mode 100644 commands/initInitialisationCommands.go delete mode 100644 commands/initLoggerCommands.go delete mode 100644 commands/initServerCommands.go delete mode 100644 commands/initSessionCommands.go create mode 100644 configuration/CommandsInitializer.go create mode 100644 configuration/ConfigCommandsInitializer.go create mode 100644 configuration/DatabaseCommandsInitializer.go create mode 100644 configuration/InitializationCommandsInitializer.go create mode 100644 configuration/KeySetter.go create mode 100644 configuration/LoggerCommandsInitializer.go create mode 100644 configuration/ServerCommandsInitializer.go create mode 100644 configuration/SessionCommandsInitializer.go create mode 100644 mocks/configuration/CommandsInitializer.go create mode 100644 mocks/configuration/KeySetter.go diff --git a/commands/initDatabaseCommands.go b/commands/initDatabaseCommands.go deleted file mode 100644 index e47f3b9e..00000000 --- a/commands/initDatabaseCommands.go +++ /dev/null @@ -1,58 +0,0 @@ -package commands - -import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/verdeter" -) - -func initDatabaseCommands(cfg *verdeter.VerdeterCommand) error { - err := cfg.GKey(configuration.DatabasePortKey, verdeter.IsInt, "", "The port of the database server") - if err != nil { - return err - } - cfg.SetRequired(configuration.DatabasePortKey) - - err = cfg.GKey(configuration.DatabaseHostKey, verdeter.IsStr, "", "The host of the database server") - if err != nil { - return err - } - cfg.SetRequired(configuration.DatabaseHostKey) - - err = cfg.GKey(configuration.DatabaseNameKey, verdeter.IsStr, "", "The name of the database to use") - if err != nil { - return err - } - cfg.SetRequired(configuration.DatabaseNameKey) - - err = cfg.GKey(configuration.DatabaseUsernameKey, verdeter.IsStr, "", "The username of the account on the database server") - if err != nil { - return err - } - cfg.SetRequired(configuration.DatabaseUsernameKey) - - err = cfg.GKey(configuration.DatabasePasswordKey, verdeter.IsStr, "", "The password of the account one the database server") - if err != nil { - return err - } - cfg.SetRequired(configuration.DatabasePasswordKey) - - err = cfg.GKey(configuration.DatabaseSslmodeKey, verdeter.IsStr, "", "The sslmode to use when connecting to the database server") - if err != nil { - return err - } - cfg.SetRequired(configuration.DatabaseSslmodeKey) - - err = cfg.GKey(configuration.DatabaseRetryKey, verdeter.IsUint, "", "The number of times badaas tries to establish a connection with the database") - if err != nil { - return err - } - cfg.SetDefault(configuration.DatabaseRetryKey, uint(10)) - - err = cfg.GKey(configuration.DatabaseRetryDurationKey, verdeter.IsUint, "", "The duration in seconds badaas wait between connection attempts") - if err != nil { - return err - } - cfg.SetDefault(configuration.DatabaseRetryDurationKey, uint(5)) - - return nil -} diff --git a/commands/initInitialisationCommands.go b/commands/initInitialisationCommands.go deleted file mode 100644 index 81f54fc5..00000000 --- a/commands/initInitialisationCommands.go +++ /dev/null @@ -1,17 +0,0 @@ -package commands - -import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/verdeter" -) - -func initInitialisationCommands(cfg *verdeter.VerdeterCommand) error { - err := cfg.GKey(configuration.InitializationDefaultAdminPasswordKey, verdeter.IsStr, "", - "Set the default admin password is the admin user is not created yet.") - if err != nil { - return err - } - cfg.SetDefault(configuration.InitializationDefaultAdminPasswordKey, "admin") - - return nil -} diff --git a/commands/initLoggerCommands.go b/commands/initLoggerCommands.go deleted file mode 100644 index d5bc7d26..00000000 --- a/commands/initLoggerCommands.go +++ /dev/null @@ -1,23 +0,0 @@ -package commands - -import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/verdeter" - "github.com/ditrit/verdeter/validators" -) - -func initLoggerCommands(cfg *verdeter.VerdeterCommand) error { - err := cfg.GKey(configuration.LoggerModeKey, verdeter.IsStr, "", "The logger mode (default to \"prod\")") - if err != nil { - return err - } - cfg.SetDefault(configuration.LoggerModeKey, "prod") - cfg.AddValidator(configuration.LoggerModeKey, validators.AuthorizedValues("prod", "dev")) - - err = cfg.GKey(configuration.LoggerRequestTemplateKey, verdeter.IsStr, "", "Template message for all request logs") - if err != nil { - return err - } - cfg.SetDefault(configuration.LoggerRequestTemplateKey, "Receive {{method}} request on {{url}}") - return nil -} diff --git a/commands/initServerCommands.go b/commands/initServerCommands.go deleted file mode 100644 index edf42806..00000000 --- a/commands/initServerCommands.go +++ /dev/null @@ -1,42 +0,0 @@ -package commands - -import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/verdeter" - "github.com/ditrit/verdeter/validators" -) - -func initServerCommands(cfg *verdeter.VerdeterCommand) error { - err := cfg.GKey(configuration.ServerTimeoutKey, verdeter.IsInt, "", "Maximum timeout of the http server in second (default is 15s)") - if err != nil { - return err - } - cfg.SetDefault(configuration.ServerTimeoutKey, 15) - - err = cfg.GKey(configuration.ServerHostKey, verdeter.IsStr, "", "Address to bind (default is 0.0.0.0)") - if err != nil { - return err - } - cfg.SetDefault(configuration.ServerHostKey, "0.0.0.0") - - err = cfg.GKey(configuration.ServerPortKey, verdeter.IsInt, "p", "Port to bind (default is 8000)") - if err != nil { - return err - } - cfg.AddValidator(configuration.ServerPortKey, validators.CheckTCPHighPort) - cfg.SetDefault(configuration.ServerPortKey, 8000) - - err = cfg.GKey(configuration.ServerPaginationMaxElemPerPage, verdeter.IsUint, "", "The max number of records returned per page") - if err != nil { - return err - } - cfg.SetDefault(configuration.ServerPaginationMaxElemPerPage, 100) - - err = cfg.GKey(configuration.ServerExampleKey, verdeter.IsStr, "", "Example server to exec (birds | posts)") - if err != nil { - return err - } - cfg.SetDefault(configuration.ServerExampleKey, "") - - return nil -} diff --git a/commands/initSessionCommands.go b/commands/initSessionCommands.go deleted file mode 100644 index c550ef1b..00000000 --- a/commands/initSessionCommands.go +++ /dev/null @@ -1,30 +0,0 @@ -package commands - -import ( - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/verdeter" -) - -// initialize session related config keys -func initSessionCommands(cfg *verdeter.VerdeterCommand) error { - err := cfg.LKey(configuration.SessionDurationKey, verdeter.IsUint, "", "The duration of a user session in seconds.") - if err != nil { - return err - } - cfg.SetDefault(configuration.SessionDurationKey, uint(3600*4)) // 4 hours by default - - err = cfg.LKey(configuration.SessionPullIntervalKey, - verdeter.IsUint, "", "The refresh interval in seconds. Badaas refresh it's internal session cache periodically.") - if err != nil { - return err - } - cfg.SetDefault(configuration.SessionPullIntervalKey, uint(30)) // 30 seconds by default - - err = cfg.LKey(configuration.SessionRollIntervalKey, verdeter.IsUint, "", "The interval in which the user can renew it's session by making a request.") - if err != nil { - return err - } - cfg.SetDefault(configuration.SessionRollIntervalKey, uint(3600)) // 1 hour by default - - return nil -} diff --git a/commands/rootCmd.go b/commands/rootCmd.go index 0fcf138c..3557d659 100644 --- a/commands/rootCmd.go +++ b/commands/rootCmd.go @@ -55,35 +55,10 @@ var rootCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ // Execute adds all child commands to the root command and sets flags appropriately. // This is called by main.main(). It only needs to happen once to the rootCmd. func Execute() { - err := InitCommands(rootCfg) + err := configuration.NewCommandInitializer().Init(rootCfg) if err != nil { panic(err) } rootCfg.Execute() } - -func InitCommands(config *verdeter.VerdeterCommand) error { - if err := config.GKey("config_path", verdeter.IsStr, "", "Path to the config file/directory"); err != nil { - return err - } - config.SetDefault("config_path", ".") - - if err := initServerCommands(config); err != nil { - return err - } - if err := initLoggerCommands(config); err != nil { - return err - } - if err := initDatabaseCommands(config); err != nil { - return err - } - if err := initInitialisationCommands(config); err != nil { - return err - } - if err := initSessionCommands(config); err != nil { - return err - } - - return nil -} diff --git a/configuration/CommandsInitializer.go b/configuration/CommandsInitializer.go new file mode 100644 index 00000000..b2f57716 --- /dev/null +++ b/configuration/CommandsInitializer.go @@ -0,0 +1,54 @@ +package configuration + +import ( + "github.com/ditrit/verdeter" +) + +type CommandsInitializer interface { + Init(config *verdeter.VerdeterCommand) error +} + +type CommandsInitializerImpl struct { + KeySetter KeySetter + Initializers []CommandsInitializer +} + +func NewCommandInitializer() CommandsInitializer { + return CommandsInitializerImpl{ + KeySetter: NewKeySetter(), + Initializers: []CommandsInitializer{ + NewConfigCommandsInitializer(), + NewServerCommandsInitializer(), + NewLoggerCommandsInitializer(), + NewDatabaseCommandsInitializer(), + NewInitializationCommandsInitializer(), + NewSessionCommandsInitializer(), + }, + } +} + +func (ci CommandsInitializerImpl) Init(config *verdeter.VerdeterCommand) error { + for _, initializer := range ci.Initializers { + if err := initializer.Init(config); err != nil { + return err + } + } + + return nil +} + +type CommandsKeyInitializer struct { + KeySetter KeySetter + Keys []Key +} + +func (ci CommandsKeyInitializer) Init(config *verdeter.VerdeterCommand) error { + for _, key := range ci.Keys { + err := ci.KeySetter.Set(config, key) + if err != nil { + return err + } + } + + return nil +} diff --git a/configuration/ConfigCommandsInitializer.go b/configuration/ConfigCommandsInitializer.go new file mode 100644 index 00000000..6398f87e --- /dev/null +++ b/configuration/ConfigCommandsInitializer.go @@ -0,0 +1,17 @@ +package configuration + +import "github.com/ditrit/verdeter" + +func NewConfigCommandsInitializer() CommandsInitializer { + return CommandsKeyInitializer{ + KeySetter: NewKeySetter(), + Keys: []Key{ + { + Name: "config_path", + ValType: verdeter.IsStr, + Usage: "Path to the config file/directory", + DefaultV: ".", + }, + }, + } +} diff --git a/configuration/DatabaseCommandsInitializer.go b/configuration/DatabaseCommandsInitializer.go new file mode 100644 index 00000000..a2be363a --- /dev/null +++ b/configuration/DatabaseCommandsInitializer.go @@ -0,0 +1,55 @@ +package configuration + +import ( + "github.com/ditrit/verdeter" +) + +func NewDatabaseCommandsInitializer() CommandsInitializer { + return CommandsKeyInitializer{ + KeySetter: NewKeySetter(), + Keys: []Key{ + { + Name: DatabasePortKey, + ValType: verdeter.IsInt, + Usage: "The port of the database server", + }, + { + Name: DatabaseHostKey, + ValType: verdeter.IsStr, + Usage: "The host of the database server", + }, + { + Name: DatabaseNameKey, + ValType: verdeter.IsStr, + Usage: "The name of the database to use", + }, + { + Name: DatabaseUsernameKey, + ValType: verdeter.IsStr, + Usage: "The username of the account on the database server", + }, + { + Name: DatabasePasswordKey, + ValType: verdeter.IsStr, + Usage: "The password of the account one the database server", + }, + { + Name: DatabaseSslmodeKey, + ValType: verdeter.IsStr, + Usage: "The sslmode to use when connecting to the database server", + }, + { + Name: DatabaseRetryKey, + ValType: verdeter.IsUint, + Usage: "The number of times badaas tries to establish a connection with the database", + DefaultV: uint(10), + }, + { + Name: DatabaseRetryDurationKey, + ValType: verdeter.IsUint, + Usage: "The duration in seconds badaas wait between connection attempts", + DefaultV: uint(5), + }, + }, + } +} diff --git a/configuration/InitializationCommandsInitializer.go b/configuration/InitializationCommandsInitializer.go new file mode 100644 index 00000000..7f6792a6 --- /dev/null +++ b/configuration/InitializationCommandsInitializer.go @@ -0,0 +1,19 @@ +package configuration + +import ( + "github.com/ditrit/verdeter" +) + +func NewInitializationCommandsInitializer() CommandsInitializer { + return CommandsKeyInitializer{ + KeySetter: NewKeySetter(), + Keys: []Key{ + { + Name: InitializationDefaultAdminPasswordKey, + ValType: verdeter.IsStr, + Usage: "Set the default admin password is the admin user is not created yet.", + DefaultV: "admin", + }, + }, + } +} diff --git a/configuration/KeySetter.go b/configuration/KeySetter.go new file mode 100644 index 00000000..1cf8b259 --- /dev/null +++ b/configuration/KeySetter.go @@ -0,0 +1,45 @@ +package configuration + +import ( + "github.com/ditrit/verdeter" + "github.com/ditrit/verdeter/models" +) + +type KeySetter interface { + Set(config *verdeter.VerdeterCommand, key Key) error +} + +type KeySetterImpl struct{} + +func NewKeySetter() KeySetter { + return KeySetterImpl{} +} + +func (ks KeySetterImpl) Set(config *verdeter.VerdeterCommand, key Key) error { + if err := config.GKey(key.Name, key.ValType, "", key.Usage); err != nil { + return err + } + + if key.Required { + config.SetRequired(key.Name) + } + + if key.DefaultV != nil { + config.SetDefault(key.Name, key.DefaultV) + } + + if key.Validator != nil { + config.AddValidator(key.Name, *key.Validator) + } + + return nil +} + +type Key struct { + Name string + ValType models.ConfigType + Usage string + Required bool + DefaultV any + Validator *models.Validator +} diff --git a/configuration/LoggerCommandsInitializer.go b/configuration/LoggerCommandsInitializer.go new file mode 100644 index 00000000..03eec1e6 --- /dev/null +++ b/configuration/LoggerCommandsInitializer.go @@ -0,0 +1,28 @@ +package configuration + +import ( + "github.com/ditrit/verdeter" + "github.com/ditrit/verdeter/validators" +) + +func NewLoggerCommandsInitializer() CommandsInitializer { + modeValidator := validators.AuthorizedValues("prod", "dev") + return CommandsKeyInitializer{ + KeySetter: NewKeySetter(), + Keys: []Key{ + { + Name: LoggerRequestTemplateKey, + ValType: verdeter.IsStr, + Usage: "Template message for all request logs", + DefaultV: "Receive {{method}} request on {{url}}", + }, + { + Name: LoggerModeKey, + ValType: verdeter.IsStr, + Usage: "The logger mode (default to \"prod\")", + DefaultV: "prod", + Validator: &modeValidator, + }, + }, + } +} diff --git a/configuration/ServerCommandsInitializer.go b/configuration/ServerCommandsInitializer.go new file mode 100644 index 00000000..a4ff07ec --- /dev/null +++ b/configuration/ServerCommandsInitializer.go @@ -0,0 +1,45 @@ +package configuration + +import ( + "github.com/ditrit/verdeter" + "github.com/ditrit/verdeter/validators" +) + +func NewServerCommandsInitializer() CommandsInitializer { + return CommandsKeyInitializer{ + KeySetter: NewKeySetter(), + Keys: []Key{ + { + Name: ServerTimeoutKey, + ValType: verdeter.IsInt, + Usage: "Maximum timeout of the http server in second (default is 15s)", + DefaultV: 15, + }, + { + Name: ServerHostKey, + ValType: verdeter.IsStr, + Usage: "Address to bind (default is 0.0.0.0)", + DefaultV: "0.0.0.0", + }, + { + Name: ServerPortKey, + ValType: verdeter.IsInt, + Usage: "Port to bind (default is 8000)", + DefaultV: 8000, + Validator: &validators.CheckTCPHighPort, + }, + { + Name: ServerPaginationMaxElemPerPage, + ValType: verdeter.IsUint, + Usage: "The max number of records returned per page", + DefaultV: uint(100), + }, + { + Name: ServerExampleKey, + ValType: verdeter.IsStr, + Usage: "Example server to exec (birds | posts)", + DefaultV: "", + }, + }, + } +} diff --git a/configuration/SessionCommandsInitializer.go b/configuration/SessionCommandsInitializer.go new file mode 100644 index 00000000..1b238c14 --- /dev/null +++ b/configuration/SessionCommandsInitializer.go @@ -0,0 +1,31 @@ +package configuration + +import ( + "github.com/ditrit/verdeter" +) + +func NewSessionCommandsInitializer() CommandsInitializer { + return CommandsKeyInitializer{ + KeySetter: NewKeySetter(), + Keys: []Key{ + { + Name: SessionDurationKey, + ValType: verdeter.IsUint, + Usage: "The duration of a user session in seconds", + DefaultV: uint(3600 * 4), // 4 hours by default + }, + { + Name: SessionPullIntervalKey, + ValType: verdeter.IsUint, + Usage: "The refresh interval in seconds. Badaas refresh it's internal session cache periodically", + DefaultV: uint(30), // 30 seconds by default + }, + { + Name: SessionRollIntervalKey, + ValType: verdeter.IsUint, + Usage: "The interval in which the user can renew it's session by making a request", + DefaultV: uint(3600), // 1 hour by default + }, + }, + } +} diff --git a/go.mod b/go.mod index 24f4d0ae..7891a7e9 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,14 @@ module github.com/ditrit/badaas go 1.18 require ( + github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/Masterminds/squirrel v1.5.3 github.com/cucumber/godog v0.12.5 + github.com/cucumber/messages-go/v16 v16.0.1 github.com/ditrit/verdeter v0.4.0 + github.com/elliotchance/pie/v2 v2.5.2 github.com/google/uuid v1.3.0 + github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 github.com/jackc/pgconn v1.13.0 github.com/magiconair/properties v1.8.6 @@ -20,24 +24,17 @@ require ( golang.org/x/crypto v0.1.0 gorm.io/driver/postgres v1.4.5 gorm.io/gorm v1.24.1 + gotest.tools v2.2.0+incompatible ) require ( - github.com/felixge/httpsnoop v1.0.1 // indirect - golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect -) - -require ( - github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect - github.com/cucumber/messages-go/v16 v16.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/elliotchance/pie/v2 v2.5.2 + github.com/felixge/httpsnoop v1.0.1 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/goph/emperror v0.17.2 // indirect - github.com/gorilla/handlers v1.5.1 github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-memdb v1.3.3 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect @@ -69,10 +66,10 @@ require ( go.uber.org/atomic v1.10.0 // indirect go.uber.org/dig v1.15.0 // indirect go.uber.org/multierr v1.8.0 // indirect + golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect golang.org/x/sys v0.1.0 // indirect golang.org/x/text v0.4.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools v2.2.0+incompatible ) diff --git a/mocks/configuration/CommandsInitializer.go b/mocks/configuration/CommandsInitializer.go new file mode 100644 index 00000000..b1ba3863 --- /dev/null +++ b/mocks/configuration/CommandsInitializer.go @@ -0,0 +1,42 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + verdeter "github.com/ditrit/verdeter" + mock "github.com/stretchr/testify/mock" +) + +// CommandsInitializer is an autogenerated mock type for the CommandsInitializer type +type CommandsInitializer struct { + mock.Mock +} + +// Init provides a mock function with given fields: config +func (_m *CommandsInitializer) Init(config *verdeter.VerdeterCommand) error { + ret := _m.Called(config) + + var r0 error + if rf, ok := ret.Get(0).(func(*verdeter.VerdeterCommand) error); ok { + r0 = rf(config) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type mockConstructorTestingTNewCommandsInitializer interface { + mock.TestingT + Cleanup(func()) +} + +// NewCommandsInitializer creates a new instance of CommandsInitializer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewCommandsInitializer(t mockConstructorTestingTNewCommandsInitializer) *CommandsInitializer { + mock := &CommandsInitializer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/configuration/KeySetter.go b/mocks/configuration/KeySetter.go new file mode 100644 index 00000000..e3db9efc --- /dev/null +++ b/mocks/configuration/KeySetter.go @@ -0,0 +1,44 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + configuration "github.com/ditrit/badaas/configuration" + mock "github.com/stretchr/testify/mock" + + verdeter "github.com/ditrit/verdeter" +) + +// KeySetter is an autogenerated mock type for the KeySetter type +type KeySetter struct { + mock.Mock +} + +// Set provides a mock function with given fields: config, key +func (_m *KeySetter) Set(config *verdeter.VerdeterCommand, key configuration.Key) error { + ret := _m.Called(config, key) + + var r0 error + if rf, ok := ret.Get(0).(func(*verdeter.VerdeterCommand, configuration.Key) error); ok { + r0 = rf(config, key) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +type mockConstructorTestingTNewKeySetter interface { + mock.TestingT + Cleanup(func()) +} + +// NewKeySetter creates a new instance of KeySetter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewKeySetter(t mockConstructorTestingTNewKeySetter) *KeySetter { + mock := &KeySetter{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test_integration/integration_test.go b/test_integration/integration_test.go index 08900db3..983ee366 100644 --- a/test_integration/integration_test.go +++ b/test_integration/integration_test.go @@ -6,7 +6,6 @@ import ( "runtime" "testing" - "github.com/ditrit/badaas/commands" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/logger" @@ -34,7 +33,7 @@ func TestAll(t *testing.T) { _, b, _, _ := runtime.Caller(0) basePath := filepath.Dir(b) viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) - err := commands.InitCommands(testsCfg) + err := configuration.NewCommandInitializer().Init(testsCfg) if err != nil { panic(err) } From 5e5e84fd5e548522edab4aff275834474de8fc98 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 2 Jun 2023 11:59:17 +0200 Subject: [PATCH 278/467] use version of linter that works --- .github/workflows/CI.yml | 2 +- persistence/repository/CRUDRepositoryImpl.go | 4 ---- persistence/repository/CRUDRepositoryImpl_test.go | 5 +---- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 2a2a2220..fb4cffa6 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -34,7 +34,7 @@ jobs: - name: golangci-lint uses: golangci/golangci-lint-action@v3 with: - version: latest + version: v1.52.2 skip-cache: true skip-pkg-cache: true skip-build-cache: true diff --git a/persistence/repository/CRUDRepositoryImpl.go b/persistence/repository/CRUDRepositoryImpl.go index a0586ec9..7aabc863 100644 --- a/persistence/repository/CRUDRepositoryImpl.go +++ b/persistence/repository/CRUDRepositoryImpl.go @@ -10,7 +10,6 @@ import ( "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/pagination" - "go.uber.org/zap" "gorm.io/gorm" "gorm.io/gorm/clause" ) @@ -28,19 +27,16 @@ func DatabaseError(message string, golangError error) httperrors.HTTPError { type CRUDRepositoryImpl[T models.Tabler, ID any] struct { CRUDRepository[T, ID] gormDatabase *gorm.DB - logger *zap.Logger paginationConfiguration configuration.PaginationConfiguration } // Constructor of the Generic CRUD Repository func NewCRUDRepository[T models.Tabler, ID any]( database *gorm.DB, - logger *zap.Logger, paginationConfiguration configuration.PaginationConfiguration, ) CRUDRepository[T, ID] { return &CRUDRepositoryImpl[T, ID]{ gormDatabase: database, - logger: logger, paginationConfiguration: paginationConfiguration, } } diff --git a/persistence/repository/CRUDRepositoryImpl_test.go b/persistence/repository/CRUDRepositoryImpl_test.go index 1dac5dbd..c7bfbec8 100644 --- a/persistence/repository/CRUDRepositoryImpl_test.go +++ b/persistence/repository/CRUDRepositoryImpl_test.go @@ -7,7 +7,6 @@ import ( mocks "github.com/ditrit/badaas/mocks/configuration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "go.uber.org/zap" ) func TestDatabaseError(t *testing.T) { @@ -24,7 +23,7 @@ func (dumbModel) TableName() string { func TestNewRepository(t *testing.T) { paginationConfiguration := mocks.NewPaginationConfiguration(t) - dumbModelRepository := NewCRUDRepository[dumbModel, uint](nil, zap.L(), paginationConfiguration) + dumbModelRepository := NewCRUDRepository[dumbModel, uint](nil, paginationConfiguration) assert.NotNil(t, dumbModelRepository) } @@ -32,7 +31,6 @@ func TestCompileSql_NoError(t *testing.T) { paginationConfiguration := mocks.NewPaginationConfiguration(t) dumbModelRepository := &CRUDRepositoryImpl[dumbModel, uint]{ gormDatabase: nil, - logger: zap.L(), paginationConfiguration: paginationConfiguration, } _, _, err := dumbModelRepository.compileSQL(squirrel.Eq{"name": "qsdqsd"}) @@ -43,7 +41,6 @@ func TestCompileSql_Err(t *testing.T) { paginationConfiguration := mocks.NewPaginationConfiguration(t) dumbModelRepository := &CRUDRepositoryImpl[dumbModel, uint]{ gormDatabase: nil, - logger: zap.L(), paginationConfiguration: paginationConfiguration, } _, _, err := dumbModelRepository.compileSQL(squirrel.GtOrEq{"name": nil}) From 02b06a0e93db1b5d99d3601d067087e97d017e7e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 2 Jun 2023 12:24:09 +0200 Subject: [PATCH 279/467] go mod tidy --- go.mod | 60 +++++++++++++--------------- go.sum | 112 +--------------------------------------------------- go.work.sum | 9 +++++ 3 files changed, 39 insertions(+), 142 deletions(-) diff --git a/go.mod b/go.mod index 21bdc726..8b9891d1 100644 --- a/go.mod +++ b/go.mod @@ -4,65 +4,61 @@ go 1.18 require ( github.com/DATA-DOG/go-sqlmock v1.5.0 - github.com/Masterminds/semver/v3 v3.1.1 - github.com/Masterminds/squirrel v1.5.3 + github.com/Masterminds/semver/v3 v3.2.1 + github.com/Masterminds/squirrel v1.5.4 github.com/ditrit/verdeter v0.4.0 github.com/elliotchance/pie/v2 v2.5.2 github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 - github.com/jackc/pgconn v1.13.0 - github.com/magiconair/properties v1.8.6 + github.com/jackc/pgconn v1.14.0 + github.com/magiconair/properties v1.8.7 github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61 - github.com/spf13/cobra v1.5.0 - github.com/spf13/viper v1.13.0 - github.com/stretchr/testify v1.8.1 - go.uber.org/fx v1.18.2 - go.uber.org/zap v1.23.0 - golang.org/x/crypto v0.1.0 - gorm.io/driver/postgres v1.4.5 - gorm.io/gorm v1.24.1 + github.com/spf13/cobra v1.7.0 + github.com/spf13/viper v1.16.0 + github.com/stretchr/testify v1.8.4 + go.uber.org/fx v1.19.3 + go.uber.org/zap v1.24.0 + golang.org/x/crypto v0.9.0 + gorm.io/driver/postgres v1.5.2 + gorm.io/gorm v1.25.1 gotest.tools v2.2.0+incompatible ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/goph/emperror v0.17.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.1 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.12.0 // indirect - github.com/jackc/pgx/v4 v4.17.2 // indirect + github.com/jackc/pgproto3/v2 v2.3.2 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.3.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - github.com/spf13/afero v1.9.2 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/sirupsen/logrus v1.9.2 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.0 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/dig v1.15.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect - golang.org/x/sys v0.1.0 // indirect - golang.org/x/text v0.4.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + github.com/subosito/gotenv v1.4.2 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/dig v1.17.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index db9944cf..775fd4fb 100644 --- a/go.sum +++ b/go.sum @@ -40,12 +40,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= -github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc= -github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/airbrake/gobrake v3.6.1+incompatible/go.mod h1:wM4gu3Cn0W0K7GUuVWnlXZU11AGBXMILnrdOU8Kn00o= @@ -64,13 +60,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -84,10 +78,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= @@ -96,12 +88,8 @@ github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclK github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -172,12 +160,8 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -187,9 +171,6 @@ github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= -github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= github.com/jackc/pgconn v1.14.0 h1:vrbA9Ud87g6JdFWkHTJXppVce58qPIdP7N8y0Ml/A7Q= github.com/jackc/pgconn v1.14.0/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= @@ -200,7 +181,6 @@ github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5W github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= @@ -208,39 +188,23 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= -github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0= github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= -github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= -github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= -github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= -github.com/jackc/pgx/v4 v4.18.1 h1:YP7G1KABtKpB5IHrO9vYwSrCOhs7p3uqhvhhQBptya0= -github.com/jackc/pgx/v4 v4.18.1/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE= github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -251,15 +215,11 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= @@ -267,20 +227,14 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6Fm github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -293,13 +247,8 @@ github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61/go.mod h1:WboHq+ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -309,9 +258,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rollbar/rollbar-go v1.0.2/go.mod h1:AcFs5f0I+c71bpHlXNNDbOWJiKwjFDtISeXco0L5PKQ= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -319,34 +266,22 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= -github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -362,13 +297,10 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= @@ -387,35 +319,18 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.15.0 h1:vq3YWr8zRj1eFGC7Gvf907hE0eRjPTZ1d3xHadD6liE= -go.uber.org/dig v1.15.0/go.mod h1:pKHs0wMynzL6brANhB2hLMro+zalv1osARTviTcqHLM= go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= -go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= -go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= go.uber.org/fx v1.19.3 h1:YqMRE4+2IepTYCMOvXqQpRa+QAVdiSTnsHU4XNWBceA= go.uber.org/fx v1.19.3/go.mod h1:w2HrQg26ql9fLK7hlBiZ6JsRUKV+Lj/atT1KCjT8YhM= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -431,10 +346,7 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= @@ -448,8 +360,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 h1:ba9YlqfDGTTQ5aZ2fwOoQ1hf32QySyQkR6ODGDzHlnE= -golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= @@ -552,7 +462,6 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -575,21 +484,18 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -598,8 +504,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= @@ -623,8 +527,6 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -632,7 +534,6 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -756,7 +657,6 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= @@ -765,19 +665,11 @@ gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc= -gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg= gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= -gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.24.1 h1:CgvzRniUdG67hBAzsxDGOAuq4Te1osVMYsa1eQbd4fs= -gorm.io/gorm v1.24.1/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= diff --git a/go.work.sum b/go.work.sum index ef14e175..51a7890f 100644 --- a/go.work.sum +++ b/go.work.sum @@ -297,6 +297,7 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= @@ -371,6 +372,10 @@ github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4 github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.18.1/go.mod h1:FydWkUyadDmdNH/mHnGob881GawxeEm7TcMCzkb+qQE= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -381,6 +386,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= @@ -398,6 +405,7 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -414,6 +422,7 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= From 154ff5f7aaa3fae75c019cdb01f9df7a335de3a9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 2 Jun 2023 15:16:33 +0200 Subject: [PATCH 280/467] excluse conflictive dockerfile from sonar --- sonar-project.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sonar-project.properties b/sonar-project.properties index f2836946..e4f0e0c5 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.organization=ditrit sonar.projectName=badaas sonar.host.url=https://sonarcloud.io sonar.sources=. -sonar.exclusions=**/*_test.go,mocks/***,vendor/***,test_integration/***,test_e2e/*** -sonar.tests=. +sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/docker/api/Dockerfile +sonar.tests=.,testintegration/***,test_e2e/*** sonar.test.inclusions=**/*_test.go sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_int.out/coverage_int.out From 8ad7472bd865b450d0345894e7c931cc16a36edd Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 2 Jun 2023 15:27:50 +0200 Subject: [PATCH 281/467] fix sonar --- sonar-project.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sonar-project.properties b/sonar-project.properties index e4f0e0c5..a0b12f5a 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -4,6 +4,6 @@ sonar.projectName=badaas sonar.host.url=https://sonarcloud.io sonar.sources=. sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/docker/api/Dockerfile -sonar.tests=.,testintegration/***,test_e2e/*** -sonar.test.inclusions=**/*_test.go +sonar.tests=. +sonar.test.inclusions=**/*_test.go,testintegration/***,test_e2e/*** sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_int.out/coverage_int.out From 9a9bbcd75798c17f84ae7f92c400fdf74c962877 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 10:42:32 +0200 Subject: [PATCH 282/467] badctl run to makefile --- tools/badctl/cmd/gen.go | 13 +++++++++---- tools/badctl/cmd/run.go | 39 --------------------------------------- 2 files changed, 9 insertions(+), 43 deletions(-) delete mode 100644 tools/badctl/cmd/run.go diff --git a/tools/badctl/cmd/gen.go b/tools/badctl/cmd/gen.go index 3417b7d9..6cd53abb 100644 --- a/tools/badctl/cmd/gen.go +++ b/tools/badctl/cmd/gen.go @@ -16,7 +16,7 @@ import ( //go:embed docker/* //go:embed config/* -var embedFS embed.FS +var genEmbedFS embed.FS var genCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Use: "gen", @@ -81,11 +81,16 @@ func generateDockerFiles(cmd *cobra.Command, args []string) { ".dockerignore", ) + copyFile( + filepath.Join(sourceDockerDir, "Makefile"), + "Makefile", + ) + copyBadaasConfig(dbProvider) } func copyBadaasConfig(dbProvider string) { - configFile, err := embedFS.ReadFile( + configFile, err := genEmbedFS.ReadFile( filepath.Join("config", "badaas.yml"), ) if err != nil { @@ -121,7 +126,7 @@ func copyBadaasConfig(dbProvider string) { } func copyFile(sourcePath, destPath string) { - fileContent, err := embedFS.ReadFile(sourcePath) + fileContent, err := genEmbedFS.ReadFile(sourcePath) if err != nil { panic(err) } @@ -132,7 +137,7 @@ func copyFile(sourcePath, destPath string) { } func copyDir(sourceDir, destDir string) { - files, err := embedFS.ReadDir(sourceDir) + files, err := genEmbedFS.ReadDir(sourceDir) if err != nil { panic(err) } diff --git a/tools/badctl/cmd/run.go b/tools/badctl/cmd/run.go deleted file mode 100644 index 8107cece..00000000 --- a/tools/badctl/cmd/run.go +++ /dev/null @@ -1,39 +0,0 @@ -package cmd - -import ( - "log" - "os" - "os/exec" - - "github.com/ditrit/verdeter" - "github.com/spf13/cobra" -) - -var runCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ - Use: "run", - Short: "Run your BadAss application", - Long: `run is the command that will allow you to run your application once you have generated the necessary files with gen.`, - Run: runApp, -}) - -func init() { - rootCmd.AddSubCommand(runCmd) -} - -func runApp(cmd *cobra.Command, args []string) { - dockerCommand := exec.Command( - "docker", "compose", - "-f", "badaas/docker/db/docker-compose.yml", - "-f", "badaas/docker/api/docker-compose.yml", - "up", "--build", "-d", - ) - dockerCommand.Stdout = os.Stdout - dockerCommand.Stderr = os.Stderr - - err := dockerCommand.Run() - if err != nil { - panic(err) - } - - log.Println("Your api is available at http://localhost:8000") -} From b7efda53a4f5c671497655f24cb116ad788974d6 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 10:47:58 +0200 Subject: [PATCH 283/467] badctl run to makefile 2 --- tools/badctl/README.md | 18 +++++------------- tools/badctl/cmd/docker/Makefile | 2 ++ 2 files changed, 7 insertions(+), 13 deletions(-) create mode 100644 tools/badctl/cmd/docker/Makefile diff --git a/tools/badctl/README.md b/tools/badctl/README.md index 8ea2c014..321d299f 100644 --- a/tools/badctl/README.md +++ b/tools/badctl/README.md @@ -7,7 +7,6 @@ - [Build from sources](#build-from-sources) - [Commands](#commands) - [gen](#gen) - - [run](#run) - [Contributing](#contributing) ## Install with go install @@ -48,16 +47,7 @@ Well done, you have a binary `badctl` at the root of the project. You can see the available commands by running: ```bash -$ badctl help -badctl is a command line tool that makes it possible to configure and run your BadAas applications easily - -Usage: - badctl [command] - -Available Commands: - completion Generate the autocompletion script for the specified shell - gen Generate files and configurations necessary to use BadAss - help Help about any command +badctl help ``` For more information about the functionality provided and how to use each command use: @@ -76,9 +66,11 @@ The possible values for `db_provider` are `cockroachdb` and `postgres`. Cockroac All these files can be modified in case you need different values than those provided by default. For more information about the configuration head to [configuration docs](../../configuration.md). -### run +A Makefile will be generated for the execution of a badaas server, with the command: -`run` is the command that will allow you to run your application once you have generated the necessary files with gen. +```bash +make badaas_run +``` ## Contributing diff --git a/tools/badctl/cmd/docker/Makefile b/tools/badctl/cmd/docker/Makefile new file mode 100644 index 00000000..634c8ef6 --- /dev/null +++ b/tools/badctl/cmd/docker/Makefile @@ -0,0 +1,2 @@ +badaas_run: + docker compose -f badaas/docker/db/docker-compose.yml -f badaas/docker/api/docker-compose.yml up --build -d \ No newline at end of file From 398f276b0dba30f0ae60214ac1075d4fb09ef9be Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 11:41:49 +0200 Subject: [PATCH 284/467] add badctl unit tests --- .github/workflows/CI.yml | 15 +++++++- CONTRIBUTING.md | 4 +- Makefile | 11 ++++-- sonar-project.properties | 2 +- tools/badctl/cmd/gen_test.go | 71 ++++++++++++++++++++++++++++++++++++ 5 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 tools/badctl/cmd/gen_test.go diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index de735299..e83bfeb3 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -64,12 +64,18 @@ jobs: with: go-version: '^1.18' cache: true - - name: Run test - run: make test_unit_and_cover + - name: Run BaDaaS tests + run: make test_unit_badaas_cover - uses: actions/upload-artifact@v3 with: name: coverage_unit path: coverage_unit.out + - name: Run BaDctl tests + run: go test ./tools/badctl/... -coverprofile=coverage_badctl.out -v + - uses: actions/upload-artifact@v3 + with: + name: coverage_badctl + path: coverage_badctl.out integration-tests: name: Integration tests @@ -138,6 +144,11 @@ jobs: with: name: coverage_unit path: coverage_unit.out + - name: Download badctl unit tests line coverage report + uses: actions/download-artifact@v3 + with: + name: coverage_badctl + path: coverage_badctl.out - name: Download int tests line coverage report uses: actions/download-artifact@v3 with: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9959373d..5cf9a818 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,12 +16,12 @@ ### Unit tests -We use the standard test suite in combination with [github.com/stretchr/testify](https://github.com/stretchr/testify) to do our unit testing. Mocks are generated using [mockery](https://github.com/vektra/mockery) a mock generator using this command `mockery --all --keeptree`. +We use the standard test suite in combination with [github.com/stretchr/testify](https://github.com/stretchr/testify) to do our unit testing. Mocks are generated using [mockery](https://github.com/vektra/mockery) a mock generator using this command `make test_generate_mocks`. To run them, please run: ```sh -make test_unit +make -k test_unit ``` ### Integration tests diff --git a/Makefile b/Makefile index ea8b1222..feeefe09 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,19 @@ -PATHS = $(shell go list ./... | tail -n +2 | grep -v test_integration | grep -v test_e2e) +PATHS = $(shell go list ./... | tail -n +2 | grep -v test_integration) lint: golangci-lint run -test_unit: +test_unit_badaas: go test $(PATHS) -v -test_unit_and_cover: +test_unit_badaas_cover: go test $(PATHS) -coverpkg=./... -coverprofile=coverage_unit.out -v +test_unit_badctl: + go test ./tools/badctl/... -v + +test_unit: test_unit_badaas test_unit_badctl + test_db: docker compose -f "docker/test_db/docker-compose.yml" up -d diff --git a/sonar-project.properties b/sonar-project.properties index a0b12f5a..a026b18e 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -6,4 +6,4 @@ sonar.sources=. sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/docker/api/Dockerfile sonar.tests=. sonar.test.inclusions=**/*_test.go,testintegration/***,test_e2e/*** -sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_int.out/coverage_int.out +sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_badctl.out/coverage_badctl.out,coverage_int.out/coverage_int.out diff --git a/tools/badctl/cmd/gen_test.go b/tools/badctl/cmd/gen_test.go new file mode 100644 index 00000000..6193f47f --- /dev/null +++ b/tools/badctl/cmd/gen_test.go @@ -0,0 +1,71 @@ +package cmd + +import ( + "io/ioutil" + "log" + "os" + "testing" + + "github.com/magiconair/properties/assert" + "github.com/spf13/viper" + "gopkg.in/yaml.v3" +) + +func TestGenCockroach(t *testing.T) { + generateDockerFiles(nil, nil) + checkFilesExist(t) + checkDBPort(t, 26257) + teardown() +} + +func TestGenPostgres(t *testing.T) { + viper.Set(DBProviderKey, Postgres) + generateDockerFiles(nil, nil) + checkFilesExist(t) + checkFileExists(t, "badaas/docker/db/init.sql") + checkDBPort(t, 5432) + + teardown() +} + +func checkFilesExist(t *testing.T) { + checkFileExists(t, ".dockerignore") + checkFileExists(t, "Makefile") + checkFileExists(t, "badaas/config/badaas.yml") + checkFileExists(t, "badaas/docker/api/docker-compose.yml") + checkFileExists(t, "badaas/docker/api/Dockerfile") + checkFileExists(t, "badaas/docker/db/docker-compose.yml") +} + +func checkFileExists(t *testing.T, name string) { + if _, err := os.Stat(name); err != nil { + t.Error(err) + } +} + +func checkDBPort(t *testing.T, port int) { + yamlFile, err := ioutil.ReadFile("badaas/config/badaas.yml") + if err != nil { + t.Error(err) + } + configData := map[string]any{} + err = yaml.Unmarshal(yamlFile, &configData) + if err != nil { + t.Error(err) + } + + assert.Equal(t, configData["database"].(map[string]any)["port"], port) +} + +func teardown() { + remove(".dockerignore") + remove("Makefile") + remove("badaas") +} + +func remove(name string) { + err := os.RemoveAll(name) + if err != nil { + log.Fatal(err) + } +} From 7a68f87de14aecb1f7a6951d4918d491d33b4600 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 12:35:36 +0200 Subject: [PATCH 285/467] remove failing tests --- test_integration/crudService.go | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/test_integration/crudService.go b/test_integration/crudService.go index abbd852f..46b63285 100644 --- a/test_integration/crudService.go +++ b/test_integration/crudService.go @@ -2,7 +2,6 @@ package integrationtests import ( "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/google/uuid" "github.com/stretchr/testify/suite" "go.uber.org/zap" @@ -259,17 +258,6 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleI EqualList(&ts.Suite, []*Product{match1, match2}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsDBError() { - ts.createProduct("match", 0, 0, false) - - params := map[string]any{ - "not_exists": "not_exists", - } - _, err := ts.crudProductService.GetEntities(params) - ts.NotNil(err) - ts.True(gormdatabase.IsPostgresError(err, "42703")) -} - func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { match := ts.createProduct("match", 1, 0, false) ts.createProduct("not_match", 2, 0, false) @@ -283,17 +271,6 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { EqualList(&ts.Suite, []*Product{match}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeReturnsDBError() { - ts.createProduct("not_match", 1, 0, false) - - params := map[string]any{ - "int": "not_an_int", - } - _, err := ts.crudProductService.GetEntities(params) - ts.NotNil(err) - ts.True(gormdatabase.IsPostgresError(err, "22P02")) -} - func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { match := ts.createProduct("match", 0, 1.1, false) ts.createProduct("not_match", 0, 2.2, false) From 844b6815981a5a2bc1f856d8e4d21ab0695d4897 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 14:36:34 +0200 Subject: [PATCH 286/467] =?UTF-8?q?update=20name=20of=20dockerfile=20to=20?= =?UTF-8?q?ignore=20in=20sonar=C2=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index a8497dcc..a6d0b47a 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.organization=ditrit sonar.projectName=badaas sonar.host.url=https://sonarcloud.io sonar.sources=. -sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/docker/api/Dockerfile +sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/gen/docker/api/Dockerfile sonar.tests=. sonar.test.inclusions=**/*_test.go,testintegration/***,test_e2e/*** sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_badctl.out/coverage_badctl.out,coverage_int_postgresql.out/coverage_int_postgresql.out,coverage_int_mysql.out/coverage_int_mysql.out From f301f6ab964fb2a651c53fcef3bdb2608da144b3 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 14:43:27 +0200 Subject: [PATCH 287/467] divide complex function into 2 --- tools/badctl/cmd/gen/conditions/main.go | 46 ++++++++++++++----------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 63942c9c..07ef5f14 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -53,27 +53,31 @@ func generateConditions(cmd *cobra.Command, args []string) { // Generate conditions for each package for _, pkg := range pkgs { - log.Logger.Infof("Generating conditions for types in package %q", pkg.Types.Name()) - - // Generate a file with conditions for each BaDORM model in the package - for _, name := range pkg.Types.Scope().Names() { - object := getObject(pkg, name) - if object != nil { - file := NewConditionsFile( - destPkg, - strings.ToLower(object.Name())+"_conditions.go", - ) - - err := file.AddConditionsFor(object) - if err != nil { - // object is not a BaDORM model, do not generate conditions - continue - } - - err = file.Save() - if err != nil { - cmderrors.FailErr(err) - } + generateConditionsForPkg(destPkg, pkg) + } +} + +// Generates a file with conditions for each BaDORM model in the package +func generateConditionsForPkg(destPkg string, pkg *packages.Package) { + log.Logger.Infof("Generating conditions for types in package %q", pkg.Types.Name()) + + for _, name := range pkg.Types.Scope().Names() { + object := getObject(pkg, name) + if object != nil { + file := NewConditionsFile( + destPkg, + strings.ToLower(object.Name())+"_conditions.go", + ) + + err := file.AddConditionsFor(object) + if err != nil { + // object is not a BaDORM model, do not generate conditions + continue + } + + err = file.Save() + if err != nil { + cmderrors.FailErr(err) } } } From 61f64627c3e859622eefc1d6cd0ef8edb7ae18d4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 14:44:33 +0200 Subject: [PATCH 288/467] add explanation to empty function --- badorm/condition.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index cd7d4cf0..106dfdfa 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -28,7 +28,10 @@ type WhereCondition[T any] struct { Value any } -func (condition WhereCondition[T]) interfaceVerificationMethod(t T) {} +func (condition WhereCondition[T]) interfaceVerificationMethod(t T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value @@ -78,7 +81,10 @@ type JoinCondition[T1 any, T2 any] struct { Conditions []Condition[T2] } -func (condition JoinCondition[T1, T2]) interfaceVerificationMethod(t T1) {} +func (condition JoinCondition[T1, T2]) interfaceVerificationMethod(t T1) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} // Applies a join between the tables of T1 and T2 // previousTableName is the name of the table of T1 From 6877c753ad71f15f059a666b4f87a7c55d196e40 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 15:03:34 +0200 Subject: [PATCH 289/467] run and fix unsafe tests --- badorm/crudUnsafeRepository.go | 1 + testintegration/badorm_test.go | 2 +- testintegration/crudUnsafeService.go | 43 ++++++---------------------- 3 files changed, 11 insertions(+), 35 deletions(-) diff --git a/badorm/crudUnsafeRepository.go b/badorm/crudUnsafeRepository.go index a3960f39..bfc1b2f1 100644 --- a/badorm/crudUnsafeRepository.go +++ b/badorm/crudUnsafeRepository.go @@ -45,6 +45,7 @@ func (repository *CRUDUnsafeRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, cond return nil, err } + // TODO on column definition, conditions need to have the column name in place of the attribute name query := tx.Where(thisEntityConditions) entity := new(T) diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index 55461b74..dddb6be3 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -73,7 +73,7 @@ func TestBaDORM(t *testing.T) { func runBaDORMTestSuites( tsCRUDService *CRUDServiceIntTestSuite, tsCRUDRepository *CRUDRepositoryIntTestSuite, - tsCRUDUnsafeService *CRUDRepositoryIntTestSuite, + tsCRUDUnsafeService *CRUDUnsafeServiceIntTestSuite, db *gorm.DB, shutdowner fx.Shutdowner, ) { diff --git a/testintegration/crudUnsafeService.go b/testintegration/crudUnsafeService.go index 0b1fbf48..675ebf80 100644 --- a/testintegration/crudUnsafeService.go +++ b/testintegration/crudUnsafeService.go @@ -2,7 +2,6 @@ package testintegration import ( "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/gormdatabase" "github.com/ditrit/badaas/testintegration/models" "gorm.io/gorm" ) @@ -73,7 +72,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsR func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsReturnsEmptyIfNotEntitiesCreated() { params := map[string]any{ - "string": "not_created", + "string_something_else": "not_created", } entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) @@ -85,7 +84,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsRetu ts.createProduct("something_else", 0, 0, false, nil) params := map[string]any{ - "string": "not_match", + "string_something_else": "not_match", } entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) @@ -98,7 +97,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsRetu ts.createProduct("not_match", 0, 0, false, nil) params := map[string]any{ - "string": "match", + "string_something_else": "match", } entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) @@ -112,7 +111,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsRetu ts.createProduct("not_match", 0, 0, false, nil) params := map[string]any{ - "string": "match", + "string_something_else": "match", } entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) @@ -128,7 +127,6 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatD } _, err := ts.crudProductService.GetEntities(params) ts.NotNil(err) - ts.True(gormdatabase.IsPostgresError(err, "42703")) } func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfIntType() { @@ -152,7 +150,6 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfInc } _, err := ts.crudProductService.GetEntities(params) ts.NotNil(err) - ts.True(gormdatabase.IsPostgresError(err, "22P02")) } func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfFloatType() { @@ -208,9 +205,9 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithMultipleCondit ts.createProduct("match", 2, 0.0, true, nil) params := map[string]any{ - "string": "match", - "int": 1, - "bool": true, + "string_something_else": "match", + "int": 1, + "bool": true, } entities, err := ts.crudProductService.GetEntities(params) ts.Nil(err) @@ -333,28 +330,6 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ ts.ErrorContains(err, "Sale has not attribute named NotExists or NotExistsID") } -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsWithEntityThatDefinesTableName() { - person1 := models.Person{ - Name: "franco", - } - person2 := models.Person{ - Name: "xavier", - } - - match := ts.createBicycle("BMX", person1) - ts.createBicycle("Shimano", person2) - - params := map[string]any{ - "Owner": map[string]any{ - "name": "franco", - }, - } - entities, err := ts.crudBicycleService.GetEntities(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Bicycle{match}, entities) -} - func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsOnHasMany() { company1 := ts.createCompany("ditrit") company2 := ts.createCompany("orness") @@ -385,8 +360,8 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ params := map[string]any{ "Product": map[string]any{ - "int": 1, - "string": "match", + "int": 1, + "string_something_else": "match", }, } entities, err := ts.crudSaleService.GetEntities(params) From 12a19b275906ceda827f5db1db48b47c7598ddc8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 15:49:08 +0200 Subject: [PATCH 290/467] fix mysql int tests --- badorm/baseModels.go | 78 --------------- badorm/crudUnsafeRepository.go | 9 +- badorm/uuid.go | 94 +++++++++++++++++++ badorm/uuid_test.go | 22 +++++ controllers/utils.go | 6 +- persistence/repository/EntityRepository.go | 4 +- .../middlewares/middlewareAuthentication.go | 8 +- services/eav.go | 5 +- ...feService.go => crudUnsafeService_test.go} | 18 +++- 9 files changed, 150 insertions(+), 94 deletions(-) create mode 100644 badorm/uuid.go create mode 100644 badorm/uuid_test.go rename testintegration/{crudUnsafeService.go => crudUnsafeService_test.go} (97%) diff --git a/badorm/baseModels.go b/badorm/baseModels.go index 459bb60e..c62fb2e9 100644 --- a/badorm/baseModels.go +++ b/badorm/baseModels.go @@ -1,15 +1,11 @@ package badorm import ( - "context" - "database/sql/driver" "time" "github.com/google/uuid" "gorm.io/gorm" - "gorm.io/gorm/clause" - "gorm.io/gorm/schema" ) // supported types for model identifier @@ -36,77 +32,3 @@ func (model *UUIDModel) BeforeCreate(tx *gorm.DB) (err error) { } type UIntModel gorm.Model - -type UUID uuid.UUID - -func (id UUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { - switch db.Dialector.Name() { - case "mysql": - return "binary(16)" - case "postgres": - return "uuid" - } - return "" -} - -func (id UUID) String() string { - return uuid.UUID(id).String() -} - -func (id UUID) URN() string { - return uuid.UUID(id).URN() -} - -func (id UUID) Variant() uuid.Variant { - return uuid.UUID(id).Variant() -} - -func (id UUID) Version() uuid.Version { - return uuid.UUID(id).Version() -} - -func (id UUID) MarshalText() ([]byte, error) { - return uuid.UUID(id).MarshalText() -} - -func (id *UUID) UnmarshalText(data []byte) error { - return (*uuid.UUID)(id).UnmarshalText(data) -} - -func (id UUID) MarshalBinary() ([]byte, error) { - return uuid.UUID(id).MarshalBinary() -} - -func (id *UUID) UnmarshalBinary(data []byte) error { - return (*uuid.UUID)(id).UnmarshalBinary(data) -} - -func (id *UUID) Scan(src interface{}) error { - return (*uuid.UUID)(id).Scan(src) -} - -func (id UUID) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { - if len(id) == 0 { - return gorm.Expr("NULL") - } - - switch db.Dialector.Name() { - case "mysql": - binary, _ := id.MarshalBinary() - return gorm.Expr("?", binary) - } - - return gorm.Expr("?", id.String()) -} - -func (id UUID) Value() (driver.Value, error) { - return uuid.UUID(id).Value() -} - -func (id UUID) Time() uuid.Time { - return uuid.UUID(id).Time() -} - -func (id UUID) ClockSequence() int { - return uuid.UUID(id).ClockSequence() -} diff --git a/badorm/crudUnsafeRepository.go b/badorm/crudUnsafeRepository.go index bfc1b2f1..82a2fcae 100644 --- a/badorm/crudUnsafeRepository.go +++ b/badorm/crudUnsafeRepository.go @@ -179,7 +179,14 @@ func divideConditionsByEntity( for attributeName, expectedValue := range conditions { switch typedExpectedValue := expectedValue.(type) { - case float64, bool, string, int: + case string: + uuid, err := ParseUUID(typedExpectedValue) + if err == nil { + thisEntityConditions[attributeName] = uuid + } else { + thisEntityConditions[attributeName] = expectedValue + } + case float64, bool, int: thisEntityConditions[attributeName] = expectedValue case map[string]any: joinConditions[attributeName] = typedExpectedValue diff --git a/badorm/uuid.go b/badorm/uuid.go new file mode 100644 index 00000000..3a6a0df1 --- /dev/null +++ b/badorm/uuid.go @@ -0,0 +1,94 @@ +package badorm + +import ( + "context" + "database/sql/driver" + + "github.com/google/uuid" + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/schema" +) + +type UUID uuid.UUID + +func (id UUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "mysql": + return "binary(16)" + case "postgres": + return "uuid" + } + return "" +} + +func (id UUID) String() string { + return uuid.UUID(id).String() +} + +func (id UUID) URN() string { + return uuid.UUID(id).URN() +} + +func (id UUID) Variant() uuid.Variant { + return uuid.UUID(id).Variant() +} + +func (id UUID) Version() uuid.Version { + return uuid.UUID(id).Version() +} + +func (id UUID) MarshalText() ([]byte, error) { + return uuid.UUID(id).MarshalText() +} + +func (id *UUID) UnmarshalText(data []byte) error { + return (*uuid.UUID)(id).UnmarshalText(data) +} + +func (id UUID) MarshalBinary() ([]byte, error) { + return uuid.UUID(id).MarshalBinary() +} + +func (id *UUID) UnmarshalBinary(data []byte) error { + return (*uuid.UUID)(id).UnmarshalBinary(data) +} + +func (id *UUID) Scan(src interface{}) error { + return (*uuid.UUID)(id).Scan(src) +} + +func (id UUID) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { + if len(id) == 0 { + return gorm.Expr("NULL") + } + + switch db.Dialector.Name() { + case "mysql": + binary, _ := id.MarshalBinary() + return gorm.Expr("?", binary) + } + + return gorm.Expr("?", id.String()) +} + +func (id UUID) Value() (driver.Value, error) { + return uuid.UUID(id).Value() +} + +func (id UUID) Time() uuid.Time { + return uuid.UUID(id).Time() +} + +func (id UUID) ClockSequence() int { + return uuid.UUID(id).ClockSequence() +} + +func ParseUUID(s string) (UUID, error) { + uid, err := uuid.Parse(s) + if err != nil { + return UUID(uuid.Nil), err + } + + return UUID(uid), nil +} diff --git a/badorm/uuid_test.go b/badorm/uuid_test.go new file mode 100644 index 00000000..9f7b9c3f --- /dev/null +++ b/badorm/uuid_test.go @@ -0,0 +1,22 @@ +package badorm_test + +import ( + "testing" + + "github.com/ditrit/badaas/badorm" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +func TestParseCorrectUUID(t *testing.T) { + uuidString := uuid.New().String() + uuid, err := badorm.ParseUUID(uuidString) + assert.Nil(t, err) + assert.Equal(t, uuidString, uuid.String()) +} + +func TestParseIncorrectUUID(t *testing.T) { + uid, err := badorm.ParseUUID("not uuid") + assert.Error(t, err) + assert.Equal(t, uuid.Nil, uid) +} diff --git a/controllers/utils.go b/controllers/utils.go index a9b5bdc8..b3961874 100644 --- a/controllers/utils.go +++ b/controllers/utils.go @@ -59,12 +59,12 @@ func getEntityIDFromRequest(r *http.Request) (badorm.UUID, httperrors.HTTPError) return badorm.UUID(uuid.Nil), ErrEntityNotFound } - uid, err := uuid.Parse(id) + uuid, err := badorm.ParseUUID(id) if err != nil { - return badorm.UUID(uuid.Nil), ErrIDNotAnUUID + return uuid, ErrIDNotAnUUID } - return badorm.UUID(uid), nil + return uuid, nil } func mapServiceError(err error) httperrors.HTTPError { diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index d0ef0f1a..0932c118 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -121,9 +121,9 @@ func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attribut case bool: stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.BooleanValueType) case string: - uuid, err := uuid.Parse(expectedValueTyped) + uuid, err := badorm.ParseUUID(expectedValueTyped) if err == nil { - expectedValue = badorm.UUID(uuid) + expectedValue = uuid stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.RelationValueType) } else { stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.StringValueType) diff --git a/router/middlewares/middlewareAuthentication.go b/router/middlewares/middlewareAuthentication.go index 125ea789..2638ddc6 100644 --- a/router/middlewares/middlewareAuthentication.go +++ b/router/middlewares/middlewareAuthentication.go @@ -6,7 +6,6 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/services/sessionservice" - "github.com/google/uuid" "go.uber.org/zap" ) @@ -44,17 +43,18 @@ func (authenticationMiddleware *authenticationMiddleware) Handle(next http.Handl NotAuthenticated.Write(response, authenticationMiddleware.logger) return } - extractedUUID, err := uuid.Parse(accessTokenCookie.Value) + + extractedUUID, err := badorm.ParseUUID(accessTokenCookie.Value) if err != nil { NotAuthenticated.Write(response, authenticationMiddleware.logger) return } - ok, sessionClaims := authenticationMiddleware.sessionService.IsValid(badorm.UUID(extractedUUID)) + ok, sessionClaims := authenticationMiddleware.sessionService.IsValid(extractedUUID) if !ok { NotAuthenticated.Write(response, authenticationMiddleware.logger) return } - herr := authenticationMiddleware.sessionService.RollSession(badorm.UUID(extractedUUID)) + herr := authenticationMiddleware.sessionService.RollSession(extractedUUID) if herr != nil { herr.Write(response, authenticationMiddleware.logger) return diff --git a/services/eav.go b/services/eav.go index 0e5f9765..b188f130 100644 --- a/services/eav.go +++ b/services/eav.go @@ -8,7 +8,6 @@ import ( "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/utils" - "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" ) @@ -210,7 +209,7 @@ func (eavService *eavServiceImpl) updateValue(tx *gorm.DB, value *models.Value, // returns error if entity with "newID" does not exist // or its type is not the same as the one pointed by the attribute's RelationTargetEntityTypeID func (eavService *eavServiceImpl) updateRelationValue(tx *gorm.DB, value *models.Value, newID string) error { - uuidVal, err := uuid.Parse(newID) + uuidVal, err := badorm.ParseUUID(newID) if err != nil { return ErrCantParseUUID } @@ -220,7 +219,7 @@ func (eavService *eavServiceImpl) updateRelationValue(tx *gorm.DB, value *models return err } - relationEntity, err := eavService.entityRepository.Get(tx, relationEntityType.Name, badorm.UUID(uuidVal)) + relationEntity, err := eavService.entityRepository.Get(tx, relationEntityType.Name, uuidVal) if err != nil { return err } diff --git a/testintegration/crudUnsafeService.go b/testintegration/crudUnsafeService_test.go similarity index 97% rename from testintegration/crudUnsafeService.go rename to testintegration/crudUnsafeService_test.go index 675ebf80..e9721a66 100644 --- a/testintegration/crudUnsafeService.go +++ b/testintegration/crudUnsafeService_test.go @@ -1,7 +1,10 @@ package testintegration import ( + "os" + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/testintegration/models" "gorm.io/gorm" ) @@ -142,14 +145,23 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfInt EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfIncorrectTypeReturnsDBError() { +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfIncorrectType() { ts.createProduct("not_match", 1, 0, false, nil) params := map[string]any{ "int": "not_an_int", } - _, err := ts.crudProductService.GetEntities(params) - ts.NotNil(err) + result, err := ts.crudProductService.GetEntities(params) + switch configuration.DBDialector(os.Getenv(dbTypeEnvKey)) { + case configuration.PostgreSQL: + // postgres does the verification + ts.NotNil(err) + case configuration.MySQL: + // mysql simply matches nothing + ts.Nil(err) + ts.Len(result, 0) + } + } func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfFloatType() { From 96faebcf5b29c8f2fb5091aa2d247b1dbfe0c6e2 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 15:56:38 +0200 Subject: [PATCH 291/467] fix unit tests --- badorm/uuid.go | 2 + badorm/uuid_test.go | 2 +- controllers/basicAuth_test.go | 3 +- controllers/eav.go | 5 +-- controllers/utils.go | 3 +- persistence/models/Value.go | 3 +- services/sessionservice/session_test.go | 50 +++++++++++----------- services/sessionservice/sessionctx_test.go | 4 +- testintegration/crudRepository.go | 3 +- testintegration/crudService.go | 2 +- 10 files changed, 37 insertions(+), 40 deletions(-) diff --git a/badorm/uuid.go b/badorm/uuid.go index 3a6a0df1..0f968537 100644 --- a/badorm/uuid.go +++ b/badorm/uuid.go @@ -12,6 +12,8 @@ import ( type UUID uuid.UUID +var NilUUID = UUID(uuid.Nil) + func (id UUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { switch db.Dialector.Name() { case "mysql": diff --git a/badorm/uuid_test.go b/badorm/uuid_test.go index 9f7b9c3f..e4ffc1a6 100644 --- a/badorm/uuid_test.go +++ b/badorm/uuid_test.go @@ -18,5 +18,5 @@ func TestParseCorrectUUID(t *testing.T) { func TestParseIncorrectUUID(t *testing.T) { uid, err := badorm.ParseUUID("not uuid") assert.Error(t, err) - assert.Equal(t, uuid.Nil, uid) + assert.Equal(t, badorm.NilUUID, uid) } diff --git a/controllers/basicAuth_test.go b/controllers/basicAuth_test.go index 5f174c9b..fcbaf28c 100644 --- a/controllers/basicAuth_test.go +++ b/controllers/basicAuth_test.go @@ -13,7 +13,6 @@ import ( mocksUserService "github.com/ditrit/badaas/mocks/services/userservice" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" - "github.com/google/uuid" "github.com/stretchr/testify/assert" "go.uber.org/zap" "go.uber.org/zap/zaptest/observer" @@ -140,7 +139,7 @@ func Test_BasicLoginHandler_LoginSuccess(t *testing.T) { userService := mocksUserService.NewUserService(t) user := &models.User{ UUIDModel: badorm.UUIDModel{ - ID: badorm.UUID(uuid.Nil), + ID: badorm.NilUUID, }, Username: "bob", Email: "bob@email.com", diff --git a/controllers/eav.go b/controllers/eav.go index 1b91b880..351af81c 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -9,7 +9,6 @@ import ( "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/services" - "github.com/google/uuid" "github.com/gorilla/mux" "go.uber.org/zap" "gorm.io/gorm" @@ -149,12 +148,12 @@ func (controller *eavControllerImpl) getEntityTypeNameFromRequest(r *http.Reques func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Request) (string, badorm.UUID, httperrors.HTTPError) { entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) if herr != nil { - return "", badorm.UUID(uuid.Nil), herr + return "", badorm.NilUUID, herr } entityID, herr := getEntityIDFromRequest(r) if herr != nil { - return "", badorm.UUID(uuid.Nil), herr + return "", badorm.NilUUID, herr } return entityTypeName, entityID, nil diff --git a/controllers/utils.go b/controllers/utils.go index b3961874..469d6e69 100644 --- a/controllers/utils.go +++ b/controllers/utils.go @@ -8,7 +8,6 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" - "github.com/google/uuid" "github.com/gorilla/mux" "gorm.io/gorm" ) @@ -56,7 +55,7 @@ func decodeJSONOptional(r *http.Request) (map[string]any, httperrors.HTTPError) func getEntityIDFromRequest(r *http.Request) (badorm.UUID, httperrors.HTTPError) { id, present := mux.Vars(r)["id"] if !present { - return badorm.UUID(uuid.Nil), ErrEntityNotFound + return badorm.NilUUID, ErrEntityNotFound } uuid, err := badorm.ParseUUID(id) diff --git a/persistence/models/Value.go b/persistence/models/Value.go index f57115aa..908d6f55 100644 --- a/persistence/models/Value.go +++ b/persistence/models/Value.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/ditrit/badaas/badorm" - "github.com/google/uuid" ) // Describe the attribute value of an Entity @@ -101,7 +100,7 @@ func (v *Value) SetNull() error { v.FloatVal = 0.0 v.StringVal = "" v.BoolVal = false - v.RelationVal = badorm.UUID(uuid.Nil) + v.RelationVal = badorm.NilUUID return nil } diff --git a/services/sessionservice/session_test.go b/services/sessionservice/session_test.go index 04fe6a1f..5d5d4cb0 100644 --- a/services/sessionservice/session_test.go +++ b/services/sessionservice/session_test.go @@ -47,9 +47,9 @@ func setupTest( } func TestNewSession(t *testing.T) { - sessionInstance := models.NewSession(badorm.UUID(uuid.Nil), time.Second) + sessionInstance := models.NewSession(badorm.NilUUID, time.Second) assert.NotNil(t, sessionInstance) - assert.Equal(t, badorm.UUID(uuid.Nil), sessionInstance.UserID) + assert.Equal(t, badorm.NilUUID, sessionInstance.UserID) } func TestLogInUser(t *testing.T) { @@ -96,17 +96,17 @@ func TestIsValid(t *testing.T) { UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: time.Now().Add(time.Hour), } err := service.add(session) require.NoError(t, err) assert.Len(t, service.cache, 1) - assert.Equal(t, badorm.UUID(uuid.Nil), service.cache[uuidSample].UserID) + assert.Equal(t, badorm.NilUUID, service.cache[uuidSample].UserID) isValid, claims := service.IsValid(uuidSample) require.True(t, isValid) assert.Equal(t, *claims, SessionClaims{ - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, SessionUUID: uuidSample, }) } @@ -129,7 +129,7 @@ func TestLogOutUser(t *testing.T) { UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: time.Now().Add(time.Hour), } service.cache[uuidSample] = session @@ -149,7 +149,7 @@ func TestLogOutUserDbError(t *testing.T) { UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: time.Now().Add(time.Hour), } service.cache[uuidSample] = session @@ -167,14 +167,14 @@ func TestLogOutUser_SessionNotFound(t *testing.T) { uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: badorm.UUID(uuid.Nil), + ID: badorm.NilUUID, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: time.Now().Add(time.Hour), } service.cache[uuidSample] = session sessionClaims := makeSessionClaims(session) - sessionClaims.SessionUUID = badorm.UUID(uuid.Nil) + sessionClaims.SessionUUID = badorm.NilUUID err := service.LogUserOut(sessionClaims) require.Error(t, err) assert.Len(t, service.cache, 1) @@ -190,9 +190,9 @@ func TestRollSession(t *testing.T) { originalExpirationTime := time.Now().Add(sessionDuration / 5) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: badorm.UUID(uuid.Nil), + ID: badorm.NilUUID, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: originalExpirationTime, } service.cache[uuidSample] = session @@ -212,7 +212,7 @@ func TestRollSession_Expired(t *testing.T) { UUIDModel: badorm.UUIDModel{ ID: uuidSample, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: originalExpirationTime, } service.cache[uuidSample] = session @@ -230,9 +230,9 @@ func TestRollSession_falseUUID(t *testing.T) { originalExpirationTime := time.Now().Add(-time.Hour) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: badorm.UUID(uuid.Nil), + ID: badorm.NilUUID, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: originalExpirationTime, } service.cache[uuidSample] = session @@ -248,14 +248,14 @@ func TestRollSession_falseUUID(t *testing.T) { func TestRollSession_sessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, sessionConfigurationMock := setupTest(t) sessionRepositoryMock. - On("GetOptionalByID", gormDB, badorm.UUID(uuid.Nil)). + On("GetOptionalByID", gormDB, badorm.NilUUID). Return(nil, nil) sessionDuration := time.Minute sessionConfigurationMock.On("GetSessionDuration").Return(sessionDuration) sessionConfigurationMock.On("GetRollDuration").Return(sessionDuration) - err := service.RollSession(badorm.UUID(uuid.Nil)) + err := service.RollSession(badorm.NilUUID) require.NoError(t, err) } @@ -263,9 +263,9 @@ func Test_pullFromDB(t *testing.T) { sessionRepositoryMock, service, logs, _ := setupTest(t) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: badorm.UUID(uuid.Nil), + ID: badorm.NilUUID, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: time.Now().Add(time.Hour), } sessionRepositoryMock.On("GetAll", gormDB).Return([]*models.Session{session}, nil) @@ -291,9 +291,9 @@ func Test_removeExpired(t *testing.T) { uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: badorm.UUID(uuid.Nil), + ID: badorm.NilUUID, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. @@ -316,9 +316,9 @@ func Test_removeExpired_RepositoryError(t *testing.T) { uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: badorm.UUID(uuid.Nil), + ID: badorm.NilUUID, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. @@ -334,9 +334,9 @@ func Test_get(t *testing.T) { uuidSample := badorm.UUID(uuid.New()) session := &models.Session{ UUIDModel: badorm.UUIDModel{ - ID: badorm.UUID(uuid.Nil), + ID: badorm.NilUUID, }, - UserID: badorm.UUID(uuid.Nil), + UserID: badorm.NilUUID, ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. diff --git a/services/sessionservice/sessionctx_test.go b/services/sessionservice/sessionctx_test.go index fe03bac0..9981f9dc 100644 --- a/services/sessionservice/sessionctx_test.go +++ b/services/sessionservice/sessionctx_test.go @@ -11,10 +11,10 @@ import ( func TestSessionCtx(t *testing.T) { ctx := context.Background() - sessionClaims := &SessionClaims{badorm.UUID(uuid.Nil), badorm.UUID(uuid.New())} + sessionClaims := &SessionClaims{badorm.NilUUID, badorm.UUID(uuid.New())} ctx = SetSessionClaimsContext(ctx, sessionClaims) claims := GetSessionClaimsFromContext(ctx) - assert.Equal(t, badorm.UUID(uuid.Nil), claims.UserID) + assert.Equal(t, badorm.NilUUID, claims.UserID) } func TestSessionCtxPanic(t *testing.T) { diff --git a/testintegration/crudRepository.go b/testintegration/crudRepository.go index 83585b2e..e26fdf02 100644 --- a/testintegration/crudRepository.go +++ b/testintegration/crudRepository.go @@ -4,7 +4,6 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" - "github.com/google/uuid" "github.com/stretchr/testify/suite" "gorm.io/gorm" "gotest.tools/assert" @@ -38,7 +37,7 @@ func (ts *CRUDRepositoryIntTestSuite) TearDownSuite() { func (ts *CRUDRepositoryIntTestSuite) TestGetByIDReturnsErrorIfIDDontMatch() { ts.createProduct(0) - _, err := ts.crudProductRepository.GetByID(ts.db, badorm.UUID(uuid.Nil)) + _, err := ts.crudProductRepository.GetByID(ts.db, badorm.NilUUID) ts.Error(err, gorm.ErrRecordNotFound) } diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 05e36d5b..aae051f8 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -47,7 +47,7 @@ func NewCRUDServiceIntTestSuite( // ------------------------- GetEntity -------------------------------- func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { - _, err := ts.crudProductService.GetEntity(badorm.UUID(uuid.Nil)) + _, err := ts.crudProductService.GetEntity(badorm.NilUUID) ts.Error(err, gorm.ErrRecordNotFound) } From 20ed00e3731d285c028fcb008eff511d2d20512d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 16:07:17 +0200 Subject: [PATCH 292/467] add getOptionalByID tests --- testintegration/crudRepository.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/testintegration/crudRepository.go b/testintegration/crudRepository.go index e26fdf02..3610a96f 100644 --- a/testintegration/crudRepository.go +++ b/testintegration/crudRepository.go @@ -50,6 +50,24 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetByIDReturnsEntityIfIDMatch() { assert.DeepEqual(ts.T(), product, productReturned) } +// ------------------------- GetOptionalByID -------------------------------- + +func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalByIDReturnsErrorIfIDDontMatch() { + ts.createProduct(0) + result, err := ts.crudProductRepository.GetOptionalByID(ts.db, badorm.NilUUID) + ts.Nil(err) + ts.Nil(result) +} + +func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalByIDReturnsEntityIfIDMatch() { + product := ts.createProduct(0) + ts.createProduct(0) + productReturned, err := ts.crudProductRepository.GetOptionalByID(ts.db, product.ID) + ts.Nil(err) + + assert.DeepEqual(ts.T(), product, productReturned) +} + // ------------------------- Get -------------------------------- func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsErrorIfConditionsDontMatch() { From 588cc1ddb50fd2dbd38eabdd0da924a8f22f03ee Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 16:33:06 +0200 Subject: [PATCH 293/467] add int tests from uint model --- testintegration/badorm_test.go | 4 ++ .../conditions/brand_conditions.go | 40 ++++++++++++++ .../conditions/phone_conditions.go | 53 +++++++++++++++++++ testintegration/crudService.go | 35 ++++++++++++ testintegration/crudServiceCommon.go | 21 ++++++++ testintegration/crudUnsafeService_test.go | 37 +++++++++++++ testintegration/db_models.go | 2 + testintegration/models/models.go | 23 ++++++++ 8 files changed, 215 insertions(+) create mode 100644 testintegration/conditions/brand_conditions.go create mode 100644 testintegration/conditions/phone_conditions.go diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index dddb6be3..172c75fb 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -51,6 +51,8 @@ func TestBaDORM(t *testing.T) { badorm.GetCRUDServiceModule[models.Country](), badorm.GetCRUDServiceModule[models.Employee](), badorm.GetCRUDServiceModule[models.Bicycle](), + badorm.GetCRUDServiceModule[models.Phone](), + badorm.GetCRUDServiceModule[models.Brand](), badorm.GetCRUDUnsafeServiceModule[models.Company](), badorm.GetCRUDUnsafeServiceModule[models.Seller](), @@ -61,6 +63,8 @@ func TestBaDORM(t *testing.T) { badorm.GetCRUDUnsafeServiceModule[models.Employee](), badorm.GetCRUDUnsafeServiceModule[models.Person](), badorm.GetCRUDUnsafeServiceModule[models.Bicycle](), + badorm.GetCRUDUnsafeServiceModule[models.Phone](), + badorm.GetCRUDUnsafeServiceModule[models.Brand](), fx.Provide(NewCRUDServiceIntTestSuite), fx.Provide(NewCRUDUnsafeServiceIntTestSuite), diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go new file mode 100644 index 00000000..2a26f8a7 --- /dev/null +++ b/testintegration/conditions/brand_conditions.go @@ -0,0 +1,40 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + gorm "gorm.io/gorm" + "time" +) + +func BrandId(v uint) badorm.WhereCondition[models.Brand] { + return badorm.WhereCondition[models.Brand]{ + Field: "id", + Value: v, + } +} +func BrandCreatedAt(v time.Time) badorm.WhereCondition[models.Brand] { + return badorm.WhereCondition[models.Brand]{ + Field: "created_at", + Value: v, + } +} +func BrandUpdatedAt(v time.Time) badorm.WhereCondition[models.Brand] { + return badorm.WhereCondition[models.Brand]{ + Field: "updated_at", + Value: v, + } +} +func BrandDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Brand] { + return badorm.WhereCondition[models.Brand]{ + Field: "deleted_at", + Value: v, + } +} +func BrandName(v string) badorm.WhereCondition[models.Brand] { + return badorm.WhereCondition[models.Brand]{ + Field: "name", + Value: v, + } +} diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go new file mode 100644 index 00000000..55b1b89e --- /dev/null +++ b/testintegration/conditions/phone_conditions.go @@ -0,0 +1,53 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + gorm "gorm.io/gorm" + "time" +) + +func PhoneId(v uint) badorm.WhereCondition[models.Phone] { + return badorm.WhereCondition[models.Phone]{ + Field: "id", + Value: v, + } +} +func PhoneCreatedAt(v time.Time) badorm.WhereCondition[models.Phone] { + return badorm.WhereCondition[models.Phone]{ + Field: "created_at", + Value: v, + } +} +func PhoneUpdatedAt(v time.Time) badorm.WhereCondition[models.Phone] { + return badorm.WhereCondition[models.Phone]{ + Field: "updated_at", + Value: v, + } +} +func PhoneDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Phone] { + return badorm.WhereCondition[models.Phone]{ + Field: "deleted_at", + Value: v, + } +} +func PhoneName(v string) badorm.WhereCondition[models.Phone] { + return badorm.WhereCondition[models.Phone]{ + Field: "name", + Value: v, + } +} +func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[models.Phone] { + return badorm.JoinCondition[models.Phone, models.Brand]{ + Conditions: conditions, + T1Field: "brand_id", + T2Field: "id", + } +} +func PhoneBrandId(v uint) badorm.WhereCondition[models.Phone] { + return badorm.WhereCondition[models.Phone]{ + Field: "brand_id", + Value: v, + } +} diff --git a/testintegration/crudService.go b/testintegration/crudService.go index aae051f8..a855de5e 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -18,6 +18,8 @@ type CRUDServiceIntTestSuite struct { crudCityService badorm.CRUDService[models.City, badorm.UUID] crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID] crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID] + crudBrandService badorm.CRUDService[models.Brand, uint] + crudPhoneService badorm.CRUDService[models.Phone, uint] } func NewCRUDServiceIntTestSuite( @@ -29,6 +31,8 @@ func NewCRUDServiceIntTestSuite( crudCityService badorm.CRUDService[models.City, badorm.UUID], crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID], crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID], + crudBrandService badorm.CRUDService[models.Brand, uint], + crudPhoneService badorm.CRUDService[models.Phone, uint], ) *CRUDServiceIntTestSuite { return &CRUDServiceIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ @@ -41,6 +45,8 @@ func NewCRUDServiceIntTestSuite( crudCityService: crudCityService, crudEmployeeService: crudEmployeeService, crudBicycleService: crudBicycleService, + crudBrandService: crudBrandService, + crudPhoneService: crudPhoneService, } } @@ -438,6 +444,35 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOpt EqualList(&ts.Suite, []*models.Sale{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsOnUIntModel() { + match := ts.createBrand("match") + ts.createBrand("not_match") + + entities, err := ts.crudBrandService.GetEntities( + conditions.BrandName("match"), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Brand{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsUintBelongsTo() { + brand1 := ts.createBrand("google") + brand2 := ts.createBrand("apple") + + match := ts.createPhone("pixel", *brand1) + ts.createPhone("iphone", *brand2) + + entities, err := ts.crudPhoneService.GetEntities( + conditions.PhoneBrand( + conditions.BrandName("google"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Phone{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { product1 := ts.createProduct("", 1, 0.0, false, nil) product2 := ts.createProduct("", 2, 0.0, false, nil) diff --git a/testintegration/crudServiceCommon.go b/testintegration/crudServiceCommon.go index 88324eb8..8f7c024b 100644 --- a/testintegration/crudServiceCommon.go +++ b/testintegration/crudServiceCommon.go @@ -103,3 +103,24 @@ func (ts *CRUDServiceCommonIntTestSuite) createBicycle(name string, owner models return entity } + +func (ts *CRUDServiceCommonIntTestSuite) createBrand(name string) *models.Brand { + entity := &models.Brand{ + Name: name, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} + +func (ts *CRUDServiceCommonIntTestSuite) createPhone(name string, brand models.Brand) *models.Phone { + entity := &models.Phone{ + Name: name, + Brand: brand, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} diff --git a/testintegration/crudUnsafeService_test.go b/testintegration/crudUnsafeService_test.go index e9721a66..536922df 100644 --- a/testintegration/crudUnsafeService_test.go +++ b/testintegration/crudUnsafeService_test.go @@ -18,6 +18,8 @@ type CRUDUnsafeServiceIntTestSuite struct { crudCityService badorm.CRUDUnsafeService[models.City, badorm.UUID] crudEmployeeService badorm.CRUDUnsafeService[models.Employee, badorm.UUID] crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, badorm.UUID] + crudBrandService badorm.CRUDUnsafeService[models.Brand, uint] + crudPhoneService badorm.CRUDUnsafeService[models.Phone, uint] } func NewCRUDUnsafeServiceIntTestSuite( @@ -29,6 +31,8 @@ func NewCRUDUnsafeServiceIntTestSuite( crudCityService badorm.CRUDUnsafeService[models.City, badorm.UUID], crudEmployeeService badorm.CRUDUnsafeService[models.Employee, badorm.UUID], crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, badorm.UUID], + crudBrandService badorm.CRUDUnsafeService[models.Brand, uint], + crudPhoneService badorm.CRUDUnsafeService[models.Phone, uint], ) *CRUDUnsafeServiceIntTestSuite { return &CRUDUnsafeServiceIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ @@ -41,6 +45,8 @@ func NewCRUDUnsafeServiceIntTestSuite( crudCityService: crudCityService, crudEmployeeService: crudEmployeeService, crudBicycleService: crudBicycleService, + crudBrandService: crudBrandService, + crudPhoneService: crudPhoneService, } } @@ -227,6 +233,37 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithMultipleCondit EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsOnUIntModel() { + match := ts.createBrand("match") + ts.createBrand("not_match") + + params := map[string]any{ + "name": "match", + } + entities, err := ts.crudBrandService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Brand{match}, entities) +} + +func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsUintBelongsTo() { + brand1 := ts.createBrand("google") + brand2 := ts.createBrand("apple") + + match := ts.createPhone("pixel", *brand1) + ts.createPhone("iphone", *brand2) + + params := map[string]any{ + "Brand": map[string]any{ + "name": "google", + }, + } + entities, err := ts.crudPhoneService.GetEntities(params) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Phone{match}, entities) +} + func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsBelongsTo() { product1 := ts.createProduct("", 1, 0.0, false, nil) product2 := ts.createProduct("", 2, 0.0, false, nil) diff --git a/testintegration/db_models.go b/testintegration/db_models.go index 4dd2bd84..a7050dc7 100644 --- a/testintegration/db_models.go +++ b/testintegration/db_models.go @@ -19,6 +19,8 @@ var ListOfTables = []any{ models.Employee{}, models.Person{}, models.Bicycle{}, + models.Brand{}, + models.Phone{}, } func GetModels() badorm.GetModelsResult { diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 684fddc7..f16be010 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -158,3 +158,26 @@ type Bicycle struct { func (m Bicycle) Equal(other Bicycle) bool { return m.Name == other.Name } + +type Brand struct { + badorm.UIntModel + + Name string +} + +func (m Brand) Equal(other Brand) bool { + return m.Name == other.Name +} + +type Phone struct { + badorm.UIntModel + + Name string + // Phone belongsTo Brand (Phone 0..* -> 1 Brand) + Brand Brand + BrandID uint +} + +func (m Phone) Equal(other Phone) bool { + return m.Name == other.Name +} From 3f2daae1a19f5bef01e5b633e8725973780da51a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 17:12:46 +0200 Subject: [PATCH 294/467] fix dependencies between badctl and badaas --- go.work.sum | 52 +--------------------------------- tools/badctl/go.mod | 31 +++++++++++++++++---- tools/badctl/go.sum | 68 ++++++++++++++++++++++++++++++++++----------- 3 files changed, 78 insertions(+), 73 deletions(-) diff --git a/go.work.sum b/go.work.sum index 411c2815..0fefec7f 100644 --- a/go.work.sum +++ b/go.work.sum @@ -339,15 +339,7 @@ github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/ github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= -github.com/jackc/pgconn v1.14.0 h1:vrbA9Ud87g6JdFWkHTJXppVce58qPIdP7N8y0Ml/A7Q= -github.com/jackc/pgconn v1.14.0/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= -github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0= -github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= -github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -366,8 +358,6 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -380,17 +370,9 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/sagikazarmark/crypt v0.10.0/go.mod h1:gwTNHQVoOS3xp9Xvz5LLR+1AauC5M6880z5NWzdhOyQ= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k= go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4= go.etcd.io/etcd/client/v2 v2.305.7/go.mod h1:GQGT5Z3TBuAQGvgPfhR7VPySu/SudxmEkRq9BgzFU6s= @@ -398,31 +380,14 @@ go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQa go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/dig v1.16.1/go.mod h1:557JTAUZT5bUK0SvCwikmLPPtdQhfvLYtO5tJgQSbnk= -go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= -go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= -go.uber.org/fx v1.19.3 h1:YqMRE4+2IepTYCMOvXqQpRa+QAVdiSTnsHU4XNWBceA= -go.uber.org/fx v1.19.3/go.mod h1:w2HrQg26ql9fLK7hlBiZ6JsRUKV+Lj/atT1KCjT8YhM= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= -golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -431,9 +396,7 @@ golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= @@ -443,7 +406,6 @@ golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -453,19 +415,12 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -473,7 +428,6 @@ golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= @@ -512,8 +466,4 @@ google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= -gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= -gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= -gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= diff --git a/tools/badctl/go.mod b/tools/badctl/go.mod index 9f1871a4..c89734c0 100644 --- a/tools/badctl/go.mod +++ b/tools/badctl/go.mod @@ -2,35 +2,54 @@ module github.com/ditrit/badaas/tools/badctl go 1.18 +replace github.com/ditrit/badaas => ../.. + require ( github.com/dave/jennifer v1.6.1 + github.com/ditrit/badaas v0.0.0 github.com/ditrit/verdeter v0.4.0 github.com/elliotchance/pie/v2 v2.5.2 github.com/ettle/strcase v0.1.1 github.com/fatih/structtag v1.2.0 + github.com/magiconair/properties v1.8.7 github.com/sirupsen/logrus v1.9.2 github.com/spf13/cobra v1.7.0 - github.com/spf13/viper v1.15.0 + github.com/spf13/viper v1.16.0 golang.org/x/tools v0.6.0 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.3.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/pelletier/go-toml/v2 v2.0.7 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect - golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/dig v1.17.0 // indirect + go.uber.org/fx v1.19.3 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.24.0 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect golang.org/x/mod v0.8.0 // indirect - golang.org/x/sys v0.7.0 // indirect + golang.org/x/sys v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect + gorm.io/driver/mysql v1.5.1 // indirect + gorm.io/driver/postgres v1.5.2 // indirect + gorm.io/gorm v1.25.1 // indirect ) diff --git a/tools/badctl/go.sum b/tools/badctl/go.sum index 3f2f07d4..9c8a0a77 100644 --- a/tools/badctl/go.sum +++ b/tools/badctl/go.sum @@ -38,6 +38,7 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -66,12 +67,14 @@ github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -124,6 +127,8 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -135,12 +140,22 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= +github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -150,41 +165,43 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us= -github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -197,6 +214,17 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= +go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= +go.uber.org/fx v1.19.3 h1:YqMRE4+2IepTYCMOvXqQpRa+QAVdiSTnsHU4XNWBceA= +go.uber.org/fx v1.19.3/go.mod h1:w2HrQg26ql9fLK7hlBiZ6JsRUKV+Lj/atT1KCjT8YhM= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -204,6 +232,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -214,8 +244,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 h1:ba9YlqfDGTTQ5aZ2fwOoQ1hf32QySyQkR6ODGDzHlnE= -golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -330,8 +360,8 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -488,8 +518,8 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -497,6 +527,12 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= +gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= +gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= +gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= +gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= +gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From 0a1e098e242f1c0b939c4009b7b1a6404ae43b9b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 5 Jun 2023 17:22:01 +0200 Subject: [PATCH 295/467] fix dependencies between badctl and badaas 2 --- tools/badctl/go.mod | 4 ++-- tools/badctl/go.sum | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/badctl/go.mod b/tools/badctl/go.mod index c89734c0..9c9628bb 100644 --- a/tools/badctl/go.mod +++ b/tools/badctl/go.mod @@ -2,11 +2,11 @@ module github.com/ditrit/badaas/tools/badctl go 1.18 -replace github.com/ditrit/badaas => ../.. +// replace github.com/ditrit/badaas => ../.. require ( github.com/dave/jennifer v1.6.1 - github.com/ditrit/badaas v0.0.0 + github.com/ditrit/badaas v0.0.0-20230605151246-3f2daae1a19f github.com/ditrit/verdeter v0.4.0 github.com/elliotchance/pie/v2 v2.5.2 github.com/ettle/strcase v0.1.1 diff --git a/tools/badctl/go.sum b/tools/badctl/go.sum index 9c8a0a77..010e1709 100644 --- a/tools/badctl/go.sum +++ b/tools/badctl/go.sum @@ -53,6 +53,8 @@ github.com/dave/jennifer v1.6.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ditrit/badaas v0.0.0-20230605151246-3f2daae1a19f h1:mRyf40I29+vL/foE1km3XcFUzLbI7gszDQHqmj4uybs= +github.com/ditrit/badaas v0.0.0-20230605151246-3f2daae1a19f/go.mod h1:Qaxactfr4iYYzfBmyW4DkG/5pkfkk/dVZ0Y8H1cYeTM= github.com/ditrit/verdeter v0.4.0 h1:DzEOFauuXEGNQYP6OgYtHwEyb3w9riem99u0xE/l7+o= github.com/ditrit/verdeter v0.4.0/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= github.com/elliotchance/pie/v2 v2.5.2 h1:jRENMmysCljhUmyT8ITKV0Atp6Lukm3XpeqaI87POsM= From 5369ed49dfa1a64490a001b71d8a68d21c5f7073 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 6 Jun 2023 19:49:32 +0200 Subject: [PATCH 296/467] add badaas unit test report --- .github/workflows/CI.yml | 9 ++++++++- Makefile | 5 +---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 9b36f1fa..deeae5b1 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -66,7 +66,14 @@ jobs: go-version: '^1.18' cache: true - name: Run BaDaaS tests - run: make test_unit_badaas_cover + run: gotestsum --junitfile unit-tests.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage_unit.out + - name: Test Report + uses: dorny/test-reporter@v1 + if: always() # run this step even if previous step failed + with: + name: Unit Tests # Name of the check run which will be created + path: unit-tests.xml # Path to test results + reporter: java-junit # Format of test results - uses: actions/upload-artifact@v3 with: name: coverage_unit diff --git a/Makefile b/Makefile index 32cb788c..e36082cb 100644 --- a/Makefile +++ b/Makefile @@ -4,10 +4,7 @@ lint: golangci-lint run test_unit_badaas: - go test $(PATHS) -v - -test_unit_badaas_cover: - go test $(PATHS) -coverpkg=./... -coverprofile=coverage_unit.out -v + gotestsum --format pkgname $(PATHS) test_unit_badctl: go test ./tools/badctl/... -v From 0c0ab7bd25521c856b1e2710b3860b4cd3f6fb28 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 6 Jun 2023 19:53:37 +0200 Subject: [PATCH 297/467] install gotestsum --- .github/workflows/CI.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index deeae5b1..d56134ff 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -65,6 +65,8 @@ jobs: with: go-version: '^1.18' cache: true + - name: Install gotestsum + run: go install gotest.tools/gotestsum@latest - name: Run BaDaaS tests run: gotestsum --junitfile unit-tests.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage_unit.out - name: Test Report From f5bcded1458802cce36f844626f95d3f09f14807 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 7 Jun 2023 09:54:56 +0200 Subject: [PATCH 298/467] unit test report include badctl --- .github/workflows/CI.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index d56134ff..10e244d1 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -68,24 +68,24 @@ jobs: - name: Install gotestsum run: go install gotest.tools/gotestsum@latest - name: Run BaDaaS tests - run: gotestsum --junitfile unit-tests.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage_unit.out - - name: Test Report - uses: dorny/test-reporter@v1 - if: always() # run this step even if previous step failed - with: - name: Unit Tests # Name of the check run which will be created - path: unit-tests.xml # Path to test results - reporter: java-junit # Format of test results + run: gotestsum --junitfile unit-tests-badaas.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage_unit.out - uses: actions/upload-artifact@v3 with: name: coverage_unit path: coverage_unit.out - name: Run BaDctl tests - run: go test ./tools/badctl/... -coverprofile=coverage_badctl.out -v + run: gotestsum --junitfile unit-tests-badctl.xml ./tools/badctl/... -coverprofile=coverage_badctl.out - uses: actions/upload-artifact@v3 with: name: coverage_badctl path: coverage_badctl.out + - name: Test Report + uses: dorny/test-reporter@v1 + if: always() # run this step even if previous steps failed + with: + name: Unit Tests Report # Name of the check run which will be created + path: unit-tests-*.xml # Path to test results + reporter: java-junit # Format of test results integration-tests: name: Integration tests From 89faeede6cf06bfbf3196c0cf03c3fd434a570ca Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 7 Jun 2023 10:04:21 +0200 Subject: [PATCH 299/467] integration tests report --- .github/workflows/CI.yml | 11 ++++++++++- Makefile | 8 ++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 10e244d1..6fee5f37 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -102,6 +102,8 @@ jobs: with: go-version: '^1.18' cache: true + - name: Install gotestsum + run: go install gotest.tools/gotestsum@latest - name: Start containers run: docker compose -f "docker/${{ matrix.db }}/docker-compose.yml" up -d - uses: kanga333/variable-mapper@master @@ -122,7 +124,14 @@ jobs: } export_to: env - name: Run test - run: DB=${{ env.dialector }} go test ./testintegration -coverpkg=./... -coverprofile=coverage_int_${{ matrix.db }}.out -v + run: DB=${{ env.dialector }} gotestsum --junitfile unit-tests-${{ matrix.db }}.xml ./testintegration -coverpkg=./... -coverprofile=coverage_int_${{ matrix.db }}.out + - name: Test Report + uses: dorny/test-reporter@v1 + if: always() # run this step even if previous steps failed + with: + name: ${{ matrix.db }} Integration Tests Report # Name of the check run which will be created + path: unit-tests-${{ matrix.db }}.xml # Path to test results + reporter: java-junit # Format of test results - uses: actions/upload-artifact@v3 with: name: coverage_int_${{ matrix.db }} diff --git a/Makefile b/Makefile index e36082cb..08620d0b 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ test_unit_badaas: gotestsum --format pkgname $(PATHS) test_unit_badctl: - go test ./tools/badctl/... -v + gotestsum --format pkgname ./tools/badctl/... test_unit: test_unit_badaas test_unit_badctl @@ -31,13 +31,13 @@ mysql: ./docker/wait_for_db.sh test_integration_postgresql: postgresql - DB=postgresql go test ./testintegration -v + DB=postgresql gotestsum --format testname ./testintegration test_integration_cockroachdb: cockroachdb - DB=postgresql go test ./testintegration -v + DB=postgresql gotestsum --format testname ./testintegration test_integration_mysql: mysql - DB=mysql go test ./testintegration -v + DB=mysql gotestsum --format testname ./testintegration test_integration: test_integration_postgresql From e328590d11f1c6602822ce08b9a83c38634a1838 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 7 Jun 2023 10:12:20 +0200 Subject: [PATCH 300/467] change test result file name --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 6fee5f37..37fec3ec 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -124,7 +124,7 @@ jobs: } export_to: env - name: Run test - run: DB=${{ env.dialector }} gotestsum --junitfile unit-tests-${{ matrix.db }}.xml ./testintegration -coverpkg=./... -coverprofile=coverage_int_${{ matrix.db }}.out + run: DB=${{ env.dialector }} gotestsum --junitfile integration-tests-${{ matrix.db }}.xml ./testintegration -coverpkg=./... -coverprofile=coverage_int_${{ matrix.db }}.out - name: Test Report uses: dorny/test-reporter@v1 if: always() # run this step even if previous steps failed From 349f05b7fb75799a1bbcc731933724487b90233c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 7 Jun 2023 10:19:25 +0200 Subject: [PATCH 301/467] make install dependencies --- CONTRIBUTING.md | 5 +++++ Makefile | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f02870f6..f17c7da7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,7 @@ - [Contribute to the development of badaas](#contribute-to-the-development-of-badaas) - [Tests](#tests) + - [Dependencies](#dependencies) - [Unit tests](#unit-tests) - [Integration tests](#integration-tests) - [Feature tests (of end to end tests)](#feature-tests-of-end-to-end-tests) @@ -14,6 +15,10 @@ ## Tests +### Dependencies + +Running tests have some dependencies as: `mockery`, `gotestsum`, etc.. Install them with `make install dependencies`. + ### Unit tests We use the standard test suite in combination with [github.com/stretchr/testify](https://github.com/stretchr/testify) to do our unit testing. Mocks are generated using [mockery](https://github.com/vektra/mockery) a mock generator using this command `make test_generate_mocks`. diff --git a/Makefile b/Makefile index 08620d0b..ab4d9490 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,10 @@ PATHS = $(shell go list ./... | tail -n +2 | grep -v testintegration) +install_dependencies: + go install gotest.tools/gotestsum@latest + go install github.com/vektra/mockery/v2@v2.20.0 + go install github.com/ditrit/badaas/tools/badctl@latest + lint: golangci-lint run From c2e64ce2c2cafa73ef7e92dbfdbd0eaa852a3825 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 7 Jun 2023 12:22:03 +0200 Subject: [PATCH 302/467] add test for conditions generation --- .gitignore | 3 +- testintegration/models/models.go | 4 +- tools/badctl/cmd/gen/conditions/condition.go | 2 - tools/badctl/cmd/gen/conditions/main_test.go | 197 ++++++++++++++++++ .../tests/basicpointers/basicpointers.go | 26 +++ .../tests/basicslices/basicslices.go | 26 +++ .../basicslicespointer/basicslicespointer.go | 26 +++ .../conditions/tests/basictypes/basictypes.go | 26 +++ .../conditions/tests/belongsto/belongsto.go | 14 ++ .../columndefinition/columndefinition.go | 9 + .../conditions/tests/customtype/customtype.go | 42 ++++ .../conditions/tests/goembedded/goembedded.go | 13 ++ .../tests/gormembedded/gormembedded.go | 13 ++ .../gen/conditions/tests/hasmany/hasmany.go | 15 ++ .../cmd/gen/conditions/tests/hasone/hasone.go | 15 ++ .../multiplepackage/package1/package1.go | 12 ++ .../multiplepackage/package2/package2.go | 9 + .../overrideforeignkey/overrideforeignkey.go | 15 ++ .../overridereferences/overridereferences.go | 17 ++ .../conditions/tests/results/basicpointers.go | 142 +++++++++++++ .../conditions/tests/results/basicslices.go | 142 +++++++++++++ .../tests/results/basicslicespointer.go | 142 +++++++++++++ .../conditions/tests/results/basictypes.go | 142 +++++++++++++ .../tests/results/belongsto_owned.go | 47 +++++ .../tests/results/belongsto_owner.go | 34 +++ .../tests/results/columndefinition.go | 40 ++++ .../conditions/tests/results/customtype.go | 40 ++++ .../conditions/tests/results/goembedded.go | 40 ++++ .../conditions/tests/results/gormembedded.go | 40 ++++ .../tests/results/hasmany_company.go | 41 ++++ .../tests/results/hasmany_seller.go | 40 ++++ .../conditions/tests/results/hasone_city.go | 40 ++++ .../tests/results/hasone_country.go | 48 +++++ .../tests/results/multiplepackage_package1.go | 49 +++++ .../tests/results/overrideforeignkey.go | 47 +++++ .../tests/results/overridereferences.go | 47 +++++ .../tests/results/selfreferential.go | 47 +++++ .../gen/conditions/tests/results/uintmodel.go | 34 +++ .../gen/conditions/tests/results/uuidmodel.go | 34 +++ .../tests/selfreferential/selfreferential.go | 10 + .../conditions/tests/uintmodel/uintmodel.go | 7 + .../conditions/tests/uuidmodel/uuidmodel.go | 7 + tools/badctl/go.mod | 5 +- tools/badctl/go.sum | 5 +- 44 files changed, 1746 insertions(+), 8 deletions(-) create mode 100644 tools/badctl/cmd/gen/conditions/main_test.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/basicpointers/basicpointers.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/basicslices/basicslices.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/basicslicespointer/basicslicespointer.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/basictypes/basictypes.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/belongsto/belongsto.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/columndefinition/columndefinition.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/customtype/customtype.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/goembedded/goembedded.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/gormembedded/gormembedded.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/hasmany/hasmany.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/hasone/hasone.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/multiplepackage/package1/package1.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/multiplepackage/package2/package2.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/overrideforeignkey/overrideforeignkey.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/overridereferences/overridereferences.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/basicslices.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/basictypes.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/customtype.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/goembedded.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/selfreferential/selfreferential.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/uintmodel/uintmodel.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/uuidmodel/uuidmodel.go diff --git a/.gitignore b/.gitignore index f78f7b44..bf74f388 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,5 @@ node* # binary output badaas badctl -!tools/badctl/ \ No newline at end of file +!tools/badctl/ +tools/badctl/cmd/gen/conditions/*_conditions.go \ No newline at end of file diff --git a/testintegration/models/models.go b/testintegration/models/models.go index f16be010..a46bd0ef 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -128,8 +128,8 @@ type Employee struct { badorm.UUIDModel Name string - Boss *Employee `gorm:"constraint:OnDelete:SET NULL;"` // Self-Referential Has One (Employee 0..* -> 0..1 Employee) - BossID *badorm.UUID `gorm:"type:varchar(36)"` + Boss *Employee `gorm:"constraint:OnDelete:SET NULL;"` // Self-Referential Has One (Employee 0..* -> 0..1 Employee) + BossID *badorm.UUID } func (m Employee) Equal(other Employee) bool { diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index f0a38caf..0ae213dd 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -91,7 +91,6 @@ func (condition *Condition) generateForSlice(objectType Type, field Field) { ) } case *types.Pointer: - // TODO pointer solo testeado temporalmente porque despues gorm no lo soporta // slice of pointers, generate code for a slice of the pointed type // after changing the param condition.param.ToPointer() @@ -110,7 +109,6 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) { if err == nil { // field is a BaDORM Model - // TODO que pasa si esta en otro package? se importa solo? hasFK, _ := objectType.HasFK(field) if hasFK { // belongsTo relation diff --git a/tools/badctl/cmd/gen/conditions/main_test.go b/tools/badctl/cmd/gen/conditions/main_test.go new file mode 100644 index 00000000..4286378c --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/main_test.go @@ -0,0 +1,197 @@ +package conditions + +import ( + "bytes" + "io" + "io/fs" + "log" + "os" + "testing" + + "github.com/spf13/viper" + "gotest.tools/assert" +) + +const chunkSize = 100000 + +func TestUIntModel(t *testing.T) { + doTest(t, "./tests/uintmodel", []Comparison{ + {Have: "uintmodel_conditions.go", Expected: "./tests/results/uintmodel.go"}, + }) +} + +func TestUUIDModel(t *testing.T) { + doTest(t, "./tests/uuidmodel", []Comparison{ + {Have: "uuidmodel_conditions.go", Expected: "./tests/results/uuidmodel.go"}, + }) +} + +func TestBasicTypes(t *testing.T) { + doTest(t, "./tests/basictypes", []Comparison{ + {Have: "basictypes_conditions.go", Expected: "./tests/results/basictypes.go"}, + }) +} + +func TestBasicPointers(t *testing.T) { + doTest(t, "./tests/basicpointers", []Comparison{ + {Have: "basicpointers_conditions.go", Expected: "./tests/results/basicpointers.go"}, + }) +} + +func TestBasicSlices(t *testing.T) { + doTest(t, "./tests/basicslices", []Comparison{ + {Have: "basicslices_conditions.go", Expected: "./tests/results/basicslices.go"}, + }) +} + +func TestBasicSlicesPointer(t *testing.T) { + doTest(t, "./tests/basicslicespointer", []Comparison{ + {Have: "basicslicespointer_conditions.go", Expected: "./tests/results/basicslicespointer.go"}, + }) +} + +func TestGoEmbedded(t *testing.T) { + doTest(t, "./tests/goembedded", []Comparison{ + {Have: "goembedded_conditions.go", Expected: "./tests/results/goembedded.go"}, + }) +} + +func TestGormEmbedded(t *testing.T) { + doTest(t, "./tests/gormembedded", []Comparison{ + {Have: "gormembedded_conditions.go", Expected: "./tests/results/gormembedded.go"}, + }) +} + +func TestCustomType(t *testing.T) { + doTest(t, "./tests/customtype", []Comparison{ + {Have: "customtype_conditions.go", Expected: "./tests/results/customtype.go"}, + }) +} + +func TestBelongsTo(t *testing.T) { + doTest(t, "./tests/belongsto", []Comparison{ + {Have: "owner_conditions.go", Expected: "./tests/results/belongsto_owner.go"}, + {Have: "owned_conditions.go", Expected: "./tests/results/belongsto_owned.go"}, + }) +} + +func TestHasOne(t *testing.T) { + doTest(t, "./tests/hasone", []Comparison{ + {Have: "country_conditions.go", Expected: "./tests/results/hasone_country.go"}, + {Have: "city_conditions.go", Expected: "./tests/results/hasone_city.go"}, + }) +} + +func TestHasMany(t *testing.T) { + doTest(t, "./tests/hasmany", []Comparison{ + {Have: "company_conditions.go", Expected: "./tests/results/hasmany_company.go"}, + {Have: "seller_conditions.go", Expected: "./tests/results/hasmany_seller.go"}, + }) +} + +func TestSelfReferential(t *testing.T) { + doTest(t, "./tests/selfreferential", []Comparison{ + {Have: "employee_conditions.go", Expected: "./tests/results/selfreferential.go"}, + }) +} + +func TestMultiplePackage(t *testing.T) { + doTest(t, "./tests/multiplepackage/package1", []Comparison{ + {Have: "package1_conditions.go", Expected: "./tests/results/multiplepackage_package1.go"}, + }) +} + +func TestColumnDefinition(t *testing.T) { + doTest(t, "./tests/columndefinition", []Comparison{ + // TODO deberia haber un _ aca + {Have: "columndefinition_conditions.go", Expected: "./tests/results/columndefinition.go"}, + }) +} + +func TestOverrideForeignKey(t *testing.T) { + doTest(t, "./tests/overrideforeignkey", []Comparison{ + {Have: "bicycle_conditions.go", Expected: "./tests/results/overrideforeignkey.go"}, + }) + remove("person_conditions.go") +} + +func TestOverrideReferences(t *testing.T) { + doTest(t, "./tests/overridereferences", []Comparison{ + {Have: "phone_conditions.go", Expected: "./tests/results/overridereferences.go"}, + }) + remove("brand_conditions.go") +} + +type Comparison struct { + Have string + Expected string +} + +func doTest(t *testing.T, sourcePkg string, comparisons []Comparison) { + viper.Set(DestPackageKey, "conditions") + generateConditions(nil, []string{sourcePkg}) + for _, comparison := range comparisons { + checkFilesEqual(t, comparison.Have, comparison.Expected) + } +} + +func checkFilesEqual(t *testing.T, file1, file2 string) { + stat1 := checkFileExists(t, file1) + stat2 := checkFileExists(t, file2) + + // do inputs at least have the same size? + assert.Equal(t, stat1.Size(), stat2.Size(), "File lens are not equal") + + // long way: compare contents + f1, err := os.Open(file1) + if err != nil { + t.Error(err) + } + defer f1.Close() + + f2, err := os.Open(file2) + if err != nil { + t.Error(err) + } + defer f2.Close() + + b1 := make([]byte, chunkSize) + b2 := make([]byte, chunkSize) + for { + n1, err1 := io.ReadFull(f1, b1) + n2, err2 := io.ReadFull(f2, b2) + + assert.Assert(t, bytes.Equal(b1[:n1], b2[:n2])) + + if (err1 == io.EOF && err2 == io.EOF) || (err1 == io.ErrUnexpectedEOF && err2 == io.ErrUnexpectedEOF) { + break + } + + // some other error, like a dropped network connection or a bad transfer + if err1 != nil { + t.Error(err1) + } + if err2 != nil { + t.Error(err2) + } + } + + remove(file1) +} + +// TODO codigo repetido +func checkFileExists(t *testing.T, name string) fs.FileInfo { + stat, err := os.Stat(name) + if err != nil { + t.Error(err) + } + + return stat +} + +func remove(name string) { + err := os.RemoveAll(name) + if err != nil { + log.Fatal(err) + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/basicpointers/basicpointers.go b/tools/badctl/cmd/gen/conditions/tests/basicpointers/basicpointers.go new file mode 100644 index 00000000..34efd82c --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/basicpointers/basicpointers.go @@ -0,0 +1,26 @@ +package basicpointers + +import "github.com/ditrit/badaas/badorm" + +type BasicPointers struct { + badorm.UUIDModel + + Bool *bool + Int *int + Int8 *int8 + Int16 *int16 + Int32 *int32 + Int64 *int64 + UInt *uint + UInt8 *uint8 + UInt16 *uint16 + UInt32 *uint32 + UInt64 *uint64 + UIntptr *uintptr + Float32 *float32 + Float64 *float64 + Complex64 *complex64 + Complex128 *complex128 + String *string + Byte *byte +} diff --git a/tools/badctl/cmd/gen/conditions/tests/basicslices/basicslices.go b/tools/badctl/cmd/gen/conditions/tests/basicslices/basicslices.go new file mode 100644 index 00000000..362d76b5 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/basicslices/basicslices.go @@ -0,0 +1,26 @@ +package basicslices + +import "github.com/ditrit/badaas/badorm" + +type BasicSlices struct { + badorm.UUIDModel + + Bool []bool + Int []int + Int8 []int8 + Int16 []int16 + Int32 []int32 + Int64 []int64 + UInt []uint + UInt8 []uint8 + UInt16 []uint16 + UInt32 []uint32 + UInt64 []uint64 + UIntptr []uintptr + Float32 []float32 + Float64 []float64 + Complex64 []complex64 + Complex128 []complex128 + String []string + Byte []byte +} diff --git a/tools/badctl/cmd/gen/conditions/tests/basicslicespointer/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/basicslicespointer/basicslicespointer.go new file mode 100644 index 00000000..390cd02b --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/basicslicespointer/basicslicespointer.go @@ -0,0 +1,26 @@ +package basicslices + +import "github.com/ditrit/badaas/badorm" + +type BasicSlicesPointer struct { + badorm.UUIDModel + + Bool []*bool + Int []*int + Int8 []*int8 + Int16 []*int16 + Int32 []*int32 + Int64 []*int64 + UInt []*uint + UInt8 []*uint8 + UInt16 []*uint16 + UInt32 []*uint32 + UInt64 []*uint64 + UIntptr []*uintptr + Float32 []*float32 + Float64 []*float64 + Complex64 []*complex64 + Complex128 []*complex128 + String []*string + Byte []*byte +} diff --git a/tools/badctl/cmd/gen/conditions/tests/basictypes/basictypes.go b/tools/badctl/cmd/gen/conditions/tests/basictypes/basictypes.go new file mode 100644 index 00000000..45488e59 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/basictypes/basictypes.go @@ -0,0 +1,26 @@ +package basictypes + +import "github.com/ditrit/badaas/badorm" + +type BasicTypes struct { + badorm.UUIDModel + + Bool bool + Int int + Int8 int8 + Int16 int16 + Int32 int32 + Int64 int64 + UInt uint + UInt8 uint8 + UInt16 uint16 + UInt32 uint32 + UInt64 uint64 + UIntptr uintptr + Float32 float32 + Float64 float64 + Complex64 complex64 + Complex128 complex128 + String string + Byte byte +} diff --git a/tools/badctl/cmd/gen/conditions/tests/belongsto/belongsto.go b/tools/badctl/cmd/gen/conditions/tests/belongsto/belongsto.go new file mode 100644 index 00000000..c8d94b30 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/belongsto/belongsto.go @@ -0,0 +1,14 @@ +package belongsto + +import "github.com/ditrit/badaas/badorm" + +type Owner struct { + badorm.UUIDModel +} +type Owned struct { + badorm.UUIDModel + + // Owned belongsTo Owner (Owned 0..* -> 1 Owner) + Owner Owner + OwnerID badorm.UUID +} diff --git a/tools/badctl/cmd/gen/conditions/tests/columndefinition/columndefinition.go b/tools/badctl/cmd/gen/conditions/tests/columndefinition/columndefinition.go new file mode 100644 index 00000000..8426b467 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/columndefinition/columndefinition.go @@ -0,0 +1,9 @@ +package columndefinition + +import "github.com/ditrit/badaas/badorm" + +type ColumnDefinition struct { + badorm.UUIDModel + + String string `gorm:"column:string_something_else"` +} diff --git a/tools/badctl/cmd/gen/conditions/tests/customtype/customtype.go b/tools/badctl/cmd/gen/conditions/tests/customtype/customtype.go new file mode 100644 index 00000000..c67e75d9 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/customtype/customtype.go @@ -0,0 +1,42 @@ +package customtype + +import ( + "database/sql/driver" + "fmt" + "strings" + + "github.com/ditrit/badaas/badorm" +) + +type MultiString []string + +func (s *MultiString) Scan(src interface{}) error { + switch typedSrc := src.(type) { + case string: + *s = strings.Split(typedSrc, ",") + return nil + case []byte: + str := string(typedSrc) + *s = strings.Split(str, ",") + return nil + default: + return fmt.Errorf("failed to scan multistring field - source is not a string, is %T", src) + } +} + +func (s MultiString) Value() (driver.Value, error) { + if len(s) == 0 { + return nil, nil + } + return strings.Join(s, ","), nil +} + +func (MultiString) GormDataType() string { + return "text" +} + +type CustomType struct { + badorm.UUIDModel + + Custom MultiString +} diff --git a/tools/badctl/cmd/gen/conditions/tests/goembedded/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/goembedded/goembedded.go new file mode 100644 index 00000000..2e2a3d2a --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/goembedded/goembedded.go @@ -0,0 +1,13 @@ +package goembedded + +import "github.com/ditrit/badaas/badorm" + +type ToBeEmbedded struct { + EmbeddedInt int +} + +type GoEmbedded struct { + badorm.UIntModel + + ToBeEmbedded +} diff --git a/tools/badctl/cmd/gen/conditions/tests/gormembedded/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/gormembedded/gormembedded.go new file mode 100644 index 00000000..8e810242 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/gormembedded/gormembedded.go @@ -0,0 +1,13 @@ +package gormembedded + +import "github.com/ditrit/badaas/badorm" + +type ToBeGormEmbedded struct { + Int int +} + +type GormEmbedded struct { + badorm.UIntModel + + GormEmbedded ToBeGormEmbedded `gorm:"embedded;embeddedPrefix:gorm_embedded_"` +} diff --git a/tools/badctl/cmd/gen/conditions/tests/hasmany/hasmany.go b/tools/badctl/cmd/gen/conditions/tests/hasmany/hasmany.go new file mode 100644 index 00000000..55e30679 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/hasmany/hasmany.go @@ -0,0 +1,15 @@ +package hasone + +import "github.com/ditrit/badaas/badorm" + +type Company struct { + badorm.UUIDModel + + Sellers []Seller // Company HasMany Sellers (Company 0..1 -> 0..* Seller) +} + +type Seller struct { + badorm.UUIDModel + + CompanyID *badorm.UUID // Company HasMany Sellers (Company 0..1 -> 0..* Seller) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/hasone/hasone.go b/tools/badctl/cmd/gen/conditions/tests/hasone/hasone.go new file mode 100644 index 00000000..de6fbf32 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/hasone/hasone.go @@ -0,0 +1,15 @@ +package hasone + +import "github.com/ditrit/badaas/badorm" + +type Country struct { + badorm.UUIDModel + + Capital City // Country HasOne City (Country 1 -> 1 City) +} + +type City struct { + badorm.UUIDModel + + CountryID badorm.UUID // Country HasOne City (Country 1 -> 1 City) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package1/package1.go b/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package1/package1.go new file mode 100644 index 00000000..3758027c --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package1/package1.go @@ -0,0 +1,12 @@ +package package1 + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package2" +) + +type Package1 struct { + badorm.UUIDModel + + Package2 package2.Package2 // Package1 HasOne Package2 (Package1 1 -> 1 Package2) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package2/package2.go b/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package2/package2.go new file mode 100644 index 00000000..c9fc430b --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package2/package2.go @@ -0,0 +1,9 @@ +package package2 + +import "github.com/ditrit/badaas/badorm" + +type Package2 struct { + badorm.UUIDModel + + Package1ID badorm.UUID // Package1 HasOne Package2 (Package1 1 -> 1 Package2) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/overrideforeignkey/overrideforeignkey.go b/tools/badctl/cmd/gen/conditions/tests/overrideforeignkey/overrideforeignkey.go new file mode 100644 index 00000000..7dcd3489 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/overrideforeignkey/overrideforeignkey.go @@ -0,0 +1,15 @@ +package overrideforeignkey + +import "github.com/ditrit/badaas/badorm" + +type Person struct { + badorm.UUIDModel +} + +type Bicycle struct { + badorm.UUIDModel + + // Bicycle BelongsTo Person (Bicycle 0..* -> 1 Person) + Owner Person `gorm:"foreignKey:OwnerSomethingID"` + OwnerSomethingID string +} diff --git a/tools/badctl/cmd/gen/conditions/tests/overridereferences/overridereferences.go b/tools/badctl/cmd/gen/conditions/tests/overridereferences/overridereferences.go new file mode 100644 index 00000000..81544034 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/overridereferences/overridereferences.go @@ -0,0 +1,17 @@ +package overridereferences + +import "github.com/ditrit/badaas/badorm" + +type Brand struct { + badorm.UUIDModel + + Name string `gorm:"unique;type:VARCHAR(255)"` +} + +type Phone struct { + badorm.UUIDModel + + // Bicycle BelongsTo Person (Bicycle 0..* -> 1 Person) + Brand Brand `gorm:"references:Name;foreignKey:BrandName"` + BrandName string +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go new file mode 100644 index 00000000..9994079a --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go @@ -0,0 +1,142 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + basicpointers "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/basicpointers" + gorm "gorm.io/gorm" + "time" +) + +func BasicPointersId(v badorm.UUID) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "id", + Value: v, + } +} +func BasicPointersCreatedAt(v time.Time) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "created_at", + Value: v, + } +} +func BasicPointersUpdatedAt(v time.Time) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "updated_at", + Value: v, + } +} +func BasicPointersDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "deleted_at", + Value: v, + } +} +func BasicPointersBool(v *bool) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "bool", + Value: v, + } +} +func BasicPointersInt(v *int) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "int", + Value: v, + } +} +func BasicPointersInt8(v *int8) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "int8", + Value: v, + } +} +func BasicPointersInt16(v *int16) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "int16", + Value: v, + } +} +func BasicPointersInt32(v *int32) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "int32", + Value: v, + } +} +func BasicPointersInt64(v *int64) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "int64", + Value: v, + } +} +func BasicPointersUInt(v *uint) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "u_int", + Value: v, + } +} +func BasicPointersUInt8(v *uint8) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "u_int8", + Value: v, + } +} +func BasicPointersUInt16(v *uint16) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "u_int16", + Value: v, + } +} +func BasicPointersUInt32(v *uint32) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "u_int32", + Value: v, + } +} +func BasicPointersUInt64(v *uint64) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "u_int64", + Value: v, + } +} +func BasicPointersUIntptr(v *uintptr) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "u_intptr", + Value: v, + } +} +func BasicPointersFloat32(v *float32) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "float32", + Value: v, + } +} +func BasicPointersFloat64(v *float64) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "float64", + Value: v, + } +} +func BasicPointersComplex64(v *complex64) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "complex64", + Value: v, + } +} +func BasicPointersComplex128(v *complex128) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "complex128", + Value: v, + } +} +func BasicPointersString(v *string) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "string", + Value: v, + } +} +func BasicPointersByte(v *uint8) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.WhereCondition[basicpointers.BasicPointers]{ + Field: "byte", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go new file mode 100644 index 00000000..6fb64ae4 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go @@ -0,0 +1,142 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + basicslices "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/basicslices" + gorm "gorm.io/gorm" + "time" +) + +func BasicSlicesId(v badorm.UUID) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "id", + Value: v, + } +} +func BasicSlicesCreatedAt(v time.Time) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "created_at", + Value: v, + } +} +func BasicSlicesUpdatedAt(v time.Time) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "updated_at", + Value: v, + } +} +func BasicSlicesDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "deleted_at", + Value: v, + } +} +func BasicSlicesBool(v []bool) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "bool", + Value: v, + } +} +func BasicSlicesInt(v []int) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "int", + Value: v, + } +} +func BasicSlicesInt8(v []int8) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "int8", + Value: v, + } +} +func BasicSlicesInt16(v []int16) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "int16", + Value: v, + } +} +func BasicSlicesInt32(v []int32) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "int32", + Value: v, + } +} +func BasicSlicesInt64(v []int64) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "int64", + Value: v, + } +} +func BasicSlicesUInt(v []uint) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "u_int", + Value: v, + } +} +func BasicSlicesUInt8(v []uint8) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "u_int8", + Value: v, + } +} +func BasicSlicesUInt16(v []uint16) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "u_int16", + Value: v, + } +} +func BasicSlicesUInt32(v []uint32) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "u_int32", + Value: v, + } +} +func BasicSlicesUInt64(v []uint64) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "u_int64", + Value: v, + } +} +func BasicSlicesUIntptr(v []uintptr) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "u_intptr", + Value: v, + } +} +func BasicSlicesFloat32(v []float32) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "float32", + Value: v, + } +} +func BasicSlicesFloat64(v []float64) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "float64", + Value: v, + } +} +func BasicSlicesComplex64(v []complex64) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "complex64", + Value: v, + } +} +func BasicSlicesComplex128(v []complex128) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "complex128", + Value: v, + } +} +func BasicSlicesString(v []string) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "string", + Value: v, + } +} +func BasicSlicesByte(v []uint8) badorm.WhereCondition[basicslices.BasicSlices] { + return badorm.WhereCondition[basicslices.BasicSlices]{ + Field: "byte", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go new file mode 100644 index 00000000..e751f8b8 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go @@ -0,0 +1,142 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + basicslicespointer "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/basicslicespointer" + gorm "gorm.io/gorm" + "time" +) + +func BasicSlicesPointerId(v badorm.UUID) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "id", + Value: v, + } +} +func BasicSlicesPointerCreatedAt(v time.Time) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "created_at", + Value: v, + } +} +func BasicSlicesPointerUpdatedAt(v time.Time) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "updated_at", + Value: v, + } +} +func BasicSlicesPointerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "deleted_at", + Value: v, + } +} +func BasicSlicesPointerBool(v []*bool) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "bool", + Value: v, + } +} +func BasicSlicesPointerInt(v []*int) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "int", + Value: v, + } +} +func BasicSlicesPointerInt8(v []*int8) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "int8", + Value: v, + } +} +func BasicSlicesPointerInt16(v []*int16) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "int16", + Value: v, + } +} +func BasicSlicesPointerInt32(v []*int32) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "int32", + Value: v, + } +} +func BasicSlicesPointerInt64(v []*int64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "int64", + Value: v, + } +} +func BasicSlicesPointerUInt(v []*uint) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "u_int", + Value: v, + } +} +func BasicSlicesPointerUInt8(v []*uint8) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "u_int8", + Value: v, + } +} +func BasicSlicesPointerUInt16(v []*uint16) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "u_int16", + Value: v, + } +} +func BasicSlicesPointerUInt32(v []*uint32) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "u_int32", + Value: v, + } +} +func BasicSlicesPointerUInt64(v []*uint64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "u_int64", + Value: v, + } +} +func BasicSlicesPointerUIntptr(v []*uintptr) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "u_intptr", + Value: v, + } +} +func BasicSlicesPointerFloat32(v []*float32) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "float32", + Value: v, + } +} +func BasicSlicesPointerFloat64(v []*float64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "float64", + Value: v, + } +} +func BasicSlicesPointerComplex64(v []*complex64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "complex64", + Value: v, + } +} +func BasicSlicesPointerComplex128(v []*complex128) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "complex128", + Value: v, + } +} +func BasicSlicesPointerString(v []*string) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "string", + Value: v, + } +} +func BasicSlicesPointerByte(v []*uint8) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ + Field: "byte", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go new file mode 100644 index 00000000..66b93119 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go @@ -0,0 +1,142 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + basictypes "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/basictypes" + gorm "gorm.io/gorm" + "time" +) + +func BasicTypesId(v badorm.UUID) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "id", + Value: v, + } +} +func BasicTypesCreatedAt(v time.Time) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "created_at", + Value: v, + } +} +func BasicTypesUpdatedAt(v time.Time) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "updated_at", + Value: v, + } +} +func BasicTypesDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "deleted_at", + Value: v, + } +} +func BasicTypesBool(v bool) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "bool", + Value: v, + } +} +func BasicTypesInt(v int) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "int", + Value: v, + } +} +func BasicTypesInt8(v int8) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "int8", + Value: v, + } +} +func BasicTypesInt16(v int16) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "int16", + Value: v, + } +} +func BasicTypesInt32(v int32) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "int32", + Value: v, + } +} +func BasicTypesInt64(v int64) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "int64", + Value: v, + } +} +func BasicTypesUInt(v uint) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "u_int", + Value: v, + } +} +func BasicTypesUInt8(v uint8) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "u_int8", + Value: v, + } +} +func BasicTypesUInt16(v uint16) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "u_int16", + Value: v, + } +} +func BasicTypesUInt32(v uint32) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "u_int32", + Value: v, + } +} +func BasicTypesUInt64(v uint64) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "u_int64", + Value: v, + } +} +func BasicTypesUIntptr(v uintptr) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "u_intptr", + Value: v, + } +} +func BasicTypesFloat32(v float32) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "float32", + Value: v, + } +} +func BasicTypesFloat64(v float64) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "float64", + Value: v, + } +} +func BasicTypesComplex64(v complex64) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "complex64", + Value: v, + } +} +func BasicTypesComplex128(v complex128) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "complex128", + Value: v, + } +} +func BasicTypesString(v string) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "string", + Value: v, + } +} +func BasicTypesByte(v uint8) badorm.WhereCondition[basictypes.BasicTypes] { + return badorm.WhereCondition[basictypes.BasicTypes]{ + Field: "byte", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go new file mode 100644 index 00000000..d8f69269 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go @@ -0,0 +1,47 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + belongsto "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/belongsto" + gorm "gorm.io/gorm" + "time" +) + +func OwnedId(v badorm.UUID) badorm.WhereCondition[belongsto.Owned] { + return badorm.WhereCondition[belongsto.Owned]{ + Field: "id", + Value: v, + } +} +func OwnedCreatedAt(v time.Time) badorm.WhereCondition[belongsto.Owned] { + return badorm.WhereCondition[belongsto.Owned]{ + Field: "created_at", + Value: v, + } +} +func OwnedUpdatedAt(v time.Time) badorm.WhereCondition[belongsto.Owned] { + return badorm.WhereCondition[belongsto.Owned]{ + Field: "updated_at", + Value: v, + } +} +func OwnedDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[belongsto.Owned] { + return badorm.WhereCondition[belongsto.Owned]{ + Field: "deleted_at", + Value: v, + } +} +func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Condition[belongsto.Owned] { + return badorm.JoinCondition[belongsto.Owned, belongsto.Owner]{ + Conditions: conditions, + T1Field: "owner_id", + T2Field: "id", + } +} +func OwnedOwnerId(v badorm.UUID) badorm.WhereCondition[belongsto.Owned] { + return badorm.WhereCondition[belongsto.Owned]{ + Field: "owner_id", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go new file mode 100644 index 00000000..774446da --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go @@ -0,0 +1,34 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + belongsto "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/belongsto" + gorm "gorm.io/gorm" + "time" +) + +func OwnerId(v badorm.UUID) badorm.WhereCondition[belongsto.Owner] { + return badorm.WhereCondition[belongsto.Owner]{ + Field: "id", + Value: v, + } +} +func OwnerCreatedAt(v time.Time) badorm.WhereCondition[belongsto.Owner] { + return badorm.WhereCondition[belongsto.Owner]{ + Field: "created_at", + Value: v, + } +} +func OwnerUpdatedAt(v time.Time) badorm.WhereCondition[belongsto.Owner] { + return badorm.WhereCondition[belongsto.Owner]{ + Field: "updated_at", + Value: v, + } +} +func OwnerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[belongsto.Owner] { + return badorm.WhereCondition[belongsto.Owner]{ + Field: "deleted_at", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go new file mode 100644 index 00000000..d56da2b6 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go @@ -0,0 +1,40 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + columndefinition "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/columndefinition" + gorm "gorm.io/gorm" + "time" +) + +func ColumnDefinitionId(v badorm.UUID) badorm.WhereCondition[columndefinition.ColumnDefinition] { + return badorm.WhereCondition[columndefinition.ColumnDefinition]{ + Field: "id", + Value: v, + } +} +func ColumnDefinitionCreatedAt(v time.Time) badorm.WhereCondition[columndefinition.ColumnDefinition] { + return badorm.WhereCondition[columndefinition.ColumnDefinition]{ + Field: "created_at", + Value: v, + } +} +func ColumnDefinitionUpdatedAt(v time.Time) badorm.WhereCondition[columndefinition.ColumnDefinition] { + return badorm.WhereCondition[columndefinition.ColumnDefinition]{ + Field: "updated_at", + Value: v, + } +} +func ColumnDefinitionDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[columndefinition.ColumnDefinition] { + return badorm.WhereCondition[columndefinition.ColumnDefinition]{ + Field: "deleted_at", + Value: v, + } +} +func ColumnDefinitionString(v string) badorm.WhereCondition[columndefinition.ColumnDefinition] { + return badorm.WhereCondition[columndefinition.ColumnDefinition]{ + Field: "string_something_else", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go new file mode 100644 index 00000000..6758f100 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go @@ -0,0 +1,40 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + customtype "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/customtype" + gorm "gorm.io/gorm" + "time" +) + +func CustomTypeId(v badorm.UUID) badorm.WhereCondition[customtype.CustomType] { + return badorm.WhereCondition[customtype.CustomType]{ + Field: "id", + Value: v, + } +} +func CustomTypeCreatedAt(v time.Time) badorm.WhereCondition[customtype.CustomType] { + return badorm.WhereCondition[customtype.CustomType]{ + Field: "created_at", + Value: v, + } +} +func CustomTypeUpdatedAt(v time.Time) badorm.WhereCondition[customtype.CustomType] { + return badorm.WhereCondition[customtype.CustomType]{ + Field: "updated_at", + Value: v, + } +} +func CustomTypeDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[customtype.CustomType] { + return badorm.WhereCondition[customtype.CustomType]{ + Field: "deleted_at", + Value: v, + } +} +func CustomTypeCustom(v customtype.MultiString) badorm.WhereCondition[customtype.CustomType] { + return badorm.WhereCondition[customtype.CustomType]{ + Field: "custom", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go new file mode 100644 index 00000000..b482d836 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go @@ -0,0 +1,40 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + goembedded "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/goembedded" + gorm "gorm.io/gorm" + "time" +) + +func GoEmbeddedId(v uint) badorm.WhereCondition[goembedded.GoEmbedded] { + return badorm.WhereCondition[goembedded.GoEmbedded]{ + Field: "id", + Value: v, + } +} +func GoEmbeddedCreatedAt(v time.Time) badorm.WhereCondition[goembedded.GoEmbedded] { + return badorm.WhereCondition[goembedded.GoEmbedded]{ + Field: "created_at", + Value: v, + } +} +func GoEmbeddedUpdatedAt(v time.Time) badorm.WhereCondition[goembedded.GoEmbedded] { + return badorm.WhereCondition[goembedded.GoEmbedded]{ + Field: "updated_at", + Value: v, + } +} +func GoEmbeddedDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[goembedded.GoEmbedded] { + return badorm.WhereCondition[goembedded.GoEmbedded]{ + Field: "deleted_at", + Value: v, + } +} +func GoEmbeddedEmbeddedInt(v int) badorm.WhereCondition[goembedded.GoEmbedded] { + return badorm.WhereCondition[goembedded.GoEmbedded]{ + Field: "embedded_int", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go new file mode 100644 index 00000000..b5ecd758 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go @@ -0,0 +1,40 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + gormembedded "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/gormembedded" + gorm "gorm.io/gorm" + "time" +) + +func GormEmbeddedId(v uint) badorm.WhereCondition[gormembedded.GormEmbedded] { + return badorm.WhereCondition[gormembedded.GormEmbedded]{ + Field: "id", + Value: v, + } +} +func GormEmbeddedCreatedAt(v time.Time) badorm.WhereCondition[gormembedded.GormEmbedded] { + return badorm.WhereCondition[gormembedded.GormEmbedded]{ + Field: "created_at", + Value: v, + } +} +func GormEmbeddedUpdatedAt(v time.Time) badorm.WhereCondition[gormembedded.GormEmbedded] { + return badorm.WhereCondition[gormembedded.GormEmbedded]{ + Field: "updated_at", + Value: v, + } +} +func GormEmbeddedDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[gormembedded.GormEmbedded] { + return badorm.WhereCondition[gormembedded.GormEmbedded]{ + Field: "deleted_at", + Value: v, + } +} +func GormEmbeddedGormEmbeddedInt(v int) badorm.WhereCondition[gormembedded.GormEmbedded] { + return badorm.WhereCondition[gormembedded.GormEmbedded]{ + Field: "gorm_embedded_int", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go new file mode 100644 index 00000000..ef99474c --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go @@ -0,0 +1,41 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + hasmany "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasmany" + gorm "gorm.io/gorm" + "time" +) + +func CompanyId(v badorm.UUID) badorm.WhereCondition[hasmany.Company] { + return badorm.WhereCondition[hasmany.Company]{ + Field: "id", + Value: v, + } +} +func CompanyCreatedAt(v time.Time) badorm.WhereCondition[hasmany.Company] { + return badorm.WhereCondition[hasmany.Company]{ + Field: "created_at", + Value: v, + } +} +func CompanyUpdatedAt(v time.Time) badorm.WhereCondition[hasmany.Company] { + return badorm.WhereCondition[hasmany.Company]{ + Field: "updated_at", + Value: v, + } +} +func CompanyDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasmany.Company] { + return badorm.WhereCondition[hasmany.Company]{ + Field: "deleted_at", + Value: v, + } +} +func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.Condition[hasmany.Seller] { + return badorm.JoinCondition[hasmany.Seller, hasmany.Company]{ + Conditions: conditions, + T1Field: "company_id", + T2Field: "id", + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go new file mode 100644 index 00000000..a38fe97d --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go @@ -0,0 +1,40 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + hasmany "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasmany" + gorm "gorm.io/gorm" + "time" +) + +func SellerId(v badorm.UUID) badorm.WhereCondition[hasmany.Seller] { + return badorm.WhereCondition[hasmany.Seller]{ + Field: "id", + Value: v, + } +} +func SellerCreatedAt(v time.Time) badorm.WhereCondition[hasmany.Seller] { + return badorm.WhereCondition[hasmany.Seller]{ + Field: "created_at", + Value: v, + } +} +func SellerUpdatedAt(v time.Time) badorm.WhereCondition[hasmany.Seller] { + return badorm.WhereCondition[hasmany.Seller]{ + Field: "updated_at", + Value: v, + } +} +func SellerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasmany.Seller] { + return badorm.WhereCondition[hasmany.Seller]{ + Field: "deleted_at", + Value: v, + } +} +func SellerCompanyId(v *badorm.UUID) badorm.WhereCondition[hasmany.Seller] { + return badorm.WhereCondition[hasmany.Seller]{ + Field: "company_id", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go new file mode 100644 index 00000000..66c140c2 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go @@ -0,0 +1,40 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + hasone "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasone" + gorm "gorm.io/gorm" + "time" +) + +func CityId(v badorm.UUID) badorm.WhereCondition[hasone.City] { + return badorm.WhereCondition[hasone.City]{ + Field: "id", + Value: v, + } +} +func CityCreatedAt(v time.Time) badorm.WhereCondition[hasone.City] { + return badorm.WhereCondition[hasone.City]{ + Field: "created_at", + Value: v, + } +} +func CityUpdatedAt(v time.Time) badorm.WhereCondition[hasone.City] { + return badorm.WhereCondition[hasone.City]{ + Field: "updated_at", + Value: v, + } +} +func CityDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasone.City] { + return badorm.WhereCondition[hasone.City]{ + Field: "deleted_at", + Value: v, + } +} +func CityCountryId(v badorm.UUID) badorm.WhereCondition[hasone.City] { + return badorm.WhereCondition[hasone.City]{ + Field: "country_id", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go new file mode 100644 index 00000000..cc5f7b16 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go @@ -0,0 +1,48 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + hasone "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasone" + gorm "gorm.io/gorm" + "time" +) + +func CountryId(v badorm.UUID) badorm.WhereCondition[hasone.Country] { + return badorm.WhereCondition[hasone.Country]{ + Field: "id", + Value: v, + } +} +func CountryCreatedAt(v time.Time) badorm.WhereCondition[hasone.Country] { + return badorm.WhereCondition[hasone.Country]{ + Field: "created_at", + Value: v, + } +} +func CountryUpdatedAt(v time.Time) badorm.WhereCondition[hasone.Country] { + return badorm.WhereCondition[hasone.Country]{ + Field: "updated_at", + Value: v, + } +} +func CountryDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasone.Country] { + return badorm.WhereCondition[hasone.Country]{ + Field: "deleted_at", + Value: v, + } +} +func CountryCapital(conditions ...badorm.Condition[hasone.City]) badorm.Condition[hasone.Country] { + return badorm.JoinCondition[hasone.Country, hasone.City]{ + Conditions: conditions, + T1Field: "id", + T2Field: "country_id", + } +} +func CityCountry(conditions ...badorm.Condition[hasone.Country]) badorm.Condition[hasone.City] { + return badorm.JoinCondition[hasone.City, hasone.Country]{ + Conditions: conditions, + T1Field: "country_id", + T2Field: "id", + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go new file mode 100644 index 00000000..b529d848 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go @@ -0,0 +1,49 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + package1 "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package1" + package2 "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package2" + gorm "gorm.io/gorm" + "time" +) + +func Package1Id(v badorm.UUID) badorm.WhereCondition[package1.Package1] { + return badorm.WhereCondition[package1.Package1]{ + Field: "id", + Value: v, + } +} +func Package1CreatedAt(v time.Time) badorm.WhereCondition[package1.Package1] { + return badorm.WhereCondition[package1.Package1]{ + Field: "created_at", + Value: v, + } +} +func Package1UpdatedAt(v time.Time) badorm.WhereCondition[package1.Package1] { + return badorm.WhereCondition[package1.Package1]{ + Field: "updated_at", + Value: v, + } +} +func Package1DeletedAt(v gorm.DeletedAt) badorm.WhereCondition[package1.Package1] { + return badorm.WhereCondition[package1.Package1]{ + Field: "deleted_at", + Value: v, + } +} +func Package1Package2(conditions ...badorm.Condition[package2.Package2]) badorm.Condition[package1.Package1] { + return badorm.JoinCondition[package1.Package1, package2.Package2]{ + Conditions: conditions, + T1Field: "id", + T2Field: "package1_id", + } +} +func Package2Package1(conditions ...badorm.Condition[package1.Package1]) badorm.Condition[package2.Package2] { + return badorm.JoinCondition[package2.Package2, package1.Package1]{ + Conditions: conditions, + T1Field: "package1_id", + T2Field: "id", + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go new file mode 100644 index 00000000..11a2ea21 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go @@ -0,0 +1,47 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + overrideforeignkey "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overrideforeignkey" + gorm "gorm.io/gorm" + "time" +) + +func BicycleId(v badorm.UUID) badorm.WhereCondition[overrideforeignkey.Bicycle] { + return badorm.WhereCondition[overrideforeignkey.Bicycle]{ + Field: "id", + Value: v, + } +} +func BicycleCreatedAt(v time.Time) badorm.WhereCondition[overrideforeignkey.Bicycle] { + return badorm.WhereCondition[overrideforeignkey.Bicycle]{ + Field: "created_at", + Value: v, + } +} +func BicycleUpdatedAt(v time.Time) badorm.WhereCondition[overrideforeignkey.Bicycle] { + return badorm.WhereCondition[overrideforeignkey.Bicycle]{ + Field: "updated_at", + Value: v, + } +} +func BicycleDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[overrideforeignkey.Bicycle] { + return badorm.WhereCondition[overrideforeignkey.Bicycle]{ + Field: "deleted_at", + Value: v, + } +} +func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) badorm.Condition[overrideforeignkey.Bicycle] { + return badorm.JoinCondition[overrideforeignkey.Bicycle, overrideforeignkey.Person]{ + Conditions: conditions, + T1Field: "owner_something_id", + T2Field: "id", + } +} +func BicycleOwnerSomethingId(v string) badorm.WhereCondition[overrideforeignkey.Bicycle] { + return badorm.WhereCondition[overrideforeignkey.Bicycle]{ + Field: "owner_something_id", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go new file mode 100644 index 00000000..8df94db6 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go @@ -0,0 +1,47 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + overridereferences "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overridereferences" + gorm "gorm.io/gorm" + "time" +) + +func PhoneId(v badorm.UUID) badorm.WhereCondition[overridereferences.Phone] { + return badorm.WhereCondition[overridereferences.Phone]{ + Field: "id", + Value: v, + } +} +func PhoneCreatedAt(v time.Time) badorm.WhereCondition[overridereferences.Phone] { + return badorm.WhereCondition[overridereferences.Phone]{ + Field: "created_at", + Value: v, + } +} +func PhoneUpdatedAt(v time.Time) badorm.WhereCondition[overridereferences.Phone] { + return badorm.WhereCondition[overridereferences.Phone]{ + Field: "updated_at", + Value: v, + } +} +func PhoneDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[overridereferences.Phone] { + return badorm.WhereCondition[overridereferences.Phone]{ + Field: "deleted_at", + Value: v, + } +} +func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm.Condition[overridereferences.Phone] { + return badorm.JoinCondition[overridereferences.Phone, overridereferences.Brand]{ + Conditions: conditions, + T1Field: "brand_name", + T2Field: "name", + } +} +func PhoneBrandName(v string) badorm.WhereCondition[overridereferences.Phone] { + return badorm.WhereCondition[overridereferences.Phone]{ + Field: "brand_name", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go new file mode 100644 index 00000000..ebf732f4 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go @@ -0,0 +1,47 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + selfreferential "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/selfreferential" + gorm "gorm.io/gorm" + "time" +) + +func EmployeeId(v badorm.UUID) badorm.WhereCondition[selfreferential.Employee] { + return badorm.WhereCondition[selfreferential.Employee]{ + Field: "id", + Value: v, + } +} +func EmployeeCreatedAt(v time.Time) badorm.WhereCondition[selfreferential.Employee] { + return badorm.WhereCondition[selfreferential.Employee]{ + Field: "created_at", + Value: v, + } +} +func EmployeeUpdatedAt(v time.Time) badorm.WhereCondition[selfreferential.Employee] { + return badorm.WhereCondition[selfreferential.Employee]{ + Field: "updated_at", + Value: v, + } +} +func EmployeeDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[selfreferential.Employee] { + return badorm.WhereCondition[selfreferential.Employee]{ + Field: "deleted_at", + Value: v, + } +} +func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) badorm.Condition[selfreferential.Employee] { + return badorm.JoinCondition[selfreferential.Employee, selfreferential.Employee]{ + Conditions: conditions, + T1Field: "boss_id", + T2Field: "id", + } +} +func EmployeeBossId(v *badorm.UUID) badorm.WhereCondition[selfreferential.Employee] { + return badorm.WhereCondition[selfreferential.Employee]{ + Field: "boss_id", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go new file mode 100644 index 00000000..d034750b --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go @@ -0,0 +1,34 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + uintmodel "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/uintmodel" + gorm "gorm.io/gorm" + "time" +) + +func UIntModelId(v uint) badorm.WhereCondition[uintmodel.UIntModel] { + return badorm.WhereCondition[uintmodel.UIntModel]{ + Field: "id", + Value: v, + } +} +func UIntModelCreatedAt(v time.Time) badorm.WhereCondition[uintmodel.UIntModel] { + return badorm.WhereCondition[uintmodel.UIntModel]{ + Field: "created_at", + Value: v, + } +} +func UIntModelUpdatedAt(v time.Time) badorm.WhereCondition[uintmodel.UIntModel] { + return badorm.WhereCondition[uintmodel.UIntModel]{ + Field: "updated_at", + Value: v, + } +} +func UIntModelDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[uintmodel.UIntModel] { + return badorm.WhereCondition[uintmodel.UIntModel]{ + Field: "deleted_at", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go new file mode 100644 index 00000000..c9e7579f --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go @@ -0,0 +1,34 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + uuidmodel "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/uuidmodel" + gorm "gorm.io/gorm" + "time" +) + +func UUIDModelId(v badorm.UUID) badorm.WhereCondition[uuidmodel.UUIDModel] { + return badorm.WhereCondition[uuidmodel.UUIDModel]{ + Field: "id", + Value: v, + } +} +func UUIDModelCreatedAt(v time.Time) badorm.WhereCondition[uuidmodel.UUIDModel] { + return badorm.WhereCondition[uuidmodel.UUIDModel]{ + Field: "created_at", + Value: v, + } +} +func UUIDModelUpdatedAt(v time.Time) badorm.WhereCondition[uuidmodel.UUIDModel] { + return badorm.WhereCondition[uuidmodel.UUIDModel]{ + Field: "updated_at", + Value: v, + } +} +func UUIDModelDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[uuidmodel.UUIDModel] { + return badorm.WhereCondition[uuidmodel.UUIDModel]{ + Field: "deleted_at", + Value: v, + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/selfreferential/selfreferential.go b/tools/badctl/cmd/gen/conditions/tests/selfreferential/selfreferential.go new file mode 100644 index 00000000..d7422e77 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/selfreferential/selfreferential.go @@ -0,0 +1,10 @@ +package selfreferential + +import "github.com/ditrit/badaas/badorm" + +type Employee struct { + badorm.UUIDModel + + Boss *Employee `gorm:"constraint:OnDelete:SET NULL;"` // Self-Referential Has One (Employee 0..* -> 0..1 Employee) + BossID *badorm.UUID +} diff --git a/tools/badctl/cmd/gen/conditions/tests/uintmodel/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/uintmodel/uintmodel.go new file mode 100644 index 00000000..df97a07c --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/uintmodel/uintmodel.go @@ -0,0 +1,7 @@ +package uintmodel + +import "github.com/ditrit/badaas/badorm" + +type UIntModel struct { + badorm.UIntModel +} diff --git a/tools/badctl/cmd/gen/conditions/tests/uuidmodel/uuidmodel.go b/tools/badctl/cmd/gen/conditions/tests/uuidmodel/uuidmodel.go new file mode 100644 index 00000000..d82ed6c4 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/uuidmodel/uuidmodel.go @@ -0,0 +1,7 @@ +package uuidmodel + +import "github.com/ditrit/badaas/badorm" + +type UUIDModel struct { + badorm.UUIDModel +} diff --git a/tools/badctl/go.mod b/tools/badctl/go.mod index 9c9628bb..191995ed 100644 --- a/tools/badctl/go.mod +++ b/tools/badctl/go.mod @@ -17,11 +17,14 @@ require ( github.com/spf13/viper v1.16.0 golang.org/x/tools v0.6.0 gopkg.in/yaml.v3 v3.0.1 + gorm.io/gorm v1.25.1 + gotest.tools v2.2.0+incompatible ) require ( github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/google/go-cmp v0.5.9 // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -33,6 +36,7 @@ require ( github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect @@ -51,5 +55,4 @@ require ( gopkg.in/ini.v1 v1.67.0 // indirect gorm.io/driver/mysql v1.5.1 // indirect gorm.io/driver/postgres v1.5.2 // indirect - gorm.io/gorm v1.25.1 // indirect ) diff --git a/tools/badctl/go.sum b/tools/badctl/go.sum index 010e1709..5e3ac43f 100644 --- a/tools/badctl/go.sum +++ b/tools/badctl/go.sum @@ -53,8 +53,6 @@ github.com/dave/jennifer v1.6.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/ditrit/badaas v0.0.0-20230605151246-3f2daae1a19f h1:mRyf40I29+vL/foE1km3XcFUzLbI7gszDQHqmj4uybs= -github.com/ditrit/badaas v0.0.0-20230605151246-3f2daae1a19f/go.mod h1:Qaxactfr4iYYzfBmyW4DkG/5pkfkk/dVZ0Y8H1cYeTM= github.com/ditrit/verdeter v0.4.0 h1:DzEOFauuXEGNQYP6OgYtHwEyb3w9riem99u0xE/l7+o= github.com/ditrit/verdeter v0.4.0/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= github.com/elliotchance/pie/v2 v2.5.2 h1:jRENMmysCljhUmyT8ITKV0Atp6Lukm3XpeqaI87POsM= @@ -114,6 +112,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -535,6 +534,8 @@ gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From b2d8ed78fa1096df1f6e46fe688263bba9ce5656 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 7 Jun 2023 16:16:09 +0200 Subject: [PATCH 303/467] support naming strategy --- badorm/condition.go | 32 ++++++----- .../conditions/bicycle_conditions.go | 16 +++--- .../conditions/brand_conditions.go | 10 ++-- testintegration/conditions/city_conditions.go | 12 ++--- .../conditions/company_conditions.go | 14 ++--- .../conditions/country_conditions.go | 18 +++---- .../conditions/employee_conditions.go | 16 +++--- .../conditions/person_conditions.go | 10 ++-- .../conditions/phone_conditions.go | 16 +++--- .../conditions/product_conditions.go | 31 +++++------ testintegration/conditions/sale_conditions.go | 24 ++++----- .../conditions/seller_conditions.go | 12 ++--- tools/badctl/cmd/gen/conditions/condition.go | 34 +++++++----- tools/badctl/cmd/gen/conditions/field.go | 26 ++++----- tools/badctl/cmd/gen/conditions/main_test.go | 15 ++++++ .../overrideforeignkeyinverse.go | 15 ++++++ .../overridereferencesinverse.go | 14 +++++ .../conditions/tests/results/basicpointers.go | 44 +++++++-------- .../conditions/tests/results/basicslices.go | 44 +++++++-------- .../tests/results/basicslicespointer.go | 44 +++++++-------- .../conditions/tests/results/basictypes.go | 44 +++++++-------- .../tests/results/belongsto_owned.go | 14 ++--- .../tests/results/belongsto_owner.go | 8 +-- .../tests/results/columndefinition.go | 12 ++--- .../conditions/tests/results/customtype.go | 10 ++-- .../conditions/tests/results/goembedded.go | 10 ++-- .../conditions/tests/results/gormembedded.go | 13 ++--- .../tests/results/hasmany_company.go | 12 ++--- .../tests/results/hasmany_seller.go | 10 ++-- .../conditions/tests/results/hasone_city.go | 10 ++-- .../tests/results/hasone_country.go | 16 +++--- .../tests/results/multiplepackage_package1.go | 16 +++--- .../tests/results/overrideforeignkey.go | 14 ++--- .../results/overrideforeignkeyinverse.go | 48 +++++++++++++++++ .../tests/results/overridereferences.go | 14 ++--- .../results/overridereferencesinverse.go | 54 +++++++++++++++++++ .../tests/results/selfreferential.go | 14 ++--- .../gen/conditions/tests/results/uintmodel.go | 8 +-- .../gen/conditions/tests/results/uuidmodel.go | 8 +-- tools/badctl/cmd/gen/conditions/type.go | 10 ++-- 40 files changed, 475 insertions(+), 317 deletions(-) create mode 100644 tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse/overrideforeignkeyinverse.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse/overridereferencesinverse.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go diff --git a/badorm/condition.go b/badorm/condition.go index 106dfdfa..155eda1b 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -8,7 +8,7 @@ import ( "gorm.io/gorm" ) -const DeletedAtField = "deleted_at" +const DeletedAtField = "DeletedAt" type Condition[T any] interface { // Applies the condition to the "query" @@ -24,8 +24,10 @@ type Condition[T any] interface { } type WhereCondition[T any] struct { - Field string - Value any + Field string + Column string + ColumnPrefix string + Value any } func (condition WhereCondition[T]) interfaceVerificationMethod(t T) { @@ -36,7 +38,7 @@ func (condition WhereCondition[T]) interfaceVerificationMethod(t T) { // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value func (condition WhereCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { - sql, values := condition.GetSQL(tableName) + sql, values := condition.GetSQL(query, tableName) if condition.Field == DeletedAtField { query = query.Unscoped() @@ -55,7 +57,13 @@ var nullableKinds = []reflect.Kind{ reflect.Slice, } -func (condition WhereCondition[T]) GetSQL(tableName string) (string, []any) { +func (condition WhereCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any) { + columnName := condition.Column + if columnName == "" { + columnName = query.NamingStrategy.ColumnName(tableName, condition.Field) + } + columnName = condition.ColumnPrefix + columnName + val := condition.Value reflectVal := reflect.ValueOf(val) isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) @@ -64,14 +72,14 @@ func (condition WhereCondition[T]) GetSQL(tableName string) (string, []any) { return fmt.Sprintf( "%s.%s IS NULL", tableName, - condition.Field, + columnName, ), []any{} } return fmt.Sprintf( "%s.%s = ?", tableName, - condition.Field, + columnName, ), []any{val} } @@ -101,7 +109,7 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName nextTableName := toBeJoinedTableName + "_" + previousTableName // get the sql to do the join with T2 - joinQuery := condition.getSQLJoin(toBeJoinedTableName, nextTableName, previousTableName) + joinQuery := condition.getSQLJoin(query, toBeJoinedTableName, nextTableName, previousTableName) whereConditions, joinConditions := divideConditionsByType(condition.Conditions) @@ -112,7 +120,7 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName if condition.Field == DeletedAtField { isDeletedAtConditionPresent = true } - sql, values := condition.GetSQL(nextTableName) + sql, values := condition.GetSQL(query, nextTableName) joinQuery += " AND " + sql conditionsValues = append(conditionsValues, values...) } @@ -141,15 +149,15 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // Returns the SQL string to do a join between T1 and T2 // taking into account that the ID attribute necessary to do it // can be either in T1's or T2's table. -func (condition JoinCondition[T1, T2]) getSQLJoin(toBeJoinedTableName, nextTableName, previousTableName string) string { +func (condition JoinCondition[T1, T2]) getSQLJoin(query *gorm.DB, toBeJoinedTableName, nextTableName, previousTableName string) string { return fmt.Sprintf( `JOIN %[1]s %[2]s ON %[2]s.%[3]s = %[4]s.%[5]s `, toBeJoinedTableName, nextTableName, - condition.T2Field, + query.NamingStrategy.ColumnName(nextTableName, condition.T2Field), previousTableName, - condition.T1Field, + query.NamingStrategy.ColumnName(previousTableName, condition.T1Field), ) } diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index d31a5775..b3d38a01 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -10,44 +10,44 @@ import ( func BicycleId(v badorm.UUID) badorm.WhereCondition[models.Bicycle] { return badorm.WhereCondition[models.Bicycle]{ - Field: "id", + Field: "ID", Value: v, } } func BicycleCreatedAt(v time.Time) badorm.WhereCondition[models.Bicycle] { return badorm.WhereCondition[models.Bicycle]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func BicycleUpdatedAt(v time.Time) badorm.WhereCondition[models.Bicycle] { return badorm.WhereCondition[models.Bicycle]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func BicycleDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Bicycle] { return badorm.WhereCondition[models.Bicycle]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func BicycleName(v string) badorm.WhereCondition[models.Bicycle] { return badorm.WhereCondition[models.Bicycle]{ - Field: "name", + Field: "Name", Value: v, } } func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Condition[models.Bicycle] { return badorm.JoinCondition[models.Bicycle, models.Person]{ Conditions: conditions, - T1Field: "owner_name", - T2Field: "name", + T1Field: "OwnerName", + T2Field: "Name", } } func BicycleOwnerName(v string) badorm.WhereCondition[models.Bicycle] { return badorm.WhereCondition[models.Bicycle]{ - Field: "owner_name", + Field: "OwnerName", Value: v, } } diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index 2a26f8a7..569eb3cb 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -10,31 +10,31 @@ import ( func BrandId(v uint) badorm.WhereCondition[models.Brand] { return badorm.WhereCondition[models.Brand]{ - Field: "id", + Field: "ID", Value: v, } } func BrandCreatedAt(v time.Time) badorm.WhereCondition[models.Brand] { return badorm.WhereCondition[models.Brand]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func BrandUpdatedAt(v time.Time) badorm.WhereCondition[models.Brand] { return badorm.WhereCondition[models.Brand]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func BrandDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Brand] { return badorm.WhereCondition[models.Brand]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func BrandName(v string) badorm.WhereCondition[models.Brand] { return badorm.WhereCondition[models.Brand]{ - Field: "name", + Field: "Name", Value: v, } } diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index 8f159442..185750b2 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -10,37 +10,37 @@ import ( func CityId(v badorm.UUID) badorm.WhereCondition[models.City] { return badorm.WhereCondition[models.City]{ - Field: "id", + Field: "ID", Value: v, } } func CityCreatedAt(v time.Time) badorm.WhereCondition[models.City] { return badorm.WhereCondition[models.City]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func CityUpdatedAt(v time.Time) badorm.WhereCondition[models.City] { return badorm.WhereCondition[models.City]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func CityDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.City] { return badorm.WhereCondition[models.City]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func CityName(v string) badorm.WhereCondition[models.City] { return badorm.WhereCondition[models.City]{ - Field: "name", + Field: "Name", Value: v, } } func CityCountryId(v badorm.UUID) badorm.WhereCondition[models.City] { return badorm.WhereCondition[models.City]{ - Field: "country_id", + Field: "CountryID", Value: v, } } diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index ebbfe1d7..fc0da8d4 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -10,38 +10,38 @@ import ( func CompanyId(v badorm.UUID) badorm.WhereCondition[models.Company] { return badorm.WhereCondition[models.Company]{ - Field: "id", + Field: "ID", Value: v, } } func CompanyCreatedAt(v time.Time) badorm.WhereCondition[models.Company] { return badorm.WhereCondition[models.Company]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func CompanyUpdatedAt(v time.Time) badorm.WhereCondition[models.Company] { return badorm.WhereCondition[models.Company]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func CompanyDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Company] { return badorm.WhereCondition[models.Company]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func CompanyName(v string) badorm.WhereCondition[models.Company] { return badorm.WhereCondition[models.Company]{ - Field: "name", + Field: "Name", Value: v, } } func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { return badorm.JoinCondition[models.Seller, models.Company]{ Conditions: conditions, - T1Field: "company_id", - T2Field: "id", + T1Field: "CompanyID", + T2Field: "ID", } } diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index 02657f66..61c908c1 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -10,45 +10,45 @@ import ( func CountryId(v badorm.UUID) badorm.WhereCondition[models.Country] { return badorm.WhereCondition[models.Country]{ - Field: "id", + Field: "ID", Value: v, } } func CountryCreatedAt(v time.Time) badorm.WhereCondition[models.Country] { return badorm.WhereCondition[models.Country]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func CountryUpdatedAt(v time.Time) badorm.WhereCondition[models.Country] { return badorm.WhereCondition[models.Country]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func CountryDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Country] { return badorm.WhereCondition[models.Country]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func CountryName(v string) badorm.WhereCondition[models.Country] { return badorm.WhereCondition[models.Country]{ - Field: "name", + Field: "Name", Value: v, } } func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.Condition[models.Country] { return badorm.JoinCondition[models.Country, models.City]{ Conditions: conditions, - T1Field: "id", - T2Field: "country_id", + T1Field: "ID", + T2Field: "CountryID", } } func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.Condition[models.City] { return badorm.JoinCondition[models.City, models.Country]{ Conditions: conditions, - T1Field: "country_id", - T2Field: "id", + T1Field: "CountryID", + T2Field: "ID", } } diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 431c9d7c..6330f1c4 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -10,44 +10,44 @@ import ( func EmployeeId(v badorm.UUID) badorm.WhereCondition[models.Employee] { return badorm.WhereCondition[models.Employee]{ - Field: "id", + Field: "ID", Value: v, } } func EmployeeCreatedAt(v time.Time) badorm.WhereCondition[models.Employee] { return badorm.WhereCondition[models.Employee]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func EmployeeUpdatedAt(v time.Time) badorm.WhereCondition[models.Employee] { return badorm.WhereCondition[models.Employee]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func EmployeeDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Employee] { return badorm.WhereCondition[models.Employee]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func EmployeeName(v string) badorm.WhereCondition[models.Employee] { return badorm.WhereCondition[models.Employee]{ - Field: "name", + Field: "Name", Value: v, } } func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condition[models.Employee] { return badorm.JoinCondition[models.Employee, models.Employee]{ Conditions: conditions, - T1Field: "boss_id", - T2Field: "id", + T1Field: "BossID", + T2Field: "ID", } } func EmployeeBossId(v *badorm.UUID) badorm.WhereCondition[models.Employee] { return badorm.WhereCondition[models.Employee]{ - Field: "boss_id", + Field: "BossID", Value: v, } } diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index 0a1a9676..d9af4d11 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -10,31 +10,31 @@ import ( func PersonId(v badorm.UUID) badorm.WhereCondition[models.Person] { return badorm.WhereCondition[models.Person]{ - Field: "id", + Field: "ID", Value: v, } } func PersonCreatedAt(v time.Time) badorm.WhereCondition[models.Person] { return badorm.WhereCondition[models.Person]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func PersonUpdatedAt(v time.Time) badorm.WhereCondition[models.Person] { return badorm.WhereCondition[models.Person]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func PersonDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Person] { return badorm.WhereCondition[models.Person]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func PersonName(v string) badorm.WhereCondition[models.Person] { return badorm.WhereCondition[models.Person]{ - Field: "name", + Field: "Name", Value: v, } } diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index 55b1b89e..304ec36f 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -10,44 +10,44 @@ import ( func PhoneId(v uint) badorm.WhereCondition[models.Phone] { return badorm.WhereCondition[models.Phone]{ - Field: "id", + Field: "ID", Value: v, } } func PhoneCreatedAt(v time.Time) badorm.WhereCondition[models.Phone] { return badorm.WhereCondition[models.Phone]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func PhoneUpdatedAt(v time.Time) badorm.WhereCondition[models.Phone] { return badorm.WhereCondition[models.Phone]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func PhoneDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Phone] { return badorm.WhereCondition[models.Phone]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func PhoneName(v string) badorm.WhereCondition[models.Phone] { return badorm.WhereCondition[models.Phone]{ - Field: "name", + Field: "Name", Value: v, } } func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[models.Phone] { return badorm.JoinCondition[models.Phone, models.Brand]{ Conditions: conditions, - T1Field: "brand_id", - T2Field: "id", + T1Field: "BrandID", + T2Field: "ID", } } func PhoneBrandId(v uint) badorm.WhereCondition[models.Phone] { return badorm.WhereCondition[models.Phone]{ - Field: "brand_id", + Field: "BrandID", Value: v, } } diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index 1147a724..cff131d2 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -10,79 +10,80 @@ import ( func ProductId(v badorm.UUID) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "id", + Field: "ID", Value: v, } } func ProductCreatedAt(v time.Time) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func ProductUpdatedAt(v time.Time) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func ProductDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func ProductString(v string) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "string_something_else", - Value: v, + Column: "string_something_else", + Value: v, } } func ProductInt(v int) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "int", + Field: "Int", Value: v, } } func ProductIntPointer(v *int) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "int_pointer", + Field: "IntPointer", Value: v, } } func ProductFloat(v float64) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "float", + Field: "Float", Value: v, } } func ProductBool(v bool) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "bool", + Field: "Bool", Value: v, } } func ProductByteArray(v []uint8) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "byte_array", + Field: "ByteArray", Value: v, } } func ProductMultiString(v models.MultiString) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "multi_string", + Field: "MultiString", Value: v, } } func ProductEmbeddedInt(v int) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "embedded_int", + Field: "EmbeddedInt", Value: v, } } func ProductGormEmbeddedInt(v int) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "gorm_embedded_int", - Value: v, + ColumnPrefix: "gorm_embedded_", + Field: "Int", + Value: v, } } diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 817f33e0..f3b58cde 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -10,63 +10,63 @@ import ( func SaleId(v badorm.UUID) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ - Field: "id", + Field: "ID", Value: v, } } func SaleCreatedAt(v time.Time) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func SaleUpdatedAt(v time.Time) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func SaleDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func SaleCode(v int) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ - Field: "code", + Field: "Code", Value: v, } } func SaleDescription(v string) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ - Field: "description", + Field: "Description", Value: v, } } func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Condition[models.Sale] { return badorm.JoinCondition[models.Sale, models.Product]{ Conditions: conditions, - T1Field: "product_id", - T2Field: "id", + T1Field: "ProductID", + T2Field: "ID", } } func SaleProductId(v badorm.UUID) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ - Field: "product_id", + Field: "ProductID", Value: v, } } func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[models.Sale] { return badorm.JoinCondition[models.Sale, models.Seller]{ Conditions: conditions, - T1Field: "seller_id", - T2Field: "id", + T1Field: "SellerID", + T2Field: "ID", } } func SaleSellerId(v *badorm.UUID) badorm.WhereCondition[models.Sale] { return badorm.WhereCondition[models.Sale]{ - Field: "seller_id", + Field: "SellerID", Value: v, } } diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 5f6b1911..22620297 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -10,37 +10,37 @@ import ( func SellerId(v badorm.UUID) badorm.WhereCondition[models.Seller] { return badorm.WhereCondition[models.Seller]{ - Field: "id", + Field: "ID", Value: v, } } func SellerCreatedAt(v time.Time) badorm.WhereCondition[models.Seller] { return badorm.WhereCondition[models.Seller]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func SellerUpdatedAt(v time.Time) badorm.WhereCondition[models.Seller] { return badorm.WhereCondition[models.Seller]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func SellerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Seller] { return badorm.WhereCondition[models.Seller]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func SellerName(v string) badorm.WhereCondition[models.Seller] { return badorm.WhereCondition[models.Seller]{ - Field: "name", + Field: "Name", Value: v, } } func SellerCompanyId(v *badorm.UUID) badorm.WhereCondition[models.Seller] { return badorm.WhereCondition[models.Seller]{ - Field: "company_id", + Field: "CompanyID", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 0ae213dd..df7a396b 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -155,9 +155,24 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { ), ) - conditionName := getConditionName(objectType, field.Name) + conditionName := getConditionName(objectType, field) log.Logger.Debugf("Generated %q", conditionName) + params := jen.Dict{ + jen.Id("Value"): jen.Id("v"), + } + columnName := field.getColumnName() + if columnName != "" { + params[jen.Id("Column")] = jen.Lit(columnName) + } else { + params[jen.Id("Field")] = jen.Lit(field.Name) + } + + columnPrefix := field.ColumnPrefix + if columnPrefix != "" { + params[jen.Id("ColumnPrefix")] = jen.Lit(columnPrefix) + } + condition.codes = append( condition.codes, jen.Func().Id( @@ -168,10 +183,7 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { whereCondition.Clone(), ).Block( jen.Return( - whereCondition.Clone().Values(jen.Dict{ - jen.Id("Field"): jen.Lit(field.getColumnName()), - jen.Id("Value"): jen.Id("v"), - }), + whereCondition.Clone().Values(params), ), ), ) @@ -181,7 +193,6 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { func (condition *Condition) generateInverseJoin(objectType Type, field Field) { condition.generateJoinWithFK( field.Type, - // TODO testear los Override Foreign Key Field{ Name: objectType.Name(), Type: objectType, @@ -225,7 +236,7 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, field.TypeName(), ) - conditionName := getConditionName(objectType, field.Name) + conditionName := getConditionName(objectType, field) log.Logger.Debugf("Generated %q", conditionName) badormT1Condition := jen.Qual( @@ -251,8 +262,8 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, ).Block( jen.Return( badormJoinCondition.Values(jen.Dict{ - jen.Id("T1Field"): jen.Lit(strcase.ToSnake(t1Field)), - jen.Id("T2Field"): jen.Lit(strcase.ToSnake(t2Field)), + jen.Id("T1Field"): jen.Lit(t1Field), + jen.Id("T2Field"): jen.Lit(t2Field), jen.Id("Conditions"): jen.Id("conditions"), }), ), @@ -261,11 +272,10 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, } // Generate condition names -func getConditionName(typeV Type, fieldName string) string { - return typeV.Name() + strcase.ToPascal(fieldName) +func getConditionName(typeV Type, field Field) string { + return typeV.Name() + strcase.ToPascal(field.ColumnPrefix) + strcase.ToPascal(field.Name) } -// TODO testear esto // Avoid importing the same package as the destination one func getRelativePackagePath(destPkg string, typeV Type) string { srcPkg := typeV.Pkg() diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index 86202eda..24987793 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -3,15 +3,14 @@ package conditions import ( "errors" "go/types" - - "github.com/ettle/strcase" ) type Field struct { - Name string - Type Type - Embedded bool - Tags GormTags + Name string + Type Type + Embedded bool + Tags GormTags + ColumnPrefix string } // Get the name of the column where the data for a field will be saved @@ -22,9 +21,7 @@ func (field Field) getColumnName() string { return columnTag } - // column name generated automatically by gorm - // TODO support https://gorm.io/docs/conventions.html#NamingStrategy - return strcase.ToSnake(field.Name) + return "" } // Get name of the attribute of the object that is a foreign key to the field's object @@ -42,7 +39,6 @@ func (field Field) getFKAttribute() string { // Get name of the attribute of the field's object that is references by the foreign key func (field Field) getFKReferencesAttribute() string { referencesTag, isPresent := field.Tags[referencesTagName] - // TODO testear cuando hay redefinicion en la inversa if isPresent { // field has a references tag, so the name will be that tag return referencesTag @@ -54,7 +50,6 @@ func (field Field) getFKReferencesAttribute() string { // Get name of the attribute of field's object that is a foreign key to the object func (field Field) getRelatedTypeFKAttribute(structName string) string { - // TODO testear cuando hay redefinicion foreignKeyTag, isPresent := field.Tags[foreignKeyTagName] if isPresent { // field has a foreign key tag, so the name will that tag @@ -112,10 +107,11 @@ func getStructFields(structType *types.Struct, prefix string) ([]Field, error) { fieldObject := structType.Field(i) gormTags := getGormTags(structType.Tag(i)) fields = append(fields, Field{ - Name: prefix + fieldObject.Name(), - Type: Type{fieldObject.Type()}, - Embedded: fieldObject.Embedded() || gormTags.hasEmbedded(), - Tags: gormTags, + Name: fieldObject.Name(), + Type: Type{fieldObject.Type()}, + Embedded: fieldObject.Embedded() || gormTags.hasEmbedded(), + Tags: gormTags, + ColumnPrefix: prefix, }) } diff --git a/tools/badctl/cmd/gen/conditions/main_test.go b/tools/badctl/cmd/gen/conditions/main_test.go index 4286378c..b1afd64d 100644 --- a/tools/badctl/cmd/gen/conditions/main_test.go +++ b/tools/badctl/cmd/gen/conditions/main_test.go @@ -122,6 +122,21 @@ func TestOverrideReferences(t *testing.T) { remove("brand_conditions.go") } +func TestOverrideForeignKeyInverse(t *testing.T) { + doTest(t, "./tests/overrideforeignkeyinverse", []Comparison{ + {Have: "user_conditions.go", Expected: "./tests/results/overrideforeignkeyinverse.go"}, + }) + // TODO falta _ + remove("creditcard_conditions.go") +} + +func TestOverrideReferencesInverse(t *testing.T) { + doTest(t, "./tests/overridereferencesinverse", []Comparison{ + {Have: "computer_conditions.go", Expected: "./tests/results/overridereferencesinverse.go"}, + }) + remove("processor_conditions.go") +} + type Comparison struct { Have string Expected string diff --git a/tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse/overrideforeignkeyinverse.go b/tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse/overrideforeignkeyinverse.go new file mode 100644 index 00000000..9ca4eb7d --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse/overrideforeignkeyinverse.go @@ -0,0 +1,15 @@ +package overrideforeignkeyinverse + +import ( + "github.com/ditrit/badaas/badorm" +) + +type User struct { + badorm.UUIDModel + CreditCard CreditCard `gorm:"foreignKey:UserReference"` +} + +type CreditCard struct { + badorm.UUIDModel + UserReference badorm.UUID +} diff --git a/tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse/overridereferencesinverse.go b/tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse/overridereferencesinverse.go new file mode 100644 index 00000000..1343a2f1 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse/overridereferencesinverse.go @@ -0,0 +1,14 @@ +package overridereferencesinverse + +import "github.com/ditrit/badaas/badorm" + +type Computer struct { + badorm.UUIDModel + Name string + Processor Processor `gorm:"foreignKey:ComputerName;references:Name"` +} + +type Processor struct { + badorm.UUIDModel + ComputerName string +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go index 9994079a..f0cdeb2b 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go @@ -10,133 +10,133 @@ import ( func BasicPointersId(v badorm.UUID) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "id", + Field: "ID", Value: v, } } func BasicPointersCreatedAt(v time.Time) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func BasicPointersUpdatedAt(v time.Time) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func BasicPointersDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func BasicPointersBool(v *bool) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "bool", + Field: "Bool", Value: v, } } func BasicPointersInt(v *int) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "int", + Field: "Int", Value: v, } } func BasicPointersInt8(v *int8) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "int8", + Field: "Int8", Value: v, } } func BasicPointersInt16(v *int16) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "int16", + Field: "Int16", Value: v, } } func BasicPointersInt32(v *int32) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "int32", + Field: "Int32", Value: v, } } func BasicPointersInt64(v *int64) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "int64", + Field: "Int64", Value: v, } } func BasicPointersUInt(v *uint) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "u_int", + Field: "UInt", Value: v, } } func BasicPointersUInt8(v *uint8) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "u_int8", + Field: "UInt8", Value: v, } } func BasicPointersUInt16(v *uint16) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "u_int16", + Field: "UInt16", Value: v, } } func BasicPointersUInt32(v *uint32) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "u_int32", + Field: "UInt32", Value: v, } } func BasicPointersUInt64(v *uint64) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "u_int64", + Field: "UInt64", Value: v, } } func BasicPointersUIntptr(v *uintptr) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "u_intptr", + Field: "UIntptr", Value: v, } } func BasicPointersFloat32(v *float32) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "float32", + Field: "Float32", Value: v, } } func BasicPointersFloat64(v *float64) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "float64", + Field: "Float64", Value: v, } } func BasicPointersComplex64(v *complex64) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "complex64", + Field: "Complex64", Value: v, } } func BasicPointersComplex128(v *complex128) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "complex128", + Field: "Complex128", Value: v, } } func BasicPointersString(v *string) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "string", + Field: "String", Value: v, } } func BasicPointersByte(v *uint8) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "byte", + Field: "Byte", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go index 6fb64ae4..bc203778 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go @@ -10,133 +10,133 @@ import ( func BasicSlicesId(v badorm.UUID) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "id", + Field: "ID", Value: v, } } func BasicSlicesCreatedAt(v time.Time) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func BasicSlicesUpdatedAt(v time.Time) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func BasicSlicesDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func BasicSlicesBool(v []bool) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "bool", + Field: "Bool", Value: v, } } func BasicSlicesInt(v []int) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "int", + Field: "Int", Value: v, } } func BasicSlicesInt8(v []int8) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "int8", + Field: "Int8", Value: v, } } func BasicSlicesInt16(v []int16) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "int16", + Field: "Int16", Value: v, } } func BasicSlicesInt32(v []int32) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "int32", + Field: "Int32", Value: v, } } func BasicSlicesInt64(v []int64) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "int64", + Field: "Int64", Value: v, } } func BasicSlicesUInt(v []uint) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "u_int", + Field: "UInt", Value: v, } } func BasicSlicesUInt8(v []uint8) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "u_int8", + Field: "UInt8", Value: v, } } func BasicSlicesUInt16(v []uint16) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "u_int16", + Field: "UInt16", Value: v, } } func BasicSlicesUInt32(v []uint32) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "u_int32", + Field: "UInt32", Value: v, } } func BasicSlicesUInt64(v []uint64) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "u_int64", + Field: "UInt64", Value: v, } } func BasicSlicesUIntptr(v []uintptr) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "u_intptr", + Field: "UIntptr", Value: v, } } func BasicSlicesFloat32(v []float32) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "float32", + Field: "Float32", Value: v, } } func BasicSlicesFloat64(v []float64) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "float64", + Field: "Float64", Value: v, } } func BasicSlicesComplex64(v []complex64) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "complex64", + Field: "Complex64", Value: v, } } func BasicSlicesComplex128(v []complex128) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "complex128", + Field: "Complex128", Value: v, } } func BasicSlicesString(v []string) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "string", + Field: "String", Value: v, } } func BasicSlicesByte(v []uint8) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "byte", + Field: "Byte", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go index e751f8b8..5d2af0a1 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go @@ -10,133 +10,133 @@ import ( func BasicSlicesPointerId(v badorm.UUID) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "id", + Field: "ID", Value: v, } } func BasicSlicesPointerCreatedAt(v time.Time) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func BasicSlicesPointerUpdatedAt(v time.Time) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func BasicSlicesPointerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func BasicSlicesPointerBool(v []*bool) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "bool", + Field: "Bool", Value: v, } } func BasicSlicesPointerInt(v []*int) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "int", + Field: "Int", Value: v, } } func BasicSlicesPointerInt8(v []*int8) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "int8", + Field: "Int8", Value: v, } } func BasicSlicesPointerInt16(v []*int16) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "int16", + Field: "Int16", Value: v, } } func BasicSlicesPointerInt32(v []*int32) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "int32", + Field: "Int32", Value: v, } } func BasicSlicesPointerInt64(v []*int64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "int64", + Field: "Int64", Value: v, } } func BasicSlicesPointerUInt(v []*uint) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "u_int", + Field: "UInt", Value: v, } } func BasicSlicesPointerUInt8(v []*uint8) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "u_int8", + Field: "UInt8", Value: v, } } func BasicSlicesPointerUInt16(v []*uint16) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "u_int16", + Field: "UInt16", Value: v, } } func BasicSlicesPointerUInt32(v []*uint32) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "u_int32", + Field: "UInt32", Value: v, } } func BasicSlicesPointerUInt64(v []*uint64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "u_int64", + Field: "UInt64", Value: v, } } func BasicSlicesPointerUIntptr(v []*uintptr) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "u_intptr", + Field: "UIntptr", Value: v, } } func BasicSlicesPointerFloat32(v []*float32) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "float32", + Field: "Float32", Value: v, } } func BasicSlicesPointerFloat64(v []*float64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "float64", + Field: "Float64", Value: v, } } func BasicSlicesPointerComplex64(v []*complex64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "complex64", + Field: "Complex64", Value: v, } } func BasicSlicesPointerComplex128(v []*complex128) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "complex128", + Field: "Complex128", Value: v, } } func BasicSlicesPointerString(v []*string) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "string", + Field: "String", Value: v, } } func BasicSlicesPointerByte(v []*uint8) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "byte", + Field: "Byte", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go index 66b93119..89123e55 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go @@ -10,133 +10,133 @@ import ( func BasicTypesId(v badorm.UUID) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "id", + Field: "ID", Value: v, } } func BasicTypesCreatedAt(v time.Time) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func BasicTypesUpdatedAt(v time.Time) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func BasicTypesDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func BasicTypesBool(v bool) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "bool", + Field: "Bool", Value: v, } } func BasicTypesInt(v int) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "int", + Field: "Int", Value: v, } } func BasicTypesInt8(v int8) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "int8", + Field: "Int8", Value: v, } } func BasicTypesInt16(v int16) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "int16", + Field: "Int16", Value: v, } } func BasicTypesInt32(v int32) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "int32", + Field: "Int32", Value: v, } } func BasicTypesInt64(v int64) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "int64", + Field: "Int64", Value: v, } } func BasicTypesUInt(v uint) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "u_int", + Field: "UInt", Value: v, } } func BasicTypesUInt8(v uint8) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "u_int8", + Field: "UInt8", Value: v, } } func BasicTypesUInt16(v uint16) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "u_int16", + Field: "UInt16", Value: v, } } func BasicTypesUInt32(v uint32) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "u_int32", + Field: "UInt32", Value: v, } } func BasicTypesUInt64(v uint64) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "u_int64", + Field: "UInt64", Value: v, } } func BasicTypesUIntptr(v uintptr) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "u_intptr", + Field: "UIntptr", Value: v, } } func BasicTypesFloat32(v float32) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "float32", + Field: "Float32", Value: v, } } func BasicTypesFloat64(v float64) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "float64", + Field: "Float64", Value: v, } } func BasicTypesComplex64(v complex64) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "complex64", + Field: "Complex64", Value: v, } } func BasicTypesComplex128(v complex128) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "complex128", + Field: "Complex128", Value: v, } } func BasicTypesString(v string) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "string", + Field: "String", Value: v, } } func BasicTypesByte(v uint8) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "byte", + Field: "Byte", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go index d8f69269..6af631b1 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go @@ -10,38 +10,38 @@ import ( func OwnedId(v badorm.UUID) badorm.WhereCondition[belongsto.Owned] { return badorm.WhereCondition[belongsto.Owned]{ - Field: "id", + Field: "ID", Value: v, } } func OwnedCreatedAt(v time.Time) badorm.WhereCondition[belongsto.Owned] { return badorm.WhereCondition[belongsto.Owned]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func OwnedUpdatedAt(v time.Time) badorm.WhereCondition[belongsto.Owned] { return badorm.WhereCondition[belongsto.Owned]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func OwnedDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[belongsto.Owned] { return badorm.WhereCondition[belongsto.Owned]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Condition[belongsto.Owned] { return badorm.JoinCondition[belongsto.Owned, belongsto.Owner]{ Conditions: conditions, - T1Field: "owner_id", - T2Field: "id", + T1Field: "OwnerID", + T2Field: "ID", } } func OwnedOwnerId(v badorm.UUID) badorm.WhereCondition[belongsto.Owned] { return badorm.WhereCondition[belongsto.Owned]{ - Field: "owner_id", + Field: "OwnerID", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go index 774446da..a8816f8a 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go @@ -10,25 +10,25 @@ import ( func OwnerId(v badorm.UUID) badorm.WhereCondition[belongsto.Owner] { return badorm.WhereCondition[belongsto.Owner]{ - Field: "id", + Field: "ID", Value: v, } } func OwnerCreatedAt(v time.Time) badorm.WhereCondition[belongsto.Owner] { return badorm.WhereCondition[belongsto.Owner]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func OwnerUpdatedAt(v time.Time) badorm.WhereCondition[belongsto.Owner] { return badorm.WhereCondition[belongsto.Owner]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func OwnerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[belongsto.Owner] { return badorm.WhereCondition[belongsto.Owner]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go index d56da2b6..c6deff83 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go @@ -10,31 +10,31 @@ import ( func ColumnDefinitionId(v badorm.UUID) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.WhereCondition[columndefinition.ColumnDefinition]{ - Field: "id", + Field: "ID", Value: v, } } func ColumnDefinitionCreatedAt(v time.Time) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.WhereCondition[columndefinition.ColumnDefinition]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func ColumnDefinitionUpdatedAt(v time.Time) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.WhereCondition[columndefinition.ColumnDefinition]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func ColumnDefinitionDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.WhereCondition[columndefinition.ColumnDefinition]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func ColumnDefinitionString(v string) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.WhereCondition[columndefinition.ColumnDefinition]{ - Field: "string_something_else", - Value: v, + Column: "string_something_else", + Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go index 6758f100..68a8dc1f 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go @@ -10,31 +10,31 @@ import ( func CustomTypeId(v badorm.UUID) badorm.WhereCondition[customtype.CustomType] { return badorm.WhereCondition[customtype.CustomType]{ - Field: "id", + Field: "ID", Value: v, } } func CustomTypeCreatedAt(v time.Time) badorm.WhereCondition[customtype.CustomType] { return badorm.WhereCondition[customtype.CustomType]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func CustomTypeUpdatedAt(v time.Time) badorm.WhereCondition[customtype.CustomType] { return badorm.WhereCondition[customtype.CustomType]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func CustomTypeDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[customtype.CustomType] { return badorm.WhereCondition[customtype.CustomType]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func CustomTypeCustom(v customtype.MultiString) badorm.WhereCondition[customtype.CustomType] { return badorm.WhereCondition[customtype.CustomType]{ - Field: "custom", + Field: "Custom", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go index b482d836..336bed43 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go @@ -10,31 +10,31 @@ import ( func GoEmbeddedId(v uint) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.WhereCondition[goembedded.GoEmbedded]{ - Field: "id", + Field: "ID", Value: v, } } func GoEmbeddedCreatedAt(v time.Time) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.WhereCondition[goembedded.GoEmbedded]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func GoEmbeddedUpdatedAt(v time.Time) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.WhereCondition[goembedded.GoEmbedded]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func GoEmbeddedDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.WhereCondition[goembedded.GoEmbedded]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func GoEmbeddedEmbeddedInt(v int) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.WhereCondition[goembedded.GoEmbedded]{ - Field: "embedded_int", + Field: "EmbeddedInt", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go index b5ecd758..bcfcad0d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go @@ -10,31 +10,32 @@ import ( func GormEmbeddedId(v uint) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.WhereCondition[gormembedded.GormEmbedded]{ - Field: "id", + Field: "ID", Value: v, } } func GormEmbeddedCreatedAt(v time.Time) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.WhereCondition[gormembedded.GormEmbedded]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func GormEmbeddedUpdatedAt(v time.Time) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.WhereCondition[gormembedded.GormEmbedded]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func GormEmbeddedDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.WhereCondition[gormembedded.GormEmbedded]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func GormEmbeddedGormEmbeddedInt(v int) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.WhereCondition[gormembedded.GormEmbedded]{ - Field: "gorm_embedded_int", - Value: v, + ColumnPrefix: "gorm_embedded_", + Field: "Int", + Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go index ef99474c..d6dc2ed8 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go @@ -10,32 +10,32 @@ import ( func CompanyId(v badorm.UUID) badorm.WhereCondition[hasmany.Company] { return badorm.WhereCondition[hasmany.Company]{ - Field: "id", + Field: "ID", Value: v, } } func CompanyCreatedAt(v time.Time) badorm.WhereCondition[hasmany.Company] { return badorm.WhereCondition[hasmany.Company]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func CompanyUpdatedAt(v time.Time) badorm.WhereCondition[hasmany.Company] { return badorm.WhereCondition[hasmany.Company]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func CompanyDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasmany.Company] { return badorm.WhereCondition[hasmany.Company]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.Condition[hasmany.Seller] { return badorm.JoinCondition[hasmany.Seller, hasmany.Company]{ Conditions: conditions, - T1Field: "company_id", - T2Field: "id", + T1Field: "CompanyID", + T2Field: "ID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go index a38fe97d..5bcbffba 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go @@ -10,31 +10,31 @@ import ( func SellerId(v badorm.UUID) badorm.WhereCondition[hasmany.Seller] { return badorm.WhereCondition[hasmany.Seller]{ - Field: "id", + Field: "ID", Value: v, } } func SellerCreatedAt(v time.Time) badorm.WhereCondition[hasmany.Seller] { return badorm.WhereCondition[hasmany.Seller]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func SellerUpdatedAt(v time.Time) badorm.WhereCondition[hasmany.Seller] { return badorm.WhereCondition[hasmany.Seller]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func SellerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasmany.Seller] { return badorm.WhereCondition[hasmany.Seller]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func SellerCompanyId(v *badorm.UUID) badorm.WhereCondition[hasmany.Seller] { return badorm.WhereCondition[hasmany.Seller]{ - Field: "company_id", + Field: "CompanyID", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go index 66c140c2..e9a265dc 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go @@ -10,31 +10,31 @@ import ( func CityId(v badorm.UUID) badorm.WhereCondition[hasone.City] { return badorm.WhereCondition[hasone.City]{ - Field: "id", + Field: "ID", Value: v, } } func CityCreatedAt(v time.Time) badorm.WhereCondition[hasone.City] { return badorm.WhereCondition[hasone.City]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func CityUpdatedAt(v time.Time) badorm.WhereCondition[hasone.City] { return badorm.WhereCondition[hasone.City]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func CityDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasone.City] { return badorm.WhereCondition[hasone.City]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func CityCountryId(v badorm.UUID) badorm.WhereCondition[hasone.City] { return badorm.WhereCondition[hasone.City]{ - Field: "country_id", + Field: "CountryID", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go index cc5f7b16..4efc0c8f 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go @@ -10,39 +10,39 @@ import ( func CountryId(v badorm.UUID) badorm.WhereCondition[hasone.Country] { return badorm.WhereCondition[hasone.Country]{ - Field: "id", + Field: "ID", Value: v, } } func CountryCreatedAt(v time.Time) badorm.WhereCondition[hasone.Country] { return badorm.WhereCondition[hasone.Country]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func CountryUpdatedAt(v time.Time) badorm.WhereCondition[hasone.Country] { return badorm.WhereCondition[hasone.Country]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func CountryDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasone.Country] { return badorm.WhereCondition[hasone.Country]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func CountryCapital(conditions ...badorm.Condition[hasone.City]) badorm.Condition[hasone.Country] { return badorm.JoinCondition[hasone.Country, hasone.City]{ Conditions: conditions, - T1Field: "id", - T2Field: "country_id", + T1Field: "ID", + T2Field: "CountryID", } } func CityCountry(conditions ...badorm.Condition[hasone.Country]) badorm.Condition[hasone.City] { return badorm.JoinCondition[hasone.City, hasone.Country]{ Conditions: conditions, - T1Field: "country_id", - T2Field: "id", + T1Field: "CountryID", + T2Field: "ID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go index b529d848..e2ef47e2 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go @@ -11,39 +11,39 @@ import ( func Package1Id(v badorm.UUID) badorm.WhereCondition[package1.Package1] { return badorm.WhereCondition[package1.Package1]{ - Field: "id", + Field: "ID", Value: v, } } func Package1CreatedAt(v time.Time) badorm.WhereCondition[package1.Package1] { return badorm.WhereCondition[package1.Package1]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func Package1UpdatedAt(v time.Time) badorm.WhereCondition[package1.Package1] { return badorm.WhereCondition[package1.Package1]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func Package1DeletedAt(v gorm.DeletedAt) badorm.WhereCondition[package1.Package1] { return badorm.WhereCondition[package1.Package1]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func Package1Package2(conditions ...badorm.Condition[package2.Package2]) badorm.Condition[package1.Package1] { return badorm.JoinCondition[package1.Package1, package2.Package2]{ Conditions: conditions, - T1Field: "id", - T2Field: "package1_id", + T1Field: "ID", + T2Field: "Package1ID", } } func Package2Package1(conditions ...badorm.Condition[package1.Package1]) badorm.Condition[package2.Package2] { return badorm.JoinCondition[package2.Package2, package1.Package1]{ Conditions: conditions, - T1Field: "package1_id", - T2Field: "id", + T1Field: "Package1ID", + T2Field: "ID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go index 11a2ea21..10717098 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go @@ -10,38 +10,38 @@ import ( func BicycleId(v badorm.UUID) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.WhereCondition[overrideforeignkey.Bicycle]{ - Field: "id", + Field: "ID", Value: v, } } func BicycleCreatedAt(v time.Time) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.WhereCondition[overrideforeignkey.Bicycle]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func BicycleUpdatedAt(v time.Time) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.WhereCondition[overrideforeignkey.Bicycle]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func BicycleDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.WhereCondition[overrideforeignkey.Bicycle]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) badorm.Condition[overrideforeignkey.Bicycle] { return badorm.JoinCondition[overrideforeignkey.Bicycle, overrideforeignkey.Person]{ Conditions: conditions, - T1Field: "owner_something_id", - T2Field: "id", + T1Field: "OwnerSomethingID", + T2Field: "ID", } } func BicycleOwnerSomethingId(v string) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.WhereCondition[overrideforeignkey.Bicycle]{ - Field: "owner_something_id", + Field: "OwnerSomethingID", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go new file mode 100644 index 00000000..6e41db1d --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go @@ -0,0 +1,48 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + overrideforeignkeyinverse "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse" + gorm "gorm.io/gorm" + "time" +) + +func UserId(v badorm.UUID) badorm.WhereCondition[overrideforeignkeyinverse.User] { + return badorm.WhereCondition[overrideforeignkeyinverse.User]{ + Field: "ID", + Value: v, + } +} +func UserCreatedAt(v time.Time) badorm.WhereCondition[overrideforeignkeyinverse.User] { + return badorm.WhereCondition[overrideforeignkeyinverse.User]{ + Field: "CreatedAt", + Value: v, + } +} +func UserUpdatedAt(v time.Time) badorm.WhereCondition[overrideforeignkeyinverse.User] { + return badorm.WhereCondition[overrideforeignkeyinverse.User]{ + Field: "UpdatedAt", + Value: v, + } +} +func UserDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[overrideforeignkeyinverse.User] { + return badorm.WhereCondition[overrideforeignkeyinverse.User]{ + Field: "DeletedAt", + Value: v, + } +} +func UserCreditCard(conditions ...badorm.Condition[overrideforeignkeyinverse.CreditCard]) badorm.Condition[overrideforeignkeyinverse.User] { + return badorm.JoinCondition[overrideforeignkeyinverse.User, overrideforeignkeyinverse.CreditCard]{ + Conditions: conditions, + T1Field: "ID", + T2Field: "UserReference", + } +} +func CreditCardUser(conditions ...badorm.Condition[overrideforeignkeyinverse.User]) badorm.Condition[overrideforeignkeyinverse.CreditCard] { + return badorm.JoinCondition[overrideforeignkeyinverse.CreditCard, overrideforeignkeyinverse.User]{ + Conditions: conditions, + T1Field: "UserReference", + T2Field: "ID", + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go index 8df94db6..58a988b7 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go @@ -10,38 +10,38 @@ import ( func PhoneId(v badorm.UUID) badorm.WhereCondition[overridereferences.Phone] { return badorm.WhereCondition[overridereferences.Phone]{ - Field: "id", + Field: "ID", Value: v, } } func PhoneCreatedAt(v time.Time) badorm.WhereCondition[overridereferences.Phone] { return badorm.WhereCondition[overridereferences.Phone]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func PhoneUpdatedAt(v time.Time) badorm.WhereCondition[overridereferences.Phone] { return badorm.WhereCondition[overridereferences.Phone]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func PhoneDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[overridereferences.Phone] { return badorm.WhereCondition[overridereferences.Phone]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm.Condition[overridereferences.Phone] { return badorm.JoinCondition[overridereferences.Phone, overridereferences.Brand]{ Conditions: conditions, - T1Field: "brand_name", - T2Field: "name", + T1Field: "BrandName", + T2Field: "Name", } } func PhoneBrandName(v string) badorm.WhereCondition[overridereferences.Phone] { return badorm.WhereCondition[overridereferences.Phone]{ - Field: "brand_name", + Field: "BrandName", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go new file mode 100644 index 00000000..421f2e2f --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go @@ -0,0 +1,54 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + overridereferencesinverse "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse" + gorm "gorm.io/gorm" + "time" +) + +func ComputerId(v badorm.UUID) badorm.WhereCondition[overridereferencesinverse.Computer] { + return badorm.WhereCondition[overridereferencesinverse.Computer]{ + Field: "ID", + Value: v, + } +} +func ComputerCreatedAt(v time.Time) badorm.WhereCondition[overridereferencesinverse.Computer] { + return badorm.WhereCondition[overridereferencesinverse.Computer]{ + Field: "CreatedAt", + Value: v, + } +} +func ComputerUpdatedAt(v time.Time) badorm.WhereCondition[overridereferencesinverse.Computer] { + return badorm.WhereCondition[overridereferencesinverse.Computer]{ + Field: "UpdatedAt", + Value: v, + } +} +func ComputerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[overridereferencesinverse.Computer] { + return badorm.WhereCondition[overridereferencesinverse.Computer]{ + Field: "DeletedAt", + Value: v, + } +} +func ComputerName(v string) badorm.WhereCondition[overridereferencesinverse.Computer] { + return badorm.WhereCondition[overridereferencesinverse.Computer]{ + Field: "Name", + Value: v, + } +} +func ComputerProcessor(conditions ...badorm.Condition[overridereferencesinverse.Processor]) badorm.Condition[overridereferencesinverse.Computer] { + return badorm.JoinCondition[overridereferencesinverse.Computer, overridereferencesinverse.Processor]{ + Conditions: conditions, + T1Field: "Name", + T2Field: "ComputerName", + } +} +func ProcessorComputer(conditions ...badorm.Condition[overridereferencesinverse.Computer]) badorm.Condition[overridereferencesinverse.Processor] { + return badorm.JoinCondition[overridereferencesinverse.Processor, overridereferencesinverse.Computer]{ + Conditions: conditions, + T1Field: "ComputerName", + T2Field: "Name", + } +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go index ebf732f4..62a3bd4e 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go @@ -10,38 +10,38 @@ import ( func EmployeeId(v badorm.UUID) badorm.WhereCondition[selfreferential.Employee] { return badorm.WhereCondition[selfreferential.Employee]{ - Field: "id", + Field: "ID", Value: v, } } func EmployeeCreatedAt(v time.Time) badorm.WhereCondition[selfreferential.Employee] { return badorm.WhereCondition[selfreferential.Employee]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func EmployeeUpdatedAt(v time.Time) badorm.WhereCondition[selfreferential.Employee] { return badorm.WhereCondition[selfreferential.Employee]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func EmployeeDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[selfreferential.Employee] { return badorm.WhereCondition[selfreferential.Employee]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) badorm.Condition[selfreferential.Employee] { return badorm.JoinCondition[selfreferential.Employee, selfreferential.Employee]{ Conditions: conditions, - T1Field: "boss_id", - T2Field: "id", + T1Field: "BossID", + T2Field: "ID", } } func EmployeeBossId(v *badorm.UUID) badorm.WhereCondition[selfreferential.Employee] { return badorm.WhereCondition[selfreferential.Employee]{ - Field: "boss_id", + Field: "BossID", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go index d034750b..a8e2c867 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go @@ -10,25 +10,25 @@ import ( func UIntModelId(v uint) badorm.WhereCondition[uintmodel.UIntModel] { return badorm.WhereCondition[uintmodel.UIntModel]{ - Field: "id", + Field: "ID", Value: v, } } func UIntModelCreatedAt(v time.Time) badorm.WhereCondition[uintmodel.UIntModel] { return badorm.WhereCondition[uintmodel.UIntModel]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func UIntModelUpdatedAt(v time.Time) badorm.WhereCondition[uintmodel.UIntModel] { return badorm.WhereCondition[uintmodel.UIntModel]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func UIntModelDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[uintmodel.UIntModel] { return badorm.WhereCondition[uintmodel.UIntModel]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go index c9e7579f..a9401a51 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go @@ -10,25 +10,25 @@ import ( func UUIDModelId(v badorm.UUID) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.WhereCondition[uuidmodel.UUIDModel]{ - Field: "id", + Field: "ID", Value: v, } } func UUIDModelCreatedAt(v time.Time) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.WhereCondition[uuidmodel.UUIDModel]{ - Field: "created_at", + Field: "CreatedAt", Value: v, } } func UUIDModelUpdatedAt(v time.Time) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.WhereCondition[uuidmodel.UUIDModel]{ - Field: "updated_at", + Field: "UpdatedAt", Value: v, } } func UUIDModelDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.WhereCondition[uuidmodel.UUIDModel]{ - Field: "deleted_at", + Field: "DeletedAt", Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index 3529e5bc..11a6a3b6 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -10,7 +10,7 @@ import ( ) // badorm/baseModels.go -var badORMModels = []string{"UUIDModel", "UIntModel"} +var badORMModels = []string{"github.com/ditrit/badaas/badorm.UUIDModel", "github.com/ditrit/badaas/badorm.UIntModel", "gorm.io/gorm.Model"} type Type struct { types.Type @@ -52,7 +52,7 @@ func isBadORMModel(structType *types.Struct) bool { for i := 0; i < structType.NumFields(); i++ { field := structType.Field(i) - if field.Embedded() && pie.Contains(badORMModels, field.Name()) { + if field.Embedded() && pie.Contains(badORMModels, field.Type().String()) { return true } } @@ -63,11 +63,7 @@ func isBadORMModel(structType *types.Struct) bool { // Returns true is the type has a foreign key to the field's object // (another field that references that object) func (t Type) HasFK(field Field) (bool, error) { - objectFields, err := getFields( - t, - // TODO testear esto si esta bien aca - field.Tags.getEmbeddedPrefix(), - ) + objectFields, err := getFields(t, "") if err != nil { return false, err } From 160350380575670f69ece7257d516edc41043545 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 7 Jun 2023 16:17:42 +0200 Subject: [PATCH 304/467] fix ci int test report name --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 37fec3ec..48d7ce5a 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -130,7 +130,7 @@ jobs: if: always() # run this step even if previous steps failed with: name: ${{ matrix.db }} Integration Tests Report # Name of the check run which will be created - path: unit-tests-${{ matrix.db }}.xml # Path to test results + path: integration-tests-${{ matrix.db }}.xml # Path to test results reporter: java-junit # Format of test results - uses: actions/upload-artifact@v3 with: From a214d4576ef76581e5515e057cadaabbc9716c4d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 7 Jun 2023 16:25:40 +0200 Subject: [PATCH 305/467] add badctl tests to sonar tests --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index a6d0b47a..9a15b53c 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -5,5 +5,5 @@ sonar.host.url=https://sonarcloud.io sonar.sources=. sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/gen/docker/api/Dockerfile sonar.tests=. -sonar.test.inclusions=**/*_test.go,testintegration/***,test_e2e/*** +sonar.test.inclusions=**/*_test.go,testintegration/***,test_e2e/***,tools/badctl/cmd/gen/conditions/tests/* sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_badctl.out/coverage_badctl.out,coverage_int_postgresql.out/coverage_int_postgresql.out,coverage_int_mysql.out/coverage_int_mysql.out From 307122993d6a562e91ccfa29839627123fb3bd0f Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 7 Jun 2023 16:31:46 +0200 Subject: [PATCH 306/467] fix conditions file names in snake case --- tools/badctl/cmd/gen/conditions/main.go | 4 ++-- tools/badctl/cmd/gen/conditions/main_test.go | 24 +++++++++---------- .../gen/conditions/tests/results/uintmodel.go | 16 ++++++------- .../conditions/tests/uintmodel/uintmodel.go | 2 +- 4 files changed, 22 insertions(+), 24 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 07ef5f14..50a85070 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -5,11 +5,11 @@ import ( "fmt" "go/types" "os" - "strings" "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/badaas/tools/badctl/cmd/log" "github.com/ditrit/verdeter" + "github.com/ettle/strcase" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -66,7 +66,7 @@ func generateConditionsForPkg(destPkg string, pkg *packages.Package) { if object != nil { file := NewConditionsFile( destPkg, - strings.ToLower(object.Name())+"_conditions.go", + strcase.ToSnake(object.Name())+"_conditions.go", ) err := file.AddConditionsFor(object) diff --git a/tools/badctl/cmd/gen/conditions/main_test.go b/tools/badctl/cmd/gen/conditions/main_test.go index b1afd64d..25f70046 100644 --- a/tools/badctl/cmd/gen/conditions/main_test.go +++ b/tools/badctl/cmd/gen/conditions/main_test.go @@ -16,55 +16,55 @@ const chunkSize = 100000 func TestUIntModel(t *testing.T) { doTest(t, "./tests/uintmodel", []Comparison{ - {Have: "uintmodel_conditions.go", Expected: "./tests/results/uintmodel.go"}, + {Have: "uint_model_conditions.go", Expected: "./tests/results/uintmodel.go"}, }) } func TestUUIDModel(t *testing.T) { doTest(t, "./tests/uuidmodel", []Comparison{ - {Have: "uuidmodel_conditions.go", Expected: "./tests/results/uuidmodel.go"}, + {Have: "uuid_model_conditions.go", Expected: "./tests/results/uuidmodel.go"}, }) } func TestBasicTypes(t *testing.T) { doTest(t, "./tests/basictypes", []Comparison{ - {Have: "basictypes_conditions.go", Expected: "./tests/results/basictypes.go"}, + {Have: "basic_types_conditions.go", Expected: "./tests/results/basictypes.go"}, }) } func TestBasicPointers(t *testing.T) { doTest(t, "./tests/basicpointers", []Comparison{ - {Have: "basicpointers_conditions.go", Expected: "./tests/results/basicpointers.go"}, + {Have: "basic_pointers_conditions.go", Expected: "./tests/results/basicpointers.go"}, }) } func TestBasicSlices(t *testing.T) { doTest(t, "./tests/basicslices", []Comparison{ - {Have: "basicslices_conditions.go", Expected: "./tests/results/basicslices.go"}, + {Have: "basic_slices_conditions.go", Expected: "./tests/results/basicslices.go"}, }) } func TestBasicSlicesPointer(t *testing.T) { doTest(t, "./tests/basicslicespointer", []Comparison{ - {Have: "basicslicespointer_conditions.go", Expected: "./tests/results/basicslicespointer.go"}, + {Have: "basic_slices_pointer_conditions.go", Expected: "./tests/results/basicslicespointer.go"}, }) } func TestGoEmbedded(t *testing.T) { doTest(t, "./tests/goembedded", []Comparison{ - {Have: "goembedded_conditions.go", Expected: "./tests/results/goembedded.go"}, + {Have: "go_embedded_conditions.go", Expected: "./tests/results/goembedded.go"}, }) } func TestGormEmbedded(t *testing.T) { doTest(t, "./tests/gormembedded", []Comparison{ - {Have: "gormembedded_conditions.go", Expected: "./tests/results/gormembedded.go"}, + {Have: "gorm_embedded_conditions.go", Expected: "./tests/results/gormembedded.go"}, }) } func TestCustomType(t *testing.T) { doTest(t, "./tests/customtype", []Comparison{ - {Have: "customtype_conditions.go", Expected: "./tests/results/customtype.go"}, + {Have: "custom_type_conditions.go", Expected: "./tests/results/customtype.go"}, }) } @@ -103,8 +103,7 @@ func TestMultiplePackage(t *testing.T) { func TestColumnDefinition(t *testing.T) { doTest(t, "./tests/columndefinition", []Comparison{ - // TODO deberia haber un _ aca - {Have: "columndefinition_conditions.go", Expected: "./tests/results/columndefinition.go"}, + {Have: "column_definition_conditions.go", Expected: "./tests/results/columndefinition.go"}, }) } @@ -126,8 +125,7 @@ func TestOverrideForeignKeyInverse(t *testing.T) { doTest(t, "./tests/overrideforeignkeyinverse", []Comparison{ {Have: "user_conditions.go", Expected: "./tests/results/overrideforeignkeyinverse.go"}, }) - // TODO falta _ - remove("creditcard_conditions.go") + remove("credit_card_conditions.go") } func TestOverrideReferencesInverse(t *testing.T) { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go index a8e2c867..28d615c5 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go @@ -8,26 +8,26 @@ import ( "time" ) -func UIntModelId(v uint) badorm.WhereCondition[uintmodel.UIntModel] { - return badorm.WhereCondition[uintmodel.UIntModel]{ +func UintModelId(v uint) badorm.WhereCondition[uintmodel.UintModel] { + return badorm.WhereCondition[uintmodel.UintModel]{ Field: "ID", Value: v, } } -func UIntModelCreatedAt(v time.Time) badorm.WhereCondition[uintmodel.UIntModel] { - return badorm.WhereCondition[uintmodel.UIntModel]{ +func UintModelCreatedAt(v time.Time) badorm.WhereCondition[uintmodel.UintModel] { + return badorm.WhereCondition[uintmodel.UintModel]{ Field: "CreatedAt", Value: v, } } -func UIntModelUpdatedAt(v time.Time) badorm.WhereCondition[uintmodel.UIntModel] { - return badorm.WhereCondition[uintmodel.UIntModel]{ +func UintModelUpdatedAt(v time.Time) badorm.WhereCondition[uintmodel.UintModel] { + return badorm.WhereCondition[uintmodel.UintModel]{ Field: "UpdatedAt", Value: v, } } -func UIntModelDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[uintmodel.UIntModel] { - return badorm.WhereCondition[uintmodel.UIntModel]{ +func UintModelDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[uintmodel.UintModel] { + return badorm.WhereCondition[uintmodel.UintModel]{ Field: "DeletedAt", Value: v, } diff --git a/tools/badctl/cmd/gen/conditions/tests/uintmodel/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/uintmodel/uintmodel.go index df97a07c..088f6e08 100644 --- a/tools/badctl/cmd/gen/conditions/tests/uintmodel/uintmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/uintmodel/uintmodel.go @@ -2,6 +2,6 @@ package uintmodel import "github.com/ditrit/badaas/badorm" -type UIntModel struct { +type UintModel struct { badorm.UIntModel } From ded438ad025ca4b3b5ee18b576f824db247c7244 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 7 Jun 2023 17:12:44 +0200 Subject: [PATCH 307/467] fix add badctl tests to sonar tests --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index 9a15b53c..65dd48f7 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -5,5 +5,5 @@ sonar.host.url=https://sonarcloud.io sonar.sources=. sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/gen/docker/api/Dockerfile sonar.tests=. -sonar.test.inclusions=**/*_test.go,testintegration/***,test_e2e/***,tools/badctl/cmd/gen/conditions/tests/* +sonar.test.inclusions=**/*_test.go,testintegration/***,test_e2e/***,tools/badctl/cmd/gen/conditions/tests/*** sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_badctl.out/coverage_badctl.out,coverage_int_postgresql.out/coverage_int_postgresql.out,coverage_int_mysql.out/coverage_int_mysql.out From 14f17ba89592bff1ff2f50acc144d1f1c32f40b7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 8 Jun 2023 09:43:04 +0200 Subject: [PATCH 308/467] fix tests e2e? --- go.work.sum | 1 + test_e2e/go.mod | 75 +++++++++---------- test_e2e/go.sum | 175 ++++++++++++++++++++------------------------ tools/badctl/go.mod | 2 +- 4 files changed, 120 insertions(+), 133 deletions(-) diff --git a/go.work.sum b/go.work.sum index 0fefec7f..55db9872 100644 --- a/go.work.sum +++ b/go.work.sum @@ -358,6 +358,7 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= diff --git a/test_e2e/go.mod b/test_e2e/go.mod index 949db584..147cebfe 100644 --- a/test_e2e/go.mod +++ b/test_e2e/go.mod @@ -2,74 +2,75 @@ module github.com/ditrit/badaas/test_e2e go 1.18 +// replace github.com/ditrit/badaas => ../ + require ( - github.com/Masterminds/squirrel v1.5.3 + github.com/Masterminds/semver/v3 v3.2.1 github.com/cucumber/godog v0.12.5 github.com/cucumber/messages-go/v16 v16.0.1 + github.com/ditrit/badaas v0.0.0-20230607151244-ded438ad025c github.com/ditrit/verdeter v0.4.0 - github.com/google/uuid v1.3.0 + github.com/elliotchance/pie/v2 v2.5.2 github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 - github.com/jackc/pgconn v1.13.0 - github.com/magiconair/properties v1.8.6 - github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61 - github.com/spf13/cobra v1.5.0 + github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.13.0 - github.com/stretchr/testify v1.8.1 - go.uber.org/fx v1.18.2 - go.uber.org/zap v1.23.0 - golang.org/x/crypto v0.1.0 - gorm.io/driver/postgres v1.4.5 - gorm.io/gorm v1.24.1 - github.com/DATA-DOG/go-sqlmock v1.5.0 - github.com/elliotchance/pie/v2 v2.5.2 - gotest.tools v2.2.0+incompatible + github.com/spf13/viper v1.16.0 + go.uber.org/fx v1.19.3 + go.uber.org/zap v1.24.0 + gorm.io/gorm v1.25.1 ) require ( - github.com/felixge/httpsnoop v1.0.1 // indirect - golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 // indirect + github.com/Masterminds/squirrel v1.5.4 // indirect github.com/cucumber/gherkin-go/v19 v19.0.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/felixge/httpsnoop v1.0.1 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/google/go-cmp v0.5.9 // indirect + github.com/google/uuid v1.3.0 // indirect github.com/goph/emperror v0.17.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-memdb v1.3.3 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.14.0 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.1 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.12.0 // indirect - github.com/jackc/pgx/v4 v4.17.2 // indirect + github.com/jackc/pgproto3/v2 v2.3.2 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.3.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - github.com/spf13/afero v1.9.2 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/sirupsen/logrus v1.9.2 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/subosito/gotenv v1.4.1 // indirect - go.uber.org/atomic v1.10.0 // indirect - go.uber.org/dig v1.15.0 // indirect - go.uber.org/multierr v1.8.0 // indirect - golang.org/x/sys v0.1.0 // indirect - golang.org/x/text v0.4.0 // indirect + github.com/stretchr/testify v1.8.4 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/dig v1.17.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/crypto v0.9.0 // indirect + golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/driver/mysql v1.5.1 // indirect + gorm.io/driver/postgres v1.5.2 // indirect + gotest.tools v2.2.0+incompatible // indirect ) diff --git a/test_e2e/go.sum b/test_e2e/go.sum index 2cea577f..84fb6afc 100644 --- a/test_e2e/go.sum +++ b/test_e2e/go.sum @@ -40,11 +40,10 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= -github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc= -github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= +github.com/Masterminds/semver/v3 v3.2.1 h1:RN9w6+7QoMeJVGyfmbcgs28Br8cvmnucEXnY0rYXWg0= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM= +github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/airbrake/gobrake v3.6.1+incompatible/go.mod h1:wM4gu3Cn0W0K7GUuVWnlXZU11AGBXMILnrdOU8Kn00o= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -72,7 +71,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -108,10 +106,10 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= @@ -120,10 +118,10 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= @@ -237,8 +235,8 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -248,9 +246,8 @@ github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= -github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= +github.com/jackc/pgconn v1.14.0 h1:vrbA9Ud87g6JdFWkHTJXppVce58qPIdP7N8y0Ml/A7Q= +github.com/jackc/pgconn v1.14.0/go.mod h1:9mBNlny0UvkgJdCDvdVHYSjI+8tD2rnKK69Wz8ti++E= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= @@ -266,29 +263,23 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= -github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgproto3/v2 v2.3.2 h1:7eY55bdBeCz1F2fTzSz69QC+pG46jYq9/jtSPiJ5nn0= +github.com/jackc/pgproto3/v2 v2.3.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= -github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= -github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= +github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= +github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -307,7 +298,7 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -319,21 +310,17 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6Fm github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= @@ -361,10 +348,8 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -385,7 +370,7 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7z github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rollbar/rollbar-go v1.0.2/go.mod h1:AcFs5f0I+c71bpHlXNNDbOWJiKwjFDtISeXco0L5PKQ= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -396,15 +381,13 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= +github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= @@ -412,14 +395,14 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -427,8 +410,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= -github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -442,11 +425,13 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= -github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= @@ -455,6 +440,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -465,27 +451,20 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/dig v1.15.0 h1:vq3YWr8zRj1eFGC7Gvf907hE0eRjPTZ1d3xHadD6liE= -go.uber.org/dig v1.15.0/go.mod h1:pKHs0wMynzL6brANhB2hLMro+zalv1osARTviTcqHLM= -go.uber.org/fx v1.18.2 h1:bUNI6oShr+OVFQeU8cDNbnN7VFsu+SsjHzUF51V/GAU= -go.uber.org/fx v1.18.2/go.mod h1:g0V1KMQ66zIRk8bLu3Ea5Jt2w/cHlOIp4wdRsgh0JaY= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/dig v1.17.0 h1:5Chju+tUvcC+N7N6EV08BJz41UZuO3BmHcN4A287ZLI= +go.uber.org/dig v1.17.0/go.mod h1:rTxpf7l5I0eBTlE6/9RL+lDybC7WFwY2QH55ZSjy1mU= +go.uber.org/fx v1.19.3 h1:YqMRE4+2IepTYCMOvXqQpRa+QAVdiSTnsHU4XNWBceA= +go.uber.org/fx v1.19.3/go.mod h1:w2HrQg26ql9fLK7hlBiZ6JsRUKV+Lj/atT1KCjT8YhM= go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -499,10 +478,11 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -513,8 +493,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705 h1:ba9YlqfDGTTQ5aZ2fwOoQ1hf32QySyQkR6ODGDzHlnE= -golang.org/x/exp v0.0.0-20220321173239-a90fa8a75705/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -538,6 +518,7 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -576,6 +557,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -595,6 +578,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -619,7 +603,6 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -642,13 +625,18 @@ golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -657,8 +645,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -681,8 +670,6 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -691,7 +678,6 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -717,6 +703,7 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -829,18 +816,16 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/postgres v1.4.5 h1:mTeXTTtHAgnS9PgmhN2YeUbazYpLhUI1doLnw42XUZc= -gorm.io/driver/postgres v1.4.5/go.mod h1:GKNQYSJ14qvWkvPwXljMGehpKrhlDNsqYRr5HnYGncg= -gorm.io/gorm v1.24.1-0.20221019064659-5dd2bb482755/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.24.1 h1:CgvzRniUdG67hBAzsxDGOAuq4Te1osVMYsa1eQbd4fs= -gorm.io/gorm v1.24.1/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= +gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= +gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= +gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= +gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= +gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/tools/badctl/go.mod b/tools/badctl/go.mod index 191995ed..fc5c37a4 100644 --- a/tools/badctl/go.mod +++ b/tools/badctl/go.mod @@ -6,7 +6,7 @@ go 1.18 require ( github.com/dave/jennifer v1.6.1 - github.com/ditrit/badaas v0.0.0-20230605151246-3f2daae1a19f + github.com/ditrit/badaas v0.0.0-20230607151244-ded438ad025c github.com/ditrit/verdeter v0.4.0 github.com/elliotchance/pie/v2 v2.5.2 github.com/ettle/strcase v0.1.1 From 7a6ae9ef61bc4f0b662649682cc5a0261c89f2dc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 8 Jun 2023 09:56:45 +0200 Subject: [PATCH 309/467] fix test e2e? 2 --- go.work.sum | 1 + 1 file changed, 1 insertion(+) diff --git a/go.work.sum b/go.work.sum index 55db9872..d9630da3 100644 --- a/go.work.sum +++ b/go.work.sum @@ -297,6 +297,7 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/ditrit/badaas v0.0.0-20230607151244-ded438ad025c/go.mod h1:Qaxactfr4iYYzfBmyW4DkG/5pkfkk/dVZ0Y8H1cYeTM= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= From b73aaf23dc90923ca496cc3a1f1717c496dcd3e4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 8 Jun 2023 11:20:08 +0200 Subject: [PATCH 310/467] run tests over sqlite --- .github/workflows/CI.yml | 7 +++++-- .gitignore | 5 +++++ Makefile | 3 +++ badaas.example.yml | 2 +- badorm/db.go | 18 ++++++++++++++---- badorm/db_test.go | 1 - badorm/uuid.go | 9 +++++++-- badorm/uuid_test.go | 3 ++- configuration/DatabaseConfiguration.go | 5 ++++- go.mod | 2 ++ go.sum | 4 ++++ persistence/gormdatabase/db.go | 10 +++++++--- testintegration/badorm_test.go | 17 ++++++++++++----- 13 files changed, 66 insertions(+), 20 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 48d7ce5a..98f177a2 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -93,7 +93,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - db: [postgresql, cockroachdb, mysql] + db: [postgresql, cockroachdb, mysql, sqlite] steps: - uses: actions/checkout@v3 with: @@ -120,6 +120,9 @@ jobs: }, "mysql": { "dialector": "mysql" + }, + "sqlite": { + "dialector": "sqlite" } } export_to: env @@ -130,7 +133,7 @@ jobs: if: always() # run this step even if previous steps failed with: name: ${{ matrix.db }} Integration Tests Report # Name of the check run which will be created - path: integration-tests-${{ matrix.db }}.xml # Path to test results + path: integration-tests-${{ matrix.db }}.xml # Path to test results reporter: java-junit # Format of test results - uses: actions/upload-artifact@v3 with: diff --git a/.gitignore b/.gitignore index bf74f388..380fe0df 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,9 @@ vendor/ # cockroach files node* +# sqlite files +testintegration/sqlite:* + # vscode conf .vscode @@ -30,4 +33,6 @@ node* badaas badctl !tools/badctl/ + +# test results tools/badctl/cmd/gen/conditions/*_conditions.go \ No newline at end of file diff --git a/Makefile b/Makefile index ab4d9490..48e55159 100644 --- a/Makefile +++ b/Makefile @@ -44,6 +44,9 @@ test_integration_cockroachdb: cockroachdb test_integration_mysql: mysql DB=mysql gotestsum --format testname ./testintegration +test_integration_sqlite: + DB=sqlite gotestsum --format testname ./testintegration + test_integration: test_integration_postgresql test_e2e: diff --git a/badaas.example.yml b/badaas.example.yml index bbd7306c..112374eb 100644 --- a/badaas.example.yml +++ b/badaas.example.yml @@ -1,6 +1,6 @@ # The settings for the database. database: - # The host of the database server. + # The host of the database server (or path for sqlite). # (mandatory) host: e2e-db-1 diff --git a/badorm/db.go b/badorm/db.go index 15fe81cd..f081f770 100644 --- a/badorm/db.go +++ b/badorm/db.go @@ -4,11 +4,13 @@ import ( "fmt" "time" - "github.com/ditrit/badaas/persistence/gormdatabase/gormzap" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/driver/postgres" + "gorm.io/driver/sqlite" "gorm.io/gorm" + + "github.com/ditrit/badaas/persistence/gormdatabase/gormzap" ) func CreatePostgreSQLDialector(host, username, password, sslmode, dbname string, port int) gorm.Dialector { @@ -24,19 +26,27 @@ func CreatePostgreSQLDSN(host, username, password, sslmode, dbname string, port ) } -func CreateMySQLDialector(host, username, password, sslmode, dbname string, port int) gorm.Dialector { +func CreateMySQLDialector(host, username, password, dbname string, port int) gorm.Dialector { return mysql.Open(CreateMySQLDSN( - host, username, password, sslmode, dbname, port, + host, username, password, dbname, port, )) } -func CreateMySQLDSN(host, username, password, sslmode, dbname string, port int) string { +func CreateMySQLDSN(host, username, password, dbname string, port int) string { return fmt.Sprintf( "%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port, dbname, ) } +func CreateSQLiteDialector(path string) gorm.Dialector { + return sqlite.Open(CreateSQLiteDSN(path)) +} + +func CreateSQLiteDSN(path string) string { + return fmt.Sprintf("sqlite:%s", path) +} + func ConnectToDialector( logger *zap.Logger, dialector gorm.Dialector, diff --git a/badorm/db_test.go b/badorm/db_test.go index 2353ca1f..0249d8f3 100644 --- a/badorm/db_test.go +++ b/badorm/db_test.go @@ -29,7 +29,6 @@ func TestCreateMySQLDSN(t *testing.T) { "192.168.2.5", "username", "password", - "disable", "badaas_db", 1225, ), diff --git a/badorm/uuid.go b/badorm/uuid.go index 0f968537..9d8a0fd7 100644 --- a/badorm/uuid.go +++ b/badorm/uuid.go @@ -20,6 +20,8 @@ func (id UUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { return "binary(16)" case "postgres": return "uuid" + case "sqlite": + return "varchar(36)" } return "" } @@ -65,8 +67,7 @@ func (id UUID) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { return gorm.Expr("NULL") } - switch db.Dialector.Name() { - case "mysql": + if db.Dialector.Name() == "mysql" { binary, _ := id.MarshalBinary() return gorm.Expr("?", binary) } @@ -86,6 +87,10 @@ func (id UUID) ClockSequence() int { return uuid.UUID(id).ClockSequence() } +func NewUUID() UUID { + return UUID(uuid.New()) +} + func ParseUUID(s string) (UUID, error) { uid, err := uuid.Parse(s) if err != nil { diff --git a/badorm/uuid_test.go b/badorm/uuid_test.go index e4ffc1a6..c151464d 100644 --- a/badorm/uuid_test.go +++ b/badorm/uuid_test.go @@ -3,9 +3,10 @@ package badorm_test import ( "testing" - "github.com/ditrit/badaas/badorm" "github.com/google/uuid" "github.com/stretchr/testify/assert" + + "github.com/ditrit/badaas/badorm" ) func TestParseCorrectUUID(t *testing.T) { diff --git a/configuration/DatabaseConfiguration.go b/configuration/DatabaseConfiguration.go index c86431d4..2d1ecacf 100644 --- a/configuration/DatabaseConfiguration.go +++ b/configuration/DatabaseConfiguration.go @@ -3,9 +3,10 @@ package configuration import ( "time" - "github.com/ditrit/badaas/utils" "github.com/spf13/viper" "go.uber.org/zap" + + "github.com/ditrit/badaas/utils" ) // The config keys regarding the database settings @@ -26,11 +27,13 @@ type DBDialector string const ( PostgreSQL DBDialector = "postgresql" MySQL DBDialector = "mysql" + SQLite DBDialector = "sqlite" ) var DBDialectors = []string{ string(PostgreSQL), string(MySQL), + string(SQLite), } // Hold the configuration values for the database connection diff --git a/go.mod b/go.mod index e81cb255..3f342e87 100644 --- a/go.mod +++ b/go.mod @@ -21,6 +21,7 @@ require ( golang.org/x/crypto v0.9.0 gorm.io/driver/mysql v1.5.1 gorm.io/driver/postgres v1.5.2 + gorm.io/driver/sqlite v1.5.1 gorm.io/gorm v1.25.1 gotest.tools v2.2.0+incompatible ) @@ -43,6 +44,7 @@ require ( github.com/jinzhu/now v1.1.5 // indirect github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect + github.com/mattn/go-sqlite3 v1.14.16 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect diff --git a/go.sum b/go.sum index 29d494dd..e9e5c8bb 100644 --- a/go.sum +++ b/go.sum @@ -238,6 +238,8 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -674,6 +676,8 @@ gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= +gorm.io/driver/sqlite v1.5.1 h1:hYyrLkAWE71bcarJDPdZNTLWtr8XrSjOWyjUYI6xdL4= +gorm.io/driver/sqlite v1.5.1/go.mod h1:7MZZ2Z8bqyfSQA1gYEV6MagQWj3cpUkJj9Z+d1HEMEQ= gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index ae3407cc..1b5d2282 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -3,10 +3,11 @@ package gormdatabase import ( "fmt" - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/configuration" "go.uber.org/zap" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/configuration" ) // Create the dsn string from the configuration @@ -26,10 +27,13 @@ func createDialectorFromConf(databaseConfiguration configuration.DatabaseConfigu databaseConfiguration.GetHost(), databaseConfiguration.GetUsername(), databaseConfiguration.GetPassword(), - databaseConfiguration.GetSSLMode(), databaseConfiguration.GetDBName(), databaseConfiguration.GetPort(), ), nil + case configuration.SQLite: + return badorm.CreateSQLiteDialector( + databaseConfiguration.GetHost(), + ), nil default: return nil, fmt.Errorf("unknown dialector: %s", databaseConfiguration.GetDialector()) } diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index 172c75fb..35c2d5b1 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -6,16 +6,17 @@ import ( "testing" "time" - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/logger" - "github.com/ditrit/badaas/testintegration/models" "github.com/spf13/viper" "github.com/stretchr/testify/suite" "go.uber.org/fx" "go.uber.org/fx/fxevent" "go.uber.org/zap" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/logger" + "github.com/ditrit/badaas/testintegration/models" ) const dbTypeEnvKey = "DB" @@ -105,7 +106,13 @@ func NewGormDBConnection(logger *zap.Logger) (*gorm.DB, error) { case configuration.MySQL: return badorm.ConnectToDialector( logger, - badorm.CreateMySQLDialector(host, username, password, sslMode, dbName, port), + badorm.CreateMySQLDialector(host, username, password, dbName, port), + 10, time.Duration(5)*time.Second, + ) + case configuration.SQLite: + return badorm.ConnectToDialector( + logger, + badorm.CreateSQLiteDialector(host), 10, time.Duration(5)*time.Second, ) default: From ea9ebba5c6ddb133bdf3aa0dde6137180240dddc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 8 Jun 2023 15:48:52 +0200 Subject: [PATCH 311/467] fix sqlite int tests no need docker --- .github/workflows/CI.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 98f177a2..9805fd2b 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -106,6 +106,7 @@ jobs: run: go install gotest.tools/gotestsum@latest - name: Start containers run: docker compose -f "docker/${{ matrix.db }}/docker-compose.yml" up -d + if: ${{ matrix.db != 'sqlite' }} - uses: kanga333/variable-mapper@master id: export with: From da8f73f470ca95b12481966fa1833d4e20bb6533 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 8 Jun 2023 15:53:19 +0200 Subject: [PATCH 312/467] fix sqlite int tests no need docker on stop also --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 9805fd2b..9ec8cdd1 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -141,7 +141,7 @@ jobs: name: coverage_int_${{ matrix.db }} path: coverage_int_${{ matrix.db }}.out - name: Stop containers - if: always() + if: ${{ matrix.db != 'sqlite' }} run: docker stop badaas-test-db e2e-tests: From 1af8507b8c62891e7d24d49aff4413967e54f53c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 8 Jun 2023 16:01:33 +0200 Subject: [PATCH 313/467] add support for mssqlserver --- .github/workflows/CI.yml | 7 ++- Makefile | 9 +++- badorm/baseModels.go | 2 +- badorm/db.go | 16 +++++++ badorm/uuid.go | 9 ++-- configuration/DatabaseConfiguration.go | 2 + docker/mysql/docker-compose.yml | 2 +- docker/postgresql/docker-compose.yml | 2 +- docker/sqlserver/Dockerfile | 23 +++++++++ docker/sqlserver/configure-db.sh | 23 +++++++++ docker/sqlserver/docker-compose.yml | 16 +++++++ docker/sqlserver/entrypoint.sh | 10 ++++ docker/sqlserver/setup.sql | 10 ++++ docker/test_api/badaas.yml | 2 +- go.mod | 4 ++ go.sum | 48 +++++++++++++++++++ persistence/gormdatabase/db.go | 8 ++++ persistence/repository/EntityRepository.go | 17 ++++--- .../repository/EntityRepository_test.go | 9 ++-- testintegration/badaas_test.go | 9 ++-- testintegration/badorm_test.go | 8 +++- testintegration/eavService.go | 9 ++-- testintegration/int_test_config.yml | 2 +- testintegration/models/models.go | 24 +++++----- testintegration/models/mysql.go | 19 ++++++++ testintegration/models/others.go | 18 +++++++ 26 files changed, 266 insertions(+), 42 deletions(-) create mode 100644 docker/sqlserver/Dockerfile create mode 100644 docker/sqlserver/configure-db.sh create mode 100644 docker/sqlserver/docker-compose.yml create mode 100644 docker/sqlserver/entrypoint.sh create mode 100644 docker/sqlserver/setup.sql create mode 100644 testintegration/models/mysql.go create mode 100644 testintegration/models/others.go diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 9ec8cdd1..1e71b5a4 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -93,7 +93,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - db: [postgresql, cockroachdb, mysql, sqlite] + db: [postgresql, cockroachdb, mysql, sqlite, sqlserver] steps: - uses: actions/checkout@v3 with: @@ -124,11 +124,14 @@ jobs: }, "sqlite": { "dialector": "sqlite" + }, + "sqlserver": { + "dialector": "sqlserver" } } export_to: env - name: Run test - run: DB=${{ env.dialector }} gotestsum --junitfile integration-tests-${{ matrix.db }}.xml ./testintegration -coverpkg=./... -coverprofile=coverage_int_${{ matrix.db }}.out + run: DB=${{ env.dialector }} gotestsum --junitfile integration-tests-${{ matrix.db }}.xml ./testintegration -tags=${{ matrix.db }} -coverpkg=./... -coverprofile=coverage_int_${{ matrix.db }}.out - name: Test Report uses: dorny/test-reporter@v1 if: always() # run this step even if previous steps failed diff --git a/Makefile b/Makefile index 48e55159..d28f3802 100644 --- a/Makefile +++ b/Makefile @@ -35,6 +35,10 @@ mysql: docker compose -f "docker/mysql/docker-compose.yml" up -d ./docker/wait_for_db.sh +sqlserver: + docker compose -f "docker/sqlserver/docker-compose.yml" up -d --build + ./docker/wait_for_db.sh + test_integration_postgresql: postgresql DB=postgresql gotestsum --format testname ./testintegration @@ -42,11 +46,14 @@ test_integration_cockroachdb: cockroachdb DB=postgresql gotestsum --format testname ./testintegration test_integration_mysql: mysql - DB=mysql gotestsum --format testname ./testintegration + DB=mysql gotestsum --format testname ./testintegration -tags=mysql test_integration_sqlite: DB=sqlite gotestsum --format testname ./testintegration +test_integration_sqlserver: sqlserver + DB=sqlserver gotestsum --format testname ./testintegration + test_integration: test_integration_postgresql test_e2e: diff --git a/badorm/baseModels.go b/badorm/baseModels.go index c62fb2e9..2efd7c69 100644 --- a/badorm/baseModels.go +++ b/badorm/baseModels.go @@ -18,7 +18,7 @@ type BadaasID interface { // Every model intended to be saved in the database must embed this badorm.UUIDModel // reference: https://gorm.io/docs/models.html#gorm-Model type UUIDModel struct { - ID UUID `gorm:"primarykey;"` + ID UUID `gorm:"primarykey;not null"` CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt `gorm:"index"` diff --git a/badorm/db.go b/badorm/db.go index f081f770..6daed82d 100644 --- a/badorm/db.go +++ b/badorm/db.go @@ -8,6 +8,7 @@ import ( "gorm.io/driver/mysql" "gorm.io/driver/postgres" "gorm.io/driver/sqlite" + "gorm.io/driver/sqlserver" "gorm.io/gorm" "github.com/ditrit/badaas/persistence/gormdatabase/gormzap" @@ -47,6 +48,21 @@ func CreateSQLiteDSN(path string) string { return fmt.Sprintf("sqlite:%s", path) } +func CreateSQLServerDialector(host, username, password, dbname string, port int) gorm.Dialector { + return sqlserver.Open(CreateSQLServerDSN(host, username, password, dbname, port)) +} + +func CreateSQLServerDSN(host, username, password, dbname string, port int) string { + return fmt.Sprintf( + "sqlserver://%s:%s@%s:%d?database=%s", + username, + password, + host, + port, + dbname, + ) +} + func ConnectToDialector( logger *zap.Logger, dialector gorm.Dialector, diff --git a/badorm/uuid.go b/badorm/uuid.go index 9d8a0fd7..e500cb0e 100644 --- a/badorm/uuid.go +++ b/badorm/uuid.go @@ -22,6 +22,8 @@ func (id UUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { return "uuid" case "sqlite": return "varchar(36)" + case "sqlserver": + return "uniqueidentifier" } return "" } @@ -67,12 +69,13 @@ func (id UUID) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { return gorm.Expr("NULL") } - if db.Dialector.Name() == "mysql" { + switch db.Dialector.Name() { + case "mysql", "sqlserver": binary, _ := id.MarshalBinary() return gorm.Expr("?", binary) + default: + return gorm.Expr("?", id.String()) } - - return gorm.Expr("?", id.String()) } func (id UUID) Value() (driver.Value, error) { diff --git a/configuration/DatabaseConfiguration.go b/configuration/DatabaseConfiguration.go index 2d1ecacf..4458933c 100644 --- a/configuration/DatabaseConfiguration.go +++ b/configuration/DatabaseConfiguration.go @@ -28,12 +28,14 @@ const ( PostgreSQL DBDialector = "postgresql" MySQL DBDialector = "mysql" SQLite DBDialector = "sqlite" + SQLServer DBDialector = "sqlserver" ) var DBDialectors = []string{ string(PostgreSQL), string(MySQL), string(SQLite), + string(SQLServer), } // Hold the configuration values for the database connection diff --git a/docker/mysql/docker-compose.yml b/docker/mysql/docker-compose.yml index 1fba01fc..bcc350ad 100644 --- a/docker/mysql/docker-compose.yml +++ b/docker/mysql/docker-compose.yml @@ -9,7 +9,7 @@ services: MYSQL_ALLOW_EMPTY_PASSWORD: "true" MYSQL_DATABASE: 'badaas_db' MYSQL_USER: 'badaas' - MYSQL_PASSWORD: 'badaas' + MYSQL_PASSWORD: 'badaas_password2023' ports: - '5000:3306' healthcheck: diff --git a/docker/postgresql/docker-compose.yml b/docker/postgresql/docker-compose.yml index a24f3d51..f21a2b2a 100644 --- a/docker/postgresql/docker-compose.yml +++ b/docker/postgresql/docker-compose.yml @@ -7,7 +7,7 @@ services: image: postgres:latest environment: POSTGRES_USER: badaas - POSTGRES_PASSWORD: badaas + POSTGRES_PASSWORD: badaas_password2023 POSTGRES_DB: badaas_db PGDATA: /data/postgres ports: diff --git a/docker/sqlserver/Dockerfile b/docker/sqlserver/Dockerfile new file mode 100644 index 00000000..fd8f9d79 --- /dev/null +++ b/docker/sqlserver/Dockerfile @@ -0,0 +1,23 @@ +FROM mcr.microsoft.com/mssql/server:2022-latest + +USER root + +# Create a config directory +RUN mkdir -p /usr/config +WORKDIR /usr/config + +# Bundle config source +COPY entrypoint.sh /usr/config/ +COPY configure-db.sh /usr/config/ +COPY setup.sql /usr/config/ + +# Grant permissions for to our scripts to be executable +RUN chmod +x /usr/config/entrypoint.sh +RUN chmod +x /usr/config/configure-db.sh + +ENTRYPOINT ["./entrypoint.sh"] + +# Tail the setup logs to trap the process +CMD ["tail -f /dev/null"] + +HEALTHCHECK --interval=15s CMD /opt/mssql-tools/bin/sqlcmd -U sa -P $MSSQL_SA_PASSWORD -Q "select 1" && grep -q "MSSQL CONFIG COMPLETE" ./config.log \ No newline at end of file diff --git a/docker/sqlserver/configure-db.sh b/docker/sqlserver/configure-db.sh new file mode 100644 index 00000000..fc3c2f66 --- /dev/null +++ b/docker/sqlserver/configure-db.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# wait for MSSQL server to start +export STATUS=1 +i=0 + +while [[ $STATUS -ne 0 ]] && [[ $i -lt 60 ]]; do + i=$i+1 + /opt/mssql-tools/bin/sqlcmd -t 1 -U sa -P $MSSQL_SA_PASSWORD -Q "select 1" >> /dev/null + STATUS=$? + sleep 1 +done + +if [ $STATUS -ne 0 ]; then + echo "---------------------------- Error: MSSQL SERVER took more than 60 seconds to start up. ----------------------------------------------" + exit 1 +fi + +echo "======= MSSQL SERVER STARTED ========" | tee -a ./config.log +# Run the setup script to create the DB and the schema in the DB +/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $MSSQL_SA_PASSWORD -d master -i setup.sql + +echo "======= MSSQL CONFIG COMPLETE =======" | tee -a ./config.log \ No newline at end of file diff --git a/docker/sqlserver/docker-compose.yml b/docker/sqlserver/docker-compose.yml new file mode 100644 index 00000000..192f3ac4 --- /dev/null +++ b/docker/sqlserver/docker-compose.yml @@ -0,0 +1,16 @@ +# DEVELOPMENT ONLY, DO NOT USE FOR PRODUCTION +version: "3.5" + +services: + db: + container_name: "badaas-test-db" + build: . + image: badaas/mssqlserver:latest + ports: + - "5000:1433" + environment: + MSSQL_SA_PASSWORD: "badaas2023!" + ACCEPT_EULA: "Y" + MSSQL_DB: badaas_db + MSSQL_USER: badaas + MSSQL_PASSWORD: badaas_password2023 \ No newline at end of file diff --git a/docker/sqlserver/entrypoint.sh b/docker/sqlserver/entrypoint.sh new file mode 100644 index 00000000..98830030 --- /dev/null +++ b/docker/sqlserver/entrypoint.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Start SQL Server +/opt/mssql/bin/sqlservr & + +# Start the script to create the DB and user +/usr/config/configure-db.sh + +# Call extra command +eval $1 \ No newline at end of file diff --git a/docker/sqlserver/setup.sql b/docker/sqlserver/setup.sql new file mode 100644 index 00000000..8ff68fd1 --- /dev/null +++ b/docker/sqlserver/setup.sql @@ -0,0 +1,10 @@ +CREATE DATABASE $(MSSQL_DB); +GO +USE $(MSSQL_DB); +GO +CREATE LOGIN $(MSSQL_USER) WITH PASSWORD = '$(MSSQL_PASSWORD)'; +GO +CREATE USER $(MSSQL_USER) FOR LOGIN $(MSSQL_USER); +GO +ALTER SERVER ROLE sysadmin ADD MEMBER [$(MSSQL_USER)]; +GO \ No newline at end of file diff --git a/docker/test_api/badaas.yml b/docker/test_api/badaas.yml index cf36ff4a..8e583e9f 100644 --- a/docker/test_api/badaas.yml +++ b/docker/test_api/badaas.yml @@ -11,7 +11,7 @@ database: port: 26257 sslmode: disable username: badaas - password: badaas + password: badaas_password2023 name: badaas_db init: retry: 10 diff --git a/go.mod b/go.mod index 3f342e87..41384ae1 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( gorm.io/driver/mysql v1.5.1 gorm.io/driver/postgres v1.5.2 gorm.io/driver/sqlite v1.5.1 + gorm.io/driver/sqlserver v1.5.0 gorm.io/gorm v1.25.1 gotest.tools v2.2.0+incompatible ) @@ -30,6 +31,8 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/goph/emperror v0.17.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -45,6 +48,7 @@ require ( github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect github.com/mattn/go-sqlite3 v1.14.16 // indirect + github.com/microsoft/go-mssqldb v0.21.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect diff --git a/go.sum b/go.sum index e9e5c8bb..b8872a44 100644 --- a/go.sum +++ b/go.sum @@ -36,6 +36,11 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= @@ -70,6 +75,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/ditrit/verdeter v0.4.0 h1:DzEOFauuXEGNQYP6OgYtHwEyb3w9riem99u0xE/l7+o= github.com/ditrit/verdeter v0.4.0/go.mod h1:sKpWuOvYqNabLN4aNXqeBhcWpt7nf0frwqk0B5M6ax0= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/elliotchance/pie/v2 v2.5.2 h1:jRENMmysCljhUmyT8ITKV0Atp6Lukm3XpeqaI87POsM= github.com/elliotchance/pie/v2 v2.5.2/go.mod h1:18t0dgGFH006g4eVdDtWfgFZPQEgl10IoEO8YWEq3Og= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -92,6 +99,12 @@ github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -144,6 +157,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -155,6 +169,9 @@ github.com/goph/emperror v0.17.2 h1:yLapQcmEsO0ipe9p5TaN22djm3OFV/TfM/fcYP0/J18= github.com/goph/emperror v0.17.2/go.mod h1:+ZbQ+fUNO/6FNiUo0ujtMjhgad9Xa6fQL9KhH4LNHic= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -205,6 +222,12 @@ github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -222,6 +245,7 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= @@ -242,10 +266,14 @@ github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwp github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= +github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61 h1:8HaKr2WO2B5XKEFbJE9Z7W8mWC6+dL3jZCw53Dbl0oI= github.com/noirbizarre/gonja v0.0.0-20200629003239-4d051fd0be61/go.mod h1:WboHq+I9Ck8PwKsVFJNrpiRyngXhquRSTWBGwuSWOrg= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -253,6 +281,8 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -298,6 +328,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -345,12 +376,16 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= @@ -418,12 +453,14 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -484,10 +521,14 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -666,10 +707,15 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= @@ -678,6 +724,8 @@ gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= gorm.io/driver/sqlite v1.5.1 h1:hYyrLkAWE71bcarJDPdZNTLWtr8XrSjOWyjUYI6xdL4= gorm.io/driver/sqlite v1.5.1/go.mod h1:7MZZ2Z8bqyfSQA1gYEV6MagQWj3cpUkJj9Z+d1HEMEQ= +gorm.io/driver/sqlserver v1.5.0 h1:zol7ePfY1XiPfjEvjjBh4VatIF3kycNcPE0EMCXznHY= +gorm.io/driver/sqlserver v1.5.0/go.mod h1:tBAqioK34BHl0Iiez+BFfG5/K9nDAlhLxRkgc2qy3+4= gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index 1b5d2282..22830781 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -34,6 +34,14 @@ func createDialectorFromConf(databaseConfiguration configuration.DatabaseConfigu return badorm.CreateSQLiteDialector( databaseConfiguration.GetHost(), ), nil + case configuration.SQLServer: + return badorm.CreateSQLServerDialector( + databaseConfiguration.GetHost(), + databaseConfiguration.GetUsername(), + databaseConfiguration.GetPassword(), + databaseConfiguration.GetDBName(), + databaseConfiguration.GetPort(), + ), nil default: return nil, fmt.Errorf("unknown dialector: %s", databaseConfiguration.GetDialector()) } diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index 0932c118..ee354a64 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -5,13 +5,14 @@ import ( "time" sq "github.com/Masterminds/squirrel" - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/models" "github.com/elliotchance/pie/v2" "github.com/google/uuid" "go.uber.org/zap" "gorm.io/driver/postgres" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/persistence/models" ) type EntityRepository struct { @@ -68,7 +69,6 @@ func (r *EntityRepository) Create(tx *gorm.DB, entity *models.Entity) error { Columns("id", "created_at", "updated_at", "entity_type_id"). Values(entity.ID, now, now, entity.EntityType.ID). PlaceholderFormat(sq.Dollar).ToSql() - if err != nil { return err } @@ -100,6 +100,7 @@ func (r *EntityRepository) AddValueCheckToQuery(query *gorm.DB, attributeName st // Adds to the "query" the verification that the value for "attribute" is "expectedValue" func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attributeName string, expectedValue any, entitiesTableSuffix string) error { attributesSuffix := entitiesTableSuffix + "_" + attributeName + queryArgs := []any{attributeName} stringQuery := fmt.Sprintf( `JOIN attributes attributes%[1]s ON attributes%[1]s.entity_type_id = entities%[2]s.entity_type_id @@ -118,21 +119,25 @@ func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attribut getQueryCheckValueOfType(attributesSuffix, models.IntValueType), getQueryCheckValueOfType(attributesSuffix, models.FloatValueType), ) + queryArgs = append(queryArgs, expectedValue, expectedValue) case bool: stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.BooleanValueType) + queryArgs = append(queryArgs, expectedValue) case string: uuid, err := badorm.ParseUUID(expectedValueTyped) if err == nil { - expectedValue = uuid stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.RelationValueType) + queryArgs = append(queryArgs, uuid) } else { stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.StringValueType) + queryArgs = append(queryArgs, expectedValue) } case nil: stringQuery += fmt.Sprintf( - "AND values%s.is_null = true", + "AND values%[1]s.is_null = ?", attributesSuffix, ) + queryArgs = append(queryArgs, true) case map[string]any: return r.addJoinToQuery( query, attributeName, expectedValueTyped, @@ -142,7 +147,7 @@ func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attribut return fmt.Errorf("unsupported type") } - query.Joins(stringQuery, attributeName, expectedValue, expectedValue) + query.Joins(stringQuery, queryArgs...) return nil } diff --git a/persistence/repository/EntityRepository_test.go b/persistence/repository/EntityRepository_test.go index b3940d13..3fa7d410 100644 --- a/persistence/repository/EntityRepository_test.go +++ b/persistence/repository/EntityRepository_test.go @@ -6,12 +6,13 @@ import ( "testing" "github.com/DATA-DOG/go-sqlmock" - "github.com/ditrit/badaas/persistence/models" "github.com/google/uuid" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" "gorm.io/driver/postgres" "gorm.io/gorm" + + "github.com/ditrit/badaas/persistence/models" ) type EntityRepositorySuite struct { @@ -132,10 +133,10 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForNil() { JOIN values_ values_attrName ON values_attrName.attribute_id = attributes_attrName.id AND values_attrName.entity_id = entities.id AND - values_attrName.is_null = true - WHERE entities.entity_type_id = $2 AND + values_attrName.is_null = $2 + WHERE entities.entity_type_id = $3 AND "entities"."deleted_at" IS NULL`)). - WithArgs(attributeName, s.uuid). + WithArgs(attributeName, true, s.uuid). WillReturnRows(sqlmock.NewRows(nil)) s.execQuery(AttributeNameAndValue{attributeName, nil}) diff --git a/testintegration/badaas_test.go b/testintegration/badaas_test.go index 5dfd304f..77099490 100644 --- a/testintegration/badaas_test.go +++ b/testintegration/badaas_test.go @@ -7,10 +7,6 @@ import ( "runtime" "testing" - "github.com/ditrit/badaas" - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/services" - "github.com/ditrit/verdeter" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/stretchr/testify/suite" @@ -18,6 +14,11 @@ import ( "go.uber.org/fx/fxevent" "go.uber.org/zap" "gorm.io/gorm" + + "github.com/ditrit/badaas" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/services" + "github.com/ditrit/verdeter" ) var tGlobal *testing.T diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index 35c2d5b1..077f1b56 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -23,7 +23,7 @@ const dbTypeEnvKey = "DB" const ( username = "badaas" - password = "badaas" + password = "badaas_password2023" host = "localhost" port = 5000 sslMode = "disable" @@ -115,6 +115,12 @@ func NewGormDBConnection(logger *zap.Logger) (*gorm.DB, error) { badorm.CreateSQLiteDialector(host), 10, time.Duration(5)*time.Second, ) + case configuration.SQLServer: + return badorm.ConnectToDialector( + logger, + badorm.CreateSQLServerDialector(host, username, password, dbName, port), + 10, time.Duration(5)*time.Second, + ) default: return nil, fmt.Errorf("unknown db %s", dbType) } diff --git a/testintegration/eavService.go b/testintegration/eavService.go index dd8401b8..86088217 100644 --- a/testintegration/eavService.go +++ b/testintegration/eavService.go @@ -3,15 +3,16 @@ package testintegration import ( "fmt" + "github.com/elliotchance/pie/v2" + "github.com/google/uuid" + "github.com/stretchr/testify/suite" + "gorm.io/gorm" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services" "github.com/ditrit/badaas/utils" - "github.com/elliotchance/pie/v2" - "github.com/google/uuid" - "github.com/stretchr/testify/suite" - "gorm.io/gorm" ) type EAVServiceIntTestSuite struct { diff --git a/testintegration/int_test_config.yml b/testintegration/int_test_config.yml index 6d4e7d30..e188e00b 100644 --- a/testintegration/int_test_config.yml +++ b/testintegration/int_test_config.yml @@ -3,7 +3,7 @@ database: port: 5000 sslmode: disable username: badaas - password: badaas + password: badaas_password2023 name: badaas_db init: retry: 10 diff --git a/testintegration/models/models.go b/testintegration/models/models.go index a46bd0ef..d932936b 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -5,6 +5,9 @@ import ( "fmt" "strings" + "gorm.io/gorm" + "gorm.io/gorm/schema" + "github.com/ditrit/badaas/badorm" ) @@ -46,6 +49,15 @@ func (MultiString) GormDataType() string { return "text" } +func (MultiString) GormDBDataType(db *gorm.DB, field *schema.Field) string { + switch db.Dialector.Name() { + case "sqlserver": + return "varchar(255)" + default: + return "text" + } +} + type ToBeEmbedded struct { EmbeddedInt int } @@ -124,18 +136,6 @@ func (m City) Equal(other City) bool { return m.Name == other.Name } -type Employee struct { - badorm.UUIDModel - - Name string - Boss *Employee `gorm:"constraint:OnDelete:SET NULL;"` // Self-Referential Has One (Employee 0..* -> 0..1 Employee) - BossID *badorm.UUID -} - -func (m Employee) Equal(other Employee) bool { - return m.Name == other.Name -} - type Person struct { badorm.UUIDModel diff --git a/testintegration/models/mysql.go b/testintegration/models/mysql.go new file mode 100644 index 00000000..1333a9d8 --- /dev/null +++ b/testintegration/models/mysql.go @@ -0,0 +1,19 @@ +//go:build mysql +// +build mysql + +package models + +import "github.com/ditrit/badaas/badorm" + +type Employee struct { + badorm.UUIDModel + + Name string + // mysql needs OnDelete to work with self-referential fk + Boss *Employee `gorm:"constraint:OnDelete:SET NULL"` // Self-Referential Has One (Employee 0..* -> 0..1 Employee) + BossID *badorm.UUID +} + +func (m Employee) Equal(other Employee) bool { + return m.Name == other.Name +} diff --git a/testintegration/models/others.go b/testintegration/models/others.go new file mode 100644 index 00000000..4957724c --- /dev/null +++ b/testintegration/models/others.go @@ -0,0 +1,18 @@ +//go:build !mysql +// +build !mysql + +package models + +import "github.com/ditrit/badaas/badorm" + +type Employee struct { + badorm.UUIDModel + + Name string + Boss *Employee // Self-Referential Has One (Employee 0..* -> 0..1 Employee) + BossID *badorm.UUID +} + +func (m Employee) Equal(other Employee) bool { + return m.Name == other.Name +} From 126c83442d5c323caff43c8d65638c6413d84272 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 8 Jun 2023 16:23:57 +0200 Subject: [PATCH 314/467] avoid be root in mssqlserver container --- docker/sqlserver/Dockerfile | 6 ------ docker/sqlserver/configure-db.sh | 0 docker/sqlserver/entrypoint.sh | 0 3 files changed, 6 deletions(-) mode change 100644 => 100755 docker/sqlserver/configure-db.sh mode change 100644 => 100755 docker/sqlserver/entrypoint.sh diff --git a/docker/sqlserver/Dockerfile b/docker/sqlserver/Dockerfile index fd8f9d79..37d2be04 100644 --- a/docker/sqlserver/Dockerfile +++ b/docker/sqlserver/Dockerfile @@ -1,7 +1,5 @@ FROM mcr.microsoft.com/mssql/server:2022-latest -USER root - # Create a config directory RUN mkdir -p /usr/config WORKDIR /usr/config @@ -11,10 +9,6 @@ COPY entrypoint.sh /usr/config/ COPY configure-db.sh /usr/config/ COPY setup.sql /usr/config/ -# Grant permissions for to our scripts to be executable -RUN chmod +x /usr/config/entrypoint.sh -RUN chmod +x /usr/config/configure-db.sh - ENTRYPOINT ["./entrypoint.sh"] # Tail the setup logs to trap the process diff --git a/docker/sqlserver/configure-db.sh b/docker/sqlserver/configure-db.sh old mode 100644 new mode 100755 diff --git a/docker/sqlserver/entrypoint.sh b/docker/sqlserver/entrypoint.sh old mode 100644 new mode 100755 From 510ab2a2e8ccfa5fd2c0dc06800e5c1376b83b7c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 8 Jun 2023 17:09:54 +0200 Subject: [PATCH 315/467] remove TODO --- testintegration/models/models.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/testintegration/models/models.go b/testintegration/models/models.go index d932936b..8ad5b8f1 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -11,10 +11,6 @@ import ( "github.com/ditrit/badaas/badorm" ) -// TODO testear tambien en otras bases de datos - -// TODO todas las clases badorm tienen sus conditions, repository and service - type Company struct { badorm.UUIDModel From 3759b21b2f953e22d75a6d78d56cfa0a9a10343b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 8 Jun 2023 17:10:50 +0200 Subject: [PATCH 316/467] fix not use root user in sqlserver --- docker/sqlserver/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker/sqlserver/Dockerfile b/docker/sqlserver/Dockerfile index 37d2be04..d54ef6cc 100644 --- a/docker/sqlserver/Dockerfile +++ b/docker/sqlserver/Dockerfile @@ -1,5 +1,7 @@ FROM mcr.microsoft.com/mssql/server:2022-latest +USER mssql + # Create a config directory RUN mkdir -p /usr/config WORKDIR /usr/config From cf3141d6698ad221a8964b980f9e2461d4cc9761 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 8 Jun 2023 17:11:52 +0200 Subject: [PATCH 317/467] update docs --- CONTRIBUTING.md | 10 +++++----- badorm/README.md | 43 ++++++++++++++++++++++++++++++++++++------ changelog.md | 2 ++ tools/badctl/README.md | 13 ++++++++++--- 4 files changed, 54 insertions(+), 14 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f17c7da7..6cc053ed 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,7 +5,7 @@ - [Dependencies](#dependencies) - [Unit tests](#unit-tests) - [Integration tests](#integration-tests) - - [Feature tests (of end to end tests)](#feature-tests-of-end-to-end-tests) + - [Feature tests (or end to end tests)](#feature-tests-or-end-to-end-tests) - [Logger](#logger) - [Directory structure](#directory-structure) - [Git](#git) @@ -31,15 +31,15 @@ make -k test_unit ### Integration tests -Integration tests have available a CockroachDB node and the dependency injection system. - -Run: +Integration tests have a database and the dependency injection system. BaDaaS and BaDORM are tested on multiple databases (those supported by gorm, which is the base of BaDORM). By default, the database used will be postgresql: ```sh make test_integration ``` -### Feature tests (of end to end tests) +To run the tests on another database you can use: `make test_integration_postgresql`, `make test_integration_cockroachdb`, `make test_integration_mysql`, `make test_integration_sqlite`, `make test_integration_sqlserver`. All of them will be verified by our continuous integration system. + +### Feature tests (or end to end tests) We use docker to run a Badaas instance in combination with one node of CockroachDB. diff --git a/badorm/README.md b/badorm/README.md index 7f7fe11c..489015c8 100644 --- a/badorm/README.md +++ b/badorm/README.md @@ -10,7 +10,9 @@ BaDorm can be used both within a BaDaaS application and as a stand-alone applica - [BaDaaS Example](#badaas-example) - [Step-by-step instructions](#step-by-step-instructions) - [Provided functionalities](#provided-functionalities) + - [Base models](#base-models) - [CRUDServiceModule](#crudservicemodule) + - [CRUDUnsafeServiceModule](#crudunsafeservicemodule) ## Quickstart @@ -49,17 +51,17 @@ func main() { // activate BaDORM badorm.BaDORMModule, // start example data - badorm.GetCRUDServiceModule[models.Company, uuid.UUID](), - badorm.GetCRUDServiceModule[models.Product, uuid.UUID](), - badorm.GetCRUDServiceModule[models.Seller, uuid.UUID](), - badorm.GetCRUDServiceModule[models.Sale, uuid.UUID](), + badorm.GetCRUDServiceModule[models.Company](), + badorm.GetCRUDServiceModule[models.Product](), + badorm.GetCRUDServiceModule[models.Seller](), + badorm.GetCRUDServiceModule[models.Sale](), fx.Provide(CreateCRUDObjects), fx.Invoke(QueryCRUDObjects), ).Run() } ``` -There are some things you need to provide to the BaDorm module: +There are some things you need to provide to the BaDORM module: - `NewLogger` is the function that provides a zap logger to the BaDorm components. - `NewGORMDBConnection` if the function that establish the connection to the database where you data will be saved. @@ -70,9 +72,38 @@ Finally, you can call your application functions as `CreateCRUDObjects` and `Que ## Provided functionalities +### Base models + +BaDORM gives you two types of base models for your classes: `badorm.UUIDModel` and `badorm.UIntModel`. + +To use them, simply embed the desired model in any of your classes: + +```go +type MyClass struct { + badorm.UUIDModel + + // your code here +} +``` + +Once done your class will be considered a **BaDORM Model**. + +The difference between them is the type they will use as primary key: a random uuid and an auto incremental uint respectively. Both provide date created, edited and deleted (). + ### CRUDServiceModule -`CRUDServiceModule` provides you a CRUDService, a CRUDRepository for your model class and registers it. After calling it as, for example, `badorm.GetCRUDServiceModule[models.Company, uuid.UUID](),` the following can be used by dependency injection: +`CRUDServiceModule` provides you a CRUDService and a CRUDRepository for your BaDORM Model. After calling it as, for example, `badorm.GetCRUDServiceModule[models.Company](),` the following can be used by dependency injection: - `crudCompanyService badorm.CRUDService[models.Company, uuid.UUID]` - `crudCompanyRepository badorm.CRUDRepository[models.Company, uuid.UUID]` + +These classes will allow you to perform queries using the compilable query system generated with BaDctl. For details on how to do this visit [badctl docs](github.com/ditrit/badaas/tools/badctl/README.md#gen-conditions). + +### CRUDUnsafeServiceModule + +`CRUDUnsafeServiceModule` provides you a CRUDUnsafeService and a CRUDUnsafeRepository for your BaDORM Model. After calling it as, for example, `badorm.GetCRUDUnsafeServiceModule[models.Company](),` the following can be used by dependency injection: + +- `crudCompanyService badorm.CRUDUnsafeService[models.Company, uuid.UUID]` +- `crudCompanyRepository badorm.CRUDUnsafeRepository[models.Company, uuid.UUID]` + +These classes will allow you to perform queries using maps as conditions. **Its direct use is not recommended**, since using the compilable query system we can make sure that the query is correct at compile time, while here errors will happen at runtime in case your condition map is not well structured. This functionality is used internally by BaDaaS to provide an http api for queries. diff --git a/changelog.md b/changelog.md index 30786d79..98f72b64 100644 --- a/changelog.md +++ b/changelog.md @@ -37,5 +37,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add repositories to manage querying to the database. - Transform BadAas into a library. - Add BadCtl tool. +- Add BaDORM to facilitate queries on sql databases. +- Add gen conditions to BaDctl to generate a compilable query system. [unreleased]: https://github.com/ditrit/badaas/blob/main/changelog.md#unreleased diff --git a/tools/badctl/README.md b/tools/badctl/README.md index 321d299f..ecee8f36 100644 --- a/tools/badctl/README.md +++ b/tools/badctl/README.md @@ -6,7 +6,8 @@ - [Install with go install](#install-with-go-install) - [Build from sources](#build-from-sources) - [Commands](#commands) - - [gen](#gen) + - [gen docker](#gen-docker) + - [gen conditions](#gen-conditions) - [Contributing](#contributing) ## Install with go install @@ -56,9 +57,9 @@ For more information about the functionality provided and how to use each comman badctl help [command] ``` -### gen +### gen docker -gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way. +gen docker is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way. Depending of the `db_provider` chosen `gen` will generate the docker and configuration files needed to run the application in the `badaas/docker/db` and `badaas/config` folders respectively. It will also generate docker files to run a http api in `badaas/docker/api`. @@ -72,6 +73,12 @@ A Makefile will be generated for the execution of a badaas server, with the comm make badaas_run ``` +### gen conditions + +gen conditions is the command you can use to generate conditions to query your objects using BaDORM.For each BaDORM Model found in the input packages a file containing all possible Conditions on that object will be generated, allowing you to use BaDORM in an easy way. + +Its use is recommended through `go generate`. To see an example of how to do it click [here](https://github.com/ditrit/badorm-example/blob/feature/gorm_compilable_queries/standalone/conditions/badorm.go). + ## Contributing You can make modifications to the badctl source code and compile it locally with: From fb8bdaaeac821a2cb67856d23e5863595b6b6668 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 9 Jun 2023 12:58:16 +0200 Subject: [PATCH 318/467] update lint config and lint badaas and badorm --- .golangci.yml | 262 ++++++++++-------- badaas.go | 3 +- badorm/ModuleFx.go | 6 +- badorm/baseModels.go | 2 +- badorm/condition.go | 8 +- badorm/crudRepository.go | 31 +-- badorm/crudUnsafeRepository.go | 2 + badorm/db.go | 15 +- badorm/old/SortOption.go | 27 ++ badorm/old/SortOption_test.go.txt | 14 + badorm/old/crudController.txt | 61 ++++ badorm/old/crudRepository.txt | 69 +++++ badorm/old/crudService.txt | 78 ++++++ badorm/old/pagination/Page.go | 39 +++ badorm/old/pagination/Page_test.go.txt | 145 ++++++++++ badorm/old/pagination/Paginator.go | 38 +++ badorm/old/pagination/Paginator_test.go.txt | 22 ++ badorm/uuid.go | 1 + badorm/uuid_test.go | 7 +- configuration/DatabaseCommandsInitializer.go | 1 + configuration/DatabaseConfiguration.go | 3 +- configuration/DatabaseConfiguration_test.go | 18 +- .../{ConfigurationHolder.go => Holder.go} | 2 +- configuration/HttpServerConfiguration.go | 6 +- configuration/HttpServerConfiguration_test.go | 30 +- configuration/InitializationConfiguration.go | 3 +- .../InitializationConfiguration_test.go | 4 +- configuration/LoggerCommandsInitializer.go | 1 + configuration/LoggerConfiguration.go | 3 +- configuration/LoggerConfiguration_test.go | 19 +- configuration/PaginationConfiguration.go | 3 +- configuration/PaginationConfiguration_test.go | 12 +- configuration/SessionConfiguration.go | 6 +- configuration/SessionConfiguration_test.go | 34 ++- controllers/basicAuth.go | 18 +- controllers/basicAuth_test.go | 38 ++- controllers/crud.go | 8 +- controllers/crud_test.go | 33 +-- controllers/eav.go | 11 +- controllers/eav_test.go | 85 +++--- controllers/info.go | 1 + controllers/utils.go | 11 +- httperrors/httperrors.go | 30 +- httperrors/httperrors_test.go | 131 +++++---- logger/log.go | 6 +- logger/log_test.go | 3 +- persistence/ModuleFx.go | 3 +- persistence/gormdatabase/db.go | 2 +- persistence/gormdatabase/gormzap/gormzap.go | 13 +- persistence/gormdatabase/helpers.go | 12 +- persistence/gormdatabase/helpers_test.go | 2 + persistence/models/Attribute.go | 3 +- persistence/models/Entity.go | 2 + persistence/models/Entity_test.go | 5 +- persistence/models/Session_test.go | 3 +- persistence/models/Value_test.go | 15 +- persistence/models/dto/HTTPError.go | 4 +- persistence/models/dto/LoginSuccess.go | 4 +- persistence/repository/EntityRepository.go | 10 +- .../repository/EntityRepository_test.go | 17 +- .../repository/EntityTypeRepository.go | 9 +- persistence/repository/ValueRepository.go | 8 +- router/ModuleFx.go | 4 +- .../middlewares/middlewareAuthentication.go | 7 +- router/middlewares/middlewareJson.go | 8 +- router/middlewares/middlewareLogger.go | 5 +- router/middlewares/middlewarelogger_test.go | 11 +- router/routes.go | 31 ++- router/routes_test.go | 31 ++- services/ModuleFx.go | 3 +- services/auth/protocols/basicauth/basic.go | 1 + .../auth/protocols/basicauth/basic_test.go | 4 +- services/eav.go | 13 +- services/sessionservice/session.go | 20 +- services/sessionservice/session_test.go | 73 +++-- services/sessionservice/sessionctx.go | 1 + services/sessionservice/sessionctx_test.go | 7 +- services/transaction_executor.go | 1 + services/userservice/userservice.go | 10 +- services/userservice/userservice_test.go | 15 +- testintegration/asserts.go | 5 +- testintegration/badaas_test.go | 1 + testintegration/badorm_test.go | 10 +- testintegration/crudRepository.go | 49 +--- testintegration/crudService.go | 13 +- testintegration/crudServiceCommon.go | 6 +- testintegration/crudUnsafeService_test.go | 5 +- testintegration/db_models.go | 5 +- testintegration/eavService.go | 25 +- testintegration/models/models.go | 2 + utils/math.go | 2 +- utils/slice_test.go | 13 +- utils/time_test.go | 6 +- validators/email.go | 1 + validators/email_test.go | 3 +- 95 files changed, 1259 insertions(+), 594 deletions(-) create mode 100644 badorm/old/SortOption.go create mode 100644 badorm/old/SortOption_test.go.txt create mode 100644 badorm/old/crudController.txt create mode 100644 badorm/old/crudRepository.txt create mode 100644 badorm/old/crudService.txt create mode 100644 badorm/old/pagination/Page.go create mode 100644 badorm/old/pagination/Page_test.go.txt create mode 100644 badorm/old/pagination/Paginator.go create mode 100644 badorm/old/pagination/Paginator_test.go.txt rename configuration/{ConfigurationHolder.go => Holder.go} (87%) diff --git a/.golangci.yml b/.golangci.yml index d4705090..af08728c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,51 +1,23 @@ -# WARNING: DO NOT EDIT, THIS FILE IS PROBABLY A COPY -# -# The original version of this file is located in the https://github.com/istio/common-files repo. -# If you're looking at this file in a different repo and want to make a change, please go to the -# common-files repo, make the change there and check it in. Then come back to this repo and run -# "make update-common". - -output: - # Format: colored-line-number|line-number|json|tab|checkstyle|code-climate|junit-xml|github-actions - # - # Multiple can be specified by separating them by comma, output can be provided - # for each of them by separating format name and path by colon symbol. - # Output path can be either `stdout`, `stderr` or path to the file to write to. - # Example: "checkstyle:report.json,colored-line-number" - # - # Default: colored-line-number - format: github-actions - # Print lines of code with issue. - # Default: true - print-issued-lines: false - # Print linter name in the end of issue text. - # Default: true - print-linter-name: false - # Make issues output unique by line. - # Default: true - uniq-by-line: false - # Add a prefix to the output file references. - # Default is no prefix. - path-prefix: "" - # Sort results by: filepath, line and column. - sort-results: false +# based on +# - https://github.com/istio/common-files/blob/master/files/common/config/.golangci.yml +# - https://gist.github.com/maratori/47a4d00457a92aa426dbd48a18776322 +service: + golangci-lint-version: 1.52.x # use the fixed version to not introduce new linters unexpectedly run: - tests: false # timeout for analysis, e.g. 30s, 5m, default is 1m deadline: 20m build-tags: - - integ - - integfuzz + - integ + - integfuzz # which dirs to skip: they won't be analyzed; # can use regexp here: generated.*, regexp is applied on full path; # default value is empty list, but next dirs are always skipped independently # from this option's value: - #vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ skip-dirs: - genfiles$ - vendor$ - # which files to skip: they will be analyzed, but issues from them # won't be reported. Default value is empty list, but there is # no need to include all autogenerated files, we confidently recognize @@ -53,32 +25,70 @@ run: skip-files: - ".*\\.pb\\.go" - ".*\\.gen\\.go" - linters: - disable-all: true - enable: - - deadcode - - exportloopref - - gocritic - - revive - - gosimple - - govet - - ineffassign - - lll - - misspell - - staticcheck - - structcheck - - stylecheck - - typecheck - - unconvert - - unparam - - varcheck + enable-all: true + disable: + - varnamelen + - testpackage + - thelper + - paralleltest + - nonamedreturns + - nlreturn + - ireturn + - gomnd + - gochecknoglobals + - exhaustivestruct + - exhaustruct + - exhaustive + - maligned + - scopelint + - godox + - godot + - funlen + - dogsled + - nosnakecase + - interfacer + - varcheck + - deadcode + - structcheck + - noctx + - gochecknoinits + # Deprecated but still util in some cases + # - ifshort + # - golint + # Can be util in the future for better errors + - errname + - wrapcheck + - goerr113 + # Wish activated but not time by now to solve it + - errchkjson fast: false +# TODO agregar el template que formatea bien para vscode +# All possible options can be found here https://github.com/golangci/golangci-lint/blob/master/.golangci.reference.yml linters-settings: + cyclop: + # The maximal code complexity to report. + # Default: 10 + max-complexity: 18 + # The maximal average package complexity. + # If it's higher than 0.0 (float) the check is enabled + # Default: 0.0 + package-average: 0.0 + errcheck: + # report about not checking of errors in type assetions: `a := b.(MyStruct)`; + # default is false: such cases aren't reported by default. + check-type-assertions: true + # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; + # default is false: such cases aren't reported by default. + check-blank: false govet: # report about shadowed variables check-shadowing: false + goimports: + # put imports beginning with prefix after 3rd-party packages; + # it's a comma-separated list of prefixes + local-prefixes: github.com/ditrit maligned: # print struct with more effective memory layout or not, false by default suggest-new: true @@ -88,7 +98,7 @@ linters-settings: # Setting locale to US will correct the British spelling of 'colour' to 'color'. locale: US ignore-words: - - cancelled + - cancelled lll: # max line length, lines longer will be reported. Default is 120. # '\t' is counted as 1 character by default, and can be changed with the tab-width option @@ -102,60 +112,61 @@ linters-settings: error-code: 2 warning-code: 1 rules: - - name: blank-imports - - name: context-keys-type - - name: time-naming - - name: var-declaration - - name: unexported-return - - name: errorf - - name: context-as-argument - - name: dot-imports - - name: error-return - - name: error-strings - - name: error-naming - - name: increment-decrement - - name: var-naming - - name: package-comments - - name: range - - name: receiver-naming - - name: indent-error-flow - - name: superfluous-else - - name: modifies-parameter - - name: unreachable-code - - name: struct-tag - - name: constant-logical-expr - - name: bool-literal-in-expr - - name: redefines-builtin-id - - name: imports-blacklist - - name: range-val-in-closure - - name: range-val-address - - name: waitgroup-by-value - - name: atomic - - name: call-to-gc - - name: duplicated-imports - - name: string-of-int - - name: defer - arguments: [["call-chain"]] - - name: unconditional-recursion - - name: identical-branches - # the following rules can be enabled in the future - # - name: empty-lines - # - name: confusing-results - # - name: empty-block - # - name: get-return - # - name: confusing-naming - # - name: unexported-naming - - name: early-return - # - name: unused-parameter - # - name: unnecessary-stmt - # - name: deep-exit - # - name: import-shadowing - # - name: modifies-value-receiver - # - name: unused-receiver - # - name: bare-return - # - name: flag-parameter - # - name: unhandled-error - # - name: if-return + - name: blank-imports + - name: context-keys-type + - name: time-naming + - name: var-declaration + - name: unexported-return + - name: errorf + - name: context-as-argument + - name: dot-imports + - name: error-return + - name: error-strings + - name: error-naming + - name: increment-decrement + - name: var-naming + - name: package-comments + - name: range + - name: receiver-naming + - name: indent-error-flow + - name: superfluous-else + - name: modifies-parameter + - name: unreachable-code + - name: struct-tag + - name: constant-logical-expr + - name: bool-literal-in-expr + - name: redefines-builtin-id + - name: imports-blacklist + - name: range-val-in-closure + - name: range-val-address + - name: waitgroup-by-value + - name: atomic + - name: call-to-gc + - name: duplicated-imports + - name: string-of-int + - name: defer + arguments: + - - "call-chain" + - name: unconditional-recursion + - name: identical-branches + # the following rules can be enabled in the future + - name: empty-lines + - name: confusing-results + - name: empty-block + - name: get-return + # - name: confusing-naming + - name: unexported-naming + - name: early-return + # - name: unused-parameter + - name: unnecessary-stmt + # - name: deep-exit + - name: import-shadowing + - name: modifies-value-receiver + # - name: unused-receiver + # - name: bare-return + - name: flag-parameter + - name: unhandled-error + - name: if-return unused: # treat code as a program (not a library) and report unused exported identifiers; default is false. # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: @@ -165,13 +176,17 @@ linters-settings: unparam: # call graph construction algorithm (cha, rta). In general, use cha for libraries, # and rta for programs with main packages. Default is cha. - algo: rta - + algo: cha # Inspect exported functions, default is false. Set to true if no external program/library imports your code. # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: # if it's called for subdir of a project it can't find external interfaces. All text editor integrations # with golangci-lint call it on a directory with the changed file. check-exported: false + gci: + sections: + - standard # Captures all standard packages if they do not match another section. + - default # Contains all imports that could not be matched to another section type. + - prefix(github.com/ditrit/) # Groups all imports with the specified Prefix. gocritic: enabled-checks: - appendCombine @@ -218,7 +233,6 @@ linters-settings: - unslice - valSwap - weakCond - # Unused # - yodaStyleExpr # - appendAssign @@ -237,6 +251,16 @@ linters-settings: # - unlabelStmt # - unnamedResult # - wrapperFunc + depguard: + packages-with-error-message: + - github.com/gogo/protobuf: "gogo/protobuf is deprecated, use golang/protobuf" + gosec: + includes: + # TODO ver esto, no esta dando el mismo resultado que gosec a secas + - G104 + - G401 + - G402 + - G404 issues: # List of regexps of issue texts to exclude, empty list by default. @@ -245,27 +269,25 @@ issues: # excluded by default patterns execute `golangci-lint run --help` exclude: - composite literal uses unkeyed fields - exclude-rules: # Exclude some linters from running on test files. - path: _test\.go$|^tests/|^samples/ linters: - errcheck - maligned - - # TODO(https://github.com/dominikh/go-tools/issues/732) remove this once we update + # We need to use the deprecated module since the jsonpb replacement is not backwards compatible. - linters: - staticcheck - text: "SA1019: package github.com/golang/protobuf" - + text: "SA1019: package github.com/golang/protobuf/jsonpb" + - linters: + - staticcheck + text: 'SA1019: "github.com/golang/protobuf/jsonpb"' # Independently from option `exclude` we use default exclude patterns, # it can be disabled by this option. To list all # excluded by default patterns execute `golangci-lint run --help`. # Default value for this option is true. exclude-use-default: true - # Maximum issues count per one linter. Set to 0 to disable. Default is 50. max-per-linter: 0 - # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. max-same-issues: 0 \ No newline at end of file diff --git a/badaas.go b/badaas.go index fca675e2..13691219 100644 --- a/badaas.go +++ b/badaas.go @@ -3,11 +3,12 @@ package badaas //go:generate mockery --all --keeptree import ( + "go.uber.org/fx" + "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/logger" "github.com/ditrit/badaas/persistence" "github.com/ditrit/badaas/router" - "go.uber.org/fx" ) var BadaasModule = fx.Module( diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index 46e33f86..775d7541 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -96,15 +96,15 @@ func GetCRUDUnsafeServiceModule[T any]() fx.Option { } } -type BadORMModelKind uint +type modelKind uint const ( - KindUUIDModel BadORMModelKind = iota + KindUUIDModel modelKind = iota KindUIntModel KindNotBaDORMModel ) -func getBaDORMModelKind(entity any) BadORMModelKind { +func getBaDORMModelKind(entity any) modelKind { entityType := getEntityType(entity) _, isUUIDModel := entityType.FieldByName("UUIDModel") diff --git a/badorm/baseModels.go b/badorm/baseModels.go index 2efd7c69..9a99ba5c 100644 --- a/badorm/baseModels.go +++ b/badorm/baseModels.go @@ -4,7 +4,6 @@ import ( "time" "github.com/google/uuid" - "gorm.io/gorm" ) @@ -28,6 +27,7 @@ func (model *UUIDModel) BeforeCreate(tx *gorm.DB) (err error) { if model.ID == UUID(uuid.Nil) { model.ID = UUID(uuid.New()) } + return nil } diff --git a/badorm/condition.go b/badorm/condition.go index 155eda1b..355c3869 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -30,6 +30,7 @@ type WhereCondition[T any] struct { Value any } +//nolint:unused func (condition WhereCondition[T]) interfaceVerificationMethod(t T) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] @@ -62,6 +63,8 @@ func (condition WhereCondition[T]) GetSQL(query *gorm.DB, tableName string) (str if columnName == "" { columnName = query.NamingStrategy.ColumnName(tableName, condition.Field) } + + // add column prefix once we know the column name columnName = condition.ColumnPrefix + columnName val := condition.Value @@ -89,6 +92,7 @@ type JoinCondition[T1 any, T2 any] struct { Conditions []Condition[T2] } +//nolint:unused func (condition JoinCondition[T1, T2]) interfaceVerificationMethod(t T1) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] @@ -116,13 +120,15 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // apply WhereConditions to join in "on" clause conditionsValues := []any{} isDeletedAtConditionPresent := false + for _, condition := range whereConditions { if condition.Field == DeletedAtField { isDeletedAtConditionPresent = true } + sql, values := condition.GetSQL(query, nextTableName) - joinQuery += " AND " + sql conditionsValues = append(conditionsValues, values...) + joinQuery += " AND " + sql } if !isDeletedAtConditionPresent { diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index e925930a..11b82d44 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -15,9 +15,7 @@ type CRUDRepository[T any, ID BadaasID] interface { Create(tx *gorm.DB, entity *T) error // read GetByID(tx *gorm.DB, id ID) (*T, error) - GetOptionalByID(tx *gorm.DB, id ID) (*T, error) Get(tx *gorm.DB, conditions ...Condition[T]) (*T, error) - GetOptional(tx *gorm.DB, conditions ...Condition[T]) (*T, error) GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) GetAll(tx *gorm.DB) ([]*T, error) // update @@ -59,6 +57,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) Save(tx *gorm.DB, entity *T) error // Get an object by "id" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, error) { var entity T + err := tx.First(&entity, "id = ?", id).Error if err != nil { return nil, err @@ -67,32 +66,8 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, er return &entity, nil } -// Get an object by "id" inside transaction "tx" -func (repository *CRUDRepositoryImpl[T, ID]) GetOptionalByID(tx *gorm.DB, id ID) (*T, error) { - entity, err := repository.GetByID(tx, id) - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, nil - } - - return entity, nil -} - // Get an object that matches "conditions" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Condition[T]) (*T, error) { - entity, err := repository.GetOptional(tx, conditions...) - if err != nil { - return nil, err - } - - if entity == nil { - return nil, ErrObjectNotFound - } - - return entity, nil -} - -// Get an object or nil that matches "conditions" inside transaction "tx" -func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions ...Condition[T]) (*T, error) { entities, err := repository.GetMultiple(tx, conditions...) if err != nil { return nil, err @@ -102,9 +77,9 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetOptional(tx *gorm.DB, conditions return nil, ErrMoreThanOneObjectFound } else if len(entities) == 1 { return entities[0], nil + } else { + return nil, ErrObjectNotFound } - - return nil, nil } // Get the list of objects that match "conditions" inside transaction "tx" diff --git a/badorm/crudUnsafeRepository.go b/badorm/crudUnsafeRepository.go index 82a2fcae..625f9300 100644 --- a/badorm/crudUnsafeRepository.go +++ b/badorm/crudUnsafeRepository.go @@ -134,12 +134,14 @@ func (repository *CRUDUnsafeRepositoryImpl[T, ID]) addJoinToQuery( } conditionsValues := []any{} + for attributeName, conditionValue := range thisEntityConditions { stringQuery += fmt.Sprintf( `AND %[1]s.%[2]s = ? `, tableWithSuffix, attributeName, ) + conditionsValues = append(conditionsValues, conditionValue) } diff --git a/badorm/db.go b/badorm/db.go index 6daed82d..c0a3d54f 100644 --- a/badorm/db.go +++ b/badorm/db.go @@ -2,6 +2,8 @@ package badorm import ( "fmt" + "net" + "strconv" "time" "go.uber.org/zap" @@ -35,8 +37,8 @@ func CreateMySQLDialector(host, username, password, dbname string, port int) gor func CreateMySQLDSN(host, username, password, dbname string, port int) string { return fmt.Sprintf( - "%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", - username, password, host, port, dbname, + "%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", + username, password, net.JoinHostPort(host, strconv.Itoa(port)), dbname, ) } @@ -54,11 +56,10 @@ func CreateSQLServerDialector(host, username, password, dbname string, port int) func CreateSQLServerDSN(host, username, password, dbname string, port int) string { return fmt.Sprintf( - "sqlserver://%s:%s@%s:%d?database=%s", + "sqlserver://%s:%s@%s?database=%s", username, password, - host, - port, + net.JoinHostPort(host, strconv.Itoa(port)), dbname, ) } @@ -68,9 +69,7 @@ func ConnectToDialector( dialector gorm.Dialector, retryAmount uint, retryTime time.Duration, -) (*gorm.DB, error) { - var err error - var database *gorm.DB +) (database *gorm.DB, err error) { for numberRetry := uint(0); numberRetry < retryAmount; numberRetry++ { database, err = gorm.Open(dialector, &gorm.Config{ Logger: gormzap.New(logger), diff --git a/badorm/old/SortOption.go b/badorm/old/SortOption.go new file mode 100644 index 00000000..4447b745 --- /dev/null +++ b/badorm/old/SortOption.go @@ -0,0 +1,27 @@ +package badorm + +type SortOption interface { + Column() string + Desc() bool +} + +// SortOption constructor +func NewSortOption(column string, desc bool) SortOption { + return &sortOption{column, desc} +} + +// Sorting option for the repository +type sortOption struct { + column string + desc bool +} + +// return the column name to sort on +func (sortOption *sortOption) Column() string { + return sortOption.column +} + +// return true for descending sort and false for ascending +func (sortOption *sortOption) Desc() bool { + return sortOption.desc +} diff --git a/badorm/old/SortOption_test.go.txt b/badorm/old/SortOption_test.go.txt new file mode 100644 index 00000000..8078e1ff --- /dev/null +++ b/badorm/old/SortOption_test.go.txt @@ -0,0 +1,14 @@ +package badorm_test + +import ( + "testing" + + "github.com/ditrit/badaas/badorm" + "github.com/stretchr/testify/assert" +) + +func TestNewSortOption(t *testing.T) { + sortOption := badorm.NewSortOption("a", true) + assert.Equal(t, "a", sortOption.Column()) + assert.True(t, sortOption.Desc()) +} diff --git a/badorm/old/crudController.txt b/badorm/old/crudController.txt new file mode 100644 index 00000000..c4d0c017 --- /dev/null +++ b/badorm/old/crudController.txt @@ -0,0 +1,61 @@ +// The handler responsible of the creation of a object +func (controller *crudControllerImpl[T]) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + attrs, herr := decodeJSONOptional(r) + if herr != nil { + return nil, herr + } + + entity, err := controller.crudService.CreateEntity(attrs) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityTypeNotFound + } + return nil, httperrors.NewDBError(err) + } + + // TODO add location header + w.WriteHeader(http.StatusCreated) + + return entity, nil +} + +// The handler responsible for the updates of one object +func (controller *crudControllerImpl[T]) UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityID, herr := getEntityIDFromRequest(r) + if herr != nil { + return nil, herr + } + + attrs, herr := decodeJSONOptional(r) + if herr != nil { + return nil, herr + } + + entity, err := controller.crudService.UpdateEntity(entityID, attrs) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } + return nil, httperrors.NewDBError(err) + } + + return entity, nil +} + +// The handler responsible for the deletion of a object +func (controller *crudControllerImpl[T]) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityID, herr := getEntityIDFromRequest(r) + if herr != nil { + return nil, herr + } + + err := controller.crudService.DeleteEntity(entityID) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, ErrEntityNotFound + } + return nil, httperrors.NewDBError(err) + } + + return nil, nil +} \ No newline at end of file diff --git a/badorm/old/crudRepository.txt b/badorm/old/crudRepository.txt new file mode 100644 index 00000000..640de966 --- /dev/null +++ b/badorm/old/crudRepository.txt @@ -0,0 +1,69 @@ +Find(tx *gorm.DB, filters squirrel.Sqlizer, pagination pagination.Paginator, sort SortOption) (*pagination.Page[T], error) + +paginationConfiguration configuration.PaginationConfiguration + +// Find entities of a Model +func (repository *CRUDRepositoryImpl[T, ID]) Find( + tx *gorm.DB, + filters squirrel.Sqlizer, + page pagination.Paginator, + sortOption SortOption, +) (*pagination.Page[T], error) { + var instances []*T + whereClause, values, err := filters.ToSql() + if err != nil { + return nil, err + } + + if page != nil { + tx = tx. + Offset( + int((page.Offset() - 1) * page.Limit()), + ). + Limit( + int(page.Limit()), + ) + } else { + page = pagination.NewPaginator(0, repository.paginationConfiguration.GetMaxElemPerPage()) + } + + if sortOption != nil { + tx = tx.Order(buildClauseFromSortOption(sortOption)) + } + + err = tx.Where(whereClause, values...).Find(&instances).Error + if err != nil { + return nil, err + } + + // Get Count + nbElem, err := repository.count(tx, whereClause, values) + if err != nil { + return nil, err + } + + return pagination.NewPage(instances, page.Offset(), page.Limit(), nbElem), nil +} + + + +// Build a gorm order clause from a SortOption +func buildClauseFromSortOption(sortOption SortOption) clause.OrderByColumn { + return clause.OrderByColumn{Column: clause.Column{Name: sortOption.Column()}, Desc: sortOption.Desc()} +} + +// Count the number of record that match the where clause with the provided values on the db +func (repository *CRUDRepositoryImpl[T, ID]) count(tx *gorm.DB, whereClause string, values []interface{}) (uint, error) { + var entity *T + var count int64 + err := tx.Model(entity).Where(whereClause, values).Count(&count).Error + if err != nil { + return 0, err + } + + return uint(count), nil +} + +// query = query.InnerJoins("Product", query.Session(&gorm.Session{}).Model(&Product{}).Select("id").Where("\"Product\".int = ?", 1)) + // query = query.InnerJoins("Country", query.Session(&gorm.Session{}).Model(&Country{}).Select("id").Where("\"Country\".name = ?", "Argentina")) + // query = query.Model(&City{}).InnerJoins("Capital_asd", query.Session(&gorm.Session{}).Model(&City{}).Select("id").Where("\"Capital_asd\".name = ?", "Buenos Aires")) \ No newline at end of file diff --git a/badorm/old/crudService.txt b/badorm/old/crudService.txt new file mode 100644 index 00000000..7e5c21c0 --- /dev/null +++ b/badorm/old/crudService.txt @@ -0,0 +1,78 @@ +// Creates a Entity of type "entityType" and its Values from the information provided in "attributeValues" +// not specified values are set with the default value (if exists) or a null value. +// entries in "attributeValues" that do not correspond to any attribute of "entityType" are ignored +// +// "attributeValues" are in {"attributeName": value} format +func (service *crudServiceImpl[T, ID]) CreateEntity(attributeValues map[string]any) (*T, error) { + var entity T + // TODO ver si dejo esto o desencodeo el json directo en la entidad + // TODO testear lo de que se le pueden agregar relaciones a esto + err := mapstructure.Decode(attributeValues, &entity) + if err != nil { + return nil, err // TODO ver que errores puede haber aca + } + + err = service.repository.Create(service.db, &entity) + if err != nil { + return nil, err + } + + // TODO eliminar esto + // err := service.db.Model(&entity).Create(attributeValues).Error + // if err != nil { + // return nil, err + // } + // entity.ID = attributeValues["id"] + + return &entity, nil +} + +// Updates entity with type "entityTypeName" and "id" Values to the new values provided in "newValues" +// entries in "newValues" that do not correspond to any attribute of the EntityType are ignored +// +// "newValues" are in {"attributeName": newValue} format +func (service *crudServiceImpl[T, ID]) UpdateEntity(entityID ID, newValues map[string]any) (*T, error) { + // TODO + return nil, nil +} + +// Deletes Entity with type "entityTypeName" and id "entityID" and its values +func (service *crudServiceImpl[T, ID]) DeleteEntity(entityID ID) error { + // TODO + return nil +} + +// ------------------------- CreateEntity -------------------------------- + +func (ts *CRUDServiceIntTestSuite) TestCreateEntityWithoutAttributes() { + person, err := ts.crudPersonService.CreateEntity(map[string]any{}) + + ts.Nil(err) + ts.Equal("", person.Name) +} + +func (ts *CRUDServiceIntTestSuite) TestCreateEntityWithOnlyOneAttribute() { + person, err := ts.crudPersonService.CreateEntity(map[string]any{"Name": "franco"}) + + ts.Nil(err) + ts.Equal("franco", person.Name) +} + +func (ts *CRUDServiceIntTestSuite) TestCreateEntityWithoutAOptionalRelation() { + employee, err := ts.crudEmployeeService.CreateEntity(map[string]any{"Name": "franco"}) + + ts.Nil(err) + ts.Equal("franco", employee.Name) +} + +func (ts *CRUDServiceIntTestSuite) TestCreateEntityWithAOptionalRelationWithID() { + boss, err := ts.crudEmployeeService.CreateEntity(map[string]any{"Name": "xavier"}) + ts.Nil(err) + + employee, err := ts.crudEmployeeService.CreateEntity( + map[string]any{"Name": "franco", "BossID": boss.ID.String()}, + ) + ts.Nil(err) + ts.Equal("franco", employee.Name) + ts.Equal(boss.ID, employee.BossID) +} \ No newline at end of file diff --git a/badorm/old/pagination/Page.go b/badorm/old/pagination/Page.go new file mode 100644 index 00000000..ba88357f --- /dev/null +++ b/badorm/old/pagination/Page.go @@ -0,0 +1,39 @@ +package pagination + +// A page hold resources and data regarding the pagination +type Page[T any] struct { + Resources []*T `json:"resources"` + // max d'element par page + Limit uint `json:"limit"` + // page courante + Offset uint `json:"offset"` + // total d'element en base + Total uint `json:"total"` + // total de pages + TotalPages uint `json:"totalPages"` + HasNextPage bool `json:"hasNextPage"` + HasPreviousPage bool `json:"hasPreviousPage"` + IsFirstPage bool `json:"isFirstPage"` + IsLastPage bool `json:"isLastPage"` + HasContent bool `json:"hasContent"` +} + +// Create a new page +func NewPage[T any](records []*T, offset, size, nbElemTotal uint) *Page[T] { + nbPage := nbElemTotal / size + p := Page[T]{ + Resources: records, + Limit: size, + Offset: offset, + Total: nbElemTotal, + TotalPages: nbPage, + + HasNextPage: nbElemTotal > (offset+1)*size, + HasPreviousPage: offset >= 1, + IsFirstPage: offset == 0, + IsLastPage: offset == (nbPage - 1), + HasContent: len(records) != 0, + } + + return &p +} diff --git a/badorm/old/pagination/Page_test.go.txt b/badorm/old/pagination/Page_test.go.txt new file mode 100644 index 00000000..f46b49f8 --- /dev/null +++ b/badorm/old/pagination/Page_test.go.txt @@ -0,0 +1,145 @@ +package pagination_test + +import ( + "testing" + + "github.com/ditrit/badaas/badorm/pagination" + "github.com/stretchr/testify/assert" +) + +type Whatever struct { + DumbData int +} + +func (Whatever) TableName() string { + return "whatevers" +} + +var ( + // test fixture + ressources = []*Whatever{ + {10}, + {11}, + {12}, + {13}, + {14}, + {15}, + {16}, + {17}, + {18}, + {19}, + } +) + +func TestNewPage(t *testing.T) { + p := pagination.NewPage( + ressources, + 1, // page 1 + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.ElementsMatch(t, ressources, p.Ressources) + assert.Equal(t, uint(10), p.Limit) + assert.Equal(t, uint(1), p.Offset) + assert.Equal(t, uint(5), p.TotalPages) +} + +func TestPageHasNextPageFalse(t *testing.T) { + p := pagination.NewPage( + ressources, + 4, // page 4: last page + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.False(t, p.HasNextPage) +} + +func TestPageHasNextPageTrue(t *testing.T) { + p := pagination.NewPage( + ressources, + 1, // page 1 + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.True(t, p.HasNextPage) +} + +func TestPageIsLastPageFalse(t *testing.T) { + p := pagination.NewPage( + ressources, + 1, // page 1 + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.False(t, p.IsLastPage) +} + +func TestPageIsLastPageTrue(t *testing.T) { + p := pagination.NewPage( + ressources, + 4, // page 4: last page + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.True(t, p.IsLastPage) +} + +func TestPageHasPreviousPageFalse(t *testing.T) { + p := pagination.NewPage( + ressources, + 0, // page 1 + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.False(t, p.HasPreviousPage) +} + +func TestPageHasPreviousPageTrue(t *testing.T) { + p := pagination.NewPage( + ressources, + 1, // page 1 + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.True(t, p.HasPreviousPage) +} + +func TestPageIsFirstPageFalse(t *testing.T) { + p := pagination.NewPage( + ressources, + 1, // page 1 + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.False(t, p.IsFirstPage) +} + +func TestPageIsFirstPageTrue(t *testing.T) { + p := pagination.NewPage( + ressources, + 0, // page 0: first page + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.True(t, p.IsFirstPage) +} + +func TestPageHasContentFalse(t *testing.T) { + p := pagination.NewPage( + []*Whatever{}, // no content + 0, // page 1 + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.False(t, p.HasPreviousPage) +} + +func TestPageHasContentTrue(t *testing.T) { + p := pagination.NewPage( + ressources, + 1, // page 1 + 10, // 10 elems per page + 50, // 50 elem in total + ) + assert.True(t, p.HasContent) +} diff --git a/badorm/old/pagination/Paginator.go b/badorm/old/pagination/Paginator.go new file mode 100644 index 00000000..5f12ea1f --- /dev/null +++ b/badorm/old/pagination/Paginator.go @@ -0,0 +1,38 @@ +package pagination + +// Handle pagination +type Paginator interface { + Offset() uint + Limit() uint +} + +type paginatorImpl struct { + offset uint + limit uint +} + +// Constructor of Paginator +func NewPaginator(page, limit uint) Paginator { + if page == 0 { + page = 1 + } + + if limit == 0 { + limit = 1 + } + + return &paginatorImpl{ + offset: page, + limit: limit, + } +} + +// Return the page number +func (p *paginatorImpl) Offset() uint { + return p.offset +} + +// Return the max number of records for one page +func (p *paginatorImpl) Limit() uint { + return p.limit +} diff --git a/badorm/old/pagination/Paginator_test.go.txt b/badorm/old/pagination/Paginator_test.go.txt new file mode 100644 index 00000000..a2b6137f --- /dev/null +++ b/badorm/old/pagination/Paginator_test.go.txt @@ -0,0 +1,22 @@ +package pagination_test + +import ( + "testing" + + "github.com/ditrit/badaas/badorm/pagination" + "github.com/stretchr/testify/assert" +) + +func TestPaginator(t *testing.T) { + paginator := pagination.NewPaginator(uint(0), uint(12)) + assert.NotNil(t, paginator) + assert.Equal(t, uint(12), paginator.Limit()) + + paginator = pagination.NewPaginator(uint(2), uint(12)) + assert.NotNil(t, paginator) + assert.Equal(t, uint(12), paginator.Limit()) + + paginator = pagination.NewPaginator(uint(2), uint(0)) + assert.NotNil(t, paginator) + assert.Equal(t, uint(1), paginator.Limit()) +} diff --git a/badorm/uuid.go b/badorm/uuid.go index e500cb0e..289abc2d 100644 --- a/badorm/uuid.go +++ b/badorm/uuid.go @@ -25,6 +25,7 @@ func (id UUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { case "sqlserver": return "uniqueidentifier" } + return "" } diff --git a/badorm/uuid_test.go b/badorm/uuid_test.go index c151464d..bf384619 100644 --- a/badorm/uuid_test.go +++ b/badorm/uuid_test.go @@ -3,21 +3,20 @@ package badorm_test import ( "testing" - "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/ditrit/badaas/badorm" ) func TestParseCorrectUUID(t *testing.T) { - uuidString := uuid.New().String() + uuidString := badorm.NewUUID().String() uuid, err := badorm.ParseUUID(uuidString) assert.Nil(t, err) assert.Equal(t, uuidString, uuid.String()) } func TestParseIncorrectUUID(t *testing.T) { - uid, err := badorm.ParseUUID("not uuid") + uuid, err := badorm.ParseUUID("not uuid") assert.Error(t, err) - assert.Equal(t, badorm.NilUUID, uid) + assert.Equal(t, badorm.NilUUID, uuid) } diff --git a/configuration/DatabaseCommandsInitializer.go b/configuration/DatabaseCommandsInitializer.go index c0c78425..a7c04cbb 100644 --- a/configuration/DatabaseCommandsInitializer.go +++ b/configuration/DatabaseCommandsInitializer.go @@ -7,6 +7,7 @@ import ( func NewDatabaseCommandsInitializer() CommandsInitializer { dialectorValidator := validators.AuthorizedValues(DBDialectors...) + return CommandsKeyInitializer{ KeySetter: NewKeySetter(), Keys: []Key{ diff --git a/configuration/DatabaseConfiguration.go b/configuration/DatabaseConfiguration.go index 4458933c..b5d5feeb 100644 --- a/configuration/DatabaseConfiguration.go +++ b/configuration/DatabaseConfiguration.go @@ -40,7 +40,7 @@ var DBDialectors = []string{ // Hold the configuration values for the database connection type DatabaseConfiguration interface { - ConfigurationHolder + Holder GetPort() int GetHost() string GetDBName() string @@ -69,6 +69,7 @@ type databaseConfigurationImpl struct { func NewDatabaseConfiguration() DatabaseConfiguration { databaseConfiguration := new(databaseConfigurationImpl) databaseConfiguration.Reload() + return databaseConfiguration } diff --git a/configuration/DatabaseConfiguration_test.go b/configuration/DatabaseConfiguration_test.go index 21d5447c..5a08a0f2 100644 --- a/configuration/DatabaseConfiguration_test.go +++ b/configuration/DatabaseConfiguration_test.go @@ -5,13 +5,14 @@ import ( "testing" "time" - "github.com/ditrit/badaas/configuration" "github.com/spf13/viper" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" + + "github.com/ditrit/badaas/configuration" ) var databaseConfigurationString = ` @@ -35,6 +36,7 @@ database: func setupViperEnvironment(configurationString string) { viper.Reset() viper.SetConfigType("yaml") + err := viper.ReadConfig(strings.NewReader(configurationString)) if err != nil { panic(err) @@ -43,51 +45,63 @@ func setupViperEnvironment(configurationString string) { func TestDatabaseConfigurationNewDBConfig(t *testing.T) { setupViperEnvironment(databaseConfigurationString) + databaseConfiguration := configuration.NewDatabaseConfiguration() assert.NotNil(t, databaseConfiguration, "the database configuration should not be nil") } func TestDatabaseConfigurationGetPort(t *testing.T) { setupViperEnvironment(databaseConfigurationString) + databaseConfiguration := configuration.NewDatabaseConfiguration() assert.Equal(t, 26257, databaseConfiguration.GetPort(), "should be equals") } func TestDatabaseConfigurationGetHost(t *testing.T) { setupViperEnvironment(databaseConfigurationString) + databaseConfiguration := configuration.NewDatabaseConfiguration() assert.Equal(t, "e2e-db-1", databaseConfiguration.GetHost()) } func TestDatabaseConfigurationGetUsername(t *testing.T) { setupViperEnvironment(databaseConfigurationString) + databaseConfiguration := configuration.NewDatabaseConfiguration() assert.Equal(t, "root", databaseConfiguration.GetUsername()) } + func TestDatabaseConfigurationGetPassword(t *testing.T) { setupViperEnvironment(databaseConfigurationString) + databaseConfiguration := configuration.NewDatabaseConfiguration() assert.Equal(t, "postgres", databaseConfiguration.GetPassword()) } + func TestDatabaseConfigurationGetSSLMode(t *testing.T) { setupViperEnvironment(databaseConfigurationString) + databaseConfiguration := configuration.NewDatabaseConfiguration() assert.Equal(t, "disable", databaseConfiguration.GetSSLMode()) } + func TestDatabaseConfigurationGetDBName(t *testing.T) { setupViperEnvironment(databaseConfigurationString) + databaseConfiguration := configuration.NewDatabaseConfiguration() assert.Equal(t, "badaas_db", databaseConfiguration.GetDBName()) } func TestDatabaseConfigurationGetRetryTime(t *testing.T) { setupViperEnvironment(databaseConfigurationString) + databaseConfiguration := configuration.NewDatabaseConfiguration() - assert.Equal(t, time.Duration(5*time.Second), databaseConfiguration.GetRetryTime()) + assert.Equal(t, 5*time.Second, databaseConfiguration.GetRetryTime()) } func TestDatabaseConfigurationGetRetry(t *testing.T) { setupViperEnvironment(databaseConfigurationString) + databaseConfiguration := configuration.NewDatabaseConfiguration() assert.Equal(t, uint(10), databaseConfiguration.GetRetry()) } diff --git a/configuration/ConfigurationHolder.go b/configuration/Holder.go similarity index 87% rename from configuration/ConfigurationHolder.go rename to configuration/Holder.go index 95f150e4..a749222b 100644 --- a/configuration/ConfigurationHolder.go +++ b/configuration/Holder.go @@ -3,7 +3,7 @@ package configuration import "go.uber.org/zap" // Every configuration holder must implement this interface -type ConfigurationHolder interface { +type Holder interface { // Reload the values provided by the configuration holder Reload() diff --git a/configuration/HttpServerConfiguration.go b/configuration/HttpServerConfiguration.go index c9100163..5f9f9091 100644 --- a/configuration/HttpServerConfiguration.go +++ b/configuration/HttpServerConfiguration.go @@ -4,9 +4,10 @@ import ( "fmt" "time" - "github.com/ditrit/badaas/utils" "github.com/spf13/viper" "go.uber.org/zap" + + "github.com/ditrit/badaas/utils" ) // The config keys regarding the http server settings @@ -20,7 +21,7 @@ const ( // Hold the configuration values for the http server type HTTPServerConfiguration interface { - ConfigurationHolder + Holder GetAddr() string GetHost() string GetPort() int @@ -38,6 +39,7 @@ type hTTPServerConfigurationImpl struct { func NewHTTPServerConfiguration() HTTPServerConfiguration { httpServerConfiguration := new(hTTPServerConfigurationImpl) httpServerConfiguration.Reload() + return httpServerConfiguration } diff --git a/configuration/HttpServerConfiguration_test.go b/configuration/HttpServerConfiguration_test.go index 9460a79e..fc150991 100644 --- a/configuration/HttpServerConfiguration_test.go +++ b/configuration/HttpServerConfiguration_test.go @@ -4,12 +4,13 @@ import ( "testing" "time" - "github.com/ditrit/badaas/configuration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" + + "github.com/ditrit/badaas/configuration" ) var HTTPServerConfigurationString = `server: @@ -24,25 +25,30 @@ func TestHTTPServerConfigurationNewHttpServerConfiguration(t *testing.T) { func TestHTTPServerConfigurationGetPort(t *testing.T) { setupViperEnvironment(HTTPServerConfigurationString) - HTTPServerConfiguration := configuration.NewHTTPServerConfiguration() - assert.Equal(t, 8000, HTTPServerConfiguration.GetPort()) + + httpServerConfiguration := configuration.NewHTTPServerConfiguration() + assert.Equal(t, 8000, httpServerConfiguration.GetPort()) } + func TestHTTPServerConfigurationGetHost(t *testing.T) { setupViperEnvironment(HTTPServerConfigurationString) - HTTPServerConfiguration := configuration.NewHTTPServerConfiguration() - assert.Equal(t, "0.0.0.0", HTTPServerConfiguration.GetHost()) + + httpServerConfiguration := configuration.NewHTTPServerConfiguration() + assert.Equal(t, "0.0.0.0", httpServerConfiguration.GetHost()) } func TestHTTPServerConfigurationGetAddr(t *testing.T) { setupViperEnvironment(HTTPServerConfigurationString) - HTTPServerConfiguration := configuration.NewHTTPServerConfiguration() - assert.Equal(t, "0.0.0.0:8000", HTTPServerConfiguration.GetAddr()) + + httpServerConfiguration := configuration.NewHTTPServerConfiguration() + assert.Equal(t, "0.0.0.0:8000", httpServerConfiguration.GetAddr()) } func TestHTTPServerConfigurationGetMaxTimeout(t *testing.T) { setupViperEnvironment(HTTPServerConfigurationString) - HTTPServerConfiguration := configuration.NewHTTPServerConfiguration() - assert.Equal(t, time.Duration(15*time.Second), HTTPServerConfiguration.GetMaxTimeout()) + + httpServerConfiguration := configuration.NewHTTPServerConfiguration() + assert.Equal(t, 15*time.Second, httpServerConfiguration.GetMaxTimeout()) } func TestHTTPServerConfigurationLog(t *testing.T) { @@ -51,8 +57,8 @@ func TestHTTPServerConfigurationLog(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - HTTPServerConfiguration := configuration.NewHTTPServerConfiguration() - HTTPServerConfiguration.Log(observedLogger) + httpServerConfiguration := configuration.NewHTTPServerConfiguration() + httpServerConfiguration.Log(observedLogger) require.Equal(t, 1, observedLogs.Len()) log := observedLogs.All()[0] @@ -61,6 +67,6 @@ func TestHTTPServerConfigurationLog(t *testing.T) { assert.ElementsMatch(t, []zap.Field{ {Key: "port", Type: zapcore.Int64Type, Integer: 8000}, {Key: "host", Type: zapcore.StringType, String: "0.0.0.0"}, - {Key: "timeout", Type: zapcore.DurationType, Integer: int64(time.Duration(time.Second * 15))}, + {Key: "timeout", Type: zapcore.DurationType, Integer: int64(time.Second * 15)}, }, log.Context) } diff --git a/configuration/InitializationConfiguration.go b/configuration/InitializationConfiguration.go index 8e365d23..ac70938c 100644 --- a/configuration/InitializationConfiguration.go +++ b/configuration/InitializationConfiguration.go @@ -12,7 +12,7 @@ const ( // Hold the configuration values for the initialization type InitializationConfiguration interface { - ConfigurationHolder + Holder GetAdminPassword() string } @@ -25,6 +25,7 @@ type initializationConfigurationIml struct { func NewInitializationConfiguration() InitializationConfiguration { initializationConfiguration := &initializationConfigurationIml{} initializationConfiguration.Reload() + return initializationConfiguration } diff --git a/configuration/InitializationConfiguration_test.go b/configuration/InitializationConfiguration_test.go index b80fbd9d..2d548576 100644 --- a/configuration/InitializationConfiguration_test.go +++ b/configuration/InitializationConfiguration_test.go @@ -3,12 +3,13 @@ package configuration_test import ( "testing" - "github.com/ditrit/badaas/configuration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" + + "github.com/ditrit/badaas/configuration" ) var initializationConfigurationString = `default: @@ -21,6 +22,7 @@ func TestInitializationConfigurationInitializationConfiguration(t *testing.T) { func TestInitializationConfigurationGetInit(t *testing.T) { setupViperEnvironment(initializationConfigurationString) + initializationConfiguration := configuration.NewInitializationConfiguration() assert.Equal(t, "admin", initializationConfiguration.GetAdminPassword()) } diff --git a/configuration/LoggerCommandsInitializer.go b/configuration/LoggerCommandsInitializer.go index 03eec1e6..a4ca7414 100644 --- a/configuration/LoggerCommandsInitializer.go +++ b/configuration/LoggerCommandsInitializer.go @@ -7,6 +7,7 @@ import ( func NewLoggerCommandsInitializer() CommandsInitializer { modeValidator := validators.AuthorizedValues("prod", "dev") + return CommandsKeyInitializer{ KeySetter: NewKeySetter(), Keys: []Key{ diff --git a/configuration/LoggerConfiguration.go b/configuration/LoggerConfiguration.go index 133da8c8..a92ce125 100644 --- a/configuration/LoggerConfiguration.go +++ b/configuration/LoggerConfiguration.go @@ -13,7 +13,7 @@ const ( // Hold the configuration values for the logger type LoggerConfiguration interface { - ConfigurationHolder + Holder GetMode() string GetRequestTemplate() string } @@ -27,6 +27,7 @@ type loggerConfigurationImpl struct { func NewLoggerConfiguration() LoggerConfiguration { loggerConfiguration := new(loggerConfigurationImpl) loggerConfiguration.Reload() + return loggerConfiguration } diff --git a/configuration/LoggerConfiguration_test.go b/configuration/LoggerConfiguration_test.go index 53b005bb..ca97bf78 100644 --- a/configuration/LoggerConfiguration_test.go +++ b/configuration/LoggerConfiguration_test.go @@ -3,12 +3,13 @@ package configuration_test import ( "testing" - "github.com/ditrit/badaas/configuration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" + + "github.com/ditrit/badaas/configuration" ) var LoggerConfigurationString = `logger: @@ -18,19 +19,21 @@ var LoggerConfigurationString = `logger: ` func TestLoggerConfigurationNewLoggerConfiguration(t *testing.T) { - assert.NotNil(t, configuration.NewLoggerConfiguration(), "the contructor for LoggerConfiguration should not return a nil value") + assert.NotNil(t, configuration.NewLoggerConfiguration(), "the constructor for LoggerConfiguration should not return a nil value") } func TestLoggerConfigurationLoggerGetMode(t *testing.T) { setupViperEnvironment(LoggerConfigurationString) - LoggerConfiguration := configuration.NewLoggerConfiguration() - assert.Equal(t, "prod", LoggerConfiguration.GetMode()) + + loggerConfiguration := configuration.NewLoggerConfiguration() + assert.Equal(t, "prod", loggerConfiguration.GetMode()) } func TestLoggerConfigurationLoggerRequestTemplate(t *testing.T) { setupViperEnvironment(LoggerConfigurationString) - LoggerConfiguration := configuration.NewLoggerConfiguration() - assert.Equal(t, "{proto} {method} {url}", LoggerConfiguration.GetRequestTemplate()) + + loggerConfiguration := configuration.NewLoggerConfiguration() + assert.Equal(t, "{proto} {method} {url}", loggerConfiguration.GetRequestTemplate()) } func TestLoggerConfigurationLog(t *testing.T) { @@ -39,8 +42,8 @@ func TestLoggerConfigurationLog(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - LoggerConfiguration := configuration.NewLoggerConfiguration() - LoggerConfiguration.Log(observedLogger) + loggerConfiguration := configuration.NewLoggerConfiguration() + loggerConfiguration.Log(observedLogger) require.Equal(t, 1, observedLogs.Len()) log := observedLogs.All()[0] diff --git a/configuration/PaginationConfiguration.go b/configuration/PaginationConfiguration.go index 264a8233..f91408d8 100644 --- a/configuration/PaginationConfiguration.go +++ b/configuration/PaginationConfiguration.go @@ -7,7 +7,7 @@ import ( // Hold the configuration values for the pagination type PaginationConfiguration interface { - ConfigurationHolder + Holder GetMaxElemPerPage() uint } @@ -20,6 +20,7 @@ type paginationConfigurationImpl struct { func NewPaginationConfiguration() PaginationConfiguration { paginationConfiguration := new(paginationConfigurationImpl) paginationConfiguration.Reload() + return paginationConfiguration } diff --git a/configuration/PaginationConfiguration_test.go b/configuration/PaginationConfiguration_test.go index aaca2116..341eba3c 100644 --- a/configuration/PaginationConfiguration_test.go +++ b/configuration/PaginationConfiguration_test.go @@ -3,12 +3,13 @@ package configuration_test import ( "testing" - "github.com/ditrit/badaas/configuration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" + + "github.com/ditrit/badaas/configuration" ) var PaginationConfigurationString = `server.pagination.page.max: 12` @@ -19,8 +20,9 @@ func TestPaginationConfigurationNewPaginationConfiguration(t *testing.T) { func TestPaginationConfigurationGetMaxElemPerPage(t *testing.T) { setupViperEnvironment(PaginationConfigurationString) - PaginationConfiguration := configuration.NewPaginationConfiguration() - assert.Equal(t, uint(12), PaginationConfiguration.GetMaxElemPerPage()) + + paginationConfiguration := configuration.NewPaginationConfiguration() + assert.Equal(t, uint(12), paginationConfiguration.GetMaxElemPerPage()) } func TestPaginationConfigurationLog(t *testing.T) { @@ -29,8 +31,8 @@ func TestPaginationConfigurationLog(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - PaginationConfiguration := configuration.NewPaginationConfiguration() - PaginationConfiguration.Log(observedLogger) + paginationConfiguration := configuration.NewPaginationConfiguration() + paginationConfiguration.Log(observedLogger) require.Equal(t, 1, observedLogs.Len()) log := observedLogs.All()[0] diff --git a/configuration/SessionConfiguration.go b/configuration/SessionConfiguration.go index 1d330a8c..242a7739 100644 --- a/configuration/SessionConfiguration.go +++ b/configuration/SessionConfiguration.go @@ -3,9 +3,10 @@ package configuration import ( "time" - "github.com/ditrit/badaas/utils" "github.com/spf13/viper" "go.uber.org/zap" + + "github.com/ditrit/badaas/utils" ) // The config keys regarding the session handling settings @@ -17,7 +18,7 @@ const ( // Hold the configuration values to handle the sessions type SessionConfiguration interface { - ConfigurationHolder + Holder GetSessionDuration() time.Duration GetPullInterval() time.Duration GetRollDuration() time.Duration @@ -34,6 +35,7 @@ type sessionConfigurationImpl struct { func NewSessionConfiguration() SessionConfiguration { sessionConfiguration := new(sessionConfigurationImpl) sessionConfiguration.Reload() + return sessionConfiguration } diff --git a/configuration/SessionConfiguration_test.go b/configuration/SessionConfiguration_test.go index 05a9e101..ae7239c2 100644 --- a/configuration/SessionConfiguration_test.go +++ b/configuration/SessionConfiguration_test.go @@ -4,12 +4,13 @@ import ( "testing" "time" - "github.com/ditrit/badaas/configuration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" + + "github.com/ditrit/badaas/configuration" ) var SessionConfigurationString = `session: @@ -18,25 +19,28 @@ var SessionConfigurationString = `session: rollDuration: 10 # 10 seconds` func TestSessionConfigurationNewSessionConfiguration(t *testing.T) { - assert.NotNil(t, configuration.NewSessionConfiguration(), "the contructor for PaginationConfiguration should not return a nil value") + assert.NotNil(t, configuration.NewSessionConfiguration(), "the constructor for PaginationConfiguration should not return a nil value") } func TestSessionConfigurationGetSessionDuration(t *testing.T) { setupViperEnvironment(SessionConfigurationString) - SessionConfiguration := configuration.NewSessionConfiguration() - assert.Equal(t, time.Duration(time.Hour), SessionConfiguration.GetSessionDuration()) + + sessionConfiguration := configuration.NewSessionConfiguration() + assert.Equal(t, time.Hour, sessionConfiguration.GetSessionDuration()) } -func TestSessionConfigurationGetPullIntervall(t *testing.T) { +func TestSessionConfigurationGetPullInterval(t *testing.T) { setupViperEnvironment(SessionConfigurationString) - SessionConfiguration := configuration.NewSessionConfiguration() - assert.Equal(t, time.Duration(time.Second*30), SessionConfiguration.GetPullInterval()) + + sessionConfiguration := configuration.NewSessionConfiguration() + assert.Equal(t, time.Second*30, sessionConfiguration.GetPullInterval()) } -func TestSessionConfigurationGetRollIntervall(t *testing.T) { +func TestSessionConfigurationGetRollDuration(t *testing.T) { setupViperEnvironment(SessionConfigurationString) - SessionConfiguration := configuration.NewSessionConfiguration() - assert.Equal(t, time.Duration(time.Second*10), SessionConfiguration.GetRollDuration()) + + sessionConfiguration := configuration.NewSessionConfiguration() + assert.Equal(t, time.Second*10, sessionConfiguration.GetRollDuration()) } func TestSessionConfigurationLog(t *testing.T) { @@ -45,16 +49,16 @@ func TestSessionConfigurationLog(t *testing.T) { observedZapCore, observedLogs := observer.New(zap.DebugLevel) observedLogger := zap.New(observedZapCore) - PaginationConfiguration := configuration.NewSessionConfiguration() - PaginationConfiguration.Log(observedLogger) + sessionConfiguration := configuration.NewSessionConfiguration() + sessionConfiguration.Log(observedLogger) require.Equal(t, 1, observedLogs.Len()) log := observedLogs.All()[0] assert.Equal(t, "Session configuration", log.Message) require.Len(t, log.Context, 3) assert.ElementsMatch(t, []zap.Field{ - {Key: "sessionDuration", Type: zapcore.DurationType, Integer: int64(time.Duration(time.Hour))}, - {Key: "pullInterval", Type: zapcore.DurationType, Integer: int64(time.Duration(time.Second * 30))}, - {Key: "rollDuration", Type: zapcore.DurationType, Integer: int64(time.Duration(time.Second * 10))}, + {Key: "sessionDuration", Type: zapcore.DurationType, Integer: int64(time.Hour)}, + {Key: "pullInterval", Type: zapcore.DurationType, Integer: int64(time.Second * 30)}, + {Key: "rollDuration", Type: zapcore.DurationType, Integer: int64(time.Second * 10)}, }, log.Context) } diff --git a/controllers/basicAuth.go b/controllers/basicAuth.go index 5e87e9f1..1869814a 100644 --- a/controllers/basicAuth.go +++ b/controllers/basicAuth.go @@ -6,19 +6,18 @@ import ( "net/http" "time" + "go.uber.org/zap" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models/dto" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" - "go.uber.org/zap" ) -var ( - HERRAccessToken = func(err error) httperrors.HTTPError { - return httperrors.NewInternalServerError("access token error", "unable to create access token", err) - } -) +var HERRAccessToken = func(err error) httperrors.HTTPError { + return httperrors.NewInternalServerError("access token error", "unable to create access token", err) +} type BasicAuthenticationController interface { BasicLoginHandler(http.ResponseWriter, *http.Request) (any, httperrors.HTTPError) @@ -50,6 +49,7 @@ func NewBasicAuthenticationController( // Log In with username and password func (basicAuthController *basicAuthenticationController) BasicLoginHandler(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { var loginJSONStruct dto.UserLoginDTO + herr := decodeJSON(r, &loginJSONStruct) if herr != nil { return nil, herr @@ -82,7 +82,7 @@ func (basicAuthController *basicAuthenticationController) BasicLoginHandler(w ht return nil, HERRAccessToken(err) } - return dto.DTOLoginSuccess{ + return dto.LoginSuccess{ Email: user.Email, ID: user.ID.String(), Username: user.Username, @@ -115,11 +115,11 @@ func createAndSetAccessTokenCookie(w http.ResponseWriter, sessionUUID string) er Secure: false, // TODO change to true in prod Expires: time.Now().Add(48 * time.Hour), } - err := accessToken.Valid() - if err != nil { + if err := accessToken.Valid(); err != nil { return err } http.SetCookie(w, accessToken) + return nil } diff --git a/controllers/basicAuth_test.go b/controllers/basicAuth_test.go index fcbaf28c..25751d4a 100644 --- a/controllers/basicAuth_test.go +++ b/controllers/basicAuth_test.go @@ -1,11 +1,16 @@ package controllers_test import ( + "net/http" "net/http/httptest" "strings" "testing" "time" + "github.com/stretchr/testify/assert" + "go.uber.org/zap" + "go.uber.org/zap/zaptest/observer" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/httperrors" @@ -13,11 +18,18 @@ import ( mocksUserService "github.com/ditrit/badaas/mocks/services/userservice" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" - "github.com/stretchr/testify/assert" - "go.uber.org/zap" - "go.uber.org/zap/zaptest/observer" ) +// ExampleErr is an HTTPError instance useful for testing. If the code does not care +// about HTTPError specifics, and only needs to return the HTTPError for example, this +// HTTPError should be used to make the test code more readable. +var ExampleErr httperrors.HTTPError = &httperrors.HTTPErrorImpl{ + Status: -1, + Err: "TESTING ERROR", + Message: "USE ONLY FOR TESTING", + GolangError: nil, +} + func Test_BasicLoginHandler_MalformedRequest(t *testing.T) { core, _ := observer.New(zap.DebugLevel) logger := zap.New(core) @@ -32,7 +44,7 @@ func Test_BasicLoginHandler_MalformedRequest(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/login", strings.NewReader("qsdqsdqsd"), ) @@ -40,7 +52,6 @@ func Test_BasicLoginHandler_MalformedRequest(t *testing.T) { payload, err := controller.BasicLoginHandler(response, request) assert.Equal(t, controllers.HTTPErrRequestMalformed, err) assert.Nil(t, payload) - } func Test_BasicLoginHandler_UserNotFound(t *testing.T) { @@ -53,7 +64,8 @@ func Test_BasicLoginHandler_UserNotFound(t *testing.T) { userService := mocksUserService.NewUserService(t) userService. On("GetUser", loginJSONStruct). - Return(nil, httperrors.AnError) + Return(nil, ExampleErr) + sessionService := mocksSessionService.NewSessionService(t) controller := controllers.NewBasicAuthenticationController( @@ -63,7 +75,7 @@ func Test_BasicLoginHandler_UserNotFound(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/login", strings.NewReader(`{ "email": "bob@email.com", @@ -74,7 +86,6 @@ func Test_BasicLoginHandler_UserNotFound(t *testing.T) { payload, err := controller.BasicLoginHandler(response, request) assert.Error(t, err) assert.Nil(t, payload) - } func Test_BasicLoginHandler_LoginFailed(t *testing.T) { @@ -86,7 +97,7 @@ func Test_BasicLoginHandler_LoginFailed(t *testing.T) { } response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/login", strings.NewReader(`{ "email": "bob@email.com", @@ -103,10 +114,11 @@ func Test_BasicLoginHandler_LoginFailed(t *testing.T) { userService. On("GetUser", loginJSONStruct). Return(user, nil) + sessionService := mocksSessionService.NewSessionService(t) sessionService. On("LogUserIn", user). - Return(nil, httperrors.AnError) + Return(nil, ExampleErr) controller := controllers.NewBasicAuthenticationController( logger, @@ -117,7 +129,6 @@ func Test_BasicLoginHandler_LoginFailed(t *testing.T) { payload, err := controller.BasicLoginHandler(response, request) assert.Error(t, err) assert.Nil(t, payload) - } func Test_BasicLoginHandler_LoginSuccess(t *testing.T) { @@ -129,7 +140,7 @@ func Test_BasicLoginHandler_LoginSuccess(t *testing.T) { } response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/login", strings.NewReader(`{ "email": "bob@email.com", @@ -148,6 +159,7 @@ func Test_BasicLoginHandler_LoginSuccess(t *testing.T) { userService. On("GetUser", loginJSONStruct). Return(user, nil) + sessionService := mocksSessionService.NewSessionService(t) sessionService. On("LogUserIn", user). @@ -161,7 +173,7 @@ func Test_BasicLoginHandler_LoginSuccess(t *testing.T) { payload, err := controller.BasicLoginHandler(response, request) assert.NoError(t, err) - assert.Equal(t, payload, dto.DTOLoginSuccess{ + assert.Equal(t, payload, dto.LoginSuccess{ Email: "bob@email.com", ID: user.ID.String(), Username: user.Username, diff --git a/controllers/crud.go b/controllers/crud.go index bf1c1dbb..d6cd47a4 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -5,11 +5,12 @@ import ( "net/http" "strings" + "github.com/elliotchance/pie/v2" + "go.uber.org/zap" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" - "github.com/elliotchance/pie/v2" - "go.uber.org/zap" ) type CRUDController interface { @@ -42,7 +43,6 @@ func NewCRUDController[T any]( crudUnsafeService: crudUnsafeService, }, } - } // The concrete implementation of the CRUDController @@ -60,6 +60,7 @@ func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *htt } entity, err := controller.crudService.GetEntity(entityID) + return entity, mapServiceError(err) } @@ -71,5 +72,6 @@ func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *ht } entities, err := controller.crudUnsafeService.GetEntities(params) + return entities, mapServiceError(err) } diff --git a/controllers/crud_test.go b/controllers/crud_test.go index 4defea04..30d77c69 100644 --- a/controllers/crud_test.go +++ b/controllers/crud_test.go @@ -2,17 +2,18 @@ package controllers_test import ( "errors" + "net/http" "net/http/httptest" "strings" "testing" - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/controllers" - mockBadorm "github.com/ditrit/badaas/mocks/badorm" - "github.com/google/uuid" "github.com/gorilla/mux" "github.com/stretchr/testify/assert" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/controllers" + mockBadorm "github.com/ditrit/badaas/mocks/badorm" ) // ----------------------- GetObject ----------------------- @@ -32,7 +33,7 @@ func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader(""), ) @@ -52,7 +53,7 @@ func TestCRUDGetWithEntityIDNotUUIDReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader(""), ) @@ -66,7 +67,7 @@ func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() crudService. On("GetEntity", uuid). @@ -79,7 +80,7 @@ func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader(""), ) @@ -94,7 +95,7 @@ func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() crudService. On("GetEntity", uuid). @@ -107,7 +108,7 @@ func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader(""), ) @@ -122,7 +123,7 @@ func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() entity := Model{} crudService. @@ -136,7 +137,7 @@ func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader(""), ) @@ -164,7 +165,7 @@ func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader(""), ) @@ -191,7 +192,7 @@ func TestGetEntitiesWithoutParams(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader(""), ) @@ -220,7 +221,7 @@ func TestGetEntitiesWithParams(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader("{\"param1\": \"something\"}"), ) @@ -242,7 +243,7 @@ func TestGetEntitiesWithParamsNotJsonReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader("bad json"), ) diff --git a/controllers/eav.go b/controllers/eav.go index 351af81c..fb66072a 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -5,13 +5,14 @@ import ( "fmt" "net/http" + "github.com/gorilla/mux" + "go.uber.org/zap" + "gorm.io/gorm" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/services" - "github.com/gorilla/mux" - "go.uber.org/zap" - "gorm.io/gorm" ) type EAVController interface { @@ -49,6 +50,7 @@ func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Re } entity, err := controller.eavService.GetEntity(entityTypeName, entityID) + return entity, mapServiceError(err) } @@ -65,6 +67,7 @@ func (controller *eavControllerImpl) GetObjects(w http.ResponseWriter, r *http.R } entities, err := controller.eavService.GetEntities(entityTypeName, params) + return entities, mapEAVServiceError(err) } @@ -108,6 +111,7 @@ func (controller *eavControllerImpl) UpdateObject(w http.ResponseWriter, r *http } entity, err := controller.eavService.UpdateEntity(entityTypeName, entityID, attrs) + return entity, mapServiceError(err) } @@ -119,6 +123,7 @@ func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http } err := controller.eavService.DeleteEntity(entityTypeName, entityID) + return nil, mapServiceError(err) } diff --git a/controllers/eav_test.go b/controllers/eav_test.go index 6c5ef905..c4db104e 100644 --- a/controllers/eav_test.go +++ b/controllers/eav_test.go @@ -2,19 +2,20 @@ package controllers_test import ( "errors" + "net/http" "net/http/httptest" "strings" "testing" - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/controllers" - mockServices "github.com/ditrit/badaas/mocks/services" - "github.com/ditrit/badaas/persistence/models" - "github.com/google/uuid" "github.com/gorilla/mux" "github.com/stretchr/testify/assert" "go.uber.org/zap" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/controllers" + mockServices "github.com/ditrit/badaas/mocks/services" + "github.com/ditrit/badaas/persistence/models" ) var logger, _ = zap.NewDevelopment() @@ -30,7 +31,7 @@ func TestGetWithoutTypeReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/", strings.NewReader(""), ) @@ -42,7 +43,7 @@ func TestGetWithoutTypeReturnsError(t *testing.T) { func TestGetOfNotExistentTypeReturnsError(t *testing.T) { eavService := mockServices.NewEAVService(t) - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() eavService. On("GetEntity", "no-exists", uuid). Return(nil, gorm.ErrRecordNotFound) @@ -53,7 +54,7 @@ func TestGetOfNotExistentTypeReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/no-exists/id", strings.NewReader(""), ) @@ -76,7 +77,7 @@ func TestGetWithoutEntityIDReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader(""), ) @@ -99,7 +100,7 @@ func TestGetWithEntityIDNotUUIDReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/not-uuid", strings.NewReader(""), ) @@ -116,7 +117,7 @@ func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { Name: "entityType", } - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() eavService. On("GetEntity", entityType.Name, uuid). @@ -128,7 +129,7 @@ func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/"+uuid.String(), strings.NewReader(""), ) @@ -145,7 +146,7 @@ func TestGetWithErrorInDBReturnsError(t *testing.T) { Name: "entityType", } - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() eavService. On("GetEntity", entityType.Name, uuid). @@ -157,7 +158,7 @@ func TestGetWithErrorInDBReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/"+uuid.String(), strings.NewReader(""), ) @@ -178,7 +179,7 @@ func TestGetWithCorrectIDReturnsObject(t *testing.T) { EntityType: entityType, } - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() eavService. On("GetEntity", entityType.Name, uuid). @@ -190,7 +191,7 @@ func TestGetWithCorrectIDReturnsObject(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/"+uuid.String(), strings.NewReader(""), ) @@ -212,7 +213,7 @@ func TestGetAllWithoutTypeReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/", strings.NewReader(""), ) @@ -234,7 +235,7 @@ func TestGetAllOfNotExistentTypeReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/no-exists", strings.NewReader(""), ) @@ -257,7 +258,7 @@ func TestGetAllWithErrorInDBReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/no-exists", strings.NewReader(""), ) @@ -291,7 +292,7 @@ func TestGetAllWithoutParams(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader(""), ) @@ -325,7 +326,7 @@ func TestGetAllWithParams(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/exists/", strings.NewReader("{\"param1\": \"something\"}"), ) @@ -348,7 +349,7 @@ func TestDeleteWithoutTypeReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "DELETE", + http.MethodDelete, "/objects/", strings.NewReader(""), ) @@ -360,7 +361,7 @@ func TestDeleteWithoutTypeReturnsError(t *testing.T) { func TestDeleteOfNotExistentTypeReturnsError(t *testing.T) { eavService := mockServices.NewEAVService(t) - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() eavService. On("DeleteEntity", "no-exists", uuid). @@ -372,7 +373,7 @@ func TestDeleteOfNotExistentTypeReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "DELETE", + http.MethodDelete, "/objects/no-exists/"+uuid.String(), strings.NewReader(""), ) @@ -389,7 +390,7 @@ func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { Name: "entityType", } - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() eavService. On("DeleteEntity", entityType.Name, uuid). @@ -401,7 +402,7 @@ func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "DELETE", + http.MethodDelete, "/objects/exists/"+uuid.String(), strings.NewReader(""), ) @@ -418,7 +419,7 @@ func TestDeleteObjectReturnsNil(t *testing.T) { Name: "entityType", } - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() eavService. On("DeleteEntity", entityType.Name, uuid). @@ -430,7 +431,7 @@ func TestDeleteObjectReturnsNil(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "DELETE", + http.MethodDelete, "/objects/exists/"+uuid.String(), strings.NewReader(""), ) @@ -452,7 +453,7 @@ func TestCreateWithoutTypeReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/objects/", strings.NewReader(""), ) @@ -474,7 +475,7 @@ func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/objects/exists", strings.NewReader("bad json"), ) @@ -497,7 +498,7 @@ func TestCreateOfNotExistentTypeReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/objects/no-exists", strings.NewReader("{\"1\": \"1\"}"), ) @@ -524,7 +525,7 @@ func TestCreteObjectWithErrorInDBReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/objects/exists", strings.NewReader("{\"1\": \"1\"}"), ) @@ -555,7 +556,7 @@ func TestCreteObjectReturnsObject(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/objects/exists", strings.NewReader("{\"1\": \"1\"}"), ) @@ -577,7 +578,7 @@ func TestModifyWithoutTypeReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "PUT", + http.MethodPut, "/objects/", strings.NewReader(""), ) @@ -593,7 +594,7 @@ func TestUpdateObjectWithBadJSONReturnsError(t *testing.T) { Name: "entityType", } - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() controller := controllers.NewEAVController( logger, @@ -601,7 +602,7 @@ func TestUpdateObjectWithBadJSONReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "PUT", + http.MethodPut, "/objects/exists", strings.NewReader("bad json"), ) @@ -614,7 +615,7 @@ func TestUpdateObjectWithBadJSONReturnsError(t *testing.T) { func TestModifyOfNotExistentTypeReturnsError(t *testing.T) { eavService := mockServices.NewEAVService(t) - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() eavService. On("UpdateEntity", "no-exists", uuid, map[string]any{"1": "1"}). @@ -626,7 +627,7 @@ func TestModifyOfNotExistentTypeReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/objects/no-exists", strings.NewReader("{\"1\": \"1\"}"), ) @@ -643,7 +644,7 @@ func TestUpdateObjectWithErrorInDBReturnsError(t *testing.T) { Name: "entityType", } - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() eavService. On("UpdateEntity", entityType.Name, uuid, map[string]any{"1": "1"}). @@ -655,7 +656,7 @@ func TestUpdateObjectWithErrorInDBReturnsError(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "PUT", + http.MethodPut, "/objects/exists/"+uuid.String(), strings.NewReader("{\"1\": \"1\"}"), ) @@ -672,7 +673,7 @@ func TestUpdateObjectReturnsObject(t *testing.T) { Name: "entityType", } - uuid := badorm.UUID(uuid.New()) + uuid := badorm.NewUUID() entity := &models.Entity{ EntityType: entityType, } @@ -687,7 +688,7 @@ func TestUpdateObjectReturnsObject(t *testing.T) { ) response := httptest.NewRecorder() request := httptest.NewRequest( - "PUT", + http.MethodPut, "/objects/exists/"+uuid.String(), strings.NewReader("{\"1\": \"1\"}"), ) diff --git a/controllers/info.go b/controllers/info.go index 50e58ad3..81297fb6 100644 --- a/controllers/info.go +++ b/controllers/info.go @@ -4,6 +4,7 @@ import ( "net/http" "github.com/Masterminds/semver/v3" + "github.com/ditrit/badaas/httperrors" ) diff --git a/controllers/utils.go b/controllers/utils.go index 469d6e69..b265d7da 100644 --- a/controllers/utils.go +++ b/controllers/utils.go @@ -6,14 +6,15 @@ import ( "io" "net/http" - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/httperrors" "github.com/gorilla/mux" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/httperrors" ) var ( - // Sent when the request is malformed + // HTTPErrRequestMalformed is sent when the request is malformed HTTPErrRequestMalformed httperrors.HTTPError = httperrors.NewHTTPError( http.StatusBadRequest, "Request malformed", @@ -40,8 +41,9 @@ func decodeJSON(r *http.Request, to any) httperrors.HTTPError { func decodeJSONOptional(r *http.Request) (map[string]any, httperrors.HTTPError) { to := map[string]any{} err := json.NewDecoder(r.Body).Decode(&to) + switch { - case err == io.EOF: + case errors.Is(err, io.EOF): // empty body return to, nil case err != nil: @@ -71,6 +73,7 @@ func mapServiceError(err error) httperrors.HTTPError { if errors.Is(err, gorm.ErrRecordNotFound) { return ErrEntityNotFound } + return httperrors.NewDBError(err) } diff --git a/httperrors/httperrors.go b/httperrors/httperrors.go index ca43c4f1..bb1338b6 100644 --- a/httperrors/httperrors.go +++ b/httperrors/httperrors.go @@ -5,21 +5,9 @@ import ( "fmt" "net/http" - "github.com/ditrit/badaas/persistence/models/dto" "go.uber.org/zap" -) -var ( - // AnError is an HTTPError instance useful for testing. If the code does not care - // about HTTPError specifics, and only needs to return the HTTPError for example, this - // HTTPError should be used to make the test code more readable. - AnError HTTPError = &HTTPErrorImpl{ - Status: -1, - Err: "TESTING ERROR", - Message: "USE ONLY FOR TESTING", - GolangError: nil, - toLog: true, - } + "github.com/ditrit/badaas/persistence/models/dto" ) type HTTPError interface { @@ -46,12 +34,13 @@ type HTTPErrorImpl struct { // Convert an HTTPError to a json string func (httpError *HTTPErrorImpl) ToJSON() string { - dto := &dto.DTOHTTPError{ + dtoHTTPError := &dto.HTTPError{ Error: httpError.Err, Message: httpError.Message, Status: http.StatusText(httpError.Status), } - payload, _ := json.Marshal(dto) + payload, _ := json.Marshal(dtoHTTPError) + return string(payload) } @@ -70,6 +59,7 @@ func (httpError *HTTPErrorImpl) Write(httpResponse http.ResponseWriter, logger * if httpError.toLog && logger != nil { logHTTPError(httpError, logger) } + http.Error(httpResponse, httpError.ToJSON(), httpError.Status) } @@ -83,7 +73,7 @@ func logHTTPError(httpError *HTTPErrorImpl, logger *zap.Logger) { } // HTTPError constructor -func NewHTTPError(status int, err string, message string, golangError error, toLog bool) HTTPError { +func NewHTTPError(status int, err, message string, golangError error, toLog bool) HTTPError { return &HTTPErrorImpl{ Status: status, Err: err, @@ -94,7 +84,7 @@ func NewHTTPError(status int, err string, message string, golangError error, toL } // A constructor for an HttpError "Not Found" -func NewErrorNotFound(resourceName string, msg string) HTTPError { +func NewErrorNotFound(resourceName, msg string) HTTPError { return NewHTTPError( http.StatusNotFound, fmt.Sprintf("%s not found", resourceName), @@ -105,7 +95,7 @@ func NewErrorNotFound(resourceName string, msg string) HTTPError { } // A constructor for an HttpError "Internal Server Error" -func NewInternalServerError(errorName string, msg string, err error) HTTPError { +func NewInternalServerError(errorName, msg string, err error) HTTPError { return NewHTTPError( http.StatusInternalServerError, errorName, @@ -121,7 +111,7 @@ func NewDBError(err error) HTTPError { } // A constructor for an HttpError "Unauthorized Error" -func NewUnauthorizedError(errorName string, msg string) HTTPError { +func NewUnauthorizedError(errorName, msg string) HTTPError { return NewHTTPError( http.StatusUnauthorized, errorName, @@ -132,6 +122,6 @@ func NewUnauthorizedError(errorName string, msg string) HTTPError { } // A constructor for an HTTPError "Bad Request" -func NewBadRequestError(err string, msg string) HTTPError { +func NewBadRequestError(err, msg string) HTTPError { return NewHTTPError(http.StatusBadRequest, err, msg, nil, false) } diff --git a/httperrors/httperrors_test.go b/httperrors/httperrors_test.go index 4f0c8357..fbc7115e 100644 --- a/httperrors/httperrors_test.go +++ b/httperrors/httperrors_test.go @@ -9,25 +9,31 @@ import ( "net/http/httptest" "testing" - "github.com/ditrit/badaas/httperrors" - "github.com/ditrit/badaas/persistence/models/dto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" + + "github.com/ditrit/badaas/httperrors" + "github.com/ditrit/badaas/persistence/models/dto" ) func TestTojson(t *testing.T) { - err := "Error while parsing json" + errString := "Error while parsing json" message := "The request body was malformed" - error := httperrors.NewHTTPError(http.StatusBadRequest, err, message, nil, true) - assert.NotEmpty(t, error.ToJSON()) - assert.True(t, json.Valid([]byte(error.ToJSON())), "output json is not valid") + herr := httperrors.NewHTTPError(http.StatusBadRequest, errString, message, nil, true) + assert.NotEmpty(t, herr.ToJSON()) + assert.True(t, json.Valid([]byte(herr.ToJSON())), "output json is not valid") - // check if is is correctly deserialized + // check if it is correctly deserialized var content map[string]any - json.Unmarshal([]byte(error.ToJSON()), &content) + + err := json.Unmarshal([]byte(herr.ToJSON()), &content) + if err != nil { + t.Error(err) + } + _, ok := content["err"] assert.True(t, ok, "\"err\" field should be in the json string") _, ok = content["msg"] @@ -35,35 +41,52 @@ func TestTojson(t *testing.T) { _, ok = content["status"] assert.True(t, ok, "\"status\" field should be in the json string") - assert.Equal(t, err, content["err"].(string)) - assert.Equal(t, message, content["msg"].(string)) - assert.Equal(t, http.StatusText(http.StatusBadRequest), content["status"].(string)) - assert.True(t, error.Log()) + contentErr, ok := content["err"].(string) + if !ok { + t.Error("content err is not a string") + } + + assert.Equal(t, errString, contentErr) + + contentMsg, ok := content["msg"].(string) + if !ok { + t.Error("content msg is not a string") + } + + assert.Equal(t, message, contentMsg) + + contentStatus, ok := content["status"].(string) + if !ok { + t.Error("content status is not a string") + } + + assert.Equal(t, http.StatusText(http.StatusBadRequest), contentStatus) + assert.True(t, herr.Log()) } func TestLog(t *testing.T) { - error := httperrors.NewHTTPError(http.StatusBadRequest, "err", "message", nil, true) - assert.True(t, error.Log()) - error = httperrors.NewHTTPError(http.StatusBadRequest, "err", "message", nil, false) - assert.False(t, error.Log()) + herr := httperrors.NewHTTPError(http.StatusBadRequest, "err", "message", nil, true) + assert.True(t, herr.Log()) + herr = httperrors.NewHTTPError(http.StatusBadRequest, "err", "message", nil, false) + assert.False(t, herr.Log()) } func TestError(t *testing.T) { - error := httperrors.NewHTTPError(http.StatusBadRequest, "Error while parsing json", "The request body was malformed", nil, true) - assert.Contains(t, error.Error(), error.ToJSON()) + herr := httperrors.NewHTTPError(http.StatusBadRequest, "Error while parsing json", "The request body was malformed", nil, true) + assert.Contains(t, herr.Error(), herr.ToJSON()) } func TestWrite(t *testing.T) { res := httptest.NewRecorder() - error := httperrors.NewHTTPError(http.StatusBadRequest, "Error while parsing json", "The request body was malformed", nil, true) - error.Write(res, zap.L()) + herr := httperrors.NewHTTPError(http.StatusBadRequest, "Error while parsing json", "The request body was malformed", nil, true) + herr.Write(res, zap.L()) bodyBytes, err := io.ReadAll(res.Body) assert.Nil(t, err) assert.NotEmpty(t, bodyBytes) - originalBytes := []byte(error.ToJSON()) + + originalBytes := []byte(herr.ToJSON()) // can't use assert.Contains because it only support strings - assert.True(t, - bytes.Contains(bodyBytes, originalBytes)) + assert.True(t, bytes.Contains(bodyBytes, originalBytes)) } func TestLogger(t *testing.T) { @@ -72,8 +95,8 @@ func TestLogger(t *testing.T) { observedLogger := zap.New(observedZapCore) res := httptest.NewRecorder() - error := httperrors.NewHTTPError(http.StatusBadRequest, "Error while parsing json", "The request body was malformed", nil, true) - error.Write(res, observedLogger) + herr := httperrors.NewHTTPError(http.StatusBadRequest, "Error while parsing json", "The request body was malformed", nil, true) + herr.Write(res, observedLogger) require.Equal(t, 1, observedLogs.Len()) log := observedLogs.All()[0] @@ -88,44 +111,48 @@ func TestLogger(t *testing.T) { func TestNewErrorNotFound(t *testing.T) { ressourceName := "file" - error := httperrors.NewErrorNotFound(ressourceName, "main.css is not accessible") - assert.NotNil(t, error) - assert.False(t, error.Log()) - dto := new(dto.DTOHTTPError) - err := json.Unmarshal([]byte(error.ToJSON()), &dto) + herr := httperrors.NewErrorNotFound(ressourceName, "main.css is not accessible") + assert.NotNil(t, herr) + assert.False(t, herr.Log()) + + dtoHTTPError := new(dto.HTTPError) + err := json.Unmarshal([]byte(herr.ToJSON()), &dtoHTTPError) assert.NoError(t, err) - assert.Equal(t, http.StatusText(http.StatusNotFound), dto.Status) - assert.Equal(t, fmt.Sprintf("%s not found", ressourceName), dto.Error) + assert.Equal(t, http.StatusText(http.StatusNotFound), dtoHTTPError.Status) + assert.Equal(t, fmt.Sprintf("%s not found", ressourceName), dtoHTTPError.Error) } func TestNewInternalServerError(t *testing.T) { - error := httperrors.NewInternalServerError("casbin error", "the ressource is not accessible", nil) - assert.NotNil(t, error) - assert.True(t, error.Log()) - dto := new(dto.DTOHTTPError) - err := json.Unmarshal([]byte(error.ToJSON()), &dto) + herr := httperrors.NewInternalServerError("casbin error", "the ressource is not accessible", nil) + assert.NotNil(t, herr) + assert.True(t, herr.Log()) + + dtoHTTPError := new(dto.HTTPError) + err := json.Unmarshal([]byte(herr.ToJSON()), &dtoHTTPError) assert.NoError(t, err) - assert.Equal(t, http.StatusText(http.StatusInternalServerError), dto.Status) + assert.Equal(t, http.StatusText(http.StatusInternalServerError), dtoHTTPError.Status) } func TestNewUnauthorizedError(t *testing.T) { - error := httperrors.NewUnauthorizedError("json unmarshalling", "nil value whatever") - assert.NotNil(t, error) - assert.True(t, error.Log()) - dto := new(dto.DTOHTTPError) - err := json.Unmarshal([]byte(error.ToJSON()), &dto) + herr := httperrors.NewUnauthorizedError("json unmarshalling", "nil value whatever") + assert.NotNil(t, herr) + assert.True(t, herr.Log()) + + dtoHTTPError := new(dto.HTTPError) + err := json.Unmarshal([]byte(herr.ToJSON()), &dtoHTTPError) assert.NoError(t, err) - assert.Equal(t, http.StatusText(http.StatusUnauthorized), dto.Status) + assert.Equal(t, http.StatusText(http.StatusUnauthorized), dtoHTTPError.Status) } func TestNewBadRequestError(t *testing.T) { - error := httperrors.NewBadRequestError("id must be an unsigned integer", "please use a valid id") - assert.NotNil(t, error) - assert.False(t, error.Log()) - dto := new(dto.DTOHTTPError) - err := json.Unmarshal([]byte(error.ToJSON()), &dto) + herr := httperrors.NewBadRequestError("id must be an unsigned integer", "please use a valid id") + assert.NotNil(t, herr) + assert.False(t, herr.Log()) + + dtoHTTPError := new(dto.HTTPError) + err := json.Unmarshal([]byte(herr.ToJSON()), &dtoHTTPError) assert.NoError(t, err) - assert.Equal(t, http.StatusText(http.StatusBadRequest), dto.Status) - assert.Equal(t, "id must be an unsigned integer", dto.Error) - assert.Equal(t, "please use a valid id", dto.Message) + assert.Equal(t, http.StatusText(http.StatusBadRequest), dtoHTTPError.Status) + assert.Equal(t, "id must be an unsigned integer", dtoHTTPError.Error) + assert.Equal(t, "please use a valid id", dtoHTTPError.Message) } diff --git a/logger/log.go b/logger/log.go index 725daec2..8527db43 100644 --- a/logger/log.go +++ b/logger/log.go @@ -3,8 +3,9 @@ package logger import ( "log" - "github.com/ditrit/badaas/configuration" "go.uber.org/zap" + + "github.com/ditrit/badaas/configuration" ) const ( @@ -17,6 +18,7 @@ func NewLogger(conf configuration.LoggerConfiguration) *zap.Logger { var config zap.Config if conf.GetMode() == ProductionLogger { config = zap.NewProductionConfig() + log.Printf("Log mode use: %s\n", ProductionLogger) } else { config = zap.NewDevelopmentConfig() @@ -24,11 +26,13 @@ func NewLogger(conf configuration.LoggerConfiguration) *zap.Logger { } config.DisableStacktrace = true + logger, err := config.Build() if err != nil { panic(err) } logger.Info("The logger was successfully initialized") + return logger } diff --git a/logger/log_test.go b/logger/log_test.go index 873a698c..2271131b 100644 --- a/logger/log_test.go +++ b/logger/log_test.go @@ -3,9 +3,10 @@ package logger import ( "testing" - configurationmocks "github.com/ditrit/badaas/mocks/configuration" "github.com/stretchr/testify/assert" "go.uber.org/zap/zapcore" + + configurationmocks "github.com/ditrit/badaas/mocks/configuration" ) func TestInitializeDevelopmentLogger(t *testing.T) { diff --git a/persistence/ModuleFx.go b/persistence/ModuleFx.go index bca155d3..a682f2cb 100644 --- a/persistence/ModuleFx.go +++ b/persistence/ModuleFx.go @@ -1,9 +1,10 @@ package persistence import ( + "go.uber.org/fx" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/gormdatabase" - "go.uber.org/fx" ) // PersistanceModule for fx diff --git a/persistence/gormdatabase/db.go b/persistence/gormdatabase/db.go index 22830781..2e08f275 100644 --- a/persistence/gormdatabase/db.go +++ b/persistence/gormdatabase/db.go @@ -10,7 +10,6 @@ import ( "github.com/ditrit/badaas/configuration" ) -// Create the dsn string from the configuration func createDialectorFromConf(databaseConfiguration configuration.DatabaseConfiguration) (gorm.Dialector, error) { switch databaseConfiguration.GetDialector() { case configuration.PostgreSQL: @@ -56,6 +55,7 @@ func SetupDatabaseConnection( if err != nil { return nil, err } + return badorm.ConnectToDialector( logger, dialector, diff --git a/persistence/gormdatabase/gormzap/gormzap.go b/persistence/gormdatabase/gormzap/gormzap.go index 0f7b9563..d7878854 100644 --- a/persistence/gormdatabase/gormzap/gormzap.go +++ b/persistence/gormdatabase/gormzap/gormzap.go @@ -55,6 +55,7 @@ func (l Logger) Info(_ context.Context, str string, args ...interface{}) { if l.LogLevel < gormlogger.Info { return } + l.logger().Sugar().Debugf(str, args...) } @@ -63,6 +64,7 @@ func (l Logger) Warn(_ context.Context, str string, args ...interface{}) { if l.LogLevel < gormlogger.Warn { return } + l.logger().Sugar().Warnf(str, args...) } @@ -71,6 +73,7 @@ func (l Logger) Error(_ context.Context, str string, args ...interface{}) { if l.LogLevel < gormlogger.Error { return } + l.logger().Sugar().Errorf(str, args...) } @@ -82,6 +85,7 @@ func (l Logger) Trace(_ context.Context, begin time.Time, fc func() (string, int elapsed := time.Since(begin) sql, rows := fc() + switch { case err != nil && l.LogLevel >= gormlogger.Error && (!l.IgnoreRecordNotFoundError || !errors.Is(err, gorm.ErrRecordNotFound)): l.logger().Error("trace", zap.Error(err), zap.Duration("elapsed", elapsed), zap.Int64("rows", rows), zap.String("sql", sql)) @@ -101,14 +105,11 @@ var ( func (l Logger) logger() *zap.Logger { for i := 2; i < 15; i++ { _, file, _, ok := runtime.Caller(i) - switch { - case !ok: - case strings.HasSuffix(file, "_test.go"): - case strings.Contains(file, gormPackage): - case strings.Contains(file, zapgormPackage): - default: + + if ok && !strings.HasSuffix(file, "_test.go") && !strings.Contains(file, gormPackage) && !strings.Contains(file, zapgormPackage) { return l.ZapLogger.WithOptions(zap.AddCallerSkip(i)) } } + return l.ZapLogger } diff --git a/persistence/gormdatabase/helpers.go b/persistence/gormdatabase/helpers.go index 96223928..2b3c1669 100644 --- a/persistence/gormdatabase/helpers.go +++ b/persistence/gormdatabase/helpers.go @@ -1,6 +1,10 @@ package gormdatabase -import "github.com/jackc/pgconn" +import ( + "errors" + + "github.com/jackc/pgconn" +) func IsDuplicateKeyError(err error) bool { // unique_violation code is equals to 23505 @@ -8,9 +12,9 @@ func IsDuplicateKeyError(err error) bool { } func IsPostgresError(err error, errCode string) bool { - postgresError, ok := err.(*pgconn.PgError) - if ok { - return postgresError.Code == errCode + var pgerr *pgconn.PgError + if ok := errors.As(err, &pgerr); ok { + return pgerr.Code == errCode } return false diff --git a/persistence/gormdatabase/helpers_test.go b/persistence/gormdatabase/helpers_test.go index dd464993..d63341d5 100644 --- a/persistence/gormdatabase/helpers_test.go +++ b/persistence/gormdatabase/helpers_test.go @@ -20,10 +20,12 @@ func TestIsDuplicateError(t *testing.T) { func Test_isPostgresError(t *testing.T) { var postgresErrorAsError error = &pgconn.PgError{Code: "1234"} + assert.True(t, IsPostgresError( postgresErrorAsError, "1234", )) + postgresErrorAsError = &pgconn.PgError{Code: ""} assert.False(t, IsPostgresError( postgresErrorAsError, diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go index 5cbc0c13..459d454c 100644 --- a/persistence/models/Attribute.go +++ b/persistence/models/Attribute.go @@ -45,7 +45,8 @@ var ErrNoDefaultValueSet = errors.New("no default value found") func NewRelationAttribute(entityType *EntityType, name string, unique bool, required bool, - relationTargetEntityType *EntityType) *Attribute { + relationTargetEntityType *EntityType, +) *Attribute { return &Attribute{ EntityTypeID: entityType.ID, Name: name, diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go index 2638d75d..e5e2fc0a 100644 --- a/persistence/models/Entity.go +++ b/persistence/models/Entity.go @@ -39,10 +39,12 @@ func (e *Entity) MarshalJSON() ([]byte, error) { // return the values in a json encoded string func (e *Entity) encodeValues() map[string]any { pairs := make(map[string]any, len(e.Fields)) + for _, field := range e.Fields { if field.IsNull { continue } + pairs[field.Attribute.Name] = field.Value() } diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go index f90a0806..8ba27d48 100644 --- a/persistence/models/Entity_test.go +++ b/persistence/models/Entity_test.go @@ -3,9 +3,10 @@ package models import ( "testing" - "github.com/ditrit/badaas/badorm" "github.com/google/uuid" "github.com/stretchr/testify/assert" + + "github.com/ditrit/badaas/badorm" ) func TestMarshall(t *testing.T) { @@ -68,7 +69,7 @@ func TestMarshall(t *testing.T) { p, _ := et.MarshalJSON() assert.JSONEq( t, - `{"attrs":{"color":"blue"},"id":"11e1d4b8-701d-47cc-852f-6d36922bcc75","type":"bird", "createdAt":"0001-01-01T00:00:00Z", "updatedAt":"0001-01-01T00:00:00Z"}`, + `{"attrs":{"color":"blue"},"id":"11e1d4b8-701d-47cc-852f-6d36922bcc75","type":"bird", "createdAt":"0001-01-01T00:00:00Z", "updatedAt":"0001-01-01T00:00:00Z"}`, //nolint:lll string(p), ) } diff --git a/persistence/models/Session_test.go b/persistence/models/Session_test.go index 1610d26b..4494b47b 100644 --- a/persistence/models/Session_test.go +++ b/persistence/models/Session_test.go @@ -4,8 +4,9 @@ import ( "testing" "time" - "github.com/ditrit/badaas/persistence/models" "github.com/stretchr/testify/assert" + + "github.com/ditrit/badaas/persistence/models" ) func TestExpired(t *testing.T) { diff --git a/persistence/models/Value_test.go b/persistence/models/Value_test.go index 42e4541c..2f0fba8c 100644 --- a/persistence/models/Value_test.go +++ b/persistence/models/Value_test.go @@ -4,9 +4,9 @@ import ( "fmt" "testing" - "github.com/ditrit/badaas/badorm" - "github.com/google/uuid" "github.com/stretchr/testify/assert" + + "github.com/ditrit/badaas/badorm" ) func TestRelationValueNeedsEntity(t *testing.T) { @@ -25,8 +25,8 @@ func TestRelationValueNeedsEntity(t *testing.T) { } func TestRelationValueEntityHasToBeTheTargetOfTheAttribute(t *testing.T) { - brandEttID := badorm.UUID(uuid.New()) - carEttID := badorm.UUID(uuid.New()) + brandEttID := badorm.NewUUID() + carEttID := badorm.NewUUID() brandEtt := &EntityType{ UUIDModel: badorm.UUIDModel{ @@ -62,14 +62,14 @@ func TestRelationValueEntityHasToBeTheTargetOfTheAttribute(t *testing.T) { func TestRelationValueWithCorrespondingEntity(t *testing.T) { brandEtt := &EntityType{ UUIDModel: badorm.UUIDModel{ - ID: badorm.UUID(uuid.New()), + ID: badorm.NewUUID(), }, Name: "brand", } carEtt := &EntityType{ UUIDModel: badorm.UUIDModel{ - ID: badorm.UUID(uuid.New()), + ID: badorm.NewUUID(), }, Name: "car", } @@ -218,6 +218,7 @@ func TestSetNullWorks(t *testing.T) { value, err := NewStringValue(attr, "salut") assert.Nil(t, err) - value.SetNull() + err = value.SetNull() + assert.Nil(t, err) assert.Nil(t, value.Value()) } diff --git a/persistence/models/dto/HTTPError.go b/persistence/models/dto/HTTPError.go index 0e352145..e182eadd 100644 --- a/persistence/models/dto/HTTPError.go +++ b/persistence/models/dto/HTTPError.go @@ -1,9 +1,9 @@ package dto -// Data Transfert Object Package +// Data Transfer Object Package // Describe the HTTP Error payload -type DTOHTTPError struct { +type HTTPError struct { Error string `json:"err"` Message string `json:"msg"` Status string `json:"status"` diff --git a/persistence/models/dto/LoginSuccess.go b/persistence/models/dto/LoginSuccess.go index 675c670b..87492bad 100644 --- a/persistence/models/dto/LoginSuccess.go +++ b/persistence/models/dto/LoginSuccess.go @@ -1,7 +1,7 @@ package dto -// DTOLoginSuccess is a dto returned to the client when the authentication is successful. -type DTOLoginSuccess struct { +// LoginSuccess is a dto returned to the client when the authentication is successful. +type LoginSuccess struct { Email string `json:"email"` ID string `json:"id"` Username string `json:"username"` diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go index ee354a64..41832356 100644 --- a/persistence/repository/EntityRepository.go +++ b/persistence/repository/EntityRepository.go @@ -6,7 +6,6 @@ import ( sq "github.com/Masterminds/squirrel" "github.com/elliotchance/pie/v2" - "github.com/google/uuid" "go.uber.org/zap" "gorm.io/driver/postgres" "gorm.io/gorm" @@ -39,6 +38,7 @@ func (r *EntityRepository) Get(tx *gorm.DB, entityTypeName string, id badorm.UUI `JOIN entity_types ON entity_types.id = entities.entity_type_id`, ) + err := query.Where( map[string]any{"entities.id": id, "entity_types.name": entityTypeName}, ).First(&entity).Error @@ -63,7 +63,7 @@ func (r *EntityRepository) Create(tx *gorm.DB, entity *models.Entity) error { now := time.Now() - entity.ID = badorm.UUID(uuid.New()) + entity.ID = badorm.NewUUID() query, values, err := sq.Insert("entities"). Columns("id", "created_at", "updated_at", "entity_type_id"). @@ -112,6 +112,7 @@ func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attribut attributesSuffix, entitiesTableSuffix, ) + switch expectedValueTyped := expectedValue.(type) { case float64: stringQuery += fmt.Sprintf( @@ -119,17 +120,21 @@ func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attribut getQueryCheckValueOfType(attributesSuffix, models.IntValueType), getQueryCheckValueOfType(attributesSuffix, models.FloatValueType), ) + queryArgs = append(queryArgs, expectedValue, expectedValue) case bool: stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.BooleanValueType) + queryArgs = append(queryArgs, expectedValue) case string: uuid, err := badorm.ParseUUID(expectedValueTyped) if err == nil { stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.RelationValueType) + queryArgs = append(queryArgs, uuid) } else { stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.StringValueType) + queryArgs = append(queryArgs, expectedValue) } case nil: @@ -137,6 +142,7 @@ func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attribut "AND values%[1]s.is_null = ?", attributesSuffix, ) + queryArgs = append(queryArgs, true) case map[string]any: return r.addJoinToQuery( diff --git a/persistence/repository/EntityRepository_test.go b/persistence/repository/EntityRepository_test.go index 3fa7d410..2a178e86 100644 --- a/persistence/repository/EntityRepository_test.go +++ b/persistence/repository/EntityRepository_test.go @@ -60,9 +60,13 @@ type AttributeNameAndValue struct { AttributeValue any } +var ( + attributeName = "attrName" + aString = "a string" +) + func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForString() { - attributeName := "attrName" - attributeValue := "a string" + attributeValue := aString s.mock.ExpectQuery(regexp.QuoteMeta( `SELECT entities.* FROM "entities" JOIN attributes attributes_attrName ON @@ -82,7 +86,6 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForString() { } func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForStringUUID() { - attributeName := "attrName" attributeValue := uuid.New().String() s.mock.ExpectQuery(regexp.QuoteMeta( `SELECT entities.* FROM "entities" @@ -103,7 +106,6 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForStringUUID() { } func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForBool() { - attributeName := "attrName" attributeValue := true s.mock.ExpectQuery(regexp.QuoteMeta( `SELECT entities.* FROM "entities" @@ -124,7 +126,6 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForBool() { } func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForNil() { - attributeName := "attrName" s.mock.ExpectQuery(regexp.QuoteMeta( `SELECT entities.* FROM "entities" JOIN attributes attributes_attrName ON @@ -143,7 +144,6 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForNil() { } func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckIntAndFloatForFloat() { - attributeName := "attrName" attributeValue := 1.2 s.mock.ExpectQuery(regexp.QuoteMeta( `SELECT entities.* FROM "entities" @@ -164,7 +164,7 @@ func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckIntAndFloatForFlo func (s *EntityRepositorySuite) TestAddValueCheck2AddsValueCheckFor2Values() { attributeName1 := "attrName1" - attributeValue1 := "a string" + attributeValue1 := aString attributeName2 := "attrName2" attributeValue2 := true s.mock.ExpectQuery(regexp.QuoteMeta( @@ -197,9 +197,8 @@ func (s *EntityRepositorySuite) TestAddValueCheck2AddsValueCheckFor2Values() { } func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMap() { - attributeName := "attrName" innerAttributeName := "innerAttrName" - innerAttributeValue := "a string" + innerAttributeValue := aString attributeValue := map[string]any{innerAttributeName: innerAttributeValue} s.mock.ExpectQuery(regexp.QuoteMeta( `SELECT entities.* FROM "entities" diff --git a/persistence/repository/EntityTypeRepository.go b/persistence/repository/EntityTypeRepository.go index 52f17c07..e52a6c9c 100644 --- a/persistence/repository/EntityTypeRepository.go +++ b/persistence/repository/EntityTypeRepository.go @@ -1,10 +1,11 @@ package repository import ( - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/models" "go.uber.org/zap" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/persistence/models" ) type EntityTypeRepository struct { @@ -21,18 +22,22 @@ func NewEntityTypeRepository( func (r *EntityTypeRepository) Get(tx *gorm.DB, id badorm.UUID) (*models.EntityType, error) { var entityType models.EntityType + err := tx.Preload("Attributes").First(&entityType, id).Error if err != nil { return nil, err } + return &entityType, nil } func (r *EntityTypeRepository) GetByName(tx *gorm.DB, name string) (*models.EntityType, error) { var entityType models.EntityType + err := tx.Preload("Attributes").First(&entityType, "name = ?", name).Error if err != nil { return nil, err } + return &entityType, nil } diff --git a/persistence/repository/ValueRepository.go b/persistence/repository/ValueRepository.go index 6679af91..99f9dee9 100644 --- a/persistence/repository/ValueRepository.go +++ b/persistence/repository/ValueRepository.go @@ -4,12 +4,12 @@ import ( "time" sq "github.com/Masterminds/squirrel" - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/models" "github.com/elliotchance/pie/v2" - "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/persistence/models" ) type ValueRepository struct { @@ -32,7 +32,7 @@ func (r *ValueRepository) Create(tx *gorm.DB, values []*models.Value) error { now := time.Now() pie.Each(values, func(value *models.Value) { - value.ID = badorm.UUID(uuid.New()) + value.ID = badorm.NewUUID() }) query := sq.Insert("values_"). diff --git a/router/ModuleFx.go b/router/ModuleFx.go index 90901ddb..e5eeaf22 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -3,11 +3,12 @@ package router import ( "fmt" + "go.uber.org/fx" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/router/middlewares" "github.com/ditrit/badaas/services" - "go.uber.org/fx" ) // RouterModule for fx @@ -71,6 +72,7 @@ var EAVRoutesModule = fx.Module( func GetCRUDRoutesModule[T any]() fx.Option { typeName := fmt.Sprintf("%T", *new(T)) + return fx.Module( typeName+"CRUDRoutesModule", // service diff --git a/router/middlewares/middlewareAuthentication.go b/router/middlewares/middlewareAuthentication.go index 2638ddc6..269cf024 100644 --- a/router/middlewares/middlewareAuthentication.go +++ b/router/middlewares/middlewareAuthentication.go @@ -3,15 +3,14 @@ package middlewares import ( "net/http" + "go.uber.org/zap" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/services/sessionservice" - "go.uber.org/zap" ) -var ( - NotAuthenticated = httperrors.NewUnauthorizedError("Authentication Error", "not authenticated") -) +var NotAuthenticated = httperrors.NewUnauthorizedError("Authentication Error", "not authenticated") // The authentication middleware type AuthenticationMiddleware interface { diff --git a/router/middlewares/middlewareJson.go b/router/middlewares/middlewareJson.go index 641b9bcf..8662bb89 100644 --- a/router/middlewares/middlewareJson.go +++ b/router/middlewares/middlewareJson.go @@ -4,8 +4,9 @@ import ( "encoding/json" "net/http" - "github.com/ditrit/badaas/httperrors" "go.uber.org/zap" + + "github.com/ditrit/badaas/httperrors" ) // A JSONHandler is a function that returns a Marshable object and/or an [github.com/ditrit/badaas/httperrors.HTTPError] @@ -39,9 +40,11 @@ func (controller *jsonControllerImpl) Wrap(handler JSONHandler) func(response ht herr.Write(response, controller.logger) return } + if object == nil { return } + payload, err := json.Marshal(object) if err != nil { httperrors.NewInternalServerError( @@ -49,9 +52,12 @@ func (controller *jsonControllerImpl) Wrap(handler JSONHandler) func(response ht "Can't marshall the object returned by the JSON handler", nil, ).Write(response, controller.logger) + return } + response.Header().Set("Content-Type", "application/json") + _, err = response.Write(payload) if err != nil { controller.logger.Error( diff --git a/router/middlewares/middlewareLogger.go b/router/middlewares/middlewareLogger.go index 5d184b71..88e9a7ec 100644 --- a/router/middlewares/middlewareLogger.go +++ b/router/middlewares/middlewareLogger.go @@ -4,11 +4,12 @@ import ( "fmt" "net/http" - "github.com/ditrit/badaas/configuration" "github.com/gorilla/mux" "github.com/noirbizarre/gonja" "github.com/noirbizarre/gonja/exec" "go.uber.org/zap" + + "github.com/ditrit/badaas/configuration" ) func AddLoggerMiddleware(router *mux.Router, middlewareLogger MiddlewareLogger) { @@ -41,6 +42,7 @@ func NewMiddlewareLogger( if err != nil { return nil, fmt.Errorf("failed to build jinja template from configuration %w", err) } + return &middlewareLoggerImpl{ logger: logger, template: requestLogTemplate, @@ -65,5 +67,6 @@ func getLogMessage(template *exec.Template, r *http.Request) string { "method": r.Method, "url": r.URL.Path, }) + return result } diff --git a/router/middlewares/middlewarelogger_test.go b/router/middlewares/middlewarelogger_test.go index 4d0b2bbe..22e774dc 100644 --- a/router/middlewares/middlewarelogger_test.go +++ b/router/middlewares/middlewarelogger_test.go @@ -6,11 +6,12 @@ import ( "net/url" "testing" - configurationmocks "github.com/ditrit/badaas/mocks/configuration" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap" "go.uber.org/zap/zaptest/observer" + + configurationmocks "github.com/ditrit/badaas/mocks/configuration" ) func TestMiddlewareLogger(t *testing.T) { @@ -18,7 +19,7 @@ func TestMiddlewareLogger(t *testing.T) { observedLogger := zap.New(observedZapCore) req := &http.Request{ - Method: "GET", + Method: http.MethodGet, URL: &url.URL{ Scheme: "http", Host: "localhost", @@ -26,10 +27,10 @@ func TestMiddlewareLogger(t *testing.T) { }, } res := httptest.NewRecorder() - var actuallyRunned bool = false + actuallyRun := false // create a handler to use as "next" which will verify the request nextHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - actuallyRunned = true + actuallyRun = true }) loggerConfiguration := configurationmocks.NewLoggerConfiguration(t) loggerConfiguration.On("GetRequestTemplate").Return("Receive {{method}} request on {{url}}") @@ -37,7 +38,7 @@ func TestMiddlewareLogger(t *testing.T) { assert.NoError(t, err) loggerMiddleware.Handle(nextHandler).ServeHTTP(res, req) - assert.True(t, actuallyRunned) + assert.True(t, actuallyRun) require.Equal(t, 1, observedLogs.Len()) assert.Equal(t, "Receive GET request on /whatever", observedLogs.All()[0].Message) } diff --git a/router/routes.go b/router/routes.go index ae93120f..9b2a4325 100644 --- a/router/routes.go +++ b/router/routes.go @@ -1,14 +1,16 @@ package router import ( + "net/http" "strings" + "github.com/gorilla/mux" + "go.uber.org/zap" + "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/router/middlewares" "github.com/ditrit/badaas/services/userservice" - "github.com/gorilla/mux" - "go.uber.org/zap" ) func AddInfoRoutes( @@ -19,7 +21,7 @@ func AddInfoRoutes( router.HandleFunc( "/info", jsonController.Wrap(infoController.Info), - ).Methods("GET") + ).Methods(http.MethodGet) } // Adds to the "router" the routes for handling authentication: @@ -38,7 +40,7 @@ func AddAuthRoutes( router.HandleFunc( "/login", jsonController.Wrap(basicAuthenticationController.BasicLoginHandler), - ).Methods("POST") + ).Methods(http.MethodPost) protected := router.PathPrefix("").Subrouter() protected.Use(authenticationMiddleware.Handle) @@ -46,7 +48,7 @@ func AddAuthRoutes( protected.HandleFunc( "/logout", jsonController.Wrap(basicAuthenticationController.Logout), - ).Methods("GET") + ).Methods(http.MethodGet) return createSuperUser(logger, config, userService) } @@ -63,6 +65,7 @@ func createSuperUser( logger.Sugar().Errorf("failed to save the super admin %w", err) return err } + logger.Sugar().Infof("The superadmin user already exists in database") } @@ -77,11 +80,11 @@ func AddEAVCRUDRoutes( // Objects CRUD objectsBase := "/eav/objects/{type}" objectsWithID := objectsBase + "/{id}" - router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.GetObject)).Methods("GET") - router.HandleFunc(objectsBase, jsonController.Wrap(eavController.GetObjects)).Methods("GET") - router.HandleFunc(objectsBase, jsonController.Wrap(eavController.CreateObject)).Methods("POST") - router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.UpdateObject)).Methods("PUT") - router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.DeleteObject)).Methods("DELETE") + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.GetObject)).Methods(http.MethodGet) + router.HandleFunc(objectsBase, jsonController.Wrap(eavController.GetObjects)).Methods(http.MethodGet) + router.HandleFunc(objectsBase, jsonController.Wrap(eavController.CreateObject)).Methods(http.MethodPost) + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.UpdateObject)).Methods(http.MethodPut) + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.DeleteObject)).Methods(http.MethodDelete) } func AddCRUDRoutes( @@ -93,17 +96,15 @@ func AddCRUDRoutes( // Objects CRUD objectsBase := "/objects/" + crudRoute.TypeName objectsWithID := objectsBase + "/{id}" - // TODO create + // TODO create, update, delete // read router.HandleFunc( objectsWithID, jsonController.Wrap(crudRoute.Controller.GetObject), - ).Methods("GET") + ).Methods(http.MethodGet) router.HandleFunc( objectsBase, jsonController.Wrap(crudRoute.Controller.GetObjects), - ).Methods("GET") - // TODO update - // TODO delete + ).Methods(http.MethodGet) } } diff --git a/router/routes_test.go b/router/routes_test.go index 28e35379..5dd951d9 100644 --- a/router/routes_test.go +++ b/router/routes_test.go @@ -7,17 +7,18 @@ import ( "testing" "github.com/Masterminds/semver/v3" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "go.uber.org/zap" + "go.uber.org/zap/zaptest/observer" + "github.com/ditrit/badaas/controllers" mocks "github.com/ditrit/badaas/mocks/configuration" mockControllers "github.com/ditrit/badaas/mocks/controllers" mockMiddlewares "github.com/ditrit/badaas/mocks/router/middlewares" mockUserServices "github.com/ditrit/badaas/mocks/services/userservice" "github.com/ditrit/badaas/router/middlewares" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zaptest/observer" ) func TestCreateSuperUser(t *testing.T) { @@ -25,10 +26,12 @@ func TestCreateSuperUser(t *testing.T) { logger := zap.New(core) initializationConfig := mocks.NewInitializationConfiguration(t) initializationConfig.On("GetAdminPassword").Return("adminpassword") + userService := mockUserServices.NewUserService(t) userService. On("NewUser", "admin", "admin-no-reply@badaas.com", "adminpassword"). Return(nil, nil) + err := createSuperUser( logger, initializationConfig, @@ -42,10 +45,12 @@ func TestCreateSuperUser_UserExists(t *testing.T) { logger := zap.New(core) initializationConfig := mocks.NewInitializationConfiguration(t) initializationConfig.On("GetAdminPassword").Return("adminpassword") + userService := mockUserServices.NewUserService(t) userService. On("NewUser", "admin", "admin-no-reply@badaas.com", "adminpassword"). Return(nil, errors.New("user already exist in database")) + err := createSuperUser( logger, initializationConfig, @@ -61,10 +66,12 @@ func TestCreateSuperUser_UserServiceError(t *testing.T) { logger := zap.New(core) initializationConfig := mocks.NewInitializationConfiguration(t) initializationConfig.On("GetAdminPassword").Return("adminpassword") + userService := mockUserServices.NewUserService(t) userService. On("NewUser", "admin", "admin-no-reply@badaas.com", "adminpassword"). Return(nil, errors.New("email not valid")) + err := createSuperUser( logger, initializationConfig, @@ -90,7 +97,7 @@ func TestAddInfoRoutes(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/info", nil, ) @@ -120,7 +127,8 @@ func TestAddLoginRoutes(t *testing.T) { authenticationMiddleware := mockMiddlewares.NewAuthenticationMiddleware(t) router := NewRouter() - AddAuthRoutes( + + err := AddAuthRoutes( nil, router, authenticationMiddleware, @@ -129,10 +137,13 @@ func TestAddLoginRoutes(t *testing.T) { initializationConfig, userService, ) + if err != nil { + t.Error(err) + } response := httptest.NewRecorder() request := httptest.NewRequest( - "POST", + http.MethodPost, "/login", nil, ) @@ -159,7 +170,7 @@ func TestAddEAVRoutes(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/eav/objects/posts", nil, ) @@ -191,7 +202,7 @@ func TestAddCRUDRoutes(t *testing.T) { response := httptest.NewRecorder() request := httptest.NewRequest( - "GET", + http.MethodGet, "/objects/model", nil, ) diff --git a/services/ModuleFx.go b/services/ModuleFx.go index baaa151c..1bd35cf9 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -1,12 +1,13 @@ package services import ( + "go.uber.org/fx" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" - "go.uber.org/fx" ) var AuthServiceModule = fx.Module( diff --git a/services/auth/protocols/basicauth/basic.go b/services/auth/protocols/basicauth/basic.go index ac2e944d..3c202048 100644 --- a/services/auth/protocols/basicauth/basic.go +++ b/services/auth/protocols/basicauth/basic.go @@ -14,6 +14,7 @@ func SaltAndHashPassword(password string) []byte { []byte(password), cost, ) + return bytes } diff --git a/services/auth/protocols/basicauth/basic_test.go b/services/auth/protocols/basicauth/basic_test.go index c788a018..52e3f6e5 100644 --- a/services/auth/protocols/basicauth/basic_test.go +++ b/services/auth/protocols/basicauth/basic_test.go @@ -3,8 +3,9 @@ package basicauth_test import ( "testing" - "github.com/ditrit/badaas/services/auth/protocols/basicauth" "github.com/stretchr/testify/assert" + + "github.com/ditrit/badaas/services/auth/protocols/basicauth" ) func TestSaltAndHashPassword(t *testing.T) { @@ -18,5 +19,4 @@ func TestCheckUserPassword(t *testing.T) { hash := basicauth.SaltAndHashPassword(password) assert.True(t, basicauth.CheckUserPassword(hash, password), "the password and it's hash should match") assert.False(t, basicauth.CheckUserPassword(hash, "wrong password"), "the password and it's hash should match") - } diff --git a/services/eav.go b/services/eav.go index b188f130..7b6a61b9 100644 --- a/services/eav.go +++ b/services/eav.go @@ -4,17 +4,16 @@ import ( "errors" "fmt" + "go.uber.org/zap" + "gorm.io/gorm" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/utils" - "go.uber.org/zap" - "gorm.io/gorm" ) -var ( - ErrCantParseUUID = errors.New("can't parse uuid") -) +var ErrCantParseUUID = errors.New("can't parse uuid") // EAV service provide handle EAV objects type EAVService interface { @@ -132,6 +131,7 @@ func (eavService *eavServiceImpl) createValue(tx *gorm.DB, attribute *models.Att attributeValue, isPresent := attributesValues[attribute.Name] if isPresent { value := &models.Value{Attribute: attribute, AttributeID: attribute.ID} + err := eavService.updateValue(tx, value, attributeValue) if err != nil { return nil, err @@ -146,6 +146,7 @@ func (eavService *eavServiceImpl) createValue(tx *gorm.DB, attribute *models.Att } else if attribute.Required { return nil, fmt.Errorf("field %s is missing and is required", attribute.Name) } + return models.NewNullValue(attribute) } @@ -187,6 +188,7 @@ func (eavService *eavServiceImpl) updateValue(tx *gorm.DB, value *models.Value, if value.Attribute.ValueType == models.RelationValueType { return eavService.updateRelationValue(tx, value, newValueTyped) } + return value.SetStringVal(newValueTyped) case int: return value.SetIntVal(newValueTyped) @@ -194,6 +196,7 @@ func (eavService *eavServiceImpl) updateValue(tx *gorm.DB, value *models.Value, if utils.IsAnInt(newValueTyped) && value.Attribute.ValueType == models.IntValueType { return value.SetIntVal(int(newValueTyped)) } + return value.SetFloatVal(newValueTyped) case bool: return value.SetBooleanVal(newValueTyped) diff --git a/services/sessionservice/session.go b/services/sessionservice/session.go index 7b3eb215..dad4dcaa 100644 --- a/services/sessionservice/session.go +++ b/services/sessionservice/session.go @@ -5,12 +5,13 @@ import ( "sync" "time" + "go.uber.org/zap" + "gorm.io/gorm" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" - "go.uber.org/zap" - "gorm.io/gorm" ) // Errors @@ -58,6 +59,7 @@ func NewSessionService( db: db, } sessionService.init() + return sessionService } @@ -68,6 +70,7 @@ func (sessionService *sessionServiceImpl) IsValid(sessionUUID badorm.UUID) (bool if sessionInstance == nil { return false, nil } + return true, makeSessionClaims(sessionInstance) } @@ -82,7 +85,7 @@ func (sessionService *sessionServiceImpl) get(sessionUUID badorm.UUID) *models.S return session } - session, err := sessionService.sessionRepository.GetOptionalByID( + session, err := sessionService.sessionRepository.GetByID( sessionService.db, sessionUUID, ) @@ -112,6 +115,7 @@ func (sessionService *sessionServiceImpl) add(session *models.Session) error { // Initialize the session service func (sessionService *sessionServiceImpl) init() { sessionService.cache = make(map[badorm.UUID]*models.Session) + go func() { for { sessionService.removeExpired() @@ -137,6 +141,7 @@ func (sessionService *sessionServiceImpl) pullFromDB() { for _, sessionFromDatabase := range sessionsFromDatabase { newSessionCache[sessionFromDatabase.ID] = sessionFromDatabase } + sessionService.cache = newSessionCache sessionService.logger.Debug( "Pulled sessions from DB", @@ -150,6 +155,7 @@ func (sessionService *sessionServiceImpl) removeExpired() { defer sessionService.mutex.Unlock() var i int + for sessionUUID, session := range sessionService.cache { if session.IsExpired() { // Delete the session in the database @@ -164,6 +170,7 @@ func (sessionService *sessionServiceImpl) removeExpired() { i++ } } + sessionService.logger.Debug( "Removed expired session", zap.Int("expiredSessionCount", i), @@ -176,6 +183,7 @@ func (sessionService *sessionServiceImpl) delete(session *models.Session) httper defer sessionService.mutex.Unlock() sessionUUID := session.ID + err := sessionService.sessionRepository.Delete(sessionService.db, session) if err != nil { return httperrors.NewInternalServerError( @@ -184,7 +192,9 @@ func (sessionService *sessionServiceImpl) delete(session *models.Session) httper err, ) } + delete(sessionService.cache, sessionUUID) + return nil } @@ -192,6 +202,7 @@ func (sessionService *sessionServiceImpl) delete(session *models.Session) httper func (sessionService *sessionServiceImpl) RollSession(sessionUUID badorm.UUID) httperrors.HTTPError { rollInterval := sessionService.sessionConfiguration.GetRollDuration() sessionDuration := sessionService.sessionConfiguration.GetSessionDuration() + session := sessionService.get(sessionUUID) if session == nil { // no session to roll, no error @@ -207,6 +218,7 @@ func (sessionService *sessionServiceImpl) RollSession(sessionUUID badorm.UUID) h defer sessionService.mutex.Unlock() session.ExpiresAt = session.ExpiresAt.Add(sessionDuration) + err := sessionService.sessionRepository.Save(sessionService.db, session) if err != nil { return httperrors.NewDBError(err) @@ -224,10 +236,12 @@ func (sessionService *sessionServiceImpl) RollSession(sessionUUID badorm.UUID) h func (sessionService *sessionServiceImpl) LogUserIn(user *models.User) (*models.Session, error) { sessionDuration := sessionService.sessionConfiguration.GetSessionDuration() session := models.NewSession(user.ID, sessionDuration) + err := sessionService.add(session) if err != nil { return nil, err } + return session, nil } diff --git a/services/sessionservice/session_test.go b/services/sessionservice/session_test.go index 5d5d4cb0..c64f72c1 100644 --- a/services/sessionservice/session_test.go +++ b/services/sessionservice/session_test.go @@ -5,12 +5,6 @@ import ( "testing" "time" - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/httperrors" - badormMocks "github.com/ditrit/badaas/mocks/badorm" - configurationMocks "github.com/ditrit/badaas/mocks/configuration" - "github.com/ditrit/badaas/persistence/models" - "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -18,10 +12,26 @@ import ( "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/httperrors" + badormMocks "github.com/ditrit/badaas/mocks/badorm" + configurationMocks "github.com/ditrit/badaas/mocks/configuration" + "github.com/ditrit/badaas/persistence/models" ) var gormDB *gorm.DB +// ExampleErr is an HTTPError instance useful for testing. If the code does not care +// about HTTPError specifics, and only needs to return the HTTPError for example, this +// HTTPError should be used to make the test code more readable. +var ExampleErr httperrors.HTTPError = &httperrors.HTTPErrorImpl{ + Status: -1, + Err: "TESTING ERROR", + Message: "USE ONLY FOR TESTING", + GolangError: nil, +} + // make values for test func setupTest( t *testing.T, @@ -55,8 +65,8 @@ func TestNewSession(t *testing.T) { func TestLogInUser(t *testing.T) { sessionRepositoryMock, service, logs, sessionConfigurationMock := setupTest(t) sessionRepositoryMock.On("Create", gormDB, mock.Anything).Return(nil) - sessionConfigurationMock.On("GetSessionDuration").Return(time.Minute) + user := &models.User{ Username: "bob", Email: "bob@email.com", @@ -91,7 +101,8 @@ func TestLogInUserDbError(t *testing.T) { func TestIsValid(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) sessionRepositoryMock.On("Create", gormDB, mock.Anything).Return(nil) - uuidSample := badorm.UUID(uuid.New()) + + uuidSample := badorm.NewUUID() session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: uuidSample, @@ -114,9 +125,10 @@ func TestIsValid(t *testing.T) { func TestIsValid_SessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) sessionRepositoryMock. - On("GetOptionalByID", gormDB, mock.Anything). + On("GetByID", gormDB, mock.Anything). Return(nil, nil) - uuidSample := badorm.UUID(uuid.New()) + + uuidSample := badorm.NewUUID() isValid, _ := service.IsValid(uuidSample) require.False(t, isValid) } @@ -124,7 +136,8 @@ func TestIsValid_SessionNotFound(t *testing.T) { func TestLogOutUser(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) sessionRepositoryMock.On("Delete", gormDB, mock.Anything).Return(nil) - uuidSample := badorm.UUID(uuid.New()) + + uuidSample := badorm.NewUUID() session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: uuidSample, @@ -144,7 +157,7 @@ func TestLogOutUserDbError(t *testing.T) { On("Delete", gormDB, mock.Anything). Return(errors.New("db errors")) - uuidSample := badorm.UUID(uuid.New()) + uuidSample := badorm.NewUUID() session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: uuidSample, @@ -161,10 +174,10 @@ func TestLogOutUserDbError(t *testing.T) { func TestLogOutUser_SessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) sessionRepositoryMock. - On("GetOptionalByID", gormDB, mock.Anything). + On("GetByID", gormDB, mock.Anything). Return(nil, errors.New("db errors")) - uuidSample := badorm.UUID(uuid.New()) + uuidSample := badorm.NewUUID() session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: badorm.NilUUID, @@ -183,10 +196,13 @@ func TestLogOutUser_SessionNotFound(t *testing.T) { func TestRollSession(t *testing.T) { sessionRepositoryMock, service, _, sessionConfigurationMock := setupTest(t) sessionRepositoryMock.On("Save", gormDB, mock.Anything).Return(nil) + sessionDuration := time.Minute + sessionConfigurationMock.On("GetSessionDuration").Return(sessionDuration) sessionConfigurationMock.On("GetRollDuration").Return(sessionDuration / 4) - uuidSample := badorm.UUID(uuid.New()) + + uuidSample := badorm.NewUUID() originalExpirationTime := time.Now().Add(sessionDuration / 5) session := &models.Session{ UUIDModel: badorm.UUIDModel{ @@ -206,7 +222,8 @@ func TestRollSession_Expired(t *testing.T) { sessionDuration := time.Minute sessionConfigurationMock.On("GetSessionDuration").Return(sessionDuration) sessionConfigurationMock.On("GetRollDuration").Return(sessionDuration / 4) - uuidSample := badorm.UUID(uuid.New()) + + uuidSample := badorm.NewUUID() originalExpirationTime := time.Now().Add(-time.Hour) session := &models.Session{ UUIDModel: badorm.UUIDModel{ @@ -226,7 +243,7 @@ func TestRollSession_falseUUID(t *testing.T) { sessionConfigurationMock.On("GetSessionDuration").Return(sessionDuration) sessionConfigurationMock.On("GetRollDuration").Return(sessionDuration / 4) - uuidSample := badorm.UUID(uuid.New()) + uuidSample := badorm.NewUUID() originalExpirationTime := time.Now().Add(-time.Hour) session := &models.Session{ UUIDModel: badorm.UUIDModel{ @@ -238,17 +255,17 @@ func TestRollSession_falseUUID(t *testing.T) { service.cache[uuidSample] = session repoSession. - On("GetOptionalByID", gormDB, mock.Anything). + On("GetByID", gormDB, mock.Anything). Return(nil, nil) - err := service.RollSession(badorm.UUID(uuid.New())) + err := service.RollSession(badorm.NewUUID()) require.NoError(t, err) } func TestRollSession_sessionNotFound(t *testing.T) { sessionRepositoryMock, service, _, sessionConfigurationMock := setupTest(t) sessionRepositoryMock. - On("GetOptionalByID", gormDB, badorm.NilUUID). + On("GetByID", gormDB, badorm.NilUUID). Return(nil, nil) sessionDuration := time.Minute @@ -282,13 +299,13 @@ func Test_pullFromDB(t *testing.T) { func Test_pullFromDB_repoError(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) - sessionRepositoryMock.On("GetAll", gormDB).Return(nil, httperrors.AnError) - assert.PanicsWithError(t, httperrors.AnError.Error(), func() { service.pullFromDB() }) + sessionRepositoryMock.On("GetAll", gormDB).Return(nil, ExampleErr) + assert.PanicsWithError(t, ExampleErr.Error(), func() { service.pullFromDB() }) } func Test_removeExpired(t *testing.T) { sessionRepositoryMock, service, logs, _ := setupTest(t) - uuidSample := badorm.UUID(uuid.New()) + uuidSample := badorm.NewUUID() session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: badorm.NilUUID, @@ -299,6 +316,7 @@ func Test_removeExpired(t *testing.T) { sessionRepositoryMock. On("Delete", gormDB, session). Return(nil) + service.cache[uuidSample] = session service.removeExpired() @@ -313,7 +331,7 @@ func Test_removeExpired(t *testing.T) { func Test_removeExpired_RepositoryError(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) - uuidSample := badorm.UUID(uuid.New()) + uuidSample := badorm.NewUUID() session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: badorm.NilUUID, @@ -323,7 +341,8 @@ func Test_removeExpired_RepositoryError(t *testing.T) { } sessionRepositoryMock. On("Delete", gormDB, session). - Return(httperrors.AnError) + Return(ExampleErr) + service.cache[uuidSample] = session assert.Panics(t, func() { service.removeExpired() }) @@ -331,7 +350,7 @@ func Test_removeExpired_RepositoryError(t *testing.T) { func Test_get(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) - uuidSample := badorm.UUID(uuid.New()) + uuidSample := badorm.NewUUID() session := &models.Session{ UUIDModel: badorm.UUIDModel{ ID: badorm.NilUUID, @@ -340,7 +359,7 @@ func Test_get(t *testing.T) { ExpiresAt: time.Now().Add(-time.Hour), } sessionRepositoryMock. - On("GetOptionalByID", gormDB, mock.Anything). + On("GetByID", gormDB, mock.Anything). Return(session, nil) sessionFound := service.get(uuidSample) diff --git a/services/sessionservice/sessionctx.go b/services/sessionservice/sessionctx.go index a6c46b31..0a6d9643 100644 --- a/services/sessionservice/sessionctx.go +++ b/services/sessionservice/sessionctx.go @@ -41,5 +41,6 @@ func GetSessionClaimsFromContext(ctx context.Context) *SessionClaims { if !ok { panic("could not extract claims from context") } + return claims } diff --git a/services/sessionservice/sessionctx_test.go b/services/sessionservice/sessionctx_test.go index 9981f9dc..e2b7198f 100644 --- a/services/sessionservice/sessionctx_test.go +++ b/services/sessionservice/sessionctx_test.go @@ -4,14 +4,14 @@ import ( "context" "testing" - "github.com/ditrit/badaas/badorm" - "github.com/google/uuid" "github.com/stretchr/testify/assert" + + "github.com/ditrit/badaas/badorm" ) func TestSessionCtx(t *testing.T) { ctx := context.Background() - sessionClaims := &SessionClaims{badorm.NilUUID, badorm.UUID(uuid.New())} + sessionClaims := &SessionClaims{badorm.NilUUID, badorm.NewUUID()} ctx = SetSessionClaimsContext(ctx, sessionClaims) claims := GetSessionClaimsFromContext(ctx) assert.Equal(t, badorm.NilUUID, claims.UserID) @@ -19,5 +19,6 @@ func TestSessionCtx(t *testing.T) { func TestSessionCtxPanic(t *testing.T) { ctx := context.Background() + assert.Panics(t, func() { GetSessionClaimsFromContext(ctx) }) } diff --git a/services/transaction_executor.go b/services/transaction_executor.go index 2c4d3187..05fa9372 100644 --- a/services/transaction_executor.go +++ b/services/transaction_executor.go @@ -16,6 +16,7 @@ func ExecWithTransaction[RT any]( ) (RT, error) { nilValue := *new(RT) tx := db.Begin(opts...) + defer func() { if r := recover(); r != nil { tx.Rollback() diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index 07805134..68cfb1bb 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -4,13 +4,14 @@ import ( "errors" "fmt" + "go.uber.org/zap" + "gorm.io/gorm" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" "github.com/ditrit/badaas/services/auth/protocols/basicauth" validator "github.com/ditrit/badaas/validators" - "go.uber.org/zap" - "gorm.io/gorm" ) // UserService provide functions related to Users @@ -19,9 +20,7 @@ type UserService interface { GetUser(dto.UserLoginDTO) (*models.User, error) } -var ( - ErrWrongPassword = errors.New("password is incorrect") -) +var ErrWrongPassword = errors.New("password is incorrect") // Check interface compliance var _ UserService = (*userServiceImpl)(nil) @@ -58,6 +57,7 @@ func (userService *userServiceImpl) NewUser(username, email, password string) (* Email: sanitizedEmail, Password: basicauth.SaltAndHashPassword(password), } + err = userService.userRepository.Create(userService.db, u) if err != nil { return nil, err diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index d74dcdee..0762b81f 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -1,14 +1,8 @@ package userservice_test import ( - "errors" "testing" - "github.com/ditrit/badaas/badorm" - badormMocks "github.com/ditrit/badaas/mocks/badorm" - "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/models/dto" - "github.com/ditrit/badaas/services/userservice" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -16,6 +10,12 @@ import ( "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest/observer" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + badormMocks "github.com/ditrit/badaas/mocks/badorm" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/persistence/models/dto" + "github.com/ditrit/badaas/services/userservice" ) var gormDB *gorm.DB @@ -56,8 +56,9 @@ func TestNewUserServiceDatabaseError(t *testing.T) { userRepositoryMock.On( "Create", gormDB, mock.Anything, ).Return( - errors.New("database error"), + gorm.ErrInvalidTransaction, ) + userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) user, err := userService.NewUser("bob", "bob@email.com", "1234") assert.Error(t, err) diff --git a/testintegration/asserts.go b/testintegration/asserts.go index 8df7d14b..b49a554f 100644 --- a/testintegration/asserts.go +++ b/testintegration/asserts.go @@ -4,10 +4,11 @@ import ( "log" "sort" - "github.com/ditrit/badaas/persistence/models" "github.com/stretchr/testify/suite" "gotest.tools/assert" is "gotest.tools/assert/cmp" + + "github.com/ditrit/badaas/persistence/models" ) func EqualList[T any](ts *suite.Suite, expectedList, actualList []T) { @@ -25,8 +26,10 @@ func EqualList[T any](ts *suite.Suite, expectedList, actualList []T) { break } } + if j == expectedLen { ts.Fail("Lists not equal", "element %v not in list %v", expectedList[i], actualList) + for _, element := range actualList { log.Println(element) } diff --git a/testintegration/badaas_test.go b/testintegration/badaas_test.go index 77099490..0a119b6b 100644 --- a/testintegration/badaas_test.go +++ b/testintegration/badaas_test.go @@ -34,6 +34,7 @@ func TestBaDaaS(t *testing.T) { basePath := filepath.Dir(b) viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) viper.Set(configuration.DatabaseDialectorKey, os.Getenv(dbTypeEnvKey)) + err := configuration.NewCommandInitializer().Init(testsCommand) if err != nil { panic(err) diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index 077f1b56..1ed43984 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -94,30 +94,30 @@ func NewLoggerConfiguration() configuration.LoggerConfiguration { return configuration.NewLoggerConfiguration() } -func NewGormDBConnection(logger *zap.Logger) (*gorm.DB, error) { +func NewGormDBConnection(zapLogger *zap.Logger) (*gorm.DB, error) { dbType := configuration.DBDialector(os.Getenv(dbTypeEnvKey)) switch dbType { case configuration.PostgreSQL: return badorm.ConnectToDialector( - logger, + zapLogger, badorm.CreatePostgreSQLDialector(host, username, password, sslMode, dbName, port), 10, time.Duration(5)*time.Second, ) case configuration.MySQL: return badorm.ConnectToDialector( - logger, + zapLogger, badorm.CreateMySQLDialector(host, username, password, dbName, port), 10, time.Duration(5)*time.Second, ) case configuration.SQLite: return badorm.ConnectToDialector( - logger, + zapLogger, badorm.CreateSQLiteDialector(host), 10, time.Duration(5)*time.Second, ) case configuration.SQLServer: return badorm.ConnectToDialector( - logger, + zapLogger, badorm.CreateSQLServerDialector(host, username, password, dbName, port), 10, time.Duration(5)*time.Second, ) diff --git a/testintegration/crudRepository.go b/testintegration/crudRepository.go index 3610a96f..a24dfcff 100644 --- a/testintegration/crudRepository.go +++ b/testintegration/crudRepository.go @@ -1,12 +1,13 @@ package testintegration import ( - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/testintegration/conditions" - "github.com/ditrit/badaas/testintegration/models" "github.com/stretchr/testify/suite" "gorm.io/gorm" "gotest.tools/assert" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/testintegration/conditions" + "github.com/ditrit/badaas/testintegration/models" ) type CRUDRepositoryIntTestSuite struct { @@ -50,24 +51,6 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetByIDReturnsEntityIfIDMatch() { assert.DeepEqual(ts.T(), product, productReturned) } -// ------------------------- GetOptionalByID -------------------------------- - -func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalByIDReturnsErrorIfIDDontMatch() { - ts.createProduct(0) - result, err := ts.crudProductRepository.GetOptionalByID(ts.db, badorm.NilUUID) - ts.Nil(err) - ts.Nil(result) -} - -func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalByIDReturnsEntityIfIDMatch() { - product := ts.createProduct(0) - ts.createProduct(0) - productReturned, err := ts.crudProductRepository.GetOptionalByID(ts.db, product.ID) - ts.Nil(err) - - assert.DeepEqual(ts.T(), product, productReturned) -} - // ------------------------- Get -------------------------------- func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsErrorIfConditionsDontMatch() { @@ -84,30 +67,6 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsEntityIfConditionsMatch() { assert.DeepEqual(ts.T(), product, productReturned) } -// ------------------------- GetOptional -------------------------------- - -func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsNilIfConditionsDontMatch() { - ts.createProduct(0) - productReturned, err := ts.crudProductRepository.GetOptional(ts.db, conditions.ProductInt(1)) - ts.Nil(err) - ts.Nil(productReturned) -} - -func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsEntityIfConditionsMatch() { - product := ts.createProduct(0) - productReturned, err := ts.crudProductRepository.GetOptional(ts.db, conditions.ProductInt(0)) - ts.Nil(err) - - assert.DeepEqual(ts.T(), product, productReturned) -} - -func (ts *CRUDRepositoryIntTestSuite) TestGetOptionalReturnsErrorIfMoreThanOneMatchConditions() { - ts.createProduct(0) - ts.createProduct(0) - _, err := ts.crudProductRepository.GetOptional(ts.db, conditions.ProductInt(0)) - ts.Error(err, badorm.ErrMoreThanOneObjectFound) -} - // ------------------------- GetAll -------------------------------- func (ts *CRUDRepositoryIntTestSuite) TestGetAllReturnsEmptyIfNotEntitiesCreated() { diff --git a/testintegration/crudService.go b/testintegration/crudService.go index a855de5e..3430063a 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -1,12 +1,12 @@ package testintegration import ( + "gorm.io/gorm" + "gotest.tools/assert" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" - "github.com/google/uuid" - "gorm.io/gorm" - "gotest.tools/assert" ) type CRUDServiceIntTestSuite struct { @@ -60,7 +60,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { ts.createProduct("", 0, 0, false, nil) - _, err := ts.crudProductService.GetEntity(badorm.UUID(uuid.New())) + _, err := ts.crudProductService.GetEntity(badorm.NewUUID()) ts.Error(err, gorm.ErrRecordNotFound) } @@ -255,6 +255,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfDeletedAtNotNil func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { match := ts.createProduct("", 0, 0.0, false, nil) ts.createProduct("", 0, 0.0, false, nil) + match.EmbeddedInt = 1 err := ts.db.Save(match).Error @@ -271,6 +272,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfGormEmbedded() { match := ts.createProduct("", 0, 0.0, false, nil) ts.createProduct("", 0, 0.0, false, nil) + match.GormEmbedded.Int = 1 err := ts.db.Save(match).Error @@ -316,6 +318,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayWithCo match := ts.createProduct("match", 1, 0, false, nil) notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) + match.ByteArray = []byte{1, 2} notMatch1.ByteArray = []byte{2, 3} @@ -337,6 +340,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayEmpty( match := ts.createProduct("match", 1, 0, false, nil) notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) + match.ByteArray = []byte{} notMatch1.ByteArray = []byte{2, 3} @@ -374,6 +378,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { match := ts.createProduct("match", 1, 0, false, nil) notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) + match.MultiString = models.MultiString{"salut", "hola"} notMatch1.MultiString = models.MultiString{"salut", "hola", "hello"} diff --git a/testintegration/crudServiceCommon.go b/testintegration/crudServiceCommon.go index 8f7c024b..764edef4 100644 --- a/testintegration/crudServiceCommon.go +++ b/testintegration/crudServiceCommon.go @@ -1,10 +1,11 @@ package testintegration import ( - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/testintegration/models" "github.com/stretchr/testify/suite" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/testintegration/models" ) type CRUDServiceCommonIntTestSuite struct { @@ -51,6 +52,7 @@ func (ts *CRUDServiceCommonIntTestSuite) createSeller(name string, company *mode if company != nil { companyID = &company.ID } + entity := &models.Seller{ Name: name, CompanyID: companyID, diff --git a/testintegration/crudUnsafeService_test.go b/testintegration/crudUnsafeService_test.go index 536922df..5074f4ff 100644 --- a/testintegration/crudUnsafeService_test.go +++ b/testintegration/crudUnsafeService_test.go @@ -3,10 +3,11 @@ package testintegration import ( "os" + "gorm.io/gorm" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/testintegration/models" - "gorm.io/gorm" ) type CRUDUnsafeServiceIntTestSuite struct { @@ -158,6 +159,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfInc "int": "not_an_int", } result, err := ts.crudProductService.GetEntities(params) + switch configuration.DBDialector(os.Getenv(dbTypeEnvKey)) { case configuration.PostgreSQL: // postgres does the verification @@ -167,7 +169,6 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfInc ts.Nil(err) ts.Len(result, 0) } - } func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfFloatType() { diff --git a/testintegration/db_models.go b/testintegration/db_models.go index a7050dc7..d40d05f0 100644 --- a/testintegration/db_models.go +++ b/testintegration/db_models.go @@ -3,10 +3,11 @@ package testintegration import ( "log" - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/testintegration/models" "github.com/elliotchance/pie/v2" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/testintegration/models" ) var ListOfTables = []any{ diff --git a/testintegration/eavService.go b/testintegration/eavService.go index 86088217..e0f736a5 100644 --- a/testintegration/eavService.go +++ b/testintegration/eavService.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/elliotchance/pie/v2" - "github.com/google/uuid" "github.com/stretchr/testify/suite" "gorm.io/gorm" @@ -62,7 +61,7 @@ func (ts *EAVServiceIntTestSuite) cleanDB() { // ------------------------- GetEntity -------------------------------- func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityDoesNotExist() { - _, err := ts.eavService.GetEntity(ts.entityType1.Name, badorm.UUID(uuid.New())) + _, err := ts.eavService.GetEntity(ts.entityType1.Name, badorm.NewUUID()) ts.ErrorContains(err, "record not found") } @@ -142,6 +141,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyO match := ts.createEntity(ts.entityType2, map[string]any{ "string": "match", }) + ts.createEntity(ts.entityType2, map[string]any{ "string": "something_else", }) @@ -162,6 +162,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIf match2 := ts.createEntity(ts.entityType2, map[string]any{ "string": "match", }) + ts.createEntity(ts.entityType2, map[string]any{ "string": "something_else", }) @@ -200,6 +201,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { "string": "match", "int": 1, }) + ts.createEntity(ts.entityType2, map[string]any{ "string": "not_match", "int": 2, @@ -233,6 +235,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { "string": "match", "float": 1.1, }) + ts.createEntity(ts.entityType2, map[string]any{ "string": "not_match", "float": 2.0, @@ -252,6 +255,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { "string": "match", "bool": true, }) + ts.createEntity(ts.entityType2, map[string]any{ "string": "not_match", "bool": false, @@ -273,6 +277,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { match := ts.createEntity(ts.entityType2, map[string]any{ "relation": otherEntity1.ID.String(), }) + ts.createEntity(ts.entityType2, map[string]any{ "relation": otherEntity2.ID.String(), }) @@ -290,6 +295,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionFilterByNull() { match := ts.createEntity(ts.entityType2, map[string]any{ "string": nil, }) + ts.createEntity(ts.entityType2, map[string]any{ "string": "something", }) @@ -348,6 +354,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoins() { match := ts.createEntity(ts.entityType2, map[string]any{ "relation": otherEntity1.ID.String(), }) + ts.createEntity(ts.entityType2, map[string]any{ "relation": otherEntity2.ID.String(), }) @@ -376,6 +383,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDiffere match := ts.createEntity(ts.entityType2, map[string]any{ "relation": otherEntity1.ID.String(), }) + ts.createEntity(ts.entityType2, map[string]any{ "relation": otherEntity2.ID.String(), }) @@ -420,6 +428,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferent "relation": otherEntity11.ID.String(), "relation2": otherEntity31.ID.String(), }) + ts.createEntity(ts.entityType2, map[string]any{ "relation": otherEntity12.ID.String(), "relation2": otherEntity32.ID.String(), @@ -466,6 +475,7 @@ func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleT match := ts.createEntity(ts.entityType2, map[string]any{ "relation": otherEntity11.ID.String(), }) + ts.createEntity(ts.entityType2, map[string]any{ "relation": otherEntity12.ID.String(), }) @@ -546,11 +556,11 @@ func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfRelationAttributePoint ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ Name: "relation2", ValueType: models.RelationValueType, - RelationTargetEntityTypeID: badorm.UUID(uuid.New()), + RelationTargetEntityTypeID: badorm.NewUUID(), }) params := map[string]any{ - "relation2": badorm.UUID(uuid.New()).String(), + "relation2": badorm.NewUUID().String(), } entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, params) ts.Nil(entity) @@ -640,7 +650,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGo } func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfEntityDoesNotExist() { - _, err := ts.eavService.UpdateEntity(ts.entityType1.Name, badorm.UUID(uuid.New()), map[string]any{}) + _, err := ts.eavService.UpdateEntity(ts.entityType1.Name, badorm.NewUUID(), map[string]any{}) ts.ErrorIs(err, gorm.ErrRecordNotFound) } @@ -727,7 +737,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotExist entity := ts.createEntity(ts.entityType2, map[string]any{}) paramsUpdate := map[string]any{ - "relation": badorm.UUID(uuid.New()).String(), + "relation": badorm.NewUUID().String(), } _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) ts.ErrorIs(err, gorm.ErrRecordNotFound) @@ -763,6 +773,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFail entityReturned, err := ts.eavService.GetEntity(ts.entityType2.Name, entity.ID) ts.Nil(err) + notNull := pie.Filter(entityReturned.Fields, func(value *models.Value) bool { return !value.IsNull }) @@ -772,7 +783,7 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFail // ------------------------- DeleteEntity ------------------------- func (ts *EAVServiceIntTestSuite) TestDeleteEntityReturnsErrorIfEntityDoesNotExist() { - err := ts.eavService.DeleteEntity(ts.entityType2.Name, badorm.UUID(uuid.New())) + err := ts.eavService.DeleteEntity(ts.entityType2.Name, badorm.NewUUID()) ts.ErrorIs(err, gorm.ErrRecordNotFound) } diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 8ad5b8f1..2d591f0f 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -28,6 +28,7 @@ func (s *MultiString) Scan(src interface{}) error { case []byte: str := string(typedSrc) *s = strings.Split(str, ",") + return nil default: return fmt.Errorf("failed to scan multistring field - source is not a string, is %T", src) @@ -38,6 +39,7 @@ func (s MultiString) Value() (driver.Value, error) { if len(s) == 0 { return nil, nil } + return strings.Join(s, ","), nil } diff --git a/utils/math.go b/utils/math.go index 3a8f49a1..80ebfd8a 100644 --- a/utils/math.go +++ b/utils/math.go @@ -2,7 +2,7 @@ package utils import "math" -//if v=6.36 return false if v=6.000 return true +// if v=6.36 return false if v=6.000 return true func IsAnInt(v float64) bool { return math.Mod(v, 1) == 0 } diff --git a/utils/slice_test.go b/utils/slice_test.go index 977defcb..df05c090 100644 --- a/utils/slice_test.go +++ b/utils/slice_test.go @@ -3,12 +3,15 @@ package utils_test import ( "testing" - "github.com/ditrit/badaas/utils" "github.com/stretchr/testify/assert" + + "github.com/ditrit/badaas/utils" ) -var test_result_3 = 33.04 -var test_result_4 = 0.11 +var ( + testResult3 = 33.04 + testResult4 = 0.11 +) var findFirstTests = []struct { ss []float64 @@ -33,12 +36,12 @@ var findFirstTests = []struct { { []float64{5.4, 6.98, 4.987, 33.04}, func(value float64) bool { return value == 33.04 }, - &test_result_3, + &testResult3, }, { []float64{9.0, 0.11, 150.44, 33.04}, func(value float64) bool { return value == 0.11 }, - &test_result_4, + &testResult4, }, } diff --git a/utils/time_test.go b/utils/time_test.go index 578290ce..6261ca46 100644 --- a/utils/time_test.go +++ b/utils/time_test.go @@ -11,19 +11,19 @@ func TestIntToSecond(t *testing.T) { assert.Equal( t, IntToSecond(20), - time.Duration(20*time.Second), + 20*time.Second, "the duration should be equals", ) assert.Equal( t, IntToSecond(-5), - time.Duration(-5*time.Second), + -5*time.Second, "the duration should be equals", ) assert.Equal( t, IntToSecond(3600), - time.Duration(time.Hour), + time.Hour, "the duration should be equals", ) } diff --git a/validators/email.go b/validators/email.go index 99d9d1e1..b9984c2b 100644 --- a/validators/email.go +++ b/validators/email.go @@ -8,5 +8,6 @@ func ValidEmail(email string) (string, error) { if err != nil { return "", err } + return addr.Address, nil } diff --git a/validators/email_test.go b/validators/email_test.go index c41f0853..ecd84f90 100644 --- a/validators/email_test.go +++ b/validators/email_test.go @@ -3,8 +3,9 @@ package validator_test import ( "testing" - validator "github.com/ditrit/badaas/validators" "github.com/stretchr/testify/assert" + + validator "github.com/ditrit/badaas/validators" ) func TestValidEmail(t *testing.T) { From 1646b296e1d5be8b2ef27c8419a90fff2cc8cc9e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 9 Jun 2023 13:05:21 +0200 Subject: [PATCH 319/467] add linting for teste2e --- Makefile | 2 + test_e2e/badaas_e2e_test.go | 24 +-- test_e2e/http_support_test.go | 281 ++++++++++++++++++++-------------- test_e2e/test_api.go | 28 ++-- 4 files changed, 205 insertions(+), 130 deletions(-) diff --git a/Makefile b/Makefile index d28f3802..d573ec63 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,9 @@ install_dependencies: go install github.com/ditrit/badaas/tools/badctl@latest lint: +# TODO ver esto en ci golangci-lint run + cd test_e2e && golangci-lint run --config ../.golangci.yml test_unit_badaas: gotestsum --format pkgname $(PATHS) diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index 7ca9dd37..b17178f8 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -11,16 +11,17 @@ import ( "github.com/cucumber/godog" "github.com/cucumber/godog/colors" - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/persistence/gormdatabase" - "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/services/auth/protocols/basicauth" - "github.com/ditrit/badaas/testintegration" "github.com/elliotchance/pie/v2" "github.com/spf13/pflag" "github.com/spf13/viper" "go.uber.org/zap" "gorm.io/gorm" + + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/persistence/gormdatabase" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services/auth/protocols/basicauth" + "github.com/ditrit/badaas/testintegration" ) type TestContext struct { @@ -30,8 +31,10 @@ type TestContext struct { db *gorm.DB } -var opts = godog.Options{Output: colors.Colored(os.Stdout)} -var db *gorm.DB +var ( + opts = godog.Options{Output: colors.Colored(os.Stdout)} + db *gorm.DB +) func init() { godog.BindCommandLineFlags("godog.", &opts) @@ -55,6 +58,7 @@ func TestMain(_ *testing.M) { viper.Set(configuration.DatabaseRetryKey, 10) viper.Set(configuration.DatabaseRetryDurationKey, 5) viper.Set(configuration.DatabaseDialectorKey, string(configuration.PostgreSQL)) + db, err = gormdatabase.SetupDatabaseConnection( logger, configuration.NewDatabaseConfiguration(), @@ -79,13 +83,15 @@ func InitializeScenario(ctx *godog.ScenarioContext) { t := &TestContext{ db: db, } + jar, err := cookiejar.New(nil) if err != nil { panic(err) } + t.httpClient = &http.Client{ Transport: http.DefaultTransport, - Timeout: time.Duration(5 * time.Second), + Timeout: 5 * time.Second, Jar: jar, } @@ -154,7 +160,7 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^I request "(.+)"$`, t.requestGet) ctx.Step(`^status code is "(\d+)"$`, t.assertStatusCode) ctx.Step(`^response field "(.+)" is "(.+)"$`, t.assertResponseFieldIsEquals) - ctx.Step(`^I request "(.+)" with method "(.+)" with json$`, t.requestWithJson) + ctx.Step(`^I request "(.+)" with method "(.+)" with json$`, t.requestWithJSON) ctx.Step(`^a "(.+)" object exists with attributes$`, t.objectExists) ctx.Step(`^I query a "(.+)" with the object id$`, t.queryWithObjectID) ctx.Step(`^I query all "(.+)" objects$`, t.queryAllObjects) diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index e4a4452f..165af2f9 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -11,50 +11,45 @@ import ( "github.com/cucumber/godog" "github.com/cucumber/messages-go/v16" - "github.com/ditrit/badaas/testintegration/models" "github.com/elliotchance/pie/v2" + + "github.com/ditrit/badaas/testintegration/models" ) -const BaseUrl = "http://localhost:8000" +const BaseURL = "http://localhost:8000" func (t *TestContext) requestGet(url string) error { - return t.request(url, http.MethodGet, nil, nil) + return t.request(url, http.MethodGet, nil) } -func (t *TestContext) requestWithJson(url, method string, jsonTable *godog.Table) error { - return t.request(url, method, nil, jsonTable) +func (t *TestContext) requestWithJSON(url, method string, jsonTable *godog.Table) error { + return t.request(url, method, jsonTable) } -func (t *TestContext) request(url, method string, query map[string]string, jsonTable *godog.Table) error { +func (t *TestContext) request(url, method string, jsonTable *godog.Table) error { var payload io.Reader - var err error + if jsonTable != nil { - payload, err = buildJSONFromTable(jsonTable) - if err != nil { - return err - } + payload = buildJSONFromTable(jsonTable) } - method, err = checkMethod(method) + method, err := checkMethod(method) if err != nil { return err } - request, err := http.NewRequest(method, BaseUrl+url, payload) + + request, err := http.NewRequest(method, BaseURL+url, payload) if err != nil { return fmt.Errorf("failed to build request ERROR=%s", err.Error()) } - q := request.URL.Query() - for k, v := range query { - q.Add(k, v) - } - request.URL.RawQuery = q.Encode() - response, err := t.httpClient.Do(request) if err != nil { return fmt.Errorf("failed to run request ERROR=%s", err.Error()) } + t.storeResponseInContext(response) + return nil } @@ -65,25 +60,41 @@ func (t *TestContext) storeResponseInContext(response *http.Response) { if err != nil { t.json = map[string]any{} } + + err = response.Body.Close() + if err != nil { + log.Fatalln(err) + } } func (t *TestContext) assertStatusCode(expectedStatusCode int) error { if t.statusCode != expectedStatusCode { return fmt.Errorf("expect status code %d but is %d", expectedStatusCode, t.statusCode) } + return nil } func (t *TestContext) assertResponseFieldIsEquals(field string, expectedValue string) error { fields := strings.Split(field, ".") - jsonMap := t.json.(map[string]any) + + jsonMap, ok := t.json.(map[string]any) + if !ok { + log.Fatalln("json is not a map") + } for _, field := range fields[:len(fields)-1] { intValue, present := jsonMap[field] if !present { return fmt.Errorf("expected response field %s to be %s but it is not present", field, expectedValue) } - jsonMap = intValue.(map[string]any) + + intValueMap, ok := intValue.(map[string]any) + if !ok { + log.Fatalln("intValue is not a map") + } + + jsonMap = intValueMap } lastValue, present := jsonMap[pie.Last(fields)] @@ -107,75 +118,102 @@ func assertValue(value any, expectedValue string) bool { if err != nil { panic(err) } + return expectedValueInt == value case float64: expectedValueFloat, err := strconv.ParseFloat(expectedValue, 64) if err != nil { panic(err) } + return expectedValueFloat == value default: panic("unsupported format") } } +func verifyHeader(row *messages.PickleTableRow) error { + for indexCell, cell := range row.Cells { + if cell.Value != []string{"key", "value", "type"}[indexCell] { + return fmt.Errorf("should have %q as first line of the table", "| key | value | type |") + } + } + + return nil +} + +func getTableValue(key, valueAsString, valueType string) (any, error) { + switch valueType { + case stringValueType: + return valueAsString, nil + case booleanValueType: + boolean, err := strconv.ParseBool(valueAsString) + if err != nil { + return nil, fmt.Errorf("can't parse %q as boolean for key %q", valueAsString, key) + } + + return boolean, nil + case integerValueType: + integer, err := strconv.ParseInt(valueAsString, 10, 64) + if err != nil { + return nil, fmt.Errorf("can't parse %q as integer for key %q", valueAsString, key) + } + + return integer, nil + case floatValueType: + floatingNumber, err := strconv.ParseFloat(valueAsString, 64) + if err != nil { + return nil, fmt.Errorf("can't parse %q as float for key %q", valueAsString, key) + } + + return floatingNumber, nil + case jsonValueType: + jsonMap := map[string]string{} + + err := json.Unmarshal([]byte(valueAsString), &jsonMap) + if err != nil { + return nil, fmt.Errorf("can't parse %q as json for key %q", valueAsString, key) + } + + return jsonMap, nil + case nullValueType: + return nil, nil + default: + return nil, fmt.Errorf( + "type %q does not exists, please use %v", + valueType, + []string{stringValueType, booleanValueType, integerValueType, floatValueType, nullValueType}, + ) + } +} + // build a map from a godog.Table func buildMapFromTable(table *godog.Table) (map[string]any, error) { data := make(map[string]any, 0) - for indexRow, row := range table.Rows { - if indexRow == 0 { - for indexCell, cell := range row.Cells { - if cell.Value != []string{"key", "value", "type"}[indexCell] { - return nil, fmt.Errorf("should have %q as first line of the table", "| key | value | type |") - } - } - } else { - key := row.Cells[0].Value - valueAsString := row.Cells[1].Value - valueType := row.Cells[2].Value - - switch valueType { - case stringValueType: - data[key] = valueAsString - case booleanValueType: - boolean, err := strconv.ParseBool(valueAsString) - if err != nil { - return nil, fmt.Errorf("can't parse %q as boolean for key %q", valueAsString, key) - } - data[key] = boolean - case integerValueType: - integer, err := strconv.ParseInt(valueAsString, 10, 64) - if err != nil { - return nil, fmt.Errorf("can't parse %q as integer for key %q", valueAsString, key) - } - data[key] = integer - case floatValueType: - floatingNumber, err := strconv.ParseFloat(valueAsString, 64) - if err != nil { - return nil, fmt.Errorf("can't parse %q as float for key %q", valueAsString, key) - } - data[key] = floatingNumber - case jsonValueType: - jsonMap := map[string]string{} - err := json.Unmarshal([]byte(valueAsString), &jsonMap) - if err != nil { - return nil, fmt.Errorf("can't parse %q as json for key %q", valueAsString, key) - } - data[key] = jsonMap - case nullValueType: - data[key] = nil - default: - return nil, fmt.Errorf("type %q does not exists, please use %v", valueType, []string{stringValueType, booleanValueType, integerValueType, floatValueType, nullValueType}) - } + err := verifyHeader(table.Rows[0]) + if err != nil { + return nil, err + } + + for _, row := range table.Rows[1:] { + key := row.Cells[0].Value + valueAsString := row.Cells[1].Value + valueType := row.Cells[2].Value + + value, err := getTableValue(key, valueAsString, valueType) + if err != nil { + return nil, err } + + data[key] = value } return data, nil } // build a json payload in the form of a reader from a godog.Table -func buildJSONFromTable(table *godog.Table) (io.Reader, error) { +func buildJSONFromTable(table *godog.Table) io.Reader { data, err := buildMapFromTable(table) if err != nil { panic("should not return an error") @@ -185,7 +223,8 @@ func buildJSONFromTable(table *godog.Table) (io.Reader, error) { if err != nil { panic("should not return an error") } - return strings.NewReader(string(bytes)), nil + + return strings.NewReader(string(bytes)) } const ( @@ -199,7 +238,8 @@ const ( // check if the method is allowed and sanitize the string func checkMethod(method string) (string, error) { - allowedMethods := []string{http.MethodGet, + allowedMethods := []string{ + http.MethodGet, http.MethodHead, http.MethodPost, http.MethodPut, @@ -207,7 +247,9 @@ func checkMethod(method string) (string, error) { http.MethodDelete, http.MethodConnect, http.MethodOptions, - http.MethodTrace} + http.MethodTrace, + } + sanitizedMethod := strings.TrimSpace(strings.ToUpper(method)) if !pie.Contains( allowedMethods, @@ -223,7 +265,6 @@ func (t *TestContext) objectExists(entityType string, jsonTable *godog.Table) er err := t.request( "/eav/objects/"+entityType, http.MethodPost, - nil, jsonTable, ) if err != nil { @@ -239,35 +280,26 @@ func (t *TestContext) objectExists(entityType string, jsonTable *godog.Table) er } func (t *TestContext) objectExistsWithRelation(entityType string, relationAttribute string, jsonTable *godog.Table) error { - id, present := t.json.(map[string]any)["id"] - if !present { - panic("object id not available") - } - jsonTable.Rows = append(jsonTable.Rows, &messages.PickleTableRow{ Cells: []*messages.PickleTableCell{ { Value: relationAttribute, }, { - Value: id.(string), + Value: t.getIDFromJSON(), }, { Value: stringValueType, }, }, }) + return t.objectExists(entityType, jsonTable) } func (t *TestContext) queryWithObjectID(entityType string) error { - id, present := t.json.(map[string]any)["id"] - if !present { - panic("object id not available") - } - err := t.requestGet( - "/eav/objects/" + entityType + "/" + id.(string), + "/eav/objects/" + entityType + "/" + t.getIDFromJSON(), ) if err != nil { return err @@ -282,7 +314,7 @@ func (t *TestContext) queryWithObjectID(entityType string) error { } func (t *TestContext) queryObjectsWithConditions(entityType string, jsonTable *godog.Table) error { - err := t.requestWithJson( + err := t.requestWithJSON( "/eav/objects/"+entityType, http.MethodGet, jsonTable, @@ -316,7 +348,7 @@ func (t *TestContext) queryAllObjects(entityType string) error { } func (t *TestContext) thereAreObjects(expectedAmount int, entityType string) error { - amount := len(t.json.([]any)) + amount := len(t.getListFromJSON()) if amount != expectedAmount { return fmt.Errorf("expect amount %d, but there are %d objects of type %s", expectedAmount, amount, entityType) } @@ -325,15 +357,17 @@ func (t *TestContext) thereAreObjects(expectedAmount int, entityType string) err } func (t *TestContext) thereIsObjectWithAttributes(expectedEntityType string, jsonTable *godog.Table) error { - objectList := t.json.([]any) expectedValues, err := buildMapFromTable(jsonTable) if err != nil { log.Fatalln(err) } - for _, object := range objectList { - objectMap := object.(map[string]any) - objectAttrs := objectMap["attrs"].(map[string]any) + objectMapList := t.getObjectMapListFromJSON() + for _, objectMap := range objectMapList { + objectAttrs, ok := objectMap["attrs"].(map[string]any) + if !ok { + log.Fatalln("attrs in object is not a map") + } if objectMap["type"] == expectedEntityType { if t.areAllAttributesEqual(objectAttrs, expectedValues) { @@ -342,20 +376,14 @@ func (t *TestContext) thereIsObjectWithAttributes(expectedEntityType string, jso } } - return fmt.Errorf("object with attributes %v not found in %v", expectedValues, objectList) + return fmt.Errorf("object with attributes %v not found in %v", expectedValues, objectMapList) } func (t *TestContext) deleteWithObjectID(entityType string) error { - id, present := t.json.(map[string]any)["id"] - if !present { - panic("object id not available") - } - err := t.request( - "/eav/objects/"+entityType+"/"+id.(string), + "/eav/objects/"+entityType+"/"+t.getIDFromJSON(), http.MethodDelete, nil, - nil, ) if err != nil { return err @@ -370,15 +398,9 @@ func (t *TestContext) deleteWithObjectID(entityType string) error { } func (t *TestContext) modifyWithAttributes(entityType string, jsonTable *godog.Table) error { - id, present := t.json.(map[string]any)["id"] - if !present { - panic("object id not available") - } - err := t.request( - "/eav/objects/"+entityType+"/"+id.(string), + "/eav/objects/"+entityType+"/"+t.getIDFromJSON(), http.MethodPut, - nil, jsonTable, ) if err != nil { @@ -393,6 +415,20 @@ func (t *TestContext) modifyWithAttributes(entityType string, jsonTable *godog.T return nil } +func (t *TestContext) getIDFromJSON() string { + id, present := t.json.(map[string]any)["id"] + if !present { + log.Fatalln("object id not available") + } + + idString, ok := id.(string) + if !ok { + log.Fatalln("id in json is not a string") + } + + return idString +} + func (t *TestContext) saleExists(productInt int, code int, description string) { product := &models.Product{ Int: productInt, @@ -403,14 +439,14 @@ func (t *TestContext) saleExists(productInt int, code int, description string) { Description: description, Product: *product, } - err := t.db.Create(sale).Error - if err != nil { + + if err := t.db.Create(sale).Error; err != nil { log.Fatalln(err) } } func (t *TestContext) querySalesWithConditions(jsonTable *godog.Table) error { - err := t.requestWithJson( + err := t.requestWithJSON( "/objects/sale", http.MethodGet, jsonTable, @@ -428,23 +464,46 @@ func (t *TestContext) querySalesWithConditions(jsonTable *godog.Table) error { } func (t *TestContext) thereIsSaleWithAttributes(jsonTable *godog.Table) error { - objectList := t.json.([]any) expectedValues, err := buildMapFromTable(jsonTable) if err != nil { log.Fatalln(err) } - for _, object := range objectList { - if t.areAllAttributesEqual(object.(map[string]any), expectedValues) { + objectMapList := t.getObjectMapListFromJSON() + for _, objectMap := range objectMapList { + if t.areAllAttributesEqual(objectMap, expectedValues) { return nil } } - return fmt.Errorf("object with attributes %v not found in %v", expectedValues, objectList) + return fmt.Errorf("object with attributes %v not found in %v", expectedValues, objectMapList) +} + +func (t *TestContext) getListFromJSON() []any { + objectList, ok := t.json.([]any) + if !ok { + log.Fatalln("json is not a list") + } + + return objectList +} + +func (t *TestContext) getObjectMapListFromJSON() []map[string]any { + objectList := t.getListFromJSON() + + return pie.Map(objectList, func(object any) map[string]any { + objectMap, ok := object.(map[string]any) + if !ok { + log.Fatalln("object in json list is not a map") + } + + return objectMap + }) } func (t *TestContext) areAllAttributesEqual(objectMap, expectedValues map[string]any) bool { allEqual := true + for attributeName, expectedValue := range expectedValues { actualValue, isPresent := objectMap[attributeName] if !isPresent || actualValue != expectedValue { diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index 03f92a1c..67b53638 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -2,22 +2,24 @@ package main import ( "context" + "log" "net" "net/http" "github.com/Masterminds/semver/v3" - "github.com/ditrit/badaas" - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/router" - "github.com/ditrit/badaas/testintegration" - "github.com/ditrit/badaas/testintegration/models" - "github.com/ditrit/verdeter" "github.com/gorilla/handlers" "github.com/gorilla/mux" "github.com/spf13/cobra" "go.uber.org/fx" "go.uber.org/fx/fxevent" "go.uber.org/zap" + + "github.com/ditrit/badaas" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/router" + "github.com/ditrit/badaas/testintegration" + "github.com/ditrit/badaas/testintegration/models" + "github.com/ditrit/verdeter" ) var rootCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ @@ -70,11 +72,11 @@ func NewAPIVersion() *semver.Version { func NewHTTPServer( lc fx.Lifecycle, logger *zap.Logger, - router *mux.Router, + muxRouter *mux.Router, httpServerConfig configuration.HTTPServerConfiguration, ) *http.Server { handler := handlers.CORS( - handlers.AllowedMethods([]string{"GET", "POST", "DELETE", "PUT", "OPTIONS"}), + handlers.AllowedMethods([]string{http.MethodGet, http.MethodPost, http.MethodDelete, http.MethodPut, "OPTIONS"}), handlers.AllowedHeaders([]string{ "Accept", "Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization", @@ -85,9 +87,10 @@ func NewHTTPServer( handlers.AllowedOrigins([]string{"*"}), handlers.AllowCredentials(), handlers.MaxAge(0), - )(router) + )(muxRouter) srv := createServer(handler, httpServerConfig) + lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { ln, err := net.Listen("tcp", srv.Addr) @@ -95,7 +98,12 @@ func NewHTTPServer( return err } logger.Sugar().Infof("Ready to serve at %s", srv.Addr) - go srv.Serve(ln) + go func() { + err := srv.Serve(ln) + if err != nil { + log.Fatalln(err) + } + }() return nil }, OnStop: func(ctx context.Context) error { From b1bd857cb9c351f504530d66ad37332d5afae26d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 9 Jun 2023 13:11:37 +0200 Subject: [PATCH 320/467] add linting for badctl --- Makefile | 1 + tools/badctl/cmd/cmderrors/errors.go | 2 +- tools/badctl/cmd/gen/conditions/condition.go | 48 +++++++++++-------- tools/badctl/cmd/gen/conditions/file.go | 4 ++ tools/badctl/cmd/gen/conditions/gormTag.go | 1 + tools/badctl/cmd/gen/conditions/main.go | 13 +++-- tools/badctl/cmd/gen/conditions/main_test.go | 7 ++- .../basicslicespointer/basicslicespointer.go | 2 +- .../conditions/tests/customtype/customtype.go | 2 + tools/badctl/cmd/gen/conditions/type.go | 8 +++- tools/badctl/cmd/gen/docker.go | 21 ++++++-- tools/badctl/cmd/gen/docker_test.go | 12 +++-- tools/badctl/cmd/log/config.go | 3 +- tools/badctl/cmd/root.go | 1 + 14 files changed, 85 insertions(+), 40 deletions(-) diff --git a/Makefile b/Makefile index d573ec63..6c29af75 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,7 @@ lint: # TODO ver esto en ci golangci-lint run cd test_e2e && golangci-lint run --config ../.golangci.yml + cd tools/badctl && golangci-lint run --config ../../.golangci.yml test_unit_badaas: gotestsum --format pkgname $(PATHS) diff --git a/tools/badctl/cmd/cmderrors/errors.go b/tools/badctl/cmd/cmderrors/errors.go index 91b134e6..c5530986 100644 --- a/tools/badctl/cmd/cmderrors/errors.go +++ b/tools/badctl/cmd/cmderrors/errors.go @@ -7,7 +7,7 @@ import ( func FailErr(err error) { if err != nil { - fmt.Fprintf(os.Stderr, "Error: %v\n", err) + _, _ = fmt.Fprintf(os.Stderr, "Error: %v\n", err) os.Exit(1) } } diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index df7a396b..04a233a6 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -4,8 +4,9 @@ import ( "go/types" "github.com/dave/jennifer/jen" - "github.com/ditrit/badaas/tools/badctl/cmd/log" "github.com/ettle/strcase" + + "github.com/ditrit/badaas/tools/badctl/cmd/log" ) const ( @@ -27,6 +28,7 @@ func NewCondition(destPkg string, objectType Type, field Field) *Condition { destPkg: destPkg, } condition.generate(objectType, field) + return condition } @@ -109,25 +111,7 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) { if err == nil { // field is a BaDORM Model - hasFK, _ := objectType.HasFK(field) - if hasFK { - // belongsTo relation - condition.generateJoinWithFK( - objectType, - field, - ) - } else { - // hasOne relation - condition.generateJoinWithoutFK( - objectType, - field, - ) - - condition.generateInverseJoin( - objectType, - field, - ) - } + condition.generateForBadormModel(objectType, field) } else { // field is not a BaDORM Model if field.Type.IsGormCustomType() || field.TypeString() == "time.Time" { @@ -144,6 +128,29 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) { } } +// Generate condition between object and field when the field is a BaDORM Model +func (condition *Condition) generateForBadormModel(objectType Type, field Field) { + hasFK, _ := objectType.HasFK(field) + if hasFK { + // belongsTo relation + condition.generateJoinWithFK( + objectType, + field, + ) + } else { + // hasOne relation + condition.generateJoinWithoutFK( + objectType, + field, + ) + + condition.generateInverseJoin( + objectType, + field, + ) + } +} + // Generate a WhereCondition between object and field func (condition *Condition) generateWhere(objectType Type, field Field) { whereCondition := jen.Qual( @@ -162,6 +169,7 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { jen.Id("Value"): jen.Id("v"), } columnName := field.getColumnName() + if columnName != "" { params[jen.Id("Column")] = jen.Lit(columnName) } else { diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 89087585..a6a32e10 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -5,6 +5,7 @@ import ( "go/types" "github.com/dave/jennifer/jen" + "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/badaas/tools/badctl/cmd/log" "github.com/ditrit/badaas/tools/badctl/cmd/version" @@ -42,6 +43,7 @@ func (file File) AddConditionsFor(object types.Object) error { log.Logger.Infof("Generating conditions for type %q in %s", object.Name(), file.name) file.addConditionsForEachField(object, fields) + return nil } @@ -64,8 +66,10 @@ func (file File) Save() error { // Generate the conditions for each of the object's fields func (file File) generateConditionsForEachField(object types.Object, fields []Field) []*Condition { conditions := []*Condition{} + for _, field := range fields { log.Logger.Debugf("Generating condition for field %q", field.Name) + if field.Embedded { conditions = append(conditions, file.generateEmbeddedConditions( object, diff --git a/tools/badctl/cmd/gen/conditions/gormTag.go b/tools/badctl/cmd/gen/conditions/gormTag.go index 6df96aae..80cde897 100644 --- a/tools/badctl/cmd/gen/conditions/gormTag.go +++ b/tools/badctl/cmd/gen/conditions/gormTag.go @@ -49,6 +49,7 @@ func getGormTags(tag string) GormTags { for _, tag := range gormTags { splitted := strings.Split(tag, ":") tagName := GormTag(splitted[0]) + if len(splitted) == 1 { tagMap[tagName] = "" } else { diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 50a85070..a264a17e 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -6,14 +6,14 @@ import ( "go/types" "os" - "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" - "github.com/ditrit/badaas/tools/badctl/cmd/log" - "github.com/ditrit/verdeter" "github.com/ettle/strcase" "github.com/spf13/cobra" "github.com/spf13/viper" - "golang.org/x/tools/go/packages" + + "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" + "github.com/ditrit/badaas/tools/badctl/cmd/log" + "github.com/ditrit/verdeter" ) var GenConditionsCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ @@ -83,12 +83,15 @@ func generateConditionsForPkg(destPkg string, pkg *packages.Package) { } } +// TODO verificar linting de los archivos generados +// TODO ponerles .gen.go // Load package information from paths func loadPackages(paths []string) []*packages.Package { cfg := &packages.Config{Mode: packages.NeedTypes} + pkgs, err := packages.Load(cfg, paths...) if err != nil { - cmderrors.FailErr(fmt.Errorf("loading packages for inspection: %v", err)) + cmderrors.FailErr(fmt.Errorf("loading packages for inspection: %w", err)) } // print compilation errors of source packages diff --git a/tools/badctl/cmd/gen/conditions/main_test.go b/tools/badctl/cmd/gen/conditions/main_test.go index 25f70046..55ca2286 100644 --- a/tools/badctl/cmd/gen/conditions/main_test.go +++ b/tools/badctl/cmd/gen/conditions/main_test.go @@ -143,6 +143,7 @@ type Comparison struct { func doTest(t *testing.T, sourcePkg string, comparisons []Comparison) { viper.Set(DestPackageKey, "conditions") generateConditions(nil, []string{sourcePkg}) + for _, comparison := range comparisons { checkFilesEqual(t, comparison.Have, comparison.Expected) } @@ -170,6 +171,7 @@ func checkFilesEqual(t *testing.T, file1, file2 string) { b1 := make([]byte, chunkSize) b2 := make([]byte, chunkSize) + for { n1, err1 := io.ReadFull(f1, b1) n2, err2 := io.ReadFull(f2, b2) @@ -184,6 +186,7 @@ func checkFilesEqual(t *testing.T, file1, file2 string) { if err1 != nil { t.Error(err1) } + if err2 != nil { t.Error(err2) } @@ -192,6 +195,7 @@ func checkFilesEqual(t *testing.T, file1, file2 string) { remove(file1) } +// TODO hacer esto en la rama anterior // TODO codigo repetido func checkFileExists(t *testing.T, name string) fs.FileInfo { stat, err := os.Stat(name) @@ -203,8 +207,7 @@ func checkFileExists(t *testing.T, name string) fs.FileInfo { } func remove(name string) { - err := os.RemoveAll(name) - if err != nil { + if err := os.RemoveAll(name); err != nil { log.Fatal(err) } } diff --git a/tools/badctl/cmd/gen/conditions/tests/basicslicespointer/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/basicslicespointer/basicslicespointer.go index 390cd02b..7f692e01 100644 --- a/tools/badctl/cmd/gen/conditions/tests/basicslicespointer/basicslicespointer.go +++ b/tools/badctl/cmd/gen/conditions/tests/basicslicespointer/basicslicespointer.go @@ -1,4 +1,4 @@ -package basicslices +package basicslicespointer import "github.com/ditrit/badaas/badorm" diff --git a/tools/badctl/cmd/gen/conditions/tests/customtype/customtype.go b/tools/badctl/cmd/gen/conditions/tests/customtype/customtype.go index c67e75d9..700e26a8 100644 --- a/tools/badctl/cmd/gen/conditions/tests/customtype/customtype.go +++ b/tools/badctl/cmd/gen/conditions/tests/customtype/customtype.go @@ -18,6 +18,7 @@ func (s *MultiString) Scan(src interface{}) error { case []byte: str := string(typedSrc) *s = strings.Split(str, ",") + return nil default: return fmt.Errorf("failed to scan multistring field - source is not a string, is %T", src) @@ -28,6 +29,7 @@ func (s MultiString) Value() (driver.Value, error) { if len(s) == 0 { return nil, nil } + return strings.Join(s, ","), nil } diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index 11a6a3b6..61831a90 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -67,13 +67,16 @@ func (t Type) HasFK(field Field) (bool, error) { if err != nil { return false, err } + return pie.Any(objectFields, func(otherField Field) bool { return otherField.Name == field.getFKAttribute() }), nil } -var scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) -var valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) +var ( + scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) + valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) +) // Returns true if the type is a Gorm Custom type (https://gorm.io/docs/data_types.html) func (t Type) IsGormCustomType() bool { @@ -84,6 +87,7 @@ func (t Type) IsGormCustomType() bool { hasScanMethod := false hasValueMethod := false + for i := 0; i < typeNamed.NumMethods(); i++ { methodSignature := typeNamed.Method(i).String() diff --git a/tools/badctl/cmd/gen/docker.go b/tools/badctl/cmd/gen/docker.go index 018ec25c..590a8cb7 100644 --- a/tools/badctl/cmd/gen/docker.go +++ b/tools/badctl/cmd/gen/docker.go @@ -2,18 +2,20 @@ package gen import ( "embed" + "errors" "fmt" "os" "path/filepath" "strings" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "gopkg.in/yaml.v3" + "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/verdeter" "github.com/ditrit/verdeter/validators" - "github.com/spf13/cobra" - "github.com/spf13/viper" - "gopkg.in/yaml.v3" ) //go:embed docker/* @@ -62,6 +64,7 @@ func init() { if err != nil { cmderrors.FailErr(err) } + genDockerCmd.SetDefault(DBProviderKey, Cockroachdb) genDockerCmd.AddValidator( DBProviderKey, @@ -106,13 +109,20 @@ func copyBadaasConfig(dbProvider string) { } configData := map[string]any{} + err = yaml.Unmarshal(configFile, &configData) if err != nil { cmderrors.FailErr(err) } - configData["database"].(map[string]any)["port"] = DBPorts[dbProvider] - configData["database"].(map[string]any)["dialector"] = string(DBDialectors[dbProvider]) + databaseConfigMap, ok := configData["database"].(map[string]any) + if !ok { + cmderrors.FailErr(errors.New("database configuration is not a map")) + } + + databaseConfigMap["port"] = DBPorts[dbProvider] + databaseConfigMap["dialector"] = string(DBDialectors[dbProvider]) + configData["database"] = databaseConfigMap configBytes, err := yaml.Marshal(&configData) if err != nil { @@ -120,6 +130,7 @@ func copyBadaasConfig(dbProvider string) { } destConfigDir := filepath.Join(destBadaasDir, "config") + err = os.MkdirAll(destConfigDir, os.ModePerm) if err != nil { cmderrors.FailErr(err) diff --git a/tools/badctl/cmd/gen/docker_test.go b/tools/badctl/cmd/gen/docker_test.go index 776859f0..50566264 100644 --- a/tools/badctl/cmd/gen/docker_test.go +++ b/tools/badctl/cmd/gen/docker_test.go @@ -48,13 +48,20 @@ func checkDBPort(t *testing.T, port int) { if err != nil { t.Error(err) } + configData := map[string]any{} + err = yaml.Unmarshal(yamlFile, &configData) if err != nil { t.Error(err) } - assert.Equal(t, configData["database"].(map[string]any)["port"], port) + databaseConfigMap, ok := configData["database"].(map[string]any) + if !ok { + log.Fatalln("Database configuration is not a map") + } + + assert.Equal(t, databaseConfigMap["port"], port) } func teardown() { @@ -64,8 +71,7 @@ func teardown() { } func remove(name string) { - err := os.RemoveAll(name) - if err != nil { + if err := os.RemoveAll(name); err != nil { log.Fatal(err) } } diff --git a/tools/badctl/cmd/log/config.go b/tools/badctl/cmd/log/config.go index 03025b2e..de769a93 100644 --- a/tools/badctl/cmd/log/config.go +++ b/tools/badctl/cmd/log/config.go @@ -1,9 +1,10 @@ package log import ( - "github.com/ditrit/badaas/tools/badctl/cmd/version" log "github.com/sirupsen/logrus" "github.com/spf13/viper" + + "github.com/ditrit/badaas/tools/badctl/cmd/version" ) var Logger = log.WithField("version", version.Version) diff --git a/tools/badctl/cmd/root.go b/tools/badctl/cmd/root.go index 64d7d3d3..317d432d 100644 --- a/tools/badctl/cmd/root.go +++ b/tools/badctl/cmd/root.go @@ -32,5 +32,6 @@ func init() { if err != nil { cmderrors.FailErr(err) } + rootCmd.SetDefault(log.VerboseKey, false) } From c3a9b3a51da9e918df63568f5ecf3887d3f3d633 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 9 Jun 2023 13:12:39 +0200 Subject: [PATCH 321/467] more linting for badaas --- testintegration/badaas_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/testintegration/badaas_test.go b/testintegration/badaas_test.go index 0a119b6b..ef634c67 100644 --- a/testintegration/badaas_test.go +++ b/testintegration/badaas_test.go @@ -32,6 +32,7 @@ var testsCommand = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ func TestBaDaaS(t *testing.T) { _, b, _, _ := runtime.Caller(0) basePath := filepath.Dir(b) + viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) viper.Set(configuration.DatabaseDialectorKey, os.Getenv(dbTypeEnvKey)) From bdfdd53cf057830ecc76dcc01c9f98700e74795b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 9 Jun 2023 13:16:51 +0200 Subject: [PATCH 322/467] add lint for all packages in ci --- .github/workflows/CI.yml | 20 +++++++++++++++++++- Makefile | 1 - 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 1e71b5a4..d9bb94a8 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -31,13 +31,31 @@ jobs: with: go-version: '^1.18' cache: true - - name: golangci-lint + - name: badaas lint uses: golangci/golangci-lint-action@v3 with: version: v1.52.2 skip-cache: true skip-pkg-cache: true skip-build-cache: true + - name: teste2e lint + uses: golangci/golangci-lint-action@v3 + with: + version: v1.52.2 + working-directory: test_e2e + args: --config=../.golangci.yml + skip-cache: true + skip-pkg-cache: true + skip-build-cache: true + - name: badctl lint + uses: golangci/golangci-lint-action@v3 + with: + version: v1.52.2 + working-directory: tools/badctl + args: --config=../../.golangci.yml + skip-cache: true + skip-pkg-cache: true + skip-build-cache: true go-sec: needs: [branch-naming-rules] diff --git a/Makefile b/Makefile index 6c29af75..91473b0b 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,6 @@ install_dependencies: go install github.com/ditrit/badaas/tools/badctl@latest lint: -# TODO ver esto en ci golangci-lint run cd test_e2e && golangci-lint run --config ../.golangci.yml cd tools/badctl && golangci-lint run --config ../../.golangci.yml From 3cf8b3793bd0bdb10f7498de18e8c382b43d8bf8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 9 Jun 2023 14:41:03 +0200 Subject: [PATCH 323/467] re remove old code --- badorm/old/SortOption.go | 27 ---- badorm/old/SortOption_test.go.txt | 14 -- badorm/old/crudController.txt | 61 -------- badorm/old/crudRepository.txt | 69 ---------- badorm/old/crudService.txt | 78 ----------- badorm/old/pagination/Page.go | 39 ------ badorm/old/pagination/Page_test.go.txt | 145 -------------------- badorm/old/pagination/Paginator.go | 38 ----- badorm/old/pagination/Paginator_test.go.txt | 22 --- 9 files changed, 493 deletions(-) delete mode 100644 badorm/old/SortOption.go delete mode 100644 badorm/old/SortOption_test.go.txt delete mode 100644 badorm/old/crudController.txt delete mode 100644 badorm/old/crudRepository.txt delete mode 100644 badorm/old/crudService.txt delete mode 100644 badorm/old/pagination/Page.go delete mode 100644 badorm/old/pagination/Page_test.go.txt delete mode 100644 badorm/old/pagination/Paginator.go delete mode 100644 badorm/old/pagination/Paginator_test.go.txt diff --git a/badorm/old/SortOption.go b/badorm/old/SortOption.go deleted file mode 100644 index 4447b745..00000000 --- a/badorm/old/SortOption.go +++ /dev/null @@ -1,27 +0,0 @@ -package badorm - -type SortOption interface { - Column() string - Desc() bool -} - -// SortOption constructor -func NewSortOption(column string, desc bool) SortOption { - return &sortOption{column, desc} -} - -// Sorting option for the repository -type sortOption struct { - column string - desc bool -} - -// return the column name to sort on -func (sortOption *sortOption) Column() string { - return sortOption.column -} - -// return true for descending sort and false for ascending -func (sortOption *sortOption) Desc() bool { - return sortOption.desc -} diff --git a/badorm/old/SortOption_test.go.txt b/badorm/old/SortOption_test.go.txt deleted file mode 100644 index 8078e1ff..00000000 --- a/badorm/old/SortOption_test.go.txt +++ /dev/null @@ -1,14 +0,0 @@ -package badorm_test - -import ( - "testing" - - "github.com/ditrit/badaas/badorm" - "github.com/stretchr/testify/assert" -) - -func TestNewSortOption(t *testing.T) { - sortOption := badorm.NewSortOption("a", true) - assert.Equal(t, "a", sortOption.Column()) - assert.True(t, sortOption.Desc()) -} diff --git a/badorm/old/crudController.txt b/badorm/old/crudController.txt deleted file mode 100644 index c4d0c017..00000000 --- a/badorm/old/crudController.txt +++ /dev/null @@ -1,61 +0,0 @@ -// The handler responsible of the creation of a object -func (controller *crudControllerImpl[T]) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - attrs, herr := decodeJSONOptional(r) - if herr != nil { - return nil, herr - } - - entity, err := controller.crudService.CreateEntity(attrs) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityTypeNotFound - } - return nil, httperrors.NewDBError(err) - } - - // TODO add location header - w.WriteHeader(http.StatusCreated) - - return entity, nil -} - -// The handler responsible for the updates of one object -func (controller *crudControllerImpl[T]) UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityID, herr := getEntityIDFromRequest(r) - if herr != nil { - return nil, herr - } - - attrs, herr := decodeJSONOptional(r) - if herr != nil { - return nil, herr - } - - entity, err := controller.crudService.UpdateEntity(entityID, attrs) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound - } - return nil, httperrors.NewDBError(err) - } - - return entity, nil -} - -// The handler responsible for the deletion of a object -func (controller *crudControllerImpl[T]) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityID, herr := getEntityIDFromRequest(r) - if herr != nil { - return nil, herr - } - - err := controller.crudService.DeleteEntity(entityID) - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return nil, ErrEntityNotFound - } - return nil, httperrors.NewDBError(err) - } - - return nil, nil -} \ No newline at end of file diff --git a/badorm/old/crudRepository.txt b/badorm/old/crudRepository.txt deleted file mode 100644 index 640de966..00000000 --- a/badorm/old/crudRepository.txt +++ /dev/null @@ -1,69 +0,0 @@ -Find(tx *gorm.DB, filters squirrel.Sqlizer, pagination pagination.Paginator, sort SortOption) (*pagination.Page[T], error) - -paginationConfiguration configuration.PaginationConfiguration - -// Find entities of a Model -func (repository *CRUDRepositoryImpl[T, ID]) Find( - tx *gorm.DB, - filters squirrel.Sqlizer, - page pagination.Paginator, - sortOption SortOption, -) (*pagination.Page[T], error) { - var instances []*T - whereClause, values, err := filters.ToSql() - if err != nil { - return nil, err - } - - if page != nil { - tx = tx. - Offset( - int((page.Offset() - 1) * page.Limit()), - ). - Limit( - int(page.Limit()), - ) - } else { - page = pagination.NewPaginator(0, repository.paginationConfiguration.GetMaxElemPerPage()) - } - - if sortOption != nil { - tx = tx.Order(buildClauseFromSortOption(sortOption)) - } - - err = tx.Where(whereClause, values...).Find(&instances).Error - if err != nil { - return nil, err - } - - // Get Count - nbElem, err := repository.count(tx, whereClause, values) - if err != nil { - return nil, err - } - - return pagination.NewPage(instances, page.Offset(), page.Limit(), nbElem), nil -} - - - -// Build a gorm order clause from a SortOption -func buildClauseFromSortOption(sortOption SortOption) clause.OrderByColumn { - return clause.OrderByColumn{Column: clause.Column{Name: sortOption.Column()}, Desc: sortOption.Desc()} -} - -// Count the number of record that match the where clause with the provided values on the db -func (repository *CRUDRepositoryImpl[T, ID]) count(tx *gorm.DB, whereClause string, values []interface{}) (uint, error) { - var entity *T - var count int64 - err := tx.Model(entity).Where(whereClause, values).Count(&count).Error - if err != nil { - return 0, err - } - - return uint(count), nil -} - -// query = query.InnerJoins("Product", query.Session(&gorm.Session{}).Model(&Product{}).Select("id").Where("\"Product\".int = ?", 1)) - // query = query.InnerJoins("Country", query.Session(&gorm.Session{}).Model(&Country{}).Select("id").Where("\"Country\".name = ?", "Argentina")) - // query = query.Model(&City{}).InnerJoins("Capital_asd", query.Session(&gorm.Session{}).Model(&City{}).Select("id").Where("\"Capital_asd\".name = ?", "Buenos Aires")) \ No newline at end of file diff --git a/badorm/old/crudService.txt b/badorm/old/crudService.txt deleted file mode 100644 index 7e5c21c0..00000000 --- a/badorm/old/crudService.txt +++ /dev/null @@ -1,78 +0,0 @@ -// Creates a Entity of type "entityType" and its Values from the information provided in "attributeValues" -// not specified values are set with the default value (if exists) or a null value. -// entries in "attributeValues" that do not correspond to any attribute of "entityType" are ignored -// -// "attributeValues" are in {"attributeName": value} format -func (service *crudServiceImpl[T, ID]) CreateEntity(attributeValues map[string]any) (*T, error) { - var entity T - // TODO ver si dejo esto o desencodeo el json directo en la entidad - // TODO testear lo de que se le pueden agregar relaciones a esto - err := mapstructure.Decode(attributeValues, &entity) - if err != nil { - return nil, err // TODO ver que errores puede haber aca - } - - err = service.repository.Create(service.db, &entity) - if err != nil { - return nil, err - } - - // TODO eliminar esto - // err := service.db.Model(&entity).Create(attributeValues).Error - // if err != nil { - // return nil, err - // } - // entity.ID = attributeValues["id"] - - return &entity, nil -} - -// Updates entity with type "entityTypeName" and "id" Values to the new values provided in "newValues" -// entries in "newValues" that do not correspond to any attribute of the EntityType are ignored -// -// "newValues" are in {"attributeName": newValue} format -func (service *crudServiceImpl[T, ID]) UpdateEntity(entityID ID, newValues map[string]any) (*T, error) { - // TODO - return nil, nil -} - -// Deletes Entity with type "entityTypeName" and id "entityID" and its values -func (service *crudServiceImpl[T, ID]) DeleteEntity(entityID ID) error { - // TODO - return nil -} - -// ------------------------- CreateEntity -------------------------------- - -func (ts *CRUDServiceIntTestSuite) TestCreateEntityWithoutAttributes() { - person, err := ts.crudPersonService.CreateEntity(map[string]any{}) - - ts.Nil(err) - ts.Equal("", person.Name) -} - -func (ts *CRUDServiceIntTestSuite) TestCreateEntityWithOnlyOneAttribute() { - person, err := ts.crudPersonService.CreateEntity(map[string]any{"Name": "franco"}) - - ts.Nil(err) - ts.Equal("franco", person.Name) -} - -func (ts *CRUDServiceIntTestSuite) TestCreateEntityWithoutAOptionalRelation() { - employee, err := ts.crudEmployeeService.CreateEntity(map[string]any{"Name": "franco"}) - - ts.Nil(err) - ts.Equal("franco", employee.Name) -} - -func (ts *CRUDServiceIntTestSuite) TestCreateEntityWithAOptionalRelationWithID() { - boss, err := ts.crudEmployeeService.CreateEntity(map[string]any{"Name": "xavier"}) - ts.Nil(err) - - employee, err := ts.crudEmployeeService.CreateEntity( - map[string]any{"Name": "franco", "BossID": boss.ID.String()}, - ) - ts.Nil(err) - ts.Equal("franco", employee.Name) - ts.Equal(boss.ID, employee.BossID) -} \ No newline at end of file diff --git a/badorm/old/pagination/Page.go b/badorm/old/pagination/Page.go deleted file mode 100644 index ba88357f..00000000 --- a/badorm/old/pagination/Page.go +++ /dev/null @@ -1,39 +0,0 @@ -package pagination - -// A page hold resources and data regarding the pagination -type Page[T any] struct { - Resources []*T `json:"resources"` - // max d'element par page - Limit uint `json:"limit"` - // page courante - Offset uint `json:"offset"` - // total d'element en base - Total uint `json:"total"` - // total de pages - TotalPages uint `json:"totalPages"` - HasNextPage bool `json:"hasNextPage"` - HasPreviousPage bool `json:"hasPreviousPage"` - IsFirstPage bool `json:"isFirstPage"` - IsLastPage bool `json:"isLastPage"` - HasContent bool `json:"hasContent"` -} - -// Create a new page -func NewPage[T any](records []*T, offset, size, nbElemTotal uint) *Page[T] { - nbPage := nbElemTotal / size - p := Page[T]{ - Resources: records, - Limit: size, - Offset: offset, - Total: nbElemTotal, - TotalPages: nbPage, - - HasNextPage: nbElemTotal > (offset+1)*size, - HasPreviousPage: offset >= 1, - IsFirstPage: offset == 0, - IsLastPage: offset == (nbPage - 1), - HasContent: len(records) != 0, - } - - return &p -} diff --git a/badorm/old/pagination/Page_test.go.txt b/badorm/old/pagination/Page_test.go.txt deleted file mode 100644 index f46b49f8..00000000 --- a/badorm/old/pagination/Page_test.go.txt +++ /dev/null @@ -1,145 +0,0 @@ -package pagination_test - -import ( - "testing" - - "github.com/ditrit/badaas/badorm/pagination" - "github.com/stretchr/testify/assert" -) - -type Whatever struct { - DumbData int -} - -func (Whatever) TableName() string { - return "whatevers" -} - -var ( - // test fixture - ressources = []*Whatever{ - {10}, - {11}, - {12}, - {13}, - {14}, - {15}, - {16}, - {17}, - {18}, - {19}, - } -) - -func TestNewPage(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.ElementsMatch(t, ressources, p.Ressources) - assert.Equal(t, uint(10), p.Limit) - assert.Equal(t, uint(1), p.Offset) - assert.Equal(t, uint(5), p.TotalPages) -} - -func TestPageHasNextPageFalse(t *testing.T) { - p := pagination.NewPage( - ressources, - 4, // page 4: last page - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.False(t, p.HasNextPage) -} - -func TestPageHasNextPageTrue(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.True(t, p.HasNextPage) -} - -func TestPageIsLastPageFalse(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.False(t, p.IsLastPage) -} - -func TestPageIsLastPageTrue(t *testing.T) { - p := pagination.NewPage( - ressources, - 4, // page 4: last page - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.True(t, p.IsLastPage) -} - -func TestPageHasPreviousPageFalse(t *testing.T) { - p := pagination.NewPage( - ressources, - 0, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.False(t, p.HasPreviousPage) -} - -func TestPageHasPreviousPageTrue(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.True(t, p.HasPreviousPage) -} - -func TestPageIsFirstPageFalse(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.False(t, p.IsFirstPage) -} - -func TestPageIsFirstPageTrue(t *testing.T) { - p := pagination.NewPage( - ressources, - 0, // page 0: first page - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.True(t, p.IsFirstPage) -} - -func TestPageHasContentFalse(t *testing.T) { - p := pagination.NewPage( - []*Whatever{}, // no content - 0, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.False(t, p.HasPreviousPage) -} - -func TestPageHasContentTrue(t *testing.T) { - p := pagination.NewPage( - ressources, - 1, // page 1 - 10, // 10 elems per page - 50, // 50 elem in total - ) - assert.True(t, p.HasContent) -} diff --git a/badorm/old/pagination/Paginator.go b/badorm/old/pagination/Paginator.go deleted file mode 100644 index 5f12ea1f..00000000 --- a/badorm/old/pagination/Paginator.go +++ /dev/null @@ -1,38 +0,0 @@ -package pagination - -// Handle pagination -type Paginator interface { - Offset() uint - Limit() uint -} - -type paginatorImpl struct { - offset uint - limit uint -} - -// Constructor of Paginator -func NewPaginator(page, limit uint) Paginator { - if page == 0 { - page = 1 - } - - if limit == 0 { - limit = 1 - } - - return &paginatorImpl{ - offset: page, - limit: limit, - } -} - -// Return the page number -func (p *paginatorImpl) Offset() uint { - return p.offset -} - -// Return the max number of records for one page -func (p *paginatorImpl) Limit() uint { - return p.limit -} diff --git a/badorm/old/pagination/Paginator_test.go.txt b/badorm/old/pagination/Paginator_test.go.txt deleted file mode 100644 index a2b6137f..00000000 --- a/badorm/old/pagination/Paginator_test.go.txt +++ /dev/null @@ -1,22 +0,0 @@ -package pagination_test - -import ( - "testing" - - "github.com/ditrit/badaas/badorm/pagination" - "github.com/stretchr/testify/assert" -) - -func TestPaginator(t *testing.T) { - paginator := pagination.NewPaginator(uint(0), uint(12)) - assert.NotNil(t, paginator) - assert.Equal(t, uint(12), paginator.Limit()) - - paginator = pagination.NewPaginator(uint(2), uint(12)) - assert.NotNil(t, paginator) - assert.Equal(t, uint(12), paginator.Limit()) - - paginator = pagination.NewPaginator(uint(2), uint(0)) - assert.NotNil(t, paginator) - assert.Equal(t, uint(1), paginator.Limit()) -} From 833fd0494160fb5e7afcf42bbc9b655db5ab4ff1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 9 Jun 2023 17:14:58 +0200 Subject: [PATCH 324/467] add more linters --- .golangci.yml | 353 ++++++++----------- badorm/ModuleFx.go | 8 +- badorm/baseModels.go | 2 +- badorm/condition.go | 8 +- badorm/crudRepository.go | 9 +- badorm/crudUnsafeRepository.go | 6 +- badorm/uuid.go | 4 +- configuration/DatabaseCommandsInitializer.go | 25 +- configuration/HttpServerConfiguration.go | 9 +- configuration/PaginationConfiguration.go | 2 +- configuration/ServerCommandsInitializer.go | 27 +- configuration/SessionCommandsInitializer.go | 7 +- configuration/defaults/defaults.go | 14 + controllers/basicAuth.go | 4 +- controllers/crud.go | 4 +- controllers/eav.go | 8 +- controllers/info.go | 2 +- persistence/gormdatabase/gormzap/gormzap.go | 4 +- router/middlewares/middlewarelogger_test.go | 2 +- services/eav.go | 2 +- test_e2e/test_api.go | 2 +- testintegration/badaas_test.go | 4 +- testintegration/badorm_test.go | 1 - testintegration/crudUnsafeService_test.go | 10 +- testintegration/eavService.go | 4 +- testintegration/models/models.go | 2 +- tools/badctl/cmd/gen/conditions/jenParam.go | 9 + tools/badctl/cmd/gen/conditions/main.go | 2 +- tools/badctl/cmd/gen/docker.go | 20 +- 29 files changed, 274 insertions(+), 280 deletions(-) create mode 100644 configuration/defaults/defaults.go diff --git a/.golangci.yml b/.golangci.yml index af08728c..fa760d5b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -2,66 +2,58 @@ # - https://github.com/istio/common-files/blob/master/files/common/config/.golangci.yml # - https://gist.github.com/maratori/47a4d00457a92aa426dbd48a18776322 -service: - golangci-lint-version: 1.52.x # use the fixed version to not introduce new linters unexpectedly run: # timeout for analysis, e.g. 30s, 5m, default is 1m - deadline: 20m - build-tags: - - integ - - integfuzz + deadline: 3m # which dirs to skip: they won't be analyzed; # can use regexp here: generated.*, regexp is applied on full path; # default value is empty list, but next dirs are always skipped independently # from this option's value: - # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ skip-dirs: - genfiles$ - vendor$ # which files to skip: they will be analyzed, but issues from them # won't be reported. Default value is empty list, but there is # no need to include all autogenerated files, we confidently recognize - # autogenerated files. If it's not please let us know. + # autogenerated files. skip-files: - ".*\\.pb\\.go" - ".*\\.gen\\.go" + linters: enable-all: true disable: - - varnamelen - - testpackage - - thelper - - paralleltest - - nonamedreturns - - nlreturn - - ireturn - - gomnd - - gochecknoglobals - - exhaustivestruct - - exhaustruct - - exhaustive - - maligned - - scopelint - - godox - - godot - - funlen - - dogsled - - nosnakecase - - interfacer - - varcheck - - deadcode - - structcheck - - noctx - - gochecknoinits - # Deprecated but still util in some cases - # - ifshort - # - golint - # Can be util in the future for better errors - - errname - - wrapcheck - - goerr113 - # Wish activated but not time by now to solve it - - errchkjson + - dogsled # [sometimes necessary] checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) + - exhaustruct # [make it easier to construct structs] checks if all structure fields are initialized + - gochecknoglobals # [we use them] checks that no global variables exist + - gochecknoinits # [we use them] checks that no init functions are present in Go code + - godot # [not necessary] checks if comments end in a period + - godox # [we use them] detects FIXME, TODO and other comment keywords + - ireturn # [useful for mocks generation] accept interfaces, return concrete types + - nlreturn # [too strict and mostly code is not more readable] checks for a new line before return and branch statements to increase code clarity + - nonamedreturns # [are util sometimes] reports all named returns + - paralleltest # [too many false positives] detects missing usage of t.Parallel() method in your Go test + - testpackage # [doesn't allow white box tests] makes you use a separate _test package + - thelper # [not the expected result by us] detects golang test helpers without t.Helper() call and checks the consistency of test helpers + - varnamelen # [great idea, but too many false positives] checks that the length of a variable's name matches its scope + # deprecated + - deadcode # [deprecated, replaced by unused] finds unused code + - exhaustivestruct # [deprecated, replaced by exhaustruct] checks if all struct's fields are initialized + - golint # [deprecated, replaced by revive] golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes + - ifshort # [deprecated] checks that your code uses short syntax for if-statements whenever possible + - interfacer # [deprecated] suggests narrower interface types + - maligned # [deprecated, replaced by govet fieldalignment] detects Go structs that would take less memory if their fields were sorted + - nosnakecase # [deprecated, replaced by revive var-naming] detects snake case of variable naming and function name + - scopelint # [deprecated, replaced by exportloopref] checks for unpinned variables in go programs + - structcheck # [deprecated, replaced by unused] finds unused struct fields + - varcheck # [deprecated, replaced by unused] finds unused global variables and constants + # can be util in the future for better errors + - goerr113 # [too strict] checks the errors handling expressions + - wrapcheck # [too strict] checks that errors returned from external packages are wrapped + # wish activated but not time by now to solve it + - errname # checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error + - errchkjson # checks types passed to the json encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted fast: false # TODO agregar el template que formatea bien para vscode @@ -70,11 +62,14 @@ linters-settings: cyclop: # The maximal code complexity to report. # Default: 10 - max-complexity: 18 + max-complexity: 20 # The maximal average package complexity. # If it's higher than 0.0 (float) the check is enabled # Default: 0.0 package-average: 0.0 + depguard: + packages-with-error-message: + - github.com/gogo/protobuf: "gogo/protobuf is deprecated, use golang/protobuf" errcheck: # report about not checking of errors in type assetions: `a := b.(MyStruct)`; # default is false: such cases aren't reported by default. @@ -82,16 +77,81 @@ linters-settings: # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; # default is false: such cases aren't reported by default. check-blank: false - govet: - # report about shadowed variables - check-shadowing: false + exhaustive: + # Program elements to check for exhaustiveness. + # Default: [ switch ] + check: + - switch + - map + funlen: + # Checks the number of lines in a function. + # If lower than 0, disable the check. + # Default: 60 + lines: 80 + # Checks the number of statements in a function. + # If lower than 0, disable the check. + # Default: 40 + statements: 40 + gci: + sections: + - standard # Captures all standard packages if they do not match another section. + - default # Contains all imports that could not be matched to another section type. + - prefix(github.com/ditrit/) # Groups all imports with the specified Prefix. + gocritic: + # Settings passed to gocritic. + # The settings key is the name of a supported gocritic checker. + # The list of supported checkers can be find in https://go-critic.github.io/overview. + settings: + captLocal: + # Whether to restrict checker to params only. + # Default: true + paramsOnly: false + underef: + # Whether to skip (*x).method() calls where x is a pointer receiver. + # Default: true + skipRecvDeref: false goimports: # put imports beginning with prefix after 3rd-party packages; # it's a comma-separated list of prefixes local-prefixes: github.com/ditrit - maligned: - # print struct with more effective memory layout or not, false by default - suggest-new: true + gomodguard: + blocked: + # List of blocked modules. + # Default: [] + modules: + - github.com/golang/protobuf: + recommendations: + - google.golang.org/protobuf + reason: "see https://developers.google.com/protocol-buffers/docs/reference/go/faq#modules" + - github.com/satori/go.uuid: + recommendations: + - github.com/google/uuid + reason: "satori's package is not maintained" + - github.com/gofrs/uuid: + recommendations: + - github.com/google/uuid + reason: "gofrs' package is not go module" + govet: + # Enable all analyzers. + # Default: false + enable-all: true + # Disable analyzers by name. + # Run `go tool vet help` to see all analyzers. + # Default: [] + disable: + - fieldalignment # too strict + # Settings per analyzer. + settings: + shadow: + # Whether to be strict about shadowing; can be noisy. + # Default: false + strict: false + lll: + # max line length, lines longer will be reported. Default is 120. + # '\t' is counted as 1 character by default, and can be changed with the tab-width option + line-length: 160 + # tab width in spaces. Default to 1. + tab-width: 1 misspell: # Correct spellings using locale preferences for US or UK. # Default is to use a neutral variety of English. @@ -99,80 +159,21 @@ linters-settings: locale: US ignore-words: - cancelled - lll: - # max line length, lines longer will be reported. Default is 120. - # '\t' is counted as 1 character by default, and can be changed with the tab-width option - line-length: 160 - # tab width in spaces. Default to 1. - tab-width: 1 - revive: - ignore-generated-header: false - severity: "warning" - confidence: 0.0 - error-code: 2 - warning-code: 1 - rules: - - name: blank-imports - - name: context-keys-type - - name: time-naming - - name: var-declaration - - name: unexported-return - - name: errorf - - name: context-as-argument - - name: dot-imports - - name: error-return - - name: error-strings - - name: error-naming - - name: increment-decrement - - name: var-naming - - name: package-comments - - name: range - - name: receiver-naming - - name: indent-error-flow - - name: superfluous-else - - name: modifies-parameter - - name: unreachable-code - - name: struct-tag - - name: constant-logical-expr - - name: bool-literal-in-expr - - name: redefines-builtin-id - - name: imports-blacklist - - name: range-val-in-closure - - name: range-val-address - - name: waitgroup-by-value - - name: atomic - - name: call-to-gc - - name: duplicated-imports - - name: string-of-int - - name: defer - arguments: - - - "call-chain" - - name: unconditional-recursion - - name: identical-branches - # the following rules can be enabled in the future - - name: empty-lines - - name: confusing-results - - name: empty-block - - name: get-return - # - name: confusing-naming - - name: unexported-naming - - name: early-return - # - name: unused-parameter - - name: unnecessary-stmt - # - name: deep-exit - - name: import-shadowing - - name: modifies-value-receiver - # - name: unused-receiver - # - name: bare-return - - name: flag-parameter - - name: unhandled-error - - name: if-return - unused: - # treat code as a program (not a library) and report unused exported identifiers; default is false. - # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: - # if it's called for subdir of a project it can't find funcs usages. All text editor integrations - # with golangci-lint call it on a directory with the changed file. - check-exported: false + nolintlint: + # Exclude following linters from requiring an explanation. + # Default: [] + allow-no-explanation: [ funlen, gocognit, lll ] + # Enable to require an explanation of nonzero length after each nolint directive. + # Default: false + require-explanation: true + # Enable to require nolint directives to mention the specific linter being suppressed. + # Default: false + require-specific: true + rowserrcheck: + # database/sql is always checked + # Default: [] + packages: + - github.com/jmoiron/sqlx unparam: # call graph construction algorithm (cha, rta). In general, use cha for libraries, # and rta for programs with main packages. Default is cha. @@ -182,85 +183,24 @@ linters-settings: # if it's called for subdir of a project it can't find external interfaces. All text editor integrations # with golangci-lint call it on a directory with the changed file. check-exported: false - gci: - sections: - - standard # Captures all standard packages if they do not match another section. - - default # Contains all imports that could not be matched to another section type. - - prefix(github.com/ditrit/) # Groups all imports with the specified Prefix. - gocritic: - enabled-checks: - - appendCombine - - argOrder - - assignOp - - badCond - - boolExprSimplify - - builtinShadow - - captLocal - - caseOrder - - codegenComment - - commentedOutCode - - commentedOutImport - - defaultCaseOrder - - deprecatedComment - - docStub - - dupArg - - dupBranchBody - - dupCase - - dupSubExpr - - elseif - - emptyFallthrough - - equalFold - - flagDeref - - flagName - - hexLiteral - - indexAlloc - - initClause - - methodExprCall - - nilValReturn - - octalLiteral - - offBy1 - - rangeExprCopy - - regexpMust - - sloppyLen - - stringXbytes - - switchTrue - - typeAssertChain - - typeSwitchVar - - typeUnparen - - underef - - unlambda - - unnecessaryBlock - - unslice - - valSwap - - weakCond - # Unused - # - yodaStyleExpr - # - appendAssign - # - commentFormatting - # - emptyStringTest - # - exitAfterDefer - # - ifElseChain - # - hugeParam - # - importShadow - # - nestingReduce - # - paramTypeCombine - # - ptrToRefParam - # - rangeValCopy - # - singleCaseSwitch - # - sloppyReassign - # - unlabelStmt - # - unnamedResult - # - wrapperFunc - depguard: - packages-with-error-message: - - github.com/gogo/protobuf: "gogo/protobuf is deprecated, use golang/protobuf" - gosec: - includes: + unused: + # treat code as a program (not a library) and report unused exported identifiers; default is false. + # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: + # if it's called for subdir of a project it can't find funcs usages. All text editor integrations + # with golangci-lint call it on a directory with the changed file. + check-exported: false + tenv: + # The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures. + # Otherwise, only methods that take `*testing.T`, `*testing.B`, and `testing.TB` as arguments are checked. + # Default: false + all: true + # gosec: + # includes: # TODO ver esto, no esta dando el mismo resultado que gosec a secas - - G104 - - G401 - - G402 - - G404 + # - G104 + # - G401 + # - G402 + # - G404 issues: # List of regexps of issue texts to exclude, empty list by default. @@ -271,10 +211,17 @@ issues: - composite literal uses unkeyed fields exclude-rules: # Exclude some linters from running on test files. - - path: _test\.go$|^tests/|^samples/ + - path: _test\.go$|^testintegration/|^test_e2e/ linters: - errcheck - - maligned + - forcetypeassert + - funlen + - goconst + - noctx + - gomnd + # TODO sacar + - goimports + - gofumpt # We need to use the deprecated module since the jsonpb replacement is not backwards compatible. - linters: - staticcheck diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index 775d7541..33805c13 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -50,10 +50,12 @@ func GetCRUDServiceModule[T any]() fx.Option { // service fx.Provide(NewCRUDService[T, uint]), ) - default: + case KindNotBaDORMModel: log.Printf("type %T is not a BaDORM Module\n", entity) return fx.Invoke(failNotBadORMModule()) } + + return fx.Invoke(failNotBadORMModule()) } func failNotBadORMModule() error { @@ -90,10 +92,12 @@ func GetCRUDUnsafeServiceModule[T any]() fx.Option { // service fx.Provide(NewCRUDUnsafeService[T, uint]), ) - default: + case KindNotBaDORMModel: log.Printf("type %T is not a BaDORM Module\n", entity) return fx.Invoke(failNotBadORMModule()) } + + return fx.Invoke(failNotBadORMModule()) } type modelKind uint diff --git a/badorm/baseModels.go b/badorm/baseModels.go index 9a99ba5c..90fe1b46 100644 --- a/badorm/baseModels.go +++ b/badorm/baseModels.go @@ -23,7 +23,7 @@ type UUIDModel struct { DeletedAt gorm.DeletedAt `gorm:"index"` } -func (model *UUIDModel) BeforeCreate(tx *gorm.DB) (err error) { +func (model *UUIDModel) BeforeCreate(_ *gorm.DB) (err error) { if model.ID == UUID(uuid.Nil) { model.ID = UUID(uuid.New()) } diff --git a/badorm/condition.go b/badorm/condition.go index 355c3869..74c243dc 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -30,8 +30,8 @@ type WhereCondition[T any] struct { Value any } -//nolint:unused -func (condition WhereCondition[T]) interfaceVerificationMethod(t T) { +//nolint:unused // see inside +func (condition WhereCondition[T]) interfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] } @@ -92,8 +92,8 @@ type JoinCondition[T1 any, T2 any] struct { Conditions []Condition[T2] } -//nolint:unused -func (condition JoinCondition[T1, T2]) interfaceVerificationMethod(t T1) { +//nolint:unused // see inside +func (condition JoinCondition[T1, T2]) interfaceVerificationMethod(_ T1) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] } diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 11b82d44..1c8ac157 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -73,12 +73,13 @@ func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Cond return nil, err } - if len(entities) > 1 { - return nil, ErrMoreThanOneObjectFound - } else if len(entities) == 1 { + switch { + case len(entities) == 1: return entities[0], nil - } else { + case len(entities) == 0: return nil, ErrObjectNotFound + default: + return nil, ErrMoreThanOneObjectFound } } diff --git a/badorm/crudUnsafeRepository.go b/badorm/crudUnsafeRepository.go index 625f9300..d0a41299 100644 --- a/badorm/crudUnsafeRepository.go +++ b/badorm/crudUnsafeRepository.go @@ -51,7 +51,9 @@ func (repository *CRUDUnsafeRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, cond entity := new(T) // only entities that match the conditions for joinAttributeName, joinConditions := range joinConditions { - tableName, err := getTableName(tx, entity) + var tableName string + + tableName, err = getTableName(tx, entity) if err != nil { return nil, err } @@ -148,7 +150,7 @@ func (repository *CRUDUnsafeRepositoryImpl[T, ID]) addJoinToQuery( query.Joins(stringQuery, conditionsValues...) for joinAttributeName, joinConditions := range joinConditions { - err := repository.addJoinToQuery( + err = repository.addJoinToQuery( query, relatedObject, tableWithSuffix, diff --git a/badorm/uuid.go b/badorm/uuid.go index 289abc2d..33491086 100644 --- a/badorm/uuid.go +++ b/badorm/uuid.go @@ -14,7 +14,7 @@ type UUID uuid.UUID var NilUUID = UUID(uuid.Nil) -func (id UUID) GormDBDataType(db *gorm.DB, field *schema.Field) string { +func (id UUID) GormDBDataType(db *gorm.DB, _ *schema.Field) string { switch db.Dialector.Name() { case "mysql": return "binary(16)" @@ -65,7 +65,7 @@ func (id *UUID) Scan(src interface{}) error { return (*uuid.UUID)(id).Scan(src) } -func (id UUID) GormValue(ctx context.Context, db *gorm.DB) clause.Expr { +func (id UUID) GormValue(_ context.Context, db *gorm.DB) clause.Expr { if len(id) == 0 { return gorm.Expr("NULL") } diff --git a/configuration/DatabaseCommandsInitializer.go b/configuration/DatabaseCommandsInitializer.go index a7c04cbb..a8f43100 100644 --- a/configuration/DatabaseCommandsInitializer.go +++ b/configuration/DatabaseCommandsInitializer.go @@ -1,6 +1,9 @@ package configuration import ( + "fmt" + + "github.com/ditrit/badaas/configuration/defaults" "github.com/ditrit/verdeter" "github.com/ditrit/verdeter/validators" ) @@ -42,16 +45,22 @@ func NewDatabaseCommandsInitializer() CommandsInitializer { Usage: "The sslmode to use when connecting to the database server", }, { - Name: DatabaseRetryKey, - ValType: verdeter.IsUint, - Usage: "The number of times badaas tries to establish a connection with the database", - DefaultV: uint(10), + Name: DatabaseRetryKey, + ValType: verdeter.IsUint, + Usage: fmt.Sprintf( + "The number of times badaas tries to establish a connection with the database (default is %d)", + defaults.DatabaseRetryTimes, + ), + DefaultV: defaults.DatabaseRetryTimes, }, { - Name: DatabaseRetryDurationKey, - ValType: verdeter.IsUint, - Usage: "The duration in seconds badaas wait between connection attempts", - DefaultV: uint(5), + Name: DatabaseRetryDurationKey, + ValType: verdeter.IsUint, + Usage: fmt.Sprintf( + "The duration in seconds badaas wait between connection attempts (default is %ds)", + defaults.DatabaseRetryDuration, + ), + DefaultV: defaults.DatabaseRetryDuration, }, { Name: DatabaseDialectorKey, diff --git a/configuration/HttpServerConfiguration.go b/configuration/HttpServerConfiguration.go index 5f9f9091..6adf5465 100644 --- a/configuration/HttpServerConfiguration.go +++ b/configuration/HttpServerConfiguration.go @@ -12,11 +12,10 @@ import ( // The config keys regarding the http server settings const ( - ServerTimeoutKey string = "server.timeout" - ServerHostKey string = "server.host" - ServerPortKey string = "server.port" - ServerPaginationMaxElemPerPage string = "server.pagination.page.max" - ServerExampleKey string = "server.example" + ServerTimeoutKey string = "server.timeout" + ServerHostKey string = "server.host" + ServerPortKey string = "server.port" + ServerPaginationMaxElemPerPageKey string = "server.pagination.page.max" ) // Hold the configuration values for the http server diff --git a/configuration/PaginationConfiguration.go b/configuration/PaginationConfiguration.go index f91408d8..2bcd16a0 100644 --- a/configuration/PaginationConfiguration.go +++ b/configuration/PaginationConfiguration.go @@ -31,7 +31,7 @@ func (paginationConfiguration *paginationConfigurationImpl) GetMaxElemPerPage() // Reload pagination configuration func (paginationConfiguration *paginationConfigurationImpl) Reload() { - paginationConfiguration.pagesNb = viper.GetUint(ServerPaginationMaxElemPerPage) + paginationConfiguration.pagesNb = viper.GetUint(ServerPaginationMaxElemPerPageKey) } // Log the values provided by the configuration holder diff --git a/configuration/ServerCommandsInitializer.go b/configuration/ServerCommandsInitializer.go index a4ff07ec..1c6ee03b 100644 --- a/configuration/ServerCommandsInitializer.go +++ b/configuration/ServerCommandsInitializer.go @@ -1,6 +1,9 @@ package configuration import ( + "fmt" + + "github.com/ditrit/badaas/configuration/defaults" "github.com/ditrit/verdeter" "github.com/ditrit/verdeter/validators" ) @@ -12,33 +15,27 @@ func NewServerCommandsInitializer() CommandsInitializer { { Name: ServerTimeoutKey, ValType: verdeter.IsInt, - Usage: "Maximum timeout of the http server in second (default is 15s)", - DefaultV: 15, + Usage: fmt.Sprintf("Maximum timeout of the http server in second (default is %ds)", defaults.ServerTimeout), + DefaultV: defaults.ServerTimeout, }, { Name: ServerHostKey, ValType: verdeter.IsStr, - Usage: "Address to bind (default is 0.0.0.0)", - DefaultV: "0.0.0.0", + Usage: fmt.Sprintf("Address to bind (default is %s)", defaults.ServerHost), + DefaultV: defaults.ServerHost, }, { Name: ServerPortKey, ValType: verdeter.IsInt, - Usage: "Port to bind (default is 8000)", - DefaultV: 8000, + Usage: fmt.Sprintf("Port to bind (default is %d)", defaults.ServerPort), + DefaultV: defaults.ServerPort, Validator: &validators.CheckTCPHighPort, }, { - Name: ServerPaginationMaxElemPerPage, + Name: ServerPaginationMaxElemPerPageKey, ValType: verdeter.IsUint, - Usage: "The max number of records returned per page", - DefaultV: uint(100), - }, - { - Name: ServerExampleKey, - ValType: verdeter.IsStr, - Usage: "Example server to exec (birds | posts)", - DefaultV: "", + Usage: fmt.Sprintf("The max number of records returned per page (default is %d)", defaults.ServerPaginationMaxElemPerPage), + DefaultV: defaults.ServerPaginationMaxElemPerPage, }, }, } diff --git a/configuration/SessionCommandsInitializer.go b/configuration/SessionCommandsInitializer.go index 1b238c14..70e56c60 100644 --- a/configuration/SessionCommandsInitializer.go +++ b/configuration/SessionCommandsInitializer.go @@ -1,6 +1,7 @@ package configuration import ( + "github.com/ditrit/badaas/configuration/defaults" "github.com/ditrit/verdeter" ) @@ -12,19 +13,19 @@ func NewSessionCommandsInitializer() CommandsInitializer { Name: SessionDurationKey, ValType: verdeter.IsUint, Usage: "The duration of a user session in seconds", - DefaultV: uint(3600 * 4), // 4 hours by default + DefaultV: defaults.SessionDuration, }, { Name: SessionPullIntervalKey, ValType: verdeter.IsUint, Usage: "The refresh interval in seconds. Badaas refresh it's internal session cache periodically", - DefaultV: uint(30), // 30 seconds by default + DefaultV: defaults.SessionPullInterval, }, { Name: SessionRollIntervalKey, ValType: verdeter.IsUint, Usage: "The interval in which the user can renew it's session by making a request", - DefaultV: uint(3600), // 1 hour by default + DefaultV: defaults.SessionRollInterval, }, }, } diff --git a/configuration/defaults/defaults.go b/configuration/defaults/defaults.go new file mode 100644 index 00000000..922a9f30 --- /dev/null +++ b/configuration/defaults/defaults.go @@ -0,0 +1,14 @@ +package defaults + +// Database +const ( + DatabaseRetryTimes = uint(10) + DatabaseRetryDuration = uint(5) + ServerTimeout = 15 + ServerHost = "0.0.0.0" + ServerPort = 8000 + ServerPaginationMaxElemPerPage = uint(100) + SessionDuration = uint(3600 * 4) // 4 hours + SessionPullInterval = uint(30) // 30 seconds + SessionRollInterval = uint(3600) // 1 hour +) diff --git a/controllers/basicAuth.go b/controllers/basicAuth.go index 1869814a..9061ffd8 100644 --- a/controllers/basicAuth.go +++ b/controllers/basicAuth.go @@ -19,6 +19,8 @@ var HERRAccessToken = func(err error) httperrors.HTTPError { return httperrors.NewInternalServerError("access token error", "unable to create access token", err) } +const SessionCookieDuration = 48 * time.Hour + type BasicAuthenticationController interface { BasicLoginHandler(http.ResponseWriter, *http.Request) (any, httperrors.HTTPError) Logout(http.ResponseWriter, *http.Request) (any, httperrors.HTTPError) @@ -113,7 +115,7 @@ func createAndSetAccessTokenCookie(w http.ResponseWriter, sessionUUID string) er HttpOnly: true, SameSite: http.SameSiteNoneMode, // TODO change to http.SameSiteStrictMode in prod Secure: false, // TODO change to true in prod - Expires: time.Now().Add(48 * time.Hour), + Expires: time.Now().Add(SessionCookieDuration), } if err := accessToken.Valid(); err != nil { return err diff --git a/controllers/crud.go b/controllers/crud.go index d6cd47a4..35a29cd4 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -53,7 +53,7 @@ type crudControllerImpl[T any] struct { } // The handler responsible of the retrieval of one object -func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +func (controller *crudControllerImpl[T]) GetObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityID, herr := getEntityIDFromRequest(r) if herr != nil { return nil, herr @@ -65,7 +65,7 @@ func (controller *crudControllerImpl[T]) GetObject(w http.ResponseWriter, r *htt } // The handler responsible of the retrieval of multiple objects -func (controller *crudControllerImpl[T]) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +func (controller *crudControllerImpl[T]) GetObjects(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { params, herr := decodeJSONOptional(r) if herr != nil { return nil, herr diff --git a/controllers/eav.go b/controllers/eav.go index fb66072a..ad299153 100644 --- a/controllers/eav.go +++ b/controllers/eav.go @@ -43,7 +43,7 @@ type eavControllerImpl struct { } // The handler responsible of the retrieval of one objects -func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +func (controller *eavControllerImpl) GetObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) if herr != nil { return nil, herr @@ -55,7 +55,7 @@ func (controller *eavControllerImpl) GetObject(w http.ResponseWriter, r *http.Re } // The handler responsible of the retrieval of multiple objects -func (controller *eavControllerImpl) GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +func (controller *eavControllerImpl) GetObjects(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) if herr != nil { return nil, herr @@ -99,7 +99,7 @@ func buildEAVLocationString(et *models.Entity) string { } // The handler responsible for the updates of one object -func (controller *eavControllerImpl) UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +func (controller *eavControllerImpl) UpdateObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) if herr != nil { return nil, herr @@ -116,7 +116,7 @@ func (controller *eavControllerImpl) UpdateObject(w http.ResponseWriter, r *http } // The handler responsible for the deletion of a object -func (controller *eavControllerImpl) DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +func (controller *eavControllerImpl) DeleteObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) if herr != nil { return nil, herr diff --git a/controllers/info.go b/controllers/info.go index 81297fb6..1c4f95f6 100644 --- a/controllers/info.go +++ b/controllers/info.go @@ -30,7 +30,7 @@ func NewInfoController(version *semver.Version) InformationController { } // Return the badaas server information -func (c *infoControllerImpl) Info(response http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +func (c *infoControllerImpl) Info(_ http.ResponseWriter, _ *http.Request) (any, httperrors.HTTPError) { return &BadaasServerInfo{ Status: "OK", Version: c.Version.String(), diff --git a/persistence/gormdatabase/gormzap/gormzap.go b/persistence/gormdatabase/gormzap/gormzap.go index d7878854..f2c02103 100644 --- a/persistence/gormdatabase/gormzap/gormzap.go +++ b/persistence/gormdatabase/gormzap/gormzap.go @@ -13,6 +13,8 @@ import ( gormlogger "gorm.io/gorm/logger" ) +const SlowThreshold = 100 * time.Millisecond + // This type implement the [gorm.io/gorm/logger.Interface] interface. // It is to be used as a replacement for the original logger type Logger struct { @@ -28,7 +30,7 @@ func New(zapLogger *zap.Logger) gormlogger.Interface { return Logger{ ZapLogger: zapLogger, LogLevel: gormlogger.Info, - SlowThreshold: 100 * time.Millisecond, + SlowThreshold: SlowThreshold, SkipCallerLookup: true, IgnoreRecordNotFoundError: true, } diff --git a/router/middlewares/middlewarelogger_test.go b/router/middlewares/middlewarelogger_test.go index 22e774dc..711a7582 100644 --- a/router/middlewares/middlewarelogger_test.go +++ b/router/middlewares/middlewarelogger_test.go @@ -29,7 +29,7 @@ func TestMiddlewareLogger(t *testing.T) { res := httptest.NewRecorder() actuallyRun := false // create a handler to use as "next" which will verify the request - nextHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + nextHandler := http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) { actuallyRun = true }) loggerConfiguration := configurationmocks.NewLoggerConfiguration(t) diff --git a/services/eav.go b/services/eav.go index 7b6a61b9..0721c9ae 100644 --- a/services/eav.go +++ b/services/eav.go @@ -166,7 +166,7 @@ func (eavService *eavServiceImpl) UpdateEntity(entityTypeName string, entityID b for _, value := range entity.Fields { newValue, isPresent := newValues[value.Attribute.Name] if isPresent { - err := eavService.updateValue(tx, value, newValue) + err = eavService.updateValue(tx, value, newValue) if err != nil { return nil, err } diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index 67b53638..cabf41c7 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -39,7 +39,7 @@ func main() { } // Run the http server for badaas -func runHTTPServer(cmd *cobra.Command, args []string) { +func runHTTPServer(_ *cobra.Command, _ []string) { fx.New( fx.Provide(testintegration.GetModels), badaas.BadaasModule, diff --git a/testintegration/badaas_test.go b/testintegration/badaas_test.go index ef634c67..0d327bb3 100644 --- a/testintegration/badaas_test.go +++ b/testintegration/badaas_test.go @@ -13,7 +13,6 @@ import ( "go.uber.org/fx" "go.uber.org/fx/fxevent" "go.uber.org/zap" - "gorm.io/gorm" "github.com/ditrit/badaas" "github.com/ditrit/badaas/configuration" @@ -46,7 +45,7 @@ func TestBaDaaS(t *testing.T) { testsCommand.Execute() } -func injectDependencies(cmd *cobra.Command, args []string) { +func injectDependencies(_ *cobra.Command, _ []string) { fx.New( fx.Provide(GetModels), badaas.BadaasModule, @@ -65,7 +64,6 @@ func injectDependencies(cmd *cobra.Command, args []string) { func runBaDaaSTestSuites( tsEAVService *EAVServiceIntTestSuite, - db *gorm.DB, shutdowner fx.Shutdowner, ) { suite.Run(tGlobal, tsEAVService) diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index 1ed43984..e7619e25 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -79,7 +79,6 @@ func runBaDORMTestSuites( tsCRUDService *CRUDServiceIntTestSuite, tsCRUDRepository *CRUDRepositoryIntTestSuite, tsCRUDUnsafeService *CRUDUnsafeServiceIntTestSuite, - db *gorm.DB, shutdowner fx.Shutdowner, ) { suite.Run(tGlobal, tsCRUDService) diff --git a/testintegration/crudUnsafeService_test.go b/testintegration/crudUnsafeService_test.go index 5074f4ff..f29a00d0 100644 --- a/testintegration/crudUnsafeService_test.go +++ b/testintegration/crudUnsafeService_test.go @@ -161,13 +161,13 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfInc result, err := ts.crudProductService.GetEntities(params) switch configuration.DBDialector(os.Getenv(dbTypeEnvKey)) { - case configuration.PostgreSQL: - // postgres does the verification - ts.NotNil(err) - case configuration.MySQL: - // mysql simply matches nothing + case configuration.MySQL, configuration.SQLite: + // mysql and sqlite simply matches nothing ts.Nil(err) ts.Len(result, 0) + case configuration.PostgreSQL, configuration.SQLServer: + // postgresql and sqlserver do the verification + ts.NotNil(err) } } diff --git a/testintegration/eavService.go b/testintegration/eavService.go index e0f736a5..0907bcd5 100644 --- a/testintegration/eavService.go +++ b/testintegration/eavService.go @@ -631,12 +631,14 @@ func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGo "string2": "description", }) + var err error + for i := 0; i < 10; i++ { params := map[string]any{ "string": fmt.Sprintf("displayName%d", i), "string2": fmt.Sprintf("description%d", i), } - entity, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, params) + entity, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, params) ts.Nil(err) for _, value := range entity.Fields { diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 2d591f0f..f6170b72 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -47,7 +47,7 @@ func (MultiString) GormDataType() string { return "text" } -func (MultiString) GormDBDataType(db *gorm.DB, field *schema.Field) string { +func (MultiString) GormDBDataType(db *gorm.DB, _ *schema.Field) string { switch db.Dialector.Name() { case "sqlserver": return "varchar(255)" diff --git a/tools/badctl/cmd/gen/conditions/jenParam.go b/tools/badctl/cmd/gen/conditions/jenParam.go index f17a9318..2976d300 100644 --- a/tools/badctl/cmd/gen/conditions/jenParam.go +++ b/tools/badctl/cmd/gen/conditions/jenParam.go @@ -1,9 +1,12 @@ package conditions import ( + "errors" "go/types" "github.com/dave/jennifer/jen" + + "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" ) type JenParam struct { @@ -56,6 +59,12 @@ func (param JenParam) ToBasicKind(basicType *types.Basic) { param.statement.Complex128() case types.String: param.statement.String() + case types.Invalid, types.UnsafePointer, + types.UntypedBool, types.UntypedInt, + types.UntypedRune, types.UntypedFloat, + types.UntypedComplex, types.UntypedString, + types.UntypedNil: + cmderrors.FailErr(errors.New("unreachable! untyped types can't be inside a struct")) } } diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index a264a17e..85ed2373 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -37,7 +37,7 @@ func init() { } // GenConditionsCmd Run func -func generateConditions(cmd *cobra.Command, args []string) { +func generateConditions(_ *cobra.Command, args []string) { log.SetLevel() // Inspect package and use type checker to infer imported types pkgs := loadPackages(args) diff --git a/tools/badctl/cmd/gen/docker.go b/tools/badctl/cmd/gen/docker.go index 590a8cb7..27d533b1 100644 --- a/tools/badctl/cmd/gen/docker.go +++ b/tools/badctl/cmd/gen/docker.go @@ -40,10 +40,16 @@ const ( var DBProviders = []string{Cockroachdb, Postgres, MySQL} +const ( + CockroachdbDefaultPort = 26257 + PostgresDefaultPort = 5432 + MySQLDefaultPort = 3306 +) + var DBPorts = map[string]int{ - Cockroachdb: 26257, - Postgres: 5432, - MySQL: 3306, + Cockroachdb: CockroachdbDefaultPort, + Postgres: PostgresDefaultPort, + MySQL: MySQLDefaultPort, } var DBDialectors = map[string]configuration.DBDialector{ @@ -52,6 +58,8 @@ var DBDialectors = map[string]configuration.DBDialector{ MySQL: configuration.MySQL, } +const FilePermissions = 0o0600 + func init() { err := genDockerCmd.LKey( DBProviderKey, verdeter.IsStr, "p", @@ -72,7 +80,7 @@ func init() { ) } -func generateDockerFiles(cmd *cobra.Command, args []string) { +func generateDockerFiles(_ *cobra.Command, _ []string) { sourceDockerDir := "docker" destDockerDir := filepath.Join(destBadaasDir, "docker") @@ -138,7 +146,7 @@ func copyBadaasConfig(dbProvider string) { err = os.WriteFile( filepath.Join(destConfigDir, "badaas.yml"), - configBytes, 0o0600, + configBytes, FilePermissions, ) if err != nil { cmderrors.FailErr(err) @@ -151,7 +159,7 @@ func copyFile(sourcePath, destPath string) { cmderrors.FailErr(err) } - if err := os.WriteFile(destPath, fileContent, 0o0600); err != nil { + if err := os.WriteFile(destPath, fileContent, FilePermissions); err != nil { cmderrors.FailErr(err) } } From 71be7d6041b57e94cdc6ec45c40ee83a7693e65d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 9 Jun 2023 17:34:50 +0200 Subject: [PATCH 325/467] go sec is inside golangci-lint --- .github/workflows/CI.yml | 16 +--------------- .golangci.yml | 17 ++++++++++------- 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index d9bb94a8..e3cdd145 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -57,20 +57,6 @@ jobs: skip-pkg-cache: true skip-build-cache: true - go-sec: - needs: [branch-naming-rules] - runs-on: ubuntu-latest - env: - GO111MODULE: on - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Run Gosec Security Scanner - uses: securego/gosec@master - with: - args: ./... - unit-tests: name: Unit tests needs: [branch-naming-rules] @@ -199,7 +185,7 @@ jobs: sonarcloud: name: SonarCloud - needs: [check-style, go-sec, integration-tests] + needs: [check-style, integration-tests] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 diff --git a/.golangci.yml b/.golangci.yml index fa760d5b..8d5be1d4 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -194,13 +194,16 @@ linters-settings: # Otherwise, only methods that take `*testing.T`, `*testing.B`, and `testing.TB` as arguments are checked. # Default: false all: true - # gosec: - # includes: - # TODO ver esto, no esta dando el mismo resultado que gosec a secas - # - G104 - # - G401 - # - G402 - # - G404 + gosec: + config: + # Globals are applicable to all rules. + global: + # If true, ignore #nosec in comments (and an alternative as well). + # Default: false + nosec: true + # Audit mode enables addition checks that for normal code analysis might be too nosy. + # Default: false + audit: true issues: # List of regexps of issue texts to exclude, empty list by default. From f106cb5561e1e992034811f57a14a3c6b396fcca Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 9 Jun 2023 17:43:24 +0200 Subject: [PATCH 326/467] add vscode settings template --- .golangci.yml | 1 - .vscode.settings.json.template | 14 ++++++++++++++ CONTRIBUTING.md | 5 +++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .vscode.settings.json.template diff --git a/.golangci.yml b/.golangci.yml index 8d5be1d4..21ce2868 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -55,7 +55,6 @@ linters: - errname # checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error - errchkjson # checks types passed to the json encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted fast: false -# TODO agregar el template que formatea bien para vscode # All possible options can be found here https://github.com/golangci/golangci-lint/blob/master/.golangci.reference.yml linters-settings: diff --git a/.vscode.settings.json.template b/.vscode.settings.json.template new file mode 100644 index 00000000..39be3908 --- /dev/null +++ b/.vscode.settings.json.template @@ -0,0 +1,14 @@ +{ + "json.schemaDownload.enable": true, + "go.lintTool": "golangci-lint", + "go.lintFlags": [ + "--fast" + ], + "gopls": { + "formatting.gofumpt": true, + "formatting.local": "github.com/ditrit" + }, + "go.formatFlags": [ + "-s" + ] +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6cc053ed..22b19f78 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,6 +3,7 @@ - [Contribute to the development of badaas](#contribute-to-the-development-of-badaas) - [Tests](#tests) - [Dependencies](#dependencies) + - [Linting](#linting) - [Unit tests](#unit-tests) - [Integration tests](#integration-tests) - [Feature tests (or end to end tests)](#feature-tests-or-end-to-end-tests) @@ -19,6 +20,10 @@ Running tests have some dependencies as: `mockery`, `gotestsum`, etc.. Install them with `make install dependencies`. +### Linting + +We use `golangci-lint` for linting our code. You can test it with `make lint`. The configuration file is in the default path (`.golangci.yml`). The file `.vscode.settings.json.template` is a template for your `.vscode/settings.json` that formats the code according to our configuration. + ### Unit tests We use the standard test suite in combination with [github.com/stretchr/testify](https://github.com/stretchr/testify) to do our unit testing. Mocks are generated using [mockery](https://github.com/vektra/mockery) a mock generator using this command `make test_generate_mocks`. From 9559eb84f267f99b68fbdeb8de14bd76513c7ff8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 9 Jun 2023 18:10:40 +0200 Subject: [PATCH 327/467] run gofumpt with badctl gen --- .golangci.yml | 12 ++++-------- go.work.sum | 5 +++++ tools/badctl/cmd/gen/conditions/main.go | 6 ++++++ tools/badctl/go.mod | 1 + 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 21ce2868..44b3097c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -11,15 +11,14 @@ run: # from this option's value: # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ skip-dirs: - - genfiles$ - - vendor$ + - mocks$ # which files to skip: they will be analyzed, but issues from them # won't be reported. Default value is empty list, but there is # no need to include all autogenerated files, we confidently recognize # autogenerated files. - skip-files: - - ".*\\.pb\\.go" - - ".*\\.gen\\.go" + # skip-files: + # - ".*\\.pb\\.go" + # - ".*\\.gen\\.go" linters: enable-all: true @@ -221,9 +220,6 @@ issues: - goconst - noctx - gomnd - # TODO sacar - - goimports - - gofumpt # We need to use the deprecated module since the jsonpb replacement is not backwards compatible. - linters: - staticcheck diff --git a/go.work.sum b/go.work.sum index d9630da3..7892dc84 100644 --- a/go.work.sum +++ b/go.work.sum @@ -393,6 +393,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -433,6 +435,8 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y= +golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= @@ -469,3 +473,4 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js= diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 85ed2373..660af441 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -5,6 +5,7 @@ import ( "fmt" "go/types" "os" + "os/exec" "github.com/ettle/strcase" "github.com/spf13/cobra" @@ -55,6 +56,11 @@ func generateConditions(_ *cobra.Command, args []string) { for _, pkg := range pkgs { generateConditionsForPkg(destPkg, pkg) } + + cmd := exec.Command("gofumpt -l -w .") + if err := cmd.Run(); err != nil { + cmderrors.FailErr(err) + } } // Generates a file with conditions for each BaDORM model in the package diff --git a/tools/badctl/go.mod b/tools/badctl/go.mod index fc5c37a4..8170907d 100644 --- a/tools/badctl/go.mod +++ b/tools/badctl/go.mod @@ -19,6 +19,7 @@ require ( gopkg.in/yaml.v3 v3.0.1 gorm.io/gorm v1.25.1 gotest.tools v2.2.0+incompatible + mvdan.cc/gofumpt v0.5.0 ) require ( From 4266cae79240ea5127d18300a525cf1c854d9aa5 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 12 Jun 2023 10:10:49 +0200 Subject: [PATCH 328/467] allow last version of golangci lint --- .github/workflows/CI.yml | 3 --- .golangci.yml | 7 +++++-- test_e2e/http_support_test.go | 5 +---- tools/badctl/cmd/gen/conditions/main.go | 6 ------ 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index e3cdd145..b1b116cc 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -34,14 +34,12 @@ jobs: - name: badaas lint uses: golangci/golangci-lint-action@v3 with: - version: v1.52.2 skip-cache: true skip-pkg-cache: true skip-build-cache: true - name: teste2e lint uses: golangci/golangci-lint-action@v3 with: - version: v1.52.2 working-directory: test_e2e args: --config=../.golangci.yml skip-cache: true @@ -50,7 +48,6 @@ jobs: - name: badctl lint uses: golangci/golangci-lint-action@v3 with: - version: v1.52.2 working-directory: tools/badctl args: --config=../../.golangci.yml skip-cache: true diff --git a/.golangci.yml b/.golangci.yml index 44b3097c..fa94a7ec 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -66,8 +66,11 @@ linters-settings: # Default: 0.0 package-average: 0.0 depguard: - packages-with-error-message: - - github.com/gogo/protobuf: "gogo/protobuf is deprecated, use golang/protobuf" + rules: + main: + deny: + - pkg: "github.com/gogo/protobuf" + desc: gogo/protobuf is deprecated, use golang/protobuf errcheck: # report about not checking of errors in type assetions: `a := b.(MyStruct)`; # default is false: such cases aren't reported by default. diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 165af2f9..b5b2581e 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -176,13 +176,11 @@ func getTableValue(key, valueAsString, valueType string) (any, error) { } return jsonMap, nil - case nullValueType: - return nil, nil default: return nil, fmt.Errorf( "type %q does not exists, please use %v", valueType, - []string{stringValueType, booleanValueType, integerValueType, floatValueType, nullValueType}, + []string{stringValueType, booleanValueType, integerValueType, floatValueType}, ) } } @@ -232,7 +230,6 @@ const ( booleanValueType = "boolean" integerValueType = "integer" floatValueType = "float" - nullValueType = "null" jsonValueType = "json" ) diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 660af441..85ed2373 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -5,7 +5,6 @@ import ( "fmt" "go/types" "os" - "os/exec" "github.com/ettle/strcase" "github.com/spf13/cobra" @@ -56,11 +55,6 @@ func generateConditions(_ *cobra.Command, args []string) { for _, pkg := range pkgs { generateConditionsForPkg(destPkg, pkg) } - - cmd := exec.Command("gofumpt -l -w .") - if err := cmd.Run(); err != nil { - cmderrors.FailErr(err) - } } // Generates a file with conditions for each BaDORM model in the package From c2d82f44716b82309e88ec7b7677638b1b1876a6 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 12 Jun 2023 10:12:58 +0200 Subject: [PATCH 329/467] remove todos --- tools/badctl/cmd/gen/conditions/main.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 85ed2373..bbb13851 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -83,8 +83,6 @@ func generateConditionsForPkg(destPkg string, pkg *packages.Package) { } } -// TODO verificar linting de los archivos generados -// TODO ponerles .gen.go // Load package information from paths func loadPackages(paths []string) []*packages.Package { cfg := &packages.Config{Mode: packages.NeedTypes} From 72126c9c9251d869b158f271b6228792f1c22745 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 12 Jun 2023 10:13:38 +0200 Subject: [PATCH 330/467] remove todo --- tools/badctl/cmd/gen/conditions/main_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/badctl/cmd/gen/conditions/main_test.go b/tools/badctl/cmd/gen/conditions/main_test.go index 55ca2286..a32873e7 100644 --- a/tools/badctl/cmd/gen/conditions/main_test.go +++ b/tools/badctl/cmd/gen/conditions/main_test.go @@ -195,7 +195,6 @@ func checkFilesEqual(t *testing.T, file1, file2 string) { remove(file1) } -// TODO hacer esto en la rama anterior // TODO codigo repetido func checkFileExists(t *testing.T, name string) fs.FileInfo { stat, err := os.Stat(name) From da6194c094d56edb34c3b7f49de021c158a645e1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 12 Jun 2023 10:18:53 +0200 Subject: [PATCH 331/467] remove repeted code --- tools/badctl/cmd/gen/conditions/main_test.go | 35 +++++------------- tools/badctl/cmd/gen/docker_test.go | 37 +++++++------------- tools/badctl/cmd/utils/file.go | 24 +++++++++++++ 3 files changed, 45 insertions(+), 51 deletions(-) create mode 100644 tools/badctl/cmd/utils/file.go diff --git a/tools/badctl/cmd/gen/conditions/main_test.go b/tools/badctl/cmd/gen/conditions/main_test.go index 25f70046..1456c9c1 100644 --- a/tools/badctl/cmd/gen/conditions/main_test.go +++ b/tools/badctl/cmd/gen/conditions/main_test.go @@ -3,13 +3,13 @@ package conditions import ( "bytes" "io" - "io/fs" - "log" "os" "testing" "github.com/spf13/viper" "gotest.tools/assert" + + "github.com/ditrit/badaas/tools/badctl/cmd/utils" ) const chunkSize = 100000 @@ -111,28 +111,28 @@ func TestOverrideForeignKey(t *testing.T) { doTest(t, "./tests/overrideforeignkey", []Comparison{ {Have: "bicycle_conditions.go", Expected: "./tests/results/overrideforeignkey.go"}, }) - remove("person_conditions.go") + utils.RemoveFile("person_conditions.go") } func TestOverrideReferences(t *testing.T) { doTest(t, "./tests/overridereferences", []Comparison{ {Have: "phone_conditions.go", Expected: "./tests/results/overridereferences.go"}, }) - remove("brand_conditions.go") + utils.RemoveFile("brand_conditions.go") } func TestOverrideForeignKeyInverse(t *testing.T) { doTest(t, "./tests/overrideforeignkeyinverse", []Comparison{ {Have: "user_conditions.go", Expected: "./tests/results/overrideforeignkeyinverse.go"}, }) - remove("credit_card_conditions.go") + utils.RemoveFile("credit_card_conditions.go") } func TestOverrideReferencesInverse(t *testing.T) { doTest(t, "./tests/overridereferencesinverse", []Comparison{ {Have: "computer_conditions.go", Expected: "./tests/results/overridereferencesinverse.go"}, }) - remove("processor_conditions.go") + utils.RemoveFile("processor_conditions.go") } type Comparison struct { @@ -149,8 +149,8 @@ func doTest(t *testing.T, sourcePkg string, comparisons []Comparison) { } func checkFilesEqual(t *testing.T, file1, file2 string) { - stat1 := checkFileExists(t, file1) - stat2 := checkFileExists(t, file2) + stat1 := utils.CheckFileExists(t, file1) + stat2 := utils.CheckFileExists(t, file2) // do inputs at least have the same size? assert.Equal(t, stat1.Size(), stat2.Size(), "File lens are not equal") @@ -189,22 +189,5 @@ func checkFilesEqual(t *testing.T, file1, file2 string) { } } - remove(file1) -} - -// TODO codigo repetido -func checkFileExists(t *testing.T, name string) fs.FileInfo { - stat, err := os.Stat(name) - if err != nil { - t.Error(err) - } - - return stat -} - -func remove(name string) { - err := os.RemoveAll(name) - if err != nil { - log.Fatal(err) - } + utils.RemoveFile(file1) } diff --git a/tools/badctl/cmd/gen/docker_test.go b/tools/badctl/cmd/gen/docker_test.go index 776859f0..8ff6e2fa 100644 --- a/tools/badctl/cmd/gen/docker_test.go +++ b/tools/badctl/cmd/gen/docker_test.go @@ -2,13 +2,13 @@ package gen import ( "io/ioutil" - "log" - "os" "testing" "github.com/magiconair/properties/assert" "github.com/spf13/viper" "gopkg.in/yaml.v3" + + "github.com/ditrit/badaas/tools/badctl/cmd/utils" ) func TestGenCockroach(t *testing.T) { @@ -22,25 +22,19 @@ func TestGenPostgres(t *testing.T) { viper.Set(DBProviderKey, Postgres) generateDockerFiles(nil, nil) checkFilesExist(t) - checkFileExists(t, "badaas/docker/db/init.sql") + utils.CheckFileExists(t, "badaas/docker/db/init.sql") checkDBPort(t, 5432) teardown() } func checkFilesExist(t *testing.T) { - checkFileExists(t, ".dockerignore") - checkFileExists(t, "Makefile") - checkFileExists(t, "badaas/config/badaas.yml") - checkFileExists(t, "badaas/docker/api/docker-compose.yml") - checkFileExists(t, "badaas/docker/api/Dockerfile") - checkFileExists(t, "badaas/docker/db/docker-compose.yml") -} - -func checkFileExists(t *testing.T, name string) { - if _, err := os.Stat(name); err != nil { - t.Error(err) - } + utils.CheckFileExists(t, ".dockerignore") + utils.CheckFileExists(t, "Makefile") + utils.CheckFileExists(t, "badaas/config/badaas.yml") + utils.CheckFileExists(t, "badaas/docker/api/docker-compose.yml") + utils.CheckFileExists(t, "badaas/docker/api/Dockerfile") + utils.CheckFileExists(t, "badaas/docker/db/docker-compose.yml") } func checkDBPort(t *testing.T, port int) { @@ -58,14 +52,7 @@ func checkDBPort(t *testing.T, port int) { } func teardown() { - remove(".dockerignore") - remove("Makefile") - remove("badaas") -} - -func remove(name string) { - err := os.RemoveAll(name) - if err != nil { - log.Fatal(err) - } + utils.RemoveFile(".dockerignore") + utils.RemoveFile("Makefile") + utils.RemoveFile("badaas") } diff --git a/tools/badctl/cmd/utils/file.go b/tools/badctl/cmd/utils/file.go new file mode 100644 index 00000000..add5520e --- /dev/null +++ b/tools/badctl/cmd/utils/file.go @@ -0,0 +1,24 @@ +package utils + +import ( + "io/fs" + "log" + "os" + "testing" +) + +func CheckFileExists(t *testing.T, name string) fs.FileInfo { + stat, err := os.Stat(name) + if err != nil { + t.Error(err) + } + + return stat +} + +func RemoveFile(name string) { + err := os.RemoveAll(name) + if err != nil { + log.Fatal(err) + } +} From 1212b94ef06586d281f88e3fb8e0e7922b6c4e57 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 12 Jun 2023 13:02:57 +0200 Subject: [PATCH 332/467] first version of expressions with any --- badorm/condition.go | 59 +- badorm/expression.go | 153 +++ .../conditions/product_conditions.go | 82 +- testintegration/crudService.go | 1205 +++++++++-------- 4 files changed, 801 insertions(+), 698 deletions(-) create mode 100644 badorm/expression.go diff --git a/badorm/condition.go b/badorm/condition.go index 74c243dc..9edf2f6e 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -4,7 +4,6 @@ import ( "fmt" "reflect" - "github.com/elliotchance/pie/v2" "gorm.io/gorm" ) @@ -27,7 +26,8 @@ type WhereCondition[T any] struct { Field string Column string ColumnPrefix string - Value any + // TODO esto me gustaria que tenga un generics para que no le puedas poner cualquier mierda adentro + Expressions []Expression } //nolint:unused // see inside @@ -67,23 +67,48 @@ func (condition WhereCondition[T]) GetSQL(query *gorm.DB, tableName string) (str // add column prefix once we know the column name columnName = condition.ColumnPrefix + columnName - val := condition.Value - reflectVal := reflect.ValueOf(val) - isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) - // avoid nil is not nil behavior of go - if val == nil || (isNullableKind && reflectVal.IsNil()) { - return fmt.Sprintf( - "%s.%s IS NULL", - tableName, - columnName, - ), []any{} + // TODO ver el nombre + conditionString := "" + values := []any{} + + for index, expression := range condition.Expressions { + // TODO que se pueda hacer la connexion distinta aca + if index != 0 { + conditionString += " AND " + } + + expressionSQL, expressionValues := expression.ToSQL( + fmt.Sprintf( + "%s.%s", + tableName, + columnName, + ), + ) + conditionString += expressionSQL + + values = append(values, expressionValues) } - return fmt.Sprintf( - "%s.%s = ?", - tableName, - columnName, - ), []any{val} + return conditionString, values + + // val := condition.Value + // TODO ver donde hago esta verificacion + // reflectVal := reflect.ValueOf(val) + // isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) + // // avoid nil is not nil behavior of go + // if val == nil || (isNullableKind && reflectVal.IsNil()) { + // return fmt.Sprintf( + // "%s.%s IS NULL", + // tableName, + // columnName, + // ), []any{} + // } + + // return fmt.Sprintf( + // "%s.%s = ?", + // tableName, + // columnName, + // ), []any{val} } type JoinCondition[T1 any, T2 any] struct { diff --git a/badorm/expression.go b/badorm/expression.go new file mode 100644 index 00000000..7608e016 --- /dev/null +++ b/badorm/expression.go @@ -0,0 +1,153 @@ +package badorm + +import "fmt" + +// TODO +// string, int, etc. uuid, cualquier custom, time, deletedAt, asi que es any al final +// aunque algunos como like y eso solo funcionan para string, el problema es que yo no se si +// uno custom va a ir a string o no +// podria igual mirar que condiciones les genero y cuales no segun el tipo +type Expression struct { + Value any + symbol string +} + +func (expr Expression) ToSQL(columnName string) (string, []any) { + return fmt.Sprintf("%s %s ?", columnName, expr.symbol), []any{expr.Value} +} + +// Comparison Operators + +func Eq(value any) Expression { + return Expression{ + Value: value, + symbol: "=", + } +} + +func NotEq(value any) Expression { + return Expression{ + Value: value, + symbol: "<>", + } +} + +func Lt(value any) Expression { + return Expression{ + Value: value, + symbol: "<", + } +} + +func LtOrEq(value any) Expression { + return Expression{ + Value: value, + symbol: "<=", + } +} + +func Gt(value any) Expression { + return Expression{ + Value: value, + symbol: ">", + } +} + +func GtOrEq(value any) Expression { + return Expression{ + Value: value, + symbol: ">=", + } +} + +// Comparison Predicates + +// // TODO BETWEEN, NOT BETWEEN +// func IsDistinct(value any) Expression { +// return Expression{ +// Value: value, +// symbol: "IS DISTINCT FROM", +// } +// } + +// func IsNotDistinct(value any) Expression { +// return Expression{ +// Value: value, +// symbol: "IS NOT DISTINCT FROM", +// } +// } + +// // TODO no deberia ser posible para todos +// func IsNull(value any) Expression { +// return Expression{ +// Value: value, // TODO ver aca que hago +// symbol: "IS NULL", +// } +// } + +// func IsNotNull(value any) Expression { +// return Expression{ +// Value: value, // TODO ver aca que hago +// symbol: "IS NOT NULL", +// } +// } + +// // TODO no deberia ser posible para todos +// func IsTrue(value any) Expression { +// return Expression{ +// Value: value, // TODO ver aca que hago +// symbol: "IS TRUE", +// } +// } + +// func IsNotTrue(value any) Expression { +// return Expression{ +// Value: value, // TODO ver aca que hago +// symbol: "IS NOT TRUE", +// } +// } + +// // TODO no deberia ser posible para todos +// func IsFalse(value any) Expression { +// return Expression{ +// Value: value, // TODO ver aca que hago +// symbol: "IS FALSE", +// } +// } + +// func IsNotFalse(value any) Expression { +// return Expression{ +// Value: value, // TODO ver aca que hago +// symbol: "IS NOT FALSE", +// } +// } + +// func IsUnknown(value any) Expression { +// return Expression{ +// Value: value, // TODO ver aca que hago +// symbol: "IS UNKNOWN", +// } +// } + +// func IsNotUnknown(value any) Expression { +// return Expression{ +// Value: value, // TODO ver aca que hago +// symbol: "IS NOT UNKNOWN", +// } +// } + +// // TODO no se a que grupo pertenece + +// func In[T []any](values T) Expression { +// return Expression{ +// Value: values, +// symbol: "IN", +// } +// } + +// func NotIn[T []any](values T) Expression { +// return Expression{ +// Value: values, +// symbol: "NOT IN", +// } +// } diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index cff131d2..44099a03 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -1,89 +1,13 @@ -// Code generated by badctl v0.0.0, DO NOT EDIT. package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - gorm "gorm.io/gorm" - "time" ) -func ProductId(v badorm.UUID) badorm.WhereCondition[models.Product] { +func ProductId(expressions ...badorm.Expression) badorm.WhereCondition[models.Product] { return badorm.WhereCondition[models.Product]{ - Field: "ID", - Value: v, - } -} -func ProductCreatedAt(v time.Time) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "CreatedAt", - Value: v, - } -} -func ProductUpdatedAt(v time.Time) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "UpdatedAt", - Value: v, - } -} -func ProductDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "DeletedAt", - Value: v, - } -} -func ProductString(v string) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Column: "string_something_else", - Value: v, - } -} -func ProductInt(v int) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "Int", - Value: v, - } -} -func ProductIntPointer(v *int) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "IntPointer", - Value: v, - } -} -func ProductFloat(v float64) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "Float", - Value: v, - } -} -func ProductBool(v bool) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "Bool", - Value: v, - } -} -func ProductByteArray(v []uint8) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "ByteArray", - Value: v, - } -} -func ProductMultiString(v models.MultiString) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "MultiString", - Value: v, - } -} -func ProductEmbeddedInt(v int) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - Field: "EmbeddedInt", - Value: v, - } -} -func ProductGormEmbeddedInt(v int) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ - ColumnPrefix: "gorm_embedded_", - Field: "Int", - Value: v, + Field: "ID", + Expressions: expressions, } } diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 3430063a..24b7ff9d 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -2,7 +2,6 @@ package testintegration import ( "gorm.io/gorm" - "gotest.tools/assert" "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/conditions" @@ -52,722 +51,724 @@ func NewCRUDServiceIntTestSuite( // ------------------------- GetEntity -------------------------------- -func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { - _, err := ts.crudProductService.GetEntity(badorm.NilUUID) - ts.Error(err, gorm.ErrRecordNotFound) -} +// func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { +// _, err := ts.crudProductService.GetEntity(badorm.NilUUID) +// ts.Error(err, gorm.ErrRecordNotFound) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { - ts.createProduct("", 0, 0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { +// ts.createProduct("", 0, 0, false, nil) - _, err := ts.crudProductService.GetEntity(badorm.NewUUID()) - ts.Error(err, gorm.ErrRecordNotFound) -} +// _, err := ts.crudProductService.GetEntity(badorm.NewUUID()) +// ts.Error(err, gorm.ErrRecordNotFound) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsTheEntityIfItIsCreate() { - match := ts.createProduct("", 0, 0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsTheEntityIfItIsCreate() { +// match := ts.createProduct("", 0, 0, false, nil) - entity, err := ts.crudProductService.GetEntity(match.ID) - ts.Nil(err) +// entity, err := ts.crudProductService.GetEntity(match.ID) +// ts.Nil(err) - assert.DeepEqual(ts.T(), match, entity) -} +// assert.DeepEqual(ts.T(), match, entity) +// } -// ------------------------- GetEntities -------------------------------- +// // ------------------------- GetEntities -------------------------------- -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.crudProductService.GetEntities() - ts.Nil(err) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { +// entities, err := ts.crudProductService.GetEntities() +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{}, entities) -} +// EqualList(&ts.Suite, []*models.Product{}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { - match := ts.createProduct("", 0, 0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { +// match := ts.createProduct("", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities() - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities() +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { - match1 := ts.createProduct("", 0, 0, false, nil) - match2 := ts.createProduct("", 0, 0, false, nil) - match3 := ts.createProduct("", 0, 0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { +// match1 := ts.createProduct("", 0, 0, false, nil) +// match2 := ts.createProduct("", 0, 0, false, nil) +// match3 := ts.createProduct("", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities() - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities() +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString("not_created"), - ) - ts.Nil(err) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductString("not_created"), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{}, entities) -} +// EqualList(&ts.Suite, []*models.Product{}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { - ts.createProduct("something_else", 0, 0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { +// ts.createProduct("something_else", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString("not_match"), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductString("not_match"), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{}, entities) -} +// EqualList(&ts.Suite, []*models.Product{}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { - match := ts.createProduct("match", 0, 0, false, nil) - ts.createProduct("not_match", 0, 0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { +// match := ts.createProduct("match", 0, 0, false, nil) +// ts.createProduct("not_match", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString("match"), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductString("match"), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { - match1 := ts.createProduct("match", 0, 0, false, nil) - match2 := ts.createProduct("match", 0, 0, false, nil) - ts.createProduct("not_match", 0, 0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { +// match1 := ts.createProduct("match", 0, 0, false, nil) +// match2 := ts.createProduct("match", 0, 0, false, nil) +// ts.createProduct("not_match", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString("match"), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductString("match"), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { - match := ts.createProduct("match", 1, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { +// match := ts.createProduct("match", 1, 0, false, nil) +// ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt(1), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductInt(1), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { - match := ts.createProduct("match", 0, 1.1, false, nil) - ts.createProduct("not_match", 0, 2.2, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { +// match := ts.createProduct("match", 0, 1.1, false, nil) +// ts.createProduct("not_match", 0, 2.2, false, nil) - entities, err := ts.crudProductService.GetEntities( - conditions.ProductFloat(1.1), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductFloat(1.1), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { - match := ts.createProduct("match", 0, 0.0, true, nil) - ts.createProduct("not_match", 0, 0.0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { +// match := ts.createProduct("match", 0, 0.0, true, nil) +// ts.createProduct("not_match", 0, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( - conditions.ProductBool(true), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductBool(true), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { - match1 := ts.createProduct("match", 1, 0.0, true, nil) - match2 := ts.createProduct("match", 1, 0.0, true, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { +// match1 := ts.createProduct("match", 1, 0.0, true, nil) +// match2 := ts.createProduct("match", 1, 0.0, true, nil) - ts.createProduct("not_match", 1, 0.0, true, nil) - ts.createProduct("match", 2, 0.0, true, nil) +// ts.createProduct("not_match", 1, 0.0, true, nil) +// ts.createProduct("match", 2, 0.0, true, nil) - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString("match"), - conditions.ProductInt(1), - conditions.ProductBool(true), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductString("match"), +// conditions.ProductInt(1), +// conditions.ProductBool(true), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +// } func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfID() { match := ts.createProduct("", 0, 0.0, false, nil) ts.createProduct("", 0, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( - conditions.ProductId(match.ID), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { - match := ts.createProduct("", 0, 0.0, false, nil) - ts.createProduct("", 0, 0.0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductCreatedAt(match.CreatedAt), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesDeletedAtConditionIsAddedAutomatically() { - match := ts.createProduct("", 0, 0.0, false, nil) - deleted := ts.createProduct("", 0, 0.0, false, nil) - - ts.Nil(ts.db.Delete(deleted).Error) - - entities, err := ts.crudProductService.GetEntities() - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -// TODO DeletedAt with nil value but not automatic - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfDeletedAtNotNil() { - match := ts.createProduct("", 0, 0.0, false, nil) - ts.createProduct("", 0, 0.0, false, nil) - - ts.Nil(ts.db.Delete(match).Error) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductDeletedAt(match.DeletedAt), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { - match := ts.createProduct("", 0, 0.0, false, nil) - ts.createProduct("", 0, 0.0, false, nil) - - match.EmbeddedInt = 1 - - err := ts.db.Save(match).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductEmbeddedInt(1), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfGormEmbedded() { - match := ts.createProduct("", 0, 0.0, false, nil) - ts.createProduct("", 0, 0.0, false, nil) - - match.GormEmbedded.Int = 1 - - err := ts.db.Save(match).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductGormEmbeddedInt(1), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWithValue() { - intMatch := 1 - match := ts.createProduct("match", 1, 0, false, &intMatch) - intNotMatch := 2 - ts.createProduct("not_match", 2, 0, false, &intNotMatch) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductIntPointer(&intMatch), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeByNil() { - match := ts.createProduct("match", 1, 0, false, nil) - intNotMatch := 2 - ts.createProduct("not_match", 2, 0, false, &intNotMatch) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductIntPointer(nil), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayWithContent() { - match := ts.createProduct("match", 1, 0, false, nil) - notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - match.ByteArray = []byte{1, 2} - notMatch1.ByteArray = []byte{2, 3} - - err := ts.db.Save(match).Error - ts.Nil(err) - - err = ts.db.Save(notMatch1).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductByteArray([]byte{1, 2}), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayEmpty() { - match := ts.createProduct("match", 1, 0, false, nil) - notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - match.ByteArray = []byte{} - notMatch1.ByteArray = []byte{2, 3} - - err := ts.db.Save(match).Error - ts.Nil(err) - - err = ts.db.Save(notMatch1).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductByteArray([]byte{}), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() { - match := ts.createProduct("match", 1, 0, false, nil) - notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) - notMatch1.ByteArray = []byte{2, 3} - - err := ts.db.Save(notMatch1).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductByteArray(nil), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { - match := ts.createProduct("match", 1, 0, false, nil) - notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - match.MultiString = models.MultiString{"salut", "hola"} - notMatch1.MultiString = models.MultiString{"salut", "hola", "hello"} - - err := ts.db.Save(match).Error - ts.Nil(err) - - err = ts.db.Save(notMatch1).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductMultiString(models.MultiString{"salut", "hola"}), + conditions.ProductId( + badorm.Eq(match.ID), + ), ) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { - product1 := ts.createProduct("", 0, 0.0, false, nil) - product2 := ts.createProduct("", 0, 0.0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { +// match := ts.createProduct("", 0, 0.0, false, nil) +// ts.createProduct("", 0, 0.0, false, nil) - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProductId(product1.ID), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalWithValue() { - product1 := ts.createProduct("", 0, 0.0, false, nil) - product2 := ts.createProduct("", 0, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSellerId(&seller1.ID), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalByNil() { - product1 := ts.createProduct("", 0, 0.0, false, nil) - product2 := ts.createProduct("", 0, 0.0, false, nil) - - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, nil) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSellerId(nil), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsOnUIntModel() { - match := ts.createBrand("match") - ts.createBrand("not_match") - - entities, err := ts.crudBrandService.GetEntities( - conditions.BrandName("match"), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Brand{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsUintBelongsTo() { - brand1 := ts.createBrand("google") - brand2 := ts.createBrand("apple") - - match := ts.createPhone("pixel", *brand1) - ts.createPhone("iphone", *brand2) - - entities, err := ts.crudPhoneService.GetEntities( - conditions.PhoneBrand( - conditions.BrandName("google"), - ), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductCreatedAt(match.CreatedAt), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Phone{match}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesDeletedAtConditionIsAddedAutomatically() { +// match := ts.createProduct("", 0, 0.0, false, nil) +// deleted := ts.createProduct("", 0, 0.0, false, nil) - match := ts.createSale(0, product1, nil) - ts.createSale(0, product2, nil) +// ts.Nil(ts.db.Delete(deleted).Error) - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductInt(1), - ), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities() +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) +// // TODO DeletedAt with nil value but not automatic - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfDeletedAtNotNil() { +// match := ts.createProduct("", 0, 0.0, false, nil) +// ts.createProduct("", 0, 0.0, false, nil) - match := ts.createSale(1, product1, seller1) - ts.createSale(2, product2, seller2) - ts.createSale(2, product1, seller2) +// ts.Nil(ts.db.Delete(match).Error) - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleCode(1), - conditions.SaleProduct( - conditions.ProductInt(1), - ), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductDeletedAt(match.DeletedAt), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { +// match := ts.createProduct("", 0, 0.0, false, nil) +// ts.createProduct("", 0, 0.0, false, nil) - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) +// match.EmbeddedInt = 1 - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) +// err := ts.db.Save(match).Error +// ts.Nil(err) - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSeller( - conditions.SellerName("franco"), - ), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductEmbeddedInt(1), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { - boss1 := &models.Employee{ - Name: "Xavier", - } - boss2 := &models.Employee{ - Name: "Vincent", - } +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfGormEmbedded() { +// match := ts.createProduct("", 0, 0.0, false, nil) +// ts.createProduct("", 0, 0.0, false, nil) - match := ts.createEmployee("franco", boss1) - ts.createEmployee("pierre", boss2) +// match.GormEmbedded.Int = 1 - entities, err := ts.crudEmployeeService.GetEntities( - conditions.EmployeeBoss( - conditions.EmployeeName("Xavier"), - ), - ) - ts.Nil(err) +// err := ts.db.Save(match).Error +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Employee{match}, entities) -} +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductGormEmbeddedInt(1), +// ) +// ts.Nil(err) -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { - capital1 := models.City{ - Name: "Buenos Aires", - } - capital2 := models.City{ - Name: "Paris", - } +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } - ts.createCountry("Argentina", capital1) - ts.createCountry("France", capital2) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWithValue() { +// intMatch := 1 +// match := ts.createProduct("match", 1, 0, false, &intMatch) +// intNotMatch := 2 +// ts.createProduct("not_match", 2, 0, false, &intNotMatch) +// ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudCityService.GetEntities( - conditions.CityCountry( - conditions.CountryName("Argentina"), - ), - ) - ts.Nil(err) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductIntPointer(&intMatch), +// ) +// ts.Nil(err) - EqualList(&ts.Suite, []*models.City{&capital1}, entities) -} +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { - capital1 := models.City{ - Name: "Buenos Aires", - } - capital2 := models.City{ - Name: "Paris", - } +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeByNil() { +// match := ts.createProduct("match", 1, 0, false, nil) +// intNotMatch := 2 +// ts.createProduct("not_match", 2, 0, false, &intNotMatch) - country1 := ts.createCountry("Argentina", capital1) - ts.createCountry("France", capital2) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductIntPointer(nil), +// ) +// ts.Nil(err) - entities, err := ts.crudCountryService.GetEntities( - conditions.CountryCapital( - conditions.CityName("Buenos Aires"), - ), - ) - ts.Nil(err) +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } - EqualList(&ts.Suite, []*models.Country{country1}, entities) -} +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayWithContent() { +// match := ts.createProduct("match", 1, 0, false, nil) +// notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) +// ts.createProduct("not_match", 2, 0, false, nil) -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { - person1 := models.Person{ - Name: "franco", - } - person2 := models.Person{ - Name: "xavier", - } +// match.ByteArray = []byte{1, 2} +// notMatch1.ByteArray = []byte{2, 3} - match := ts.createBicycle("BMX", person1) - ts.createBicycle("Shimano", person2) +// err := ts.db.Save(match).Error +// ts.Nil(err) - entities, err := ts.crudBicycleService.GetEntities( - conditions.BicycleOwner( - conditions.PersonName("franco"), - ), - ) - ts.Nil(err) +// err = ts.db.Save(notMatch1).Error +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Bicycle{match}, entities) -} +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductByteArray([]byte{1, 2}), +// ) +// ts.Nil(err) -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { - company1 := ts.createCompany("ditrit") - company2 := ts.createCompany("orness") +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } - match := ts.createSeller("franco", company1) - ts.createSeller("agustin", company2) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayEmpty() { +// match := ts.createProduct("match", 1, 0, false, nil) +// notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) +// ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudSellerService.GetEntities( - conditions.SellerCompany( - conditions.CompanyName("ditrit"), - ), - ) - ts.Nil(err) +// match.ByteArray = []byte{} +// notMatch1.ByteArray = []byte{2, 3} - EqualList(&ts.Suite, []*models.Seller{match}, entities) -} +// err := ts.db.Save(match).Error +// ts.Nil(err) -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { - product1 := ts.createProduct("match", 1, 0.0, false, nil) - product2 := ts.createProduct("match", 2, 0.0, false, nil) +// err = ts.db.Save(notMatch1).Error +// ts.Nil(err) - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductByteArray([]byte{}), +// ) +// ts.Nil(err) - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductInt(1), - conditions.ProductString("match"), - ), - ) - ts.Nil(err) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() { +// match := ts.createProduct("match", 1, 0, false, nil) +// notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) +// notMatch1.ByteArray = []byte{2, 3} - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} +// err := ts.db.Save(notMatch1).Error +// ts.Nil(err) -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAddsDeletedAtAutomatically() { - product1 := ts.createProduct("match", 1, 0.0, false, nil) - product2 := ts.createProduct("match", 2, 0.0, false, nil) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductByteArray(nil), +// ) +// ts.Nil(err) - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } - ts.Nil(ts.db.Delete(product2).Error) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { +// match := ts.createProduct("match", 1, 0, false, nil) +// notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) +// ts.createProduct("not_match", 2, 0, false, nil) - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) +// match.MultiString = models.MultiString{"salut", "hola"} +// notMatch1.MultiString = models.MultiString{"salut", "hola", "hello"} - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductString("match"), - ), - ) - ts.Nil(err) +// err := ts.db.Save(match).Error +// ts.Nil(err) - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} +// err = ts.db.Save(notMatch1).Error +// ts.Nil(err) -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDeletedAt() { - product1 := ts.createProduct("match", 1, 0.0, false, nil) - product2 := ts.createProduct("match", 2, 0.0, false, nil) +// entities, err := ts.crudProductService.GetEntities( +// conditions.ProductMultiString(models.MultiString{"salut", "hola"}), +// ) +// ts.Nil(err) - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) +// EqualList(&ts.Suite, []*models.Product{match}, entities) +// } - ts.Nil(ts.db.Delete(product1).Error) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { +// product1 := ts.createProduct("", 0, 0.0, false, nil) +// product2 := ts.createProduct("", 0, 0.0, false, nil) - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductDeletedAt(product1.DeletedAt), - ), - ) - ts.Nil(err) +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleProductId(product1.ID), +// ) +// ts.Nil(err) -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersByNil() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - intProduct2 := 2 - product2 := ts.createProduct("", 2, 0.0, false, &intProduct2) +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } - match := ts.createSale(0, product1, nil) - ts.createSale(0, product2, nil) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalWithValue() { +// product1 := ts.createProduct("", 0, 0.0, false, nil) +// product2 := ts.createProduct("", 0, 0.0, false, nil) - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductIntPointer(nil), - ), - ) - ts.Nil(err) +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleSellerId(&seller1.ID), +// ) +// ts.Nil(err) - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - ts.createSale(0, product1, seller2) - ts.createSale(0, product2, seller1) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalByNil() { +// product1 := ts.createProduct("", 0, 0.0, false, nil) +// product2 := ts.createProduct("", 0, 0.0, false, nil) - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductInt(1), - ), - conditions.SaleSeller( - conditions.SellerName("franco"), - ), - ) - ts.Nil(err) +// seller2 := ts.createSeller("agustin", nil) - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} +// match := ts.createSale(0, product1, nil) +// ts.createSale(0, product2, seller2) -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { - product1 := ts.createProduct("", 0, 0.0, false, nil) - product2 := ts.createProduct("", 0, 0.0, false, nil) +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleSellerId(nil), +// ) +// ts.Nil(err) - company1 := ts.createCompany("ditrit") - company2 := ts.createCompany("orness") +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } - seller1 := ts.createSeller("franco", company1) - seller2 := ts.createSeller("agustin", company2) +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsOnUIntModel() { +// match := ts.createBrand("match") +// ts.createBrand("not_match") - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) +// entities, err := ts.crudBrandService.GetEntities( +// conditions.BrandName("match"), +// ) +// ts.Nil(err) - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSeller( - conditions.SellerName("franco"), - conditions.SellerCompany( - conditions.CompanyName("ditrit"), - ), - ), - ) - ts.Nil(err) +// EqualList(&ts.Suite, []*models.Brand{match}, entities) +// } - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsUintBelongsTo() { +// brand1 := ts.createBrand("google") +// brand2 := ts.createBrand("apple") + +// match := ts.createPhone("pixel", *brand1) +// ts.createPhone("iphone", *brand2) + +// entities, err := ts.crudPhoneService.GetEntities( +// conditions.PhoneBrand( +// conditions.BrandName("google"), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Phone{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { +// product1 := ts.createProduct("", 1, 0.0, false, nil) +// product2 := ts.createProduct("", 2, 0.0, false, nil) + +// match := ts.createSale(0, product1, nil) +// ts.createSale(0, product2, nil) + +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleProduct( +// conditions.ProductInt(1), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { +// product1 := ts.createProduct("", 1, 0.0, false, nil) +// product2 := ts.createProduct("", 2, 0.0, false, nil) + +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) + +// match := ts.createSale(1, product1, seller1) +// ts.createSale(2, product2, seller2) +// ts.createSale(2, product1, seller2) + +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleCode(1), +// conditions.SaleProduct( +// conditions.ProductInt(1), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { +// product1 := ts.createProduct("", 1, 0.0, false, nil) +// product2 := ts.createProduct("", 2, 0.0, false, nil) + +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) + +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) + +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleSeller( +// conditions.SellerName("franco"), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { +// boss1 := &models.Employee{ +// Name: "Xavier", +// } +// boss2 := &models.Employee{ +// Name: "Vincent", +// } + +// match := ts.createEmployee("franco", boss1) +// ts.createEmployee("pierre", boss2) + +// entities, err := ts.crudEmployeeService.GetEntities( +// conditions.EmployeeBoss( +// conditions.EmployeeName("Xavier"), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Employee{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { +// capital1 := models.City{ +// Name: "Buenos Aires", +// } +// capital2 := models.City{ +// Name: "Paris", +// } + +// ts.createCountry("Argentina", capital1) +// ts.createCountry("France", capital2) + +// entities, err := ts.crudCityService.GetEntities( +// conditions.CityCountry( +// conditions.CountryName("Argentina"), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.City{&capital1}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { +// capital1 := models.City{ +// Name: "Buenos Aires", +// } +// capital2 := models.City{ +// Name: "Paris", +// } + +// country1 := ts.createCountry("Argentina", capital1) +// ts.createCountry("France", capital2) + +// entities, err := ts.crudCountryService.GetEntities( +// conditions.CountryCapital( +// conditions.CityName("Buenos Aires"), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Country{country1}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { +// person1 := models.Person{ +// Name: "franco", +// } +// person2 := models.Person{ +// Name: "xavier", +// } + +// match := ts.createBicycle("BMX", person1) +// ts.createBicycle("Shimano", person2) + +// entities, err := ts.crudBicycleService.GetEntities( +// conditions.BicycleOwner( +// conditions.PersonName("franco"), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Bicycle{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { +// company1 := ts.createCompany("ditrit") +// company2 := ts.createCompany("orness") + +// match := ts.createSeller("franco", company1) +// ts.createSeller("agustin", company2) + +// entities, err := ts.crudSellerService.GetEntities( +// conditions.SellerCompany( +// conditions.CompanyName("ditrit"), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Seller{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { +// product1 := ts.createProduct("match", 1, 0.0, false, nil) +// product2 := ts.createProduct("match", 2, 0.0, false, nil) + +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) + +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) + +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleProduct( +// conditions.ProductInt(1), +// conditions.ProductString("match"), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAddsDeletedAtAutomatically() { +// product1 := ts.createProduct("match", 1, 0.0, false, nil) +// product2 := ts.createProduct("match", 2, 0.0, false, nil) + +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) + +// ts.Nil(ts.db.Delete(product2).Error) + +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) + +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleProduct( +// conditions.ProductString("match"), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDeletedAt() { +// product1 := ts.createProduct("match", 1, 0.0, false, nil) +// product2 := ts.createProduct("match", 2, 0.0, false, nil) + +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) + +// ts.Nil(ts.db.Delete(product1).Error) + +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) + +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleProduct( +// conditions.ProductDeletedAt(product1.DeletedAt), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersByNil() { +// product1 := ts.createProduct("", 1, 0.0, false, nil) +// intProduct2 := 2 +// product2 := ts.createProduct("", 2, 0.0, false, &intProduct2) + +// match := ts.createSale(0, product1, nil) +// ts.createSale(0, product2, nil) + +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleProduct( +// conditions.ProductIntPointer(nil), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { +// product1 := ts.createProduct("", 1, 0.0, false, nil) +// product2 := ts.createProduct("", 2, 0.0, false, nil) + +// seller1 := ts.createSeller("franco", nil) +// seller2 := ts.createSeller("agustin", nil) + +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) +// ts.createSale(0, product1, seller2) +// ts.createSale(0, product2, seller1) + +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleProduct( +// conditions.ProductInt(1), +// ), +// conditions.SaleSeller( +// conditions.SellerName("franco"), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } + +// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { +// product1 := ts.createProduct("", 0, 0.0, false, nil) +// product2 := ts.createProduct("", 0, 0.0, false, nil) + +// company1 := ts.createCompany("ditrit") +// company2 := ts.createCompany("orness") + +// seller1 := ts.createSeller("franco", company1) +// seller2 := ts.createSeller("agustin", company2) + +// match := ts.createSale(0, product1, seller1) +// ts.createSale(0, product2, seller2) + +// entities, err := ts.crudSaleService.GetEntities( +// conditions.SaleSeller( +// conditions.SellerName("franco"), +// conditions.SellerCompany( +// conditions.CompanyName("ditrit"), +// ), +// ), +// ) +// ts.Nil(err) + +// EqualList(&ts.Suite, []*models.Sale{match}, entities) +// } From 527fd560d7143c98109bb710b444219f1af47645 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 12 Jun 2023 15:05:21 +0200 Subject: [PATCH 333/467] add generics on expresions --- badorm/condition.go | 53 +++++++++++++++++++++++------ badorm/expression.go | 80 ++++++++++++++++++++++---------------------- 2 files changed, 82 insertions(+), 51 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 9edf2f6e..6bce90f4 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -9,12 +9,21 @@ import ( const DeletedAtField = "DeletedAt" +type ConditionType string + +const ( + WhereType ConditionType = "Where" + JoinType ConditionType = "Join" +) + type Condition[T any] interface { // Applies the condition to the "query" // using the "tableName" as name for the table holding // the data for object of type T ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) + Type() ConditionType + // This method is necessary to get the compiler to verify // that an object is of type Condition[T], // since if no method receives by parameter a type T, @@ -22,23 +31,28 @@ type Condition[T any] interface { interfaceVerificationMethod(T) } -type WhereCondition[T any] struct { +type WhereCondition[T any] interface { + GetSQL(query *gorm.DB, tableName string) (string, []any) + + getField() string +} + +type FieldCondition[TObject any, TAtribute any] struct { Field string Column string ColumnPrefix string - // TODO esto me gustaria que tenga un generics para que no le puedas poner cualquier mierda adentro - Expressions []Expression + Expressions []Expression[TAtribute] } //nolint:unused // see inside -func (condition WhereCondition[T]) interfaceVerificationMethod(_ T) { +func (condition FieldCondition[TObject, TAtribute]) interfaceVerificationMethod(_ TObject) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] } // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value -func (condition WhereCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { +func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { sql, values := condition.GetSQL(query, tableName) if condition.Field == DeletedAtField { @@ -51,6 +65,14 @@ func (condition WhereCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*g ), nil } +func (condition FieldCondition[TObject, TAtribute]) Type() ConditionType { + return WhereType +} + +func (condition FieldCondition[TObject, TAtribute]) getField() string { + return condition.Field +} + var nullableKinds = []reflect.Kind{ reflect.Chan, reflect.Func, reflect.Map, reflect.Pointer, @@ -58,7 +80,7 @@ var nullableKinds = []reflect.Kind{ reflect.Slice, } -func (condition WhereCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any) { +func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, tableName string) (string, []any) { columnName := condition.Column if columnName == "" { columnName = query.NamingStrategy.ColumnName(tableName, condition.Field) @@ -147,7 +169,7 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName isDeletedAtConditionPresent := false for _, condition := range whereConditions { - if condition.Field == DeletedAtField { + if condition.getField() == DeletedAtField { isDeletedAtConditionPresent = true } @@ -177,6 +199,10 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName return query, nil } +func (condition JoinCondition[T1, T2]) Type() ConditionType { + return JoinType +} + // Returns the SQL string to do a join between T1 and T2 // taking into account that the ID attribute necessary to do it // can be either in T1's or T2's table. @@ -197,11 +223,16 @@ func divideConditionsByType[T any]( conditions []Condition[T], ) (thisEntityConditions []WhereCondition[T], joinConditions []Condition[T]) { for _, condition := range conditions { - switch typedCondition := condition.(type) { - case WhereCondition[T]: + switch condition.Type() { + case WhereType: + typedCondition, ok := condition.(WhereCondition[T]) + if !ok { + // TODO no se que hacer aca + } + thisEntityConditions = append(thisEntityConditions, typedCondition) - default: - joinConditions = append(joinConditions, typedCondition) + case JoinType: + joinConditions = append(joinConditions, condition) } } diff --git a/badorm/expression.go b/badorm/expression.go index 7608e016..af1682d0 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -7,54 +7,54 @@ import "fmt" // aunque algunos como like y eso solo funcionan para string, el problema es que yo no se si // uno custom va a ir a string o no // podria igual mirar que condiciones les genero y cuales no segun el tipo -type Expression struct { - Value any +type Expression[T any] struct { + Value T symbol string } -func (expr Expression) ToSQL(columnName string) (string, []any) { - return fmt.Sprintf("%s %s ?", columnName, expr.symbol), []any{expr.Value} +func (expr Expression[T]) ToSQL(columnName string) (string, []T) { + return fmt.Sprintf("%s %s ?", columnName, expr.symbol), []T{expr.Value} } // Comparison Operators -func Eq(value any) Expression { - return Expression{ +func Eq[T any](value T) Expression[T] { + return Expression[T]{ Value: value, symbol: "=", } } -func NotEq(value any) Expression { - return Expression{ +func NotEq[T any](value T) Expression[T] { + return Expression[T]{ Value: value, symbol: "<>", } } -func Lt(value any) Expression { - return Expression{ +func Lt[T any](value T) Expression[T] { + return Expression[T]{ Value: value, symbol: "<", } } -func LtOrEq(value any) Expression { - return Expression{ +func LtOrEq[T any](value T) Expression[T] { + return Expression[T]{ Value: value, symbol: "<=", } } -func Gt(value any) Expression { - return Expression{ +func Gt[T any](value T) Expression[T] { + return Expression[T]{ Value: value, symbol: ">", } } -func GtOrEq(value any) Expression { - return Expression{ +func GtOrEq[T any](value T) Expression[T] { + return Expression[T]{ Value: value, symbol: ">=", } @@ -63,74 +63,74 @@ func GtOrEq(value any) Expression { // Comparison Predicates // // TODO BETWEEN, NOT BETWEEN -// func IsDistinct(value any) Expression { -// return Expression{ +// func IsDistinct[T any](value T) Expression[T] { +// return Expression[T]{ // Value: value, // symbol: "IS DISTINCT FROM", // } // } -// func IsNotDistinct(value any) Expression { -// return Expression{ +// func IsNotDistinct[T any](value T) Expression[T] { +// return Expression[T]{ // Value: value, // symbol: "IS NOT DISTINCT FROM", // } // } // // TODO no deberia ser posible para todos -// func IsNull(value any) Expression { -// return Expression{ +// func IsNull[T any](value T) Expression[T] { +// return Expression[T]{ // Value: value, // TODO ver aca que hago // symbol: "IS NULL", // } // } -// func IsNotNull(value any) Expression { -// return Expression{ +// func IsNotNull[T any](value T) Expression[T] { +// return Expression[T]{ // Value: value, // TODO ver aca que hago // symbol: "IS NOT NULL", // } // } // // TODO no deberia ser posible para todos -// func IsTrue(value any) Expression { -// return Expression{ +// func IsTrue[T any](value T) Expression[T] { +// return Expression[T]{ // Value: value, // TODO ver aca que hago // symbol: "IS TRUE", // } // } -// func IsNotTrue(value any) Expression { -// return Expression{ +// func IsNotTrue[T any](value T) Expression[T] { +// return Expression[T]{ // Value: value, // TODO ver aca que hago // symbol: "IS NOT TRUE", // } // } // // TODO no deberia ser posible para todos -// func IsFalse(value any) Expression { -// return Expression{ +// func IsFalse[T any](value T) Expression[T] { +// return Expression[T]{ // Value: value, // TODO ver aca que hago // symbol: "IS FALSE", // } // } -// func IsNotFalse(value any) Expression { -// return Expression{ +// func IsNotFalse[T any](value T) Expression[T] { +// return Expression[T]{ // Value: value, // TODO ver aca que hago // symbol: "IS NOT FALSE", // } // } -// func IsUnknown(value any) Expression { -// return Expression{ +// func IsUnknown[T any](value T) Expression[T] { +// return Expression[T]{ // Value: value, // TODO ver aca que hago // symbol: "IS UNKNOWN", // } // } -// func IsNotUnknown(value any) Expression { -// return Expression{ +// func IsNotUnknown[T any](value T) Expression[T] { +// return Expression[T]{ // Value: value, // TODO ver aca que hago // symbol: "IS NOT UNKNOWN", // } @@ -138,15 +138,15 @@ func GtOrEq(value any) Expression { // // TODO no se a que grupo pertenece -// func In[T []any](values T) Expression { -// return Expression{ +// func In[T []any](values T) Expression[T] { +// return Expression[T]{ // Value: values, // symbol: "IN", // } // } -// func NotIn[T []any](values T) Expression { -// return Expression{ +// func NotIn[T []any](values T) Expression[T] { +// return Expression[T]{ // Value: values, // symbol: "NOT IN", // } From dedde05f3212373769d4af769978e095427a44f5 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 14 Jun 2023 09:47:40 +0200 Subject: [PATCH 334/467] update conditions generation to work with expressions --- badorm/condition.go | 30 +- badorm/expression.go | 32 +- .../conditions/bicycle_conditions.go | 48 +- .../conditions/brand_conditions.go | 40 +- testintegration/conditions/city_conditions.go | 48 +- .../conditions/company_conditions.go | 40 +- .../conditions/country_conditions.go | 40 +- .../conditions/employee_conditions.go | 48 +- .../conditions/person_conditions.go | 40 +- .../conditions/phone_conditions.go | 48 +- .../conditions/product_conditions.go | 82 +- testintegration/conditions/sale_conditions.go | 64 +- .../conditions/seller_conditions.go | 48 +- testintegration/crudService.go | 1311 +++++++++-------- tools/badctl/cmd/gen/conditions/condition.go | 25 +- tools/badctl/cmd/gen/conditions/jenParam.go | 54 +- 16 files changed, 1097 insertions(+), 901 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 6bce90f4..3aab4578 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -2,7 +2,6 @@ package badorm import ( "fmt" - "reflect" "gorm.io/gorm" ) @@ -73,13 +72,6 @@ func (condition FieldCondition[TObject, TAtribute]) getField() string { return condition.Field } -var nullableKinds = []reflect.Kind{ - reflect.Chan, reflect.Func, - reflect.Map, reflect.Pointer, - reflect.UnsafePointer, reflect.Interface, - reflect.Slice, -} - func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, tableName string) (string, []any) { columnName := condition.Column if columnName == "" { @@ -89,7 +81,6 @@ func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table // add column prefix once we know the column name columnName = condition.ColumnPrefix + columnName - // TODO ver el nombre conditionString := "" values := []any{} @@ -108,29 +99,10 @@ func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table ) conditionString += expressionSQL - values = append(values, expressionValues) + values = append(values, expressionValues...) } return conditionString, values - - // val := condition.Value - // TODO ver donde hago esta verificacion - // reflectVal := reflect.ValueOf(val) - // isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) - // // avoid nil is not nil behavior of go - // if val == nil || (isNullableKind && reflectVal.IsNil()) { - // return fmt.Sprintf( - // "%s.%s IS NULL", - // tableName, - // columnName, - // ), []any{} - // } - - // return fmt.Sprintf( - // "%s.%s = ?", - // tableName, - // columnName, - // ), []any{val} } type JoinCondition[T1 any, T2 any] struct { diff --git a/badorm/expression.go b/badorm/expression.go index af1682d0..9f6169ca 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -1,6 +1,11 @@ package badorm -import "fmt" +import ( + "fmt" + "reflect" + + "github.com/elliotchance/pie/v2" +) // TODO // string, int, etc. uuid, cualquier custom, time, deletedAt, asi que es any al final @@ -12,8 +17,29 @@ type Expression[T any] struct { symbol string } -func (expr Expression[T]) ToSQL(columnName string) (string, []T) { - return fmt.Sprintf("%s %s ?", columnName, expr.symbol), []T{expr.Value} +var nullableKinds = []reflect.Kind{ + reflect.Chan, reflect.Func, + reflect.Map, reflect.Pointer, + reflect.UnsafePointer, reflect.Interface, + reflect.Slice, +} + +// TODO aca me gustaria que devuelva []T pero no me anda asi +func (expr Expression[T]) ToSQL(columnName string) (string, []any) { + // TODO esto es valido solo para el equal, para los demas no se deberia hacer esto + // sino que para punteros no haya equal nil? + // TODO este chequeo deberia ser solo cuando T es un puntero + reflectVal := reflect.ValueOf(expr.Value) + isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) + // avoid nil is not nil behavior of go + if isNullableKind && reflectVal.IsNil() { + return fmt.Sprintf( + "%s IS NULL", + columnName, + ), []any{} + } + + return fmt.Sprintf("%s %s ?", columnName, expr.symbol), []any{expr.Value} } // Comparison Operators diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index b3d38a01..2aad2335 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -8,34 +8,34 @@ import ( "time" ) -func BicycleId(v badorm.UUID) badorm.WhereCondition[models.Bicycle] { - return badorm.WhereCondition[models.Bicycle]{ - Field: "ID", - Value: v, +func BicycleId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Bicycle, badorm.UUID] { + return badorm.FieldCondition[models.Bicycle, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func BicycleCreatedAt(v time.Time) badorm.WhereCondition[models.Bicycle] { - return badorm.WhereCondition[models.Bicycle]{ - Field: "CreatedAt", - Value: v, +func BicycleCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Bicycle, time.Time] { + return badorm.FieldCondition[models.Bicycle, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func BicycleUpdatedAt(v time.Time) badorm.WhereCondition[models.Bicycle] { - return badorm.WhereCondition[models.Bicycle]{ - Field: "UpdatedAt", - Value: v, +func BicycleUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Bicycle, time.Time] { + return badorm.FieldCondition[models.Bicycle, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func BicycleDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Bicycle] { - return badorm.WhereCondition[models.Bicycle]{ - Field: "DeletedAt", - Value: v, +func BicycleDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Bicycle, gorm.DeletedAt] { + return badorm.FieldCondition[models.Bicycle, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func BicycleName(v string) badorm.WhereCondition[models.Bicycle] { - return badorm.WhereCondition[models.Bicycle]{ - Field: "Name", - Value: v, +func BicycleName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Bicycle, string] { + return badorm.FieldCondition[models.Bicycle, string]{ + Expressions: exprs, + Field: "Name", } } func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Condition[models.Bicycle] { @@ -45,9 +45,9 @@ func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Conditio T2Field: "Name", } } -func BicycleOwnerName(v string) badorm.WhereCondition[models.Bicycle] { - return badorm.WhereCondition[models.Bicycle]{ - Field: "OwnerName", - Value: v, +func BicycleOwnerName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Bicycle, string] { + return badorm.FieldCondition[models.Bicycle, string]{ + Expressions: exprs, + Field: "OwnerName", } } diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index 569eb3cb..ebe34f5a 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -8,33 +8,33 @@ import ( "time" ) -func BrandId(v uint) badorm.WhereCondition[models.Brand] { - return badorm.WhereCondition[models.Brand]{ - Field: "ID", - Value: v, +func BrandId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[models.Brand, uint] { + return badorm.FieldCondition[models.Brand, uint]{ + Expressions: exprs, + Field: "ID", } } -func BrandCreatedAt(v time.Time) badorm.WhereCondition[models.Brand] { - return badorm.WhereCondition[models.Brand]{ - Field: "CreatedAt", - Value: v, +func BrandCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Brand, time.Time] { + return badorm.FieldCondition[models.Brand, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func BrandUpdatedAt(v time.Time) badorm.WhereCondition[models.Brand] { - return badorm.WhereCondition[models.Brand]{ - Field: "UpdatedAt", - Value: v, +func BrandUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Brand, time.Time] { + return badorm.FieldCondition[models.Brand, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func BrandDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Brand] { - return badorm.WhereCondition[models.Brand]{ - Field: "DeletedAt", - Value: v, +func BrandDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Brand, gorm.DeletedAt] { + return badorm.FieldCondition[models.Brand, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func BrandName(v string) badorm.WhereCondition[models.Brand] { - return badorm.WhereCondition[models.Brand]{ - Field: "Name", - Value: v, +func BrandName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Brand, string] { + return badorm.FieldCondition[models.Brand, string]{ + Expressions: exprs, + Field: "Name", } } diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index 185750b2..d28c19ae 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -8,39 +8,39 @@ import ( "time" ) -func CityId(v badorm.UUID) badorm.WhereCondition[models.City] { - return badorm.WhereCondition[models.City]{ - Field: "ID", - Value: v, +func CityId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.City, badorm.UUID] { + return badorm.FieldCondition[models.City, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func CityCreatedAt(v time.Time) badorm.WhereCondition[models.City] { - return badorm.WhereCondition[models.City]{ - Field: "CreatedAt", - Value: v, +func CityCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.City, time.Time] { + return badorm.FieldCondition[models.City, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func CityUpdatedAt(v time.Time) badorm.WhereCondition[models.City] { - return badorm.WhereCondition[models.City]{ - Field: "UpdatedAt", - Value: v, +func CityUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.City, time.Time] { + return badorm.FieldCondition[models.City, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func CityDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.City] { - return badorm.WhereCondition[models.City]{ - Field: "DeletedAt", - Value: v, +func CityDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.City, gorm.DeletedAt] { + return badorm.FieldCondition[models.City, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func CityName(v string) badorm.WhereCondition[models.City] { - return badorm.WhereCondition[models.City]{ - Field: "Name", - Value: v, +func CityName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.City, string] { + return badorm.FieldCondition[models.City, string]{ + Expressions: exprs, + Field: "Name", } } -func CityCountryId(v badorm.UUID) badorm.WhereCondition[models.City] { - return badorm.WhereCondition[models.City]{ - Field: "CountryID", - Value: v, +func CityCountryId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.City, badorm.UUID] { + return badorm.FieldCondition[models.City, badorm.UUID]{ + Expressions: exprs, + Field: "CountryID", } } diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index fc0da8d4..b70fd8a3 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -8,34 +8,34 @@ import ( "time" ) -func CompanyId(v badorm.UUID) badorm.WhereCondition[models.Company] { - return badorm.WhereCondition[models.Company]{ - Field: "ID", - Value: v, +func CompanyId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Company, badorm.UUID] { + return badorm.FieldCondition[models.Company, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func CompanyCreatedAt(v time.Time) badorm.WhereCondition[models.Company] { - return badorm.WhereCondition[models.Company]{ - Field: "CreatedAt", - Value: v, +func CompanyCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Company, time.Time] { + return badorm.FieldCondition[models.Company, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func CompanyUpdatedAt(v time.Time) badorm.WhereCondition[models.Company] { - return badorm.WhereCondition[models.Company]{ - Field: "UpdatedAt", - Value: v, +func CompanyUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Company, time.Time] { + return badorm.FieldCondition[models.Company, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func CompanyDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Company] { - return badorm.WhereCondition[models.Company]{ - Field: "DeletedAt", - Value: v, +func CompanyDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Company, gorm.DeletedAt] { + return badorm.FieldCondition[models.Company, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func CompanyName(v string) badorm.WhereCondition[models.Company] { - return badorm.WhereCondition[models.Company]{ - Field: "Name", - Value: v, +func CompanyName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Company, string] { + return badorm.FieldCondition[models.Company, string]{ + Expressions: exprs, + Field: "Name", } } func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index 61c908c1..8867c469 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -8,34 +8,34 @@ import ( "time" ) -func CountryId(v badorm.UUID) badorm.WhereCondition[models.Country] { - return badorm.WhereCondition[models.Country]{ - Field: "ID", - Value: v, +func CountryId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Country, badorm.UUID] { + return badorm.FieldCondition[models.Country, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func CountryCreatedAt(v time.Time) badorm.WhereCondition[models.Country] { - return badorm.WhereCondition[models.Country]{ - Field: "CreatedAt", - Value: v, +func CountryCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Country, time.Time] { + return badorm.FieldCondition[models.Country, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func CountryUpdatedAt(v time.Time) badorm.WhereCondition[models.Country] { - return badorm.WhereCondition[models.Country]{ - Field: "UpdatedAt", - Value: v, +func CountryUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Country, time.Time] { + return badorm.FieldCondition[models.Country, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func CountryDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Country] { - return badorm.WhereCondition[models.Country]{ - Field: "DeletedAt", - Value: v, +func CountryDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Country, gorm.DeletedAt] { + return badorm.FieldCondition[models.Country, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func CountryName(v string) badorm.WhereCondition[models.Country] { - return badorm.WhereCondition[models.Country]{ - Field: "Name", - Value: v, +func CountryName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Country, string] { + return badorm.FieldCondition[models.Country, string]{ + Expressions: exprs, + Field: "Name", } } func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.Condition[models.Country] { diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 6330f1c4..4730dd28 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -8,34 +8,34 @@ import ( "time" ) -func EmployeeId(v badorm.UUID) badorm.WhereCondition[models.Employee] { - return badorm.WhereCondition[models.Employee]{ - Field: "ID", - Value: v, +func EmployeeId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Employee, badorm.UUID] { + return badorm.FieldCondition[models.Employee, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func EmployeeCreatedAt(v time.Time) badorm.WhereCondition[models.Employee] { - return badorm.WhereCondition[models.Employee]{ - Field: "CreatedAt", - Value: v, +func EmployeeCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Employee, time.Time] { + return badorm.FieldCondition[models.Employee, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func EmployeeUpdatedAt(v time.Time) badorm.WhereCondition[models.Employee] { - return badorm.WhereCondition[models.Employee]{ - Field: "UpdatedAt", - Value: v, +func EmployeeUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Employee, time.Time] { + return badorm.FieldCondition[models.Employee, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func EmployeeDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Employee] { - return badorm.WhereCondition[models.Employee]{ - Field: "DeletedAt", - Value: v, +func EmployeeDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Employee, gorm.DeletedAt] { + return badorm.FieldCondition[models.Employee, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func EmployeeName(v string) badorm.WhereCondition[models.Employee] { - return badorm.WhereCondition[models.Employee]{ - Field: "Name", - Value: v, +func EmployeeName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Employee, string] { + return badorm.FieldCondition[models.Employee, string]{ + Expressions: exprs, + Field: "Name", } } func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condition[models.Employee] { @@ -45,9 +45,9 @@ func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condit T2Field: "ID", } } -func EmployeeBossId(v *badorm.UUID) badorm.WhereCondition[models.Employee] { - return badorm.WhereCondition[models.Employee]{ - Field: "BossID", - Value: v, +func EmployeeBossId(exprs ...badorm.Expression[*badorm.UUID]) badorm.FieldCondition[models.Employee, *badorm.UUID] { + return badorm.FieldCondition[models.Employee, *badorm.UUID]{ + Expressions: exprs, + Field: "BossID", } } diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index d9af4d11..19ed21f4 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -8,33 +8,33 @@ import ( "time" ) -func PersonId(v badorm.UUID) badorm.WhereCondition[models.Person] { - return badorm.WhereCondition[models.Person]{ - Field: "ID", - Value: v, +func PersonId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Person, badorm.UUID] { + return badorm.FieldCondition[models.Person, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func PersonCreatedAt(v time.Time) badorm.WhereCondition[models.Person] { - return badorm.WhereCondition[models.Person]{ - Field: "CreatedAt", - Value: v, +func PersonCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Person, time.Time] { + return badorm.FieldCondition[models.Person, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func PersonUpdatedAt(v time.Time) badorm.WhereCondition[models.Person] { - return badorm.WhereCondition[models.Person]{ - Field: "UpdatedAt", - Value: v, +func PersonUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Person, time.Time] { + return badorm.FieldCondition[models.Person, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func PersonDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Person] { - return badorm.WhereCondition[models.Person]{ - Field: "DeletedAt", - Value: v, +func PersonDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Person, gorm.DeletedAt] { + return badorm.FieldCondition[models.Person, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func PersonName(v string) badorm.WhereCondition[models.Person] { - return badorm.WhereCondition[models.Person]{ - Field: "Name", - Value: v, +func PersonName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Person, string] { + return badorm.FieldCondition[models.Person, string]{ + Expressions: exprs, + Field: "Name", } } diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index 304ec36f..b101b387 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -8,34 +8,34 @@ import ( "time" ) -func PhoneId(v uint) badorm.WhereCondition[models.Phone] { - return badorm.WhereCondition[models.Phone]{ - Field: "ID", - Value: v, +func PhoneId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[models.Phone, uint] { + return badorm.FieldCondition[models.Phone, uint]{ + Expressions: exprs, + Field: "ID", } } -func PhoneCreatedAt(v time.Time) badorm.WhereCondition[models.Phone] { - return badorm.WhereCondition[models.Phone]{ - Field: "CreatedAt", - Value: v, +func PhoneCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Phone, time.Time] { + return badorm.FieldCondition[models.Phone, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func PhoneUpdatedAt(v time.Time) badorm.WhereCondition[models.Phone] { - return badorm.WhereCondition[models.Phone]{ - Field: "UpdatedAt", - Value: v, +func PhoneUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Phone, time.Time] { + return badorm.FieldCondition[models.Phone, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func PhoneDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Phone] { - return badorm.WhereCondition[models.Phone]{ - Field: "DeletedAt", - Value: v, +func PhoneDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Phone, gorm.DeletedAt] { + return badorm.FieldCondition[models.Phone, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func PhoneName(v string) badorm.WhereCondition[models.Phone] { - return badorm.WhereCondition[models.Phone]{ - Field: "Name", - Value: v, +func PhoneName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Phone, string] { + return badorm.FieldCondition[models.Phone, string]{ + Expressions: exprs, + Field: "Name", } } func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[models.Phone] { @@ -45,9 +45,9 @@ func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[m T2Field: "ID", } } -func PhoneBrandId(v uint) badorm.WhereCondition[models.Phone] { - return badorm.WhereCondition[models.Phone]{ - Field: "BrandID", - Value: v, +func PhoneBrandId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[models.Phone, uint] { + return badorm.FieldCondition[models.Phone, uint]{ + Expressions: exprs, + Field: "BrandID", } } diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index 44099a03..750bbbf5 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -1,13 +1,89 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. package conditions import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" + gorm "gorm.io/gorm" + "time" ) -func ProductId(expressions ...badorm.Expression) badorm.WhereCondition[models.Product] { - return badorm.WhereCondition[models.Product]{ +func ProductId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Product, badorm.UUID] { + return badorm.FieldCondition[models.Product, badorm.UUID]{ + Expressions: exprs, Field: "ID", - Expressions: expressions, + } +} +func ProductCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Product, time.Time] { + return badorm.FieldCondition[models.Product, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", + } +} +func ProductUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Product, time.Time] { + return badorm.FieldCondition[models.Product, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", + } +} +func ProductDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Product, gorm.DeletedAt] { + return badorm.FieldCondition[models.Product, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", + } +} +func ProductString(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Product, string] { + return badorm.FieldCondition[models.Product, string]{ + Column: "string_something_else", + Expressions: exprs, + } +} +func ProductInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Product, int] { + return badorm.FieldCondition[models.Product, int]{ + Expressions: exprs, + Field: "Int", + } +} +func ProductIntPointer(exprs ...badorm.Expression[*int]) badorm.FieldCondition[models.Product, *int] { + return badorm.FieldCondition[models.Product, *int]{ + Expressions: exprs, + Field: "IntPointer", + } +} +func ProductFloat(exprs ...badorm.Expression[float64]) badorm.FieldCondition[models.Product, float64] { + return badorm.FieldCondition[models.Product, float64]{ + Expressions: exprs, + Field: "Float", + } +} +func ProductBool(exprs ...badorm.Expression[bool]) badorm.FieldCondition[models.Product, bool] { + return badorm.FieldCondition[models.Product, bool]{ + Expressions: exprs, + Field: "Bool", + } +} +func ProductByteArray(exprs ...badorm.Expression[[]uint8]) badorm.FieldCondition[models.Product, []uint8] { + return badorm.FieldCondition[models.Product, []uint8]{ + Expressions: exprs, + Field: "ByteArray", + } +} +func ProductMultiString(exprs ...badorm.Expression[models.MultiString]) badorm.FieldCondition[models.Product, models.MultiString] { + return badorm.FieldCondition[models.Product, models.MultiString]{ + Expressions: exprs, + Field: "MultiString", + } +} +func ProductEmbeddedInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Product, int] { + return badorm.FieldCondition[models.Product, int]{ + Expressions: exprs, + Field: "EmbeddedInt", + } +} +func ProductGormEmbeddedInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Product, int] { + return badorm.FieldCondition[models.Product, int]{ + ColumnPrefix: "gorm_embedded_", + Expressions: exprs, + Field: "Int", } } diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index f3b58cde..d9199b81 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -8,40 +8,40 @@ import ( "time" ) -func SaleId(v badorm.UUID) badorm.WhereCondition[models.Sale] { - return badorm.WhereCondition[models.Sale]{ - Field: "ID", - Value: v, +func SaleId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Sale, badorm.UUID] { + return badorm.FieldCondition[models.Sale, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func SaleCreatedAt(v time.Time) badorm.WhereCondition[models.Sale] { - return badorm.WhereCondition[models.Sale]{ - Field: "CreatedAt", - Value: v, +func SaleCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Sale, time.Time] { + return badorm.FieldCondition[models.Sale, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func SaleUpdatedAt(v time.Time) badorm.WhereCondition[models.Sale] { - return badorm.WhereCondition[models.Sale]{ - Field: "UpdatedAt", - Value: v, +func SaleUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Sale, time.Time] { + return badorm.FieldCondition[models.Sale, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func SaleDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Sale] { - return badorm.WhereCondition[models.Sale]{ - Field: "DeletedAt", - Value: v, +func SaleDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Sale, gorm.DeletedAt] { + return badorm.FieldCondition[models.Sale, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func SaleCode(v int) badorm.WhereCondition[models.Sale] { - return badorm.WhereCondition[models.Sale]{ - Field: "Code", - Value: v, +func SaleCode(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Sale, int] { + return badorm.FieldCondition[models.Sale, int]{ + Expressions: exprs, + Field: "Code", } } -func SaleDescription(v string) badorm.WhereCondition[models.Sale] { - return badorm.WhereCondition[models.Sale]{ - Field: "Description", - Value: v, +func SaleDescription(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Sale, string] { + return badorm.FieldCondition[models.Sale, string]{ + Expressions: exprs, + Field: "Description", } } func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Condition[models.Sale] { @@ -51,10 +51,10 @@ func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Conditio T2Field: "ID", } } -func SaleProductId(v badorm.UUID) badorm.WhereCondition[models.Sale] { - return badorm.WhereCondition[models.Sale]{ - Field: "ProductID", - Value: v, +func SaleProductId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Sale, badorm.UUID] { + return badorm.FieldCondition[models.Sale, badorm.UUID]{ + Expressions: exprs, + Field: "ProductID", } } func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[models.Sale] { @@ -64,9 +64,9 @@ func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[ T2Field: "ID", } } -func SaleSellerId(v *badorm.UUID) badorm.WhereCondition[models.Sale] { - return badorm.WhereCondition[models.Sale]{ - Field: "SellerID", - Value: v, +func SaleSellerId(exprs ...badorm.Expression[*badorm.UUID]) badorm.FieldCondition[models.Sale, *badorm.UUID] { + return badorm.FieldCondition[models.Sale, *badorm.UUID]{ + Expressions: exprs, + Field: "SellerID", } } diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 22620297..0cdf03d9 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -8,39 +8,39 @@ import ( "time" ) -func SellerId(v badorm.UUID) badorm.WhereCondition[models.Seller] { - return badorm.WhereCondition[models.Seller]{ - Field: "ID", - Value: v, +func SellerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Seller, badorm.UUID] { + return badorm.FieldCondition[models.Seller, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func SellerCreatedAt(v time.Time) badorm.WhereCondition[models.Seller] { - return badorm.WhereCondition[models.Seller]{ - Field: "CreatedAt", - Value: v, +func SellerCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Seller, time.Time] { + return badorm.FieldCondition[models.Seller, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func SellerUpdatedAt(v time.Time) badorm.WhereCondition[models.Seller] { - return badorm.WhereCondition[models.Seller]{ - Field: "UpdatedAt", - Value: v, +func SellerUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Seller, time.Time] { + return badorm.FieldCondition[models.Seller, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func SellerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[models.Seller] { - return badorm.WhereCondition[models.Seller]{ - Field: "DeletedAt", - Value: v, +func SellerDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Seller, gorm.DeletedAt] { + return badorm.FieldCondition[models.Seller, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func SellerName(v string) badorm.WhereCondition[models.Seller] { - return badorm.WhereCondition[models.Seller]{ - Field: "Name", - Value: v, +func SellerName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Seller, string] { + return badorm.FieldCondition[models.Seller, string]{ + Expressions: exprs, + Field: "Name", } } -func SellerCompanyId(v *badorm.UUID) badorm.WhereCondition[models.Seller] { - return badorm.WhereCondition[models.Seller]{ - Field: "CompanyID", - Value: v, +func SellerCompanyId(exprs ...badorm.Expression[*badorm.UUID]) badorm.FieldCondition[models.Seller, *badorm.UUID] { + return badorm.FieldCondition[models.Seller, *badorm.UUID]{ + Expressions: exprs, + Field: "CompanyID", } } diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 24b7ff9d..a2623335 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -2,6 +2,7 @@ package testintegration import ( "gorm.io/gorm" + "gotest.tools/assert" "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/conditions" @@ -51,153 +52,263 @@ func NewCRUDServiceIntTestSuite( // ------------------------- GetEntity -------------------------------- -// func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { -// _, err := ts.crudProductService.GetEntity(badorm.NilUUID) -// ts.Error(err, gorm.ErrRecordNotFound) -// } +func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { + _, err := ts.crudProductService.GetEntity(badorm.NilUUID) + ts.Error(err, gorm.ErrRecordNotFound) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { -// ts.createProduct("", 0, 0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { + ts.createProduct("", 0, 0, false, nil) -// _, err := ts.crudProductService.GetEntity(badorm.NewUUID()) -// ts.Error(err, gorm.ErrRecordNotFound) -// } + _, err := ts.crudProductService.GetEntity(badorm.NewUUID()) + ts.Error(err, gorm.ErrRecordNotFound) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsTheEntityIfItIsCreate() { -// match := ts.createProduct("", 0, 0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsTheEntityIfItIsCreate() { + match := ts.createProduct("", 0, 0, false, nil) -// entity, err := ts.crudProductService.GetEntity(match.ID) -// ts.Nil(err) + entity, err := ts.crudProductService.GetEntity(match.ID) + ts.Nil(err) -// assert.DeepEqual(ts.T(), match, entity) -// } + assert.DeepEqual(ts.T(), match, entity) +} -// // ------------------------- GetEntities -------------------------------- +// ------------------------- GetEntities -------------------------------- -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { -// entities, err := ts.crudProductService.GetEntities() -// ts.Nil(err) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { + entities, err := ts.crudProductService.GetEntities() + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{}, entities) -// } + EqualList(&ts.Suite, []*models.Product{}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { -// match := ts.createProduct("", 0, 0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { + match := ts.createProduct("", 0, 0, false, nil) -// entities, err := ts.crudProductService.GetEntities() -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities() + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { -// match1 := ts.createProduct("", 0, 0, false, nil) -// match2 := ts.createProduct("", 0, 0, false, nil) -// match3 := ts.createProduct("", 0, 0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { + match1 := ts.createProduct("", 0, 0, false, nil) + match2 := ts.createProduct("", 0, 0, false, nil) + match3 := ts.createProduct("", 0, 0, false, nil) -// entities, err := ts.crudProductService.GetEntities() -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities() + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductString("not_created"), -// ) -// ts.Nil(err) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + badorm.Eq("not_created"), + ), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{}, entities) -// } + EqualList(&ts.Suite, []*models.Product{}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { -// ts.createProduct("something_else", 0, 0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { + ts.createProduct("something_else", 0, 0, false, nil) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductString("not_match"), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + badorm.Eq("not_match"), + ), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{}, entities) -// } + EqualList(&ts.Suite, []*models.Product{}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { -// match := ts.createProduct("match", 0, 0, false, nil) -// ts.createProduct("not_match", 0, 0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { + match := ts.createProduct("match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductString("match"), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + badorm.Eq("match"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { + match1 := ts.createProduct("match", 0, 0, false, nil) + match2 := ts.createProduct("match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + badorm.Eq("match"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { + match := ts.createProduct("match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Eq(1), + ), + ) + ts.Nil(err) -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { -// match1 := ts.createProduct("match", 0, 0, false, nil) -// match2 := ts.createProduct("match", 0, 0, false, nil) -// ts.createProduct("not_match", 0, 0, false, nil) + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeNotEq() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 3, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.NotEq(2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeLt() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 2, 0, false, nil) + ts.createProduct("not_match", 3, 0, false, nil) + ts.createProduct("not_match", 4, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Lt(3), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeLtOrEq() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 2, 0, false, nil) + ts.createProduct("not_match", 3, 0, false, nil) + ts.createProduct("not_match", 4, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.LtOrEq(2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeGt() { + match1 := ts.createProduct("match", 3, 0, false, nil) + match2 := ts.createProduct("match", 4, 0, false, nil) + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Gt(2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeGtOrEq() { + match1 := ts.createProduct("match", 3, 0, false, nil) + match2 := ts.createProduct("match", 4, 0, false, nil) + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.GtOrEq(3), + ), + ) + ts.Nil(err) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductString("match"), -// ) -// ts.Nil(err) + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} -// EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -// } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { + match := ts.createProduct("match", 0, 1.1, false, nil) + ts.createProduct("not_match", 0, 2.2, false, nil) -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { -// match := ts.createProduct("match", 1, 0, false, nil) -// ts.createProduct("not_match", 2, 0, false, nil) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + badorm.Eq(1.1), + ), + ) + ts.Nil(err) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductInt(1), -// ) -// ts.Nil(err) + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { + match := ts.createProduct("match", 0, 0.0, true, nil) + ts.createProduct("not_match", 0, 0.0, false, nil) -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { -// match := ts.createProduct("match", 0, 1.1, false, nil) -// ts.createProduct("not_match", 0, 2.2, false, nil) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductBool( + badorm.Eq(true), + ), + ) + ts.Nil(err) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductFloat(1.1), -// ) -// ts.Nil(err) + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { + match1 := ts.createProduct("match", 1, 0.0, true, nil) + match2 := ts.createProduct("match", 1, 0.0, true, nil) -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { -// match := ts.createProduct("match", 0, 0.0, true, nil) -// ts.createProduct("not_match", 0, 0.0, false, nil) + ts.createProduct("not_match", 1, 0.0, true, nil) + ts.createProduct("match", 2, 0.0, true, nil) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductBool(true), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString(badorm.Eq("match")), + conditions.ProductInt(badorm.Eq(1)), + conditions.ProductBool(badorm.Eq(true)), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { -// match1 := ts.createProduct("match", 1, 0.0, true, nil) -// match2 := ts.createProduct("match", 1, 0.0, true, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWithDifferentExpressionsWorks() { + match1 := ts.createProduct("match", 1, 0.0, true, nil) + match2 := ts.createProduct("match", 1, 0.0, true, nil) -// ts.createProduct("not_match", 1, 0.0, true, nil) -// ts.createProduct("match", 2, 0.0, true, nil) + ts.createProduct("not_match", 1, 0.0, true, nil) + ts.createProduct("match", 2, 0.0, true, nil) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductString("match"), -// conditions.ProductInt(1), -// conditions.ProductBool(true), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString(badorm.Eq("match")), + conditions.ProductInt(badorm.Lt(2)), + conditions.ProductBool(badorm.NotEq(false)), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfID() { match := ts.createProduct("", 0, 0.0, false, nil) @@ -213,562 +324,562 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfID() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { -// match := ts.createProduct("", 0, 0.0, false, nil) -// ts.createProduct("", 0, 0.0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductCreatedAt(match.CreatedAt), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductCreatedAt(badorm.Eq(match.CreatedAt)), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesDeletedAtConditionIsAddedAutomatically() { -// match := ts.createProduct("", 0, 0.0, false, nil) -// deleted := ts.createProduct("", 0, 0.0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesDeletedAtConditionIsAddedAutomatically() { + match := ts.createProduct("", 0, 0.0, false, nil) + deleted := ts.createProduct("", 0, 0.0, false, nil) -// ts.Nil(ts.db.Delete(deleted).Error) + ts.Nil(ts.db.Delete(deleted).Error) -// entities, err := ts.crudProductService.GetEntities() -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities() + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// // TODO DeletedAt with nil value but not automatic +// TODO DeletedAt with nil value but not automatic -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfDeletedAtNotNil() { -// match := ts.createProduct("", 0, 0.0, false, nil) -// ts.createProduct("", 0, 0.0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfDeletedAtNotNil() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) -// ts.Nil(ts.db.Delete(match).Error) + ts.Nil(ts.db.Delete(match).Error) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductDeletedAt(match.DeletedAt), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductDeletedAt(badorm.Eq(match.DeletedAt)), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { -// match := ts.createProduct("", 0, 0.0, false, nil) -// ts.createProduct("", 0, 0.0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) -// match.EmbeddedInt = 1 + match.EmbeddedInt = 1 -// err := ts.db.Save(match).Error -// ts.Nil(err) + err := ts.db.Save(match).Error + ts.Nil(err) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductEmbeddedInt(1), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductEmbeddedInt(badorm.Eq(1)), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfGormEmbedded() { -// match := ts.createProduct("", 0, 0.0, false, nil) -// ts.createProduct("", 0, 0.0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfGormEmbedded() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) -// match.GormEmbedded.Int = 1 + match.GormEmbedded.Int = 1 -// err := ts.db.Save(match).Error -// ts.Nil(err) + err := ts.db.Save(match).Error + ts.Nil(err) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductGormEmbeddedInt(1), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductGormEmbeddedInt(badorm.Eq(1)), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWithValue() { -// intMatch := 1 -// match := ts.createProduct("match", 1, 0, false, &intMatch) -// intNotMatch := 2 -// ts.createProduct("not_match", 2, 0, false, &intNotMatch) -// ts.createProduct("not_match", 2, 0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWithValue() { + intMatch := 1 + match := ts.createProduct("match", 1, 0, false, &intMatch) + intNotMatch := 2 + ts.createProduct("not_match", 2, 0, false, &intNotMatch) + ts.createProduct("not_match", 2, 0, false, nil) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductIntPointer(&intMatch), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductIntPointer(badorm.Eq(&intMatch)), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeByNil() { -// match := ts.createProduct("match", 1, 0, false, nil) -// intNotMatch := 2 -// ts.createProduct("not_match", 2, 0, false, &intNotMatch) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeByNil() { + match := ts.createProduct("match", 1, 0, false, nil) + intNotMatch := 2 + ts.createProduct("not_match", 2, 0, false, &intNotMatch) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductIntPointer(nil), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductIntPointer(badorm.Eq[*int](nil)), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayWithContent() { -// match := ts.createProduct("match", 1, 0, false, nil) -// notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) -// ts.createProduct("not_match", 2, 0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayWithContent() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) -// match.ByteArray = []byte{1, 2} -// notMatch1.ByteArray = []byte{2, 3} + match.ByteArray = []byte{1, 2} + notMatch1.ByteArray = []byte{2, 3} -// err := ts.db.Save(match).Error -// ts.Nil(err) + err := ts.db.Save(match).Error + ts.Nil(err) -// err = ts.db.Save(notMatch1).Error -// ts.Nil(err) + err = ts.db.Save(notMatch1).Error + ts.Nil(err) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductByteArray([]byte{1, 2}), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductByteArray(badorm.Eq([]byte{1, 2})), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayEmpty() { -// match := ts.createProduct("match", 1, 0, false, nil) -// notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) -// ts.createProduct("not_match", 2, 0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayEmpty() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) -// match.ByteArray = []byte{} -// notMatch1.ByteArray = []byte{2, 3} + match.ByteArray = []byte{} + notMatch1.ByteArray = []byte{2, 3} -// err := ts.db.Save(match).Error -// ts.Nil(err) + err := ts.db.Save(match).Error + ts.Nil(err) -// err = ts.db.Save(notMatch1).Error -// ts.Nil(err) + err = ts.db.Save(notMatch1).Error + ts.Nil(err) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductByteArray([]byte{}), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductByteArray(badorm.Eq([]byte{})), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() { -// match := ts.createProduct("match", 1, 0, false, nil) -// notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) -// notMatch1.ByteArray = []byte{2, 3} +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + notMatch1.ByteArray = []byte{2, 3} -// err := ts.db.Save(notMatch1).Error -// ts.Nil(err) + err := ts.db.Save(notMatch1).Error + ts.Nil(err) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductByteArray(nil), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductByteArray(badorm.Eq[[]uint8](nil)), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { -// match := ts.createProduct("match", 1, 0, false, nil) -// notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) -// ts.createProduct("not_match", 2, 0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) -// match.MultiString = models.MultiString{"salut", "hola"} -// notMatch1.MultiString = models.MultiString{"salut", "hola", "hello"} + match.MultiString = models.MultiString{"salut", "hola"} + notMatch1.MultiString = models.MultiString{"salut", "hola", "hello"} -// err := ts.db.Save(match).Error -// ts.Nil(err) + err := ts.db.Save(match).Error + ts.Nil(err) -// err = ts.db.Save(notMatch1).Error -// ts.Nil(err) + err = ts.db.Save(notMatch1).Error + ts.Nil(err) -// entities, err := ts.crudProductService.GetEntities( -// conditions.ProductMultiString(models.MultiString{"salut", "hola"}), -// ) -// ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductMultiString(badorm.Eq(models.MultiString{"salut", "hola"})), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Product{match}, entities) -// } + EqualList(&ts.Suite, []*models.Product{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { -// product1 := ts.createProduct("", 0, 0.0, false, nil) -// product2 := ts.createProduct("", 0, 0.0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleProductId(product1.ID), -// ) -// ts.Nil(err) + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProductId(badorm.Eq(product1.ID)), + ) + ts.Nil(err) -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalWithValue() { -// product1 := ts.createProduct("", 0, 0.0, false, nil) -// product2 := ts.createProduct("", 0, 0.0, false, nil) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalWithValue() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSellerId(badorm.Eq(&seller1.ID)), + ) + ts.Nil(err) -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleSellerId(&seller1.ID), -// ) -// ts.Nil(err) + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalByNil() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalByNil() { -// product1 := ts.createProduct("", 0, 0.0, false, nil) -// product2 := ts.createProduct("", 0, 0.0, false, nil) + seller2 := ts.createSeller("agustin", nil) -// seller2 := ts.createSeller("agustin", nil) + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, seller2) -// match := ts.createSale(0, product1, nil) -// ts.createSale(0, product2, seller2) + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSellerId(badorm.Eq[*badorm.UUID](nil)), + ) + ts.Nil(err) -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleSellerId(nil), -// ) -// ts.Nil(err) + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsOnUIntModel() { + match := ts.createBrand("match") + ts.createBrand("not_match") -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsOnUIntModel() { -// match := ts.createBrand("match") -// ts.createBrand("not_match") + entities, err := ts.crudBrandService.GetEntities( + conditions.BrandName(badorm.Eq("match")), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Brand{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsUintBelongsTo() { + brand1 := ts.createBrand("google") + brand2 := ts.createBrand("apple") + + match := ts.createPhone("pixel", *brand1) + ts.createPhone("iphone", *brand2) + + entities, err := ts.crudPhoneService.GetEntities( + conditions.PhoneBrand( + conditions.BrandName(badorm.Eq("google")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Phone{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductInt(badorm.Eq(1)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} -// entities, err := ts.crudBrandService.GetEntities( -// conditions.BrandName("match"), -// ) -// ts.Nil(err) +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(1, product1, seller1) + ts.createSale(2, product2, seller2) + ts.createSale(2, product1, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleCode(badorm.Eq(1)), + conditions.SaleProduct( + conditions.ProductInt(badorm.Eq(1)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSeller( + conditions.SellerName(badorm.Eq("franco")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { + boss1 := &models.Employee{ + Name: "Xavier", + } + boss2 := &models.Employee{ + Name: "Vincent", + } + + match := ts.createEmployee("franco", boss1) + ts.createEmployee("pierre", boss2) + + entities, err := ts.crudEmployeeService.GetEntities( + conditions.EmployeeBoss( + conditions.EmployeeName(badorm.Eq("Xavier")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Employee{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { + capital1 := models.City{ + Name: "Buenos Aires", + } + capital2 := models.City{ + Name: "Paris", + } + + ts.createCountry("Argentina", capital1) + ts.createCountry("France", capital2) + + entities, err := ts.crudCityService.GetEntities( + conditions.CityCountry( + conditions.CountryName(badorm.Eq("Argentina")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.City{&capital1}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { + capital1 := models.City{ + Name: "Buenos Aires", + } + capital2 := models.City{ + Name: "Paris", + } -// EqualList(&ts.Suite, []*models.Brand{match}, entities) -// } + country1 := ts.createCountry("Argentina", capital1) + ts.createCountry("France", capital2) -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsUintBelongsTo() { -// brand1 := ts.createBrand("google") -// brand2 := ts.createBrand("apple") - -// match := ts.createPhone("pixel", *brand1) -// ts.createPhone("iphone", *brand2) - -// entities, err := ts.crudPhoneService.GetEntities( -// conditions.PhoneBrand( -// conditions.BrandName("google"), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Phone{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { -// product1 := ts.createProduct("", 1, 0.0, false, nil) -// product2 := ts.createProduct("", 2, 0.0, false, nil) - -// match := ts.createSale(0, product1, nil) -// ts.createSale(0, product2, nil) - -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleProduct( -// conditions.ProductInt(1), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { -// product1 := ts.createProduct("", 1, 0.0, false, nil) -// product2 := ts.createProduct("", 2, 0.0, false, nil) - -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) - -// match := ts.createSale(1, product1, seller1) -// ts.createSale(2, product2, seller2) -// ts.createSale(2, product1, seller2) - -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleCode(1), -// conditions.SaleProduct( -// conditions.ProductInt(1), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { -// product1 := ts.createProduct("", 1, 0.0, false, nil) -// product2 := ts.createProduct("", 2, 0.0, false, nil) - -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) - -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) - -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleSeller( -// conditions.SellerName("franco"), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { -// boss1 := &models.Employee{ -// Name: "Xavier", -// } -// boss2 := &models.Employee{ -// Name: "Vincent", -// } - -// match := ts.createEmployee("franco", boss1) -// ts.createEmployee("pierre", boss2) - -// entities, err := ts.crudEmployeeService.GetEntities( -// conditions.EmployeeBoss( -// conditions.EmployeeName("Xavier"), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Employee{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { -// capital1 := models.City{ -// Name: "Buenos Aires", -// } -// capital2 := models.City{ -// Name: "Paris", -// } - -// ts.createCountry("Argentina", capital1) -// ts.createCountry("France", capital2) - -// entities, err := ts.crudCityService.GetEntities( -// conditions.CityCountry( -// conditions.CountryName("Argentina"), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.City{&capital1}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { -// capital1 := models.City{ -// Name: "Buenos Aires", -// } -// capital2 := models.City{ -// Name: "Paris", -// } - -// country1 := ts.createCountry("Argentina", capital1) -// ts.createCountry("France", capital2) - -// entities, err := ts.crudCountryService.GetEntities( -// conditions.CountryCapital( -// conditions.CityName("Buenos Aires"), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Country{country1}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { -// person1 := models.Person{ -// Name: "franco", -// } -// person2 := models.Person{ -// Name: "xavier", -// } - -// match := ts.createBicycle("BMX", person1) -// ts.createBicycle("Shimano", person2) - -// entities, err := ts.crudBicycleService.GetEntities( -// conditions.BicycleOwner( -// conditions.PersonName("franco"), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Bicycle{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { -// company1 := ts.createCompany("ditrit") -// company2 := ts.createCompany("orness") - -// match := ts.createSeller("franco", company1) -// ts.createSeller("agustin", company2) - -// entities, err := ts.crudSellerService.GetEntities( -// conditions.SellerCompany( -// conditions.CompanyName("ditrit"), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Seller{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { -// product1 := ts.createProduct("match", 1, 0.0, false, nil) -// product2 := ts.createProduct("match", 2, 0.0, false, nil) - -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) - -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) - -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleProduct( -// conditions.ProductInt(1), -// conditions.ProductString("match"), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAddsDeletedAtAutomatically() { -// product1 := ts.createProduct("match", 1, 0.0, false, nil) -// product2 := ts.createProduct("match", 2, 0.0, false, nil) - -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) - -// ts.Nil(ts.db.Delete(product2).Error) - -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) - -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleProduct( -// conditions.ProductString("match"), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDeletedAt() { -// product1 := ts.createProduct("match", 1, 0.0, false, nil) -// product2 := ts.createProduct("match", 2, 0.0, false, nil) - -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) - -// ts.Nil(ts.db.Delete(product1).Error) - -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) - -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleProduct( -// conditions.ProductDeletedAt(product1.DeletedAt), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersByNil() { -// product1 := ts.createProduct("", 1, 0.0, false, nil) -// intProduct2 := 2 -// product2 := ts.createProduct("", 2, 0.0, false, &intProduct2) - -// match := ts.createSale(0, product1, nil) -// ts.createSale(0, product2, nil) - -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleProduct( -// conditions.ProductIntPointer(nil), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { -// product1 := ts.createProduct("", 1, 0.0, false, nil) -// product2 := ts.createProduct("", 2, 0.0, false, nil) - -// seller1 := ts.createSeller("franco", nil) -// seller2 := ts.createSeller("agustin", nil) - -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) -// ts.createSale(0, product1, seller2) -// ts.createSale(0, product2, seller1) - -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleProduct( -// conditions.ProductInt(1), -// ), -// conditions.SaleSeller( -// conditions.SellerName("franco"), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } - -// func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { -// product1 := ts.createProduct("", 0, 0.0, false, nil) -// product2 := ts.createProduct("", 0, 0.0, false, nil) - -// company1 := ts.createCompany("ditrit") -// company2 := ts.createCompany("orness") - -// seller1 := ts.createSeller("franco", company1) -// seller2 := ts.createSeller("agustin", company2) - -// match := ts.createSale(0, product1, seller1) -// ts.createSale(0, product2, seller2) - -// entities, err := ts.crudSaleService.GetEntities( -// conditions.SaleSeller( -// conditions.SellerName("franco"), -// conditions.SellerCompany( -// conditions.CompanyName("ditrit"), -// ), -// ), -// ) -// ts.Nil(err) - -// EqualList(&ts.Suite, []*models.Sale{match}, entities) -// } + entities, err := ts.crudCountryService.GetEntities( + conditions.CountryCapital( + conditions.CityName(badorm.Eq("Buenos Aires")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Country{country1}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { + person1 := models.Person{ + Name: "franco", + } + person2 := models.Person{ + Name: "xavier", + } + + match := ts.createBicycle("BMX", person1) + ts.createBicycle("Shimano", person2) + + entities, err := ts.crudBicycleService.GetEntities( + conditions.BicycleOwner( + conditions.PersonName(badorm.Eq("franco")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Bicycle{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + match := ts.createSeller("franco", company1) + ts.createSeller("agustin", company2) + + entities, err := ts.crudSellerService.GetEntities( + conditions.SellerCompany( + conditions.CompanyName(badorm.Eq("ditrit")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Seller{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { + product1 := ts.createProduct("match", 1, 0.0, false, nil) + product2 := ts.createProduct("match", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductInt(badorm.Eq(1)), + conditions.ProductString(badorm.Eq("match")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAddsDeletedAtAutomatically() { + product1 := ts.createProduct("match", 1, 0.0, false, nil) + product2 := ts.createProduct("match", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + ts.Nil(ts.db.Delete(product2).Error) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductString(badorm.Eq("match")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDeletedAt() { + product1 := ts.createProduct("match", 1, 0.0, false, nil) + product2 := ts.createProduct("match", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + ts.Nil(ts.db.Delete(product1).Error) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductDeletedAt(badorm.Eq(product1.DeletedAt)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersByNil() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + intProduct2 := 2 + product2 := ts.createProduct("", 2, 0.0, false, &intProduct2) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductIntPointer(badorm.Eq[*int](nil)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + ts.createSale(0, product1, seller2) + ts.createSale(0, product2, seller1) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductInt(badorm.Eq(1)), + ), + conditions.SaleSeller( + conditions.SellerName(badorm.Eq("franco")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + seller1 := ts.createSeller("franco", company1) + seller2 := ts.createSeller("agustin", company2) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSeller( + conditions.SellerName(badorm.Eq("franco")), + conditions.SellerCompany( + conditions.CompanyName(badorm.Eq("ditrit")), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 04a233a6..ae32b8d3 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -12,8 +12,10 @@ import ( const ( // badorm/condition.go badORMCondition = "Condition" - badORMWhereCondition = "WhereCondition" + badORMFieldCondition = "FieldCondition" badORMJoinCondition = "JoinCondition" + // badorm/expression.go + badORMExpression = "Expression" ) type Condition struct { @@ -153,32 +155,33 @@ func (condition *Condition) generateForBadormModel(objectType Type, field Field) // Generate a WhereCondition between object and field func (condition *Condition) generateWhere(objectType Type, field Field) { - whereCondition := jen.Qual( - badORMPath, badORMWhereCondition, + fieldCondition := jen.Qual( + badORMPath, badORMFieldCondition, ).Types( jen.Qual( getRelativePackagePath(condition.destPkg, objectType), objectType.Name(), ), + condition.param.GenericType(), ) conditionName := getConditionName(objectType, field) log.Logger.Debugf("Generated %q", conditionName) - params := jen.Dict{ - jen.Id("Value"): jen.Id("v"), + conditionValues := jen.Dict{ + jen.Id("Expressions"): jen.Id("exprs"), } columnName := field.getColumnName() if columnName != "" { - params[jen.Id("Column")] = jen.Lit(columnName) + conditionValues[jen.Id("Column")] = jen.Lit(columnName) } else { - params[jen.Id("Field")] = jen.Lit(field.Name) + conditionValues[jen.Id("Field")] = jen.Lit(field.Name) } columnPrefix := field.ColumnPrefix if columnPrefix != "" { - params[jen.Id("ColumnPrefix")] = jen.Lit(columnPrefix) + conditionValues[jen.Id("ColumnPrefix")] = jen.Lit(columnPrefix) } condition.codes = append( @@ -188,10 +191,10 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { ).Params( condition.param.Statement(), ).Add( - whereCondition.Clone(), + fieldCondition.Clone(), ).Block( jen.Return( - whereCondition.Clone().Values(params), + fieldCondition.Clone().Values(conditionValues), ), ), ) @@ -287,7 +290,7 @@ func getConditionName(typeV Type, field Field) string { // Avoid importing the same package as the destination one func getRelativePackagePath(destPkg string, typeV Type) string { srcPkg := typeV.Pkg() - if srcPkg.Name() == destPkg { + if srcPkg == nil || srcPkg.Name() == destPkg { return "" } diff --git a/tools/badctl/cmd/gen/conditions/jenParam.go b/tools/badctl/cmd/gen/conditions/jenParam.go index 2976d300..1e4dac61 100644 --- a/tools/badctl/cmd/gen/conditions/jenParam.go +++ b/tools/badctl/cmd/gen/conditions/jenParam.go @@ -10,55 +10,63 @@ import ( ) type JenParam struct { - statement *jen.Statement + statement *jen.Statement + internalType *jen.Statement } func NewJenParam() *JenParam { return &JenParam{ - statement: jen.Id("v"), + statement: jen.Id("exprs").Op("...").Qual( + badORMPath, badORMExpression, + ), + internalType: &jen.Statement{}, } } func (param JenParam) Statement() *jen.Statement { - return param.statement + return param.statement.Types(param.internalType) +} + +func (param JenParam) GenericType() *jen.Statement { + return param.internalType } func (param JenParam) ToBasicKind(basicType *types.Basic) { switch basicType.Kind() { case types.Bool: - param.statement.Bool() + param.internalType.Bool() case types.Int: - param.statement.Int() + param.internalType.Int() case types.Int8: - param.statement.Int8() + param.internalType.Int8() case types.Int16: - param.statement.Int16() + param.internalType.Int16() case types.Int32: - param.statement.Int32() + param.internalType.Int32() case types.Int64: - param.statement.Int64() + param.internalType.Int64() case types.Uint: - param.statement.Uint() + param.internalType.Uint() case types.Uint8: - param.statement.Uint8() + param.internalType.Uint8() case types.Uint16: - param.statement.Uint16() + param.internalType.Uint16() case types.Uint32: - param.statement.Uint32() + param.internalType.Uint32() case types.Uint64: - param.statement.Uint64() + param.internalType.Uint64() case types.Uintptr: - param.statement.Uintptr() + param.internalType.Uintptr() case types.Float32: - param.statement.Float32() + param.internalType.Float32() case types.Float64: - param.statement.Float64() + param.internalType.Float64() case types.Complex64: - param.statement.Complex64() + param.internalType.Complex64() case types.Complex128: - param.statement.Complex128() + param.internalType.Complex128() case types.String: - param.statement.String() + param.internalType.String() case types.Invalid, types.UnsafePointer, types.UntypedBool, types.UntypedInt, types.UntypedRune, types.UntypedFloat, @@ -69,15 +77,15 @@ func (param JenParam) ToBasicKind(basicType *types.Basic) { } func (param JenParam) ToPointer() { - param.statement.Op("*") + param.internalType.Op("*") } func (param JenParam) ToSlice() { - param.statement.Index() + param.internalType.Index() } func (param JenParam) ToCustomType(destPkg string, typeV Type) { - param.statement.Qual( + param.internalType.Qual( getRelativePackagePath(destPkg, typeV), typeV.Name(), ) From 9f2feab74a212dfb99237f16413f70f5515aa38a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 14 Jun 2023 10:21:53 +0200 Subject: [PATCH 335/467] is distinct and is null --- badorm/expression.go | 97 +++++++++++++++++++--------------- testintegration/crudService.go | 82 ++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+), 43 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index 9f6169ca..c827791c 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -13,7 +13,7 @@ import ( // uno custom va a ir a string o no // podria igual mirar que condiciones les genero y cuales no segun el tipo type Expression[T any] struct { - Value T + Values []T symbol string } @@ -26,97 +26,108 @@ var nullableKinds = []reflect.Kind{ // TODO aca me gustaria que devuelva []T pero no me anda asi func (expr Expression[T]) ToSQL(columnName string) (string, []any) { - // TODO esto es valido solo para el equal, para los demas no se deberia hacer esto + // TODO esto se podria hacer pasando expression a interfaz y tener distintos tipos + if len(expr.Values) == 0 { + return fmt.Sprintf("%s %s", columnName, expr.symbol), []any{} + } + + value := expr.Values[0] // sino que para punteros no haya equal nil? // TODO este chequeo deberia ser solo cuando T es un puntero - reflectVal := reflect.ValueOf(expr.Value) - isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) - // avoid nil is not nil behavior of go - if isNullableKind && reflectVal.IsNil() { - return fmt.Sprintf( - "%s IS NULL", - columnName, - ), []any{} + // TODO y aca que pasa con time, deletedAt, y otros nullables por valuer + // TODO que pasa para los demas symbols, puede meterme un null en un lt? + // TODO esto esta feo + if expr.symbol == "=" { + reflectVal := reflect.ValueOf(value) + isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) + // avoid nil is not nil behavior of go + if isNullableKind && reflectVal.IsNil() { + return fmt.Sprintf( + "%s IS NULL", + columnName, + ), []any{} + } } - return fmt.Sprintf("%s %s ?", columnName, expr.symbol), []any{expr.Value} + return fmt.Sprintf("%s %s ?", columnName, expr.symbol), []any{value} } // Comparison Operators +// TODO aca hay codigo repetido entre los constructores func Eq[T any](value T) Expression[T] { return Expression[T]{ - Value: value, + Values: []T{value}, symbol: "=", } } func NotEq[T any](value T) Expression[T] { return Expression[T]{ - Value: value, + Values: []T{value}, symbol: "<>", } } func Lt[T any](value T) Expression[T] { return Expression[T]{ - Value: value, + Values: []T{value}, symbol: "<", } } func LtOrEq[T any](value T) Expression[T] { return Expression[T]{ - Value: value, + Values: []T{value}, symbol: "<=", } } func Gt[T any](value T) Expression[T] { return Expression[T]{ - Value: value, + Values: []T{value}, symbol: ">", } } func GtOrEq[T any](value T) Expression[T] { return Expression[T]{ - Value: value, + Values: []T{value}, symbol: ">=", } } // Comparison Predicates -// // TODO BETWEEN, NOT BETWEEN -// func IsDistinct[T any](value T) Expression[T] { -// return Expression[T]{ -// Value: value, -// symbol: "IS DISTINCT FROM", -// } -// } +// TODO BETWEEN, NOT BETWEEN -// func IsNotDistinct[T any](value T) Expression[T] { -// return Expression[T]{ -// Value: value, -// symbol: "IS NOT DISTINCT FROM", -// } -// } +func IsDistinct[T any](value T) Expression[T] { + return Expression[T]{ + Values: []T{value}, + symbol: "IS DISTINCT FROM", + } +} -// // TODO no deberia ser posible para todos -// func IsNull[T any](value T) Expression[T] { -// return Expression[T]{ -// Value: value, // TODO ver aca que hago -// symbol: "IS NULL", -// } -// } +func IsNotDistinct[T any](value T) Expression[T] { + return Expression[T]{ + Values: []T{value}, + symbol: "IS NOT DISTINCT FROM", + } +} -// func IsNotNull[T any](value T) Expression[T] { -// return Expression[T]{ -// Value: value, // TODO ver aca que hago -// symbol: "IS NOT NULL", -// } -// } +// TODO no deberia ser posible para todos, solo los que son nullables +// pero como puedo saberlo, los que son pointers?, pero tambien hay otros como deletedAt que pueden ser null por su valuer +func IsNull[T any]() Expression[T] { + return Expression[T]{ + symbol: "IS NULL", + } +} + +func IsNotNull[T any]() Expression[T] { + return Expression[T]{ + symbol: "IS NOT NULL", + } +} // // TODO no deberia ser posible para todos // func IsTrue[T any](value T) Expression[T] { diff --git a/testintegration/crudService.go b/testintegration/crudService.go index a2623335..205bed23 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -248,6 +248,88 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeGtOrEq() EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsDistinct() { + match1 := ts.createProduct("match", 3, 0, false, nil) + match2 := ts.createProduct("match", 4, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.IsDistinct(2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotDistinct() { + match := ts.createProduct("match", 3, 0, false, nil) + ts.createProduct("not_match", 4, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.IsNotDistinct(3), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNull() { + match := ts.createProduct("match", 0, 0, false, nil) + int1 := 1 + int2 := 2 + ts.createProduct("not_match", 0, 0, false, &int1) + ts.createProduct("not_match", 0, 0, false, &int2) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductIntPointer( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNull[*int](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotNull() { + int1 := 1 + match := ts.createProduct("match", 0, 0, false, &int1) + ts.createProduct("not_match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductIntPointer( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNotNull[*int](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithMultipleExpressions() { + match := ts.createProduct("match", 3, 0, false, nil) + ts.createProduct("not_match", 5, 0, false, nil) + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.GtOrEq(3), + badorm.LtOrEq(4), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { match := ts.createProduct("match", 0, 1.1, false, nil) ts.createProduct("not_match", 0, 2.2, false, nil) From cf8a41d0f420fb99713bfddf65199e2dfe971a70 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 14 Jun 2023 10:55:33 +0200 Subject: [PATCH 336/467] boolean comparison predicates + fix bug in isCustomGorm --- badorm/expression.go | 72 +++++----- .../conditions/product_conditions.go | 7 + testintegration/crudService.go | 128 ++++++++++++++++++ testintegration/models/models.go | 2 + tools/badctl/cmd/gen/conditions/condition.go | 4 +- tools/badctl/cmd/gen/conditions/field.go | 4 + tools/badctl/cmd/gen/conditions/type.go | 2 +- 7 files changed, 178 insertions(+), 41 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index c827791c..8ce2836f 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -1,6 +1,7 @@ package badorm import ( + "database/sql" "fmt" "reflect" @@ -129,49 +130,44 @@ func IsNotNull[T any]() Expression[T] { } } -// // TODO no deberia ser posible para todos -// func IsTrue[T any](value T) Expression[T] { -// return Expression[T]{ -// Value: value, // TODO ver aca que hago -// symbol: "IS TRUE", -// } -// } +// Boolean Comparison Predicates -// func IsNotTrue[T any](value T) Expression[T] { -// return Expression[T]{ -// Value: value, // TODO ver aca que hago -// symbol: "IS NOT TRUE", -// } -// } +// TODO que pasa con otros que mapean a bool por valuer? +func IsTrue[T bool | *bool | sql.NullBool]() Expression[T] { + return Expression[T]{ + symbol: "IS TRUE", + } +} -// // TODO no deberia ser posible para todos -// func IsFalse[T any](value T) Expression[T] { -// return Expression[T]{ -// Value: value, // TODO ver aca que hago -// symbol: "IS FALSE", -// } -// } +func IsNotTrue[T bool | *bool | sql.NullBool]() Expression[T] { + return Expression[T]{ + symbol: "IS NOT TRUE", + } +} -// func IsNotFalse[T any](value T) Expression[T] { -// return Expression[T]{ -// Value: value, // TODO ver aca que hago -// symbol: "IS NOT FALSE", -// } -// } +func IsFalse[T bool | *bool | sql.NullBool]() Expression[T] { + return Expression[T]{ + symbol: "IS FALSE", + } +} -// func IsUnknown[T any](value T) Expression[T] { -// return Expression[T]{ -// Value: value, // TODO ver aca que hago -// symbol: "IS UNKNOWN", -// } -// } +func IsNotFalse[T bool | *bool | sql.NullBool]() Expression[T] { + return Expression[T]{ + symbol: "IS NOT FALSE", + } +} -// func IsNotUnknown[T any](value T) Expression[T] { -// return Expression[T]{ -// Value: value, // TODO ver aca que hago -// symbol: "IS NOT UNKNOWN", -// } -// } +func IsUnknown[T *bool | sql.NullBool]() Expression[T] { + return Expression[T]{ + symbol: "IS UNKNOWN", + } +} + +func IsNotUnknown[T *bool | sql.NullBool]() Expression[T] { + return Expression[T]{ + symbol: "IS NOT UNKNOWN", + } +} // // TODO no se a que grupo pertenece diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index 750bbbf5..7c165943 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -2,6 +2,7 @@ package conditions import ( + "database/sql" badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" @@ -62,6 +63,12 @@ func ProductBool(exprs ...badorm.Expression[bool]) badorm.FieldCondition[models. Field: "Bool", } } +func ProductNullBool(exprs ...badorm.Expression[sql.NullBool]) badorm.FieldCondition[models.Product, sql.NullBool] { + return badorm.FieldCondition[models.Product, sql.NullBool]{ + Expressions: exprs, + Field: "NullBool", + } +} func ProductByteArray(exprs ...badorm.Expression[[]uint8]) badorm.FieldCondition[models.Product, []uint8] { return badorm.FieldCondition[models.Product, []uint8]{ Expressions: exprs, diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 205bed23..5f753a34 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -1,6 +1,8 @@ package testintegration import ( + "database/sql" + "gorm.io/gorm" "gotest.tools/assert" @@ -313,6 +315,132 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotNull EqualList(&ts.Suite, []*models.Product{match}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsTrue() { + match := ts.createProduct("match", 0, 0, true, nil) + ts.createProduct("not_match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsTrue[bool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsFalse() { + match := ts.createProduct("match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, true, nil) + ts.createProduct("not_match", 0, 0, true, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsFalse[bool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotTrue() { + match1 := ts.createProduct("match", 0, 0, false, nil) + match2 := ts.createProduct("match", 0, 0, false, nil) + match2.NullBool = sql.NullBool{Valid: true, Bool: false} + err := ts.db.Save(match2).Error + ts.Nil(err) + + notMatch := ts.createProduct("not_match", 0, 0, false, nil) + notMatch.NullBool = sql.NullBool{Valid: true, Bool: true} + err = ts.db.Save(notMatch).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNotTrue[sql.NullBool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotFalse() { + match1 := ts.createProduct("match", 0, 0, false, nil) + match2 := ts.createProduct("match", 0, 0, false, nil) + match2.NullBool = sql.NullBool{Valid: true, Bool: true} + err := ts.db.Save(match2).Error + ts.Nil(err) + + notMatch := ts.createProduct("not_match", 0, 0, false, nil) + notMatch.NullBool = sql.NullBool{Valid: true, Bool: false} + err = ts.db.Save(notMatch).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNotFalse[sql.NullBool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsUnknown() { + match := ts.createProduct("match", 0, 0, false, nil) + + notMatch1 := ts.createProduct("match", 0, 0, false, nil) + notMatch1.NullBool = sql.NullBool{Valid: true, Bool: true} + err := ts.db.Save(notMatch1).Error + ts.Nil(err) + + notMatch2 := ts.createProduct("not_match", 0, 0, false, nil) + notMatch2.NullBool = sql.NullBool{Valid: true, Bool: false} + err = ts.db.Save(notMatch2).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsUnknown[sql.NullBool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotUnknown() { + match1 := ts.createProduct("", 0, 0, false, nil) + match1.NullBool = sql.NullBool{Valid: true, Bool: true} + err := ts.db.Save(match1).Error + ts.Nil(err) + + match2 := ts.createProduct("", 0, 0, false, nil) + match2.NullBool = sql.NullBool{Valid: true, Bool: false} + err = ts.db.Save(match2).Error + ts.Nil(err) + + ts.createProduct("", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNotUnknown[sql.NullBool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithMultipleExpressions() { match := ts.createProduct("match", 3, 0, false, nil) ts.createProduct("not_match", 5, 0, false, nil) diff --git a/testintegration/models/models.go b/testintegration/models/models.go index f6170b72..609b78e4 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -1,6 +1,7 @@ package models import ( + "database/sql" "database/sql/driver" "fmt" "strings" @@ -72,6 +73,7 @@ type Product struct { IntPointer *int Float float64 Bool bool + NullBool sql.NullBool ByteArray []byte MultiString MultiString ToBeEmbedded diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index ae32b8d3..0144dd32 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -36,7 +36,7 @@ func NewCondition(destPkg string, objectType Type, field Field) *Condition { // Generate the condition between the object and the field func (condition *Condition) generate(objectType Type, field Field) { - switch fieldType := field.Type.Type.(type) { + switch fieldType := field.GetType().(type) { case *types.Basic: // the field is a basic type (string, int, etc) // adapt param to that type and generate a WhereCondition @@ -75,7 +75,7 @@ func (condition *Condition) generate(objectType Type, field Field) { // Generate condition between the object and the field when the field is a slice func (condition *Condition) generateForSlice(objectType Type, field Field) { - switch elemType := field.Type.Type.(type) { + switch elemType := field.GetType().(type) { case *types.Basic: // slice of basic types ([]string, []int, etc.) // the only one supported directly by gorm is []byte diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index 24987793..1e7f9197 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -60,6 +60,10 @@ func (field Field) getRelatedTypeFKAttribute(structName string) string { return structName + "ID" } +func (field Field) GetType() types.Type { + return field.Type.Type +} + // Get field's type full string (pkg + name) func (field Field) TypeString() string { return field.Type.String() diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index 61831a90..c2c77402 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -74,7 +74,7 @@ func (t Type) HasFK(field Field) (bool, error) { } var ( - scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* interface\{\}\) error$`) + scanMethod = regexp.MustCompile(`func \(\*.*\)\.Scan\([a-zA-Z0-9_-]* (interface\{\}|any)\) error$`) valueMethod = regexp.MustCompile(`func \(.*\)\.Value\(\) \(database/sql/driver\.Value\, error\)$`) ) From 67b1050efa5ff075cd1663a4d55f67493445430a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 14 Jun 2023 13:44:39 +0200 Subject: [PATCH 337/467] in and not in --- badorm/expression.go | 189 ++++++++++++++++++--------------- testintegration/crudService.go | 34 ++++++ 2 files changed, 140 insertions(+), 83 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index 8ce2836f..9ee1387f 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -8,14 +8,20 @@ import ( "github.com/elliotchance/pie/v2" ) +type Expression[T any] interface { + // TODO agregar el metodo de validacion de interface + ToSQL(columnName string) (string, []any) +} + // TODO // string, int, etc. uuid, cualquier custom, time, deletedAt, asi que es any al final // aunque algunos como like y eso solo funcionan para string, el problema es que yo no se si // uno custom va a ir a string o no // podria igual mirar que condiciones les genero y cuales no segun el tipo -type Expression[T any] struct { - Values []T - symbol string +type ValueExpression[T any] struct { + // TODO creo que como no uso T esto no va a verificar nada, aca antes habia []T pero me limita para cosas que no necesariamente comparan contra T como el startsWith + Value any + sqlExpression string } var nullableKinds = []reflect.Kind{ @@ -26,20 +32,14 @@ var nullableKinds = []reflect.Kind{ } // TODO aca me gustaria que devuelva []T pero no me anda asi -func (expr Expression[T]) ToSQL(columnName string) (string, []any) { - // TODO esto se podria hacer pasando expression a interfaz y tener distintos tipos - if len(expr.Values) == 0 { - return fmt.Sprintf("%s %s", columnName, expr.symbol), []any{} - } - - value := expr.Values[0] +func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { // sino que para punteros no haya equal nil? // TODO este chequeo deberia ser solo cuando T es un puntero // TODO y aca que pasa con time, deletedAt, y otros nullables por valuer // TODO que pasa para los demas symbols, puede meterme un null en un lt? // TODO esto esta feo - if expr.symbol == "=" { - reflectVal := reflect.ValueOf(value) + if expr.sqlExpression == "=" { + reflectVal := reflect.ValueOf(expr.Value) isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) // avoid nil is not nil behavior of go if isNullableKind && reflectVal.IsNil() { @@ -50,51 +50,74 @@ func (expr Expression[T]) ToSQL(columnName string) (string, []any) { } } - return fmt.Sprintf("%s %s ?", columnName, expr.symbol), []any{value} + return fmt.Sprintf("%s %s ?", columnName, expr.sqlExpression), []any{expr.Value} } -// Comparison Operators +type PredicateExpression[T any] struct { + // TODO creo que como no uso T esto no va a verificar nada, aca antes habia []T pero me limita para cosas que no necesariamente comparan contra T como el startsWith + sqlExpression string +} + +// TODO aca me gustaria que devuelva []T pero no me anda asi +func (expr PredicateExpression[T]) ToSQL(columnName string) (string, []any) { + return fmt.Sprintf("%s %s", columnName, expr.sqlExpression), []any{} +} +type ArrayExpression[T any] struct { + Values []T + sqlExpression string +} + +func (expr ArrayExpression[T]) ToSQL(columnName string) (string, []any) { + return fmt.Sprintf( + "%s %s ?", + columnName, + expr.sqlExpression, + // TODO testear esto porque no se si gorm igual no lo saca de la lista + ), []any{expr.Values} +} + +// Comparison Operators // TODO aca hay codigo repetido entre los constructores -func Eq[T any](value T) Expression[T] { - return Expression[T]{ - Values: []T{value}, - symbol: "=", +func Eq[T any](value T) ValueExpression[T] { + return ValueExpression[T]{ + Value: value, + sqlExpression: "=", } } -func NotEq[T any](value T) Expression[T] { - return Expression[T]{ - Values: []T{value}, - symbol: "<>", +func NotEq[T any](value T) ValueExpression[T] { + return ValueExpression[T]{ + Value: value, + sqlExpression: "<>", } } -func Lt[T any](value T) Expression[T] { - return Expression[T]{ - Values: []T{value}, - symbol: "<", +func Lt[T any](value T) ValueExpression[T] { + return ValueExpression[T]{ + Value: value, + sqlExpression: "<", } } -func LtOrEq[T any](value T) Expression[T] { - return Expression[T]{ - Values: []T{value}, - symbol: "<=", +func LtOrEq[T any](value T) ValueExpression[T] { + return ValueExpression[T]{ + Value: value, + sqlExpression: "<=", } } -func Gt[T any](value T) Expression[T] { - return Expression[T]{ - Values: []T{value}, - symbol: ">", +func Gt[T any](value T) ValueExpression[T] { + return ValueExpression[T]{ + Value: value, + sqlExpression: ">", } } -func GtOrEq[T any](value T) Expression[T] { - return Expression[T]{ - Values: []T{value}, - symbol: ">=", +func GtOrEq[T any](value T) ValueExpression[T] { + return ValueExpression[T]{ + Value: value, + sqlExpression: ">=", } } @@ -102,85 +125,85 @@ func GtOrEq[T any](value T) Expression[T] { // TODO BETWEEN, NOT BETWEEN -func IsDistinct[T any](value T) Expression[T] { - return Expression[T]{ - Values: []T{value}, - symbol: "IS DISTINCT FROM", +func IsDistinct[T any](value T) ValueExpression[T] { + return ValueExpression[T]{ + Value: value, + sqlExpression: "IS DISTINCT FROM", } } -func IsNotDistinct[T any](value T) Expression[T] { - return Expression[T]{ - Values: []T{value}, - symbol: "IS NOT DISTINCT FROM", +func IsNotDistinct[T any](value T) ValueExpression[T] { + return ValueExpression[T]{ + Value: value, + sqlExpression: "IS NOT DISTINCT FROM", } } // TODO no deberia ser posible para todos, solo los que son nullables // pero como puedo saberlo, los que son pointers?, pero tambien hay otros como deletedAt que pueden ser null por su valuer -func IsNull[T any]() Expression[T] { - return Expression[T]{ - symbol: "IS NULL", +func IsNull[T any]() PredicateExpression[T] { + return PredicateExpression[T]{ + sqlExpression: "IS NULL", } } -func IsNotNull[T any]() Expression[T] { - return Expression[T]{ - symbol: "IS NOT NULL", +func IsNotNull[T any]() PredicateExpression[T] { + return PredicateExpression[T]{ + sqlExpression: "IS NOT NULL", } } // Boolean Comparison Predicates // TODO que pasa con otros que mapean a bool por valuer? -func IsTrue[T bool | *bool | sql.NullBool]() Expression[T] { - return Expression[T]{ - symbol: "IS TRUE", +func IsTrue[T bool | *bool | sql.NullBool]() PredicateExpression[T] { + return PredicateExpression[T]{ + sqlExpression: "IS TRUE", } } -func IsNotTrue[T bool | *bool | sql.NullBool]() Expression[T] { - return Expression[T]{ - symbol: "IS NOT TRUE", +func IsNotTrue[T bool | *bool | sql.NullBool]() PredicateExpression[T] { + return PredicateExpression[T]{ + sqlExpression: "IS NOT TRUE", } } -func IsFalse[T bool | *bool | sql.NullBool]() Expression[T] { - return Expression[T]{ - symbol: "IS FALSE", +func IsFalse[T bool | *bool | sql.NullBool]() PredicateExpression[T] { + return PredicateExpression[T]{ + sqlExpression: "IS FALSE", } } -func IsNotFalse[T bool | *bool | sql.NullBool]() Expression[T] { - return Expression[T]{ - symbol: "IS NOT FALSE", +func IsNotFalse[T bool | *bool | sql.NullBool]() PredicateExpression[T] { + return PredicateExpression[T]{ + sqlExpression: "IS NOT FALSE", } } -func IsUnknown[T *bool | sql.NullBool]() Expression[T] { - return Expression[T]{ - symbol: "IS UNKNOWN", +func IsUnknown[T *bool | sql.NullBool]() PredicateExpression[T] { + return PredicateExpression[T]{ + sqlExpression: "IS UNKNOWN", } } -func IsNotUnknown[T *bool | sql.NullBool]() Expression[T] { - return Expression[T]{ - symbol: "IS NOT UNKNOWN", +func IsNotUnknown[T *bool | sql.NullBool]() PredicateExpression[T] { + return PredicateExpression[T]{ + sqlExpression: "IS NOT UNKNOWN", } } -// // TODO no se a que grupo pertenece +// Row and Array Comparisons -// func In[T []any](values T) Expression[T] { -// return Expression[T]{ -// Value: values, -// symbol: "IN", -// } -// } +func In[T any](values ...T) ArrayExpression[T] { + return ArrayExpression[T]{ + Values: values, + sqlExpression: "IN", + } +} -// func NotIn[T []any](values T) Expression[T] { -// return Expression[T]{ -// Value: values, -// symbol: "NOT IN", -// } -// } +func NotIn[T any](values ...T) ArrayExpression[T] { + return ArrayExpression[T]{ + Values: values, + sqlExpression: "NOT IN", + } +} diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 5f753a34..afe652ab 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -441,6 +441,40 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotUnkn EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIn() { + match1 := ts.createProduct("s1", 0, 0, false, nil) + match2 := ts.createProduct("s2", 0, 0, false, nil) + + ts.createProduct("ns1", 0, 0, false, nil) + ts.createProduct("ns2", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + badorm.In("s1", "s2", "s3"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprNotIn() { + match1 := ts.createProduct("s1", 0, 0, false, nil) + match2 := ts.createProduct("s2", 0, 0, false, nil) + + ts.createProduct("ns1", 0, 0, false, nil) + ts.createProduct("ns2", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + badorm.NotIn("ns1", "ns2"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithMultipleExpressions() { match := ts.createProduct("match", 3, 0, false, nil) ts.createProduct("not_match", 5, 0, false, nil) From e3faf22936de8c668d6f6ae689c6cb41c969e047 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 14 Jun 2023 15:11:28 +0200 Subject: [PATCH 338/467] add array and comparison mysql compatible expressions --- badorm/expression.go | 131 +++------ badorm/mysql/array.go | 46 +++ badorm/mysql/comparison.go | 9 + badorm/psql/array.go | 35 +++ badorm/psql/comparison.go | 13 + testintegration/badorm_test.go | 18 +- testintegration/crudService.go | 340 ---------------------- testintegration/crudUnsafeService_test.go | 4 +- 8 files changed, 151 insertions(+), 445 deletions(-) create mode 100644 badorm/mysql/array.go create mode 100644 badorm/mysql/comparison.go create mode 100644 badorm/psql/array.go create mode 100644 badorm/psql/comparison.go diff --git a/badorm/expression.go b/badorm/expression.go index 9ee1387f..43e733f7 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -21,7 +21,7 @@ type Expression[T any] interface { type ValueExpression[T any] struct { // TODO creo que como no uso T esto no va a verificar nada, aca antes habia []T pero me limita para cosas que no necesariamente comparan contra T como el startsWith Value any - sqlExpression string + SqlExpression string } var nullableKinds = []reflect.Kind{ @@ -38,7 +38,7 @@ func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { // TODO y aca que pasa con time, deletedAt, y otros nullables por valuer // TODO que pasa para los demas symbols, puede meterme un null en un lt? // TODO esto esta feo - if expr.sqlExpression == "=" { + if expr.SqlExpression == "=" { reflectVal := reflect.ValueOf(expr.Value) isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) // avoid nil is not nil behavior of go @@ -50,160 +50,99 @@ func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { } } - return fmt.Sprintf("%s %s ?", columnName, expr.sqlExpression), []any{expr.Value} + return fmt.Sprintf("%s %s ?", columnName, expr.SqlExpression), []any{expr.Value} +} + +func NewValueExpression[T any](value T, sqlExpression string) ValueExpression[T] { + return ValueExpression[T]{ + Value: value, + SqlExpression: sqlExpression, + } } type PredicateExpression[T any] struct { // TODO creo que como no uso T esto no va a verificar nada, aca antes habia []T pero me limita para cosas que no necesariamente comparan contra T como el startsWith - sqlExpression string + SqlExpression string } // TODO aca me gustaria que devuelva []T pero no me anda asi func (expr PredicateExpression[T]) ToSQL(columnName string) (string, []any) { - return fmt.Sprintf("%s %s", columnName, expr.sqlExpression), []any{} -} - -type ArrayExpression[T any] struct { - Values []T - sqlExpression string + return fmt.Sprintf("%s %s", columnName, expr.SqlExpression), []any{} } -func (expr ArrayExpression[T]) ToSQL(columnName string) (string, []any) { - return fmt.Sprintf( - "%s %s ?", - columnName, - expr.sqlExpression, - // TODO testear esto porque no se si gorm igual no lo saca de la lista - ), []any{expr.Values} +func NewPredicateExpression[T any](sqlExpression string) PredicateExpression[T] { + return PredicateExpression[T]{ + SqlExpression: sqlExpression, + } } // Comparison Operators -// TODO aca hay codigo repetido entre los constructores func Eq[T any](value T) ValueExpression[T] { - return ValueExpression[T]{ - Value: value, - sqlExpression: "=", - } + return NewValueExpression(value, "=") } func NotEq[T any](value T) ValueExpression[T] { - return ValueExpression[T]{ - Value: value, - sqlExpression: "<>", - } + return NewValueExpression(value, "<>") } func Lt[T any](value T) ValueExpression[T] { - return ValueExpression[T]{ - Value: value, - sqlExpression: "<", - } + return NewValueExpression(value, "<") } func LtOrEq[T any](value T) ValueExpression[T] { - return ValueExpression[T]{ - Value: value, - sqlExpression: "<=", - } + return NewValueExpression(value, "<=") +} + +// TODO no existe en psql +func NotLt[T any](value T) ValueExpression[T] { + return NewValueExpression(value, "!<") } func Gt[T any](value T) ValueExpression[T] { - return ValueExpression[T]{ - Value: value, - sqlExpression: ">", - } + return NewValueExpression(value, ">") } func GtOrEq[T any](value T) ValueExpression[T] { - return ValueExpression[T]{ - Value: value, - sqlExpression: ">=", - } + return NewValueExpression(value, ">=") } // Comparison Predicates // TODO BETWEEN, NOT BETWEEN -func IsDistinct[T any](value T) ValueExpression[T] { - return ValueExpression[T]{ - Value: value, - sqlExpression: "IS DISTINCT FROM", - } -} - -func IsNotDistinct[T any](value T) ValueExpression[T] { - return ValueExpression[T]{ - Value: value, - sqlExpression: "IS NOT DISTINCT FROM", - } -} - // TODO no deberia ser posible para todos, solo los que son nullables // pero como puedo saberlo, los que son pointers?, pero tambien hay otros como deletedAt que pueden ser null por su valuer func IsNull[T any]() PredicateExpression[T] { - return PredicateExpression[T]{ - sqlExpression: "IS NULL", - } + return NewPredicateExpression[T]("IS NULL") } func IsNotNull[T any]() PredicateExpression[T] { - return PredicateExpression[T]{ - sqlExpression: "IS NOT NULL", - } + return NewPredicateExpression[T]("IS NOT NULL") } // Boolean Comparison Predicates // TODO que pasa con otros que mapean a bool por valuer? func IsTrue[T bool | *bool | sql.NullBool]() PredicateExpression[T] { - return PredicateExpression[T]{ - sqlExpression: "IS TRUE", - } + return NewPredicateExpression[T]("IS TRUE") } func IsNotTrue[T bool | *bool | sql.NullBool]() PredicateExpression[T] { - return PredicateExpression[T]{ - sqlExpression: "IS NOT TRUE", - } + return NewPredicateExpression[T]("IS NOT TRUE") } func IsFalse[T bool | *bool | sql.NullBool]() PredicateExpression[T] { - return PredicateExpression[T]{ - sqlExpression: "IS FALSE", - } + return NewPredicateExpression[T]("IS FALSE") } func IsNotFalse[T bool | *bool | sql.NullBool]() PredicateExpression[T] { - return PredicateExpression[T]{ - sqlExpression: "IS NOT FALSE", - } + return NewPredicateExpression[T]("IS NOT FALSE") } func IsUnknown[T *bool | sql.NullBool]() PredicateExpression[T] { - return PredicateExpression[T]{ - sqlExpression: "IS UNKNOWN", - } + return NewPredicateExpression[T]("IS UNKNOWN") } func IsNotUnknown[T *bool | sql.NullBool]() PredicateExpression[T] { - return PredicateExpression[T]{ - sqlExpression: "IS NOT UNKNOWN", - } -} - -// Row and Array Comparisons - -func In[T any](values ...T) ArrayExpression[T] { - return ArrayExpression[T]{ - Values: values, - sqlExpression: "IN", - } -} - -func NotIn[T any](values ...T) ArrayExpression[T] { - return ArrayExpression[T]{ - Values: values, - sqlExpression: "NOT IN", - } + return NewPredicateExpression[T]("IS NOT UNKNOWN") } diff --git a/badorm/mysql/array.go b/badorm/mysql/array.go new file mode 100644 index 00000000..e7cf9da5 --- /dev/null +++ b/badorm/mysql/array.go @@ -0,0 +1,46 @@ +package mysql + +import ( + "fmt" + "strings" + + "github.com/elliotchance/pie/v2" +) + +// Row and Array Comparisons + +type ArrayExpression[T any] struct { + Values []T + SqlExpression string +} + +func NewArrayExpression[T any](values []T, sqlExpression string) ArrayExpression[T] { + return ArrayExpression[T]{ + Values: values, + SqlExpression: sqlExpression, + } +} + +func (expr ArrayExpression[T]) ToSQL(columnName string) (string, []any) { + placeholders := strings.Join(pie.Map(expr.Values, func(value T) string { + return "?" + }), ", ") + + values := pie.Map(expr.Values, func(value T) any { + return value + }) + + return fmt.Sprintf( + "%s %s ("+placeholders+")", + columnName, + expr.SqlExpression, + ), values +} + +func ArrayIn[T any](values ...T) ArrayExpression[T] { + return NewArrayExpression(values, "IN") +} + +func ArrayNotIn[T any](values ...T) ArrayExpression[T] { + return NewArrayExpression(values, "NOT IN") +} diff --git a/badorm/mysql/comparison.go b/badorm/mysql/comparison.go new file mode 100644 index 00000000..2c9470c5 --- /dev/null +++ b/badorm/mysql/comparison.go @@ -0,0 +1,9 @@ +package mysql + +import "github.com/ditrit/badaas/badorm" + +// Comparison Predicates + +func IsEqual[T any](value T) badorm.ValueExpression[T] { + return badorm.NewValueExpression(value, "<=>") +} diff --git a/badorm/psql/array.go b/badorm/psql/array.go new file mode 100644 index 00000000..468f8999 --- /dev/null +++ b/badorm/psql/array.go @@ -0,0 +1,35 @@ +package psql + +import ( + "fmt" +) + +// Row and Array Comparisons + +type ArrayExpression[T any] struct { + Values []T + SqlExpression string +} + +func NewArrayExpression[T any](values []T, sqlExpression string) ArrayExpression[T] { + return ArrayExpression[T]{ + Values: values, + SqlExpression: sqlExpression, + } +} + +func (expr ArrayExpression[T]) ToSQL(columnName string) (string, []any) { + return fmt.Sprintf( + "%s %s ?", + columnName, + expr.SqlExpression, + ), []any{expr.Values} +} + +func ArrayIn[T any](values ...T) ArrayExpression[T] { + return NewArrayExpression(values, "IN") +} + +func ArrayNotIn[T any](values ...T) ArrayExpression[T] { + return NewArrayExpression(values, "NOT IN") +} diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go new file mode 100644 index 00000000..e4049f81 --- /dev/null +++ b/badorm/psql/comparison.go @@ -0,0 +1,13 @@ +package psql + +import "github.com/ditrit/badaas/badorm" + +// Comparison Predicates + +func IsDistinct[T any](value T) badorm.ValueExpression[T] { + return badorm.NewValueExpression(value, "IS DISTINCT FROM") +} + +func IsNotDistinct[T any](value T) badorm.ValueExpression[T] { + return badorm.NewValueExpression(value, "IS NOT DISTINCT FROM") +} diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index e7619e25..011f0316 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -70,6 +70,7 @@ func TestBaDORM(t *testing.T) { fx.Provide(NewCRUDServiceIntTestSuite), fx.Provide(NewCRUDUnsafeServiceIntTestSuite), fx.Provide(NewCRUDRepositoryIntTestSuite), + fx.Provide(NewExpressionsIntTestSuite), fx.Invoke(runBaDORMTestSuites), ).Run() @@ -79,11 +80,13 @@ func runBaDORMTestSuites( tsCRUDService *CRUDServiceIntTestSuite, tsCRUDRepository *CRUDRepositoryIntTestSuite, tsCRUDUnsafeService *CRUDUnsafeServiceIntTestSuite, + tsExpressions *ExpressionIntTestSuite, shutdowner fx.Shutdowner, ) { - suite.Run(tGlobal, tsCRUDService) - suite.Run(tGlobal, tsCRUDRepository) - suite.Run(tGlobal, tsCRUDUnsafeService) + // suite.Run(tGlobal, tsCRUDService) + // suite.Run(tGlobal, tsCRUDRepository) + // suite.Run(tGlobal, tsCRUDUnsafeService) + suite.Run(tGlobal, tsExpressions) shutdowner.Shutdown() } @@ -94,8 +97,7 @@ func NewLoggerConfiguration() configuration.LoggerConfiguration { } func NewGormDBConnection(zapLogger *zap.Logger) (*gorm.DB, error) { - dbType := configuration.DBDialector(os.Getenv(dbTypeEnvKey)) - switch dbType { + switch getDBDialector() { case configuration.PostgreSQL: return badorm.ConnectToDialector( zapLogger, @@ -121,6 +123,10 @@ func NewGormDBConnection(zapLogger *zap.Logger) (*gorm.DB, error) { 10, time.Duration(5)*time.Second, ) default: - return nil, fmt.Errorf("unknown db %s", dbType) + return nil, fmt.Errorf("unknown db %s", getDBDialector()) } } + +func getDBDialector() configuration.DBDialector { + return configuration.DBDialector(os.Getenv(dbTypeEnvKey)) +} diff --git a/testintegration/crudService.go b/testintegration/crudService.go index afe652ab..3a2c13ca 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -1,8 +1,6 @@ package testintegration import ( - "database/sql" - "gorm.io/gorm" "gotest.tools/assert" @@ -171,327 +169,6 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeNotEq() { - match1 := ts.createProduct("match", 1, 0, false, nil) - match2 := ts.createProduct("match", 3, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.NotEq(2), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeLt() { - match1 := ts.createProduct("match", 1, 0, false, nil) - match2 := ts.createProduct("match", 2, 0, false, nil) - ts.createProduct("not_match", 3, 0, false, nil) - ts.createProduct("not_match", 4, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.Lt(3), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeLtOrEq() { - match1 := ts.createProduct("match", 1, 0, false, nil) - match2 := ts.createProduct("match", 2, 0, false, nil) - ts.createProduct("not_match", 3, 0, false, nil) - ts.createProduct("not_match", 4, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.LtOrEq(2), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeGt() { - match1 := ts.createProduct("match", 3, 0, false, nil) - match2 := ts.createProduct("match", 4, 0, false, nil) - ts.createProduct("not_match", 1, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.Gt(2), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntTypeGtOrEq() { - match1 := ts.createProduct("match", 3, 0, false, nil) - match2 := ts.createProduct("match", 4, 0, false, nil) - ts.createProduct("not_match", 1, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.GtOrEq(3), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsDistinct() { - match1 := ts.createProduct("match", 3, 0, false, nil) - match2 := ts.createProduct("match", 4, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.IsDistinct(2), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotDistinct() { - match := ts.createProduct("match", 3, 0, false, nil) - ts.createProduct("not_match", 4, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.IsNotDistinct(3), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNull() { - match := ts.createProduct("match", 0, 0, false, nil) - int1 := 1 - int2 := 2 - ts.createProduct("not_match", 0, 0, false, &int1) - ts.createProduct("not_match", 0, 0, false, &int2) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductIntPointer( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsNull[*int](), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotNull() { - int1 := 1 - match := ts.createProduct("match", 0, 0, false, &int1) - ts.createProduct("not_match", 0, 0, false, nil) - ts.createProduct("not_match", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductIntPointer( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsNotNull[*int](), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsTrue() { - match := ts.createProduct("match", 0, 0, true, nil) - ts.createProduct("not_match", 0, 0, false, nil) - ts.createProduct("not_match", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsTrue[bool](), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsFalse() { - match := ts.createProduct("match", 0, 0, false, nil) - ts.createProduct("not_match", 0, 0, true, nil) - ts.createProduct("not_match", 0, 0, true, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsFalse[bool](), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotTrue() { - match1 := ts.createProduct("match", 0, 0, false, nil) - match2 := ts.createProduct("match", 0, 0, false, nil) - match2.NullBool = sql.NullBool{Valid: true, Bool: false} - err := ts.db.Save(match2).Error - ts.Nil(err) - - notMatch := ts.createProduct("not_match", 0, 0, false, nil) - notMatch.NullBool = sql.NullBool{Valid: true, Bool: true} - err = ts.db.Save(notMatch).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductNullBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsNotTrue[sql.NullBool](), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotFalse() { - match1 := ts.createProduct("match", 0, 0, false, nil) - match2 := ts.createProduct("match", 0, 0, false, nil) - match2.NullBool = sql.NullBool{Valid: true, Bool: true} - err := ts.db.Save(match2).Error - ts.Nil(err) - - notMatch := ts.createProduct("not_match", 0, 0, false, nil) - notMatch.NullBool = sql.NullBool{Valid: true, Bool: false} - err = ts.db.Save(notMatch).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductNullBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsNotFalse[sql.NullBool](), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsUnknown() { - match := ts.createProduct("match", 0, 0, false, nil) - - notMatch1 := ts.createProduct("match", 0, 0, false, nil) - notMatch1.NullBool = sql.NullBool{Valid: true, Bool: true} - err := ts.db.Save(notMatch1).Error - ts.Nil(err) - - notMatch2 := ts.createProduct("not_match", 0, 0, false, nil) - notMatch2.NullBool = sql.NullBool{Valid: true, Bool: false} - err = ts.db.Save(notMatch2).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductNullBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsUnknown[sql.NullBool](), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIsNotUnknown() { - match1 := ts.createProduct("", 0, 0, false, nil) - match1.NullBool = sql.NullBool{Valid: true, Bool: true} - err := ts.db.Save(match1).Error - ts.Nil(err) - - match2 := ts.createProduct("", 0, 0, false, nil) - match2.NullBool = sql.NullBool{Valid: true, Bool: false} - err = ts.db.Save(match2).Error - ts.Nil(err) - - ts.createProduct("", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductNullBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsNotUnknown[sql.NullBool](), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprIn() { - match1 := ts.createProduct("s1", 0, 0, false, nil) - match2 := ts.createProduct("s2", 0, 0, false, nil) - - ts.createProduct("ns1", 0, 0, false, nil) - ts.createProduct("ns2", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString( - badorm.In("s1", "s2", "s3"), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithExprNotIn() { - match1 := ts.createProduct("s1", 0, 0, false, nil) - match2 := ts.createProduct("s2", 0, 0, false, nil) - - ts.createProduct("ns1", 0, 0, false, nil) - ts.createProduct("ns2", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString( - badorm.NotIn("ns1", "ns2"), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionWithMultipleExpressions() { - match := ts.createProduct("match", 3, 0, false, nil) - ts.createProduct("not_match", 5, 0, false, nil) - ts.createProduct("not_match", 1, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.GtOrEq(3), - badorm.LtOrEq(4), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { match := ts.createProduct("match", 0, 1.1, false, nil) ts.createProduct("not_match", 0, 2.2, false, nil) @@ -537,23 +214,6 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDiffer EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWithDifferentExpressionsWorks() { - match1 := ts.createProduct("match", 1, 0.0, true, nil) - match2 := ts.createProduct("match", 1, 0.0, true, nil) - - ts.createProduct("not_match", 1, 0.0, true, nil) - ts.createProduct("match", 2, 0.0, true, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString(badorm.Eq("match")), - conditions.ProductInt(badorm.Lt(2)), - conditions.ProductBool(badorm.NotEq(false)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfID() { match := ts.createProduct("", 0, 0.0, false, nil) ts.createProduct("", 0, 0.0, false, nil) diff --git a/testintegration/crudUnsafeService_test.go b/testintegration/crudUnsafeService_test.go index f29a00d0..f27f5bbc 100644 --- a/testintegration/crudUnsafeService_test.go +++ b/testintegration/crudUnsafeService_test.go @@ -1,8 +1,6 @@ package testintegration import ( - "os" - "gorm.io/gorm" "github.com/ditrit/badaas/badorm" @@ -160,7 +158,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfInc } result, err := ts.crudProductService.GetEntities(params) - switch configuration.DBDialector(os.Getenv(dbTypeEnvKey)) { + switch getDBDialector() { case configuration.MySQL, configuration.SQLite: // mysql and sqlite simply matches nothing ts.Nil(err) From 9d0bc528c0532a9c66f423d33ba1470e67f8a3f5 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 14 Jun 2023 15:11:54 +0200 Subject: [PATCH 339/467] fix: add forgoten test file --- testintegration/expressions_test.go | 413 ++++++++++++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 testintegration/expressions_test.go diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go new file mode 100644 index 00000000..dd775b77 --- /dev/null +++ b/testintegration/expressions_test.go @@ -0,0 +1,413 @@ +package testintegration + +import ( + "database/sql" + "log" + + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/mysql" + "github.com/ditrit/badaas/badorm/psql" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/testintegration/conditions" + "github.com/ditrit/badaas/testintegration/models" +) + +type ExpressionIntTestSuite struct { + CRUDServiceCommonIntTestSuite + crudProductService badorm.CRUDService[models.Product, badorm.UUID] +} + +func NewExpressionsIntTestSuite( + db *gorm.DB, + crudProductService badorm.CRUDService[models.Product, badorm.UUID], +) *ExpressionIntTestSuite { + return &ExpressionIntTestSuite{ + CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ + db: db, + }, + crudProductService: crudProductService, + } +} + +func (ts *ExpressionIntTestSuite) TestNotEq() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 3, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.NotEq(2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestLt() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 2, 0, false, nil) + ts.createProduct("not_match", 3, 0, false, nil) + ts.createProduct("not_match", 4, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Lt(3), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestLtOrEq() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 2, 0, false, nil) + ts.createProduct("not_match", 3, 0, false, nil) + ts.createProduct("not_match", 4, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.LtOrEq(2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestGt() { + match1 := ts.createProduct("match", 3, 0, false, nil) + match2 := ts.createProduct("match", 4, 0, false, nil) + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Gt(2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestGtOrEq() { + match1 := ts.createProduct("match", 3, 0, false, nil) + match2 := ts.createProduct("match", 4, 0, false, nil) + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.GtOrEq(3), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsDistinct() { + match1 := ts.createProduct("match", 3, 0, false, nil) + match2 := ts.createProduct("match", 4, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + switch getDBDialector() { + case configuration.PostgreSQL: + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + psql.IsDistinct(2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + default: + // TODO + log.Println("TODO") + } +} + +func (ts *ExpressionIntTestSuite) TestIsNotDistinct() { + match := ts.createProduct("match", 3, 0, false, nil) + ts.createProduct("not_match", 4, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + var isNotEqualExpression badorm.Expression[int] + + switch getDBDialector() { + case configuration.MySQL: + isNotEqualExpression = mysql.IsEqual(3) + case configuration.PostgreSQL: + isNotEqualExpression = psql.IsNotDistinct(3) + default: + // TODO esto no va a andar en todos + isNotEqualExpression = psql.IsNotDistinct(3) + } + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + isNotEqualExpression, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsNull() { + match := ts.createProduct("match", 0, 0, false, nil) + int1 := 1 + int2 := 2 + + ts.createProduct("not_match", 0, 0, false, &int1) + ts.createProduct("not_match", 0, 0, false, &int2) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductIntPointer( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNull[*int](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsNotNull() { + int1 := 1 + match := ts.createProduct("match", 0, 0, false, &int1) + ts.createProduct("not_match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductIntPointer( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNotNull[*int](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsTrue() { + match := ts.createProduct("match", 0, 0, true, nil) + ts.createProduct("not_match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsTrue[bool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsFalse() { + match := ts.createProduct("match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, true, nil) + ts.createProduct("not_match", 0, 0, true, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsFalse[bool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsNotTrue() { + match1 := ts.createProduct("match", 0, 0, false, nil) + match2 := ts.createProduct("match", 0, 0, false, nil) + match2.NullBool = sql.NullBool{Valid: true, Bool: false} + err := ts.db.Save(match2).Error + ts.Nil(err) + + notMatch := ts.createProduct("not_match", 0, 0, false, nil) + notMatch.NullBool = sql.NullBool{Valid: true, Bool: true} + err = ts.db.Save(notMatch).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNotTrue[sql.NullBool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsNotFalse() { + match1 := ts.createProduct("match", 0, 0, false, nil) + match2 := ts.createProduct("match", 0, 0, false, nil) + match2.NullBool = sql.NullBool{Valid: true, Bool: true} + err := ts.db.Save(match2).Error + ts.Nil(err) + + notMatch := ts.createProduct("not_match", 0, 0, false, nil) + notMatch.NullBool = sql.NullBool{Valid: true, Bool: false} + err = ts.db.Save(notMatch).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNotFalse[sql.NullBool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsUnknown() { + match := ts.createProduct("match", 0, 0, false, nil) + + notMatch1 := ts.createProduct("match", 0, 0, false, nil) + notMatch1.NullBool = sql.NullBool{Valid: true, Bool: true} + err := ts.db.Save(notMatch1).Error + ts.Nil(err) + + notMatch2 := ts.createProduct("not_match", 0, 0, false, nil) + notMatch2.NullBool = sql.NullBool{Valid: true, Bool: false} + err = ts.db.Save(notMatch2).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsUnknown[sql.NullBool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsNotUnknown() { + match1 := ts.createProduct("", 0, 0, false, nil) + match1.NullBool = sql.NullBool{Valid: true, Bool: true} + err := ts.db.Save(match1).Error + ts.Nil(err) + + match2 := ts.createProduct("", 0, 0, false, nil) + match2.NullBool = sql.NullBool{Valid: true, Bool: false} + err = ts.db.Save(match2).Error + ts.Nil(err) + + ts.createProduct("", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullBool( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNotUnknown[sql.NullBool](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestArrayIn() { + match1 := ts.createProduct("s1", 0, 0, false, nil) + match2 := ts.createProduct("s2", 0, 0, false, nil) + + ts.createProduct("ns1", 0, 0, false, nil) + ts.createProduct("ns2", 0, 0, false, nil) + + var arrayInExpression badorm.Expression[string] + + switch getDBDialector() { + case configuration.MySQL: + arrayInExpression = mysql.ArrayIn("s1", "s2", "s3") + case configuration.PostgreSQL: + arrayInExpression = psql.ArrayIn("s1", "s2", "s3") + default: + // TODO esto no va a andar en todos + arrayInExpression = psql.ArrayIn("s1", "s2", "s3") + } + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + arrayInExpression, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestArrayNotIn() { + match1 := ts.createProduct("s1", 0, 0, false, nil) + match2 := ts.createProduct("s2", 0, 0, false, nil) + + ts.createProduct("ns1", 0, 0, false, nil) + ts.createProduct("ns2", 0, 0, false, nil) + + var arrayNotInExpression badorm.Expression[string] + + switch getDBDialector() { + case configuration.MySQL: + arrayNotInExpression = mysql.ArrayNotIn("ns1", "ns2") + case configuration.PostgreSQL: + arrayNotInExpression = psql.ArrayNotIn("ns1", "ns2") + default: + // TODO esto no va a andar en todos + arrayNotInExpression = psql.ArrayNotIn("ns1", "ns2") + } + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + arrayNotInExpression, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestMultipleExpressions() { + match := ts.createProduct("match", 3, 0, false, nil) + ts.createProduct("not_match", 5, 0, false, nil) + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.GtOrEq(3), + badorm.LtOrEq(4), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestMultipleConditionsDifferentExpressions() { + match1 := ts.createProduct("match", 1, 0.0, true, nil) + match2 := ts.createProduct("match", 1, 0.0, true, nil) + + ts.createProduct("not_match", 1, 0.0, true, nil) + ts.createProduct("match", 2, 0.0, true, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString(badorm.Eq("match")), + conditions.ProductInt(badorm.Lt(2)), + conditions.ProductBool(badorm.NotEq(false)), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} From aeec491b51f6286e32bc8f1f2a110ef6fa9e4a19 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 14 Jun 2023 15:20:39 +0200 Subject: [PATCH 340/467] fix user email condition --- persistence/models/User.go | 8 ++++---- services/userservice/userservice.go | 2 +- services/userservice/userservice_test.go | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/persistence/models/User.go b/persistence/models/User.go index c704eb77..f24c4dd1 100644 --- a/persistence/models/User.go +++ b/persistence/models/User.go @@ -12,9 +12,9 @@ type User struct { Password []byte `gorm:"not null"` } -func UserEmailCondition(email string) badorm.Condition[User] { - return badorm.WhereCondition[User]{ - Field: "email", - Value: email, +func UserEmailCondition(exprs ...badorm.Expression[string]) badorm.FieldCondition[User, string] { + return badorm.FieldCondition[User, string]{ + Expressions: exprs, + Field: "Email", } } diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index 68cfb1bb..bccbe92c 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -76,7 +76,7 @@ func (userService *userServiceImpl) NewUser(username, email, password string) (* func (userService *userServiceImpl) GetUser(userLoginDTO dto.UserLoginDTO) (*models.User, error) { user, err := userService.userRepository.Get( userService.db, - models.UserEmailCondition(userLoginDTO.Email), + models.UserEmailCondition(badorm.Eq(userLoginDTO.Email)), ) if err != nil { return nil, err diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index 0762b81f..d106d69a 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -99,7 +99,7 @@ func TestGetUser(t *testing.T) { require.NoError(t, err) userRepositoryMock.On( - "Get", gormDB, models.UserEmailCondition("bob@email.com"), + "Get", gormDB, models.UserEmailCondition(badorm.Eq("bob@email.com")), ).Return( user, nil, @@ -127,7 +127,7 @@ func TestGetUserNoUserFound(t *testing.T) { userRepositoryMock := badormMocks.NewCRUDRepository[models.User, badorm.UUID](t) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) userRepositoryMock.On( - "Get", gormDB, models.UserEmailCondition("bobnotfound@email.com"), + "Get", gormDB, models.UserEmailCondition(badorm.Eq("bobnotfound@email.com")), ).Return( &models.User{}, badorm.ErrObjectNotFound, @@ -154,7 +154,7 @@ func TestGetUserWrongPassword(t *testing.T) { require.NoError(t, err) userRepositoryMock.On( - "Get", gormDB, models.UserEmailCondition("bob@email.com"), + "Get", gormDB, models.UserEmailCondition(badorm.Eq("bob@email.com")), ).Return( user, nil, From 7a6a48b6dec0e0e443967b94906514473d62f4a8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 14 Jun 2023 15:23:01 +0200 Subject: [PATCH 341/467] fix int tests --- testintegration/badorm_test.go | 6 +++--- testintegration/crudRepository.go | 10 ++++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index 011f0316..02749be8 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -83,9 +83,9 @@ func runBaDORMTestSuites( tsExpressions *ExpressionIntTestSuite, shutdowner fx.Shutdowner, ) { - // suite.Run(tGlobal, tsCRUDService) - // suite.Run(tGlobal, tsCRUDRepository) - // suite.Run(tGlobal, tsCRUDUnsafeService) + suite.Run(tGlobal, tsCRUDService) + suite.Run(tGlobal, tsCRUDRepository) + suite.Run(tGlobal, tsCRUDUnsafeService) suite.Run(tGlobal, tsExpressions) shutdowner.Shutdown() diff --git a/testintegration/crudRepository.go b/testintegration/crudRepository.go index a24dfcff..9aecf67f 100644 --- a/testintegration/crudRepository.go +++ b/testintegration/crudRepository.go @@ -55,13 +55,19 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetByIDReturnsEntityIfIDMatch() { func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsErrorIfConditionsDontMatch() { ts.createProduct(0) - _, err := ts.crudProductRepository.Get(ts.db, conditions.ProductInt(1)) + _, err := ts.crudProductRepository.Get( + ts.db, + conditions.ProductInt(badorm.Eq(1)), + ) ts.Error(err, gorm.ErrRecordNotFound) } func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsEntityIfConditionsMatch() { product := ts.createProduct(1) - productReturned, err := ts.crudProductRepository.Get(ts.db, conditions.ProductInt(1)) + productReturned, err := ts.crudProductRepository.Get( + ts.db, + conditions.ProductInt(badorm.Eq(1)), + ) ts.Nil(err) assert.DeepEqual(ts.T(), product, productReturned) From d7290e898eebb6b8316346b5a51f3c0afd28e7fc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 14 Jun 2023 15:28:54 +0200 Subject: [PATCH 342/467] fix lint --- badorm/condition.go | 10 +++++----- badorm/expression.go | 20 +++++++++++--------- badorm/mysql/array.go | 6 +++--- badorm/psql/array.go | 6 +++--- testintegration/expressions_test.go | 8 ++++---- 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 3aab4578..a4a782d8 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -85,7 +85,8 @@ func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table values := []any{} for index, expression := range condition.Expressions { - // TODO que se pueda hacer la connexion distinta aca + // TODO que se pueda hacer la connection distinta aca + // TODO strings.Join(exprs, " AND ")? if index != 0 { conditionString += " AND " } @@ -198,11 +199,10 @@ func divideConditionsByType[T any]( switch condition.Type() { case WhereType: typedCondition, ok := condition.(WhereCondition[T]) - if !ok { - // TODO no se que hacer aca + if ok { + // TODO ver si dejo asi + thisEntityConditions = append(thisEntityConditions, typedCondition) } - - thisEntityConditions = append(thisEntityConditions, typedCondition) case JoinType: joinConditions = append(joinConditions, condition) } diff --git a/badorm/expression.go b/badorm/expression.go index 43e733f7..b9510e4b 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -19,9 +19,10 @@ type Expression[T any] interface { // uno custom va a ir a string o no // podria igual mirar que condiciones les genero y cuales no segun el tipo type ValueExpression[T any] struct { - // TODO creo que como no uso T esto no va a verificar nada, aca antes habia []T pero me limita para cosas que no necesariamente comparan contra T como el startsWith + // TODO creo que como no uso T esto no va a verificar nada, + // aca antes habia []T pero me limita para cosas que no necesariamente comparan contra T como el startsWith Value any - SqlExpression string + SQLExpression string } var nullableKinds = []reflect.Kind{ @@ -38,7 +39,7 @@ func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { // TODO y aca que pasa con time, deletedAt, y otros nullables por valuer // TODO que pasa para los demas symbols, puede meterme un null en un lt? // TODO esto esta feo - if expr.SqlExpression == "=" { + if expr.SQLExpression == "=" { reflectVal := reflect.ValueOf(expr.Value) isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) // avoid nil is not nil behavior of go @@ -50,29 +51,30 @@ func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { } } - return fmt.Sprintf("%s %s ?", columnName, expr.SqlExpression), []any{expr.Value} + return fmt.Sprintf("%s %s ?", columnName, expr.SQLExpression), []any{expr.Value} } func NewValueExpression[T any](value T, sqlExpression string) ValueExpression[T] { return ValueExpression[T]{ Value: value, - SqlExpression: sqlExpression, + SQLExpression: sqlExpression, } } type PredicateExpression[T any] struct { - // TODO creo que como no uso T esto no va a verificar nada, aca antes habia []T pero me limita para cosas que no necesariamente comparan contra T como el startsWith - SqlExpression string + // TODO creo que como no uso T esto no va a verificar nada, + // aca antes habia []T pero me limita para cosas que no necesariamente comparan contra T como el startsWith + SQLExpression string } // TODO aca me gustaria que devuelva []T pero no me anda asi func (expr PredicateExpression[T]) ToSQL(columnName string) (string, []any) { - return fmt.Sprintf("%s %s", columnName, expr.SqlExpression), []any{} + return fmt.Sprintf("%s %s", columnName, expr.SQLExpression), []any{} } func NewPredicateExpression[T any](sqlExpression string) PredicateExpression[T] { return PredicateExpression[T]{ - SqlExpression: sqlExpression, + SQLExpression: sqlExpression, } } diff --git a/badorm/mysql/array.go b/badorm/mysql/array.go index e7cf9da5..9672a995 100644 --- a/badorm/mysql/array.go +++ b/badorm/mysql/array.go @@ -11,13 +11,13 @@ import ( type ArrayExpression[T any] struct { Values []T - SqlExpression string + SQLExpression string } func NewArrayExpression[T any](values []T, sqlExpression string) ArrayExpression[T] { return ArrayExpression[T]{ Values: values, - SqlExpression: sqlExpression, + SQLExpression: sqlExpression, } } @@ -33,7 +33,7 @@ func (expr ArrayExpression[T]) ToSQL(columnName string) (string, []any) { return fmt.Sprintf( "%s %s ("+placeholders+")", columnName, - expr.SqlExpression, + expr.SQLExpression, ), values } diff --git a/badorm/psql/array.go b/badorm/psql/array.go index 468f8999..a817c1c4 100644 --- a/badorm/psql/array.go +++ b/badorm/psql/array.go @@ -8,13 +8,13 @@ import ( type ArrayExpression[T any] struct { Values []T - SqlExpression string + SQLExpression string } func NewArrayExpression[T any](values []T, sqlExpression string) ArrayExpression[T] { return ArrayExpression[T]{ Values: values, - SqlExpression: sqlExpression, + SQLExpression: sqlExpression, } } @@ -22,7 +22,7 @@ func (expr ArrayExpression[T]) ToSQL(columnName string) (string, []any) { return fmt.Sprintf( "%s %s ?", columnName, - expr.SqlExpression, + expr.SQLExpression, ), []any{expr.Values} } diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index dd775b77..e68af4de 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -125,7 +125,7 @@ func (ts *ExpressionIntTestSuite) TestIsDistinct() { ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) - default: + case configuration.MySQL, configuration.SQLServer, configuration.SQLite: // TODO log.Println("TODO") } @@ -143,7 +143,7 @@ func (ts *ExpressionIntTestSuite) TestIsNotDistinct() { isNotEqualExpression = mysql.IsEqual(3) case configuration.PostgreSQL: isNotEqualExpression = psql.IsNotDistinct(3) - default: + case configuration.SQLServer, configuration.SQLite: // TODO esto no va a andar en todos isNotEqualExpression = psql.IsNotDistinct(3) } @@ -334,7 +334,7 @@ func (ts *ExpressionIntTestSuite) TestArrayIn() { arrayInExpression = mysql.ArrayIn("s1", "s2", "s3") case configuration.PostgreSQL: arrayInExpression = psql.ArrayIn("s1", "s2", "s3") - default: + case configuration.SQLServer, configuration.SQLite: // TODO esto no va a andar en todos arrayInExpression = psql.ArrayIn("s1", "s2", "s3") } @@ -363,7 +363,7 @@ func (ts *ExpressionIntTestSuite) TestArrayNotIn() { arrayNotInExpression = mysql.ArrayNotIn("ns1", "ns2") case configuration.PostgreSQL: arrayNotInExpression = psql.ArrayNotIn("ns1", "ns2") - default: + case configuration.SQLServer, configuration.SQLite: // TODO esto no va a andar en todos arrayNotInExpression = psql.ArrayNotIn("ns1", "ns2") } From 9ea48f81e3084d612b38caa1f2378415e480a730 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 14 Jun 2023 16:37:03 +0200 Subject: [PATCH 343/467] fix unit tests --- .../conditions/tests/results/basicpointers.go | 176 +++++++++--------- .../conditions/tests/results/basicslices.go | 176 +++++++++--------- .../tests/results/basicslicespointer.go | 176 +++++++++--------- .../conditions/tests/results/basictypes.go | 176 +++++++++--------- .../tests/results/belongsto_owned.go | 40 ++-- .../tests/results/belongsto_owner.go | 32 ++-- .../tests/results/columndefinition.go | 40 ++-- .../conditions/tests/results/customtype.go | 40 ++-- .../conditions/tests/results/goembedded.go | 40 ++-- .../conditions/tests/results/gormembedded.go | 38 ++-- .../tests/results/hasmany_company.go | 32 ++-- .../tests/results/hasmany_seller.go | 40 ++-- .../conditions/tests/results/hasone_city.go | 40 ++-- .../tests/results/hasone_country.go | 32 ++-- .../tests/results/multiplepackage_package1.go | 32 ++-- .../tests/results/overrideforeignkey.go | 40 ++-- .../results/overrideforeignkeyinverse.go | 32 ++-- .../tests/results/overridereferences.go | 40 ++-- .../results/overridereferencesinverse.go | 40 ++-- .../tests/results/selfreferential.go | 40 ++-- .../gen/conditions/tests/results/uintmodel.go | 32 ++-- .../gen/conditions/tests/results/uuidmodel.go | 32 ++-- 22 files changed, 683 insertions(+), 683 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go index f0cdeb2b..0a3bf28c 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go @@ -8,135 +8,135 @@ import ( "time" ) -func BasicPointersId(v badorm.UUID) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "ID", - Value: v, +func BasicPointersId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[basicpointers.BasicPointers, badorm.UUID] { + return badorm.FieldCondition[basicpointers.BasicPointers, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func BasicPointersCreatedAt(v time.Time) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "CreatedAt", - Value: v, +func BasicPointersCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicpointers.BasicPointers, time.Time] { + return badorm.FieldCondition[basicpointers.BasicPointers, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func BasicPointersUpdatedAt(v time.Time) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "UpdatedAt", - Value: v, +func BasicPointersUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicpointers.BasicPointers, time.Time] { + return badorm.FieldCondition[basicpointers.BasicPointers, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func BasicPointersDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "DeletedAt", - Value: v, +func BasicPointersDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[basicpointers.BasicPointers, gorm.DeletedAt] { + return badorm.FieldCondition[basicpointers.BasicPointers, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func BasicPointersBool(v *bool) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Bool", - Value: v, +func BasicPointersBool(exprs ...badorm.Expression[*bool]) badorm.FieldCondition[basicpointers.BasicPointers, *bool] { + return badorm.FieldCondition[basicpointers.BasicPointers, *bool]{ + Expressions: exprs, + Field: "Bool", } } -func BasicPointersInt(v *int) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Int", - Value: v, +func BasicPointersInt(exprs ...badorm.Expression[*int]) badorm.FieldCondition[basicpointers.BasicPointers, *int] { + return badorm.FieldCondition[basicpointers.BasicPointers, *int]{ + Expressions: exprs, + Field: "Int", } } -func BasicPointersInt8(v *int8) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Int8", - Value: v, +func BasicPointersInt8(exprs ...badorm.Expression[*int8]) badorm.FieldCondition[basicpointers.BasicPointers, *int8] { + return badorm.FieldCondition[basicpointers.BasicPointers, *int8]{ + Expressions: exprs, + Field: "Int8", } } -func BasicPointersInt16(v *int16) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Int16", - Value: v, +func BasicPointersInt16(exprs ...badorm.Expression[*int16]) badorm.FieldCondition[basicpointers.BasicPointers, *int16] { + return badorm.FieldCondition[basicpointers.BasicPointers, *int16]{ + Expressions: exprs, + Field: "Int16", } } -func BasicPointersInt32(v *int32) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Int32", - Value: v, +func BasicPointersInt32(exprs ...badorm.Expression[*int32]) badorm.FieldCondition[basicpointers.BasicPointers, *int32] { + return badorm.FieldCondition[basicpointers.BasicPointers, *int32]{ + Expressions: exprs, + Field: "Int32", } } -func BasicPointersInt64(v *int64) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Int64", - Value: v, +func BasicPointersInt64(exprs ...badorm.Expression[*int64]) badorm.FieldCondition[basicpointers.BasicPointers, *int64] { + return badorm.FieldCondition[basicpointers.BasicPointers, *int64]{ + Expressions: exprs, + Field: "Int64", } } -func BasicPointersUInt(v *uint) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "UInt", - Value: v, +func BasicPointersUInt(exprs ...badorm.Expression[*uint]) badorm.FieldCondition[basicpointers.BasicPointers, *uint] { + return badorm.FieldCondition[basicpointers.BasicPointers, *uint]{ + Expressions: exprs, + Field: "UInt", } } -func BasicPointersUInt8(v *uint8) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "UInt8", - Value: v, +func BasicPointersUInt8(exprs ...badorm.Expression[*uint8]) badorm.FieldCondition[basicpointers.BasicPointers, *uint8] { + return badorm.FieldCondition[basicpointers.BasicPointers, *uint8]{ + Expressions: exprs, + Field: "UInt8", } } -func BasicPointersUInt16(v *uint16) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "UInt16", - Value: v, +func BasicPointersUInt16(exprs ...badorm.Expression[*uint16]) badorm.FieldCondition[basicpointers.BasicPointers, *uint16] { + return badorm.FieldCondition[basicpointers.BasicPointers, *uint16]{ + Expressions: exprs, + Field: "UInt16", } } -func BasicPointersUInt32(v *uint32) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "UInt32", - Value: v, +func BasicPointersUInt32(exprs ...badorm.Expression[*uint32]) badorm.FieldCondition[basicpointers.BasicPointers, *uint32] { + return badorm.FieldCondition[basicpointers.BasicPointers, *uint32]{ + Expressions: exprs, + Field: "UInt32", } } -func BasicPointersUInt64(v *uint64) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "UInt64", - Value: v, +func BasicPointersUInt64(exprs ...badorm.Expression[*uint64]) badorm.FieldCondition[basicpointers.BasicPointers, *uint64] { + return badorm.FieldCondition[basicpointers.BasicPointers, *uint64]{ + Expressions: exprs, + Field: "UInt64", } } -func BasicPointersUIntptr(v *uintptr) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "UIntptr", - Value: v, +func BasicPointersUIntptr(exprs ...badorm.Expression[*uintptr]) badorm.FieldCondition[basicpointers.BasicPointers, *uintptr] { + return badorm.FieldCondition[basicpointers.BasicPointers, *uintptr]{ + Expressions: exprs, + Field: "UIntptr", } } -func BasicPointersFloat32(v *float32) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Float32", - Value: v, +func BasicPointersFloat32(exprs ...badorm.Expression[*float32]) badorm.FieldCondition[basicpointers.BasicPointers, *float32] { + return badorm.FieldCondition[basicpointers.BasicPointers, *float32]{ + Expressions: exprs, + Field: "Float32", } } -func BasicPointersFloat64(v *float64) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Float64", - Value: v, +func BasicPointersFloat64(exprs ...badorm.Expression[*float64]) badorm.FieldCondition[basicpointers.BasicPointers, *float64] { + return badorm.FieldCondition[basicpointers.BasicPointers, *float64]{ + Expressions: exprs, + Field: "Float64", } } -func BasicPointersComplex64(v *complex64) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Complex64", - Value: v, +func BasicPointersComplex64(exprs ...badorm.Expression[*complex64]) badorm.FieldCondition[basicpointers.BasicPointers, *complex64] { + return badorm.FieldCondition[basicpointers.BasicPointers, *complex64]{ + Expressions: exprs, + Field: "Complex64", } } -func BasicPointersComplex128(v *complex128) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Complex128", - Value: v, +func BasicPointersComplex128(exprs ...badorm.Expression[*complex128]) badorm.FieldCondition[basicpointers.BasicPointers, *complex128] { + return badorm.FieldCondition[basicpointers.BasicPointers, *complex128]{ + Expressions: exprs, + Field: "Complex128", } } -func BasicPointersString(v *string) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "String", - Value: v, +func BasicPointersString(exprs ...badorm.Expression[*string]) badorm.FieldCondition[basicpointers.BasicPointers, *string] { + return badorm.FieldCondition[basicpointers.BasicPointers, *string]{ + Expressions: exprs, + Field: "String", } } -func BasicPointersByte(v *uint8) badorm.WhereCondition[basicpointers.BasicPointers] { - return badorm.WhereCondition[basicpointers.BasicPointers]{ - Field: "Byte", - Value: v, +func BasicPointersByte(exprs ...badorm.Expression[*uint8]) badorm.FieldCondition[basicpointers.BasicPointers, *uint8] { + return badorm.FieldCondition[basicpointers.BasicPointers, *uint8]{ + Expressions: exprs, + Field: "Byte", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go index bc203778..53048ccd 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go @@ -8,135 +8,135 @@ import ( "time" ) -func BasicSlicesId(v badorm.UUID) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "ID", - Value: v, +func BasicSlicesId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[basicslices.BasicSlices, badorm.UUID] { + return badorm.FieldCondition[basicslices.BasicSlices, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func BasicSlicesCreatedAt(v time.Time) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "CreatedAt", - Value: v, +func BasicSlicesCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicslices.BasicSlices, time.Time] { + return badorm.FieldCondition[basicslices.BasicSlices, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func BasicSlicesUpdatedAt(v time.Time) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "UpdatedAt", - Value: v, +func BasicSlicesUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicslices.BasicSlices, time.Time] { + return badorm.FieldCondition[basicslices.BasicSlices, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func BasicSlicesDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "DeletedAt", - Value: v, +func BasicSlicesDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[basicslices.BasicSlices, gorm.DeletedAt] { + return badorm.FieldCondition[basicslices.BasicSlices, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func BasicSlicesBool(v []bool) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Bool", - Value: v, +func BasicSlicesBool(exprs ...badorm.Expression[[]bool]) badorm.FieldCondition[basicslices.BasicSlices, []bool] { + return badorm.FieldCondition[basicslices.BasicSlices, []bool]{ + Expressions: exprs, + Field: "Bool", } } -func BasicSlicesInt(v []int) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Int", - Value: v, +func BasicSlicesInt(exprs ...badorm.Expression[[]int]) badorm.FieldCondition[basicslices.BasicSlices, []int] { + return badorm.FieldCondition[basicslices.BasicSlices, []int]{ + Expressions: exprs, + Field: "Int", } } -func BasicSlicesInt8(v []int8) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Int8", - Value: v, +func BasicSlicesInt8(exprs ...badorm.Expression[[]int8]) badorm.FieldCondition[basicslices.BasicSlices, []int8] { + return badorm.FieldCondition[basicslices.BasicSlices, []int8]{ + Expressions: exprs, + Field: "Int8", } } -func BasicSlicesInt16(v []int16) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Int16", - Value: v, +func BasicSlicesInt16(exprs ...badorm.Expression[[]int16]) badorm.FieldCondition[basicslices.BasicSlices, []int16] { + return badorm.FieldCondition[basicslices.BasicSlices, []int16]{ + Expressions: exprs, + Field: "Int16", } } -func BasicSlicesInt32(v []int32) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Int32", - Value: v, +func BasicSlicesInt32(exprs ...badorm.Expression[[]int32]) badorm.FieldCondition[basicslices.BasicSlices, []int32] { + return badorm.FieldCondition[basicslices.BasicSlices, []int32]{ + Expressions: exprs, + Field: "Int32", } } -func BasicSlicesInt64(v []int64) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Int64", - Value: v, +func BasicSlicesInt64(exprs ...badorm.Expression[[]int64]) badorm.FieldCondition[basicslices.BasicSlices, []int64] { + return badorm.FieldCondition[basicslices.BasicSlices, []int64]{ + Expressions: exprs, + Field: "Int64", } } -func BasicSlicesUInt(v []uint) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "UInt", - Value: v, +func BasicSlicesUInt(exprs ...badorm.Expression[[]uint]) badorm.FieldCondition[basicslices.BasicSlices, []uint] { + return badorm.FieldCondition[basicslices.BasicSlices, []uint]{ + Expressions: exprs, + Field: "UInt", } } -func BasicSlicesUInt8(v []uint8) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "UInt8", - Value: v, +func BasicSlicesUInt8(exprs ...badorm.Expression[[]uint8]) badorm.FieldCondition[basicslices.BasicSlices, []uint8] { + return badorm.FieldCondition[basicslices.BasicSlices, []uint8]{ + Expressions: exprs, + Field: "UInt8", } } -func BasicSlicesUInt16(v []uint16) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "UInt16", - Value: v, +func BasicSlicesUInt16(exprs ...badorm.Expression[[]uint16]) badorm.FieldCondition[basicslices.BasicSlices, []uint16] { + return badorm.FieldCondition[basicslices.BasicSlices, []uint16]{ + Expressions: exprs, + Field: "UInt16", } } -func BasicSlicesUInt32(v []uint32) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "UInt32", - Value: v, +func BasicSlicesUInt32(exprs ...badorm.Expression[[]uint32]) badorm.FieldCondition[basicslices.BasicSlices, []uint32] { + return badorm.FieldCondition[basicslices.BasicSlices, []uint32]{ + Expressions: exprs, + Field: "UInt32", } } -func BasicSlicesUInt64(v []uint64) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "UInt64", - Value: v, +func BasicSlicesUInt64(exprs ...badorm.Expression[[]uint64]) badorm.FieldCondition[basicslices.BasicSlices, []uint64] { + return badorm.FieldCondition[basicslices.BasicSlices, []uint64]{ + Expressions: exprs, + Field: "UInt64", } } -func BasicSlicesUIntptr(v []uintptr) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "UIntptr", - Value: v, +func BasicSlicesUIntptr(exprs ...badorm.Expression[[]uintptr]) badorm.FieldCondition[basicslices.BasicSlices, []uintptr] { + return badorm.FieldCondition[basicslices.BasicSlices, []uintptr]{ + Expressions: exprs, + Field: "UIntptr", } } -func BasicSlicesFloat32(v []float32) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Float32", - Value: v, +func BasicSlicesFloat32(exprs ...badorm.Expression[[]float32]) badorm.FieldCondition[basicslices.BasicSlices, []float32] { + return badorm.FieldCondition[basicslices.BasicSlices, []float32]{ + Expressions: exprs, + Field: "Float32", } } -func BasicSlicesFloat64(v []float64) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Float64", - Value: v, +func BasicSlicesFloat64(exprs ...badorm.Expression[[]float64]) badorm.FieldCondition[basicslices.BasicSlices, []float64] { + return badorm.FieldCondition[basicslices.BasicSlices, []float64]{ + Expressions: exprs, + Field: "Float64", } } -func BasicSlicesComplex64(v []complex64) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Complex64", - Value: v, +func BasicSlicesComplex64(exprs ...badorm.Expression[[]complex64]) badorm.FieldCondition[basicslices.BasicSlices, []complex64] { + return badorm.FieldCondition[basicslices.BasicSlices, []complex64]{ + Expressions: exprs, + Field: "Complex64", } } -func BasicSlicesComplex128(v []complex128) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Complex128", - Value: v, +func BasicSlicesComplex128(exprs ...badorm.Expression[[]complex128]) badorm.FieldCondition[basicslices.BasicSlices, []complex128] { + return badorm.FieldCondition[basicslices.BasicSlices, []complex128]{ + Expressions: exprs, + Field: "Complex128", } } -func BasicSlicesString(v []string) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "String", - Value: v, +func BasicSlicesString(exprs ...badorm.Expression[[]string]) badorm.FieldCondition[basicslices.BasicSlices, []string] { + return badorm.FieldCondition[basicslices.BasicSlices, []string]{ + Expressions: exprs, + Field: "String", } } -func BasicSlicesByte(v []uint8) badorm.WhereCondition[basicslices.BasicSlices] { - return badorm.WhereCondition[basicslices.BasicSlices]{ - Field: "Byte", - Value: v, +func BasicSlicesByte(exprs ...badorm.Expression[[]uint8]) badorm.FieldCondition[basicslices.BasicSlices, []uint8] { + return badorm.FieldCondition[basicslices.BasicSlices, []uint8]{ + Expressions: exprs, + Field: "Byte", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go index 5d2af0a1..886657e4 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go @@ -8,135 +8,135 @@ import ( "time" ) -func BasicSlicesPointerId(v badorm.UUID) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "ID", - Value: v, +func BasicSlicesPointerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, badorm.UUID] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func BasicSlicesPointerCreatedAt(v time.Time) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "CreatedAt", - Value: v, +func BasicSlicesPointerCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func BasicSlicesPointerUpdatedAt(v time.Time) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "UpdatedAt", - Value: v, +func BasicSlicesPointerUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func BasicSlicesPointerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "DeletedAt", - Value: v, +func BasicSlicesPointerDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, gorm.DeletedAt] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func BasicSlicesPointerBool(v []*bool) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Bool", - Value: v, +func BasicSlicesPointerBool(exprs ...badorm.Expression[[]*bool]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*bool] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*bool]{ + Expressions: exprs, + Field: "Bool", } } -func BasicSlicesPointerInt(v []*int) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Int", - Value: v, +func BasicSlicesPointerInt(exprs ...badorm.Expression[[]*int]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int]{ + Expressions: exprs, + Field: "Int", } } -func BasicSlicesPointerInt8(v []*int8) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Int8", - Value: v, +func BasicSlicesPointerInt8(exprs ...badorm.Expression[[]*int8]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int8] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int8]{ + Expressions: exprs, + Field: "Int8", } } -func BasicSlicesPointerInt16(v []*int16) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Int16", - Value: v, +func BasicSlicesPointerInt16(exprs ...badorm.Expression[[]*int16]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int16] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int16]{ + Expressions: exprs, + Field: "Int16", } } -func BasicSlicesPointerInt32(v []*int32) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Int32", - Value: v, +func BasicSlicesPointerInt32(exprs ...badorm.Expression[[]*int32]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int32] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int32]{ + Expressions: exprs, + Field: "Int32", } } -func BasicSlicesPointerInt64(v []*int64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Int64", - Value: v, +func BasicSlicesPointerInt64(exprs ...badorm.Expression[[]*int64]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int64] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int64]{ + Expressions: exprs, + Field: "Int64", } } -func BasicSlicesPointerUInt(v []*uint) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "UInt", - Value: v, +func BasicSlicesPointerUInt(exprs ...badorm.Expression[[]*uint]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint]{ + Expressions: exprs, + Field: "UInt", } } -func BasicSlicesPointerUInt8(v []*uint8) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "UInt8", - Value: v, +func BasicSlicesPointerUInt8(exprs ...badorm.Expression[[]*uint8]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint8] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint8]{ + Expressions: exprs, + Field: "UInt8", } } -func BasicSlicesPointerUInt16(v []*uint16) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "UInt16", - Value: v, +func BasicSlicesPointerUInt16(exprs ...badorm.Expression[[]*uint16]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint16] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint16]{ + Expressions: exprs, + Field: "UInt16", } } -func BasicSlicesPointerUInt32(v []*uint32) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "UInt32", - Value: v, +func BasicSlicesPointerUInt32(exprs ...badorm.Expression[[]*uint32]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint32] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint32]{ + Expressions: exprs, + Field: "UInt32", } } -func BasicSlicesPointerUInt64(v []*uint64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "UInt64", - Value: v, +func BasicSlicesPointerUInt64(exprs ...badorm.Expression[[]*uint64]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint64] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint64]{ + Expressions: exprs, + Field: "UInt64", } } -func BasicSlicesPointerUIntptr(v []*uintptr) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "UIntptr", - Value: v, +func BasicSlicesPointerUIntptr(exprs ...badorm.Expression[[]*uintptr]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uintptr] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uintptr]{ + Expressions: exprs, + Field: "UIntptr", } } -func BasicSlicesPointerFloat32(v []*float32) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Float32", - Value: v, +func BasicSlicesPointerFloat32(exprs ...badorm.Expression[[]*float32]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*float32] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*float32]{ + Expressions: exprs, + Field: "Float32", } } -func BasicSlicesPointerFloat64(v []*float64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Float64", - Value: v, +func BasicSlicesPointerFloat64(exprs ...badorm.Expression[[]*float64]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*float64] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*float64]{ + Expressions: exprs, + Field: "Float64", } } -func BasicSlicesPointerComplex64(v []*complex64) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Complex64", - Value: v, +func BasicSlicesPointerComplex64(exprs ...badorm.Expression[[]*complex64]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*complex64] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*complex64]{ + Expressions: exprs, + Field: "Complex64", } } -func BasicSlicesPointerComplex128(v []*complex128) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Complex128", - Value: v, +func BasicSlicesPointerComplex128(exprs ...badorm.Expression[[]*complex128]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*complex128] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*complex128]{ + Expressions: exprs, + Field: "Complex128", } } -func BasicSlicesPointerString(v []*string) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "String", - Value: v, +func BasicSlicesPointerString(exprs ...badorm.Expression[[]*string]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*string] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*string]{ + Expressions: exprs, + Field: "String", } } -func BasicSlicesPointerByte(v []*uint8) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { - return badorm.WhereCondition[basicslicespointer.BasicSlicesPointer]{ - Field: "Byte", - Value: v, +func BasicSlicesPointerByte(exprs ...badorm.Expression[[]*uint8]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint8] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint8]{ + Expressions: exprs, + Field: "Byte", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go index 89123e55..aec65500 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go @@ -8,135 +8,135 @@ import ( "time" ) -func BasicTypesId(v badorm.UUID) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "ID", - Value: v, +func BasicTypesId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[basictypes.BasicTypes, badorm.UUID] { + return badorm.FieldCondition[basictypes.BasicTypes, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func BasicTypesCreatedAt(v time.Time) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "CreatedAt", - Value: v, +func BasicTypesCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basictypes.BasicTypes, time.Time] { + return badorm.FieldCondition[basictypes.BasicTypes, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func BasicTypesUpdatedAt(v time.Time) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "UpdatedAt", - Value: v, +func BasicTypesUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basictypes.BasicTypes, time.Time] { + return badorm.FieldCondition[basictypes.BasicTypes, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func BasicTypesDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "DeletedAt", - Value: v, +func BasicTypesDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[basictypes.BasicTypes, gorm.DeletedAt] { + return badorm.FieldCondition[basictypes.BasicTypes, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func BasicTypesBool(v bool) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Bool", - Value: v, +func BasicTypesBool(exprs ...badorm.Expression[bool]) badorm.FieldCondition[basictypes.BasicTypes, bool] { + return badorm.FieldCondition[basictypes.BasicTypes, bool]{ + Expressions: exprs, + Field: "Bool", } } -func BasicTypesInt(v int) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Int", - Value: v, +func BasicTypesInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[basictypes.BasicTypes, int] { + return badorm.FieldCondition[basictypes.BasicTypes, int]{ + Expressions: exprs, + Field: "Int", } } -func BasicTypesInt8(v int8) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Int8", - Value: v, +func BasicTypesInt8(exprs ...badorm.Expression[int8]) badorm.FieldCondition[basictypes.BasicTypes, int8] { + return badorm.FieldCondition[basictypes.BasicTypes, int8]{ + Expressions: exprs, + Field: "Int8", } } -func BasicTypesInt16(v int16) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Int16", - Value: v, +func BasicTypesInt16(exprs ...badorm.Expression[int16]) badorm.FieldCondition[basictypes.BasicTypes, int16] { + return badorm.FieldCondition[basictypes.BasicTypes, int16]{ + Expressions: exprs, + Field: "Int16", } } -func BasicTypesInt32(v int32) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Int32", - Value: v, +func BasicTypesInt32(exprs ...badorm.Expression[int32]) badorm.FieldCondition[basictypes.BasicTypes, int32] { + return badorm.FieldCondition[basictypes.BasicTypes, int32]{ + Expressions: exprs, + Field: "Int32", } } -func BasicTypesInt64(v int64) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Int64", - Value: v, +func BasicTypesInt64(exprs ...badorm.Expression[int64]) badorm.FieldCondition[basictypes.BasicTypes, int64] { + return badorm.FieldCondition[basictypes.BasicTypes, int64]{ + Expressions: exprs, + Field: "Int64", } } -func BasicTypesUInt(v uint) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "UInt", - Value: v, +func BasicTypesUInt(exprs ...badorm.Expression[uint]) badorm.FieldCondition[basictypes.BasicTypes, uint] { + return badorm.FieldCondition[basictypes.BasicTypes, uint]{ + Expressions: exprs, + Field: "UInt", } } -func BasicTypesUInt8(v uint8) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "UInt8", - Value: v, +func BasicTypesUInt8(exprs ...badorm.Expression[uint8]) badorm.FieldCondition[basictypes.BasicTypes, uint8] { + return badorm.FieldCondition[basictypes.BasicTypes, uint8]{ + Expressions: exprs, + Field: "UInt8", } } -func BasicTypesUInt16(v uint16) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "UInt16", - Value: v, +func BasicTypesUInt16(exprs ...badorm.Expression[uint16]) badorm.FieldCondition[basictypes.BasicTypes, uint16] { + return badorm.FieldCondition[basictypes.BasicTypes, uint16]{ + Expressions: exprs, + Field: "UInt16", } } -func BasicTypesUInt32(v uint32) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "UInt32", - Value: v, +func BasicTypesUInt32(exprs ...badorm.Expression[uint32]) badorm.FieldCondition[basictypes.BasicTypes, uint32] { + return badorm.FieldCondition[basictypes.BasicTypes, uint32]{ + Expressions: exprs, + Field: "UInt32", } } -func BasicTypesUInt64(v uint64) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "UInt64", - Value: v, +func BasicTypesUInt64(exprs ...badorm.Expression[uint64]) badorm.FieldCondition[basictypes.BasicTypes, uint64] { + return badorm.FieldCondition[basictypes.BasicTypes, uint64]{ + Expressions: exprs, + Field: "UInt64", } } -func BasicTypesUIntptr(v uintptr) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "UIntptr", - Value: v, +func BasicTypesUIntptr(exprs ...badorm.Expression[uintptr]) badorm.FieldCondition[basictypes.BasicTypes, uintptr] { + return badorm.FieldCondition[basictypes.BasicTypes, uintptr]{ + Expressions: exprs, + Field: "UIntptr", } } -func BasicTypesFloat32(v float32) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Float32", - Value: v, +func BasicTypesFloat32(exprs ...badorm.Expression[float32]) badorm.FieldCondition[basictypes.BasicTypes, float32] { + return badorm.FieldCondition[basictypes.BasicTypes, float32]{ + Expressions: exprs, + Field: "Float32", } } -func BasicTypesFloat64(v float64) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Float64", - Value: v, +func BasicTypesFloat64(exprs ...badorm.Expression[float64]) badorm.FieldCondition[basictypes.BasicTypes, float64] { + return badorm.FieldCondition[basictypes.BasicTypes, float64]{ + Expressions: exprs, + Field: "Float64", } } -func BasicTypesComplex64(v complex64) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Complex64", - Value: v, +func BasicTypesComplex64(exprs ...badorm.Expression[complex64]) badorm.FieldCondition[basictypes.BasicTypes, complex64] { + return badorm.FieldCondition[basictypes.BasicTypes, complex64]{ + Expressions: exprs, + Field: "Complex64", } } -func BasicTypesComplex128(v complex128) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Complex128", - Value: v, +func BasicTypesComplex128(exprs ...badorm.Expression[complex128]) badorm.FieldCondition[basictypes.BasicTypes, complex128] { + return badorm.FieldCondition[basictypes.BasicTypes, complex128]{ + Expressions: exprs, + Field: "Complex128", } } -func BasicTypesString(v string) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "String", - Value: v, +func BasicTypesString(exprs ...badorm.Expression[string]) badorm.FieldCondition[basictypes.BasicTypes, string] { + return badorm.FieldCondition[basictypes.BasicTypes, string]{ + Expressions: exprs, + Field: "String", } } -func BasicTypesByte(v uint8) badorm.WhereCondition[basictypes.BasicTypes] { - return badorm.WhereCondition[basictypes.BasicTypes]{ - Field: "Byte", - Value: v, +func BasicTypesByte(exprs ...badorm.Expression[uint8]) badorm.FieldCondition[basictypes.BasicTypes, uint8] { + return badorm.FieldCondition[basictypes.BasicTypes, uint8]{ + Expressions: exprs, + Field: "Byte", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go index 6af631b1..d18bf3a5 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go @@ -8,28 +8,28 @@ import ( "time" ) -func OwnedId(v badorm.UUID) badorm.WhereCondition[belongsto.Owned] { - return badorm.WhereCondition[belongsto.Owned]{ - Field: "ID", - Value: v, +func OwnedId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[belongsto.Owned, badorm.UUID] { + return badorm.FieldCondition[belongsto.Owned, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func OwnedCreatedAt(v time.Time) badorm.WhereCondition[belongsto.Owned] { - return badorm.WhereCondition[belongsto.Owned]{ - Field: "CreatedAt", - Value: v, +func OwnedCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[belongsto.Owned, time.Time] { + return badorm.FieldCondition[belongsto.Owned, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func OwnedUpdatedAt(v time.Time) badorm.WhereCondition[belongsto.Owned] { - return badorm.WhereCondition[belongsto.Owned]{ - Field: "UpdatedAt", - Value: v, +func OwnedUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[belongsto.Owned, time.Time] { + return badorm.FieldCondition[belongsto.Owned, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func OwnedDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[belongsto.Owned] { - return badorm.WhereCondition[belongsto.Owned]{ - Field: "DeletedAt", - Value: v, +func OwnedDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[belongsto.Owned, gorm.DeletedAt] { + return badorm.FieldCondition[belongsto.Owned, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Condition[belongsto.Owned] { @@ -39,9 +39,9 @@ func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Conditio T2Field: "ID", } } -func OwnedOwnerId(v badorm.UUID) badorm.WhereCondition[belongsto.Owned] { - return badorm.WhereCondition[belongsto.Owned]{ - Field: "OwnerID", - Value: v, +func OwnedOwnerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[belongsto.Owned, badorm.UUID] { + return badorm.FieldCondition[belongsto.Owned, badorm.UUID]{ + Expressions: exprs, + Field: "OwnerID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go index a8816f8a..3ee7aaae 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go @@ -8,27 +8,27 @@ import ( "time" ) -func OwnerId(v badorm.UUID) badorm.WhereCondition[belongsto.Owner] { - return badorm.WhereCondition[belongsto.Owner]{ - Field: "ID", - Value: v, +func OwnerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[belongsto.Owner, badorm.UUID] { + return badorm.FieldCondition[belongsto.Owner, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func OwnerCreatedAt(v time.Time) badorm.WhereCondition[belongsto.Owner] { - return badorm.WhereCondition[belongsto.Owner]{ - Field: "CreatedAt", - Value: v, +func OwnerCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[belongsto.Owner, time.Time] { + return badorm.FieldCondition[belongsto.Owner, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func OwnerUpdatedAt(v time.Time) badorm.WhereCondition[belongsto.Owner] { - return badorm.WhereCondition[belongsto.Owner]{ - Field: "UpdatedAt", - Value: v, +func OwnerUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[belongsto.Owner, time.Time] { + return badorm.FieldCondition[belongsto.Owner, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func OwnerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[belongsto.Owner] { - return badorm.WhereCondition[belongsto.Owner]{ - Field: "DeletedAt", - Value: v, +func OwnerDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[belongsto.Owner, gorm.DeletedAt] { + return badorm.FieldCondition[belongsto.Owner, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go index c6deff83..50ac9c06 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go @@ -8,33 +8,33 @@ import ( "time" ) -func ColumnDefinitionId(v badorm.UUID) badorm.WhereCondition[columndefinition.ColumnDefinition] { - return badorm.WhereCondition[columndefinition.ColumnDefinition]{ - Field: "ID", - Value: v, +func ColumnDefinitionId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[columndefinition.ColumnDefinition, badorm.UUID] { + return badorm.FieldCondition[columndefinition.ColumnDefinition, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func ColumnDefinitionCreatedAt(v time.Time) badorm.WhereCondition[columndefinition.ColumnDefinition] { - return badorm.WhereCondition[columndefinition.ColumnDefinition]{ - Field: "CreatedAt", - Value: v, +func ColumnDefinitionCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time] { + return badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func ColumnDefinitionUpdatedAt(v time.Time) badorm.WhereCondition[columndefinition.ColumnDefinition] { - return badorm.WhereCondition[columndefinition.ColumnDefinition]{ - Field: "UpdatedAt", - Value: v, +func ColumnDefinitionUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time] { + return badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func ColumnDefinitionDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[columndefinition.ColumnDefinition] { - return badorm.WhereCondition[columndefinition.ColumnDefinition]{ - Field: "DeletedAt", - Value: v, +func ColumnDefinitionDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[columndefinition.ColumnDefinition, gorm.DeletedAt] { + return badorm.FieldCondition[columndefinition.ColumnDefinition, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func ColumnDefinitionString(v string) badorm.WhereCondition[columndefinition.ColumnDefinition] { - return badorm.WhereCondition[columndefinition.ColumnDefinition]{ - Column: "string_something_else", - Value: v, +func ColumnDefinitionString(exprs ...badorm.Expression[string]) badorm.FieldCondition[columndefinition.ColumnDefinition, string] { + return badorm.FieldCondition[columndefinition.ColumnDefinition, string]{ + Column: "string_something_else", + Expressions: exprs, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go index 68a8dc1f..5edb2331 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go @@ -8,33 +8,33 @@ import ( "time" ) -func CustomTypeId(v badorm.UUID) badorm.WhereCondition[customtype.CustomType] { - return badorm.WhereCondition[customtype.CustomType]{ - Field: "ID", - Value: v, +func CustomTypeId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[customtype.CustomType, badorm.UUID] { + return badorm.FieldCondition[customtype.CustomType, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func CustomTypeCreatedAt(v time.Time) badorm.WhereCondition[customtype.CustomType] { - return badorm.WhereCondition[customtype.CustomType]{ - Field: "CreatedAt", - Value: v, +func CustomTypeCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[customtype.CustomType, time.Time] { + return badorm.FieldCondition[customtype.CustomType, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func CustomTypeUpdatedAt(v time.Time) badorm.WhereCondition[customtype.CustomType] { - return badorm.WhereCondition[customtype.CustomType]{ - Field: "UpdatedAt", - Value: v, +func CustomTypeUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[customtype.CustomType, time.Time] { + return badorm.FieldCondition[customtype.CustomType, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func CustomTypeDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[customtype.CustomType] { - return badorm.WhereCondition[customtype.CustomType]{ - Field: "DeletedAt", - Value: v, +func CustomTypeDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[customtype.CustomType, gorm.DeletedAt] { + return badorm.FieldCondition[customtype.CustomType, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func CustomTypeCustom(v customtype.MultiString) badorm.WhereCondition[customtype.CustomType] { - return badorm.WhereCondition[customtype.CustomType]{ - Field: "Custom", - Value: v, +func CustomTypeCustom(exprs ...badorm.Expression[customtype.MultiString]) badorm.FieldCondition[customtype.CustomType, customtype.MultiString] { + return badorm.FieldCondition[customtype.CustomType, customtype.MultiString]{ + Expressions: exprs, + Field: "Custom", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go index 336bed43..a768ebb6 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go @@ -8,33 +8,33 @@ import ( "time" ) -func GoEmbeddedId(v uint) badorm.WhereCondition[goembedded.GoEmbedded] { - return badorm.WhereCondition[goembedded.GoEmbedded]{ - Field: "ID", - Value: v, +func GoEmbeddedId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[goembedded.GoEmbedded, uint] { + return badorm.FieldCondition[goembedded.GoEmbedded, uint]{ + Expressions: exprs, + Field: "ID", } } -func GoEmbeddedCreatedAt(v time.Time) badorm.WhereCondition[goembedded.GoEmbedded] { - return badorm.WhereCondition[goembedded.GoEmbedded]{ - Field: "CreatedAt", - Value: v, +func GoEmbeddedCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[goembedded.GoEmbedded, time.Time] { + return badorm.FieldCondition[goembedded.GoEmbedded, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func GoEmbeddedUpdatedAt(v time.Time) badorm.WhereCondition[goembedded.GoEmbedded] { - return badorm.WhereCondition[goembedded.GoEmbedded]{ - Field: "UpdatedAt", - Value: v, +func GoEmbeddedUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[goembedded.GoEmbedded, time.Time] { + return badorm.FieldCondition[goembedded.GoEmbedded, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func GoEmbeddedDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[goembedded.GoEmbedded] { - return badorm.WhereCondition[goembedded.GoEmbedded]{ - Field: "DeletedAt", - Value: v, +func GoEmbeddedDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[goembedded.GoEmbedded, gorm.DeletedAt] { + return badorm.FieldCondition[goembedded.GoEmbedded, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func GoEmbeddedEmbeddedInt(v int) badorm.WhereCondition[goembedded.GoEmbedded] { - return badorm.WhereCondition[goembedded.GoEmbedded]{ - Field: "EmbeddedInt", - Value: v, +func GoEmbeddedEmbeddedInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[goembedded.GoEmbedded, int] { + return badorm.FieldCondition[goembedded.GoEmbedded, int]{ + Expressions: exprs, + Field: "EmbeddedInt", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go index bcfcad0d..1eab3cf1 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go @@ -8,34 +8,34 @@ import ( "time" ) -func GormEmbeddedId(v uint) badorm.WhereCondition[gormembedded.GormEmbedded] { - return badorm.WhereCondition[gormembedded.GormEmbedded]{ - Field: "ID", - Value: v, +func GormEmbeddedId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[gormembedded.GormEmbedded, uint] { + return badorm.FieldCondition[gormembedded.GormEmbedded, uint]{ + Expressions: exprs, + Field: "ID", } } -func GormEmbeddedCreatedAt(v time.Time) badorm.WhereCondition[gormembedded.GormEmbedded] { - return badorm.WhereCondition[gormembedded.GormEmbedded]{ - Field: "CreatedAt", - Value: v, +func GormEmbeddedCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[gormembedded.GormEmbedded, time.Time] { + return badorm.FieldCondition[gormembedded.GormEmbedded, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func GormEmbeddedUpdatedAt(v time.Time) badorm.WhereCondition[gormembedded.GormEmbedded] { - return badorm.WhereCondition[gormembedded.GormEmbedded]{ - Field: "UpdatedAt", - Value: v, +func GormEmbeddedUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[gormembedded.GormEmbedded, time.Time] { + return badorm.FieldCondition[gormembedded.GormEmbedded, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func GormEmbeddedDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[gormembedded.GormEmbedded] { - return badorm.WhereCondition[gormembedded.GormEmbedded]{ - Field: "DeletedAt", - Value: v, +func GormEmbeddedDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[gormembedded.GormEmbedded, gorm.DeletedAt] { + return badorm.FieldCondition[gormembedded.GormEmbedded, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func GormEmbeddedGormEmbeddedInt(v int) badorm.WhereCondition[gormembedded.GormEmbedded] { - return badorm.WhereCondition[gormembedded.GormEmbedded]{ +func GormEmbeddedGormEmbeddedInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[gormembedded.GormEmbedded, int] { + return badorm.FieldCondition[gormembedded.GormEmbedded, int]{ ColumnPrefix: "gorm_embedded_", + Expressions: exprs, Field: "Int", - Value: v, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go index d6dc2ed8..db6498ba 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go @@ -8,28 +8,28 @@ import ( "time" ) -func CompanyId(v badorm.UUID) badorm.WhereCondition[hasmany.Company] { - return badorm.WhereCondition[hasmany.Company]{ - Field: "ID", - Value: v, +func CompanyId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[hasmany.Company, badorm.UUID] { + return badorm.FieldCondition[hasmany.Company, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func CompanyCreatedAt(v time.Time) badorm.WhereCondition[hasmany.Company] { - return badorm.WhereCondition[hasmany.Company]{ - Field: "CreatedAt", - Value: v, +func CompanyCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasmany.Company, time.Time] { + return badorm.FieldCondition[hasmany.Company, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func CompanyUpdatedAt(v time.Time) badorm.WhereCondition[hasmany.Company] { - return badorm.WhereCondition[hasmany.Company]{ - Field: "UpdatedAt", - Value: v, +func CompanyUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasmany.Company, time.Time] { + return badorm.FieldCondition[hasmany.Company, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func CompanyDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasmany.Company] { - return badorm.WhereCondition[hasmany.Company]{ - Field: "DeletedAt", - Value: v, +func CompanyDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[hasmany.Company, gorm.DeletedAt] { + return badorm.FieldCondition[hasmany.Company, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.Condition[hasmany.Seller] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go index 5bcbffba..2b53ab0d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go @@ -8,33 +8,33 @@ import ( "time" ) -func SellerId(v badorm.UUID) badorm.WhereCondition[hasmany.Seller] { - return badorm.WhereCondition[hasmany.Seller]{ - Field: "ID", - Value: v, +func SellerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[hasmany.Seller, badorm.UUID] { + return badorm.FieldCondition[hasmany.Seller, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func SellerCreatedAt(v time.Time) badorm.WhereCondition[hasmany.Seller] { - return badorm.WhereCondition[hasmany.Seller]{ - Field: "CreatedAt", - Value: v, +func SellerCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasmany.Seller, time.Time] { + return badorm.FieldCondition[hasmany.Seller, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func SellerUpdatedAt(v time.Time) badorm.WhereCondition[hasmany.Seller] { - return badorm.WhereCondition[hasmany.Seller]{ - Field: "UpdatedAt", - Value: v, +func SellerUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasmany.Seller, time.Time] { + return badorm.FieldCondition[hasmany.Seller, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func SellerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasmany.Seller] { - return badorm.WhereCondition[hasmany.Seller]{ - Field: "DeletedAt", - Value: v, +func SellerDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[hasmany.Seller, gorm.DeletedAt] { + return badorm.FieldCondition[hasmany.Seller, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func SellerCompanyId(v *badorm.UUID) badorm.WhereCondition[hasmany.Seller] { - return badorm.WhereCondition[hasmany.Seller]{ - Field: "CompanyID", - Value: v, +func SellerCompanyId(exprs ...badorm.Expression[*badorm.UUID]) badorm.FieldCondition[hasmany.Seller, *badorm.UUID] { + return badorm.FieldCondition[hasmany.Seller, *badorm.UUID]{ + Expressions: exprs, + Field: "CompanyID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go index e9a265dc..f1b66eb9 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go @@ -8,33 +8,33 @@ import ( "time" ) -func CityId(v badorm.UUID) badorm.WhereCondition[hasone.City] { - return badorm.WhereCondition[hasone.City]{ - Field: "ID", - Value: v, +func CityId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[hasone.City, badorm.UUID] { + return badorm.FieldCondition[hasone.City, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func CityCreatedAt(v time.Time) badorm.WhereCondition[hasone.City] { - return badorm.WhereCondition[hasone.City]{ - Field: "CreatedAt", - Value: v, +func CityCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasone.City, time.Time] { + return badorm.FieldCondition[hasone.City, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func CityUpdatedAt(v time.Time) badorm.WhereCondition[hasone.City] { - return badorm.WhereCondition[hasone.City]{ - Field: "UpdatedAt", - Value: v, +func CityUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasone.City, time.Time] { + return badorm.FieldCondition[hasone.City, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func CityDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasone.City] { - return badorm.WhereCondition[hasone.City]{ - Field: "DeletedAt", - Value: v, +func CityDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[hasone.City, gorm.DeletedAt] { + return badorm.FieldCondition[hasone.City, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func CityCountryId(v badorm.UUID) badorm.WhereCondition[hasone.City] { - return badorm.WhereCondition[hasone.City]{ - Field: "CountryID", - Value: v, +func CityCountryId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[hasone.City, badorm.UUID] { + return badorm.FieldCondition[hasone.City, badorm.UUID]{ + Expressions: exprs, + Field: "CountryID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go index 4efc0c8f..f5789a79 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go @@ -8,28 +8,28 @@ import ( "time" ) -func CountryId(v badorm.UUID) badorm.WhereCondition[hasone.Country] { - return badorm.WhereCondition[hasone.Country]{ - Field: "ID", - Value: v, +func CountryId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[hasone.Country, badorm.UUID] { + return badorm.FieldCondition[hasone.Country, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func CountryCreatedAt(v time.Time) badorm.WhereCondition[hasone.Country] { - return badorm.WhereCondition[hasone.Country]{ - Field: "CreatedAt", - Value: v, +func CountryCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasone.Country, time.Time] { + return badorm.FieldCondition[hasone.Country, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func CountryUpdatedAt(v time.Time) badorm.WhereCondition[hasone.Country] { - return badorm.WhereCondition[hasone.Country]{ - Field: "UpdatedAt", - Value: v, +func CountryUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasone.Country, time.Time] { + return badorm.FieldCondition[hasone.Country, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func CountryDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[hasone.Country] { - return badorm.WhereCondition[hasone.Country]{ - Field: "DeletedAt", - Value: v, +func CountryDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[hasone.Country, gorm.DeletedAt] { + return badorm.FieldCondition[hasone.Country, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } func CountryCapital(conditions ...badorm.Condition[hasone.City]) badorm.Condition[hasone.Country] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go index e2ef47e2..547298c5 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go @@ -9,28 +9,28 @@ import ( "time" ) -func Package1Id(v badorm.UUID) badorm.WhereCondition[package1.Package1] { - return badorm.WhereCondition[package1.Package1]{ - Field: "ID", - Value: v, +func Package1Id(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[package1.Package1, badorm.UUID] { + return badorm.FieldCondition[package1.Package1, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func Package1CreatedAt(v time.Time) badorm.WhereCondition[package1.Package1] { - return badorm.WhereCondition[package1.Package1]{ - Field: "CreatedAt", - Value: v, +func Package1CreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[package1.Package1, time.Time] { + return badorm.FieldCondition[package1.Package1, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func Package1UpdatedAt(v time.Time) badorm.WhereCondition[package1.Package1] { - return badorm.WhereCondition[package1.Package1]{ - Field: "UpdatedAt", - Value: v, +func Package1UpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[package1.Package1, time.Time] { + return badorm.FieldCondition[package1.Package1, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func Package1DeletedAt(v gorm.DeletedAt) badorm.WhereCondition[package1.Package1] { - return badorm.WhereCondition[package1.Package1]{ - Field: "DeletedAt", - Value: v, +func Package1DeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[package1.Package1, gorm.DeletedAt] { + return badorm.FieldCondition[package1.Package1, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } func Package1Package2(conditions ...badorm.Condition[package2.Package2]) badorm.Condition[package1.Package1] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go index 10717098..c9758ebf 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go @@ -8,28 +8,28 @@ import ( "time" ) -func BicycleId(v badorm.UUID) badorm.WhereCondition[overrideforeignkey.Bicycle] { - return badorm.WhereCondition[overrideforeignkey.Bicycle]{ - Field: "ID", - Value: v, +func BicycleId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[overrideforeignkey.Bicycle, badorm.UUID] { + return badorm.FieldCondition[overrideforeignkey.Bicycle, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func BicycleCreatedAt(v time.Time) badorm.WhereCondition[overrideforeignkey.Bicycle] { - return badorm.WhereCondition[overrideforeignkey.Bicycle]{ - Field: "CreatedAt", - Value: v, +func BicycleCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time] { + return badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func BicycleUpdatedAt(v time.Time) badorm.WhereCondition[overrideforeignkey.Bicycle] { - return badorm.WhereCondition[overrideforeignkey.Bicycle]{ - Field: "UpdatedAt", - Value: v, +func BicycleUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time] { + return badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func BicycleDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[overrideforeignkey.Bicycle] { - return badorm.WhereCondition[overrideforeignkey.Bicycle]{ - Field: "DeletedAt", - Value: v, +func BicycleDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[overrideforeignkey.Bicycle, gorm.DeletedAt] { + return badorm.FieldCondition[overrideforeignkey.Bicycle, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) badorm.Condition[overrideforeignkey.Bicycle] { @@ -39,9 +39,9 @@ func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) bad T2Field: "ID", } } -func BicycleOwnerSomethingId(v string) badorm.WhereCondition[overrideforeignkey.Bicycle] { - return badorm.WhereCondition[overrideforeignkey.Bicycle]{ - Field: "OwnerSomethingID", - Value: v, +func BicycleOwnerSomethingId(exprs ...badorm.Expression[string]) badorm.FieldCondition[overrideforeignkey.Bicycle, string] { + return badorm.FieldCondition[overrideforeignkey.Bicycle, string]{ + Expressions: exprs, + Field: "OwnerSomethingID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go index 6e41db1d..74e7e60d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go @@ -8,28 +8,28 @@ import ( "time" ) -func UserId(v badorm.UUID) badorm.WhereCondition[overrideforeignkeyinverse.User] { - return badorm.WhereCondition[overrideforeignkeyinverse.User]{ - Field: "ID", - Value: v, +func UserId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[overrideforeignkeyinverse.User, badorm.UUID] { + return badorm.FieldCondition[overrideforeignkeyinverse.User, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func UserCreatedAt(v time.Time) badorm.WhereCondition[overrideforeignkeyinverse.User] { - return badorm.WhereCondition[overrideforeignkeyinverse.User]{ - Field: "CreatedAt", - Value: v, +func UserCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time] { + return badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func UserUpdatedAt(v time.Time) badorm.WhereCondition[overrideforeignkeyinverse.User] { - return badorm.WhereCondition[overrideforeignkeyinverse.User]{ - Field: "UpdatedAt", - Value: v, +func UserUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time] { + return badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func UserDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[overrideforeignkeyinverse.User] { - return badorm.WhereCondition[overrideforeignkeyinverse.User]{ - Field: "DeletedAt", - Value: v, +func UserDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[overrideforeignkeyinverse.User, gorm.DeletedAt] { + return badorm.FieldCondition[overrideforeignkeyinverse.User, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } func UserCreditCard(conditions ...badorm.Condition[overrideforeignkeyinverse.CreditCard]) badorm.Condition[overrideforeignkeyinverse.User] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go index 58a988b7..2d4e877d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go @@ -8,28 +8,28 @@ import ( "time" ) -func PhoneId(v badorm.UUID) badorm.WhereCondition[overridereferences.Phone] { - return badorm.WhereCondition[overridereferences.Phone]{ - Field: "ID", - Value: v, +func PhoneId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[overridereferences.Phone, badorm.UUID] { + return badorm.FieldCondition[overridereferences.Phone, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func PhoneCreatedAt(v time.Time) badorm.WhereCondition[overridereferences.Phone] { - return badorm.WhereCondition[overridereferences.Phone]{ - Field: "CreatedAt", - Value: v, +func PhoneCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overridereferences.Phone, time.Time] { + return badorm.FieldCondition[overridereferences.Phone, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func PhoneUpdatedAt(v time.Time) badorm.WhereCondition[overridereferences.Phone] { - return badorm.WhereCondition[overridereferences.Phone]{ - Field: "UpdatedAt", - Value: v, +func PhoneUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overridereferences.Phone, time.Time] { + return badorm.FieldCondition[overridereferences.Phone, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func PhoneDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[overridereferences.Phone] { - return badorm.WhereCondition[overridereferences.Phone]{ - Field: "DeletedAt", - Value: v, +func PhoneDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[overridereferences.Phone, gorm.DeletedAt] { + return badorm.FieldCondition[overridereferences.Phone, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm.Condition[overridereferences.Phone] { @@ -39,9 +39,9 @@ func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm T2Field: "Name", } } -func PhoneBrandName(v string) badorm.WhereCondition[overridereferences.Phone] { - return badorm.WhereCondition[overridereferences.Phone]{ - Field: "BrandName", - Value: v, +func PhoneBrandName(exprs ...badorm.Expression[string]) badorm.FieldCondition[overridereferences.Phone, string] { + return badorm.FieldCondition[overridereferences.Phone, string]{ + Expressions: exprs, + Field: "BrandName", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go index 421f2e2f..87a89b15 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go @@ -8,34 +8,34 @@ import ( "time" ) -func ComputerId(v badorm.UUID) badorm.WhereCondition[overridereferencesinverse.Computer] { - return badorm.WhereCondition[overridereferencesinverse.Computer]{ - Field: "ID", - Value: v, +func ComputerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[overridereferencesinverse.Computer, badorm.UUID] { + return badorm.FieldCondition[overridereferencesinverse.Computer, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func ComputerCreatedAt(v time.Time) badorm.WhereCondition[overridereferencesinverse.Computer] { - return badorm.WhereCondition[overridereferencesinverse.Computer]{ - Field: "CreatedAt", - Value: v, +func ComputerCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overridereferencesinverse.Computer, time.Time] { + return badorm.FieldCondition[overridereferencesinverse.Computer, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func ComputerUpdatedAt(v time.Time) badorm.WhereCondition[overridereferencesinverse.Computer] { - return badorm.WhereCondition[overridereferencesinverse.Computer]{ - Field: "UpdatedAt", - Value: v, +func ComputerUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overridereferencesinverse.Computer, time.Time] { + return badorm.FieldCondition[overridereferencesinverse.Computer, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func ComputerDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[overridereferencesinverse.Computer] { - return badorm.WhereCondition[overridereferencesinverse.Computer]{ - Field: "DeletedAt", - Value: v, +func ComputerDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[overridereferencesinverse.Computer, gorm.DeletedAt] { + return badorm.FieldCondition[overridereferencesinverse.Computer, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } -func ComputerName(v string) badorm.WhereCondition[overridereferencesinverse.Computer] { - return badorm.WhereCondition[overridereferencesinverse.Computer]{ - Field: "Name", - Value: v, +func ComputerName(exprs ...badorm.Expression[string]) badorm.FieldCondition[overridereferencesinverse.Computer, string] { + return badorm.FieldCondition[overridereferencesinverse.Computer, string]{ + Expressions: exprs, + Field: "Name", } } func ComputerProcessor(conditions ...badorm.Condition[overridereferencesinverse.Processor]) badorm.Condition[overridereferencesinverse.Computer] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go index 62a3bd4e..f32030ed 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go @@ -8,28 +8,28 @@ import ( "time" ) -func EmployeeId(v badorm.UUID) badorm.WhereCondition[selfreferential.Employee] { - return badorm.WhereCondition[selfreferential.Employee]{ - Field: "ID", - Value: v, +func EmployeeId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[selfreferential.Employee, badorm.UUID] { + return badorm.FieldCondition[selfreferential.Employee, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func EmployeeCreatedAt(v time.Time) badorm.WhereCondition[selfreferential.Employee] { - return badorm.WhereCondition[selfreferential.Employee]{ - Field: "CreatedAt", - Value: v, +func EmployeeCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[selfreferential.Employee, time.Time] { + return badorm.FieldCondition[selfreferential.Employee, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func EmployeeUpdatedAt(v time.Time) badorm.WhereCondition[selfreferential.Employee] { - return badorm.WhereCondition[selfreferential.Employee]{ - Field: "UpdatedAt", - Value: v, +func EmployeeUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[selfreferential.Employee, time.Time] { + return badorm.FieldCondition[selfreferential.Employee, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func EmployeeDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[selfreferential.Employee] { - return badorm.WhereCondition[selfreferential.Employee]{ - Field: "DeletedAt", - Value: v, +func EmployeeDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[selfreferential.Employee, gorm.DeletedAt] { + return badorm.FieldCondition[selfreferential.Employee, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) badorm.Condition[selfreferential.Employee] { @@ -39,9 +39,9 @@ func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) bado T2Field: "ID", } } -func EmployeeBossId(v *badorm.UUID) badorm.WhereCondition[selfreferential.Employee] { - return badorm.WhereCondition[selfreferential.Employee]{ - Field: "BossID", - Value: v, +func EmployeeBossId(exprs ...badorm.Expression[*badorm.UUID]) badorm.FieldCondition[selfreferential.Employee, *badorm.UUID] { + return badorm.FieldCondition[selfreferential.Employee, *badorm.UUID]{ + Expressions: exprs, + Field: "BossID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go index 28d615c5..f8cc085c 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go @@ -8,27 +8,27 @@ import ( "time" ) -func UintModelId(v uint) badorm.WhereCondition[uintmodel.UintModel] { - return badorm.WhereCondition[uintmodel.UintModel]{ - Field: "ID", - Value: v, +func UintModelId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[uintmodel.UintModel, uint] { + return badorm.FieldCondition[uintmodel.UintModel, uint]{ + Expressions: exprs, + Field: "ID", } } -func UintModelCreatedAt(v time.Time) badorm.WhereCondition[uintmodel.UintModel] { - return badorm.WhereCondition[uintmodel.UintModel]{ - Field: "CreatedAt", - Value: v, +func UintModelCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[uintmodel.UintModel, time.Time] { + return badorm.FieldCondition[uintmodel.UintModel, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func UintModelUpdatedAt(v time.Time) badorm.WhereCondition[uintmodel.UintModel] { - return badorm.WhereCondition[uintmodel.UintModel]{ - Field: "UpdatedAt", - Value: v, +func UintModelUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[uintmodel.UintModel, time.Time] { + return badorm.FieldCondition[uintmodel.UintModel, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func UintModelDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[uintmodel.UintModel] { - return badorm.WhereCondition[uintmodel.UintModel]{ - Field: "DeletedAt", - Value: v, +func UintModelDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[uintmodel.UintModel, gorm.DeletedAt] { + return badorm.FieldCondition[uintmodel.UintModel, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go index a9401a51..50d6fcae 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go @@ -8,27 +8,27 @@ import ( "time" ) -func UUIDModelId(v badorm.UUID) badorm.WhereCondition[uuidmodel.UUIDModel] { - return badorm.WhereCondition[uuidmodel.UUIDModel]{ - Field: "ID", - Value: v, +func UUIDModelId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[uuidmodel.UUIDModel, badorm.UUID] { + return badorm.FieldCondition[uuidmodel.UUIDModel, badorm.UUID]{ + Expressions: exprs, + Field: "ID", } } -func UUIDModelCreatedAt(v time.Time) badorm.WhereCondition[uuidmodel.UUIDModel] { - return badorm.WhereCondition[uuidmodel.UUIDModel]{ - Field: "CreatedAt", - Value: v, +func UUIDModelCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[uuidmodel.UUIDModel, time.Time] { + return badorm.FieldCondition[uuidmodel.UUIDModel, time.Time]{ + Expressions: exprs, + Field: "CreatedAt", } } -func UUIDModelUpdatedAt(v time.Time) badorm.WhereCondition[uuidmodel.UUIDModel] { - return badorm.WhereCondition[uuidmodel.UUIDModel]{ - Field: "UpdatedAt", - Value: v, +func UUIDModelUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[uuidmodel.UUIDModel, time.Time] { + return badorm.FieldCondition[uuidmodel.UUIDModel, time.Time]{ + Expressions: exprs, + Field: "UpdatedAt", } } -func UUIDModelDeletedAt(v gorm.DeletedAt) badorm.WhereCondition[uuidmodel.UUIDModel] { - return badorm.WhereCondition[uuidmodel.UUIDModel]{ - Field: "DeletedAt", - Value: v, +func UUIDModelDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[uuidmodel.UUIDModel, gorm.DeletedAt] { + return badorm.FieldCondition[uuidmodel.UUIDModel, gorm.DeletedAt]{ + Expressions: exprs, + Field: "DeletedAt", } } From 42532335fda13caf560bd873ea38b20d3ab865cf Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 15 Jun 2023 09:46:42 +0200 Subject: [PATCH 344/467] add interface verification method --- badorm/expression.go | 30 +++++++++++++++++++----------- badorm/mysql/array.go | 6 ++++++ badorm/psql/array.go | 6 ++++++ 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index b9510e4b..3b4de0ec 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -9,22 +9,26 @@ import ( ) type Expression[T any] interface { - // TODO agregar el metodo de validacion de interface ToSQL(columnName string) (string, []any) + + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T], + // since if no method receives by parameter a type T, + // any other Expression[T2] would also be considered a Expression[T]. + InterfaceVerificationMethod(T) } -// TODO -// string, int, etc. uuid, cualquier custom, time, deletedAt, asi que es any al final -// aunque algunos como like y eso solo funcionan para string, el problema es que yo no se si -// uno custom va a ir a string o no -// podria igual mirar que condiciones les genero y cuales no segun el tipo type ValueExpression[T any] struct { - // TODO creo que como no uso T esto no va a verificar nada, - // aca antes habia []T pero me limita para cosas que no necesariamente comparan contra T como el startsWith Value any SQLExpression string } +//nolint:unused // see inside +func (expr ValueExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + var nullableKinds = []reflect.Kind{ reflect.Chan, reflect.Func, reflect.Map, reflect.Pointer, @@ -39,6 +43,7 @@ func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { // TODO y aca que pasa con time, deletedAt, y otros nullables por valuer // TODO que pasa para los demas symbols, puede meterme un null en un lt? // TODO esto esta feo + // TODO tambien lo que hace la libreria esa es transformarlo en in si es un array if expr.SQLExpression == "=" { reflectVal := reflect.ValueOf(expr.Value) isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) @@ -62,12 +67,15 @@ func NewValueExpression[T any](value T, sqlExpression string) ValueExpression[T] } type PredicateExpression[T any] struct { - // TODO creo que como no uso T esto no va a verificar nada, - // aca antes habia []T pero me limita para cosas que no necesariamente comparan contra T como el startsWith SQLExpression string } -// TODO aca me gustaria que devuelva []T pero no me anda asi +//nolint:unused // see inside +func (expr PredicateExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + func (expr PredicateExpression[T]) ToSQL(columnName string) (string, []any) { return fmt.Sprintf("%s %s", columnName, expr.SQLExpression), []any{} } diff --git a/badorm/mysql/array.go b/badorm/mysql/array.go index 9672a995..ae2df696 100644 --- a/badorm/mysql/array.go +++ b/badorm/mysql/array.go @@ -14,6 +14,12 @@ type ArrayExpression[T any] struct { SQLExpression string } +//nolint:unused // see inside +func (expr ArrayExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + func NewArrayExpression[T any](values []T, sqlExpression string) ArrayExpression[T] { return ArrayExpression[T]{ Values: values, diff --git a/badorm/psql/array.go b/badorm/psql/array.go index a817c1c4..52b8f13a 100644 --- a/badorm/psql/array.go +++ b/badorm/psql/array.go @@ -11,6 +11,12 @@ type ArrayExpression[T any] struct { SQLExpression string } +//nolint:unused // see inside +func (expr ArrayExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + func NewArrayExpression[T any](values []T, sqlExpression string) ArrayExpression[T] { return ArrayExpression[T]{ Values: values, From c3d27fda499b2fbcc73b2c9de56f0fa99f072127 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 15 Jun 2023 10:19:38 +0200 Subject: [PATCH 345/467] between and not between --- badorm/expression.go | 65 +++++++++++++++++++++++++---- badorm/mysql/array.go | 50 +++------------------- badorm/mysql/comparison.go | 2 + testintegration/expressions_test.go | 32 ++++++++++++++ 4 files changed, 98 insertions(+), 51 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index 3b4de0ec..42e01dd2 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -4,6 +4,7 @@ import ( "database/sql" "fmt" "reflect" + "strings" "github.com/elliotchance/pie/v2" ) @@ -40,7 +41,7 @@ var nullableKinds = []reflect.Kind{ func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { // sino que para punteros no haya equal nil? // TODO este chequeo deberia ser solo cuando T es un puntero - // TODO y aca que pasa con time, deletedAt, y otros nullables por valuer + // y que pasa con time, deletedAt, y otros nullables por valuer // TODO que pasa para los demas symbols, puede meterme un null en un lt? // TODO esto esta feo // TODO tambien lo que hace la libreria esa es transformarlo en in si es un array @@ -66,6 +67,48 @@ func NewValueExpression[T any](value T, sqlExpression string) ValueExpression[T] } } +type MultivalueExpression[T any] struct { + Values []T + SQLExpression string + SQLConnector string + SQLPrefix string + SQLSuffix string +} + +//nolint:unused // see inside +func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + +func (expr MultivalueExpression[T]) ToSQL(columnName string) (string, []any) { + placeholders := strings.Join(pie.Map(expr.Values, func(value T) string { + return "?" + }), " "+expr.SQLConnector+" ") + + values := pie.Map(expr.Values, func(value T) any { + return value + }) + + return fmt.Sprintf( + "%s %s %s"+placeholders+"%s", + columnName, + expr.SQLExpression, + expr.SQLPrefix, + expr.SQLSuffix, + ), values +} + +func NewMultivalueExpression[T any](sqlExpression, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) MultivalueExpression[T] { + return MultivalueExpression[T]{ + Values: values, + SQLExpression: sqlExpression, + SQLConnector: sqlConnector, + SQLPrefix: sqlPrefix, + SQLSuffix: sqlSuffix, + } +} + type PredicateExpression[T any] struct { SQLExpression string } @@ -87,6 +130,10 @@ func NewPredicateExpression[T any](sqlExpression string) PredicateExpression[T] } // Comparison Operators +// refs: +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// https://www.postgresql.org/docs/current/functions-comparison.html + func Eq[T any](value T) ValueExpression[T] { return NewValueExpression(value, "=") } @@ -103,11 +150,6 @@ func LtOrEq[T any](value T) ValueExpression[T] { return NewValueExpression(value, "<=") } -// TODO no existe en psql -func NotLt[T any](value T) ValueExpression[T] { - return NewValueExpression(value, "!<") -} - func Gt[T any](value T) ValueExpression[T] { return NewValueExpression(value, ">") } @@ -117,8 +159,17 @@ func GtOrEq[T any](value T) ValueExpression[T] { } // Comparison Predicates +// refs: +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE -// TODO BETWEEN, NOT BETWEEN +func Between[T any](v1 T, v2 T) MultivalueExpression[T] { + return NewMultivalueExpression("BETWEEN", "AND", "", "", v1, v2) +} + +func NotBetween[T any](v1 T, v2 T) MultivalueExpression[T] { + return NewMultivalueExpression("NOT BETWEEN", "AND", "", "", v1, v2) +} // TODO no deberia ser posible para todos, solo los que son nullables // pero como puedo saberlo, los que son pointers?, pero tambien hay otros como deletedAt que pueden ser null por su valuer diff --git a/badorm/mysql/array.go b/badorm/mysql/array.go index ae2df696..333e1aa5 100644 --- a/badorm/mysql/array.go +++ b/badorm/mysql/array.go @@ -1,52 +1,14 @@ package mysql -import ( - "fmt" - "strings" - - "github.com/elliotchance/pie/v2" -) +import "github.com/ditrit/badaas/badorm" // Row and Array Comparisons -type ArrayExpression[T any] struct { - Values []T - SQLExpression string -} - -//nolint:unused // see inside -func (expr ArrayExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func NewArrayExpression[T any](values []T, sqlExpression string) ArrayExpression[T] { - return ArrayExpression[T]{ - Values: values, - SQLExpression: sqlExpression, - } -} - -func (expr ArrayExpression[T]) ToSQL(columnName string) (string, []any) { - placeholders := strings.Join(pie.Map(expr.Values, func(value T) string { - return "?" - }), ", ") - - values := pie.Map(expr.Values, func(value T) any { - return value - }) - - return fmt.Sprintf( - "%s %s ("+placeholders+")", - columnName, - expr.SQLExpression, - ), values -} - -func ArrayIn[T any](values ...T) ArrayExpression[T] { - return NewArrayExpression(values, "IN") +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in +func ArrayIn[T any](values ...T) badorm.MultivalueExpression[T] { + return badorm.NewMultivalueExpression("IN", ",", "(", ")", values...) } -func ArrayNotIn[T any](values ...T) ArrayExpression[T] { - return NewArrayExpression(values, "NOT IN") +func ArrayNotIn[T any](values ...T) badorm.MultivalueExpression[T] { + return badorm.NewMultivalueExpression("NOT IN", ",", "(", ")", values...) } diff --git a/badorm/mysql/comparison.go b/badorm/mysql/comparison.go index 2c9470c5..e1408435 100644 --- a/badorm/mysql/comparison.go +++ b/badorm/mysql/comparison.go @@ -4,6 +4,8 @@ import "github.com/ditrit/badaas/badorm" // Comparison Predicates +// preferred over eq +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal-to func IsEqual[T any](value T) badorm.ValueExpression[T] { return badorm.NewValueExpression(value, "<=>") } diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index e68af4de..67c1e3a3 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -110,6 +110,38 @@ func (ts *ExpressionIntTestSuite) TestGtOrEq() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } +func (ts *ExpressionIntTestSuite) TestBetween() { + match1 := ts.createProduct("match", 3, 0, false, nil) + match2 := ts.createProduct("match", 4, 0, false, nil) + ts.createProduct("not_match", 6, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Between(3, 5), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestNotBetween() { + match1 := ts.createProduct("match", 3, 0, false, nil) + match2 := ts.createProduct("match", 4, 0, false, nil) + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.NotBetween(0, 2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + func (ts *ExpressionIntTestSuite) TestIsDistinct() { match1 := ts.createProduct("match", 3, 0, false, nil) match2 := ts.createProduct("match", 4, 0, false, nil) From ab64bce2d0d9a19b412acab329d18848a15c1fd9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 15 Jun 2023 10:24:19 +0200 Subject: [PATCH 346/467] refactor: arrayExpression can be valueExpression --- badorm/expression.go | 14 +++++++------- badorm/mysql/comparison.go | 2 +- badorm/psql/array.go | 38 +++++--------------------------------- badorm/psql/comparison.go | 4 ++-- 4 files changed, 15 insertions(+), 43 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index 42e01dd2..7bceea72 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -60,7 +60,7 @@ func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { return fmt.Sprintf("%s %s ?", columnName, expr.SQLExpression), []any{expr.Value} } -func NewValueExpression[T any](value T, sqlExpression string) ValueExpression[T] { +func NewValueExpression[T any](value any, sqlExpression string) ValueExpression[T] { return ValueExpression[T]{ Value: value, SQLExpression: sqlExpression, @@ -135,27 +135,27 @@ func NewPredicateExpression[T any](sqlExpression string) PredicateExpression[T] // https://www.postgresql.org/docs/current/functions-comparison.html func Eq[T any](value T) ValueExpression[T] { - return NewValueExpression(value, "=") + return NewValueExpression[T](value, "=") } func NotEq[T any](value T) ValueExpression[T] { - return NewValueExpression(value, "<>") + return NewValueExpression[T](value, "<>") } func Lt[T any](value T) ValueExpression[T] { - return NewValueExpression(value, "<") + return NewValueExpression[T](value, "<") } func LtOrEq[T any](value T) ValueExpression[T] { - return NewValueExpression(value, "<=") + return NewValueExpression[T](value, "<=") } func Gt[T any](value T) ValueExpression[T] { - return NewValueExpression(value, ">") + return NewValueExpression[T](value, ">") } func GtOrEq[T any](value T) ValueExpression[T] { - return NewValueExpression(value, ">=") + return NewValueExpression[T](value, ">=") } // Comparison Predicates diff --git a/badorm/mysql/comparison.go b/badorm/mysql/comparison.go index e1408435..0a18fd47 100644 --- a/badorm/mysql/comparison.go +++ b/badorm/mysql/comparison.go @@ -7,5 +7,5 @@ import "github.com/ditrit/badaas/badorm" // preferred over eq // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal-to func IsEqual[T any](value T) badorm.ValueExpression[T] { - return badorm.NewValueExpression(value, "<=>") + return badorm.NewValueExpression[T](value, "<=>") } diff --git a/badorm/psql/array.go b/badorm/psql/array.go index 52b8f13a..2f5c755e 100644 --- a/badorm/psql/array.go +++ b/badorm/psql/array.go @@ -1,41 +1,13 @@ package psql -import ( - "fmt" -) +import "github.com/ditrit/badaas/badorm" // Row and Array Comparisons -type ArrayExpression[T any] struct { - Values []T - SQLExpression string +func ArrayIn[T any](values ...T) badorm.ValueExpression[T] { + return badorm.NewValueExpression[T](values, "IN") } -//nolint:unused // see inside -func (expr ArrayExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func NewArrayExpression[T any](values []T, sqlExpression string) ArrayExpression[T] { - return ArrayExpression[T]{ - Values: values, - SQLExpression: sqlExpression, - } -} - -func (expr ArrayExpression[T]) ToSQL(columnName string) (string, []any) { - return fmt.Sprintf( - "%s %s ?", - columnName, - expr.SQLExpression, - ), []any{expr.Values} -} - -func ArrayIn[T any](values ...T) ArrayExpression[T] { - return NewArrayExpression(values, "IN") -} - -func ArrayNotIn[T any](values ...T) ArrayExpression[T] { - return NewArrayExpression(values, "NOT IN") +func ArrayNotIn[T any](values ...T) badorm.ValueExpression[T] { + return badorm.NewValueExpression[T](values, "NOT IN") } diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go index e4049f81..cfaedf52 100644 --- a/badorm/psql/comparison.go +++ b/badorm/psql/comparison.go @@ -5,9 +5,9 @@ import "github.com/ditrit/badaas/badorm" // Comparison Predicates func IsDistinct[T any](value T) badorm.ValueExpression[T] { - return badorm.NewValueExpression(value, "IS DISTINCT FROM") + return badorm.NewValueExpression[T](value, "IS DISTINCT FROM") } func IsNotDistinct[T any](value T) badorm.ValueExpression[T] { - return badorm.NewValueExpression(value, "IS NOT DISTINCT FROM") + return badorm.NewValueExpression[T](value, "IS NOT DISTINCT FROM") } From 25dcc86a70fb792749958917cd00d3705d00e7f0 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 15 Jun 2023 11:39:22 +0200 Subject: [PATCH 347/467] now pointers are compared aganist the pointed type (isNull must be used to check null --- badorm/expression.go | 16 +++-- .../conditions/employee_conditions.go | 4 +- .../conditions/product_conditions.go | 10 +++- testintegration/conditions/sale_conditions.go | 4 +- .../conditions/seller_conditions.go | 4 +- testintegration/crudService.go | 21 ++----- testintegration/expressions_test.go | 60 ++++++++++++++++++- testintegration/models/models.go | 1 + tools/badctl/cmd/gen/conditions/condition.go | 4 -- tools/badctl/cmd/gen/conditions/jenParam.go | 4 -- 10 files changed, 84 insertions(+), 44 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index 7bceea72..8d2e1d01 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -39,12 +39,12 @@ var nullableKinds = []reflect.Kind{ // TODO aca me gustaria que devuelva []T pero no me anda asi func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { - // sino que para punteros no haya equal nil? // TODO este chequeo deberia ser solo cuando T es un puntero // y que pasa con time, deletedAt, y otros nullables por valuer // TODO que pasa para los demas symbols, puede meterme un null en un lt? // TODO esto esta feo // TODO tambien lo que hace la libreria esa es transformarlo en in si es un array + // TODO ahora solo es util para los arrays y eso, para pointers ya no existe esta posibilidad if expr.SQLExpression == "=" { reflectVal := reflect.ValueOf(expr.Value) isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) @@ -171,8 +171,6 @@ func NotBetween[T any](v1 T, v2 T) MultivalueExpression[T] { return NewMultivalueExpression("NOT BETWEEN", "AND", "", "", v1, v2) } -// TODO no deberia ser posible para todos, solo los que son nullables -// pero como puedo saberlo, los que son pointers?, pero tambien hay otros como deletedAt que pueden ser null por su valuer func IsNull[T any]() PredicateExpression[T] { return NewPredicateExpression[T]("IS NULL") } @@ -184,26 +182,26 @@ func IsNotNull[T any]() PredicateExpression[T] { // Boolean Comparison Predicates // TODO que pasa con otros que mapean a bool por valuer? -func IsTrue[T bool | *bool | sql.NullBool]() PredicateExpression[T] { +func IsTrue[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS TRUE") } -func IsNotTrue[T bool | *bool | sql.NullBool]() PredicateExpression[T] { +func IsNotTrue[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS NOT TRUE") } -func IsFalse[T bool | *bool | sql.NullBool]() PredicateExpression[T] { +func IsFalse[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS FALSE") } -func IsNotFalse[T bool | *bool | sql.NullBool]() PredicateExpression[T] { +func IsNotFalse[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS NOT FALSE") } -func IsUnknown[T *bool | sql.NullBool]() PredicateExpression[T] { +func IsUnknown[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS UNKNOWN") } -func IsNotUnknown[T *bool | sql.NullBool]() PredicateExpression[T] { +func IsNotUnknown[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS NOT UNKNOWN") } diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 4730dd28..e6fff2d9 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -45,8 +45,8 @@ func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condit T2Field: "ID", } } -func EmployeeBossId(exprs ...badorm.Expression[*badorm.UUID]) badorm.FieldCondition[models.Employee, *badorm.UUID] { - return badorm.FieldCondition[models.Employee, *badorm.UUID]{ +func EmployeeBossId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Employee, badorm.UUID] { + return badorm.FieldCondition[models.Employee, badorm.UUID]{ Expressions: exprs, Field: "BossID", } diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index 7c165943..13c70356 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -45,8 +45,8 @@ func ProductInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Pr Field: "Int", } } -func ProductIntPointer(exprs ...badorm.Expression[*int]) badorm.FieldCondition[models.Product, *int] { - return badorm.FieldCondition[models.Product, *int]{ +func ProductIntPointer(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Product, int] { + return badorm.FieldCondition[models.Product, int]{ Expressions: exprs, Field: "IntPointer", } @@ -57,6 +57,12 @@ func ProductFloat(exprs ...badorm.Expression[float64]) badorm.FieldCondition[mod Field: "Float", } } +func ProductNullFloat(exprs ...badorm.Expression[sql.NullFloat64]) badorm.FieldCondition[models.Product, sql.NullFloat64] { + return badorm.FieldCondition[models.Product, sql.NullFloat64]{ + Expressions: exprs, + Field: "NullFloat", + } +} func ProductBool(exprs ...badorm.Expression[bool]) badorm.FieldCondition[models.Product, bool] { return badorm.FieldCondition[models.Product, bool]{ Expressions: exprs, diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index d9199b81..4e19c787 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -64,8 +64,8 @@ func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[ T2Field: "ID", } } -func SaleSellerId(exprs ...badorm.Expression[*badorm.UUID]) badorm.FieldCondition[models.Sale, *badorm.UUID] { - return badorm.FieldCondition[models.Sale, *badorm.UUID]{ +func SaleSellerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Sale, badorm.UUID] { + return badorm.FieldCondition[models.Sale, badorm.UUID]{ Expressions: exprs, Field: "SellerID", } diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 0cdf03d9..146c3251 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -38,8 +38,8 @@ func SellerName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models Field: "Name", } } -func SellerCompanyId(exprs ...badorm.Expression[*badorm.UUID]) badorm.FieldCondition[models.Seller, *badorm.UUID] { - return badorm.FieldCondition[models.Seller, *badorm.UUID]{ +func SellerCompanyId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Seller, badorm.UUID] { + return badorm.FieldCondition[models.Seller, badorm.UUID]{ Expressions: exprs, Field: "CompanyID", } diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 3a2c13ca..190087d2 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -310,20 +310,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWith ts.createProduct("not_match", 2, 0, false, nil) entities, err := ts.crudProductService.GetEntities( - conditions.ProductIntPointer(badorm.Eq(&intMatch)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeByNil() { - match := ts.createProduct("match", 1, 0, false, nil) - intNotMatch := 2 - ts.createProduct("not_match", 2, 0, false, &intNotMatch) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductIntPointer(badorm.Eq[*int](nil)), + conditions.ProductIntPointer(badorm.Eq(1)), ) ts.Nil(err) @@ -441,7 +428,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOpt ts.createSale(0, product2, seller2) entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSellerId(badorm.Eq(&seller1.ID)), + conditions.SaleSellerId(badorm.Eq(seller1.ID)), ) ts.Nil(err) @@ -458,7 +445,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOpt ts.createSale(0, product2, seller2) entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSellerId(badorm.Eq[*badorm.UUID](nil)), + conditions.SaleSellerId(badorm.IsNull[badorm.UUID]()), ) ts.Nil(err) @@ -729,7 +716,7 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFilte entities, err := ts.crudSaleService.GetEntities( conditions.SaleProduct( - conditions.ProductIntPointer(badorm.Eq[*int](nil)), + conditions.ProductIntPointer(badorm.IsNull[int]()), ), ) ts.Nil(err) diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 67c1e3a3..83bf9d9e 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -31,6 +31,24 @@ func NewExpressionsIntTestSuite( } } +func (ts *ExpressionIntTestSuite) TestEqPointers() { + intMatch := 1 + match := ts.createProduct("match", 1, 0, false, &intMatch) + + intNotMatch := 2 + ts.createProduct("match", 3, 0, false, &intNotMatch) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductIntPointer( + badorm.Eq(1), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + func (ts *ExpressionIntTestSuite) TestNotEq() { match1 := ts.createProduct("match", 1, 0, false, nil) match2 := ts.createProduct("match", 3, 0, false, nil) @@ -201,7 +219,26 @@ func (ts *ExpressionIntTestSuite) TestIsNull() { entities, err := ts.crudProductService.GetEntities( conditions.ProductIntPointer( // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsNull[*int](), + badorm.IsNull[int](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsNullNotPointers() { + match := ts.createProduct("match", 0, 0, false, nil) + + notMatch := ts.createProduct("not_match", 0, 0, false, nil) + notMatch.NullFloat = sql.NullFloat64{Valid: true, Float64: 6} + err := ts.db.Save(notMatch).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullFloat( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNull[sql.NullFloat64](), ), ) ts.Nil(err) @@ -218,7 +255,26 @@ func (ts *ExpressionIntTestSuite) TestIsNotNull() { entities, err := ts.crudProductService.GetEntities( conditions.ProductIntPointer( // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsNotNull[*int](), + badorm.IsNotNull[int](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestIsNotNullNotPointers() { + match := ts.createProduct("match", 0, 0, false, nil) + match.NullFloat = sql.NullFloat64{Valid: true, Float64: 6} + err := ts.db.Save(match).Error + ts.Nil(err) + + ts.createProduct("not_match", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullFloat( + // TODO esto no queda muy lindo que hay que ponerlo asi + badorm.IsNotNull[sql.NullFloat64](), ), ) ts.Nil(err) diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 609b78e4..893e3931 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -72,6 +72,7 @@ type Product struct { Int int IntPointer *int Float float64 + NullFloat sql.NullFloat64 Bool bool NullBool sql.NullBool ByteArray []byte diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 0144dd32..c3ff04f8 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -53,8 +53,6 @@ func (condition *Condition) generate(objectType Type, field Field) { ) case *types.Pointer: // the field is a pointer - // adapt param to pointer and generate code for the pointed type - condition.param.ToPointer() condition.generate( objectType, field.ChangeType(fieldType.Elem()), @@ -96,8 +94,6 @@ func (condition *Condition) generateForSlice(objectType Type, field Field) { } case *types.Pointer: // slice of pointers, generate code for a slice of the pointed type - // after changing the param - condition.param.ToPointer() condition.generateForSlice( objectType, field.ChangeType(elemType.Elem()), diff --git a/tools/badctl/cmd/gen/conditions/jenParam.go b/tools/badctl/cmd/gen/conditions/jenParam.go index 1e4dac61..f2a316c1 100644 --- a/tools/badctl/cmd/gen/conditions/jenParam.go +++ b/tools/badctl/cmd/gen/conditions/jenParam.go @@ -76,10 +76,6 @@ func (param JenParam) ToBasicKind(basicType *types.Basic) { } } -func (param JenParam) ToPointer() { - param.internalType.Op("*") -} - func (param JenParam) ToSlice() { param.internalType.Index() } From 3d92085712afb392a11f542db7b261a54a6f0208 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 15 Jun 2023 15:07:39 +0200 Subject: [PATCH 348/467] EqOrIsNull and NotEqOrIsNotNull --- badorm/expression.go | 87 ++++++++++--- go.work.sum | 2 + testintegration/crudService.go | 16 --- testintegration/expressions_test.go | 183 ++++++++++++++++++++++++++++ 4 files changed, 254 insertions(+), 34 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index 8d2e1d01..c7488a75 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -2,6 +2,8 @@ package badorm import ( "database/sql" + "database/sql/driver" + "errors" "fmt" "reflect" "strings" @@ -9,6 +11,8 @@ import ( "github.com/elliotchance/pie/v2" ) +var ErrNotRelated = errors.New("value type not related with T") + type Expression[T any] interface { ToSQL(columnName string) (string, []any) @@ -39,24 +43,6 @@ var nullableKinds = []reflect.Kind{ // TODO aca me gustaria que devuelva []T pero no me anda asi func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { - // TODO este chequeo deberia ser solo cuando T es un puntero - // y que pasa con time, deletedAt, y otros nullables por valuer - // TODO que pasa para los demas symbols, puede meterme un null en un lt? - // TODO esto esta feo - // TODO tambien lo que hace la libreria esa es transformarlo en in si es un array - // TODO ahora solo es util para los arrays y eso, para pointers ya no existe esta posibilidad - if expr.SQLExpression == "=" { - reflectVal := reflect.ValueOf(expr.Value) - isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) - // avoid nil is not nil behavior of go - if isNullableKind && reflectVal.IsNil() { - return fmt.Sprintf( - "%s IS NULL", - columnName, - ), []any{} - } - } - return fmt.Sprintf("%s %s ?", columnName, expr.SQLExpression), []any{expr.Value} } @@ -134,14 +120,79 @@ func NewPredicateExpression[T any](sqlExpression string) PredicateExpression[T] // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html // https://www.postgresql.org/docs/current/functions-comparison.html +// EqOrIsNull must be used in cases where value can be NULL func Eq[T any](value T) ValueExpression[T] { return NewValueExpression[T](value, "=") } +// if value is not NULL returns a Eq expression +// but if value is NULL returns a IsNull expression +// this must be used because ANSI SQL-92 standard defines: +// NULL = NULL evaluates to unknown, which is later considered a false +// +// this behavior can be also avoided in other ways as: +// * in SQLServer you can set ansi_nulls setting to off +// * in MySQL you can use equal_to operator (implemented in mysql.IsEqual) +// * in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in psql.IsNotDistinct) +func EqOrIsNull[T any](value any) (Expression[T], error) { + return expressionFromValueOrNil[T](value, Eq[T], IsNull[T]()) +} + +// NotEqOrNotIsNull must be used in cases where value can be NULL func NotEq[T any](value T) ValueExpression[T] { return NewValueExpression[T](value, "<>") } +// if value is not NULL returns a NotEq expression +// but if value is NULL returns a IsNotNull expression +// this must be used because ANSI SQL-92 standard defines: +// NULL = NULL evaluates to unknown, which is later considered a false +// +// this behavior can be also avoided in other ways as: +// * in SQLServer you can set ansi_nulls setting to off +// * in PostgreSQL you can use the IS DISTINCT operator (implemented in psql.IsDistinct) +func NotEqOrIsNotNull[T any](value any) (Expression[T], error) { + return expressionFromValueOrNil[T](value, NotEq[T], IsNotNull[T]()) +} + +func expressionFromValueOrNil[T any](value any, eqFunc func(T) ValueExpression[T], nilExpression Expression[T]) (Expression[T], error) { + if value == nil { + return nilExpression, nil + } + + valueTPointer, isTPointer := value.(*T) + if isTPointer { + if valueTPointer == nil { + return nilExpression, nil + } + + return eqFunc(*valueTPointer), nil + } + + valueT, isT := value.(T) + if isT { + reflectVal := reflect.ValueOf(value) + isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) + // avoid nil is not nil behavior of go + if isNullableKind && reflectVal.IsNil() { + return nilExpression, nil + } + + // TODO creo que esto lo voy a tener que mover afuera si quiero que los nullables se comparen contra los no nullables + valuer, isValuer := value.(driver.Valuer) + if isValuer { + valuerValue, err := valuer.Value() + if err == nil && valuerValue == nil { + return nilExpression, nil + } + } + + return eqFunc(valueT), nil + } + + return nil, ErrNotRelated +} + func Lt[T any](value T) ValueExpression[T] { return NewValueExpression[T](value, "<") } diff --git a/go.work.sum b/go.work.sum index 7892dc84..35e9278e 100644 --- a/go.work.sum +++ b/go.work.sum @@ -452,6 +452,7 @@ google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= @@ -468,6 +469,7 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/testintegration/crudService.go b/testintegration/crudService.go index 190087d2..8011f0cc 100644 --- a/testintegration/crudService.go +++ b/testintegration/crudService.go @@ -361,22 +361,6 @@ func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayEmpty( EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayNil() { - match := ts.createProduct("match", 1, 0, false, nil) - notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) - notMatch1.ByteArray = []byte{2, 3} - - err := ts.db.Save(notMatch1).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductByteArray(badorm.Eq[[]uint8](nil)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { match := ts.createProduct("match", 1, 0, false, nil) notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 83bf9d9e..aa8f7aac 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -49,6 +49,189 @@ func (ts *ExpressionIntTestSuite) TestEqPointers() { EqualList(&ts.Suite, []*models.Product{match}, entities) } +func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNotNil() { + match := ts.createProduct("match", 1, 0, false, nil) + ts.createProduct("match", 3, 0, false, nil) + + eqOrNil, err := badorm.EqOrIsNull[int](1) + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + eqOrNil, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNil() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch := ts.createProduct("match", 3, 0, false, nil) + notMatch.ByteArray = []byte{2, 3} + err := ts.db.Save(notMatch).Error + ts.Nil(err) + + eqOrNil, err := badorm.EqOrIsNull[[]byte](nil) + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductByteArray( + eqOrNil, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNilOfType() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch := ts.createProduct("match", 3, 0, false, nil) + notMatch.ByteArray = []byte{2, 3} + err := ts.db.Save(notMatch).Error + ts.Nil(err) + + var nilOfType []byte + eqOrNil, err := badorm.EqOrIsNull[[]byte](nilOfType) + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductByteArray( + eqOrNil, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestEqOrIsNullNilPointer() { + match := ts.createProduct("match", 1, 0, false, nil) + + notMatchInt := 1 + ts.createProduct("match", 3, 0, false, ¬MatchInt) + + var intPointer *int + eqOrNil, err := badorm.EqOrIsNull[int](intPointer) + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductIntPointer( + eqOrNil, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestEqOrIsNullNotNilPointer() { + matchInt := 1 + match := ts.createProduct("match", 1, 0, false, &matchInt) + + ts.createProduct("match", 3, 0, false, nil) + + eqOrNil, err := badorm.EqOrIsNull[int](&matchInt) + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + eqOrNil, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestEqOrIsNullNullableNil() { + match := ts.createProduct("match", 1, 0, false, nil) + + notMatch := ts.createProduct("match", 3, 0, false, nil) + notMatch.NullFloat = sql.NullFloat64{Valid: true, Float64: 6} + err := ts.db.Save(notMatch).Error + ts.Nil(err) + + eqOrNil, err := badorm.EqOrIsNull[sql.NullFloat64](sql.NullFloat64{Valid: false}) + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullFloat( + eqOrNil, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestEqOrIsNullNullableNotNil() { + match := ts.createProduct("match", 1, 0, false, nil) + match.NullFloat = sql.NullFloat64{Valid: true, Float64: 6} + err := ts.db.Save(match).Error + ts.Nil(err) + + ts.createProduct("match", 3, 0, false, nil) + + eqOrNil, err := badorm.EqOrIsNull[sql.NullFloat64](sql.NullFloat64{Valid: true, Float64: 6}) + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullFloat( + eqOrNil, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestEqOrIsNullNotRelated() { + notRelated := "not_related" + _, err := badorm.EqOrIsNull[int](¬Related) + ts.ErrorIs(err, badorm.ErrNotRelated) +} + +func (ts *ExpressionIntTestSuite) TestNotEqOrIsNotNullTNotNil() { + match := ts.createProduct("match", 1, 0, false, nil) + ts.createProduct("match", 3, 0, false, nil) + + notEqOrNotNil, err := badorm.NotEqOrIsNotNull[int](3) + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + notEqOrNotNil, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestNotEqOrIsNotNullTNil() { + match := ts.createProduct("match", 1, 0, false, nil) + match.ByteArray = []byte{2, 3} + err := ts.db.Save(match).Error + ts.Nil(err) + + ts.createProduct("match", 3, 0, false, nil) + + notEqOrNotNil, err := badorm.NotEqOrIsNotNull[[]byte](nil) + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductByteArray( + notEqOrNotNil, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + func (ts *ExpressionIntTestSuite) TestNotEq() { match1 := ts.createProduct("match", 1, 0, false, nil) match2 := ts.createProduct("match", 3, 0, false, nil) From cc45d5dcee98a09aba2af6ed0a76a3e707c6cde8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 15 Jun 2023 15:56:22 +0200 Subject: [PATCH 349/467] check that the value is not null for corresponding expressions --- badorm/condition.go | 24 ++++-- badorm/expression.go | 128 +++++++++++++++++++--------- testintegration/expressions_test.go | 68 +++++++-------- 3 files changed, 138 insertions(+), 82 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index a4a782d8..cd0525c5 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -31,7 +31,7 @@ type Condition[T any] interface { } type WhereCondition[T any] interface { - GetSQL(query *gorm.DB, tableName string) (string, []any) + GetSQL(query *gorm.DB, tableName string) (string, []any, error) getField() string } @@ -52,7 +52,10 @@ func (condition FieldCondition[TObject, TAtribute]) interfaceVerificationMethod( // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { - sql, values := condition.GetSQL(query, tableName) + sql, values, err := condition.GetSQL(query, tableName) + if err != nil { + return nil, err + } if condition.Field == DeletedAtField { query = query.Unscoped() @@ -72,7 +75,7 @@ func (condition FieldCondition[TObject, TAtribute]) getField() string { return condition.Field } -func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, tableName string) (string, []any) { +func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { columnName := condition.Column if columnName == "" { columnName = query.NamingStrategy.ColumnName(tableName, condition.Field) @@ -91,19 +94,23 @@ func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table conditionString += " AND " } - expressionSQL, expressionValues := expression.ToSQL( + expressionSQL, expressionValues, err := expression.ToSQL( fmt.Sprintf( "%s.%s", tableName, columnName, ), ) + if err != nil { + return "", nil, err + } + conditionString += expressionSQL values = append(values, expressionValues...) } - return conditionString, values + return conditionString, values, nil } type JoinCondition[T1 any, T2 any] struct { @@ -146,7 +153,11 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName isDeletedAtConditionPresent = true } - sql, values := condition.GetSQL(query, nextTableName) + sql, values, err := condition.GetSQL(query, nextTableName) + if err != nil { + return nil, err + } + conditionsValues = append(conditionsValues, values...) joinQuery += " AND " + sql } @@ -201,6 +212,7 @@ func divideConditionsByType[T any]( typedCondition, ok := condition.(WhereCondition[T]) if ok { // TODO ver si dejo asi + // esto me trajo problems cuando hice un cambio en el metodo, ya no cumplia y todas las condiciones me quedaron vacias thisEntityConditions = append(thisEntityConditions, typedCondition) } case JoinType: diff --git a/badorm/expression.go b/badorm/expression.go index c7488a75..4b79f875 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -11,10 +11,14 @@ import ( "github.com/elliotchance/pie/v2" ) -var ErrNotRelated = errors.New("value type not related with T") +var ( + ErrNotRelated = errors.New("value type not related with T") + ErrValueCantBeNull = errors.New("value to compare can't be null") +) type Expression[T any] interface { - ToSQL(columnName string) (string, []any) + // TODO quizas no devolver los values aca y ponerlos en otro metodo? + ToSQL(columnName string) (string, []any, error) // This method is necessary to get the compiler to verify // that an object is of type Expression[T], @@ -42,8 +46,12 @@ var nullableKinds = []reflect.Kind{ } // TODO aca me gustaria que devuelva []T pero no me anda asi -func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any) { - return fmt.Sprintf("%s %s ?", columnName, expr.SQLExpression), []any{expr.Value} +func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any, error) { + return fmt.Sprintf( + "%s %s ?", + columnName, + expr.SQLExpression, + ), []any{expr.Value}, nil } func NewValueExpression[T any](value any, sqlExpression string) ValueExpression[T] { @@ -53,6 +61,14 @@ func NewValueExpression[T any](value any, sqlExpression string) ValueExpression[ } } +func NewCantBeNullValueExpression[T any](value any, sqlExpression string) Expression[T] { + if value == nil || mapsToNull(value) { + return NewInvalidExpression[T](ErrValueCantBeNull) + } + + return NewValueExpression[T](value, sqlExpression) +} + type MultivalueExpression[T any] struct { Values []T SQLExpression string @@ -67,7 +83,7 @@ func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr MultivalueExpression[T]) ToSQL(columnName string) (string, []any) { +func (expr MultivalueExpression[T]) ToSQL(columnName string) (string, []any, error) { placeholders := strings.Join(pie.Map(expr.Values, func(value T) string { return "?" }), " "+expr.SQLConnector+" ") @@ -82,7 +98,7 @@ func (expr MultivalueExpression[T]) ToSQL(columnName string) (string, []any) { expr.SQLExpression, expr.SQLPrefix, expr.SQLSuffix, - ), values + ), values, nil } func NewMultivalueExpression[T any](sqlExpression, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) MultivalueExpression[T] { @@ -105,8 +121,8 @@ func (expr PredicateExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr PredicateExpression[T]) ToSQL(columnName string) (string, []any) { - return fmt.Sprintf("%s %s", columnName, expr.SQLExpression), []any{} +func (expr PredicateExpression[T]) ToSQL(columnName string) (string, []any, error) { + return fmt.Sprintf("%s %s", columnName, expr.SQLExpression), []any{}, nil } func NewPredicateExpression[T any](sqlExpression string) PredicateExpression[T] { @@ -115,14 +131,35 @@ func NewPredicateExpression[T any](sqlExpression string) PredicateExpression[T] } } +type InvalidExpression[T any] struct { + Err error +} + +//nolint:unused // see inside +func (expr InvalidExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + +func (expr InvalidExpression[T]) ToSQL(columnName string) (string, []any, error) { + return "", nil, expr.Err +} + +func NewInvalidExpression[T any](err error) InvalidExpression[T] { + return InvalidExpression[T]{ + Err: err, + } +} + // Comparison Operators // refs: // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html // https://www.postgresql.org/docs/current/functions-comparison.html // EqOrIsNull must be used in cases where value can be NULL -func Eq[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, "=") +func Eq[T any](value T) Expression[T] { + // TODO hacer el eq de sql server que si puede con los null + return NewCantBeNullValueExpression[T](value, "=") } // if value is not NULL returns a Eq expression @@ -134,13 +171,13 @@ func Eq[T any](value T) ValueExpression[T] { // * in SQLServer you can set ansi_nulls setting to off // * in MySQL you can use equal_to operator (implemented in mysql.IsEqual) // * in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in psql.IsNotDistinct) -func EqOrIsNull[T any](value any) (Expression[T], error) { +func EqOrIsNull[T any](value any) Expression[T] { return expressionFromValueOrNil[T](value, Eq[T], IsNull[T]()) } // NotEqOrNotIsNull must be used in cases where value can be NULL -func NotEq[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, "<>") +func NotEq[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, "<>") } // if value is not NULL returns a NotEq expression @@ -151,62 +188,70 @@ func NotEq[T any](value T) ValueExpression[T] { // this behavior can be also avoided in other ways as: // * in SQLServer you can set ansi_nulls setting to off // * in PostgreSQL you can use the IS DISTINCT operator (implemented in psql.IsDistinct) -func NotEqOrIsNotNull[T any](value any) (Expression[T], error) { +func NotEqOrIsNotNull[T any](value any) Expression[T] { return expressionFromValueOrNil[T](value, NotEq[T], IsNotNull[T]()) } -func expressionFromValueOrNil[T any](value any, eqFunc func(T) ValueExpression[T], nilExpression Expression[T]) (Expression[T], error) { +func expressionFromValueOrNil[T any](value any, notNilFunc func(T) Expression[T], nilExpression Expression[T]) Expression[T] { if value == nil { - return nilExpression, nil + return nilExpression } valueTPointer, isTPointer := value.(*T) if isTPointer { if valueTPointer == nil { - return nilExpression, nil + return nilExpression } - return eqFunc(*valueTPointer), nil + return notNilFunc(*valueTPointer) } valueT, isT := value.(T) if isT { - reflectVal := reflect.ValueOf(value) - isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) - // avoid nil is not nil behavior of go - if isNullableKind && reflectVal.IsNil() { - return nilExpression, nil + if mapsToNull(value) { + return nilExpression } - // TODO creo que esto lo voy a tener que mover afuera si quiero que los nullables se comparen contra los no nullables - valuer, isValuer := value.(driver.Valuer) - if isValuer { - valuerValue, err := valuer.Value() - if err == nil && valuerValue == nil { - return nilExpression, nil - } - } + return notNilFunc(valueT) + } + + return NewInvalidExpression[T](ErrNotRelated) +} - return eqFunc(valueT), nil +func mapsToNull(value any) bool { + reflectVal := reflect.ValueOf(value) + isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) + // avoid nil is not nil behavior of go + if isNullableKind && reflectVal.IsNil() { + return true + } + + // TODO creo que esto lo voy a tener que mover afuera si quiero que los nullables se comparen contra los no nullables + valuer, isValuer := value.(driver.Valuer) + if isValuer { + valuerValue, err := valuer.Value() + if err == nil && valuerValue == nil { + return true + } } - return nil, ErrNotRelated + return false } -func Lt[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, "<") +func Lt[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, "<") } -func LtOrEq[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, "<=") +func LtOrEq[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, "<=") } -func Gt[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, ">") +func Gt[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, ">") } -func GtOrEq[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, ">=") +func GtOrEq[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, ">=") } // Comparison Predicates @@ -215,6 +260,7 @@ func GtOrEq[T any](value T) ValueExpression[T] { // https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE func Between[T any](v1 T, v2 T) MultivalueExpression[T] { + // TODO cant be null? return NewMultivalueExpression("BETWEEN", "AND", "", "", v1, v2) } diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index aa8f7aac..a763a374 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -31,6 +31,15 @@ func NewExpressionsIntTestSuite( } } +func (ts *ExpressionIntTestSuite) TestEqNullableNullReturnsError() { + _, err := ts.crudProductService.GetEntities( + conditions.ProductNullFloat( + badorm.Eq(sql.NullFloat64{Valid: false}), + ), + ) + ts.ErrorIs(err, badorm.ErrValueCantBeNull) +} + func (ts *ExpressionIntTestSuite) TestEqPointers() { intMatch := 1 match := ts.createProduct("match", 1, 0, false, &intMatch) @@ -53,12 +62,9 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNotNil() { match := ts.createProduct("match", 1, 0, false, nil) ts.createProduct("match", 3, 0, false, nil) - eqOrNil, err := badorm.EqOrIsNull[int](1) - ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - eqOrNil, + badorm.EqOrIsNull[int](1), ), ) ts.Nil(err) @@ -73,12 +79,9 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNil() { err := ts.db.Save(notMatch).Error ts.Nil(err) - eqOrNil, err := badorm.EqOrIsNull[[]byte](nil) - ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( conditions.ProductByteArray( - eqOrNil, + badorm.EqOrIsNull[[]byte](nil), ), ) ts.Nil(err) @@ -94,12 +97,10 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNilOfType() { ts.Nil(err) var nilOfType []byte - eqOrNil, err := badorm.EqOrIsNull[[]byte](nilOfType) - ts.Nil(err) entities, err := ts.crudProductService.GetEntities( conditions.ProductByteArray( - eqOrNil, + badorm.EqOrIsNull[[]byte](nilOfType), ), ) ts.Nil(err) @@ -114,12 +115,10 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullNilPointer() { ts.createProduct("match", 3, 0, false, ¬MatchInt) var intPointer *int - eqOrNil, err := badorm.EqOrIsNull[int](intPointer) - ts.Nil(err) entities, err := ts.crudProductService.GetEntities( conditions.ProductIntPointer( - eqOrNil, + badorm.EqOrIsNull[int](intPointer), ), ) ts.Nil(err) @@ -133,12 +132,9 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullNotNilPointer() { ts.createProduct("match", 3, 0, false, nil) - eqOrNil, err := badorm.EqOrIsNull[int](&matchInt) - ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - eqOrNil, + badorm.EqOrIsNull[int](&matchInt), ), ) ts.Nil(err) @@ -154,12 +150,9 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullNullableNil() { err := ts.db.Save(notMatch).Error ts.Nil(err) - eqOrNil, err := badorm.EqOrIsNull[sql.NullFloat64](sql.NullFloat64{Valid: false}) - ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( conditions.ProductNullFloat( - eqOrNil, + badorm.EqOrIsNull[sql.NullFloat64](sql.NullFloat64{Valid: false}), ), ) ts.Nil(err) @@ -175,12 +168,9 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullNullableNotNil() { ts.createProduct("match", 3, 0, false, nil) - eqOrNil, err := badorm.EqOrIsNull[sql.NullFloat64](sql.NullFloat64{Valid: true, Float64: 6}) - ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( conditions.ProductNullFloat( - eqOrNil, + badorm.EqOrIsNull[sql.NullFloat64](sql.NullFloat64{Valid: true, Float64: 6}), ), ) ts.Nil(err) @@ -190,7 +180,12 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullNullableNotNil() { func (ts *ExpressionIntTestSuite) TestEqOrIsNullNotRelated() { notRelated := "not_related" - _, err := badorm.EqOrIsNull[int](¬Related) + + _, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + badorm.EqOrIsNull[float64](¬Related), + ), + ) ts.ErrorIs(err, badorm.ErrNotRelated) } @@ -198,12 +193,9 @@ func (ts *ExpressionIntTestSuite) TestNotEqOrIsNotNullTNotNil() { match := ts.createProduct("match", 1, 0, false, nil) ts.createProduct("match", 3, 0, false, nil) - notEqOrNotNil, err := badorm.NotEqOrIsNotNull[int](3) - ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - notEqOrNotNil, + badorm.NotEqOrIsNotNull[int](3), ), ) ts.Nil(err) @@ -219,12 +211,9 @@ func (ts *ExpressionIntTestSuite) TestNotEqOrIsNotNullTNil() { ts.createProduct("match", 3, 0, false, nil) - notEqOrNotNil, err := badorm.NotEqOrIsNotNull[[]byte](nil) - ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( conditions.ProductByteArray( - notEqOrNotNil, + badorm.NotEqOrIsNotNull[[]byte](nil), ), ) ts.Nil(err) @@ -263,6 +252,15 @@ func (ts *ExpressionIntTestSuite) TestLt() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } +func (ts *ExpressionIntTestSuite) TestLtNullableNullReturnsError() { + _, err := ts.crudProductService.GetEntities( + conditions.ProductNullFloat( + badorm.Lt(sql.NullFloat64{Valid: false}), + ), + ) + ts.ErrorIs(err, badorm.ErrValueCantBeNull) +} + func (ts *ExpressionIntTestSuite) TestLtOrEq() { match1 := ts.createProduct("match", 1, 0, false, nil) match2 := ts.createProduct("match", 2, 0, false, nil) From ecb974e7e34249fa1f45458700b29a46330fa1b4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 15 Jun 2023 17:01:08 +0200 Subject: [PATCH 350/467] add sqlserver operators --- badorm/expression.go | 20 ++-- badorm/psql/comparison.go | 11 +- badorm/shared/comparison.go | 13 ++ badorm/sqlserver/comparison.go | 38 ++++++ testintegration/expressions_test.go | 178 +++++++++++++++++++++++++--- 5 files changed, 232 insertions(+), 28 deletions(-) create mode 100644 badorm/shared/comparison.go create mode 100644 badorm/sqlserver/comparison.go diff --git a/badorm/expression.go b/badorm/expression.go index 4b79f875..97683d05 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -155,10 +155,10 @@ func NewInvalidExpression[T any](err error) InvalidExpression[T] { // refs: // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html // https://www.postgresql.org/docs/current/functions-comparison.html +// https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 // EqOrIsNull must be used in cases where value can be NULL func Eq[T any](value T) Expression[T] { - // TODO hacer el eq de sql server que si puede con los null return NewCantBeNullValueExpression[T](value, "=") } @@ -167,10 +167,12 @@ func Eq[T any](value T) Expression[T] { // this must be used because ANSI SQL-92 standard defines: // NULL = NULL evaluates to unknown, which is later considered a false // -// this behavior can be also avoided in other ways as: -// * in SQLServer you can set ansi_nulls setting to off -// * in MySQL you can use equal_to operator (implemented in mysql.IsEqual) -// * in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in psql.IsNotDistinct) +// this behavior can be also avoided in other ways: +// - in SQLServer you can: +// ** set ansi_nulls setting to off and use sqlserver.EqNullable +// ** use the IS NOT DISTINCT operator (implemented in sqlserver.IsNotDistinct) +// - in MySQL you can use equal_to operator (implemented in mysql.IsEqual) +// - in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in psql.IsNotDistinct) func EqOrIsNull[T any](value any) Expression[T] { return expressionFromValueOrNil[T](value, Eq[T], IsNull[T]()) } @@ -185,9 +187,11 @@ func NotEq[T any](value T) Expression[T] { // this must be used because ANSI SQL-92 standard defines: // NULL = NULL evaluates to unknown, which is later considered a false // -// this behavior can be also avoided in other ways as: -// * in SQLServer you can set ansi_nulls setting to off -// * in PostgreSQL you can use the IS DISTINCT operator (implemented in psql.IsDistinct) +// this behavior can be also avoided in other ways: +// - in SQLServer you can: +// ** set ansi_nulls setting to off and use sqlserver.NotEqNullable +// ** use the IS DISTINCT operator (implemented in sqlserver.IsDistinct) +// - in PostgreSQL you can use the IS DISTINCT operator (implemented in psql.IsDistinct) func NotEqOrIsNotNull[T any](value any) Expression[T] { return expressionFromValueOrNil[T](value, NotEq[T], IsNotNull[T]()) } diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go index cfaedf52..4503440b 100644 --- a/badorm/psql/comparison.go +++ b/badorm/psql/comparison.go @@ -1,13 +1,14 @@ package psql -import "github.com/ditrit/badaas/badorm" - -// Comparison Predicates +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/shared" +) func IsDistinct[T any](value T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](value, "IS DISTINCT FROM") + return shared.IsDistinct(value) } func IsNotDistinct[T any](value T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](value, "IS NOT DISTINCT FROM") + return shared.IsNotDistinct(value) } diff --git a/badorm/shared/comparison.go b/badorm/shared/comparison.go new file mode 100644 index 00000000..6428bef1 --- /dev/null +++ b/badorm/shared/comparison.go @@ -0,0 +1,13 @@ +package shared + +import "github.com/ditrit/badaas/badorm" + +// Comparison Predicates + +func IsDistinct[T any](value T) badorm.ValueExpression[T] { + return badorm.NewValueExpression[T](value, "IS DISTINCT FROM") +} + +func IsNotDistinct[T any](value T) badorm.ValueExpression[T] { + return badorm.NewValueExpression[T](value, "IS NOT DISTINCT FROM") +} diff --git a/badorm/sqlserver/comparison.go b/badorm/sqlserver/comparison.go new file mode 100644 index 00000000..b33fc0d3 --- /dev/null +++ b/badorm/sqlserver/comparison.go @@ -0,0 +1,38 @@ +package sqlserver + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/shared" +) + +// Comparison Operators +// ref: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 + +// EqNullable is the same as badorm.Eq but it supports value to be NULL +// ansi_nulls must be set to off to avoid the NULL = NULL: unknown problem +func EqNullable[T any](value T) badorm.Expression[T] { + return badorm.NewValueExpression[T](value, "=") +} + +// NotEqNullable is the same as badorm.NotEq but it supports value to be NULL +// ansi_nulls must be set to off to avoid the NULL = NULL: unknown problem +func NotEqNullable[T any](value T) badorm.Expression[T] { + return badorm.NewValueExpression[T](value, "<>") +} + +func NotLt[T any](value T) badorm.Expression[T] { + return badorm.NewCantBeNullValueExpression[T](value, "!<") +} + +func NotGt[T any](value T) badorm.Expression[T] { + return badorm.NewCantBeNullValueExpression[T](value, "!>") +} + +// https://learn.microsoft.com/en-us/sql/t-sql/queries/is-distinct-from-transact-sql?view=sql-server-ver16 +func IsDistinct[T any](value T) badorm.ValueExpression[T] { + return shared.IsDistinct(value) +} + +func IsNotDistinct[T any](value T) badorm.ValueExpression[T] { + return shared.IsNotDistinct(value) +} diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index a763a374..80b6db29 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -9,6 +9,7 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/mysql" "github.com/ditrit/badaas/badorm/psql" + "github.com/ditrit/badaas/badorm/sqlserver" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" @@ -277,6 +278,28 @@ func (ts *ExpressionIntTestSuite) TestLtOrEq() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } +func (ts *ExpressionIntTestSuite) TestNotLt() { + switch getDBDialector() { + case configuration.SQLServer: + match1 := ts.createProduct("match", 3, 0, false, nil) + match2 := ts.createProduct("match", 4, 0, false, nil) + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + sqlserver.NotLt(3), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + case configuration.PostgreSQL, configuration.MySQL, configuration.SQLite: + // TODO + log.Println("TODO") + } +} + func (ts *ExpressionIntTestSuite) TestGt() { match1 := ts.createProduct("match", 3, 0, false, nil) match2 := ts.createProduct("match", 4, 0, false, nil) @@ -309,6 +332,28 @@ func (ts *ExpressionIntTestSuite) TestGtOrEq() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } +func (ts *ExpressionIntTestSuite) TestNotGt() { + switch getDBDialector() { + case configuration.SQLServer: + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 2, 0, false, nil) + ts.createProduct("not_match", 3, 0, false, nil) + ts.createProduct("not_match", 4, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + sqlserver.NotGt(2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + case configuration.PostgreSQL, configuration.MySQL, configuration.SQLite: + // TODO + log.Println("TODO") + } +} + func (ts *ExpressionIntTestSuite) TestBetween() { match1 := ts.createProduct("match", 3, 0, false, nil) match2 := ts.createProduct("match", 4, 0, false, nil) @@ -356,7 +401,16 @@ func (ts *ExpressionIntTestSuite) TestIsDistinct() { ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) - case configuration.MySQL, configuration.SQLServer, configuration.SQLite: + case configuration.SQLServer: + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + sqlserver.IsDistinct(2), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + case configuration.MySQL, configuration.SQLite: // TODO log.Println("TODO") } @@ -374,8 +428,10 @@ func (ts *ExpressionIntTestSuite) TestIsNotDistinct() { isNotEqualExpression = mysql.IsEqual(3) case configuration.PostgreSQL: isNotEqualExpression = psql.IsNotDistinct(3) - case configuration.SQLServer, configuration.SQLite: - // TODO esto no va a andar en todos + case configuration.SQLServer: + isNotEqualExpression = sqlserver.IsNotDistinct(3) + case configuration.SQLite: + // TODO isNotEqualExpression = psql.IsNotDistinct(3) } @@ -389,6 +445,38 @@ func (ts *ExpressionIntTestSuite) TestIsNotDistinct() { EqualList(&ts.Suite, []*models.Product{match}, entities) } +func (ts *ExpressionIntTestSuite) TestIsNotDistinctNullValue() { + match := ts.createProduct("match", 3, 0, false, nil) + + notMatch := ts.createProduct("not_match", 4, 0, false, nil) + notMatch.NullFloat = sql.NullFloat64{Valid: true, Float64: 6} + err := ts.db.Save(notMatch).Error + ts.Nil(err) + + var isEqualExpression badorm.Expression[sql.NullFloat64] + + switch getDBDialector() { + case configuration.MySQL: + isEqualExpression = mysql.IsEqual(sql.NullFloat64{Valid: false}) + case configuration.PostgreSQL: + isEqualExpression = psql.IsNotDistinct(sql.NullFloat64{Valid: false}) + case configuration.SQLServer: + isEqualExpression = sqlserver.IsNotDistinct(sql.NullFloat64{Valid: false}) + case configuration.SQLite: + // TODO + isEqualExpression = psql.IsNotDistinct(sql.NullFloat64{Valid: false}) + } + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullFloat( + isEqualExpression, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + func (ts *ExpressionIntTestSuite) TestIsNull() { match := ts.createProduct("match", 0, 0, false, nil) int1 := 1 @@ -468,10 +556,20 @@ func (ts *ExpressionIntTestSuite) TestIsTrue() { ts.createProduct("not_match", 0, 0, false, nil) ts.createProduct("not_match", 0, 0, false, nil) + var isTrueExpression badorm.Expression[bool] + + switch getDBDialector() { + case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: + // TODO esto no queda muy lindo que hay que ponerlo asi + isTrueExpression = badorm.IsTrue[bool]() + case configuration.SQLServer: + // sqlserver doesn't support IsTrue + isTrueExpression = badorm.Eq[bool](true) + } + entities, err := ts.crudProductService.GetEntities( conditions.ProductBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsTrue[bool](), + isTrueExpression, ), ) ts.Nil(err) @@ -484,10 +582,20 @@ func (ts *ExpressionIntTestSuite) TestIsFalse() { ts.createProduct("not_match", 0, 0, true, nil) ts.createProduct("not_match", 0, 0, true, nil) + var isFalseExpression badorm.Expression[bool] + + switch getDBDialector() { + case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: + // TODO esto no queda muy lindo que hay que ponerlo asi + isFalseExpression = badorm.IsFalse[bool]() + case configuration.SQLServer: + // sqlserver doesn't support IsFalse + isFalseExpression = badorm.Eq[bool](false) + } + entities, err := ts.crudProductService.GetEntities( conditions.ProductBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsFalse[bool](), + isFalseExpression, ), ) ts.Nil(err) @@ -507,10 +615,20 @@ func (ts *ExpressionIntTestSuite) TestIsNotTrue() { err = ts.db.Save(notMatch).Error ts.Nil(err) + var isNotTrueExpression badorm.Expression[sql.NullBool] + + switch getDBDialector() { + case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: + // TODO esto no queda muy lindo que hay que ponerlo asi + isNotTrueExpression = badorm.IsNotTrue[sql.NullBool]() + case configuration.SQLServer: + // sqlserver doesn't support IsNotTrue + isNotTrueExpression = sqlserver.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: true}) + } + entities, err := ts.crudProductService.GetEntities( conditions.ProductNullBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsNotTrue[sql.NullBool](), + isNotTrueExpression, ), ) ts.Nil(err) @@ -530,10 +648,20 @@ func (ts *ExpressionIntTestSuite) TestIsNotFalse() { err = ts.db.Save(notMatch).Error ts.Nil(err) + var isNotFalseExpression badorm.Expression[sql.NullBool] + + switch getDBDialector() { + case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: + // TODO esto no queda muy lindo que hay que ponerlo asi + isNotFalseExpression = badorm.IsNotFalse[sql.NullBool]() + case configuration.SQLServer: + // sqlserver doesn't support IsNotFalse + isNotFalseExpression = sqlserver.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: false}) + } + entities, err := ts.crudProductService.GetEntities( conditions.ProductNullBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsNotFalse[sql.NullBool](), + isNotFalseExpression, ), ) ts.Nil(err) @@ -554,10 +682,20 @@ func (ts *ExpressionIntTestSuite) TestIsUnknown() { err = ts.db.Save(notMatch2).Error ts.Nil(err) + var isUnknownExpression badorm.Expression[sql.NullBool] + + switch getDBDialector() { + case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: + // TODO esto no queda muy lindo que hay que ponerlo asi + isUnknownExpression = badorm.IsUnknown[sql.NullBool]() + case configuration.SQLServer: + // sqlserver doesn't support IsUnknown + isUnknownExpression = sqlserver.IsNotDistinct[sql.NullBool](sql.NullBool{Valid: false}) + } + entities, err := ts.crudProductService.GetEntities( conditions.ProductNullBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsUnknown[sql.NullBool](), + isUnknownExpression, ), ) ts.Nil(err) @@ -578,10 +716,20 @@ func (ts *ExpressionIntTestSuite) TestIsNotUnknown() { ts.createProduct("", 0, 0, false, nil) + var isNotUnknownExpression badorm.Expression[sql.NullBool] + + switch getDBDialector() { + case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: + // TODO esto no queda muy lindo que hay que ponerlo asi + isNotUnknownExpression = badorm.IsNotUnknown[sql.NullBool]() + case configuration.SQLServer: + // sqlserver doesn't support IsNotUnknown + isNotUnknownExpression = sqlserver.IsDistinct[sql.NullBool](sql.NullBool{Valid: false}) + } + entities, err := ts.crudProductService.GetEntities( conditions.ProductNullBool( - // TODO esto no queda muy lindo que hay que ponerlo asi - badorm.IsNotUnknown[sql.NullBool](), + isNotUnknownExpression, ), ) ts.Nil(err) From 02a278f3882fb229c212803f250516b4fcdf6754 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 15 Jun 2023 17:05:15 +0200 Subject: [PATCH 351/467] add sqlserver array operators --- badorm/psql/array.go | 9 ++++++--- badorm/shared/array.go | 13 +++++++++++++ badorm/sqlserver/array.go | 14 ++++++++++++++ testintegration/expressions_test.go | 6 ++++-- 4 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 badorm/shared/array.go create mode 100644 badorm/sqlserver/array.go diff --git a/badorm/psql/array.go b/badorm/psql/array.go index 2f5c755e..1b84451d 100644 --- a/badorm/psql/array.go +++ b/badorm/psql/array.go @@ -1,13 +1,16 @@ package psql -import "github.com/ditrit/badaas/badorm" +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/shared" +) // Row and Array Comparisons func ArrayIn[T any](values ...T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](values, "IN") + return shared.ArrayIn(values...) } func ArrayNotIn[T any](values ...T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](values, "NOT IN") + return shared.ArrayNotIn(values...) } diff --git a/badorm/shared/array.go b/badorm/shared/array.go new file mode 100644 index 00000000..4ba52dd7 --- /dev/null +++ b/badorm/shared/array.go @@ -0,0 +1,13 @@ +package shared + +import "github.com/ditrit/badaas/badorm" + +// Row and Array Comparisons + +func ArrayIn[T any](values ...T) badorm.ValueExpression[T] { + return badorm.NewValueExpression[T](values, "IN") +} + +func ArrayNotIn[T any](values ...T) badorm.ValueExpression[T] { + return badorm.NewValueExpression[T](values, "NOT IN") +} diff --git a/badorm/sqlserver/array.go b/badorm/sqlserver/array.go new file mode 100644 index 00000000..94e7c655 --- /dev/null +++ b/badorm/sqlserver/array.go @@ -0,0 +1,14 @@ +package sqlserver + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/shared" +) + +func ArrayIn[T any](values ...T) badorm.ValueExpression[T] { + return shared.ArrayIn(values...) +} + +func ArrayNotIn[T any](values ...T) badorm.ValueExpression[T] { + return shared.ArrayNotIn(values...) +} diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 80b6db29..9d7ba412 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -751,8 +751,10 @@ func (ts *ExpressionIntTestSuite) TestArrayIn() { arrayInExpression = mysql.ArrayIn("s1", "s2", "s3") case configuration.PostgreSQL: arrayInExpression = psql.ArrayIn("s1", "s2", "s3") - case configuration.SQLServer, configuration.SQLite: - // TODO esto no va a andar en todos + case configuration.SQLServer: + arrayInExpression = sqlserver.ArrayIn("s1", "s2", "s3") + case configuration.SQLite: + // TODO arrayInExpression = psql.ArrayIn("s1", "s2", "s3") } From 6aa26193dd509a922d4ac348f6b09b9eab621ed3 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 15 Jun 2023 17:24:30 +0200 Subject: [PATCH 352/467] fix tests for sqlite --- badorm/expression.go | 17 ++++++--- badorm/psql/comparison.go | 14 -------- badorm/shared/comparison.go | 13 ------- badorm/sqlserver/comparison.go | 10 ------ testintegration/expressions_test.go | 55 ++++++++++------------------- 5 files changed, 31 insertions(+), 78 deletions(-) delete mode 100644 badorm/psql/comparison.go delete mode 100644 badorm/shared/comparison.go diff --git a/badorm/expression.go b/badorm/expression.go index 97683d05..50f7be92 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -156,6 +156,7 @@ func NewInvalidExpression[T any](err error) InvalidExpression[T] { // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html // https://www.postgresql.org/docs/current/functions-comparison.html // https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 +// https://www.sqlite.org/lang_expr.html // EqOrIsNull must be used in cases where value can be NULL func Eq[T any](value T) Expression[T] { @@ -170,9 +171,10 @@ func Eq[T any](value T) Expression[T] { // this behavior can be also avoided in other ways: // - in SQLServer you can: // ** set ansi_nulls setting to off and use sqlserver.EqNullable -// ** use the IS NOT DISTINCT operator (implemented in sqlserver.IsNotDistinct) +// ** use the IS NOT DISTINCT operator (implemented in IsNotDistinct) // - in MySQL you can use equal_to operator (implemented in mysql.IsEqual) -// - in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in psql.IsNotDistinct) +// - in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) +// - in SQLite you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) func EqOrIsNull[T any](value any) Expression[T] { return expressionFromValueOrNil[T](value, Eq[T], IsNull[T]()) } @@ -190,8 +192,9 @@ func NotEq[T any](value T) Expression[T] { // this behavior can be also avoided in other ways: // - in SQLServer you can: // ** set ansi_nulls setting to off and use sqlserver.NotEqNullable -// ** use the IS DISTINCT operator (implemented in sqlserver.IsDistinct) -// - in PostgreSQL you can use the IS DISTINCT operator (implemented in psql.IsDistinct) +// ** use the IS DISTINCT operator (implemented in IsDistinct) +// - in PostgreSQL you can use the IS DISTINCT operator (implemented in IsDistinct) +// - in SQLite you can use the IS DISTINCT operator (implemented in IsDistinct) func NotEqOrIsNotNull[T any](value any) Expression[T] { return expressionFromValueOrNil[T](value, NotEq[T], IsNotNull[T]()) } @@ -283,26 +286,32 @@ func IsNotNull[T any]() PredicateExpression[T] { // Boolean Comparison Predicates // TODO que pasa con otros que mapean a bool por valuer? +// Not supported by: sqlserver func IsTrue[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS TRUE") } +// Not supported by: sqlserver func IsNotTrue[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS NOT TRUE") } +// Not supported by: sqlserver func IsFalse[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS FALSE") } +// Not supported by: sqlserver func IsNotFalse[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS NOT FALSE") } +// Not supported by: sqlserver, sqlite func IsUnknown[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS UNKNOWN") } +// Not supported by: sqlserver, sqlite func IsNotUnknown[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS NOT UNKNOWN") } diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go deleted file mode 100644 index 4503440b..00000000 --- a/badorm/psql/comparison.go +++ /dev/null @@ -1,14 +0,0 @@ -package psql - -import ( - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/shared" -) - -func IsDistinct[T any](value T) badorm.ValueExpression[T] { - return shared.IsDistinct(value) -} - -func IsNotDistinct[T any](value T) badorm.ValueExpression[T] { - return shared.IsNotDistinct(value) -} diff --git a/badorm/shared/comparison.go b/badorm/shared/comparison.go deleted file mode 100644 index 6428bef1..00000000 --- a/badorm/shared/comparison.go +++ /dev/null @@ -1,13 +0,0 @@ -package shared - -import "github.com/ditrit/badaas/badorm" - -// Comparison Predicates - -func IsDistinct[T any](value T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](value, "IS DISTINCT FROM") -} - -func IsNotDistinct[T any](value T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](value, "IS NOT DISTINCT FROM") -} diff --git a/badorm/sqlserver/comparison.go b/badorm/sqlserver/comparison.go index b33fc0d3..f9b205ee 100644 --- a/badorm/sqlserver/comparison.go +++ b/badorm/sqlserver/comparison.go @@ -2,7 +2,6 @@ package sqlserver import ( "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/shared" ) // Comparison Operators @@ -27,12 +26,3 @@ func NotLt[T any](value T) badorm.Expression[T] { func NotGt[T any](value T) badorm.Expression[T] { return badorm.NewCantBeNullValueExpression[T](value, "!>") } - -// https://learn.microsoft.com/en-us/sql/t-sql/queries/is-distinct-from-transact-sql?view=sql-server-ver16 -func IsDistinct[T any](value T) badorm.ValueExpression[T] { - return shared.IsDistinct(value) -} - -func IsNotDistinct[T any](value T) badorm.ValueExpression[T] { - return shared.IsNotDistinct(value) -} diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 9d7ba412..8920f5f7 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -9,6 +9,7 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/mysql" "github.com/ditrit/badaas/badorm/psql" + "github.com/ditrit/badaas/badorm/sqlite" "github.com/ditrit/badaas/badorm/sqlserver" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/testintegration/conditions" @@ -392,26 +393,17 @@ func (ts *ExpressionIntTestSuite) TestIsDistinct() { ts.createProduct("not_match", 2, 0, false, nil) switch getDBDialector() { - case configuration.PostgreSQL: - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - psql.IsDistinct(2), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) - case configuration.SQLServer: + case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - sqlserver.IsDistinct(2), + badorm.IsDistinct(2), ), ) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) - case configuration.MySQL, configuration.SQLite: - // TODO + case configuration.MySQL: + // TODO not is equal log.Println("TODO") } } @@ -426,13 +418,8 @@ func (ts *ExpressionIntTestSuite) TestIsNotDistinct() { switch getDBDialector() { case configuration.MySQL: isNotEqualExpression = mysql.IsEqual(3) - case configuration.PostgreSQL: - isNotEqualExpression = psql.IsNotDistinct(3) - case configuration.SQLServer: - isNotEqualExpression = sqlserver.IsNotDistinct(3) - case configuration.SQLite: - // TODO - isNotEqualExpression = psql.IsNotDistinct(3) + case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: + isNotEqualExpression = badorm.IsNotDistinct(3) } entities, err := ts.crudProductService.GetEntities( @@ -458,13 +445,8 @@ func (ts *ExpressionIntTestSuite) TestIsNotDistinctNullValue() { switch getDBDialector() { case configuration.MySQL: isEqualExpression = mysql.IsEqual(sql.NullFloat64{Valid: false}) - case configuration.PostgreSQL: - isEqualExpression = psql.IsNotDistinct(sql.NullFloat64{Valid: false}) - case configuration.SQLServer: - isEqualExpression = sqlserver.IsNotDistinct(sql.NullFloat64{Valid: false}) - case configuration.SQLite: - // TODO - isEqualExpression = psql.IsNotDistinct(sql.NullFloat64{Valid: false}) + case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: + isEqualExpression = badorm.IsNotDistinct(sql.NullFloat64{Valid: false}) } entities, err := ts.crudProductService.GetEntities( @@ -623,7 +605,7 @@ func (ts *ExpressionIntTestSuite) TestIsNotTrue() { isNotTrueExpression = badorm.IsNotTrue[sql.NullBool]() case configuration.SQLServer: // sqlserver doesn't support IsNotTrue - isNotTrueExpression = sqlserver.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: true}) + isNotTrueExpression = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: true}) } entities, err := ts.crudProductService.GetEntities( @@ -656,7 +638,7 @@ func (ts *ExpressionIntTestSuite) TestIsNotFalse() { isNotFalseExpression = badorm.IsNotFalse[sql.NullBool]() case configuration.SQLServer: // sqlserver doesn't support IsNotFalse - isNotFalseExpression = sqlserver.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: false}) + isNotFalseExpression = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: false}) } entities, err := ts.crudProductService.GetEntities( @@ -685,12 +667,12 @@ func (ts *ExpressionIntTestSuite) TestIsUnknown() { var isUnknownExpression badorm.Expression[sql.NullBool] switch getDBDialector() { - case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: + case configuration.MySQL, configuration.PostgreSQL: // TODO esto no queda muy lindo que hay que ponerlo asi isUnknownExpression = badorm.IsUnknown[sql.NullBool]() - case configuration.SQLServer: + case configuration.SQLServer, configuration.SQLite: // sqlserver doesn't support IsUnknown - isUnknownExpression = sqlserver.IsNotDistinct[sql.NullBool](sql.NullBool{Valid: false}) + isUnknownExpression = badorm.IsNotDistinct[sql.NullBool](sql.NullBool{Valid: false}) } entities, err := ts.crudProductService.GetEntities( @@ -719,12 +701,12 @@ func (ts *ExpressionIntTestSuite) TestIsNotUnknown() { var isNotUnknownExpression badorm.Expression[sql.NullBool] switch getDBDialector() { - case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: + case configuration.MySQL, configuration.PostgreSQL: // TODO esto no queda muy lindo que hay que ponerlo asi isNotUnknownExpression = badorm.IsNotUnknown[sql.NullBool]() - case configuration.SQLServer: + case configuration.SQLServer, configuration.SQLite: // sqlserver doesn't support IsNotUnknown - isNotUnknownExpression = sqlserver.IsDistinct[sql.NullBool](sql.NullBool{Valid: false}) + isNotUnknownExpression = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: false}) } entities, err := ts.crudProductService.GetEntities( @@ -754,8 +736,7 @@ func (ts *ExpressionIntTestSuite) TestArrayIn() { case configuration.SQLServer: arrayInExpression = sqlserver.ArrayIn("s1", "s2", "s3") case configuration.SQLite: - // TODO - arrayInExpression = psql.ArrayIn("s1", "s2", "s3") + arrayInExpression = sqlite.ArrayIn("s1", "s2", "s3") } entities, err := ts.crudProductService.GetEntities( From 0ae879b59efa0e5933711fb1b47592746388d243 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 15 Jun 2023 17:26:34 +0200 Subject: [PATCH 353/467] add sqlite folder --- badorm/sqlite/array.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 badorm/sqlite/array.go diff --git a/badorm/sqlite/array.go b/badorm/sqlite/array.go new file mode 100644 index 00000000..c6fb7c9f --- /dev/null +++ b/badorm/sqlite/array.go @@ -0,0 +1,16 @@ +package sqlite + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/shared" +) + +// Row and Array Comparisons + +func ArrayIn[T any](values ...T) badorm.ValueExpression[T] { + return shared.ArrayIn(values...) +} + +func ArrayNotIn[T any](values ...T) badorm.ValueExpression[T] { + return shared.ArrayNotIn(values...) +} From 8ba413292b92ab81e41c2485229744fc75fa0575 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 16 Jun 2023 14:52:54 +0200 Subject: [PATCH 354/467] add expressions on strings --- badorm/expression.go | 105 +++++++++++++- badorm/mysql/comparison.go | 33 ++++- badorm/psql/comparison.go | 78 ++++++++++ badorm/sqlite/comparison.go | 12 ++ testintegration/expressions_test.go | 217 ++++++++++++++++++++++++++++ 5 files changed, 443 insertions(+), 2 deletions(-) create mode 100644 badorm/psql/comparison.go create mode 100644 badorm/sqlite/comparison.go diff --git a/badorm/expression.go b/badorm/expression.go index 50f7be92..6355f06f 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "reflect" + "regexp" "strings" "github.com/elliotchance/pie/v2" @@ -69,6 +70,15 @@ func NewCantBeNullValueExpression[T any](value any, sqlExpression string) Expres return NewValueExpression[T](value, sqlExpression) } +func NewMustBePOSIXValueExpression[T string | sql.NullString](pattern string, sqlExpression string) Expression[T] { + _, err := regexp.CompilePOSIX(pattern) + if err != nil { + return NewInvalidExpression[T](err) + } + + return NewValueExpression[T](pattern, sqlExpression) +} + type MultivalueExpression[T any] struct { Values []T SQLExpression string @@ -151,6 +161,40 @@ func NewInvalidExpression[T any](err error) InvalidExpression[T] { } } +// TODO el value expression podria usar este internamente pero lo complicaria un poco +type MultiExpressionExpression[T any] struct { + ExpressionsAndValues []SQLExpressionAndValue +} + +type SQLExpressionAndValue struct { + SQLExpression string + Value any +} + +//nolint:unused // see inside +func (expr MultiExpressionExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + +func (expr MultiExpressionExpression[T]) ToSQL(columnName string) (string, []any, error) { + exprString := columnName + values := []any{} + + for _, sqlExprAndValue := range expr.ExpressionsAndValues { + exprString += " " + sqlExprAndValue.SQLExpression + " ?" + values = append(values, sqlExprAndValue.Value) + } + + return exprString, values, nil +} + +func NewMultiExpressionExpression[T any](exprsAndValues ...SQLExpressionAndValue) MultiExpressionExpression[T] { + return MultiExpressionExpression[T]{ + ExpressionsAndValues: exprsAndValues, + } +} + // Comparison Operators // refs: // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html @@ -233,7 +277,6 @@ func mapsToNull(value any) bool { return true } - // TODO creo que esto lo voy a tener que mover afuera si quiero que los nullables se comparen contra los no nullables valuer, isValuer := value.(driver.Valuer) if isValuer { valuerValue, err := valuer.Value() @@ -315,3 +358,63 @@ func IsUnknown[T bool | sql.NullBool]() PredicateExpression[T] { func IsNotUnknown[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS NOT UNKNOWN") } + +// Not supported by: mysql +func IsDistinct[T any](value T) ValueExpression[T] { + return NewValueExpression[T](value, "IS DISTINCT FROM") +} + +// Not supported by: mysql +func IsNotDistinct[T any](value T) ValueExpression[T] { + return NewValueExpression[T](value, "IS NOT DISTINCT FROM") +} + +// TODO hay muchos operadores en el caso de que quisiera aplicarle la funcion contra lo que estoy comparando +// y despues esta el tema de si quiero en alguna comparacion usar una columna anterior, ahi ya se re complica esto + +// Pattern Matching + +// TODO que pasa con los que son strings for valuer +// Pattern in all databases: +// - An underscore (_) in pattern stands for (matches) any single character. +// - A percent sign (%) matches any sequence of zero or more characters. +// +// Additionally in SQLServer: +// - Square brackets ([ ]) matches any single character within the specified range ([a-f]) or set ([abcdef]). +// - [^] matches any single character not within the specified range ([^a-f]) or set ([^abcdef]). +// +// # To be able to use ESCAPE operator use LikeEscape +// +// WARNINGS: +// - SQLite: LIKE is case-insensitive unless case_sensitive_like pragma (https://www.sqlite.org/pragma.html#pragma_case_sensitive_like) is true. +// - SQLServer, MySQL: the case-sensitivity depends on the collation used in compared column. +// - PostgreSQL: LIKE is always case-sensitive, if you want case-insensitive use the ILIKE operator (implemented in psql.ILike) +// +// refs: +// - mysql: https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like +// - postgresql: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE +// - sqlserver: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver16 +// - sqlite: https://www.sqlite.org/lang_expr.html#like +func Like[T string | sql.NullString](pattern string) ValueExpression[T] { + return NewValueExpression[T](pattern, "LIKE") +} + +// Similar to Like but with the possibility to use the ESCAPE operator +func LikeEscape[T string | sql.NullString](pattern string, escape rune) MultiExpressionExpression[T] { + return NewMultiExpressionExpression[T]( + SQLExpressionAndValue{ + SQLExpression: "LIKE", + Value: pattern, + }, + SQLExpressionAndValue{ + SQLExpression: "ESCAPE", + Value: string(escape), + }, + ) +} + +// Date/Time Functions and Operators +// TODO isfinite +// TODO OVERLAPS + +// TODO Subquery Expressions diff --git a/badorm/mysql/comparison.go b/badorm/mysql/comparison.go index 0a18fd47..214827fe 100644 --- a/badorm/mysql/comparison.go +++ b/badorm/mysql/comparison.go @@ -1,6 +1,10 @@ package mysql -import "github.com/ditrit/badaas/badorm" +import ( + "database/sql" + + "github.com/ditrit/badaas/badorm" +) // Comparison Predicates @@ -9,3 +13,30 @@ import "github.com/ditrit/badaas/badorm" func IsEqual[T any](value T) badorm.ValueExpression[T] { return badorm.NewValueExpression[T](value, "<=>") } + +// Pattern Matching + +// TODO codigo repetido +// As an extension to standard SQL, MySQL permits LIKE on numeric expressions. +func Like[T string | sql.NullString | int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64](pattern string) badorm.ValueExpression[T] { + return badorm.NewValueExpression[T](pattern, "LIKE") +} + +// As an extension to standard SQL, MySQL permits LIKE on numeric expressions. +func LikeEscape[T string | sql.NullString | int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64](pattern string, escape rune) badorm.MultiExpressionExpression[T] { + return badorm.NewMultiExpressionExpression[T]( + badorm.SQLExpressionAndValue{ + SQLExpression: "LIKE", + Value: pattern, + }, + badorm.SQLExpressionAndValue{ + SQLExpression: "ESCAPE", + Value: string(escape), + }, + ) +} + +// ref: https://dev.mysql.com/doc/refman/8.0/en/regexp.html#operator_regexp +func RegexP[T string | sql.NullString](pattern string) badorm.Expression[T] { + return badorm.NewMustBePOSIXValueExpression[T](pattern, "REGEXP") +} diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go new file mode 100644 index 00000000..ce0c8049 --- /dev/null +++ b/badorm/psql/comparison.go @@ -0,0 +1,78 @@ +package psql + +import ( + "database/sql" + + "golang.org/x/text/unicode/norm" + + "github.com/ditrit/badaas/badorm" +) + +// String Functions and Operators + +var normalForms = map[norm.Form]string{ + norm.NFC: "NFC", + norm.NFD: "NFD", + norm.NFKC: "NFKC", + norm.NFKD: "NFKD", +} + +// TODO que pasa con otros que mapean a string por valuer? +func IsNormalized[T string | sql.NullString](expectedNorm norm.Form) badorm.PredicateExpression[T] { + return badorm.NewPredicateExpression[T]( + "IS " + normalForms[expectedNorm] + " NORMALIZED", + ) +} + +func StartsWith[T string | sql.NullString](expectedStart string) badorm.ValueExpression[T] { + return badorm.NewValueExpression[T](expectedStart, "^@") +} + +// Pattern Matching + +func ILike[T string | sql.NullString](pattern string) badorm.ValueExpression[T] { + return badorm.NewValueExpression[T](pattern, "ILIKE") +} + +func ILikeEscape[T string | sql.NullString](pattern string, escape rune) badorm.MultiExpressionExpression[T] { + // TODO aca podria hacer un .Add o algo asi para no repetir lo de arriba + return badorm.NewMultiExpressionExpression[T]( + badorm.SQLExpressionAndValue{ + SQLExpression: "ILIKE", + Value: pattern, + }, + badorm.SQLExpressionAndValue{ + SQLExpression: "ESCAPE", + Value: string(escape), + }, + ) +} + +// ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP +func SimilarTo[T string | sql.NullString](pattern string) badorm.ValueExpression[T] { + return badorm.NewValueExpression[T](pattern, "SIMILAR TO") +} + +// ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP +func SimilarToEscape[T string | sql.NullString](pattern string, escape rune) badorm.MultiExpressionExpression[T] { + return badorm.NewMultiExpressionExpression[T]( + badorm.SQLExpressionAndValue{ + SQLExpression: "SIMILAR TO", + Value: pattern, + }, + badorm.SQLExpressionAndValue{ + SQLExpression: "ESCAPE", + Value: string(escape), + }, + ) +} + +// ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP +func POSIXMatch[T string | sql.NullString](pattern string) badorm.Expression[T] { + return badorm.NewMustBePOSIXValueExpression[T](pattern, "~") +} + +// ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP +func POSIXIMatch[T string | sql.NullString](pattern string) badorm.Expression[T] { + return badorm.NewMustBePOSIXValueExpression[T](pattern, "~*") +} diff --git a/badorm/sqlite/comparison.go b/badorm/sqlite/comparison.go new file mode 100644 index 00000000..7ba2f1de --- /dev/null +++ b/badorm/sqlite/comparison.go @@ -0,0 +1,12 @@ +package sqlite + +import ( + "database/sql" + + "github.com/ditrit/badaas/badorm" +) + +// ref: https://www.sqlite.org/lang_expr.html#like +func Glob[T string | sql.NullString](pattern string) badorm.Expression[T] { + return badorm.NewMustBePOSIXValueExpression[T](pattern, "GLOB") +} diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 8920f5f7..e541bb19 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -4,6 +4,7 @@ import ( "database/sql" "log" + "golang.org/x/text/unicode/norm" "gorm.io/gorm" "github.com/ditrit/badaas/badorm" @@ -778,6 +779,222 @@ func (ts *ExpressionIntTestSuite) TestArrayNotIn() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } +func (ts *ExpressionIntTestSuite) TestLike() { + match1 := ts.createProduct("basd", 0, 0, false, nil) + match2 := ts.createProduct("cape", 0, 0, false, nil) + + ts.createProduct("bbsd", 0, 0, false, nil) + ts.createProduct("bbasd", 0, 0, false, nil) + + var likeExpression badorm.Expression[string] + + switch getDBDialector() { + case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: + likeExpression = badorm.Like[string]("_a%") + case configuration.SQLServer: + likeExpression = badorm.Like[string]("[bc]a[^a]%") + } + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + likeExpression, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestLikeEscape() { + match1 := ts.createProduct("ba_sd", 0, 0, false, nil) + match2 := ts.createProduct("ca_pe", 0, 0, false, nil) + + ts.createProduct("bb_sd", 0, 0, false, nil) + ts.createProduct("bba_sd", 0, 0, false, nil) + + var likeExpression badorm.Expression[string] + + switch getDBDialector() { + case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: + likeExpression = badorm.LikeEscape[string]("_a!_%", '!') + case configuration.SQLServer: + likeExpression = badorm.LikeEscape[string]("[bc]a!_[^a]%", '!') + } + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + likeExpression, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestLikeOnNumeric() { + switch getDBDialector() { + case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: + log.Println("Like with numeric not compatible") + case configuration.MySQL: + match1 := ts.createProduct("", 10, 0, false, nil) + match2 := ts.createProduct("", 100, 0, false, nil) + + ts.createProduct("", 20, 0, false, nil) + ts.createProduct("", 3, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + mysql.Like[int]("1%"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + } +} + +func (ts *ExpressionIntTestSuite) TestIsNormalized() { + switch getDBDialector() { + case configuration.MySQL, configuration.SQLServer, configuration.SQLite: + log.Println("IsNormalized not compatible") + case configuration.PostgreSQL: + match := ts.createProduct("A\0308", 0, 0, false, nil) + ts.createProduct("A\u030A", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + psql.IsNormalized[string](norm.NFC), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) + } +} + +func (ts *ExpressionIntTestSuite) TestStartsWith() { + switch getDBDialector() { + case configuration.MySQL, configuration.SQLServer, configuration.SQLite: + log.Println("StartsWith not compatible") + case configuration.PostgreSQL: + match1 := ts.createProduct("franco", 0, 0, false, nil) + match2 := ts.createProduct("francisco", 0, 0, false, nil) + + ts.createProduct("agustin", 0, 0, false, nil) + ts.createProduct("lorenzo", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + psql.StartsWith[string]("fra"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + } +} + +func (ts *ExpressionIntTestSuite) TestILike() { + switch getDBDialector() { + case configuration.MySQL, configuration.SQLServer, configuration.SQLite: + log.Println("ILike not compatible") + case configuration.PostgreSQL: + match1 := ts.createProduct("basd", 0, 0, false, nil) + match2 := ts.createProduct("cape", 0, 0, false, nil) + match3 := ts.createProduct("bAsd", 0, 0, false, nil) + + ts.createProduct("bbsd", 0, 0, false, nil) + ts.createProduct("bbasd", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + psql.ILike[string]("_a%"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) + } +} + +func (ts *ExpressionIntTestSuite) TestSimilarTo() { + switch getDBDialector() { + case configuration.MySQL, configuration.SQLServer, configuration.SQLite: + log.Println("SimilarTo not compatible") + case configuration.PostgreSQL: + match1 := ts.createProduct("abc", 0, 0, false, nil) + match2 := ts.createProduct("aabcc", 0, 0, false, nil) + + ts.createProduct("aec", 0, 0, false, nil) + ts.createProduct("aaaaa", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + psql.SimilarTo[string]("%(b|d)%"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + } +} + +func (ts *ExpressionIntTestSuite) TestPosixRegex() { + match1 := ts.createProduct("ab", 0, 0, false, nil) + match2 := ts.createProduct("ax", 0, 0, false, nil) + + ts.createProduct("bb", 0, 0, false, nil) + ts.createProduct("cx", 0, 0, false, nil) + + var posixRegexExpression badorm.Expression[string] + + switch getDBDialector() { + case configuration.SQLServer: + log.Println("PosixRegex not compatible") + case configuration.MySQL: + posixRegexExpression = mysql.RegexP[string]("^a(b|x)") + case configuration.PostgreSQL: + posixRegexExpression = psql.POSIXMatch[string]("^a(b|x)") + case configuration.SQLite: + posixRegexExpression = sqlite.Glob[string]("^a(b|x)") + } + + if posixRegexExpression != nil { + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + posixRegexExpression, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + } +} + +func (ts *ExpressionIntTestSuite) TestPosixRegexNotPosix() { + var posixRegexExpression badorm.Expression[string] + + switch getDBDialector() { + case configuration.SQLServer: + log.Println("PosixRegex not compatible") + case configuration.MySQL: + posixRegexExpression = mysql.RegexP[string]("^a(b|x") + case configuration.PostgreSQL: + posixRegexExpression = psql.POSIXMatch[string]("^a(b|x") + case configuration.SQLite: + posixRegexExpression = sqlite.Glob[string]("^a(b|x") + } + + if posixRegexExpression != nil { + _, err := ts.crudProductService.GetEntities( + conditions.ProductString( + posixRegexExpression, + ), + ) + ts.ErrorContains(err, "error parsing regexp") + } +} + func (ts *ExpressionIntTestSuite) TestMultipleExpressions() { match := ts.createProduct("match", 3, 0, false, nil) ts.createProduct("not_match", 5, 0, false, nil) From b4c6850dd9ef26364d714176f2c1708e923fbb8e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 16 Jun 2023 15:19:19 +0200 Subject: [PATCH 355/467] refactor: escape as method --- badorm/expression.go | 126 +++++++++++++--------------- badorm/mysql/comparison.go | 21 ++--- badorm/psql/comparison.go | 28 ------- testintegration/expressions_test.go | 4 +- 4 files changed, 65 insertions(+), 114 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index 6355f06f..e8b0a779 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -29,8 +29,12 @@ type Expression[T any] interface { } type ValueExpression[T any] struct { - Value any + ExpressionsAndValues []SQLExpressionAndValue +} + +type SQLExpressionAndValue struct { SQLExpression string + Value any } //nolint:unused // see inside @@ -39,6 +43,24 @@ func (expr ValueExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } +func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any, error) { + exprString := columnName + values := []any{} + + for _, sqlExprAndValue := range expr.ExpressionsAndValues { + exprString += " " + sqlExprAndValue.SQLExpression + " ?" + values = append(values, sqlExprAndValue.Value) + } + + return exprString, values, nil +} + +func NewValueExpression[T any](value any, sqlExpression string) ValueExpression[T] { + expr := ValueExpression[T]{} + + return expr.AddSQLExpression(value, sqlExpression) +} + var nullableKinds = []reflect.Kind{ reflect.Chan, reflect.Func, reflect.Map, reflect.Pointer, @@ -46,22 +68,6 @@ var nullableKinds = []reflect.Kind{ reflect.Slice, } -// TODO aca me gustaria que devuelva []T pero no me anda asi -func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any, error) { - return fmt.Sprintf( - "%s %s ?", - columnName, - expr.SQLExpression, - ), []any{expr.Value}, nil -} - -func NewValueExpression[T any](value any, sqlExpression string) ValueExpression[T] { - return ValueExpression[T]{ - Value: value, - SQLExpression: sqlExpression, - } -} - func NewCantBeNullValueExpression[T any](value any, sqlExpression string) Expression[T] { if value == nil || mapsToNull(value) { return NewInvalidExpression[T](ErrValueCantBeNull) @@ -79,6 +85,24 @@ func NewMustBePOSIXValueExpression[T string | sql.NullString](pattern string, sq return NewValueExpression[T](pattern, sqlExpression) } +func NewMultiExpressionExpression[T any](exprsAndValues ...SQLExpressionAndValue) ValueExpression[T] { + return ValueExpression[T]{ + ExpressionsAndValues: exprsAndValues, + } +} + +func (expr *ValueExpression[T]) AddSQLExpression(value any, sqlExpression string) ValueExpression[T] { + expr.ExpressionsAndValues = append( + expr.ExpressionsAndValues, + SQLExpressionAndValue{ + Value: value, + SQLExpression: sqlExpression, + }, + ) + + return *expr +} + type MultivalueExpression[T any] struct { Values []T SQLExpression string @@ -151,7 +175,7 @@ func (expr InvalidExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr InvalidExpression[T]) ToSQL(columnName string) (string, []any, error) { +func (expr InvalidExpression[T]) ToSQL(_ string) (string, []any, error) { return "", nil, expr.Err } @@ -161,40 +185,6 @@ func NewInvalidExpression[T any](err error) InvalidExpression[T] { } } -// TODO el value expression podria usar este internamente pero lo complicaria un poco -type MultiExpressionExpression[T any] struct { - ExpressionsAndValues []SQLExpressionAndValue -} - -type SQLExpressionAndValue struct { - SQLExpression string - Value any -} - -//nolint:unused // see inside -func (expr MultiExpressionExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func (expr MultiExpressionExpression[T]) ToSQL(columnName string) (string, []any, error) { - exprString := columnName - values := []any{} - - for _, sqlExprAndValue := range expr.ExpressionsAndValues { - exprString += " " + sqlExprAndValue.SQLExpression + " ?" - values = append(values, sqlExprAndValue.Value) - } - - return exprString, values, nil -} - -func NewMultiExpressionExpression[T any](exprsAndValues ...SQLExpressionAndValue) MultiExpressionExpression[T] { - return MultiExpressionExpression[T]{ - ExpressionsAndValues: exprsAndValues, - } -} - // Comparison Operators // refs: // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html @@ -374,6 +364,20 @@ func IsNotDistinct[T any](value T) ValueExpression[T] { // Pattern Matching +type LikeExpression[T string | sql.NullString] struct { + ValueExpression[T] +} + +func NewLikeExpression[T string | sql.NullString](pattern, sqlExpression string) LikeExpression[T] { + return LikeExpression[T]{ + ValueExpression: NewValueExpression[T](pattern, sqlExpression), + } +} + +func (expr LikeExpression[T]) Escape(escape rune) ValueExpression[T] { + return expr.AddSQLExpression(string(escape), "ESCAPE") +} + // TODO que pasa con los que son strings for valuer // Pattern in all databases: // - An underscore (_) in pattern stands for (matches) any single character. @@ -395,22 +399,8 @@ func IsNotDistinct[T any](value T) ValueExpression[T] { // - postgresql: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE // - sqlserver: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver16 // - sqlite: https://www.sqlite.org/lang_expr.html#like -func Like[T string | sql.NullString](pattern string) ValueExpression[T] { - return NewValueExpression[T](pattern, "LIKE") -} - -// Similar to Like but with the possibility to use the ESCAPE operator -func LikeEscape[T string | sql.NullString](pattern string, escape rune) MultiExpressionExpression[T] { - return NewMultiExpressionExpression[T]( - SQLExpressionAndValue{ - SQLExpression: "LIKE", - Value: pattern, - }, - SQLExpressionAndValue{ - SQLExpression: "ESCAPE", - Value: string(escape), - }, - ) +func Like[T string | sql.NullString](pattern string) LikeExpression[T] { + return NewLikeExpression[T](pattern, "LIKE") } // Date/Time Functions and Operators diff --git a/badorm/mysql/comparison.go b/badorm/mysql/comparison.go index 214827fe..e52ba2f4 100644 --- a/badorm/mysql/comparison.go +++ b/badorm/mysql/comparison.go @@ -16,26 +16,15 @@ func IsEqual[T any](value T) badorm.ValueExpression[T] { // Pattern Matching -// TODO codigo repetido // As an extension to standard SQL, MySQL permits LIKE on numeric expressions. -func Like[T string | sql.NullString | int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64](pattern string) badorm.ValueExpression[T] { +func Like[T string | sql.NullString | + int | int8 | int16 | int32 | int64 | + uint | uint8 | uint16 | uint32 | uint64 | + float32 | float64](pattern string, +) badorm.ValueExpression[T] { return badorm.NewValueExpression[T](pattern, "LIKE") } -// As an extension to standard SQL, MySQL permits LIKE on numeric expressions. -func LikeEscape[T string | sql.NullString | int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64](pattern string, escape rune) badorm.MultiExpressionExpression[T] { - return badorm.NewMultiExpressionExpression[T]( - badorm.SQLExpressionAndValue{ - SQLExpression: "LIKE", - Value: pattern, - }, - badorm.SQLExpressionAndValue{ - SQLExpression: "ESCAPE", - Value: string(escape), - }, - ) -} - // ref: https://dev.mysql.com/doc/refman/8.0/en/regexp.html#operator_regexp func RegexP[T string | sql.NullString](pattern string) badorm.Expression[T] { return badorm.NewMustBePOSIXValueExpression[T](pattern, "REGEXP") diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go index ce0c8049..accbd84f 100644 --- a/badorm/psql/comparison.go +++ b/badorm/psql/comparison.go @@ -34,39 +34,11 @@ func ILike[T string | sql.NullString](pattern string) badorm.ValueExpression[T] return badorm.NewValueExpression[T](pattern, "ILIKE") } -func ILikeEscape[T string | sql.NullString](pattern string, escape rune) badorm.MultiExpressionExpression[T] { - // TODO aca podria hacer un .Add o algo asi para no repetir lo de arriba - return badorm.NewMultiExpressionExpression[T]( - badorm.SQLExpressionAndValue{ - SQLExpression: "ILIKE", - Value: pattern, - }, - badorm.SQLExpressionAndValue{ - SQLExpression: "ESCAPE", - Value: string(escape), - }, - ) -} - // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP func SimilarTo[T string | sql.NullString](pattern string) badorm.ValueExpression[T] { return badorm.NewValueExpression[T](pattern, "SIMILAR TO") } -// ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP -func SimilarToEscape[T string | sql.NullString](pattern string, escape rune) badorm.MultiExpressionExpression[T] { - return badorm.NewMultiExpressionExpression[T]( - badorm.SQLExpressionAndValue{ - SQLExpression: "SIMILAR TO", - Value: pattern, - }, - badorm.SQLExpressionAndValue{ - SQLExpression: "ESCAPE", - Value: string(escape), - }, - ) -} - // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP func POSIXMatch[T string | sql.NullString](pattern string) badorm.Expression[T] { return badorm.NewMustBePOSIXValueExpression[T](pattern, "~") diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index e541bb19..c37dff90 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -816,9 +816,9 @@ func (ts *ExpressionIntTestSuite) TestLikeEscape() { switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - likeExpression = badorm.LikeEscape[string]("_a!_%", '!') + likeExpression = badorm.Like[string]("_a!_%").Escape('!') case configuration.SQLServer: - likeExpression = badorm.LikeEscape[string]("[bc]a!_[^a]%", '!') + likeExpression = badorm.Like[string]("[bc]a!_[^a]%").Escape('!') } entities, err := ts.crudProductService.GetEntities( From 2dcc915524ddbbc099695beb3fdd1c6cd12b9fbb Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 16 Jun 2023 17:00:08 +0200 Subject: [PATCH 356/467] add and, or, not, xor --- badorm/condition.go | 32 +------- badorm/expression.go | 116 +++++++++++++++++++++++++-- badorm/mysql/logical.go | 10 +++ badorm/shared/logical.go | 7 ++ badorm/sqlserver/logical.go | 10 +++ testintegration/expressions_test.go | 118 +++++++++++++++++++++++++++- 6 files changed, 257 insertions(+), 36 deletions(-) create mode 100644 badorm/mysql/logical.go create mode 100644 badorm/shared/logical.go create mode 100644 badorm/sqlserver/logical.go diff --git a/badorm/condition.go b/badorm/condition.go index cd0525c5..75664b71 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -81,36 +81,10 @@ func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table columnName = query.NamingStrategy.ColumnName(tableName, condition.Field) } - // add column prefix once we know the column name - columnName = condition.ColumnPrefix + columnName + // add column prefix and table name once we know the column name + columnName = tableName + "." + condition.ColumnPrefix + columnName - conditionString := "" - values := []any{} - - for index, expression := range condition.Expressions { - // TODO que se pueda hacer la connection distinta aca - // TODO strings.Join(exprs, " AND ")? - if index != 0 { - conditionString += " AND " - } - - expressionSQL, expressionValues, err := expression.ToSQL( - fmt.Sprintf( - "%s.%s", - tableName, - columnName, - ), - ) - if err != nil { - return "", nil, err - } - - conditionString += expressionSQL - - values = append(values, expressionValues...) - } - - return conditionString, values, nil + return evaluateExpressions(columnName, condition.Expressions) } type JoinCondition[T1 any, T2 any] struct { diff --git a/badorm/expression.go b/badorm/expression.go index e8b0a779..fc0ad2a0 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -13,8 +13,9 @@ import ( ) var ( - ErrNotRelated = errors.New("value type not related with T") - ErrValueCantBeNull = errors.New("value to compare can't be null") + ErrNotRelated = errors.New("value type not related with T") + ErrValueCantBeNull = errors.New("value to compare can't be null") + ErrEmptyExpressions = errors.New("each condition must have at least one expression") ) type Expression[T any] interface { @@ -28,6 +29,87 @@ type Expression[T any] interface { InterfaceVerificationMethod(T) } +type ContainerExpression[T any] struct { + Expressions []Expression[T] + Prefix string +} + +//nolint:unused // see inside +func (expr ContainerExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + +func (expr ContainerExpression[T]) ToSQL(columnName string) (string, []any, error) { + sqlString, values, err := evaluateExpressions(columnName, expr.Expressions) + if err != nil { + return "", nil, err + } + + sqlString = expr.Prefix + " (" + sqlString + ")" + + return sqlString, values, nil +} + +func evaluateExpressions[T any](columnName string, exprs []Expression[T]) (string, []any, error) { + expressionsAmount := len(exprs) + if expressionsAmount == 0 { + return "", nil, ErrEmptyExpressions + } else if expressionsAmount == 1 { + return exprs[0].ToSQL(columnName) + } + + return And(exprs...).ToSQL(columnName) +} + +func NewContainerExpression[T any](prefix string, expressions ...Expression[T]) ContainerExpression[T] { + return ContainerExpression[T]{ + Prefix: prefix, + Expressions: expressions, + } +} + +type ConnectionExpression[T any] struct { + Expressions []Expression[T] + Connector string +} + +//nolint:unused // see inside +func (expr ConnectionExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + +func (expr ConnectionExpression[T]) ToSQL(columnName string) (string, []any, error) { + sqlString := "" + values := []any{} + + for index, internalExpr := range expr.Expressions { + // TODO strings.Join(exprs, " AND ")? + if index != 0 { + sqlString += " " + expr.Connector + " " + } + + exprSQLString, exprValues, err := internalExpr.ToSQL(columnName) + if err != nil { + return "", nil, err + } + + sqlString += exprSQLString + + values = append(values, exprValues...) + } + + return sqlString, values, nil +} + +func NewConnectionExpression[T any](connector string, expressions ...Expression[T]) ConnectionExpression[T] { + return ConnectionExpression[T]{ + Connector: connector, + Expressions: expressions, + } +} + type ValueExpression[T any] struct { ExpressionsAndValues []SQLExpressionAndValue } @@ -185,12 +267,34 @@ func NewInvalidExpression[T any](err error) InvalidExpression[T] { } } +// Logical Operators +// ref: +// - PostgreSQL: https://www.postgresql.org/docs/current/functions-logical.html +// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/logical-operators.html +// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/logical-operators-transact-sql?view=sql-server-ver16 +// - SQLite: https://www.sqlite.org/lang_expr.html + +func And[T any](exprs ...Expression[T]) ConnectionExpression[T] { + return NewConnectionExpression("AND", exprs...) +} + +// TODO que pasa si quiero esto entre distintas conditions, +// y si ensima queres entre distintos joins olvidate imposible +// -> agregar unsafe condition y unsafe expression +func Or[T any](exprs ...Expression[T]) ConnectionExpression[T] { + return NewConnectionExpression("OR", exprs...) +} + +func Not[T any](exprs ...Expression[T]) ContainerExpression[T] { + return NewContainerExpression("NOT", exprs...) +} + // Comparison Operators // refs: -// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html -// https://www.postgresql.org/docs/current/functions-comparison.html -// https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 -// https://www.sqlite.org/lang_expr.html +// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// - PostgreSQL: https://www.postgresql.org/docs/current/functions-comparison.html +// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 +// - SQLite: https://www.sqlite.org/lang_expr.html // EqOrIsNull must be used in cases where value can be NULL func Eq[T any](value T) Expression[T] { diff --git a/badorm/mysql/logical.go b/badorm/mysql/logical.go new file mode 100644 index 00000000..956946ce --- /dev/null +++ b/badorm/mysql/logical.go @@ -0,0 +1,10 @@ +package mysql + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/shared" +) + +func Xor[T any](exprs ...badorm.Expression[T]) badorm.ConnectionExpression[T] { + return shared.Xor(exprs...) +} diff --git a/badorm/shared/logical.go b/badorm/shared/logical.go new file mode 100644 index 00000000..3e3f8d03 --- /dev/null +++ b/badorm/shared/logical.go @@ -0,0 +1,7 @@ +package shared + +import "github.com/ditrit/badaas/badorm" + +func Xor[T any](exprs ...badorm.Expression[T]) badorm.ConnectionExpression[T] { + return badorm.NewConnectionExpression("XOR", exprs...) +} \ No newline at end of file diff --git a/badorm/sqlserver/logical.go b/badorm/sqlserver/logical.go new file mode 100644 index 00000000..df8aa954 --- /dev/null +++ b/badorm/sqlserver/logical.go @@ -0,0 +1,10 @@ +package sqlserver + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/shared" +) + +func Xor[T any](exprs ...badorm.Expression[T]) badorm.ConnectionExpression[T] { + return shared.Xor(exprs...) +} diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index c37dff90..4e1b6c7c 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -995,7 +995,7 @@ func (ts *ExpressionIntTestSuite) TestPosixRegexNotPosix() { } } -func (ts *ExpressionIntTestSuite) TestMultipleExpressions() { +func (ts *ExpressionIntTestSuite) TestMultipleExpressionsAreConnectedByAnd() { match := ts.createProduct("match", 3, 0, false, nil) ts.createProduct("not_match", 5, 0, false, nil) ts.createProduct("not_match", 1, 0, false, nil) @@ -1012,6 +1012,122 @@ func (ts *ExpressionIntTestSuite) TestMultipleExpressions() { EqualList(&ts.Suite, []*models.Product{match}, entities) } +func (ts *ExpressionIntTestSuite) TestNot() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 3, 0, false, nil) + + ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Not(badorm.Eq(2)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestNotWithMultipleExpressionsAreConnectedByAnd() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 5, 0, false, nil) + + ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 3, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Not( + badorm.Gt(1), + badorm.Lt(4), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestOr() { + match1 := ts.createProduct("match", 2, 0, false, nil) + match2 := ts.createProduct("match", 3, 0, false, nil) + + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 4, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Or( + badorm.Eq(2), + badorm.Eq(3), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *ExpressionIntTestSuite) TestNotOr() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 5, 0, false, nil) + match3 := ts.createProduct("match", 4, 0, false, nil) + + ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 3, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Not[int]( + badorm.Or( + badorm.Eq(2), + badorm.Eq(3), + ), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) +} + +func (ts *ExpressionIntTestSuite) TestXor() { + match1 := ts.createProduct("", 1, 0, false, nil) + match2 := ts.createProduct("", 7, 0, false, nil) + + ts.createProduct("", 5, 0, false, nil) + ts.createProduct("", 4, 0, false, nil) + + var xorExpression badorm.Expression[int] + + switch getDBDialector() { + case configuration.PostgreSQL, configuration.SQLite: + log.Println("Xor not compatible") + case configuration.MySQL: + xorExpression = mysql.Xor( + badorm.Lt(6), + badorm.Gt(3), + ) + case configuration.SQLServer: + xorExpression = mysql.Xor( + badorm.Lt(6), + badorm.Gt(3), + ) + } + + if xorExpression != nil { + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + xorExpression, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + } +} + func (ts *ExpressionIntTestSuite) TestMultipleConditionsDifferentExpressions() { match1 := ts.createProduct("match", 1, 0.0, true, nil) match2 := ts.createProduct("match", 1, 0.0, true, nil) From e7b17e60996fcf39221ab52ad9c1ad9b181fd767 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 19 Jun 2023 12:30:57 +0200 Subject: [PATCH 357/467] move logical operators to condition level --- badorm/condition.go | 205 ++++- badorm/expression.go | 108 +-- badorm/mysql/logical.go | 4 +- badorm/shared/logical.go | 6 +- badorm/sqlserver/logical.go | 4 +- persistence/models/User.go | 6 +- testintegration/badorm_test.go | 9 +- .../conditions/bicycle_conditions.go | 36 +- .../conditions/brand_conditions.go | 30 +- testintegration/conditions/city_conditions.go | 36 +- .../conditions/company_conditions.go | 30 +- .../conditions/country_conditions.go | 30 +- .../conditions/employee_conditions.go | 36 +- .../conditions/person_conditions.go | 30 +- .../conditions/phone_conditions.go | 36 +- .../conditions/product_conditions.go | 88 +- testintegration/conditions/sale_conditions.go | 48 +- .../conditions/seller_conditions.go | 36 +- testintegration/crudService.go | 760 ------------------ testintegration/expressions_test.go | 150 ---- testintegration/join_conditions_test.go | 355 ++++++++ testintegration/where_conditions_test.go | 575 +++++++++++++ tools/badctl/cmd/gen/conditions/condition.go | 21 +- tools/badctl/cmd/gen/conditions/jenParam.go | 2 +- .../conditions/tests/results/basicpointers.go | 168 ++-- .../conditions/tests/results/basicslices.go | 132 +-- .../tests/results/basicslicespointer.go | 168 ++-- .../conditions/tests/results/basictypes.go | 132 +-- .../tests/results/belongsto_owned.go | 30 +- .../tests/results/belongsto_owner.go | 24 +- .../tests/results/columndefinition.go | 30 +- .../conditions/tests/results/customtype.go | 30 +- .../conditions/tests/results/goembedded.go | 30 +- .../conditions/tests/results/gormembedded.go | 28 +- .../tests/results/hasmany_company.go | 24 +- .../tests/results/hasmany_seller.go | 32 +- .../conditions/tests/results/hasone_city.go | 30 +- .../tests/results/hasone_country.go | 24 +- .../tests/results/multiplepackage_package1.go | 24 +- .../tests/results/overrideforeignkey.go | 30 +- .../results/overrideforeignkeyinverse.go | 24 +- .../tests/results/overridereferences.go | 30 +- .../results/overridereferencesinverse.go | 30 +- .../tests/results/selfreferential.go | 32 +- .../gen/conditions/tests/results/uintmodel.go | 24 +- .../gen/conditions/tests/results/uuidmodel.go | 24 +- 46 files changed, 1915 insertions(+), 1826 deletions(-) delete mode 100644 testintegration/crudService.go create mode 100644 testintegration/join_conditions_test.go create mode 100644 testintegration/where_conditions_test.go diff --git a/badorm/condition.go b/badorm/condition.go index 75664b71..999f6dea 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -1,13 +1,17 @@ package badorm import ( + "errors" "fmt" + "github.com/elliotchance/pie/v2" "gorm.io/gorm" ) const DeletedAtField = "DeletedAt" +var ErrEmptyConditions = errors.New("condition must have at least one inner condition") + type ConditionType string const ( @@ -31,16 +35,122 @@ type Condition[T any] interface { } type WhereCondition[T any] interface { + Condition[T] + GetSQL(query *gorm.DB, tableName string) (string, []any, error) - getField() string + affectsDeletedAt() bool +} + +type ContainerCondition[T any] struct { + ConnectionCondition WhereCondition[T] + Prefix string +} + +//nolint:unused // see inside +func (condition ContainerCondition[T]) interfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} + +func (condition ContainerCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { + return applyWhereCondition[T](condition, query, tableName) +} + +func (condition ContainerCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { + sqlString, values, err := condition.ConnectionCondition.GetSQL(query, tableName) + if err != nil { + return "", nil, err + } + + sqlString = condition.Prefix + " (" + sqlString + ")" + + return sqlString, values, nil +} + +func (condition ContainerCondition[T]) Type() ConditionType { + return WhereType +} + +func (condition ContainerCondition[T]) affectsDeletedAt() bool { + return condition.ConnectionCondition.affectsDeletedAt() +} + +func NewContainerCondition[T any](prefix string, conditions ...WhereCondition[T]) WhereCondition[T] { + if len(conditions) == 0 { + return NewInvalidCondition[T](ErrEmptyConditions) + } + + return ContainerCondition[T]{ + Prefix: prefix, + ConnectionCondition: And(conditions...), + } +} + +type ConnectionCondition[T any] struct { + Connector string + Conditions []WhereCondition[T] +} + +//nolint:unused // see inside +func (condition ConnectionCondition[T]) interfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} + +func (condition ConnectionCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { + return applyWhereCondition[T](condition, query, tableName) +} + +func (condition ConnectionCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { + sqlString := "" + values := []any{} + + for index, internalCondition := range condition.Conditions { + // TODO strings.Join(exprs, " AND ")? + if index != 0 { + sqlString += " " + condition.Connector + " " + } + + exprSQLString, exprValues, err := internalCondition.GetSQL(query, tableName) + if err != nil { + return "", nil, err + } + + sqlString += exprSQLString + + values = append(values, exprValues...) + } + + return sqlString, values, nil +} + +func (condition ConnectionCondition[T]) Type() ConditionType { + return WhereType +} + +func (condition ConnectionCondition[T]) affectsDeletedAt() bool { + return pie.Any(condition.Conditions, func(internalCondition WhereCondition[T]) bool { + return internalCondition.affectsDeletedAt() + }) +} + +func NewConnectionCondition[T any](connector string, conditions ...WhereCondition[T]) WhereCondition[T] { + if len(conditions) == 0 { + return NewInvalidCondition[T](ErrEmptyConditions) + } + + return ConnectionCondition[T]{ + Connector: connector, + Conditions: conditions, + } } type FieldCondition[TObject any, TAtribute any] struct { Field string Column string ColumnPrefix string - Expressions []Expression[TAtribute] + Expression Expression[TAtribute] } //nolint:unused // see inside @@ -52,12 +162,16 @@ func (condition FieldCondition[TObject, TAtribute]) interfaceVerificationMethod( // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { + return applyWhereCondition[TObject](condition, query, tableName) +} + +func applyWhereCondition[T any](condition WhereCondition[T], query *gorm.DB, tableName string) (*gorm.DB, error) { sql, values, err := condition.GetSQL(query, tableName) if err != nil { return nil, err } - if condition.Field == DeletedAtField { + if condition.affectsDeletedAt() { query = query.Unscoped() } @@ -71,8 +185,8 @@ func (condition FieldCondition[TObject, TAtribute]) Type() ConditionType { return WhereType } -func (condition FieldCondition[TObject, TAtribute]) getField() string { - return condition.Field +func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { + return condition.Field == DeletedAtField } func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { @@ -84,7 +198,7 @@ func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table // add column prefix and table name once we know the column name columnName = tableName + "." + condition.ColumnPrefix + columnName - return evaluateExpressions(columnName, condition.Expressions) + return condition.Expression.ToSQL(columnName) } type JoinCondition[T1 any, T2 any] struct { @@ -119,24 +233,17 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName whereConditions, joinConditions := divideConditionsByType(condition.Conditions) // apply WhereConditions to join in "on" clause - conditionsValues := []any{} - isDeletedAtConditionPresent := false + connectionCondition := And(whereConditions...) - for _, condition := range whereConditions { - if condition.getField() == DeletedAtField { - isDeletedAtConditionPresent = true - } - - sql, values, err := condition.GetSQL(query, nextTableName) - if err != nil { - return nil, err - } - - conditionsValues = append(conditionsValues, values...) - joinQuery += " AND " + sql + onQuery, onValues, err := connectionCondition.GetSQL(query, nextTableName) + if err != nil { + return nil, err } - if !isDeletedAtConditionPresent { + joinQuery += " AND " + onQuery + + // TODO podria desactivar el unscoped y meter esto en el connection + if !connectionCondition.affectsDeletedAt() { joinQuery += fmt.Sprintf( " AND %s.deleted_at IS NULL", nextTableName, @@ -144,7 +251,7 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName } // add the join to the query - query = query.Joins(joinQuery, conditionsValues...) + query = query.Joins(joinQuery, onValues...) // apply nested joins for _, joinCondition := range joinConditions { @@ -196,3 +303,57 @@ func divideConditionsByType[T any]( return } + +type InvalidCondition[T any] struct { + Err error +} + +//nolint:unused // see inside +func (condition InvalidCondition[T]) interfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} + +func (condition InvalidCondition[T]) ApplyTo(_ *gorm.DB, _ string) (*gorm.DB, error) { + return nil, condition.Err +} + +func (condition InvalidCondition[T]) Type() ConditionType { + return WhereType +} + +func (condition InvalidCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { + return "", nil, condition.Err +} + +func (condition InvalidCondition[T]) affectsDeletedAt() bool { + return false +} + +func NewInvalidCondition[T any](err error) InvalidCondition[T] { + return InvalidCondition[T]{ + Err: err, + } +} + +// Logical Operators +// ref: +// - PostgreSQL: https://www.postgresql.org/docs/current/functions-logical.html +// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/logical-operators.html +// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/logical-operators-transact-sql?view=sql-server-ver16 +// - SQLite: https://www.sqlite.org/lang_expr.html + +// TODO que pasa si quiero esto entre distintas conditions, +// y si ensima queres entre distintos joins olvidate imposible +// -> agregar unsafe condition y unsafe expression +func And[T any](conditions ...WhereCondition[T]) WhereCondition[T] { + return NewConnectionCondition("AND", conditions...) +} + +func Or[T any](conditions ...WhereCondition[T]) WhereCondition[T] { + return NewConnectionCondition("OR", conditions...) +} + +func Not[T any](conditions ...WhereCondition[T]) WhereCondition[T] { + return NewContainerCondition("NOT", conditions...) +} diff --git a/badorm/expression.go b/badorm/expression.go index fc0ad2a0..ecae9a86 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -13,9 +13,8 @@ import ( ) var ( - ErrNotRelated = errors.New("value type not related with T") - ErrValueCantBeNull = errors.New("value to compare can't be null") - ErrEmptyExpressions = errors.New("each condition must have at least one expression") + ErrNotRelated = errors.New("value type not related with T") + ErrValueCantBeNull = errors.New("value to compare can't be null") ) type Expression[T any] interface { @@ -29,87 +28,6 @@ type Expression[T any] interface { InterfaceVerificationMethod(T) } -type ContainerExpression[T any] struct { - Expressions []Expression[T] - Prefix string -} - -//nolint:unused // see inside -func (expr ContainerExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func (expr ContainerExpression[T]) ToSQL(columnName string) (string, []any, error) { - sqlString, values, err := evaluateExpressions(columnName, expr.Expressions) - if err != nil { - return "", nil, err - } - - sqlString = expr.Prefix + " (" + sqlString + ")" - - return sqlString, values, nil -} - -func evaluateExpressions[T any](columnName string, exprs []Expression[T]) (string, []any, error) { - expressionsAmount := len(exprs) - if expressionsAmount == 0 { - return "", nil, ErrEmptyExpressions - } else if expressionsAmount == 1 { - return exprs[0].ToSQL(columnName) - } - - return And(exprs...).ToSQL(columnName) -} - -func NewContainerExpression[T any](prefix string, expressions ...Expression[T]) ContainerExpression[T] { - return ContainerExpression[T]{ - Prefix: prefix, - Expressions: expressions, - } -} - -type ConnectionExpression[T any] struct { - Expressions []Expression[T] - Connector string -} - -//nolint:unused // see inside -func (expr ConnectionExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func (expr ConnectionExpression[T]) ToSQL(columnName string) (string, []any, error) { - sqlString := "" - values := []any{} - - for index, internalExpr := range expr.Expressions { - // TODO strings.Join(exprs, " AND ")? - if index != 0 { - sqlString += " " + expr.Connector + " " - } - - exprSQLString, exprValues, err := internalExpr.ToSQL(columnName) - if err != nil { - return "", nil, err - } - - sqlString += exprSQLString - - values = append(values, exprValues...) - } - - return sqlString, values, nil -} - -func NewConnectionExpression[T any](connector string, expressions ...Expression[T]) ConnectionExpression[T] { - return ConnectionExpression[T]{ - Connector: connector, - Expressions: expressions, - } -} - type ValueExpression[T any] struct { ExpressionsAndValues []SQLExpressionAndValue } @@ -267,28 +185,6 @@ func NewInvalidExpression[T any](err error) InvalidExpression[T] { } } -// Logical Operators -// ref: -// - PostgreSQL: https://www.postgresql.org/docs/current/functions-logical.html -// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/logical-operators.html -// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/logical-operators-transact-sql?view=sql-server-ver16 -// - SQLite: https://www.sqlite.org/lang_expr.html - -func And[T any](exprs ...Expression[T]) ConnectionExpression[T] { - return NewConnectionExpression("AND", exprs...) -} - -// TODO que pasa si quiero esto entre distintas conditions, -// y si ensima queres entre distintos joins olvidate imposible -// -> agregar unsafe condition y unsafe expression -func Or[T any](exprs ...Expression[T]) ConnectionExpression[T] { - return NewConnectionExpression("OR", exprs...) -} - -func Not[T any](exprs ...Expression[T]) ContainerExpression[T] { - return NewContainerExpression("NOT", exprs...) -} - // Comparison Operators // refs: // - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html diff --git a/badorm/mysql/logical.go b/badorm/mysql/logical.go index 956946ce..548d9b4d 100644 --- a/badorm/mysql/logical.go +++ b/badorm/mysql/logical.go @@ -5,6 +5,6 @@ import ( "github.com/ditrit/badaas/badorm/shared" ) -func Xor[T any](exprs ...badorm.Expression[T]) badorm.ConnectionExpression[T] { - return shared.Xor(exprs...) +func Xor[T any](conditions ...badorm.WhereCondition[T]) badorm.WhereCondition[T] { + return shared.Xor(conditions...) } diff --git a/badorm/shared/logical.go b/badorm/shared/logical.go index 3e3f8d03..2b77aed5 100644 --- a/badorm/shared/logical.go +++ b/badorm/shared/logical.go @@ -2,6 +2,6 @@ package shared import "github.com/ditrit/badaas/badorm" -func Xor[T any](exprs ...badorm.Expression[T]) badorm.ConnectionExpression[T] { - return badorm.NewConnectionExpression("XOR", exprs...) -} \ No newline at end of file +func Xor[T any](conditions ...badorm.WhereCondition[T]) badorm.WhereCondition[T] { + return badorm.NewConnectionCondition("XOR", conditions...) +} diff --git a/badorm/sqlserver/logical.go b/badorm/sqlserver/logical.go index df8aa954..f9e3c261 100644 --- a/badorm/sqlserver/logical.go +++ b/badorm/sqlserver/logical.go @@ -5,6 +5,6 @@ import ( "github.com/ditrit/badaas/badorm/shared" ) -func Xor[T any](exprs ...badorm.Expression[T]) badorm.ConnectionExpression[T] { - return shared.Xor(exprs...) +func Xor[T any](conditions ...badorm.WhereCondition[T]) badorm.WhereCondition[T] { + return shared.Xor(conditions...) } diff --git a/persistence/models/User.go b/persistence/models/User.go index f24c4dd1..d4a6bc54 100644 --- a/persistence/models/User.go +++ b/persistence/models/User.go @@ -12,9 +12,9 @@ type User struct { Password []byte `gorm:"not null"` } -func UserEmailCondition(exprs ...badorm.Expression[string]) badorm.FieldCondition[User, string] { +func UserEmailCondition(expr badorm.Expression[string]) badorm.WhereCondition[User] { return badorm.FieldCondition[User, string]{ - Expressions: exprs, - Field: "Email", + Expression: expr, + Field: "Email", } } diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index 02749be8..db07a0ed 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -67,9 +67,10 @@ func TestBaDORM(t *testing.T) { badorm.GetCRUDUnsafeServiceModule[models.Phone](), badorm.GetCRUDUnsafeServiceModule[models.Brand](), - fx.Provide(NewCRUDServiceIntTestSuite), fx.Provide(NewCRUDUnsafeServiceIntTestSuite), fx.Provide(NewCRUDRepositoryIntTestSuite), + fx.Provide(NewWhereConditionsIntTestSuite), + fx.Provide(NewJoinConditionsIntTestSuite), fx.Provide(NewExpressionsIntTestSuite), fx.Invoke(runBaDORMTestSuites), @@ -77,15 +78,17 @@ func TestBaDORM(t *testing.T) { } func runBaDORMTestSuites( - tsCRUDService *CRUDServiceIntTestSuite, tsCRUDRepository *CRUDRepositoryIntTestSuite, tsCRUDUnsafeService *CRUDUnsafeServiceIntTestSuite, + tsWhereConditions *WhereConditionsIntTestSuite, + tsJoinConditions *JoinConditionsIntTestSuite, tsExpressions *ExpressionIntTestSuite, shutdowner fx.Shutdowner, ) { - suite.Run(tGlobal, tsCRUDService) suite.Run(tGlobal, tsCRUDRepository) suite.Run(tGlobal, tsCRUDUnsafeService) + suite.Run(tGlobal, tsWhereConditions) + suite.Run(tGlobal, tsJoinConditions) suite.Run(tGlobal, tsExpressions) shutdowner.Shutdown() diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index 2aad2335..f9667f25 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -8,34 +8,34 @@ import ( "time" ) -func BicycleId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Bicycle, badorm.UUID] { +func BicycleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func BicycleCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Bicycle, time.Time] { +func BicycleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func BicycleUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Bicycle, time.Time] { +func BicycleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func BicycleDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Bicycle, gorm.DeletedAt] { +func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func BicycleName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Bicycle, string] { +func BicycleName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, string]{ - Expressions: exprs, - Field: "Name", + Expression: expr, + Field: "Name", } } func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Condition[models.Bicycle] { @@ -45,9 +45,9 @@ func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Conditio T2Field: "Name", } } -func BicycleOwnerName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Bicycle, string] { +func BicycleOwnerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, string]{ - Expressions: exprs, - Field: "OwnerName", + Expression: expr, + Field: "OwnerName", } } diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index ebe34f5a..af6c308f 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -8,33 +8,33 @@ import ( "time" ) -func BrandId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[models.Brand, uint] { +func BrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, uint]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func BrandCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Brand, time.Time] { +func BrandCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func BrandUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Brand, time.Time] { +func BrandUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func BrandDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Brand, gorm.DeletedAt] { +func BrandDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func BrandName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Brand, string] { +func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, string]{ - Expressions: exprs, - Field: "Name", + Expression: expr, + Field: "Name", } } diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index d28c19ae..39285987 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -8,39 +8,39 @@ import ( "time" ) -func CityId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.City, badorm.UUID] { +func CityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func CityCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.City, time.Time] { +func CityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func CityUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.City, time.Time] { +func CityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func CityDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.City, gorm.DeletedAt] { +func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func CityName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.City, string] { +func CityName(expr badorm.Expression[string]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, string]{ - Expressions: exprs, - Field: "Name", + Expression: expr, + Field: "Name", } } -func CityCountryId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.City, badorm.UUID] { +func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, badorm.UUID]{ - Expressions: exprs, - Field: "CountryID", + Expression: expr, + Field: "CountryID", } } diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index b70fd8a3..26dba2fd 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -8,34 +8,34 @@ import ( "time" ) -func CompanyId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Company, badorm.UUID] { +func CompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func CompanyCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Company, time.Time] { +func CompanyCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func CompanyUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Company, time.Time] { +func CompanyUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func CompanyDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Company, gorm.DeletedAt] { +func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func CompanyName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Company, string] { +func CompanyName(expr badorm.Expression[string]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, string]{ - Expressions: exprs, - Field: "Name", + Expression: expr, + Field: "Name", } } func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index 8867c469..da99c890 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -8,34 +8,34 @@ import ( "time" ) -func CountryId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Country, badorm.UUID] { +func CountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func CountryCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Country, time.Time] { +func CountryCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func CountryUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Country, time.Time] { +func CountryUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func CountryDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Country, gorm.DeletedAt] { +func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func CountryName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Country, string] { +func CountryName(expr badorm.Expression[string]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, string]{ - Expressions: exprs, - Field: "Name", + Expression: expr, + Field: "Name", } } func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.Condition[models.Country] { diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index e6fff2d9..884fd9f8 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -8,34 +8,34 @@ import ( "time" ) -func EmployeeId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Employee, badorm.UUID] { +func EmployeeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func EmployeeCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Employee, time.Time] { +func EmployeeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func EmployeeUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Employee, time.Time] { +func EmployeeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func EmployeeDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Employee, gorm.DeletedAt] { +func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func EmployeeName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Employee, string] { +func EmployeeName(expr badorm.Expression[string]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, string]{ - Expressions: exprs, - Field: "Name", + Expression: expr, + Field: "Name", } } func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condition[models.Employee] { @@ -45,9 +45,9 @@ func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condit T2Field: "ID", } } -func EmployeeBossId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Employee, badorm.UUID] { +func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, badorm.UUID]{ - Expressions: exprs, - Field: "BossID", + Expression: expr, + Field: "BossID", } } diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index 19ed21f4..eb63cdac 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -8,33 +8,33 @@ import ( "time" ) -func PersonId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Person, badorm.UUID] { +func PersonId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func PersonCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Person, time.Time] { +func PersonCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func PersonUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Person, time.Time] { +func PersonUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func PersonDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Person, gorm.DeletedAt] { +func PersonDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func PersonName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Person, string] { +func PersonName(expr badorm.Expression[string]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, string]{ - Expressions: exprs, - Field: "Name", + Expression: expr, + Field: "Name", } } diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index b101b387..27c586e0 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -8,34 +8,34 @@ import ( "time" ) -func PhoneId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[models.Phone, uint] { +func PhoneId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, uint]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func PhoneCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Phone, time.Time] { +func PhoneCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func PhoneUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Phone, time.Time] { +func PhoneUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func PhoneDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Phone, gorm.DeletedAt] { +func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func PhoneName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Phone, string] { +func PhoneName(expr badorm.Expression[string]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, string]{ - Expressions: exprs, - Field: "Name", + Expression: expr, + Field: "Name", } } func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[models.Phone] { @@ -45,9 +45,9 @@ func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[m T2Field: "ID", } } -func PhoneBrandId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[models.Phone, uint] { +func PhoneBrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, uint]{ - Expressions: exprs, - Field: "BrandID", + Expression: expr, + Field: "BrandID", } } diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index 13c70356..632be864 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -9,94 +9,94 @@ import ( "time" ) -func ProductId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Product, badorm.UUID] { +func ProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func ProductCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Product, time.Time] { +func ProductCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func ProductUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Product, time.Time] { +func ProductUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func ProductDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Product, gorm.DeletedAt] { +func ProductDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func ProductString(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Product, string] { +func ProductString(expr badorm.Expression[string]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, string]{ - Column: "string_something_else", - Expressions: exprs, + Column: "string_something_else", + Expression: expr, } } -func ProductInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Product, int] { +func ProductInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expressions: exprs, - Field: "Int", + Expression: expr, + Field: "Int", } } -func ProductIntPointer(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Product, int] { +func ProductIntPointer(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expressions: exprs, - Field: "IntPointer", + Expression: expr, + Field: "IntPointer", } } -func ProductFloat(exprs ...badorm.Expression[float64]) badorm.FieldCondition[models.Product, float64] { +func ProductFloat(expr badorm.Expression[float64]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, float64]{ - Expressions: exprs, - Field: "Float", + Expression: expr, + Field: "Float", } } -func ProductNullFloat(exprs ...badorm.Expression[sql.NullFloat64]) badorm.FieldCondition[models.Product, sql.NullFloat64] { +func ProductNullFloat(expr badorm.Expression[sql.NullFloat64]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, sql.NullFloat64]{ - Expressions: exprs, - Field: "NullFloat", + Expression: expr, + Field: "NullFloat", } } -func ProductBool(exprs ...badorm.Expression[bool]) badorm.FieldCondition[models.Product, bool] { +func ProductBool(expr badorm.Expression[bool]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, bool]{ - Expressions: exprs, - Field: "Bool", + Expression: expr, + Field: "Bool", } } -func ProductNullBool(exprs ...badorm.Expression[sql.NullBool]) badorm.FieldCondition[models.Product, sql.NullBool] { +func ProductNullBool(expr badorm.Expression[sql.NullBool]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, sql.NullBool]{ - Expressions: exprs, - Field: "NullBool", + Expression: expr, + Field: "NullBool", } } -func ProductByteArray(exprs ...badorm.Expression[[]uint8]) badorm.FieldCondition[models.Product, []uint8] { +func ProductByteArray(expr badorm.Expression[[]uint8]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, []uint8]{ - Expressions: exprs, - Field: "ByteArray", + Expression: expr, + Field: "ByteArray", } } -func ProductMultiString(exprs ...badorm.Expression[models.MultiString]) badorm.FieldCondition[models.Product, models.MultiString] { +func ProductMultiString(expr badorm.Expression[models.MultiString]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, models.MultiString]{ - Expressions: exprs, - Field: "MultiString", + Expression: expr, + Field: "MultiString", } } -func ProductEmbeddedInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Product, int] { +func ProductEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expressions: exprs, - Field: "EmbeddedInt", + Expression: expr, + Field: "EmbeddedInt", } } -func ProductGormEmbeddedInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Product, int] { +func ProductGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ ColumnPrefix: "gorm_embedded_", - Expressions: exprs, + Expression: expr, Field: "Int", } } diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 4e19c787..13f75fe8 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -8,40 +8,40 @@ import ( "time" ) -func SaleId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Sale, badorm.UUID] { +func SaleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func SaleCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Sale, time.Time] { +func SaleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func SaleUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Sale, time.Time] { +func SaleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func SaleDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Sale, gorm.DeletedAt] { +func SaleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func SaleCode(exprs ...badorm.Expression[int]) badorm.FieldCondition[models.Sale, int] { +func SaleCode(expr badorm.Expression[int]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, int]{ - Expressions: exprs, - Field: "Code", + Expression: expr, + Field: "Code", } } -func SaleDescription(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Sale, string] { +func SaleDescription(expr badorm.Expression[string]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, string]{ - Expressions: exprs, - Field: "Description", + Expression: expr, + Field: "Description", } } func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Condition[models.Sale] { @@ -51,10 +51,10 @@ func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Conditio T2Field: "ID", } } -func SaleProductId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Sale, badorm.UUID] { +func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ - Expressions: exprs, - Field: "ProductID", + Expression: expr, + Field: "ProductID", } } func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[models.Sale] { @@ -64,9 +64,9 @@ func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[ T2Field: "ID", } } -func SaleSellerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Sale, badorm.UUID] { +func SaleSellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ - Expressions: exprs, - Field: "SellerID", + Expression: expr, + Field: "SellerID", } } diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 146c3251..1cf69a97 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -8,39 +8,39 @@ import ( "time" ) -func SellerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Seller, badorm.UUID] { +func SellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func SellerCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Seller, time.Time] { +func SellerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func SellerUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[models.Seller, time.Time] { +func SellerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func SellerDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[models.Seller, gorm.DeletedAt] { +func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func SellerName(exprs ...badorm.Expression[string]) badorm.FieldCondition[models.Seller, string] { +func SellerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, string]{ - Expressions: exprs, - Field: "Name", + Expression: expr, + Field: "Name", } } -func SellerCompanyId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[models.Seller, badorm.UUID] { +func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ - Expressions: exprs, - Field: "CompanyID", + Expression: expr, + Field: "CompanyID", } } diff --git a/testintegration/crudService.go b/testintegration/crudService.go deleted file mode 100644 index 8011f0cc..00000000 --- a/testintegration/crudService.go +++ /dev/null @@ -1,760 +0,0 @@ -package testintegration - -import ( - "gorm.io/gorm" - "gotest.tools/assert" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/testintegration/conditions" - "github.com/ditrit/badaas/testintegration/models" -) - -type CRUDServiceIntTestSuite struct { - CRUDServiceCommonIntTestSuite - crudProductService badorm.CRUDService[models.Product, badorm.UUID] - crudSaleService badorm.CRUDService[models.Sale, badorm.UUID] - crudSellerService badorm.CRUDService[models.Seller, badorm.UUID] - crudCountryService badorm.CRUDService[models.Country, badorm.UUID] - crudCityService badorm.CRUDService[models.City, badorm.UUID] - crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID] - crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID] - crudBrandService badorm.CRUDService[models.Brand, uint] - crudPhoneService badorm.CRUDService[models.Phone, uint] -} - -func NewCRUDServiceIntTestSuite( - db *gorm.DB, - crudProductService badorm.CRUDService[models.Product, badorm.UUID], - crudSaleService badorm.CRUDService[models.Sale, badorm.UUID], - crudSellerService badorm.CRUDService[models.Seller, badorm.UUID], - crudCountryService badorm.CRUDService[models.Country, badorm.UUID], - crudCityService badorm.CRUDService[models.City, badorm.UUID], - crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID], - crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID], - crudBrandService badorm.CRUDService[models.Brand, uint], - crudPhoneService badorm.CRUDService[models.Phone, uint], -) *CRUDServiceIntTestSuite { - return &CRUDServiceIntTestSuite{ - CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ - db: db, - }, - crudProductService: crudProductService, - crudSaleService: crudSaleService, - crudSellerService: crudSellerService, - crudCountryService: crudCountryService, - crudCityService: crudCityService, - crudEmployeeService: crudEmployeeService, - crudBicycleService: crudBicycleService, - crudBrandService: crudBrandService, - crudPhoneService: crudPhoneService, - } -} - -// ------------------------- GetEntity -------------------------------- - -func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { - _, err := ts.crudProductService.GetEntity(badorm.NilUUID) - ts.Error(err, gorm.ErrRecordNotFound) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { - ts.createProduct("", 0, 0, false, nil) - - _, err := ts.crudProductService.GetEntity(badorm.NewUUID()) - ts.Error(err, gorm.ErrRecordNotFound) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntityReturnsTheEntityIfItIsCreate() { - match := ts.createProduct("", 0, 0, false, nil) - - entity, err := ts.crudProductService.GetEntity(match.ID) - ts.Nil(err) - - assert.DeepEqual(ts.T(), match, entity) -} - -// ------------------------- GetEntities -------------------------------- - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.crudProductService.GetEntities() - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { - match := ts.createProduct("", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities() - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { - match1 := ts.createProduct("", 0, 0, false, nil) - match2 := ts.createProduct("", 0, 0, false, nil) - match3 := ts.createProduct("", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities() - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString( - badorm.Eq("not_created"), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { - ts.createProduct("something_else", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString( - badorm.Eq("not_match"), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { - match := ts.createProduct("match", 0, 0, false, nil) - ts.createProduct("not_match", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString( - badorm.Eq("match"), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { - match1 := ts.createProduct("match", 0, 0, false, nil) - match2 := ts.createProduct("match", 0, 0, false, nil) - ts.createProduct("not_match", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString( - badorm.Eq("match"), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { - match := ts.createProduct("match", 1, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.Eq(1), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { - match := ts.createProduct("match", 0, 1.1, false, nil) - ts.createProduct("not_match", 0, 2.2, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductFloat( - badorm.Eq(1.1), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { - match := ts.createProduct("match", 0, 0.0, true, nil) - ts.createProduct("not_match", 0, 0.0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductBool( - badorm.Eq(true), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { - match1 := ts.createProduct("match", 1, 0.0, true, nil) - match2 := ts.createProduct("match", 1, 0.0, true, nil) - - ts.createProduct("not_match", 1, 0.0, true, nil) - ts.createProduct("match", 2, 0.0, true, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString(badorm.Eq("match")), - conditions.ProductInt(badorm.Eq(1)), - conditions.ProductBool(badorm.Eq(true)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfID() { - match := ts.createProduct("", 0, 0.0, false, nil) - ts.createProduct("", 0, 0.0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductId( - badorm.Eq(match.ID), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCreatedAt() { - match := ts.createProduct("", 0, 0.0, false, nil) - ts.createProduct("", 0, 0.0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductCreatedAt(badorm.Eq(match.CreatedAt)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesDeletedAtConditionIsAddedAutomatically() { - match := ts.createProduct("", 0, 0.0, false, nil) - deleted := ts.createProduct("", 0, 0.0, false, nil) - - ts.Nil(ts.db.Delete(deleted).Error) - - entities, err := ts.crudProductService.GetEntities() - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -// TODO DeletedAt with nil value but not automatic - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfDeletedAtNotNil() { - match := ts.createProduct("", 0, 0.0, false, nil) - ts.createProduct("", 0, 0.0, false, nil) - - ts.Nil(ts.db.Delete(match).Error) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductDeletedAt(badorm.Eq(match.DeletedAt)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfEmbedded() { - match := ts.createProduct("", 0, 0.0, false, nil) - ts.createProduct("", 0, 0.0, false, nil) - - match.EmbeddedInt = 1 - - err := ts.db.Save(match).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductEmbeddedInt(badorm.Eq(1)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfGormEmbedded() { - match := ts.createProduct("", 0, 0.0, false, nil) - ts.createProduct("", 0, 0.0, false, nil) - - match.GormEmbedded.Int = 1 - - err := ts.db.Save(match).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductGormEmbeddedInt(badorm.Eq(1)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfPointerTypeWithValue() { - intMatch := 1 - match := ts.createProduct("match", 1, 0, false, &intMatch) - intNotMatch := 2 - ts.createProduct("not_match", 2, 0, false, &intNotMatch) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductIntPointer(badorm.Eq(1)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayWithContent() { - match := ts.createProduct("match", 1, 0, false, nil) - notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - match.ByteArray = []byte{1, 2} - notMatch1.ByteArray = []byte{2, 3} - - err := ts.db.Save(match).Error - ts.Nil(err) - - err = ts.db.Save(notMatch1).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductByteArray(badorm.Eq([]byte{1, 2})), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfByteArrayEmpty() { - match := ts.createProduct("match", 1, 0, false, nil) - notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - match.ByteArray = []byte{} - notMatch1.ByteArray = []byte{2, 3} - - err := ts.db.Save(match).Error - ts.Nil(err) - - err = ts.db.Save(notMatch1).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductByteArray(badorm.Eq([]byte{})), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfCustomType() { - match := ts.createProduct("match", 1, 0, false, nil) - notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - match.MultiString = models.MultiString{"salut", "hola"} - notMatch1.MultiString = models.MultiString{"salut", "hola", "hello"} - - err := ts.db.Save(match).Error - ts.Nil(err) - - err = ts.db.Save(notMatch1).Error - ts.Nil(err) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductMultiString(badorm.Eq(models.MultiString{"salut", "hola"})), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { - product1 := ts.createProduct("", 0, 0.0, false, nil) - product2 := ts.createProduct("", 0, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProductId(badorm.Eq(product1.ID)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalWithValue() { - product1 := ts.createProduct("", 0, 0.0, false, nil) - product2 := ts.createProduct("", 0, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSellerId(badorm.Eq(seller1.ID)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationTypeOptionalByNil() { - product1 := ts.createProduct("", 0, 0.0, false, nil) - product2 := ts.createProduct("", 0, 0.0, false, nil) - - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, nil) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSellerId(badorm.IsNull[badorm.UUID]()), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionsOnUIntModel() { - match := ts.createBrand("match") - ts.createBrand("not_match") - - entities, err := ts.crudBrandService.GetEntities( - conditions.BrandName(badorm.Eq("match")), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Brand{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsUintBelongsTo() { - brand1 := ts.createBrand("google") - brand2 := ts.createBrand("apple") - - match := ts.createPhone("pixel", *brand1) - ts.createPhone("iphone", *brand2) - - entities, err := ts.crudPhoneService.GetEntities( - conditions.PhoneBrand( - conditions.BrandName(badorm.Eq("google")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Phone{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsBelongsTo() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) - - match := ts.createSale(0, product1, nil) - ts.createSale(0, product2, nil) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductInt(badorm.Eq(1)), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersTheMainEntity() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(1, product1, seller1) - ts.createSale(2, product2, seller2) - ts.createSale(2, product1, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleCode(badorm.Eq(1)), - conditions.SaleProduct( - conditions.ProductInt(badorm.Eq(1)), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneOptional() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSeller( - conditions.SellerName(badorm.Eq("franco")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsHasOneSelfReferential() { - boss1 := &models.Employee{ - Name: "Xavier", - } - boss2 := &models.Employee{ - Name: "Vincent", - } - - match := ts.createEmployee("franco", boss1) - ts.createEmployee("pierre", boss2) - - entities, err := ts.crudEmployeeService.GetEntities( - conditions.EmployeeBoss( - conditions.EmployeeName(badorm.Eq("Xavier")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Employee{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOne() { - capital1 := models.City{ - Name: "Buenos Aires", - } - capital2 := models.City{ - Name: "Paris", - } - - ts.createCountry("Argentina", capital1) - ts.createCountry("France", capital2) - - entities, err := ts.crudCityService.GetEntities( - conditions.CityCountry( - conditions.CountryName(badorm.Eq("Argentina")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.City{&capital1}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOneToOneReversed() { - capital1 := models.City{ - Name: "Buenos Aires", - } - capital2 := models.City{ - Name: "Paris", - } - - country1 := ts.createCountry("Argentina", capital1) - ts.createCountry("France", capital2) - - entities, err := ts.crudCountryService.GetEntities( - conditions.CountryCapital( - conditions.CityName(badorm.Eq("Buenos Aires")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Country{country1}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsWithEntityThatDefinesTableName() { - person1 := models.Person{ - Name: "franco", - } - person2 := models.Person{ - Name: "xavier", - } - - match := ts.createBicycle("BMX", person1) - ts.createBicycle("Shimano", person2) - - entities, err := ts.crudBicycleService.GetEntities( - conditions.BicycleOwner( - conditions.PersonName(badorm.Eq("franco")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Bicycle{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnHasMany() { - company1 := ts.createCompany("ditrit") - company2 := ts.createCompany("orness") - - match := ts.createSeller("franco", company1) - ts.createSeller("agustin", company2) - - entities, err := ts.crudSellerService.GetEntities( - conditions.SellerCompany( - conditions.CompanyName(badorm.Eq("ditrit")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Seller{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { - product1 := ts.createProduct("match", 1, 0.0, false, nil) - product2 := ts.createProduct("match", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductInt(badorm.Eq(1)), - conditions.ProductString(badorm.Eq("match")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAddsDeletedAtAutomatically() { - product1 := ts.createProduct("match", 1, 0.0, false, nil) - product2 := ts.createProduct("match", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - ts.Nil(ts.db.Delete(product2).Error) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductString(badorm.Eq("match")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDeletedAt() { - product1 := ts.createProduct("match", 1, 0.0, false, nil) - product2 := ts.createProduct("match", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - ts.Nil(ts.db.Delete(product1).Error) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductDeletedAt(badorm.Eq(product1.DeletedAt)), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsAndFiltersByNil() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - intProduct2 := 2 - product2 := ts.createProduct("", 2, 0.0, false, &intProduct2) - - match := ts.createSale(0, product1, nil) - ts.createSale(0, product2, nil) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductIntPointer(badorm.IsNull[int]()), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - ts.createSale(0, product1, seller2) - ts.createSale(0, product2, seller1) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductInt(badorm.Eq(1)), - ), - conditions.SaleSeller( - conditions.SellerName(badorm.Eq("franco")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { - product1 := ts.createProduct("", 0, 0.0, false, nil) - product2 := ts.createProduct("", 0, 0.0, false, nil) - - company1 := ts.createCompany("ditrit") - company2 := ts.createCompany("orness") - - seller1 := ts.createSeller("franco", company1) - seller2 := ts.createSeller("agustin", company2) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSeller( - conditions.SellerName(badorm.Eq("franco")), - conditions.SellerCompany( - conditions.CompanyName(badorm.Eq("ditrit")), - ), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 4e1b6c7c..87fd7a44 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -994,153 +994,3 @@ func (ts *ExpressionIntTestSuite) TestPosixRegexNotPosix() { ts.ErrorContains(err, "error parsing regexp") } } - -func (ts *ExpressionIntTestSuite) TestMultipleExpressionsAreConnectedByAnd() { - match := ts.createProduct("match", 3, 0, false, nil) - ts.createProduct("not_match", 5, 0, false, nil) - ts.createProduct("not_match", 1, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.GtOrEq(3), - badorm.LtOrEq(4), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *ExpressionIntTestSuite) TestNot() { - match1 := ts.createProduct("match", 1, 0, false, nil) - match2 := ts.createProduct("match", 3, 0, false, nil) - - ts.createProduct("not_match", 2, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.Not(badorm.Eq(2)), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *ExpressionIntTestSuite) TestNotWithMultipleExpressionsAreConnectedByAnd() { - match1 := ts.createProduct("match", 1, 0, false, nil) - match2 := ts.createProduct("match", 5, 0, false, nil) - - ts.createProduct("not_match", 2, 0, false, nil) - ts.createProduct("not_match", 3, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.Not( - badorm.Gt(1), - badorm.Lt(4), - ), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *ExpressionIntTestSuite) TestOr() { - match1 := ts.createProduct("match", 2, 0, false, nil) - match2 := ts.createProduct("match", 3, 0, false, nil) - - ts.createProduct("not_match", 1, 0, false, nil) - ts.createProduct("not_match", 4, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.Or( - badorm.Eq(2), - badorm.Eq(3), - ), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *ExpressionIntTestSuite) TestNotOr() { - match1 := ts.createProduct("match", 1, 0, false, nil) - match2 := ts.createProduct("match", 5, 0, false, nil) - match3 := ts.createProduct("match", 4, 0, false, nil) - - ts.createProduct("not_match", 2, 0, false, nil) - ts.createProduct("not_match", 3, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.Not[int]( - badorm.Or( - badorm.Eq(2), - badorm.Eq(3), - ), - ), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) -} - -func (ts *ExpressionIntTestSuite) TestXor() { - match1 := ts.createProduct("", 1, 0, false, nil) - match2 := ts.createProduct("", 7, 0, false, nil) - - ts.createProduct("", 5, 0, false, nil) - ts.createProduct("", 4, 0, false, nil) - - var xorExpression badorm.Expression[int] - - switch getDBDialector() { - case configuration.PostgreSQL, configuration.SQLite: - log.Println("Xor not compatible") - case configuration.MySQL: - xorExpression = mysql.Xor( - badorm.Lt(6), - badorm.Gt(3), - ) - case configuration.SQLServer: - xorExpression = mysql.Xor( - badorm.Lt(6), - badorm.Gt(3), - ) - } - - if xorExpression != nil { - entities, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - xorExpression, - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) - } -} - -func (ts *ExpressionIntTestSuite) TestMultipleConditionsDifferentExpressions() { - match1 := ts.createProduct("match", 1, 0.0, true, nil) - match2 := ts.createProduct("match", 1, 0.0, true, nil) - - ts.createProduct("not_match", 1, 0.0, true, nil) - ts.createProduct("match", 2, 0.0, true, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString(badorm.Eq("match")), - conditions.ProductInt(badorm.Lt(2)), - conditions.ProductBool(badorm.NotEq(false)), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go new file mode 100644 index 00000000..44585979 --- /dev/null +++ b/testintegration/join_conditions_test.go @@ -0,0 +1,355 @@ +package testintegration + +import ( + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/testintegration/conditions" + "github.com/ditrit/badaas/testintegration/models" +) + +type JoinConditionsIntTestSuite struct { + CRUDServiceCommonIntTestSuite + crudSaleService badorm.CRUDService[models.Sale, badorm.UUID] + crudSellerService badorm.CRUDService[models.Seller, badorm.UUID] + crudCountryService badorm.CRUDService[models.Country, badorm.UUID] + crudCityService badorm.CRUDService[models.City, badorm.UUID] + crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID] + crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID] + crudPhoneService badorm.CRUDService[models.Phone, uint] +} + +func NewJoinConditionsIntTestSuite( + db *gorm.DB, + crudSaleService badorm.CRUDService[models.Sale, badorm.UUID], + crudSellerService badorm.CRUDService[models.Seller, badorm.UUID], + crudCountryService badorm.CRUDService[models.Country, badorm.UUID], + crudCityService badorm.CRUDService[models.City, badorm.UUID], + crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID], + crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID], + crudPhoneService badorm.CRUDService[models.Phone, uint], +) *JoinConditionsIntTestSuite { + return &JoinConditionsIntTestSuite{ + CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ + db: db, + }, + crudSaleService: crudSaleService, + crudSellerService: crudSellerService, + crudCountryService: crudCountryService, + crudCityService: crudCityService, + crudEmployeeService: crudEmployeeService, + crudBicycleService: crudBicycleService, + crudPhoneService: crudPhoneService, + } +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsUintBelongsTo() { + brand1 := ts.createBrand("google") + brand2 := ts.createBrand("apple") + + match := ts.createPhone("pixel", *brand1) + ts.createPhone("iphone", *brand2) + + entities, err := ts.crudPhoneService.GetEntities( + conditions.PhoneBrand( + conditions.BrandName(badorm.Eq("google")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Phone{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsBelongsTo() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductInt(badorm.Eq(1)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsAndFiltersTheMainEntity() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(1, product1, seller1) + ts.createSale(2, product2, seller2) + ts.createSale(2, product1, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleCode(badorm.Eq(1)), + conditions.SaleProduct( + conditions.ProductInt(badorm.Eq(1)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsHasOneOptional() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSeller( + conditions.SellerName(badorm.Eq("franco")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsHasOneSelfReferential() { + boss1 := &models.Employee{ + Name: "Xavier", + } + boss2 := &models.Employee{ + Name: "Vincent", + } + + match := ts.createEmployee("franco", boss1) + ts.createEmployee("pierre", boss2) + + entities, err := ts.crudEmployeeService.GetEntities( + conditions.EmployeeBoss( + conditions.EmployeeName(badorm.Eq("Xavier")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Employee{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsOneToOne() { + capital1 := models.City{ + Name: "Buenos Aires", + } + capital2 := models.City{ + Name: "Paris", + } + + ts.createCountry("Argentina", capital1) + ts.createCountry("France", capital2) + + entities, err := ts.crudCityService.GetEntities( + conditions.CityCountry( + conditions.CountryName(badorm.Eq("Argentina")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.City{&capital1}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsOneToOneReversed() { + capital1 := models.City{ + Name: "Buenos Aires", + } + capital2 := models.City{ + Name: "Paris", + } + + country1 := ts.createCountry("Argentina", capital1) + ts.createCountry("France", capital2) + + entities, err := ts.crudCountryService.GetEntities( + conditions.CountryCapital( + conditions.CityName(badorm.Eq("Buenos Aires")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Country{country1}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsWithEntityThatDefinesTableName() { + person1 := models.Person{ + Name: "franco", + } + person2 := models.Person{ + Name: "xavier", + } + + match := ts.createBicycle("BMX", person1) + ts.createBicycle("Shimano", person2) + + entities, err := ts.crudBicycleService.GetEntities( + conditions.BicycleOwner( + conditions.PersonName(badorm.Eq("franco")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Bicycle{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsOnHasMany() { + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + match := ts.createSeller("franco", company1) + ts.createSeller("agustin", company2) + + entities, err := ts.crudSellerService.GetEntities( + conditions.SellerCompany( + conditions.CompanyName(badorm.Eq("ditrit")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Seller{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsOnDifferentAttributes() { + product1 := ts.createProduct("match", 1, 0.0, false, nil) + product2 := ts.createProduct("match", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductInt(badorm.Eq(1)), + conditions.ProductString(badorm.Eq("match")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsAddsDeletedAtAutomatically() { + product1 := ts.createProduct("match", 1, 0.0, false, nil) + product2 := ts.createProduct("match", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + ts.Nil(ts.db.Delete(product2).Error) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductString(badorm.Eq("match")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsOnDeletedAt() { + product1 := ts.createProduct("match", 1, 0.0, false, nil) + product2 := ts.createProduct("match", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + ts.Nil(ts.db.Delete(product1).Error) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductDeletedAt(badorm.Eq(product1.DeletedAt)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsAndFiltersByNil() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + intProduct2 := 2 + product2 := ts.createProduct("", 2, 0.0, false, &intProduct2) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductIntPointer(badorm.IsNull[int]()), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsDifferentEntities() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + ts.createSale(0, product1, seller2) + ts.createSale(0, product2, seller1) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductInt(badorm.Eq(1)), + ), + conditions.SaleSeller( + conditions.SellerName(badorm.Eq("franco")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsMultipleTimes() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + seller1 := ts.createSeller("franco", company1) + seller2 := ts.createSeller("agustin", company2) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSeller( + conditions.SellerName(badorm.Eq("franco")), + conditions.SellerCompany( + conditions.CompanyName(badorm.Eq("ditrit")), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} diff --git a/testintegration/where_conditions_test.go b/testintegration/where_conditions_test.go new file mode 100644 index 00000000..2f02806a --- /dev/null +++ b/testintegration/where_conditions_test.go @@ -0,0 +1,575 @@ +package testintegration + +import ( + "log" + + "gorm.io/gorm" + "gotest.tools/assert" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/mysql" + "github.com/ditrit/badaas/badorm/sqlserver" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/testintegration/conditions" + "github.com/ditrit/badaas/testintegration/models" +) + +type WhereConditionsIntTestSuite struct { + CRUDServiceCommonIntTestSuite + crudProductService badorm.CRUDService[models.Product, badorm.UUID] + crudSaleService badorm.CRUDService[models.Sale, badorm.UUID] + crudBrandService badorm.CRUDService[models.Brand, uint] +} + +func NewWhereConditionsIntTestSuite( + db *gorm.DB, + crudProductService badorm.CRUDService[models.Product, badorm.UUID], + crudSaleService badorm.CRUDService[models.Sale, badorm.UUID], + crudBrandService badorm.CRUDService[models.Brand, uint], +) *WhereConditionsIntTestSuite { + return &WhereConditionsIntTestSuite{ + CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ + db: db, + }, + crudProductService: crudProductService, + crudSaleService: crudSaleService, + crudBrandService: crudBrandService, + } +} + +// ------------------------- GetEntity -------------------------------- + +func (ts *WhereConditionsIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { + _, err := ts.crudProductService.GetEntity(badorm.NilUUID) + ts.Error(err, gorm.ErrRecordNotFound) +} + +func (ts *WhereConditionsIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { + ts.createProduct("", 0, 0, false, nil) + + _, err := ts.crudProductService.GetEntity(badorm.NewUUID()) + ts.Error(err, gorm.ErrRecordNotFound) +} + +func (ts *WhereConditionsIntTestSuite) TestGetEntityReturnsTheEntityIfItIsCreate() { + match := ts.createProduct("", 0, 0, false, nil) + + entity, err := ts.crudProductService.GetEntity(match.ID) + ts.Nil(err) + + assert.DeepEqual(ts.T(), match, entity) +} + +// ------------------------- GetEntities -------------------------------- + +func (ts *WhereConditionsIntTestSuite) TestGetEntitiesReturnsEmptyIfNotEntitiesCreated() { + entities, err := ts.crudProductService.GetEntities() + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestGetEntitiesReturnsTheOnlyOneIfOneEntityCreated() { + match := ts.createProduct("", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities() + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestGetEntitiesReturnsTheListWhenMultipleCreated() { + match1 := ts.createProduct("", 0, 0, false, nil) + match2 := ts.createProduct("", 0, 0, false, nil) + match3 := ts.createProduct("", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities() + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionsReturnsEmptyIfNotEntitiesCreated() { + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + badorm.Eq("not_created"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionsReturnsEmptyIfNothingMatch() { + ts.createProduct("something_else", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + badorm.Eq("not_match"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionsReturnsOneIfOnlyOneMatch() { + match := ts.createProduct("match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + badorm.Eq("match"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionsReturnsMultipleIfMultipleMatch() { + match1 := ts.createProduct("match", 0, 0, false, nil) + match2 := ts.createProduct("match", 0, 0, false, nil) + ts.createProduct("not_match", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + badorm.Eq("match"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfIntType() { + match := ts.createProduct("match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.Eq(1), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfFloatType() { + match := ts.createProduct("match", 0, 1.1, false, nil) + ts.createProduct("not_match", 0, 2.2, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + badorm.Eq(1.1), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfBoolType() { + match := ts.createProduct("match", 0, 0.0, true, nil) + ts.createProduct("not_match", 0, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductBool( + badorm.Eq(true), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestMultipleConditionsOfDifferentTypesWorks() { + match1 := ts.createProduct("match", 1, 0.0, true, nil) + match2 := ts.createProduct("match", 1, 0.0, true, nil) + + ts.createProduct("not_match", 1, 0.0, true, nil) + ts.createProduct("match", 2, 0.0, true, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString(badorm.Eq("match")), + conditions.ProductInt(badorm.Eq(1)), + conditions.ProductBool(badorm.Eq(true)), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfID() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductId( + badorm.Eq(match.ID), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfCreatedAt() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductCreatedAt(badorm.Eq(match.CreatedAt)), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestDeletedAtConditionIsAddedAutomatically() { + match := ts.createProduct("", 0, 0.0, false, nil) + deleted := ts.createProduct("", 0, 0.0, false, nil) + + ts.Nil(ts.db.Delete(deleted).Error) + + entities, err := ts.crudProductService.GetEntities() + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +// TODO DeletedAt with nil value but not automatic + +func (ts *WhereConditionsIntTestSuite) TestConditionOfDeletedAtNotNil() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) + + ts.Nil(ts.db.Delete(match).Error) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductDeletedAt(badorm.Eq(match.DeletedAt)), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfEmbedded() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) + + match.EmbeddedInt = 1 + + err := ts.db.Save(match).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductEmbeddedInt(badorm.Eq(1)), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfGormEmbedded() { + match := ts.createProduct("", 0, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) + + match.GormEmbedded.Int = 1 + + err := ts.db.Save(match).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductGormEmbeddedInt(badorm.Eq(1)), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfPointerTypeWithValue() { + intMatch := 1 + match := ts.createProduct("match", 1, 0, false, &intMatch) + intNotMatch := 2 + ts.createProduct("not_match", 2, 0, false, &intNotMatch) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductIntPointer(badorm.Eq(1)), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfByteArrayWithContent() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + match.ByteArray = []byte{1, 2} + notMatch1.ByteArray = []byte{2, 3} + + err := ts.db.Save(match).Error + ts.Nil(err) + + err = ts.db.Save(notMatch1).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductByteArray(badorm.Eq([]byte{1, 2})), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfByteArrayEmpty() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + match.ByteArray = []byte{} + notMatch1.ByteArray = []byte{2, 3} + + err := ts.db.Save(match).Error + ts.Nil(err) + + err = ts.db.Save(notMatch1).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductByteArray(badorm.Eq([]byte{})), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfCustomType() { + match := ts.createProduct("match", 1, 0, false, nil) + notMatch1 := ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + match.MultiString = models.MultiString{"salut", "hola"} + notMatch1.MultiString = models.MultiString{"salut", "hola", "hello"} + + err := ts.db.Save(match).Error + ts.Nil(err) + + err = ts.db.Save(notMatch1).Error + ts.Nil(err) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductMultiString(badorm.Eq(models.MultiString{"salut", "hola"})), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfRelationType() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProductId(badorm.Eq(product1.ID)), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfRelationTypeOptionalWithValue() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSellerId(badorm.Eq(seller1.ID)), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionOfRelationTypeOptionalByNil() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSellerId(badorm.IsNull[badorm.UUID]()), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestConditionsOnUIntModel() { + match := ts.createBrand("match") + ts.createBrand("not_match") + + entities, err := ts.crudBrandService.GetEntities( + conditions.BrandName(badorm.Eq("match")), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Brand{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestMultipleConditionsAreConnectedByAnd() { + match := ts.createProduct("match", 3, 0, false, nil) + ts.createProduct("not_match", 5, 0, false, nil) + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt(badorm.GtOrEq(3)), + conditions.ProductInt(badorm.LtOrEq(4)), + conditions.ProductString(badorm.Eq("match")), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestNot() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 3, 0, false, nil) + + ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 2, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + badorm.Not(conditions.ProductInt(badorm.Eq(2))), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestNotWithMultipleConditionsAreConnectedByAnd() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 5, 0, false, nil) + + ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match", 3, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + badorm.Not( + conditions.ProductInt(badorm.Gt(1)), + conditions.ProductInt(badorm.Lt(4)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestOr() { + match1 := ts.createProduct("match", 2, 0, false, nil) + match2 := ts.createProduct("match", 3, 0, false, nil) + match3 := ts.createProduct("match_3", 3, 0, false, nil) + + ts.createProduct("not_match", 1, 0, false, nil) + ts.createProduct("not_match", 4, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + badorm.Or( + conditions.ProductInt(badorm.Eq(2)), + conditions.ProductInt(badorm.Eq(3)), + conditions.ProductString(badorm.Eq("match_3")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestNotOr() { + match1 := ts.createProduct("match", 1, 0, false, nil) + match2 := ts.createProduct("match", 5, 0, false, nil) + match3 := ts.createProduct("match", 4, 0, false, nil) + + ts.createProduct("not_match", 2, 0, false, nil) + ts.createProduct("not_match_string", 3, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + badorm.Not[models.Product]( + badorm.Or( + conditions.ProductInt(badorm.Eq(2)), + conditions.ProductString(badorm.Eq("not_match_string")), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestXor() { + match1 := ts.createProduct("", 1, 0, false, nil) + match2 := ts.createProduct("", 7, 0, false, nil) + + ts.createProduct("", 5, 0, false, nil) + ts.createProduct("", 4, 0, false, nil) + + var xorExpression badorm.WhereCondition[models.Product] + + switch getDBDialector() { + case configuration.PostgreSQL, configuration.SQLite: + log.Println("Xor not compatible") + case configuration.MySQL: + xorExpression = mysql.Xor( + conditions.ProductInt(badorm.Lt(6)), + conditions.ProductInt(badorm.Gt(3)), + ) + case configuration.SQLServer: + xorExpression = sqlserver.Xor( + conditions.ProductInt(badorm.Lt(6)), + conditions.ProductInt(badorm.Gt(3)), + ) + } + + if xorExpression != nil { + entities, err := ts.crudProductService.GetEntities(xorExpression) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + } +} + +func (ts *WhereConditionsIntTestSuite) TestMultipleConditionsDifferentExpressions() { + match1 := ts.createProduct("match", 1, 0.0, true, nil) + match2 := ts.createProduct("match", 1, 0.0, true, nil) + + ts.createProduct("not_match", 1, 0.0, true, nil) + ts.createProduct("match", 2, 0.0, true, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString(badorm.Eq("match")), + conditions.ProductInt(badorm.Lt(2)), + conditions.ProductBool(badorm.NotEq(false)), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index c3ff04f8..ccb58e62 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -13,6 +13,7 @@ const ( // badorm/condition.go badORMCondition = "Condition" badORMFieldCondition = "FieldCondition" + badORMWhereCondition = "WhereCondition" badORMJoinCondition = "JoinCondition" // badorm/expression.go badORMExpression = "Expression" @@ -151,21 +152,29 @@ func (condition *Condition) generateForBadormModel(objectType Type, field Field) // Generate a WhereCondition between object and field func (condition *Condition) generateWhere(objectType Type, field Field) { + objectTypeQual := jen.Qual( + getRelativePackagePath(condition.destPkg, objectType), + objectType.Name(), + ) + fieldCondition := jen.Qual( badORMPath, badORMFieldCondition, ).Types( - jen.Qual( - getRelativePackagePath(condition.destPkg, objectType), - objectType.Name(), - ), + objectTypeQual, condition.param.GenericType(), ) + whereCondition := jen.Qual( + badORMPath, badORMWhereCondition, + ).Types( + objectTypeQual, + ) + conditionName := getConditionName(objectType, field) log.Logger.Debugf("Generated %q", conditionName) conditionValues := jen.Dict{ - jen.Id("Expressions"): jen.Id("exprs"), + jen.Id("Expression"): jen.Id("expr"), } columnName := field.getColumnName() @@ -187,7 +196,7 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { ).Params( condition.param.Statement(), ).Add( - fieldCondition.Clone(), + whereCondition, ).Block( jen.Return( fieldCondition.Clone().Values(conditionValues), diff --git a/tools/badctl/cmd/gen/conditions/jenParam.go b/tools/badctl/cmd/gen/conditions/jenParam.go index f2a316c1..174a6898 100644 --- a/tools/badctl/cmd/gen/conditions/jenParam.go +++ b/tools/badctl/cmd/gen/conditions/jenParam.go @@ -16,7 +16,7 @@ type JenParam struct { func NewJenParam() *JenParam { return &JenParam{ - statement: jen.Id("exprs").Op("...").Qual( + statement: jen.Id("expr").Qual( badORMPath, badORMExpression, ), internalType: &jen.Statement{}, diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go index 0a3bf28c..8e7ccdfc 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go @@ -8,135 +8,135 @@ import ( "time" ) -func BasicPointersId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[basicpointers.BasicPointers, badorm.UUID] { +func BasicPointersId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func BasicPointersCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicpointers.BasicPointers, time.Time] { +func BasicPointersCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func BasicPointersUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicpointers.BasicPointers, time.Time] { +func BasicPointersUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func BasicPointersDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[basicpointers.BasicPointers, gorm.DeletedAt] { +func BasicPointersDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func BasicPointersBool(exprs ...badorm.Expression[*bool]) badorm.FieldCondition[basicpointers.BasicPointers, *bool] { - return badorm.FieldCondition[basicpointers.BasicPointers, *bool]{ - Expressions: exprs, - Field: "Bool", +func BasicPointersBool(expr badorm.Expression[bool]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, bool]{ + Expression: expr, + Field: "Bool", } } -func BasicPointersInt(exprs ...badorm.Expression[*int]) badorm.FieldCondition[basicpointers.BasicPointers, *int] { - return badorm.FieldCondition[basicpointers.BasicPointers, *int]{ - Expressions: exprs, - Field: "Int", +func BasicPointersInt(expr badorm.Expression[int]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, int]{ + Expression: expr, + Field: "Int", } } -func BasicPointersInt8(exprs ...badorm.Expression[*int8]) badorm.FieldCondition[basicpointers.BasicPointers, *int8] { - return badorm.FieldCondition[basicpointers.BasicPointers, *int8]{ - Expressions: exprs, - Field: "Int8", +func BasicPointersInt8(expr badorm.Expression[int8]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, int8]{ + Expression: expr, + Field: "Int8", } } -func BasicPointersInt16(exprs ...badorm.Expression[*int16]) badorm.FieldCondition[basicpointers.BasicPointers, *int16] { - return badorm.FieldCondition[basicpointers.BasicPointers, *int16]{ - Expressions: exprs, - Field: "Int16", +func BasicPointersInt16(expr badorm.Expression[int16]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, int16]{ + Expression: expr, + Field: "Int16", } } -func BasicPointersInt32(exprs ...badorm.Expression[*int32]) badorm.FieldCondition[basicpointers.BasicPointers, *int32] { - return badorm.FieldCondition[basicpointers.BasicPointers, *int32]{ - Expressions: exprs, - Field: "Int32", +func BasicPointersInt32(expr badorm.Expression[int32]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, int32]{ + Expression: expr, + Field: "Int32", } } -func BasicPointersInt64(exprs ...badorm.Expression[*int64]) badorm.FieldCondition[basicpointers.BasicPointers, *int64] { - return badorm.FieldCondition[basicpointers.BasicPointers, *int64]{ - Expressions: exprs, - Field: "Int64", +func BasicPointersInt64(expr badorm.Expression[int64]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, int64]{ + Expression: expr, + Field: "Int64", } } -func BasicPointersUInt(exprs ...badorm.Expression[*uint]) badorm.FieldCondition[basicpointers.BasicPointers, *uint] { - return badorm.FieldCondition[basicpointers.BasicPointers, *uint]{ - Expressions: exprs, - Field: "UInt", +func BasicPointersUInt(expr badorm.Expression[uint]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, uint]{ + Expression: expr, + Field: "UInt", } } -func BasicPointersUInt8(exprs ...badorm.Expression[*uint8]) badorm.FieldCondition[basicpointers.BasicPointers, *uint8] { - return badorm.FieldCondition[basicpointers.BasicPointers, *uint8]{ - Expressions: exprs, - Field: "UInt8", +func BasicPointersUInt8(expr badorm.Expression[uint8]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, uint8]{ + Expression: expr, + Field: "UInt8", } } -func BasicPointersUInt16(exprs ...badorm.Expression[*uint16]) badorm.FieldCondition[basicpointers.BasicPointers, *uint16] { - return badorm.FieldCondition[basicpointers.BasicPointers, *uint16]{ - Expressions: exprs, - Field: "UInt16", +func BasicPointersUInt16(expr badorm.Expression[uint16]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, uint16]{ + Expression: expr, + Field: "UInt16", } } -func BasicPointersUInt32(exprs ...badorm.Expression[*uint32]) badorm.FieldCondition[basicpointers.BasicPointers, *uint32] { - return badorm.FieldCondition[basicpointers.BasicPointers, *uint32]{ - Expressions: exprs, - Field: "UInt32", +func BasicPointersUInt32(expr badorm.Expression[uint32]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, uint32]{ + Expression: expr, + Field: "UInt32", } } -func BasicPointersUInt64(exprs ...badorm.Expression[*uint64]) badorm.FieldCondition[basicpointers.BasicPointers, *uint64] { - return badorm.FieldCondition[basicpointers.BasicPointers, *uint64]{ - Expressions: exprs, - Field: "UInt64", +func BasicPointersUInt64(expr badorm.Expression[uint64]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, uint64]{ + Expression: expr, + Field: "UInt64", } } -func BasicPointersUIntptr(exprs ...badorm.Expression[*uintptr]) badorm.FieldCondition[basicpointers.BasicPointers, *uintptr] { - return badorm.FieldCondition[basicpointers.BasicPointers, *uintptr]{ - Expressions: exprs, - Field: "UIntptr", +func BasicPointersUIntptr(expr badorm.Expression[uintptr]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, uintptr]{ + Expression: expr, + Field: "UIntptr", } } -func BasicPointersFloat32(exprs ...badorm.Expression[*float32]) badorm.FieldCondition[basicpointers.BasicPointers, *float32] { - return badorm.FieldCondition[basicpointers.BasicPointers, *float32]{ - Expressions: exprs, - Field: "Float32", +func BasicPointersFloat32(expr badorm.Expression[float32]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, float32]{ + Expression: expr, + Field: "Float32", } } -func BasicPointersFloat64(exprs ...badorm.Expression[*float64]) badorm.FieldCondition[basicpointers.BasicPointers, *float64] { - return badorm.FieldCondition[basicpointers.BasicPointers, *float64]{ - Expressions: exprs, - Field: "Float64", +func BasicPointersFloat64(expr badorm.Expression[float64]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, float64]{ + Expression: expr, + Field: "Float64", } } -func BasicPointersComplex64(exprs ...badorm.Expression[*complex64]) badorm.FieldCondition[basicpointers.BasicPointers, *complex64] { - return badorm.FieldCondition[basicpointers.BasicPointers, *complex64]{ - Expressions: exprs, - Field: "Complex64", +func BasicPointersComplex64(expr badorm.Expression[complex64]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, complex64]{ + Expression: expr, + Field: "Complex64", } } -func BasicPointersComplex128(exprs ...badorm.Expression[*complex128]) badorm.FieldCondition[basicpointers.BasicPointers, *complex128] { - return badorm.FieldCondition[basicpointers.BasicPointers, *complex128]{ - Expressions: exprs, - Field: "Complex128", +func BasicPointersComplex128(expr badorm.Expression[complex128]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, complex128]{ + Expression: expr, + Field: "Complex128", } } -func BasicPointersString(exprs ...badorm.Expression[*string]) badorm.FieldCondition[basicpointers.BasicPointers, *string] { - return badorm.FieldCondition[basicpointers.BasicPointers, *string]{ - Expressions: exprs, - Field: "String", +func BasicPointersString(expr badorm.Expression[string]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, string]{ + Expression: expr, + Field: "String", } } -func BasicPointersByte(exprs ...badorm.Expression[*uint8]) badorm.FieldCondition[basicpointers.BasicPointers, *uint8] { - return badorm.FieldCondition[basicpointers.BasicPointers, *uint8]{ - Expressions: exprs, - Field: "Byte", +func BasicPointersByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basicpointers.BasicPointers] { + return badorm.FieldCondition[basicpointers.BasicPointers, uint8]{ + Expression: expr, + Field: "Byte", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go index 53048ccd..af0c125e 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go @@ -8,135 +8,135 @@ import ( "time" ) -func BasicSlicesId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[basicslices.BasicSlices, badorm.UUID] { +func BasicSlicesId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func BasicSlicesCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicslices.BasicSlices, time.Time] { +func BasicSlicesCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func BasicSlicesUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicslices.BasicSlices, time.Time] { +func BasicSlicesUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func BasicSlicesDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[basicslices.BasicSlices, gorm.DeletedAt] { +func BasicSlicesDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func BasicSlicesBool(exprs ...badorm.Expression[[]bool]) badorm.FieldCondition[basicslices.BasicSlices, []bool] { +func BasicSlicesBool(expr badorm.Expression[[]bool]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []bool]{ - Expressions: exprs, - Field: "Bool", + Expression: expr, + Field: "Bool", } } -func BasicSlicesInt(exprs ...badorm.Expression[[]int]) badorm.FieldCondition[basicslices.BasicSlices, []int] { +func BasicSlicesInt(expr badorm.Expression[[]int]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int]{ - Expressions: exprs, - Field: "Int", + Expression: expr, + Field: "Int", } } -func BasicSlicesInt8(exprs ...badorm.Expression[[]int8]) badorm.FieldCondition[basicslices.BasicSlices, []int8] { +func BasicSlicesInt8(expr badorm.Expression[[]int8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int8]{ - Expressions: exprs, - Field: "Int8", + Expression: expr, + Field: "Int8", } } -func BasicSlicesInt16(exprs ...badorm.Expression[[]int16]) badorm.FieldCondition[basicslices.BasicSlices, []int16] { +func BasicSlicesInt16(expr badorm.Expression[[]int16]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int16]{ - Expressions: exprs, - Field: "Int16", + Expression: expr, + Field: "Int16", } } -func BasicSlicesInt32(exprs ...badorm.Expression[[]int32]) badorm.FieldCondition[basicslices.BasicSlices, []int32] { +func BasicSlicesInt32(expr badorm.Expression[[]int32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int32]{ - Expressions: exprs, - Field: "Int32", + Expression: expr, + Field: "Int32", } } -func BasicSlicesInt64(exprs ...badorm.Expression[[]int64]) badorm.FieldCondition[basicslices.BasicSlices, []int64] { +func BasicSlicesInt64(expr badorm.Expression[[]int64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int64]{ - Expressions: exprs, - Field: "Int64", + Expression: expr, + Field: "Int64", } } -func BasicSlicesUInt(exprs ...badorm.Expression[[]uint]) badorm.FieldCondition[basicslices.BasicSlices, []uint] { +func BasicSlicesUInt(expr badorm.Expression[[]uint]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint]{ - Expressions: exprs, - Field: "UInt", + Expression: expr, + Field: "UInt", } } -func BasicSlicesUInt8(exprs ...badorm.Expression[[]uint8]) badorm.FieldCondition[basicslices.BasicSlices, []uint8] { +func BasicSlicesUInt8(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint8]{ - Expressions: exprs, - Field: "UInt8", + Expression: expr, + Field: "UInt8", } } -func BasicSlicesUInt16(exprs ...badorm.Expression[[]uint16]) badorm.FieldCondition[basicslices.BasicSlices, []uint16] { +func BasicSlicesUInt16(expr badorm.Expression[[]uint16]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint16]{ - Expressions: exprs, - Field: "UInt16", + Expression: expr, + Field: "UInt16", } } -func BasicSlicesUInt32(exprs ...badorm.Expression[[]uint32]) badorm.FieldCondition[basicslices.BasicSlices, []uint32] { +func BasicSlicesUInt32(expr badorm.Expression[[]uint32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint32]{ - Expressions: exprs, - Field: "UInt32", + Expression: expr, + Field: "UInt32", } } -func BasicSlicesUInt64(exprs ...badorm.Expression[[]uint64]) badorm.FieldCondition[basicslices.BasicSlices, []uint64] { +func BasicSlicesUInt64(expr badorm.Expression[[]uint64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint64]{ - Expressions: exprs, - Field: "UInt64", + Expression: expr, + Field: "UInt64", } } -func BasicSlicesUIntptr(exprs ...badorm.Expression[[]uintptr]) badorm.FieldCondition[basicslices.BasicSlices, []uintptr] { +func BasicSlicesUIntptr(expr badorm.Expression[[]uintptr]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uintptr]{ - Expressions: exprs, - Field: "UIntptr", + Expression: expr, + Field: "UIntptr", } } -func BasicSlicesFloat32(exprs ...badorm.Expression[[]float32]) badorm.FieldCondition[basicslices.BasicSlices, []float32] { +func BasicSlicesFloat32(expr badorm.Expression[[]float32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []float32]{ - Expressions: exprs, - Field: "Float32", + Expression: expr, + Field: "Float32", } } -func BasicSlicesFloat64(exprs ...badorm.Expression[[]float64]) badorm.FieldCondition[basicslices.BasicSlices, []float64] { +func BasicSlicesFloat64(expr badorm.Expression[[]float64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []float64]{ - Expressions: exprs, - Field: "Float64", + Expression: expr, + Field: "Float64", } } -func BasicSlicesComplex64(exprs ...badorm.Expression[[]complex64]) badorm.FieldCondition[basicslices.BasicSlices, []complex64] { +func BasicSlicesComplex64(expr badorm.Expression[[]complex64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []complex64]{ - Expressions: exprs, - Field: "Complex64", + Expression: expr, + Field: "Complex64", } } -func BasicSlicesComplex128(exprs ...badorm.Expression[[]complex128]) badorm.FieldCondition[basicslices.BasicSlices, []complex128] { +func BasicSlicesComplex128(expr badorm.Expression[[]complex128]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []complex128]{ - Expressions: exprs, - Field: "Complex128", + Expression: expr, + Field: "Complex128", } } -func BasicSlicesString(exprs ...badorm.Expression[[]string]) badorm.FieldCondition[basicslices.BasicSlices, []string] { +func BasicSlicesString(expr badorm.Expression[[]string]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []string]{ - Expressions: exprs, - Field: "String", + Expression: expr, + Field: "String", } } -func BasicSlicesByte(exprs ...badorm.Expression[[]uint8]) badorm.FieldCondition[basicslices.BasicSlices, []uint8] { +func BasicSlicesByte(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint8]{ - Expressions: exprs, - Field: "Byte", + Expression: expr, + Field: "Byte", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go index 886657e4..6ad3c6e3 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go @@ -8,135 +8,135 @@ import ( "time" ) -func BasicSlicesPointerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, badorm.UUID] { +func BasicSlicesPointerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func BasicSlicesPointerCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time] { +func BasicSlicesPointerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func BasicSlicesPointerUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time] { +func BasicSlicesPointerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func BasicSlicesPointerDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, gorm.DeletedAt] { +func BasicSlicesPointerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func BasicSlicesPointerBool(exprs ...badorm.Expression[[]*bool]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*bool] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*bool]{ - Expressions: exprs, - Field: "Bool", +func BasicSlicesPointerBool(expr badorm.Expression[[]bool]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []bool]{ + Expression: expr, + Field: "Bool", } } -func BasicSlicesPointerInt(exprs ...badorm.Expression[[]*int]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int]{ - Expressions: exprs, - Field: "Int", +func BasicSlicesPointerInt(expr badorm.Expression[[]int]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int]{ + Expression: expr, + Field: "Int", } } -func BasicSlicesPointerInt8(exprs ...badorm.Expression[[]*int8]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int8] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int8]{ - Expressions: exprs, - Field: "Int8", +func BasicSlicesPointerInt8(expr badorm.Expression[[]int8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int8]{ + Expression: expr, + Field: "Int8", } } -func BasicSlicesPointerInt16(exprs ...badorm.Expression[[]*int16]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int16] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int16]{ - Expressions: exprs, - Field: "Int16", +func BasicSlicesPointerInt16(expr badorm.Expression[[]int16]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int16]{ + Expression: expr, + Field: "Int16", } } -func BasicSlicesPointerInt32(exprs ...badorm.Expression[[]*int32]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int32] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int32]{ - Expressions: exprs, - Field: "Int32", +func BasicSlicesPointerInt32(expr badorm.Expression[[]int32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int32]{ + Expression: expr, + Field: "Int32", } } -func BasicSlicesPointerInt64(exprs ...badorm.Expression[[]*int64]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int64] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*int64]{ - Expressions: exprs, - Field: "Int64", +func BasicSlicesPointerInt64(expr badorm.Expression[[]int64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int64]{ + Expression: expr, + Field: "Int64", } } -func BasicSlicesPointerUInt(exprs ...badorm.Expression[[]*uint]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint]{ - Expressions: exprs, - Field: "UInt", +func BasicSlicesPointerUInt(expr badorm.Expression[[]uint]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint]{ + Expression: expr, + Field: "UInt", } } -func BasicSlicesPointerUInt8(exprs ...badorm.Expression[[]*uint8]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint8] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint8]{ - Expressions: exprs, - Field: "UInt8", +func BasicSlicesPointerUInt8(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint8]{ + Expression: expr, + Field: "UInt8", } } -func BasicSlicesPointerUInt16(exprs ...badorm.Expression[[]*uint16]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint16] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint16]{ - Expressions: exprs, - Field: "UInt16", +func BasicSlicesPointerUInt16(expr badorm.Expression[[]uint16]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint16]{ + Expression: expr, + Field: "UInt16", } } -func BasicSlicesPointerUInt32(exprs ...badorm.Expression[[]*uint32]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint32] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint32]{ - Expressions: exprs, - Field: "UInt32", +func BasicSlicesPointerUInt32(expr badorm.Expression[[]uint32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint32]{ + Expression: expr, + Field: "UInt32", } } -func BasicSlicesPointerUInt64(exprs ...badorm.Expression[[]*uint64]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint64] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint64]{ - Expressions: exprs, - Field: "UInt64", +func BasicSlicesPointerUInt64(expr badorm.Expression[[]uint64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint64]{ + Expression: expr, + Field: "UInt64", } } -func BasicSlicesPointerUIntptr(exprs ...badorm.Expression[[]*uintptr]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uintptr] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uintptr]{ - Expressions: exprs, - Field: "UIntptr", +func BasicSlicesPointerUIntptr(expr badorm.Expression[[]uintptr]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uintptr]{ + Expression: expr, + Field: "UIntptr", } } -func BasicSlicesPointerFloat32(exprs ...badorm.Expression[[]*float32]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*float32] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*float32]{ - Expressions: exprs, - Field: "Float32", +func BasicSlicesPointerFloat32(expr badorm.Expression[[]float32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []float32]{ + Expression: expr, + Field: "Float32", } } -func BasicSlicesPointerFloat64(exprs ...badorm.Expression[[]*float64]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*float64] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*float64]{ - Expressions: exprs, - Field: "Float64", +func BasicSlicesPointerFloat64(expr badorm.Expression[[]float64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []float64]{ + Expression: expr, + Field: "Float64", } } -func BasicSlicesPointerComplex64(exprs ...badorm.Expression[[]*complex64]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*complex64] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*complex64]{ - Expressions: exprs, - Field: "Complex64", +func BasicSlicesPointerComplex64(expr badorm.Expression[[]complex64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []complex64]{ + Expression: expr, + Field: "Complex64", } } -func BasicSlicesPointerComplex128(exprs ...badorm.Expression[[]*complex128]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*complex128] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*complex128]{ - Expressions: exprs, - Field: "Complex128", +func BasicSlicesPointerComplex128(expr badorm.Expression[[]complex128]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []complex128]{ + Expression: expr, + Field: "Complex128", } } -func BasicSlicesPointerString(exprs ...badorm.Expression[[]*string]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*string] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*string]{ - Expressions: exprs, - Field: "String", +func BasicSlicesPointerString(expr badorm.Expression[[]string]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []string]{ + Expression: expr, + Field: "String", } } -func BasicSlicesPointerByte(exprs ...badorm.Expression[[]*uint8]) badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint8] { - return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []*uint8]{ - Expressions: exprs, - Field: "Byte", +func BasicSlicesPointerByte(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint8]{ + Expression: expr, + Field: "Byte", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go index aec65500..fce3f461 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go @@ -8,135 +8,135 @@ import ( "time" ) -func BasicTypesId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[basictypes.BasicTypes, badorm.UUID] { +func BasicTypesId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func BasicTypesCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basictypes.BasicTypes, time.Time] { +func BasicTypesCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func BasicTypesUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[basictypes.BasicTypes, time.Time] { +func BasicTypesUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func BasicTypesDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[basictypes.BasicTypes, gorm.DeletedAt] { +func BasicTypesDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func BasicTypesBool(exprs ...badorm.Expression[bool]) badorm.FieldCondition[basictypes.BasicTypes, bool] { +func BasicTypesBool(expr badorm.Expression[bool]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, bool]{ - Expressions: exprs, - Field: "Bool", + Expression: expr, + Field: "Bool", } } -func BasicTypesInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[basictypes.BasicTypes, int] { +func BasicTypesInt(expr badorm.Expression[int]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int]{ - Expressions: exprs, - Field: "Int", + Expression: expr, + Field: "Int", } } -func BasicTypesInt8(exprs ...badorm.Expression[int8]) badorm.FieldCondition[basictypes.BasicTypes, int8] { +func BasicTypesInt8(expr badorm.Expression[int8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int8]{ - Expressions: exprs, - Field: "Int8", + Expression: expr, + Field: "Int8", } } -func BasicTypesInt16(exprs ...badorm.Expression[int16]) badorm.FieldCondition[basictypes.BasicTypes, int16] { +func BasicTypesInt16(expr badorm.Expression[int16]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int16]{ - Expressions: exprs, - Field: "Int16", + Expression: expr, + Field: "Int16", } } -func BasicTypesInt32(exprs ...badorm.Expression[int32]) badorm.FieldCondition[basictypes.BasicTypes, int32] { +func BasicTypesInt32(expr badorm.Expression[int32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int32]{ - Expressions: exprs, - Field: "Int32", + Expression: expr, + Field: "Int32", } } -func BasicTypesInt64(exprs ...badorm.Expression[int64]) badorm.FieldCondition[basictypes.BasicTypes, int64] { +func BasicTypesInt64(expr badorm.Expression[int64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int64]{ - Expressions: exprs, - Field: "Int64", + Expression: expr, + Field: "Int64", } } -func BasicTypesUInt(exprs ...badorm.Expression[uint]) badorm.FieldCondition[basictypes.BasicTypes, uint] { +func BasicTypesUInt(expr badorm.Expression[uint]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint]{ - Expressions: exprs, - Field: "UInt", + Expression: expr, + Field: "UInt", } } -func BasicTypesUInt8(exprs ...badorm.Expression[uint8]) badorm.FieldCondition[basictypes.BasicTypes, uint8] { +func BasicTypesUInt8(expr badorm.Expression[uint8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint8]{ - Expressions: exprs, - Field: "UInt8", + Expression: expr, + Field: "UInt8", } } -func BasicTypesUInt16(exprs ...badorm.Expression[uint16]) badorm.FieldCondition[basictypes.BasicTypes, uint16] { +func BasicTypesUInt16(expr badorm.Expression[uint16]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint16]{ - Expressions: exprs, - Field: "UInt16", + Expression: expr, + Field: "UInt16", } } -func BasicTypesUInt32(exprs ...badorm.Expression[uint32]) badorm.FieldCondition[basictypes.BasicTypes, uint32] { +func BasicTypesUInt32(expr badorm.Expression[uint32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint32]{ - Expressions: exprs, - Field: "UInt32", + Expression: expr, + Field: "UInt32", } } -func BasicTypesUInt64(exprs ...badorm.Expression[uint64]) badorm.FieldCondition[basictypes.BasicTypes, uint64] { +func BasicTypesUInt64(expr badorm.Expression[uint64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint64]{ - Expressions: exprs, - Field: "UInt64", + Expression: expr, + Field: "UInt64", } } -func BasicTypesUIntptr(exprs ...badorm.Expression[uintptr]) badorm.FieldCondition[basictypes.BasicTypes, uintptr] { +func BasicTypesUIntptr(expr badorm.Expression[uintptr]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uintptr]{ - Expressions: exprs, - Field: "UIntptr", + Expression: expr, + Field: "UIntptr", } } -func BasicTypesFloat32(exprs ...badorm.Expression[float32]) badorm.FieldCondition[basictypes.BasicTypes, float32] { +func BasicTypesFloat32(expr badorm.Expression[float32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, float32]{ - Expressions: exprs, - Field: "Float32", + Expression: expr, + Field: "Float32", } } -func BasicTypesFloat64(exprs ...badorm.Expression[float64]) badorm.FieldCondition[basictypes.BasicTypes, float64] { +func BasicTypesFloat64(expr badorm.Expression[float64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, float64]{ - Expressions: exprs, - Field: "Float64", + Expression: expr, + Field: "Float64", } } -func BasicTypesComplex64(exprs ...badorm.Expression[complex64]) badorm.FieldCondition[basictypes.BasicTypes, complex64] { +func BasicTypesComplex64(expr badorm.Expression[complex64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, complex64]{ - Expressions: exprs, - Field: "Complex64", + Expression: expr, + Field: "Complex64", } } -func BasicTypesComplex128(exprs ...badorm.Expression[complex128]) badorm.FieldCondition[basictypes.BasicTypes, complex128] { +func BasicTypesComplex128(expr badorm.Expression[complex128]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, complex128]{ - Expressions: exprs, - Field: "Complex128", + Expression: expr, + Field: "Complex128", } } -func BasicTypesString(exprs ...badorm.Expression[string]) badorm.FieldCondition[basictypes.BasicTypes, string] { +func BasicTypesString(expr badorm.Expression[string]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, string]{ - Expressions: exprs, - Field: "String", + Expression: expr, + Field: "String", } } -func BasicTypesByte(exprs ...badorm.Expression[uint8]) badorm.FieldCondition[basictypes.BasicTypes, uint8] { +func BasicTypesByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint8]{ - Expressions: exprs, - Field: "Byte", + Expression: expr, + Field: "Byte", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go index d18bf3a5..ca967751 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go @@ -8,28 +8,28 @@ import ( "time" ) -func OwnedId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[belongsto.Owned, badorm.UUID] { +func OwnedId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func OwnedCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[belongsto.Owned, time.Time] { +func OwnedCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func OwnedUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[belongsto.Owned, time.Time] { +func OwnedUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func OwnedDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[belongsto.Owned, gorm.DeletedAt] { +func OwnedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Condition[belongsto.Owned] { @@ -39,9 +39,9 @@ func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Conditio T2Field: "ID", } } -func OwnedOwnerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[belongsto.Owned, badorm.UUID] { +func OwnedOwnerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, badorm.UUID]{ - Expressions: exprs, - Field: "OwnerID", + Expression: expr, + Field: "OwnerID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go index 3ee7aaae..6133202b 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go @@ -8,27 +8,27 @@ import ( "time" ) -func OwnerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[belongsto.Owner, badorm.UUID] { +func OwnerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func OwnerCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[belongsto.Owner, time.Time] { +func OwnerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func OwnerUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[belongsto.Owner, time.Time] { +func OwnerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func OwnerDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[belongsto.Owner, gorm.DeletedAt] { +func OwnerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go index 50ac9c06..ab8099e3 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go @@ -8,33 +8,33 @@ import ( "time" ) -func ColumnDefinitionId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[columndefinition.ColumnDefinition, badorm.UUID] { +func ColumnDefinitionId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func ColumnDefinitionCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time] { +func ColumnDefinitionCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func ColumnDefinitionUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time] { +func ColumnDefinitionUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func ColumnDefinitionDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[columndefinition.ColumnDefinition, gorm.DeletedAt] { +func ColumnDefinitionDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func ColumnDefinitionString(exprs ...badorm.Expression[string]) badorm.FieldCondition[columndefinition.ColumnDefinition, string] { +func ColumnDefinitionString(expr badorm.Expression[string]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, string]{ - Column: "string_something_else", - Expressions: exprs, + Column: "string_something_else", + Expression: expr, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go index 5edb2331..3971182a 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go @@ -8,33 +8,33 @@ import ( "time" ) -func CustomTypeId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[customtype.CustomType, badorm.UUID] { +func CustomTypeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func CustomTypeCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[customtype.CustomType, time.Time] { +func CustomTypeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func CustomTypeUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[customtype.CustomType, time.Time] { +func CustomTypeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func CustomTypeDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[customtype.CustomType, gorm.DeletedAt] { +func CustomTypeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func CustomTypeCustom(exprs ...badorm.Expression[customtype.MultiString]) badorm.FieldCondition[customtype.CustomType, customtype.MultiString] { +func CustomTypeCustom(expr badorm.Expression[customtype.MultiString]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, customtype.MultiString]{ - Expressions: exprs, - Field: "Custom", + Expression: expr, + Field: "Custom", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go index a768ebb6..4cbe4808 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go @@ -8,33 +8,33 @@ import ( "time" ) -func GoEmbeddedId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[goembedded.GoEmbedded, uint] { +func GoEmbeddedId(expr badorm.Expression[uint]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, uint]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func GoEmbeddedCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[goembedded.GoEmbedded, time.Time] { +func GoEmbeddedCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func GoEmbeddedUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[goembedded.GoEmbedded, time.Time] { +func GoEmbeddedUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func GoEmbeddedDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[goembedded.GoEmbedded, gorm.DeletedAt] { +func GoEmbeddedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func GoEmbeddedEmbeddedInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[goembedded.GoEmbedded, int] { +func GoEmbeddedEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, int]{ - Expressions: exprs, - Field: "EmbeddedInt", + Expression: expr, + Field: "EmbeddedInt", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go index 1eab3cf1..a9b9db37 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go @@ -8,34 +8,34 @@ import ( "time" ) -func GormEmbeddedId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[gormembedded.GormEmbedded, uint] { +func GormEmbeddedId(expr badorm.Expression[uint]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, uint]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func GormEmbeddedCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[gormembedded.GormEmbedded, time.Time] { +func GormEmbeddedCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func GormEmbeddedUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[gormembedded.GormEmbedded, time.Time] { +func GormEmbeddedUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func GormEmbeddedDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[gormembedded.GormEmbedded, gorm.DeletedAt] { +func GormEmbeddedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func GormEmbeddedGormEmbeddedInt(exprs ...badorm.Expression[int]) badorm.FieldCondition[gormembedded.GormEmbedded, int] { +func GormEmbeddedGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, int]{ ColumnPrefix: "gorm_embedded_", - Expressions: exprs, + Expression: expr, Field: "Int", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go index db6498ba..8b6c02e3 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go @@ -8,28 +8,28 @@ import ( "time" ) -func CompanyId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[hasmany.Company, badorm.UUID] { +func CompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func CompanyCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasmany.Company, time.Time] { +func CompanyCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func CompanyUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasmany.Company, time.Time] { +func CompanyUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func CompanyDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[hasmany.Company, gorm.DeletedAt] { +func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.Condition[hasmany.Seller] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go index 2b53ab0d..63d3b5fe 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go @@ -8,33 +8,33 @@ import ( "time" ) -func SellerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[hasmany.Seller, badorm.UUID] { +func SellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func SellerCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasmany.Seller, time.Time] { +func SellerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func SellerUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasmany.Seller, time.Time] { +func SellerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func SellerDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[hasmany.Seller, gorm.DeletedAt] { +func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func SellerCompanyId(exprs ...badorm.Expression[*badorm.UUID]) badorm.FieldCondition[hasmany.Seller, *badorm.UUID] { - return badorm.FieldCondition[hasmany.Seller, *badorm.UUID]{ - Expressions: exprs, - Field: "CompanyID", +func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Seller] { + return badorm.FieldCondition[hasmany.Seller, badorm.UUID]{ + Expression: expr, + Field: "CompanyID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go index f1b66eb9..dcc4d42e 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go @@ -8,33 +8,33 @@ import ( "time" ) -func CityId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[hasone.City, badorm.UUID] { +func CityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func CityCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasone.City, time.Time] { +func CityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func CityUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasone.City, time.Time] { +func CityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func CityDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[hasone.City, gorm.DeletedAt] { +func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func CityCountryId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[hasone.City, badorm.UUID] { +func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, badorm.UUID]{ - Expressions: exprs, - Field: "CountryID", + Expression: expr, + Field: "CountryID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go index f5789a79..4952eadc 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go @@ -8,28 +8,28 @@ import ( "time" ) -func CountryId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[hasone.Country, badorm.UUID] { +func CountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func CountryCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasone.Country, time.Time] { +func CountryCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func CountryUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[hasone.Country, time.Time] { +func CountryUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func CountryDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[hasone.Country, gorm.DeletedAt] { +func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } func CountryCapital(conditions ...badorm.Condition[hasone.City]) badorm.Condition[hasone.Country] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go index 547298c5..a6a48747 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go @@ -9,28 +9,28 @@ import ( "time" ) -func Package1Id(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[package1.Package1, badorm.UUID] { +func Package1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func Package1CreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[package1.Package1, time.Time] { +func Package1CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func Package1UpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[package1.Package1, time.Time] { +func Package1UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func Package1DeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[package1.Package1, gorm.DeletedAt] { +func Package1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } func Package1Package2(conditions ...badorm.Condition[package2.Package2]) badorm.Condition[package1.Package1] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go index c9758ebf..9292e407 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go @@ -8,28 +8,28 @@ import ( "time" ) -func BicycleId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[overrideforeignkey.Bicycle, badorm.UUID] { +func BicycleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func BicycleCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time] { +func BicycleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func BicycleUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time] { +func BicycleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func BicycleDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[overrideforeignkey.Bicycle, gorm.DeletedAt] { +func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) badorm.Condition[overrideforeignkey.Bicycle] { @@ -39,9 +39,9 @@ func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) bad T2Field: "ID", } } -func BicycleOwnerSomethingId(exprs ...badorm.Expression[string]) badorm.FieldCondition[overrideforeignkey.Bicycle, string] { +func BicycleOwnerSomethingId(expr badorm.Expression[string]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, string]{ - Expressions: exprs, - Field: "OwnerSomethingID", + Expression: expr, + Field: "OwnerSomethingID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go index 74e7e60d..0d1edabd 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go @@ -8,28 +8,28 @@ import ( "time" ) -func UserId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[overrideforeignkeyinverse.User, badorm.UUID] { +func UserId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func UserCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time] { +func UserCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func UserUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time] { +func UserUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func UserDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[overrideforeignkeyinverse.User, gorm.DeletedAt] { +func UserDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } func UserCreditCard(conditions ...badorm.Condition[overrideforeignkeyinverse.CreditCard]) badorm.Condition[overrideforeignkeyinverse.User] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go index 2d4e877d..c189dfde 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go @@ -8,28 +8,28 @@ import ( "time" ) -func PhoneId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[overridereferences.Phone, badorm.UUID] { +func PhoneId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func PhoneCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overridereferences.Phone, time.Time] { +func PhoneCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func PhoneUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overridereferences.Phone, time.Time] { +func PhoneUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func PhoneDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[overridereferences.Phone, gorm.DeletedAt] { +func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm.Condition[overridereferences.Phone] { @@ -39,9 +39,9 @@ func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm T2Field: "Name", } } -func PhoneBrandName(exprs ...badorm.Expression[string]) badorm.FieldCondition[overridereferences.Phone, string] { +func PhoneBrandName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, string]{ - Expressions: exprs, - Field: "BrandName", + Expression: expr, + Field: "BrandName", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go index 87a89b15..23d7777d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go @@ -8,34 +8,34 @@ import ( "time" ) -func ComputerId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[overridereferencesinverse.Computer, badorm.UUID] { +func ComputerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func ComputerCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overridereferencesinverse.Computer, time.Time] { +func ComputerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func ComputerUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[overridereferencesinverse.Computer, time.Time] { +func ComputerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func ComputerDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[overridereferencesinverse.Computer, gorm.DeletedAt] { +func ComputerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } -func ComputerName(exprs ...badorm.Expression[string]) badorm.FieldCondition[overridereferencesinverse.Computer, string] { +func ComputerName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, string]{ - Expressions: exprs, - Field: "Name", + Expression: expr, + Field: "Name", } } func ComputerProcessor(conditions ...badorm.Condition[overridereferencesinverse.Processor]) badorm.Condition[overridereferencesinverse.Computer] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go index f32030ed..fac42e84 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go @@ -8,28 +8,28 @@ import ( "time" ) -func EmployeeId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[selfreferential.Employee, badorm.UUID] { +func EmployeeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func EmployeeCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[selfreferential.Employee, time.Time] { +func EmployeeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func EmployeeUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[selfreferential.Employee, time.Time] { +func EmployeeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func EmployeeDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[selfreferential.Employee, gorm.DeletedAt] { +func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) badorm.Condition[selfreferential.Employee] { @@ -39,9 +39,9 @@ func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) bado T2Field: "ID", } } -func EmployeeBossId(exprs ...badorm.Expression[*badorm.UUID]) badorm.FieldCondition[selfreferential.Employee, *badorm.UUID] { - return badorm.FieldCondition[selfreferential.Employee, *badorm.UUID]{ - Expressions: exprs, - Field: "BossID", +func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { + return badorm.FieldCondition[selfreferential.Employee, badorm.UUID]{ + Expression: expr, + Field: "BossID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go index f8cc085c..0da2f819 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go @@ -8,27 +8,27 @@ import ( "time" ) -func UintModelId(exprs ...badorm.Expression[uint]) badorm.FieldCondition[uintmodel.UintModel, uint] { +func UintModelId(expr badorm.Expression[uint]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, uint]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func UintModelCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[uintmodel.UintModel, time.Time] { +func UintModelCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func UintModelUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[uintmodel.UintModel, time.Time] { +func UintModelUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func UintModelDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[uintmodel.UintModel, gorm.DeletedAt] { +func UintModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go index 50d6fcae..12c7ccf2 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go @@ -8,27 +8,27 @@ import ( "time" ) -func UUIDModelId(exprs ...badorm.Expression[badorm.UUID]) badorm.FieldCondition[uuidmodel.UUIDModel, badorm.UUID] { +func UUIDModelId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, badorm.UUID]{ - Expressions: exprs, - Field: "ID", + Expression: expr, + Field: "ID", } } -func UUIDModelCreatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[uuidmodel.UUIDModel, time.Time] { +func UUIDModelCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, time.Time]{ - Expressions: exprs, - Field: "CreatedAt", + Expression: expr, + Field: "CreatedAt", } } -func UUIDModelUpdatedAt(exprs ...badorm.Expression[time.Time]) badorm.FieldCondition[uuidmodel.UUIDModel, time.Time] { +func UUIDModelUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, time.Time]{ - Expressions: exprs, - Field: "UpdatedAt", + Expression: expr, + Field: "UpdatedAt", } } -func UUIDModelDeletedAt(exprs ...badorm.Expression[gorm.DeletedAt]) badorm.FieldCondition[uuidmodel.UUIDModel, gorm.DeletedAt] { +func UUIDModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, gorm.DeletedAt]{ - Expressions: exprs, - Field: "DeletedAt", + Expression: expr, + Field: "DeletedAt", } } From 93864fce33b9717a68142575867fc22b53b7086b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 19 Jun 2023 12:38:29 +0200 Subject: [PATCH 358/467] fix lint --- badorm/condition.go | 6 +++++- badorm/expression.go | 4 ---- testintegration/expressions_test.go | 2 ++ 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 999f6dea..b114309a 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -72,6 +72,7 @@ func (condition ContainerCondition[T]) Type() ConditionType { return WhereType } +//nolint:unused // is used func (condition ContainerCondition[T]) affectsDeletedAt() bool { return condition.ConnectionCondition.affectsDeletedAt() } @@ -129,6 +130,7 @@ func (condition ConnectionCondition[T]) Type() ConditionType { return WhereType } +//nolint:unused // is used func (condition ConnectionCondition[T]) affectsDeletedAt() bool { return pie.Any(condition.Conditions, func(internalCondition WhereCondition[T]) bool { return internalCondition.affectsDeletedAt() @@ -185,6 +187,7 @@ func (condition FieldCondition[TObject, TAtribute]) Type() ConditionType { return WhereType } +//nolint:unused // is used func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { return condition.Field == DeletedAtField } @@ -322,10 +325,11 @@ func (condition InvalidCondition[T]) Type() ConditionType { return WhereType } -func (condition InvalidCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { +func (condition InvalidCondition[T]) GetSQL(_ *gorm.DB, _ string) (string, []any, error) { return "", nil, condition.Err } +//nolint:unused // is used func (condition InvalidCondition[T]) affectsDeletedAt() bool { return false } diff --git a/badorm/expression.go b/badorm/expression.go index ecae9a86..fea2dadb 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -37,7 +37,6 @@ type SQLExpressionAndValue struct { Value any } -//nolint:unused // see inside func (expr ValueExpression[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Expression[T] @@ -111,7 +110,6 @@ type MultivalueExpression[T any] struct { SQLSuffix string } -//nolint:unused // see inside func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Expression[T] @@ -149,7 +147,6 @@ type PredicateExpression[T any] struct { SQLExpression string } -//nolint:unused // see inside func (expr PredicateExpression[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Expression[T] @@ -169,7 +166,6 @@ type InvalidExpression[T any] struct { Err error } -//nolint:unused // see inside func (expr InvalidExpression[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Expression[T] diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 87fd7a44..95635a29 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -586,6 +586,7 @@ func (ts *ExpressionIntTestSuite) TestIsFalse() { EqualList(&ts.Suite, []*models.Product{match}, entities) } +//nolint:dupl // not really duplicated func (ts *ExpressionIntTestSuite) TestIsNotTrue() { match1 := ts.createProduct("match", 0, 0, false, nil) match2 := ts.createProduct("match", 0, 0, false, nil) @@ -619,6 +620,7 @@ func (ts *ExpressionIntTestSuite) TestIsNotTrue() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } +//nolint:dupl // not really duplicated func (ts *ExpressionIntTestSuite) TestIsNotFalse() { match1 := ts.createProduct("match", 0, 0, false, nil) match2 := ts.createProduct("match", 0, 0, false, nil) From 098d1382bcee4a286b061c3e190fdce59c85007b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 19 Jun 2023 12:43:44 +0200 Subject: [PATCH 359/467] remove unnecesary type method --- badorm/condition.go | 42 ++++-------------------------------------- 1 file changed, 4 insertions(+), 38 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index b114309a..d9bfd6a1 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -12,21 +12,12 @@ const DeletedAtField = "DeletedAt" var ErrEmptyConditions = errors.New("condition must have at least one inner condition") -type ConditionType string - -const ( - WhereType ConditionType = "Where" - JoinType ConditionType = "Join" -) - type Condition[T any] interface { // Applies the condition to the "query" // using the "tableName" as name for the table holding // the data for object of type T ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) - Type() ConditionType - // This method is necessary to get the compiler to verify // that an object is of type Condition[T], // since if no method receives by parameter a type T, @@ -68,10 +59,6 @@ func (condition ContainerCondition[T]) GetSQL(query *gorm.DB, tableName string) return sqlString, values, nil } -func (condition ContainerCondition[T]) Type() ConditionType { - return WhereType -} - //nolint:unused // is used func (condition ContainerCondition[T]) affectsDeletedAt() bool { return condition.ConnectionCondition.affectsDeletedAt() @@ -126,10 +113,6 @@ func (condition ConnectionCondition[T]) GetSQL(query *gorm.DB, tableName string) return sqlString, values, nil } -func (condition ConnectionCondition[T]) Type() ConditionType { - return WhereType -} - //nolint:unused // is used func (condition ConnectionCondition[T]) affectsDeletedAt() bool { return pie.Any(condition.Conditions, func(internalCondition WhereCondition[T]) bool { @@ -183,10 +166,6 @@ func applyWhereCondition[T any](condition WhereCondition[T], query *gorm.DB, tab ), nil } -func (condition FieldCondition[TObject, TAtribute]) Type() ConditionType { - return WhereType -} - //nolint:unused // is used func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { return condition.Field == DeletedAtField @@ -267,10 +246,6 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName return query, nil } -func (condition JoinCondition[T1, T2]) Type() ConditionType { - return JoinType -} - // Returns the SQL string to do a join between T1 and T2 // taking into account that the ID attribute necessary to do it // can be either in T1's or T2's table. @@ -291,15 +266,10 @@ func divideConditionsByType[T any]( conditions []Condition[T], ) (thisEntityConditions []WhereCondition[T], joinConditions []Condition[T]) { for _, condition := range conditions { - switch condition.Type() { - case WhereType: - typedCondition, ok := condition.(WhereCondition[T]) - if ok { - // TODO ver si dejo asi - // esto me trajo problems cuando hice un cambio en el metodo, ya no cumplia y todas las condiciones me quedaron vacias - thisEntityConditions = append(thisEntityConditions, typedCondition) - } - case JoinType: + typedCondition, ok := condition.(WhereCondition[T]) + if ok { + thisEntityConditions = append(thisEntityConditions, typedCondition) + } else { joinConditions = append(joinConditions, condition) } } @@ -321,10 +291,6 @@ func (condition InvalidCondition[T]) ApplyTo(_ *gorm.DB, _ string) (*gorm.DB, er return nil, condition.Err } -func (condition InvalidCondition[T]) Type() ConditionType { - return WhereType -} - func (condition InvalidCondition[T]) GetSQL(_ *gorm.DB, _ string) (string, []any, error) { return "", nil, condition.Err } From c6941ae20a3c3afd6f5a8456fb909562bc9f69a9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 19 Jun 2023 14:33:29 +0200 Subject: [PATCH 360/467] fix sqlite int tests --- testintegration/expressions_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 95635a29..7ccb48c3 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -958,7 +958,7 @@ func (ts *ExpressionIntTestSuite) TestPosixRegex() { case configuration.PostgreSQL: posixRegexExpression = psql.POSIXMatch[string]("^a(b|x)") case configuration.SQLite: - posixRegexExpression = sqlite.Glob[string]("^a(b|x)") + posixRegexExpression = sqlite.Glob[string]("a[bx]") } if posixRegexExpression != nil { From 5f703240e0c743bc9a6f24c5721f2355c3fc113e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 19 Jun 2023 14:36:27 +0200 Subject: [PATCH 361/467] use strings.Join in place of + --- badorm/condition.go | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index d9bfd6a1..dce891d8 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -3,6 +3,7 @@ package badorm import ( "errors" "fmt" + "strings" "github.com/elliotchance/pie/v2" "gorm.io/gorm" @@ -91,26 +92,21 @@ func (condition ConnectionCondition[T]) ApplyTo(query *gorm.DB, tableName string } func (condition ConnectionCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { - sqlString := "" + sqlStrings := []string{} values := []any{} - for index, internalCondition := range condition.Conditions { - // TODO strings.Join(exprs, " AND ")? - if index != 0 { - sqlString += " " + condition.Connector + " " - } - - exprSQLString, exprValues, err := internalCondition.GetSQL(query, tableName) + for _, internalCondition := range condition.Conditions { + internalSQLString, exprValues, err := internalCondition.GetSQL(query, tableName) if err != nil { return "", nil, err } - sqlString += exprSQLString + sqlStrings = append(sqlStrings, internalSQLString) values = append(values, exprValues...) } - return sqlString, values, nil + return strings.Join(sqlStrings, " "+condition.Connector+" "), values, nil } //nolint:unused // is used From 450252d8301df467229e416ca64b2a782068217b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 19 Jun 2023 14:47:33 +0200 Subject: [PATCH 362/467] fix todos in tests --- badorm/condition.go | 1 - badorm/expression.go | 6 +----- testintegration/expressions_test.go | 23 ++++++++++++++--------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index dce891d8..708ad3d2 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -220,7 +220,6 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName joinQuery += " AND " + onQuery - // TODO podria desactivar el unscoped y meter esto en el connection if !connectionCondition.affectsDeletedAt() { joinQuery += fmt.Sprintf( " AND %s.deleted_at IS NULL", diff --git a/badorm/expression.go b/badorm/expression.go index fea2dadb..66c97b16 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -18,7 +18,6 @@ var ( ) type Expression[T any] interface { - // TODO quizas no devolver los values aca y ponerlos en otro metodo? ToSQL(columnName string) (string, []any, error) // This method is necessary to get the compiler to verify @@ -399,8 +398,5 @@ func Like[T string | sql.NullString](pattern string) LikeExpression[T] { return NewLikeExpression[T](pattern, "LIKE") } -// Date/Time Functions and Operators -// TODO isfinite -// TODO OVERLAPS - +// TODO Date/Time Functions and Operators // TODO Subquery Expressions diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 7ccb48c3..b6a2d20a 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -297,8 +297,7 @@ func (ts *ExpressionIntTestSuite) TestNotLt() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) case configuration.PostgreSQL, configuration.MySQL, configuration.SQLite: - // TODO - log.Println("TODO") + log.Println("NotLt not supported") } } @@ -351,8 +350,7 @@ func (ts *ExpressionIntTestSuite) TestNotGt() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) case configuration.PostgreSQL, configuration.MySQL, configuration.SQLite: - // TODO - log.Println("TODO") + log.Println("NotGt not supported") } } @@ -404,8 +402,14 @@ func (ts *ExpressionIntTestSuite) TestIsDistinct() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) case configuration.MySQL: - // TODO not is equal - log.Println("TODO") + entities, err := ts.crudProductService.GetEntities( + badorm.Not[models.Product]( + conditions.ProductInt(mysql.IsEqual(2)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } } @@ -766,9 +770,10 @@ func (ts *ExpressionIntTestSuite) TestArrayNotIn() { arrayNotInExpression = mysql.ArrayNotIn("ns1", "ns2") case configuration.PostgreSQL: arrayNotInExpression = psql.ArrayNotIn("ns1", "ns2") - case configuration.SQLServer, configuration.SQLite: - // TODO esto no va a andar en todos - arrayNotInExpression = psql.ArrayNotIn("ns1", "ns2") + case configuration.SQLServer: + arrayNotInExpression = sqlserver.ArrayNotIn("ns1", "ns2") + case configuration.SQLite: + arrayNotInExpression = sqlite.ArrayNotIn("ns1", "ns2") } entities, err := ts.crudProductService.GetEntities( From 50c8224758cda2582b7d280859399556226a26e9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 19 Jun 2023 16:35:19 +0200 Subject: [PATCH 363/467] remove not compatible sqlserver xor --- badorm/expression.go | 4 ---- badorm/mysql/logical.go | 3 +-- badorm/shared/logical.go | 7 ------- badorm/sqlserver/logical.go | 10 ---------- testintegration/expressions_test.go | 10 ---------- testintegration/where_conditions_test.go | 8 +------- 6 files changed, 2 insertions(+), 40 deletions(-) delete mode 100644 badorm/shared/logical.go delete mode 100644 badorm/sqlserver/logical.go diff --git a/badorm/expression.go b/badorm/expression.go index 66c97b16..5b7af974 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -313,7 +313,6 @@ func IsNotNull[T any]() PredicateExpression[T] { // Boolean Comparison Predicates -// TODO que pasa con otros que mapean a bool por valuer? // Not supported by: sqlserver func IsTrue[T bool | sql.NullBool]() PredicateExpression[T] { return NewPredicateExpression[T]("IS TRUE") @@ -373,7 +372,6 @@ func (expr LikeExpression[T]) Escape(escape rune) ValueExpression[T] { return expr.AddSQLExpression(string(escape), "ESCAPE") } -// TODO que pasa con los que son strings for valuer // Pattern in all databases: // - An underscore (_) in pattern stands for (matches) any single character. // - A percent sign (%) matches any sequence of zero or more characters. @@ -382,8 +380,6 @@ func (expr LikeExpression[T]) Escape(escape rune) ValueExpression[T] { // - Square brackets ([ ]) matches any single character within the specified range ([a-f]) or set ([abcdef]). // - [^] matches any single character not within the specified range ([^a-f]) or set ([^abcdef]). // -// # To be able to use ESCAPE operator use LikeEscape -// // WARNINGS: // - SQLite: LIKE is case-insensitive unless case_sensitive_like pragma (https://www.sqlite.org/pragma.html#pragma_case_sensitive_like) is true. // - SQLServer, MySQL: the case-sensitivity depends on the collation used in compared column. diff --git a/badorm/mysql/logical.go b/badorm/mysql/logical.go index 548d9b4d..caf4dce1 100644 --- a/badorm/mysql/logical.go +++ b/badorm/mysql/logical.go @@ -2,9 +2,8 @@ package mysql import ( "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/shared" ) func Xor[T any](conditions ...badorm.WhereCondition[T]) badorm.WhereCondition[T] { - return shared.Xor(conditions...) + return badorm.NewConnectionCondition("XOR", conditions...) } diff --git a/badorm/shared/logical.go b/badorm/shared/logical.go deleted file mode 100644 index 2b77aed5..00000000 --- a/badorm/shared/logical.go +++ /dev/null @@ -1,7 +0,0 @@ -package shared - -import "github.com/ditrit/badaas/badorm" - -func Xor[T any](conditions ...badorm.WhereCondition[T]) badorm.WhereCondition[T] { - return badorm.NewConnectionCondition("XOR", conditions...) -} diff --git a/badorm/sqlserver/logical.go b/badorm/sqlserver/logical.go deleted file mode 100644 index f9e3c261..00000000 --- a/badorm/sqlserver/logical.go +++ /dev/null @@ -1,10 +0,0 @@ -package sqlserver - -import ( - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/shared" -) - -func Xor[T any](conditions ...badorm.WhereCondition[T]) badorm.WhereCondition[T] { - return shared.Xor(conditions...) -} diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index b6a2d20a..0d3b3fd2 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -474,7 +474,6 @@ func (ts *ExpressionIntTestSuite) TestIsNull() { entities, err := ts.crudProductService.GetEntities( conditions.ProductIntPointer( - // TODO esto no queda muy lindo que hay que ponerlo asi badorm.IsNull[int](), ), ) @@ -493,7 +492,6 @@ func (ts *ExpressionIntTestSuite) TestIsNullNotPointers() { entities, err := ts.crudProductService.GetEntities( conditions.ProductNullFloat( - // TODO esto no queda muy lindo que hay que ponerlo asi badorm.IsNull[sql.NullFloat64](), ), ) @@ -510,7 +508,6 @@ func (ts *ExpressionIntTestSuite) TestIsNotNull() { entities, err := ts.crudProductService.GetEntities( conditions.ProductIntPointer( - // TODO esto no queda muy lindo que hay que ponerlo asi badorm.IsNotNull[int](), ), ) @@ -529,7 +526,6 @@ func (ts *ExpressionIntTestSuite) TestIsNotNullNotPointers() { entities, err := ts.crudProductService.GetEntities( conditions.ProductNullFloat( - // TODO esto no queda muy lindo que hay que ponerlo asi badorm.IsNotNull[sql.NullFloat64](), ), ) @@ -547,7 +543,6 @@ func (ts *ExpressionIntTestSuite) TestIsTrue() { switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - // TODO esto no queda muy lindo que hay que ponerlo asi isTrueExpression = badorm.IsTrue[bool]() case configuration.SQLServer: // sqlserver doesn't support IsTrue @@ -573,7 +568,6 @@ func (ts *ExpressionIntTestSuite) TestIsFalse() { switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - // TODO esto no queda muy lindo que hay que ponerlo asi isFalseExpression = badorm.IsFalse[bool]() case configuration.SQLServer: // sqlserver doesn't support IsFalse @@ -607,7 +601,6 @@ func (ts *ExpressionIntTestSuite) TestIsNotTrue() { switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - // TODO esto no queda muy lindo que hay que ponerlo asi isNotTrueExpression = badorm.IsNotTrue[sql.NullBool]() case configuration.SQLServer: // sqlserver doesn't support IsNotTrue @@ -641,7 +634,6 @@ func (ts *ExpressionIntTestSuite) TestIsNotFalse() { switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - // TODO esto no queda muy lindo que hay que ponerlo asi isNotFalseExpression = badorm.IsNotFalse[sql.NullBool]() case configuration.SQLServer: // sqlserver doesn't support IsNotFalse @@ -675,7 +667,6 @@ func (ts *ExpressionIntTestSuite) TestIsUnknown() { switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL: - // TODO esto no queda muy lindo que hay que ponerlo asi isUnknownExpression = badorm.IsUnknown[sql.NullBool]() case configuration.SQLServer, configuration.SQLite: // sqlserver doesn't support IsUnknown @@ -709,7 +700,6 @@ func (ts *ExpressionIntTestSuite) TestIsNotUnknown() { switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL: - // TODO esto no queda muy lindo que hay que ponerlo asi isNotUnknownExpression = badorm.IsNotUnknown[sql.NullBool]() case configuration.SQLServer, configuration.SQLite: // sqlserver doesn't support IsNotUnknown diff --git a/testintegration/where_conditions_test.go b/testintegration/where_conditions_test.go index 2f02806a..4e30a45d 100644 --- a/testintegration/where_conditions_test.go +++ b/testintegration/where_conditions_test.go @@ -8,7 +8,6 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/mysql" - "github.com/ditrit/badaas/badorm/sqlserver" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" @@ -535,18 +534,13 @@ func (ts *WhereConditionsIntTestSuite) TestXor() { var xorExpression badorm.WhereCondition[models.Product] switch getDBDialector() { - case configuration.PostgreSQL, configuration.SQLite: + case configuration.PostgreSQL, configuration.SQLite, configuration.SQLServer: log.Println("Xor not compatible") case configuration.MySQL: xorExpression = mysql.Xor( conditions.ProductInt(badorm.Lt(6)), conditions.ProductInt(badorm.Gt(3)), ) - case configuration.SQLServer: - xorExpression = sqlserver.Xor( - conditions.ProductInt(badorm.Lt(6)), - conditions.ProductInt(badorm.Gt(3)), - ) } if xorExpression != nil { From 2f4613d4bdb7258795c0aaeb804d9c8f0627a675 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 19 Jun 2023 16:59:12 +0200 Subject: [PATCH 364/467] unsafe condition for unsopported conditions --- badorm/condition.go | 45 +++++++++++++++++++----- badorm/psql/comparison.go | 1 - testintegration/join_conditions_test.go | 25 +++++++++++++ testintegration/where_conditions_test.go | 14 ++++++++ 4 files changed, 76 insertions(+), 9 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 708ad3d2..2489873c 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -117,10 +117,6 @@ func (condition ConnectionCondition[T]) affectsDeletedAt() bool { } func NewConnectionCondition[T any](connector string, conditions ...WhereCondition[T]) WhereCondition[T] { - if len(conditions) == 0 { - return NewInvalidCondition[T](ErrEmptyConditions) - } - return ConnectionCondition[T]{ Connector: connector, Conditions: conditions, @@ -218,7 +214,9 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName return nil, err } - joinQuery += " AND " + onQuery + if onQuery != "" { + joinQuery += " AND " + onQuery + } if !connectionCondition.affectsDeletedAt() { joinQuery += fmt.Sprintf( @@ -272,6 +270,40 @@ func divideConditionsByType[T any]( return } +type UnsafeCondition[T any] struct { + SQLCondition string + Values []any +} + +//nolint:unused // see inside +func (condition UnsafeCondition[T]) interfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} + +func (condition UnsafeCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { + return applyWhereCondition[T](condition, query, tableName) +} + +func (condition UnsafeCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { + return fmt.Sprintf( + condition.SQLCondition, + tableName, + ), condition.Values, nil +} + +//nolint:unused // is used +func (condition UnsafeCondition[T]) affectsDeletedAt() bool { + return false +} + +func NewUnsafeCondition[T any](condition string, values []any) UnsafeCondition[T] { + return UnsafeCondition[T]{ + SQLCondition: condition, + Values: values, + } +} + type InvalidCondition[T any] struct { Err error } @@ -308,9 +340,6 @@ func NewInvalidCondition[T any](err error) InvalidCondition[T] { // - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/logical-operators-transact-sql?view=sql-server-ver16 // - SQLite: https://www.sqlite.org/lang_expr.html -// TODO que pasa si quiero esto entre distintas conditions, -// y si ensima queres entre distintos joins olvidate imposible -// -> agregar unsafe condition y unsafe expression func And[T any](conditions ...WhereCondition[T]) WhereCondition[T] { return NewConnectionCondition("AND", conditions...) } diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go index accbd84f..05ca1cba 100644 --- a/badorm/psql/comparison.go +++ b/badorm/psql/comparison.go @@ -17,7 +17,6 @@ var normalForms = map[norm.Form]string{ norm.NFKD: "NFKD", } -// TODO que pasa con otros que mapean a string por valuer? func IsNormalized[T string | sql.NullString](expectedNorm norm.Form) badorm.PredicateExpression[T] { return badorm.NewPredicateExpression[T]( "IS " + normalForms[expectedNorm] + " NORMALIZED", diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 44585979..633c36f3 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -353,3 +353,28 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsMultipleTimes() { EqualList(&ts.Suite, []*models.Sale{match}, entities) } + +func (ts *WhereConditionsIntTestSuite) TestJoinWithUnsafeCondition() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + seller1 := ts.createSeller("ditrit", company1) + seller2 := ts.createSeller("agustin", company2) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSeller( + conditions.SellerCompany( + badorm.NewUnsafeCondition[models.Company]("%s.name = sellers_sales.name", []any{}), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} diff --git a/testintegration/where_conditions_test.go b/testintegration/where_conditions_test.go index 4e30a45d..b29c2aa6 100644 --- a/testintegration/where_conditions_test.go +++ b/testintegration/where_conditions_test.go @@ -567,3 +567,17 @@ func (ts *WhereConditionsIntTestSuite) TestMultipleConditionsDifferentExpression EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } + +func (ts *WhereConditionsIntTestSuite) TestUnsafeCondition() { + match1 := ts.createProduct("match", 1, 0.0, true, nil) + match2 := ts.createProduct("match", 1, 0.0, true, nil) + + ts.createProduct("not_match", 2, 0.0, true, nil) + + entities, err := ts.crudProductService.GetEntities( + badorm.NewUnsafeCondition[models.Product]("%s.int = ?", []any{1}), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} From 99c6adf78f22bcbb81a842ee964e08fffabf842e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 19 Jun 2023 17:11:43 +0200 Subject: [PATCH 365/467] remove unsopported operators with cockroachdb --- badorm/psql/comparison.go | 21 --------------- testintegration/expressions_test.go | 42 ----------------------------- 2 files changed, 63 deletions(-) diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go index 05ca1cba..ee6c1137 100644 --- a/badorm/psql/comparison.go +++ b/badorm/psql/comparison.go @@ -3,30 +3,9 @@ package psql import ( "database/sql" - "golang.org/x/text/unicode/norm" - "github.com/ditrit/badaas/badorm" ) -// String Functions and Operators - -var normalForms = map[norm.Form]string{ - norm.NFC: "NFC", - norm.NFD: "NFD", - norm.NFKC: "NFKC", - norm.NFKD: "NFKD", -} - -func IsNormalized[T string | sql.NullString](expectedNorm norm.Form) badorm.PredicateExpression[T] { - return badorm.NewPredicateExpression[T]( - "IS " + normalForms[expectedNorm] + " NORMALIZED", - ) -} - -func StartsWith[T string | sql.NullString](expectedStart string) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](expectedStart, "^@") -} - // Pattern Matching func ILike[T string | sql.NullString](pattern string) badorm.ValueExpression[T] { diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 0d3b3fd2..c3421775 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -4,7 +4,6 @@ import ( "database/sql" "log" - "golang.org/x/text/unicode/norm" "gorm.io/gorm" "github.com/ditrit/badaas/badorm" @@ -850,47 +849,6 @@ func (ts *ExpressionIntTestSuite) TestLikeOnNumeric() { } } -func (ts *ExpressionIntTestSuite) TestIsNormalized() { - switch getDBDialector() { - case configuration.MySQL, configuration.SQLServer, configuration.SQLite: - log.Println("IsNormalized not compatible") - case configuration.PostgreSQL: - match := ts.createProduct("A\0308", 0, 0, false, nil) - ts.createProduct("A\u030A", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString( - psql.IsNormalized[string](norm.NFC), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) - } -} - -func (ts *ExpressionIntTestSuite) TestStartsWith() { - switch getDBDialector() { - case configuration.MySQL, configuration.SQLServer, configuration.SQLite: - log.Println("StartsWith not compatible") - case configuration.PostgreSQL: - match1 := ts.createProduct("franco", 0, 0, false, nil) - match2 := ts.createProduct("francisco", 0, 0, false, nil) - - ts.createProduct("agustin", 0, 0, false, nil) - ts.createProduct("lorenzo", 0, 0, false, nil) - - entities, err := ts.crudProductService.GetEntities( - conditions.ProductString( - psql.StartsWith[string]("fra"), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) - } -} - func (ts *ExpressionIntTestSuite) TestILike() { switch getDBDialector() { case configuration.MySQL, configuration.SQLServer, configuration.SQLite: From ed2f7441c4de074fa7b8ad25a0cdef895c599d2b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 19 Jun 2023 17:12:33 +0200 Subject: [PATCH 366/467] fix lint --- badorm/condition.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/badorm/condition.go b/badorm/condition.go index 2489873c..09a4d412 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -285,7 +285,7 @@ func (condition UnsafeCondition[T]) ApplyTo(query *gorm.DB, tableName string) (* return applyWhereCondition[T](condition, query, tableName) } -func (condition UnsafeCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { +func (condition UnsafeCondition[T]) GetSQL(_ *gorm.DB, tableName string) (string, []any, error) { return fmt.Sprintf( condition.SQLCondition, tableName, From 903c9637885f71f0f4200e51c6e611f61ab4d24c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 09:52:51 +0200 Subject: [PATCH 367/467] TODO to issue --- badorm/expression.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index 5b7af974..ea494cb5 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -353,9 +353,6 @@ func IsNotDistinct[T any](value T) ValueExpression[T] { return NewValueExpression[T](value, "IS NOT DISTINCT FROM") } -// TODO hay muchos operadores en el caso de que quisiera aplicarle la funcion contra lo que estoy comparando -// y despues esta el tema de si quiero en alguna comparacion usar una columna anterior, ahi ya se re complica esto - // Pattern Matching type LikeExpression[T string | sql.NullString] struct { From 40cc0d42e20ab4a9c99800364870e2522ae8de47 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 09:54:53 +0200 Subject: [PATCH 368/467] remove todos --- badorm/expression.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index ea494cb5..9cda22c4 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -295,7 +295,6 @@ func GtOrEq[T any](value T) Expression[T] { // https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE func Between[T any](v1 T, v2 T) MultivalueExpression[T] { - // TODO cant be null? return NewMultivalueExpression("BETWEEN", "AND", "", "", v1, v2) } @@ -391,5 +390,4 @@ func Like[T string | sql.NullString](pattern string) LikeExpression[T] { return NewLikeExpression[T](pattern, "LIKE") } -// TODO Date/Time Functions and Operators // TODO Subquery Expressions From 34a7e64a7f0201d28c490a531a6bdf561b6d7989 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 10:00:29 +0200 Subject: [PATCH 369/467] put all coverage exit files in the same folder --- .github/workflows/CI.yml | 32 ++++++++------------------------ sonar-project.properties | 2 +- 2 files changed, 9 insertions(+), 25 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b1b116cc..8d2d91ad 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -72,14 +72,14 @@ jobs: run: gotestsum --junitfile unit-tests-badaas.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage_unit.out - uses: actions/upload-artifact@v3 with: - name: coverage_unit - path: coverage_unit.out + name: unit + path: coverage - name: Run BaDctl tests run: gotestsum --junitfile unit-tests-badctl.xml ./tools/badctl/... -coverprofile=coverage_badctl.out - uses: actions/upload-artifact@v3 with: - name: coverage_badctl - path: coverage_badctl.out + name: badctl + path: coverage - name: Test Report uses: dorny/test-reporter@v1 if: always() # run this step even if previous steps failed @@ -142,8 +142,8 @@ jobs: reporter: java-junit # Format of test results - uses: actions/upload-artifact@v3 with: - name: coverage_int_${{ matrix.db }} - path: coverage_int_${{ matrix.db }}.out + name: int_${{ matrix.db }} + path: coverage - name: Stop containers if: ${{ matrix.db != 'sqlite' }} run: docker stop badaas-test-db @@ -188,26 +188,10 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Download unit tests line coverage report + - name: Download line coverage report uses: actions/download-artifact@v3 with: - name: coverage_unit - path: coverage_unit.out - - name: Download badctl unit tests line coverage report - uses: actions/download-artifact@v3 - with: - name: coverage_badctl - path: coverage_badctl.out - - name: Download postgresql int tests line coverage report - uses: actions/download-artifact@v3 - with: - name: coverage_int_postgresql - path: coverage_int_postgresql.out - - name: Download mysql int tests line coverage report - uses: actions/download-artifact@v3 - with: - name: coverage_int_mysql - path: coverage_int_mysql.out + path: coverage - name: SonarCloud Scan uses: sonarsource/sonarcloud-github-action@master env: diff --git a/sonar-project.properties b/sonar-project.properties index 65dd48f7..4ae6b96d 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -6,4 +6,4 @@ sonar.sources=. sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/gen/docker/api/Dockerfile sonar.tests=. sonar.test.inclusions=**/*_test.go,testintegration/***,test_e2e/***,tools/badctl/cmd/gen/conditions/tests/*** -sonar.go.coverage.reportPaths=coverage_unit.out/coverage_unit.out,coverage_badctl.out/coverage_badctl.out,coverage_int_postgresql.out/coverage_int_postgresql.out,coverage_int_mysql.out/coverage_int_mysql.out +sonar.go.coverage.reportPaths=coverage/* From c00982ba6fbb8ef949c050ff15cbc0f57921b894 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 10:20:23 +0200 Subject: [PATCH 370/467] add more comments to functions --- badorm/condition.go | 22 ++++++++++++++++++++++ badorm/expression.go | 19 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/badorm/condition.go b/badorm/condition.go index 09a4d412..68b6becf 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -26,14 +26,21 @@ type Condition[T any] interface { interfaceVerificationMethod(T) } +// Conditions that can be used in a where clause +// (or in a on of a join) type WhereCondition[T any] interface { Condition[T] + // Get the sql string and values to use in the query GetSQL(query *gorm.DB, tableName string) (string, []any, error) + // Returns true if the DeletedAt column if affected by the condition + // If no condition affects the DeletedAt, the verification that it's null will be added automatically affectsDeletedAt() bool } +// Condition that contains a internal condition. +// Example: NOT (internal condition) type ContainerCondition[T any] struct { ConnectionCondition WhereCondition[T] Prefix string @@ -65,6 +72,8 @@ func (condition ContainerCondition[T]) affectsDeletedAt() bool { return condition.ConnectionCondition.affectsDeletedAt() } +// Condition that contains a internal condition. +// Example: NOT (internal condition) func NewContainerCondition[T any](prefix string, conditions ...WhereCondition[T]) WhereCondition[T] { if len(conditions) == 0 { return NewInvalidCondition[T](ErrEmptyConditions) @@ -76,6 +85,8 @@ func NewContainerCondition[T any](prefix string, conditions ...WhereCondition[T] } } +// Condition that connects multiple conditions. +// Example: condition1 AND condition2 type ConnectionCondition[T any] struct { Connector string Conditions []WhereCondition[T] @@ -116,6 +127,8 @@ func (condition ConnectionCondition[T]) affectsDeletedAt() bool { }) } +// Condition that connects multiple conditions. +// Example: condition1 AND condition2 func NewConnectionCondition[T any](connector string, conditions ...WhereCondition[T]) WhereCondition[T] { return ConnectionCondition[T]{ Connector: connector, @@ -123,6 +136,8 @@ func NewConnectionCondition[T any](connector string, conditions ...WhereConditio } } +// Condition that verifies the value of a field, +// using the Expression type FieldCondition[TObject any, TAtribute any] struct { Field string Column string @@ -175,6 +190,7 @@ func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table return condition.Expression.ToSQL(columnName) } +// Condition that joins with other table type JoinCondition[T1 any, T2 any] struct { T1Field string T2Field string @@ -270,6 +286,8 @@ func divideConditionsByType[T any]( return } +// Condition that can be used to express conditions that are not supported (yet?) by BaDORM +// Example: table1.columnX = table2.columnY type UnsafeCondition[T any] struct { SQLCondition string Values []any @@ -297,6 +315,8 @@ func (condition UnsafeCondition[T]) affectsDeletedAt() bool { return false } +// Condition that can be used to express conditions that are not supported (yet?) by BaDORM +// Example: table1.columnX = table2.columnY func NewUnsafeCondition[T any](condition string, values []any) UnsafeCondition[T] { return UnsafeCondition[T]{ SQLCondition: condition, @@ -304,6 +324,7 @@ func NewUnsafeCondition[T any](condition string, values []any) UnsafeCondition[T } } +// Condition used to returns an error when the query is executed type InvalidCondition[T any] struct { Err error } @@ -327,6 +348,7 @@ func (condition InvalidCondition[T]) affectsDeletedAt() bool { return false } +// Condition used to returns an error when the query is executed func NewInvalidCondition[T any](err error) InvalidCondition[T] { return InvalidCondition[T]{ Err: err, diff --git a/badorm/expression.go b/badorm/expression.go index 9cda22c4..4ec1286f 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -18,6 +18,8 @@ var ( ) type Expression[T any] interface { + // Transform the Expression to a SQL string and a list of values to use in the query + // columnName is used by the expression to determine which is the objective column. ToSQL(columnName string) (string, []any, error) // This method is necessary to get the compiler to verify @@ -27,6 +29,10 @@ type Expression[T any] interface { InterfaceVerificationMethod(T) } +// Expression that compares the value of the column against a fixed value +// If ExpressionsAndValues has multiple entries, comparisons will be nested +// Example (single): value = v1 +// Example (multi): value LIKE v1 ESCAPE v2 type ValueExpression[T any] struct { ExpressionsAndValues []SQLExpressionAndValue } @@ -101,6 +107,8 @@ func (expr *ValueExpression[T]) AddSQLExpression(value any, sqlExpression string return *expr } +// Expression that compares the value of the column against multiple values +// Example: value IN (v1, v2, v3, ..., vN) type MultivalueExpression[T any] struct { Values []T SQLExpression string @@ -142,6 +150,8 @@ func NewMultivalueExpression[T any](sqlExpression, sqlConnector, sqlPrefix, sqlS } } +// Expression that verifies a predicate +// Example: value IS TRUE type PredicateExpression[T any] struct { SQLExpression string } @@ -161,6 +171,7 @@ func NewPredicateExpression[T any](sqlExpression string) PredicateExpression[T] } } +// Expression used to return an error type InvalidExpression[T any] struct { Err error } @@ -187,6 +198,7 @@ func NewInvalidExpression[T any](err error) InvalidExpression[T] { // - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 // - SQLite: https://www.sqlite.org/lang_expr.html +// EqualTo // EqOrIsNull must be used in cases where value can be NULL func Eq[T any](value T) Expression[T] { return NewCantBeNullValueExpression[T](value, "=") @@ -208,6 +220,7 @@ func EqOrIsNull[T any](value any) Expression[T] { return expressionFromValueOrNil[T](value, Eq[T], IsNull[T]()) } +// NotEqualTo // NotEqOrNotIsNull must be used in cases where value can be NULL func NotEq[T any](value T) Expression[T] { return NewCantBeNullValueExpression[T](value, "<>") @@ -273,18 +286,22 @@ func mapsToNull(value any) bool { return false } +// LessThan func Lt[T any](value T) Expression[T] { return NewCantBeNullValueExpression[T](value, "<") } +// LessThanOrEqualTo func LtOrEq[T any](value T) Expression[T] { return NewCantBeNullValueExpression[T](value, "<=") } +// GreaterThan func Gt[T any](value T) Expression[T] { return NewCantBeNullValueExpression[T](value, ">") } +// GreaterThanOrEqualTo func GtOrEq[T any](value T) Expression[T] { return NewCantBeNullValueExpression[T](value, ">=") } @@ -294,10 +311,12 @@ func GtOrEq[T any](value T) Expression[T] { // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html // https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE +// Equivalent to v1 < value < v2 func Between[T any](v1 T, v2 T) MultivalueExpression[T] { return NewMultivalueExpression("BETWEEN", "AND", "", "", v1, v2) } +// Equivalent to NOT (v1 < value < v2) func NotBetween[T any](v1 T, v2 T) MultivalueExpression[T] { return NewMultivalueExpression("NOT BETWEEN", "AND", "", "", v1, v2) } From 456daa558796cf507d391703e28ba4a318281678 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 10:24:54 +0200 Subject: [PATCH 371/467] fix line coverage report upload --- .github/workflows/CI.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 8d2d91ad..c15d2f48 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -72,14 +72,14 @@ jobs: run: gotestsum --junitfile unit-tests-badaas.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage_unit.out - uses: actions/upload-artifact@v3 with: - name: unit - path: coverage + name: coverage/unit + path: coverage_unit.out - name: Run BaDctl tests run: gotestsum --junitfile unit-tests-badctl.xml ./tools/badctl/... -coverprofile=coverage_badctl.out - uses: actions/upload-artifact@v3 with: - name: badctl - path: coverage + name: coverage/badctl + path: coverage_badctl.out - name: Test Report uses: dorny/test-reporter@v1 if: always() # run this step even if previous steps failed @@ -142,8 +142,8 @@ jobs: reporter: java-junit # Format of test results - uses: actions/upload-artifact@v3 with: - name: int_${{ matrix.db }} - path: coverage + name: coverage/int_${{ matrix.db }} + path: coverage_int_${{ matrix.db }} - name: Stop containers if: ${{ matrix.db != 'sqlite' }} run: docker stop badaas-test-db @@ -188,7 +188,7 @@ jobs: - uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Download line coverage report + - name: Download line coverage reports uses: actions/download-artifact@v3 with: path: coverage From 4c9acd84bc60cc47d701ef13f90425c861326bc0 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 10:27:43 +0200 Subject: [PATCH 372/467] fix int line coverage report upload --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index c15d2f48..5df0de16 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -143,7 +143,7 @@ jobs: - uses: actions/upload-artifact@v3 with: name: coverage/int_${{ matrix.db }} - path: coverage_int_${{ matrix.db }} + path: coverage_int_${{ matrix.db }}.out - name: Stop containers if: ${{ matrix.db != 'sqlite' }} run: docker stop badaas-test-db From 6a60fb3310faf8d71c09719d4cac9e3c6e41644d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 10:40:06 +0200 Subject: [PATCH 373/467] add tests for empty conditions --- testintegration/join_conditions_test.go | 26 ++++++++++++++++++++++++ testintegration/where_conditions_test.go | 19 +++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 633c36f3..96f4f78e 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -378,3 +378,29 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithUnsafeCondition() { EqualList(&ts.Suite, []*models.Sale{match}, entities) } + +func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyConnectionConditionMakesNothing() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + match1 := ts.createSale(0, product1, nil) + match2 := ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + badorm.And[models.Product](), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match1, match2}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesNothing() { + _, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + badorm.Not[models.Product](), + ), + ) + ts.ErrorIs(err, badorm.ErrEmptyConditions) +} diff --git a/testintegration/where_conditions_test.go b/testintegration/where_conditions_test.go index b29c2aa6..1f104c9f 100644 --- a/testintegration/where_conditions_test.go +++ b/testintegration/where_conditions_test.go @@ -581,3 +581,22 @@ func (ts *WhereConditionsIntTestSuite) TestUnsafeCondition() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } + +func (ts *WhereConditionsIntTestSuite) TestEmptyConnectionConditionMakesNothing() { + match1 := ts.createProduct("match", 1, 0.0, true, nil) + match2 := ts.createProduct("match", 1, 0.0, true, nil) + + entities, err := ts.crudProductService.GetEntities( + badorm.And[models.Product](), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) +} + +func (ts *WhereConditionsIntTestSuite) TestEmptyContainerConditionReturnsError() { + _, err := ts.crudProductService.GetEntities( + badorm.Not[models.Product](), + ) + ts.ErrorIs(err, badorm.ErrEmptyConditions) +} From 337f91f9cb96bb52e8caa82bfb45f3cce13e6f0e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 10:47:38 +0200 Subject: [PATCH 374/467] coverage results to a folder --- .github/workflows/CI.yml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 5df0de16..619a9279 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -68,18 +68,18 @@ jobs: cache: true - name: Install gotestsum run: go install gotest.tools/gotestsum@latest + - name: Create coverage folder + run: mkdir coverage - name: Run BaDaaS tests - run: gotestsum --junitfile unit-tests-badaas.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage_unit.out + run: gotestsum --junitfile unit-tests-badaas.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage/unit.out - uses: actions/upload-artifact@v3 with: - name: coverage/unit - path: coverage_unit.out + path: coverage/unit.out - name: Run BaDctl tests - run: gotestsum --junitfile unit-tests-badctl.xml ./tools/badctl/... -coverprofile=coverage_badctl.out + run: gotestsum --junitfile unit-tests-badctl.xml ./tools/badctl/... -coverprofile=coverage/badctl.out - uses: actions/upload-artifact@v3 with: - name: coverage/badctl - path: coverage_badctl.out + path: coverage/badctl.out - name: Test Report uses: dorny/test-reporter@v1 if: always() # run this step even if previous steps failed @@ -105,6 +105,8 @@ jobs: cache: true - name: Install gotestsum run: go install gotest.tools/gotestsum@latest + - name: Create coverage folder + run: mkdir coverage - name: Start containers run: docker compose -f "docker/${{ matrix.db }}/docker-compose.yml" up -d if: ${{ matrix.db != 'sqlite' }} @@ -132,7 +134,7 @@ jobs: } export_to: env - name: Run test - run: DB=${{ env.dialector }} gotestsum --junitfile integration-tests-${{ matrix.db }}.xml ./testintegration -tags=${{ matrix.db }} -coverpkg=./... -coverprofile=coverage_int_${{ matrix.db }}.out + run: DB=${{ env.dialector }} gotestsum --junitfile integration-tests-${{ matrix.db }}.xml ./testintegration -tags=${{ matrix.db }} -coverpkg=./... -coverprofile=coverage/int_${{ matrix.db }}.out - name: Test Report uses: dorny/test-reporter@v1 if: always() # run this step even if previous steps failed @@ -142,8 +144,7 @@ jobs: reporter: java-junit # Format of test results - uses: actions/upload-artifact@v3 with: - name: coverage/int_${{ matrix.db }} - path: coverage_int_${{ matrix.db }}.out + path: coverage/int_${{ matrix.db }}.out - name: Stop containers if: ${{ matrix.db != 'sqlite' }} run: docker stop badaas-test-db From ad183ee2a4f6b20d892c507dac502db8474c40f7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 10:49:02 +0200 Subject: [PATCH 375/467] add test reports to gitigore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 380fe0df..48935fc3 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out +*-tests-*.xml # Dependency directories (remove the comment below to include it) vendor/ From 52348b6734d5814f94f1f741a16b5ab3e00ecb01 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 11:03:13 +0200 Subject: [PATCH 376/467] coverage reports to artifact with name --- .github/workflows/CI.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 619a9279..fedbdf60 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -74,11 +74,13 @@ jobs: run: gotestsum --junitfile unit-tests-badaas.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage/unit.out - uses: actions/upload-artifact@v3 with: + name: coverage path: coverage/unit.out - name: Run BaDctl tests run: gotestsum --junitfile unit-tests-badctl.xml ./tools/badctl/... -coverprofile=coverage/badctl.out - uses: actions/upload-artifact@v3 with: + name: coverage path: coverage/badctl.out - name: Test Report uses: dorny/test-reporter@v1 @@ -144,6 +146,7 @@ jobs: reporter: java-junit # Format of test results - uses: actions/upload-artifact@v3 with: + name: coverage path: coverage/int_${{ matrix.db }}.out - name: Stop containers if: ${{ matrix.db != 'sqlite' }} @@ -192,7 +195,7 @@ jobs: - name: Download line coverage reports uses: actions/download-artifact@v3 with: - path: coverage + name: coverage - name: SonarCloud Scan uses: sonarsource/sonarcloud-github-action@master env: From ef4b6685efdcdddcf9980c988ff0a24b1dac2f06 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 11:09:59 +0200 Subject: [PATCH 377/467] use all .out files for coverage --- .github/workflows/CI.yml | 16 ++++++---------- sonar-project.properties | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index fedbdf60..04b8c9d4 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -68,20 +68,18 @@ jobs: cache: true - name: Install gotestsum run: go install gotest.tools/gotestsum@latest - - name: Create coverage folder - run: mkdir coverage - name: Run BaDaaS tests - run: gotestsum --junitfile unit-tests-badaas.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage/unit.out + run: gotestsum --junitfile unit-tests-badaas.xml $(go list ./... | tail -n +2 | grep -v testintegration) -coverpkg=./... -coverprofile=coverage_unit.out - uses: actions/upload-artifact@v3 with: name: coverage - path: coverage/unit.out + path: coverage_unit.out - name: Run BaDctl tests - run: gotestsum --junitfile unit-tests-badctl.xml ./tools/badctl/... -coverprofile=coverage/badctl.out + run: gotestsum --junitfile unit-tests-badctl.xml ./tools/badctl/... -coverprofile=coverage_badctl.out - uses: actions/upload-artifact@v3 with: name: coverage - path: coverage/badctl.out + path: coverage_badctl.out - name: Test Report uses: dorny/test-reporter@v1 if: always() # run this step even if previous steps failed @@ -107,8 +105,6 @@ jobs: cache: true - name: Install gotestsum run: go install gotest.tools/gotestsum@latest - - name: Create coverage folder - run: mkdir coverage - name: Start containers run: docker compose -f "docker/${{ matrix.db }}/docker-compose.yml" up -d if: ${{ matrix.db != 'sqlite' }} @@ -136,7 +132,7 @@ jobs: } export_to: env - name: Run test - run: DB=${{ env.dialector }} gotestsum --junitfile integration-tests-${{ matrix.db }}.xml ./testintegration -tags=${{ matrix.db }} -coverpkg=./... -coverprofile=coverage/int_${{ matrix.db }}.out + run: DB=${{ env.dialector }} gotestsum --junitfile integration-tests-${{ matrix.db }}.xml ./testintegration -tags=${{ matrix.db }} -coverpkg=./... -coverprofile=coverage_int_${{ matrix.db }}.out - name: Test Report uses: dorny/test-reporter@v1 if: always() # run this step even if previous steps failed @@ -147,7 +143,7 @@ jobs: - uses: actions/upload-artifact@v3 with: name: coverage - path: coverage/int_${{ matrix.db }}.out + path: coverage_int_${{ matrix.db }}.out - name: Stop containers if: ${{ matrix.db != 'sqlite' }} run: docker stop badaas-test-db diff --git a/sonar-project.properties b/sonar-project.properties index 4ae6b96d..69edb6d7 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -6,4 +6,4 @@ sonar.sources=. sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/gen/docker/api/Dockerfile sonar.tests=. sonar.test.inclusions=**/*_test.go,testintegration/***,test_e2e/***,tools/badctl/cmd/gen/conditions/tests/*** -sonar.go.coverage.reportPaths=coverage/* +sonar.go.coverage.reportPaths=*.out From 2b4bb50fac53e16afd10872078a97334a5c29d5e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 11:24:42 +0200 Subject: [PATCH 378/467] add test for case sensitive of regex --- testintegration/expressions_test.go | 38 ++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index c3421775..b0553fdf 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -894,20 +894,19 @@ func (ts *ExpressionIntTestSuite) TestSimilarTo() { } } -func (ts *ExpressionIntTestSuite) TestPosixRegex() { +func (ts *ExpressionIntTestSuite) TestPosixRegexCaseSensitive() { match1 := ts.createProduct("ab", 0, 0, false, nil) match2 := ts.createProduct("ax", 0, 0, false, nil) ts.createProduct("bb", 0, 0, false, nil) ts.createProduct("cx", 0, 0, false, nil) + ts.createProduct("AB", 0, 0, false, nil) var posixRegexExpression badorm.Expression[string] switch getDBDialector() { - case configuration.SQLServer: + case configuration.SQLServer, configuration.MySQL: log.Println("PosixRegex not compatible") - case configuration.MySQL: - posixRegexExpression = mysql.RegexP[string]("^a(b|x)") case configuration.PostgreSQL: posixRegexExpression = psql.POSIXMatch[string]("^a(b|x)") case configuration.SQLite: @@ -926,6 +925,37 @@ func (ts *ExpressionIntTestSuite) TestPosixRegex() { } } +func (ts *ExpressionIntTestSuite) TestPosixRegexCaseInsensitive() { + match1 := ts.createProduct("ab", 0, 0, false, nil) + match2 := ts.createProduct("ax", 0, 0, false, nil) + match3 := ts.createProduct("AB", 0, 0, false, nil) + + ts.createProduct("bb", 0, 0, false, nil) + ts.createProduct("cx", 0, 0, false, nil) + + var posixRegexExpression badorm.Expression[string] + + switch getDBDialector() { + case configuration.SQLServer, configuration.SQLite: + log.Println("PosixRegex Case Insensitive not compatible") + case configuration.MySQL: + posixRegexExpression = mysql.RegexP[string]("^a(b|x)") + case configuration.PostgreSQL: + posixRegexExpression = psql.POSIXIMatch[string]("^a(b|x)") + } + + if posixRegexExpression != nil { + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + posixRegexExpression, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) + } +} + func (ts *ExpressionIntTestSuite) TestPosixRegexNotPosix() { var posixRegexExpression badorm.Expression[string] From 19c8fd5f877ba501e9a4f20cd8b8a2f24dbbe9cf Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 11:26:26 +0200 Subject: [PATCH 379/467] remove unused code --- badorm/expression.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/badorm/expression.go b/badorm/expression.go index 4ec1286f..4ebe488b 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -89,12 +89,6 @@ func NewMustBePOSIXValueExpression[T string | sql.NullString](pattern string, sq return NewValueExpression[T](pattern, sqlExpression) } -func NewMultiExpressionExpression[T any](exprsAndValues ...SQLExpressionAndValue) ValueExpression[T] { - return ValueExpression[T]{ - ExpressionsAndValues: exprsAndValues, - } -} - func (expr *ValueExpression[T]) AddSQLExpression(value any, sqlExpression string) ValueExpression[T] { expr.ExpressionsAndValues = append( expr.ExpressionsAndValues, From 2d61a7762542800df6386710593e5e3e492a69d1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 17:02:04 +0200 Subject: [PATCH 380/467] add possibility to do preload --- badorm/condition.go | 103 ++++++++-- badorm/crudRepository.go | 2 +- testintegration/asserts.go | 2 +- testintegration/badorm_test.go | 1 + .../conditions/child_conditions.go | 62 ++++++ .../conditions/parent1_conditions.go | 48 +++++ .../conditions/parent2_conditions.go | 48 +++++ .../conditions/parent_parent_conditions.go | 34 ++++ testintegration/conditions/sale_conditions.go | 3 + testintegration/db_models.go | 4 + testintegration/join_conditions_test.go | 179 +++++++++++++++++- testintegration/models/models.go | 44 +++++ 12 files changed, 511 insertions(+), 19 deletions(-) create mode 100644 testintegration/conditions/child_conditions.go create mode 100644 testintegration/conditions/parent1_conditions.go create mode 100644 testintegration/conditions/parent2_conditions.go create mode 100644 testintegration/conditions/parent_parent_conditions.go diff --git a/badorm/condition.go b/badorm/condition.go index 68b6becf..2a08deed 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -136,6 +136,65 @@ func NewConnectionCondition[T any](connector string, conditions ...WhereConditio } } +// TODO usar tambien en las conditions +// poner en variables y reutilizar +type ColumnIdentifier struct { + Column string + Field string + ColumnPrefix string +} + +func (columnID ColumnIdentifier) ColumnName(db *gorm.DB, tableName string) string { + // TODO codigo repetido + columnName := columnID.Column + if columnName == "" { + columnName = db.NamingStrategy.ColumnName(tableName, columnID.Field) + } + + // add column prefix and table name once we know the column name + return columnID.ColumnPrefix + columnName +} + +// TODO doc +type PreloadCondition[T any] struct { + Columns []ColumnIdentifier +} + +//nolint:unused // see inside +func (condition PreloadCondition[T]) interfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} + +func (condition PreloadCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { + for _, columnID := range condition.Columns { + columnName := columnID.ColumnName(query, tableName) + + // Remove first table name as GORM only adds it from the second join + _, attributePrefix, _ := strings.Cut(tableName, "__") + + query.Statement.Selects = append( + query.Statement.Selects, + fmt.Sprintf( + "%[1]s.%[2]s AS \"%[3]s__%[2]s\"", // name used by gorm to load the fields inside the models + tableName, + // TODO testear los casos raros de prefix, column, embedded y eso + columnName, + attributePrefix, + ), + ) + } + + return query, nil +} + +// TODO doc +func NewPreloadCondition[T any](columns ...ColumnIdentifier) PreloadCondition[T] { + return PreloadCondition[T]{ + Columns: columns, + } +} + // Condition that verifies the value of a field, // using the Expression type FieldCondition[TObject any, TAtribute any] struct { @@ -179,6 +238,7 @@ func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { } func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { + // TODO codigo repetido columnName := condition.Column if columnName == "" { columnName = query.NamingStrategy.ColumnName(tableName, condition.Field) @@ -192,9 +252,10 @@ func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table // Condition that joins with other table type JoinCondition[T1 any, T2 any] struct { - T1Field string - T2Field string - Conditions []Condition[T2] + T1Field string + T2Field string + ConnectionField string + Conditions []Condition[T2] } //nolint:unused // see inside @@ -215,17 +276,17 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // add a suffix to avoid tables with the same name when joining // the same table more than once - nextTableName := toBeJoinedTableName + "_" + previousTableName + nextTableAlias := previousTableName + "__" + condition.ConnectionField // get the sql to do the join with T2 - joinQuery := condition.getSQLJoin(query, toBeJoinedTableName, nextTableName, previousTableName) + joinQuery := condition.getSQLJoin(query, toBeJoinedTableName, nextTableAlias, previousTableName) - whereConditions, joinConditions := divideConditionsByType(condition.Conditions) + whereConditions, joinConditions, preloadCondition := divideConditionsByType(condition.Conditions) // apply WhereConditions to join in "on" clause connectionCondition := And(whereConditions...) - onQuery, onValues, err := connectionCondition.GetSQL(query, nextTableName) + onQuery, onValues, err := connectionCondition.GetSQL(query, nextTableAlias) if err != nil { return nil, err } @@ -237,16 +298,21 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName if !connectionCondition.affectsDeletedAt() { joinQuery += fmt.Sprintf( " AND %s.deleted_at IS NULL", - nextTableName, + nextTableAlias, ) } // add the join to the query query = query.Joins(joinQuery, onValues...) + query, err = preloadCondition.ApplyTo(query, nextTableAlias) + if err != nil { + return nil, err + } + // apply nested joins for _, joinCondition := range joinConditions { - query, err = joinCondition.ApplyTo(query, nextTableName) + query, err = joinCondition.ApplyTo(query, nextTableAlias) if err != nil { return nil, err } @@ -258,13 +324,13 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // Returns the SQL string to do a join between T1 and T2 // taking into account that the ID attribute necessary to do it // can be either in T1's or T2's table. -func (condition JoinCondition[T1, T2]) getSQLJoin(query *gorm.DB, toBeJoinedTableName, nextTableName, previousTableName string) string { +func (condition JoinCondition[T1, T2]) getSQLJoin(query *gorm.DB, toBeJoinedTableName, nextTableAlias, previousTableName string) string { return fmt.Sprintf( `JOIN %[1]s %[2]s ON %[2]s.%[3]s = %[4]s.%[5]s `, toBeJoinedTableName, - nextTableName, - query.NamingStrategy.ColumnName(nextTableName, condition.T2Field), + nextTableAlias, + query.NamingStrategy.ColumnName(nextTableAlias, condition.T2Field), previousTableName, query.NamingStrategy.ColumnName(previousTableName, condition.T1Field), ) @@ -273,13 +339,18 @@ func (condition JoinCondition[T1, T2]) getSQLJoin(query *gorm.DB, toBeJoinedTabl // Divides a list of conditions by its type: WhereConditions and JoinConditions func divideConditionsByType[T any]( conditions []Condition[T], -) (thisEntityConditions []WhereCondition[T], joinConditions []Condition[T]) { +) (whereConditions []WhereCondition[T], joinConditions []Condition[T], preloadCondition PreloadCondition[T]) { for _, condition := range conditions { - typedCondition, ok := condition.(WhereCondition[T]) + whereCondition, ok := condition.(WhereCondition[T]) if ok { - thisEntityConditions = append(thisEntityConditions, typedCondition) + whereConditions = append(whereConditions, whereCondition) } else { - joinConditions = append(joinConditions, condition) + possiblePreloadCondition, ok := condition.(PreloadCondition[T]) + if ok { + preloadCondition = possiblePreloadCondition + } else { + joinConditions = append(joinConditions, condition) + } } } diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 1c8ac157..15f940f7 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -90,7 +90,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions return nil, err } - query := tx + query := tx.Select(initialTableName + ".*") for _, condition := range conditions { query, err = condition.ApplyTo(query, initialTableName) if err != nil { diff --git a/testintegration/asserts.go b/testintegration/asserts.go index b49a554f..dfb50802 100644 --- a/testintegration/asserts.go +++ b/testintegration/asserts.go @@ -28,7 +28,7 @@ func EqualList[T any](ts *suite.Suite, expectedList, actualList []T) { } if j == expectedLen { - ts.Fail("Lists not equal", "element %v not in list %v", expectedList[i], actualList) + ts.FailNow("Lists not equal", "element %v not in list %v", expectedList[i], actualList) for _, element := range actualList { log.Println(element) diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index db07a0ed..2ea7918c 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -54,6 +54,7 @@ func TestBaDORM(t *testing.T) { badorm.GetCRUDServiceModule[models.Bicycle](), badorm.GetCRUDServiceModule[models.Phone](), badorm.GetCRUDServiceModule[models.Brand](), + badorm.GetCRUDServiceModule[models.Child](), badorm.GetCRUDUnsafeServiceModule[models.Company](), badorm.GetCRUDUnsafeServiceModule[models.Seller](), diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go new file mode 100644 index 00000000..a98dd38c --- /dev/null +++ b/testintegration/conditions/child_conditions.go @@ -0,0 +1,62 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + gorm "gorm.io/gorm" + "time" +) + +func ChildId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { + return badorm.FieldCondition[models.Child, badorm.UUID]{ + Expression: expr, + Field: "ID", + } +} +func ChildCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Child] { + return badorm.FieldCondition[models.Child, time.Time]{ + Expression: expr, + Field: "CreatedAt", + } +} +func ChildUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Child] { + return badorm.FieldCondition[models.Child, time.Time]{ + Expression: expr, + Field: "UpdatedAt", + } +} +func ChildDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Child] { + return badorm.FieldCondition[models.Child, gorm.DeletedAt]{ + Expression: expr, + Field: "DeletedAt", + } +} +func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.Condition[models.Child] { + return badorm.JoinCondition[models.Child, models.Parent1]{ + Conditions: conditions, + ConnectionField: "Parent1", + T1Field: "Parent1ID", + T2Field: "ID", + } +} +func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { + return badorm.FieldCondition[models.Child, badorm.UUID]{ + Expression: expr, + Field: "Parent1ID", + } +} +func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.Condition[models.Child] { + return badorm.JoinCondition[models.Child, models.Parent2]{ + Conditions: conditions, + ConnectionField: "Parent2", + T1Field: "Parent2ID", + T2Field: "ID", + } +} +func ChildParent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { + return badorm.FieldCondition[models.Child, badorm.UUID]{ + Expression: expr, + Field: "Parent2ID", + } +} diff --git a/testintegration/conditions/parent1_conditions.go b/testintegration/conditions/parent1_conditions.go new file mode 100644 index 00000000..16f4ec75 --- /dev/null +++ b/testintegration/conditions/parent1_conditions.go @@ -0,0 +1,48 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + gorm "gorm.io/gorm" + "time" +) + +func Parent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { + return badorm.FieldCondition[models.Parent1, badorm.UUID]{ + Expression: expr, + Field: "ID", + } +} +func Parent1CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent1] { + return badorm.FieldCondition[models.Parent1, time.Time]{ + Expression: expr, + Field: "CreatedAt", + } +} +func Parent1UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent1] { + return badorm.FieldCondition[models.Parent1, time.Time]{ + Expression: expr, + Field: "UpdatedAt", + } +} +func Parent1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Parent1] { + return badorm.FieldCondition[models.Parent1, gorm.DeletedAt]{ + Expression: expr, + Field: "DeletedAt", + } +} +func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.Condition[models.Parent1] { + return badorm.JoinCondition[models.Parent1, models.ParentParent]{ + Conditions: conditions, + ConnectionField: "ParentParent", + T1Field: "ParentParentID", + T2Field: "ID", + } +} +func Parent1ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { + return badorm.FieldCondition[models.Parent1, badorm.UUID]{ + Expression: expr, + Field: "ParentParentID", + } +} diff --git a/testintegration/conditions/parent2_conditions.go b/testintegration/conditions/parent2_conditions.go new file mode 100644 index 00000000..1034166e --- /dev/null +++ b/testintegration/conditions/parent2_conditions.go @@ -0,0 +1,48 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + gorm "gorm.io/gorm" + "time" +) + +func Parent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { + return badorm.FieldCondition[models.Parent2, badorm.UUID]{ + Expression: expr, + Field: "ID", + } +} +func Parent2CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent2] { + return badorm.FieldCondition[models.Parent2, time.Time]{ + Expression: expr, + Field: "CreatedAt", + } +} +func Parent2UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent2] { + return badorm.FieldCondition[models.Parent2, time.Time]{ + Expression: expr, + Field: "UpdatedAt", + } +} +func Parent2DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Parent2] { + return badorm.FieldCondition[models.Parent2, gorm.DeletedAt]{ + Expression: expr, + Field: "DeletedAt", + } +} +func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.Condition[models.Parent2] { + return badorm.JoinCondition[models.Parent2, models.ParentParent]{ + Conditions: conditions, + ConnectionField: "ParentParent", + T1Field: "ParentParentID", + T2Field: "ID", + } +} +func Parent2ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { + return badorm.FieldCondition[models.Parent2, badorm.UUID]{ + Expression: expr, + Field: "ParentParentID", + } +} diff --git a/testintegration/conditions/parent_parent_conditions.go b/testintegration/conditions/parent_parent_conditions.go new file mode 100644 index 00000000..2aca66d6 --- /dev/null +++ b/testintegration/conditions/parent_parent_conditions.go @@ -0,0 +1,34 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + gorm "gorm.io/gorm" + "time" +) + +func ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.ParentParent] { + return badorm.FieldCondition[models.ParentParent, badorm.UUID]{ + Expression: expr, + Field: "ID", + } +} +func ParentParentCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.ParentParent] { + return badorm.FieldCondition[models.ParentParent, time.Time]{ + Expression: expr, + Field: "CreatedAt", + } +} +func ParentParentUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.ParentParent] { + return badorm.FieldCondition[models.ParentParent, time.Time]{ + Expression: expr, + Field: "UpdatedAt", + } +} +func ParentParentDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.ParentParent] { + return badorm.FieldCondition[models.ParentParent, gorm.DeletedAt]{ + Expression: expr, + Field: "DeletedAt", + } +} diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 13f75fe8..414fe79b 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -47,6 +47,8 @@ func SaleDescription(expr badorm.Expression[string]) badorm.WhereCondition[model func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Condition[models.Sale] { return badorm.JoinCondition[models.Sale, models.Product]{ Conditions: conditions, + // TODO agregar a todos + ConnectionField: "Product", T1Field: "ProductID", T2Field: "ID", } @@ -60,6 +62,7 @@ func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[mo func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[models.Sale] { return badorm.JoinCondition[models.Sale, models.Seller]{ Conditions: conditions, + ConnectionField: "Seller", T1Field: "SellerID", T2Field: "ID", } diff --git a/testintegration/db_models.go b/testintegration/db_models.go index d40d05f0..4bb0447c 100644 --- a/testintegration/db_models.go +++ b/testintegration/db_models.go @@ -22,6 +22,10 @@ var ListOfTables = []any{ models.Bicycle{}, models.Brand{}, models.Phone{}, + models.ParentParent{}, + models.Parent1{}, + models.Parent2{}, + models.Child{}, } func GetModels() badorm.GetModelsResult { diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 96f4f78e..db199251 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -2,6 +2,7 @@ package testintegration import ( "gorm.io/gorm" + "gotest.tools/assert" "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/conditions" @@ -17,6 +18,7 @@ type JoinConditionsIntTestSuite struct { crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID] crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID] crudPhoneService badorm.CRUDService[models.Phone, uint] + crudChildService badorm.CRUDService[models.Child, badorm.UUID] } func NewJoinConditionsIntTestSuite( @@ -28,6 +30,7 @@ func NewJoinConditionsIntTestSuite( crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID], crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID], crudPhoneService badorm.CRUDService[models.Phone, uint], + crudChildService badorm.CRUDService[models.Child, badorm.UUID], ) *JoinConditionsIntTestSuite { return &JoinConditionsIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ @@ -40,6 +43,7 @@ func NewJoinConditionsIntTestSuite( crudEmployeeService: crudEmployeeService, crudBicycleService: crudBicycleService, crudPhoneService: crudPhoneService, + crudChildService: crudChildService, } } @@ -370,7 +374,7 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithUnsafeCondition() { entities, err := ts.crudSaleService.GetEntities( conditions.SaleSeller( conditions.SellerCompany( - badorm.NewUnsafeCondition[models.Company]("%s.name = sellers_sales.name", []any{}), + badorm.NewUnsafeCondition[models.Company]("%s.name = sales__Seller.name", []any{}), ), ), ) @@ -404,3 +408,176 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesN ) ts.ErrorIs(err, badorm.ErrEmptyConditions) } + +// TODO que se genere automaticamente +var ProductPreload = badorm.NewPreloadCondition[models.Product]( + badorm.ColumnIdentifier{Field: "ID"}, + badorm.ColumnIdentifier{Field: "CreatedAt"}, + badorm.ColumnIdentifier{Field: "UpdatedAt"}, + badorm.ColumnIdentifier{Field: "DeletedAt"}, + badorm.ColumnIdentifier{Column: "string_something_else"}, + badorm.ColumnIdentifier{Field: "Int"}, + badorm.ColumnIdentifier{Field: "IntPointer"}, + badorm.ColumnIdentifier{Field: "Float"}, + badorm.ColumnIdentifier{Field: "NullFloat"}, + badorm.ColumnIdentifier{Field: "Bool"}, + badorm.ColumnIdentifier{Field: "NullBool"}, + badorm.ColumnIdentifier{Field: "ByteArray"}, + badorm.ColumnIdentifier{Field: "MultiString"}, + badorm.ColumnIdentifier{Field: "EmbeddedInt"}, + badorm.ColumnIdentifier{Field: "Int", ColumnPrefix: "gorm_embedded_"}, +) + +var SellerPreload = badorm.NewPreloadCondition[models.Seller]( + // TODO estos 4 que no se repitan todas las veces + badorm.ColumnIdentifier{Field: "ID"}, + badorm.ColumnIdentifier{Field: "CreatedAt"}, + badorm.ColumnIdentifier{Field: "UpdatedAt"}, + badorm.ColumnIdentifier{Field: "DeletedAt"}, + badorm.ColumnIdentifier{Field: "Name"}, + badorm.ColumnIdentifier{Field: "CompanyID"}, +) + +// TODO algo para poder hacer el preload completo? +var Parent1Preload = badorm.NewPreloadCondition[models.Parent1]( + badorm.ColumnIdentifier{Field: "ID"}, + badorm.ColumnIdentifier{Field: "CreatedAt"}, + badorm.ColumnIdentifier{Field: "UpdatedAt"}, + badorm.ColumnIdentifier{Field: "DeletedAt"}, + badorm.ColumnIdentifier{Field: "ParentParentID"}, +) + +var Parent2Preload = badorm.NewPreloadCondition[models.Parent2]( + badorm.ColumnIdentifier{Field: "ID"}, + badorm.ColumnIdentifier{Field: "CreatedAt"}, + badorm.ColumnIdentifier{Field: "UpdatedAt"}, + badorm.ColumnIdentifier{Field: "DeletedAt"}, + badorm.ColumnIdentifier{Field: "ParentParentID"}, +) + +var ParentParentPreload = badorm.NewPreloadCondition[models.ParentParent]( + badorm.ColumnIdentifier{Field: "ID"}, + badorm.ColumnIdentifier{Field: "CreatedAt"}, + badorm.ColumnIdentifier{Field: "UpdatedAt"}, + badorm.ColumnIdentifier{Field: "DeletedAt"}, +) + +func (ts *JoinConditionsIntTestSuite) TestJoinAndPreload() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + ProductPreload, + conditions.ProductInt(badorm.Eq(1)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) + assert.DeepEqual(ts.T(), *product1, entities[0].Product) +} + +func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadDifferentEntities() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + ts.createSale(0, product1, seller2) + ts.createSale(0, product2, seller1) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + ProductPreload, + conditions.ProductInt(badorm.Eq(1)), + ), + conditions.SaleSeller( + SellerPreload, + conditions.SellerName(badorm.Eq("franco")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) + assert.DeepEqual(ts.T(), *product1, entities[0].Product) + assert.DeepEqual(ts.T(), seller1, entities[0].Seller) +} + +func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreload() { + parentParent := &models.ParentParent{} + err := ts.db.Create(parentParent).Error + ts.Nil(err) + + parent1 := &models.Parent1{ParentParent: *parentParent} + err = ts.db.Create(parent1).Error + ts.Nil(err) + + parent2 := &models.Parent2{ParentParent: *parentParent} + err = ts.db.Create(parent2).Error + ts.Nil(err) + + child := &models.Child{Parent1: *parent1, Parent2: *parent2} + err = ts.db.Create(child).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildParent1( + Parent1Preload, + conditions.Parent1ParentParent( + ParentParentPreload, + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child}, entities) + assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) + assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent1.ParentParent) +} + +func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond() { + parentParent := &models.ParentParent{} + err := ts.db.Create(parentParent).Error + ts.Nil(err) + + parent1 := &models.Parent1{ParentParent: *parentParent} + err = ts.db.Create(parent1).Error + ts.Nil(err) + + parent2 := &models.Parent2{ParentParent: *parentParent} + err = ts.db.Create(parent2).Error + ts.Nil(err) + + child := &models.Child{Parent1: *parent1, Parent2: *parent2} + err = ts.db.Create(child).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildParent1( + Parent1Preload, + conditions.Parent1ParentParent( + ParentParentPreload, + ), + ), + conditions.ChildParent2( + Parent2Preload, + conditions.Parent2ParentParent( + ParentParentPreload, + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child}, entities) + assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) + assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) + assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent1.ParentParent) + assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent2.ParentParent) +} diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 893e3931..3f97a22b 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -182,3 +182,47 @@ type Phone struct { func (m Phone) Equal(other Phone) bool { return m.Name == other.Name } + +type ParentParent struct { + badorm.UUIDModel +} + +func (m ParentParent) Equal(other ParentParent) bool { + return m.ID == other.ID +} + +type Parent1 struct { + badorm.UUIDModel + + ParentParent ParentParent + ParentParentID badorm.UUID +} + +func (m Parent1) Equal(other Parent1) bool { + return m.ID == other.ID +} + +type Parent2 struct { + badorm.UUIDModel + + ParentParent ParentParent + ParentParentID badorm.UUID +} + +func (m Parent2) Equal(other Parent2) bool { + return m.ID == other.ID +} + +type Child struct { + badorm.UUIDModel + + Parent1 Parent1 + Parent1ID badorm.UUID + + Parent2 Parent2 + Parent2ID badorm.UUID +} + +func (m Child) Equal(other Child) bool { + return m.ID == other.ID +} From 216f5577d1048881c0f913a57a924a4aabf9efe1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 17:15:20 +0200 Subject: [PATCH 381/467] test that embedded also work with preload --- badorm/condition.go | 1 - testintegration/join_conditions_test.go | 10 +++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 2a08deed..2e6d73a9 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -178,7 +178,6 @@ func (condition PreloadCondition[T]) ApplyTo(query *gorm.DB, tableName string) ( fmt.Sprintf( "%[1]s.%[2]s AS \"%[3]s__%[2]s\"", // name used by gorm to load the fields inside the models tableName, - // TODO testear los casos raros de prefix, column, embedded y eso columnName, attributePrefix, ), diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index db199251..ebc8c23a 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -463,7 +463,12 @@ var ParentParentPreload = badorm.NewPreloadCondition[models.ParentParent]( ) func (ts *JoinConditionsIntTestSuite) TestJoinAndPreload() { - product1 := ts.createProduct("", 1, 0.0, false, nil) + product1 := ts.createProduct("a_string", 1, 0.0, false, nil) + product1.EmbeddedInt = 1 + product1.GormEmbedded.Int = 2 + err := ts.db.Save(product1).Error + ts.Nil(err) + product2 := ts.createProduct("", 2, 0.0, false, nil) match := ts.createSale(0, product1, nil) @@ -479,6 +484,9 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreload() { EqualList(&ts.Suite, []*models.Sale{match}, entities) assert.DeepEqual(ts.T(), *product1, entities[0].Product) + ts.Equal("a_string", entities[0].Product.String) + ts.Equal(1, entities[0].Product.EmbeddedInt) + ts.Equal(2, entities[0].Product.GormEmbedded.Int) } func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadDifferentEntities() { From f411c195fdd7cb9a5a5f502a6d7b34805a318503 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 20 Jun 2023 17:21:33 +0200 Subject: [PATCH 382/467] always add base model fields to preload conditions --- badorm/condition.go | 16 +++++++++++++++- testintegration/join_conditions_test.go | 25 +------------------------ 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 2e6d73a9..8e5d41c1 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -11,6 +11,13 @@ import ( const DeletedAtField = "DeletedAt" +var ( + IDColumnID = ColumnIdentifier{Field: "ID"} + CreatedAtColumnID = ColumnIdentifier{Field: "CreatedAt"} + UpdatedAtColumnID = ColumnIdentifier{Field: "UpdatedAt"} + DeletedAtColumnID = ColumnIdentifier{Field: DeletedAtField} +) + var ErrEmptyConditions = errors.New("condition must have at least one inner condition") type Condition[T any] interface { @@ -190,7 +197,14 @@ func (condition PreloadCondition[T]) ApplyTo(query *gorm.DB, tableName string) ( // TODO doc func NewPreloadCondition[T any](columns ...ColumnIdentifier) PreloadCondition[T] { return PreloadCondition[T]{ - Columns: columns, + Columns: append( + columns, + // base model fields + IDColumnID, + CreatedAtColumnID, + UpdatedAtColumnID, + DeletedAtColumnID, + ), } } diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index ebc8c23a..c751ab74 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -411,10 +411,6 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesN // TODO que se genere automaticamente var ProductPreload = badorm.NewPreloadCondition[models.Product]( - badorm.ColumnIdentifier{Field: "ID"}, - badorm.ColumnIdentifier{Field: "CreatedAt"}, - badorm.ColumnIdentifier{Field: "UpdatedAt"}, - badorm.ColumnIdentifier{Field: "DeletedAt"}, badorm.ColumnIdentifier{Column: "string_something_else"}, badorm.ColumnIdentifier{Field: "Int"}, badorm.ColumnIdentifier{Field: "IntPointer"}, @@ -429,38 +425,19 @@ var ProductPreload = badorm.NewPreloadCondition[models.Product]( ) var SellerPreload = badorm.NewPreloadCondition[models.Seller]( - // TODO estos 4 que no se repitan todas las veces - badorm.ColumnIdentifier{Field: "ID"}, - badorm.ColumnIdentifier{Field: "CreatedAt"}, - badorm.ColumnIdentifier{Field: "UpdatedAt"}, - badorm.ColumnIdentifier{Field: "DeletedAt"}, badorm.ColumnIdentifier{Field: "Name"}, badorm.ColumnIdentifier{Field: "CompanyID"}, ) // TODO algo para poder hacer el preload completo? var Parent1Preload = badorm.NewPreloadCondition[models.Parent1]( - badorm.ColumnIdentifier{Field: "ID"}, - badorm.ColumnIdentifier{Field: "CreatedAt"}, - badorm.ColumnIdentifier{Field: "UpdatedAt"}, - badorm.ColumnIdentifier{Field: "DeletedAt"}, badorm.ColumnIdentifier{Field: "ParentParentID"}, ) var Parent2Preload = badorm.NewPreloadCondition[models.Parent2]( - badorm.ColumnIdentifier{Field: "ID"}, - badorm.ColumnIdentifier{Field: "CreatedAt"}, - badorm.ColumnIdentifier{Field: "UpdatedAt"}, - badorm.ColumnIdentifier{Field: "DeletedAt"}, badorm.ColumnIdentifier{Field: "ParentParentID"}, ) - -var ParentParentPreload = badorm.NewPreloadCondition[models.ParentParent]( - badorm.ColumnIdentifier{Field: "ID"}, - badorm.ColumnIdentifier{Field: "CreatedAt"}, - badorm.ColumnIdentifier{Field: "UpdatedAt"}, - badorm.ColumnIdentifier{Field: "DeletedAt"}, -) +var ParentParentPreload = badorm.NewPreloadCondition[models.ParentParent]() func (ts *JoinConditionsIntTestSuite) TestJoinAndPreload() { product1 := ts.createProduct("a_string", 1, 0.0, false, nil) From 9117ef0775501fbcffa11dcadc9907a6fd89529a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 21 Jun 2023 10:18:12 +0200 Subject: [PATCH 383/467] left join if we only want to do the preload --- badorm/condition.go | 43 +++++++--- .../conditions/parent_parent_conditions.go | 6 ++ testintegration/join_conditions_test.go | 82 ++++++++++++++++++- testintegration/models/models.go | 2 + 4 files changed, 121 insertions(+), 12 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 8e5d41c1..d30436f1 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -291,9 +291,6 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // the same table more than once nextTableAlias := previousTableName + "__" + condition.ConnectionField - // get the sql to do the join with T2 - joinQuery := condition.getSQLJoin(query, toBeJoinedTableName, nextTableAlias, previousTableName) - whereConditions, joinConditions, preloadCondition := divideConditionsByType(condition.Conditions) // apply WhereConditions to join in "on" clause @@ -304,6 +301,19 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName return nil, err } + // get the sql to do the join with T2 + // if it's only a preload use a left join + // TODO una condicion para ver que la relacion sea null (ademas de hacerle is null al fk) + // TODO no me termina de convencer que para el preload hay que hacer el join si o si + isLeftJoin := len(whereConditions) == 0 && preloadCondition != nil + joinQuery := condition.getSQLJoin( + query, + toBeJoinedTableName, + nextTableAlias, + previousTableName, + isLeftJoin, + ) + if onQuery != "" { joinQuery += " AND " + onQuery } @@ -318,9 +328,12 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // add the join to the query query = query.Joins(joinQuery, onValues...) - query, err = preloadCondition.ApplyTo(query, nextTableAlias) - if err != nil { - return nil, err + // apply preload condition + if preloadCondition != nil { + query, err = preloadCondition.ApplyTo(query, nextTableAlias) + if err != nil { + return nil, err + } } // apply nested joins @@ -337,22 +350,32 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // Returns the SQL string to do a join between T1 and T2 // taking into account that the ID attribute necessary to do it // can be either in T1's or T2's table. -func (condition JoinCondition[T1, T2]) getSQLJoin(query *gorm.DB, toBeJoinedTableName, nextTableAlias, previousTableName string) string { +func (condition JoinCondition[T1, T2]) getSQLJoin( + query *gorm.DB, + toBeJoinedTableName, nextTableAlias, previousTableName string, + isLeftJoin bool, +) string { + joinString := "INNER JOIN" + if isLeftJoin { + joinString = "LEFT JOIN" + } + return fmt.Sprintf( - `JOIN %[1]s %[2]s ON %[2]s.%[3]s = %[4]s.%[5]s + `%[6]s %[1]s %[2]s ON %[2]s.%[3]s = %[4]s.%[5]s `, toBeJoinedTableName, nextTableAlias, query.NamingStrategy.ColumnName(nextTableAlias, condition.T2Field), previousTableName, query.NamingStrategy.ColumnName(previousTableName, condition.T1Field), + joinString, ) } // Divides a list of conditions by its type: WhereConditions and JoinConditions func divideConditionsByType[T any]( conditions []Condition[T], -) (whereConditions []WhereCondition[T], joinConditions []Condition[T], preloadCondition PreloadCondition[T]) { +) (whereConditions []WhereCondition[T], joinConditions []Condition[T], preloadCondition *PreloadCondition[T]) { for _, condition := range conditions { whereCondition, ok := condition.(WhereCondition[T]) if ok { @@ -360,7 +383,7 @@ func divideConditionsByType[T any]( } else { possiblePreloadCondition, ok := condition.(PreloadCondition[T]) if ok { - preloadCondition = possiblePreloadCondition + preloadCondition = &possiblePreloadCondition } else { joinConditions = append(joinConditions, condition) } diff --git a/testintegration/conditions/parent_parent_conditions.go b/testintegration/conditions/parent_parent_conditions.go index 2aca66d6..eee322b2 100644 --- a/testintegration/conditions/parent_parent_conditions.go +++ b/testintegration/conditions/parent_parent_conditions.go @@ -32,3 +32,9 @@ func ParentParentDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereC Field: "DeletedAt", } } +func ParentParentName(expr badorm.Expression[string]) badorm.WhereCondition[models.ParentParent] { + return badorm.FieldCondition[models.ParentParent, string]{ + Expression: expr, + Field: "Name", + } +} diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index c751ab74..19c902ec 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -4,6 +4,8 @@ import ( "gorm.io/gorm" "gotest.tools/assert" + "github.com/elliotchance/pie/v2" + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" @@ -439,7 +441,32 @@ var Parent2Preload = badorm.NewPreloadCondition[models.Parent2]( ) var ParentParentPreload = badorm.NewPreloadCondition[models.ParentParent]() -func (ts *JoinConditionsIntTestSuite) TestJoinAndPreload() { +func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithoutWhereConditionDoesNotFilter() { + product1 := ts.createProduct("a_string", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + + withSeller := ts.createSale(0, product1, seller1) + withoutSeller := ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSeller( + SellerPreload, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{withSeller, withoutSeller}, entities) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + return sale.Seller.Equal(*seller1) + })) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + return sale.Seller == nil + })) +} + +func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithWhereConditionFilters() { product1 := ts.createProduct("a_string", 1, 0.0, false, nil) product1.EmbeddedInt = 1 product1.GormEmbedded.Int = 2 @@ -495,7 +522,7 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadDifferentEntities() { assert.DeepEqual(ts.T(), seller1, entities[0].Seller) } -func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreload() { +func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithoutCondition() { parentParent := &models.ParentParent{} err := ts.db.Create(parentParent).Error ts.Nil(err) @@ -527,6 +554,57 @@ func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreload() { assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent1.ParentParent) } +func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithCondition() { + parentParent1 := &models.ParentParent{ + Name: "parentParent1", + } + err := ts.db.Create(parentParent1).Error + ts.Nil(err) + + parent11 := &models.Parent1{ParentParent: *parentParent1} + err = ts.db.Create(parent11).Error + ts.Nil(err) + + parent21 := &models.Parent2{ParentParent: *parentParent1} + err = ts.db.Create(parent21).Error + ts.Nil(err) + + child1 := &models.Child{Parent1: *parent11, Parent2: *parent21} + err = ts.db.Create(child1).Error + ts.Nil(err) + + parentParent2 := &models.ParentParent{} + err = ts.db.Create(parentParent2).Error + ts.Nil(err) + + parent12 := &models.Parent1{ParentParent: *parentParent2} + err = ts.db.Create(parent12).Error + ts.Nil(err) + + parent22 := &models.Parent2{ParentParent: *parentParent2} + err = ts.db.Create(parent22).Error + ts.Nil(err) + + child2 := &models.Child{Parent1: *parent12, Parent2: *parent22} + err = ts.db.Create(child2).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildParent1( + Parent1Preload, + conditions.Parent1ParentParent( + ParentParentPreload, + conditions.ParentParentName(badorm.Eq("parentParent1")), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child1}, entities) + assert.DeepEqual(ts.T(), *parent11, entities[0].Parent1) + assert.DeepEqual(ts.T(), *parentParent1, entities[0].Parent1.ParentParent) +} + func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond() { parentParent := &models.ParentParent{} err := ts.db.Create(parentParent).Error diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 3f97a22b..df5a6602 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -185,6 +185,8 @@ func (m Phone) Equal(other Phone) bool { type ParentParent struct { badorm.UUIDModel + + Name string } func (m ParentParent) Equal(other ParentParent) bool { From b8d9b6ac65d54050e7c667a14456f88ebc88a90d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 21 Jun 2023 10:35:52 +0200 Subject: [PATCH 384/467] add relation field to the condition auto generation --- badorm/condition.go | 10 +++++----- .../conditions/bicycle_conditions.go | 7 ++++--- testintegration/conditions/child_conditions.go | 16 ++++++++-------- .../conditions/company_conditions.go | 7 ++++--- .../conditions/country_conditions.go | 14 ++++++++------ .../conditions/employee_conditions.go | 7 ++++--- .../conditions/parent1_conditions.go | 8 ++++---- .../conditions/parent2_conditions.go | 8 ++++---- testintegration/conditions/phone_conditions.go | 7 ++++--- testintegration/conditions/sale_conditions.go | 17 ++++++++--------- tools/badctl/cmd/gen/conditions/condition.go | 7 ++++--- .../conditions/tests/results/belongsto_owned.go | 7 ++++--- .../conditions/tests/results/hasmany_company.go | 7 ++++--- .../conditions/tests/results/hasone_country.go | 14 ++++++++------ .../tests/results/multiplepackage_package1.go | 14 ++++++++------ .../tests/results/overrideforeignkey.go | 7 ++++--- .../tests/results/overrideforeignkeyinverse.go | 14 ++++++++------ .../tests/results/overridereferences.go | 7 ++++--- .../tests/results/overridereferencesinverse.go | 14 ++++++++------ .../conditions/tests/results/selfreferential.go | 7 ++++--- 20 files changed, 109 insertions(+), 90 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index d30436f1..cde2da1a 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -265,10 +265,10 @@ func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table // Condition that joins with other table type JoinCondition[T1 any, T2 any] struct { - T1Field string - T2Field string - ConnectionField string - Conditions []Condition[T2] + T1Field string + T2Field string + RelationField string + Conditions []Condition[T2] } //nolint:unused // see inside @@ -289,7 +289,7 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // add a suffix to avoid tables with the same name when joining // the same table more than once - nextTableAlias := previousTableName + "__" + condition.ConnectionField + nextTableAlias := previousTableName + "__" + condition.RelationField whereConditions, joinConditions, preloadCondition := divideConditionsByType(condition.Conditions) diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index f9667f25..6259f3eb 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -40,9 +40,10 @@ func BicycleName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bi } func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Condition[models.Bicycle] { return badorm.JoinCondition[models.Bicycle, models.Person]{ - Conditions: conditions, - T1Field: "OwnerName", - T2Field: "Name", + Conditions: conditions, + RelationField: "Owner", + T1Field: "OwnerName", + T2Field: "Name", } } func BicycleOwnerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index a98dd38c..37ba2cce 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -34,10 +34,10 @@ func ChildDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio } func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.Condition[models.Child] { return badorm.JoinCondition[models.Child, models.Parent1]{ - Conditions: conditions, - ConnectionField: "Parent1", - T1Field: "Parent1ID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Parent1", + T1Field: "Parent1ID", + T2Field: "ID", } } func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { @@ -48,10 +48,10 @@ func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[m } func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.Condition[models.Child] { return badorm.JoinCondition[models.Child, models.Parent2]{ - Conditions: conditions, - ConnectionField: "Parent2", - T1Field: "Parent2ID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Parent2", + T1Field: "Parent2ID", + T2Field: "ID", } } func ChildParent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index 26dba2fd..5442210c 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -40,8 +40,9 @@ func CompanyName(expr badorm.Expression[string]) badorm.WhereCondition[models.Co } func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { return badorm.JoinCondition[models.Seller, models.Company]{ - Conditions: conditions, - T1Field: "CompanyID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Company", + T1Field: "CompanyID", + T2Field: "ID", } } diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index da99c890..2665e4bb 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -40,15 +40,17 @@ func CountryName(expr badorm.Expression[string]) badorm.WhereCondition[models.Co } func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.Condition[models.Country] { return badorm.JoinCondition[models.Country, models.City]{ - Conditions: conditions, - T1Field: "ID", - T2Field: "CountryID", + Conditions: conditions, + RelationField: "Capital", + T1Field: "ID", + T2Field: "CountryID", } } func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.Condition[models.City] { return badorm.JoinCondition[models.City, models.Country]{ - Conditions: conditions, - T1Field: "CountryID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Country", + T1Field: "CountryID", + T2Field: "ID", } } diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 884fd9f8..99606e5d 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -40,9 +40,10 @@ func EmployeeName(expr badorm.Expression[string]) badorm.WhereCondition[models.E } func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condition[models.Employee] { return badorm.JoinCondition[models.Employee, models.Employee]{ - Conditions: conditions, - T1Field: "BossID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Boss", + T1Field: "BossID", + T2Field: "ID", } } func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { diff --git a/testintegration/conditions/parent1_conditions.go b/testintegration/conditions/parent1_conditions.go index 16f4ec75..f3e87559 100644 --- a/testintegration/conditions/parent1_conditions.go +++ b/testintegration/conditions/parent1_conditions.go @@ -34,10 +34,10 @@ func Parent1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.Condition[models.Parent1] { return badorm.JoinCondition[models.Parent1, models.ParentParent]{ - Conditions: conditions, - ConnectionField: "ParentParent", - T1Field: "ParentParentID", - T2Field: "ID", + Conditions: conditions, + RelationField: "ParentParent", + T1Field: "ParentParentID", + T2Field: "ID", } } func Parent1ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { diff --git a/testintegration/conditions/parent2_conditions.go b/testintegration/conditions/parent2_conditions.go index 1034166e..2755cbbf 100644 --- a/testintegration/conditions/parent2_conditions.go +++ b/testintegration/conditions/parent2_conditions.go @@ -34,10 +34,10 @@ func Parent2DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.Condition[models.Parent2] { return badorm.JoinCondition[models.Parent2, models.ParentParent]{ - Conditions: conditions, - ConnectionField: "ParentParent", - T1Field: "ParentParentID", - T2Field: "ID", + Conditions: conditions, + RelationField: "ParentParent", + T1Field: "ParentParentID", + T2Field: "ID", } } func Parent2ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index 27c586e0..cc6ba663 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -40,9 +40,10 @@ func PhoneName(expr badorm.Expression[string]) badorm.WhereCondition[models.Phon } func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[models.Phone] { return badorm.JoinCondition[models.Phone, models.Brand]{ - Conditions: conditions, - T1Field: "BrandID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Brand", + T1Field: "BrandID", + T2Field: "ID", } } func PhoneBrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 414fe79b..6d4887f6 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -46,11 +46,10 @@ func SaleDescription(expr badorm.Expression[string]) badorm.WhereCondition[model } func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Condition[models.Sale] { return badorm.JoinCondition[models.Sale, models.Product]{ - Conditions: conditions, - // TODO agregar a todos - ConnectionField: "Product", - T1Field: "ProductID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Product", + T1Field: "ProductID", + T2Field: "ID", } } func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { @@ -61,10 +60,10 @@ func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[mo } func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[models.Sale] { return badorm.JoinCondition[models.Sale, models.Seller]{ - Conditions: conditions, - ConnectionField: "Seller", - T1Field: "SellerID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Seller", + T1Field: "SellerID", + T2Field: "ID", } } func SaleSellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index ccb58e62..46d3496b 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -278,9 +278,10 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, ).Block( jen.Return( badormJoinCondition.Values(jen.Dict{ - jen.Id("T1Field"): jen.Lit(t1Field), - jen.Id("T2Field"): jen.Lit(t2Field), - jen.Id("Conditions"): jen.Id("conditions"), + jen.Id("T1Field"): jen.Lit(t1Field), + jen.Id("T2Field"): jen.Lit(t2Field), + jen.Id("RelationField"): jen.Lit(field.Name), + jen.Id("Conditions"): jen.Id("conditions"), }), ), ), diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go index ca967751..fda7649e 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go @@ -34,9 +34,10 @@ func OwnedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio } func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Condition[belongsto.Owned] { return badorm.JoinCondition[belongsto.Owned, belongsto.Owner]{ - Conditions: conditions, - T1Field: "OwnerID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Owner", + T1Field: "OwnerID", + T2Field: "ID", } } func OwnedOwnerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go index 8b6c02e3..dea0f505 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go @@ -34,8 +34,9 @@ func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.Condition[hasmany.Seller] { return badorm.JoinCondition[hasmany.Seller, hasmany.Company]{ - Conditions: conditions, - T1Field: "CompanyID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Company", + T1Field: "CompanyID", + T2Field: "ID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go index 4952eadc..d91901f6 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go @@ -34,15 +34,17 @@ func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } func CountryCapital(conditions ...badorm.Condition[hasone.City]) badorm.Condition[hasone.Country] { return badorm.JoinCondition[hasone.Country, hasone.City]{ - Conditions: conditions, - T1Field: "ID", - T2Field: "CountryID", + Conditions: conditions, + RelationField: "Capital", + T1Field: "ID", + T2Field: "CountryID", } } func CityCountry(conditions ...badorm.Condition[hasone.Country]) badorm.Condition[hasone.City] { return badorm.JoinCondition[hasone.City, hasone.Country]{ - Conditions: conditions, - T1Field: "CountryID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Country", + T1Field: "CountryID", + T2Field: "ID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go index a6a48747..c9c7fda4 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go @@ -35,15 +35,17 @@ func Package1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondi } func Package1Package2(conditions ...badorm.Condition[package2.Package2]) badorm.Condition[package1.Package1] { return badorm.JoinCondition[package1.Package1, package2.Package2]{ - Conditions: conditions, - T1Field: "ID", - T2Field: "Package1ID", + Conditions: conditions, + RelationField: "Package2", + T1Field: "ID", + T2Field: "Package1ID", } } func Package2Package1(conditions ...badorm.Condition[package1.Package1]) badorm.Condition[package2.Package2] { return badorm.JoinCondition[package2.Package2, package1.Package1]{ - Conditions: conditions, - T1Field: "Package1ID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Package1", + T1Field: "Package1ID", + T2Field: "ID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go index 9292e407..aecf4cea 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go @@ -34,9 +34,10 @@ func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) badorm.Condition[overrideforeignkey.Bicycle] { return badorm.JoinCondition[overrideforeignkey.Bicycle, overrideforeignkey.Person]{ - Conditions: conditions, - T1Field: "OwnerSomethingID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Owner", + T1Field: "OwnerSomethingID", + T2Field: "ID", } } func BicycleOwnerSomethingId(expr badorm.Expression[string]) badorm.WhereCondition[overrideforeignkey.Bicycle] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go index 0d1edabd..20cd605c 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go @@ -34,15 +34,17 @@ func UserDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition } func UserCreditCard(conditions ...badorm.Condition[overrideforeignkeyinverse.CreditCard]) badorm.Condition[overrideforeignkeyinverse.User] { return badorm.JoinCondition[overrideforeignkeyinverse.User, overrideforeignkeyinverse.CreditCard]{ - Conditions: conditions, - T1Field: "ID", - T2Field: "UserReference", + Conditions: conditions, + RelationField: "CreditCard", + T1Field: "ID", + T2Field: "UserReference", } } func CreditCardUser(conditions ...badorm.Condition[overrideforeignkeyinverse.User]) badorm.Condition[overrideforeignkeyinverse.CreditCard] { return badorm.JoinCondition[overrideforeignkeyinverse.CreditCard, overrideforeignkeyinverse.User]{ - Conditions: conditions, - T1Field: "UserReference", - T2Field: "ID", + Conditions: conditions, + RelationField: "User", + T1Field: "UserReference", + T2Field: "ID", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go index c189dfde..2be1d577 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go @@ -34,9 +34,10 @@ func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio } func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm.Condition[overridereferences.Phone] { return badorm.JoinCondition[overridereferences.Phone, overridereferences.Brand]{ - Conditions: conditions, - T1Field: "BrandName", - T2Field: "Name", + Conditions: conditions, + RelationField: "Brand", + T1Field: "BrandName", + T2Field: "Name", } } func PhoneBrandName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferences.Phone] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go index 23d7777d..dcf9b0f2 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go @@ -40,15 +40,17 @@ func ComputerName(expr badorm.Expression[string]) badorm.WhereCondition[override } func ComputerProcessor(conditions ...badorm.Condition[overridereferencesinverse.Processor]) badorm.Condition[overridereferencesinverse.Computer] { return badorm.JoinCondition[overridereferencesinverse.Computer, overridereferencesinverse.Processor]{ - Conditions: conditions, - T1Field: "Name", - T2Field: "ComputerName", + Conditions: conditions, + RelationField: "Processor", + T1Field: "Name", + T2Field: "ComputerName", } } func ProcessorComputer(conditions ...badorm.Condition[overridereferencesinverse.Computer]) badorm.Condition[overridereferencesinverse.Processor] { return badorm.JoinCondition[overridereferencesinverse.Processor, overridereferencesinverse.Computer]{ - Conditions: conditions, - T1Field: "ComputerName", - T2Field: "Name", + Conditions: conditions, + RelationField: "Computer", + T1Field: "ComputerName", + T2Field: "Name", } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go index fac42e84..c242db92 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go @@ -34,9 +34,10 @@ func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondi } func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) badorm.Condition[selfreferential.Employee] { return badorm.JoinCondition[selfreferential.Employee, selfreferential.Employee]{ - Conditions: conditions, - T1Field: "BossID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Boss", + T1Field: "BossID", + T2Field: "ID", } } func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { From 10f2f7bb29aea745dacef1c9ab6752d68526fb8b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 21 Jun 2023 11:14:43 +0200 Subject: [PATCH 385/467] reuse field identifier in field conditions --- badorm/condition.go | 53 +++++------ persistence/models/User.go | 4 +- .../conditions/bicycle_conditions.go | 24 ++--- .../conditions/brand_conditions.go | 20 ++--- .../conditions/child_conditions.go | 24 ++--- testintegration/conditions/city_conditions.go | 24 ++--- .../conditions/company_conditions.go | 20 ++--- .../conditions/country_conditions.go | 20 ++--- .../conditions/employee_conditions.go | 24 ++--- .../conditions/parent1_conditions.go | 20 ++--- .../conditions/parent2_conditions.go | 20 ++--- .../conditions/parent_parent_conditions.go | 20 ++--- .../conditions/person_conditions.go | 20 ++--- .../conditions/phone_conditions.go | 24 ++--- .../conditions/product_conditions.go | 64 +++++++------- testintegration/conditions/sale_conditions.go | 32 +++---- .../conditions/seller_conditions.go | 24 ++--- testintegration/join_conditions_test.go | 30 +++---- tools/badctl/cmd/gen/conditions/condition.go | 55 ++++++++---- .../conditions/tests/results/basicpointers.go | 88 +++++++++---------- .../conditions/tests/results/basicslices.go | 88 +++++++++---------- .../tests/results/basicslicespointer.go | 88 +++++++++---------- .../conditions/tests/results/basictypes.go | 88 +++++++++---------- .../tests/results/belongsto_owned.go | 20 ++--- .../tests/results/belongsto_owner.go | 16 ++-- .../tests/results/columndefinition.go | 20 ++--- .../conditions/tests/results/customtype.go | 20 ++--- .../conditions/tests/results/goembedded.go | 20 ++--- .../conditions/tests/results/gormembedded.go | 24 ++--- .../tests/results/hasmany_company.go | 16 ++-- .../tests/results/hasmany_seller.go | 20 ++--- .../conditions/tests/results/hasone_city.go | 20 ++--- .../tests/results/hasone_country.go | 16 ++-- .../tests/results/multiplepackage_package1.go | 16 ++-- .../tests/results/overrideforeignkey.go | 20 ++--- .../results/overrideforeignkeyinverse.go | 16 ++-- .../tests/results/overridereferences.go | 20 ++--- .../results/overridereferencesinverse.go | 20 ++--- .../tests/results/selfreferential.go | 20 ++--- .../gen/conditions/tests/results/uintmodel.go | 16 ++-- .../gen/conditions/tests/results/uuidmodel.go | 16 ++-- 41 files changed, 613 insertions(+), 597 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index cde2da1a..2416a66f 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -12,10 +12,10 @@ import ( const DeletedAtField = "DeletedAt" var ( - IDColumnID = ColumnIdentifier{Field: "ID"} - CreatedAtColumnID = ColumnIdentifier{Field: "CreatedAt"} - UpdatedAtColumnID = ColumnIdentifier{Field: "UpdatedAt"} - DeletedAtColumnID = ColumnIdentifier{Field: DeletedAtField} + IDFieldID = FieldIdentifier{Field: "ID"} + CreatedAtFieldID = FieldIdentifier{Field: "CreatedAt"} + UpdatedAtFieldID = FieldIdentifier{Field: "UpdatedAt"} + DeletedAtFieldID = FieldIdentifier{Field: DeletedAtField} ) var ErrEmptyConditions = errors.New("condition must have at least one inner condition") @@ -143,16 +143,13 @@ func NewConnectionCondition[T any](connector string, conditions ...WhereConditio } } -// TODO usar tambien en las conditions -// poner en variables y reutilizar -type ColumnIdentifier struct { +type FieldIdentifier struct { Column string Field string ColumnPrefix string } -func (columnID ColumnIdentifier) ColumnName(db *gorm.DB, tableName string) string { - // TODO codigo repetido +func (columnID FieldIdentifier) ColumnName(db *gorm.DB, tableName string) string { columnName := columnID.Column if columnName == "" { columnName = db.NamingStrategy.ColumnName(tableName, columnID.Field) @@ -164,7 +161,7 @@ func (columnID ColumnIdentifier) ColumnName(db *gorm.DB, tableName string) strin // TODO doc type PreloadCondition[T any] struct { - Columns []ColumnIdentifier + Fields []FieldIdentifier } //nolint:unused // see inside @@ -174,8 +171,8 @@ func (condition PreloadCondition[T]) interfaceVerificationMethod(_ T) { } func (condition PreloadCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { - for _, columnID := range condition.Columns { - columnName := columnID.ColumnName(query, tableName) + for _, fieldID := range condition.Fields { + columnName := fieldID.ColumnName(query, tableName) // Remove first table name as GORM only adds it from the second join _, attributePrefix, _ := strings.Cut(tableName, "__") @@ -195,15 +192,15 @@ func (condition PreloadCondition[T]) ApplyTo(query *gorm.DB, tableName string) ( } // TODO doc -func NewPreloadCondition[T any](columns ...ColumnIdentifier) PreloadCondition[T] { +func NewPreloadCondition[T any](fields ...FieldIdentifier) PreloadCondition[T] { return PreloadCondition[T]{ - Columns: append( - columns, + Fields: append( + fields, // base model fields - IDColumnID, - CreatedAtColumnID, - UpdatedAtColumnID, - DeletedAtColumnID, + IDFieldID, + CreatedAtFieldID, + UpdatedAtFieldID, + DeletedAtFieldID, ), } } @@ -211,10 +208,8 @@ func NewPreloadCondition[T any](columns ...ColumnIdentifier) PreloadCondition[T] // Condition that verifies the value of a field, // using the Expression type FieldCondition[TObject any, TAtribute any] struct { - Field string - Column string - ColumnPrefix string - Expression Expression[TAtribute] + FieldIdentifier FieldIdentifier + Expression Expression[TAtribute] } //nolint:unused // see inside @@ -247,19 +242,11 @@ func applyWhereCondition[T any](condition WhereCondition[T], query *gorm.DB, tab //nolint:unused // is used func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { - return condition.Field == DeletedAtField + return condition.FieldIdentifier.Field == DeletedAtField } func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { - // TODO codigo repetido - columnName := condition.Column - if columnName == "" { - columnName = query.NamingStrategy.ColumnName(tableName, condition.Field) - } - - // add column prefix and table name once we know the column name - columnName = tableName + "." + condition.ColumnPrefix + columnName - + columnName := tableName + "." + condition.FieldIdentifier.ColumnName(query, tableName) return condition.Expression.ToSQL(columnName) } diff --git a/persistence/models/User.go b/persistence/models/User.go index d4a6bc54..124cd012 100644 --- a/persistence/models/User.go +++ b/persistence/models/User.go @@ -15,6 +15,8 @@ type User struct { func UserEmailCondition(expr badorm.Expression[string]) badorm.WhereCondition[User] { return badorm.FieldCondition[User, string]{ Expression: expr, - Field: "Email", + FieldIdentifier: badorm.FieldIdentifier{ + Field: "Email", + }, } } diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index 6259f3eb..f49fabe9 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -10,32 +10,32 @@ import ( func BicycleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func BicycleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func BicycleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func BicycleName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Condition[models.Bicycle] { @@ -48,7 +48,7 @@ func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Conditio } func BicycleOwnerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, string]{ - Expression: expr, - Field: "OwnerName", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "OwnerName"}, } } diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index af6c308f..de6cf1c9 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -10,31 +10,31 @@ import ( func BrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, uint]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func BrandCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func BrandUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func BrandDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index 37ba2cce..f261b3e0 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -10,26 +10,26 @@ import ( func ChildId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func ChildCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func ChildUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func ChildDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.Condition[models.Child] { @@ -42,8 +42,8 @@ func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.Conditi } func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ - Expression: expr, - Field: "Parent1ID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Parent1ID"}, } } func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.Condition[models.Child] { @@ -56,7 +56,7 @@ func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.Conditi } func ChildParent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ - Expression: expr, - Field: "Parent2ID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Parent2ID"}, } } diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index 39285987..f0e4956e 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -10,37 +10,37 @@ import ( func CityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func CityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func CityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func CityName(expr badorm.Expression[string]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, badorm.UUID]{ - Expression: expr, - Field: "CountryID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "CountryID"}, } } diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index 5442210c..4c74f89f 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -10,32 +10,32 @@ import ( func CompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func CompanyCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func CompanyUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func CompanyName(expr badorm.Expression[string]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index 2665e4bb..aa141917 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -10,32 +10,32 @@ import ( func CountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func CountryCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func CountryUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func CountryName(expr badorm.Expression[string]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.Condition[models.Country] { diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 99606e5d..9c3ddee1 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -10,32 +10,32 @@ import ( func EmployeeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func EmployeeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func EmployeeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func EmployeeName(expr badorm.Expression[string]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condition[models.Employee] { @@ -48,7 +48,7 @@ func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condit } func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, badorm.UUID]{ - Expression: expr, - Field: "BossID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "BossID"}, } } diff --git a/testintegration/conditions/parent1_conditions.go b/testintegration/conditions/parent1_conditions.go index f3e87559..24096c58 100644 --- a/testintegration/conditions/parent1_conditions.go +++ b/testintegration/conditions/parent1_conditions.go @@ -10,26 +10,26 @@ import ( func Parent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func Parent1CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func Parent1UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func Parent1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.Condition[models.Parent1] { @@ -42,7 +42,7 @@ func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) ba } func Parent1ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, badorm.UUID]{ - Expression: expr, - Field: "ParentParentID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "ParentParentID"}, } } diff --git a/testintegration/conditions/parent2_conditions.go b/testintegration/conditions/parent2_conditions.go index 2755cbbf..3415e252 100644 --- a/testintegration/conditions/parent2_conditions.go +++ b/testintegration/conditions/parent2_conditions.go @@ -10,26 +10,26 @@ import ( func Parent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func Parent2CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func Parent2UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func Parent2DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.Condition[models.Parent2] { @@ -42,7 +42,7 @@ func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) ba } func Parent2ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, badorm.UUID]{ - Expression: expr, - Field: "ParentParentID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "ParentParentID"}, } } diff --git a/testintegration/conditions/parent_parent_conditions.go b/testintegration/conditions/parent_parent_conditions.go index eee322b2..e630e138 100644 --- a/testintegration/conditions/parent_parent_conditions.go +++ b/testintegration/conditions/parent_parent_conditions.go @@ -10,31 +10,31 @@ import ( func ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func ParentParentCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func ParentParentUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func ParentParentDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func ParentParentName(expr badorm.Expression[string]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index eb63cdac..c534f2e7 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -10,31 +10,31 @@ import ( func PersonId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func PersonCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func PersonUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func PersonDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func PersonName(expr badorm.Expression[string]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index cc6ba663..c2a6da77 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -10,32 +10,32 @@ import ( func PhoneId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, uint]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func PhoneCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func PhoneUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func PhoneName(expr badorm.Expression[string]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[models.Phone] { @@ -48,7 +48,7 @@ func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[m } func PhoneBrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, uint]{ - Expression: expr, - Field: "BrandID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "BrandID"}, } } diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index 632be864..e9d45361 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -11,92 +11,94 @@ import ( func ProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func ProductCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func ProductUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func ProductDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func ProductString(expr badorm.Expression[string]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, string]{ - Column: "string_something_else", - Expression: expr, + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Column: "string_something_else"}, } } func ProductInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expression: expr, - Field: "Int", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int"}, } } func ProductIntPointer(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expression: expr, - Field: "IntPointer", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "IntPointer"}, } } func ProductFloat(expr badorm.Expression[float64]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, float64]{ - Expression: expr, - Field: "Float", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Float"}, } } func ProductNullFloat(expr badorm.Expression[sql.NullFloat64]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, sql.NullFloat64]{ - Expression: expr, - Field: "NullFloat", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "NullFloat"}, } } func ProductBool(expr badorm.Expression[bool]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, bool]{ - Expression: expr, - Field: "Bool", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Bool"}, } } func ProductNullBool(expr badorm.Expression[sql.NullBool]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, sql.NullBool]{ - Expression: expr, - Field: "NullBool", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "NullBool"}, } } func ProductByteArray(expr badorm.Expression[[]uint8]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, []uint8]{ - Expression: expr, - Field: "ByteArray", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "ByteArray"}, } } func ProductMultiString(expr badorm.Expression[models.MultiString]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, models.MultiString]{ - Expression: expr, - Field: "MultiString", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "MultiString"}, } } func ProductEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expression: expr, - Field: "EmbeddedInt", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "EmbeddedInt"}, } } func ProductGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - ColumnPrefix: "gorm_embedded_", - Expression: expr, - Field: "Int", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{ + ColumnPrefix: "gorm_embedded_", + Field: "Int", + }, } } diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 6d4887f6..68fe092e 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -10,38 +10,38 @@ import ( func SaleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func SaleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func SaleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func SaleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func SaleCode(expr badorm.Expression[int]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, int]{ - Expression: expr, - Field: "Code", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Code"}, } } func SaleDescription(expr badorm.Expression[string]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, string]{ - Expression: expr, - Field: "Description", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Description"}, } } func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Condition[models.Sale] { @@ -54,8 +54,8 @@ func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Conditio } func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ - Expression: expr, - Field: "ProductID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "ProductID"}, } } func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[models.Sale] { @@ -68,7 +68,7 @@ func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[ } func SaleSellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ - Expression: expr, - Field: "SellerID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "SellerID"}, } } diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 1cf69a97..35588824 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -10,37 +10,37 @@ import ( func SellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func SellerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func SellerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func SellerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ - Expression: expr, - Field: "CompanyID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "CompanyID"}, } } diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 19c902ec..20be6b4c 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -413,31 +413,31 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesN // TODO que se genere automaticamente var ProductPreload = badorm.NewPreloadCondition[models.Product]( - badorm.ColumnIdentifier{Column: "string_something_else"}, - badorm.ColumnIdentifier{Field: "Int"}, - badorm.ColumnIdentifier{Field: "IntPointer"}, - badorm.ColumnIdentifier{Field: "Float"}, - badorm.ColumnIdentifier{Field: "NullFloat"}, - badorm.ColumnIdentifier{Field: "Bool"}, - badorm.ColumnIdentifier{Field: "NullBool"}, - badorm.ColumnIdentifier{Field: "ByteArray"}, - badorm.ColumnIdentifier{Field: "MultiString"}, - badorm.ColumnIdentifier{Field: "EmbeddedInt"}, - badorm.ColumnIdentifier{Field: "Int", ColumnPrefix: "gorm_embedded_"}, + badorm.FieldIdentifier{Column: "string_something_else"}, + badorm.FieldIdentifier{Field: "Int"}, + badorm.FieldIdentifier{Field: "IntPointer"}, + badorm.FieldIdentifier{Field: "Float"}, + badorm.FieldIdentifier{Field: "NullFloat"}, + badorm.FieldIdentifier{Field: "Bool"}, + badorm.FieldIdentifier{Field: "NullBool"}, + badorm.FieldIdentifier{Field: "ByteArray"}, + badorm.FieldIdentifier{Field: "MultiString"}, + badorm.FieldIdentifier{Field: "EmbeddedInt"}, + badorm.FieldIdentifier{Field: "Int", ColumnPrefix: "gorm_embedded_"}, ) var SellerPreload = badorm.NewPreloadCondition[models.Seller]( - badorm.ColumnIdentifier{Field: "Name"}, - badorm.ColumnIdentifier{Field: "CompanyID"}, + badorm.FieldIdentifier{Field: "Name"}, + badorm.FieldIdentifier{Field: "CompanyID"}, ) // TODO algo para poder hacer el preload completo? var Parent1Preload = badorm.NewPreloadCondition[models.Parent1]( - badorm.ColumnIdentifier{Field: "ParentParentID"}, + badorm.FieldIdentifier{Field: "ParentParentID"}, ) var Parent2Preload = badorm.NewPreloadCondition[models.Parent2]( - badorm.ColumnIdentifier{Field: "ParentParentID"}, + badorm.FieldIdentifier{Field: "ParentParentID"}, ) var ParentParentPreload = badorm.NewPreloadCondition[models.ParentParent]() diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 46d3496b..81276622 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -11,14 +11,26 @@ import ( const ( // badorm/condition.go - badORMCondition = "Condition" - badORMFieldCondition = "FieldCondition" - badORMWhereCondition = "WhereCondition" - badORMJoinCondition = "JoinCondition" + badORMCondition = "Condition" + badORMFieldCondition = "FieldCondition" + badORMWhereCondition = "WhereCondition" + badORMJoinCondition = "JoinCondition" + badORMFieldIdentifier = "FieldIdentifier" + IDFieldID = "IDFieldID" + CreatedAtFieldID = "CreatedAtFieldID" + UpdatedAtFieldID = "UpdatedAtFieldID" + DeletedAtFieldID = "DeletedAtFieldID" // badorm/expression.go badORMExpression = "Expression" ) +var constantFieldIdentifiers = map[string]*jen.Statement{ + "ID": jen.Qual(badORMPath, IDFieldID), + "CreatedAt": jen.Qual(badORMPath, CreatedAtFieldID), + "UpdatedAt": jen.Qual(badORMPath, UpdatedAtFieldID), + "DeletedAt": jen.Qual(badORMPath, DeletedAtFieldID), +} + type Condition struct { codes []jen.Code param *JenParam @@ -173,20 +185,28 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { conditionName := getConditionName(objectType, field) log.Logger.Debugf("Generated %q", conditionName) - conditionValues := jen.Dict{ - jen.Id("Expression"): jen.Id("expr"), - } - columnName := field.getColumnName() + fieldIdentifier := jen.Qual( + badORMPath, badORMFieldIdentifier, + ) - if columnName != "" { - conditionValues[jen.Id("Column")] = jen.Lit(columnName) + if constantFieldIdentifier, ok := constantFieldIdentifiers[field.Name]; ok { + fieldIdentifier = constantFieldIdentifier } else { - conditionValues[jen.Id("Field")] = jen.Lit(field.Name) - } + fieldIdentifierValues := jen.Dict{} + columnName := field.getColumnName() - columnPrefix := field.ColumnPrefix - if columnPrefix != "" { - conditionValues[jen.Id("ColumnPrefix")] = jen.Lit(columnPrefix) + if columnName != "" { + fieldIdentifierValues[jen.Id("Column")] = jen.Lit(columnName) + } else { + fieldIdentifierValues[jen.Id("Field")] = jen.Lit(field.Name) + } + + columnPrefix := field.ColumnPrefix + if columnPrefix != "" { + fieldIdentifierValues[jen.Id("ColumnPrefix")] = jen.Lit(columnPrefix) + } + + fieldIdentifier = fieldIdentifier.Values(fieldIdentifierValues) } condition.codes = append( @@ -199,7 +219,10 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { whereCondition, ).Block( jen.Return( - fieldCondition.Clone().Values(conditionValues), + fieldCondition.Clone().Values(jen.Dict{ + jen.Id("Expression"): jen.Id("expr"), + jen.Id("FieldIdentifier"): fieldIdentifier, + }), ), ), ) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go index 8e7ccdfc..d9e4d9d7 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go @@ -10,133 +10,133 @@ import ( func BasicPointersId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func BasicPointersCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func BasicPointersUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func BasicPointersDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func BasicPointersBool(expr badorm.Expression[bool]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, bool]{ - Expression: expr, - Field: "Bool", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Bool"}, } } func BasicPointersInt(expr badorm.Expression[int]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int]{ - Expression: expr, - Field: "Int", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int"}, } } func BasicPointersInt8(expr badorm.Expression[int8]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int8]{ - Expression: expr, - Field: "Int8", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int8"}, } } func BasicPointersInt16(expr badorm.Expression[int16]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int16]{ - Expression: expr, - Field: "Int16", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int16"}, } } func BasicPointersInt32(expr badorm.Expression[int32]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int32]{ - Expression: expr, - Field: "Int32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int32"}, } } func BasicPointersInt64(expr badorm.Expression[int64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int64]{ - Expression: expr, - Field: "Int64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int64"}, } } func BasicPointersUInt(expr badorm.Expression[uint]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint]{ - Expression: expr, - Field: "UInt", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt"}, } } func BasicPointersUInt8(expr badorm.Expression[uint8]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint8]{ - Expression: expr, - Field: "UInt8", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt8"}, } } func BasicPointersUInt16(expr badorm.Expression[uint16]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint16]{ - Expression: expr, - Field: "UInt16", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt16"}, } } func BasicPointersUInt32(expr badorm.Expression[uint32]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint32]{ - Expression: expr, - Field: "UInt32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt32"}, } } func BasicPointersUInt64(expr badorm.Expression[uint64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint64]{ - Expression: expr, - Field: "UInt64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt64"}, } } func BasicPointersUIntptr(expr badorm.Expression[uintptr]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uintptr]{ - Expression: expr, - Field: "UIntptr", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UIntptr"}, } } func BasicPointersFloat32(expr badorm.Expression[float32]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, float32]{ - Expression: expr, - Field: "Float32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Float32"}, } } func BasicPointersFloat64(expr badorm.Expression[float64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, float64]{ - Expression: expr, - Field: "Float64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Float64"}, } } func BasicPointersComplex64(expr badorm.Expression[complex64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, complex64]{ - Expression: expr, - Field: "Complex64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Complex64"}, } } func BasicPointersComplex128(expr badorm.Expression[complex128]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, complex128]{ - Expression: expr, - Field: "Complex128", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Complex128"}, } } func BasicPointersString(expr badorm.Expression[string]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, string]{ - Expression: expr, - Field: "String", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "String"}, } } func BasicPointersByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint8]{ - Expression: expr, - Field: "Byte", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Byte"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go index af0c125e..eac39ac4 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go @@ -10,133 +10,133 @@ import ( func BasicSlicesId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func BasicSlicesCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func BasicSlicesUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func BasicSlicesDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func BasicSlicesBool(expr badorm.Expression[[]bool]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []bool]{ - Expression: expr, - Field: "Bool", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Bool"}, } } func BasicSlicesInt(expr badorm.Expression[[]int]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int]{ - Expression: expr, - Field: "Int", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int"}, } } func BasicSlicesInt8(expr badorm.Expression[[]int8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int8]{ - Expression: expr, - Field: "Int8", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int8"}, } } func BasicSlicesInt16(expr badorm.Expression[[]int16]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int16]{ - Expression: expr, - Field: "Int16", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int16"}, } } func BasicSlicesInt32(expr badorm.Expression[[]int32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int32]{ - Expression: expr, - Field: "Int32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int32"}, } } func BasicSlicesInt64(expr badorm.Expression[[]int64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int64]{ - Expression: expr, - Field: "Int64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int64"}, } } func BasicSlicesUInt(expr badorm.Expression[[]uint]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint]{ - Expression: expr, - Field: "UInt", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt"}, } } func BasicSlicesUInt8(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint8]{ - Expression: expr, - Field: "UInt8", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt8"}, } } func BasicSlicesUInt16(expr badorm.Expression[[]uint16]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint16]{ - Expression: expr, - Field: "UInt16", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt16"}, } } func BasicSlicesUInt32(expr badorm.Expression[[]uint32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint32]{ - Expression: expr, - Field: "UInt32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt32"}, } } func BasicSlicesUInt64(expr badorm.Expression[[]uint64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint64]{ - Expression: expr, - Field: "UInt64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt64"}, } } func BasicSlicesUIntptr(expr badorm.Expression[[]uintptr]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uintptr]{ - Expression: expr, - Field: "UIntptr", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UIntptr"}, } } func BasicSlicesFloat32(expr badorm.Expression[[]float32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []float32]{ - Expression: expr, - Field: "Float32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Float32"}, } } func BasicSlicesFloat64(expr badorm.Expression[[]float64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []float64]{ - Expression: expr, - Field: "Float64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Float64"}, } } func BasicSlicesComplex64(expr badorm.Expression[[]complex64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []complex64]{ - Expression: expr, - Field: "Complex64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Complex64"}, } } func BasicSlicesComplex128(expr badorm.Expression[[]complex128]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []complex128]{ - Expression: expr, - Field: "Complex128", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Complex128"}, } } func BasicSlicesString(expr badorm.Expression[[]string]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []string]{ - Expression: expr, - Field: "String", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "String"}, } } func BasicSlicesByte(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint8]{ - Expression: expr, - Field: "Byte", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Byte"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go index 6ad3c6e3..fafff250 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go @@ -10,133 +10,133 @@ import ( func BasicSlicesPointerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func BasicSlicesPointerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func BasicSlicesPointerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func BasicSlicesPointerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func BasicSlicesPointerBool(expr badorm.Expression[[]bool]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []bool]{ - Expression: expr, - Field: "Bool", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Bool"}, } } func BasicSlicesPointerInt(expr badorm.Expression[[]int]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int]{ - Expression: expr, - Field: "Int", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int"}, } } func BasicSlicesPointerInt8(expr badorm.Expression[[]int8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int8]{ - Expression: expr, - Field: "Int8", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int8"}, } } func BasicSlicesPointerInt16(expr badorm.Expression[[]int16]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int16]{ - Expression: expr, - Field: "Int16", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int16"}, } } func BasicSlicesPointerInt32(expr badorm.Expression[[]int32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int32]{ - Expression: expr, - Field: "Int32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int32"}, } } func BasicSlicesPointerInt64(expr badorm.Expression[[]int64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int64]{ - Expression: expr, - Field: "Int64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int64"}, } } func BasicSlicesPointerUInt(expr badorm.Expression[[]uint]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint]{ - Expression: expr, - Field: "UInt", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt"}, } } func BasicSlicesPointerUInt8(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint8]{ - Expression: expr, - Field: "UInt8", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt8"}, } } func BasicSlicesPointerUInt16(expr badorm.Expression[[]uint16]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint16]{ - Expression: expr, - Field: "UInt16", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt16"}, } } func BasicSlicesPointerUInt32(expr badorm.Expression[[]uint32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint32]{ - Expression: expr, - Field: "UInt32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt32"}, } } func BasicSlicesPointerUInt64(expr badorm.Expression[[]uint64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint64]{ - Expression: expr, - Field: "UInt64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt64"}, } } func BasicSlicesPointerUIntptr(expr badorm.Expression[[]uintptr]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uintptr]{ - Expression: expr, - Field: "UIntptr", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UIntptr"}, } } func BasicSlicesPointerFloat32(expr badorm.Expression[[]float32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []float32]{ - Expression: expr, - Field: "Float32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Float32"}, } } func BasicSlicesPointerFloat64(expr badorm.Expression[[]float64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []float64]{ - Expression: expr, - Field: "Float64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Float64"}, } } func BasicSlicesPointerComplex64(expr badorm.Expression[[]complex64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []complex64]{ - Expression: expr, - Field: "Complex64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Complex64"}, } } func BasicSlicesPointerComplex128(expr badorm.Expression[[]complex128]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []complex128]{ - Expression: expr, - Field: "Complex128", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Complex128"}, } } func BasicSlicesPointerString(expr badorm.Expression[[]string]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []string]{ - Expression: expr, - Field: "String", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "String"}, } } func BasicSlicesPointerByte(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint8]{ - Expression: expr, - Field: "Byte", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Byte"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go index fce3f461..285845f8 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go @@ -10,133 +10,133 @@ import ( func BasicTypesId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func BasicTypesCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func BasicTypesUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func BasicTypesDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func BasicTypesBool(expr badorm.Expression[bool]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, bool]{ - Expression: expr, - Field: "Bool", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Bool"}, } } func BasicTypesInt(expr badorm.Expression[int]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int]{ - Expression: expr, - Field: "Int", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int"}, } } func BasicTypesInt8(expr badorm.Expression[int8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int8]{ - Expression: expr, - Field: "Int8", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int8"}, } } func BasicTypesInt16(expr badorm.Expression[int16]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int16]{ - Expression: expr, - Field: "Int16", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int16"}, } } func BasicTypesInt32(expr badorm.Expression[int32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int32]{ - Expression: expr, - Field: "Int32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int32"}, } } func BasicTypesInt64(expr badorm.Expression[int64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int64]{ - Expression: expr, - Field: "Int64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Int64"}, } } func BasicTypesUInt(expr badorm.Expression[uint]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint]{ - Expression: expr, - Field: "UInt", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt"}, } } func BasicTypesUInt8(expr badorm.Expression[uint8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint8]{ - Expression: expr, - Field: "UInt8", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt8"}, } } func BasicTypesUInt16(expr badorm.Expression[uint16]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint16]{ - Expression: expr, - Field: "UInt16", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt16"}, } } func BasicTypesUInt32(expr badorm.Expression[uint32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint32]{ - Expression: expr, - Field: "UInt32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt32"}, } } func BasicTypesUInt64(expr badorm.Expression[uint64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint64]{ - Expression: expr, - Field: "UInt64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UInt64"}, } } func BasicTypesUIntptr(expr badorm.Expression[uintptr]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uintptr]{ - Expression: expr, - Field: "UIntptr", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "UIntptr"}, } } func BasicTypesFloat32(expr badorm.Expression[float32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, float32]{ - Expression: expr, - Field: "Float32", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Float32"}, } } func BasicTypesFloat64(expr badorm.Expression[float64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, float64]{ - Expression: expr, - Field: "Float64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Float64"}, } } func BasicTypesComplex64(expr badorm.Expression[complex64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, complex64]{ - Expression: expr, - Field: "Complex64", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Complex64"}, } } func BasicTypesComplex128(expr badorm.Expression[complex128]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, complex128]{ - Expression: expr, - Field: "Complex128", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Complex128"}, } } func BasicTypesString(expr badorm.Expression[string]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, string]{ - Expression: expr, - Field: "String", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "String"}, } } func BasicTypesByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint8]{ - Expression: expr, - Field: "Byte", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Byte"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go index fda7649e..5b3f2157 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go @@ -10,26 +10,26 @@ import ( func OwnedId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func OwnedCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func OwnedUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func OwnedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Condition[belongsto.Owned] { @@ -42,7 +42,7 @@ func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Conditio } func OwnedOwnerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, badorm.UUID]{ - Expression: expr, - Field: "OwnerID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "OwnerID"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go index 6133202b..14b07700 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go @@ -10,25 +10,25 @@ import ( func OwnerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func OwnerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func OwnerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func OwnerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go index ab8099e3..0b107dc5 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go @@ -10,31 +10,31 @@ import ( func ColumnDefinitionId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func ColumnDefinitionCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func ColumnDefinitionUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func ColumnDefinitionDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func ColumnDefinitionString(expr badorm.Expression[string]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, string]{ - Column: "string_something_else", - Expression: expr, + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Column: "string_something_else"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go index 3971182a..21e4b6a7 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go @@ -10,31 +10,31 @@ import ( func CustomTypeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func CustomTypeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func CustomTypeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func CustomTypeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func CustomTypeCustom(expr badorm.Expression[customtype.MultiString]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, customtype.MultiString]{ - Expression: expr, - Field: "Custom", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Custom"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go index 4cbe4808..3d51ca57 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go @@ -10,31 +10,31 @@ import ( func GoEmbeddedId(expr badorm.Expression[uint]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, uint]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func GoEmbeddedCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func GoEmbeddedUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func GoEmbeddedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func GoEmbeddedEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, int]{ - Expression: expr, - Field: "EmbeddedInt", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "EmbeddedInt"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go index a9b9db37..8abfe94d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go @@ -10,32 +10,34 @@ import ( func GormEmbeddedId(expr badorm.Expression[uint]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, uint]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func GormEmbeddedCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func GormEmbeddedUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func GormEmbeddedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func GormEmbeddedGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, int]{ - ColumnPrefix: "gorm_embedded_", - Expression: expr, - Field: "Int", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{ + ColumnPrefix: "gorm_embedded_", + Field: "Int", + }, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go index dea0f505..38c490b0 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go @@ -10,26 +10,26 @@ import ( func CompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func CompanyCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func CompanyUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.Condition[hasmany.Seller] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go index 63d3b5fe..5ab2a68d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go @@ -10,31 +10,31 @@ import ( func SellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func SellerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func SellerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, badorm.UUID]{ - Expression: expr, - Field: "CompanyID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "CompanyID"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go index dcc4d42e..cf95d22d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go @@ -10,31 +10,31 @@ import ( func CityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func CityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func CityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, badorm.UUID]{ - Expression: expr, - Field: "CountryID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "CountryID"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go index d91901f6..15ae61b3 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go @@ -10,26 +10,26 @@ import ( func CountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func CountryCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func CountryUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func CountryCapital(conditions ...badorm.Condition[hasone.City]) badorm.Condition[hasone.Country] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go index c9c7fda4..00f4e254 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go @@ -11,26 +11,26 @@ import ( func Package1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func Package1CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func Package1UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func Package1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func Package1Package2(conditions ...badorm.Condition[package2.Package2]) badorm.Condition[package1.Package1] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go index aecf4cea..54b6b1f0 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go @@ -10,26 +10,26 @@ import ( func BicycleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func BicycleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func BicycleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) badorm.Condition[overrideforeignkey.Bicycle] { @@ -42,7 +42,7 @@ func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) bad } func BicycleOwnerSomethingId(expr badorm.Expression[string]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, string]{ - Expression: expr, - Field: "OwnerSomethingID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "OwnerSomethingID"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go index 20cd605c..cc943ee5 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go @@ -10,26 +10,26 @@ import ( func UserId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func UserCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func UserUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func UserDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func UserCreditCard(conditions ...badorm.Condition[overrideforeignkeyinverse.CreditCard]) badorm.Condition[overrideforeignkeyinverse.User] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go index 2be1d577..be6e5130 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go @@ -10,26 +10,26 @@ import ( func PhoneId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func PhoneCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func PhoneUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm.Condition[overridereferences.Phone] { @@ -42,7 +42,7 @@ func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm } func PhoneBrandName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, string]{ - Expression: expr, - Field: "BrandName", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "BrandName"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go index dcf9b0f2..16b7d4b7 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go @@ -10,32 +10,32 @@ import ( func ComputerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func ComputerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func ComputerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func ComputerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func ComputerName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, string]{ - Expression: expr, - Field: "Name", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, } } func ComputerProcessor(conditions ...badorm.Condition[overridereferencesinverse.Processor]) badorm.Condition[overridereferencesinverse.Computer] { diff --git a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go index c242db92..83f91b6a 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go @@ -10,26 +10,26 @@ import ( func EmployeeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func EmployeeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func EmployeeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) badorm.Condition[selfreferential.Employee] { @@ -42,7 +42,7 @@ func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) bado } func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, badorm.UUID]{ - Expression: expr, - Field: "BossID", + Expression: expr, + FieldIdentifier: badorm.FieldIdentifier{Field: "BossID"}, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go index 0da2f819..7ce205a1 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go @@ -10,25 +10,25 @@ import ( func UintModelId(expr badorm.Expression[uint]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, uint]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func UintModelCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func UintModelUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func UintModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go index 12c7ccf2..c8c3e707 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go @@ -10,25 +10,25 @@ import ( func UUIDModelId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, badorm.UUID]{ - Expression: expr, - Field: "ID", + Expression: expr, + FieldIdentifier: badorm.IDFieldID, } } func UUIDModelCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, time.Time]{ - Expression: expr, - Field: "CreatedAt", + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, } } func UUIDModelUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, time.Time]{ - Expression: expr, - Field: "UpdatedAt", + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, } } func UUIDModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, gorm.DeletedAt]{ - Expression: expr, - Field: "DeletedAt", + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, } } From 78a3ec49af61817218217cf01a06287d2f36d28a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 21 Jun 2023 12:26:13 +0200 Subject: [PATCH 386/467] auto generation of preload conditions --- .../conditions/bicycle_conditions.go | 12 ++- .../conditions/brand_conditions.go | 7 +- .../conditions/child_conditions.go | 12 ++- testintegration/conditions/city_conditions.go | 12 ++- .../conditions/company_conditions.go | 7 +- .../conditions/country_conditions.go | 7 +- .../conditions/employee_conditions.go | 12 ++- .../conditions/parent1_conditions.go | 7 +- .../conditions/parent2_conditions.go | 7 +- .../conditions/parent_parent_conditions.go | 7 +- .../conditions/person_conditions.go | 7 +- .../conditions/phone_conditions.go | 12 ++- .../conditions/product_conditions.go | 65 ++++++++++--- testintegration/conditions/sale_conditions.go | 22 ++++- .../conditions/seller_conditions.go | 12 ++- testintegration/join_conditions_test.go | 52 +++-------- tools/badctl/cmd/gen/conditions/condition.go | 62 ++++++++----- tools/badctl/cmd/gen/conditions/file.go | 74 +++++++++++---- tools/badctl/cmd/gen/conditions/main.go | 5 +- .../conditions/tests/results/basicpointers.go | 92 +++++++++++++++---- .../conditions/tests/results/basicslices.go | 92 +++++++++++++++---- .../tests/results/basicslicespointer.go | 92 +++++++++++++++---- .../conditions/tests/results/basictypes.go | 92 +++++++++++++++---- .../tests/results/belongsto_owned.go | 7 +- .../tests/results/belongsto_owner.go | 2 + .../tests/results/columndefinition.go | 7 +- .../conditions/tests/results/customtype.go | 7 +- .../conditions/tests/results/goembedded.go | 7 +- .../conditions/tests/results/gormembedded.go | 15 ++- .../tests/results/hasmany_company.go | 2 + .../tests/results/hasmany_seller.go | 7 +- .../conditions/tests/results/hasone_city.go | 7 +- .../tests/results/hasone_country.go | 2 + .../tests/results/multiplepackage_package1.go | 2 + .../tests/results/overrideforeignkey.go | 7 +- .../results/overrideforeignkeyinverse.go | 2 + .../tests/results/overridereferences.go | 7 +- .../results/overridereferencesinverse.go | 7 +- .../tests/results/selfreferential.go | 7 +- .../gen/conditions/tests/results/uintmodel.go | 2 + .../gen/conditions/tests/results/uuidmodel.go | 2 + 41 files changed, 659 insertions(+), 209 deletions(-) diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index f49fabe9..f3125671 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -32,10 +32,13 @@ func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit FieldIdentifier: badorm.DeletedAtFieldID, } } + +var bicycleNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func BicycleName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: bicycleNameFieldID, } } func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Condition[models.Bicycle] { @@ -46,9 +49,14 @@ func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Conditio T2Field: "Name", } } + +var bicycleOwnerNameFieldID = badorm.FieldIdentifier{Field: "OwnerName"} + func BicycleOwnerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "OwnerName"}, + FieldIdentifier: bicycleOwnerNameFieldID, } } + +var BicyclePreload = badorm.NewPreloadCondition[models.Bicycle](bicycleNameFieldID, bicycleOwnerNameFieldID) diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index de6cf1c9..77aa68b7 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -32,9 +32,14 @@ func BrandDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio FieldIdentifier: badorm.DeletedAtFieldID, } } + +var brandNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: brandNameFieldID, } } + +var BrandPreload = badorm.NewPreloadCondition[models.Brand](brandNameFieldID) diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index f261b3e0..b23749f0 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -40,10 +40,13 @@ func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.Conditi T2Field: "ID", } } + +var childParent1IdFieldID = badorm.FieldIdentifier{Field: "Parent1ID"} + func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Parent1ID"}, + FieldIdentifier: childParent1IdFieldID, } } func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.Condition[models.Child] { @@ -54,9 +57,14 @@ func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.Conditi T2Field: "ID", } } + +var childParent2IdFieldID = badorm.FieldIdentifier{Field: "Parent2ID"} + func ChildParent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Parent2ID"}, + FieldIdentifier: childParent2IdFieldID, } } + +var ChildPreload = badorm.NewPreloadCondition[models.Child](childParent1IdFieldID, childParent2IdFieldID) diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index f0e4956e..d3778352 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -32,15 +32,23 @@ func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition FieldIdentifier: badorm.DeletedAtFieldID, } } + +var cityNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func CityName(expr badorm.Expression[string]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: cityNameFieldID, } } + +var cityCountryIdFieldID = badorm.FieldIdentifier{Field: "CountryID"} + func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "CountryID"}, + FieldIdentifier: cityCountryIdFieldID, } } + +var CityPreload = badorm.NewPreloadCondition[models.City](cityNameFieldID, cityCountryIdFieldID) diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index 4c74f89f..407acf15 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -32,10 +32,13 @@ func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit FieldIdentifier: badorm.DeletedAtFieldID, } } + +var companyNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func CompanyName(expr badorm.Expression[string]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: companyNameFieldID, } } func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { @@ -46,3 +49,5 @@ func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condit T2Field: "ID", } } + +var CompanyPreload = badorm.NewPreloadCondition[models.Company](companyNameFieldID) diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index aa141917..6f0ef97c 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -32,10 +32,13 @@ func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit FieldIdentifier: badorm.DeletedAtFieldID, } } + +var countryNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func CountryName(expr badorm.Expression[string]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: countryNameFieldID, } } func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.Condition[models.Country] { @@ -54,3 +57,5 @@ func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.Conditio T2Field: "ID", } } + +var CountryPreload = badorm.NewPreloadCondition[models.Country](countryNameFieldID) diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 9c3ddee1..6a37273d 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -32,10 +32,13 @@ func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondi FieldIdentifier: badorm.DeletedAtFieldID, } } + +var employeeNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func EmployeeName(expr badorm.Expression[string]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: employeeNameFieldID, } } func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condition[models.Employee] { @@ -46,9 +49,14 @@ func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condit T2Field: "ID", } } + +var employeeBossIdFieldID = badorm.FieldIdentifier{Field: "BossID"} + func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "BossID"}, + FieldIdentifier: employeeBossIdFieldID, } } + +var EmployeePreload = badorm.NewPreloadCondition[models.Employee](employeeNameFieldID, employeeBossIdFieldID) diff --git a/testintegration/conditions/parent1_conditions.go b/testintegration/conditions/parent1_conditions.go index 24096c58..bb38af74 100644 --- a/testintegration/conditions/parent1_conditions.go +++ b/testintegration/conditions/parent1_conditions.go @@ -40,9 +40,14 @@ func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) ba T2Field: "ID", } } + +var parent1ParentParentIdFieldID = badorm.FieldIdentifier{Field: "ParentParentID"} + func Parent1ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "ParentParentID"}, + FieldIdentifier: parent1ParentParentIdFieldID, } } + +var Parent1Preload = badorm.NewPreloadCondition[models.Parent1](parent1ParentParentIdFieldID) diff --git a/testintegration/conditions/parent2_conditions.go b/testintegration/conditions/parent2_conditions.go index 3415e252..5009f907 100644 --- a/testintegration/conditions/parent2_conditions.go +++ b/testintegration/conditions/parent2_conditions.go @@ -40,9 +40,14 @@ func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) ba T2Field: "ID", } } + +var parent2ParentParentIdFieldID = badorm.FieldIdentifier{Field: "ParentParentID"} + func Parent2ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "ParentParentID"}, + FieldIdentifier: parent2ParentParentIdFieldID, } } + +var Parent2Preload = badorm.NewPreloadCondition[models.Parent2](parent2ParentParentIdFieldID) diff --git a/testintegration/conditions/parent_parent_conditions.go b/testintegration/conditions/parent_parent_conditions.go index e630e138..61b4ce78 100644 --- a/testintegration/conditions/parent_parent_conditions.go +++ b/testintegration/conditions/parent_parent_conditions.go @@ -32,9 +32,14 @@ func ParentParentDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereC FieldIdentifier: badorm.DeletedAtFieldID, } } + +var parentParentNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func ParentParentName(expr badorm.Expression[string]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: parentParentNameFieldID, } } + +var ParentParentPreload = badorm.NewPreloadCondition[models.ParentParent](parentParentNameFieldID) diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index c534f2e7..719afb50 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -32,9 +32,14 @@ func PersonDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditi FieldIdentifier: badorm.DeletedAtFieldID, } } + +var personNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func PersonName(expr badorm.Expression[string]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: personNameFieldID, } } + +var PersonPreload = badorm.NewPreloadCondition[models.Person](personNameFieldID) diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index c2a6da77..3c2e59e0 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -32,10 +32,13 @@ func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio FieldIdentifier: badorm.DeletedAtFieldID, } } + +var phoneNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func PhoneName(expr badorm.Expression[string]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: phoneNameFieldID, } } func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[models.Phone] { @@ -46,9 +49,14 @@ func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[m T2Field: "ID", } } + +var phoneBrandIdFieldID = badorm.FieldIdentifier{Field: "BrandID"} + func PhoneBrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, uint]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "BrandID"}, + FieldIdentifier: phoneBrandIdFieldID, } } + +var PhonePreload = badorm.NewPreloadCondition[models.Phone](phoneNameFieldID, phoneBrandIdFieldID) diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index e9d45361..fc4ac19d 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -33,72 +33,107 @@ func ProductDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit FieldIdentifier: badorm.DeletedAtFieldID, } } + +var productStringFieldID = badorm.FieldIdentifier{Column: "string_something_else"} + func ProductString(expr badorm.Expression[string]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Column: "string_something_else"}, + FieldIdentifier: productStringFieldID, } } + +var productIntFieldID = badorm.FieldIdentifier{Field: "Int"} + func ProductInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int"}, + FieldIdentifier: productIntFieldID, } } + +var productIntPointerFieldID = badorm.FieldIdentifier{Field: "IntPointer"} + func ProductIntPointer(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "IntPointer"}, + FieldIdentifier: productIntPointerFieldID, } } + +var productFloatFieldID = badorm.FieldIdentifier{Field: "Float"} + func ProductFloat(expr badorm.Expression[float64]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, float64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Float"}, + FieldIdentifier: productFloatFieldID, } } + +var productNullFloatFieldID = badorm.FieldIdentifier{Field: "NullFloat"} + func ProductNullFloat(expr badorm.Expression[sql.NullFloat64]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, sql.NullFloat64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "NullFloat"}, + FieldIdentifier: productNullFloatFieldID, } } + +var productBoolFieldID = badorm.FieldIdentifier{Field: "Bool"} + func ProductBool(expr badorm.Expression[bool]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, bool]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Bool"}, + FieldIdentifier: productBoolFieldID, } } + +var productNullBoolFieldID = badorm.FieldIdentifier{Field: "NullBool"} + func ProductNullBool(expr badorm.Expression[sql.NullBool]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, sql.NullBool]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "NullBool"}, + FieldIdentifier: productNullBoolFieldID, } } + +var productByteArrayFieldID = badorm.FieldIdentifier{Field: "ByteArray"} + func ProductByteArray(expr badorm.Expression[[]uint8]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, []uint8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "ByteArray"}, + FieldIdentifier: productByteArrayFieldID, } } + +var productMultiStringFieldID = badorm.FieldIdentifier{Field: "MultiString"} + func ProductMultiString(expr badorm.Expression[models.MultiString]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, models.MultiString]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "MultiString"}, + FieldIdentifier: productMultiStringFieldID, } } + +var productEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "EmbeddedInt"} + func ProductEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "EmbeddedInt"}, + FieldIdentifier: productEmbeddedIntFieldID, } } + +var productGormEmbeddedIntFieldID = badorm.FieldIdentifier{ + ColumnPrefix: "gorm_embedded_", + Field: "Int", +} + func ProductGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{ - ColumnPrefix: "gorm_embedded_", - Field: "Int", - }, + Expression: expr, + FieldIdentifier: productGormEmbeddedIntFieldID, } } + +var ProductPreload = badorm.NewPreloadCondition[models.Product](productStringFieldID, productIntFieldID, productIntPointerFieldID, productFloatFieldID, productNullFloatFieldID, productBoolFieldID, productNullBoolFieldID, productByteArrayFieldID, productMultiStringFieldID, productEmbeddedIntFieldID, productGormEmbeddedIntFieldID) diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 68fe092e..a1a90449 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -32,16 +32,22 @@ func SaleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition FieldIdentifier: badorm.DeletedAtFieldID, } } + +var saleCodeFieldID = badorm.FieldIdentifier{Field: "Code"} + func SaleCode(expr badorm.Expression[int]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, int]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Code"}, + FieldIdentifier: saleCodeFieldID, } } + +var saleDescriptionFieldID = badorm.FieldIdentifier{Field: "Description"} + func SaleDescription(expr badorm.Expression[string]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Description"}, + FieldIdentifier: saleDescriptionFieldID, } } func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Condition[models.Sale] { @@ -52,10 +58,13 @@ func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Conditio T2Field: "ID", } } + +var saleProductIdFieldID = badorm.FieldIdentifier{Field: "ProductID"} + func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "ProductID"}, + FieldIdentifier: saleProductIdFieldID, } } func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[models.Sale] { @@ -66,9 +75,14 @@ func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[ T2Field: "ID", } } + +var saleSellerIdFieldID = badorm.FieldIdentifier{Field: "SellerID"} + func SaleSellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "SellerID"}, + FieldIdentifier: saleSellerIdFieldID, } } + +var SalePreload = badorm.NewPreloadCondition[models.Sale](saleCodeFieldID, saleDescriptionFieldID, saleProductIdFieldID, saleSellerIdFieldID) diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 35588824..4be3a235 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -32,15 +32,23 @@ func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditi FieldIdentifier: badorm.DeletedAtFieldID, } } + +var sellerNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func SellerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: sellerNameFieldID, } } + +var sellerCompanyIdFieldID = badorm.FieldIdentifier{Field: "CompanyID"} + func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "CompanyID"}, + FieldIdentifier: sellerCompanyIdFieldID, } } + +var SellerPreload = badorm.NewPreloadCondition[models.Seller](sellerNameFieldID, sellerCompanyIdFieldID) diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 20be6b4c..13f4d65b 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -411,35 +411,7 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesN ts.ErrorIs(err, badorm.ErrEmptyConditions) } -// TODO que se genere automaticamente -var ProductPreload = badorm.NewPreloadCondition[models.Product]( - badorm.FieldIdentifier{Column: "string_something_else"}, - badorm.FieldIdentifier{Field: "Int"}, - badorm.FieldIdentifier{Field: "IntPointer"}, - badorm.FieldIdentifier{Field: "Float"}, - badorm.FieldIdentifier{Field: "NullFloat"}, - badorm.FieldIdentifier{Field: "Bool"}, - badorm.FieldIdentifier{Field: "NullBool"}, - badorm.FieldIdentifier{Field: "ByteArray"}, - badorm.FieldIdentifier{Field: "MultiString"}, - badorm.FieldIdentifier{Field: "EmbeddedInt"}, - badorm.FieldIdentifier{Field: "Int", ColumnPrefix: "gorm_embedded_"}, -) - -var SellerPreload = badorm.NewPreloadCondition[models.Seller]( - badorm.FieldIdentifier{Field: "Name"}, - badorm.FieldIdentifier{Field: "CompanyID"}, -) - // TODO algo para poder hacer el preload completo? -var Parent1Preload = badorm.NewPreloadCondition[models.Parent1]( - badorm.FieldIdentifier{Field: "ParentParentID"}, -) - -var Parent2Preload = badorm.NewPreloadCondition[models.Parent2]( - badorm.FieldIdentifier{Field: "ParentParentID"}, -) -var ParentParentPreload = badorm.NewPreloadCondition[models.ParentParent]() func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithoutWhereConditionDoesNotFilter() { product1 := ts.createProduct("a_string", 1, 0.0, false, nil) @@ -452,7 +424,7 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithoutWhereConditionDoe entities, err := ts.crudSaleService.GetEntities( conditions.SaleSeller( - SellerPreload, + conditions.SellerPreload, ), ) ts.Nil(err) @@ -480,7 +452,7 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithWhereConditionFilter entities, err := ts.crudSaleService.GetEntities( conditions.SaleProduct( - ProductPreload, + conditions.ProductPreload, conditions.ProductInt(badorm.Eq(1)), ), ) @@ -507,11 +479,11 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadDifferentEntities() { entities, err := ts.crudSaleService.GetEntities( conditions.SaleProduct( - ProductPreload, + conditions.ProductPreload, conditions.ProductInt(badorm.Eq(1)), ), conditions.SaleSeller( - SellerPreload, + conditions.SellerPreload, conditions.SellerName(badorm.Eq("franco")), ), ) @@ -541,9 +513,9 @@ func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithoutCond entities, err := ts.crudChildService.GetEntities( conditions.ChildParent1( - Parent1Preload, + conditions.Parent1Preload, conditions.Parent1ParentParent( - ParentParentPreload, + conditions.ParentParentPreload, ), ), ) @@ -591,9 +563,9 @@ func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithConditi entities, err := ts.crudChildService.GetEntities( conditions.ChildParent1( - Parent1Preload, + conditions.Parent1Preload, conditions.Parent1ParentParent( - ParentParentPreload, + conditions.ParentParentPreload, conditions.ParentParentName(badorm.Eq("parentParent1")), ), ), @@ -624,15 +596,15 @@ func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond() { entities, err := ts.crudChildService.GetEntities( conditions.ChildParent1( - Parent1Preload, + conditions.Parent1Preload, conditions.Parent1ParentParent( - ParentParentPreload, + conditions.ParentParentPreload, ), ), conditions.ChildParent2( - Parent2Preload, + conditions.Parent2Preload, conditions.Parent2ParentParent( - ParentParentPreload, + conditions.ParentParentPreload, ), ), ) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 81276622..694784ce 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -32,9 +32,10 @@ var constantFieldIdentifiers = map[string]*jen.Statement{ } type Condition struct { - codes []jen.Code - param *JenParam - destPkg string + codes []jen.Code + param *JenParam + destPkg string + fieldIdentifier string } func NewCondition(destPkg string, objectType Type, field Field) *Condition { @@ -185,28 +186,12 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { conditionName := getConditionName(objectType, field) log.Logger.Debugf("Generated %q", conditionName) - fieldIdentifier := jen.Qual( - badORMPath, badORMFieldIdentifier, - ) + var fieldIdentifier *jen.Statement if constantFieldIdentifier, ok := constantFieldIdentifiers[field.Name]; ok { fieldIdentifier = constantFieldIdentifier } else { - fieldIdentifierValues := jen.Dict{} - columnName := field.getColumnName() - - if columnName != "" { - fieldIdentifierValues[jen.Id("Column")] = jen.Lit(columnName) - } else { - fieldIdentifierValues[jen.Id("Field")] = jen.Lit(field.Name) - } - - columnPrefix := field.ColumnPrefix - if columnPrefix != "" { - fieldIdentifierValues[jen.Id("ColumnPrefix")] = jen.Lit(columnPrefix) - } - - fieldIdentifier = fieldIdentifier.Values(fieldIdentifierValues) + fieldIdentifier = condition.createFieldIdentifier(objectType, field, conditionName) } condition.codes = append( @@ -228,6 +213,41 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { ) } +// create a variable containing the definition of the field identifier +// to use it in the where condition and in the preload condition +func (condition *Condition) createFieldIdentifier(objectType Type, field Field, conditionName string) *jen.Statement { + fieldIdentifierValues := jen.Dict{} + columnName := field.getColumnName() + + if columnName != "" { + fieldIdentifierValues[jen.Id("Column")] = jen.Lit(columnName) + } else { + fieldIdentifierValues[jen.Id("Field")] = jen.Lit(field.Name) + } + + columnPrefix := field.ColumnPrefix + if columnPrefix != "" { + fieldIdentifierValues[jen.Id("ColumnPrefix")] = jen.Lit(columnPrefix) + } + + fieldIdentifierVar := jen.Qual( + badORMPath, badORMFieldIdentifier, + ).Values(fieldIdentifierValues) + + fieldIdentifierName := strcase.ToCamel(conditionName) + "FieldID" + + condition.codes = append( + condition.codes, + jen.Var().Id( + fieldIdentifierName, + ).Op("=").Add(fieldIdentifierVar), + ) + + condition.fieldIdentifier = fieldIdentifierName + + return jen.Qual("", fieldIdentifierName) +} + // Generate a inverse JoinCondition, so from the field's object to the object func (condition *Condition) generateInverseJoin(objectType Type, field Field) { condition.generateJoinWithFK( diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index a6a32e10..2422e303 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -11,51 +11,86 @@ import ( "github.com/ditrit/badaas/tools/badctl/cmd/version" ) -const badORMPath = "github.com/ditrit/badaas/badorm" +const ( + badORMPath = "github.com/ditrit/badaas/badorm" + badORMNewPreloadCondition = "NewPreloadCondition" +) type File struct { - destPkg string - jenFile *jen.File - name string + destPkg string + jenFile *jen.File + name string + object types.Object + objectType Type } -func NewConditionsFile(destPkg string, name string) *File { +func NewConditionsFile(destPkg string, name string, object types.Object) (*File, error) { // Start a new file in destination package f := jen.NewFile(destPkg) // Add a package comment, so IDEs detect files as generated f.PackageComment("Code generated by badctl v" + version.Version + ", DO NOT EDIT.") - return &File{ - destPkg: destPkg, - name: name, - jenFile: f, + file := &File{ + destPkg: destPkg, + name: name, + jenFile: f, + object: object, + objectType: Type{object.Type()}, + } + + err := file.addConditions() + if err != nil { + return nil, err } + + return file, nil } // Add conditions for an object in the file -func (file File) AddConditionsFor(object types.Object) error { - fields, err := getFields(Type{object.Type()}, "") +func (file File) addConditions() error { + fields, err := getFields(file.objectType, "") if err != nil { return err } - log.Logger.Infof("Generating conditions for type %q in %s", object.Name(), file.name) + log.Logger.Infof("Generating conditions for type %q in %s", file.object.Name(), file.name) - file.addConditionsForEachField(object, fields) + file.addConditionsForEachField(fields) return nil } // Add one condition for each field of the object -func (file File) addConditionsForEachField(object types.Object, fields []Field) { - conditions := file.generateConditionsForEachField(object, fields) +func (file File) addConditionsForEachField(fields []Field) { + conditions := file.generateConditionsForEachField(fields) + + preloadCondition := jen.Var().Id( + file.object.Name() + "Preload", + ).Op("=").Add(jen.Qual( + badORMPath, badORMNewPreloadCondition, + )).Types( + jen.Qual( + getRelativePackagePath(file.destPkg, file.objectType), + file.objectType.Name(), + ), + ) + fieldIdentifiers := []jen.Code{} for _, condition := range conditions { for _, code := range condition.codes { file.jenFile.Add(code) } + + if condition.fieldIdentifier != "" { + fieldIdentifiers = append( + fieldIdentifiers, + jen.Qual("", condition.fieldIdentifier), + ) + } } + + file.jenFile.Add(preloadCondition.Call(fieldIdentifiers...)) } // Write generated file @@ -64,7 +99,7 @@ func (file File) Save() error { } // Generate the conditions for each of the object's fields -func (file File) generateConditionsForEachField(object types.Object, fields []Field) []*Condition { +func (file File) generateConditionsForEachField(fields []Field) []*Condition { conditions := []*Condition{} for _, field := range fields { @@ -72,12 +107,11 @@ func (file File) generateConditionsForEachField(object types.Object, fields []Fi if field.Embedded { conditions = append(conditions, file.generateEmbeddedConditions( - object, field, )...) } else { conditions = append(conditions, NewCondition( - file.destPkg, Type{object.Type()}, field, + file.destPkg, file.objectType, field, )) } } @@ -87,7 +121,7 @@ func (file File) generateConditionsForEachField(object types.Object, fields []Fi // Generate conditions for a embedded field // it will generate a condition for each of the field of the embedded field's type -func (file File) generateEmbeddedConditions(object types.Object, field Field) []*Condition { +func (file File) generateEmbeddedConditions(field Field) []*Condition { embeddedStructType, ok := field.Type.Underlying().(*types.Struct) if !ok { cmderrors.FailErr(errors.New("unreachable! embedded objects are always structs")) @@ -99,5 +133,5 @@ func (file File) generateEmbeddedConditions(object types.Object, field Field) [] return []*Condition{} } - return file.generateConditionsForEachField(object, fields) + return file.generateConditionsForEachField(fields) } diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index bbb13851..3d4eacfa 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -64,12 +64,11 @@ func generateConditionsForPkg(destPkg string, pkg *packages.Package) { for _, name := range pkg.Types.Scope().Names() { object := getObject(pkg, name) if object != nil { - file := NewConditionsFile( + file, err := NewConditionsFile( destPkg, strcase.ToSnake(object.Name())+"_conditions.go", + object, ) - - err := file.AddConditionsFor(object) if err != nil { // object is not a BaDORM model, do not generate conditions continue diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go index d9e4d9d7..4a5ad493 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go @@ -32,111 +32,167 @@ func BasicPointersDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.Where FieldIdentifier: badorm.DeletedAtFieldID, } } + +var basicPointersBoolFieldID = badorm.FieldIdentifier{Field: "Bool"} + func BasicPointersBool(expr badorm.Expression[bool]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, bool]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Bool"}, + FieldIdentifier: basicPointersBoolFieldID, } } + +var basicPointersIntFieldID = badorm.FieldIdentifier{Field: "Int"} + func BasicPointersInt(expr badorm.Expression[int]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int"}, + FieldIdentifier: basicPointersIntFieldID, } } + +var basicPointersInt8FieldID = badorm.FieldIdentifier{Field: "Int8"} + func BasicPointersInt8(expr badorm.Expression[int8]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int8"}, + FieldIdentifier: basicPointersInt8FieldID, } } + +var basicPointersInt16FieldID = badorm.FieldIdentifier{Field: "Int16"} + func BasicPointersInt16(expr badorm.Expression[int16]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int16]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int16"}, + FieldIdentifier: basicPointersInt16FieldID, } } + +var basicPointersInt32FieldID = badorm.FieldIdentifier{Field: "Int32"} + func BasicPointersInt32(expr badorm.Expression[int32]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int32"}, + FieldIdentifier: basicPointersInt32FieldID, } } + +var basicPointersInt64FieldID = badorm.FieldIdentifier{Field: "Int64"} + func BasicPointersInt64(expr badorm.Expression[int64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int64"}, + FieldIdentifier: basicPointersInt64FieldID, } } + +var basicPointersUIntFieldID = badorm.FieldIdentifier{Field: "UInt"} + func BasicPointersUInt(expr badorm.Expression[uint]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt"}, + FieldIdentifier: basicPointersUIntFieldID, } } + +var basicPointersUInt8FieldID = badorm.FieldIdentifier{Field: "UInt8"} + func BasicPointersUInt8(expr badorm.Expression[uint8]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt8"}, + FieldIdentifier: basicPointersUInt8FieldID, } } + +var basicPointersUInt16FieldID = badorm.FieldIdentifier{Field: "UInt16"} + func BasicPointersUInt16(expr badorm.Expression[uint16]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint16]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt16"}, + FieldIdentifier: basicPointersUInt16FieldID, } } + +var basicPointersUInt32FieldID = badorm.FieldIdentifier{Field: "UInt32"} + func BasicPointersUInt32(expr badorm.Expression[uint32]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt32"}, + FieldIdentifier: basicPointersUInt32FieldID, } } + +var basicPointersUInt64FieldID = badorm.FieldIdentifier{Field: "UInt64"} + func BasicPointersUInt64(expr badorm.Expression[uint64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt64"}, + FieldIdentifier: basicPointersUInt64FieldID, } } + +var basicPointersUIntptrFieldID = badorm.FieldIdentifier{Field: "UIntptr"} + func BasicPointersUIntptr(expr badorm.Expression[uintptr]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uintptr]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UIntptr"}, + FieldIdentifier: basicPointersUIntptrFieldID, } } + +var basicPointersFloat32FieldID = badorm.FieldIdentifier{Field: "Float32"} + func BasicPointersFloat32(expr badorm.Expression[float32]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, float32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Float32"}, + FieldIdentifier: basicPointersFloat32FieldID, } } + +var basicPointersFloat64FieldID = badorm.FieldIdentifier{Field: "Float64"} + func BasicPointersFloat64(expr badorm.Expression[float64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, float64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Float64"}, + FieldIdentifier: basicPointersFloat64FieldID, } } + +var basicPointersComplex64FieldID = badorm.FieldIdentifier{Field: "Complex64"} + func BasicPointersComplex64(expr badorm.Expression[complex64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, complex64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Complex64"}, + FieldIdentifier: basicPointersComplex64FieldID, } } + +var basicPointersComplex128FieldID = badorm.FieldIdentifier{Field: "Complex128"} + func BasicPointersComplex128(expr badorm.Expression[complex128]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, complex128]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Complex128"}, + FieldIdentifier: basicPointersComplex128FieldID, } } + +var basicPointersStringFieldID = badorm.FieldIdentifier{Field: "String"} + func BasicPointersString(expr badorm.Expression[string]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "String"}, + FieldIdentifier: basicPointersStringFieldID, } } + +var basicPointersByteFieldID = badorm.FieldIdentifier{Field: "Byte"} + func BasicPointersByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Byte"}, + FieldIdentifier: basicPointersByteFieldID, } } + +var BasicPointersPreload = badorm.NewPreloadCondition[basicpointers.BasicPointers](basicPointersBoolFieldID, basicPointersIntFieldID, basicPointersInt8FieldID, basicPointersInt16FieldID, basicPointersInt32FieldID, basicPointersInt64FieldID, basicPointersUIntFieldID, basicPointersUInt8FieldID, basicPointersUInt16FieldID, basicPointersUInt32FieldID, basicPointersUInt64FieldID, basicPointersUIntptrFieldID, basicPointersFloat32FieldID, basicPointersFloat64FieldID, basicPointersComplex64FieldID, basicPointersComplex128FieldID, basicPointersStringFieldID, basicPointersByteFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go index eac39ac4..19fecec5 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go @@ -32,111 +32,167 @@ func BasicSlicesDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCo FieldIdentifier: badorm.DeletedAtFieldID, } } + +var basicSlicesBoolFieldID = badorm.FieldIdentifier{Field: "Bool"} + func BasicSlicesBool(expr badorm.Expression[[]bool]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []bool]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Bool"}, + FieldIdentifier: basicSlicesBoolFieldID, } } + +var basicSlicesIntFieldID = badorm.FieldIdentifier{Field: "Int"} + func BasicSlicesInt(expr badorm.Expression[[]int]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int"}, + FieldIdentifier: basicSlicesIntFieldID, } } + +var basicSlicesInt8FieldID = badorm.FieldIdentifier{Field: "Int8"} + func BasicSlicesInt8(expr badorm.Expression[[]int8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int8"}, + FieldIdentifier: basicSlicesInt8FieldID, } } + +var basicSlicesInt16FieldID = badorm.FieldIdentifier{Field: "Int16"} + func BasicSlicesInt16(expr badorm.Expression[[]int16]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int16]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int16"}, + FieldIdentifier: basicSlicesInt16FieldID, } } + +var basicSlicesInt32FieldID = badorm.FieldIdentifier{Field: "Int32"} + func BasicSlicesInt32(expr badorm.Expression[[]int32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int32"}, + FieldIdentifier: basicSlicesInt32FieldID, } } + +var basicSlicesInt64FieldID = badorm.FieldIdentifier{Field: "Int64"} + func BasicSlicesInt64(expr badorm.Expression[[]int64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int64"}, + FieldIdentifier: basicSlicesInt64FieldID, } } + +var basicSlicesUIntFieldID = badorm.FieldIdentifier{Field: "UInt"} + func BasicSlicesUInt(expr badorm.Expression[[]uint]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt"}, + FieldIdentifier: basicSlicesUIntFieldID, } } + +var basicSlicesUInt8FieldID = badorm.FieldIdentifier{Field: "UInt8"} + func BasicSlicesUInt8(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt8"}, + FieldIdentifier: basicSlicesUInt8FieldID, } } + +var basicSlicesUInt16FieldID = badorm.FieldIdentifier{Field: "UInt16"} + func BasicSlicesUInt16(expr badorm.Expression[[]uint16]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint16]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt16"}, + FieldIdentifier: basicSlicesUInt16FieldID, } } + +var basicSlicesUInt32FieldID = badorm.FieldIdentifier{Field: "UInt32"} + func BasicSlicesUInt32(expr badorm.Expression[[]uint32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt32"}, + FieldIdentifier: basicSlicesUInt32FieldID, } } + +var basicSlicesUInt64FieldID = badorm.FieldIdentifier{Field: "UInt64"} + func BasicSlicesUInt64(expr badorm.Expression[[]uint64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt64"}, + FieldIdentifier: basicSlicesUInt64FieldID, } } + +var basicSlicesUIntptrFieldID = badorm.FieldIdentifier{Field: "UIntptr"} + func BasicSlicesUIntptr(expr badorm.Expression[[]uintptr]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uintptr]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UIntptr"}, + FieldIdentifier: basicSlicesUIntptrFieldID, } } + +var basicSlicesFloat32FieldID = badorm.FieldIdentifier{Field: "Float32"} + func BasicSlicesFloat32(expr badorm.Expression[[]float32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []float32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Float32"}, + FieldIdentifier: basicSlicesFloat32FieldID, } } + +var basicSlicesFloat64FieldID = badorm.FieldIdentifier{Field: "Float64"} + func BasicSlicesFloat64(expr badorm.Expression[[]float64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []float64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Float64"}, + FieldIdentifier: basicSlicesFloat64FieldID, } } + +var basicSlicesComplex64FieldID = badorm.FieldIdentifier{Field: "Complex64"} + func BasicSlicesComplex64(expr badorm.Expression[[]complex64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []complex64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Complex64"}, + FieldIdentifier: basicSlicesComplex64FieldID, } } + +var basicSlicesComplex128FieldID = badorm.FieldIdentifier{Field: "Complex128"} + func BasicSlicesComplex128(expr badorm.Expression[[]complex128]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []complex128]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Complex128"}, + FieldIdentifier: basicSlicesComplex128FieldID, } } + +var basicSlicesStringFieldID = badorm.FieldIdentifier{Field: "String"} + func BasicSlicesString(expr badorm.Expression[[]string]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "String"}, + FieldIdentifier: basicSlicesStringFieldID, } } + +var basicSlicesByteFieldID = badorm.FieldIdentifier{Field: "Byte"} + func BasicSlicesByte(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Byte"}, + FieldIdentifier: basicSlicesByteFieldID, } } + +var BasicSlicesPreload = badorm.NewPreloadCondition[basicslices.BasicSlices](basicSlicesBoolFieldID, basicSlicesIntFieldID, basicSlicesInt8FieldID, basicSlicesInt16FieldID, basicSlicesInt32FieldID, basicSlicesInt64FieldID, basicSlicesUIntFieldID, basicSlicesUInt8FieldID, basicSlicesUInt16FieldID, basicSlicesUInt32FieldID, basicSlicesUInt64FieldID, basicSlicesUIntptrFieldID, basicSlicesFloat32FieldID, basicSlicesFloat64FieldID, basicSlicesComplex64FieldID, basicSlicesComplex128FieldID, basicSlicesStringFieldID, basicSlicesByteFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go index fafff250..017fe37b 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go @@ -32,111 +32,167 @@ func BasicSlicesPointerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm. FieldIdentifier: badorm.DeletedAtFieldID, } } + +var basicSlicesPointerBoolFieldID = badorm.FieldIdentifier{Field: "Bool"} + func BasicSlicesPointerBool(expr badorm.Expression[[]bool]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []bool]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Bool"}, + FieldIdentifier: basicSlicesPointerBoolFieldID, } } + +var basicSlicesPointerIntFieldID = badorm.FieldIdentifier{Field: "Int"} + func BasicSlicesPointerInt(expr badorm.Expression[[]int]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int"}, + FieldIdentifier: basicSlicesPointerIntFieldID, } } + +var basicSlicesPointerInt8FieldID = badorm.FieldIdentifier{Field: "Int8"} + func BasicSlicesPointerInt8(expr badorm.Expression[[]int8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int8"}, + FieldIdentifier: basicSlicesPointerInt8FieldID, } } + +var basicSlicesPointerInt16FieldID = badorm.FieldIdentifier{Field: "Int16"} + func BasicSlicesPointerInt16(expr badorm.Expression[[]int16]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int16]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int16"}, + FieldIdentifier: basicSlicesPointerInt16FieldID, } } + +var basicSlicesPointerInt32FieldID = badorm.FieldIdentifier{Field: "Int32"} + func BasicSlicesPointerInt32(expr badorm.Expression[[]int32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int32"}, + FieldIdentifier: basicSlicesPointerInt32FieldID, } } + +var basicSlicesPointerInt64FieldID = badorm.FieldIdentifier{Field: "Int64"} + func BasicSlicesPointerInt64(expr badorm.Expression[[]int64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int64"}, + FieldIdentifier: basicSlicesPointerInt64FieldID, } } + +var basicSlicesPointerUIntFieldID = badorm.FieldIdentifier{Field: "UInt"} + func BasicSlicesPointerUInt(expr badorm.Expression[[]uint]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt"}, + FieldIdentifier: basicSlicesPointerUIntFieldID, } } + +var basicSlicesPointerUInt8FieldID = badorm.FieldIdentifier{Field: "UInt8"} + func BasicSlicesPointerUInt8(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt8"}, + FieldIdentifier: basicSlicesPointerUInt8FieldID, } } + +var basicSlicesPointerUInt16FieldID = badorm.FieldIdentifier{Field: "UInt16"} + func BasicSlicesPointerUInt16(expr badorm.Expression[[]uint16]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint16]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt16"}, + FieldIdentifier: basicSlicesPointerUInt16FieldID, } } + +var basicSlicesPointerUInt32FieldID = badorm.FieldIdentifier{Field: "UInt32"} + func BasicSlicesPointerUInt32(expr badorm.Expression[[]uint32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt32"}, + FieldIdentifier: basicSlicesPointerUInt32FieldID, } } + +var basicSlicesPointerUInt64FieldID = badorm.FieldIdentifier{Field: "UInt64"} + func BasicSlicesPointerUInt64(expr badorm.Expression[[]uint64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt64"}, + FieldIdentifier: basicSlicesPointerUInt64FieldID, } } + +var basicSlicesPointerUIntptrFieldID = badorm.FieldIdentifier{Field: "UIntptr"} + func BasicSlicesPointerUIntptr(expr badorm.Expression[[]uintptr]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uintptr]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UIntptr"}, + FieldIdentifier: basicSlicesPointerUIntptrFieldID, } } + +var basicSlicesPointerFloat32FieldID = badorm.FieldIdentifier{Field: "Float32"} + func BasicSlicesPointerFloat32(expr badorm.Expression[[]float32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []float32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Float32"}, + FieldIdentifier: basicSlicesPointerFloat32FieldID, } } + +var basicSlicesPointerFloat64FieldID = badorm.FieldIdentifier{Field: "Float64"} + func BasicSlicesPointerFloat64(expr badorm.Expression[[]float64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []float64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Float64"}, + FieldIdentifier: basicSlicesPointerFloat64FieldID, } } + +var basicSlicesPointerComplex64FieldID = badorm.FieldIdentifier{Field: "Complex64"} + func BasicSlicesPointerComplex64(expr badorm.Expression[[]complex64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []complex64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Complex64"}, + FieldIdentifier: basicSlicesPointerComplex64FieldID, } } + +var basicSlicesPointerComplex128FieldID = badorm.FieldIdentifier{Field: "Complex128"} + func BasicSlicesPointerComplex128(expr badorm.Expression[[]complex128]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []complex128]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Complex128"}, + FieldIdentifier: basicSlicesPointerComplex128FieldID, } } + +var basicSlicesPointerStringFieldID = badorm.FieldIdentifier{Field: "String"} + func BasicSlicesPointerString(expr badorm.Expression[[]string]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "String"}, + FieldIdentifier: basicSlicesPointerStringFieldID, } } + +var basicSlicesPointerByteFieldID = badorm.FieldIdentifier{Field: "Byte"} + func BasicSlicesPointerByte(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Byte"}, + FieldIdentifier: basicSlicesPointerByteFieldID, } } + +var BasicSlicesPointerPreload = badorm.NewPreloadCondition[basicslicespointer.BasicSlicesPointer](basicSlicesPointerBoolFieldID, basicSlicesPointerIntFieldID, basicSlicesPointerInt8FieldID, basicSlicesPointerInt16FieldID, basicSlicesPointerInt32FieldID, basicSlicesPointerInt64FieldID, basicSlicesPointerUIntFieldID, basicSlicesPointerUInt8FieldID, basicSlicesPointerUInt16FieldID, basicSlicesPointerUInt32FieldID, basicSlicesPointerUInt64FieldID, basicSlicesPointerUIntptrFieldID, basicSlicesPointerFloat32FieldID, basicSlicesPointerFloat64FieldID, basicSlicesPointerComplex64FieldID, basicSlicesPointerComplex128FieldID, basicSlicesPointerStringFieldID, basicSlicesPointerByteFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go index 285845f8..e28800bf 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go @@ -32,111 +32,167 @@ func BasicTypesDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCon FieldIdentifier: badorm.DeletedAtFieldID, } } + +var basicTypesBoolFieldID = badorm.FieldIdentifier{Field: "Bool"} + func BasicTypesBool(expr badorm.Expression[bool]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, bool]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Bool"}, + FieldIdentifier: basicTypesBoolFieldID, } } + +var basicTypesIntFieldID = badorm.FieldIdentifier{Field: "Int"} + func BasicTypesInt(expr badorm.Expression[int]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int"}, + FieldIdentifier: basicTypesIntFieldID, } } + +var basicTypesInt8FieldID = badorm.FieldIdentifier{Field: "Int8"} + func BasicTypesInt8(expr badorm.Expression[int8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int8"}, + FieldIdentifier: basicTypesInt8FieldID, } } + +var basicTypesInt16FieldID = badorm.FieldIdentifier{Field: "Int16"} + func BasicTypesInt16(expr badorm.Expression[int16]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int16]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int16"}, + FieldIdentifier: basicTypesInt16FieldID, } } + +var basicTypesInt32FieldID = badorm.FieldIdentifier{Field: "Int32"} + func BasicTypesInt32(expr badorm.Expression[int32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int32"}, + FieldIdentifier: basicTypesInt32FieldID, } } + +var basicTypesInt64FieldID = badorm.FieldIdentifier{Field: "Int64"} + func BasicTypesInt64(expr badorm.Expression[int64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Int64"}, + FieldIdentifier: basicTypesInt64FieldID, } } + +var basicTypesUIntFieldID = badorm.FieldIdentifier{Field: "UInt"} + func BasicTypesUInt(expr badorm.Expression[uint]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt"}, + FieldIdentifier: basicTypesUIntFieldID, } } + +var basicTypesUInt8FieldID = badorm.FieldIdentifier{Field: "UInt8"} + func BasicTypesUInt8(expr badorm.Expression[uint8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt8"}, + FieldIdentifier: basicTypesUInt8FieldID, } } + +var basicTypesUInt16FieldID = badorm.FieldIdentifier{Field: "UInt16"} + func BasicTypesUInt16(expr badorm.Expression[uint16]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint16]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt16"}, + FieldIdentifier: basicTypesUInt16FieldID, } } + +var basicTypesUInt32FieldID = badorm.FieldIdentifier{Field: "UInt32"} + func BasicTypesUInt32(expr badorm.Expression[uint32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt32"}, + FieldIdentifier: basicTypesUInt32FieldID, } } + +var basicTypesUInt64FieldID = badorm.FieldIdentifier{Field: "UInt64"} + func BasicTypesUInt64(expr badorm.Expression[uint64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UInt64"}, + FieldIdentifier: basicTypesUInt64FieldID, } } + +var basicTypesUIntptrFieldID = badorm.FieldIdentifier{Field: "UIntptr"} + func BasicTypesUIntptr(expr badorm.Expression[uintptr]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uintptr]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "UIntptr"}, + FieldIdentifier: basicTypesUIntptrFieldID, } } + +var basicTypesFloat32FieldID = badorm.FieldIdentifier{Field: "Float32"} + func BasicTypesFloat32(expr badorm.Expression[float32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, float32]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Float32"}, + FieldIdentifier: basicTypesFloat32FieldID, } } + +var basicTypesFloat64FieldID = badorm.FieldIdentifier{Field: "Float64"} + func BasicTypesFloat64(expr badorm.Expression[float64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, float64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Float64"}, + FieldIdentifier: basicTypesFloat64FieldID, } } + +var basicTypesComplex64FieldID = badorm.FieldIdentifier{Field: "Complex64"} + func BasicTypesComplex64(expr badorm.Expression[complex64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, complex64]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Complex64"}, + FieldIdentifier: basicTypesComplex64FieldID, } } + +var basicTypesComplex128FieldID = badorm.FieldIdentifier{Field: "Complex128"} + func BasicTypesComplex128(expr badorm.Expression[complex128]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, complex128]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Complex128"}, + FieldIdentifier: basicTypesComplex128FieldID, } } + +var basicTypesStringFieldID = badorm.FieldIdentifier{Field: "String"} + func BasicTypesString(expr badorm.Expression[string]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "String"}, + FieldIdentifier: basicTypesStringFieldID, } } + +var basicTypesByteFieldID = badorm.FieldIdentifier{Field: "Byte"} + func BasicTypesByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint8]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Byte"}, + FieldIdentifier: basicTypesByteFieldID, } } + +var BasicTypesPreload = badorm.NewPreloadCondition[basictypes.BasicTypes](basicTypesBoolFieldID, basicTypesIntFieldID, basicTypesInt8FieldID, basicTypesInt16FieldID, basicTypesInt32FieldID, basicTypesInt64FieldID, basicTypesUIntFieldID, basicTypesUInt8FieldID, basicTypesUInt16FieldID, basicTypesUInt32FieldID, basicTypesUInt64FieldID, basicTypesUIntptrFieldID, basicTypesFloat32FieldID, basicTypesFloat64FieldID, basicTypesComplex64FieldID, basicTypesComplex128FieldID, basicTypesStringFieldID, basicTypesByteFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go index 5b3f2157..a465afa4 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go @@ -40,9 +40,14 @@ func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Conditio T2Field: "ID", } } + +var ownedOwnerIdFieldID = badorm.FieldIdentifier{Field: "OwnerID"} + func OwnedOwnerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "OwnerID"}, + FieldIdentifier: ownedOwnerIdFieldID, } } + +var OwnedPreload = badorm.NewPreloadCondition[belongsto.Owned](ownedOwnerIdFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go index 14b07700..f4a3cedd 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go @@ -32,3 +32,5 @@ func OwnerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio FieldIdentifier: badorm.DeletedAtFieldID, } } + +var OwnerPreload = badorm.NewPreloadCondition[belongsto.Owner]() diff --git a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go index 0b107dc5..3e3dc6ed 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go @@ -32,9 +32,14 @@ func ColumnDefinitionDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.Wh FieldIdentifier: badorm.DeletedAtFieldID, } } + +var columnDefinitionStringFieldID = badorm.FieldIdentifier{Column: "string_something_else"} + func ColumnDefinitionString(expr badorm.Expression[string]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Column: "string_something_else"}, + FieldIdentifier: columnDefinitionStringFieldID, } } + +var ColumnDefinitionPreload = badorm.NewPreloadCondition[columndefinition.ColumnDefinition](columnDefinitionStringFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go index 21e4b6a7..1bcafd23 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go @@ -32,9 +32,14 @@ func CustomTypeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCon FieldIdentifier: badorm.DeletedAtFieldID, } } + +var customTypeCustomFieldID = badorm.FieldIdentifier{Field: "Custom"} + func CustomTypeCustom(expr badorm.Expression[customtype.MultiString]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, customtype.MultiString]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Custom"}, + FieldIdentifier: customTypeCustomFieldID, } } + +var CustomTypePreload = badorm.NewPreloadCondition[customtype.CustomType](customTypeCustomFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go index 3d51ca57..0b74c21b 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go @@ -32,9 +32,14 @@ func GoEmbeddedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCon FieldIdentifier: badorm.DeletedAtFieldID, } } + +var goEmbeddedEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "EmbeddedInt"} + func GoEmbeddedEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, int]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "EmbeddedInt"}, + FieldIdentifier: goEmbeddedEmbeddedIntFieldID, } } + +var GoEmbeddedPreload = badorm.NewPreloadCondition[goembedded.GoEmbedded](goEmbeddedEmbeddedIntFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go index 8abfe94d..36e2dc98 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go @@ -32,12 +32,17 @@ func GormEmbeddedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereC FieldIdentifier: badorm.DeletedAtFieldID, } } + +var gormEmbeddedGormEmbeddedIntFieldID = badorm.FieldIdentifier{ + ColumnPrefix: "gorm_embedded_", + Field: "Int", +} + func GormEmbeddedGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, int]{ - Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{ - ColumnPrefix: "gorm_embedded_", - Field: "Int", - }, + Expression: expr, + FieldIdentifier: gormEmbeddedGormEmbeddedIntFieldID, } } + +var GormEmbeddedPreload = badorm.NewPreloadCondition[gormembedded.GormEmbedded](gormEmbeddedGormEmbeddedIntFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go index 38c490b0..5ae4ce2a 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go @@ -40,3 +40,5 @@ func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.Condi T2Field: "ID", } } + +var CompanyPreload = badorm.NewPreloadCondition[hasmany.Company]() diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go index 5ab2a68d..e56ea593 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go @@ -32,9 +32,14 @@ func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditi FieldIdentifier: badorm.DeletedAtFieldID, } } + +var sellerCompanyIdFieldID = badorm.FieldIdentifier{Field: "CompanyID"} + func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "CompanyID"}, + FieldIdentifier: sellerCompanyIdFieldID, } } + +var SellerPreload = badorm.NewPreloadCondition[hasmany.Seller](sellerCompanyIdFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go index cf95d22d..35b234fb 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go @@ -32,9 +32,14 @@ func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition FieldIdentifier: badorm.DeletedAtFieldID, } } + +var cityCountryIdFieldID = badorm.FieldIdentifier{Field: "CountryID"} + func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "CountryID"}, + FieldIdentifier: cityCountryIdFieldID, } } + +var CityPreload = badorm.NewPreloadCondition[hasone.City](cityCountryIdFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go index 15ae61b3..efcdc955 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go @@ -48,3 +48,5 @@ func CityCountry(conditions ...badorm.Condition[hasone.Country]) badorm.Conditio T2Field: "ID", } } + +var CountryPreload = badorm.NewPreloadCondition[hasone.Country]() diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go index 00f4e254..bac3e1a4 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go @@ -49,3 +49,5 @@ func Package2Package1(conditions ...badorm.Condition[package1.Package1]) badorm. T2Field: "ID", } } + +var Package1Preload = badorm.NewPreloadCondition[package1.Package1]() diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go index 54b6b1f0..d628a916 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go @@ -40,9 +40,14 @@ func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) bad T2Field: "ID", } } + +var bicycleOwnerSomethingIdFieldID = badorm.FieldIdentifier{Field: "OwnerSomethingID"} + func BicycleOwnerSomethingId(expr badorm.Expression[string]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "OwnerSomethingID"}, + FieldIdentifier: bicycleOwnerSomethingIdFieldID, } } + +var BicyclePreload = badorm.NewPreloadCondition[overrideforeignkey.Bicycle](bicycleOwnerSomethingIdFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go index cc943ee5..5e751125 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go @@ -48,3 +48,5 @@ func CreditCardUser(conditions ...badorm.Condition[overrideforeignkeyinverse.Use T2Field: "ID", } } + +var UserPreload = badorm.NewPreloadCondition[overrideforeignkeyinverse.User]() diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go index be6e5130..8f3b54fe 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go @@ -40,9 +40,14 @@ func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm T2Field: "Name", } } + +var phoneBrandNameFieldID = badorm.FieldIdentifier{Field: "BrandName"} + func PhoneBrandName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "BrandName"}, + FieldIdentifier: phoneBrandNameFieldID, } } + +var PhonePreload = badorm.NewPreloadCondition[overridereferences.Phone](phoneBrandNameFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go index 16b7d4b7..a88653fd 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go @@ -32,10 +32,13 @@ func ComputerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondi FieldIdentifier: badorm.DeletedAtFieldID, } } + +var computerNameFieldID = badorm.FieldIdentifier{Field: "Name"} + func ComputerName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "Name"}, + FieldIdentifier: computerNameFieldID, } } func ComputerProcessor(conditions ...badorm.Condition[overridereferencesinverse.Processor]) badorm.Condition[overridereferencesinverse.Computer] { @@ -54,3 +57,5 @@ func ProcessorComputer(conditions ...badorm.Condition[overridereferencesinverse. T2Field: "Name", } } + +var ComputerPreload = badorm.NewPreloadCondition[overridereferencesinverse.Computer](computerNameFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go index 83f91b6a..f5b5a6e0 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go @@ -40,9 +40,14 @@ func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) bado T2Field: "ID", } } + +var employeeBossIdFieldID = badorm.FieldIdentifier{Field: "BossID"} + func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{Field: "BossID"}, + FieldIdentifier: employeeBossIdFieldID, } } + +var EmployeePreload = badorm.NewPreloadCondition[selfreferential.Employee](employeeBossIdFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go index 7ce205a1..a2a275cd 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go @@ -32,3 +32,5 @@ func UintModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCond FieldIdentifier: badorm.DeletedAtFieldID, } } + +var UintModelPreload = badorm.NewPreloadCondition[uintmodel.UintModel]() diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go index c8c3e707..9af0ceed 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go @@ -32,3 +32,5 @@ func UUIDModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCond FieldIdentifier: badorm.DeletedAtFieldID, } } + +var UUIDModelPreload = badorm.NewPreloadCondition[uuidmodel.UUIDModel]() From 3a0a6250332a3cc0750cdda8f69cdbdb8fe75d3a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 21 Jun 2023 13:56:01 +0200 Subject: [PATCH 387/467] support attributes named in the same way inside embedded structs --- .../conditions/product_conditions.go | 8 ++++---- testintegration/where_conditions_test.go | 2 +- tools/badctl/cmd/gen/conditions/condition.go | 2 +- tools/badctl/cmd/gen/conditions/field.go | 16 +++++++-------- tools/badctl/cmd/gen/conditions/file.go | 14 +++++++++++-- .../conditions/tests/goembedded/goembedded.go | 3 ++- .../tests/gormembedded/gormembedded.go | 4 +++- .../conditions/tests/results/goembedded.go | 17 ++++++++++++---- .../conditions/tests/results/gormembedded.go | 20 ++++++++++++++++++- tools/badctl/cmd/gen/conditions/type.go | 8 ++++++-- 10 files changed, 69 insertions(+), 25 deletions(-) diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index fc4ac19d..d9a54f45 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -115,12 +115,12 @@ func ProductMultiString(expr badorm.Expression[models.MultiString]) badorm.Where } } -var productEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "EmbeddedInt"} +var productToBeEmbeddedEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "EmbeddedInt"} -func ProductEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { +func ProductToBeEmbeddedEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ Expression: expr, - FieldIdentifier: productEmbeddedIntFieldID, + FieldIdentifier: productToBeEmbeddedEmbeddedIntFieldID, } } @@ -136,4 +136,4 @@ func ProductGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[m } } -var ProductPreload = badorm.NewPreloadCondition[models.Product](productStringFieldID, productIntFieldID, productIntPointerFieldID, productFloatFieldID, productNullFloatFieldID, productBoolFieldID, productNullBoolFieldID, productByteArrayFieldID, productMultiStringFieldID, productEmbeddedIntFieldID, productGormEmbeddedIntFieldID) +var ProductPreload = badorm.NewPreloadCondition[models.Product](productStringFieldID, productIntFieldID, productIntPointerFieldID, productFloatFieldID, productNullFloatFieldID, productBoolFieldID, productNullBoolFieldID, productByteArrayFieldID, productMultiStringFieldID, productToBeEmbeddedEmbeddedIntFieldID, productGormEmbeddedIntFieldID) diff --git a/testintegration/where_conditions_test.go b/testintegration/where_conditions_test.go index 1f104c9f..3fb47427 100644 --- a/testintegration/where_conditions_test.go +++ b/testintegration/where_conditions_test.go @@ -264,7 +264,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfEmbedded() { ts.Nil(err) entities, err := ts.crudProductService.GetEntities( - conditions.ProductEmbeddedInt(badorm.Eq(1)), + conditions.ProductToBeEmbeddedEmbeddedInt(badorm.Eq(1)), ) ts.Nil(err) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 694784ce..10a4e526 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -333,7 +333,7 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, // Generate condition names func getConditionName(typeV Type, field Field) string { - return typeV.Name() + strcase.ToPascal(field.ColumnPrefix) + strcase.ToPascal(field.Name) + return typeV.Name() + strcase.ToPascal(field.NamePrefix) + strcase.ToPascal(field.Name) } // Avoid importing the same package as the destination one diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index 1e7f9197..9a20e3be 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -7,6 +7,7 @@ import ( type Field struct { Name string + NamePrefix string Type Type Embedded bool Tags GormTags @@ -85,7 +86,7 @@ func (field Field) ChangeType(newType types.Type) Field { // Get fields of a BaDORM model // Returns error is objectType is not a BaDORM model -func getFields(objectType Type, prefix string) ([]Field, error) { +func getFields(objectType Type) ([]Field, error) { // The underlying type has to be a struct and a BaDORM Model // (ignore const, var, func, etc.) structType, err := objectType.BadORMModelStruct() @@ -93,12 +94,12 @@ func getFields(objectType Type, prefix string) ([]Field, error) { return nil, err } - return getStructFields(structType, prefix) + return getStructFields(structType) } // Get fields of a struct // Returns errors if the struct has not fields -func getStructFields(structType *types.Struct, prefix string) ([]Field, error) { +func getStructFields(structType *types.Struct) ([]Field, error) { numFields := structType.NumFields() if numFields == 0 { return nil, errors.New("struct has 0 fields") @@ -111,11 +112,10 @@ func getStructFields(structType *types.Struct, prefix string) ([]Field, error) { fieldObject := structType.Field(i) gormTags := getGormTags(structType.Tag(i)) fields = append(fields, Field{ - Name: fieldObject.Name(), - Type: Type{fieldObject.Type()}, - Embedded: fieldObject.Embedded() || gormTags.hasEmbedded(), - Tags: gormTags, - ColumnPrefix: prefix, + Name: fieldObject.Name(), + Type: Type{fieldObject.Type()}, + Embedded: fieldObject.Embedded() || gormTags.hasEmbedded(), + Tags: gormTags, }) } diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 2422e303..6d325b9f 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -5,6 +5,7 @@ import ( "go/types" "github.com/dave/jennifer/jen" + "github.com/elliotchance/pie/v2" "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/badaas/tools/badctl/cmd/log" @@ -49,7 +50,7 @@ func NewConditionsFile(destPkg string, name string, object types.Object) (*File, // Add conditions for an object in the file func (file File) addConditions() error { - fields, err := getFields(file.objectType, "") + fields, err := getFields(file.objectType) if err != nil { return err } @@ -127,11 +128,20 @@ func (file File) generateEmbeddedConditions(field Field) []*Condition { cmderrors.FailErr(errors.New("unreachable! embedded objects are always structs")) } - fields, err := getStructFields(embeddedStructType, field.Tags.getEmbeddedPrefix()) + fields, err := getStructFields(embeddedStructType) if err != nil { // embedded field's type has not fields return []*Condition{} } + if !isBadORMBaseModel(field.TypeString()) { + fields = pie.Map(fields, func(embeddedField Field) Field { + embeddedField.ColumnPrefix = field.Tags.getEmbeddedPrefix() + embeddedField.NamePrefix = field.Name + + return embeddedField + }) + } + return file.generateConditionsForEachField(fields) } diff --git a/tools/badctl/cmd/gen/conditions/tests/goembedded/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/goembedded/goembedded.go index 2e2a3d2a..cdaee23d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/goembedded/goembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/goembedded/goembedded.go @@ -3,11 +3,12 @@ package goembedded import "github.com/ditrit/badaas/badorm" type ToBeEmbedded struct { - EmbeddedInt int + Int int } type GoEmbedded struct { badorm.UIntModel + Int int ToBeEmbedded } diff --git a/tools/badctl/cmd/gen/conditions/tests/gormembedded/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/gormembedded/gormembedded.go index 8e810242..00911fe3 100644 --- a/tools/badctl/cmd/gen/conditions/tests/gormembedded/gormembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/gormembedded/gormembedded.go @@ -9,5 +9,7 @@ type ToBeGormEmbedded struct { type GormEmbedded struct { badorm.UIntModel - GormEmbedded ToBeGormEmbedded `gorm:"embedded;embeddedPrefix:gorm_embedded_"` + Int int + GormEmbedded ToBeGormEmbedded `gorm:"embedded;embeddedPrefix:gorm_embedded_"` + GormEmbeddedNoPrefix ToBeGormEmbedded `gorm:"embedded"` } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go index 0b74c21b..e5d220b7 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go @@ -33,13 +33,22 @@ func GoEmbeddedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCon } } -var goEmbeddedEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "EmbeddedInt"} +var goEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "Int"} -func GoEmbeddedEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[goembedded.GoEmbedded] { +func GoEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, int]{ Expression: expr, - FieldIdentifier: goEmbeddedEmbeddedIntFieldID, + FieldIdentifier: goEmbeddedIntFieldID, } } -var GoEmbeddedPreload = badorm.NewPreloadCondition[goembedded.GoEmbedded](goEmbeddedEmbeddedIntFieldID) +var goEmbeddedToBeEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "Int"} + +func GoEmbeddedToBeEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[goembedded.GoEmbedded] { + return badorm.FieldCondition[goembedded.GoEmbedded, int]{ + Expression: expr, + FieldIdentifier: goEmbeddedToBeEmbeddedIntFieldID, + } +} + +var GoEmbeddedPreload = badorm.NewPreloadCondition[goembedded.GoEmbedded](goEmbeddedIntFieldID, goEmbeddedToBeEmbeddedIntFieldID) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go index 36e2dc98..d2b55252 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go @@ -33,6 +33,15 @@ func GormEmbeddedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereC } } +var gormEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "Int"} + +func GormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { + return badorm.FieldCondition[gormembedded.GormEmbedded, int]{ + Expression: expr, + FieldIdentifier: gormEmbeddedIntFieldID, + } +} + var gormEmbeddedGormEmbeddedIntFieldID = badorm.FieldIdentifier{ ColumnPrefix: "gorm_embedded_", Field: "Int", @@ -45,4 +54,13 @@ func GormEmbeddedGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondit } } -var GormEmbeddedPreload = badorm.NewPreloadCondition[gormembedded.GormEmbedded](gormEmbeddedGormEmbeddedIntFieldID) +var gormEmbeddedGormEmbeddedNoPrefixIntFieldID = badorm.FieldIdentifier{Field: "Int"} + +func GormEmbeddedGormEmbeddedNoPrefixInt(expr badorm.Expression[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { + return badorm.FieldCondition[gormembedded.GormEmbedded, int]{ + Expression: expr, + FieldIdentifier: gormEmbeddedGormEmbeddedNoPrefixIntFieldID, + } +} + +var GormEmbeddedPreload = badorm.NewPreloadCondition[gormembedded.GormEmbedded](gormEmbeddedIntFieldID, gormEmbeddedGormEmbeddedIntFieldID, gormEmbeddedGormEmbeddedNoPrefixIntFieldID) diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index c2c77402..20c86254 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -52,7 +52,7 @@ func isBadORMModel(structType *types.Struct) bool { for i := 0; i < structType.NumFields(); i++ { field := structType.Field(i) - if field.Embedded() && pie.Contains(badORMModels, field.Type().String()) { + if field.Embedded() && isBadORMBaseModel(field.Type().String()) { return true } } @@ -60,10 +60,14 @@ func isBadORMModel(structType *types.Struct) bool { return false } +func isBadORMBaseModel(fieldName string) bool { + return pie.Contains(badORMModels, fieldName) +} + // Returns true is the type has a foreign key to the field's object // (another field that references that object) func (t Type) HasFK(field Field) (bool, error) { - objectFields, err := getFields(t, "") + objectFields, err := getFields(t) if err != nil { return false, err } From 14e90d7c7f1184d3bbb3598d149cfbea177087ec Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 21 Jun 2023 13:57:05 +0200 Subject: [PATCH 388/467] fix lint --- testintegration/join_conditions_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 13f4d65b..f71913c3 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -1,11 +1,10 @@ package testintegration import ( + "github.com/elliotchance/pie/v2" "gorm.io/gorm" "gotest.tools/assert" - "github.com/elliotchance/pie/v2" - "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" From b1556255509287817bc1a8cd9b1c1d989a39acf4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 21 Jun 2023 16:32:50 +0200 Subject: [PATCH 389/467] autogenerate Preload relations + remove inverse Join because its not necessary if we put reverse references in the model --- badorm/condition.go | 2 - .../conditions/bicycle_conditions.go | 4 +- .../conditions/brand_conditions.go | 3 +- .../conditions/child_conditions.go | 5 +- testintegration/conditions/city_conditions.go | 12 ++- .../conditions/company_conditions.go | 11 +-- .../conditions/country_conditions.go | 12 +-- .../conditions/employee_conditions.go | 4 +- .../conditions/parent1_conditions.go | 4 +- .../conditions/parent2_conditions.go | 4 +- .../conditions/parent_parent_conditions.go | 3 +- .../conditions/person_conditions.go | 3 +- .../conditions/phone_conditions.go | 4 +- .../conditions/product_conditions.go | 3 +- testintegration/conditions/sale_conditions.go | 5 +- .../conditions/seller_conditions.go | 12 ++- testintegration/join_conditions_test.go | 93 ++++++++++++++----- testintegration/models/models.go | 20 +++- tools/badctl/cmd/gen/conditions/condition.go | 40 +++----- tools/badctl/cmd/gen/conditions/file.go | 37 ++++++-- 20 files changed, 188 insertions(+), 93 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 2416a66f..72a62c27 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -290,8 +290,6 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // get the sql to do the join with T2 // if it's only a preload use a left join - // TODO una condicion para ver que la relacion sea null (ademas de hacerle is null al fk) - // TODO no me termina de convencer que para el preload hay que hacer el join si o si isLeftJoin := len(whereConditions) == 0 && preloadCondition != nil joinQuery := condition.getSQLJoin( query, diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index f3125671..d601b1d2 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -50,6 +50,7 @@ func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Conditio } } +var BicyclePreloadOwner = BicycleOwner(PersonPreloadAttributes) var bicycleOwnerNameFieldID = badorm.FieldIdentifier{Field: "OwnerName"} func BicycleOwnerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { @@ -59,4 +60,5 @@ func BicycleOwnerName(expr badorm.Expression[string]) badorm.WhereCondition[mode } } -var BicyclePreload = badorm.NewPreloadCondition[models.Bicycle](bicycleNameFieldID, bicycleOwnerNameFieldID) +var BicyclePreloadAttributes = badorm.NewPreloadCondition[models.Bicycle](bicycleNameFieldID, bicycleOwnerNameFieldID) +var BicyclePreloadRelations = []badorm.Condition[models.Bicycle]{BicyclePreloadOwner} diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index 77aa68b7..f5fbf804 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -42,4 +42,5 @@ func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bran } } -var BrandPreload = badorm.NewPreloadCondition[models.Brand](brandNameFieldID) +var BrandPreloadAttributes = badorm.NewPreloadCondition[models.Brand](brandNameFieldID) +var BrandPreloadRelations = []badorm.Condition[models.Brand]{} diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index b23749f0..a925e735 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -41,6 +41,7 @@ func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.Conditi } } +var ChildPreloadParent1 = ChildParent1(Parent1PreloadAttributes) var childParent1IdFieldID = badorm.FieldIdentifier{Field: "Parent1ID"} func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { @@ -58,6 +59,7 @@ func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.Conditi } } +var ChildPreloadParent2 = ChildParent2(Parent2PreloadAttributes) var childParent2IdFieldID = badorm.FieldIdentifier{Field: "Parent2ID"} func ChildParent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { @@ -67,4 +69,5 @@ func ChildParent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[m } } -var ChildPreload = badorm.NewPreloadCondition[models.Child](childParent1IdFieldID, childParent2IdFieldID) +var ChildPreloadAttributes = badorm.NewPreloadCondition[models.Child](childParent1IdFieldID, childParent2IdFieldID) +var ChildPreloadRelations = []badorm.Condition[models.Child]{ChildPreloadParent1, ChildPreloadParent2} diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index d3778352..67648fa2 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -41,7 +41,16 @@ func CityName(expr badorm.Expression[string]) badorm.WhereCondition[models.City] FieldIdentifier: cityNameFieldID, } } +func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.Condition[models.City] { + return badorm.JoinCondition[models.City, models.Country]{ + Conditions: conditions, + RelationField: "Country", + T1Field: "CountryID", + T2Field: "ID", + } +} +var CityPreloadCountry = CityCountry(CountryPreloadAttributes) var cityCountryIdFieldID = badorm.FieldIdentifier{Field: "CountryID"} func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { @@ -51,4 +60,5 @@ func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[mo } } -var CityPreload = badorm.NewPreloadCondition[models.City](cityNameFieldID, cityCountryIdFieldID) +var CityPreloadAttributes = badorm.NewPreloadCondition[models.City](cityNameFieldID, cityCountryIdFieldID) +var CityPreloadRelations = []badorm.Condition[models.City]{CityPreloadCountry} diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index 407acf15..3990b0b0 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -41,13 +41,6 @@ func CompanyName(expr badorm.Expression[string]) badorm.WhereCondition[models.Co FieldIdentifier: companyNameFieldID, } } -func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { - return badorm.JoinCondition[models.Seller, models.Company]{ - Conditions: conditions, - RelationField: "Company", - T1Field: "CompanyID", - T2Field: "ID", - } -} -var CompanyPreload = badorm.NewPreloadCondition[models.Company](companyNameFieldID) +var CompanyPreloadAttributes = badorm.NewPreloadCondition[models.Company](companyNameFieldID) +var CompanyPreloadRelations = []badorm.Condition[models.Company]{} diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index 6f0ef97c..bc5f8c91 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -49,13 +49,7 @@ func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.Conditio T2Field: "CountryID", } } -func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.Condition[models.City] { - return badorm.JoinCondition[models.City, models.Country]{ - Conditions: conditions, - RelationField: "Country", - T1Field: "CountryID", - T2Field: "ID", - } -} -var CountryPreload = badorm.NewPreloadCondition[models.Country](countryNameFieldID) +var CountryPreloadCapital = CountryCapital(CityPreloadAttributes) +var CountryPreloadAttributes = badorm.NewPreloadCondition[models.Country](countryNameFieldID) +var CountryPreloadRelations = []badorm.Condition[models.Country]{CountryPreloadCapital} diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 6a37273d..a0ca3b41 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -50,6 +50,7 @@ func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condit } } +var EmployeePreloadBoss = EmployeeBoss(EmployeePreloadAttributes) var employeeBossIdFieldID = badorm.FieldIdentifier{Field: "BossID"} func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { @@ -59,4 +60,5 @@ func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[m } } -var EmployeePreload = badorm.NewPreloadCondition[models.Employee](employeeNameFieldID, employeeBossIdFieldID) +var EmployeePreloadAttributes = badorm.NewPreloadCondition[models.Employee](employeeNameFieldID, employeeBossIdFieldID) +var EmployeePreloadRelations = []badorm.Condition[models.Employee]{EmployeePreloadBoss} diff --git a/testintegration/conditions/parent1_conditions.go b/testintegration/conditions/parent1_conditions.go index bb38af74..0097b645 100644 --- a/testintegration/conditions/parent1_conditions.go +++ b/testintegration/conditions/parent1_conditions.go @@ -41,6 +41,7 @@ func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) ba } } +var Parent1PreloadParentParent = Parent1ParentParent(ParentParentPreloadAttributes) var parent1ParentParentIdFieldID = badorm.FieldIdentifier{Field: "ParentParentID"} func Parent1ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { @@ -50,4 +51,5 @@ func Parent1ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCond } } -var Parent1Preload = badorm.NewPreloadCondition[models.Parent1](parent1ParentParentIdFieldID) +var Parent1PreloadAttributes = badorm.NewPreloadCondition[models.Parent1](parent1ParentParentIdFieldID) +var Parent1PreloadRelations = []badorm.Condition[models.Parent1]{Parent1PreloadParentParent} diff --git a/testintegration/conditions/parent2_conditions.go b/testintegration/conditions/parent2_conditions.go index 5009f907..f7f99248 100644 --- a/testintegration/conditions/parent2_conditions.go +++ b/testintegration/conditions/parent2_conditions.go @@ -41,6 +41,7 @@ func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) ba } } +var Parent2PreloadParentParent = Parent2ParentParent(ParentParentPreloadAttributes) var parent2ParentParentIdFieldID = badorm.FieldIdentifier{Field: "ParentParentID"} func Parent2ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { @@ -50,4 +51,5 @@ func Parent2ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCond } } -var Parent2Preload = badorm.NewPreloadCondition[models.Parent2](parent2ParentParentIdFieldID) +var Parent2PreloadAttributes = badorm.NewPreloadCondition[models.Parent2](parent2ParentParentIdFieldID) +var Parent2PreloadRelations = []badorm.Condition[models.Parent2]{Parent2PreloadParentParent} diff --git a/testintegration/conditions/parent_parent_conditions.go b/testintegration/conditions/parent_parent_conditions.go index 61b4ce78..68fa2b24 100644 --- a/testintegration/conditions/parent_parent_conditions.go +++ b/testintegration/conditions/parent_parent_conditions.go @@ -42,4 +42,5 @@ func ParentParentName(expr badorm.Expression[string]) badorm.WhereCondition[mode } } -var ParentParentPreload = badorm.NewPreloadCondition[models.ParentParent](parentParentNameFieldID) +var ParentParentPreloadAttributes = badorm.NewPreloadCondition[models.ParentParent](parentParentNameFieldID) +var ParentParentPreloadRelations = []badorm.Condition[models.ParentParent]{} diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index 719afb50..85bc2ed9 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -42,4 +42,5 @@ func PersonName(expr badorm.Expression[string]) badorm.WhereCondition[models.Per } } -var PersonPreload = badorm.NewPreloadCondition[models.Person](personNameFieldID) +var PersonPreloadAttributes = badorm.NewPreloadCondition[models.Person](personNameFieldID) +var PersonPreloadRelations = []badorm.Condition[models.Person]{} diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index 3c2e59e0..ec3305bc 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -50,6 +50,7 @@ func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[m } } +var PhonePreloadBrand = PhoneBrand(BrandPreloadAttributes) var phoneBrandIdFieldID = badorm.FieldIdentifier{Field: "BrandID"} func PhoneBrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { @@ -59,4 +60,5 @@ func PhoneBrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Pho } } -var PhonePreload = badorm.NewPreloadCondition[models.Phone](phoneNameFieldID, phoneBrandIdFieldID) +var PhonePreloadAttributes = badorm.NewPreloadCondition[models.Phone](phoneNameFieldID, phoneBrandIdFieldID) +var PhonePreloadRelations = []badorm.Condition[models.Phone]{PhonePreloadBrand} diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index d9a54f45..da3ad8a8 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -136,4 +136,5 @@ func ProductGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[m } } -var ProductPreload = badorm.NewPreloadCondition[models.Product](productStringFieldID, productIntFieldID, productIntPointerFieldID, productFloatFieldID, productNullFloatFieldID, productBoolFieldID, productNullBoolFieldID, productByteArrayFieldID, productMultiStringFieldID, productToBeEmbeddedEmbeddedIntFieldID, productGormEmbeddedIntFieldID) +var ProductPreloadAttributes = badorm.NewPreloadCondition[models.Product](productStringFieldID, productIntFieldID, productIntPointerFieldID, productFloatFieldID, productNullFloatFieldID, productBoolFieldID, productNullBoolFieldID, productByteArrayFieldID, productMultiStringFieldID, productToBeEmbeddedEmbeddedIntFieldID, productGormEmbeddedIntFieldID) +var ProductPreloadRelations = []badorm.Condition[models.Product]{} diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index a1a90449..0b28ef89 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -59,6 +59,7 @@ func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Conditio } } +var SalePreloadProduct = SaleProduct(ProductPreloadAttributes) var saleProductIdFieldID = badorm.FieldIdentifier{Field: "ProductID"} func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { @@ -76,6 +77,7 @@ func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[ } } +var SalePreloadSeller = SaleSeller(SellerPreloadAttributes) var saleSellerIdFieldID = badorm.FieldIdentifier{Field: "SellerID"} func SaleSellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { @@ -85,4 +87,5 @@ func SaleSellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[mod } } -var SalePreload = badorm.NewPreloadCondition[models.Sale](saleCodeFieldID, saleDescriptionFieldID, saleProductIdFieldID, saleSellerIdFieldID) +var SalePreloadAttributes = badorm.NewPreloadCondition[models.Sale](saleCodeFieldID, saleDescriptionFieldID, saleProductIdFieldID, saleSellerIdFieldID) +var SalePreloadRelations = []badorm.Condition[models.Sale]{SalePreloadProduct, SalePreloadSeller} diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 4be3a235..522d4525 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -41,7 +41,16 @@ func SellerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Sel FieldIdentifier: sellerNameFieldID, } } +func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { + return badorm.JoinCondition[models.Seller, models.Company]{ + Conditions: conditions, + RelationField: "Company", + T1Field: "CompanyID", + T2Field: "ID", + } +} +var SellerPreloadCompany = SellerCompany(CompanyPreloadAttributes) var sellerCompanyIdFieldID = badorm.FieldIdentifier{Field: "CompanyID"} func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { @@ -51,4 +60,5 @@ func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[ } } -var SellerPreload = badorm.NewPreloadCondition[models.Seller](sellerNameFieldID, sellerCompanyIdFieldID) +var SellerPreloadAttributes = badorm.NewPreloadCondition[models.Seller](sellerNameFieldID, sellerCompanyIdFieldID) +var SellerPreloadRelations = []badorm.Condition[models.Seller]{SellerPreloadCompany} diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index f71913c3..84c6b27d 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -410,8 +410,6 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesN ts.ErrorIs(err, badorm.ErrEmptyConditions) } -// TODO algo para poder hacer el preload completo? - func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithoutWhereConditionDoesNotFilter() { product1 := ts.createProduct("a_string", 1, 0.0, false, nil) product2 := ts.createProduct("", 2, 0.0, false, nil) @@ -422,9 +420,7 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithoutWhereConditionDoe withoutSeller := ts.createSale(0, product2, nil) entities, err := ts.crudSaleService.GetEntities( - conditions.SaleSeller( - conditions.SellerPreload, - ), + conditions.SalePreloadSeller, ) ts.Nil(err) @@ -451,7 +447,7 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithWhereConditionFilter entities, err := ts.crudSaleService.GetEntities( conditions.SaleProduct( - conditions.ProductPreload, + conditions.ProductPreloadAttributes, conditions.ProductInt(badorm.Eq(1)), ), ) @@ -478,11 +474,11 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadDifferentEntities() { entities, err := ts.crudSaleService.GetEntities( conditions.SaleProduct( - conditions.ProductPreload, + conditions.ProductPreloadAttributes, conditions.ProductInt(badorm.Eq(1)), ), conditions.SaleSeller( - conditions.SellerPreload, + conditions.SellerPreloadAttributes, conditions.SellerName(badorm.Eq("franco")), ), ) @@ -493,6 +489,61 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadDifferentEntities() { assert.DeepEqual(ts.T(), seller1, entities[0].Seller) } +func (ts *JoinConditionsIntTestSuite) TestPreloadDifferentEntities() { + parentParent := &models.ParentParent{} + err := ts.db.Create(parentParent).Error + ts.Nil(err) + + parent1 := &models.Parent1{ParentParent: *parentParent} + err = ts.db.Create(parent1).Error + ts.Nil(err) + + parent2 := &models.Parent2{ParentParent: *parentParent} + err = ts.db.Create(parent2).Error + ts.Nil(err) + + child := &models.Child{Parent1: *parent1, Parent2: *parent2} + err = ts.db.Create(child).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildPreloadParent1, + conditions.ChildPreloadParent2, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child}, entities) + assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) + assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) +} + +func (ts *JoinConditionsIntTestSuite) TestPreloadAll() { + parentParent := &models.ParentParent{} + err := ts.db.Create(parentParent).Error + ts.Nil(err) + + parent1 := &models.Parent1{ParentParent: *parentParent} + err = ts.db.Create(parent1).Error + ts.Nil(err) + + parent2 := &models.Parent2{ParentParent: *parentParent} + err = ts.db.Create(parent2).Error + ts.Nil(err) + + child := &models.Child{Parent1: *parent1, Parent2: *parent2} + err = ts.db.Create(child).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildPreloadRelations..., + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child}, entities) + assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) + assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) +} + func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithoutCondition() { parentParent := &models.ParentParent{} err := ts.db.Create(parentParent).Error @@ -512,10 +563,9 @@ func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithoutCond entities, err := ts.crudChildService.GetEntities( conditions.ChildParent1( - conditions.Parent1Preload, - conditions.Parent1ParentParent( - conditions.ParentParentPreload, - ), + // TODO ver esto, no se si me gusta que esten separados + conditions.Parent1PreloadAttributes, + conditions.Parent1PreloadParentParent, ), ) ts.Nil(err) @@ -562,9 +612,9 @@ func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithConditi entities, err := ts.crudChildService.GetEntities( conditions.ChildParent1( - conditions.Parent1Preload, + conditions.Parent1PreloadAttributes, conditions.Parent1ParentParent( - conditions.ParentParentPreload, + conditions.ParentParentPreloadAttributes, conditions.ParentParentName(badorm.Eq("parentParent1")), ), ), @@ -576,6 +626,9 @@ func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithConditi assert.DeepEqual(ts.T(), *parentParent1, entities[0].Parent1.ParentParent) } +// TODO que pasa si usan preaload y ademas hacen el join +// idem ahora que pasa si hago el join dos veces con la misma entidad, deberian agruparse los join? + func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond() { parentParent := &models.ParentParent{} err := ts.db.Create(parentParent).Error @@ -595,16 +648,12 @@ func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond() { entities, err := ts.crudChildService.GetEntities( conditions.ChildParent1( - conditions.Parent1Preload, - conditions.Parent1ParentParent( - conditions.ParentParentPreload, - ), + conditions.Parent1PreloadAttributes, + conditions.Parent1PreloadParentParent, ), conditions.ChildParent2( - conditions.Parent2Preload, - conditions.Parent2ParentParent( - conditions.ParentParentPreload, - ), + conditions.Parent2PreloadAttributes, + conditions.Parent2PreloadParentParent, ), ) ts.Nil(err) diff --git a/testintegration/models/models.go b/testintegration/models/models.go index df5a6602..6e4a5d5d 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -15,7 +15,8 @@ import ( type Company struct { badorm.UUIDModel - Name string + Name string + // TODO preload de esto Sellers []Seller // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } @@ -88,7 +89,10 @@ func (m Product) Equal(other Product) bool { type Seller struct { badorm.UUIDModel - Name string + Name string + // TODO estas referencias contrarias andan, por lo que puedo eliminar lo que es crear el join inverso + // y entonces puedo pasar a usar join + where en lugar de crear el on a mano + Company *Company CompanyID *badorm.UUID // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } @@ -103,6 +107,7 @@ type Sale struct { ProductID badorm.UUID // Sale HasOne Seller (Sale 0..* -> 0..1 Seller) + // TODO este comentario no se si esta bien, sigue siendo belongs to Seller *Seller SellerID *badorm.UUID } @@ -125,8 +130,15 @@ type Country struct { type City struct { badorm.UUIDModel - Name string - CountryID badorm.UUID // Country HasOne City (Country 1 -> 1 City) + Name string + Country *Country + // TODO aca no me esta creando el unique index, por lo que podria haber muchos que mapeen al mismo country + // pero esto pasa igual por mas que saque la referencia, es un problema que gorm lo hace mal + // TODO tampoco le pone notNull a las cosas que no son punteros, por lo que podria crear clases para directamente + // poder hacer hasone y otras relaciones bien, pero no se si pueda, sino será cuestion de hacer una buena documentacion + // ya que la de gorm no es muy clara + // TODO mirar si para el save si anda la referencia, para el create ya vi que no + CountryID badorm.UUID //`gorm:"unique"` // Country HasOne City (Country 1 -> 1 City) } func (m Country) Equal(other Country) bool { diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 10a4e526..2d43dfda 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -36,6 +36,7 @@ type Condition struct { param *JenParam destPkg string fieldIdentifier string + preloadName string } func NewCondition(destPkg string, objectType Type, field Field) *Condition { @@ -96,16 +97,6 @@ func (condition *Condition) generateForSlice(objectType Type, field Field) { objectType, field, ) - case *types.Named: - // slice of named types (user defined types) - _, err := field.Type.BadORMModelStruct() - if err == nil { - // slice of BadORM models -> hasMany relation - condition.generateInverseJoin( - objectType, - field, - ) - } case *types.Pointer: // slice of pointers, generate code for a slice of the pointed type condition.generateForSlice( @@ -155,11 +146,6 @@ func (condition *Condition) generateForBadormModel(objectType Type, field Field) objectType, field, ) - - condition.generateInverseJoin( - objectType, - field, - ) } } @@ -248,18 +234,6 @@ func (condition *Condition) createFieldIdentifier(objectType Type, field Field, return jen.Qual("", fieldIdentifierName) } -// Generate a inverse JoinCondition, so from the field's object to the object -func (condition *Condition) generateInverseJoin(objectType Type, field Field) { - condition.generateJoinWithFK( - field.Type, - Field{ - Name: objectType.Name(), - Type: objectType, - Tags: field.Tags, - }, - ) -} - // Generate a JoinCondition between the object and field's object // when object has a foreign key to the field's object func (condition *Condition) generateJoinWithFK(objectType Type, field Field) { @@ -329,6 +303,18 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, ), ), ) + + // preload + preloadName := objectType.Name() + "Preload" + field.Name + condition.codes = append( + condition.codes, + jen.Var().Id( + preloadName, + ).Op("=").Add(jen.Id(conditionName)).Call( + jen.Id(getPreloadAttributesName(field.TypeName())), + ), + ) + condition.preloadName = preloadName } // Generate condition names diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 6d325b9f..679287f9 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -66,18 +66,29 @@ func (file File) addConditions() error { func (file File) addConditionsForEachField(fields []Field) { conditions := file.generateConditionsForEachField(fields) - preloadCondition := jen.Var().Id( - file.object.Name() + "Preload", + objectName := file.object.Name() + objectQual := jen.Qual( + getRelativePackagePath(file.destPkg, file.objectType), + file.objectType.Name(), + ) + preloadAttributesCondition := jen.Var().Id( + getPreloadAttributesName(objectName), ).Op("=").Add(jen.Qual( badORMPath, badORMNewPreloadCondition, )).Types( - jen.Qual( - getRelativePackagePath(file.destPkg, file.objectType), - file.objectType.Name(), - ), + objectQual, ) fieldIdentifiers := []jen.Code{} + preloadAllCondition := jen.Var().Id( + objectName + "PreloadRelations", + ).Op("=").Index().Add(jen.Qual( + badORMPath, badORMCondition, + )).Types( + objectQual, + ) + preloads := []jen.Code{} + for _, condition := range conditions { for _, code := range condition.codes { file.jenFile.Add(code) @@ -89,9 +100,21 @@ func (file File) addConditionsForEachField(fields []Field) { jen.Qual("", condition.fieldIdentifier), ) } + + if condition.preloadName != "" { + preloads = append( + preloads, + jen.Qual("", condition.preloadName), + ) + } } - file.jenFile.Add(preloadCondition.Call(fieldIdentifiers...)) + file.jenFile.Add(preloadAttributesCondition.Call(fieldIdentifiers...)) + file.jenFile.Add(preloadAllCondition.Values(preloads...)) +} + +func getPreloadAttributesName(objectName string) string { + return objectName + "PreloadAttributes" } // Write generated file From fcc6b2dc03eed0061120018bb4e3454a0f9f3209 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 21 Jun 2023 16:53:19 +0200 Subject: [PATCH 390/467] add test of preload in other types of relations --- testintegration/join_conditions_test.go | 78 +++++++++++++++++++++++-- testintegration/models/models.go | 4 ++ 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 84c6b27d..c1ecff67 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -460,7 +460,78 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithWhereConditionFilter ts.Equal(2, entities[0].Product.GormEmbedded.Int) } -func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadDifferentEntities() { +func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadOneToOne() { + capital1 := models.City{ + Name: "Buenos Aires", + } + capital2 := models.City{ + Name: "Paris", + } + + country1 := ts.createCountry("Argentina", capital1) + country2 := ts.createCountry("France", capital2) + + entities, err := ts.crudCityService.GetEntities( + conditions.CityPreloadCountry, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.City{&capital1, &capital2}, entities) + ts.True(pie.Any(entities, func(city *models.City) bool { + return city.Country.Equal(*country1) + })) + ts.True(pie.Any(entities, func(city *models.City) bool { + return city.Country.Equal(*country2) + })) +} + +func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadHasMany() { + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + seller1 := ts.createSeller("franco", company1) + seller2 := ts.createSeller("agustin", company2) + + entities, err := ts.crudSellerService.GetEntities( + conditions.SellerPreloadCompany, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Seller{seller1, seller2}, entities) + ts.True(pie.Any(entities, func(seller *models.Seller) bool { + return seller.Company.Equal(*company1) + })) + ts.True(pie.Any(entities, func(seller *models.Seller) bool { + return seller.Company.Equal(*company2) + })) +} + +func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadOneToOneReversed() { + capital1 := models.City{ + Name: "Buenos Aires", + } + capital2 := models.City{ + Name: "Paris", + } + + country1 := ts.createCountry("Argentina", capital1) + country2 := ts.createCountry("France", capital2) + + entities, err := ts.crudCountryService.GetEntities( + conditions.CountryPreloadCapital, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Country{country1, country2}, entities) + ts.True(pie.Any(entities, func(country *models.Country) bool { + return country.Capital.Equal(capital1) + })) + ts.True(pie.Any(entities, func(country *models.Country) bool { + return country.Capital.Equal(capital2) + })) +} + +func (ts *JoinConditionsIntTestSuite) TestPreloadDifferentEntitiesWithConditions() { product1 := ts.createProduct("", 1, 0.0, false, nil) product2 := ts.createProduct("", 2, 0.0, false, nil) @@ -489,7 +560,7 @@ func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadDifferentEntities() { assert.DeepEqual(ts.T(), seller1, entities[0].Seller) } -func (ts *JoinConditionsIntTestSuite) TestPreloadDifferentEntities() { +func (ts *JoinConditionsIntTestSuite) TestPreloadDifferentEntitiesWithoutConditions() { parentParent := &models.ParentParent{} err := ts.db.Create(parentParent).Error ts.Nil(err) @@ -517,7 +588,7 @@ func (ts *JoinConditionsIntTestSuite) TestPreloadDifferentEntities() { assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) } -func (ts *JoinConditionsIntTestSuite) TestPreloadAll() { +func (ts *JoinConditionsIntTestSuite) TestPreloadRelations() { parentParent := &models.ParentParent{} err := ts.db.Create(parentParent).Error ts.Nil(err) @@ -563,7 +634,6 @@ func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithoutCond entities, err := ts.crudChildService.GetEntities( conditions.ChildParent1( - // TODO ver esto, no se si me gusta que esten separados conditions.Parent1PreloadAttributes, conditions.Parent1PreloadParentParent, ), diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 6e4a5d5d..e45e75d3 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -20,6 +20,10 @@ type Company struct { Sellers []Seller // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } +func (m Company) Equal(other Company) bool { + return m.ID == other.ID +} + type MultiString []string func (s *MultiString) Scan(src interface{}) error { From 7ab5479bf06ee86cc152c116fa3ccf9c751ba10c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 23 Jun 2023 10:16:54 +0200 Subject: [PATCH 391/467] add a way to know if a relation was loaded or not --- badorm/ModuleFx.go | 8 +- badorm/baseModels.go | 33 +- badorm/preload.go | 26 ++ badorm/uuid.go | 22 +- testintegration/asserts.go | 4 +- testintegration/badorm_test.go | 3 + testintegration/crudUnsafeService_test.go | 8 +- testintegration/join_conditions_test.go | 334 +--------------- testintegration/models/badorm.go | 55 +++ testintegration/models/models.go | 7 +- testintegration/preload_conditions_test.go | 419 +++++++++++++++++++++ testintegration/where_conditions_test.go | 4 +- 12 files changed, 566 insertions(+), 357 deletions(-) create mode 100644 badorm/preload.go create mode 100644 testintegration/models/badorm.go create mode 100644 testintegration/preload_conditions_test.go diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index 33805c13..aeb1f853 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -46,9 +46,9 @@ func GetCRUDServiceModule[T any]() fx.Option { return fx.Module( moduleName, // repository - fx.Provide(NewCRUDRepository[T, uint]), + fx.Provide(NewCRUDRepository[T, UIntID]), // service - fx.Provide(NewCRUDService[T, uint]), + fx.Provide(NewCRUDService[T, UIntID]), ) case KindNotBaDORMModel: log.Printf("type %T is not a BaDORM Module\n", entity) @@ -88,9 +88,9 @@ func GetCRUDUnsafeServiceModule[T any]() fx.Option { // models fx.Invoke(AddUnsafeModel[T]), // repository - fx.Provide(NewCRUDUnsafeRepository[T, uint]), + fx.Provide(NewCRUDUnsafeRepository[T, UIntID]), // service - fx.Provide(NewCRUDUnsafeService[T, uint]), + fx.Provide(NewCRUDUnsafeService[T, UIntID]), ) case KindNotBaDORMModel: log.Printf("type %T is not a BaDORM Module\n", entity) diff --git a/badorm/baseModels.go b/badorm/baseModels.go index 90fe1b46..b04a01cb 100644 --- a/badorm/baseModels.go +++ b/badorm/baseModels.go @@ -3,13 +3,15 @@ package badorm import ( "time" - "github.com/google/uuid" "gorm.io/gorm" ) // supported types for model identifier +// TODO cambiar el nombre type BadaasID interface { - uint | UUID + UIntID | UUID + + IsNil() bool } // Base Model for gorm @@ -23,12 +25,33 @@ type UUIDModel struct { DeletedAt gorm.DeletedAt `gorm:"index"` } +func (model UUIDModel) IsLoaded() bool { + return !model.ID.IsNil() +} + func (model *UUIDModel) BeforeCreate(_ *gorm.DB) (err error) { - if model.ID == UUID(uuid.Nil) { - model.ID = UUID(uuid.New()) + if model.ID == NilUUID { + model.ID = NewUUID() } return nil } -type UIntModel gorm.Model +type UIntID uint + +const NilUIntID = 0 + +func (id UIntID) IsNil() bool { + return id == NilUIntID +} + +type UIntModel struct { + ID UIntID `gorm:"primarykey;not null"` + CreatedAt time.Time + UpdatedAt time.Time + DeletedAt gorm.DeletedAt `gorm:"index"` +} + +func (model UIntModel) IsLoaded() bool { + return !model.ID.IsNil() +} diff --git a/badorm/preload.go b/badorm/preload.go new file mode 100644 index 00000000..2d0c0d07 --- /dev/null +++ b/badorm/preload.go @@ -0,0 +1,26 @@ +package badorm + +import "errors" + +var ErrRelationNotLoaded = errors.New("Relation not loaded") + +// TODO usar en el resto de lugar de badorm +type BadORMModel interface { + IsLoaded() bool +} + +func VerifyStructLoaded[T BadORMModel](toVerify *T) (*T, error) { + if toVerify == nil || !(*toVerify).IsLoaded() { + return nil, ErrRelationNotLoaded + } + + return toVerify, nil +} + +func VerifyPointerLoaded[TModel BadORMModel, TID BadaasID](id *TID, toVerify *TModel) (*TModel, error) { + if id != nil && !(*id).IsNil() && toVerify == nil { + return nil, ErrRelationNotLoaded + } + + return toVerify, nil +} diff --git a/badorm/uuid.go b/badorm/uuid.go index 33491086..60ab4bf7 100644 --- a/badorm/uuid.go +++ b/badorm/uuid.go @@ -62,17 +62,33 @@ func (id *UUID) UnmarshalBinary(data []byte) error { } func (id *UUID) Scan(src interface{}) error { - return (*uuid.UUID)(id).Scan(src) + switch src := src.(type) { + case nil: + *id = NilUUID + + return nil + default: + return (*uuid.UUID)(id).Scan(src) + } +} + +func (id UUID) IsNil() bool { + return id == NilUUID } func (id UUID) GormValue(_ context.Context, db *gorm.DB) clause.Expr { - if len(id) == 0 { + if id == NilUUID { return gorm.Expr("NULL") } switch db.Dialector.Name() { case "mysql", "sqlserver": - binary, _ := id.MarshalBinary() + binary, err := id.MarshalBinary() + if err != nil { + db.AddError(err) + return clause.Expr{} + } + return gorm.Expr("?", binary) default: return gorm.Expr("?", id.String()) diff --git a/testintegration/asserts.go b/testintegration/asserts.go index dfb50802..e205197f 100644 --- a/testintegration/asserts.go +++ b/testintegration/asserts.go @@ -28,11 +28,11 @@ func EqualList[T any](ts *suite.Suite, expectedList, actualList []T) { } if j == expectedLen { - ts.FailNow("Lists not equal", "element %v not in list %v", expectedList[i], actualList) - for _, element := range actualList { log.Println(element) } + + ts.FailNow("Lists not equal", "element %v not in list %v", expectedList[i], actualList) } } } diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index 2ea7918c..eb53e151 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -72,6 +72,7 @@ func TestBaDORM(t *testing.T) { fx.Provide(NewCRUDRepositoryIntTestSuite), fx.Provide(NewWhereConditionsIntTestSuite), fx.Provide(NewJoinConditionsIntTestSuite), + fx.Provide(NewPreloadConditionsIntTestSuite), fx.Provide(NewExpressionsIntTestSuite), fx.Invoke(runBaDORMTestSuites), @@ -83,6 +84,7 @@ func runBaDORMTestSuites( tsCRUDUnsafeService *CRUDUnsafeServiceIntTestSuite, tsWhereConditions *WhereConditionsIntTestSuite, tsJoinConditions *JoinConditionsIntTestSuite, + tsPreloadConditions *PreloadConditionsIntTestSuite, tsExpressions *ExpressionIntTestSuite, shutdowner fx.Shutdowner, ) { @@ -90,6 +92,7 @@ func runBaDORMTestSuites( suite.Run(tGlobal, tsCRUDUnsafeService) suite.Run(tGlobal, tsWhereConditions) suite.Run(tGlobal, tsJoinConditions) + suite.Run(tGlobal, tsPreloadConditions) suite.Run(tGlobal, tsExpressions) shutdowner.Shutdown() diff --git a/testintegration/crudUnsafeService_test.go b/testintegration/crudUnsafeService_test.go index f27f5bbc..22b95834 100644 --- a/testintegration/crudUnsafeService_test.go +++ b/testintegration/crudUnsafeService_test.go @@ -17,8 +17,8 @@ type CRUDUnsafeServiceIntTestSuite struct { crudCityService badorm.CRUDUnsafeService[models.City, badorm.UUID] crudEmployeeService badorm.CRUDUnsafeService[models.Employee, badorm.UUID] crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, badorm.UUID] - crudBrandService badorm.CRUDUnsafeService[models.Brand, uint] - crudPhoneService badorm.CRUDUnsafeService[models.Phone, uint] + crudBrandService badorm.CRUDUnsafeService[models.Brand, badorm.UIntID] + crudPhoneService badorm.CRUDUnsafeService[models.Phone, badorm.UIntID] } func NewCRUDUnsafeServiceIntTestSuite( @@ -30,8 +30,8 @@ func NewCRUDUnsafeServiceIntTestSuite( crudCityService badorm.CRUDUnsafeService[models.City, badorm.UUID], crudEmployeeService badorm.CRUDUnsafeService[models.Employee, badorm.UUID], crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, badorm.UUID], - crudBrandService badorm.CRUDUnsafeService[models.Brand, uint], - crudPhoneService badorm.CRUDUnsafeService[models.Phone, uint], + crudBrandService badorm.CRUDUnsafeService[models.Brand, badorm.UIntID], + crudPhoneService badorm.CRUDUnsafeService[models.Phone, badorm.UIntID], ) *CRUDUnsafeServiceIntTestSuite { return &CRUDUnsafeServiceIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index c1ecff67..3ec0c599 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -1,9 +1,7 @@ package testintegration import ( - "github.com/elliotchance/pie/v2" "gorm.io/gorm" - "gotest.tools/assert" "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/conditions" @@ -18,8 +16,7 @@ type JoinConditionsIntTestSuite struct { crudCityService badorm.CRUDService[models.City, badorm.UUID] crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID] crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID] - crudPhoneService badorm.CRUDService[models.Phone, uint] - crudChildService badorm.CRUDService[models.Child, badorm.UUID] + crudPhoneService badorm.CRUDService[models.Phone, badorm.UIntID] } func NewJoinConditionsIntTestSuite( @@ -30,8 +27,7 @@ func NewJoinConditionsIntTestSuite( crudCityService badorm.CRUDService[models.City, badorm.UUID], crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID], crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID], - crudPhoneService badorm.CRUDService[models.Phone, uint], - crudChildService badorm.CRUDService[models.Child, badorm.UUID], + crudPhoneService badorm.CRUDService[models.Phone, badorm.UIntID], ) *JoinConditionsIntTestSuite { return &JoinConditionsIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ @@ -44,7 +40,6 @@ func NewJoinConditionsIntTestSuite( crudEmployeeService: crudEmployeeService, crudBicycleService: crudBicycleService, crudPhoneService: crudPhoneService, - crudChildService: crudChildService, } } @@ -409,328 +404,3 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesN ) ts.ErrorIs(err, badorm.ErrEmptyConditions) } - -func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithoutWhereConditionDoesNotFilter() { - product1 := ts.createProduct("a_string", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - - withSeller := ts.createSale(0, product1, seller1) - withoutSeller := ts.createSale(0, product2, nil) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SalePreloadSeller, - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{withSeller, withoutSeller}, entities) - ts.True(pie.Any(entities, func(sale *models.Sale) bool { - return sale.Seller.Equal(*seller1) - })) - ts.True(pie.Any(entities, func(sale *models.Sale) bool { - return sale.Seller == nil - })) -} - -func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadWithWhereConditionFilters() { - product1 := ts.createProduct("a_string", 1, 0.0, false, nil) - product1.EmbeddedInt = 1 - product1.GormEmbedded.Int = 2 - err := ts.db.Save(product1).Error - ts.Nil(err) - - product2 := ts.createProduct("", 2, 0.0, false, nil) - - match := ts.createSale(0, product1, nil) - ts.createSale(0, product2, nil) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductPreloadAttributes, - conditions.ProductInt(badorm.Eq(1)), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) - assert.DeepEqual(ts.T(), *product1, entities[0].Product) - ts.Equal("a_string", entities[0].Product.String) - ts.Equal(1, entities[0].Product.EmbeddedInt) - ts.Equal(2, entities[0].Product.GormEmbedded.Int) -} - -func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadOneToOne() { - capital1 := models.City{ - Name: "Buenos Aires", - } - capital2 := models.City{ - Name: "Paris", - } - - country1 := ts.createCountry("Argentina", capital1) - country2 := ts.createCountry("France", capital2) - - entities, err := ts.crudCityService.GetEntities( - conditions.CityPreloadCountry, - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.City{&capital1, &capital2}, entities) - ts.True(pie.Any(entities, func(city *models.City) bool { - return city.Country.Equal(*country1) - })) - ts.True(pie.Any(entities, func(city *models.City) bool { - return city.Country.Equal(*country2) - })) -} - -func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadHasMany() { - company1 := ts.createCompany("ditrit") - company2 := ts.createCompany("orness") - - seller1 := ts.createSeller("franco", company1) - seller2 := ts.createSeller("agustin", company2) - - entities, err := ts.crudSellerService.GetEntities( - conditions.SellerPreloadCompany, - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Seller{seller1, seller2}, entities) - ts.True(pie.Any(entities, func(seller *models.Seller) bool { - return seller.Company.Equal(*company1) - })) - ts.True(pie.Any(entities, func(seller *models.Seller) bool { - return seller.Company.Equal(*company2) - })) -} - -func (ts *JoinConditionsIntTestSuite) TestJoinAndPreloadOneToOneReversed() { - capital1 := models.City{ - Name: "Buenos Aires", - } - capital2 := models.City{ - Name: "Paris", - } - - country1 := ts.createCountry("Argentina", capital1) - country2 := ts.createCountry("France", capital2) - - entities, err := ts.crudCountryService.GetEntities( - conditions.CountryPreloadCapital, - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Country{country1, country2}, entities) - ts.True(pie.Any(entities, func(country *models.Country) bool { - return country.Capital.Equal(capital1) - })) - ts.True(pie.Any(entities, func(country *models.Country) bool { - return country.Capital.Equal(capital2) - })) -} - -func (ts *JoinConditionsIntTestSuite) TestPreloadDifferentEntitiesWithConditions() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - ts.createSale(0, product1, seller2) - ts.createSale(0, product2, seller1) - - entities, err := ts.crudSaleService.GetEntities( - conditions.SaleProduct( - conditions.ProductPreloadAttributes, - conditions.ProductInt(badorm.Eq(1)), - ), - conditions.SaleSeller( - conditions.SellerPreloadAttributes, - conditions.SellerName(badorm.Eq("franco")), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) - assert.DeepEqual(ts.T(), *product1, entities[0].Product) - assert.DeepEqual(ts.T(), seller1, entities[0].Seller) -} - -func (ts *JoinConditionsIntTestSuite) TestPreloadDifferentEntitiesWithoutConditions() { - parentParent := &models.ParentParent{} - err := ts.db.Create(parentParent).Error - ts.Nil(err) - - parent1 := &models.Parent1{ParentParent: *parentParent} - err = ts.db.Create(parent1).Error - ts.Nil(err) - - parent2 := &models.Parent2{ParentParent: *parentParent} - err = ts.db.Create(parent2).Error - ts.Nil(err) - - child := &models.Child{Parent1: *parent1, Parent2: *parent2} - err = ts.db.Create(child).Error - ts.Nil(err) - - entities, err := ts.crudChildService.GetEntities( - conditions.ChildPreloadParent1, - conditions.ChildPreloadParent2, - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Child{child}, entities) - assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) - assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) -} - -func (ts *JoinConditionsIntTestSuite) TestPreloadRelations() { - parentParent := &models.ParentParent{} - err := ts.db.Create(parentParent).Error - ts.Nil(err) - - parent1 := &models.Parent1{ParentParent: *parentParent} - err = ts.db.Create(parent1).Error - ts.Nil(err) - - parent2 := &models.Parent2{ParentParent: *parentParent} - err = ts.db.Create(parent2).Error - ts.Nil(err) - - child := &models.Child{Parent1: *parent1, Parent2: *parent2} - err = ts.db.Create(child).Error - ts.Nil(err) - - entities, err := ts.crudChildService.GetEntities( - conditions.ChildPreloadRelations..., - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Child{child}, entities) - assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) - assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) -} - -func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithoutCondition() { - parentParent := &models.ParentParent{} - err := ts.db.Create(parentParent).Error - ts.Nil(err) - - parent1 := &models.Parent1{ParentParent: *parentParent} - err = ts.db.Create(parent1).Error - ts.Nil(err) - - parent2 := &models.Parent2{ParentParent: *parentParent} - err = ts.db.Create(parent2).Error - ts.Nil(err) - - child := &models.Child{Parent1: *parent1, Parent2: *parent2} - err = ts.db.Create(child).Error - ts.Nil(err) - - entities, err := ts.crudChildService.GetEntities( - conditions.ChildParent1( - conditions.Parent1PreloadAttributes, - conditions.Parent1PreloadParentParent, - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Child{child}, entities) - assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) - assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent1.ParentParent) -} - -func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithCondition() { - parentParent1 := &models.ParentParent{ - Name: "parentParent1", - } - err := ts.db.Create(parentParent1).Error - ts.Nil(err) - - parent11 := &models.Parent1{ParentParent: *parentParent1} - err = ts.db.Create(parent11).Error - ts.Nil(err) - - parent21 := &models.Parent2{ParentParent: *parentParent1} - err = ts.db.Create(parent21).Error - ts.Nil(err) - - child1 := &models.Child{Parent1: *parent11, Parent2: *parent21} - err = ts.db.Create(child1).Error - ts.Nil(err) - - parentParent2 := &models.ParentParent{} - err = ts.db.Create(parentParent2).Error - ts.Nil(err) - - parent12 := &models.Parent1{ParentParent: *parentParent2} - err = ts.db.Create(parent12).Error - ts.Nil(err) - - parent22 := &models.Parent2{ParentParent: *parentParent2} - err = ts.db.Create(parent22).Error - ts.Nil(err) - - child2 := &models.Child{Parent1: *parent12, Parent2: *parent22} - err = ts.db.Create(child2).Error - ts.Nil(err) - - entities, err := ts.crudChildService.GetEntities( - conditions.ChildParent1( - conditions.Parent1PreloadAttributes, - conditions.Parent1ParentParent( - conditions.ParentParentPreloadAttributes, - conditions.ParentParentName(badorm.Eq("parentParent1")), - ), - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Child{child1}, entities) - assert.DeepEqual(ts.T(), *parent11, entities[0].Parent1) - assert.DeepEqual(ts.T(), *parentParent1, entities[0].Parent1.ParentParent) -} - -// TODO que pasa si usan preaload y ademas hacen el join -// idem ahora que pasa si hago el join dos veces con la misma entidad, deberian agruparse los join? - -func (ts *JoinConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond() { - parentParent := &models.ParentParent{} - err := ts.db.Create(parentParent).Error - ts.Nil(err) - - parent1 := &models.Parent1{ParentParent: *parentParent} - err = ts.db.Create(parent1).Error - ts.Nil(err) - - parent2 := &models.Parent2{ParentParent: *parentParent} - err = ts.db.Create(parent2).Error - ts.Nil(err) - - child := &models.Child{Parent1: *parent1, Parent2: *parent2} - err = ts.db.Create(child).Error - ts.Nil(err) - - entities, err := ts.crudChildService.GetEntities( - conditions.ChildParent1( - conditions.Parent1PreloadAttributes, - conditions.Parent1PreloadParentParent, - ), - conditions.ChildParent2( - conditions.Parent2PreloadAttributes, - conditions.Parent2PreloadParentParent, - ), - ) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Child{child}, entities) - assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) - assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) - assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent1.ParentParent) - assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent2.ParentParent) -} diff --git a/testintegration/models/badorm.go b/testintegration/models/badorm.go new file mode 100644 index 00000000..a99ff0ee --- /dev/null +++ b/testintegration/models/badorm.go @@ -0,0 +1,55 @@ +package models + +import "github.com/ditrit/badaas/badorm" + +// TODO que se genere automaticamente todo el archivo +// en el unico caso que no se puede generar es el de pointer sin fk +// TODO que pasa si el fk no es un id? +// ahi tampoco lo puedo terminar de determinar +// porque no tengo el id.IsNil() +// para strings se podria hacer comparando con el string vacio +// el resto bueno, que lo determine el usuario sino +// el problema es que para que vaya a string vacia tengo que hacer el truquito del null mapearlo a string vacio, +// lo cual no puedo hacer en todos los casos +// a menos que ya te cree una StringReference que haga el truquito pero chupala +// quien mierda en este mundo usa esas referencias por string +func (m Sale) GetProduct() (*Product, error) { + return badorm.VerifyStructLoaded[Product](&m.Product) +} + +func (m Sale) GetSeller() (*Seller, error) { + return badorm.VerifyPointerLoaded[Seller](m.SellerID, m.Seller) + // TODO entonces creo que es mejor siempre trabajar con pointers + // porque sino en el caso del struct si vos no le pones nada, te crea uno vacio y te lo guarda solo + // + // aca puedo mirar el fk (id), que es un *badorm.UUID + // aunque puedo hacer un preload relations sin hacer el preloadAttributes + // TODO entonces el preload de una relacion me tiene que asegurar el preload del fk +} + +func (m Phone) GetBrand() (*Brand, error) { + return badorm.VerifyStructLoaded[Brand](&m.Brand) +} + +// TODO como hago esto cuando este objeto no tiene el fk +// por ejemplo el country, por ahora podria hacer lo que hice con el product +// porque es un struct, pero la idea es pasar todo a pointer +// para evitar las creaciones sin querer +// entonces solo tengo una relacion que puede ser nil lo cargues o no, y no tengo el fk para verificar +// el tema aca tambien es como aseguro el 1 del lado del country si no lo pongo por struct +// porque si ok al que tiene el fk le pongo not null, pero a este imposible +// entonces la forma tiene que ser por modelo y exponerse a la creacion de uno falso +// aunque esta relacion 1 -> 1 no es tan realista creo, no se da tanto +// supongamos entonces que pudiera ser Country 1 -> 0..1 City +// entonces el fk de city va a ser not null, unique y el city del country va a ser un pointer +// entonces que mierda hago? +// en este caso, podria intercambiar donde pongo el fk +// siendo cuentry el que tiene un fk nullable y un pointer +// por su lado, el city pasaria a tener un un country, y lo puedo sacar por lo de los struct +// pero si la relacion es Country 0..1 -> 0..1 City +// y bueno ahi parece que estoy en la mierda, no hay forma de saberlo en alguna de las dos +// igual creo que puede ser una limitacion de la libreria, no es un caso tan comun creeria + +// TODO igual ojo que si se puede mezclar pointers y no pointers +// por ejemplo en value.go se hace eso +// TODO que pasa si me ponen la entidad como pointer pero el id sin pointer diff --git a/testintegration/models/models.go b/testintegration/models/models.go index e45e75d3..0cdb944f 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -93,9 +93,7 @@ func (m Product) Equal(other Product) bool { type Seller struct { badorm.UUIDModel - Name string - // TODO estas referencias contrarias andan, por lo que puedo eliminar lo que es crear el join inverso - // y entonces puedo pasar a usar join + where en lugar de crear el on a mano + Name string Company *Company CompanyID *badorm.UUID // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } @@ -110,8 +108,7 @@ type Sale struct { Product Product ProductID badorm.UUID - // Sale HasOne Seller (Sale 0..* -> 0..1 Seller) - // TODO este comentario no se si esta bien, sigue siendo belongs to + // Sale belongsTo Seller (Sale 0..* -> 0..1 Seller) Seller *Seller SellerID *badorm.UUID } diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go new file mode 100644 index 00000000..93aabfde --- /dev/null +++ b/testintegration/preload_conditions_test.go @@ -0,0 +1,419 @@ +package testintegration + +import ( + "gorm.io/gorm" + "gotest.tools/assert" + + "github.com/elliotchance/pie/v2" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/testintegration/conditions" + "github.com/ditrit/badaas/testintegration/models" +) + +type PreloadConditionsIntTestSuite struct { + CRUDServiceCommonIntTestSuite + crudSaleService badorm.CRUDService[models.Sale, badorm.UUID] + crudSellerService badorm.CRUDService[models.Seller, badorm.UUID] + crudCountryService badorm.CRUDService[models.Country, badorm.UUID] + crudCityService badorm.CRUDService[models.City, badorm.UUID] + crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID] + crudChildService badorm.CRUDService[models.Child, badorm.UUID] + crudPhoneService badorm.CRUDService[models.Phone, badorm.UIntID] +} + +func NewPreloadConditionsIntTestSuite( + db *gorm.DB, + crudSaleService badorm.CRUDService[models.Sale, badorm.UUID], + crudSellerService badorm.CRUDService[models.Seller, badorm.UUID], + crudCountryService badorm.CRUDService[models.Country, badorm.UUID], + crudCityService badorm.CRUDService[models.City, badorm.UUID], + crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID], + crudChildService badorm.CRUDService[models.Child, badorm.UUID], + crudPhoneService badorm.CRUDService[models.Phone, badorm.UIntID], +) *PreloadConditionsIntTestSuite { + return &PreloadConditionsIntTestSuite{ + CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ + db: db, + }, + crudSaleService: crudSaleService, + crudSellerService: crudSellerService, + crudCountryService: crudCountryService, + crudCityService: crudCityService, + // TODO hacer algun test de self reference preload + crudEmployeeService: crudEmployeeService, + crudChildService: crudChildService, + crudPhoneService: crudPhoneService, + } +} + +func (ts *PreloadConditionsIntTestSuite) TestNoPreloadReturnsErrorOnGetRelation() { + product := ts.createProduct("a_string", 1, 0.0, false, nil) + seller := ts.createSeller("franco", nil) + sale := ts.createSale(0, product, seller) + + entities, err := ts.crudSaleService.GetEntities() + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{sale}, entities) + + saleLoaded := entities[0] + + ts.False(saleLoaded.Product.IsLoaded()) + _, err = saleLoaded.GetProduct() + ts.ErrorIs(err, badorm.ErrRelationNotLoaded) + + ts.Nil(saleLoaded.Seller) // is nil but we cant determine why directly + _, err = saleLoaded.GetSeller() // GetSeller give us that information + ts.ErrorIs(err, badorm.ErrRelationNotLoaded) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadWithoutWhereConditionDoesNotFilter() { + product1 := ts.createProduct("a_string", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + + withSeller := ts.createSale(0, product1, seller1) + withoutSeller := ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SalePreloadSeller, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{withSeller, withoutSeller}, entities) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + saleSeller, err := sale.GetSeller() + return err == nil && saleSeller.Equal(*seller1) + })) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + // in this case sale.Seller will also be nil + // but we can now it's really null in the db because err is nil + saleSeller, err := sale.GetSeller() + return err == nil && saleSeller == nil + })) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadUIntModel() { + brand1 := ts.createBrand("google") + brand2 := ts.createBrand("apple") + + phone1 := ts.createPhone("pixel", *brand1) + phone2 := ts.createPhone("iphone", *brand2) + + entities, err := ts.crudPhoneService.GetEntities( + conditions.PhonePreloadBrand, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Phone{phone1, phone2}, entities) + ts.True(pie.Any(entities, func(phone *models.Phone) bool { + phoneBrand, err := phone.GetBrand() + return err == nil && phoneBrand.Equal(*brand1) + })) + ts.True(pie.Any(entities, func(phone *models.Phone) bool { + phoneBrand, err := phone.GetBrand() + return err == nil && phoneBrand.Equal(*brand2) + })) +} + +// TODO pasar todo el resto de lugares a usar el get en lugar de directo +func (ts *PreloadConditionsIntTestSuite) TestPreloadWithWhereConditionFilters() { + product1 := ts.createProduct("a_string", 1, 0.0, false, nil) + product1.EmbeddedInt = 1 + product1.GormEmbedded.Int = 2 + err := ts.db.Save(product1).Error + ts.Nil(err) + + product2 := ts.createProduct("", 2, 0.0, false, nil) + + match := ts.createSale(0, product1, nil) + ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductPreloadAttributes, + conditions.ProductInt(badorm.Eq(1)), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) + assert.DeepEqual(ts.T(), *product1, entities[0].Product) + ts.Equal("a_string", entities[0].Product.String) + ts.Equal(1, entities[0].Product.EmbeddedInt) + ts.Equal(2, entities[0].Product.GormEmbedded.Int) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadOneToOne() { + capital1 := models.City{ + Name: "Buenos Aires", + } + capital2 := models.City{ + Name: "Paris", + } + + country1 := ts.createCountry("Argentina", capital1) + country2 := ts.createCountry("France", capital2) + + entities, err := ts.crudCityService.GetEntities( + conditions.CityPreloadCountry, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.City{&capital1, &capital2}, entities) + ts.True(pie.Any(entities, func(city *models.City) bool { + return city.Country.Equal(*country1) + })) + ts.True(pie.Any(entities, func(city *models.City) bool { + return city.Country.Equal(*country2) + })) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadOneToOneReversed() { + capital1 := models.City{ + Name: "Buenos Aires", + } + capital2 := models.City{ + Name: "Paris", + } + + country1 := ts.createCountry("Argentina", capital1) + country2 := ts.createCountry("France", capital2) + + entities, err := ts.crudCountryService.GetEntities( + conditions.CountryPreloadCapital, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Country{country1, country2}, entities) + ts.True(pie.Any(entities, func(country *models.Country) bool { + return country.Capital.Equal(capital1) + })) + ts.True(pie.Any(entities, func(country *models.Country) bool { + return country.Capital.Equal(capital2) + })) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadHasManyReversed() { + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + seller1 := ts.createSeller("franco", company1) + seller2 := ts.createSeller("agustin", company2) + + entities, err := ts.crudSellerService.GetEntities( + conditions.SellerPreloadCompany, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Seller{seller1, seller2}, entities) + ts.True(pie.Any(entities, func(seller *models.Seller) bool { + return seller.Company.Equal(*company1) + })) + ts.True(pie.Any(entities, func(seller *models.Seller) bool { + return seller.Company.Equal(*company2) + })) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadDifferentEntitiesWithConditions() { + product1 := ts.createProduct("", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + seller2 := ts.createSeller("agustin", nil) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + ts.createSale(0, product1, seller2) + ts.createSale(0, product2, seller1) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleProduct( + conditions.ProductPreloadAttributes, + conditions.ProductInt(badorm.Eq(1)), + ), + conditions.SaleSeller( + conditions.SellerPreloadAttributes, + conditions.SellerName(badorm.Eq("franco")), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) + assert.DeepEqual(ts.T(), *product1, entities[0].Product) + assert.DeepEqual(ts.T(), seller1, entities[0].Seller) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadDifferentEntitiesWithoutConditions() { + parentParent := &models.ParentParent{} + err := ts.db.Create(parentParent).Error + ts.Nil(err) + + parent1 := &models.Parent1{ParentParent: *parentParent} + err = ts.db.Create(parent1).Error + ts.Nil(err) + + parent2 := &models.Parent2{ParentParent: *parentParent} + err = ts.db.Create(parent2).Error + ts.Nil(err) + + child := &models.Child{Parent1: *parent1, Parent2: *parent2} + err = ts.db.Create(child).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildPreloadParent1, + conditions.ChildPreloadParent2, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child}, entities) + assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) + assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadRelations() { + parentParent := &models.ParentParent{} + err := ts.db.Create(parentParent).Error + ts.Nil(err) + + parent1 := &models.Parent1{ParentParent: *parentParent} + err = ts.db.Create(parent1).Error + ts.Nil(err) + + parent2 := &models.Parent2{ParentParent: *parentParent} + err = ts.db.Create(parent2).Error + ts.Nil(err) + + child := &models.Child{Parent1: *parent1, Parent2: *parent2} + err = ts.db.Create(child).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildPreloadRelations..., + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child}, entities) + assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) + assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) +} + +func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithoutCondition() { + parentParent := &models.ParentParent{} + err := ts.db.Create(parentParent).Error + ts.Nil(err) + + parent1 := &models.Parent1{ParentParent: *parentParent} + err = ts.db.Create(parent1).Error + ts.Nil(err) + + parent2 := &models.Parent2{ParentParent: *parentParent} + err = ts.db.Create(parent2).Error + ts.Nil(err) + + child := &models.Child{Parent1: *parent1, Parent2: *parent2} + err = ts.db.Create(child).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildParent1( + conditions.Parent1PreloadAttributes, + conditions.Parent1PreloadParentParent, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child}, entities) + assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) + assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent1.ParentParent) +} + +func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithCondition() { + parentParent1 := &models.ParentParent{ + Name: "parentParent1", + } + err := ts.db.Create(parentParent1).Error + ts.Nil(err) + + parent11 := &models.Parent1{ParentParent: *parentParent1} + err = ts.db.Create(parent11).Error + ts.Nil(err) + + parent21 := &models.Parent2{ParentParent: *parentParent1} + err = ts.db.Create(parent21).Error + ts.Nil(err) + + child1 := &models.Child{Parent1: *parent11, Parent2: *parent21} + err = ts.db.Create(child1).Error + ts.Nil(err) + + parentParent2 := &models.ParentParent{} + err = ts.db.Create(parentParent2).Error + ts.Nil(err) + + parent12 := &models.Parent1{ParentParent: *parentParent2} + err = ts.db.Create(parent12).Error + ts.Nil(err) + + parent22 := &models.Parent2{ParentParent: *parentParent2} + err = ts.db.Create(parent22).Error + ts.Nil(err) + + child2 := &models.Child{Parent1: *parent12, Parent2: *parent22} + err = ts.db.Create(child2).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildParent1( + conditions.Parent1PreloadAttributes, + conditions.Parent1ParentParent( + conditions.ParentParentPreloadAttributes, + conditions.ParentParentName(badorm.Eq("parentParent1")), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child1}, entities) + assert.DeepEqual(ts.T(), *parent11, entities[0].Parent1) + assert.DeepEqual(ts.T(), *parentParent1, entities[0].Parent1.ParentParent) +} + +func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond() { + parentParent := &models.ParentParent{} + err := ts.db.Create(parentParent).Error + ts.Nil(err) + + parent1 := &models.Parent1{ParentParent: *parentParent} + err = ts.db.Create(parent1).Error + ts.Nil(err) + + parent2 := &models.Parent2{ParentParent: *parentParent} + err = ts.db.Create(parent2).Error + ts.Nil(err) + + child := &models.Child{Parent1: *parent1, Parent2: *parent2} + err = ts.db.Create(child).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildParent1( + conditions.Parent1PreloadAttributes, + conditions.Parent1PreloadParentParent, + ), + conditions.ChildParent2( + conditions.Parent2PreloadAttributes, + conditions.Parent2PreloadParentParent, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child}, entities) + assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) + assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) + assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent1.ParentParent) + assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent2.ParentParent) +} diff --git a/testintegration/where_conditions_test.go b/testintegration/where_conditions_test.go index 3fb47427..8fdf6846 100644 --- a/testintegration/where_conditions_test.go +++ b/testintegration/where_conditions_test.go @@ -17,14 +17,14 @@ type WhereConditionsIntTestSuite struct { CRUDServiceCommonIntTestSuite crudProductService badorm.CRUDService[models.Product, badorm.UUID] crudSaleService badorm.CRUDService[models.Sale, badorm.UUID] - crudBrandService badorm.CRUDService[models.Brand, uint] + crudBrandService badorm.CRUDService[models.Brand, badorm.UIntID] } func NewWhereConditionsIntTestSuite( db *gorm.DB, crudProductService badorm.CRUDService[models.Product, badorm.UUID], crudSaleService badorm.CRUDService[models.Sale, badorm.UUID], - crudBrandService badorm.CRUDService[models.Brand, uint], + crudBrandService badorm.CRUDService[models.Brand, badorm.UIntID], ) *WhereConditionsIntTestSuite { return &WhereConditionsIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ From 53eb8f727f03d8bf8c935488688074bf7b052f9a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 26 Jun 2023 15:39:50 +0200 Subject: [PATCH 392/467] preload attributes if a relation is preload or any nested preload --- badorm/condition.go | 207 +++++++++++------- badorm/crudRepository.go | 6 +- badorm/preload.go | 3 + .../conditions/bicycle_conditions.go | 9 +- .../conditions/child_conditions.go | 18 +- testintegration/conditions/city_conditions.go | 9 +- .../conditions/country_conditions.go | 9 +- .../conditions/employee_conditions.go | 9 +- .../conditions/parent1_conditions.go | 9 +- .../conditions/parent2_conditions.go | 9 +- .../conditions/phone_conditions.go | 9 +- testintegration/conditions/sale_conditions.go | 18 +- .../conditions/seller_conditions.go | 9 +- testintegration/join_conditions_test.go | 2 +- testintegration/models/badorm.go | 4 + testintegration/preload_conditions_test.go | 134 +++++++++++- tools/badctl/cmd/gen/conditions/condition.go | 11 +- tools/badctl/cmd/gen/conditions/file.go | 13 +- 18 files changed, 353 insertions(+), 135 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 72a62c27..0231e29d 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -20,11 +20,42 @@ var ( var ErrEmptyConditions = errors.New("condition must have at least one inner condition") +type Table struct { + Name string + Alias string + Initial bool +} + +func (t Table) IsInitial() bool { + return t.Initial +} + +func (t Table) DeliverTable(query *gorm.DB, model any, relationName string) (Table, error) { + // get the name of the table for the model + tableName, err := getTableName(query, model) + if err != nil { + return Table{}, err + } + + // add a suffix to avoid tables with the same name when joining + // the same table more than once + tableAlias := relationName + if !t.IsInitial() { + tableAlias = t.Alias + "__" + relationName + } + + return Table{ + Name: tableName, + Alias: tableAlias, + Initial: false, + }, nil +} + type Condition[T any] interface { // Applies the condition to the "query" // using the "tableName" as name for the table holding // the data for object of type T - ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) + ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) // This method is necessary to get the compiler to verify // that an object is of type Condition[T], @@ -39,7 +70,7 @@ type WhereCondition[T any] interface { Condition[T] // Get the sql string and values to use in the query - GetSQL(query *gorm.DB, tableName string) (string, []any, error) + GetSQL(query *gorm.DB, table Table) (string, []any, error) // Returns true if the DeletedAt column if affected by the condition // If no condition affects the DeletedAt, the verification that it's null will be added automatically @@ -59,12 +90,12 @@ func (condition ContainerCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition ContainerCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { - return applyWhereCondition[T](condition, query, tableName) +func (condition ContainerCondition[T]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { + return applyWhereCondition[T](condition, query, table) } -func (condition ContainerCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { - sqlString, values, err := condition.ConnectionCondition.GetSQL(query, tableName) +func (condition ContainerCondition[T]) GetSQL(query *gorm.DB, table Table) (string, []any, error) { + sqlString, values, err := condition.ConnectionCondition.GetSQL(query, table) if err != nil { return "", nil, err } @@ -105,16 +136,16 @@ func (condition ConnectionCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition ConnectionCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { - return applyWhereCondition[T](condition, query, tableName) +func (condition ConnectionCondition[T]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { + return applyWhereCondition[T](condition, query, table) } -func (condition ConnectionCondition[T]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { +func (condition ConnectionCondition[T]) GetSQL(query *gorm.DB, table Table) (string, []any, error) { sqlStrings := []string{} values := []any{} for _, internalCondition := range condition.Conditions { - internalSQLString, exprValues, err := internalCondition.GetSQL(query, tableName) + internalSQLString, exprValues, err := internalCondition.GetSQL(query, table) if err != nil { return "", nil, err } @@ -149,10 +180,10 @@ type FieldIdentifier struct { ColumnPrefix string } -func (columnID FieldIdentifier) ColumnName(db *gorm.DB, tableName string) string { +func (columnID FieldIdentifier) ColumnName(db *gorm.DB, table Table) string { columnName := columnID.Column if columnName == "" { - columnName = db.NamingStrategy.ColumnName(tableName, columnID.Field) + columnName = db.NamingStrategy.ColumnName(table.Name, columnID.Field) } // add column prefix and table name once we know the column name @@ -170,20 +201,16 @@ func (condition PreloadCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition PreloadCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { +func (condition PreloadCondition[T]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { for _, fieldID := range condition.Fields { - columnName := fieldID.ColumnName(query, tableName) - - // Remove first table name as GORM only adds it from the second join - _, attributePrefix, _ := strings.Cut(tableName, "__") + columnName := fieldID.ColumnName(query, table) query.Statement.Selects = append( query.Statement.Selects, fmt.Sprintf( - "%[1]s.%[2]s AS \"%[3]s__%[2]s\"", // name used by gorm to load the fields inside the models - tableName, + "%[1]s.%[2]s AS \"%[1]s__%[2]s\"", // name used by gorm to load the fields inside the models + table.Alias, columnName, - attributePrefix, ), ) } @@ -220,12 +247,12 @@ func (condition FieldCondition[TObject, TAtribute]) interfaceVerificationMethod( // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value -func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { - return applyWhereCondition[TObject](condition, query, tableName) +func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { + return applyWhereCondition[TObject](condition, query, table) } -func applyWhereCondition[T any](condition WhereCondition[T], query *gorm.DB, tableName string) (*gorm.DB, error) { - sql, values, err := condition.GetSQL(query, tableName) +func applyWhereCondition[T any](condition WhereCondition[T], query *gorm.DB, table Table) (*gorm.DB, error) { + sql, values, err := condition.GetSQL(query, table) if err != nil { return nil, err } @@ -245,17 +272,27 @@ func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { return condition.FieldIdentifier.Field == DeletedAtField } -func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, tableName string) (string, []any, error) { - columnName := tableName + "." + condition.FieldIdentifier.ColumnName(query, tableName) +func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table Table) (string, []any, error) { + columnName := table.Alias + "." + condition.FieldIdentifier.ColumnName(query, table) return condition.Expression.ToSQL(columnName) } +// Interface of a join condition that joins T with any other model +type IJoinCondition[T any] interface { + Condition[T] + + // Returns true if this condition or any nested condition makes a preload + makesPreload() bool +} + // Condition that joins with other table type JoinCondition[T1 any, T2 any] struct { T1Field string T2Field string RelationField string Conditions []Condition[T2] + // condition to preload T1 in case T2 any nested object is preloaded by user + T1PreloadCondition PreloadCondition[T1] } //nolint:unused // see inside @@ -264,41 +301,44 @@ func (condition JoinCondition[T1, T2]) interfaceVerificationMethod(_ T1) { // that an object is of type Condition[T] } +// Returns true if this condition or any nested condition makes a preload +func (condition JoinCondition[T1, T2]) makesPreload() bool { + _, joinConditions, t2PreloadCondition := divideConditionsByType(condition.Conditions) + + return t2PreloadCondition != nil || pie.Any(joinConditions, func(cond IJoinCondition[T2]) bool { + return cond.makesPreload() + }) +} + // Applies a join between the tables of T1 and T2 // previousTableName is the name of the table of T1 // It also applies the nested conditions -func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName string) (*gorm.DB, error) { - // get the name of the table for T2 - toBeJoinedTableName, err := getTableName(query, *new(T2)) +func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, t1Table Table) (*gorm.DB, error) { + whereConditions, joinConditions, t2PreloadCondition := divideConditionsByType(condition.Conditions) + + // get the sql to do the join with T2 + // if it's only a preload use a left join + t2Table, err := t1Table.DeliverTable(query, *new(T2), condition.RelationField) if err != nil { return nil, err } - // add a suffix to avoid tables with the same name when joining - // the same table more than once - nextTableAlias := previousTableName + "__" + condition.RelationField - - whereConditions, joinConditions, preloadCondition := divideConditionsByType(condition.Conditions) + makesPreload := condition.makesPreload() + joinQuery := condition.getSQLJoin( + query, + t1Table, + t2Table, + len(whereConditions) == 0 && makesPreload, + ) - // apply WhereConditions to join in "on" clause + // apply WhereConditions to the join in the "on" clause connectionCondition := And(whereConditions...) - onQuery, onValues, err := connectionCondition.GetSQL(query, nextTableAlias) + onQuery, onValues, err := connectionCondition.GetSQL(query, t2Table) if err != nil { return nil, err } - // get the sql to do the join with T2 - // if it's only a preload use a left join - isLeftJoin := len(whereConditions) == 0 && preloadCondition != nil - joinQuery := condition.getSQLJoin( - query, - toBeJoinedTableName, - nextTableAlias, - previousTableName, - isLeftJoin, - ) - if onQuery != "" { joinQuery += " AND " + onQuery } @@ -306,16 +346,28 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName if !connectionCondition.affectsDeletedAt() { joinQuery += fmt.Sprintf( " AND %s.deleted_at IS NULL", - nextTableAlias, + t2Table.Alias, ) } // add the join to the query query = query.Joins(joinQuery, onValues...) - // apply preload condition - if preloadCondition != nil { - query, err = preloadCondition.ApplyTo(query, nextTableAlias) + // apply T1 preload condition + // if this condition has a T2 preload condition + // or any nested join condition has a preload condition + // and this is not first level (T1 is the type of the repository) + // because T1 is always loaded in that case + if makesPreload && !t1Table.IsInitial() { + query, err = condition.T1PreloadCondition.ApplyTo(query, t1Table) + if err != nil { + return nil, err + } + } + + // apply T2 preload condition + if t2PreloadCondition != nil { + query, err = t2PreloadCondition.ApplyTo(query, t2Table) if err != nil { return nil, err } @@ -323,7 +375,7 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // apply nested joins for _, joinCondition := range joinConditions { - query, err = joinCondition.ApplyTo(query, nextTableAlias) + query, err = joinCondition.ApplyTo(query, t2Table) if err != nil { return nil, err } @@ -337,7 +389,8 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, previousTableName // can be either in T1's or T2's table. func (condition JoinCondition[T1, T2]) getSQLJoin( query *gorm.DB, - toBeJoinedTableName, nextTableAlias, previousTableName string, + t1Table Table, + t2Table Table, isLeftJoin bool, ) string { joinString := "INNER JOIN" @@ -348,11 +401,11 @@ func (condition JoinCondition[T1, T2]) getSQLJoin( return fmt.Sprintf( `%[6]s %[1]s %[2]s ON %[2]s.%[3]s = %[4]s.%[5]s `, - toBeJoinedTableName, - nextTableAlias, - query.NamingStrategy.ColumnName(nextTableAlias, condition.T2Field), - previousTableName, - query.NamingStrategy.ColumnName(previousTableName, condition.T1Field), + t2Table.Name, + t2Table.Alias, + query.NamingStrategy.ColumnName(t2Table.Name, condition.T2Field), + t1Table.Alias, + query.NamingStrategy.ColumnName(t1Table.Name, condition.T1Field), joinString, ) } @@ -360,18 +413,24 @@ func (condition JoinCondition[T1, T2]) getSQLJoin( // Divides a list of conditions by its type: WhereConditions and JoinConditions func divideConditionsByType[T any]( conditions []Condition[T], -) (whereConditions []WhereCondition[T], joinConditions []Condition[T], preloadCondition *PreloadCondition[T]) { +) (whereConditions []WhereCondition[T], joinConditions []IJoinCondition[T], preloadCondition *PreloadCondition[T]) { for _, condition := range conditions { - whereCondition, ok := condition.(WhereCondition[T]) + possibleWhereCondition, ok := condition.(WhereCondition[T]) + if ok { + whereConditions = append(whereConditions, possibleWhereCondition) + continue + } + + possiblePreloadCondition, ok := condition.(PreloadCondition[T]) + if ok { + preloadCondition = &possiblePreloadCondition + continue + } + + possibleJoinCondition, ok := condition.(IJoinCondition[T]) if ok { - whereConditions = append(whereConditions, whereCondition) - } else { - possiblePreloadCondition, ok := condition.(PreloadCondition[T]) - if ok { - preloadCondition = &possiblePreloadCondition - } else { - joinConditions = append(joinConditions, condition) - } + joinConditions = append(joinConditions, possibleJoinCondition) + continue } } @@ -391,14 +450,14 @@ func (condition UnsafeCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition UnsafeCondition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { - return applyWhereCondition[T](condition, query, tableName) +func (condition UnsafeCondition[T]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { + return applyWhereCondition[T](condition, query, table) } -func (condition UnsafeCondition[T]) GetSQL(_ *gorm.DB, tableName string) (string, []any, error) { +func (condition UnsafeCondition[T]) GetSQL(_ *gorm.DB, table Table) (string, []any, error) { return fmt.Sprintf( condition.SQLCondition, - tableName, + table.Alias, ), condition.Values, nil } @@ -427,11 +486,11 @@ func (condition InvalidCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition InvalidCondition[T]) ApplyTo(_ *gorm.DB, _ string) (*gorm.DB, error) { +func (condition InvalidCondition[T]) ApplyTo(_ *gorm.DB, _ Table) (*gorm.DB, error) { return nil, condition.Err } -func (condition InvalidCondition[T]) GetSQL(_ *gorm.DB, _ string) (string, []any, error) { +func (condition InvalidCondition[T]) GetSQL(_ *gorm.DB, _ Table) (string, []any, error) { return "", nil, condition.Err } diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 15f940f7..78323b49 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -92,7 +92,11 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions query := tx.Select(initialTableName + ".*") for _, condition := range conditions { - query, err = condition.ApplyTo(query, initialTableName) + query, err = condition.ApplyTo(query, Table{ + Name: initialTableName, + Alias: initialTableName, + Initial: true, + }) if err != nil { return nil, err } diff --git a/badorm/preload.go b/badorm/preload.go index 2d0c0d07..d7130eff 100644 --- a/badorm/preload.go +++ b/badorm/preload.go @@ -18,6 +18,9 @@ func VerifyStructLoaded[T BadORMModel](toVerify *T) (*T, error) { } func VerifyPointerLoaded[TModel BadORMModel, TID BadaasID](id *TID, toVerify *TModel) (*TModel, error) { + // if id == nil the relation is null + // if (*id).IsNil(), id is loaded from a null + // if toVerify != nil, the relation is loaded and not null if id != nil && !(*id).IsNil() && toVerify == nil { return nil, ErrRelationNotLoaded } diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index d601b1d2..d1b20cdd 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -43,10 +43,11 @@ func BicycleName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bi } func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Condition[models.Bicycle] { return badorm.JoinCondition[models.Bicycle, models.Person]{ - Conditions: conditions, - RelationField: "Owner", - T1Field: "OwnerName", - T2Field: "Name", + Conditions: conditions, + RelationField: "Owner", + T1Field: "OwnerName", + T1PreloadCondition: BicyclePreloadAttributes, + T2Field: "Name", } } diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index a925e735..62089803 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -34,10 +34,11 @@ func ChildDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio } func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.Condition[models.Child] { return badorm.JoinCondition[models.Child, models.Parent1]{ - Conditions: conditions, - RelationField: "Parent1", - T1Field: "Parent1ID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Parent1", + T1Field: "Parent1ID", + T1PreloadCondition: ChildPreloadAttributes, + T2Field: "ID", } } @@ -52,10 +53,11 @@ func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[m } func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.Condition[models.Child] { return badorm.JoinCondition[models.Child, models.Parent2]{ - Conditions: conditions, - RelationField: "Parent2", - T1Field: "Parent2ID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Parent2", + T1Field: "Parent2ID", + T1PreloadCondition: ChildPreloadAttributes, + T2Field: "ID", } } diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index 67648fa2..2aea3b96 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -43,10 +43,11 @@ func CityName(expr badorm.Expression[string]) badorm.WhereCondition[models.City] } func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.Condition[models.City] { return badorm.JoinCondition[models.City, models.Country]{ - Conditions: conditions, - RelationField: "Country", - T1Field: "CountryID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Country", + T1Field: "CountryID", + T1PreloadCondition: CityPreloadAttributes, + T2Field: "ID", } } diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index bc5f8c91..29a24032 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -43,10 +43,11 @@ func CountryName(expr badorm.Expression[string]) badorm.WhereCondition[models.Co } func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.Condition[models.Country] { return badorm.JoinCondition[models.Country, models.City]{ - Conditions: conditions, - RelationField: "Capital", - T1Field: "ID", - T2Field: "CountryID", + Conditions: conditions, + RelationField: "Capital", + T1Field: "ID", + T1PreloadCondition: CountryPreloadAttributes, + T2Field: "CountryID", } } diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index a0ca3b41..6537a3a6 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -43,10 +43,11 @@ func EmployeeName(expr badorm.Expression[string]) badorm.WhereCondition[models.E } func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condition[models.Employee] { return badorm.JoinCondition[models.Employee, models.Employee]{ - Conditions: conditions, - RelationField: "Boss", - T1Field: "BossID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Boss", + T1Field: "BossID", + T1PreloadCondition: EmployeePreloadAttributes, + T2Field: "ID", } } diff --git a/testintegration/conditions/parent1_conditions.go b/testintegration/conditions/parent1_conditions.go index 0097b645..db31166b 100644 --- a/testintegration/conditions/parent1_conditions.go +++ b/testintegration/conditions/parent1_conditions.go @@ -34,10 +34,11 @@ func Parent1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.Condition[models.Parent1] { return badorm.JoinCondition[models.Parent1, models.ParentParent]{ - Conditions: conditions, - RelationField: "ParentParent", - T1Field: "ParentParentID", - T2Field: "ID", + Conditions: conditions, + RelationField: "ParentParent", + T1Field: "ParentParentID", + T1PreloadCondition: Parent1PreloadAttributes, + T2Field: "ID", } } diff --git a/testintegration/conditions/parent2_conditions.go b/testintegration/conditions/parent2_conditions.go index f7f99248..1c5bc1c9 100644 --- a/testintegration/conditions/parent2_conditions.go +++ b/testintegration/conditions/parent2_conditions.go @@ -34,10 +34,11 @@ func Parent2DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.Condition[models.Parent2] { return badorm.JoinCondition[models.Parent2, models.ParentParent]{ - Conditions: conditions, - RelationField: "ParentParent", - T1Field: "ParentParentID", - T2Field: "ID", + Conditions: conditions, + RelationField: "ParentParent", + T1Field: "ParentParentID", + T1PreloadCondition: Parent2PreloadAttributes, + T2Field: "ID", } } diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index ec3305bc..e75a4f03 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -43,10 +43,11 @@ func PhoneName(expr badorm.Expression[string]) badorm.WhereCondition[models.Phon } func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[models.Phone] { return badorm.JoinCondition[models.Phone, models.Brand]{ - Conditions: conditions, - RelationField: "Brand", - T1Field: "BrandID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Brand", + T1Field: "BrandID", + T1PreloadCondition: PhonePreloadAttributes, + T2Field: "ID", } } diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 0b28ef89..3855693c 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -52,10 +52,11 @@ func SaleDescription(expr badorm.Expression[string]) badorm.WhereCondition[model } func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Condition[models.Sale] { return badorm.JoinCondition[models.Sale, models.Product]{ - Conditions: conditions, - RelationField: "Product", - T1Field: "ProductID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Product", + T1Field: "ProductID", + T1PreloadCondition: SalePreloadAttributes, + T2Field: "ID", } } @@ -70,10 +71,11 @@ func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[mo } func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[models.Sale] { return badorm.JoinCondition[models.Sale, models.Seller]{ - Conditions: conditions, - RelationField: "Seller", - T1Field: "SellerID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Seller", + T1Field: "SellerID", + T1PreloadCondition: SalePreloadAttributes, + T2Field: "ID", } } diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 522d4525..3c709965 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -43,10 +43,11 @@ func SellerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Sel } func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { return badorm.JoinCondition[models.Seller, models.Company]{ - Conditions: conditions, - RelationField: "Company", - T1Field: "CompanyID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Company", + T1Field: "CompanyID", + T1PreloadCondition: SellerPreloadAttributes, + T2Field: "ID", } } diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 3ec0c599..0d764579 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -370,7 +370,7 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithUnsafeCondition() { entities, err := ts.crudSaleService.GetEntities( conditions.SaleSeller( conditions.SellerCompany( - badorm.NewUnsafeCondition[models.Company]("%s.name = sales__Seller.name", []any{}), + badorm.NewUnsafeCondition[models.Company]("%s.name = Seller.name", []any{}), ), ), ) diff --git a/testintegration/models/badorm.go b/testintegration/models/badorm.go index a99ff0ee..5a1f843d 100644 --- a/testintegration/models/badorm.go +++ b/testintegration/models/badorm.go @@ -31,6 +31,10 @@ func (m Phone) GetBrand() (*Brand, error) { return badorm.VerifyStructLoaded[Brand](&m.Brand) } +func (m Seller) GetCompany() (*Company, error) { + return badorm.VerifyPointerLoaded[Company](m.CompanyID, m.Company) +} + // TODO como hago esto cuando este objeto no tiene el fk // por ejemplo el country, por ahora podria hacer lo que hice con el product // porque es un struct, pero la idea es pasar todo a pointer diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index 93aabfde..8e32913a 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -1,6 +1,8 @@ package testintegration import ( + "errors" + "gorm.io/gorm" "gotest.tools/assert" @@ -63,11 +65,32 @@ func (ts *PreloadConditionsIntTestSuite) TestNoPreloadReturnsErrorOnGetRelation( _, err = saleLoaded.GetProduct() ts.ErrorIs(err, badorm.ErrRelationNotLoaded) - ts.Nil(saleLoaded.Seller) // is nil but we cant determine why directly + ts.Nil(saleLoaded.Seller) // is nil but we cant determine why directly (not loaded or really null) _, err = saleLoaded.GetSeller() // GetSeller give us that information ts.ErrorIs(err, badorm.ErrRelationNotLoaded) } +func (ts *PreloadConditionsIntTestSuite) TestNoPreloadWhenItsNullKnowsItsReallyNull() { + product := ts.createProduct("a_string", 1, 0.0, false, nil) + sale := ts.createSale(10, product, nil) + + entities, err := ts.crudSaleService.GetEntities() + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{sale}, entities) + + saleLoaded := entities[0] + + ts.False(saleLoaded.Product.IsLoaded()) + _, err = saleLoaded.GetProduct() + ts.ErrorIs(err, badorm.ErrRelationNotLoaded) + + ts.Nil(saleLoaded.Seller) // is nil but we cant determine why directly (not loaded or really null) + saleSeller, err := saleLoaded.GetSeller() // GetSeller give us that information + ts.Nil(err) + ts.Nil(saleSeller) +} + func (ts *PreloadConditionsIntTestSuite) TestPreloadWithoutWhereConditionDoesNotFilter() { product1 := ts.createProduct("a_string", 1, 0.0, false, nil) product2 := ts.createProduct("", 2, 0.0, false, nil) @@ -95,6 +118,115 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadWithoutWhereConditionDoesNot })) } +func (ts *PreloadConditionsIntTestSuite) TestPreloadNullableAtSecondLevel() { + product1 := ts.createProduct("a_string", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + company := ts.createCompany("ditrit") + + withCompany := ts.createSeller("with", company) + withoutCompany := ts.createSeller("without", nil) + + sale1 := ts.createSale(0, product1, withoutCompany) + sale2 := ts.createSale(0, product2, withCompany) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSeller( + conditions.SellerPreloadCompany, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{sale1, sale2}, entities) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + saleSeller, err := sale.GetSeller() + if err != nil { + return false + } + + sellerCompany, err := saleSeller.GetCompany() + return err == nil && saleSeller.Name == "with" && sellerCompany != nil && sellerCompany.Equal(*company) + })) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + saleSeller, err := sale.GetSeller() + if err != nil { + return false + } + + sellerCompany, err := saleSeller.GetCompany() + return err == nil && saleSeller.Name == "without" && sellerCompany == nil + })) +} + +func (ts *PreloadConditionsIntTestSuite) TestNoPreloadNullableAtSecondLevel() { + product1 := ts.createProduct("a_string", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + company := ts.createCompany("ditrit") + + withCompany := ts.createSeller("with", company) + withoutCompany := ts.createSeller("without", nil) + + sale1 := ts.createSale(0, product1, withoutCompany) + sale2 := ts.createSale(0, product2, withCompany) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SalePreloadSeller, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{sale1, sale2}, entities) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + saleSeller, err := sale.GetSeller() + if err != nil { + return false + } + + // the not null one is not loaded + sellerCompany, err := saleSeller.GetCompany() + return errors.Is(err, badorm.ErrRelationNotLoaded) && sellerCompany == nil + })) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + saleSeller, err := sale.GetSeller() + if err != nil { + return false + } + + // we can be sure the null one is null + sellerCompany, err := saleSeller.GetCompany() + return err == nil && sellerCompany == nil + })) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadWithoutWhereConditionDoesNotFilterAtSecondLevel() { + product1 := ts.createProduct("a_string", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + seller1 := ts.createSeller("franco", nil) + + withSeller := ts.createSale(0, product1, seller1) + withoutSeller := ts.createSale(0, product2, nil) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSeller( + conditions.SellerPreloadCompany, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{withSeller, withoutSeller}, entities) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + saleSeller, err := sale.GetSeller() + return err == nil && saleSeller.Equal(*seller1) && saleSeller.Company == nil + })) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + // in this case sale.Seller will also be nil + // but we can now it's really null in the db because err is nil + saleSeller, err := sale.GetSeller() + return err == nil && saleSeller == nil + })) +} + func (ts *PreloadConditionsIntTestSuite) TestPreloadUIntModel() { brand1 := ts.createBrand("google") brand2 := ts.createBrand("apple") diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 2d43dfda..518f4247 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -295,16 +295,17 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, ).Block( jen.Return( badormJoinCondition.Values(jen.Dict{ - jen.Id("T1Field"): jen.Lit(t1Field), - jen.Id("T2Field"): jen.Lit(t2Field), - jen.Id("RelationField"): jen.Lit(field.Name), - jen.Id("Conditions"): jen.Id("conditions"), + jen.Id("T1Field"): jen.Lit(t1Field), + jen.Id("T2Field"): jen.Lit(t2Field), + jen.Id("RelationField"): jen.Lit(field.Name), + jen.Id("Conditions"): jen.Id("conditions"), + jen.Id("T1PreloadCondition"): jen.Id(getPreloadAttributesName(objectType.Name())), }), ), ), ) - // preload + // preload for the relation preloadName := objectType.Name() + "Preload" + field.Name condition.codes = append( condition.codes, diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 679287f9..9e9721d6 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -71,6 +71,7 @@ func (file File) addConditionsForEachField(fields []Field) { getRelativePackagePath(file.destPkg, file.objectType), file.objectType.Name(), ) + preloadAttributesCondition := jen.Var().Id( getPreloadAttributesName(objectName), ).Op("=").Add(jen.Qual( @@ -80,20 +81,21 @@ func (file File) addConditionsForEachField(fields []Field) { ) fieldIdentifiers := []jen.Code{} - preloadAllCondition := jen.Var().Id( + preloadRelationsCondition := jen.Var().Id( objectName + "PreloadRelations", ).Op("=").Index().Add(jen.Qual( badORMPath, badORMCondition, )).Types( objectQual, ) - preloads := []jen.Code{} + relationPreloads := []jen.Code{} for _, condition := range conditions { for _, code := range condition.codes { file.jenFile.Add(code) } + // add all field names to the list of fields of the preload condition if condition.fieldIdentifier != "" { fieldIdentifiers = append( fieldIdentifiers, @@ -101,16 +103,17 @@ func (file File) addConditionsForEachField(fields []Field) { ) } + // add the preload to the list of all possible preloads if condition.preloadName != "" { - preloads = append( - preloads, + relationPreloads = append( + relationPreloads, jen.Qual("", condition.preloadName), ) } } file.jenFile.Add(preloadAttributesCondition.Call(fieldIdentifiers...)) - file.jenFile.Add(preloadAllCondition.Values(preloads...)) + file.jenFile.Add(preloadRelationsCondition.Values(relationPreloads...)) } func getPreloadAttributesName(objectName string) string { From c597913ca38f4b8fdfab50beab690d65a8de0ae9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 26 Jun 2023 15:50:36 +0200 Subject: [PATCH 393/467] generate conditions for UIntID --- .../conditions/brand_conditions.go | 4 +- .../conditions/phone_conditions.go | 4 +- testintegration/preload_conditions_test.go | 43 ++++++++++++++++++- tools/badctl/cmd/gen/conditions/condition.go | 6 ++- tools/badctl/cmd/gen/conditions/type.go | 5 ++- 5 files changed, 54 insertions(+), 8 deletions(-) diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index f5fbf804..cb43a9e8 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -8,8 +8,8 @@ import ( "time" ) -func BrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Brand] { - return badorm.FieldCondition[models.Brand, uint]{ +func BrandId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[models.Brand] { + return badorm.FieldCondition[models.Brand, badorm.UIntID]{ Expression: expr, FieldIdentifier: badorm.IDFieldID, } diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index e75a4f03..95887f6b 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -8,8 +8,8 @@ import ( "time" ) -func PhoneId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { - return badorm.FieldCondition[models.Phone, uint]{ +func PhoneId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[models.Phone] { + return badorm.FieldCondition[models.Phone, badorm.UIntID]{ Expression: expr, FieldIdentifier: badorm.IDFieldID, } diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index 8e32913a..7a581a71 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -158,6 +158,47 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadNullableAtSecondLevel() { })) } +func (ts *PreloadConditionsIntTestSuite) TestPreloadAtSecondLevelWorksWithManualPreload() { + product1 := ts.createProduct("a_string", 1, 0.0, false, nil) + product2 := ts.createProduct("", 2, 0.0, false, nil) + + company := ts.createCompany("ditrit") + + withCompany := ts.createSeller("with", company) + withoutCompany := ts.createSeller("without", nil) + + sale1 := ts.createSale(0, product1, withoutCompany) + sale2 := ts.createSale(0, product2, withCompany) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSeller( + conditions.SellerPreloadAttributes, + conditions.SellerPreloadCompany, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{sale1, sale2}, entities) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + saleSeller, err := sale.GetSeller() + if err != nil { + return false + } + + sellerCompany, err := saleSeller.GetCompany() + return err == nil && saleSeller.Name == "with" && sellerCompany != nil && sellerCompany.Equal(*company) + })) + ts.True(pie.Any(entities, func(sale *models.Sale) bool { + saleSeller, err := sale.GetSeller() + if err != nil { + return false + } + + sellerCompany, err := saleSeller.GetCompany() + return err == nil && saleSeller.Name == "without" && sellerCompany == nil + })) +} + func (ts *PreloadConditionsIntTestSuite) TestNoPreloadNullableAtSecondLevel() { product1 := ts.createProduct("a_string", 1, 0.0, false, nil) product2 := ts.createProduct("", 2, 0.0, false, nil) @@ -533,11 +574,9 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond( entities, err := ts.crudChildService.GetEntities( conditions.ChildParent1( - conditions.Parent1PreloadAttributes, conditions.Parent1PreloadParentParent, ), conditions.ChildParent2( - conditions.Parent2PreloadAttributes, conditions.Parent2PreloadParentParent, ), ) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 518f4247..197cdb04 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -22,6 +22,10 @@ const ( DeletedAtFieldID = "DeletedAtFieldID" // badorm/expression.go badORMExpression = "Expression" + // badorm/baseModels.go + uIntID = "UIntID" + uuidModel = "UUIDModel" + uIntModel = "UIntModel" ) var constantFieldIdentifiers = map[string]*jen.Statement{ @@ -117,7 +121,7 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) { condition.generateForBadormModel(objectType, field) } else { // field is not a BaDORM Model - if field.Type.IsGormCustomType() || field.TypeString() == "time.Time" { + if field.Type.IsGormCustomType() || field.TypeString() == "time.Time" || field.TypeString() == badORMPath+"."+uIntID { // field is a Gorm Custom type (implements Scanner and Valuer interfaces) // or a named type supported by gorm (time.Time, gorm.DeletedAt) condition.param.ToCustomType(condition.destPkg, field.Type) diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index 20c86254..c21628ab 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -10,7 +10,10 @@ import ( ) // badorm/baseModels.go -var badORMModels = []string{"github.com/ditrit/badaas/badorm.UUIDModel", "github.com/ditrit/badaas/badorm.UIntModel", "gorm.io/gorm.Model"} +var badORMModels = []string{ + badORMPath + "." + uuidModel, + badORMPath + "." + uIntModel, +} type Type struct { types.Type From 4240a04eb4abc3b54aa8805365a89c594d304d7e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 26 Jun 2023 16:09:39 +0200 Subject: [PATCH 394/467] use badorm model in place of any --- badorm/ModuleFx.go | 8 +- badorm/badorm.go | 3 +- badorm/baseModels.go | 7 +- badorm/condition.go | 36 +++---- badorm/crudRepository.go | 6 +- badorm/crudService.go | 6 +- badorm/crudUnsafeRepository.go | 6 +- badorm/crudUnsafeService.go | 6 +- badorm/mysql/logical.go | 2 +- badorm/preload.go | 9 +- controllers/crud.go | 4 +- controllers/crud_test.go | 2 +- mocks/badorm/CRUDRepository.go | 63 +---------- mocks/badorm/CRUDService.go | 4 +- mocks/badorm/CRUDUnsafeRepository.go | 4 +- mocks/badorm/CRUDUnsafeService.go | 4 +- mocks/badorm/Condition.go | 26 ++--- mocks/badorm/Expression.go | 63 +++++++++++ mocks/badorm/IJoinCondition.go | 75 +++++++++++++ mocks/badorm/Model.go | 39 +++++++ mocks/badorm/ModelID.go | 39 +++++++ mocks/badorm/WhereCondition.go | 108 +++++++++++++++++++ mocks/badorm/old/SortOption.go | 53 +++++++++ mocks/badorm/old/pagination/Paginator.go | 53 +++++++++ mocks/configuration/DatabaseConfiguration.go | 19 +++- mocks/configuration/Holder.go | 38 +++++++ router/ModuleFx.go | 2 +- 27 files changed, 555 insertions(+), 130 deletions(-) create mode 100644 mocks/badorm/Expression.go create mode 100644 mocks/badorm/IJoinCondition.go create mode 100644 mocks/badorm/Model.go create mode 100644 mocks/badorm/ModelID.go create mode 100644 mocks/badorm/WhereCondition.go create mode 100644 mocks/badorm/old/SortOption.go create mode 100644 mocks/badorm/old/pagination/Paginator.go create mode 100644 mocks/configuration/Holder.go diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index aeb1f853..f46eef1f 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -24,7 +24,7 @@ var BaDORMModule = fx.Module( ), ) -func GetCRUDServiceModule[T any]() fx.Option { +func GetCRUDServiceModule[T Model]() fx.Option { entity := *new(T) moduleName := fmt.Sprintf( @@ -62,7 +62,7 @@ func failNotBadORMModule() error { return fmt.Errorf("type is not a BaDORM Module") } -func GetCRUDUnsafeServiceModule[T any]() fx.Option { +func GetCRUDUnsafeServiceModule[T Model]() fx.Option { entity := *new(T) moduleName := fmt.Sprintf( @@ -108,7 +108,7 @@ const ( KindNotBaDORMModel ) -func getBaDORMModelKind(entity any) modelKind { +func getBaDORMModelKind(entity Model) modelKind { entityType := getEntityType(entity) _, isUUIDModel := entityType.FieldByName("UUIDModel") @@ -126,7 +126,7 @@ func getBaDORMModelKind(entity any) modelKind { var modelsMapping = map[string]reflect.Type{} -func AddUnsafeModel[T any]() { +func AddUnsafeModel[T Model]() { entity := *new(T) entityType := reflect.TypeOf(entity) modelsMapping[entityType.Name()] = entityType diff --git a/badorm/badorm.go b/badorm/badorm.go index 2446ecbe..9545d455 100644 --- a/badorm/badorm.go +++ b/badorm/badorm.go @@ -5,11 +5,12 @@ import ( "gorm.io/gorm" ) -func GetCRUD[T any, ID BadaasID](db *gorm.DB) (CRUDService[T, ID], CRUDRepository[T, ID]) { +func GetCRUD[T Model, ID ModelID](db *gorm.DB) (CRUDService[T, ID], CRUDRepository[T, ID]) { repository := NewCRUDRepository[T, ID]() return NewCRUDService(db, repository), repository } +// TODO auto migracion no obligatoria func autoMigrate(modelsLists [][]any, db *gorm.DB) error { allModels := pie.Flat(modelsLists) return db.AutoMigrate(allModels...) diff --git a/badorm/baseModels.go b/badorm/baseModels.go index b04a01cb..89832803 100644 --- a/badorm/baseModels.go +++ b/badorm/baseModels.go @@ -7,13 +7,16 @@ import ( ) // supported types for model identifier -// TODO cambiar el nombre -type BadaasID interface { +type ModelID interface { UIntID | UUID IsNil() bool } +type Model interface { + IsLoaded() bool +} + // Base Model for gorm // // Every model intended to be saved in the database must embed this badorm.UUIDModel diff --git a/badorm/condition.go b/badorm/condition.go index 0231e29d..ab451f33 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -51,7 +51,7 @@ func (t Table) DeliverTable(query *gorm.DB, model any, relationName string) (Tab }, nil } -type Condition[T any] interface { +type Condition[T Model] interface { // Applies the condition to the "query" // using the "tableName" as name for the table holding // the data for object of type T @@ -66,7 +66,7 @@ type Condition[T any] interface { // Conditions that can be used in a where clause // (or in a on of a join) -type WhereCondition[T any] interface { +type WhereCondition[T Model] interface { Condition[T] // Get the sql string and values to use in the query @@ -79,7 +79,7 @@ type WhereCondition[T any] interface { // Condition that contains a internal condition. // Example: NOT (internal condition) -type ContainerCondition[T any] struct { +type ContainerCondition[T Model] struct { ConnectionCondition WhereCondition[T] Prefix string } @@ -112,7 +112,7 @@ func (condition ContainerCondition[T]) affectsDeletedAt() bool { // Condition that contains a internal condition. // Example: NOT (internal condition) -func NewContainerCondition[T any](prefix string, conditions ...WhereCondition[T]) WhereCondition[T] { +func NewContainerCondition[T Model](prefix string, conditions ...WhereCondition[T]) WhereCondition[T] { if len(conditions) == 0 { return NewInvalidCondition[T](ErrEmptyConditions) } @@ -125,7 +125,7 @@ func NewContainerCondition[T any](prefix string, conditions ...WhereCondition[T] // Condition that connects multiple conditions. // Example: condition1 AND condition2 -type ConnectionCondition[T any] struct { +type ConnectionCondition[T Model] struct { Connector string Conditions []WhereCondition[T] } @@ -167,7 +167,7 @@ func (condition ConnectionCondition[T]) affectsDeletedAt() bool { // Condition that connects multiple conditions. // Example: condition1 AND condition2 -func NewConnectionCondition[T any](connector string, conditions ...WhereCondition[T]) WhereCondition[T] { +func NewConnectionCondition[T Model](connector string, conditions ...WhereCondition[T]) WhereCondition[T] { return ConnectionCondition[T]{ Connector: connector, Conditions: conditions, @@ -191,7 +191,7 @@ func (columnID FieldIdentifier) ColumnName(db *gorm.DB, table Table) string { } // TODO doc -type PreloadCondition[T any] struct { +type PreloadCondition[T Model] struct { Fields []FieldIdentifier } @@ -219,7 +219,7 @@ func (condition PreloadCondition[T]) ApplyTo(query *gorm.DB, table Table) (*gorm } // TODO doc -func NewPreloadCondition[T any](fields ...FieldIdentifier) PreloadCondition[T] { +func NewPreloadCondition[T Model](fields ...FieldIdentifier) PreloadCondition[T] { return PreloadCondition[T]{ Fields: append( fields, @@ -234,7 +234,7 @@ func NewPreloadCondition[T any](fields ...FieldIdentifier) PreloadCondition[T] { // Condition that verifies the value of a field, // using the Expression -type FieldCondition[TObject any, TAtribute any] struct { +type FieldCondition[TObject Model, TAtribute any] struct { FieldIdentifier FieldIdentifier Expression Expression[TAtribute] } @@ -251,7 +251,7 @@ func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *gorm.DB, tabl return applyWhereCondition[TObject](condition, query, table) } -func applyWhereCondition[T any](condition WhereCondition[T], query *gorm.DB, table Table) (*gorm.DB, error) { +func applyWhereCondition[T Model](condition WhereCondition[T], query *gorm.DB, table Table) (*gorm.DB, error) { sql, values, err := condition.GetSQL(query, table) if err != nil { return nil, err @@ -278,7 +278,7 @@ func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table } // Interface of a join condition that joins T with any other model -type IJoinCondition[T any] interface { +type IJoinCondition[T Model] interface { Condition[T] // Returns true if this condition or any nested condition makes a preload @@ -286,7 +286,7 @@ type IJoinCondition[T any] interface { } // Condition that joins with other table -type JoinCondition[T1 any, T2 any] struct { +type JoinCondition[T1 Model, T2 Model] struct { T1Field string T2Field string RelationField string @@ -411,7 +411,7 @@ func (condition JoinCondition[T1, T2]) getSQLJoin( } // Divides a list of conditions by its type: WhereConditions and JoinConditions -func divideConditionsByType[T any]( +func divideConditionsByType[T Model]( conditions []Condition[T], ) (whereConditions []WhereCondition[T], joinConditions []IJoinCondition[T], preloadCondition *PreloadCondition[T]) { for _, condition := range conditions { @@ -439,7 +439,7 @@ func divideConditionsByType[T any]( // Condition that can be used to express conditions that are not supported (yet?) by BaDORM // Example: table1.columnX = table2.columnY -type UnsafeCondition[T any] struct { +type UnsafeCondition[T Model] struct { SQLCondition string Values []any } @@ -468,7 +468,7 @@ func (condition UnsafeCondition[T]) affectsDeletedAt() bool { // Condition that can be used to express conditions that are not supported (yet?) by BaDORM // Example: table1.columnX = table2.columnY -func NewUnsafeCondition[T any](condition string, values []any) UnsafeCondition[T] { +func NewUnsafeCondition[T Model](condition string, values []any) UnsafeCondition[T] { return UnsafeCondition[T]{ SQLCondition: condition, Values: values, @@ -513,14 +513,14 @@ func NewInvalidCondition[T any](err error) InvalidCondition[T] { // - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/logical-operators-transact-sql?view=sql-server-ver16 // - SQLite: https://www.sqlite.org/lang_expr.html -func And[T any](conditions ...WhereCondition[T]) WhereCondition[T] { +func And[T Model](conditions ...WhereCondition[T]) WhereCondition[T] { return NewConnectionCondition("AND", conditions...) } -func Or[T any](conditions ...WhereCondition[T]) WhereCondition[T] { +func Or[T Model](conditions ...WhereCondition[T]) WhereCondition[T] { return NewConnectionCondition("OR", conditions...) } -func Not[T any](conditions ...WhereCondition[T]) WhereCondition[T] { +func Not[T Model](conditions ...WhereCondition[T]) WhereCondition[T] { return NewContainerCondition("NOT", conditions...) } diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 78323b49..8c70e133 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -10,7 +10,7 @@ import ( // Generic CRUD Repository // T can be any model whose identifier attribute is of type ID -type CRUDRepository[T any, ID BadaasID] interface { +type CRUDRepository[T Model, ID ModelID] interface { // create Create(tx *gorm.DB, entity *T) error // read @@ -30,12 +30,12 @@ var ( ) // Implementation of the Generic CRUD Repository -type CRUDRepositoryImpl[T any, ID BadaasID] struct { +type CRUDRepositoryImpl[T Model, ID ModelID] struct { CRUDRepository[T, ID] } // Constructor of the Generic CRUD Repository -func NewCRUDRepository[T any, ID BadaasID]() CRUDRepository[T, ID] { +func NewCRUDRepository[T Model, ID ModelID]() CRUDRepository[T, ID] { return &CRUDRepositoryImpl[T, ID]{} } diff --git a/badorm/crudService.go b/badorm/crudService.go index 2b419979..22b995db 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -5,7 +5,7 @@ import ( ) // T can be any model whose identifier attribute is of type ID -type CRUDService[T any, ID BadaasID] interface { +type CRUDService[T Model, ID ModelID] interface { GetEntity(id ID) (*T, error) // GetEntities(conditions map[string]any) ([]*T, error) GetEntities(conditions ...Condition[T]) ([]*T, error) @@ -15,13 +15,13 @@ type CRUDService[T any, ID BadaasID] interface { var _ CRUDService[UUIDModel, UUID] = (*crudServiceImpl[UUIDModel, UUID])(nil) // Implementation of the CRUD Service -type crudServiceImpl[T any, ID BadaasID] struct { +type crudServiceImpl[T Model, ID ModelID] struct { CRUDService[T, ID] db *gorm.DB repository CRUDRepository[T, ID] } -func NewCRUDService[T any, ID BadaasID]( +func NewCRUDService[T Model, ID ModelID]( db *gorm.DB, repository CRUDRepository[T, ID], ) CRUDService[T, ID] { diff --git a/badorm/crudUnsafeRepository.go b/badorm/crudUnsafeRepository.go index d0a41299..dfabf3ac 100644 --- a/badorm/crudUnsafeRepository.go +++ b/badorm/crudUnsafeRepository.go @@ -9,7 +9,7 @@ import ( // Generic CRUD Repository // T can be any model whose identifier attribute is of type ID -type CRUDUnsafeRepository[T any, ID BadaasID] interface { +type CRUDUnsafeRepository[T Model, ID ModelID] interface { GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) } @@ -26,12 +26,12 @@ var ( ) // Implementation of the Generic CRUD Repository -type CRUDUnsafeRepositoryImpl[T any, ID BadaasID] struct { +type CRUDUnsafeRepositoryImpl[T Model, ID ModelID] struct { CRUDUnsafeRepository[T, ID] } // Constructor of the Generic CRUD Repository -func NewCRUDUnsafeRepository[T any, ID BadaasID]() CRUDUnsafeRepository[T, ID] { +func NewCRUDUnsafeRepository[T Model, ID ModelID]() CRUDUnsafeRepository[T, ID] { return &CRUDUnsafeRepositoryImpl[T, ID]{} } diff --git a/badorm/crudUnsafeService.go b/badorm/crudUnsafeService.go index 4d8036d5..8d9d8928 100644 --- a/badorm/crudUnsafeService.go +++ b/badorm/crudUnsafeService.go @@ -5,7 +5,7 @@ import ( ) // T can be any model whose identifier attribute is of type ID -type CRUDUnsafeService[T any, ID BadaasID] interface { +type CRUDUnsafeService[T Model, ID ModelID] interface { GetEntities(conditions map[string]any) ([]*T, error) } @@ -13,13 +13,13 @@ type CRUDUnsafeService[T any, ID BadaasID] interface { var _ CRUDUnsafeService[UUIDModel, UUID] = (*crudUnsafeServiceImpl[UUIDModel, UUID])(nil) // Implementation of the CRUD Service -type crudUnsafeServiceImpl[T any, ID BadaasID] struct { +type crudUnsafeServiceImpl[T Model, ID ModelID] struct { CRUDService[T, ID] db *gorm.DB repository CRUDUnsafeRepository[T, ID] } -func NewCRUDUnsafeService[T any, ID BadaasID]( +func NewCRUDUnsafeService[T Model, ID ModelID]( db *gorm.DB, repository CRUDUnsafeRepository[T, ID], ) CRUDUnsafeService[T, ID] { diff --git a/badorm/mysql/logical.go b/badorm/mysql/logical.go index caf4dce1..89a8d8b7 100644 --- a/badorm/mysql/logical.go +++ b/badorm/mysql/logical.go @@ -4,6 +4,6 @@ import ( "github.com/ditrit/badaas/badorm" ) -func Xor[T any](conditions ...badorm.WhereCondition[T]) badorm.WhereCondition[T] { +func Xor[T badorm.Model](conditions ...badorm.WhereCondition[T]) badorm.WhereCondition[T] { return badorm.NewConnectionCondition("XOR", conditions...) } diff --git a/badorm/preload.go b/badorm/preload.go index d7130eff..069641cd 100644 --- a/badorm/preload.go +++ b/badorm/preload.go @@ -4,12 +4,7 @@ import "errors" var ErrRelationNotLoaded = errors.New("Relation not loaded") -// TODO usar en el resto de lugar de badorm -type BadORMModel interface { - IsLoaded() bool -} - -func VerifyStructLoaded[T BadORMModel](toVerify *T) (*T, error) { +func VerifyStructLoaded[T Model](toVerify *T) (*T, error) { if toVerify == nil || !(*toVerify).IsLoaded() { return nil, ErrRelationNotLoaded } @@ -17,7 +12,7 @@ func VerifyStructLoaded[T BadORMModel](toVerify *T) (*T, error) { return toVerify, nil } -func VerifyPointerLoaded[TModel BadORMModel, TID BadaasID](id *TID, toVerify *TModel) (*TModel, error) { +func VerifyPointerLoaded[TModel Model, TID ModelID](id *TID, toVerify *TModel) (*TModel, error) { // if id == nil the relation is null // if (*id).IsNil(), id is loaded from a null // if toVerify != nil, the relation is loaded and not null diff --git a/controllers/crud.go b/controllers/crud.go index 35a29cd4..0f1de812 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -26,7 +26,7 @@ type CRUDRoute struct { Controller CRUDController } -func NewCRUDController[T any]( +func NewCRUDController[T badorm.Model]( logger *zap.Logger, crudService badorm.CRUDService[T, badorm.UUID], crudUnsafeService badorm.CRUDUnsafeService[T, badorm.UUID], @@ -46,7 +46,7 @@ func NewCRUDController[T any]( } // The concrete implementation of the CRUDController -type crudControllerImpl[T any] struct { +type crudControllerImpl[T badorm.Model] struct { logger *zap.Logger crudService badorm.CRUDService[T, badorm.UUID] crudUnsafeService badorm.CRUDUnsafeService[T, badorm.UUID] diff --git a/controllers/crud_test.go b/controllers/crud_test.go index 30d77c69..4007b812 100644 --- a/controllers/crud_test.go +++ b/controllers/crud_test.go @@ -19,7 +19,7 @@ import ( // ----------------------- GetObject ----------------------- type Model struct { - ID badorm.UUID + badorm.UUIDModel } func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { diff --git a/mocks/badorm/CRUDRepository.go b/mocks/badorm/CRUDRepository.go index 630a22fe..6b681d4b 100644 --- a/mocks/badorm/CRUDRepository.go +++ b/mocks/badorm/CRUDRepository.go @@ -10,7 +10,7 @@ import ( ) // CRUDRepository is an autogenerated mock type for the CRUDRepository type -type CRUDRepository[T interface{}, ID badorm.BadaasID] struct { +type CRUDRepository[T badorm.Model, ID badorm.ModelID] struct { mock.Mock } @@ -160,65 +160,6 @@ func (_m *CRUDRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions ...badorm.C return r0, r1 } -// GetOptional provides a mock function with given fields: tx, conditions -func (_m *CRUDRepository[T, ID]) GetOptional(tx *gorm.DB, conditions ...badorm.Condition[T]) (*T, error) { - _va := make([]interface{}, len(conditions)) - for _i := range conditions { - _va[_i] = conditions[_i] - } - var _ca []interface{} - _ca = append(_ca, tx) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - var r0 *T - var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) (*T, error)); ok { - return rf(tx, conditions...) - } - if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) *T); ok { - r0 = rf(tx, conditions...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*T) - } - } - - if rf, ok := ret.Get(1).(func(*gorm.DB, ...badorm.Condition[T]) error); ok { - r1 = rf(tx, conditions...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetOptionalByID provides a mock function with given fields: tx, id -func (_m *CRUDRepository[T, ID]) GetOptionalByID(tx *gorm.DB, id ID) (*T, error) { - ret := _m.Called(tx, id) - - var r0 *T - var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, ID) (*T, error)); ok { - return rf(tx, id) - } - if rf, ok := ret.Get(0).(func(*gorm.DB, ID) *T); ok { - r0 = rf(tx, id) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*T) - } - } - - if rf, ok := ret.Get(1).(func(*gorm.DB, ID) error); ok { - r1 = rf(tx, id) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // Save provides a mock function with given fields: tx, entity func (_m *CRUDRepository[T, ID]) Save(tx *gorm.DB, entity *T) error { ret := _m.Called(tx, entity) @@ -239,7 +180,7 @@ type mockConstructorTestingTNewCRUDRepository interface { } // NewCRUDRepository creates a new instance of CRUDRepository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDRepository[T interface{}, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDRepository) *CRUDRepository[T, ID] { +func NewCRUDRepository[T badorm.Model, ID badorm.ModelID](t mockConstructorTestingTNewCRUDRepository) *CRUDRepository[T, ID] { mock := &CRUDRepository[T, ID]{} mock.Mock.Test(t) diff --git a/mocks/badorm/CRUDService.go b/mocks/badorm/CRUDService.go index 9b6d258b..c13b3ad0 100644 --- a/mocks/badorm/CRUDService.go +++ b/mocks/badorm/CRUDService.go @@ -8,7 +8,7 @@ import ( ) // CRUDService is an autogenerated mock type for the CRUDService type -type CRUDService[T interface{}, ID badorm.BadaasID] struct { +type CRUDService[T badorm.Model, ID badorm.ModelID] struct { mock.Mock } @@ -76,7 +76,7 @@ type mockConstructorTestingTNewCRUDService interface { } // NewCRUDService creates a new instance of CRUDService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDService[T interface{}, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDService) *CRUDService[T, ID] { +func NewCRUDService[T badorm.Model, ID badorm.ModelID](t mockConstructorTestingTNewCRUDService) *CRUDService[T, ID] { mock := &CRUDService[T, ID]{} mock.Mock.Test(t) diff --git a/mocks/badorm/CRUDUnsafeRepository.go b/mocks/badorm/CRUDUnsafeRepository.go index d510ae40..c81201eb 100644 --- a/mocks/badorm/CRUDUnsafeRepository.go +++ b/mocks/badorm/CRUDUnsafeRepository.go @@ -10,7 +10,7 @@ import ( ) // CRUDUnsafeRepository is an autogenerated mock type for the CRUDUnsafeRepository type -type CRUDUnsafeRepository[T interface{}, ID badorm.BadaasID] struct { +type CRUDUnsafeRepository[T badorm.Model, ID badorm.ModelID] struct { mock.Mock } @@ -46,7 +46,7 @@ type mockConstructorTestingTNewCRUDUnsafeRepository interface { } // NewCRUDUnsafeRepository creates a new instance of CRUDUnsafeRepository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDUnsafeRepository[T interface{}, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDUnsafeRepository) *CRUDUnsafeRepository[T, ID] { +func NewCRUDUnsafeRepository[T badorm.Model, ID badorm.ModelID](t mockConstructorTestingTNewCRUDUnsafeRepository) *CRUDUnsafeRepository[T, ID] { mock := &CRUDUnsafeRepository[T, ID]{} mock.Mock.Test(t) diff --git a/mocks/badorm/CRUDUnsafeService.go b/mocks/badorm/CRUDUnsafeService.go index b96a98dc..1f4ee53e 100644 --- a/mocks/badorm/CRUDUnsafeService.go +++ b/mocks/badorm/CRUDUnsafeService.go @@ -8,7 +8,7 @@ import ( ) // CRUDUnsafeService is an autogenerated mock type for the CRUDUnsafeService type -type CRUDUnsafeService[T interface{}, ID badorm.BadaasID] struct { +type CRUDUnsafeService[T badorm.Model, ID badorm.ModelID] struct { mock.Mock } @@ -44,7 +44,7 @@ type mockConstructorTestingTNewCRUDUnsafeService interface { } // NewCRUDUnsafeService creates a new instance of CRUDUnsafeService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDUnsafeService[T interface{}, ID badorm.BadaasID](t mockConstructorTestingTNewCRUDUnsafeService) *CRUDUnsafeService[T, ID] { +func NewCRUDUnsafeService[T badorm.Model, ID badorm.ModelID](t mockConstructorTestingTNewCRUDUnsafeService) *CRUDUnsafeService[T, ID] { mock := &CRUDUnsafeService[T, ID]{} mock.Mock.Test(t) diff --git a/mocks/badorm/Condition.go b/mocks/badorm/Condition.go index 2d214a05..c6601120 100644 --- a/mocks/badorm/Condition.go +++ b/mocks/badorm/Condition.go @@ -3,34 +3,36 @@ package mocks import ( - mock "github.com/stretchr/testify/mock" + badorm "github.com/ditrit/badaas/badorm" gorm "gorm.io/gorm" + + mock "github.com/stretchr/testify/mock" ) // Condition is an autogenerated mock type for the Condition type -type Condition[T interface{}] struct { +type Condition[T badorm.Model] struct { mock.Mock } -// ApplyTo provides a mock function with given fields: query, tableName -func (_m *Condition[T]) ApplyTo(query *gorm.DB, tableName string) (*gorm.DB, error) { - ret := _m.Called(query, tableName) +// ApplyTo provides a mock function with given fields: query, table +func (_m *Condition[T]) ApplyTo(query *gorm.DB, table badorm.Table) (*gorm.DB, error) { + ret := _m.Called(query, table) var r0 *gorm.DB var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, string) (*gorm.DB, error)); ok { - return rf(query, tableName) + if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) (*gorm.DB, error)); ok { + return rf(query, table) } - if rf, ok := ret.Get(0).(func(*gorm.DB, string) *gorm.DB); ok { - r0 = rf(query, tableName) + if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) *gorm.DB); ok { + r0 = rf(query, table) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*gorm.DB) } } - if rf, ok := ret.Get(1).(func(*gorm.DB, string) error); ok { - r1 = rf(query, tableName) + if rf, ok := ret.Get(1).(func(*gorm.DB, badorm.Table) error); ok { + r1 = rf(query, table) } else { r1 = ret.Error(1) } @@ -49,7 +51,7 @@ type mockConstructorTestingTNewCondition interface { } // NewCondition creates a new instance of Condition. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCondition[T interface{}](t mockConstructorTestingTNewCondition) *Condition[T] { +func NewCondition[T badorm.Model](t mockConstructorTestingTNewCondition) *Condition[T] { mock := &Condition[T]{} mock.Mock.Test(t) diff --git a/mocks/badorm/Expression.go b/mocks/badorm/Expression.go new file mode 100644 index 00000000..73f44bb2 --- /dev/null +++ b/mocks/badorm/Expression.go @@ -0,0 +1,63 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// Expression is an autogenerated mock type for the Expression type +type Expression[T interface{}] struct { + mock.Mock +} + +// InterfaceVerificationMethod provides a mock function with given fields: _a0 +func (_m *Expression[T]) InterfaceVerificationMethod(_a0 T) { + _m.Called(_a0) +} + +// ToSQL provides a mock function with given fields: columnName +func (_m *Expression[T]) ToSQL(columnName string) (string, []interface{}, error) { + ret := _m.Called(columnName) + + var r0 string + var r1 []interface{} + var r2 error + if rf, ok := ret.Get(0).(func(string) (string, []interface{}, error)); ok { + return rf(columnName) + } + if rf, ok := ret.Get(0).(func(string) string); ok { + r0 = rf(columnName) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(string) []interface{}); ok { + r1 = rf(columnName) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]interface{}) + } + } + + if rf, ok := ret.Get(2).(func(string) error); ok { + r2 = rf(columnName) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +type mockConstructorTestingTNewExpression interface { + mock.TestingT + Cleanup(func()) +} + +// NewExpression creates a new instance of Expression. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewExpression[T interface{}](t mockConstructorTestingTNewExpression) *Expression[T] { + mock := &Expression[T]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/badorm/IJoinCondition.go b/mocks/badorm/IJoinCondition.go new file mode 100644 index 00000000..81909f3c --- /dev/null +++ b/mocks/badorm/IJoinCondition.go @@ -0,0 +1,75 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + badorm "github.com/ditrit/badaas/badorm" + gorm "gorm.io/gorm" + + mock "github.com/stretchr/testify/mock" +) + +// IJoinCondition is an autogenerated mock type for the IJoinCondition type +type IJoinCondition[T badorm.Model] struct { + mock.Mock +} + +// ApplyTo provides a mock function with given fields: query, table +func (_m *IJoinCondition[T]) ApplyTo(query *gorm.DB, table badorm.Table) (*gorm.DB, error) { + ret := _m.Called(query, table) + + var r0 *gorm.DB + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) (*gorm.DB, error)); ok { + return rf(query, table) + } + if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) *gorm.DB); ok { + r0 = rf(query, table) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*gorm.DB) + } + } + + if rf, ok := ret.Get(1).(func(*gorm.DB, badorm.Table) error); ok { + r1 = rf(query, table) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// interfaceVerificationMethod provides a mock function with given fields: _a0 +func (_m *IJoinCondition[T]) interfaceVerificationMethod(_a0 T) { + _m.Called(_a0) +} + +// makesPreload provides a mock function with given fields: +func (_m *IJoinCondition[T]) makesPreload() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +type mockConstructorTestingTNewIJoinCondition interface { + mock.TestingT + Cleanup(func()) +} + +// NewIJoinCondition creates a new instance of IJoinCondition. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewIJoinCondition[T badorm.Model](t mockConstructorTestingTNewIJoinCondition) *IJoinCondition[T] { + mock := &IJoinCondition[T]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/badorm/Model.go b/mocks/badorm/Model.go new file mode 100644 index 00000000..ca967b67 --- /dev/null +++ b/mocks/badorm/Model.go @@ -0,0 +1,39 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// Model is an autogenerated mock type for the Model type +type Model struct { + mock.Mock +} + +// IsLoaded provides a mock function with given fields: +func (_m *Model) IsLoaded() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +type mockConstructorTestingTNewModel interface { + mock.TestingT + Cleanup(func()) +} + +// NewModel creates a new instance of Model. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewModel(t mockConstructorTestingTNewModel) *Model { + mock := &Model{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/badorm/ModelID.go b/mocks/badorm/ModelID.go new file mode 100644 index 00000000..dfaee03d --- /dev/null +++ b/mocks/badorm/ModelID.go @@ -0,0 +1,39 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// ModelID is an autogenerated mock type for the ModelID type +type ModelID struct { + mock.Mock +} + +// IsNil provides a mock function with given fields: +func (_m *ModelID) IsNil() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +type mockConstructorTestingTNewModelID interface { + mock.TestingT + Cleanup(func()) +} + +// NewModelID creates a new instance of ModelID. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewModelID(t mockConstructorTestingTNewModelID) *ModelID { + mock := &ModelID{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/badorm/WhereCondition.go b/mocks/badorm/WhereCondition.go new file mode 100644 index 00000000..4dfdfdea --- /dev/null +++ b/mocks/badorm/WhereCondition.go @@ -0,0 +1,108 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + badorm "github.com/ditrit/badaas/badorm" + gorm "gorm.io/gorm" + + mock "github.com/stretchr/testify/mock" +) + +// WhereCondition is an autogenerated mock type for the WhereCondition type +type WhereCondition[T badorm.Model] struct { + mock.Mock +} + +// ApplyTo provides a mock function with given fields: query, table +func (_m *WhereCondition[T]) ApplyTo(query *gorm.DB, table badorm.Table) (*gorm.DB, error) { + ret := _m.Called(query, table) + + var r0 *gorm.DB + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) (*gorm.DB, error)); ok { + return rf(query, table) + } + if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) *gorm.DB); ok { + r0 = rf(query, table) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*gorm.DB) + } + } + + if rf, ok := ret.Get(1).(func(*gorm.DB, badorm.Table) error); ok { + r1 = rf(query, table) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetSQL provides a mock function with given fields: query, table +func (_m *WhereCondition[T]) GetSQL(query *gorm.DB, table badorm.Table) (string, []interface{}, error) { + ret := _m.Called(query, table) + + var r0 string + var r1 []interface{} + var r2 error + if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) (string, []interface{}, error)); ok { + return rf(query, table) + } + if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) string); ok { + r0 = rf(query, table) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(*gorm.DB, badorm.Table) []interface{}); ok { + r1 = rf(query, table) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]interface{}) + } + } + + if rf, ok := ret.Get(2).(func(*gorm.DB, badorm.Table) error); ok { + r2 = rf(query, table) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// affectsDeletedAt provides a mock function with given fields: +func (_m *WhereCondition[T]) affectsDeletedAt() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// interfaceVerificationMethod provides a mock function with given fields: _a0 +func (_m *WhereCondition[T]) interfaceVerificationMethod(_a0 T) { + _m.Called(_a0) +} + +type mockConstructorTestingTNewWhereCondition interface { + mock.TestingT + Cleanup(func()) +} + +// NewWhereCondition creates a new instance of WhereCondition. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewWhereCondition[T badorm.Model](t mockConstructorTestingTNewWhereCondition) *WhereCondition[T] { + mock := &WhereCondition[T]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/badorm/old/SortOption.go b/mocks/badorm/old/SortOption.go new file mode 100644 index 00000000..807bd26c --- /dev/null +++ b/mocks/badorm/old/SortOption.go @@ -0,0 +1,53 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// SortOption is an autogenerated mock type for the SortOption type +type SortOption struct { + mock.Mock +} + +// Column provides a mock function with given fields: +func (_m *SortOption) Column() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// Desc provides a mock function with given fields: +func (_m *SortOption) Desc() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +type mockConstructorTestingTNewSortOption interface { + mock.TestingT + Cleanup(func()) +} + +// NewSortOption creates a new instance of SortOption. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewSortOption(t mockConstructorTestingTNewSortOption) *SortOption { + mock := &SortOption{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/badorm/old/pagination/Paginator.go b/mocks/badorm/old/pagination/Paginator.go new file mode 100644 index 00000000..ef2c6359 --- /dev/null +++ b/mocks/badorm/old/pagination/Paginator.go @@ -0,0 +1,53 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// Paginator is an autogenerated mock type for the Paginator type +type Paginator struct { + mock.Mock +} + +// Limit provides a mock function with given fields: +func (_m *Paginator) Limit() uint { + ret := _m.Called() + + var r0 uint + if rf, ok := ret.Get(0).(func() uint); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint) + } + + return r0 +} + +// Offset provides a mock function with given fields: +func (_m *Paginator) Offset() uint { + ret := _m.Called() + + var r0 uint + if rf, ok := ret.Get(0).(func() uint); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint) + } + + return r0 +} + +type mockConstructorTestingTNewPaginator interface { + mock.TestingT + Cleanup(func()) +} + +// NewPaginator creates a new instance of Paginator. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewPaginator(t mockConstructorTestingTNewPaginator) *Paginator { + mock := &Paginator{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/configuration/DatabaseConfiguration.go b/mocks/configuration/DatabaseConfiguration.go index 51f0f487..12eeb7f7 100644 --- a/mocks/configuration/DatabaseConfiguration.go +++ b/mocks/configuration/DatabaseConfiguration.go @@ -3,10 +3,11 @@ package mocks import ( - time "time" - + configuration "github.com/ditrit/badaas/configuration" mock "github.com/stretchr/testify/mock" + time "time" + zap "go.uber.org/zap" ) @@ -29,6 +30,20 @@ func (_m *DatabaseConfiguration) GetDBName() string { return r0 } +// GetDialector provides a mock function with given fields: +func (_m *DatabaseConfiguration) GetDialector() configuration.DBDialector { + ret := _m.Called() + + var r0 configuration.DBDialector + if rf, ok := ret.Get(0).(func() configuration.DBDialector); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(configuration.DBDialector) + } + + return r0 +} + // GetHost provides a mock function with given fields: func (_m *DatabaseConfiguration) GetHost() string { ret := _m.Called() diff --git a/mocks/configuration/Holder.go b/mocks/configuration/Holder.go new file mode 100644 index 00000000..4dfc6188 --- /dev/null +++ b/mocks/configuration/Holder.go @@ -0,0 +1,38 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + mock "github.com/stretchr/testify/mock" + zap "go.uber.org/zap" +) + +// Holder is an autogenerated mock type for the Holder type +type Holder struct { + mock.Mock +} + +// Log provides a mock function with given fields: logger +func (_m *Holder) Log(logger *zap.Logger) { + _m.Called(logger) +} + +// Reload provides a mock function with given fields: +func (_m *Holder) Reload() { + _m.Called() +} + +type mockConstructorTestingTNewHolder interface { + mock.TestingT + Cleanup(func()) +} + +// NewHolder creates a new instance of Holder. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewHolder(t mockConstructorTestingTNewHolder) *Holder { + mock := &Holder{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/router/ModuleFx.go b/router/ModuleFx.go index e5eeaf22..61142f53 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -70,7 +70,7 @@ var EAVRoutesModule = fx.Module( ), ) -func GetCRUDRoutesModule[T any]() fx.Option { +func GetCRUDRoutesModule[T badorm.Model]() fx.Option { typeName := fmt.Sprintf("%T", *new(T)) return fx.Module( From 13362c0a46c32427a28bb980d366c54b0574bec5 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 26 Jun 2023 16:10:38 +0200 Subject: [PATCH 395/467] remove old mock files --- mocks/badorm/old/SortOption.go | 53 ------------------------ mocks/badorm/old/pagination/Paginator.go | 53 ------------------------ 2 files changed, 106 deletions(-) delete mode 100644 mocks/badorm/old/SortOption.go delete mode 100644 mocks/badorm/old/pagination/Paginator.go diff --git a/mocks/badorm/old/SortOption.go b/mocks/badorm/old/SortOption.go deleted file mode 100644 index 807bd26c..00000000 --- a/mocks/badorm/old/SortOption.go +++ /dev/null @@ -1,53 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import mock "github.com/stretchr/testify/mock" - -// SortOption is an autogenerated mock type for the SortOption type -type SortOption struct { - mock.Mock -} - -// Column provides a mock function with given fields: -func (_m *SortOption) Column() string { - ret := _m.Called() - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// Desc provides a mock function with given fields: -func (_m *SortOption) Desc() bool { - ret := _m.Called() - - var r0 bool - if rf, ok := ret.Get(0).(func() bool); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -type mockConstructorTestingTNewSortOption interface { - mock.TestingT - Cleanup(func()) -} - -// NewSortOption creates a new instance of SortOption. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewSortOption(t mockConstructorTestingTNewSortOption) *SortOption { - mock := &SortOption{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/mocks/badorm/old/pagination/Paginator.go b/mocks/badorm/old/pagination/Paginator.go deleted file mode 100644 index ef2c6359..00000000 --- a/mocks/badorm/old/pagination/Paginator.go +++ /dev/null @@ -1,53 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import mock "github.com/stretchr/testify/mock" - -// Paginator is an autogenerated mock type for the Paginator type -type Paginator struct { - mock.Mock -} - -// Limit provides a mock function with given fields: -func (_m *Paginator) Limit() uint { - ret := _m.Called() - - var r0 uint - if rf, ok := ret.Get(0).(func() uint); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(uint) - } - - return r0 -} - -// Offset provides a mock function with given fields: -func (_m *Paginator) Offset() uint { - ret := _m.Called() - - var r0 uint - if rf, ok := ret.Get(0).(func() uint); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(uint) - } - - return r0 -} - -type mockConstructorTestingTNewPaginator interface { - mock.TestingT - Cleanup(func()) -} - -// NewPaginator creates a new instance of Paginator. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewPaginator(t mockConstructorTestingTNewPaginator) *Paginator { - mock := &Paginator{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} From 4bd5ef2056b24e89ef76edf26c61a1d233cd3e86 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 27 Jun 2023 14:52:12 +0200 Subject: [PATCH 396/467] automatic generation of relation getters --- badorm/preload.go | 17 +- testintegration/join_conditions_test.go | 6 +- testintegration/models/badorm.go | 76 ++++----- testintegration/models/models.go | 12 +- testintegration/preload_conditions_test.go | 127 +++++++++++---- tools/badctl/cmd/gen/conditions/condition.go | 8 +- tools/badctl/cmd/gen/conditions/main.go | 160 ++++++++++++++++++- tools/badctl/cmd/gen/conditions/type.go | 23 ++- 8 files changed, 324 insertions(+), 105 deletions(-) diff --git a/badorm/preload.go b/badorm/preload.go index 069641cd..a0fe4adb 100644 --- a/badorm/preload.go +++ b/badorm/preload.go @@ -13,10 +13,19 @@ func VerifyStructLoaded[T Model](toVerify *T) (*T, error) { } func VerifyPointerLoaded[TModel Model, TID ModelID](id *TID, toVerify *TModel) (*TModel, error) { - // if id == nil the relation is null - // if (*id).IsNil(), id is loaded from a null - // if toVerify != nil, the relation is loaded and not null - if id != nil && !(*id).IsNil() && toVerify == nil { + // when the pointer to the object is nil + // but the id pointer indicates that the relation is not nil + if id != nil && toVerify == nil { + return nil, ErrRelationNotLoaded + } + + return toVerify, nil +} + +func VerifyPointerWithIDLoaded[TModel Model, TID ModelID](id TID, toVerify *TModel) (*TModel, error) { + // when the pointer to the object is nil + // but the id indicates that the relation is not nil + if !id.IsNil() && toVerify == nil { return nil, ErrRelationNotLoaded } diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 0d764579..9c797835 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -354,7 +354,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsMultipleTimes() { EqualList(&ts.Suite, []*models.Sale{match}, entities) } -func (ts *WhereConditionsIntTestSuite) TestJoinWithUnsafeCondition() { +func (ts *JoinConditionsIntTestSuite) TestJoinWithUnsafeCondition() { product1 := ts.createProduct("", 0, 0.0, false, nil) product2 := ts.createProduct("", 0, 0.0, false, nil) @@ -379,7 +379,7 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithUnsafeCondition() { EqualList(&ts.Suite, []*models.Sale{match}, entities) } -func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyConnectionConditionMakesNothing() { +func (ts *JoinConditionsIntTestSuite) TestJoinWithEmptyConnectionConditionMakesNothing() { product1 := ts.createProduct("", 1, 0.0, false, nil) product2 := ts.createProduct("", 2, 0.0, false, nil) @@ -396,7 +396,7 @@ func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyConnectionConditionMakes EqualList(&ts.Suite, []*models.Sale{match1, match2}, entities) } -func (ts *WhereConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesNothing() { +func (ts *JoinConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesNothing() { _, err := ts.crudSaleService.GetEntities( conditions.SaleProduct( badorm.Not[models.Product](), diff --git a/testintegration/models/badorm.go b/testintegration/models/badorm.go index 5a1f843d..f94cc99d 100644 --- a/testintegration/models/badorm.go +++ b/testintegration/models/badorm.go @@ -1,59 +1,41 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. package models -import "github.com/ditrit/badaas/badorm" +import badorm "github.com/ditrit/badaas/badorm" -// TODO que se genere automaticamente todo el archivo -// en el unico caso que no se puede generar es el de pointer sin fk -// TODO que pasa si el fk no es un id? -// ahi tampoco lo puedo terminar de determinar -// porque no tengo el id.IsNil() -// para strings se podria hacer comparando con el string vacio -// el resto bueno, que lo determine el usuario sino -// el problema es que para que vaya a string vacia tengo que hacer el truquito del null mapearlo a string vacio, -// lo cual no puedo hacer en todos los casos -// a menos que ya te cree una StringReference que haga el truquito pero chupala -// quien mierda en este mundo usa esas referencias por string +func (m Bicycle) GetOwner() (*Person, error) { + return badorm.VerifyStructLoaded[Person](&m.Owner) +} +func (m Child) GetParent1() (*Parent1, error) { + return badorm.VerifyStructLoaded[Parent1](&m.Parent1) +} +func (m Child) GetParent2() (*Parent2, error) { + return badorm.VerifyStructLoaded[Parent2](&m.Parent2) +} +func (m City) GetCountry() (*Country, error) { + return badorm.VerifyPointerWithIDLoaded[Country](m.CountryID, m.Country) +} +func (m Country) GetCapital() (*City, error) { + return badorm.VerifyStructLoaded[City](&m.Capital) +} +func (m Employee) GetBoss() (*Employee, error) { + return badorm.VerifyPointerLoaded[Employee](m.BossID, m.Boss) +} +func (m Parent1) GetParentParent() (*ParentParent, error) { + return badorm.VerifyStructLoaded[ParentParent](&m.ParentParent) +} +func (m Parent2) GetParentParent() (*ParentParent, error) { + return badorm.VerifyStructLoaded[ParentParent](&m.ParentParent) +} +func (m Phone) GetBrand() (*Brand, error) { + return badorm.VerifyStructLoaded[Brand](&m.Brand) +} func (m Sale) GetProduct() (*Product, error) { return badorm.VerifyStructLoaded[Product](&m.Product) } - func (m Sale) GetSeller() (*Seller, error) { return badorm.VerifyPointerLoaded[Seller](m.SellerID, m.Seller) - // TODO entonces creo que es mejor siempre trabajar con pointers - // porque sino en el caso del struct si vos no le pones nada, te crea uno vacio y te lo guarda solo - // - // aca puedo mirar el fk (id), que es un *badorm.UUID - // aunque puedo hacer un preload relations sin hacer el preloadAttributes - // TODO entonces el preload de una relacion me tiene que asegurar el preload del fk } - -func (m Phone) GetBrand() (*Brand, error) { - return badorm.VerifyStructLoaded[Brand](&m.Brand) -} - func (m Seller) GetCompany() (*Company, error) { return badorm.VerifyPointerLoaded[Company](m.CompanyID, m.Company) } - -// TODO como hago esto cuando este objeto no tiene el fk -// por ejemplo el country, por ahora podria hacer lo que hice con el product -// porque es un struct, pero la idea es pasar todo a pointer -// para evitar las creaciones sin querer -// entonces solo tengo una relacion que puede ser nil lo cargues o no, y no tengo el fk para verificar -// el tema aca tambien es como aseguro el 1 del lado del country si no lo pongo por struct -// porque si ok al que tiene el fk le pongo not null, pero a este imposible -// entonces la forma tiene que ser por modelo y exponerse a la creacion de uno falso -// aunque esta relacion 1 -> 1 no es tan realista creo, no se da tanto -// supongamos entonces que pudiera ser Country 1 -> 0..1 City -// entonces el fk de city va a ser not null, unique y el city del country va a ser un pointer -// entonces que mierda hago? -// en este caso, podria intercambiar donde pongo el fk -// siendo cuentry el que tiene un fk nullable y un pointer -// por su lado, el city pasaria a tener un un country, y lo puedo sacar por lo de los struct -// pero si la relacion es Country 0..1 -> 0..1 City -// y bueno ahi parece que estoy en la mierda, no hay forma de saberlo en alguna de las dos -// igual creo que puede ser una limitacion de la libreria, no es un caso tan comun creeria - -// TODO igual ojo que si se puede mezclar pointers y no pointers -// por ejemplo en value.go se hace eso -// TODO que pasa si me ponen la entidad como pointer pero el id sin pointer diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 0cdb944f..c7b3bc99 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -131,15 +131,9 @@ type Country struct { type City struct { badorm.UUIDModel - Name string - Country *Country - // TODO aca no me esta creando el unique index, por lo que podria haber muchos que mapeen al mismo country - // pero esto pasa igual por mas que saque la referencia, es un problema que gorm lo hace mal - // TODO tampoco le pone notNull a las cosas que no son punteros, por lo que podria crear clases para directamente - // poder hacer hasone y otras relaciones bien, pero no se si pueda, sino será cuestion de hacer una buena documentacion - // ya que la de gorm no es muy clara - // TODO mirar si para el save si anda la referencia, para el create ya vi que no - CountryID badorm.UUID //`gorm:"unique"` // Country HasOne City (Country 1 -> 1 City) + Name string + Country *Country + CountryID badorm.UUID // Country HasOne City (Country 1 -> 1 City) } func (m Country) Equal(other Country) bool { diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index 7a581a71..9b24601b 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -3,11 +3,10 @@ package testintegration import ( "errors" + "github.com/elliotchance/pie/v2" "gorm.io/gorm" "gotest.tools/assert" - "github.com/elliotchance/pie/v2" - "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" @@ -258,7 +257,13 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadWithoutWhereConditionDoesNot EqualList(&ts.Suite, []*models.Sale{withSeller, withoutSeller}, entities) ts.True(pie.Any(entities, func(sale *models.Sale) bool { saleSeller, err := sale.GetSeller() - return err == nil && saleSeller.Equal(*seller1) && saleSeller.Company == nil + if saleSeller == nil || err != nil { + return false + } + + sellerCompany, err := saleSeller.GetCompany() + + return err == nil && saleSeller.Equal(*seller1) && sellerCompany == nil })) ts.True(pie.Any(entities, func(sale *models.Sale) bool { // in this case sale.Seller will also be nil @@ -291,7 +296,6 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadUIntModel() { })) } -// TODO pasar todo el resto de lugares a usar el get en lugar de directo func (ts *PreloadConditionsIntTestSuite) TestPreloadWithWhereConditionFilters() { product1 := ts.createProduct("a_string", 1, 0.0, false, nil) product1.EmbeddedInt = 1 @@ -313,10 +317,12 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadWithWhereConditionFilters() ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{match}, entities) - assert.DeepEqual(ts.T(), *product1, entities[0].Product) - ts.Equal("a_string", entities[0].Product.String) - ts.Equal(1, entities[0].Product.EmbeddedInt) - ts.Equal(2, entities[0].Product.GormEmbedded.Int) + saleProduct, err := entities[0].GetProduct() + ts.Nil(err) + assert.DeepEqual(ts.T(), product1, saleProduct) + ts.Equal("a_string", saleProduct.String) + ts.Equal(1, saleProduct.EmbeddedInt) + ts.Equal(2, saleProduct.GormEmbedded.Int) } func (ts *PreloadConditionsIntTestSuite) TestPreloadOneToOne() { @@ -337,13 +343,38 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadOneToOne() { EqualList(&ts.Suite, []*models.City{&capital1, &capital2}, entities) ts.True(pie.Any(entities, func(city *models.City) bool { - return city.Country.Equal(*country1) + cityCountry, err := city.GetCountry() + if err != nil { + return false + } + + return cityCountry.Equal(*country1) })) ts.True(pie.Any(entities, func(city *models.City) bool { - return city.Country.Equal(*country2) + cityCountry, err := city.GetCountry() + if err != nil { + return false + } + + return cityCountry.Equal(*country2) })) } +func (ts *PreloadConditionsIntTestSuite) TestNoPreloadOneToOne() { + capital1 := models.City{ + Name: "Buenos Aires", + } + + ts.createCountry("Argentina", capital1) + + entities, err := ts.crudCityService.GetEntities() + ts.Nil(err) + + EqualList(&ts.Suite, []*models.City{&capital1}, entities) + _, err = entities[0].GetCountry() + ts.ErrorIs(err, badorm.ErrRelationNotLoaded) +} + func (ts *PreloadConditionsIntTestSuite) TestPreloadOneToOneReversed() { capital1 := models.City{ Name: "Buenos Aires", @@ -362,10 +393,12 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadOneToOneReversed() { EqualList(&ts.Suite, []*models.Country{country1, country2}, entities) ts.True(pie.Any(entities, func(country *models.Country) bool { - return country.Capital.Equal(capital1) + countryCapital, err := country.GetCapital() + return err == nil && countryCapital.Equal(capital1) })) ts.True(pie.Any(entities, func(country *models.Country) bool { - return country.Capital.Equal(capital2) + countryCapital, err := country.GetCapital() + return err == nil && countryCapital.Equal(capital2) })) } @@ -383,10 +416,12 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadHasManyReversed() { EqualList(&ts.Suite, []*models.Seller{seller1, seller2}, entities) ts.True(pie.Any(entities, func(seller *models.Seller) bool { - return seller.Company.Equal(*company1) + sellerCompany, err := seller.GetCompany() + return err == nil && sellerCompany.Equal(*company1) })) ts.True(pie.Any(entities, func(seller *models.Seller) bool { - return seller.Company.Equal(*company2) + sellerCompany, err := seller.GetCompany() + return err == nil && sellerCompany.Equal(*company2) })) } @@ -415,8 +450,13 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadDifferentEntitiesWithConditi ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{match}, entities) - assert.DeepEqual(ts.T(), *product1, entities[0].Product) - assert.DeepEqual(ts.T(), seller1, entities[0].Seller) + saleProduct, err := entities[0].GetProduct() + ts.Nil(err) + assert.DeepEqual(ts.T(), product1, saleProduct) + + saleSeller, err := entities[0].GetSeller() + ts.Nil(err) + assert.DeepEqual(ts.T(), seller1, saleSeller) } func (ts *PreloadConditionsIntTestSuite) TestPreloadDifferentEntitiesWithoutConditions() { @@ -443,8 +483,13 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadDifferentEntitiesWithoutCond ts.Nil(err) EqualList(&ts.Suite, []*models.Child{child}, entities) - assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) - assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) + childParent1, err := entities[0].GetParent1() + ts.Nil(err) + assert.DeepEqual(ts.T(), parent1, childParent1) + + childParent2, err := entities[0].GetParent2() + ts.Nil(err) + assert.DeepEqual(ts.T(), parent2, childParent2) } func (ts *PreloadConditionsIntTestSuite) TestPreloadRelations() { @@ -470,8 +515,13 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadRelations() { ts.Nil(err) EqualList(&ts.Suite, []*models.Child{child}, entities) - assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) - assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) + childParent1, err := entities[0].GetParent1() + ts.Nil(err) + assert.DeepEqual(ts.T(), parent1, childParent1) + + childParent2, err := entities[0].GetParent2() + ts.Nil(err) + assert.DeepEqual(ts.T(), parent2, childParent2) } func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithoutCondition() { @@ -500,8 +550,13 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithoutC ts.Nil(err) EqualList(&ts.Suite, []*models.Child{child}, entities) - assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) - assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent1.ParentParent) + childParent1, err := entities[0].GetParent1() + ts.Nil(err) + assert.DeepEqual(ts.T(), parent1, childParent1) + + childParentParent, err := childParent1.GetParentParent() + ts.Nil(err) + assert.DeepEqual(ts.T(), parentParent, childParentParent) } func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithCondition() { @@ -551,8 +606,13 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithCond ts.Nil(err) EqualList(&ts.Suite, []*models.Child{child1}, entities) - assert.DeepEqual(ts.T(), *parent11, entities[0].Parent1) - assert.DeepEqual(ts.T(), *parentParent1, entities[0].Parent1.ParentParent) + childParent1, err := entities[0].GetParent1() + ts.Nil(err) + assert.DeepEqual(ts.T(), parent11, childParent1) + + childParentParent, err := childParent1.GetParentParent() + ts.Nil(err) + assert.DeepEqual(ts.T(), parentParent1, childParentParent) } func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond() { @@ -583,8 +643,19 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond( ts.Nil(err) EqualList(&ts.Suite, []*models.Child{child}, entities) - assert.DeepEqual(ts.T(), *parent1, entities[0].Parent1) - assert.DeepEqual(ts.T(), *parent2, entities[0].Parent2) - assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent1.ParentParent) - assert.DeepEqual(ts.T(), *parentParent, entities[0].Parent2.ParentParent) + childParent1, err := entities[0].GetParent1() + ts.Nil(err) + assert.DeepEqual(ts.T(), parent1, childParent1) + + childParent2, err := entities[0].GetParent2() + ts.Nil(err) + assert.DeepEqual(ts.T(), parent2, childParent2) + + childParent1Parent, err := childParent1.GetParentParent() + ts.Nil(err) + assert.DeepEqual(ts.T(), parentParent, childParent1Parent) + + childParent2Parent, err := childParent2.GetParentParent() + ts.Nil(err) + assert.DeepEqual(ts.T(), parentParent, childParent2Parent) } diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 197cdb04..7fc23099 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -137,15 +137,15 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) { // Generate condition between object and field when the field is a BaDORM Model func (condition *Condition) generateForBadormModel(objectType Type, field Field) { - hasFK, _ := objectType.HasFK(field) - if hasFK { - // belongsTo relation + _, err := objectType.GetFK(field) + if err == nil { + // has the fk -> belongsTo relation condition.generateJoinWithFK( objectType, field, ) } else { - // hasOne relation + // has not the fk -> hasOne relation condition.generateJoinWithoutFK( objectType, field, diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 3d4eacfa..5e033a9a 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -5,7 +5,9 @@ import ( "fmt" "go/types" "os" + "path/filepath" + "github.com/dave/jennifer/jen" "github.com/ettle/strcase" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -13,6 +15,7 @@ import ( "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/badaas/tools/badctl/cmd/log" + "github.com/ditrit/badaas/tools/badctl/cmd/version" "github.com/ditrit/verdeter" ) @@ -24,7 +27,12 @@ var GenConditionsCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Args: cobra.MinimumNArgs(1), }) -const DestPackageKey = "dest_package" +const ( + DestPackageKey = "dest_package" + badORMVerifyStructLoaded = "VerifyStructLoaded" + badORMVerifyPointerLoaded = "VerifyPointerLoaded" + badORMVerifyPointerWithIDLoaded = "VerifyPointerWithIDLoaded" +) func init() { err := GenConditionsCmd.LKey( @@ -52,15 +60,23 @@ func generateConditions(_ *cobra.Command, args []string) { } // Generate conditions for each package - for _, pkg := range pkgs { - generateConditionsForPkg(destPkg, pkg) + for i, pkg := range pkgs { + generateConditionsForPkg(destPkg, args[i], pkg) } } // Generates a file with conditions for each BaDORM model in the package -func generateConditionsForPkg(destPkg string, pkg *packages.Package) { +func generateConditionsForPkg(destPkg string, pkgPath string, pkg *packages.Package) { log.Logger.Infof("Generating conditions for types in package %q", pkg.Types.Name()) + // TODO codigo repetido con file + // Start a new file in destination package + f := jen.NewFile(pkg.Types.Name()) + // Add a package comment, so IDEs detect files as generated + f.PackageComment("Code generated by badctl v" + version.Version + ", DO NOT EDIT.") + + relationGetters := []jen.Code{} + for _, name := range pkg.Types.Scope().Names() { object := getObject(pkg, name) if object != nil { @@ -78,8 +94,144 @@ func generateConditionsForPkg(destPkg string, pkg *packages.Package) { if err != nil { cmderrors.FailErr(err) } + + relationGettersForObject := generateRelationGetters(object) + relationGetters = append(relationGetters, relationGettersForObject...) + } + } + + // TODO codigo repetido con file + if len(relationGetters) > 0 { + for _, relationGetter := range relationGetters { + f.Add(relationGetter) + } + // f.Add(relationGetters...) + err := f.Save(filepath.Join(pkgPath, "badorm.go")) + if err != nil { + cmderrors.FailErr(err) + } + } +} + +func generateRelationGetters(object types.Object) []jen.Code { + // TODO codigo repetido con file + objectType := Type{object.Type()} + fields, _ := getFields(objectType) + relationGetters := []jen.Code{} + + for _, field := range fields { + if field.Embedded { + // TODO + } else { + // TODO codigo repetido con condition.go + switch fieldType := field.GetType().(type) { + case *types.Named: + // the field is a named type (user defined structs) + _, err := field.Type.BadORMModelStruct() + + if err == nil { + // field is a BaDORM Model + relationGetters = append( + relationGetters, + generateVerifyStruct(object, field), + ) + } + case *types.Pointer: + // the field is a pointer + _, err := field.ChangeType(fieldType.Elem()).Type.BadORMModelStruct() + + if err == nil { + // field is a BaDORM Model + fk, err := objectType.GetFK(field) + if err != nil { + log.Logger.Debugf("unhandled: field is a pointer and object not has the fk: %T", fieldType) + continue + } + + switch fk.GetType().(type) { + // TODO verificar que sea de los ids correctos? + // TODO basics para strings y eso? + case *types.Named: + relationGetters = append( + relationGetters, + generateVerifyPointerWithID(object, field), + ) + case *types.Pointer: + relationGetters = append( + relationGetters, + generateVerifyPointer(object, field), + ) + } + } + default: + log.Logger.Debugf("struct field type not handled: %T", fieldType) + } } } + + return relationGetters +} + +func getGetterName(field Field) string { + return "Get" + strcase.ToPascal(field.Name) +} + +func generateVerifyStruct(object types.Object, field Field) *jen.Statement { + return generateGetterCommon( + object, + field, + badORMVerifyStructLoaded, + jen.Op("&").Id("m").Op(".").Id(field.Name), + ) +} + +func generateVerifyPointer(object types.Object, field Field) *jen.Statement { + return generateVerifyPointerCommon(object, field, badORMVerifyPointerLoaded) +} + +func generateVerifyPointerWithID(object types.Object, field Field) *jen.Statement { + return generateVerifyPointerCommon(object, field, badORMVerifyPointerWithIDLoaded) +} + +func generateVerifyPointerCommon(object types.Object, field Field, verifyFunc string) *jen.Statement { + return generateGetterCommon( + object, + field, + verifyFunc, + jen.Id("m").Op(".").Id(field.Name+"ID"), + jen.Id("m").Op(".").Id(field.Name), + ) +} + +func generateGetterCommon(object types.Object, field Field, verifyFunc string, callParams ...jen.Code) *jen.Statement { + return jen.Func().Parens( + jen.Id("m").Id(object.Name()), + ).Id(getGetterName(field)).Params().Add( + jen.Parens( + jen.List( + jen.Op("*").Qual( + getRelativePackagePath( + object.Pkg().Name(), + field.Type, + ), + field.TypeName(), + ), + + jen.Id("error"), + ), + ), + ).Block( + jen.Return( + jen.Qual( + badORMPath, + verifyFunc, + ).Types( + jen.Id(field.TypeName()), + ).Call( + callParams..., + ), + ), + ) } // Load package information from paths diff --git a/tools/badctl/cmd/gen/conditions/type.go b/tools/badctl/cmd/gen/conditions/type.go index c21628ab..2668e058 100644 --- a/tools/badctl/cmd/gen/conditions/type.go +++ b/tools/badctl/cmd/gen/conditions/type.go @@ -1,12 +1,15 @@ package conditions import ( + "errors" "fmt" "go/types" "regexp" "strings" "github.com/elliotchance/pie/v2" + + "github.com/ditrit/badaas/utils" ) // badorm/baseModels.go @@ -15,6 +18,8 @@ var badORMModels = []string{ badORMPath + "." + uIntModel, } +var ErrFkNotInTypeFields = errors.New("fk not in type's fields") + type Type struct { types.Type } @@ -67,17 +72,23 @@ func isBadORMBaseModel(fieldName string) bool { return pie.Contains(badORMModels, fieldName) } -// Returns true is the type has a foreign key to the field's object +// Returns the fk field of the type to the "field"'s object // (another field that references that object) -func (t Type) HasFK(field Field) (bool, error) { +func (t Type) GetFK(field Field) (*Field, error) { objectFields, err := getFields(t) if err != nil { - return false, err + return nil, err + } + + fk := utils.FindFirst(objectFields, func(otherField Field) bool { + return strings.EqualFold(otherField.Name, field.getFKAttribute()) + }) + + if fk == nil { + return nil, ErrFkNotInTypeFields } - return pie.Any(objectFields, func(otherField Field) bool { - return otherField.Name == field.getFKAttribute() - }), nil + return fk, nil } var ( From 588453bb573aab247bab7bb33fcd23a7b5963fd4 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 27 Jun 2023 15:53:06 +0200 Subject: [PATCH 397/467] refactor relation getters generation to generator --- .../cmd/gen/conditions/conditionsGenerator.go | 144 ++++++++++++++ tools/badctl/cmd/gen/conditions/file.go | 157 ++------------- tools/badctl/cmd/gen/conditions/main.go | 178 +++--------------- .../conditions/relationGettersGenerator.go | 150 +++++++++++++++ 4 files changed, 327 insertions(+), 302 deletions(-) create mode 100644 tools/badctl/cmd/gen/conditions/conditionsGenerator.go create mode 100644 tools/badctl/cmd/gen/conditions/relationGettersGenerator.go diff --git a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go new file mode 100644 index 00000000..50595a34 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go @@ -0,0 +1,144 @@ +package conditions + +import ( + "errors" + "go/types" + + "github.com/dave/jennifer/jen" + "github.com/elliotchance/pie/v2" + + "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" + "github.com/ditrit/badaas/tools/badctl/cmd/log" +) + +const badORMNewPreloadCondition = "NewPreloadCondition" + +type ConditionsGenerator struct { + object types.Object + objectType Type +} + +func NewConditionsGenerator(object types.Object) *ConditionsGenerator { + return &ConditionsGenerator{ + object: object, + objectType: Type{object.Type()}, + } +} + +// Add conditions for an object in the file +func (cg ConditionsGenerator) AddConditions(file *File) error { + fields, err := getFields(cg.objectType) + if err != nil { + return err + } + + log.Logger.Infof("Generating conditions for type %q in %s", cg.object.Name(), file.name) + + cg.addConditionsForEachField(file, fields) + + return nil +} + +// Add one condition for each field of the object +func (cg ConditionsGenerator) addConditionsForEachField(file *File, fields []Field) { + conditions := cg.generateConditionsForEachField(file, fields) + + objectName := cg.object.Name() + objectQual := jen.Qual( + getRelativePackagePath(file.destPkg, cg.objectType), + cg.objectType.Name(), + ) + + preloadAttributesCondition := jen.Var().Id( + getPreloadAttributesName(objectName), + ).Op("=").Add(jen.Qual( + badORMPath, badORMNewPreloadCondition, + )).Types( + objectQual, + ) + fieldIdentifiers := []jen.Code{} + + preloadRelationsCondition := jen.Var().Id( + objectName + "PreloadRelations", + ).Op("=").Index().Add(jen.Qual( + badORMPath, badORMCondition, + )).Types( + objectQual, + ) + relationPreloads := []jen.Code{} + + for _, condition := range conditions { + file.Add(condition.codes...) + + // add all field names to the list of fields of the preload condition + if condition.fieldIdentifier != "" { + fieldIdentifiers = append( + fieldIdentifiers, + jen.Qual("", condition.fieldIdentifier), + ) + } + + // add the preload to the list of all possible preloads + if condition.preloadName != "" { + relationPreloads = append( + relationPreloads, + jen.Qual("", condition.preloadName), + ) + } + } + + file.Add(preloadAttributesCondition.Call(fieldIdentifiers...)) + file.Add(preloadRelationsCondition.Values(relationPreloads...)) +} + +func getPreloadAttributesName(objectName string) string { + return objectName + "PreloadAttributes" +} + +// Generate the conditions for each of the object's fields +func (cg ConditionsGenerator) generateConditionsForEachField(file *File, fields []Field) []*Condition { + conditions := []*Condition{} + + for _, field := range fields { + log.Logger.Debugf("Generating condition for field %q", field.Name) + + if field.Embedded { + conditions = append(conditions, cg.generateEmbeddedConditions( + file, + field, + )...) + } else { + conditions = append(conditions, NewCondition( + file.destPkg, cg.objectType, field, + )) + } + } + + return conditions +} + +// Generate conditions for a embedded field +// it will generate a condition for each of the field of the embedded field's type +func (cg ConditionsGenerator) generateEmbeddedConditions(file *File, field Field) []*Condition { + embeddedStructType, ok := field.Type.Underlying().(*types.Struct) + if !ok { + cmderrors.FailErr(errors.New("unreachable! embedded objects are always structs")) + } + + fields, err := getStructFields(embeddedStructType) + if err != nil { + // embedded field's type has not fields + return []*Condition{} + } + + if !isBadORMBaseModel(field.TypeString()) { + fields = pie.Map(fields, func(embeddedField Field) Field { + embeddedField.ColumnPrefix = field.Tags.getEmbeddedPrefix() + embeddedField.NamePrefix = field.Name + + return embeddedField + }) + } + + return cg.generateConditionsForEachField(file, fields) +} diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index 9e9721d6..baf622f0 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -1,173 +1,38 @@ package conditions import ( - "errors" - "go/types" - "github.com/dave/jennifer/jen" - "github.com/elliotchance/pie/v2" - "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" - "github.com/ditrit/badaas/tools/badctl/cmd/log" "github.com/ditrit/badaas/tools/badctl/cmd/version" ) -const ( - badORMPath = "github.com/ditrit/badaas/badorm" - badORMNewPreloadCondition = "NewPreloadCondition" -) - type File struct { - destPkg string - jenFile *jen.File - name string - object types.Object - objectType Type + destPkg string + jenFile *jen.File + name string } -func NewConditionsFile(destPkg string, name string, object types.Object) (*File, error) { +func NewFile(destPkg, name string) *File { // Start a new file in destination package f := jen.NewFile(destPkg) // Add a package comment, so IDEs detect files as generated f.PackageComment("Code generated by badctl v" + version.Version + ", DO NOT EDIT.") - file := &File{ - destPkg: destPkg, - name: name, - jenFile: f, - object: object, - objectType: Type{object.Type()}, - } - - err := file.addConditions() - if err != nil { - return nil, err - } - - return file, nil -} - -// Add conditions for an object in the file -func (file File) addConditions() error { - fields, err := getFields(file.objectType) - if err != nil { - return err + return &File{ + destPkg: destPkg, + name: name, + jenFile: f, } - - log.Logger.Infof("Generating conditions for type %q in %s", file.object.Name(), file.name) - - file.addConditionsForEachField(fields) - - return nil } -// Add one condition for each field of the object -func (file File) addConditionsForEachField(fields []Field) { - conditions := file.generateConditionsForEachField(fields) - - objectName := file.object.Name() - objectQual := jen.Qual( - getRelativePackagePath(file.destPkg, file.objectType), - file.objectType.Name(), - ) - - preloadAttributesCondition := jen.Var().Id( - getPreloadAttributesName(objectName), - ).Op("=").Add(jen.Qual( - badORMPath, badORMNewPreloadCondition, - )).Types( - objectQual, - ) - fieldIdentifiers := []jen.Code{} - - preloadRelationsCondition := jen.Var().Id( - objectName + "PreloadRelations", - ).Op("=").Index().Add(jen.Qual( - badORMPath, badORMCondition, - )).Types( - objectQual, - ) - relationPreloads := []jen.Code{} - - for _, condition := range conditions { - for _, code := range condition.codes { - file.jenFile.Add(code) - } - - // add all field names to the list of fields of the preload condition - if condition.fieldIdentifier != "" { - fieldIdentifiers = append( - fieldIdentifiers, - jen.Qual("", condition.fieldIdentifier), - ) - } - - // add the preload to the list of all possible preloads - if condition.preloadName != "" { - relationPreloads = append( - relationPreloads, - jen.Qual("", condition.preloadName), - ) - } +func (file File) Add(codes ...jen.Code) { + for _, code := range codes { + file.jenFile.Add(code) } - - file.jenFile.Add(preloadAttributesCondition.Call(fieldIdentifiers...)) - file.jenFile.Add(preloadRelationsCondition.Values(relationPreloads...)) -} - -func getPreloadAttributesName(objectName string) string { - return objectName + "PreloadAttributes" } // Write generated file func (file File) Save() error { return file.jenFile.Save(file.name) } - -// Generate the conditions for each of the object's fields -func (file File) generateConditionsForEachField(fields []Field) []*Condition { - conditions := []*Condition{} - - for _, field := range fields { - log.Logger.Debugf("Generating condition for field %q", field.Name) - - if field.Embedded { - conditions = append(conditions, file.generateEmbeddedConditions( - field, - )...) - } else { - conditions = append(conditions, NewCondition( - file.destPkg, file.objectType, field, - )) - } - } - - return conditions -} - -// Generate conditions for a embedded field -// it will generate a condition for each of the field of the embedded field's type -func (file File) generateEmbeddedConditions(field Field) []*Condition { - embeddedStructType, ok := field.Type.Underlying().(*types.Struct) - if !ok { - cmderrors.FailErr(errors.New("unreachable! embedded objects are always structs")) - } - - fields, err := getStructFields(embeddedStructType) - if err != nil { - // embedded field's type has not fields - return []*Condition{} - } - - if !isBadORMBaseModel(field.TypeString()) { - fields = pie.Map(fields, func(embeddedField Field) Field { - embeddedField.ColumnPrefix = field.Tags.getEmbeddedPrefix() - embeddedField.NamePrefix = field.Name - - return embeddedField - }) - } - - return file.generateConditionsForEachField(fields) -} diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 5e033a9a..2a0965b5 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -7,7 +7,6 @@ import ( "os" "path/filepath" - "github.com/dave/jennifer/jen" "github.com/ettle/strcase" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -15,7 +14,6 @@ import ( "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/badaas/tools/badctl/cmd/log" - "github.com/ditrit/badaas/tools/badctl/cmd/version" "github.com/ditrit/verdeter" ) @@ -28,10 +26,8 @@ var GenConditionsCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ }) const ( - DestPackageKey = "dest_package" - badORMVerifyStructLoaded = "VerifyStructLoaded" - badORMVerifyPointerLoaded = "VerifyPointerLoaded" - badORMVerifyPointerWithIDLoaded = "VerifyPointerWithIDLoaded" + DestPackageKey = "dest_package" + badORMPath = "github.com/ditrit/badaas/badorm" ) func init() { @@ -69,169 +65,39 @@ func generateConditions(_ *cobra.Command, args []string) { func generateConditionsForPkg(destPkg string, pkgPath string, pkg *packages.Package) { log.Logger.Infof("Generating conditions for types in package %q", pkg.Types.Name()) - // TODO codigo repetido con file - // Start a new file in destination package - f := jen.NewFile(pkg.Types.Name()) - // Add a package comment, so IDEs detect files as generated - f.PackageComment("Code generated by badctl v" + version.Version + ", DO NOT EDIT.") - - relationGetters := []jen.Code{} + relationGettersFile := NewFile(pkg.Types.Name(), filepath.Join(pkgPath, "badorm.go")) for _, name := range pkg.Types.Scope().Names() { object := getObject(pkg, name) if object != nil { - file, err := NewConditionsFile( - destPkg, - strcase.ToSnake(object.Name())+"_conditions.go", - object, - ) - if err != nil { - // object is not a BaDORM model, do not generate conditions - continue - } - - err = file.Save() - if err != nil { - cmderrors.FailErr(err) - } - - relationGettersForObject := generateRelationGetters(object) - relationGetters = append(relationGetters, relationGettersForObject...) - } - } - - // TODO codigo repetido con file - if len(relationGetters) > 0 { - for _, relationGetter := range relationGetters { - f.Add(relationGetter) - } - // f.Add(relationGetters...) - err := f.Save(filepath.Join(pkgPath, "badorm.go")) - if err != nil { - cmderrors.FailErr(err) + generateConditionsForObject(destPkg, object) + // TODO ver que onda este error + _ = NewRelationGettersGenerator(object).GenerateInto(relationGettersFile) } } -} -func generateRelationGetters(object types.Object) []jen.Code { - // TODO codigo repetido con file - objectType := Type{object.Type()} - fields, _ := getFields(objectType) - relationGetters := []jen.Code{} - - for _, field := range fields { - if field.Embedded { - // TODO - } else { - // TODO codigo repetido con condition.go - switch fieldType := field.GetType().(type) { - case *types.Named: - // the field is a named type (user defined structs) - _, err := field.Type.BadORMModelStruct() - - if err == nil { - // field is a BaDORM Model - relationGetters = append( - relationGetters, - generateVerifyStruct(object, field), - ) - } - case *types.Pointer: - // the field is a pointer - _, err := field.ChangeType(fieldType.Elem()).Type.BadORMModelStruct() - - if err == nil { - // field is a BaDORM Model - fk, err := objectType.GetFK(field) - if err != nil { - log.Logger.Debugf("unhandled: field is a pointer and object not has the fk: %T", fieldType) - continue - } - - switch fk.GetType().(type) { - // TODO verificar que sea de los ids correctos? - // TODO basics para strings y eso? - case *types.Named: - relationGetters = append( - relationGetters, - generateVerifyPointerWithID(object, field), - ) - case *types.Pointer: - relationGetters = append( - relationGetters, - generateVerifyPointer(object, field), - ) - } - } - default: - log.Logger.Debugf("struct field type not handled: %T", fieldType) - } - } + err := relationGettersFile.Save() + if err != nil { + cmderrors.FailErr(err) } - - return relationGetters } -func getGetterName(field Field) string { - return "Get" + strcase.ToPascal(field.Name) -} - -func generateVerifyStruct(object types.Object, field Field) *jen.Statement { - return generateGetterCommon( - object, - field, - badORMVerifyStructLoaded, - jen.Op("&").Id("m").Op(".").Id(field.Name), - ) -} - -func generateVerifyPointer(object types.Object, field Field) *jen.Statement { - return generateVerifyPointerCommon(object, field, badORMVerifyPointerLoaded) -} - -func generateVerifyPointerWithID(object types.Object, field Field) *jen.Statement { - return generateVerifyPointerCommon(object, field, badORMVerifyPointerWithIDLoaded) -} - -func generateVerifyPointerCommon(object types.Object, field Field, verifyFunc string) *jen.Statement { - return generateGetterCommon( - object, - field, - verifyFunc, - jen.Id("m").Op(".").Id(field.Name+"ID"), - jen.Id("m").Op(".").Id(field.Name), +func generateConditionsForObject(destPkg string, object types.Object) { + file := NewFile( + destPkg, + strcase.ToSnake(object.Name())+"_conditions.go", ) -} -func generateGetterCommon(object types.Object, field Field, verifyFunc string, callParams ...jen.Code) *jen.Statement { - return jen.Func().Parens( - jen.Id("m").Id(object.Name()), - ).Id(getGetterName(field)).Params().Add( - jen.Parens( - jen.List( - jen.Op("*").Qual( - getRelativePackagePath( - object.Pkg().Name(), - field.Type, - ), - field.TypeName(), - ), + err := NewConditionsGenerator(object).AddConditions(file) + if err != nil { + // object is not a BaDORM model, do not generate conditions + return + } - jen.Id("error"), - ), - ), - ).Block( - jen.Return( - jen.Qual( - badORMPath, - verifyFunc, - ).Types( - jen.Id(field.TypeName()), - ).Call( - callParams..., - ), - ), - ) + err = file.Save() + if err != nil { + cmderrors.FailErr(err) + } } // Load package information from paths diff --git a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go new file mode 100644 index 00000000..cf442dd3 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go @@ -0,0 +1,150 @@ +package conditions + +import ( + "go/types" + + "github.com/dave/jennifer/jen" + "github.com/ettle/strcase" + + "github.com/ditrit/badaas/tools/badctl/cmd/log" +) + +const ( + badORMVerifyStructLoaded = "VerifyStructLoaded" + badORMVerifyPointerLoaded = "VerifyPointerLoaded" + badORMVerifyPointerWithIDLoaded = "VerifyPointerWithIDLoaded" +) + +// TODO codigo repetido con el conditions generator +type RelationGettersGenerator struct { + object types.Object + objectType Type +} + +func NewRelationGettersGenerator(object types.Object) *RelationGettersGenerator { + return &RelationGettersGenerator{ + object: object, + objectType: Type{object.Type()}, + } +} + +// Add conditions for an object in the file +func (generator RelationGettersGenerator) GenerateInto(file *File) error { + // TODO codigo repetido con file + fields, _ := getFields(generator.objectType) + relationGetters := []jen.Code{} + + for _, field := range fields { + if field.Embedded { + // TODO + } else { + // TODO codigo repetido con condition.go + switch fieldType := field.GetType().(type) { + case *types.Named: + // the field is a named type (user defined structs) + _, err := field.Type.BadORMModelStruct() + + if err == nil { + // field is a BaDORM Model + relationGetters = append( + relationGetters, + generator.verifyStruct(field), + ) + } + case *types.Pointer: + // the field is a pointer + _, err := field.ChangeType(fieldType.Elem()).Type.BadORMModelStruct() + + if err == nil { + // field is a BaDORM Model + fk, err := generator.objectType.GetFK(field) + if err != nil { + log.Logger.Debugf("unhandled: field is a pointer and object not has the fk: %T", fieldType) + continue + } + + switch fk.GetType().(type) { + // TODO verificar que sea de los ids correctos? + // TODO basics para strings y eso? + case *types.Named: + relationGetters = append( + relationGetters, + generator.verifyPointerWithID(field), + ) + case *types.Pointer: + relationGetters = append( + relationGetters, + generator.verifyPointer(field), + ) + } + } + default: + log.Logger.Debugf("struct field type not handled: %T", fieldType) + } + } + } + + file.Add(relationGetters...) + + return nil +} + +func getGetterName(field Field) string { + return "Get" + strcase.ToPascal(field.Name) +} + +func (generator RelationGettersGenerator) verifyStruct(field Field) *jen.Statement { + return generator.verifyCommon( + field, + badORMVerifyStructLoaded, + jen.Op("&").Id("m").Op(".").Id(field.Name), + ) +} + +func (generator RelationGettersGenerator) verifyPointer(field Field) *jen.Statement { + return generator.verifyPointerCommon(field, badORMVerifyPointerLoaded) +} + +func (generator RelationGettersGenerator) verifyPointerWithID(field Field) *jen.Statement { + return generator.verifyPointerCommon(field, badORMVerifyPointerWithIDLoaded) +} + +func (generator RelationGettersGenerator) verifyPointerCommon(field Field, verifyFunc string) *jen.Statement { + return generator.verifyCommon( + field, + verifyFunc, + jen.Id("m").Op(".").Id(field.Name+"ID"), + jen.Id("m").Op(".").Id(field.Name), + ) +} + +func (generator RelationGettersGenerator) verifyCommon(field Field, verifyFunc string, callParams ...jen.Code) *jen.Statement { + return jen.Func().Parens( + jen.Id("m").Id(generator.object.Name()), + ).Id(getGetterName(field)).Params().Add( + jen.Parens( + jen.List( + jen.Op("*").Qual( + getRelativePackagePath( + generator.object.Pkg().Name(), + field.Type, + ), + field.TypeName(), + ), + + jen.Id("error"), + ), + ), + ).Block( + jen.Return( + jen.Qual( + badORMPath, + verifyFunc, + ).Types( + jen.Id(field.TypeName()), + ).Call( + callParams..., + ), + ), + ) +} From a51f5240ac2fac1257fe0f52e837ecba528e8949 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 27 Jun 2023 16:50:58 +0200 Subject: [PATCH 398/467] generate getters for embedded structs --- .../cmd/gen/conditions/codeGenerator.go | 6 + .../cmd/gen/conditions/conditionsGenerator.go | 51 +++------ .../cmd/gen/conditions/embeddedField.go | 36 ++++++ tools/badctl/cmd/gen/conditions/main.go | 5 +- .../conditions/relationGettersGenerator.go | 107 ++++++++++-------- 5 files changed, 117 insertions(+), 88 deletions(-) create mode 100644 tools/badctl/cmd/gen/conditions/codeGenerator.go create mode 100644 tools/badctl/cmd/gen/conditions/embeddedField.go diff --git a/tools/badctl/cmd/gen/conditions/codeGenerator.go b/tools/badctl/cmd/gen/conditions/codeGenerator.go new file mode 100644 index 00000000..7671dc32 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/codeGenerator.go @@ -0,0 +1,6 @@ +package conditions + +type CodeGenerator[T any] interface { + Into(file *File) error + ForEachField(file *File, fields []Field) []T +} diff --git a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go index 50595a34..8edcecc6 100644 --- a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go +++ b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go @@ -1,13 +1,10 @@ package conditions import ( - "errors" "go/types" "github.com/dave/jennifer/jen" - "github.com/elliotchance/pie/v2" - "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" "github.com/ditrit/badaas/tools/badctl/cmd/log" ) @@ -26,7 +23,7 @@ func NewConditionsGenerator(object types.Object) *ConditionsGenerator { } // Add conditions for an object in the file -func (cg ConditionsGenerator) AddConditions(file *File) error { +func (cg ConditionsGenerator) Into(file *File) error { fields, err := getFields(cg.objectType) if err != nil { return err @@ -41,7 +38,7 @@ func (cg ConditionsGenerator) AddConditions(file *File) error { // Add one condition for each field of the object func (cg ConditionsGenerator) addConditionsForEachField(file *File, fields []Field) { - conditions := cg.generateConditionsForEachField(file, fields) + conditions := cg.ForEachField(file, fields) objectName := cg.object.Name() objectQual := jen.Qual( @@ -96,19 +93,23 @@ func getPreloadAttributesName(objectName string) string { } // Generate the conditions for each of the object's fields -func (cg ConditionsGenerator) generateConditionsForEachField(file *File, fields []Field) []*Condition { - conditions := []*Condition{} +func (cg ConditionsGenerator) ForEachField(file *File, fields []Field) []Condition { + conditions := []Condition{} for _, field := range fields { log.Logger.Debugf("Generating condition for field %q", field.Name) if field.Embedded { - conditions = append(conditions, cg.generateEmbeddedConditions( - file, - field, - )...) + conditions = append( + conditions, + generateForEmbeddedField[Condition]( + file, + field, + cg, + )..., + ) } else { - conditions = append(conditions, NewCondition( + conditions = append(conditions, *NewCondition( file.destPkg, cg.objectType, field, )) } @@ -116,29 +117,3 @@ func (cg ConditionsGenerator) generateConditionsForEachField(file *File, fields return conditions } - -// Generate conditions for a embedded field -// it will generate a condition for each of the field of the embedded field's type -func (cg ConditionsGenerator) generateEmbeddedConditions(file *File, field Field) []*Condition { - embeddedStructType, ok := field.Type.Underlying().(*types.Struct) - if !ok { - cmderrors.FailErr(errors.New("unreachable! embedded objects are always structs")) - } - - fields, err := getStructFields(embeddedStructType) - if err != nil { - // embedded field's type has not fields - return []*Condition{} - } - - if !isBadORMBaseModel(field.TypeString()) { - fields = pie.Map(fields, func(embeddedField Field) Field { - embeddedField.ColumnPrefix = field.Tags.getEmbeddedPrefix() - embeddedField.NamePrefix = field.Name - - return embeddedField - }) - } - - return cg.generateConditionsForEachField(file, fields) -} diff --git a/tools/badctl/cmd/gen/conditions/embeddedField.go b/tools/badctl/cmd/gen/conditions/embeddedField.go new file mode 100644 index 00000000..b0c0430b --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/embeddedField.go @@ -0,0 +1,36 @@ +package conditions + +import ( + "errors" + "go/types" + + "github.com/elliotchance/pie/v2" + + "github.com/ditrit/badaas/tools/badctl/cmd/cmderrors" +) + +// Generate conditions for a embedded field +// it will generate a condition for each of the field of the embedded field's type +func generateForEmbeddedField[T any](file *File, field Field, generator CodeGenerator[T]) []T { + embeddedStructType, ok := field.Type.Underlying().(*types.Struct) + if !ok { + cmderrors.FailErr(errors.New("unreachable! embedded objects are always structs")) + } + + fields, err := getStructFields(embeddedStructType) + if err != nil { + // embedded field's type has not fields + return []T{} + } + + if !isBadORMBaseModel(field.TypeString()) { + fields = pie.Map(fields, func(embeddedField Field) Field { + embeddedField.ColumnPrefix = field.Tags.getEmbeddedPrefix() + embeddedField.NamePrefix = field.Name + + return embeddedField + }) + } + + return generator.ForEachField(file, fields) +} diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 2a0965b5..33523d29 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -71,8 +71,7 @@ func generateConditionsForPkg(destPkg string, pkgPath string, pkg *packages.Pack object := getObject(pkg, name) if object != nil { generateConditionsForObject(destPkg, object) - // TODO ver que onda este error - _ = NewRelationGettersGenerator(object).GenerateInto(relationGettersFile) + _ = NewRelationGettersGenerator(object).Into(relationGettersFile) } } @@ -88,7 +87,7 @@ func generateConditionsForObject(destPkg string, object types.Object) { strcase.ToSnake(object.Name())+"_conditions.go", ) - err := NewConditionsGenerator(object).AddConditions(file) + err := NewConditionsGenerator(object).Into(file) if err != nil { // object is not a BaDORM model, do not generate conditions return diff --git a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go index cf442dd3..52fd3095 100644 --- a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go +++ b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go @@ -15,7 +15,6 @@ const ( badORMVerifyPointerWithIDLoaded = "VerifyPointerWithIDLoaded" ) -// TODO codigo repetido con el conditions generator type RelationGettersGenerator struct { object types.Object objectType Type @@ -29,62 +28,76 @@ func NewRelationGettersGenerator(object types.Object) *RelationGettersGenerator } // Add conditions for an object in the file -func (generator RelationGettersGenerator) GenerateInto(file *File) error { - // TODO codigo repetido con file +func (generator RelationGettersGenerator) Into(file *File) error { fields, _ := getFields(generator.objectType) + file.Add(generator.ForEachField(file, fields)...) + + return nil +} + +func (generator RelationGettersGenerator) ForEachField(file *File, fields []Field) []jen.Code { relationGetters := []jen.Code{} for _, field := range fields { if field.Embedded { - // TODO + relationGetters = append( + relationGetters, + generateForEmbeddedField[jen.Code]( + file, + field, + generator, + )..., + ) } else { - // TODO codigo repetido con condition.go - switch fieldType := field.GetType().(type) { - case *types.Named: - // the field is a named type (user defined structs) - _, err := field.Type.BadORMModelStruct() - - if err == nil { - // field is a BaDORM Model - relationGetters = append( - relationGetters, - generator.verifyStruct(field), - ) - } - case *types.Pointer: - // the field is a pointer - _, err := field.ChangeType(fieldType.Elem()).Type.BadORMModelStruct() - - if err == nil { - // field is a BaDORM Model - fk, err := generator.objectType.GetFK(field) - if err != nil { - log.Logger.Debugf("unhandled: field is a pointer and object not has the fk: %T", fieldType) - continue - } - - switch fk.GetType().(type) { - // TODO verificar que sea de los ids correctos? - // TODO basics para strings y eso? - case *types.Named: - relationGetters = append( - relationGetters, - generator.verifyPointerWithID(field), - ) - case *types.Pointer: - relationGetters = append( - relationGetters, - generator.verifyPointer(field), - ) - } - } - default: - log.Logger.Debugf("struct field type not handled: %T", fieldType) + getterForField := generator.generateForField(field) + if getterForField != nil { + relationGetters = append(relationGetters, getterForField) } } } - file.Add(relationGetters...) + return relationGetters +} + +func (generator RelationGettersGenerator) generateForField(field Field) jen.Code { + switch fieldType := field.GetType().(type) { + case *types.Named: + // the field is a named type (user defined structs) + _, err := field.Type.BadORMModelStruct() + if err == nil { + // field is a BaDORM Model + return generator.verifyStruct(field) + } + case *types.Pointer: + // the field is a pointer + return generator.generateForPointer(field.ChangeType(fieldType.Elem())) + default: + log.Logger.Debugf("struct field type not handled: %T", fieldType) + } + + return nil +} + +func (generator RelationGettersGenerator) generateForPointer(field Field) jen.Code { + _, err := field.Type.BadORMModelStruct() + if err == nil { + // field is a pointer to BaDORM Model + fk, err := generator.objectType.GetFK(field) + if err != nil { + log.Logger.Debugf("unhandled: field is a pointer and object not has the fk: %s", field.Type) + return nil + } + + switch fk.GetType().(type) { + // TODO verificar que sea de los ids correctos? + // TODO basics para strings y eso? + case *types.Named: + return generator.verifyPointerWithID(field) + case *types.Pointer: + // the fk is a pointer + return generator.verifyPointer(field) + } + } return nil } From 94e1dda6806660b8e93d4b306734c8e06b456f66 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 27 Jun 2023 16:57:01 +0200 Subject: [PATCH 399/467] add logging to relation getters generation --- .../cmd/gen/conditions/relationGettersGenerator.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go index 52fd3095..0733d8c1 100644 --- a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go +++ b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go @@ -29,7 +29,13 @@ func NewRelationGettersGenerator(object types.Object) *RelationGettersGenerator // Add conditions for an object in the file func (generator RelationGettersGenerator) Into(file *File) error { - fields, _ := getFields(generator.objectType) + fields, err := getFields(generator.objectType) + if err != nil { + return err + } + + log.Logger.Infof("Generating relation getters for type %q in %s", generator.object.Name(), file.name) + file.Add(generator.ForEachField(file, fields)...) return nil @@ -65,6 +71,7 @@ func (generator RelationGettersGenerator) generateForField(field Field) jen.Code // the field is a named type (user defined structs) _, err := field.Type.BadORMModelStruct() if err == nil { + log.Logger.Debugf("Generating relation getter for type %q and field %s", generator.object.Name(), field.Name) // field is a BaDORM Model return generator.verifyStruct(field) } @@ -88,6 +95,8 @@ func (generator RelationGettersGenerator) generateForPointer(field Field) jen.Co return nil } + log.Logger.Debugf("Generating relation getter for type %q and field %s", generator.object.Name(), field.Name) + switch fk.GetType().(type) { // TODO verificar que sea de los ids correctos? // TODO basics para strings y eso? From ab306749a7ca4765ee20df0894550976e8d932e8 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 27 Jun 2023 17:06:52 +0200 Subject: [PATCH 400/467] verify pointer with id only if id is badorm model id --- tools/badctl/cmd/gen/conditions/condition.go | 3 ++- tools/badctl/cmd/gen/conditions/field.go | 12 ++++++++++++ .../cmd/gen/conditions/relationGettersGenerator.go | 6 +++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 7fc23099..bfbcf1c8 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -24,6 +24,7 @@ const ( badORMExpression = "Expression" // badorm/baseModels.go uIntID = "UIntID" + uuid = "UUID" uuidModel = "UUIDModel" uIntModel = "UIntModel" ) @@ -121,7 +122,7 @@ func (condition *Condition) generateForNamedType(objectType Type, field Field) { condition.generateForBadormModel(objectType, field) } else { // field is not a BaDORM Model - if field.Type.IsGormCustomType() || field.TypeString() == "time.Time" || field.TypeString() == badORMPath+"."+uIntID { + if field.Type.IsGormCustomType() || field.TypeString() == "time.Time" || field.IsBadORMID() { // field is a Gorm Custom type (implements Scanner and Valuer interfaces) // or a named type supported by gorm (time.Time, gorm.DeletedAt) condition.param.ToCustomType(condition.destPkg, field.Type) diff --git a/tools/badctl/cmd/gen/conditions/field.go b/tools/badctl/cmd/gen/conditions/field.go index 9a20e3be..040c1959 100644 --- a/tools/badctl/cmd/gen/conditions/field.go +++ b/tools/badctl/cmd/gen/conditions/field.go @@ -3,8 +3,16 @@ package conditions import ( "errors" "go/types" + + "github.com/elliotchance/pie/v2" ) +// badorm/baseModels.go +var badORMIDs = []string{ + badORMPath + "." + uIntID, + badORMPath + "." + uuid, +} + type Field struct { Name string NamePrefix string @@ -84,6 +92,10 @@ func (field Field) ChangeType(newType types.Type) Field { } } +func (field Field) IsBadORMID() bool { + return pie.Contains(badORMIDs, field.TypeString()) +} + // Get fields of a BaDORM model // Returns error is objectType is not a BaDORM model func getFields(objectType Type) ([]Field, error) { diff --git a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go index 0733d8c1..f8898541 100644 --- a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go +++ b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go @@ -98,10 +98,10 @@ func (generator RelationGettersGenerator) generateForPointer(field Field) jen.Co log.Logger.Debugf("Generating relation getter for type %q and field %s", generator.object.Name(), field.Name) switch fk.GetType().(type) { - // TODO verificar que sea de los ids correctos? - // TODO basics para strings y eso? case *types.Named: - return generator.verifyPointerWithID(field) + if fk.IsBadORMID() { + return generator.verifyPointerWithID(field) + } case *types.Pointer: // the fk is a pointer return generator.verifyPointer(field) From 35cdf04b872a0eb6e13b6b82ca9cc57496dca67e Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 28 Jun 2023 12:17:05 +0200 Subject: [PATCH 401/467] list and nested attributes preload --- badorm/condition.go | 57 +++++++- testintegration/badorm_test.go | 1 + .../conditions/seller_conditions.go | 23 ++- .../conditions/university_conditions.go | 46 ++++++ testintegration/crudServiceCommon.go | 10 ++ testintegration/models/badorm.go | 3 + testintegration/models/models.go | 13 ++ testintegration/preload_conditions_test.go | 137 ++++++++++++++++++ 8 files changed, 281 insertions(+), 9 deletions(-) create mode 100644 testintegration/conditions/university_conditions.go diff --git a/badorm/condition.go b/badorm/condition.go index ab451f33..bf72a201 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -232,6 +232,53 @@ func NewPreloadCondition[T Model](fields ...FieldIdentifier) PreloadCondition[T] } } +// TODO doc +type CollectionPreloadCondition[T1 Model, T2 Model] struct { + CollectionField string + NestedPreloads *Condition[T2] +} + +//nolint:unused // see inside +func (condition CollectionPreloadCondition[T1, T2]) interfaceVerificationMethod(_ T1) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T1] +} + +func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { + if condition.NestedPreloads == nil { + return query.Preload(condition.CollectionField), nil + } + + initialTableName, err := getTableName(query, *new(T2)) + if err != nil { + return nil, err + } + + return query.Preload( + condition.CollectionField, + func(db *gorm.DB) *gorm.DB { + // TODO verificar que sea realmente solo preloads? + db = db.Select(initialTableName + ".*") + db, err := (*condition.NestedPreloads).ApplyTo( + db, + Table{ + Name: initialTableName, + Alias: initialTableName, + Initial: true, + }, + ) + if err != nil { + _ = db.AddError(err) + return db + } + + return db + // TODO se podria hacer que el join si el solo preload haga esto y a la verga, asi me ahorro el select, la table y eso + // return db.Joins("University") + }, + ), nil +} + // Condition that verifies the value of a field, // using the Expression type FieldCondition[TObject Model, TAtribute any] struct { @@ -413,7 +460,7 @@ func (condition JoinCondition[T1, T2]) getSQLJoin( // Divides a list of conditions by its type: WhereConditions and JoinConditions func divideConditionsByType[T Model]( conditions []Condition[T], -) (whereConditions []WhereCondition[T], joinConditions []IJoinCondition[T], preloadCondition *PreloadCondition[T]) { +) (whereConditions []WhereCondition[T], joinConditions []IJoinCondition[T], preloadCondition Condition[T]) { for _, condition := range conditions { possibleWhereCondition, ok := condition.(WhereCondition[T]) if ok { @@ -421,17 +468,13 @@ func divideConditionsByType[T Model]( continue } - possiblePreloadCondition, ok := condition.(PreloadCondition[T]) - if ok { - preloadCondition = &possiblePreloadCondition - continue - } - possibleJoinCondition, ok := condition.(IJoinCondition[T]) if ok { joinConditions = append(joinConditions, possibleJoinCondition) continue } + + preloadCondition = condition } return diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index eb53e151..b569dc89 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -46,6 +46,7 @@ func TestBaDORM(t *testing.T) { }), badorm.GetCRUDServiceModule[models.Seller](), + badorm.GetCRUDServiceModule[models.Company](), badorm.GetCRUDServiceModule[models.Product](), badorm.GetCRUDServiceModule[models.Sale](), badorm.GetCRUDServiceModule[models.City](), diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 3c709965..b1325710 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -60,6 +60,25 @@ func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[ FieldIdentifier: sellerCompanyIdFieldID, } } +func SellerUniversity(conditions ...badorm.Condition[models.University]) badorm.Condition[models.Seller] { + return badorm.JoinCondition[models.Seller, models.University]{ + Conditions: conditions, + RelationField: "University", + T1Field: "UniversityID", + T1PreloadCondition: SellerPreloadAttributes, + T2Field: "ID", + } +} + +var SellerPreloadUniversity = SellerUniversity(UniversityPreloadAttributes) +var sellerUniversityIdFieldID = badorm.FieldIdentifier{Field: "UniversityID"} + +func SellerUniversityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { + return badorm.FieldCondition[models.Seller, badorm.UUID]{ + Expression: expr, + FieldIdentifier: sellerUniversityIdFieldID, + } +} -var SellerPreloadAttributes = badorm.NewPreloadCondition[models.Seller](sellerNameFieldID, sellerCompanyIdFieldID) -var SellerPreloadRelations = []badorm.Condition[models.Seller]{SellerPreloadCompany} +var SellerPreloadAttributes = badorm.NewPreloadCondition[models.Seller](sellerNameFieldID, sellerCompanyIdFieldID, sellerUniversityIdFieldID) +var SellerPreloadRelations = []badorm.Condition[models.Seller]{SellerPreloadCompany, SellerPreloadUniversity} diff --git a/testintegration/conditions/university_conditions.go b/testintegration/conditions/university_conditions.go new file mode 100644 index 00000000..0b94db09 --- /dev/null +++ b/testintegration/conditions/university_conditions.go @@ -0,0 +1,46 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + models "github.com/ditrit/badaas/testintegration/models" + gorm "gorm.io/gorm" + "time" +) + +func UniversityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.University] { + return badorm.FieldCondition[models.University, badorm.UUID]{ + Expression: expr, + FieldIdentifier: badorm.IDFieldID, + } +} +func UniversityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.University] { + return badorm.FieldCondition[models.University, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, + } +} +func UniversityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.University] { + return badorm.FieldCondition[models.University, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, + } +} +func UniversityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.University] { + return badorm.FieldCondition[models.University, gorm.DeletedAt]{ + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, + } +} + +var universityNameFieldID = badorm.FieldIdentifier{Field: "Name"} + +func UniversityName(expr badorm.Expression[string]) badorm.WhereCondition[models.University] { + return badorm.FieldCondition[models.University, string]{ + Expression: expr, + FieldIdentifier: universityNameFieldID, + } +} + +var UniversityPreloadAttributes = badorm.NewPreloadCondition[models.University](universityNameFieldID) +var UniversityPreloadRelations = []badorm.Condition[models.University]{} diff --git a/testintegration/crudServiceCommon.go b/testintegration/crudServiceCommon.go index 764edef4..85b64162 100644 --- a/testintegration/crudServiceCommon.go +++ b/testintegration/crudServiceCommon.go @@ -126,3 +126,13 @@ func (ts *CRUDServiceCommonIntTestSuite) createPhone(name string, brand models.B return entity } + +func (ts *CRUDServiceCommonIntTestSuite) createUniversity(name string) *models.University { + entity := &models.University{ + Name: name, + } + err := ts.db.Create(entity).Error + ts.Nil(err) + + return entity +} diff --git a/testintegration/models/badorm.go b/testintegration/models/badorm.go index f94cc99d..d2b54eb0 100644 --- a/testintegration/models/badorm.go +++ b/testintegration/models/badorm.go @@ -39,3 +39,6 @@ func (m Sale) GetSeller() (*Seller, error) { func (m Seller) GetCompany() (*Company, error) { return badorm.VerifyPointerLoaded[Company](m.CompanyID, m.Company) } +func (m Seller) GetUniversity() (*University, error) { + return badorm.VerifyPointerLoaded[University](m.UniversityID, m.University) +} diff --git a/testintegration/models/models.go b/testintegration/models/models.go index c7b3bc99..658a18fa 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -90,12 +90,25 @@ func (m Product) Equal(other Product) bool { return m.ID == other.ID } +type University struct { + badorm.UUIDModel + + Name string +} + +func (m University) Equal(other University) bool { + return m.ID == other.ID +} + type Seller struct { badorm.UUIDModel Name string Company *Company CompanyID *badorm.UUID // Company HasMany Sellers (Company 0..1 -> 0..* Seller) + + University *University + UniversityID *badorm.UUID } type Sale struct { diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index 9b24601b..0acc19b8 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -10,11 +10,13 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" + "github.com/ditrit/badaas/utils" ) type PreloadConditionsIntTestSuite struct { CRUDServiceCommonIntTestSuite crudSaleService badorm.CRUDService[models.Sale, badorm.UUID] + crudCompanyService badorm.CRUDService[models.Company, badorm.UUID] crudSellerService badorm.CRUDService[models.Seller, badorm.UUID] crudCountryService badorm.CRUDService[models.Country, badorm.UUID] crudCityService badorm.CRUDService[models.City, badorm.UUID] @@ -26,6 +28,7 @@ type PreloadConditionsIntTestSuite struct { func NewPreloadConditionsIntTestSuite( db *gorm.DB, crudSaleService badorm.CRUDService[models.Sale, badorm.UUID], + crudCompanyService badorm.CRUDService[models.Company, badorm.UUID], crudSellerService badorm.CRUDService[models.Seller, badorm.UUID], crudCountryService badorm.CRUDService[models.Country, badorm.UUID], crudCityService badorm.CRUDService[models.City, badorm.UUID], @@ -38,6 +41,7 @@ func NewPreloadConditionsIntTestSuite( db: db, }, crudSaleService: crudSaleService, + crudCompanyService: crudCompanyService, crudSellerService: crudSellerService, crudCountryService: crudCountryService, crudCityService: crudCityService, @@ -659,3 +663,136 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond( ts.Nil(err) assert.DeepEqual(ts.T(), parentParent, childParent2Parent) } + +func CompanyPreloadSellers(nestedPreloads ...badorm.Condition[models.Seller]) badorm.CollectionPreloadCondition[models.Company, models.Seller] { + // TODO poner esto en un constructor + var nestedPreload *badorm.Condition[models.Seller] + if len(nestedPreloads) == 0 { + nestedPreload = nil + } else if len(nestedPreloads) == 1 { + nestedPreload = &nestedPreloads[0] + } + // TODO si me pones mas te doy error + return badorm.CollectionPreloadCondition[models.Company, models.Seller]{ + CollectionField: "Sellers", + NestedPreloads: nestedPreload, + } +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadList() { + company := ts.createCompany("ditrit") + seller1 := ts.createSeller("1", company) + seller2 := ts.createSeller("2", company) + + entities, err := ts.crudCompanyService.GetEntities( + CompanyPreloadSellers(), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Company{company}, entities) + // TODO tener el getter + EqualList(&ts.Suite, []models.Seller{*seller1, *seller2}, entities[0].Sellers) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributes() { + company := ts.createCompany("ditrit") + + university1 := ts.createUniversity("uni1") + seller1 := ts.createSeller("1", company) + seller1.University = university1 + err := ts.db.Save(seller1).Error + ts.Nil(err) + + university2 := ts.createUniversity("uni1") + seller2 := ts.createSeller("2", company) + seller2.University = university2 + err = ts.db.Save(seller2).Error + ts.Nil(err) + + entities, err := ts.crudCompanyService.GetEntities( + CompanyPreloadSellers( + conditions.SellerPreloadUniversity, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Company{company}, entities) + // TODO tener el getter + EqualList(&ts.Suite, []models.Seller{*seller1, *seller2}, entities[0].Sellers) + + ts.True(pie.Any(entities[0].Sellers, func(seller models.Seller) bool { + sellerUniversity, err := seller.GetUniversity() + return err == nil && sellerUniversity.Equal(*university1) + })) + ts.True(pie.Any(entities[0].Sellers, func(seller models.Seller) bool { + sellerUniversity, err := seller.GetUniversity() + return err == nil && sellerUniversity.Equal(*university2) + })) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadMultipleListsAndNestedAttributes() { + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + university1 := ts.createUniversity("uni1") + seller1 := ts.createSeller("1", company1) + seller1.University = university1 + err := ts.db.Save(seller1).Error + ts.Nil(err) + + university2 := ts.createUniversity("uni1") + seller2 := ts.createSeller("2", company1) + seller2.University = university2 + err = ts.db.Save(seller2).Error + ts.Nil(err) + + seller3 := ts.createSeller("3", company2) + seller3.University = university1 + err = ts.db.Save(seller3).Error + ts.Nil(err) + + seller4 := ts.createSeller("4", company2) + seller4.University = university2 + err = ts.db.Save(seller4).Error + ts.Nil(err) + + entities, err := ts.crudCompanyService.GetEntities( + CompanyPreloadSellers( + conditions.SellerPreloadUniversity, + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Company{company1, company2}, entities) + + company1Loaded := *utils.FindFirst(entities, func(company *models.Company) bool { + return company.Equal(*company1) + }) + company2Loaded := *utils.FindFirst(entities, func(company *models.Company) bool { + return company.Equal(*company2) + }) + + // TODO tener el getter + EqualList(&ts.Suite, []models.Seller{*seller1, *seller2}, company1Loaded.Sellers) + + ts.True(pie.Any(company1Loaded.Sellers, func(seller models.Seller) bool { + sellerUniversity, err := seller.GetUniversity() + return err == nil && sellerUniversity.Equal(*university1) + })) + ts.True(pie.Any(company1Loaded.Sellers, func(seller models.Seller) bool { + sellerUniversity, err := seller.GetUniversity() + return err == nil && sellerUniversity.Equal(*university2) + })) + + // TODO tener el getter + EqualList(&ts.Suite, []models.Seller{*seller3, *seller4}, company2Loaded.Sellers) + + ts.True(pie.Any(company2Loaded.Sellers, func(seller models.Seller) bool { + sellerUniversity, err := seller.GetUniversity() + return err == nil && sellerUniversity.Equal(*university1) + })) + ts.True(pie.Any(company2Loaded.Sellers, func(seller models.Seller) bool { + sellerUniversity, err := seller.GetUniversity() + return err == nil && sellerUniversity.Equal(*university2) + })) +} From 8758556bd5c1087e76776049044c1f08ab863174 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 28 Jun 2023 15:15:07 +0200 Subject: [PATCH 402/467] allow multiple preloads inside collection preload --- badorm/condition.go | 45 ++++++++++++------- badorm/crudRepository.go | 35 ++++++++++----- .../conditions/seller_conditions.go | 3 +- testintegration/preload_conditions_test.go | 19 +++----- 4 files changed, 59 insertions(+), 43 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index bf72a201..792da1a1 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -18,7 +18,10 @@ var ( DeletedAtFieldID = FieldIdentifier{Field: DeletedAtField} ) -var ErrEmptyConditions = errors.New("condition must have at least one inner condition") +var ( + ErrEmptyConditions = errors.New("condition must have at least one inner condition") + ErrOnlyPreloadsAllowed = errors.New("only conditions that do a preload are allowed") +) type Table struct { Name string @@ -235,7 +238,7 @@ func NewPreloadCondition[T Model](fields ...FieldIdentifier) PreloadCondition[T] // TODO doc type CollectionPreloadCondition[T1 Model, T2 Model] struct { CollectionField string - NestedPreloads *Condition[T2] + NestedPreloads []IJoinCondition[T2] } //nolint:unused // see inside @@ -245,40 +248,48 @@ func (condition CollectionPreloadCondition[T1, T2]) interfaceVerificationMethod( } func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { - if condition.NestedPreloads == nil { + if len(condition.NestedPreloads) == 0 { return query.Preload(condition.CollectionField), nil } - initialTableName, err := getTableName(query, *new(T2)) - if err != nil { - return nil, err - } - return query.Preload( condition.CollectionField, func(db *gorm.DB) *gorm.DB { - // TODO verificar que sea realmente solo preloads? - db = db.Select(initialTableName + ".*") - db, err := (*condition.NestedPreloads).ApplyTo( - db, - Table{ - Name: initialTableName, - Alias: initialTableName, - Initial: true, + preloadsAsCondition := pie.Map( + condition.NestedPreloads, + func(joinCondition IJoinCondition[T2]) Condition[T2] { + return joinCondition }, ) + + query, err := applyConditionsToQuery[T2](db, preloadsAsCondition) if err != nil { _ = db.AddError(err) return db } - return db + return query // TODO se podria hacer que el join si el solo preload haga esto y a la verga, asi me ahorro el select, la table y eso // return db.Joins("University") }, ), nil } +// TODO doc +func NewCollectionPreloadCondition[T1 Model, T2 Model](collectionField string, nestedPreloads []IJoinCondition[T2]) Condition[T1] { + // TODO verificar que no haga filtros? + if pie.Any(nestedPreloads, func(nestedPreload IJoinCondition[T2]) bool { + return !nestedPreload.makesPreload() + }) { + return NewInvalidCondition[T1](ErrOnlyPreloadsAllowed) + } + + return CollectionPreloadCondition[T1, T2]{ + CollectionField: collectionField, + NestedPreloads: nestedPreloads, + } +} + // Condition that verifies the value of a field, // using the Expression type FieldCondition[TObject Model, TAtribute any] struct { diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 8c70e133..accf1d2f 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -85,28 +85,39 @@ func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Cond // Get the list of objects that match "conditions" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { - initialTableName, err := getTableName(tx, *new(T)) + query, err := applyConditionsToQuery(tx, conditions) if err != nil { return nil, err } - query := tx.Select(initialTableName + ".*") + // execute query + var entities []*T + err = query.Find(&entities).Error + + return entities, err +} + +func applyConditionsToQuery[T Model](query *gorm.DB, conditions []Condition[T]) (*gorm.DB, error) { + initialTableName, err := getTableName(query, *new(T)) + if err != nil { + return nil, err + } + + initialTable := Table{ + Name: initialTableName, + Alias: initialTableName, + Initial: true, + } + + query = query.Select(initialTableName + ".*") for _, condition := range conditions { - query, err = condition.ApplyTo(query, Table{ - Name: initialTableName, - Alias: initialTableName, - Initial: true, - }) + query, err = condition.ApplyTo(query, initialTable) if err != nil { return nil, err } } - // execute query - var entities []*T - err = query.Find(&entities).Error - - return entities, err + return query, nil } // Get the name of the table in "db" in which the data for "entity" is saved diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index b1325710..d75731af 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -60,7 +60,8 @@ func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[ FieldIdentifier: sellerCompanyIdFieldID, } } -func SellerUniversity(conditions ...badorm.Condition[models.University]) badorm.Condition[models.Seller] { +// TODO hacer este cambio en todos los generados +func SellerUniversity(conditions ...badorm.Condition[models.University]) badorm.IJoinCondition[models.Seller] { return badorm.JoinCondition[models.Seller, models.University]{ Conditions: conditions, RelationField: "University", diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index 0acc19b8..9efefe07 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -664,19 +664,12 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond( assert.DeepEqual(ts.T(), parentParent, childParent2Parent) } -func CompanyPreloadSellers(nestedPreloads ...badorm.Condition[models.Seller]) badorm.CollectionPreloadCondition[models.Company, models.Seller] { - // TODO poner esto en un constructor - var nestedPreload *badorm.Condition[models.Seller] - if len(nestedPreloads) == 0 { - nestedPreload = nil - } else if len(nestedPreloads) == 1 { - nestedPreload = &nestedPreloads[0] - } - // TODO si me pones mas te doy error - return badorm.CollectionPreloadCondition[models.Company, models.Seller]{ - CollectionField: "Sellers", - NestedPreloads: nestedPreload, - } +// TODO generacion automatica +func CompanyPreloadSellers(nestedPreloads ...badorm.IJoinCondition[models.Seller]) badorm.Condition[models.Company] { + return badorm.NewCollectionPreloadCondition[models.Company, models.Seller]( + "Sellers", + nestedPreloads, + ) } func (ts *PreloadConditionsIntTestSuite) TestPreloadList() { From 3dee16e1f96222ed2d98f6202a7dfacfa155922c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 28 Jun 2023 15:18:25 +0200 Subject: [PATCH 403/467] generated join conditions return ijoincondition --- testintegration/conditions/bicycle_conditions.go | 2 +- testintegration/conditions/child_conditions.go | 4 ++-- testintegration/conditions/city_conditions.go | 2 +- testintegration/conditions/country_conditions.go | 2 +- testintegration/conditions/employee_conditions.go | 2 +- testintegration/conditions/parent1_conditions.go | 2 +- testintegration/conditions/parent2_conditions.go | 2 +- testintegration/conditions/phone_conditions.go | 2 +- testintegration/conditions/sale_conditions.go | 4 ++-- testintegration/conditions/seller_conditions.go | 3 +-- tools/badctl/cmd/gen/conditions/condition.go | 7 ++++--- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index d1b20cdd..3bc0c06c 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -41,7 +41,7 @@ func BicycleName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bi FieldIdentifier: bicycleNameFieldID, } } -func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.Condition[models.Bicycle] { +func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.IJoinCondition[models.Bicycle] { return badorm.JoinCondition[models.Bicycle, models.Person]{ Conditions: conditions, RelationField: "Owner", diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index 62089803..0ba9ee90 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -32,7 +32,7 @@ func ChildDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio FieldIdentifier: badorm.DeletedAtFieldID, } } -func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.Condition[models.Child] { +func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.IJoinCondition[models.Child] { return badorm.JoinCondition[models.Child, models.Parent1]{ Conditions: conditions, RelationField: "Parent1", @@ -51,7 +51,7 @@ func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[m FieldIdentifier: childParent1IdFieldID, } } -func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.Condition[models.Child] { +func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.IJoinCondition[models.Child] { return badorm.JoinCondition[models.Child, models.Parent2]{ Conditions: conditions, RelationField: "Parent2", diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index 2aea3b96..18a3e095 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -41,7 +41,7 @@ func CityName(expr badorm.Expression[string]) badorm.WhereCondition[models.City] FieldIdentifier: cityNameFieldID, } } -func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.Condition[models.City] { +func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.IJoinCondition[models.City] { return badorm.JoinCondition[models.City, models.Country]{ Conditions: conditions, RelationField: "Country", diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index 29a24032..1921f483 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -41,7 +41,7 @@ func CountryName(expr badorm.Expression[string]) badorm.WhereCondition[models.Co FieldIdentifier: countryNameFieldID, } } -func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.Condition[models.Country] { +func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.IJoinCondition[models.Country] { return badorm.JoinCondition[models.Country, models.City]{ Conditions: conditions, RelationField: "Capital", diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 6537a3a6..0f4ce81e 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -41,7 +41,7 @@ func EmployeeName(expr badorm.Expression[string]) badorm.WhereCondition[models.E FieldIdentifier: employeeNameFieldID, } } -func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.Condition[models.Employee] { +func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.IJoinCondition[models.Employee] { return badorm.JoinCondition[models.Employee, models.Employee]{ Conditions: conditions, RelationField: "Boss", diff --git a/testintegration/conditions/parent1_conditions.go b/testintegration/conditions/parent1_conditions.go index db31166b..1088d44e 100644 --- a/testintegration/conditions/parent1_conditions.go +++ b/testintegration/conditions/parent1_conditions.go @@ -32,7 +32,7 @@ func Parent1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit FieldIdentifier: badorm.DeletedAtFieldID, } } -func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.Condition[models.Parent1] { +func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.IJoinCondition[models.Parent1] { return badorm.JoinCondition[models.Parent1, models.ParentParent]{ Conditions: conditions, RelationField: "ParentParent", diff --git a/testintegration/conditions/parent2_conditions.go b/testintegration/conditions/parent2_conditions.go index 1c5bc1c9..130b58e9 100644 --- a/testintegration/conditions/parent2_conditions.go +++ b/testintegration/conditions/parent2_conditions.go @@ -32,7 +32,7 @@ func Parent2DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit FieldIdentifier: badorm.DeletedAtFieldID, } } -func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.Condition[models.Parent2] { +func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.IJoinCondition[models.Parent2] { return badorm.JoinCondition[models.Parent2, models.ParentParent]{ Conditions: conditions, RelationField: "ParentParent", diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index 95887f6b..644eaaf4 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -41,7 +41,7 @@ func PhoneName(expr badorm.Expression[string]) badorm.WhereCondition[models.Phon FieldIdentifier: phoneNameFieldID, } } -func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.Condition[models.Phone] { +func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.IJoinCondition[models.Phone] { return badorm.JoinCondition[models.Phone, models.Brand]{ Conditions: conditions, RelationField: "Brand", diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 3855693c..32326564 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -50,7 +50,7 @@ func SaleDescription(expr badorm.Expression[string]) badorm.WhereCondition[model FieldIdentifier: saleDescriptionFieldID, } } -func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.Condition[models.Sale] { +func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.IJoinCondition[models.Sale] { return badorm.JoinCondition[models.Sale, models.Product]{ Conditions: conditions, RelationField: "Product", @@ -69,7 +69,7 @@ func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[mo FieldIdentifier: saleProductIdFieldID, } } -func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.Condition[models.Sale] { +func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.IJoinCondition[models.Sale] { return badorm.JoinCondition[models.Sale, models.Seller]{ Conditions: conditions, RelationField: "Seller", diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index d75731af..f2bc7228 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -41,7 +41,7 @@ func SellerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Sel FieldIdentifier: sellerNameFieldID, } } -func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.Condition[models.Seller] { +func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.IJoinCondition[models.Seller] { return badorm.JoinCondition[models.Seller, models.Company]{ Conditions: conditions, RelationField: "Company", @@ -60,7 +60,6 @@ func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[ FieldIdentifier: sellerCompanyIdFieldID, } } -// TODO hacer este cambio en todos los generados func SellerUniversity(conditions ...badorm.Condition[models.University]) badorm.IJoinCondition[models.Seller] { return badorm.JoinCondition[models.Seller, models.University]{ Conditions: conditions, diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index bfbcf1c8..2b85f219 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -15,6 +15,7 @@ const ( badORMFieldCondition = "FieldCondition" badORMWhereCondition = "WhereCondition" badORMJoinCondition = "JoinCondition" + badORMIJoinCondition = "IJoinCondition" badORMFieldIdentifier = "FieldIdentifier" IDFieldID = "IDFieldID" CreatedAtFieldID = "CreatedAtFieldID" @@ -277,8 +278,8 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, conditionName := getConditionName(objectType, field) log.Logger.Debugf("Generated %q", conditionName) - badormT1Condition := jen.Qual( - badORMPath, badORMCondition, + badormT1IJoinCondition := jen.Qual( + badORMPath, badORMIJoinCondition, ).Types(t1) badormT2Condition := jen.Qual( badORMPath, badORMCondition, @@ -296,7 +297,7 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, ).Params( jen.Id("conditions").Op("...").Add(badormT2Condition), ).Add( - badormT1Condition, + badormT1IJoinCondition, ).Block( jen.Return( badormJoinCondition.Values(jen.Dict{ From 0d07549d312c3c6057e4932cdd86ecfef0ee3adf Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 28 Jun 2023 15:53:02 +0200 Subject: [PATCH 404/467] automatic generation of collection preload --- .../conditions/company_conditions.go | 5 +- testintegration/preload_conditions_test.go | 14 +--- tools/badctl/cmd/gen/conditions/condition.go | 79 ++++++++++++++++--- 3 files changed, 75 insertions(+), 23 deletions(-) diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index 3990b0b0..7983a125 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -41,6 +41,9 @@ func CompanyName(expr badorm.Expression[string]) badorm.WhereCondition[models.Co FieldIdentifier: companyNameFieldID, } } +func CompanyPreloadSellers(nestedPreloads ...badorm.IJoinCondition[models.Seller]) badorm.Condition[models.Company] { + return badorm.NewCollectionPreloadCondition[models.Company, models.Seller]("Sellers", nestedPreloads) +} var CompanyPreloadAttributes = badorm.NewPreloadCondition[models.Company](companyNameFieldID) -var CompanyPreloadRelations = []badorm.Condition[models.Company]{} +var CompanyPreloadRelations = []badorm.Condition[models.Company]{CompanyPreloadSellers()} diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index 9efefe07..ac113bbd 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -664,21 +664,13 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond( assert.DeepEqual(ts.T(), parentParent, childParent2Parent) } -// TODO generacion automatica -func CompanyPreloadSellers(nestedPreloads ...badorm.IJoinCondition[models.Seller]) badorm.Condition[models.Company] { - return badorm.NewCollectionPreloadCondition[models.Company, models.Seller]( - "Sellers", - nestedPreloads, - ) -} - func (ts *PreloadConditionsIntTestSuite) TestPreloadList() { company := ts.createCompany("ditrit") seller1 := ts.createSeller("1", company) seller2 := ts.createSeller("2", company) entities, err := ts.crudCompanyService.GetEntities( - CompanyPreloadSellers(), + conditions.CompanyPreloadSellers(), ) ts.Nil(err) @@ -703,7 +695,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributes() { ts.Nil(err) entities, err := ts.crudCompanyService.GetEntities( - CompanyPreloadSellers( + conditions.CompanyPreloadSellers( conditions.SellerPreloadUniversity, ), ) @@ -750,7 +742,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadMultipleListsAndNestedAttrib ts.Nil(err) entities, err := ts.crudCompanyService.GetEntities( - CompanyPreloadSellers( + conditions.CompanyPreloadSellers( conditions.SellerPreloadUniversity, ), ) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 2b85f219..bd68b561 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -11,16 +11,17 @@ import ( const ( // badorm/condition.go - badORMCondition = "Condition" - badORMFieldCondition = "FieldCondition" - badORMWhereCondition = "WhereCondition" - badORMJoinCondition = "JoinCondition" - badORMIJoinCondition = "IJoinCondition" - badORMFieldIdentifier = "FieldIdentifier" - IDFieldID = "IDFieldID" - CreatedAtFieldID = "CreatedAtFieldID" - UpdatedAtFieldID = "UpdatedAtFieldID" - DeletedAtFieldID = "DeletedAtFieldID" + badORMCondition = "Condition" + badORMFieldCondition = "FieldCondition" + badORMWhereCondition = "WhereCondition" + badORMJoinCondition = "JoinCondition" + badORMIJoinCondition = "IJoinCondition" + badORMFieldIdentifier = "FieldIdentifier" + badORMNewCollectionPreload = "NewCollectionPreloadCondition" + IDFieldID = "IDFieldID" + CreatedAtFieldID = "CreatedAtFieldID" + UpdatedAtFieldID = "UpdatedAtFieldID" + DeletedAtFieldID = "DeletedAtFieldID" // badorm/expression.go badORMExpression = "Expression" // badorm/baseModels.go @@ -109,6 +110,12 @@ func (condition *Condition) generateForSlice(objectType Type, field Field) { objectType, field.ChangeType(elemType.Elem()), ) + case *types.Named: + _, err := field.Type.BadORMModelStruct() + if err == nil { + // field is a BaDORM Model + condition.generateCollectionPreload(objectType, field) + } default: log.Logger.Debugf("struct field list elem type not handled: %T", elemType) } @@ -312,7 +319,7 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, ) // preload for the relation - preloadName := objectType.Name() + "Preload" + field.Name + preloadName := getPreloadRelationName(objectType, field) condition.codes = append( condition.codes, jen.Var().Id( @@ -324,6 +331,56 @@ func (condition *Condition) generateJoin(objectType Type, field Field, t1Field, condition.preloadName = preloadName } +func getPreloadRelationName(objectType Type, field Field) string { + return objectType.Name() + "Preload" + field.Name +} + +func (condition *Condition) generateCollectionPreload(objectType Type, field Field) { + t1 := jen.Qual( + getRelativePackagePath(condition.destPkg, objectType), + objectType.Name(), + ) + + t2 := jen.Qual( + getRelativePackagePath(condition.destPkg, field.Type), + field.TypeName(), + ) + + badormT1Condition := jen.Qual( + badORMPath, badORMCondition, + ).Types(t1) + badormT2IJoinCondition := jen.Qual( + badORMPath, badORMIJoinCondition, + ).Types(t2) + badormNewCollectionPreload := jen.Qual( + badORMPath, badORMNewCollectionPreload, + ).Types( + t1, t2, + ) + + preloadName := getPreloadRelationName(objectType, field) + + condition.codes = append( + condition.codes, + jen.Func().Id( + preloadName, + ).Params( + jen.Id("nestedPreloads").Op("...").Add(badormT2IJoinCondition), + ).Add( + badormT1Condition, + ).Block( + jen.Return( + badormNewCollectionPreload.Call( + jen.Lit(field.Name), + jen.Id("nestedPreloads"), + ), + ), + ), + ) + + condition.preloadName = preloadName + "()" +} + // Generate condition names func getConditionName(typeV Type, field Field) string { return typeV.Name() + strcase.ToPascal(field.NamePrefix) + strcase.ToPascal(field.Name) From c03753e76ea6e7046bb3fac59bd53a3198075795 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 10:53:29 +0200 Subject: [PATCH 405/467] collection getter and automatic generation --- badorm/preload.go | 8 ++ testintegration/models/badorm.go | 3 + testintegration/models/models.go | 5 +- testintegration/preload_conditions_test.go | 59 ++++++++++---- .../conditions/relationGettersGenerator.go | 76 ++++++++++++++----- 5 files changed, 115 insertions(+), 36 deletions(-) diff --git a/badorm/preload.go b/badorm/preload.go index a0fe4adb..eefca54e 100644 --- a/badorm/preload.go +++ b/badorm/preload.go @@ -31,3 +31,11 @@ func VerifyPointerWithIDLoaded[TModel Model, TID ModelID](id TID, toVerify *TMod return toVerify, nil } + +func VerifyCollectionLoaded[T Model](collection *[]T) ([]T, error) { + if collection == nil { + return nil, ErrRelationNotLoaded + } + + return *collection, nil +} diff --git a/testintegration/models/badorm.go b/testintegration/models/badorm.go index d2b54eb0..1ec4114f 100644 --- a/testintegration/models/badorm.go +++ b/testintegration/models/badorm.go @@ -15,6 +15,9 @@ func (m Child) GetParent2() (*Parent2, error) { func (m City) GetCountry() (*Country, error) { return badorm.VerifyPointerWithIDLoaded[Country](m.CountryID, m.Country) } +func (m Company) GetSellers() ([]Seller, error) { + return badorm.VerifyCollectionLoaded[Seller](m.Sellers) +} func (m Country) GetCapital() (*City, error) { return badorm.VerifyStructLoaded[City](&m.Capital) } diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 658a18fa..d86d3259 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -15,9 +15,8 @@ import ( type Company struct { badorm.UUIDModel - Name string - // TODO preload de esto - Sellers []Seller // Company HasMany Sellers (Company 0..1 -> 0..* Seller) + Name string + Sellers *[]Seller // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } func (m Company) Equal(other Company) bool { diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index ac113bbd..0df5de98 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -664,7 +664,7 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond( assert.DeepEqual(ts.T(), parentParent, childParent2Parent) } -func (ts *PreloadConditionsIntTestSuite) TestPreloadList() { +func (ts *PreloadConditionsIntTestSuite) TestPreloadCollection() { company := ts.createCompany("ditrit") seller1 := ts.createSeller("1", company) seller2 := ts.createSeller("2", company) @@ -675,8 +675,34 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadList() { ts.Nil(err) EqualList(&ts.Suite, []*models.Company{company}, entities) - // TODO tener el getter - EqualList(&ts.Suite, []models.Seller{*seller1, *seller2}, entities[0].Sellers) + companySellers, err := entities[0].GetSellers() + ts.Nil(err) + EqualList(&ts.Suite, []models.Seller{*seller1, *seller2}, companySellers) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadEmptyCollection() { + company := ts.createCompany("ditrit") + + entities, err := ts.crudCompanyService.GetEntities( + conditions.CompanyPreloadSellers(), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Company{company}, entities) + companySellers, err := entities[0].GetSellers() + ts.Nil(err) + EqualList(&ts.Suite, []models.Seller{}, companySellers) +} + +func (ts *PreloadConditionsIntTestSuite) TestNoPreloadCollection() { + company := ts.createCompany("ditrit") + + entities, err := ts.crudCompanyService.GetEntities() + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Company{company}, entities) + _, err = entities[0].GetSellers() + ts.ErrorIs(err, badorm.ErrRelationNotLoaded) } func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributes() { @@ -702,14 +728,15 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributes() { ts.Nil(err) EqualList(&ts.Suite, []*models.Company{company}, entities) - // TODO tener el getter - EqualList(&ts.Suite, []models.Seller{*seller1, *seller2}, entities[0].Sellers) + companySellers, err := entities[0].GetSellers() + ts.Nil(err) + EqualList(&ts.Suite, []models.Seller{*seller1, *seller2}, companySellers) - ts.True(pie.Any(entities[0].Sellers, func(seller models.Seller) bool { + ts.True(pie.Any(*entities[0].Sellers, func(seller models.Seller) bool { sellerUniversity, err := seller.GetUniversity() return err == nil && sellerUniversity.Equal(*university1) })) - ts.True(pie.Any(entities[0].Sellers, func(seller models.Seller) bool { + ts.True(pie.Any(*entities[0].Sellers, func(seller models.Seller) bool { sellerUniversity, err := seller.GetUniversity() return err == nil && sellerUniversity.Equal(*university2) })) @@ -757,26 +784,28 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadMultipleListsAndNestedAttrib return company.Equal(*company2) }) - // TODO tener el getter - EqualList(&ts.Suite, []models.Seller{*seller1, *seller2}, company1Loaded.Sellers) + company1Sellers, err := company1Loaded.GetSellers() + ts.Nil(err) + EqualList(&ts.Suite, []models.Seller{*seller1, *seller2}, company1Sellers) - ts.True(pie.Any(company1Loaded.Sellers, func(seller models.Seller) bool { + ts.True(pie.Any(*company1Loaded.Sellers, func(seller models.Seller) bool { sellerUniversity, err := seller.GetUniversity() return err == nil && sellerUniversity.Equal(*university1) })) - ts.True(pie.Any(company1Loaded.Sellers, func(seller models.Seller) bool { + ts.True(pie.Any(*company1Loaded.Sellers, func(seller models.Seller) bool { sellerUniversity, err := seller.GetUniversity() return err == nil && sellerUniversity.Equal(*university2) })) - // TODO tener el getter - EqualList(&ts.Suite, []models.Seller{*seller3, *seller4}, company2Loaded.Sellers) + company2Sellers, err := company2Loaded.GetSellers() + ts.Nil(err) + EqualList(&ts.Suite, []models.Seller{*seller3, *seller4}, company2Sellers) - ts.True(pie.Any(company2Loaded.Sellers, func(seller models.Seller) bool { + ts.True(pie.Any(*company2Loaded.Sellers, func(seller models.Seller) bool { sellerUniversity, err := seller.GetUniversity() return err == nil && sellerUniversity.Equal(*university1) })) - ts.True(pie.Any(company2Loaded.Sellers, func(seller models.Seller) bool { + ts.True(pie.Any(*company2Loaded.Sellers, func(seller models.Seller) bool { sellerUniversity, err := seller.GetUniversity() return err == nil && sellerUniversity.Equal(*university2) })) diff --git a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go index f8898541..35878cf2 100644 --- a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go +++ b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go @@ -13,6 +13,7 @@ const ( badORMVerifyStructLoaded = "VerifyStructLoaded" badORMVerifyPointerLoaded = "VerifyPointerLoaded" badORMVerifyPointerWithIDLoaded = "VerifyPointerWithIDLoaded" + badORMVerifyCollectionLoaded = "VerifyCollectionLoaded" ) type RelationGettersGenerator struct { @@ -86,26 +87,48 @@ func (generator RelationGettersGenerator) generateForField(field Field) jen.Code } func (generator RelationGettersGenerator) generateForPointer(field Field) jen.Code { - _, err := field.Type.BadORMModelStruct() - if err == nil { - // field is a pointer to BaDORM Model - fk, err := generator.objectType.GetFK(field) - if err != nil { - log.Logger.Debugf("unhandled: field is a pointer and object not has the fk: %s", field.Type) - return nil - } + switch fieldType := field.GetType().(type) { + case *types.Named: + _, err := field.Type.BadORMModelStruct() + if err == nil { + // field is a pointer to BaDORM Model + fk, err := generator.objectType.GetFK(field) + if err != nil { + log.Logger.Debugf("unhandled: field is a pointer and object not has the fk: %s", field.Type) + return nil + } - log.Logger.Debugf("Generating relation getter for type %q and field %s", generator.object.Name(), field.Name) + log.Logger.Debugf("Generating relation getter for type %q and field %s", generator.object.Name(), field.Name) - switch fk.GetType().(type) { - case *types.Named: - if fk.IsBadORMID() { - return generator.verifyPointerWithID(field) + switch fk.GetType().(type) { + case *types.Named: + if fk.IsBadORMID() { + return generator.verifyPointerWithID(field) + } + case *types.Pointer: + // the fk is a pointer + return generator.verifyPointer(field) } - case *types.Pointer: - // the fk is a pointer - return generator.verifyPointer(field) } + case *types.Slice: + return generator.generateForSlicePointer(field.ChangeType(fieldType.Elem())) + } + + return nil +} + +func (generator RelationGettersGenerator) generateForSlicePointer(field Field) jen.Code { + switch fieldType := field.GetType().(type) { + case *types.Named: + _, err := field.Type.BadORMModelStruct() + if err == nil { + // field is a pointer to a slice of BaDORM Model + return generator.verifyCollection(field) + } + case *types.Pointer: + return generator.generateForSlicePointer( + field.ChangeType(fieldType.Elem()), + ) } return nil @@ -119,6 +142,7 @@ func (generator RelationGettersGenerator) verifyStruct(field Field) *jen.Stateme return generator.verifyCommon( field, badORMVerifyStructLoaded, + jen.Op("*"), jen.Op("&").Id("m").Op(".").Id(field.Name), ) } @@ -131,22 +155,38 @@ func (generator RelationGettersGenerator) verifyPointerWithID(field Field) *jen. return generator.verifyPointerCommon(field, badORMVerifyPointerWithIDLoaded) } +func (generator RelationGettersGenerator) verifyCollection(field Field) jen.Code { + return generator.verifyCommon( + field, + badORMVerifyCollectionLoaded, + // TODO verificar que antes tanto para *[] como para *[]* + jen.Index(), + jen.Id("m").Op(".").Id(field.Name), + ) +} + func (generator RelationGettersGenerator) verifyPointerCommon(field Field, verifyFunc string) *jen.Statement { return generator.verifyCommon( field, verifyFunc, + jen.Op("*"), jen.Id("m").Op(".").Id(field.Name+"ID"), jen.Id("m").Op(".").Id(field.Name), ) } -func (generator RelationGettersGenerator) verifyCommon(field Field, verifyFunc string, callParams ...jen.Code) *jen.Statement { +func (generator RelationGettersGenerator) verifyCommon( + field Field, + verifyFunc string, + returnType *jen.Statement, + callParams ...jen.Code, +) *jen.Statement { return jen.Func().Parens( jen.Id("m").Id(generator.object.Name()), ).Id(getGetterName(field)).Params().Add( jen.Parens( jen.List( - jen.Op("*").Qual( + returnType.Qual( getRelativePackagePath( generator.object.Pkg().Name(), field.Type, From dca05b7fda67aa217f58c2b3eb0740a33af6773a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 11:17:14 +0200 Subject: [PATCH 406/467] verify that nested collection preloads not filter --- badorm/condition.go | 17 +++++++++++++---- testintegration/preload_conditions_test.go | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 792da1a1..2195c021 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -269,17 +269,14 @@ func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *gorm.DB, tabl } return query - // TODO se podria hacer que el join si el solo preload haga esto y a la verga, asi me ahorro el select, la table y eso - // return db.Joins("University") }, ), nil } // TODO doc func NewCollectionPreloadCondition[T1 Model, T2 Model](collectionField string, nestedPreloads []IJoinCondition[T2]) Condition[T1] { - // TODO verificar que no haga filtros? if pie.Any(nestedPreloads, func(nestedPreload IJoinCondition[T2]) bool { - return !nestedPreload.makesPreload() + return !nestedPreload.makesPreload() || nestedPreload.makesFilter() }) { return NewInvalidCondition[T1](ErrOnlyPreloadsAllowed) } @@ -341,6 +338,9 @@ type IJoinCondition[T Model] interface { // Returns true if this condition or any nested condition makes a preload makesPreload() bool + + // Returns true if the condition of nay nested condition applies a filter (has where conditions) + makesFilter() bool } // Condition that joins with other table @@ -368,6 +368,15 @@ func (condition JoinCondition[T1, T2]) makesPreload() bool { }) } +// Returns true if the condition of nay nested condition applies a filter (has where conditions) +func (condition JoinCondition[T1, T2]) makesFilter() bool { + whereConditions, joinConditions, _ := divideConditionsByType(condition.Conditions) + + return len(whereConditions) != 0 || pie.Any(joinConditions, func(cond IJoinCondition[T2]) bool { + return cond.makesFilter() + }) +} + // Applies a join between the tables of T1 and T2 // previousTableName is the name of the table of T1 // It also applies the nested conditions diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index 0df5de98..aef9897c 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -810,3 +810,24 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadMultipleListsAndNestedAttrib return err == nil && sellerUniversity.Equal(*university2) })) } + +func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributesWithFiltersReturnsError() { + _, err := ts.crudCompanyService.GetEntities( + conditions.CompanyPreloadSellers( + conditions.SellerUniversity( + conditions.UniversityPreloadAttributes, + conditions.UniversityId(badorm.Eq(badorm.NilUUID)), + ), + ), + ) + ts.ErrorIs(err, badorm.ErrOnlyPreloadsAllowed) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributesWithoutPreloadReturnsError() { + _, err := ts.crudCompanyService.GetEntities( + conditions.CompanyPreloadSellers( + conditions.SellerUniversity(), + ), + ) + ts.ErrorIs(err, badorm.ErrOnlyPreloadsAllowed) +} From f1e3118dedfcee66e20ecb7e33007e717e4fba1c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 11:27:31 +0200 Subject: [PATCH 407/467] fix lint --- .golangci.yml | 1 + badorm/condition.go | 4 +++- badorm/preload.go | 2 +- badorm/uuid.go | 2 +- testintegration/preload_conditions_test.go | 6 ++++-- tools/badctl/cmd/gen/conditions/condition.go | 4 ++-- .../badctl/cmd/gen/conditions/conditionsGenerator.go | 12 ++++++------ 7 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index fa94a7ec..7ab996a9 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -223,6 +223,7 @@ issues: - goconst - noctx - gomnd + - unparam # We need to use the deprecated module since the jsonpb replacement is not backwards compatible. - linters: - staticcheck diff --git a/badorm/condition.go b/badorm/condition.go index 2195c021..c54d8667 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -247,7 +247,7 @@ func (condition CollectionPreloadCondition[T1, T2]) interfaceVerificationMethod( // that an object is of type Condition[T1] } -func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { +func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *gorm.DB, _ Table) (*gorm.DB, error) { if len(condition.NestedPreloads) == 0 { return query.Preload(condition.CollectionField), nil } @@ -369,6 +369,8 @@ func (condition JoinCondition[T1, T2]) makesPreload() bool { } // Returns true if the condition of nay nested condition applies a filter (has where conditions) +// +//nolint:unused // is used func (condition JoinCondition[T1, T2]) makesFilter() bool { whereConditions, joinConditions, _ := divideConditionsByType(condition.Conditions) diff --git a/badorm/preload.go b/badorm/preload.go index eefca54e..4dab56cf 100644 --- a/badorm/preload.go +++ b/badorm/preload.go @@ -2,7 +2,7 @@ package badorm import "errors" -var ErrRelationNotLoaded = errors.New("Relation not loaded") +var ErrRelationNotLoaded = errors.New("relation not loaded") func VerifyStructLoaded[T Model](toVerify *T) (*T, error) { if toVerify == nil || !(*toVerify).IsLoaded() { diff --git a/badorm/uuid.go b/badorm/uuid.go index 60ab4bf7..ffe0ec34 100644 --- a/badorm/uuid.go +++ b/badorm/uuid.go @@ -85,7 +85,7 @@ func (id UUID) GormValue(_ context.Context, db *gorm.DB) clause.Expr { case "mysql", "sqlserver": binary, err := id.MarshalBinary() if err != nil { - db.AddError(err) + _ = db.AddError(err) return clause.Expr{} } diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index aef9897c..a630a589 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -788,12 +788,14 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadMultipleListsAndNestedAttrib ts.Nil(err) EqualList(&ts.Suite, []models.Seller{*seller1, *seller2}, company1Sellers) + var sellerUniversity *models.University + ts.True(pie.Any(*company1Loaded.Sellers, func(seller models.Seller) bool { - sellerUniversity, err := seller.GetUniversity() + sellerUniversity, err = seller.GetUniversity() return err == nil && sellerUniversity.Equal(*university1) })) ts.True(pie.Any(*company1Loaded.Sellers, func(seller models.Seller) bool { - sellerUniversity, err := seller.GetUniversity() + sellerUniversity, err = seller.GetUniversity() return err == nil && sellerUniversity.Equal(*university2) })) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index bd68b561..504c6c63 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -190,7 +190,7 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { if constantFieldIdentifier, ok := constantFieldIdentifiers[field.Name]; ok { fieldIdentifier = constantFieldIdentifier } else { - fieldIdentifier = condition.createFieldIdentifier(objectType, field, conditionName) + fieldIdentifier = condition.createFieldIdentifier(field, conditionName) } condition.codes = append( @@ -214,7 +214,7 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { // create a variable containing the definition of the field identifier // to use it in the where condition and in the preload condition -func (condition *Condition) createFieldIdentifier(objectType Type, field Field, conditionName string) *jen.Statement { +func (condition *Condition) createFieldIdentifier(field Field, conditionName string) *jen.Statement { fieldIdentifierValues := jen.Dict{} columnName := field.getColumnName() diff --git a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go index 8edcecc6..097571c9 100644 --- a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go +++ b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go @@ -10,20 +10,20 @@ import ( const badORMNewPreloadCondition = "NewPreloadCondition" -type ConditionsGenerator struct { +type CodeConditionsGenerator struct { object types.Object objectType Type } -func NewConditionsGenerator(object types.Object) *ConditionsGenerator { - return &ConditionsGenerator{ +func NewConditionsGenerator(object types.Object) *CodeConditionsGenerator { + return &CodeConditionsGenerator{ object: object, objectType: Type{object.Type()}, } } // Add conditions for an object in the file -func (cg ConditionsGenerator) Into(file *File) error { +func (cg CodeConditionsGenerator) Into(file *File) error { fields, err := getFields(cg.objectType) if err != nil { return err @@ -37,7 +37,7 @@ func (cg ConditionsGenerator) Into(file *File) error { } // Add one condition for each field of the object -func (cg ConditionsGenerator) addConditionsForEachField(file *File, fields []Field) { +func (cg CodeConditionsGenerator) addConditionsForEachField(file *File, fields []Field) { conditions := cg.ForEachField(file, fields) objectName := cg.object.Name() @@ -93,7 +93,7 @@ func getPreloadAttributesName(objectName string) string { } // Generate the conditions for each of the object's fields -func (cg ConditionsGenerator) ForEachField(file *File, fields []Field) []Condition { +func (cg CodeConditionsGenerator) ForEachField(file *File, fields []Field) []Condition { conditions := []Condition{} for _, field := range fields { From dd981ecebee6dac0060cce7f11f0e8e8438d9d5b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 12:29:30 +0200 Subject: [PATCH 408/467] update badctl unit tests results --- .gitignore | 3 +- tools/badctl/cmd/gen/conditions/file.go | 19 ++++++-- tools/badctl/cmd/gen/conditions/main.go | 2 + tools/badctl/cmd/gen/conditions/main_test.go | 40 +++++++++++----- .../conditions/tests/results/basicpointers.go | 3 +- .../conditions/tests/results/basicslices.go | 3 +- .../tests/results/basicslicespointer.go | 3 +- .../conditions/tests/results/basictypes.go | 3 +- .../tests/results/belongsto_owned.go | 15 +++--- .../tests/results/belongsto_owner.go | 3 +- .../tests/results/columndefinition.go | 3 +- .../conditions/tests/results/customtype.go | 3 +- .../conditions/tests/results/goembedded.go | 7 +-- .../conditions/tests/results/gormembedded.go | 7 +-- .../tests/results/hasmany_company.go | 12 ++--- .../tests/results/hasmany_seller.go | 3 +- .../conditions/tests/results/hasone_city.go | 3 +- .../tests/results/hasone_country.go | 23 ++++------ .../tests/results/multiplepackage_package1.go | 23 ++++------ .../tests/results/multiplepackage_package2.go | 46 +++++++++++++++++++ ...gnkey.go => overrideforeignkey_bicycle.go} | 15 +++--- .../results/overrideforeignkey_person.go | 37 +++++++++++++++ .../overrideforeignkeyinverse_credit_card.go | 46 +++++++++++++++++++ ...e.go => overrideforeignkeyinverse_user.go} | 23 ++++------ .../tests/results/overridereferences_brand.go | 46 +++++++++++++++++++ ...erences.go => overridereferences_phone.go} | 15 +++--- ... => overridereferencesinverse_computer.go} | 23 ++++------ .../overridereferencesinverse_processor.go | 46 +++++++++++++++++++ .../tests/results/selfreferential.go | 15 +++--- .../gen/conditions/tests/results/uintmodel.go | 7 +-- .../gen/conditions/tests/results/uuidmodel.go | 3 +- tools/badctl/cmd/utils/file.go | 7 +++ 32 files changed, 382 insertions(+), 125 deletions(-) create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go rename tools/badctl/cmd/gen/conditions/tests/results/{overrideforeignkey.go => overrideforeignkey_bicycle.go} (77%) create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go rename tools/badctl/cmd/gen/conditions/tests/results/{overrideforeignkeyinverse.go => overrideforeignkeyinverse_user.go} (70%) create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go rename tools/badctl/cmd/gen/conditions/tests/results/{overridereferences.go => overridereferences_phone.go} (77%) rename tools/badctl/cmd/gen/conditions/tests/results/{overridereferencesinverse.go => overridereferencesinverse_computer.go} (73%) create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go diff --git a/.gitignore b/.gitignore index 48935fc3..57580cc4 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,5 @@ badctl !tools/badctl/ # test results -tools/badctl/cmd/gen/conditions/*_conditions.go \ No newline at end of file +tools/badctl/cmd/gen/conditions/*_conditions.go +tools/badctl/cmd/gen/conditions/tests/**/badorm.go \ No newline at end of file diff --git a/tools/badctl/cmd/gen/conditions/file.go b/tools/badctl/cmd/gen/conditions/file.go index baf622f0..ce10aadc 100644 --- a/tools/badctl/cmd/gen/conditions/file.go +++ b/tools/badctl/cmd/gen/conditions/file.go @@ -7,9 +7,10 @@ import ( ) type File struct { - destPkg string - jenFile *jen.File - name string + destPkg string + jenFile *jen.File + name string + codesAdded bool } func NewFile(destPkg, name string) *File { @@ -26,7 +27,11 @@ func NewFile(destPkg, name string) *File { } } -func (file File) Add(codes ...jen.Code) { +func (file *File) Add(codes ...jen.Code) { + if len(codes) > 0 { + file.codesAdded = true + } + for _, code := range codes { file.jenFile.Add(code) } @@ -34,5 +39,9 @@ func (file File) Add(codes ...jen.Code) { // Write generated file func (file File) Save() error { - return file.jenFile.Save(file.name) + if file.codesAdded { + return file.jenFile.Save(file.name) + } + + return nil } diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 33523d29..45ca4b53 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -61,6 +61,8 @@ func generateConditions(_ *cobra.Command, args []string) { } } +// TODO BasicSlicesPreloadRelations solo si tiene alguna relacion + // Generates a file with conditions for each BaDORM model in the package func generateConditionsForPkg(destPkg string, pkgPath string, pkg *packages.Package) { log.Logger.Infof("Generating conditions for types in package %q", pkg.Types.Name()) diff --git a/tools/badctl/cmd/gen/conditions/main_test.go b/tools/badctl/cmd/gen/conditions/main_test.go index 344c351f..25b567ec 100644 --- a/tools/badctl/cmd/gen/conditions/main_test.go +++ b/tools/badctl/cmd/gen/conditions/main_test.go @@ -18,56 +18,73 @@ func TestUIntModel(t *testing.T) { doTest(t, "./tests/uintmodel", []Comparison{ {Have: "uint_model_conditions.go", Expected: "./tests/results/uintmodel.go"}, }) + utils.CheckFileNotExists(t, "./tests/uintmodel/badorm.go") } func TestUUIDModel(t *testing.T) { doTest(t, "./tests/uuidmodel", []Comparison{ {Have: "uuid_model_conditions.go", Expected: "./tests/results/uuidmodel.go"}, }) + utils.CheckFileNotExists(t, "./tests/uuidmodel/badorm.go") } func TestBasicTypes(t *testing.T) { doTest(t, "./tests/basictypes", []Comparison{ {Have: "basic_types_conditions.go", Expected: "./tests/results/basictypes.go"}, }) + utils.CheckFileNotExists(t, "./tests/basictypes/badorm.go") } func TestBasicPointers(t *testing.T) { doTest(t, "./tests/basicpointers", []Comparison{ {Have: "basic_pointers_conditions.go", Expected: "./tests/results/basicpointers.go"}, }) + utils.CheckFileNotExists(t, "./tests/basicpointers/badorm.go") } func TestBasicSlices(t *testing.T) { doTest(t, "./tests/basicslices", []Comparison{ {Have: "basic_slices_conditions.go", Expected: "./tests/results/basicslices.go"}, }) + utils.CheckFileNotExists(t, "./tests/basicslices/badorm.go") } func TestBasicSlicesPointer(t *testing.T) { doTest(t, "./tests/basicslicespointer", []Comparison{ {Have: "basic_slices_pointer_conditions.go", Expected: "./tests/results/basicslicespointer.go"}, }) + utils.CheckFileNotExists(t, "./tests/basicslicespointer/badorm.go") } func TestGoEmbedded(t *testing.T) { doTest(t, "./tests/goembedded", []Comparison{ {Have: "go_embedded_conditions.go", Expected: "./tests/results/goembedded.go"}, }) + utils.CheckFileNotExists(t, "./tests/goembedded/badorm.go") } func TestGormEmbedded(t *testing.T) { doTest(t, "./tests/gormembedded", []Comparison{ {Have: "gorm_embedded_conditions.go", Expected: "./tests/results/gormembedded.go"}, }) + utils.CheckFileNotExists(t, "./tests/gormembedded/badorm.go") } func TestCustomType(t *testing.T) { doTest(t, "./tests/customtype", []Comparison{ {Have: "custom_type_conditions.go", Expected: "./tests/results/customtype.go"}, }) + utils.CheckFileNotExists(t, "./tests/customtype/badorm.go") } +func TestColumnDefinition(t *testing.T) { + doTest(t, "./tests/columndefinition", []Comparison{ + {Have: "column_definition_conditions.go", Expected: "./tests/results/columndefinition.go"}, + }) + utils.CheckFileNotExists(t, "./tests/columndefinition/badorm.go") +} + +// TODO verificacion de los badorm relation getters func TestBelongsTo(t *testing.T) { doTest(t, "./tests/belongsto", []Comparison{ {Have: "owner_conditions.go", Expected: "./tests/results/belongsto_owner.go"}, @@ -96,41 +113,40 @@ func TestSelfReferential(t *testing.T) { } func TestMultiplePackage(t *testing.T) { + // TODO hacer los dos paquetes a la vez porque sino el badorm se rompe doTest(t, "./tests/multiplepackage/package1", []Comparison{ {Have: "package1_conditions.go", Expected: "./tests/results/multiplepackage_package1.go"}, }) -} - -func TestColumnDefinition(t *testing.T) { - doTest(t, "./tests/columndefinition", []Comparison{ - {Have: "column_definition_conditions.go", Expected: "./tests/results/columndefinition.go"}, + doTest(t, "./tests/multiplepackage/package2", []Comparison{ + {Have: "package2_conditions.go", Expected: "./tests/results/multiplepackage_package2.go"}, }) } func TestOverrideForeignKey(t *testing.T) { doTest(t, "./tests/overrideforeignkey", []Comparison{ - {Have: "bicycle_conditions.go", Expected: "./tests/results/overrideforeignkey.go"}, + {Have: "bicycle_conditions.go", Expected: "./tests/results/overrideforeignkey_bicycle.go"}, + {Have: "person_conditions.go", Expected: "./tests/results/overrideforeignkey_person.go"}, }) - utils.RemoveFile("person_conditions.go") } func TestOverrideReferences(t *testing.T) { doTest(t, "./tests/overridereferences", []Comparison{ - {Have: "phone_conditions.go", Expected: "./tests/results/overridereferences.go"}, + {Have: "phone_conditions.go", Expected: "./tests/results/overridereferences_phone.go"}, + {Have: "brand_conditions.go", Expected: "./tests/results/overridereferences_brand.go"}, }) - utils.RemoveFile("brand_conditions.go") } func TestOverrideForeignKeyInverse(t *testing.T) { doTest(t, "./tests/overrideforeignkeyinverse", []Comparison{ - {Have: "user_conditions.go", Expected: "./tests/results/overrideforeignkeyinverse.go"}, + {Have: "user_conditions.go", Expected: "./tests/results/overrideforeignkeyinverse_user.go"}, + {Have: "credit_card_conditions.go", Expected: "./tests/results/overrideforeignkeyinverse_credit_card.go"}, }) - utils.RemoveFile("credit_card_conditions.go") } func TestOverrideReferencesInverse(t *testing.T) { doTest(t, "./tests/overridereferencesinverse", []Comparison{ - {Have: "computer_conditions.go", Expected: "./tests/results/overridereferencesinverse.go"}, + {Have: "computer_conditions.go", Expected: "./tests/results/overridereferencesinverse_computer.go"}, + {Have: "processor_conditions.go", Expected: "./tests/results/overridereferencesinverse_processor.go"}, }) utils.RemoveFile("processor_conditions.go") } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go index 4a5ad493..18e1594f 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go @@ -195,4 +195,5 @@ func BasicPointersByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basi } } -var BasicPointersPreload = badorm.NewPreloadCondition[basicpointers.BasicPointers](basicPointersBoolFieldID, basicPointersIntFieldID, basicPointersInt8FieldID, basicPointersInt16FieldID, basicPointersInt32FieldID, basicPointersInt64FieldID, basicPointersUIntFieldID, basicPointersUInt8FieldID, basicPointersUInt16FieldID, basicPointersUInt32FieldID, basicPointersUInt64FieldID, basicPointersUIntptrFieldID, basicPointersFloat32FieldID, basicPointersFloat64FieldID, basicPointersComplex64FieldID, basicPointersComplex128FieldID, basicPointersStringFieldID, basicPointersByteFieldID) +var BasicPointersPreloadAttributes = badorm.NewPreloadCondition[basicpointers.BasicPointers](basicPointersBoolFieldID, basicPointersIntFieldID, basicPointersInt8FieldID, basicPointersInt16FieldID, basicPointersInt32FieldID, basicPointersInt64FieldID, basicPointersUIntFieldID, basicPointersUInt8FieldID, basicPointersUInt16FieldID, basicPointersUInt32FieldID, basicPointersUInt64FieldID, basicPointersUIntptrFieldID, basicPointersFloat32FieldID, basicPointersFloat64FieldID, basicPointersComplex64FieldID, basicPointersComplex128FieldID, basicPointersStringFieldID, basicPointersByteFieldID) +var BasicPointersPreloadRelations = []badorm.Condition[basicpointers.BasicPointers]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go index 19fecec5..b5738de2 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go @@ -195,4 +195,5 @@ func BasicSlicesByte(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basi } } -var BasicSlicesPreload = badorm.NewPreloadCondition[basicslices.BasicSlices](basicSlicesBoolFieldID, basicSlicesIntFieldID, basicSlicesInt8FieldID, basicSlicesInt16FieldID, basicSlicesInt32FieldID, basicSlicesInt64FieldID, basicSlicesUIntFieldID, basicSlicesUInt8FieldID, basicSlicesUInt16FieldID, basicSlicesUInt32FieldID, basicSlicesUInt64FieldID, basicSlicesUIntptrFieldID, basicSlicesFloat32FieldID, basicSlicesFloat64FieldID, basicSlicesComplex64FieldID, basicSlicesComplex128FieldID, basicSlicesStringFieldID, basicSlicesByteFieldID) +var BasicSlicesPreloadAttributes = badorm.NewPreloadCondition[basicslices.BasicSlices](basicSlicesBoolFieldID, basicSlicesIntFieldID, basicSlicesInt8FieldID, basicSlicesInt16FieldID, basicSlicesInt32FieldID, basicSlicesInt64FieldID, basicSlicesUIntFieldID, basicSlicesUInt8FieldID, basicSlicesUInt16FieldID, basicSlicesUInt32FieldID, basicSlicesUInt64FieldID, basicSlicesUIntptrFieldID, basicSlicesFloat32FieldID, basicSlicesFloat64FieldID, basicSlicesComplex64FieldID, basicSlicesComplex128FieldID, basicSlicesStringFieldID, basicSlicesByteFieldID) +var BasicSlicesPreloadRelations = []badorm.Condition[basicslices.BasicSlices]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go index 017fe37b..1e1ae696 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go @@ -195,4 +195,5 @@ func BasicSlicesPointerByte(expr badorm.Expression[[]uint8]) badorm.WhereConditi } } -var BasicSlicesPointerPreload = badorm.NewPreloadCondition[basicslicespointer.BasicSlicesPointer](basicSlicesPointerBoolFieldID, basicSlicesPointerIntFieldID, basicSlicesPointerInt8FieldID, basicSlicesPointerInt16FieldID, basicSlicesPointerInt32FieldID, basicSlicesPointerInt64FieldID, basicSlicesPointerUIntFieldID, basicSlicesPointerUInt8FieldID, basicSlicesPointerUInt16FieldID, basicSlicesPointerUInt32FieldID, basicSlicesPointerUInt64FieldID, basicSlicesPointerUIntptrFieldID, basicSlicesPointerFloat32FieldID, basicSlicesPointerFloat64FieldID, basicSlicesPointerComplex64FieldID, basicSlicesPointerComplex128FieldID, basicSlicesPointerStringFieldID, basicSlicesPointerByteFieldID) +var BasicSlicesPointerPreloadAttributes = badorm.NewPreloadCondition[basicslicespointer.BasicSlicesPointer](basicSlicesPointerBoolFieldID, basicSlicesPointerIntFieldID, basicSlicesPointerInt8FieldID, basicSlicesPointerInt16FieldID, basicSlicesPointerInt32FieldID, basicSlicesPointerInt64FieldID, basicSlicesPointerUIntFieldID, basicSlicesPointerUInt8FieldID, basicSlicesPointerUInt16FieldID, basicSlicesPointerUInt32FieldID, basicSlicesPointerUInt64FieldID, basicSlicesPointerUIntptrFieldID, basicSlicesPointerFloat32FieldID, basicSlicesPointerFloat64FieldID, basicSlicesPointerComplex64FieldID, basicSlicesPointerComplex128FieldID, basicSlicesPointerStringFieldID, basicSlicesPointerByteFieldID) +var BasicSlicesPointerPreloadRelations = []badorm.Condition[basicslicespointer.BasicSlicesPointer]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go index e28800bf..4c007428 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go @@ -195,4 +195,5 @@ func BasicTypesByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basicty } } -var BasicTypesPreload = badorm.NewPreloadCondition[basictypes.BasicTypes](basicTypesBoolFieldID, basicTypesIntFieldID, basicTypesInt8FieldID, basicTypesInt16FieldID, basicTypesInt32FieldID, basicTypesInt64FieldID, basicTypesUIntFieldID, basicTypesUInt8FieldID, basicTypesUInt16FieldID, basicTypesUInt32FieldID, basicTypesUInt64FieldID, basicTypesUIntptrFieldID, basicTypesFloat32FieldID, basicTypesFloat64FieldID, basicTypesComplex64FieldID, basicTypesComplex128FieldID, basicTypesStringFieldID, basicTypesByteFieldID) +var BasicTypesPreloadAttributes = badorm.NewPreloadCondition[basictypes.BasicTypes](basicTypesBoolFieldID, basicTypesIntFieldID, basicTypesInt8FieldID, basicTypesInt16FieldID, basicTypesInt32FieldID, basicTypesInt64FieldID, basicTypesUIntFieldID, basicTypesUInt8FieldID, basicTypesUInt16FieldID, basicTypesUInt32FieldID, basicTypesUInt64FieldID, basicTypesUIntptrFieldID, basicTypesFloat32FieldID, basicTypesFloat64FieldID, basicTypesComplex64FieldID, basicTypesComplex128FieldID, basicTypesStringFieldID, basicTypesByteFieldID) +var BasicTypesPreloadRelations = []badorm.Condition[basictypes.BasicTypes]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go index a465afa4..92039afc 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go @@ -32,15 +32,17 @@ func OwnedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio FieldIdentifier: badorm.DeletedAtFieldID, } } -func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.Condition[belongsto.Owned] { +func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.IJoinCondition[belongsto.Owned] { return badorm.JoinCondition[belongsto.Owned, belongsto.Owner]{ - Conditions: conditions, - RelationField: "Owner", - T1Field: "OwnerID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Owner", + T1Field: "OwnerID", + T1PreloadCondition: OwnedPreloadAttributes, + T2Field: "ID", } } +var OwnedPreloadOwner = OwnedOwner(OwnerPreloadAttributes) var ownedOwnerIdFieldID = badorm.FieldIdentifier{Field: "OwnerID"} func OwnedOwnerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { @@ -50,4 +52,5 @@ func OwnedOwnerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[bel } } -var OwnedPreload = badorm.NewPreloadCondition[belongsto.Owned](ownedOwnerIdFieldID) +var OwnedPreloadAttributes = badorm.NewPreloadCondition[belongsto.Owned](ownedOwnerIdFieldID) +var OwnedPreloadRelations = []badorm.Condition[belongsto.Owned]{OwnedPreloadOwner} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go index f4a3cedd..739eb26e 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go @@ -33,4 +33,5 @@ func OwnerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio } } -var OwnerPreload = badorm.NewPreloadCondition[belongsto.Owner]() +var OwnerPreloadAttributes = badorm.NewPreloadCondition[belongsto.Owner]() +var OwnerPreloadRelations = []badorm.Condition[belongsto.Owner]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go index 3e3dc6ed..ffe5bc62 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go @@ -42,4 +42,5 @@ func ColumnDefinitionString(expr badorm.Expression[string]) badorm.WhereConditio } } -var ColumnDefinitionPreload = badorm.NewPreloadCondition[columndefinition.ColumnDefinition](columnDefinitionStringFieldID) +var ColumnDefinitionPreloadAttributes = badorm.NewPreloadCondition[columndefinition.ColumnDefinition](columnDefinitionStringFieldID) +var ColumnDefinitionPreloadRelations = []badorm.Condition[columndefinition.ColumnDefinition]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go index 1bcafd23..b74e19ad 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go @@ -42,4 +42,5 @@ func CustomTypeCustom(expr badorm.Expression[customtype.MultiString]) badorm.Whe } } -var CustomTypePreload = badorm.NewPreloadCondition[customtype.CustomType](customTypeCustomFieldID) +var CustomTypePreloadAttributes = badorm.NewPreloadCondition[customtype.CustomType](customTypeCustomFieldID) +var CustomTypePreloadRelations = []badorm.Condition[customtype.CustomType]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go index e5d220b7..5497150f 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go @@ -8,8 +8,8 @@ import ( "time" ) -func GoEmbeddedId(expr badorm.Expression[uint]) badorm.WhereCondition[goembedded.GoEmbedded] { - return badorm.FieldCondition[goembedded.GoEmbedded, uint]{ +func GoEmbeddedId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[goembedded.GoEmbedded] { + return badorm.FieldCondition[goembedded.GoEmbedded, badorm.UIntID]{ Expression: expr, FieldIdentifier: badorm.IDFieldID, } @@ -51,4 +51,5 @@ func GoEmbeddedToBeEmbeddedInt(expr badorm.Expression[int]) badorm.WhereConditio } } -var GoEmbeddedPreload = badorm.NewPreloadCondition[goembedded.GoEmbedded](goEmbeddedIntFieldID, goEmbeddedToBeEmbeddedIntFieldID) +var GoEmbeddedPreloadAttributes = badorm.NewPreloadCondition[goembedded.GoEmbedded](goEmbeddedIntFieldID, goEmbeddedToBeEmbeddedIntFieldID) +var GoEmbeddedPreloadRelations = []badorm.Condition[goembedded.GoEmbedded]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go index d2b55252..30c11c3f 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go @@ -8,8 +8,8 @@ import ( "time" ) -func GormEmbeddedId(expr badorm.Expression[uint]) badorm.WhereCondition[gormembedded.GormEmbedded] { - return badorm.FieldCondition[gormembedded.GormEmbedded, uint]{ +func GormEmbeddedId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[gormembedded.GormEmbedded] { + return badorm.FieldCondition[gormembedded.GormEmbedded, badorm.UIntID]{ Expression: expr, FieldIdentifier: badorm.IDFieldID, } @@ -63,4 +63,5 @@ func GormEmbeddedGormEmbeddedNoPrefixInt(expr badorm.Expression[int]) badorm.Whe } } -var GormEmbeddedPreload = badorm.NewPreloadCondition[gormembedded.GormEmbedded](gormEmbeddedIntFieldID, gormEmbeddedGormEmbeddedIntFieldID, gormEmbeddedGormEmbeddedNoPrefixIntFieldID) +var GormEmbeddedPreloadAttributes = badorm.NewPreloadCondition[gormembedded.GormEmbedded](gormEmbeddedIntFieldID, gormEmbeddedGormEmbeddedIntFieldID, gormEmbeddedGormEmbeddedNoPrefixIntFieldID) +var GormEmbeddedPreloadRelations = []badorm.Condition[gormembedded.GormEmbedded]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go index 5ae4ce2a..9ce387ec 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go @@ -32,13 +32,9 @@ func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit FieldIdentifier: badorm.DeletedAtFieldID, } } -func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.Condition[hasmany.Seller] { - return badorm.JoinCondition[hasmany.Seller, hasmany.Company]{ - Conditions: conditions, - RelationField: "Company", - T1Field: "CompanyID", - T2Field: "ID", - } +func CompanyPreloadSellers(nestedPreloads ...badorm.IJoinCondition[hasmany.Seller]) badorm.Condition[hasmany.Company] { + return badorm.NewCollectionPreloadCondition[hasmany.Company, hasmany.Seller]("Sellers", nestedPreloads) } -var CompanyPreload = badorm.NewPreloadCondition[hasmany.Company]() +var CompanyPreloadAttributes = badorm.NewPreloadCondition[hasmany.Company]() +var CompanyPreloadRelations = []badorm.Condition[hasmany.Company]{CompanyPreloadSellers()} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go index e56ea593..e5a17cfa 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go @@ -42,4 +42,5 @@ func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[ } } -var SellerPreload = badorm.NewPreloadCondition[hasmany.Seller](sellerCompanyIdFieldID) +var SellerPreloadAttributes = badorm.NewPreloadCondition[hasmany.Seller](sellerCompanyIdFieldID) +var SellerPreloadRelations = []badorm.Condition[hasmany.Seller]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go index 35b234fb..00ae766a 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go @@ -42,4 +42,5 @@ func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[ha } } -var CityPreload = badorm.NewPreloadCondition[hasone.City](cityCountryIdFieldID) +var CityPreloadAttributes = badorm.NewPreloadCondition[hasone.City](cityCountryIdFieldID) +var CityPreloadRelations = []badorm.Condition[hasone.City]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go index efcdc955..c834823d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go @@ -32,21 +32,16 @@ func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit FieldIdentifier: badorm.DeletedAtFieldID, } } -func CountryCapital(conditions ...badorm.Condition[hasone.City]) badorm.Condition[hasone.Country] { +func CountryCapital(conditions ...badorm.Condition[hasone.City]) badorm.IJoinCondition[hasone.Country] { return badorm.JoinCondition[hasone.Country, hasone.City]{ - Conditions: conditions, - RelationField: "Capital", - T1Field: "ID", - T2Field: "CountryID", - } -} -func CityCountry(conditions ...badorm.Condition[hasone.Country]) badorm.Condition[hasone.City] { - return badorm.JoinCondition[hasone.City, hasone.Country]{ - Conditions: conditions, - RelationField: "Country", - T1Field: "CountryID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Capital", + T1Field: "ID", + T1PreloadCondition: CountryPreloadAttributes, + T2Field: "CountryID", } } -var CountryPreload = badorm.NewPreloadCondition[hasone.Country]() +var CountryPreloadCapital = CountryCapital(CityPreloadAttributes) +var CountryPreloadAttributes = badorm.NewPreloadCondition[hasone.Country]() +var CountryPreloadRelations = []badorm.Condition[hasone.Country]{CountryPreloadCapital} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go index bac3e1a4..965f395b 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go @@ -33,21 +33,16 @@ func Package1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondi FieldIdentifier: badorm.DeletedAtFieldID, } } -func Package1Package2(conditions ...badorm.Condition[package2.Package2]) badorm.Condition[package1.Package1] { +func Package1Package2(conditions ...badorm.Condition[package2.Package2]) badorm.IJoinCondition[package1.Package1] { return badorm.JoinCondition[package1.Package1, package2.Package2]{ - Conditions: conditions, - RelationField: "Package2", - T1Field: "ID", - T2Field: "Package1ID", - } -} -func Package2Package1(conditions ...badorm.Condition[package1.Package1]) badorm.Condition[package2.Package2] { - return badorm.JoinCondition[package2.Package2, package1.Package1]{ - Conditions: conditions, - RelationField: "Package1", - T1Field: "Package1ID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Package2", + T1Field: "ID", + T1PreloadCondition: Package1PreloadAttributes, + T2Field: "Package1ID", } } -var Package1Preload = badorm.NewPreloadCondition[package1.Package1]() +var Package1PreloadPackage2 = Package1Package2(Package2PreloadAttributes) +var Package1PreloadAttributes = badorm.NewPreloadCondition[package1.Package1]() +var Package1PreloadRelations = []badorm.Condition[package1.Package1]{Package1PreloadPackage2} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go new file mode 100644 index 00000000..13a1ac25 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go @@ -0,0 +1,46 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + package2 "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package2" + gorm "gorm.io/gorm" + "time" +) + +func Package2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[package2.Package2] { + return badorm.FieldCondition[package2.Package2, badorm.UUID]{ + Expression: expr, + FieldIdentifier: badorm.IDFieldID, + } +} +func Package2CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[package2.Package2] { + return badorm.FieldCondition[package2.Package2, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, + } +} +func Package2UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[package2.Package2] { + return badorm.FieldCondition[package2.Package2, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, + } +} +func Package2DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[package2.Package2] { + return badorm.FieldCondition[package2.Package2, gorm.DeletedAt]{ + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, + } +} + +var package2Package1IdFieldID = badorm.FieldIdentifier{Field: "Package1ID"} + +func Package2Package1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[package2.Package2] { + return badorm.FieldCondition[package2.Package2, badorm.UUID]{ + Expression: expr, + FieldIdentifier: package2Package1IdFieldID, + } +} + +var Package2PreloadAttributes = badorm.NewPreloadCondition[package2.Package2](package2Package1IdFieldID) +var Package2PreloadRelations = []badorm.Condition[package2.Package2]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_bicycle.go similarity index 77% rename from tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go rename to tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_bicycle.go index d628a916..6b0139c6 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_bicycle.go @@ -32,15 +32,17 @@ func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit FieldIdentifier: badorm.DeletedAtFieldID, } } -func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) badorm.Condition[overrideforeignkey.Bicycle] { +func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) badorm.IJoinCondition[overrideforeignkey.Bicycle] { return badorm.JoinCondition[overrideforeignkey.Bicycle, overrideforeignkey.Person]{ - Conditions: conditions, - RelationField: "Owner", - T1Field: "OwnerSomethingID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Owner", + T1Field: "OwnerSomethingID", + T1PreloadCondition: BicyclePreloadAttributes, + T2Field: "ID", } } +var BicyclePreloadOwner = BicycleOwner(PersonPreloadAttributes) var bicycleOwnerSomethingIdFieldID = badorm.FieldIdentifier{Field: "OwnerSomethingID"} func BicycleOwnerSomethingId(expr badorm.Expression[string]) badorm.WhereCondition[overrideforeignkey.Bicycle] { @@ -50,4 +52,5 @@ func BicycleOwnerSomethingId(expr badorm.Expression[string]) badorm.WhereConditi } } -var BicyclePreload = badorm.NewPreloadCondition[overrideforeignkey.Bicycle](bicycleOwnerSomethingIdFieldID) +var BicyclePreloadAttributes = badorm.NewPreloadCondition[overrideforeignkey.Bicycle](bicycleOwnerSomethingIdFieldID) +var BicyclePreloadRelations = []badorm.Condition[overrideforeignkey.Bicycle]{BicyclePreloadOwner} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go new file mode 100644 index 00000000..50021ed9 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go @@ -0,0 +1,37 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + overrideforeignkey "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overrideforeignkey" + gorm "gorm.io/gorm" + "time" +) + +func PersonId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkey.Person] { + return badorm.FieldCondition[overrideforeignkey.Person, badorm.UUID]{ + Expression: expr, + FieldIdentifier: badorm.IDFieldID, + } +} +func PersonCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkey.Person] { + return badorm.FieldCondition[overrideforeignkey.Person, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, + } +} +func PersonUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkey.Person] { + return badorm.FieldCondition[overrideforeignkey.Person, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, + } +} +func PersonDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkey.Person] { + return badorm.FieldCondition[overrideforeignkey.Person, gorm.DeletedAt]{ + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, + } +} + +var PersonPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkey.Person]() +var PersonPreloadRelations = []badorm.Condition[overrideforeignkey.Person]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go new file mode 100644 index 00000000..50903aa6 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go @@ -0,0 +1,46 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + overrideforeignkeyinverse "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse" + gorm "gorm.io/gorm" + "time" +) + +func CreditCardId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { + return badorm.FieldCondition[overrideforeignkeyinverse.CreditCard, badorm.UUID]{ + Expression: expr, + FieldIdentifier: badorm.IDFieldID, + } +} +func CreditCardCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { + return badorm.FieldCondition[overrideforeignkeyinverse.CreditCard, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, + } +} +func CreditCardUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { + return badorm.FieldCondition[overrideforeignkeyinverse.CreditCard, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, + } +} +func CreditCardDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { + return badorm.FieldCondition[overrideforeignkeyinverse.CreditCard, gorm.DeletedAt]{ + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, + } +} + +var creditCardUserReferenceFieldID = badorm.FieldIdentifier{Field: "UserReference"} + +func CreditCardUserReference(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { + return badorm.FieldCondition[overrideforeignkeyinverse.CreditCard, badorm.UUID]{ + Expression: expr, + FieldIdentifier: creditCardUserReferenceFieldID, + } +} + +var CreditCardPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkeyinverse.CreditCard](creditCardUserReferenceFieldID) +var CreditCardPreloadRelations = []badorm.Condition[overrideforeignkeyinverse.CreditCard]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_user.go similarity index 70% rename from tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go rename to tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_user.go index 5e751125..a5a22e9f 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_user.go @@ -32,21 +32,16 @@ func UserDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition FieldIdentifier: badorm.DeletedAtFieldID, } } -func UserCreditCard(conditions ...badorm.Condition[overrideforeignkeyinverse.CreditCard]) badorm.Condition[overrideforeignkeyinverse.User] { +func UserCreditCard(conditions ...badorm.Condition[overrideforeignkeyinverse.CreditCard]) badorm.IJoinCondition[overrideforeignkeyinverse.User] { return badorm.JoinCondition[overrideforeignkeyinverse.User, overrideforeignkeyinverse.CreditCard]{ - Conditions: conditions, - RelationField: "CreditCard", - T1Field: "ID", - T2Field: "UserReference", - } -} -func CreditCardUser(conditions ...badorm.Condition[overrideforeignkeyinverse.User]) badorm.Condition[overrideforeignkeyinverse.CreditCard] { - return badorm.JoinCondition[overrideforeignkeyinverse.CreditCard, overrideforeignkeyinverse.User]{ - Conditions: conditions, - RelationField: "User", - T1Field: "UserReference", - T2Field: "ID", + Conditions: conditions, + RelationField: "CreditCard", + T1Field: "ID", + T1PreloadCondition: UserPreloadAttributes, + T2Field: "UserReference", } } -var UserPreload = badorm.NewPreloadCondition[overrideforeignkeyinverse.User]() +var UserPreloadCreditCard = UserCreditCard(CreditCardPreloadAttributes) +var UserPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkeyinverse.User]() +var UserPreloadRelations = []badorm.Condition[overrideforeignkeyinverse.User]{UserPreloadCreditCard} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go new file mode 100644 index 00000000..e267ec43 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go @@ -0,0 +1,46 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + overridereferences "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overridereferences" + gorm "gorm.io/gorm" + "time" +) + +func BrandId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overridereferences.Brand] { + return badorm.FieldCondition[overridereferences.Brand, badorm.UUID]{ + Expression: expr, + FieldIdentifier: badorm.IDFieldID, + } +} +func BrandCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferences.Brand] { + return badorm.FieldCondition[overridereferences.Brand, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, + } +} +func BrandUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferences.Brand] { + return badorm.FieldCondition[overridereferences.Brand, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, + } +} +func BrandDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overridereferences.Brand] { + return badorm.FieldCondition[overridereferences.Brand, gorm.DeletedAt]{ + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, + } +} + +var brandNameFieldID = badorm.FieldIdentifier{Field: "Name"} + +func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferences.Brand] { + return badorm.FieldCondition[overridereferences.Brand, string]{ + Expression: expr, + FieldIdentifier: brandNameFieldID, + } +} + +var BrandPreloadAttributes = badorm.NewPreloadCondition[overridereferences.Brand](brandNameFieldID) +var BrandPreloadRelations = []badorm.Condition[overridereferences.Brand]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_phone.go similarity index 77% rename from tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go rename to tools/badctl/cmd/gen/conditions/tests/results/overridereferences_phone.go index 8f3b54fe..15a12a12 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_phone.go @@ -32,15 +32,17 @@ func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio FieldIdentifier: badorm.DeletedAtFieldID, } } -func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm.Condition[overridereferences.Phone] { +func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm.IJoinCondition[overridereferences.Phone] { return badorm.JoinCondition[overridereferences.Phone, overridereferences.Brand]{ - Conditions: conditions, - RelationField: "Brand", - T1Field: "BrandName", - T2Field: "Name", + Conditions: conditions, + RelationField: "Brand", + T1Field: "BrandName", + T1PreloadCondition: PhonePreloadAttributes, + T2Field: "Name", } } +var PhonePreloadBrand = PhoneBrand(BrandPreloadAttributes) var phoneBrandNameFieldID = badorm.FieldIdentifier{Field: "BrandName"} func PhoneBrandName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferences.Phone] { @@ -50,4 +52,5 @@ func PhoneBrandName(expr badorm.Expression[string]) badorm.WhereCondition[overri } } -var PhonePreload = badorm.NewPreloadCondition[overridereferences.Phone](phoneBrandNameFieldID) +var PhonePreloadAttributes = badorm.NewPreloadCondition[overridereferences.Phone](phoneBrandNameFieldID) +var PhonePreloadRelations = []badorm.Condition[overridereferences.Phone]{PhonePreloadBrand} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_computer.go similarity index 73% rename from tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go rename to tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_computer.go index a88653fd..1f5015d1 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_computer.go @@ -41,21 +41,16 @@ func ComputerName(expr badorm.Expression[string]) badorm.WhereCondition[override FieldIdentifier: computerNameFieldID, } } -func ComputerProcessor(conditions ...badorm.Condition[overridereferencesinverse.Processor]) badorm.Condition[overridereferencesinverse.Computer] { +func ComputerProcessor(conditions ...badorm.Condition[overridereferencesinverse.Processor]) badorm.IJoinCondition[overridereferencesinverse.Computer] { return badorm.JoinCondition[overridereferencesinverse.Computer, overridereferencesinverse.Processor]{ - Conditions: conditions, - RelationField: "Processor", - T1Field: "Name", - T2Field: "ComputerName", - } -} -func ProcessorComputer(conditions ...badorm.Condition[overridereferencesinverse.Computer]) badorm.Condition[overridereferencesinverse.Processor] { - return badorm.JoinCondition[overridereferencesinverse.Processor, overridereferencesinverse.Computer]{ - Conditions: conditions, - RelationField: "Computer", - T1Field: "ComputerName", - T2Field: "Name", + Conditions: conditions, + RelationField: "Processor", + T1Field: "Name", + T1PreloadCondition: ComputerPreloadAttributes, + T2Field: "ComputerName", } } -var ComputerPreload = badorm.NewPreloadCondition[overridereferencesinverse.Computer](computerNameFieldID) +var ComputerPreloadProcessor = ComputerProcessor(ProcessorPreloadAttributes) +var ComputerPreloadAttributes = badorm.NewPreloadCondition[overridereferencesinverse.Computer](computerNameFieldID) +var ComputerPreloadRelations = []badorm.Condition[overridereferencesinverse.Computer]{ComputerPreloadProcessor} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go new file mode 100644 index 00000000..94244d95 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go @@ -0,0 +1,46 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + overridereferencesinverse "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse" + gorm "gorm.io/gorm" + "time" +) + +func ProcessorId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overridereferencesinverse.Processor] { + return badorm.FieldCondition[overridereferencesinverse.Processor, badorm.UUID]{ + Expression: expr, + FieldIdentifier: badorm.IDFieldID, + } +} +func ProcessorCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferencesinverse.Processor] { + return badorm.FieldCondition[overridereferencesinverse.Processor, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, + } +} +func ProcessorUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferencesinverse.Processor] { + return badorm.FieldCondition[overridereferencesinverse.Processor, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, + } +} +func ProcessorDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overridereferencesinverse.Processor] { + return badorm.FieldCondition[overridereferencesinverse.Processor, gorm.DeletedAt]{ + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, + } +} + +var processorComputerNameFieldID = badorm.FieldIdentifier{Field: "ComputerName"} + +func ProcessorComputerName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferencesinverse.Processor] { + return badorm.FieldCondition[overridereferencesinverse.Processor, string]{ + Expression: expr, + FieldIdentifier: processorComputerNameFieldID, + } +} + +var ProcessorPreloadAttributes = badorm.NewPreloadCondition[overridereferencesinverse.Processor](processorComputerNameFieldID) +var ProcessorPreloadRelations = []badorm.Condition[overridereferencesinverse.Processor]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go index f5b5a6e0..2acd3ad6 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go @@ -32,15 +32,17 @@ func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondi FieldIdentifier: badorm.DeletedAtFieldID, } } -func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) badorm.Condition[selfreferential.Employee] { +func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) badorm.IJoinCondition[selfreferential.Employee] { return badorm.JoinCondition[selfreferential.Employee, selfreferential.Employee]{ - Conditions: conditions, - RelationField: "Boss", - T1Field: "BossID", - T2Field: "ID", + Conditions: conditions, + RelationField: "Boss", + T1Field: "BossID", + T1PreloadCondition: EmployeePreloadAttributes, + T2Field: "ID", } } +var EmployeePreloadBoss = EmployeeBoss(EmployeePreloadAttributes) var employeeBossIdFieldID = badorm.FieldIdentifier{Field: "BossID"} func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { @@ -50,4 +52,5 @@ func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[s } } -var EmployeePreload = badorm.NewPreloadCondition[selfreferential.Employee](employeeBossIdFieldID) +var EmployeePreloadAttributes = badorm.NewPreloadCondition[selfreferential.Employee](employeeBossIdFieldID) +var EmployeePreloadRelations = []badorm.Condition[selfreferential.Employee]{EmployeePreloadBoss} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go index a2a275cd..e0cad550 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go @@ -8,8 +8,8 @@ import ( "time" ) -func UintModelId(expr badorm.Expression[uint]) badorm.WhereCondition[uintmodel.UintModel] { - return badorm.FieldCondition[uintmodel.UintModel, uint]{ +func UintModelId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[uintmodel.UintModel] { + return badorm.FieldCondition[uintmodel.UintModel, badorm.UIntID]{ Expression: expr, FieldIdentifier: badorm.IDFieldID, } @@ -33,4 +33,5 @@ func UintModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCond } } -var UintModelPreload = badorm.NewPreloadCondition[uintmodel.UintModel]() +var UintModelPreloadAttributes = badorm.NewPreloadCondition[uintmodel.UintModel]() +var UintModelPreloadRelations = []badorm.Condition[uintmodel.UintModel]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go index 9af0ceed..f25bd6ff 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go @@ -33,4 +33,5 @@ func UUIDModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCond } } -var UUIDModelPreload = badorm.NewPreloadCondition[uuidmodel.UUIDModel]() +var UUIDModelPreloadAttributes = badorm.NewPreloadCondition[uuidmodel.UUIDModel]() +var UUIDModelPreloadRelations = []badorm.Condition[uuidmodel.UUIDModel]{} diff --git a/tools/badctl/cmd/utils/file.go b/tools/badctl/cmd/utils/file.go index 40ff96d2..ab9969f2 100644 --- a/tools/badctl/cmd/utils/file.go +++ b/tools/badctl/cmd/utils/file.go @@ -7,6 +7,13 @@ import ( "testing" ) +func CheckFileNotExists(t *testing.T, name string) { + _, err := os.Stat(name) + if err == nil { + t.Error(err, "Should have been an error") + } +} + func CheckFileExists(t *testing.T, name string) fs.FileInfo { stat, err := os.Stat(name) if err != nil { From a1f3aa3214d1bcc97d4ac8c7d9476ad72bfd5272 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 15:35:33 +0200 Subject: [PATCH 409/467] add verifications of relation getters --- tools/badctl/cmd/gen/conditions/main_test.go | 21 ++++++- .../conditions/relationGettersGenerator.go | 40 ++++++++----- .../tests/belongsto/badorm_result.go | 8 +++ .../conditions/tests/hasmany/badorm_result.go | 11 ++++ .../gen/conditions/tests/hasmany/hasmany.go | 5 +- .../hasmanywithpointers/badorm_result.go | 11 ++++ .../hasmanywithpointers.go | 16 ++++++ .../conditions/tests/hasone/badorm_result.go | 11 ++++ .../cmd/gen/conditions/tests/hasone/hasone.go | 1 + .../multiplepackage/package1/badorm_result.go | 11 ++++ .../tests/overrideforeignkey/badorm_result.go | 8 +++ .../badorm_result.go | 8 +++ .../tests/overridereferences/badorm_result.go | 8 +++ .../badorm_result.go | 8 +++ .../tests/results/hasmany_seller.go | 12 +++- .../results/hasmanywithpointers_company.go | 40 +++++++++++++ .../results/hasmanywithpointers_seller.go | 56 +++++++++++++++++++ .../conditions/tests/results/hasone_city.go | 12 +++- .../tests/selfreferential/badorm_result.go | 8 +++ 19 files changed, 274 insertions(+), 21 deletions(-) create mode 100644 tools/badctl/cmd/gen/conditions/tests/belongsto/badorm_result.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/hasmany/badorm_result.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers/badorm_result.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers/hasmanywithpointers.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/hasone/badorm_result.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/multiplepackage/package1/badorm_result.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/overrideforeignkey/badorm_result.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse/badorm_result.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/overridereferences/badorm_result.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse/badorm_result.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_company.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_seller.go create mode 100644 tools/badctl/cmd/gen/conditions/tests/selfreferential/badorm_result.go diff --git a/tools/badctl/cmd/gen/conditions/main_test.go b/tools/badctl/cmd/gen/conditions/main_test.go index 25b567ec..4b4559fc 100644 --- a/tools/badctl/cmd/gen/conditions/main_test.go +++ b/tools/badctl/cmd/gen/conditions/main_test.go @@ -84,11 +84,11 @@ func TestColumnDefinition(t *testing.T) { utils.CheckFileNotExists(t, "./tests/columndefinition/badorm.go") } -// TODO verificacion de los badorm relation getters func TestBelongsTo(t *testing.T) { doTest(t, "./tests/belongsto", []Comparison{ {Have: "owner_conditions.go", Expected: "./tests/results/belongsto_owner.go"}, {Have: "owned_conditions.go", Expected: "./tests/results/belongsto_owned.go"}, + {Have: "./tests/belongsto/badorm.go", Expected: "./tests/belongsto/badorm_result.go"}, }) } @@ -96,6 +96,7 @@ func TestHasOne(t *testing.T) { doTest(t, "./tests/hasone", []Comparison{ {Have: "country_conditions.go", Expected: "./tests/results/hasone_country.go"}, {Have: "city_conditions.go", Expected: "./tests/results/hasone_city.go"}, + {Have: "./tests/hasone/badorm.go", Expected: "./tests/hasone/badorm_result.go"}, }) } @@ -103,29 +104,41 @@ func TestHasMany(t *testing.T) { doTest(t, "./tests/hasmany", []Comparison{ {Have: "company_conditions.go", Expected: "./tests/results/hasmany_company.go"}, {Have: "seller_conditions.go", Expected: "./tests/results/hasmany_seller.go"}, + {Have: "./tests/hasmany/badorm.go", Expected: "./tests/hasmany/badorm_result.go"}, + }) +} + +func TestHasManyWithPointers(t *testing.T) { + doTest(t, "./tests/hasmanywithpointers", []Comparison{ + {Have: "company_with_pointers_conditions.go", Expected: "./tests/results/hasmanywithpointers_company.go"}, + {Have: "seller_in_pointers_conditions.go", Expected: "./tests/results/hasmanywithpointers_seller.go"}, + {Have: "./tests/hasmanywithpointers/badorm.go", Expected: "./tests/hasmanywithpointers/badorm_result.go"}, }) } func TestSelfReferential(t *testing.T) { doTest(t, "./tests/selfreferential", []Comparison{ {Have: "employee_conditions.go", Expected: "./tests/results/selfreferential.go"}, + {Have: "./tests/selfreferential/badorm.go", Expected: "./tests/selfreferential/badorm_result.go"}, }) } func TestMultiplePackage(t *testing.T) { - // TODO hacer los dos paquetes a la vez porque sino el badorm se rompe doTest(t, "./tests/multiplepackage/package1", []Comparison{ {Have: "package1_conditions.go", Expected: "./tests/results/multiplepackage_package1.go"}, + {Have: "./tests/multiplepackage/package1/badorm.go", Expected: "./tests/multiplepackage/package1/badorm_result.go"}, }) doTest(t, "./tests/multiplepackage/package2", []Comparison{ {Have: "package2_conditions.go", Expected: "./tests/results/multiplepackage_package2.go"}, }) + utils.CheckFileNotExists(t, "./tests/multiplepackage/package2/badorm.go") } func TestOverrideForeignKey(t *testing.T) { doTest(t, "./tests/overrideforeignkey", []Comparison{ {Have: "bicycle_conditions.go", Expected: "./tests/results/overrideforeignkey_bicycle.go"}, {Have: "person_conditions.go", Expected: "./tests/results/overrideforeignkey_person.go"}, + {Have: "./tests/overrideforeignkey/badorm.go", Expected: "./tests/overrideforeignkey/badorm_result.go"}, }) } @@ -133,6 +146,7 @@ func TestOverrideReferences(t *testing.T) { doTest(t, "./tests/overridereferences", []Comparison{ {Have: "phone_conditions.go", Expected: "./tests/results/overridereferences_phone.go"}, {Have: "brand_conditions.go", Expected: "./tests/results/overridereferences_brand.go"}, + {Have: "./tests/overridereferences/badorm.go", Expected: "./tests/overridereferences/badorm_result.go"}, }) } @@ -140,6 +154,7 @@ func TestOverrideForeignKeyInverse(t *testing.T) { doTest(t, "./tests/overrideforeignkeyinverse", []Comparison{ {Have: "user_conditions.go", Expected: "./tests/results/overrideforeignkeyinverse_user.go"}, {Have: "credit_card_conditions.go", Expected: "./tests/results/overrideforeignkeyinverse_credit_card.go"}, + {Have: "./tests/overrideforeignkeyinverse/badorm.go", Expected: "./tests/overrideforeignkeyinverse/badorm_result.go"}, }) } @@ -147,8 +162,8 @@ func TestOverrideReferencesInverse(t *testing.T) { doTest(t, "./tests/overridereferencesinverse", []Comparison{ {Have: "computer_conditions.go", Expected: "./tests/results/overridereferencesinverse_computer.go"}, {Have: "processor_conditions.go", Expected: "./tests/results/overridereferencesinverse_processor.go"}, + {Have: "./tests/overridereferencesinverse/badorm.go", Expected: "./tests/overridereferencesinverse/badorm_result.go"}, }) - utils.RemoveFile("processor_conditions.go") } type Comparison struct { diff --git a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go index 35878cf2..b954900e 100644 --- a/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go +++ b/tools/badctl/cmd/gen/conditions/relationGettersGenerator.go @@ -111,23 +111,27 @@ func (generator RelationGettersGenerator) generateForPointer(field Field) jen.Co } } case *types.Slice: - return generator.generateForSlicePointer(field.ChangeType(fieldType.Elem())) + return generator.generateForSlicePointer( + field.ChangeType(fieldType.Elem()), + nil, + ) } return nil } -func (generator RelationGettersGenerator) generateForSlicePointer(field Field) jen.Code { +func (generator RelationGettersGenerator) generateForSlicePointer(field Field, fieldTypePrefix *jen.Statement) jen.Code { switch fieldType := field.GetType().(type) { case *types.Named: _, err := field.Type.BadORMModelStruct() if err == nil { // field is a pointer to a slice of BaDORM Model - return generator.verifyCollection(field) + return generator.verifyCollection(field, fieldTypePrefix) } case *types.Pointer: return generator.generateForSlicePointer( field.ChangeType(fieldType.Elem()), + jen.Op("*"), ) } @@ -143,6 +147,7 @@ func (generator RelationGettersGenerator) verifyStruct(field Field) *jen.Stateme field, badORMVerifyStructLoaded, jen.Op("*"), + nil, jen.Op("&").Id("m").Op(".").Id(field.Name), ) } @@ -155,12 +160,12 @@ func (generator RelationGettersGenerator) verifyPointerWithID(field Field) *jen. return generator.verifyPointerCommon(field, badORMVerifyPointerWithIDLoaded) } -func (generator RelationGettersGenerator) verifyCollection(field Field) jen.Code { +func (generator RelationGettersGenerator) verifyCollection(field Field, fieldTypePrefix *jen.Statement) jen.Code { return generator.verifyCommon( field, badORMVerifyCollectionLoaded, - // TODO verificar que antes tanto para *[] como para *[]* jen.Index(), + fieldTypePrefix, jen.Id("m").Op(".").Id(field.Name), ) } @@ -170,6 +175,7 @@ func (generator RelationGettersGenerator) verifyPointerCommon(field Field, verif field, verifyFunc, jen.Op("*"), + nil, jen.Id("m").Op(".").Id(field.Name+"ID"), jen.Id("m").Op(".").Id(field.Name), ) @@ -179,21 +185,27 @@ func (generator RelationGettersGenerator) verifyCommon( field Field, verifyFunc string, returnType *jen.Statement, + fieldTypePrefix *jen.Statement, callParams ...jen.Code, ) *jen.Statement { + fieldType := jen.Qual( + getRelativePackagePath( + generator.object.Pkg().Name(), + field.Type, + ), + field.TypeName(), + ) + + if fieldTypePrefix != nil { + fieldType = fieldTypePrefix.Add(fieldType) + } + return jen.Func().Parens( jen.Id("m").Id(generator.object.Name()), ).Id(getGetterName(field)).Params().Add( jen.Parens( jen.List( - returnType.Qual( - getRelativePackagePath( - generator.object.Pkg().Name(), - field.Type, - ), - field.TypeName(), - ), - + returnType.Add(fieldType), jen.Id("error"), ), ), @@ -203,7 +215,7 @@ func (generator RelationGettersGenerator) verifyCommon( badORMPath, verifyFunc, ).Types( - jen.Id(field.TypeName()), + fieldType, ).Call( callParams..., ), diff --git a/tools/badctl/cmd/gen/conditions/tests/belongsto/badorm_result.go b/tools/badctl/cmd/gen/conditions/tests/belongsto/badorm_result.go new file mode 100644 index 00000000..23425a10 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/belongsto/badorm_result.go @@ -0,0 +1,8 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package belongsto + +import badorm "github.com/ditrit/badaas/badorm" + +func (m Owned) GetOwner() (*Owner, error) { + return badorm.VerifyStructLoaded[Owner](&m.Owner) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/hasmany/badorm_result.go b/tools/badctl/cmd/gen/conditions/tests/hasmany/badorm_result.go new file mode 100644 index 00000000..c6434d85 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/hasmany/badorm_result.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package hasmany + +import badorm "github.com/ditrit/badaas/badorm" + +func (m Company) GetSellers() ([]Seller, error) { + return badorm.VerifyCollectionLoaded[Seller](m.Sellers) +} +func (m Seller) GetCompany() (*Company, error) { + return badorm.VerifyPointerLoaded[Company](m.CompanyID, m.Company) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/hasmany/hasmany.go b/tools/badctl/cmd/gen/conditions/tests/hasmany/hasmany.go index 55e30679..dd05c041 100644 --- a/tools/badctl/cmd/gen/conditions/tests/hasmany/hasmany.go +++ b/tools/badctl/cmd/gen/conditions/tests/hasmany/hasmany.go @@ -1,15 +1,16 @@ -package hasone +package hasmany import "github.com/ditrit/badaas/badorm" type Company struct { badorm.UUIDModel - Sellers []Seller // Company HasMany Sellers (Company 0..1 -> 0..* Seller) + Sellers *[]Seller // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } type Seller struct { badorm.UUIDModel + Company *Company CompanyID *badorm.UUID // Company HasMany Sellers (Company 0..1 -> 0..* Seller) } diff --git a/tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers/badorm_result.go b/tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers/badorm_result.go new file mode 100644 index 00000000..332b47f0 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers/badorm_result.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package hasmanywithpointers + +import badorm "github.com/ditrit/badaas/badorm" + +func (m CompanyWithPointers) GetSellers() ([]*SellerInPointers, error) { + return badorm.VerifyCollectionLoaded[*SellerInPointers](m.Sellers) +} +func (m SellerInPointers) GetCompany() (*CompanyWithPointers, error) { + return badorm.VerifyPointerLoaded[CompanyWithPointers](m.CompanyID, m.Company) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers/hasmanywithpointers.go b/tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers/hasmanywithpointers.go new file mode 100644 index 00000000..0672f70a --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers/hasmanywithpointers.go @@ -0,0 +1,16 @@ +package hasmanywithpointers + +import "github.com/ditrit/badaas/badorm" + +type CompanyWithPointers struct { + badorm.UUIDModel + + Sellers *[]*SellerInPointers // CompanyWithPointers HasMany SellerInPointers +} + +type SellerInPointers struct { + badorm.UUIDModel + + Company *CompanyWithPointers + CompanyID *badorm.UUID // Company HasMany Seller +} diff --git a/tools/badctl/cmd/gen/conditions/tests/hasone/badorm_result.go b/tools/badctl/cmd/gen/conditions/tests/hasone/badorm_result.go new file mode 100644 index 00000000..000d4b74 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/hasone/badorm_result.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package hasone + +import badorm "github.com/ditrit/badaas/badorm" + +func (m City) GetCountry() (*Country, error) { + return badorm.VerifyPointerWithIDLoaded[Country](m.CountryID, m.Country) +} +func (m Country) GetCapital() (*City, error) { + return badorm.VerifyStructLoaded[City](&m.Capital) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/hasone/hasone.go b/tools/badctl/cmd/gen/conditions/tests/hasone/hasone.go index de6fbf32..9ceb8068 100644 --- a/tools/badctl/cmd/gen/conditions/tests/hasone/hasone.go +++ b/tools/badctl/cmd/gen/conditions/tests/hasone/hasone.go @@ -11,5 +11,6 @@ type Country struct { type City struct { badorm.UUIDModel + Country *Country CountryID badorm.UUID // Country HasOne City (Country 1 -> 1 City) } diff --git a/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package1/badorm_result.go b/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package1/badorm_result.go new file mode 100644 index 00000000..b57670ad --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package1/badorm_result.go @@ -0,0 +1,11 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package package1 + +import ( + badorm "github.com/ditrit/badaas/badorm" + package2 "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package2" +) + +func (m Package1) GetPackage2() (*package2.Package2, error) { + return badorm.VerifyStructLoaded[package2.Package2](&m.Package2) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/overrideforeignkey/badorm_result.go b/tools/badctl/cmd/gen/conditions/tests/overrideforeignkey/badorm_result.go new file mode 100644 index 00000000..110b3f47 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/overrideforeignkey/badorm_result.go @@ -0,0 +1,8 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package overrideforeignkey + +import badorm "github.com/ditrit/badaas/badorm" + +func (m Bicycle) GetOwner() (*Person, error) { + return badorm.VerifyStructLoaded[Person](&m.Owner) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse/badorm_result.go b/tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse/badorm_result.go new file mode 100644 index 00000000..9b6aac49 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse/badorm_result.go @@ -0,0 +1,8 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package overrideforeignkeyinverse + +import badorm "github.com/ditrit/badaas/badorm" + +func (m User) GetCreditCard() (*CreditCard, error) { + return badorm.VerifyStructLoaded[CreditCard](&m.CreditCard) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/overridereferences/badorm_result.go b/tools/badctl/cmd/gen/conditions/tests/overridereferences/badorm_result.go new file mode 100644 index 00000000..f710ffa6 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/overridereferences/badorm_result.go @@ -0,0 +1,8 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package overridereferences + +import badorm "github.com/ditrit/badaas/badorm" + +func (m Phone) GetBrand() (*Brand, error) { + return badorm.VerifyStructLoaded[Brand](&m.Brand) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse/badorm_result.go b/tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse/badorm_result.go new file mode 100644 index 00000000..9228c409 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse/badorm_result.go @@ -0,0 +1,8 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package overridereferencesinverse + +import badorm "github.com/ditrit/badaas/badorm" + +func (m Computer) GetProcessor() (*Processor, error) { + return badorm.VerifyStructLoaded[Processor](&m.Processor) +} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go index e5a17cfa..cbacdc6e 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go @@ -32,7 +32,17 @@ func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditi FieldIdentifier: badorm.DeletedAtFieldID, } } +func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.IJoinCondition[hasmany.Seller] { + return badorm.JoinCondition[hasmany.Seller, hasmany.Company]{ + Conditions: conditions, + RelationField: "Company", + T1Field: "CompanyID", + T1PreloadCondition: SellerPreloadAttributes, + T2Field: "ID", + } +} +var SellerPreloadCompany = SellerCompany(CompanyPreloadAttributes) var sellerCompanyIdFieldID = badorm.FieldIdentifier{Field: "CompanyID"} func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Seller] { @@ -43,4 +53,4 @@ func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[ } var SellerPreloadAttributes = badorm.NewPreloadCondition[hasmany.Seller](sellerCompanyIdFieldID) -var SellerPreloadRelations = []badorm.Condition[hasmany.Seller]{} +var SellerPreloadRelations = []badorm.Condition[hasmany.Seller]{SellerPreloadCompany} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_company.go new file mode 100644 index 00000000..44cd1b44 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_company.go @@ -0,0 +1,40 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + hasmanywithpointers "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers" + gorm "gorm.io/gorm" + "time" +) + +func CompanyWithPointersId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { + return badorm.FieldCondition[hasmanywithpointers.CompanyWithPointers, badorm.UUID]{ + Expression: expr, + FieldIdentifier: badorm.IDFieldID, + } +} +func CompanyWithPointersCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { + return badorm.FieldCondition[hasmanywithpointers.CompanyWithPointers, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, + } +} +func CompanyWithPointersUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { + return badorm.FieldCondition[hasmanywithpointers.CompanyWithPointers, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, + } +} +func CompanyWithPointersDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { + return badorm.FieldCondition[hasmanywithpointers.CompanyWithPointers, gorm.DeletedAt]{ + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, + } +} +func CompanyWithPointersPreloadSellers(nestedPreloads ...badorm.IJoinCondition[hasmanywithpointers.SellerInPointers]) badorm.Condition[hasmanywithpointers.CompanyWithPointers] { + return badorm.NewCollectionPreloadCondition[hasmanywithpointers.CompanyWithPointers, hasmanywithpointers.SellerInPointers]("Sellers", nestedPreloads) +} + +var CompanyWithPointersPreloadAttributes = badorm.NewPreloadCondition[hasmanywithpointers.CompanyWithPointers]() +var CompanyWithPointersPreloadRelations = []badorm.Condition[hasmanywithpointers.CompanyWithPointers]{CompanyWithPointersPreloadSellers()} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_seller.go new file mode 100644 index 00000000..e3359ce5 --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_seller.go @@ -0,0 +1,56 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package conditions + +import ( + badorm "github.com/ditrit/badaas/badorm" + hasmanywithpointers "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers" + gorm "gorm.io/gorm" + "time" +) + +func SellerInPointersId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { + return badorm.FieldCondition[hasmanywithpointers.SellerInPointers, badorm.UUID]{ + Expression: expr, + FieldIdentifier: badorm.IDFieldID, + } +} +func SellerInPointersCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { + return badorm.FieldCondition[hasmanywithpointers.SellerInPointers, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.CreatedAtFieldID, + } +} +func SellerInPointersUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { + return badorm.FieldCondition[hasmanywithpointers.SellerInPointers, time.Time]{ + Expression: expr, + FieldIdentifier: badorm.UpdatedAtFieldID, + } +} +func SellerInPointersDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { + return badorm.FieldCondition[hasmanywithpointers.SellerInPointers, gorm.DeletedAt]{ + Expression: expr, + FieldIdentifier: badorm.DeletedAtFieldID, + } +} +func SellerInPointersCompany(conditions ...badorm.Condition[hasmanywithpointers.CompanyWithPointers]) badorm.IJoinCondition[hasmanywithpointers.SellerInPointers] { + return badorm.JoinCondition[hasmanywithpointers.SellerInPointers, hasmanywithpointers.CompanyWithPointers]{ + Conditions: conditions, + RelationField: "Company", + T1Field: "CompanyID", + T1PreloadCondition: SellerInPointersPreloadAttributes, + T2Field: "ID", + } +} + +var SellerInPointersPreloadCompany = SellerInPointersCompany(CompanyWithPointersPreloadAttributes) +var sellerInPointersCompanyIdFieldID = badorm.FieldIdentifier{Field: "CompanyID"} + +func SellerInPointersCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { + return badorm.FieldCondition[hasmanywithpointers.SellerInPointers, badorm.UUID]{ + Expression: expr, + FieldIdentifier: sellerInPointersCompanyIdFieldID, + } +} + +var SellerInPointersPreloadAttributes = badorm.NewPreloadCondition[hasmanywithpointers.SellerInPointers](sellerInPointersCompanyIdFieldID) +var SellerInPointersPreloadRelations = []badorm.Condition[hasmanywithpointers.SellerInPointers]{SellerInPointersPreloadCompany} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go index 00ae766a..79a0db98 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go @@ -32,7 +32,17 @@ func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition FieldIdentifier: badorm.DeletedAtFieldID, } } +func CityCountry(conditions ...badorm.Condition[hasone.Country]) badorm.IJoinCondition[hasone.City] { + return badorm.JoinCondition[hasone.City, hasone.Country]{ + Conditions: conditions, + RelationField: "Country", + T1Field: "CountryID", + T1PreloadCondition: CityPreloadAttributes, + T2Field: "ID", + } +} +var CityPreloadCountry = CityCountry(CountryPreloadAttributes) var cityCountryIdFieldID = badorm.FieldIdentifier{Field: "CountryID"} func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.City] { @@ -43,4 +53,4 @@ func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[ha } var CityPreloadAttributes = badorm.NewPreloadCondition[hasone.City](cityCountryIdFieldID) -var CityPreloadRelations = []badorm.Condition[hasone.City]{} +var CityPreloadRelations = []badorm.Condition[hasone.City]{CityPreloadCountry} diff --git a/tools/badctl/cmd/gen/conditions/tests/selfreferential/badorm_result.go b/tools/badctl/cmd/gen/conditions/tests/selfreferential/badorm_result.go new file mode 100644 index 00000000..2fe691bb --- /dev/null +++ b/tools/badctl/cmd/gen/conditions/tests/selfreferential/badorm_result.go @@ -0,0 +1,8 @@ +// Code generated by badctl v0.0.0, DO NOT EDIT. +package selfreferential + +import badorm "github.com/ditrit/badaas/badorm" + +func (m Employee) GetBoss() (*Employee, error) { + return badorm.VerifyPointerLoaded[Employee](m.BossID, m.Boss) +} From f650a910e59e680ea8bec5889aa9a225dd2f5462 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 15:45:29 +0200 Subject: [PATCH 410/467] do not renegare relations preload if no relations --- testintegration/conditions/brand_conditions.go | 1 - testintegration/conditions/parent_parent_conditions.go | 1 - testintegration/conditions/person_conditions.go | 1 - testintegration/conditions/product_conditions.go | 1 - testintegration/conditions/university_conditions.go | 1 - tools/badctl/cmd/gen/conditions/conditionsGenerator.go | 5 ++++- tools/badctl/cmd/gen/conditions/main.go | 2 -- .../badctl/cmd/gen/conditions/tests/results/basicpointers.go | 1 - tools/badctl/cmd/gen/conditions/tests/results/basicslices.go | 1 - .../cmd/gen/conditions/tests/results/basicslicespointer.go | 1 - tools/badctl/cmd/gen/conditions/tests/results/basictypes.go | 1 - .../cmd/gen/conditions/tests/results/belongsto_owner.go | 1 - .../cmd/gen/conditions/tests/results/columndefinition.go | 1 - tools/badctl/cmd/gen/conditions/tests/results/customtype.go | 1 - tools/badctl/cmd/gen/conditions/tests/results/goembedded.go | 1 - .../badctl/cmd/gen/conditions/tests/results/gormembedded.go | 1 - .../gen/conditions/tests/results/multiplepackage_package2.go | 1 - .../conditions/tests/results/overrideforeignkey_person.go | 1 - .../tests/results/overrideforeignkeyinverse_credit_card.go | 1 - .../gen/conditions/tests/results/overridereferences_brand.go | 1 - .../tests/results/overridereferencesinverse_processor.go | 1 - tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go | 1 - tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go | 1 - 23 files changed, 4 insertions(+), 24 deletions(-) diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index cb43a9e8..2bc30fe8 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -43,4 +43,3 @@ func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bran } var BrandPreloadAttributes = badorm.NewPreloadCondition[models.Brand](brandNameFieldID) -var BrandPreloadRelations = []badorm.Condition[models.Brand]{} diff --git a/testintegration/conditions/parent_parent_conditions.go b/testintegration/conditions/parent_parent_conditions.go index 68fa2b24..6f200034 100644 --- a/testintegration/conditions/parent_parent_conditions.go +++ b/testintegration/conditions/parent_parent_conditions.go @@ -43,4 +43,3 @@ func ParentParentName(expr badorm.Expression[string]) badorm.WhereCondition[mode } var ParentParentPreloadAttributes = badorm.NewPreloadCondition[models.ParentParent](parentParentNameFieldID) -var ParentParentPreloadRelations = []badorm.Condition[models.ParentParent]{} diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index 85bc2ed9..584d316e 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -43,4 +43,3 @@ func PersonName(expr badorm.Expression[string]) badorm.WhereCondition[models.Per } var PersonPreloadAttributes = badorm.NewPreloadCondition[models.Person](personNameFieldID) -var PersonPreloadRelations = []badorm.Condition[models.Person]{} diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index da3ad8a8..ea73ca68 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -137,4 +137,3 @@ func ProductGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[m } var ProductPreloadAttributes = badorm.NewPreloadCondition[models.Product](productStringFieldID, productIntFieldID, productIntPointerFieldID, productFloatFieldID, productNullFloatFieldID, productBoolFieldID, productNullBoolFieldID, productByteArrayFieldID, productMultiStringFieldID, productToBeEmbeddedEmbeddedIntFieldID, productGormEmbeddedIntFieldID) -var ProductPreloadRelations = []badorm.Condition[models.Product]{} diff --git a/testintegration/conditions/university_conditions.go b/testintegration/conditions/university_conditions.go index 0b94db09..473ebc5f 100644 --- a/testintegration/conditions/university_conditions.go +++ b/testintegration/conditions/university_conditions.go @@ -43,4 +43,3 @@ func UniversityName(expr badorm.Expression[string]) badorm.WhereCondition[models } var UniversityPreloadAttributes = badorm.NewPreloadCondition[models.University](universityNameFieldID) -var UniversityPreloadRelations = []badorm.Condition[models.University]{} diff --git a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go index 097571c9..9f022cf0 100644 --- a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go +++ b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go @@ -85,7 +85,10 @@ func (cg CodeConditionsGenerator) addConditionsForEachField(file *File, fields [ } file.Add(preloadAttributesCondition.Call(fieldIdentifiers...)) - file.Add(preloadRelationsCondition.Values(relationPreloads...)) + + if len(relationPreloads) > 0 { + file.Add(preloadRelationsCondition.Values(relationPreloads...)) + } } func getPreloadAttributesName(objectName string) string { diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 45ca4b53..33523d29 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -61,8 +61,6 @@ func generateConditions(_ *cobra.Command, args []string) { } } -// TODO BasicSlicesPreloadRelations solo si tiene alguna relacion - // Generates a file with conditions for each BaDORM model in the package func generateConditionsForPkg(destPkg string, pkgPath string, pkg *packages.Package) { log.Logger.Infof("Generating conditions for types in package %q", pkg.Types.Name()) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go index 18e1594f..5e7b0134 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go @@ -196,4 +196,3 @@ func BasicPointersByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basi } var BasicPointersPreloadAttributes = badorm.NewPreloadCondition[basicpointers.BasicPointers](basicPointersBoolFieldID, basicPointersIntFieldID, basicPointersInt8FieldID, basicPointersInt16FieldID, basicPointersInt32FieldID, basicPointersInt64FieldID, basicPointersUIntFieldID, basicPointersUInt8FieldID, basicPointersUInt16FieldID, basicPointersUInt32FieldID, basicPointersUInt64FieldID, basicPointersUIntptrFieldID, basicPointersFloat32FieldID, basicPointersFloat64FieldID, basicPointersComplex64FieldID, basicPointersComplex128FieldID, basicPointersStringFieldID, basicPointersByteFieldID) -var BasicPointersPreloadRelations = []badorm.Condition[basicpointers.BasicPointers]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go index b5738de2..aa6b4822 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go @@ -196,4 +196,3 @@ func BasicSlicesByte(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basi } var BasicSlicesPreloadAttributes = badorm.NewPreloadCondition[basicslices.BasicSlices](basicSlicesBoolFieldID, basicSlicesIntFieldID, basicSlicesInt8FieldID, basicSlicesInt16FieldID, basicSlicesInt32FieldID, basicSlicesInt64FieldID, basicSlicesUIntFieldID, basicSlicesUInt8FieldID, basicSlicesUInt16FieldID, basicSlicesUInt32FieldID, basicSlicesUInt64FieldID, basicSlicesUIntptrFieldID, basicSlicesFloat32FieldID, basicSlicesFloat64FieldID, basicSlicesComplex64FieldID, basicSlicesComplex128FieldID, basicSlicesStringFieldID, basicSlicesByteFieldID) -var BasicSlicesPreloadRelations = []badorm.Condition[basicslices.BasicSlices]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go index 1e1ae696..728e42dc 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go @@ -196,4 +196,3 @@ func BasicSlicesPointerByte(expr badorm.Expression[[]uint8]) badorm.WhereConditi } var BasicSlicesPointerPreloadAttributes = badorm.NewPreloadCondition[basicslicespointer.BasicSlicesPointer](basicSlicesPointerBoolFieldID, basicSlicesPointerIntFieldID, basicSlicesPointerInt8FieldID, basicSlicesPointerInt16FieldID, basicSlicesPointerInt32FieldID, basicSlicesPointerInt64FieldID, basicSlicesPointerUIntFieldID, basicSlicesPointerUInt8FieldID, basicSlicesPointerUInt16FieldID, basicSlicesPointerUInt32FieldID, basicSlicesPointerUInt64FieldID, basicSlicesPointerUIntptrFieldID, basicSlicesPointerFloat32FieldID, basicSlicesPointerFloat64FieldID, basicSlicesPointerComplex64FieldID, basicSlicesPointerComplex128FieldID, basicSlicesPointerStringFieldID, basicSlicesPointerByteFieldID) -var BasicSlicesPointerPreloadRelations = []badorm.Condition[basicslicespointer.BasicSlicesPointer]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go index 4c007428..dd96d522 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go @@ -196,4 +196,3 @@ func BasicTypesByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basicty } var BasicTypesPreloadAttributes = badorm.NewPreloadCondition[basictypes.BasicTypes](basicTypesBoolFieldID, basicTypesIntFieldID, basicTypesInt8FieldID, basicTypesInt16FieldID, basicTypesInt32FieldID, basicTypesInt64FieldID, basicTypesUIntFieldID, basicTypesUInt8FieldID, basicTypesUInt16FieldID, basicTypesUInt32FieldID, basicTypesUInt64FieldID, basicTypesUIntptrFieldID, basicTypesFloat32FieldID, basicTypesFloat64FieldID, basicTypesComplex64FieldID, basicTypesComplex128FieldID, basicTypesStringFieldID, basicTypesByteFieldID) -var BasicTypesPreloadRelations = []badorm.Condition[basictypes.BasicTypes]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go index 739eb26e..1d6035a3 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go @@ -34,4 +34,3 @@ func OwnerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio } var OwnerPreloadAttributes = badorm.NewPreloadCondition[belongsto.Owner]() -var OwnerPreloadRelations = []badorm.Condition[belongsto.Owner]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go index ffe5bc62..c9aa62f9 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go @@ -43,4 +43,3 @@ func ColumnDefinitionString(expr badorm.Expression[string]) badorm.WhereConditio } var ColumnDefinitionPreloadAttributes = badorm.NewPreloadCondition[columndefinition.ColumnDefinition](columnDefinitionStringFieldID) -var ColumnDefinitionPreloadRelations = []badorm.Condition[columndefinition.ColumnDefinition]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go index b74e19ad..597bbfa0 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go @@ -43,4 +43,3 @@ func CustomTypeCustom(expr badorm.Expression[customtype.MultiString]) badorm.Whe } var CustomTypePreloadAttributes = badorm.NewPreloadCondition[customtype.CustomType](customTypeCustomFieldID) -var CustomTypePreloadRelations = []badorm.Condition[customtype.CustomType]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go index 5497150f..2f1cc747 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go @@ -52,4 +52,3 @@ func GoEmbeddedToBeEmbeddedInt(expr badorm.Expression[int]) badorm.WhereConditio } var GoEmbeddedPreloadAttributes = badorm.NewPreloadCondition[goembedded.GoEmbedded](goEmbeddedIntFieldID, goEmbeddedToBeEmbeddedIntFieldID) -var GoEmbeddedPreloadRelations = []badorm.Condition[goembedded.GoEmbedded]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go index 30c11c3f..14302c14 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go @@ -64,4 +64,3 @@ func GormEmbeddedGormEmbeddedNoPrefixInt(expr badorm.Expression[int]) badorm.Whe } var GormEmbeddedPreloadAttributes = badorm.NewPreloadCondition[gormembedded.GormEmbedded](gormEmbeddedIntFieldID, gormEmbeddedGormEmbeddedIntFieldID, gormEmbeddedGormEmbeddedNoPrefixIntFieldID) -var GormEmbeddedPreloadRelations = []badorm.Condition[gormembedded.GormEmbedded]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go index 13a1ac25..0193750d 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go @@ -43,4 +43,3 @@ func Package2Package1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereConditi } var Package2PreloadAttributes = badorm.NewPreloadCondition[package2.Package2](package2Package1IdFieldID) -var Package2PreloadRelations = []badorm.Condition[package2.Package2]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go index 50021ed9..f375d0ef 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go @@ -34,4 +34,3 @@ func PersonDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditi } var PersonPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkey.Person]() -var PersonPreloadRelations = []badorm.Condition[overrideforeignkey.Person]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go index 50903aa6..af712da4 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go @@ -43,4 +43,3 @@ func CreditCardUserReference(expr badorm.Expression[badorm.UUID]) badorm.WhereCo } var CreditCardPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkeyinverse.CreditCard](creditCardUserReferenceFieldID) -var CreditCardPreloadRelations = []badorm.Condition[overrideforeignkeyinverse.CreditCard]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go index e267ec43..91b120d4 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go @@ -43,4 +43,3 @@ func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[overrideref } var BrandPreloadAttributes = badorm.NewPreloadCondition[overridereferences.Brand](brandNameFieldID) -var BrandPreloadRelations = []badorm.Condition[overridereferences.Brand]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go index 94244d95..c9d0cbe3 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go @@ -43,4 +43,3 @@ func ProcessorComputerName(expr badorm.Expression[string]) badorm.WhereCondition } var ProcessorPreloadAttributes = badorm.NewPreloadCondition[overridereferencesinverse.Processor](processorComputerNameFieldID) -var ProcessorPreloadRelations = []badorm.Condition[overridereferencesinverse.Processor]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go index e0cad550..f829d9ef 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go @@ -34,4 +34,3 @@ func UintModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCond } var UintModelPreloadAttributes = badorm.NewPreloadCondition[uintmodel.UintModel]() -var UintModelPreloadRelations = []badorm.Condition[uintmodel.UintModel]{} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go index f25bd6ff..24e2faa6 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go @@ -34,4 +34,3 @@ func UUIDModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCond } var UUIDModelPreloadAttributes = badorm.NewPreloadCondition[uuidmodel.UUIDModel]() -var UUIDModelPreloadRelations = []badorm.Condition[uuidmodel.UUIDModel]{} From cc1bb4c1e966611e8212b63b0da33ec2e15e67cd Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 15:54:16 +0200 Subject: [PATCH 411/467] fix posible nil reference in int tests --- testintegration/preload_conditions_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index a630a589..1af9498b 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -111,7 +111,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadWithoutWhereConditionDoesNot EqualList(&ts.Suite, []*models.Sale{withSeller, withoutSeller}, entities) ts.True(pie.Any(entities, func(sale *models.Sale) bool { saleSeller, err := sale.GetSeller() - return err == nil && saleSeller.Equal(*seller1) + return err == nil && saleSeller != nil && saleSeller.Equal(*seller1) })) ts.True(pie.Any(entities, func(sale *models.Sale) bool { // in this case sale.Seller will also be nil From fc7afa27c025920035dcbcce1edb6fe8d528b398 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 16:18:02 +0200 Subject: [PATCH 412/467] add self referencial preload tests --- testintegration/preload_conditions_test.go | 67 ++++++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index 1af9498b..79dca375 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -40,12 +40,11 @@ func NewPreloadConditionsIntTestSuite( CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ db: db, }, - crudSaleService: crudSaleService, - crudCompanyService: crudCompanyService, - crudSellerService: crudSellerService, - crudCountryService: crudCountryService, - crudCityService: crudCityService, - // TODO hacer algun test de self reference preload + crudSaleService: crudSaleService, + crudCompanyService: crudCompanyService, + crudSellerService: crudSellerService, + crudCountryService: crudCountryService, + crudCityService: crudCityService, crudEmployeeService: crudEmployeeService, crudChildService: crudChildService, crudPhoneService: crudPhoneService, @@ -300,6 +299,62 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadUIntModel() { })) } +func (ts *PreloadConditionsIntTestSuite) TestPreloadSelfReferential() { + boss1 := &models.Employee{ + Name: "Xavier", + } + + employee1 := ts.createEmployee("franco", boss1) + employee2 := ts.createEmployee("pierre", nil) + + entities, err := ts.crudEmployeeService.GetEntities( + conditions.EmployeePreloadBoss, + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Employee{boss1, employee1, employee2}, entities) + + ts.True(pie.Any(entities, func(employee *models.Employee) bool { + employeeBoss, err := employee.GetBoss() + return err == nil && employeeBoss != nil && employeeBoss.Equal(*boss1) + })) + ts.True(pie.Any(entities, func(employee *models.Employee) bool { + employeeBoss, err := employee.GetBoss() + return err == nil && employeeBoss == nil + })) +} + +func (ts *PreloadConditionsIntTestSuite) TestPreloadSelfReferentialAtSecondLevel() { + bossBoss := &models.Employee{ + Name: "Xavier", + } + boss := &models.Employee{ + Name: "Vincent", + Boss: bossBoss, + } + employee := ts.createEmployee("franco", boss) + + entities, err := ts.crudEmployeeService.GetEntities( + conditions.EmployeeBoss( + conditions.EmployeeBoss( + conditions.EmployeePreloadAttributes, + ), + ), + conditions.EmployeeName(badorm.Eq("franco")), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Employee{employee}, entities) + + bossLoaded, err := entities[0].GetBoss() + ts.Nil(err) + ts.True(bossLoaded.Equal(*boss)) + + bossBossLoaded, err := bossLoaded.GetBoss() + ts.Nil(err) + ts.True(bossBossLoaded.Equal(*bossBoss)) +} + func (ts *PreloadConditionsIntTestSuite) TestPreloadWithWhereConditionFilters() { product1 := ts.createProduct("a_string", 1, 0.0, false, nil) product1.EmbeddedInt = 1 From f4d72e67670be967aca228a2175ff83a3998d993 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 16:51:18 +0200 Subject: [PATCH 413/467] remove not necesary code --- badorm/uuid.go | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/badorm/uuid.go b/badorm/uuid.go index ffe0ec34..4bf0f95d 100644 --- a/badorm/uuid.go +++ b/badorm/uuid.go @@ -62,14 +62,7 @@ func (id *UUID) UnmarshalBinary(data []byte) error { } func (id *UUID) Scan(src interface{}) error { - switch src := src.(type) { - case nil: - *id = NilUUID - - return nil - default: - return (*uuid.UUID)(id).Scan(src) - } + return (*uuid.UUID)(id).Scan(src) } func (id UUID) IsNil() bool { From 84d5c872bacc32ff327e00ae5989174d069dda37 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 16:59:17 +0200 Subject: [PATCH 414/467] add more comments to conditions --- badorm/condition.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index c54d8667..8fcae2f6 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -9,13 +9,13 @@ import ( "gorm.io/gorm" ) -const DeletedAtField = "DeletedAt" +const deletedAtField = "DeletedAt" var ( IDFieldID = FieldIdentifier{Field: "ID"} CreatedAtFieldID = FieldIdentifier{Field: "CreatedAt"} UpdatedAtFieldID = FieldIdentifier{Field: "UpdatedAt"} - DeletedAtFieldID = FieldIdentifier{Field: DeletedAtField} + DeletedAtFieldID = FieldIdentifier{Field: deletedAtField} ) var ( @@ -29,11 +29,13 @@ type Table struct { Initial bool } +// Returns true if the Table is the initial table in a query func (t Table) IsInitial() bool { return t.Initial } -func (t Table) DeliverTable(query *gorm.DB, model any, relationName string) (Table, error) { +// Returns the related Table corresponding to the model +func (t Table) DeliverTable(query *gorm.DB, model Model, relationName string) (Table, error) { // get the name of the table for the model tableName, err := getTableName(query, model) if err != nil { @@ -193,7 +195,7 @@ func (columnID FieldIdentifier) ColumnName(db *gorm.DB, table Table) string { return columnID.ColumnPrefix + columnName } -// TODO doc +// Condition used to the preload the attributes of a model type PreloadCondition[T Model] struct { Fields []FieldIdentifier } @@ -221,7 +223,7 @@ func (condition PreloadCondition[T]) ApplyTo(query *gorm.DB, table Table) (*gorm return query, nil } -// TODO doc +// Condition used to the preload the attributes of a model func NewPreloadCondition[T Model](fields ...FieldIdentifier) PreloadCondition[T] { return PreloadCondition[T]{ Fields: append( @@ -235,10 +237,11 @@ func NewPreloadCondition[T Model](fields ...FieldIdentifier) PreloadCondition[T] } } -// TODO doc +// Condition used to the preload a collection of models of a model type CollectionPreloadCondition[T1 Model, T2 Model] struct { CollectionField string - NestedPreloads []IJoinCondition[T2] + // For each model in the collection we can preload its relations + NestedPreloads []IJoinCondition[T2] } //nolint:unused // see inside @@ -255,6 +258,7 @@ func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *gorm.DB, _ Ta return query.Preload( condition.CollectionField, func(db *gorm.DB) *gorm.DB { + // apply NestedPreloads preloadsAsCondition := pie.Map( condition.NestedPreloads, func(joinCondition IJoinCondition[T2]) Condition[T2] { @@ -273,7 +277,7 @@ func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *gorm.DB, _ Ta ), nil } -// TODO doc +// Condition used to the preload a collection of models of a model func NewCollectionPreloadCondition[T1 Model, T2 Model](collectionField string, nestedPreloads []IJoinCondition[T2]) Condition[T1] { if pie.Any(nestedPreloads, func(nestedPreload IJoinCondition[T2]) bool { return !nestedPreload.makesPreload() || nestedPreload.makesFilter() @@ -324,7 +328,7 @@ func applyWhereCondition[T Model](condition WhereCondition[T], query *gorm.DB, t //nolint:unused // is used func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { - return condition.FieldIdentifier.Field == DeletedAtField + return condition.FieldIdentifier.Field == deletedAtField } func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table Table) (string, []any, error) { From 6b92ce45ccf2c975f4fea6ea2fc98cb06815d628 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 29 Jun 2023 17:12:50 +0200 Subject: [PATCH 415/467] change utils package name --- tools/badctl/cmd/gen/conditions/main.go | 4 +-- tools/badctl/cmd/gen/conditions/main_test.go | 32 +++++++++---------- tools/badctl/cmd/gen/docker.go | 4 +-- tools/badctl/cmd/gen/docker_test.go | 26 +++++++-------- tools/badctl/cmd/{utils => testutils}/file.go | 2 +- 5 files changed, 34 insertions(+), 34 deletions(-) rename tools/badctl/cmd/{utils => testutils}/file.go (95%) diff --git a/tools/badctl/cmd/gen/conditions/main.go b/tools/badctl/cmd/gen/conditions/main.go index 33523d29..3c830bc3 100644 --- a/tools/badctl/cmd/gen/conditions/main.go +++ b/tools/badctl/cmd/gen/conditions/main.go @@ -21,7 +21,7 @@ var GenConditionsCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Use: "conditions", Short: "Generate conditions to query your objects using BaDORM", Long: `gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way.`, - Run: generateConditions, + Run: GenerateConditions, Args: cobra.MinimumNArgs(1), }) @@ -41,7 +41,7 @@ func init() { } // GenConditionsCmd Run func -func generateConditions(_ *cobra.Command, args []string) { +func GenerateConditions(_ *cobra.Command, args []string) { log.SetLevel() // Inspect package and use type checker to infer imported types pkgs := loadPackages(args) diff --git a/tools/badctl/cmd/gen/conditions/main_test.go b/tools/badctl/cmd/gen/conditions/main_test.go index 4b4559fc..5f4960d4 100644 --- a/tools/badctl/cmd/gen/conditions/main_test.go +++ b/tools/badctl/cmd/gen/conditions/main_test.go @@ -9,7 +9,7 @@ import ( "github.com/spf13/viper" "gotest.tools/assert" - "github.com/ditrit/badaas/tools/badctl/cmd/utils" + "github.com/ditrit/badaas/tools/badctl/cmd/testutils" ) const chunkSize = 100000 @@ -18,70 +18,70 @@ func TestUIntModel(t *testing.T) { doTest(t, "./tests/uintmodel", []Comparison{ {Have: "uint_model_conditions.go", Expected: "./tests/results/uintmodel.go"}, }) - utils.CheckFileNotExists(t, "./tests/uintmodel/badorm.go") + testutils.CheckFileNotExists(t, "./tests/uintmodel/badorm.go") } func TestUUIDModel(t *testing.T) { doTest(t, "./tests/uuidmodel", []Comparison{ {Have: "uuid_model_conditions.go", Expected: "./tests/results/uuidmodel.go"}, }) - utils.CheckFileNotExists(t, "./tests/uuidmodel/badorm.go") + testutils.CheckFileNotExists(t, "./tests/uuidmodel/badorm.go") } func TestBasicTypes(t *testing.T) { doTest(t, "./tests/basictypes", []Comparison{ {Have: "basic_types_conditions.go", Expected: "./tests/results/basictypes.go"}, }) - utils.CheckFileNotExists(t, "./tests/basictypes/badorm.go") + testutils.CheckFileNotExists(t, "./tests/basictypes/badorm.go") } func TestBasicPointers(t *testing.T) { doTest(t, "./tests/basicpointers", []Comparison{ {Have: "basic_pointers_conditions.go", Expected: "./tests/results/basicpointers.go"}, }) - utils.CheckFileNotExists(t, "./tests/basicpointers/badorm.go") + testutils.CheckFileNotExists(t, "./tests/basicpointers/badorm.go") } func TestBasicSlices(t *testing.T) { doTest(t, "./tests/basicslices", []Comparison{ {Have: "basic_slices_conditions.go", Expected: "./tests/results/basicslices.go"}, }) - utils.CheckFileNotExists(t, "./tests/basicslices/badorm.go") + testutils.CheckFileNotExists(t, "./tests/basicslices/badorm.go") } func TestBasicSlicesPointer(t *testing.T) { doTest(t, "./tests/basicslicespointer", []Comparison{ {Have: "basic_slices_pointer_conditions.go", Expected: "./tests/results/basicslicespointer.go"}, }) - utils.CheckFileNotExists(t, "./tests/basicslicespointer/badorm.go") + testutils.CheckFileNotExists(t, "./tests/basicslicespointer/badorm.go") } func TestGoEmbedded(t *testing.T) { doTest(t, "./tests/goembedded", []Comparison{ {Have: "go_embedded_conditions.go", Expected: "./tests/results/goembedded.go"}, }) - utils.CheckFileNotExists(t, "./tests/goembedded/badorm.go") + testutils.CheckFileNotExists(t, "./tests/goembedded/badorm.go") } func TestGormEmbedded(t *testing.T) { doTest(t, "./tests/gormembedded", []Comparison{ {Have: "gorm_embedded_conditions.go", Expected: "./tests/results/gormembedded.go"}, }) - utils.CheckFileNotExists(t, "./tests/gormembedded/badorm.go") + testutils.CheckFileNotExists(t, "./tests/gormembedded/badorm.go") } func TestCustomType(t *testing.T) { doTest(t, "./tests/customtype", []Comparison{ {Have: "custom_type_conditions.go", Expected: "./tests/results/customtype.go"}, }) - utils.CheckFileNotExists(t, "./tests/customtype/badorm.go") + testutils.CheckFileNotExists(t, "./tests/customtype/badorm.go") } func TestColumnDefinition(t *testing.T) { doTest(t, "./tests/columndefinition", []Comparison{ {Have: "column_definition_conditions.go", Expected: "./tests/results/columndefinition.go"}, }) - utils.CheckFileNotExists(t, "./tests/columndefinition/badorm.go") + testutils.CheckFileNotExists(t, "./tests/columndefinition/badorm.go") } func TestBelongsTo(t *testing.T) { @@ -131,7 +131,7 @@ func TestMultiplePackage(t *testing.T) { doTest(t, "./tests/multiplepackage/package2", []Comparison{ {Have: "package2_conditions.go", Expected: "./tests/results/multiplepackage_package2.go"}, }) - utils.CheckFileNotExists(t, "./tests/multiplepackage/package2/badorm.go") + testutils.CheckFileNotExists(t, "./tests/multiplepackage/package2/badorm.go") } func TestOverrideForeignKey(t *testing.T) { @@ -173,7 +173,7 @@ type Comparison struct { func doTest(t *testing.T, sourcePkg string, comparisons []Comparison) { viper.Set(DestPackageKey, "conditions") - generateConditions(nil, []string{sourcePkg}) + GenerateConditions(nil, []string{sourcePkg}) for _, comparison := range comparisons { checkFilesEqual(t, comparison.Have, comparison.Expected) @@ -181,8 +181,8 @@ func doTest(t *testing.T, sourcePkg string, comparisons []Comparison) { } func checkFilesEqual(t *testing.T, file1, file2 string) { - stat1 := utils.CheckFileExists(t, file1) - stat2 := utils.CheckFileExists(t, file2) + stat1 := testutils.CheckFileExists(t, file1) + stat2 := testutils.CheckFileExists(t, file2) // do inputs at least have the same size? assert.Equal(t, stat1.Size(), stat2.Size(), "File lens are not equal") @@ -223,5 +223,5 @@ func checkFilesEqual(t *testing.T, file1, file2 string) { } } - utils.RemoveFile(file1) + testutils.RemoveFile(file1) } diff --git a/tools/badctl/cmd/gen/docker.go b/tools/badctl/cmd/gen/docker.go index 27d533b1..1bfc4c72 100644 --- a/tools/badctl/cmd/gen/docker.go +++ b/tools/badctl/cmd/gen/docker.go @@ -26,7 +26,7 @@ var genDockerCmd = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Use: "docker", Short: "Generate files and configurations necessary to use BadAss over Docker", Long: `gen is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way.`, - Run: generateDockerFiles, + Run: GenerateDockerFiles, }) const destBadaasDir = "badaas" @@ -80,7 +80,7 @@ func init() { ) } -func generateDockerFiles(_ *cobra.Command, _ []string) { +func GenerateDockerFiles(_ *cobra.Command, _ []string) { sourceDockerDir := "docker" destDockerDir := filepath.Join(destBadaasDir, "docker") diff --git a/tools/badctl/cmd/gen/docker_test.go b/tools/badctl/cmd/gen/docker_test.go index 677802d3..74d4f66d 100644 --- a/tools/badctl/cmd/gen/docker_test.go +++ b/tools/badctl/cmd/gen/docker_test.go @@ -9,11 +9,11 @@ import ( "github.com/spf13/viper" "gopkg.in/yaml.v3" - "github.com/ditrit/badaas/tools/badctl/cmd/utils" + "github.com/ditrit/badaas/tools/badctl/cmd/testutils" ) func TestGenCockroach(t *testing.T) { - generateDockerFiles(nil, nil) + GenerateDockerFiles(nil, nil) checkFilesExist(t) checkDBPort(t, 26257) teardown() @@ -21,21 +21,21 @@ func TestGenCockroach(t *testing.T) { func TestGenPostgres(t *testing.T) { viper.Set(DBProviderKey, Postgres) - generateDockerFiles(nil, nil) + GenerateDockerFiles(nil, nil) checkFilesExist(t) - utils.CheckFileExists(t, "badaas/docker/db/init.sql") + testutils.CheckFileExists(t, "badaas/docker/db/init.sql") checkDBPort(t, 5432) teardown() } func checkFilesExist(t *testing.T) { - utils.CheckFileExists(t, ".dockerignore") - utils.CheckFileExists(t, "Makefile") - utils.CheckFileExists(t, "badaas/config/badaas.yml") - utils.CheckFileExists(t, "badaas/docker/api/docker-compose.yml") - utils.CheckFileExists(t, "badaas/docker/api/Dockerfile") - utils.CheckFileExists(t, "badaas/docker/db/docker-compose.yml") + testutils.CheckFileExists(t, ".dockerignore") + testutils.CheckFileExists(t, "Makefile") + testutils.CheckFileExists(t, "badaas/config/badaas.yml") + testutils.CheckFileExists(t, "badaas/docker/api/docker-compose.yml") + testutils.CheckFileExists(t, "badaas/docker/api/Dockerfile") + testutils.CheckFileExists(t, "badaas/docker/db/docker-compose.yml") } func checkDBPort(t *testing.T, port int) { @@ -60,7 +60,7 @@ func checkDBPort(t *testing.T, port int) { } func teardown() { - utils.RemoveFile(".dockerignore") - utils.RemoveFile("Makefile") - utils.RemoveFile("badaas") + testutils.RemoveFile(".dockerignore") + testutils.RemoveFile("Makefile") + testutils.RemoveFile("badaas") } diff --git a/tools/badctl/cmd/utils/file.go b/tools/badctl/cmd/testutils/file.go similarity index 95% rename from tools/badctl/cmd/utils/file.go rename to tools/badctl/cmd/testutils/file.go index ab9969f2..a0c8c5d9 100644 --- a/tools/badctl/cmd/utils/file.go +++ b/tools/badctl/cmd/testutils/file.go @@ -1,4 +1,4 @@ -package utils +package testutils import ( "io/fs" From 8bc041d266b5e5d44846738cf1b34cc3e092d017 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 3 Jul 2023 15:19:09 +0200 Subject: [PATCH 416/467] refactor: gorm.db to query --- badorm/condition.go | 154 ++++++++++++++------------------------- badorm/crudRepository.go | 29 +------- badorm/expression.go | 10 +-- badorm/query.go | 130 +++++++++++++++++++++++++++++++++ 4 files changed, 192 insertions(+), 131 deletions(-) create mode 100644 badorm/query.go diff --git a/badorm/condition.go b/badorm/condition.go index 8fcae2f6..ee8910e4 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -23,44 +23,11 @@ var ( ErrOnlyPreloadsAllowed = errors.New("only conditions that do a preload are allowed") ) -type Table struct { - Name string - Alias string - Initial bool -} - -// Returns true if the Table is the initial table in a query -func (t Table) IsInitial() bool { - return t.Initial -} - -// Returns the related Table corresponding to the model -func (t Table) DeliverTable(query *gorm.DB, model Model, relationName string) (Table, error) { - // get the name of the table for the model - tableName, err := getTableName(query, model) - if err != nil { - return Table{}, err - } - - // add a suffix to avoid tables with the same name when joining - // the same table more than once - tableAlias := relationName - if !t.IsInitial() { - tableAlias = t.Alias + "__" + relationName - } - - return Table{ - Name: tableName, - Alias: tableAlias, - Initial: false, - }, nil -} - type Condition[T Model] interface { // Applies the condition to the "query" // using the "tableName" as name for the table holding // the data for object of type T - ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) + ApplyTo(query *query, table Table) error // This method is necessary to get the compiler to verify // that an object is of type Condition[T], @@ -75,7 +42,7 @@ type WhereCondition[T Model] interface { Condition[T] // Get the sql string and values to use in the query - GetSQL(query *gorm.DB, table Table) (string, []any, error) + GetSQL(query *query, table Table) (string, []any, error) // Returns true if the DeletedAt column if affected by the condition // If no condition affects the DeletedAt, the verification that it's null will be added automatically @@ -95,11 +62,11 @@ func (condition ContainerCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition ContainerCondition[T]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { +func (condition ContainerCondition[T]) ApplyTo(query *query, table Table) error { return applyWhereCondition[T](condition, query, table) } -func (condition ContainerCondition[T]) GetSQL(query *gorm.DB, table Table) (string, []any, error) { +func (condition ContainerCondition[T]) GetSQL(query *query, table Table) (string, []any, error) { sqlString, values, err := condition.ConnectionCondition.GetSQL(query, table) if err != nil { return "", nil, err @@ -141,11 +108,11 @@ func (condition ConnectionCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition ConnectionCondition[T]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { +func (condition ConnectionCondition[T]) ApplyTo(query *query, table Table) error { return applyWhereCondition[T](condition, query, table) } -func (condition ConnectionCondition[T]) GetSQL(query *gorm.DB, table Table) (string, []any, error) { +func (condition ConnectionCondition[T]) GetSQL(query *query, table Table) (string, []any, error) { sqlStrings := []string{} values := []any{} @@ -179,22 +146,6 @@ func NewConnectionCondition[T Model](connector string, conditions ...WhereCondit } } -type FieldIdentifier struct { - Column string - Field string - ColumnPrefix string -} - -func (columnID FieldIdentifier) ColumnName(db *gorm.DB, table Table) string { - columnName := columnID.Column - if columnName == "" { - columnName = db.NamingStrategy.ColumnName(table.Name, columnID.Field) - } - - // add column prefix and table name once we know the column name - return columnID.ColumnPrefix + columnName -} - // Condition used to the preload the attributes of a model type PreloadCondition[T Model] struct { Fields []FieldIdentifier @@ -206,21 +157,12 @@ func (condition PreloadCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition PreloadCondition[T]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { +func (condition PreloadCondition[T]) ApplyTo(query *query, table Table) error { for _, fieldID := range condition.Fields { - columnName := fieldID.ColumnName(query, table) - - query.Statement.Selects = append( - query.Statement.Selects, - fmt.Sprintf( - "%[1]s.%[2]s AS \"%[1]s__%[2]s\"", // name used by gorm to load the fields inside the models - table.Alias, - columnName, - ), - ) + query.AddSelect(table, fieldID) } - return query, nil + return nil } // Condition used to the preload the attributes of a model @@ -250,12 +192,13 @@ func (condition CollectionPreloadCondition[T1, T2]) interfaceVerificationMethod( // that an object is of type Condition[T1] } -func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *gorm.DB, _ Table) (*gorm.DB, error) { +func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(queryV *query, _ Table) error { if len(condition.NestedPreloads) == 0 { - return query.Preload(condition.CollectionField), nil + queryV.Preload(condition.CollectionField) + return nil } - return query.Preload( + queryV.Preload( condition.CollectionField, func(db *gorm.DB) *gorm.DB { // apply NestedPreloads @@ -266,15 +209,19 @@ func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *gorm.DB, _ Ta }, ) - query, err := applyConditionsToQuery[T2](db, preloadsAsCondition) + preloadInternalQuery := &query{gormDB: db} + + err := applyConditionsToQuery[T2](preloadInternalQuery, preloadsAsCondition) if err != nil { _ = db.AddError(err) return db } - return query + return preloadInternalQuery.gormDB }, - ), nil + ) + + return nil } // Condition used to the preload a collection of models of a model @@ -306,24 +253,26 @@ func (condition FieldCondition[TObject, TAtribute]) interfaceVerificationMethod( // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value -func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { +func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *query, table Table) error { return applyWhereCondition[TObject](condition, query, table) } -func applyWhereCondition[T Model](condition WhereCondition[T], query *gorm.DB, table Table) (*gorm.DB, error) { +func applyWhereCondition[T Model](condition WhereCondition[T], query *query, table Table) error { sql, values, err := condition.GetSQL(query, table) if err != nil { - return nil, err + return err } if condition.affectsDeletedAt() { - query = query.Unscoped() + query.Unscoped() } - return query.Where( + query.Where( sql, values..., - ), nil + ) + + return nil } //nolint:unused // is used @@ -331,9 +280,11 @@ func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { return condition.FieldIdentifier.Field == deletedAtField } -func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *gorm.DB, table Table) (string, []any, error) { - columnName := table.Alias + "." + condition.FieldIdentifier.ColumnName(query, table) - return condition.Expression.ToSQL(columnName) +func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *query, table Table) (string, []any, error) { + return condition.Expression.ToSQL( + query, + condition.FieldIdentifier.ColumnSQL(query, table), + ) } // Interface of a join condition that joins T with any other model @@ -386,14 +337,14 @@ func (condition JoinCondition[T1, T2]) makesFilter() bool { // Applies a join between the tables of T1 and T2 // previousTableName is the name of the table of T1 // It also applies the nested conditions -func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, t1Table Table) (*gorm.DB, error) { +func (condition JoinCondition[T1, T2]) ApplyTo(query *query, t1Table Table) error { whereConditions, joinConditions, t2PreloadCondition := divideConditionsByType(condition.Conditions) // get the sql to do the join with T2 // if it's only a preload use a left join t2Table, err := t1Table.DeliverTable(query, *new(T2), condition.RelationField) if err != nil { - return nil, err + return err } makesPreload := condition.makesPreload() @@ -407,9 +358,10 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, t1Table Table) (* // apply WhereConditions to the join in the "on" clause connectionCondition := And(whereConditions...) + // TODO aca es donde tengo que mandar la lista correcta onQuery, onValues, err := connectionCondition.GetSQL(query, t2Table) if err != nil { - return nil, err + return err } if onQuery != "" { @@ -424,7 +376,7 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, t1Table Table) (* } // add the join to the query - query = query.Joins(joinQuery, onValues...) + query.Joins(joinQuery, onValues...) // apply T1 preload condition // if this condition has a T2 preload condition @@ -432,36 +384,36 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *gorm.DB, t1Table Table) (* // and this is not first level (T1 is the type of the repository) // because T1 is always loaded in that case if makesPreload && !t1Table.IsInitial() { - query, err = condition.T1PreloadCondition.ApplyTo(query, t1Table) + err = condition.T1PreloadCondition.ApplyTo(query, t1Table) if err != nil { - return nil, err + return err } } // apply T2 preload condition if t2PreloadCondition != nil { - query, err = t2PreloadCondition.ApplyTo(query, t2Table) + err = t2PreloadCondition.ApplyTo(query, t2Table) if err != nil { - return nil, err + return err } } // apply nested joins for _, joinCondition := range joinConditions { - query, err = joinCondition.ApplyTo(query, t2Table) + err = joinCondition.ApplyTo(query, t2Table) if err != nil { - return nil, err + return err } } - return query, nil + return nil } // Returns the SQL string to do a join between T1 and T2 // taking into account that the ID attribute necessary to do it // can be either in T1's or T2's table. func (condition JoinCondition[T1, T2]) getSQLJoin( - query *gorm.DB, + query *query, t1Table Table, t2Table Table, isLeftJoin bool, @@ -476,9 +428,9 @@ func (condition JoinCondition[T1, T2]) getSQLJoin( `, t2Table.Name, t2Table.Alias, - query.NamingStrategy.ColumnName(t2Table.Name, condition.T2Field), + query.ColumnName(t2Table, condition.T2Field), t1Table.Alias, - query.NamingStrategy.ColumnName(t1Table.Name, condition.T1Field), + query.ColumnName(t1Table, condition.T1Field), joinString, ) } @@ -519,11 +471,11 @@ func (condition UnsafeCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition UnsafeCondition[T]) ApplyTo(query *gorm.DB, table Table) (*gorm.DB, error) { +func (condition UnsafeCondition[T]) ApplyTo(query *query, table Table) error { return applyWhereCondition[T](condition, query, table) } -func (condition UnsafeCondition[T]) GetSQL(_ *gorm.DB, table Table) (string, []any, error) { +func (condition UnsafeCondition[T]) GetSQL(_ *query, table Table) (string, []any, error) { return fmt.Sprintf( condition.SQLCondition, table.Alias, @@ -555,11 +507,11 @@ func (condition InvalidCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition InvalidCondition[T]) ApplyTo(_ *gorm.DB, _ Table) (*gorm.DB, error) { - return nil, condition.Err +func (condition InvalidCondition[T]) ApplyTo(_ *query, _ Table) error { + return condition.Err } -func (condition InvalidCondition[T]) GetSQL(_ *gorm.DB, _ Table) (string, []any, error) { +func (condition InvalidCondition[T]) GetSQL(_ *query, _ Table) (string, []any, error) { return "", nil, condition.Err } diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index accf1d2f..478d0252 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -85,41 +85,20 @@ func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Cond // Get the list of objects that match "conditions" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { - query, err := applyConditionsToQuery(tx, conditions) + query := &query{gormDB: tx} + + err := applyConditionsToQuery(query, conditions) if err != nil { return nil, err } // execute query var entities []*T - err = query.Find(&entities).Error + err = query.Find(&entities) return entities, err } -func applyConditionsToQuery[T Model](query *gorm.DB, conditions []Condition[T]) (*gorm.DB, error) { - initialTableName, err := getTableName(query, *new(T)) - if err != nil { - return nil, err - } - - initialTable := Table{ - Name: initialTableName, - Alias: initialTableName, - Initial: true, - } - - query = query.Select(initialTableName + ".*") - for _, condition := range conditions { - query, err = condition.ApplyTo(query, initialTable) - if err != nil { - return nil, err - } - } - - return query, nil -} - // Get the name of the table in "db" in which the data for "entity" is saved // returns error is table name can not be found by gorm, // probably because the type of "entity" is not registered using AddModel diff --git a/badorm/expression.go b/badorm/expression.go index 4ebe488b..75b8a122 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -20,7 +20,7 @@ var ( type Expression[T any] interface { // Transform the Expression to a SQL string and a list of values to use in the query // columnName is used by the expression to determine which is the objective column. - ToSQL(columnName string) (string, []any, error) + ToSQL(query *query, columnName string) (string, []any, error) // This method is necessary to get the compiler to verify // that an object is of type Expression[T], @@ -47,7 +47,7 @@ func (expr ValueExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr ValueExpression[T]) ToSQL(columnName string) (string, []any, error) { +func (expr ValueExpression[T]) ToSQL(_ *query, columnName string) (string, []any, error) { exprString := columnName values := []any{} @@ -116,7 +116,7 @@ func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr MultivalueExpression[T]) ToSQL(columnName string) (string, []any, error) { +func (expr MultivalueExpression[T]) ToSQL(_ *query, columnName string) (string, []any, error) { placeholders := strings.Join(pie.Map(expr.Values, func(value T) string { return "?" }), " "+expr.SQLConnector+" ") @@ -155,7 +155,7 @@ func (expr PredicateExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr PredicateExpression[T]) ToSQL(columnName string) (string, []any, error) { +func (expr PredicateExpression[T]) ToSQL(_ *query, columnName string) (string, []any, error) { return fmt.Sprintf("%s %s", columnName, expr.SQLExpression), []any{}, nil } @@ -175,7 +175,7 @@ func (expr InvalidExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr InvalidExpression[T]) ToSQL(_ string) (string, []any, error) { +func (expr InvalidExpression[T]) ToSQL(_ *query, _ string) (string, []any, error) { return "", nil, expr.Err } diff --git a/badorm/query.go b/badorm/query.go new file mode 100644 index 00000000..e06a052a --- /dev/null +++ b/badorm/query.go @@ -0,0 +1,130 @@ +package badorm + +import ( + "fmt" + + "gorm.io/gorm" +) + +// TODO creo que estos podrian ser todos tipos privados +type Table struct { + Name string + Alias string + Initial bool +} + +// Returns true if the Table is the initial table in a query +func (t Table) IsInitial() bool { + return t.Initial +} + +// Returns the related Table corresponding to the model +func (t Table) DeliverTable(query *query, model Model, relationName string) (Table, error) { + // get the name of the table for the model + tableName, err := getTableName(query.gormDB, model) + if err != nil { + return Table{}, err + } + + // add a suffix to avoid tables with the same name when joining + // the same table more than once + tableAlias := relationName + if !t.IsInitial() { + tableAlias = t.Alias + "__" + relationName + } + + return Table{ + Name: tableName, + Alias: tableAlias, + Initial: false, + }, nil +} + +type FieldIdentifier struct { + Column string + Field string + ColumnPrefix string +} + +// Returns the name of the column in which the field is saved in the table +func (columnID FieldIdentifier) ColumnName(query *query, table Table) string { + columnName := columnID.Column + if columnName == "" { + columnName = query.ColumnName(table, columnID.Field) + } + + // add column prefix and table name once we know the column name + return columnID.ColumnPrefix + columnName +} + +// Returns the SQL to get the value of the field in the table +func (columnID FieldIdentifier) ColumnSQL(query *query, table Table) string { + return table.Alias + "." + columnID.ColumnName(query, table) +} + +type query struct { + gormDB *gorm.DB +} + +func (query *query) AddSelect(table Table, fieldID FieldIdentifier) { + columnName := fieldID.ColumnName(query, table) + + query.gormDB.Statement.Selects = append( + query.gormDB.Statement.Selects, + fmt.Sprintf( + "%[1]s.%[2]s AS \"%[1]s__%[2]s\"", // name used by gorm to load the fields inside the models + table.Alias, + columnName, + ), + ) +} + +func (query *query) Preload(preloadQuery string, args ...interface{}) { + query.gormDB = query.gormDB.Preload(preloadQuery, args...) +} + +func (query *query) Unscoped() { + query.gormDB = query.gormDB.Unscoped() +} + +func (query *query) Where(whereQuery interface{}, args ...interface{}) { + query.gormDB = query.gormDB.Where(whereQuery, args...) +} + +func (query *query) Joins(joinQuery string, args ...interface{}) { + query.gormDB = query.gormDB.Joins(joinQuery, args...) +} + +func (query *query) Find(dest interface{}, conds ...interface{}) error { + query.gormDB = query.gormDB.Find(dest, conds...) + + return query.gormDB.Error +} + +// TODO ver esta, porque no estoy usando los fields aca y que pasa si hay fk override y todo eso +func (query query) ColumnName(table Table, fieldName string) string { + return query.gormDB.NamingStrategy.ColumnName(table.Name, fieldName) +} + +func applyConditionsToQuery[T Model](query *query, conditions []Condition[T]) error { + initialTableName, err := getTableName(query.gormDB, *new(T)) + if err != nil { + return err + } + + initialTable := Table{ + Name: initialTableName, + Alias: initialTableName, + Initial: true, + } + + query.gormDB = query.gormDB.Select(initialTableName + ".*") + for _, condition := range conditions { + err = condition.ApplyTo(query, initialTable) + if err != nil { + return err + } + } + + return nil +} From 28b81c3510be5db34daf499603e0c72903010c56 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 3 Jul 2023 17:23:33 +0200 Subject: [PATCH 417/467] add possibility to do dynamic conditions --- badorm/condition.go | 19 ++-- badorm/crudRepository.go | 4 +- badorm/dynamicExpression.go | 87 +++++++++++++++++++ badorm/query.go | 30 +++++-- .../conditions/product_conditions.go | 13 +-- .../conditions/seller_conditions.go | 14 +-- testintegration/expressions_test.go | 19 ++++ testintegration/join_conditions_test.go | 52 +++++++++++ 8 files changed, 211 insertions(+), 27 deletions(-) create mode 100644 badorm/dynamicExpression.go diff --git a/badorm/condition.go b/badorm/condition.go index ee8910e4..4c965bec 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -192,13 +192,13 @@ func (condition CollectionPreloadCondition[T1, T2]) interfaceVerificationMethod( // that an object is of type Condition[T1] } -func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(queryV *query, _ Table) error { +func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *query, _ Table) error { if len(condition.NestedPreloads) == 0 { - queryV.Preload(condition.CollectionField) + query.Preload(condition.CollectionField) return nil } - queryV.Preload( + query.Preload( condition.CollectionField, func(db *gorm.DB) *gorm.DB { // apply NestedPreloads @@ -209,9 +209,7 @@ func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(queryV *query, _ Tab }, ) - preloadInternalQuery := &query{gormDB: db} - - err := applyConditionsToQuery[T2](preloadInternalQuery, preloadsAsCondition) + preloadInternalQuery, err := NewQuery(db, preloadsAsCondition) if err != nil { _ = db.AddError(err) return db @@ -340,9 +338,11 @@ func (condition JoinCondition[T1, T2]) makesFilter() bool { func (condition JoinCondition[T1, T2]) ApplyTo(query *query, t1Table Table) error { whereConditions, joinConditions, t2PreloadCondition := divideConditionsByType(condition.Conditions) + t2Model := *new(T2) + // get the sql to do the join with T2 // if it's only a preload use a left join - t2Table, err := t1Table.DeliverTable(query, *new(T2), condition.RelationField) + t2Table, err := t1Table.DeliverTable(query, t2Model, condition.RelationField) if err != nil { return err } @@ -355,6 +355,11 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *query, t1Table Table) erro len(whereConditions) == 0 && makesPreload, ) + query.AddConcernedModel( + t2Model, + t2Table, + ) + // apply WhereConditions to the join in the "on" clause connectionCondition := And(whereConditions...) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 478d0252..f0b2e519 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -85,9 +85,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Cond // Get the list of objects that match "conditions" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { - query := &query{gormDB: tx} - - err := applyConditionsToQuery(query, conditions) + query, err := NewQuery(tx, conditions) if err != nil { return nil, err } diff --git a/badorm/dynamicExpression.go b/badorm/dynamicExpression.go new file mode 100644 index 00000000..82d386f0 --- /dev/null +++ b/badorm/dynamicExpression.go @@ -0,0 +1,87 @@ +package badorm + +import ( + "errors" + "fmt" + "reflect" +) + +// TODO ponerles mas informacion precisa a los errores +var ( + ErrFieldTypeDoesNotMatch = errors.New("field type does not match expression type") + ErrFieldModelNotConcerned = errors.New("field's model is not concerned by the query so it can't be used in a expression") + ErrExpressionTypeNotSupported = errors.New("expression type not supported") +) + +// TODO ver el nombre +// TODO quizas field identifier deberia llamarse solo field +func NewDynamicExpression[T any](expression func(value T) Expression[T], field FieldIdentifier) Expression[T] { + tValue := *new(T) + + if field.Type != reflect.TypeOf(tValue).Kind() { + return NewInvalidExpression[T](ErrFieldTypeDoesNotMatch) + } + + staticExpression := expression( + // TODO esto podria no pasar alguna validacion + tValue, + ) + + if _, isInvalid := staticExpression.(InvalidExpression[T]); isInvalid { + return staticExpression + } + + if valueExpression, isValue := staticExpression.(ValueExpression[T]); isValue { + // TODO que pasa si hay mas de uno, no se si me gusta mucho esto + // creo que si hay mas de uno solo se tendria que aplicar en el primero, + return DynamicExpression[T]{ + SQLExpressions: []LiteralSQLExpression{ + { + SQL: valueExpression.ExpressionsAndValues[0].SQLExpression, + Field: field, + }, + }, + } + } + + // TODO soportar multivalue, no todos necesariamente dinamicos + return NewInvalidExpression[T](ErrExpressionTypeNotSupported) +} + +// TODO doc +type DynamicExpression[T any] struct { + // TODO hacer el cambio de nombre en el anterior tambien? + SQLExpressions []LiteralSQLExpression +} + +type LiteralSQLExpression struct { + SQL string + Field FieldIdentifier +} + +func (expr DynamicExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + +// verificar que en las condiciones anteriores alguien usó el field con el que se intenta comparar +// obtener de ahi cual es el nombre de la table a usar con ese field. +// TODO doc a ingles +func (expr DynamicExpression[T]) ToSQL(query *query, columnName string) (string, []any, error) { + exprString := columnName + values := []any{} + + for _, sqlExpr := range expr.SQLExpressions { + modelTable, isConcerned := query.concernedModels[sqlExpr.Field.ModelType] + if !isConcerned { + return "", nil, ErrFieldModelNotConcerned + } + + exprString += fmt.Sprintf( + " "+sqlExpr.SQL+" %s", + sqlExpr.Field.ColumnSQL(query, modelTable), + ) + } + + return exprString, values, nil +} diff --git a/badorm/query.go b/badorm/query.go index e06a052a..3a6ed8ac 100644 --- a/badorm/query.go +++ b/badorm/query.go @@ -2,6 +2,7 @@ package badorm import ( "fmt" + "reflect" "gorm.io/gorm" ) @@ -44,6 +45,8 @@ type FieldIdentifier struct { Column string Field string ColumnPrefix string + Type reflect.Kind + ModelType reflect.Type } // Returns the name of the column in which the field is saved in the table @@ -63,7 +66,8 @@ func (columnID FieldIdentifier) ColumnSQL(query *query, table Table) string { } type query struct { - gormDB *gorm.DB + gormDB *gorm.DB + concernedModels map[reflect.Type]Table } func (query *query) AddSelect(table Table, fieldID FieldIdentifier) { @@ -101,15 +105,22 @@ func (query *query) Find(dest interface{}, conds ...interface{}) error { return query.gormDB.Error } +func (query *query) AddConcernedModel(model Model, table Table) { + // TODO que pasa si ya estaba + query.concernedModels[reflect.TypeOf(model)] = table +} + // TODO ver esta, porque no estoy usando los fields aca y que pasa si hay fk override y todo eso func (query query) ColumnName(table Table, fieldName string) string { return query.gormDB.NamingStrategy.ColumnName(table.Name, fieldName) } -func applyConditionsToQuery[T Model](query *query, conditions []Condition[T]) error { - initialTableName, err := getTableName(query.gormDB, *new(T)) +func NewQuery[T Model](db *gorm.DB, conditions []Condition[T]) (*query, error) { + model := *new(T) + + initialTableName, err := getTableName(db, model) if err != nil { - return err + return nil, err } initialTable := Table{ @@ -118,13 +129,18 @@ func applyConditionsToQuery[T Model](query *query, conditions []Condition[T]) er Initial: true, } - query.gormDB = query.gormDB.Select(initialTableName + ".*") + query := &query{ + gormDB: db.Select(initialTableName + ".*"), + concernedModels: map[reflect.Type]Table{}, + } + query.AddConcernedModel(model, initialTable) + for _, condition := range conditions { err = condition.ApplyTo(query, initialTable) if err != nil { - return err + return nil, err } } - return nil + return query, nil } diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index ea73ca68..7af4859a 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -3,10 +3,13 @@ package conditions import ( "database/sql" + "reflect" + "time" + + gorm "gorm.io/gorm" + badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - gorm "gorm.io/gorm" - "time" ) func ProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Product] { @@ -52,12 +55,12 @@ func ProductInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Produc } } -var productIntPointerFieldID = badorm.FieldIdentifier{Field: "IntPointer"} +var ProductIntPointerField = badorm.FieldIdentifier{Field: "IntPointer", Type: reflect.Int, ModelType: reflect.TypeOf(models.Product{})} func ProductIntPointer(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ Expression: expr, - FieldIdentifier: productIntPointerFieldID, + FieldIdentifier: ProductIntPointerField, } } @@ -136,4 +139,4 @@ func ProductGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[m } } -var ProductPreloadAttributes = badorm.NewPreloadCondition[models.Product](productStringFieldID, productIntFieldID, productIntPointerFieldID, productFloatFieldID, productNullFloatFieldID, productBoolFieldID, productNullBoolFieldID, productByteArrayFieldID, productMultiStringFieldID, productToBeEmbeddedEmbeddedIntFieldID, productGormEmbeddedIntFieldID) +var ProductPreloadAttributes = badorm.NewPreloadCondition[models.Product](productStringFieldID, productIntFieldID, ProductIntPointerField, productFloatFieldID, productNullFloatFieldID, productBoolFieldID, productNullBoolFieldID, productByteArrayFieldID, productMultiStringFieldID, productToBeEmbeddedEmbeddedIntFieldID, productGormEmbeddedIntFieldID) diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index f2bc7228..f0fd8de1 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -2,10 +2,13 @@ package conditions import ( + "reflect" + "time" + + gorm "gorm.io/gorm" + badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" - gorm "gorm.io/gorm" - "time" ) func SellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { @@ -33,12 +36,13 @@ func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditi } } -var sellerNameFieldID = badorm.FieldIdentifier{Field: "Name"} +// TODO generacion automatica +var SellerNameField = badorm.FieldIdentifier{Field: "Name", Type: reflect.String, ModelType: reflect.TypeOf(models.Seller{})} func SellerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, string]{ Expression: expr, - FieldIdentifier: sellerNameFieldID, + FieldIdentifier: SellerNameField, } } func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.IJoinCondition[models.Seller] { @@ -80,5 +84,5 @@ func SellerUniversityId(expr badorm.Expression[badorm.UUID]) badorm.WhereConditi } } -var SellerPreloadAttributes = badorm.NewPreloadCondition[models.Seller](sellerNameFieldID, sellerCompanyIdFieldID, sellerUniversityIdFieldID) +var SellerPreloadAttributes = badorm.NewPreloadCondition[models.Seller](SellerNameField, sellerCompanyIdFieldID, sellerUniversityIdFieldID) var SellerPreloadRelations = []badorm.Condition[models.Seller]{SellerPreloadCompany, SellerPreloadUniversity} diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index b0553fdf..ca78f2c9 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -979,3 +979,22 @@ func (ts *ExpressionIntTestSuite) TestPosixRegexNotPosix() { ts.ErrorContains(err, "error parsing regexp") } } + +func (ts *ExpressionIntTestSuite) TestDynamicExpressionOver1Table() { + int1 := 1 + product1 := ts.createProduct("", 1, 0.0, false, &int1) + ts.createProduct("", 2, 0.0, false, &int1) + ts.createProduct("", 0, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.NewDynamicExpression( + badorm.Eq[int], + conditions.ProductIntPointerField, + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{product1}, entities) +} diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 9c797835..3b52fc01 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -354,6 +354,58 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsMultipleTimes() { EqualList(&ts.Suite, []*models.Sale{match}, entities) } +func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2Tables() { + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + seller1 := ts.createSeller("ditrit", company1) + ts.createSeller("agustin", company2) + + entities, err := ts.crudSellerService.GetEntities( + conditions.SellerCompany( + conditions.CompanyName( + badorm.NewDynamicExpression( + badorm.Eq[string], + conditions.SellerNameField, + ), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Seller{seller1}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2TablesAtMoreLevel() { + product1 := ts.createProduct("", 0, 0.0, false, nil) + product2 := ts.createProduct("", 0, 0.0, false, nil) + + company1 := ts.createCompany("ditrit") + company2 := ts.createCompany("orness") + + seller1 := ts.createSeller("ditrit", company1) + seller2 := ts.createSeller("agustin", company2) + + match := ts.createSale(0, product1, seller1) + ts.createSale(0, product2, seller2) + + entities, err := ts.crudSaleService.GetEntities( + conditions.SaleSeller( + conditions.SellerCompany( + conditions.CompanyName( + badorm.NewDynamicExpression( + badorm.Eq[string], + conditions.SellerNameField, + ), + ), + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Sale{match}, entities) +} + func (ts *JoinConditionsIntTestSuite) TestJoinWithUnsafeCondition() { product1 := ts.createProduct("", 0, 0.0, false, nil) product2 := ts.createProduct("", 0, 0.0, false, nil) From 0e8175d43da21b707d4be0d4012512f768604e0b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 4 Jul 2023 14:23:51 +0200 Subject: [PATCH 418/467] automatic generation of new fields --- badorm/condition.go | 16 +-- badorm/dynamicExpression.go | 69 ++++++---- badorm/expression.go | 30 ++-- badorm/expressions/sqlExpressions.go | 39 ++++++ badorm/mysql/comparison.go | 3 +- badorm/query.go | 2 +- badorm/sqlserver/comparison.go | 9 +- go.mod | 2 +- .../conditions/bicycle_conditions.go | 55 ++++++-- .../conditions/brand_conditions.go | 47 ++++++- .../conditions/child_conditions.go | 55 ++++++-- testintegration/conditions/city_conditions.go | 55 ++++++-- .../conditions/company_conditions.go | 47 ++++++- .../conditions/country_conditions.go | 47 ++++++- .../conditions/employee_conditions.go | 55 ++++++-- .../conditions/parent1_conditions.go | 47 ++++++- .../conditions/parent2_conditions.go | 47 ++++++- .../conditions/parent_parent_conditions.go | 47 ++++++- .../conditions/person_conditions.go | 47 ++++++- .../conditions/phone_conditions.go | 55 ++++++-- .../conditions/product_conditions.go | 130 +++++++++++++----- testintegration/conditions/sale_conditions.go | 71 ++++++++-- .../conditions/seller_conditions.go | 69 +++++++--- .../conditions/university_conditions.go | 47 ++++++- testintegration/expressions_test.go | 100 +++++++++++++- testintegration/join_conditions_test.go | 9 +- tools/badctl/cmd/gen/conditions/condition.go | 36 ++--- .../cmd/gen/conditions/conditionsGenerator.go | 21 +++ 28 files changed, 1005 insertions(+), 252 deletions(-) create mode 100644 badorm/expressions/sqlExpressions.go diff --git a/badorm/condition.go b/badorm/condition.go index 4c965bec..09c33fdb 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -11,13 +11,6 @@ import ( const deletedAtField = "DeletedAt" -var ( - IDFieldID = FieldIdentifier{Field: "ID"} - CreatedAtFieldID = FieldIdentifier{Field: "CreatedAt"} - UpdatedAtFieldID = FieldIdentifier{Field: "UpdatedAt"} - DeletedAtFieldID = FieldIdentifier{Field: deletedAtField} -) - var ( ErrEmptyConditions = errors.New("condition must have at least one inner condition") ErrOnlyPreloadsAllowed = errors.New("only conditions that do a preload are allowed") @@ -168,14 +161,7 @@ func (condition PreloadCondition[T]) ApplyTo(query *query, table Table) error { // Condition used to the preload the attributes of a model func NewPreloadCondition[T Model](fields ...FieldIdentifier) PreloadCondition[T] { return PreloadCondition[T]{ - Fields: append( - fields, - // base model fields - IDFieldID, - CreatedAtFieldID, - UpdatedAtFieldID, - DeletedAtFieldID, - ), + Fields: fields, } } diff --git a/badorm/dynamicExpression.go b/badorm/dynamicExpression.go index 82d386f0..dc7e8d3b 100644 --- a/badorm/dynamicExpression.go +++ b/badorm/dynamicExpression.go @@ -1,9 +1,15 @@ package badorm import ( + "database/sql" "errors" "fmt" "reflect" + + "github.com/elliotchance/pie/v2" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm/expressions" ) // TODO ponerles mas informacion precisa a los errores @@ -13,39 +19,54 @@ var ( ErrExpressionTypeNotSupported = errors.New("expression type not supported") ) +var nullableTypes = []reflect.Type{ + reflect.TypeOf(sql.NullBool{}), + reflect.TypeOf(sql.NullByte{}), + reflect.TypeOf(sql.NullFloat64{}), + reflect.TypeOf(sql.NullInt16{}), + reflect.TypeOf(sql.NullInt32{}), + reflect.TypeOf(sql.NullInt64{}), + reflect.TypeOf(sql.NullString{}), + reflect.TypeOf(sql.NullTime{}), + reflect.TypeOf(gorm.DeletedAt{}), +} + +func isNullable(fieldType reflect.Type) bool { + return pie.Contains(nullableTypes, fieldType) +} + // TODO ver el nombre // TODO quizas field identifier deberia llamarse solo field -func NewDynamicExpression[T any](expression func(value T) Expression[T], field FieldIdentifier) Expression[T] { - tValue := *new(T) +func NewDynamicExpression[T any](expression expressions.SQLExpression, field FieldIdentifier) Expression[T] { + expressionType := reflect.TypeOf(*new(T)) + fieldType := field.Type - if field.Type != reflect.TypeOf(tValue).Kind() { - return NewInvalidExpression[T](ErrFieldTypeDoesNotMatch) - } - - staticExpression := expression( - // TODO esto podria no pasar alguna validacion - tValue, - ) + // TODO si el field lo paso a tipado esto podria andar tambien en tiempo de compilacion, + // el problema es que no tengo como hacer esto de los nullables, a menos que cree otro metodo + // o que a los fields de cosas nullables le ponga el T de no nullable + // pero la expression me va a quedar de T no nullable y no va a andar + // podria ser otro metodo que acepte un field de cualquier tipo y ahi ver las condiciones estas + // el problema es que ese tipo despues no lo puedo obtener en tiempo de ejecucion creo + // entonces la unica posibilidad seria una funcion para cada una de las posibilidades - if _, isInvalid := staticExpression.(InvalidExpression[T]); isInvalid { - return staticExpression + if fieldType != expressionType && + !((isNullable(fieldType) && fieldType.Field(0).Type == expressionType) || + (isNullable(expressionType) && expressionType.Field(0).Type == fieldType)) { + return NewInvalidExpression[T](ErrFieldTypeDoesNotMatch) } - if valueExpression, isValue := staticExpression.(ValueExpression[T]); isValue { - // TODO que pasa si hay mas de uno, no se si me gusta mucho esto - // creo que si hay mas de uno solo se tendria que aplicar en el primero, - return DynamicExpression[T]{ - SQLExpressions: []LiteralSQLExpression{ - { - SQL: valueExpression.ExpressionsAndValues[0].SQLExpression, - Field: field, - }, + // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo + // TODO que pasa si hay mas de uno, no se si me gusta mucho esto + // creo que si hay mas de uno solo se tendria que aplicar en el primero, + return DynamicExpression[T]{ + SQLExpressions: []LiteralSQLExpression{ + { + SQL: expressions.ToSQL[expression], + Field: field, }, - } + }, } - // TODO soportar multivalue, no todos necesariamente dinamicos - return NewInvalidExpression[T](ErrExpressionTypeNotSupported) } // TODO doc diff --git a/badorm/expression.go b/badorm/expression.go index 75b8a122..4517c61a 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -10,6 +10,8 @@ import ( "strings" "github.com/elliotchance/pie/v2" + + "github.com/ditrit/badaas/badorm/expressions" ) var ( @@ -104,11 +106,11 @@ func (expr *ValueExpression[T]) AddSQLExpression(value any, sqlExpression string // Expression that compares the value of the column against multiple values // Example: value IN (v1, v2, v3, ..., vN) type MultivalueExpression[T any] struct { - Values []T - SQLExpression string - SQLConnector string - SQLPrefix string - SQLSuffix string + Values []T // the values to compare with + SQLExpression string // the expression used to compare, example: IN + SQLConnector string // the connector between values, example: ', ' + SQLPrefix string // something to put before the values, example: ( + SQLSuffix string // something to put after the values, example: ) } func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { @@ -195,7 +197,7 @@ func NewInvalidExpression[T any](err error) InvalidExpression[T] { // EqualTo // EqOrIsNull must be used in cases where value can be NULL func Eq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, "=") + return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.Eq]) } // if value is not NULL returns a Eq expression @@ -207,7 +209,7 @@ func Eq[T any](value T) Expression[T] { // - in SQLServer you can: // ** set ansi_nulls setting to off and use sqlserver.EqNullable // ** use the IS NOT DISTINCT operator (implemented in IsNotDistinct) -// - in MySQL you can use equal_to operator (implemented in mysql.IsEqual) +// - in MySQL you can use the equal_to operator (implemented in mysql.IsEqual) // - in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) // - in SQLite you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) func EqOrIsNull[T any](value any) Expression[T] { @@ -217,7 +219,7 @@ func EqOrIsNull[T any](value any) Expression[T] { // NotEqualTo // NotEqOrNotIsNull must be used in cases where value can be NULL func NotEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, "<>") + return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.NotEq]) } // if value is not NULL returns a NotEq expression @@ -282,22 +284,22 @@ func mapsToNull(value any) bool { // LessThan func Lt[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, "<") + return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.Lt]) } // LessThanOrEqualTo func LtOrEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, "<=") + return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.LtOrEq]) } // GreaterThan func Gt[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, ">") + return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.Gt]) } // GreaterThanOrEqualTo func GtOrEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, ">=") + return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.GtOrEq]) } // Comparison Predicates @@ -357,12 +359,12 @@ func IsNotUnknown[T bool | sql.NullBool]() PredicateExpression[T] { // Not supported by: mysql func IsDistinct[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, "IS DISTINCT FROM") + return NewValueExpression[T](value, expressions.ToSQL[expressions.IsDistinct]) } // Not supported by: mysql func IsNotDistinct[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, "IS NOT DISTINCT FROM") + return NewValueExpression[T](value, expressions.ToSQL[expressions.IsNotDistinct]) } // Pattern Matching diff --git a/badorm/expressions/sqlExpressions.go b/badorm/expressions/sqlExpressions.go new file mode 100644 index 00000000..3f387464 --- /dev/null +++ b/badorm/expressions/sqlExpressions.go @@ -0,0 +1,39 @@ +package expressions + +type SQLExpression uint + +const ( + Eq SQLExpression = iota + NotEq + Lt + LtOrEq + Gt + GtOrEq + IsDistinct // Not supported by: mysql + IsNotDistinct // Not supported by: mysql + // mysql + MySQLIsEqual + // sqlserver + SQLServerNotLt + SQLServerNotGt +) + +// alias +const ( + SQLServerEqNullable = Eq + SQLServerNotEqNullable = NotEq +) + +var ToSQL = map[SQLExpression]string{ + Eq: "=", + NotEq: "<>", + Lt: "<", + LtOrEq: "<=", + Gt: ">", + GtOrEq: ">=", + IsDistinct: "IS DISTINCT FROM", + IsNotDistinct: "IS NOT DISTINCT FROM", + MySQLIsEqual: "<=>", + SQLServerNotLt: "!<", + SQLServerNotGt: "!>", +} diff --git a/badorm/mysql/comparison.go b/badorm/mysql/comparison.go index e52ba2f4..3defbad2 100644 --- a/badorm/mysql/comparison.go +++ b/badorm/mysql/comparison.go @@ -4,6 +4,7 @@ import ( "database/sql" "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/expressions" ) // Comparison Predicates @@ -11,7 +12,7 @@ import ( // preferred over eq // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal-to func IsEqual[T any](value T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](value, "<=>") + return badorm.NewValueExpression[T](value, expressions.ToSQL[expressions.MySQLIsEqual]) } // Pattern Matching diff --git a/badorm/query.go b/badorm/query.go index 3a6ed8ac..4df0866d 100644 --- a/badorm/query.go +++ b/badorm/query.go @@ -45,7 +45,7 @@ type FieldIdentifier struct { Column string Field string ColumnPrefix string - Type reflect.Kind + Type reflect.Type ModelType reflect.Type } diff --git a/badorm/sqlserver/comparison.go b/badorm/sqlserver/comparison.go index f9b205ee..dfd12dd5 100644 --- a/badorm/sqlserver/comparison.go +++ b/badorm/sqlserver/comparison.go @@ -2,6 +2,7 @@ package sqlserver import ( "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/expressions" ) // Comparison Operators @@ -10,19 +11,19 @@ import ( // EqNullable is the same as badorm.Eq but it supports value to be NULL // ansi_nulls must be set to off to avoid the NULL = NULL: unknown problem func EqNullable[T any](value T) badorm.Expression[T] { - return badorm.NewValueExpression[T](value, "=") + return badorm.NewValueExpression[T](value, expressions.ToSQL[expressions.SQLServerEqNullable]) } // NotEqNullable is the same as badorm.NotEq but it supports value to be NULL // ansi_nulls must be set to off to avoid the NULL = NULL: unknown problem func NotEqNullable[T any](value T) badorm.Expression[T] { - return badorm.NewValueExpression[T](value, "<>") + return badorm.NewValueExpression[T](value, expressions.ToSQL[expressions.SQLServerNotEqNullable]) } func NotLt[T any](value T) badorm.Expression[T] { - return badorm.NewCantBeNullValueExpression[T](value, "!<") + return badorm.NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.SQLServerNotLt]) } func NotGt[T any](value T) badorm.Expression[T] { - return badorm.NewCantBeNullValueExpression[T](value, "!>") + return badorm.NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.SQLServerNotGt]) } diff --git a/go.mod b/go.mod index 41384ae1..2cad02f8 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/ditrit/badaas -go 1.18 +go 1.20 require ( github.com/DATA-DOG/go-sqlmock v1.5.0 diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index 3bc0c06c..7f125f36 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -5,40 +5,73 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var bicycleType = reflect.TypeOf(*new(models.Bicycle)) +var BicycleIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: bicycleType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func BicycleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: BicycleIdField, } } + +var BicycleCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: bicycleType, + Type: reflect.TypeOf(*new(time.Time)), +} + func BicycleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: BicycleCreatedAtField, } } + +var BicycleUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: bicycleType, + Type: reflect.TypeOf(*new(time.Time)), +} + func BicycleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: BicycleUpdatedAtField, } } + +var BicycleDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: bicycleType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: BicycleDeletedAtField, } } -var bicycleNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var BicycleNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: bicycleType, + Type: reflect.TypeOf(*new(string)), +} func BicycleName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, string]{ Expression: expr, - FieldIdentifier: bicycleNameFieldID, + FieldIdentifier: BicycleNameField, } } func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.IJoinCondition[models.Bicycle] { @@ -52,14 +85,18 @@ func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.IJoinCon } var BicyclePreloadOwner = BicycleOwner(PersonPreloadAttributes) -var bicycleOwnerNameFieldID = badorm.FieldIdentifier{Field: "OwnerName"} +var BicycleOwnerNameField = badorm.FieldIdentifier{ + Field: "OwnerName", + ModelType: bicycleType, + Type: reflect.TypeOf(*new(string)), +} func BicycleOwnerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, string]{ Expression: expr, - FieldIdentifier: bicycleOwnerNameFieldID, + FieldIdentifier: BicycleOwnerNameField, } } -var BicyclePreloadAttributes = badorm.NewPreloadCondition[models.Bicycle](bicycleNameFieldID, bicycleOwnerNameFieldID) +var BicyclePreloadAttributes = badorm.NewPreloadCondition[models.Bicycle](BicycleIdField, BicycleCreatedAtField, BicycleUpdatedAtField, BicycleDeletedAtField, BicycleNameField, BicycleOwnerNameField) var BicyclePreloadRelations = []badorm.Condition[models.Bicycle]{BicyclePreloadOwner} diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index 2bc30fe8..3d9c1c37 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -5,41 +5,74 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var brandType = reflect.TypeOf(*new(models.Brand)) +var BrandIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: brandType, + Type: reflect.TypeOf(*new(badorm.UIntID)), +} + func BrandId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, badorm.UIntID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: BrandIdField, } } + +var BrandCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: brandType, + Type: reflect.TypeOf(*new(time.Time)), +} + func BrandCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: BrandCreatedAtField, } } + +var BrandUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: brandType, + Type: reflect.TypeOf(*new(time.Time)), +} + func BrandUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: BrandUpdatedAtField, } } + +var BrandDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: brandType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func BrandDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: BrandDeletedAtField, } } -var brandNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var BrandNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: brandType, + Type: reflect.TypeOf(*new(string)), +} func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, string]{ Expression: expr, - FieldIdentifier: brandNameFieldID, + FieldIdentifier: BrandNameField, } } -var BrandPreloadAttributes = badorm.NewPreloadCondition[models.Brand](brandNameFieldID) +var BrandPreloadAttributes = badorm.NewPreloadCondition[models.Brand](BrandIdField, BrandCreatedAtField, BrandUpdatedAtField, BrandDeletedAtField, BrandNameField) diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index 0ba9ee90..04691560 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -5,31 +5,60 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var childType = reflect.TypeOf(*new(models.Child)) +var ChildIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: childType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func ChildId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: ChildIdField, } } + +var ChildCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: childType, + Type: reflect.TypeOf(*new(time.Time)), +} + func ChildCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: ChildCreatedAtField, } } + +var ChildUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: childType, + Type: reflect.TypeOf(*new(time.Time)), +} + func ChildUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: ChildUpdatedAtField, } } + +var ChildDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: childType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func ChildDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: ChildDeletedAtField, } } func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.IJoinCondition[models.Child] { @@ -43,12 +72,16 @@ func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.IJoinCo } var ChildPreloadParent1 = ChildParent1(Parent1PreloadAttributes) -var childParent1IdFieldID = badorm.FieldIdentifier{Field: "Parent1ID"} +var ChildParent1IdField = badorm.FieldIdentifier{ + Field: "Parent1ID", + ModelType: childType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ Expression: expr, - FieldIdentifier: childParent1IdFieldID, + FieldIdentifier: ChildParent1IdField, } } func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.IJoinCondition[models.Child] { @@ -62,14 +95,18 @@ func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.IJoinCo } var ChildPreloadParent2 = ChildParent2(Parent2PreloadAttributes) -var childParent2IdFieldID = badorm.FieldIdentifier{Field: "Parent2ID"} +var ChildParent2IdField = badorm.FieldIdentifier{ + Field: "Parent2ID", + ModelType: childType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} func ChildParent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ Expression: expr, - FieldIdentifier: childParent2IdFieldID, + FieldIdentifier: ChildParent2IdField, } } -var ChildPreloadAttributes = badorm.NewPreloadCondition[models.Child](childParent1IdFieldID, childParent2IdFieldID) +var ChildPreloadAttributes = badorm.NewPreloadCondition[models.Child](ChildIdField, ChildCreatedAtField, ChildUpdatedAtField, ChildDeletedAtField, ChildParent1IdField, ChildParent2IdField) var ChildPreloadRelations = []badorm.Condition[models.Child]{ChildPreloadParent1, ChildPreloadParent2} diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index 18a3e095..b5120309 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -5,40 +5,73 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var cityType = reflect.TypeOf(*new(models.City)) +var CityIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: cityType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func CityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: CityIdField, } } + +var CityCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: cityType, + Type: reflect.TypeOf(*new(time.Time)), +} + func CityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: CityCreatedAtField, } } + +var CityUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: cityType, + Type: reflect.TypeOf(*new(time.Time)), +} + func CityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: CityUpdatedAtField, } } + +var CityDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: cityType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: CityDeletedAtField, } } -var cityNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var CityNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: cityType, + Type: reflect.TypeOf(*new(string)), +} func CityName(expr badorm.Expression[string]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, string]{ Expression: expr, - FieldIdentifier: cityNameFieldID, + FieldIdentifier: CityNameField, } } func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.IJoinCondition[models.City] { @@ -52,14 +85,18 @@ func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.IJoinCon } var CityPreloadCountry = CityCountry(CountryPreloadAttributes) -var cityCountryIdFieldID = badorm.FieldIdentifier{Field: "CountryID"} +var CityCountryIdField = badorm.FieldIdentifier{ + Field: "CountryID", + ModelType: cityType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, badorm.UUID]{ Expression: expr, - FieldIdentifier: cityCountryIdFieldID, + FieldIdentifier: CityCountryIdField, } } -var CityPreloadAttributes = badorm.NewPreloadCondition[models.City](cityNameFieldID, cityCountryIdFieldID) +var CityPreloadAttributes = badorm.NewPreloadCondition[models.City](CityIdField, CityCreatedAtField, CityUpdatedAtField, CityDeletedAtField, CityNameField, CityCountryIdField) var CityPreloadRelations = []badorm.Condition[models.City]{CityPreloadCountry} diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index 7983a125..cede7f76 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -5,45 +5,78 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var companyType = reflect.TypeOf(*new(models.Company)) +var CompanyIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: companyType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func CompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: CompanyIdField, } } + +var CompanyCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: companyType, + Type: reflect.TypeOf(*new(time.Time)), +} + func CompanyCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: CompanyCreatedAtField, } } + +var CompanyUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: companyType, + Type: reflect.TypeOf(*new(time.Time)), +} + func CompanyUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: CompanyUpdatedAtField, } } + +var CompanyDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: companyType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: CompanyDeletedAtField, } } -var companyNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var CompanyNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: companyType, + Type: reflect.TypeOf(*new(string)), +} func CompanyName(expr badorm.Expression[string]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, string]{ Expression: expr, - FieldIdentifier: companyNameFieldID, + FieldIdentifier: CompanyNameField, } } func CompanyPreloadSellers(nestedPreloads ...badorm.IJoinCondition[models.Seller]) badorm.Condition[models.Company] { return badorm.NewCollectionPreloadCondition[models.Company, models.Seller]("Sellers", nestedPreloads) } -var CompanyPreloadAttributes = badorm.NewPreloadCondition[models.Company](companyNameFieldID) +var CompanyPreloadAttributes = badorm.NewPreloadCondition[models.Company](CompanyIdField, CompanyCreatedAtField, CompanyUpdatedAtField, CompanyDeletedAtField, CompanyNameField) var CompanyPreloadRelations = []badorm.Condition[models.Company]{CompanyPreloadSellers()} diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index 1921f483..efd20f60 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -5,40 +5,73 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var countryType = reflect.TypeOf(*new(models.Country)) +var CountryIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: countryType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func CountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: CountryIdField, } } + +var CountryCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: countryType, + Type: reflect.TypeOf(*new(time.Time)), +} + func CountryCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: CountryCreatedAtField, } } + +var CountryUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: countryType, + Type: reflect.TypeOf(*new(time.Time)), +} + func CountryUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: CountryUpdatedAtField, } } + +var CountryDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: countryType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: CountryDeletedAtField, } } -var countryNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var CountryNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: countryType, + Type: reflect.TypeOf(*new(string)), +} func CountryName(expr badorm.Expression[string]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, string]{ Expression: expr, - FieldIdentifier: countryNameFieldID, + FieldIdentifier: CountryNameField, } } func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.IJoinCondition[models.Country] { @@ -52,5 +85,5 @@ func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.IJoinCon } var CountryPreloadCapital = CountryCapital(CityPreloadAttributes) -var CountryPreloadAttributes = badorm.NewPreloadCondition[models.Country](countryNameFieldID) +var CountryPreloadAttributes = badorm.NewPreloadCondition[models.Country](CountryIdField, CountryCreatedAtField, CountryUpdatedAtField, CountryDeletedAtField, CountryNameField) var CountryPreloadRelations = []badorm.Condition[models.Country]{CountryPreloadCapital} diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 0f4ce81e..8645a52c 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -5,40 +5,73 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var employeeType = reflect.TypeOf(*new(models.Employee)) +var EmployeeIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: employeeType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func EmployeeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: EmployeeIdField, } } + +var EmployeeCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: employeeType, + Type: reflect.TypeOf(*new(time.Time)), +} + func EmployeeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: EmployeeCreatedAtField, } } + +var EmployeeUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: employeeType, + Type: reflect.TypeOf(*new(time.Time)), +} + func EmployeeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: EmployeeUpdatedAtField, } } + +var EmployeeDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: employeeType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: EmployeeDeletedAtField, } } -var employeeNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var EmployeeNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: employeeType, + Type: reflect.TypeOf(*new(string)), +} func EmployeeName(expr badorm.Expression[string]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, string]{ Expression: expr, - FieldIdentifier: employeeNameFieldID, + FieldIdentifier: EmployeeNameField, } } func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.IJoinCondition[models.Employee] { @@ -52,14 +85,18 @@ func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.IJoinC } var EmployeePreloadBoss = EmployeeBoss(EmployeePreloadAttributes) -var employeeBossIdFieldID = badorm.FieldIdentifier{Field: "BossID"} +var EmployeeBossIdField = badorm.FieldIdentifier{ + Field: "BossID", + ModelType: employeeType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, badorm.UUID]{ Expression: expr, - FieldIdentifier: employeeBossIdFieldID, + FieldIdentifier: EmployeeBossIdField, } } -var EmployeePreloadAttributes = badorm.NewPreloadCondition[models.Employee](employeeNameFieldID, employeeBossIdFieldID) +var EmployeePreloadAttributes = badorm.NewPreloadCondition[models.Employee](EmployeeIdField, EmployeeCreatedAtField, EmployeeUpdatedAtField, EmployeeDeletedAtField, EmployeeNameField, EmployeeBossIdField) var EmployeePreloadRelations = []badorm.Condition[models.Employee]{EmployeePreloadBoss} diff --git a/testintegration/conditions/parent1_conditions.go b/testintegration/conditions/parent1_conditions.go index 1088d44e..3ba4e57e 100644 --- a/testintegration/conditions/parent1_conditions.go +++ b/testintegration/conditions/parent1_conditions.go @@ -5,31 +5,60 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var parent1Type = reflect.TypeOf(*new(models.Parent1)) +var Parent1IdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: parent1Type, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func Parent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: Parent1IdField, } } + +var Parent1CreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: parent1Type, + Type: reflect.TypeOf(*new(time.Time)), +} + func Parent1CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: Parent1CreatedAtField, } } + +var Parent1UpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: parent1Type, + Type: reflect.TypeOf(*new(time.Time)), +} + func Parent1UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: Parent1UpdatedAtField, } } + +var Parent1DeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: parent1Type, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func Parent1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: Parent1DeletedAtField, } } func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.IJoinCondition[models.Parent1] { @@ -43,14 +72,18 @@ func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) ba } var Parent1PreloadParentParent = Parent1ParentParent(ParentParentPreloadAttributes) -var parent1ParentParentIdFieldID = badorm.FieldIdentifier{Field: "ParentParentID"} +var Parent1ParentParentIdField = badorm.FieldIdentifier{ + Field: "ParentParentID", + ModelType: parent1Type, + Type: reflect.TypeOf(*new(badorm.UUID)), +} func Parent1ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, badorm.UUID]{ Expression: expr, - FieldIdentifier: parent1ParentParentIdFieldID, + FieldIdentifier: Parent1ParentParentIdField, } } -var Parent1PreloadAttributes = badorm.NewPreloadCondition[models.Parent1](parent1ParentParentIdFieldID) +var Parent1PreloadAttributes = badorm.NewPreloadCondition[models.Parent1](Parent1IdField, Parent1CreatedAtField, Parent1UpdatedAtField, Parent1DeletedAtField, Parent1ParentParentIdField) var Parent1PreloadRelations = []badorm.Condition[models.Parent1]{Parent1PreloadParentParent} diff --git a/testintegration/conditions/parent2_conditions.go b/testintegration/conditions/parent2_conditions.go index 130b58e9..a85946b5 100644 --- a/testintegration/conditions/parent2_conditions.go +++ b/testintegration/conditions/parent2_conditions.go @@ -5,31 +5,60 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var parent2Type = reflect.TypeOf(*new(models.Parent2)) +var Parent2IdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: parent2Type, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func Parent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: Parent2IdField, } } + +var Parent2CreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: parent2Type, + Type: reflect.TypeOf(*new(time.Time)), +} + func Parent2CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: Parent2CreatedAtField, } } + +var Parent2UpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: parent2Type, + Type: reflect.TypeOf(*new(time.Time)), +} + func Parent2UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: Parent2UpdatedAtField, } } + +var Parent2DeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: parent2Type, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func Parent2DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: Parent2DeletedAtField, } } func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.IJoinCondition[models.Parent2] { @@ -43,14 +72,18 @@ func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) ba } var Parent2PreloadParentParent = Parent2ParentParent(ParentParentPreloadAttributes) -var parent2ParentParentIdFieldID = badorm.FieldIdentifier{Field: "ParentParentID"} +var Parent2ParentParentIdField = badorm.FieldIdentifier{ + Field: "ParentParentID", + ModelType: parent2Type, + Type: reflect.TypeOf(*new(badorm.UUID)), +} func Parent2ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, badorm.UUID]{ Expression: expr, - FieldIdentifier: parent2ParentParentIdFieldID, + FieldIdentifier: Parent2ParentParentIdField, } } -var Parent2PreloadAttributes = badorm.NewPreloadCondition[models.Parent2](parent2ParentParentIdFieldID) +var Parent2PreloadAttributes = badorm.NewPreloadCondition[models.Parent2](Parent2IdField, Parent2CreatedAtField, Parent2UpdatedAtField, Parent2DeletedAtField, Parent2ParentParentIdField) var Parent2PreloadRelations = []badorm.Condition[models.Parent2]{Parent2PreloadParentParent} diff --git a/testintegration/conditions/parent_parent_conditions.go b/testintegration/conditions/parent_parent_conditions.go index 6f200034..794858bf 100644 --- a/testintegration/conditions/parent_parent_conditions.go +++ b/testintegration/conditions/parent_parent_conditions.go @@ -5,41 +5,74 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var parentParentType = reflect.TypeOf(*new(models.ParentParent)) +var ParentParentIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: parentParentType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: ParentParentIdField, } } + +var ParentParentCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: parentParentType, + Type: reflect.TypeOf(*new(time.Time)), +} + func ParentParentCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: ParentParentCreatedAtField, } } + +var ParentParentUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: parentParentType, + Type: reflect.TypeOf(*new(time.Time)), +} + func ParentParentUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: ParentParentUpdatedAtField, } } + +var ParentParentDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: parentParentType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func ParentParentDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: ParentParentDeletedAtField, } } -var parentParentNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var ParentParentNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: parentParentType, + Type: reflect.TypeOf(*new(string)), +} func ParentParentName(expr badorm.Expression[string]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, string]{ Expression: expr, - FieldIdentifier: parentParentNameFieldID, + FieldIdentifier: ParentParentNameField, } } -var ParentParentPreloadAttributes = badorm.NewPreloadCondition[models.ParentParent](parentParentNameFieldID) +var ParentParentPreloadAttributes = badorm.NewPreloadCondition[models.ParentParent](ParentParentIdField, ParentParentCreatedAtField, ParentParentUpdatedAtField, ParentParentDeletedAtField, ParentParentNameField) diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index 584d316e..199518ea 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -5,41 +5,74 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var personType = reflect.TypeOf(*new(models.Person)) +var PersonIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: personType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func PersonId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: PersonIdField, } } + +var PersonCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: personType, + Type: reflect.TypeOf(*new(time.Time)), +} + func PersonCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: PersonCreatedAtField, } } + +var PersonUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: personType, + Type: reflect.TypeOf(*new(time.Time)), +} + func PersonUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: PersonUpdatedAtField, } } + +var PersonDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: personType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func PersonDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: PersonDeletedAtField, } } -var personNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var PersonNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: personType, + Type: reflect.TypeOf(*new(string)), +} func PersonName(expr badorm.Expression[string]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, string]{ Expression: expr, - FieldIdentifier: personNameFieldID, + FieldIdentifier: PersonNameField, } } -var PersonPreloadAttributes = badorm.NewPreloadCondition[models.Person](personNameFieldID) +var PersonPreloadAttributes = badorm.NewPreloadCondition[models.Person](PersonIdField, PersonCreatedAtField, PersonUpdatedAtField, PersonDeletedAtField, PersonNameField) diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index 644eaaf4..e9db006c 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -5,40 +5,73 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var phoneType = reflect.TypeOf(*new(models.Phone)) +var PhoneIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: phoneType, + Type: reflect.TypeOf(*new(badorm.UIntID)), +} + func PhoneId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, badorm.UIntID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: PhoneIdField, } } + +var PhoneCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: phoneType, + Type: reflect.TypeOf(*new(time.Time)), +} + func PhoneCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: PhoneCreatedAtField, } } + +var PhoneUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: phoneType, + Type: reflect.TypeOf(*new(time.Time)), +} + func PhoneUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: PhoneUpdatedAtField, } } + +var PhoneDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: phoneType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: PhoneDeletedAtField, } } -var phoneNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var PhoneNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: phoneType, + Type: reflect.TypeOf(*new(string)), +} func PhoneName(expr badorm.Expression[string]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, string]{ Expression: expr, - FieldIdentifier: phoneNameFieldID, + FieldIdentifier: PhoneNameField, } } func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.IJoinCondition[models.Phone] { @@ -52,14 +85,18 @@ func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.IJoinCondit } var PhonePreloadBrand = PhoneBrand(BrandPreloadAttributes) -var phoneBrandIdFieldID = badorm.FieldIdentifier{Field: "BrandID"} +var PhoneBrandIdField = badorm.FieldIdentifier{ + Field: "BrandID", + ModelType: phoneType, + Type: reflect.TypeOf(*new(uint)), +} func PhoneBrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, uint]{ Expression: expr, - FieldIdentifier: phoneBrandIdFieldID, + FieldIdentifier: PhoneBrandIdField, } } -var PhonePreloadAttributes = badorm.NewPreloadCondition[models.Phone](phoneNameFieldID, phoneBrandIdFieldID) +var PhonePreloadAttributes = badorm.NewPreloadCondition[models.Phone](PhoneIdField, PhoneCreatedAtField, PhoneUpdatedAtField, PhoneDeletedAtField, PhoneNameField, PhoneBrandIdField) var PhonePreloadRelations = []badorm.Condition[models.Phone]{PhonePreloadBrand} diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index 7af4859a..354644ec 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -3,59 +3,97 @@ package conditions import ( "database/sql" - "reflect" - "time" - - gorm "gorm.io/gorm" - badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" + gorm "gorm.io/gorm" + "reflect" + "time" ) +var productType = reflect.TypeOf(*new(models.Product)) +var ProductIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: productType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func ProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: ProductIdField, } } + +var ProductCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: productType, + Type: reflect.TypeOf(*new(time.Time)), +} + func ProductCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: ProductCreatedAtField, } } + +var ProductUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: productType, + Type: reflect.TypeOf(*new(time.Time)), +} + func ProductUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: ProductUpdatedAtField, } } + +var ProductDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: productType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func ProductDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: ProductDeletedAtField, } } -var productStringFieldID = badorm.FieldIdentifier{Column: "string_something_else"} +var ProductStringField = badorm.FieldIdentifier{ + Column: "string_something_else", + ModelType: productType, + Type: reflect.TypeOf(*new(string)), +} func ProductString(expr badorm.Expression[string]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, string]{ Expression: expr, - FieldIdentifier: productStringFieldID, + FieldIdentifier: ProductStringField, } } -var productIntFieldID = badorm.FieldIdentifier{Field: "Int"} +var ProductIntField = badorm.FieldIdentifier{ + Field: "Int", + ModelType: productType, + Type: reflect.TypeOf(*new(int)), +} func ProductInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ Expression: expr, - FieldIdentifier: productIntFieldID, + FieldIdentifier: ProductIntField, } } -var ProductIntPointerField = badorm.FieldIdentifier{Field: "IntPointer", Type: reflect.Int, ModelType: reflect.TypeOf(models.Product{})} +var ProductIntPointerField = badorm.FieldIdentifier{ + Field: "IntPointer", + ModelType: productType, + Type: reflect.TypeOf(*new(int)), +} func ProductIntPointer(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ @@ -64,79 +102,109 @@ func ProductIntPointer(expr badorm.Expression[int]) badorm.WhereCondition[models } } -var productFloatFieldID = badorm.FieldIdentifier{Field: "Float"} +var ProductFloatField = badorm.FieldIdentifier{ + Field: "Float", + ModelType: productType, + Type: reflect.TypeOf(*new(float64)), +} func ProductFloat(expr badorm.Expression[float64]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, float64]{ Expression: expr, - FieldIdentifier: productFloatFieldID, + FieldIdentifier: ProductFloatField, } } -var productNullFloatFieldID = badorm.FieldIdentifier{Field: "NullFloat"} +var ProductNullFloatField = badorm.FieldIdentifier{ + Field: "NullFloat", + ModelType: productType, + Type: reflect.TypeOf(*new(sql.NullFloat64)), +} func ProductNullFloat(expr badorm.Expression[sql.NullFloat64]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, sql.NullFloat64]{ Expression: expr, - FieldIdentifier: productNullFloatFieldID, + FieldIdentifier: ProductNullFloatField, } } -var productBoolFieldID = badorm.FieldIdentifier{Field: "Bool"} +var ProductBoolField = badorm.FieldIdentifier{ + Field: "Bool", + ModelType: productType, + Type: reflect.TypeOf(*new(bool)), +} func ProductBool(expr badorm.Expression[bool]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, bool]{ Expression: expr, - FieldIdentifier: productBoolFieldID, + FieldIdentifier: ProductBoolField, } } -var productNullBoolFieldID = badorm.FieldIdentifier{Field: "NullBool"} +var ProductNullBoolField = badorm.FieldIdentifier{ + Field: "NullBool", + ModelType: productType, + Type: reflect.TypeOf(*new(sql.NullBool)), +} func ProductNullBool(expr badorm.Expression[sql.NullBool]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, sql.NullBool]{ Expression: expr, - FieldIdentifier: productNullBoolFieldID, + FieldIdentifier: ProductNullBoolField, } } -var productByteArrayFieldID = badorm.FieldIdentifier{Field: "ByteArray"} +var ProductByteArrayField = badorm.FieldIdentifier{ + Field: "ByteArray", + ModelType: productType, + Type: reflect.TypeOf(*new([]uint8)), +} func ProductByteArray(expr badorm.Expression[[]uint8]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, []uint8]{ Expression: expr, - FieldIdentifier: productByteArrayFieldID, + FieldIdentifier: ProductByteArrayField, } } -var productMultiStringFieldID = badorm.FieldIdentifier{Field: "MultiString"} +var ProductMultiStringField = badorm.FieldIdentifier{ + Field: "MultiString", + ModelType: productType, + Type: reflect.TypeOf(*new(models.MultiString)), +} func ProductMultiString(expr badorm.Expression[models.MultiString]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, models.MultiString]{ Expression: expr, - FieldIdentifier: productMultiStringFieldID, + FieldIdentifier: ProductMultiStringField, } } -var productToBeEmbeddedEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "EmbeddedInt"} +var ProductToBeEmbeddedEmbeddedIntField = badorm.FieldIdentifier{ + Field: "EmbeddedInt", + ModelType: productType, + Type: reflect.TypeOf(*new(int)), +} func ProductToBeEmbeddedEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ Expression: expr, - FieldIdentifier: productToBeEmbeddedEmbeddedIntFieldID, + FieldIdentifier: ProductToBeEmbeddedEmbeddedIntField, } } -var productGormEmbeddedIntFieldID = badorm.FieldIdentifier{ +var ProductGormEmbeddedIntField = badorm.FieldIdentifier{ ColumnPrefix: "gorm_embedded_", Field: "Int", + ModelType: productType, + Type: reflect.TypeOf(*new(int)), } func ProductGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ Expression: expr, - FieldIdentifier: productGormEmbeddedIntFieldID, + FieldIdentifier: ProductGormEmbeddedIntField, } } -var ProductPreloadAttributes = badorm.NewPreloadCondition[models.Product](productStringFieldID, productIntFieldID, ProductIntPointerField, productFloatFieldID, productNullFloatFieldID, productBoolFieldID, productNullBoolFieldID, productByteArrayFieldID, productMultiStringFieldID, productToBeEmbeddedEmbeddedIntFieldID, productGormEmbeddedIntFieldID) +var ProductPreloadAttributes = badorm.NewPreloadCondition[models.Product](ProductIdField, ProductCreatedAtField, ProductUpdatedAtField, ProductDeletedAtField, ProductStringField, ProductIntField, ProductIntPointerField, ProductFloatField, ProductNullFloatField, ProductBoolField, ProductNullBoolField, ProductByteArrayField, ProductMultiStringField, ProductToBeEmbeddedEmbeddedIntField, ProductGormEmbeddedIntField) diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 32326564..21e05fee 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -5,49 +5,86 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var saleType = reflect.TypeOf(*new(models.Sale)) +var SaleIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: saleType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func SaleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: SaleIdField, } } + +var SaleCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: saleType, + Type: reflect.TypeOf(*new(time.Time)), +} + func SaleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: SaleCreatedAtField, } } + +var SaleUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: saleType, + Type: reflect.TypeOf(*new(time.Time)), +} + func SaleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: SaleUpdatedAtField, } } + +var SaleDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: saleType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func SaleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: SaleDeletedAtField, } } -var saleCodeFieldID = badorm.FieldIdentifier{Field: "Code"} +var SaleCodeField = badorm.FieldIdentifier{ + Field: "Code", + ModelType: saleType, + Type: reflect.TypeOf(*new(int)), +} func SaleCode(expr badorm.Expression[int]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, int]{ Expression: expr, - FieldIdentifier: saleCodeFieldID, + FieldIdentifier: SaleCodeField, } } -var saleDescriptionFieldID = badorm.FieldIdentifier{Field: "Description"} +var SaleDescriptionField = badorm.FieldIdentifier{ + Field: "Description", + ModelType: saleType, + Type: reflect.TypeOf(*new(string)), +} func SaleDescription(expr badorm.Expression[string]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, string]{ Expression: expr, - FieldIdentifier: saleDescriptionFieldID, + FieldIdentifier: SaleDescriptionField, } } func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.IJoinCondition[models.Sale] { @@ -61,12 +98,16 @@ func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.IJoinCon } var SalePreloadProduct = SaleProduct(ProductPreloadAttributes) -var saleProductIdFieldID = badorm.FieldIdentifier{Field: "ProductID"} +var SaleProductIdField = badorm.FieldIdentifier{ + Field: "ProductID", + ModelType: saleType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ Expression: expr, - FieldIdentifier: saleProductIdFieldID, + FieldIdentifier: SaleProductIdField, } } func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.IJoinCondition[models.Sale] { @@ -80,14 +121,18 @@ func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.IJoinCondi } var SalePreloadSeller = SaleSeller(SellerPreloadAttributes) -var saleSellerIdFieldID = badorm.FieldIdentifier{Field: "SellerID"} +var SaleSellerIdField = badorm.FieldIdentifier{ + Field: "SellerID", + ModelType: saleType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} func SaleSellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ Expression: expr, - FieldIdentifier: saleSellerIdFieldID, + FieldIdentifier: SaleSellerIdField, } } -var SalePreloadAttributes = badorm.NewPreloadCondition[models.Sale](saleCodeFieldID, saleDescriptionFieldID, saleProductIdFieldID, saleSellerIdFieldID) +var SalePreloadAttributes = badorm.NewPreloadCondition[models.Sale](SaleIdField, SaleCreatedAtField, SaleUpdatedAtField, SaleDeletedAtField, SaleCodeField, SaleDescriptionField, SaleProductIdField, SaleSellerIdField) var SalePreloadRelations = []badorm.Condition[models.Sale]{SalePreloadProduct, SalePreloadSeller} diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index f0fd8de1..dd3f1421 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -2,42 +2,71 @@ package conditions import ( - "reflect" - "time" - - gorm "gorm.io/gorm" - badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" + gorm "gorm.io/gorm" + "reflect" + "time" ) +var sellerType = reflect.TypeOf(*new(models.Seller)) +var SellerIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: sellerType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func SellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: SellerIdField, } } + +var SellerCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: sellerType, + Type: reflect.TypeOf(*new(time.Time)), +} + func SellerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: SellerCreatedAtField, } } + +var SellerUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: sellerType, + Type: reflect.TypeOf(*new(time.Time)), +} + func SellerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: SellerUpdatedAtField, } } + +var SellerDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: sellerType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: SellerDeletedAtField, } } -// TODO generacion automatica -var SellerNameField = badorm.FieldIdentifier{Field: "Name", Type: reflect.String, ModelType: reflect.TypeOf(models.Seller{})} +var SellerNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: sellerType, + Type: reflect.TypeOf(*new(string)), +} func SellerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, string]{ @@ -56,12 +85,16 @@ func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.IJoinC } var SellerPreloadCompany = SellerCompany(CompanyPreloadAttributes) -var sellerCompanyIdFieldID = badorm.FieldIdentifier{Field: "CompanyID"} +var SellerCompanyIdField = badorm.FieldIdentifier{ + Field: "CompanyID", + ModelType: sellerType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ Expression: expr, - FieldIdentifier: sellerCompanyIdFieldID, + FieldIdentifier: SellerCompanyIdField, } } func SellerUniversity(conditions ...badorm.Condition[models.University]) badorm.IJoinCondition[models.Seller] { @@ -75,14 +108,18 @@ func SellerUniversity(conditions ...badorm.Condition[models.University]) badorm. } var SellerPreloadUniversity = SellerUniversity(UniversityPreloadAttributes) -var sellerUniversityIdFieldID = badorm.FieldIdentifier{Field: "UniversityID"} +var SellerUniversityIdField = badorm.FieldIdentifier{ + Field: "UniversityID", + ModelType: sellerType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} func SellerUniversityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ Expression: expr, - FieldIdentifier: sellerUniversityIdFieldID, + FieldIdentifier: SellerUniversityIdField, } } -var SellerPreloadAttributes = badorm.NewPreloadCondition[models.Seller](SellerNameField, sellerCompanyIdFieldID, sellerUniversityIdFieldID) +var SellerPreloadAttributes = badorm.NewPreloadCondition[models.Seller](SellerIdField, SellerCreatedAtField, SellerUpdatedAtField, SellerDeletedAtField, SellerNameField, SellerCompanyIdField, SellerUniversityIdField) var SellerPreloadRelations = []badorm.Condition[models.Seller]{SellerPreloadCompany, SellerPreloadUniversity} diff --git a/testintegration/conditions/university_conditions.go b/testintegration/conditions/university_conditions.go index 473ebc5f..49eb6ff4 100644 --- a/testintegration/conditions/university_conditions.go +++ b/testintegration/conditions/university_conditions.go @@ -5,41 +5,74 @@ import ( badorm "github.com/ditrit/badaas/badorm" models "github.com/ditrit/badaas/testintegration/models" gorm "gorm.io/gorm" + "reflect" "time" ) +var universityType = reflect.TypeOf(*new(models.University)) +var UniversityIdField = badorm.FieldIdentifier{ + Field: "ID", + ModelType: universityType, + Type: reflect.TypeOf(*new(badorm.UUID)), +} + func UniversityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.University] { return badorm.FieldCondition[models.University, badorm.UUID]{ Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: UniversityIdField, } } + +var UniversityCreatedAtField = badorm.FieldIdentifier{ + Field: "CreatedAt", + ModelType: universityType, + Type: reflect.TypeOf(*new(time.Time)), +} + func UniversityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.University] { return badorm.FieldCondition[models.University, time.Time]{ Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: UniversityCreatedAtField, } } + +var UniversityUpdatedAtField = badorm.FieldIdentifier{ + Field: "UpdatedAt", + ModelType: universityType, + Type: reflect.TypeOf(*new(time.Time)), +} + func UniversityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.University] { return badorm.FieldCondition[models.University, time.Time]{ Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: UniversityUpdatedAtField, } } + +var UniversityDeletedAtField = badorm.FieldIdentifier{ + Field: "DeletedAt", + ModelType: universityType, + Type: reflect.TypeOf(*new(gorm.DeletedAt)), +} + func UniversityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.University] { return badorm.FieldCondition[models.University, gorm.DeletedAt]{ Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: UniversityDeletedAtField, } } -var universityNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var UniversityNameField = badorm.FieldIdentifier{ + Field: "Name", + ModelType: universityType, + Type: reflect.TypeOf(*new(string)), +} func UniversityName(expr badorm.Expression[string]) badorm.WhereCondition[models.University] { return badorm.FieldCondition[models.University, string]{ Expression: expr, - FieldIdentifier: universityNameFieldID, + FieldIdentifier: UniversityNameField, } } -var UniversityPreloadAttributes = badorm.NewPreloadCondition[models.University](universityNameFieldID) +var UniversityPreloadAttributes = badorm.NewPreloadCondition[models.University](UniversityIdField, UniversityCreatedAtField, UniversityUpdatedAtField, UniversityDeletedAtField, UniversityNameField) diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index ca78f2c9..2f6706ed 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -7,6 +7,7 @@ import ( "gorm.io/gorm" "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/expressions" "github.com/ditrit/badaas/badorm/mysql" "github.com/ditrit/badaas/badorm/psql" "github.com/ditrit/badaas/badorm/sqlite" @@ -980,7 +981,7 @@ func (ts *ExpressionIntTestSuite) TestPosixRegexNotPosix() { } } -func (ts *ExpressionIntTestSuite) TestDynamicExpressionOver1Table() { +func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBasicType() { int1 := 1 product1 := ts.createProduct("", 1, 0.0, false, &int1) ts.createProduct("", 2, 0.0, false, &int1) @@ -988,8 +989,8 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionOver1Table() { entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - badorm.NewDynamicExpression( - badorm.Eq[int], + badorm.NewDynamicExpression[int]( + expressions.Eq, conditions.ProductIntPointerField, ), ), @@ -998,3 +999,96 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionOver1Table() { EqualList(&ts.Suite, []*models.Product{product1}, entities) } + +func (ts *ExpressionIntTestSuite) TestDynamicExpressionWithFieldOfAnotherTypeReturnsError() { + _, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.NewDynamicExpression[int]( + expressions.Eq, + conditions.ProductStringField, + ), + ), + ) + ts.ErrorIs(err, badorm.ErrFieldTypeDoesNotMatch) +} + +func (ts *ExpressionIntTestSuite) TestDynamicExpressionForCustomType() { + match := ts.createProduct("salut,hola", 1, 0.0, false, nil) + match.MultiString = models.MultiString{"salut", "hola"} + err := ts.db.Save(match).Error + ts.Nil(err) + + ts.createProduct("salut,hola", 1, 0.0, false, nil) + ts.createProduct("hola", 1, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductMultiString( + badorm.NewDynamicExpression[models.MultiString]( + expressions.Eq, + // TODO el field podria tener el tipo para evitar el tipo en el new dynamic + conditions.ProductMultiStringField, + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestDynamicExpressionForNullableTypeCanBeComparedWithNotNullType() { + match := ts.createProduct("", 1, 1.0, false, nil) + match.NullFloat = sql.NullFloat64{Valid: true, Float64: 1.0} + err := ts.db.Save(match).Error + ts.Nil(err) + + ts.createProduct("", 1, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductNullFloat( + badorm.NewDynamicExpression[sql.NullFloat64]( + expressions.Eq, + conditions.ProductFloatField, + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestDynamicExpressionForNotNullTypeCanBeComparedWithNullableType() { + match := ts.createProduct("", 1, 1.0, false, nil) + match.NullFloat = sql.NullFloat64{Valid: true, Float64: 1.0} + err := ts.db.Save(match).Error + ts.Nil(err) + + ts.createProduct("", 1, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + badorm.NewDynamicExpression[float64]( + expressions.Eq, + conditions.ProductNullFloatField, + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBadORMModelAttribute() { + match := ts.createProduct("", 1, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductDeletedAt( + badorm.NewDynamicExpression[gorm.DeletedAt]( + expressions.IsDistinct, + conditions.ProductCreatedAtField, + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 3b52fc01..2a4a5dbb 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -4,6 +4,7 @@ import ( "gorm.io/gorm" "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/expressions" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" ) @@ -364,8 +365,8 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2Tables() { entities, err := ts.crudSellerService.GetEntities( conditions.SellerCompany( conditions.CompanyName( - badorm.NewDynamicExpression( - badorm.Eq[string], + badorm.NewDynamicExpression[string]( + expressions.Eq, conditions.SellerNameField, ), ), @@ -393,8 +394,8 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2TablesAtMoreLeve conditions.SaleSeller( conditions.SellerCompany( conditions.CompanyName( - badorm.NewDynamicExpression( - badorm.Eq[string], + badorm.NewDynamicExpression[string]( + expressions.Eq, conditions.SellerNameField, ), ), diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 504c6c63..a34a0714 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -18,10 +18,6 @@ const ( badORMIJoinCondition = "IJoinCondition" badORMFieldIdentifier = "FieldIdentifier" badORMNewCollectionPreload = "NewCollectionPreloadCondition" - IDFieldID = "IDFieldID" - CreatedAtFieldID = "CreatedAtFieldID" - UpdatedAtFieldID = "UpdatedAtFieldID" - DeletedAtFieldID = "DeletedAtFieldID" // badorm/expression.go badORMExpression = "Expression" // badorm/baseModels.go @@ -31,13 +27,6 @@ const ( uIntModel = "UIntModel" ) -var constantFieldIdentifiers = map[string]*jen.Statement{ - "ID": jen.Qual(badORMPath, IDFieldID), - "CreatedAt": jen.Qual(badORMPath, CreatedAtFieldID), - "UpdatedAt": jen.Qual(badORMPath, UpdatedAtFieldID), - "DeletedAt": jen.Qual(badORMPath, DeletedAtFieldID), -} - type Condition struct { codes []jen.Code param *JenParam @@ -185,14 +174,6 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { conditionName := getConditionName(objectType, field) log.Logger.Debugf("Generated %q", conditionName) - var fieldIdentifier *jen.Statement - - if constantFieldIdentifier, ok := constantFieldIdentifiers[field.Name]; ok { - fieldIdentifier = constantFieldIdentifier - } else { - fieldIdentifier = condition.createFieldIdentifier(field, conditionName) - } - condition.codes = append( condition.codes, jen.Func().Id( @@ -204,8 +185,11 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { ).Block( jen.Return( fieldCondition.Clone().Values(jen.Dict{ - jen.Id("Expression"): jen.Id("expr"), - jen.Id("FieldIdentifier"): fieldIdentifier, + jen.Id("Expression"): jen.Id("expr"), + jen.Id("FieldIdentifier"): condition.createFieldIdentifier( + objectType.Name(), objectTypeQual, + field, conditionName, + ), }), ), ), @@ -214,8 +198,12 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { // create a variable containing the definition of the field identifier // to use it in the where condition and in the preload condition -func (condition *Condition) createFieldIdentifier(field Field, conditionName string) *jen.Statement { - fieldIdentifierValues := jen.Dict{} +func (condition *Condition) createFieldIdentifier(objectName string, objectTypeQual jen.Code, field Field, conditionName string) *jen.Statement { + fieldIdentifierValues := jen.Dict{ + jen.Id("Type"): reflectTypeOf().Call(jen.Op("*").New(condition.param.GenericType())), + jen.Id("ModelType"): jen.Id(getObjectTypeName(objectName)), + } + columnName := field.getColumnName() if columnName != "" { @@ -233,7 +221,7 @@ func (condition *Condition) createFieldIdentifier(field Field, conditionName str badORMPath, badORMFieldIdentifier, ).Values(fieldIdentifierValues) - fieldIdentifierName := strcase.ToCamel(conditionName) + "FieldID" + fieldIdentifierName := conditionName + "Field" condition.codes = append( condition.codes, diff --git a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go index 9f022cf0..272be565 100644 --- a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go +++ b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go @@ -4,6 +4,7 @@ import ( "go/types" "github.com/dave/jennifer/jen" + "github.com/ettle/strcase" "github.com/ditrit/badaas/tools/badctl/cmd/log" ) @@ -36,6 +37,17 @@ func (cg CodeConditionsGenerator) Into(file *File) error { return nil } +func getObjectTypeName(objectType string) string { + return strcase.ToCamel(objectType) + "Type" +} + +func reflectTypeOf() *jen.Statement { + return jen.Qual( + "reflect", + "TypeOf", + ) +} + // Add one condition for each field of the object func (cg CodeConditionsGenerator) addConditionsForEachField(file *File, fields []Field) { conditions := cg.ForEachField(file, fields) @@ -64,6 +76,15 @@ func (cg CodeConditionsGenerator) addConditionsForEachField(file *File, fields [ ) relationPreloads := []jen.Code{} + // object reflect type definition + file.Add( + jen.Var().Id( + getObjectTypeName(objectName), + ).Op("=").Add( + reflectTypeOf().Call(jen.Op("*").New(objectQual)), + ), + ) + for _, condition := range conditions { file.Add(condition.codes...) From 2abb3ff841835af6d667f92f9c2cb9aac608ab28 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 4 Jul 2023 15:22:11 +0200 Subject: [PATCH 419/467] field identifier to generics to make verify at compilation time --- badorm/condition.go | 6 +- badorm/dynamicExpression.go | 47 ++++++++------- badorm/query.go | 27 ++++++--- persistence/models/User.go | 2 +- testintegration/conditions/badorm.go | 2 +- .../conditions/bicycle_conditions.go | 18 ++---- .../conditions/brand_conditions.go | 15 ++--- .../conditions/child_conditions.go | 18 ++---- testintegration/conditions/city_conditions.go | 18 ++---- .../conditions/company_conditions.go | 15 ++--- .../conditions/country_conditions.go | 15 ++--- .../conditions/employee_conditions.go | 18 ++---- .../conditions/parent1_conditions.go | 15 ++--- .../conditions/parent2_conditions.go | 15 ++--- .../conditions/parent_parent_conditions.go | 15 ++--- .../conditions/person_conditions.go | 15 ++--- .../conditions/phone_conditions.go | 18 ++---- .../conditions/product_conditions.go | 45 +++++---------- testintegration/conditions/sale_conditions.go | 24 +++----- .../conditions/seller_conditions.go | 21 +++---- .../conditions/university_conditions.go | 15 ++--- testintegration/expressions_test.go | 57 ++++++++++++------- testintegration/join_conditions_test.go | 4 +- tools/badctl/cmd/gen/conditions/condition.go | 3 +- .../cmd/gen/conditions/conditionsGenerator.go | 12 ++-- 25 files changed, 194 insertions(+), 266 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 09c33fdb..280689d3 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -141,7 +141,7 @@ func NewConnectionCondition[T Model](connector string, conditions ...WhereCondit // Condition used to the preload the attributes of a model type PreloadCondition[T Model] struct { - Fields []FieldIdentifier + Fields []IFieldIdentifier } //nolint:unused // see inside @@ -159,7 +159,7 @@ func (condition PreloadCondition[T]) ApplyTo(query *query, table Table) error { } // Condition used to the preload the attributes of a model -func NewPreloadCondition[T Model](fields ...FieldIdentifier) PreloadCondition[T] { +func NewPreloadCondition[T Model](fields ...IFieldIdentifier) PreloadCondition[T] { return PreloadCondition[T]{ Fields: fields, } @@ -225,7 +225,7 @@ func NewCollectionPreloadCondition[T1 Model, T2 Model](collectionField string, n // Condition that verifies the value of a field, // using the Expression type FieldCondition[TObject Model, TAtribute any] struct { - FieldIdentifier FieldIdentifier + FieldIdentifier FieldIdentifier[TAtribute] Expression Expression[TAtribute] } diff --git a/badorm/dynamicExpression.go b/badorm/dynamicExpression.go index dc7e8d3b..a2cdbba6 100644 --- a/badorm/dynamicExpression.go +++ b/badorm/dynamicExpression.go @@ -19,6 +19,23 @@ var ( ErrExpressionTypeNotSupported = errors.New("expression type not supported") ) +// TODO ver el nombre +// TODO quizas field identifier deberia llamarse solo field +func DynamicExpression[T any](expression expressions.SQLExpression, field FieldIdentifier[T]) Expression[T] { + // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo + // TODO que pasa si hay mas de uno, no se si me gusta mucho esto + // creo que si hay mas de uno solo se tendria que aplicar en el primero, + return dynamicExpressionImpl[T]{ + SQLExpressions: []LiteralSQLExpression{ + { + SQL: expressions.ToSQL[expression], + Field: field, + }, + }, + } + // TODO soportar multivalue, no todos necesariamente dinamicos +} + var nullableTypes = []reflect.Type{ reflect.TypeOf(sql.NullBool{}), reflect.TypeOf(sql.NullByte{}), @@ -35,30 +52,20 @@ func isNullable(fieldType reflect.Type) bool { return pie.Contains(nullableTypes, fieldType) } -// TODO ver el nombre -// TODO quizas field identifier deberia llamarse solo field -func NewDynamicExpression[T any](expression expressions.SQLExpression, field FieldIdentifier) Expression[T] { - expressionType := reflect.TypeOf(*new(T)) - fieldType := field.Type - - // TODO si el field lo paso a tipado esto podria andar tambien en tiempo de compilacion, - // el problema es que no tengo como hacer esto de los nullables, a menos que cree otro metodo - // o que a los fields de cosas nullables le ponga el T de no nullable - // pero la expression me va a quedar de T no nullable y no va a andar - // podria ser otro metodo que acepte un field de cualquier tipo y ahi ver las condiciones estas - // el problema es que ese tipo despues no lo puedo obtener en tiempo de ejecucion creo - // entonces la unica posibilidad seria una funcion para cada una de las posibilidades +func MultitypeDynamicExpression[T1 any, T2 any](expression expressions.SQLExpression, field FieldIdentifier[T2]) Expression[T1] { + expressionType := reflect.TypeOf(*new(T1)) + fieldType := reflect.TypeOf(*new(T2)) if fieldType != expressionType && !((isNullable(fieldType) && fieldType.Field(0).Type == expressionType) || (isNullable(expressionType) && expressionType.Field(0).Type == fieldType)) { - return NewInvalidExpression[T](ErrFieldTypeDoesNotMatch) + return NewInvalidExpression[T1](ErrFieldTypeDoesNotMatch) } // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo // TODO que pasa si hay mas de uno, no se si me gusta mucho esto // creo que si hay mas de uno solo se tendria que aplicar en el primero, - return DynamicExpression[T]{ + return dynamicExpressionImpl[T1]{ SQLExpressions: []LiteralSQLExpression{ { SQL: expressions.ToSQL[expression], @@ -70,17 +77,17 @@ func NewDynamicExpression[T any](expression expressions.SQLExpression, field Fie } // TODO doc -type DynamicExpression[T any] struct { +type dynamicExpressionImpl[T any] struct { // TODO hacer el cambio de nombre en el anterior tambien? SQLExpressions []LiteralSQLExpression } type LiteralSQLExpression struct { SQL string - Field FieldIdentifier + Field IFieldIdentifier } -func (expr DynamicExpression[T]) InterfaceVerificationMethod(_ T) { +func (expr dynamicExpressionImpl[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Expression[T] } @@ -88,12 +95,12 @@ func (expr DynamicExpression[T]) InterfaceVerificationMethod(_ T) { // verificar que en las condiciones anteriores alguien usó el field con el que se intenta comparar // obtener de ahi cual es el nombre de la table a usar con ese field. // TODO doc a ingles -func (expr DynamicExpression[T]) ToSQL(query *query, columnName string) (string, []any, error) { +func (expr dynamicExpressionImpl[T]) ToSQL(query *query, columnName string) (string, []any, error) { exprString := columnName values := []any{} for _, sqlExpr := range expr.SQLExpressions { - modelTable, isConcerned := query.concernedModels[sqlExpr.Field.ModelType] + modelTable, isConcerned := query.concernedModels[sqlExpr.Field.GetModelType()] if !isConcerned { return "", nil, ErrFieldModelNotConcerned } diff --git a/badorm/query.go b/badorm/query.go index 4df0866d..3ad298b9 100644 --- a/badorm/query.go +++ b/badorm/query.go @@ -41,28 +41,37 @@ func (t Table) DeliverTable(query *query, model Model, relationName string) (Tab }, nil } -type FieldIdentifier struct { +type IFieldIdentifier interface { + ColumnName(query *query, table Table) string + ColumnSQL(query *query, table Table) string + GetModelType() reflect.Type +} + +type FieldIdentifier[T any] struct { Column string Field string ColumnPrefix string - Type reflect.Type ModelType reflect.Type } +func (fieldID FieldIdentifier[T]) GetModelType() reflect.Type { + return fieldID.ModelType +} + // Returns the name of the column in which the field is saved in the table -func (columnID FieldIdentifier) ColumnName(query *query, table Table) string { - columnName := columnID.Column +func (fieldID FieldIdentifier[T]) ColumnName(query *query, table Table) string { + columnName := fieldID.Column if columnName == "" { - columnName = query.ColumnName(table, columnID.Field) + columnName = query.ColumnName(table, fieldID.Field) } // add column prefix and table name once we know the column name - return columnID.ColumnPrefix + columnName + return fieldID.ColumnPrefix + columnName } // Returns the SQL to get the value of the field in the table -func (columnID FieldIdentifier) ColumnSQL(query *query, table Table) string { - return table.Alias + "." + columnID.ColumnName(query, table) +func (fieldID FieldIdentifier[T]) ColumnSQL(query *query, table Table) string { + return table.Alias + "." + fieldID.ColumnName(query, table) } type query struct { @@ -70,7 +79,7 @@ type query struct { concernedModels map[reflect.Type]Table } -func (query *query) AddSelect(table Table, fieldID FieldIdentifier) { +func (query *query) AddSelect(table Table, fieldID IFieldIdentifier) { columnName := fieldID.ColumnName(query, table) query.gormDB.Statement.Selects = append( diff --git a/persistence/models/User.go b/persistence/models/User.go index 124cd012..5c02836d 100644 --- a/persistence/models/User.go +++ b/persistence/models/User.go @@ -15,7 +15,7 @@ type User struct { func UserEmailCondition(expr badorm.Expression[string]) badorm.WhereCondition[User] { return badorm.FieldCondition[User, string]{ Expression: expr, - FieldIdentifier: badorm.FieldIdentifier{ + FieldIdentifier: badorm.FieldIdentifier[string]{ Field: "Email", }, } diff --git a/testintegration/conditions/badorm.go b/testintegration/conditions/badorm.go index 8891ae4d..cc0ad018 100644 --- a/testintegration/conditions/badorm.go +++ b/testintegration/conditions/badorm.go @@ -1,3 +1,3 @@ package conditions -//go:generate badctl gen conditions ../models +//go:generate ../../tools/badctl/badctl gen conditions ../models diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index 7f125f36..afdd5a91 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -10,10 +10,9 @@ import ( ) var bicycleType = reflect.TypeOf(*new(models.Bicycle)) -var BicycleIdField = badorm.FieldIdentifier{ +var BicycleIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: bicycleType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func BicycleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Bicycle] { @@ -23,10 +22,9 @@ func BicycleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models } } -var BicycleCreatedAtField = badorm.FieldIdentifier{ +var BicycleCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: bicycleType, - Type: reflect.TypeOf(*new(time.Time)), } func BicycleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Bicycle] { @@ -36,10 +34,9 @@ func BicycleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var BicycleUpdatedAtField = badorm.FieldIdentifier{ +var BicycleUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: bicycleType, - Type: reflect.TypeOf(*new(time.Time)), } func BicycleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Bicycle] { @@ -49,10 +46,9 @@ func BicycleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var BicycleDeletedAtField = badorm.FieldIdentifier{ +var BicycleDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: bicycleType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Bicycle] { @@ -62,10 +58,9 @@ func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } } -var BicycleNameField = badorm.FieldIdentifier{ +var BicycleNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: bicycleType, - Type: reflect.TypeOf(*new(string)), } func BicycleName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { @@ -85,10 +80,9 @@ func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.IJoinCon } var BicyclePreloadOwner = BicycleOwner(PersonPreloadAttributes) -var BicycleOwnerNameField = badorm.FieldIdentifier{ +var BicycleOwnerNameField = badorm.FieldIdentifier[string]{ Field: "OwnerName", ModelType: bicycleType, - Type: reflect.TypeOf(*new(string)), } func BicycleOwnerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index 3d9c1c37..8ad0313d 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -10,10 +10,9 @@ import ( ) var brandType = reflect.TypeOf(*new(models.Brand)) -var BrandIdField = badorm.FieldIdentifier{ +var BrandIdField = badorm.FieldIdentifier[badorm.UIntID]{ Field: "ID", ModelType: brandType, - Type: reflect.TypeOf(*new(badorm.UIntID)), } func BrandId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[models.Brand] { @@ -23,10 +22,9 @@ func BrandId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[models } } -var BrandCreatedAtField = badorm.FieldIdentifier{ +var BrandCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: brandType, - Type: reflect.TypeOf(*new(time.Time)), } func BrandCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Brand] { @@ -36,10 +34,9 @@ func BrandCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mod } } -var BrandUpdatedAtField = badorm.FieldIdentifier{ +var BrandUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: brandType, - Type: reflect.TypeOf(*new(time.Time)), } func BrandUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Brand] { @@ -49,10 +46,9 @@ func BrandUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mod } } -var BrandDeletedAtField = badorm.FieldIdentifier{ +var BrandDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: brandType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func BrandDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Brand] { @@ -62,10 +58,9 @@ func BrandDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio } } -var BrandNameField = badorm.FieldIdentifier{ +var BrandNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: brandType, - Type: reflect.TypeOf(*new(string)), } func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[models.Brand] { diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index 04691560..13b44286 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -10,10 +10,9 @@ import ( ) var childType = reflect.TypeOf(*new(models.Child)) -var ChildIdField = badorm.FieldIdentifier{ +var ChildIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: childType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func ChildId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { @@ -23,10 +22,9 @@ func ChildId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.C } } -var ChildCreatedAtField = badorm.FieldIdentifier{ +var ChildCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: childType, - Type: reflect.TypeOf(*new(time.Time)), } func ChildCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Child] { @@ -36,10 +34,9 @@ func ChildCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mod } } -var ChildUpdatedAtField = badorm.FieldIdentifier{ +var ChildUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: childType, - Type: reflect.TypeOf(*new(time.Time)), } func ChildUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Child] { @@ -49,10 +46,9 @@ func ChildUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mod } } -var ChildDeletedAtField = badorm.FieldIdentifier{ +var ChildDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: childType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func ChildDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Child] { @@ -72,10 +68,9 @@ func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.IJoinCo } var ChildPreloadParent1 = ChildParent1(Parent1PreloadAttributes) -var ChildParent1IdField = badorm.FieldIdentifier{ +var ChildParent1IdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "Parent1ID", ModelType: childType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { @@ -95,10 +90,9 @@ func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.IJoinCo } var ChildPreloadParent2 = ChildParent2(Parent2PreloadAttributes) -var ChildParent2IdField = badorm.FieldIdentifier{ +var ChildParent2IdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "Parent2ID", ModelType: childType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func ChildParent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index b5120309..858b541e 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -10,10 +10,9 @@ import ( ) var cityType = reflect.TypeOf(*new(models.City)) -var CityIdField = badorm.FieldIdentifier{ +var CityIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: cityType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func CityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { @@ -23,10 +22,9 @@ func CityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Ci } } -var CityCreatedAtField = badorm.FieldIdentifier{ +var CityCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: cityType, - Type: reflect.TypeOf(*new(time.Time)), } func CityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.City] { @@ -36,10 +34,9 @@ func CityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mode } } -var CityUpdatedAtField = badorm.FieldIdentifier{ +var CityUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: cityType, - Type: reflect.TypeOf(*new(time.Time)), } func CityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.City] { @@ -49,10 +46,9 @@ func CityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mode } } -var CityDeletedAtField = badorm.FieldIdentifier{ +var CityDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: cityType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.City] { @@ -62,10 +58,9 @@ func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition } } -var CityNameField = badorm.FieldIdentifier{ +var CityNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: cityType, - Type: reflect.TypeOf(*new(string)), } func CityName(expr badorm.Expression[string]) badorm.WhereCondition[models.City] { @@ -85,10 +80,9 @@ func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.IJoinCon } var CityPreloadCountry = CityCountry(CountryPreloadAttributes) -var CityCountryIdField = badorm.FieldIdentifier{ +var CityCountryIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "CountryID", ModelType: cityType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index cede7f76..6ce97259 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -10,10 +10,9 @@ import ( ) var companyType = reflect.TypeOf(*new(models.Company)) -var CompanyIdField = badorm.FieldIdentifier{ +var CompanyIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: companyType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func CompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Company] { @@ -23,10 +22,9 @@ func CompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models } } -var CompanyCreatedAtField = badorm.FieldIdentifier{ +var CompanyCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: companyType, - Type: reflect.TypeOf(*new(time.Time)), } func CompanyCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Company] { @@ -36,10 +34,9 @@ func CompanyCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var CompanyUpdatedAtField = badorm.FieldIdentifier{ +var CompanyUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: companyType, - Type: reflect.TypeOf(*new(time.Time)), } func CompanyUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Company] { @@ -49,10 +46,9 @@ func CompanyUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var CompanyDeletedAtField = badorm.FieldIdentifier{ +var CompanyDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: companyType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Company] { @@ -62,10 +58,9 @@ func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } } -var CompanyNameField = badorm.FieldIdentifier{ +var CompanyNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: companyType, - Type: reflect.TypeOf(*new(string)), } func CompanyName(expr badorm.Expression[string]) badorm.WhereCondition[models.Company] { diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index efd20f60..7aeffe6a 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -10,10 +10,9 @@ import ( ) var countryType = reflect.TypeOf(*new(models.Country)) -var CountryIdField = badorm.FieldIdentifier{ +var CountryIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: countryType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func CountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Country] { @@ -23,10 +22,9 @@ func CountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models } } -var CountryCreatedAtField = badorm.FieldIdentifier{ +var CountryCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: countryType, - Type: reflect.TypeOf(*new(time.Time)), } func CountryCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Country] { @@ -36,10 +34,9 @@ func CountryCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var CountryUpdatedAtField = badorm.FieldIdentifier{ +var CountryUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: countryType, - Type: reflect.TypeOf(*new(time.Time)), } func CountryUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Country] { @@ -49,10 +46,9 @@ func CountryUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var CountryDeletedAtField = badorm.FieldIdentifier{ +var CountryDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: countryType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Country] { @@ -62,10 +58,9 @@ func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } } -var CountryNameField = badorm.FieldIdentifier{ +var CountryNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: countryType, - Type: reflect.TypeOf(*new(string)), } func CountryName(expr badorm.Expression[string]) badorm.WhereCondition[models.Country] { diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 8645a52c..5097d360 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -10,10 +10,9 @@ import ( ) var employeeType = reflect.TypeOf(*new(models.Employee)) -var EmployeeIdField = badorm.FieldIdentifier{ +var EmployeeIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: employeeType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func EmployeeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { @@ -23,10 +22,9 @@ func EmployeeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[model } } -var EmployeeCreatedAtField = badorm.FieldIdentifier{ +var EmployeeCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: employeeType, - Type: reflect.TypeOf(*new(time.Time)), } func EmployeeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Employee] { @@ -36,10 +34,9 @@ func EmployeeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[ } } -var EmployeeUpdatedAtField = badorm.FieldIdentifier{ +var EmployeeUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: employeeType, - Type: reflect.TypeOf(*new(time.Time)), } func EmployeeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Employee] { @@ -49,10 +46,9 @@ func EmployeeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[ } } -var EmployeeDeletedAtField = badorm.FieldIdentifier{ +var EmployeeDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: employeeType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Employee] { @@ -62,10 +58,9 @@ func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondi } } -var EmployeeNameField = badorm.FieldIdentifier{ +var EmployeeNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: employeeType, - Type: reflect.TypeOf(*new(string)), } func EmployeeName(expr badorm.Expression[string]) badorm.WhereCondition[models.Employee] { @@ -85,10 +80,9 @@ func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.IJoinC } var EmployeePreloadBoss = EmployeeBoss(EmployeePreloadAttributes) -var EmployeeBossIdField = badorm.FieldIdentifier{ +var EmployeeBossIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "BossID", ModelType: employeeType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { diff --git a/testintegration/conditions/parent1_conditions.go b/testintegration/conditions/parent1_conditions.go index 3ba4e57e..6dfe49be 100644 --- a/testintegration/conditions/parent1_conditions.go +++ b/testintegration/conditions/parent1_conditions.go @@ -10,10 +10,9 @@ import ( ) var parent1Type = reflect.TypeOf(*new(models.Parent1)) -var Parent1IdField = badorm.FieldIdentifier{ +var Parent1IdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: parent1Type, - Type: reflect.TypeOf(*new(badorm.UUID)), } func Parent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { @@ -23,10 +22,9 @@ func Parent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models } } -var Parent1CreatedAtField = badorm.FieldIdentifier{ +var Parent1CreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: parent1Type, - Type: reflect.TypeOf(*new(time.Time)), } func Parent1CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent1] { @@ -36,10 +34,9 @@ func Parent1CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var Parent1UpdatedAtField = badorm.FieldIdentifier{ +var Parent1UpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: parent1Type, - Type: reflect.TypeOf(*new(time.Time)), } func Parent1UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent1] { @@ -49,10 +46,9 @@ func Parent1UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var Parent1DeletedAtField = badorm.FieldIdentifier{ +var Parent1DeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: parent1Type, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func Parent1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Parent1] { @@ -72,10 +68,9 @@ func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) ba } var Parent1PreloadParentParent = Parent1ParentParent(ParentParentPreloadAttributes) -var Parent1ParentParentIdField = badorm.FieldIdentifier{ +var Parent1ParentParentIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ParentParentID", ModelType: parent1Type, - Type: reflect.TypeOf(*new(badorm.UUID)), } func Parent1ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { diff --git a/testintegration/conditions/parent2_conditions.go b/testintegration/conditions/parent2_conditions.go index a85946b5..acd7dc41 100644 --- a/testintegration/conditions/parent2_conditions.go +++ b/testintegration/conditions/parent2_conditions.go @@ -10,10 +10,9 @@ import ( ) var parent2Type = reflect.TypeOf(*new(models.Parent2)) -var Parent2IdField = badorm.FieldIdentifier{ +var Parent2IdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: parent2Type, - Type: reflect.TypeOf(*new(badorm.UUID)), } func Parent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { @@ -23,10 +22,9 @@ func Parent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models } } -var Parent2CreatedAtField = badorm.FieldIdentifier{ +var Parent2CreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: parent2Type, - Type: reflect.TypeOf(*new(time.Time)), } func Parent2CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent2] { @@ -36,10 +34,9 @@ func Parent2CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var Parent2UpdatedAtField = badorm.FieldIdentifier{ +var Parent2UpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: parent2Type, - Type: reflect.TypeOf(*new(time.Time)), } func Parent2UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent2] { @@ -49,10 +46,9 @@ func Parent2UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var Parent2DeletedAtField = badorm.FieldIdentifier{ +var Parent2DeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: parent2Type, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func Parent2DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Parent2] { @@ -72,10 +68,9 @@ func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) ba } var Parent2PreloadParentParent = Parent2ParentParent(ParentParentPreloadAttributes) -var Parent2ParentParentIdField = badorm.FieldIdentifier{ +var Parent2ParentParentIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ParentParentID", ModelType: parent2Type, - Type: reflect.TypeOf(*new(badorm.UUID)), } func Parent2ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { diff --git a/testintegration/conditions/parent_parent_conditions.go b/testintegration/conditions/parent_parent_conditions.go index 794858bf..33455a65 100644 --- a/testintegration/conditions/parent_parent_conditions.go +++ b/testintegration/conditions/parent_parent_conditions.go @@ -10,10 +10,9 @@ import ( ) var parentParentType = reflect.TypeOf(*new(models.ParentParent)) -var ParentParentIdField = badorm.FieldIdentifier{ +var ParentParentIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: parentParentType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.ParentParent] { @@ -23,10 +22,9 @@ func ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[m } } -var ParentParentCreatedAtField = badorm.FieldIdentifier{ +var ParentParentCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: parentParentType, - Type: reflect.TypeOf(*new(time.Time)), } func ParentParentCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.ParentParent] { @@ -36,10 +34,9 @@ func ParentParentCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondit } } -var ParentParentUpdatedAtField = badorm.FieldIdentifier{ +var ParentParentUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: parentParentType, - Type: reflect.TypeOf(*new(time.Time)), } func ParentParentUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.ParentParent] { @@ -49,10 +46,9 @@ func ParentParentUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondit } } -var ParentParentDeletedAtField = badorm.FieldIdentifier{ +var ParentParentDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: parentParentType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func ParentParentDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.ParentParent] { @@ -62,10 +58,9 @@ func ParentParentDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereC } } -var ParentParentNameField = badorm.FieldIdentifier{ +var ParentParentNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: parentParentType, - Type: reflect.TypeOf(*new(string)), } func ParentParentName(expr badorm.Expression[string]) badorm.WhereCondition[models.ParentParent] { diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index 199518ea..35762329 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -10,10 +10,9 @@ import ( ) var personType = reflect.TypeOf(*new(models.Person)) -var PersonIdField = badorm.FieldIdentifier{ +var PersonIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: personType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func PersonId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Person] { @@ -23,10 +22,9 @@ func PersonId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models. } } -var PersonCreatedAtField = badorm.FieldIdentifier{ +var PersonCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: personType, - Type: reflect.TypeOf(*new(time.Time)), } func PersonCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Person] { @@ -36,10 +34,9 @@ func PersonCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mo } } -var PersonUpdatedAtField = badorm.FieldIdentifier{ +var PersonUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: personType, - Type: reflect.TypeOf(*new(time.Time)), } func PersonUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Person] { @@ -49,10 +46,9 @@ func PersonUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mo } } -var PersonDeletedAtField = badorm.FieldIdentifier{ +var PersonDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: personType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func PersonDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Person] { @@ -62,10 +58,9 @@ func PersonDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditi } } -var PersonNameField = badorm.FieldIdentifier{ +var PersonNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: personType, - Type: reflect.TypeOf(*new(string)), } func PersonName(expr badorm.Expression[string]) badorm.WhereCondition[models.Person] { diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index e9db006c..8c9064bc 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -10,10 +10,9 @@ import ( ) var phoneType = reflect.TypeOf(*new(models.Phone)) -var PhoneIdField = badorm.FieldIdentifier{ +var PhoneIdField = badorm.FieldIdentifier[badorm.UIntID]{ Field: "ID", ModelType: phoneType, - Type: reflect.TypeOf(*new(badorm.UIntID)), } func PhoneId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[models.Phone] { @@ -23,10 +22,9 @@ func PhoneId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[models } } -var PhoneCreatedAtField = badorm.FieldIdentifier{ +var PhoneCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: phoneType, - Type: reflect.TypeOf(*new(time.Time)), } func PhoneCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Phone] { @@ -36,10 +34,9 @@ func PhoneCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mod } } -var PhoneUpdatedAtField = badorm.FieldIdentifier{ +var PhoneUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: phoneType, - Type: reflect.TypeOf(*new(time.Time)), } func PhoneUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Phone] { @@ -49,10 +46,9 @@ func PhoneUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mod } } -var PhoneDeletedAtField = badorm.FieldIdentifier{ +var PhoneDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: phoneType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Phone] { @@ -62,10 +58,9 @@ func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio } } -var PhoneNameField = badorm.FieldIdentifier{ +var PhoneNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: phoneType, - Type: reflect.TypeOf(*new(string)), } func PhoneName(expr badorm.Expression[string]) badorm.WhereCondition[models.Phone] { @@ -85,10 +80,9 @@ func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.IJoinCondit } var PhonePreloadBrand = PhoneBrand(BrandPreloadAttributes) -var PhoneBrandIdField = badorm.FieldIdentifier{ +var PhoneBrandIdField = badorm.FieldIdentifier[uint]{ Field: "BrandID", ModelType: phoneType, - Type: reflect.TypeOf(*new(uint)), } func PhoneBrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index 354644ec..22064624 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -11,10 +11,9 @@ import ( ) var productType = reflect.TypeOf(*new(models.Product)) -var ProductIdField = badorm.FieldIdentifier{ +var ProductIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: productType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func ProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Product] { @@ -24,10 +23,9 @@ func ProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models } } -var ProductCreatedAtField = badorm.FieldIdentifier{ +var ProductCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: productType, - Type: reflect.TypeOf(*new(time.Time)), } func ProductCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Product] { @@ -37,10 +35,9 @@ func ProductCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var ProductUpdatedAtField = badorm.FieldIdentifier{ +var ProductUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: productType, - Type: reflect.TypeOf(*new(time.Time)), } func ProductUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Product] { @@ -50,10 +47,9 @@ func ProductUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[m } } -var ProductDeletedAtField = badorm.FieldIdentifier{ +var ProductDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: productType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func ProductDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Product] { @@ -63,10 +59,9 @@ func ProductDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondit } } -var ProductStringField = badorm.FieldIdentifier{ +var ProductStringField = badorm.FieldIdentifier[string]{ Column: "string_something_else", ModelType: productType, - Type: reflect.TypeOf(*new(string)), } func ProductString(expr badorm.Expression[string]) badorm.WhereCondition[models.Product] { @@ -76,10 +71,9 @@ func ProductString(expr badorm.Expression[string]) badorm.WhereCondition[models. } } -var ProductIntField = badorm.FieldIdentifier{ +var ProductIntField = badorm.FieldIdentifier[int]{ Field: "Int", ModelType: productType, - Type: reflect.TypeOf(*new(int)), } func ProductInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { @@ -89,10 +83,9 @@ func ProductInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Produc } } -var ProductIntPointerField = badorm.FieldIdentifier{ +var ProductIntPointerField = badorm.FieldIdentifier[int]{ Field: "IntPointer", ModelType: productType, - Type: reflect.TypeOf(*new(int)), } func ProductIntPointer(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { @@ -102,10 +95,9 @@ func ProductIntPointer(expr badorm.Expression[int]) badorm.WhereCondition[models } } -var ProductFloatField = badorm.FieldIdentifier{ +var ProductFloatField = badorm.FieldIdentifier[float64]{ Field: "Float", ModelType: productType, - Type: reflect.TypeOf(*new(float64)), } func ProductFloat(expr badorm.Expression[float64]) badorm.WhereCondition[models.Product] { @@ -115,10 +107,9 @@ func ProductFloat(expr badorm.Expression[float64]) badorm.WhereCondition[models. } } -var ProductNullFloatField = badorm.FieldIdentifier{ +var ProductNullFloatField = badorm.FieldIdentifier[sql.NullFloat64]{ Field: "NullFloat", ModelType: productType, - Type: reflect.TypeOf(*new(sql.NullFloat64)), } func ProductNullFloat(expr badorm.Expression[sql.NullFloat64]) badorm.WhereCondition[models.Product] { @@ -128,10 +119,9 @@ func ProductNullFloat(expr badorm.Expression[sql.NullFloat64]) badorm.WhereCondi } } -var ProductBoolField = badorm.FieldIdentifier{ +var ProductBoolField = badorm.FieldIdentifier[bool]{ Field: "Bool", ModelType: productType, - Type: reflect.TypeOf(*new(bool)), } func ProductBool(expr badorm.Expression[bool]) badorm.WhereCondition[models.Product] { @@ -141,10 +131,9 @@ func ProductBool(expr badorm.Expression[bool]) badorm.WhereCondition[models.Prod } } -var ProductNullBoolField = badorm.FieldIdentifier{ +var ProductNullBoolField = badorm.FieldIdentifier[sql.NullBool]{ Field: "NullBool", ModelType: productType, - Type: reflect.TypeOf(*new(sql.NullBool)), } func ProductNullBool(expr badorm.Expression[sql.NullBool]) badorm.WhereCondition[models.Product] { @@ -154,10 +143,9 @@ func ProductNullBool(expr badorm.Expression[sql.NullBool]) badorm.WhereCondition } } -var ProductByteArrayField = badorm.FieldIdentifier{ +var ProductByteArrayField = badorm.FieldIdentifier[[]uint8]{ Field: "ByteArray", ModelType: productType, - Type: reflect.TypeOf(*new([]uint8)), } func ProductByteArray(expr badorm.Expression[[]uint8]) badorm.WhereCondition[models.Product] { @@ -167,10 +155,9 @@ func ProductByteArray(expr badorm.Expression[[]uint8]) badorm.WhereCondition[mod } } -var ProductMultiStringField = badorm.FieldIdentifier{ +var ProductMultiStringField = badorm.FieldIdentifier[models.MultiString]{ Field: "MultiString", ModelType: productType, - Type: reflect.TypeOf(*new(models.MultiString)), } func ProductMultiString(expr badorm.Expression[models.MultiString]) badorm.WhereCondition[models.Product] { @@ -180,10 +167,9 @@ func ProductMultiString(expr badorm.Expression[models.MultiString]) badorm.Where } } -var ProductToBeEmbeddedEmbeddedIntField = badorm.FieldIdentifier{ +var ProductToBeEmbeddedEmbeddedIntField = badorm.FieldIdentifier[int]{ Field: "EmbeddedInt", ModelType: productType, - Type: reflect.TypeOf(*new(int)), } func ProductToBeEmbeddedEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { @@ -193,11 +179,10 @@ func ProductToBeEmbeddedEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCon } } -var ProductGormEmbeddedIntField = badorm.FieldIdentifier{ +var ProductGormEmbeddedIntField = badorm.FieldIdentifier[int]{ ColumnPrefix: "gorm_embedded_", Field: "Int", ModelType: productType, - Type: reflect.TypeOf(*new(int)), } func ProductGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 21e05fee..132d6a08 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -10,10 +10,9 @@ import ( ) var saleType = reflect.TypeOf(*new(models.Sale)) -var SaleIdField = badorm.FieldIdentifier{ +var SaleIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: saleType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func SaleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { @@ -23,10 +22,9 @@ func SaleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sa } } -var SaleCreatedAtField = badorm.FieldIdentifier{ +var SaleCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: saleType, - Type: reflect.TypeOf(*new(time.Time)), } func SaleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Sale] { @@ -36,10 +34,9 @@ func SaleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mode } } -var SaleUpdatedAtField = badorm.FieldIdentifier{ +var SaleUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: saleType, - Type: reflect.TypeOf(*new(time.Time)), } func SaleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Sale] { @@ -49,10 +46,9 @@ func SaleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mode } } -var SaleDeletedAtField = badorm.FieldIdentifier{ +var SaleDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: saleType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func SaleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Sale] { @@ -62,10 +58,9 @@ func SaleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition } } -var SaleCodeField = badorm.FieldIdentifier{ +var SaleCodeField = badorm.FieldIdentifier[int]{ Field: "Code", ModelType: saleType, - Type: reflect.TypeOf(*new(int)), } func SaleCode(expr badorm.Expression[int]) badorm.WhereCondition[models.Sale] { @@ -75,10 +70,9 @@ func SaleCode(expr badorm.Expression[int]) badorm.WhereCondition[models.Sale] { } } -var SaleDescriptionField = badorm.FieldIdentifier{ +var SaleDescriptionField = badorm.FieldIdentifier[string]{ Field: "Description", ModelType: saleType, - Type: reflect.TypeOf(*new(string)), } func SaleDescription(expr badorm.Expression[string]) badorm.WhereCondition[models.Sale] { @@ -98,10 +92,9 @@ func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.IJoinCon } var SalePreloadProduct = SaleProduct(ProductPreloadAttributes) -var SaleProductIdField = badorm.FieldIdentifier{ +var SaleProductIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ProductID", ModelType: saleType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { @@ -121,10 +114,9 @@ func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.IJoinCondi } var SalePreloadSeller = SaleSeller(SellerPreloadAttributes) -var SaleSellerIdField = badorm.FieldIdentifier{ +var SaleSellerIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "SellerID", ModelType: saleType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func SaleSellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index dd3f1421..6ce76b83 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -10,10 +10,9 @@ import ( ) var sellerType = reflect.TypeOf(*new(models.Seller)) -var SellerIdField = badorm.FieldIdentifier{ +var SellerIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: sellerType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func SellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { @@ -23,10 +22,9 @@ func SellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models. } } -var SellerCreatedAtField = badorm.FieldIdentifier{ +var SellerCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: sellerType, - Type: reflect.TypeOf(*new(time.Time)), } func SellerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Seller] { @@ -36,10 +34,9 @@ func SellerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mo } } -var SellerUpdatedAtField = badorm.FieldIdentifier{ +var SellerUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: sellerType, - Type: reflect.TypeOf(*new(time.Time)), } func SellerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Seller] { @@ -49,10 +46,9 @@ func SellerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[mo } } -var SellerDeletedAtField = badorm.FieldIdentifier{ +var SellerDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: sellerType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Seller] { @@ -62,10 +58,9 @@ func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditi } } -var SellerNameField = badorm.FieldIdentifier{ +var SellerNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: sellerType, - Type: reflect.TypeOf(*new(string)), } func SellerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Seller] { @@ -85,10 +80,9 @@ func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.IJoinC } var SellerPreloadCompany = SellerCompany(CompanyPreloadAttributes) -var SellerCompanyIdField = badorm.FieldIdentifier{ +var SellerCompanyIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "CompanyID", ModelType: sellerType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { @@ -108,10 +102,9 @@ func SellerUniversity(conditions ...badorm.Condition[models.University]) badorm. } var SellerPreloadUniversity = SellerUniversity(UniversityPreloadAttributes) -var SellerUniversityIdField = badorm.FieldIdentifier{ +var SellerUniversityIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "UniversityID", ModelType: sellerType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func SellerUniversityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { diff --git a/testintegration/conditions/university_conditions.go b/testintegration/conditions/university_conditions.go index 49eb6ff4..36898cbd 100644 --- a/testintegration/conditions/university_conditions.go +++ b/testintegration/conditions/university_conditions.go @@ -10,10 +10,9 @@ import ( ) var universityType = reflect.TypeOf(*new(models.University)) -var UniversityIdField = badorm.FieldIdentifier{ +var UniversityIdField = badorm.FieldIdentifier[badorm.UUID]{ Field: "ID", ModelType: universityType, - Type: reflect.TypeOf(*new(badorm.UUID)), } func UniversityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.University] { @@ -23,10 +22,9 @@ func UniversityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[mod } } -var UniversityCreatedAtField = badorm.FieldIdentifier{ +var UniversityCreatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "CreatedAt", ModelType: universityType, - Type: reflect.TypeOf(*new(time.Time)), } func UniversityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.University] { @@ -36,10 +34,9 @@ func UniversityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereConditio } } -var UniversityUpdatedAtField = badorm.FieldIdentifier{ +var UniversityUpdatedAtField = badorm.FieldIdentifier[time.Time]{ Field: "UpdatedAt", ModelType: universityType, - Type: reflect.TypeOf(*new(time.Time)), } func UniversityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.University] { @@ -49,10 +46,9 @@ func UniversityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereConditio } } -var UniversityDeletedAtField = badorm.FieldIdentifier{ +var UniversityDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ Field: "DeletedAt", ModelType: universityType, - Type: reflect.TypeOf(*new(gorm.DeletedAt)), } func UniversityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.University] { @@ -62,10 +58,9 @@ func UniversityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCon } } -var UniversityNameField = badorm.FieldIdentifier{ +var UniversityNameField = badorm.FieldIdentifier[string]{ Field: "Name", ModelType: universityType, - Type: reflect.TypeOf(*new(string)), } func UniversityName(expr badorm.Expression[string]) badorm.WhereCondition[models.University] { diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 2f6706ed..9c9b8aaa 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -989,7 +989,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBasicType() { entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - badorm.NewDynamicExpression[int]( + badorm.DynamicExpression( expressions.Eq, conditions.ProductIntPointerField, ), @@ -1000,18 +1000,6 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBasicType() { EqualList(&ts.Suite, []*models.Product{product1}, entities) } -func (ts *ExpressionIntTestSuite) TestDynamicExpressionWithFieldOfAnotherTypeReturnsError() { - _, err := ts.crudProductService.GetEntities( - conditions.ProductInt( - badorm.NewDynamicExpression[int]( - expressions.Eq, - conditions.ProductStringField, - ), - ), - ) - ts.ErrorIs(err, badorm.ErrFieldTypeDoesNotMatch) -} - func (ts *ExpressionIntTestSuite) TestDynamicExpressionForCustomType() { match := ts.createProduct("salut,hola", 1, 0.0, false, nil) match.MultiString = models.MultiString{"salut", "hola"} @@ -1023,9 +1011,8 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForCustomType() { entities, err := ts.crudProductService.GetEntities( conditions.ProductMultiString( - badorm.NewDynamicExpression[models.MultiString]( + badorm.DynamicExpression( expressions.Eq, - // TODO el field podria tener el tipo para evitar el tipo en el new dynamic conditions.ProductMultiStringField, ), ), @@ -1035,7 +1022,35 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForCustomType() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestDynamicExpressionForNullableTypeCanBeComparedWithNotNullType() { +func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBadORMModelAttribute() { + match := ts.createProduct("", 1, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductDeletedAt( + badorm.DynamicExpression( + expressions.IsNotDistinct, + conditions.ProductDeletedAtField, + ), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionWithFieldOfAnotherTypeReturnsError() { + _, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + badorm.MultitypeDynamicExpression[int]( + expressions.Eq, + conditions.ProductStringField, + ), + ), + ) + ts.ErrorIs(err, badorm.ErrFieldTypeDoesNotMatch) +} + +func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForNullableTypeCanBeComparedWithNotNullType() { match := ts.createProduct("", 1, 1.0, false, nil) match.NullFloat = sql.NullFloat64{Valid: true, Float64: 1.0} err := ts.db.Save(match).Error @@ -1045,7 +1060,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForNullableTypeCanBeCompa entities, err := ts.crudProductService.GetEntities( conditions.ProductNullFloat( - badorm.NewDynamicExpression[sql.NullFloat64]( + badorm.MultitypeDynamicExpression[sql.NullFloat64]( expressions.Eq, conditions.ProductFloatField, ), @@ -1056,7 +1071,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForNullableTypeCanBeCompa EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestDynamicExpressionForNotNullTypeCanBeComparedWithNullableType() { +func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForNotNullTypeCanBeComparedWithNullableType() { match := ts.createProduct("", 1, 1.0, false, nil) match.NullFloat = sql.NullFloat64{Valid: true, Float64: 1.0} err := ts.db.Save(match).Error @@ -1066,7 +1081,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForNotNullTypeCanBeCompar entities, err := ts.crudProductService.GetEntities( conditions.ProductFloat( - badorm.NewDynamicExpression[float64]( + badorm.MultitypeDynamicExpression[float64]( expressions.Eq, conditions.ProductNullFloatField, ), @@ -1077,12 +1092,12 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForNotNullTypeCanBeCompar EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBadORMModelAttribute() { +func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForBadORMModelAttribute() { match := ts.createProduct("", 1, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( conditions.ProductDeletedAt( - badorm.NewDynamicExpression[gorm.DeletedAt]( + badorm.MultitypeDynamicExpression[gorm.DeletedAt]( expressions.IsDistinct, conditions.ProductCreatedAtField, ), diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 2a4a5dbb..496bd5c2 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -365,7 +365,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2Tables() { entities, err := ts.crudSellerService.GetEntities( conditions.SellerCompany( conditions.CompanyName( - badorm.NewDynamicExpression[string]( + badorm.DynamicExpression( expressions.Eq, conditions.SellerNameField, ), @@ -394,7 +394,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2TablesAtMoreLeve conditions.SaleSeller( conditions.SellerCompany( conditions.CompanyName( - badorm.NewDynamicExpression[string]( + badorm.DynamicExpression( expressions.Eq, conditions.SellerNameField, ), diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index a34a0714..65759645 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -200,7 +200,6 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { // to use it in the where condition and in the preload condition func (condition *Condition) createFieldIdentifier(objectName string, objectTypeQual jen.Code, field Field, conditionName string) *jen.Statement { fieldIdentifierValues := jen.Dict{ - jen.Id("Type"): reflectTypeOf().Call(jen.Op("*").New(condition.param.GenericType())), jen.Id("ModelType"): jen.Id(getObjectTypeName(objectName)), } @@ -219,6 +218,8 @@ func (condition *Condition) createFieldIdentifier(objectName string, objectTypeQ fieldIdentifierVar := jen.Qual( badORMPath, badORMFieldIdentifier, + ).Types( + condition.param.GenericType(), ).Values(fieldIdentifierValues) fieldIdentifierName := conditionName + "Field" diff --git a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go index 272be565..73472110 100644 --- a/tools/badctl/cmd/gen/conditions/conditionsGenerator.go +++ b/tools/badctl/cmd/gen/conditions/conditionsGenerator.go @@ -41,13 +41,6 @@ func getObjectTypeName(objectType string) string { return strcase.ToCamel(objectType) + "Type" } -func reflectTypeOf() *jen.Statement { - return jen.Qual( - "reflect", - "TypeOf", - ) -} - // Add one condition for each field of the object func (cg CodeConditionsGenerator) addConditionsForEachField(file *File, fields []Field) { conditions := cg.ForEachField(file, fields) @@ -81,7 +74,10 @@ func (cg CodeConditionsGenerator) addConditionsForEachField(file *File, fields [ jen.Var().Id( getObjectTypeName(objectName), ).Op("=").Add( - reflectTypeOf().Call(jen.Op("*").New(objectQual)), + jen.Qual( + "reflect", + "TypeOf", + ).Call(jen.Op("*").New(objectQual)), ), ) From 72b26450e9f1f739d64dad2a462f609390bfc2e7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 5 Jul 2023 12:37:07 +0200 Subject: [PATCH 420/467] refactor dynamic to package + select join posibility --- badorm/condition.go | 34 ++-- badorm/dynamic/expression.go | 154 ++++++++++++++++++ badorm/dynamicExpression.go | 115 ------------- badorm/expression.go | 60 ++++--- badorm/expressions/sqlExpressions.go | 49 ++++-- badorm/multitype/expression.go | 123 ++++++++++++++ badorm/mysql/array.go | 9 +- badorm/mysql/comparison.go | 6 +- badorm/psql/comparison.go | 9 +- badorm/query.go | 54 +++--- badorm/shared/array.go | 9 +- badorm/sqlite/comparison.go | 3 +- badorm/sqlserver/comparison.go | 8 +- .../conditions/child_conditions.go | 14 +- testintegration/expressions_test.go | 40 ++--- testintegration/join_conditions_test.go | 52 +++++- testintegration/models/models.go | 2 + 17 files changed, 495 insertions(+), 246 deletions(-) create mode 100644 badorm/dynamic/expression.go delete mode 100644 badorm/dynamicExpression.go create mode 100644 badorm/multitype/expression.go diff --git a/badorm/condition.go b/badorm/condition.go index 280689d3..b83aeec8 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -20,7 +20,7 @@ type Condition[T Model] interface { // Applies the condition to the "query" // using the "tableName" as name for the table holding // the data for object of type T - ApplyTo(query *query, table Table) error + ApplyTo(query *Query, table Table) error // This method is necessary to get the compiler to verify // that an object is of type Condition[T], @@ -35,7 +35,7 @@ type WhereCondition[T Model] interface { Condition[T] // Get the sql string and values to use in the query - GetSQL(query *query, table Table) (string, []any, error) + GetSQL(query *Query, table Table) (string, []any, error) // Returns true if the DeletedAt column if affected by the condition // If no condition affects the DeletedAt, the verification that it's null will be added automatically @@ -55,11 +55,11 @@ func (condition ContainerCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition ContainerCondition[T]) ApplyTo(query *query, table Table) error { +func (condition ContainerCondition[T]) ApplyTo(query *Query, table Table) error { return applyWhereCondition[T](condition, query, table) } -func (condition ContainerCondition[T]) GetSQL(query *query, table Table) (string, []any, error) { +func (condition ContainerCondition[T]) GetSQL(query *Query, table Table) (string, []any, error) { sqlString, values, err := condition.ConnectionCondition.GetSQL(query, table) if err != nil { return "", nil, err @@ -101,11 +101,11 @@ func (condition ConnectionCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition ConnectionCondition[T]) ApplyTo(query *query, table Table) error { +func (condition ConnectionCondition[T]) ApplyTo(query *Query, table Table) error { return applyWhereCondition[T](condition, query, table) } -func (condition ConnectionCondition[T]) GetSQL(query *query, table Table) (string, []any, error) { +func (condition ConnectionCondition[T]) GetSQL(query *Query, table Table) (string, []any, error) { sqlStrings := []string{} values := []any{} @@ -150,7 +150,7 @@ func (condition PreloadCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition PreloadCondition[T]) ApplyTo(query *query, table Table) error { +func (condition PreloadCondition[T]) ApplyTo(query *Query, table Table) error { for _, fieldID := range condition.Fields { query.AddSelect(table, fieldID) } @@ -178,7 +178,7 @@ func (condition CollectionPreloadCondition[T1, T2]) interfaceVerificationMethod( // that an object is of type Condition[T1] } -func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *query, _ Table) error { +func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *Query, _ Table) error { if len(condition.NestedPreloads) == 0 { query.Preload(condition.CollectionField) return nil @@ -237,11 +237,11 @@ func (condition FieldCondition[TObject, TAtribute]) interfaceVerificationMethod( // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value -func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *query, table Table) error { +func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *Query, table Table) error { return applyWhereCondition[TObject](condition, query, table) } -func applyWhereCondition[T Model](condition WhereCondition[T], query *query, table Table) error { +func applyWhereCondition[T Model](condition WhereCondition[T], query *Query, table Table) error { sql, values, err := condition.GetSQL(query, table) if err != nil { return err @@ -264,7 +264,7 @@ func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { return condition.FieldIdentifier.Field == deletedAtField } -func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *query, table Table) (string, []any, error) { +func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *Query, table Table) (string, []any, error) { return condition.Expression.ToSQL( query, condition.FieldIdentifier.ColumnSQL(query, table), @@ -321,7 +321,7 @@ func (condition JoinCondition[T1, T2]) makesFilter() bool { // Applies a join between the tables of T1 and T2 // previousTableName is the name of the table of T1 // It also applies the nested conditions -func (condition JoinCondition[T1, T2]) ApplyTo(query *query, t1Table Table) error { +func (condition JoinCondition[T1, T2]) ApplyTo(query *Query, t1Table Table) error { whereConditions, joinConditions, t2PreloadCondition := divideConditionsByType(condition.Conditions) t2Model := *new(T2) @@ -404,7 +404,7 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *query, t1Table Table) erro // taking into account that the ID attribute necessary to do it // can be either in T1's or T2's table. func (condition JoinCondition[T1, T2]) getSQLJoin( - query *query, + query *Query, t1Table Table, t2Table Table, isLeftJoin bool, @@ -462,11 +462,11 @@ func (condition UnsafeCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition UnsafeCondition[T]) ApplyTo(query *query, table Table) error { +func (condition UnsafeCondition[T]) ApplyTo(query *Query, table Table) error { return applyWhereCondition[T](condition, query, table) } -func (condition UnsafeCondition[T]) GetSQL(_ *query, table Table) (string, []any, error) { +func (condition UnsafeCondition[T]) GetSQL(_ *Query, table Table) (string, []any, error) { return fmt.Sprintf( condition.SQLCondition, table.Alias, @@ -498,11 +498,11 @@ func (condition InvalidCondition[T]) interfaceVerificationMethod(_ T) { // that an object is of type Condition[T] } -func (condition InvalidCondition[T]) ApplyTo(_ *query, _ Table) error { +func (condition InvalidCondition[T]) ApplyTo(_ *Query, _ Table) error { return condition.Err } -func (condition InvalidCondition[T]) GetSQL(_ *query, _ Table) (string, []any, error) { +func (condition InvalidCondition[T]) GetSQL(_ *Query, _ Table) (string, []any, error) { return "", nil, condition.Err } diff --git a/badorm/dynamic/expression.go b/badorm/dynamic/expression.go new file mode 100644 index 00000000..16d60bb9 --- /dev/null +++ b/badorm/dynamic/expression.go @@ -0,0 +1,154 @@ +package dynamic + +import ( + "errors" + "fmt" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/expressions" +) + +// TODO ponerles mas informacion precisa a los errores +var ( + ErrFieldModelNotConcerned = errors.New("field's model is not concerned by the query so it can't be used in a expression") + ErrJoinMustBeSelected = errors.New("table is joined more than once, select which one you want to use") +) + +const UndefinedJoinNumber = -1 + +func newDynamicExpression[T any](expression expressions.SQLExpression, field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo + // TODO que pasa si hay mas de uno, no se si me gusta mucho esto + // creo que si hay mas de uno solo se tendria que aplicar en el primero, + return &Expression[T]{ + SQLExpressions: []LiteralSQLExpression{ + { + SQL: expressions.ToSQL[expression], + Field: field, + }, + }, + JoinNumber: UndefinedJoinNumber, + } + // TODO soportar multivalue, no todos necesariamente dinamicos +} + +// TODO doc +type Expression[T any] struct { + // TODO hacer el cambio de nombre en el anterior tambien? + SQLExpressions []LiteralSQLExpression + JoinNumber int +} + +type LiteralSQLExpression struct { + SQL string + Field badorm.IFieldIdentifier +} + +func (expr Expression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + +func (expr *Expression[T]) SelectJoin(joinNumber uint) badorm.DynamicExpression[T] { + expr.JoinNumber = int(joinNumber) + return expr +} + +// verificar que en las condiciones anteriores alguien usó el field con el que se intenta comparar +// obtener de ahi cual es el nombre de la table a usar con ese field. +// TODO doc a ingles +func (expr Expression[T]) ToSQL(query *badorm.Query, columnName string) (string, []any, error) { + exprString := columnName + values := []any{} + + for _, sqlExpr := range expr.SQLExpressions { + modelTables := query.GetTables(sqlExpr.Field.GetModelType()) + if modelTables == nil { + return "", nil, ErrFieldModelNotConcerned + } + + var modelTable badorm.Table + + if len(modelTables) == 1 { + modelTable = modelTables[0] + } else { + if expr.JoinNumber == UndefinedJoinNumber { + return "", nil, ErrJoinMustBeSelected + } + + modelTable = modelTables[expr.JoinNumber] + } + + exprString += fmt.Sprintf( + " "+sqlExpr.SQL+" %s", + sqlExpr.Field.ColumnSQL(query, modelTable), + ) + } + + return exprString, values, nil +} + +// Comparison Operators +// refs: +// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// - PostgreSQL: https://www.postgresql.org/docs/current/functions-comparison.html +// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 +// - SQLite: https://www.sqlite.org/lang_expr.html + +// EqualTo +func Eq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + return newDynamicExpression(expressions.Eq, field) +} + +// NotEqualTo +func NotEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + return newDynamicExpression(expressions.NotEq, field) +} + +// LessThan +func Lt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + return newDynamicExpression(expressions.Lt, field) +} + +// LessThanOrEqualTo +func LtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + return newDynamicExpression(expressions.LtOrEq, field) +} + +// GreaterThan +func Gt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + // TODO invertir orden de parametros para que quede igual que en badorm/expression + return newDynamicExpression(expressions.Gt, field) +} + +// GreaterThanOrEqualTo +func GtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + return newDynamicExpression(expressions.GtOrEq, field) +} + +// Comparison Predicates +// refs: +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE + +// Equivalent to v1 < value < v2 +// func Between[T any](v1 T, v2 T) MultivalueExpression[T] { +// return NewMultivalueExpression("BETWEEN", "AND", "", "", v1, v2) +// } + +// // Equivalent to NOT (v1 < value < v2) +// func NotBetween[T any](v1 T, v2 T) MultivalueExpression[T] { +// return NewMultivalueExpression("NOT BETWEEN", "AND", "", "", v1, v2) +// } + +// Boolean Comparison Predicates + +// Not supported by: mysql +func IsDistinct[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + return newDynamicExpression(expressions.IsDistinct, field) +} + +// Not supported by: mysql +func IsNotDistinct[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + return newDynamicExpression(expressions.IsNotDistinct, field) +} diff --git a/badorm/dynamicExpression.go b/badorm/dynamicExpression.go deleted file mode 100644 index a2cdbba6..00000000 --- a/badorm/dynamicExpression.go +++ /dev/null @@ -1,115 +0,0 @@ -package badorm - -import ( - "database/sql" - "errors" - "fmt" - "reflect" - - "github.com/elliotchance/pie/v2" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm/expressions" -) - -// TODO ponerles mas informacion precisa a los errores -var ( - ErrFieldTypeDoesNotMatch = errors.New("field type does not match expression type") - ErrFieldModelNotConcerned = errors.New("field's model is not concerned by the query so it can't be used in a expression") - ErrExpressionTypeNotSupported = errors.New("expression type not supported") -) - -// TODO ver el nombre -// TODO quizas field identifier deberia llamarse solo field -func DynamicExpression[T any](expression expressions.SQLExpression, field FieldIdentifier[T]) Expression[T] { - // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo - // TODO que pasa si hay mas de uno, no se si me gusta mucho esto - // creo que si hay mas de uno solo se tendria que aplicar en el primero, - return dynamicExpressionImpl[T]{ - SQLExpressions: []LiteralSQLExpression{ - { - SQL: expressions.ToSQL[expression], - Field: field, - }, - }, - } - // TODO soportar multivalue, no todos necesariamente dinamicos -} - -var nullableTypes = []reflect.Type{ - reflect.TypeOf(sql.NullBool{}), - reflect.TypeOf(sql.NullByte{}), - reflect.TypeOf(sql.NullFloat64{}), - reflect.TypeOf(sql.NullInt16{}), - reflect.TypeOf(sql.NullInt32{}), - reflect.TypeOf(sql.NullInt64{}), - reflect.TypeOf(sql.NullString{}), - reflect.TypeOf(sql.NullTime{}), - reflect.TypeOf(gorm.DeletedAt{}), -} - -func isNullable(fieldType reflect.Type) bool { - return pie.Contains(nullableTypes, fieldType) -} - -func MultitypeDynamicExpression[T1 any, T2 any](expression expressions.SQLExpression, field FieldIdentifier[T2]) Expression[T1] { - expressionType := reflect.TypeOf(*new(T1)) - fieldType := reflect.TypeOf(*new(T2)) - - if fieldType != expressionType && - !((isNullable(fieldType) && fieldType.Field(0).Type == expressionType) || - (isNullable(expressionType) && expressionType.Field(0).Type == fieldType)) { - return NewInvalidExpression[T1](ErrFieldTypeDoesNotMatch) - } - - // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo - // TODO que pasa si hay mas de uno, no se si me gusta mucho esto - // creo que si hay mas de uno solo se tendria que aplicar en el primero, - return dynamicExpressionImpl[T1]{ - SQLExpressions: []LiteralSQLExpression{ - { - SQL: expressions.ToSQL[expression], - Field: field, - }, - }, - } - // TODO soportar multivalue, no todos necesariamente dinamicos -} - -// TODO doc -type dynamicExpressionImpl[T any] struct { - // TODO hacer el cambio de nombre en el anterior tambien? - SQLExpressions []LiteralSQLExpression -} - -type LiteralSQLExpression struct { - SQL string - Field IFieldIdentifier -} - -func (expr dynamicExpressionImpl[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -// verificar que en las condiciones anteriores alguien usó el field con el que se intenta comparar -// obtener de ahi cual es el nombre de la table a usar con ese field. -// TODO doc a ingles -func (expr dynamicExpressionImpl[T]) ToSQL(query *query, columnName string) (string, []any, error) { - exprString := columnName - values := []any{} - - for _, sqlExpr := range expr.SQLExpressions { - modelTable, isConcerned := query.concernedModels[sqlExpr.Field.GetModelType()] - if !isConcerned { - return "", nil, ErrFieldModelNotConcerned - } - - exprString += fmt.Sprintf( - " "+sqlExpr.SQL+" %s", - sqlExpr.Field.ColumnSQL(query, modelTable), - ) - } - - return exprString, values, nil -} diff --git a/badorm/expression.go b/badorm/expression.go index 4517c61a..d79e8800 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -22,7 +22,7 @@ var ( type Expression[T any] interface { // Transform the Expression to a SQL string and a list of values to use in the query // columnName is used by the expression to determine which is the objective column. - ToSQL(query *query, columnName string) (string, []any, error) + ToSQL(query *Query, columnName string) (string, []any, error) // This method is necessary to get the compiler to verify // that an object is of type Expression[T], @@ -31,6 +31,12 @@ type Expression[T any] interface { InterfaceVerificationMethod(T) } +type DynamicExpression[T any] interface { + Expression[T] + + SelectJoin(joinNumber uint) DynamicExpression[T] +} + // Expression that compares the value of the column against a fixed value // If ExpressionsAndValues has multiple entries, comparisons will be nested // Example (single): value = v1 @@ -49,7 +55,7 @@ func (expr ValueExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr ValueExpression[T]) ToSQL(_ *query, columnName string) (string, []any, error) { +func (expr ValueExpression[T]) ToSQL(_ *Query, columnName string) (string, []any, error) { exprString := columnName values := []any{} @@ -61,7 +67,7 @@ func (expr ValueExpression[T]) ToSQL(_ *query, columnName string) (string, []any return exprString, values, nil } -func NewValueExpression[T any](value any, sqlExpression string) ValueExpression[T] { +func NewValueExpression[T any](value any, sqlExpression expressions.SQLExpression) ValueExpression[T] { expr := ValueExpression[T]{} return expr.AddSQLExpression(value, sqlExpression) @@ -74,7 +80,7 @@ var nullableKinds = []reflect.Kind{ reflect.Slice, } -func NewCantBeNullValueExpression[T any](value any, sqlExpression string) Expression[T] { +func NewCantBeNullValueExpression[T any](value any, sqlExpression expressions.SQLExpression) Expression[T] { if value == nil || mapsToNull(value) { return NewInvalidExpression[T](ErrValueCantBeNull) } @@ -82,7 +88,7 @@ func NewCantBeNullValueExpression[T any](value any, sqlExpression string) Expres return NewValueExpression[T](value, sqlExpression) } -func NewMustBePOSIXValueExpression[T string | sql.NullString](pattern string, sqlExpression string) Expression[T] { +func NewMustBePOSIXValueExpression[T string | sql.NullString](pattern string, sqlExpression expressions.SQLExpression) Expression[T] { _, err := regexp.CompilePOSIX(pattern) if err != nil { return NewInvalidExpression[T](err) @@ -91,12 +97,12 @@ func NewMustBePOSIXValueExpression[T string | sql.NullString](pattern string, sq return NewValueExpression[T](pattern, sqlExpression) } -func (expr *ValueExpression[T]) AddSQLExpression(value any, sqlExpression string) ValueExpression[T] { +func (expr *ValueExpression[T]) AddSQLExpression(value any, sqlExpression expressions.SQLExpression) ValueExpression[T] { expr.ExpressionsAndValues = append( expr.ExpressionsAndValues, SQLExpressionAndValue{ Value: value, - SQLExpression: sqlExpression, + SQLExpression: expressions.ToSQL[sqlExpression], }, ) @@ -118,7 +124,7 @@ func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr MultivalueExpression[T]) ToSQL(_ *query, columnName string) (string, []any, error) { +func (expr MultivalueExpression[T]) ToSQL(_ *Query, columnName string) (string, []any, error) { placeholders := strings.Join(pie.Map(expr.Values, func(value T) string { return "?" }), " "+expr.SQLConnector+" ") @@ -136,10 +142,10 @@ func (expr MultivalueExpression[T]) ToSQL(_ *query, columnName string) (string, ), values, nil } -func NewMultivalueExpression[T any](sqlExpression, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) MultivalueExpression[T] { +func NewMultivalueExpression[T any](sqlExpression expressions.SQLExpression, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) MultivalueExpression[T] { return MultivalueExpression[T]{ Values: values, - SQLExpression: sqlExpression, + SQLExpression: expressions.ToSQL[sqlExpression], SQLConnector: sqlConnector, SQLPrefix: sqlPrefix, SQLSuffix: sqlSuffix, @@ -157,7 +163,7 @@ func (expr PredicateExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr PredicateExpression[T]) ToSQL(_ *query, columnName string) (string, []any, error) { +func (expr PredicateExpression[T]) ToSQL(_ *Query, columnName string) (string, []any, error) { return fmt.Sprintf("%s %s", columnName, expr.SQLExpression), []any{}, nil } @@ -177,7 +183,11 @@ func (expr InvalidExpression[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Expression[T] } -func (expr InvalidExpression[T]) ToSQL(_ *query, _ string) (string, []any, error) { +func (expr InvalidExpression[T]) SelectJoin(joinNumber uint) DynamicExpression[T] { + return expr +} + +func (expr InvalidExpression[T]) ToSQL(_ *Query, _ string) (string, []any, error) { return "", nil, expr.Err } @@ -197,7 +207,7 @@ func NewInvalidExpression[T any](err error) InvalidExpression[T] { // EqualTo // EqOrIsNull must be used in cases where value can be NULL func Eq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.Eq]) + return NewCantBeNullValueExpression[T](value, expressions.Eq) } // if value is not NULL returns a Eq expression @@ -219,7 +229,7 @@ func EqOrIsNull[T any](value any) Expression[T] { // NotEqualTo // NotEqOrNotIsNull must be used in cases where value can be NULL func NotEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.NotEq]) + return NewCantBeNullValueExpression[T](value, expressions.NotEq) } // if value is not NULL returns a NotEq expression @@ -284,22 +294,22 @@ func mapsToNull(value any) bool { // LessThan func Lt[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.Lt]) + return NewCantBeNullValueExpression[T](value, expressions.Lt) } // LessThanOrEqualTo func LtOrEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.LtOrEq]) + return NewCantBeNullValueExpression[T](value, expressions.LtOrEq) } // GreaterThan func Gt[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.Gt]) + return NewCantBeNullValueExpression[T](value, expressions.Gt) } // GreaterThanOrEqualTo func GtOrEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.GtOrEq]) + return NewCantBeNullValueExpression[T](value, expressions.GtOrEq) } // Comparison Predicates @@ -309,12 +319,12 @@ func GtOrEq[T any](value T) Expression[T] { // Equivalent to v1 < value < v2 func Between[T any](v1 T, v2 T) MultivalueExpression[T] { - return NewMultivalueExpression("BETWEEN", "AND", "", "", v1, v2) + return NewMultivalueExpression(expressions.Between, "AND", "", "", v1, v2) } // Equivalent to NOT (v1 < value < v2) func NotBetween[T any](v1 T, v2 T) MultivalueExpression[T] { - return NewMultivalueExpression("NOT BETWEEN", "AND", "", "", v1, v2) + return NewMultivalueExpression(expressions.NotBetween, "AND", "", "", v1, v2) } func IsNull[T any]() PredicateExpression[T] { @@ -359,12 +369,12 @@ func IsNotUnknown[T bool | sql.NullBool]() PredicateExpression[T] { // Not supported by: mysql func IsDistinct[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, expressions.ToSQL[expressions.IsDistinct]) + return NewValueExpression[T](value, expressions.IsDistinct) } // Not supported by: mysql func IsNotDistinct[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, expressions.ToSQL[expressions.IsNotDistinct]) + return NewValueExpression[T](value, expressions.IsNotDistinct) } // Pattern Matching @@ -373,14 +383,14 @@ type LikeExpression[T string | sql.NullString] struct { ValueExpression[T] } -func NewLikeExpression[T string | sql.NullString](pattern, sqlExpression string) LikeExpression[T] { +func NewLikeExpression[T string | sql.NullString](pattern string, sqlExpression expressions.SQLExpression) LikeExpression[T] { return LikeExpression[T]{ ValueExpression: NewValueExpression[T](pattern, sqlExpression), } } func (expr LikeExpression[T]) Escape(escape rune) ValueExpression[T] { - return expr.AddSQLExpression(string(escape), "ESCAPE") + return expr.AddSQLExpression(string(escape), expressions.Escape) } // Pattern in all databases: @@ -402,7 +412,7 @@ func (expr LikeExpression[T]) Escape(escape rune) ValueExpression[T] { // - sqlserver: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver16 // - sqlite: https://www.sqlite.org/lang_expr.html#like func Like[T string | sql.NullString](pattern string) LikeExpression[T] { - return NewLikeExpression[T](pattern, "LIKE") + return NewLikeExpression[T](pattern, expressions.Like) } // TODO Subquery Expressions diff --git a/badorm/expressions/sqlExpressions.go b/badorm/expressions/sqlExpressions.go index 3f387464..1b790b76 100644 --- a/badorm/expressions/sqlExpressions.go +++ b/badorm/expressions/sqlExpressions.go @@ -9,13 +9,28 @@ const ( LtOrEq Gt GtOrEq + Between + NotBetween IsDistinct // Not supported by: mysql IsNotDistinct // Not supported by: mysql + Like + Escape // mysql MySQLIsEqual + MySQLRegexp // sqlserver SQLServerNotLt SQLServerNotGt + // postgresql + PostgreSQLILike + PostgreSQLSimilarTo + PostgreSQLPosixMatch + PostgreSQLPosixIMatch + // sqlite + SQLiteGlob + // shared + ArrayIn + ArrayNotIn ) // alias @@ -25,15 +40,27 @@ const ( ) var ToSQL = map[SQLExpression]string{ - Eq: "=", - NotEq: "<>", - Lt: "<", - LtOrEq: "<=", - Gt: ">", - GtOrEq: ">=", - IsDistinct: "IS DISTINCT FROM", - IsNotDistinct: "IS NOT DISTINCT FROM", - MySQLIsEqual: "<=>", - SQLServerNotLt: "!<", - SQLServerNotGt: "!>", + Eq: "=", + NotEq: "<>", + Lt: "<", + LtOrEq: "<=", + Gt: ">", + GtOrEq: ">=", + Between: "BETWEEN", + NotBetween: "NOT BETWEEN", + IsDistinct: "IS DISTINCT FROM", + IsNotDistinct: "IS NOT DISTINCT FROM", + Like: "LIKE", + Escape: "ESCAPE", + MySQLIsEqual: "<=>", + MySQLRegexp: "REGEXP", + SQLServerNotLt: "!<", + SQLServerNotGt: "!>", + PostgreSQLILike: "ILIKE", + PostgreSQLSimilarTo: "SIMILAR TO", + PostgreSQLPosixMatch: "~", + PostgreSQLPosixIMatch: "~*", + SQLiteGlob: "GLOB", + ArrayIn: "IN", + ArrayNotIn: "NOT IN", } diff --git a/badorm/multitype/expression.go b/badorm/multitype/expression.go new file mode 100644 index 00000000..0dc1ce95 --- /dev/null +++ b/badorm/multitype/expression.go @@ -0,0 +1,123 @@ +package multitype + +import ( + "database/sql" + "errors" + "reflect" + + "github.com/elliotchance/pie/v2" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/dynamic" + "github.com/ditrit/badaas/badorm/expressions" +) + +// TODO ponerles mas informacion precisa a los errores +var ErrFieldTypeDoesNotMatch = errors.New("field type does not match expression type") + +var nullableTypes = []reflect.Type{ + reflect.TypeOf(sql.NullBool{}), + reflect.TypeOf(sql.NullByte{}), + reflect.TypeOf(sql.NullFloat64{}), + reflect.TypeOf(sql.NullInt16{}), + reflect.TypeOf(sql.NullInt32{}), + reflect.TypeOf(sql.NullInt64{}), + reflect.TypeOf(sql.NullString{}), + reflect.TypeOf(sql.NullTime{}), + reflect.TypeOf(gorm.DeletedAt{}), +} + +func isNullable(fieldType reflect.Type) bool { + return pie.Contains(nullableTypes, fieldType) +} + +func newMultitypeDynamicExpression[T1 any, T2 any](expression expressions.SQLExpression, field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { + expressionType := reflect.TypeOf(*new(T1)) + fieldType := reflect.TypeOf(*new(T2)) + + if fieldType != expressionType && + !((isNullable(fieldType) && fieldType.Field(0).Type == expressionType) || + (isNullable(expressionType) && expressionType.Field(0).Type == fieldType)) { + return badorm.NewInvalidExpression[T1](ErrFieldTypeDoesNotMatch) + } + + // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo + // TODO que pasa si hay mas de uno, no se si me gusta mucho esto + // creo que si hay mas de uno solo se tendria que aplicar en el primero, + return &dynamic.Expression[T1]{ + SQLExpressions: []dynamic.LiteralSQLExpression{ + { + SQL: expressions.ToSQL[expression], + Field: field, + }, + }, + JoinNumber: dynamic.UndefinedJoinNumber, + } + // TODO soportar multivalue, no todos necesariamente dinamicos +} + +// Comparison Operators +// refs: +// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// - PostgreSQL: https://www.postgresql.org/docs/current/functions-comparison.html +// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 +// - SQLite: https://www.sqlite.org/lang_expr.html + +// EqualTo +func Eq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { + return newMultitypeDynamicExpression[T1, T2](expressions.Eq, field) +} + +// NotEqualTo +func NotEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { + return newMultitypeDynamicExpression[T1, T2](expressions.NotEq, field) +} + +// LessThan +func Lt[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { + return newMultitypeDynamicExpression[T1, T2](expressions.Lt, field) +} + +// LessThanOrEqualTo +func LtOrEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { + return newMultitypeDynamicExpression[T1, T2](expressions.LtOrEq, field) +} + +// GreaterThan +func Gt[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { + // TODO invertir orden de parametros para que quede igual que en badorm/expression + return newMultitypeDynamicExpression[T1, T2](expressions.Gt, field) +} + +// GreaterThanOrEqualTo +func GtOrEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { + return newMultitypeDynamicExpression[T1, T2](expressions.GtOrEq, field) +} + +// Comparison Predicates +// refs: +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE + +// Equivalent to v1 < value < v2 +// func Between[T any](v1 T, v2 T) MultivalueExpression[T] { +// return NewMultivalueExpression("BETWEEN", "AND", "", "", v1, v2) +// } + +// // Equivalent to NOT (v1 < value < v2) +// func NotBetween[T any](v1 T, v2 T) MultivalueExpression[T] { +// return NewMultivalueExpression("NOT BETWEEN", "AND", "", "", v1, v2) +// } + +// Boolean Comparison Predicates + +// Not supported by: mysql +func IsDistinct[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { + return newMultitypeDynamicExpression[T1, T2](expressions.IsDistinct, field) +} + +// Not supported by: mysql +func IsNotDistinct[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { + return newMultitypeDynamicExpression[T1, T2](expressions.IsNotDistinct, field) +} diff --git a/badorm/mysql/array.go b/badorm/mysql/array.go index 333e1aa5..7801dfe9 100644 --- a/badorm/mysql/array.go +++ b/badorm/mysql/array.go @@ -1,14 +1,17 @@ package mysql -import "github.com/ditrit/badaas/badorm" +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/expressions" +) // Row and Array Comparisons // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in func ArrayIn[T any](values ...T) badorm.MultivalueExpression[T] { - return badorm.NewMultivalueExpression("IN", ",", "(", ")", values...) + return badorm.NewMultivalueExpression(expressions.ArrayIn, ",", "(", ")", values...) } func ArrayNotIn[T any](values ...T) badorm.MultivalueExpression[T] { - return badorm.NewMultivalueExpression("NOT IN", ",", "(", ")", values...) + return badorm.NewMultivalueExpression(expressions.ArrayNotIn, ",", "(", ")", values...) } diff --git a/badorm/mysql/comparison.go b/badorm/mysql/comparison.go index 3defbad2..81b2f191 100644 --- a/badorm/mysql/comparison.go +++ b/badorm/mysql/comparison.go @@ -12,7 +12,7 @@ import ( // preferred over eq // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal-to func IsEqual[T any](value T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](value, expressions.ToSQL[expressions.MySQLIsEqual]) + return badorm.NewValueExpression[T](value, expressions.MySQLIsEqual) } // Pattern Matching @@ -23,10 +23,10 @@ func Like[T string | sql.NullString | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64](pattern string, ) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](pattern, "LIKE") + return badorm.NewValueExpression[T](pattern, expressions.Like) } // ref: https://dev.mysql.com/doc/refman/8.0/en/regexp.html#operator_regexp func RegexP[T string | sql.NullString](pattern string) badorm.Expression[T] { - return badorm.NewMustBePOSIXValueExpression[T](pattern, "REGEXP") + return badorm.NewMustBePOSIXValueExpression[T](pattern, expressions.MySQLRegexp) } diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go index ee6c1137..8c5b3b63 100644 --- a/badorm/psql/comparison.go +++ b/badorm/psql/comparison.go @@ -4,25 +4,26 @@ import ( "database/sql" "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/expressions" ) // Pattern Matching func ILike[T string | sql.NullString](pattern string) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](pattern, "ILIKE") + return badorm.NewValueExpression[T](pattern, expressions.PostgreSQLILike) } // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP func SimilarTo[T string | sql.NullString](pattern string) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](pattern, "SIMILAR TO") + return badorm.NewValueExpression[T](pattern, expressions.PostgreSQLSimilarTo) } // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP func POSIXMatch[T string | sql.NullString](pattern string) badorm.Expression[T] { - return badorm.NewMustBePOSIXValueExpression[T](pattern, "~") + return badorm.NewMustBePOSIXValueExpression[T](pattern, expressions.PostgreSQLPosixMatch) } // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP func POSIXIMatch[T string | sql.NullString](pattern string) badorm.Expression[T] { - return badorm.NewMustBePOSIXValueExpression[T](pattern, "~*") + return badorm.NewMustBePOSIXValueExpression[T](pattern, expressions.PostgreSQLPosixIMatch) } diff --git a/badorm/query.go b/badorm/query.go index 3ad298b9..e92ee726 100644 --- a/badorm/query.go +++ b/badorm/query.go @@ -20,7 +20,7 @@ func (t Table) IsInitial() bool { } // Returns the related Table corresponding to the model -func (t Table) DeliverTable(query *query, model Model, relationName string) (Table, error) { +func (t Table) DeliverTable(query *Query, model Model, relationName string) (Table, error) { // get the name of the table for the model tableName, err := getTableName(query.gormDB, model) if err != nil { @@ -42,8 +42,8 @@ func (t Table) DeliverTable(query *query, model Model, relationName string) (Tab } type IFieldIdentifier interface { - ColumnName(query *query, table Table) string - ColumnSQL(query *query, table Table) string + ColumnName(query *Query, table Table) string + ColumnSQL(query *Query, table Table) string GetModelType() reflect.Type } @@ -59,7 +59,7 @@ func (fieldID FieldIdentifier[T]) GetModelType() reflect.Type { } // Returns the name of the column in which the field is saved in the table -func (fieldID FieldIdentifier[T]) ColumnName(query *query, table Table) string { +func (fieldID FieldIdentifier[T]) ColumnName(query *Query, table Table) string { columnName := fieldID.Column if columnName == "" { columnName = query.ColumnName(table, fieldID.Field) @@ -70,16 +70,16 @@ func (fieldID FieldIdentifier[T]) ColumnName(query *query, table Table) string { } // Returns the SQL to get the value of the field in the table -func (fieldID FieldIdentifier[T]) ColumnSQL(query *query, table Table) string { +func (fieldID FieldIdentifier[T]) ColumnSQL(query *Query, table Table) string { return table.Alias + "." + fieldID.ColumnName(query, table) } -type query struct { +type Query struct { gormDB *gorm.DB - concernedModels map[reflect.Type]Table + concernedModels map[reflect.Type][]Table } -func (query *query) AddSelect(table Table, fieldID IFieldIdentifier) { +func (query *Query) AddSelect(table Table, fieldID IFieldIdentifier) { columnName := fieldID.ColumnName(query, table) query.gormDB.Statement.Selects = append( @@ -92,39 +92,53 @@ func (query *query) AddSelect(table Table, fieldID IFieldIdentifier) { ) } -func (query *query) Preload(preloadQuery string, args ...interface{}) { +func (query *Query) Preload(preloadQuery string, args ...interface{}) { query.gormDB = query.gormDB.Preload(preloadQuery, args...) } -func (query *query) Unscoped() { +func (query *Query) Unscoped() { query.gormDB = query.gormDB.Unscoped() } -func (query *query) Where(whereQuery interface{}, args ...interface{}) { +func (query *Query) Where(whereQuery interface{}, args ...interface{}) { query.gormDB = query.gormDB.Where(whereQuery, args...) } -func (query *query) Joins(joinQuery string, args ...interface{}) { +func (query *Query) Joins(joinQuery string, args ...interface{}) { query.gormDB = query.gormDB.Joins(joinQuery, args...) } -func (query *query) Find(dest interface{}, conds ...interface{}) error { +func (query *Query) Find(dest interface{}, conds ...interface{}) error { query.gormDB = query.gormDB.Find(dest, conds...) return query.gormDB.Error } -func (query *query) AddConcernedModel(model Model, table Table) { - // TODO que pasa si ya estaba - query.concernedModels[reflect.TypeOf(model)] = table +func (query *Query) AddConcernedModel(model Model, table Table) { + tableList, isPresent := query.concernedModels[reflect.TypeOf(model)] + if !isPresent { + query.concernedModels[reflect.TypeOf(model)] = []Table{table} + } else { + tableList = append(tableList, table) + query.concernedModels[reflect.TypeOf(model)] = tableList + } +} + +func (query *Query) GetTables(modelType reflect.Type) []Table { + tableList, isPresent := query.concernedModels[modelType] + if !isPresent { + return nil + } + + return tableList } // TODO ver esta, porque no estoy usando los fields aca y que pasa si hay fk override y todo eso -func (query query) ColumnName(table Table, fieldName string) string { +func (query Query) ColumnName(table Table, fieldName string) string { return query.gormDB.NamingStrategy.ColumnName(table.Name, fieldName) } -func NewQuery[T Model](db *gorm.DB, conditions []Condition[T]) (*query, error) { +func NewQuery[T Model](db *gorm.DB, conditions []Condition[T]) (*Query, error) { model := *new(T) initialTableName, err := getTableName(db, model) @@ -138,9 +152,9 @@ func NewQuery[T Model](db *gorm.DB, conditions []Condition[T]) (*query, error) { Initial: true, } - query := &query{ + query := &Query{ gormDB: db.Select(initialTableName + ".*"), - concernedModels: map[reflect.Type]Table{}, + concernedModels: map[reflect.Type][]Table{}, } query.AddConcernedModel(model, initialTable) diff --git a/badorm/shared/array.go b/badorm/shared/array.go index 4ba52dd7..7dca4c4f 100644 --- a/badorm/shared/array.go +++ b/badorm/shared/array.go @@ -1,13 +1,16 @@ package shared -import "github.com/ditrit/badaas/badorm" +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/expressions" +) // Row and Array Comparisons func ArrayIn[T any](values ...T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](values, "IN") + return badorm.NewValueExpression[T](values, expressions.ArrayIn) } func ArrayNotIn[T any](values ...T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](values, "NOT IN") + return badorm.NewValueExpression[T](values, expressions.ArrayNotIn) } diff --git a/badorm/sqlite/comparison.go b/badorm/sqlite/comparison.go index 7ba2f1de..0cc0cab1 100644 --- a/badorm/sqlite/comparison.go +++ b/badorm/sqlite/comparison.go @@ -4,9 +4,10 @@ import ( "database/sql" "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/expressions" ) // ref: https://www.sqlite.org/lang_expr.html#like func Glob[T string | sql.NullString](pattern string) badorm.Expression[T] { - return badorm.NewMustBePOSIXValueExpression[T](pattern, "GLOB") + return badorm.NewMustBePOSIXValueExpression[T](pattern, expressions.SQLiteGlob) } diff --git a/badorm/sqlserver/comparison.go b/badorm/sqlserver/comparison.go index dfd12dd5..1bb14fe2 100644 --- a/badorm/sqlserver/comparison.go +++ b/badorm/sqlserver/comparison.go @@ -11,19 +11,19 @@ import ( // EqNullable is the same as badorm.Eq but it supports value to be NULL // ansi_nulls must be set to off to avoid the NULL = NULL: unknown problem func EqNullable[T any](value T) badorm.Expression[T] { - return badorm.NewValueExpression[T](value, expressions.ToSQL[expressions.SQLServerEqNullable]) + return badorm.NewValueExpression[T](value, expressions.SQLServerEqNullable) } // NotEqNullable is the same as badorm.NotEq but it supports value to be NULL // ansi_nulls must be set to off to avoid the NULL = NULL: unknown problem func NotEqNullable[T any](value T) badorm.Expression[T] { - return badorm.NewValueExpression[T](value, expressions.ToSQL[expressions.SQLServerNotEqNullable]) + return badorm.NewValueExpression[T](value, expressions.SQLServerNotEqNullable) } func NotLt[T any](value T) badorm.Expression[T] { - return badorm.NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.SQLServerNotLt]) + return badorm.NewCantBeNullValueExpression[T](value, expressions.SQLServerNotLt) } func NotGt[T any](value T) badorm.Expression[T] { - return badorm.NewCantBeNullValueExpression[T](value, expressions.ToSQL[expressions.SQLServerNotGt]) + return badorm.NewCantBeNullValueExpression[T](value, expressions.SQLServerNotGt) } diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index 13b44286..1debc38c 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -57,6 +57,18 @@ func ChildDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereConditio FieldIdentifier: ChildDeletedAtField, } } + +var ChildNameField = badorm.FieldIdentifier[string]{ + Field: "Name", + ModelType: childType, +} + +func ChildName(expr badorm.Expression[string]) badorm.WhereCondition[models.Child] { + return badorm.FieldCondition[models.Child, string]{ + Expression: expr, + FieldIdentifier: ChildNameField, + } +} func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.IJoinCondition[models.Child] { return badorm.JoinCondition[models.Child, models.Parent1]{ Conditions: conditions, @@ -102,5 +114,5 @@ func ChildParent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[m } } -var ChildPreloadAttributes = badorm.NewPreloadCondition[models.Child](ChildIdField, ChildCreatedAtField, ChildUpdatedAtField, ChildDeletedAtField, ChildParent1IdField, ChildParent2IdField) +var ChildPreloadAttributes = badorm.NewPreloadCondition[models.Child](ChildIdField, ChildCreatedAtField, ChildUpdatedAtField, ChildDeletedAtField, ChildNameField, ChildParent1IdField, ChildParent2IdField) var ChildPreloadRelations = []badorm.Condition[models.Child]{ChildPreloadParent1, ChildPreloadParent2} diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 9c9b8aaa..5a17c2bc 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -7,7 +7,8 @@ import ( "gorm.io/gorm" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/expressions" + "github.com/ditrit/badaas/badorm/dynamic" + "github.com/ditrit/badaas/badorm/multitype" "github.com/ditrit/badaas/badorm/mysql" "github.com/ditrit/badaas/badorm/psql" "github.com/ditrit/badaas/badorm/sqlite" @@ -989,10 +990,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBasicType() { entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - badorm.DynamicExpression( - expressions.Eq, - conditions.ProductIntPointerField, - ), + dynamic.Eq(conditions.ProductIntPointerField), ), ) ts.Nil(err) @@ -1011,10 +1009,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForCustomType() { entities, err := ts.crudProductService.GetEntities( conditions.ProductMultiString( - badorm.DynamicExpression( - expressions.Eq, - conditions.ProductMultiStringField, - ), + dynamic.Eq(conditions.ProductMultiStringField), ), ) ts.Nil(err) @@ -1027,10 +1022,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBadORMModelAttribute() entities, err := ts.crudProductService.GetEntities( conditions.ProductDeletedAt( - badorm.DynamicExpression( - expressions.IsNotDistinct, - conditions.ProductDeletedAtField, - ), + dynamic.IsNotDistinct(conditions.ProductDeletedAtField), ), ) ts.Nil(err) @@ -1041,13 +1033,10 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBadORMModelAttribute() func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionWithFieldOfAnotherTypeReturnsError() { _, err := ts.crudProductService.GetEntities( conditions.ProductInt( - badorm.MultitypeDynamicExpression[int]( - expressions.Eq, - conditions.ProductStringField, - ), + multitype.Eq[int](conditions.ProductStringField), ), ) - ts.ErrorIs(err, badorm.ErrFieldTypeDoesNotMatch) + ts.ErrorIs(err, multitype.ErrFieldTypeDoesNotMatch) } func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForNullableTypeCanBeComparedWithNotNullType() { @@ -1060,10 +1049,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForNullableTypeC entities, err := ts.crudProductService.GetEntities( conditions.ProductNullFloat( - badorm.MultitypeDynamicExpression[sql.NullFloat64]( - expressions.Eq, - conditions.ProductFloatField, - ), + multitype.Eq[sql.NullFloat64](conditions.ProductFloatField), ), ) ts.Nil(err) @@ -1081,10 +1067,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForNotNullTypeCa entities, err := ts.crudProductService.GetEntities( conditions.ProductFloat( - badorm.MultitypeDynamicExpression[float64]( - expressions.Eq, - conditions.ProductNullFloatField, - ), + multitype.Eq[float64](conditions.ProductNullFloatField), ), ) ts.Nil(err) @@ -1097,10 +1080,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForBadORMModelAt entities, err := ts.crudProductService.GetEntities( conditions.ProductDeletedAt( - badorm.MultitypeDynamicExpression[gorm.DeletedAt]( - expressions.IsDistinct, - conditions.ProductCreatedAtField, - ), + multitype.IsDistinct[gorm.DeletedAt](conditions.ProductCreatedAtField), ), ) ts.Nil(err) diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 496bd5c2..4cf4fbd7 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -4,7 +4,7 @@ import ( "gorm.io/gorm" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/expressions" + "github.com/ditrit/badaas/badorm/dynamic" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" ) @@ -18,6 +18,7 @@ type JoinConditionsIntTestSuite struct { crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID] crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID] crudPhoneService badorm.CRUDService[models.Phone, badorm.UIntID] + crudChildService badorm.CRUDService[models.Child, badorm.UUID] } func NewJoinConditionsIntTestSuite( @@ -29,6 +30,7 @@ func NewJoinConditionsIntTestSuite( crudEmployeeService badorm.CRUDService[models.Employee, badorm.UUID], crudBicycleService badorm.CRUDService[models.Bicycle, badorm.UUID], crudPhoneService badorm.CRUDService[models.Phone, badorm.UIntID], + crudChildService badorm.CRUDService[models.Child, badorm.UUID], ) *JoinConditionsIntTestSuite { return &JoinConditionsIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ @@ -41,6 +43,7 @@ func NewJoinConditionsIntTestSuite( crudEmployeeService: crudEmployeeService, crudBicycleService: crudBicycleService, crudPhoneService: crudPhoneService, + crudChildService: crudChildService, } } @@ -365,10 +368,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2Tables() { entities, err := ts.crudSellerService.GetEntities( conditions.SellerCompany( conditions.CompanyName( - badorm.DynamicExpression( - expressions.Eq, - conditions.SellerNameField, - ), + dynamic.Eq(conditions.SellerNameField), ), ), ) @@ -394,10 +394,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2TablesAtMoreLeve conditions.SaleSeller( conditions.SellerCompany( conditions.CompanyName( - badorm.DynamicExpression( - expressions.Eq, - conditions.SellerNameField, - ), + dynamic.Eq(conditions.SellerNameField), ), ), ), @@ -407,6 +404,43 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2TablesAtMoreLeve EqualList(&ts.Suite, []*models.Sale{match}, entities) } +func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionJoinMoreThanOnceWithoutSelectJoinReturnsError() { + _, err := ts.crudChildService.GetEntities( + conditions.ChildParent1( + conditions.Parent1ParentParent(), + ), + conditions.ChildParent2( + conditions.Parent2ParentParent(), + ), + conditions.ChildId(dynamic.Eq(conditions.ParentParentIdField)), + ) + ts.ErrorIs(err, dynamic.ErrJoinMustBeSelected) +} + +func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionJoinMoreThanOnceWithSelectJoin() { + parentParent := &models.ParentParent{Name: "franco"} + parent1 := &models.Parent1{ParentParent: *parentParent} + parent2 := &models.Parent2{ParentParent: *parentParent} + child := &models.Child{Parent1: *parent1, Parent2: *parent2, Name: "franco"} + err := ts.db.Create(child).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildParent1( + conditions.Parent1ParentParent(), + ), + conditions.ChildParent2( + conditions.Parent2ParentParent(), + ), + conditions.ChildName( + dynamic.Eq(conditions.ParentParentNameField).SelectJoin(0), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child}, entities) +} + func (ts *JoinConditionsIntTestSuite) TestJoinWithUnsafeCondition() { product1 := ts.createProduct("", 0, 0.0, false, nil) product2 := ts.createProduct("", 0, 0.0, false, nil) diff --git a/testintegration/models/models.go b/testintegration/models/models.go index d86d3259..947e0271 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -237,6 +237,8 @@ func (m Parent2) Equal(other Parent2) bool { type Child struct { badorm.UUIDModel + Name string + Parent1 Parent1 Parent1ID badorm.UUID From 52668c6669ac1fc01afca88952e89527641d320f Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 5 Jul 2023 15:20:47 +0200 Subject: [PATCH 421/467] add dynamic multivalue expressions --- badorm/dynamic/expression.go | 179 ++++++++++++++++++++-------- badorm/expression.go | 54 --------- badorm/multitype/expression.go | 20 ++-- badorm/multivalue/multivalue.go | 33 +++++ badorm/mysql/array.go | 9 +- testintegration/expressions_test.go | 5 +- 6 files changed, 180 insertions(+), 120 deletions(-) create mode 100644 badorm/multivalue/multivalue.go diff --git a/badorm/dynamic/expression.go b/badorm/dynamic/expression.go index 16d60bb9..469b969a 100644 --- a/badorm/dynamic/expression.go +++ b/badorm/dynamic/expression.go @@ -3,6 +3,9 @@ package dynamic import ( "errors" "fmt" + "strings" + + "github.com/elliotchance/pie/v2" "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/expressions" @@ -16,24 +19,8 @@ var ( const UndefinedJoinNumber = -1 -func newDynamicExpression[T any](expression expressions.SQLExpression, field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo - // TODO que pasa si hay mas de uno, no se si me gusta mucho esto - // creo que si hay mas de uno solo se tendria que aplicar en el primero, - return &Expression[T]{ - SQLExpressions: []LiteralSQLExpression{ - { - SQL: expressions.ToSQL[expression], - Field: field, - }, - }, - JoinNumber: UndefinedJoinNumber, - } - // TODO soportar multivalue, no todos necesariamente dinamicos -} - // TODO doc -type Expression[T any] struct { +type ValueExpression[T any] struct { // TODO hacer el cambio de nombre en el anterior tambien? SQLExpressions []LiteralSQLExpression JoinNumber int @@ -44,12 +31,12 @@ type LiteralSQLExpression struct { Field badorm.IFieldIdentifier } -func (expr Expression[T]) InterfaceVerificationMethod(_ T) { +func (expr ValueExpression[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Expression[T] } -func (expr *Expression[T]) SelectJoin(joinNumber uint) badorm.DynamicExpression[T] { +func (expr *ValueExpression[T]) SelectJoin(joinNumber uint) badorm.DynamicExpression[T] { expr.JoinNumber = int(joinNumber) return expr } @@ -57,26 +44,14 @@ func (expr *Expression[T]) SelectJoin(joinNumber uint) badorm.DynamicExpression[ // verificar que en las condiciones anteriores alguien usó el field con el que se intenta comparar // obtener de ahi cual es el nombre de la table a usar con ese field. // TODO doc a ingles -func (expr Expression[T]) ToSQL(query *badorm.Query, columnName string) (string, []any, error) { +func (expr ValueExpression[T]) ToSQL(query *badorm.Query, columnName string) (string, []any, error) { exprString := columnName values := []any{} for _, sqlExpr := range expr.SQLExpressions { - modelTables := query.GetTables(sqlExpr.Field.GetModelType()) - if modelTables == nil { - return "", nil, ErrFieldModelNotConcerned - } - - var modelTable badorm.Table - - if len(modelTables) == 1 { - modelTable = modelTables[0] - } else { - if expr.JoinNumber == UndefinedJoinNumber { - return "", nil, ErrJoinMustBeSelected - } - - modelTable = modelTables[expr.JoinNumber] + modelTable, err := getModelTable(query, sqlExpr.Field, expr.JoinNumber) + if err != nil { + return "", nil, err } exprString += fmt.Sprintf( @@ -88,6 +63,110 @@ func (expr Expression[T]) ToSQL(query *badorm.Query, columnName string) (string, return exprString, values, nil } +func newValueExpression[T any](expression expressions.SQLExpression, field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo + // TODO que pasa si hay mas de uno, no se si me gusta mucho esto + // creo que si hay mas de uno solo se tendria que aplicar en el primero, + // TODO soportar multivalue, no todos necesariamente dinamicos + return &ValueExpression[T]{ + SQLExpressions: []LiteralSQLExpression{ + { + SQL: expressions.ToSQL[expression], + Field: field, + }, + }, + JoinNumber: UndefinedJoinNumber, + } +} + +// Expression that compares the value of the column against multiple values +// Example: value IN (v1, v2, v3, ..., vN) +type MultivalueExpression[T any] struct { + // TODO hacer el cambio de nombre en el anterior tambien? + // TODO con esto podria reemplazar el SQLExpressionAndValue para que todos sean por dentro dynamics + Values []any // the values to compare with + SQLExpression string // the expression used to compare, example: IN + SQLConnector string // the connector between values, example: ', ' + SQLPrefix string // something to put before the values, example: ( + SQLSuffix string // something to put after the values, example: ) + JoinNumber int +} + +func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + +func (expr *MultivalueExpression[T]) SelectJoin(joinNumber uint) badorm.DynamicExpression[T] { + expr.JoinNumber = int(joinNumber) + return expr +} + +func (expr MultivalueExpression[T]) ToSQL(query *badorm.Query, columnName string) (string, []any, error) { + placeholderList := []string{} + values := []any{} + + for _, value := range expr.Values { + field, isField := value.(badorm.IFieldIdentifier) + if isField { + // if it is a field, add the field column to the query + modelTable, err := getModelTable(query, field, expr.JoinNumber) + if err != nil { + return "", nil, err + } + + placeholderList = append(placeholderList, field.ColumnSQL(query, modelTable)) + } else { + // if it is not a field, it a value, ass the placeholder ? and the value to the list + placeholderList = append(placeholderList, "?") + values = append(values, value) + } + } + + placeholders := strings.Join(placeholderList, " "+expr.SQLConnector+" ") + + return fmt.Sprintf( + "%s %s %s"+placeholders+"%s", + columnName, + expr.SQLExpression, + expr.SQLPrefix, + expr.SQLSuffix, + ), values, nil +} + +func newMultivalueExpression[T any](sqlExpression expressions.SQLExpression, sqlConnector, sqlPrefix, sqlSuffix string, fields ...badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + // TODO no todos necesariamente dinamicos, pueden ser T o field[T] + values := pie.Map(fields, func(field badorm.FieldIdentifier[T]) any { + return field + }) + + return &MultivalueExpression[T]{ + Values: values, + SQLExpression: expressions.ToSQL[sqlExpression], + SQLConnector: sqlConnector, + SQLPrefix: sqlPrefix, + SQLSuffix: sqlSuffix, + JoinNumber: UndefinedJoinNumber, + } +} + +func getModelTable(query *badorm.Query, field badorm.IFieldIdentifier, joinNumber int) (badorm.Table, error) { + modelTables := query.GetTables(field.GetModelType()) + if modelTables == nil { + return badorm.Table{}, ErrFieldModelNotConcerned + } + + if len(modelTables) == 1 { + return modelTables[0], nil + } + + if joinNumber == UndefinedJoinNumber { + return badorm.Table{}, ErrJoinMustBeSelected + } + + return modelTables[joinNumber], nil +} + // Comparison Operators // refs: // - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html @@ -97,33 +176,33 @@ func (expr Expression[T]) ToSQL(query *badorm.Query, columnName string) (string, // EqualTo func Eq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newDynamicExpression(expressions.Eq, field) + return newValueExpression(expressions.Eq, field) } // NotEqualTo func NotEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newDynamicExpression(expressions.NotEq, field) + return newValueExpression(expressions.NotEq, field) } // LessThan func Lt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newDynamicExpression(expressions.Lt, field) + return newValueExpression(expressions.Lt, field) } // LessThanOrEqualTo func LtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newDynamicExpression(expressions.LtOrEq, field) + return newValueExpression(expressions.LtOrEq, field) } // GreaterThan func Gt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { // TODO invertir orden de parametros para que quede igual que en badorm/expression - return newDynamicExpression(expressions.Gt, field) + return newValueExpression(expressions.Gt, field) } // GreaterThanOrEqualTo func GtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newDynamicExpression(expressions.GtOrEq, field) + return newValueExpression(expressions.GtOrEq, field) } // Comparison Predicates @@ -132,23 +211,23 @@ func GtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] // https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE // Equivalent to v1 < value < v2 -// func Between[T any](v1 T, v2 T) MultivalueExpression[T] { -// return NewMultivalueExpression("BETWEEN", "AND", "", "", v1, v2) -// } +func Between[T any](field1 badorm.FieldIdentifier[T], field2 badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + return newMultivalueExpression(expressions.Between, "AND", "", "", field1, field2) +} -// // Equivalent to NOT (v1 < value < v2) -// func NotBetween[T any](v1 T, v2 T) MultivalueExpression[T] { -// return NewMultivalueExpression("NOT BETWEEN", "AND", "", "", v1, v2) -// } +// Equivalent to NOT (v1 < value < v2) +func NotBetween[T any](field1 badorm.FieldIdentifier[T], field2 badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { + return newMultivalueExpression(expressions.NotBetween, "AND", "", "", field1, field2) +} // Boolean Comparison Predicates // Not supported by: mysql func IsDistinct[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newDynamicExpression(expressions.IsDistinct, field) + return newValueExpression(expressions.IsDistinct, field) } // Not supported by: mysql func IsNotDistinct[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newDynamicExpression(expressions.IsNotDistinct, field) + return newValueExpression(expressions.IsNotDistinct, field) } diff --git a/badorm/expression.go b/badorm/expression.go index d79e8800..598ea824 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -7,7 +7,6 @@ import ( "fmt" "reflect" "regexp" - "strings" "github.com/elliotchance/pie/v2" @@ -109,49 +108,6 @@ func (expr *ValueExpression[T]) AddSQLExpression(value any, sqlExpression expres return *expr } -// Expression that compares the value of the column against multiple values -// Example: value IN (v1, v2, v3, ..., vN) -type MultivalueExpression[T any] struct { - Values []T // the values to compare with - SQLExpression string // the expression used to compare, example: IN - SQLConnector string // the connector between values, example: ', ' - SQLPrefix string // something to put before the values, example: ( - SQLSuffix string // something to put after the values, example: ) -} - -func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func (expr MultivalueExpression[T]) ToSQL(_ *Query, columnName string) (string, []any, error) { - placeholders := strings.Join(pie.Map(expr.Values, func(value T) string { - return "?" - }), " "+expr.SQLConnector+" ") - - values := pie.Map(expr.Values, func(value T) any { - return value - }) - - return fmt.Sprintf( - "%s %s %s"+placeholders+"%s", - columnName, - expr.SQLExpression, - expr.SQLPrefix, - expr.SQLSuffix, - ), values, nil -} - -func NewMultivalueExpression[T any](sqlExpression expressions.SQLExpression, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) MultivalueExpression[T] { - return MultivalueExpression[T]{ - Values: values, - SQLExpression: expressions.ToSQL[sqlExpression], - SQLConnector: sqlConnector, - SQLPrefix: sqlPrefix, - SQLSuffix: sqlSuffix, - } -} - // Expression that verifies a predicate // Example: value IS TRUE type PredicateExpression[T any] struct { @@ -317,16 +273,6 @@ func GtOrEq[T any](value T) Expression[T] { // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html // https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE -// Equivalent to v1 < value < v2 -func Between[T any](v1 T, v2 T) MultivalueExpression[T] { - return NewMultivalueExpression(expressions.Between, "AND", "", "", v1, v2) -} - -// Equivalent to NOT (v1 < value < v2) -func NotBetween[T any](v1 T, v2 T) MultivalueExpression[T] { - return NewMultivalueExpression(expressions.NotBetween, "AND", "", "", v1, v2) -} - func IsNull[T any]() PredicateExpression[T] { return NewPredicateExpression[T]("IS NULL") } diff --git a/badorm/multitype/expression.go b/badorm/multitype/expression.go index 0dc1ce95..df0baac1 100644 --- a/badorm/multitype/expression.go +++ b/badorm/multitype/expression.go @@ -32,7 +32,7 @@ func isNullable(fieldType reflect.Type) bool { return pie.Contains(nullableTypes, fieldType) } -func newMultitypeDynamicExpression[T1 any, T2 any](expression expressions.SQLExpression, field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { +func newMultitypeValueExpression[T1 any, T2 any](expression expressions.SQLExpression, field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { expressionType := reflect.TypeOf(*new(T1)) fieldType := reflect.TypeOf(*new(T2)) @@ -45,7 +45,7 @@ func newMultitypeDynamicExpression[T1 any, T2 any](expression expressions.SQLExp // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo // TODO que pasa si hay mas de uno, no se si me gusta mucho esto // creo que si hay mas de uno solo se tendria que aplicar en el primero, - return &dynamic.Expression[T1]{ + return &dynamic.ValueExpression[T1]{ SQLExpressions: []dynamic.LiteralSQLExpression{ { SQL: expressions.ToSQL[expression], @@ -66,33 +66,33 @@ func newMultitypeDynamicExpression[T1 any, T2 any](expression expressions.SQLExp // EqualTo func Eq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeDynamicExpression[T1, T2](expressions.Eq, field) + return newMultitypeValueExpression[T1, T2](expressions.Eq, field) } // NotEqualTo func NotEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeDynamicExpression[T1, T2](expressions.NotEq, field) + return newMultitypeValueExpression[T1, T2](expressions.NotEq, field) } // LessThan func Lt[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeDynamicExpression[T1, T2](expressions.Lt, field) + return newMultitypeValueExpression[T1, T2](expressions.Lt, field) } // LessThanOrEqualTo func LtOrEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeDynamicExpression[T1, T2](expressions.LtOrEq, field) + return newMultitypeValueExpression[T1, T2](expressions.LtOrEq, field) } // GreaterThan func Gt[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { // TODO invertir orden de parametros para que quede igual que en badorm/expression - return newMultitypeDynamicExpression[T1, T2](expressions.Gt, field) + return newMultitypeValueExpression[T1, T2](expressions.Gt, field) } // GreaterThanOrEqualTo func GtOrEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeDynamicExpression[T1, T2](expressions.GtOrEq, field) + return newMultitypeValueExpression[T1, T2](expressions.GtOrEq, field) } // Comparison Predicates @@ -114,10 +114,10 @@ func GtOrEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpr // Not supported by: mysql func IsDistinct[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeDynamicExpression[T1, T2](expressions.IsDistinct, field) + return newMultitypeValueExpression[T1, T2](expressions.IsDistinct, field) } // Not supported by: mysql func IsNotDistinct[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeDynamicExpression[T1, T2](expressions.IsNotDistinct, field) + return newMultitypeValueExpression[T1, T2](expressions.IsNotDistinct, field) } diff --git a/badorm/multivalue/multivalue.go b/badorm/multivalue/multivalue.go new file mode 100644 index 00000000..4c4a1e2b --- /dev/null +++ b/badorm/multivalue/multivalue.go @@ -0,0 +1,33 @@ +package multivalue + +import ( + "github.com/elliotchance/pie/v2" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/dynamic" + "github.com/ditrit/badaas/badorm/expressions" +) + +func NewMultivalueExpression[T any](sqlExpression expressions.SQLExpression, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) badorm.Expression[T] { + valuesAny := pie.Map(values, func(value T) any { + return value + }) + + return &dynamic.MultivalueExpression[T]{ + Values: valuesAny, + SQLExpression: expressions.ToSQL[sqlExpression], + SQLConnector: sqlConnector, + SQLPrefix: sqlPrefix, + SQLSuffix: sqlSuffix, + } +} + +// Equivalent to v1 < value < v2 +func Between[T any](v1 T, v2 T) badorm.Expression[T] { + return NewMultivalueExpression(expressions.Between, "AND", "", "", v1, v2) +} + +// Equivalent to NOT (v1 < value < v2) +func NotBetween[T any](v1 T, v2 T) badorm.Expression[T] { + return NewMultivalueExpression(expressions.NotBetween, "AND", "", "", v1, v2) +} diff --git a/badorm/mysql/array.go b/badorm/mysql/array.go index 7801dfe9..203024c8 100644 --- a/badorm/mysql/array.go +++ b/badorm/mysql/array.go @@ -3,15 +3,16 @@ package mysql import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/expressions" + "github.com/ditrit/badaas/badorm/multivalue" ) // Row and Array Comparisons // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in -func ArrayIn[T any](values ...T) badorm.MultivalueExpression[T] { - return badorm.NewMultivalueExpression(expressions.ArrayIn, ",", "(", ")", values...) +func ArrayIn[T any](values ...T) badorm.Expression[T] { + return multivalue.NewMultivalueExpression(expressions.ArrayIn, ",", "(", ")", values...) } -func ArrayNotIn[T any](values ...T) badorm.MultivalueExpression[T] { - return badorm.NewMultivalueExpression(expressions.ArrayNotIn, ",", "(", ")", values...) +func ArrayNotIn[T any](values ...T) badorm.Expression[T] { + return multivalue.NewMultivalueExpression(expressions.ArrayNotIn, ",", "(", ")", values...) } diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 5a17c2bc..d7859ea4 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -9,6 +9,7 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/dynamic" "github.com/ditrit/badaas/badorm/multitype" + "github.com/ditrit/badaas/badorm/multivalue" "github.com/ditrit/badaas/badorm/mysql" "github.com/ditrit/badaas/badorm/psql" "github.com/ditrit/badaas/badorm/sqlite" @@ -363,7 +364,7 @@ func (ts *ExpressionIntTestSuite) TestBetween() { entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - badorm.Between(3, 5), + multivalue.Between(3, 5), ), ) ts.Nil(err) @@ -379,7 +380,7 @@ func (ts *ExpressionIntTestSuite) TestNotBetween() { entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - badorm.NotBetween(0, 2), + multivalue.NotBetween(0, 2), ), ) ts.Nil(err) From b7fd30e0fca9f3eec074e2335a870e8d81c781f0 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 5 Jul 2023 16:29:06 +0200 Subject: [PATCH 422/467] multitype multivalue expressions --- badorm/dynamic/expression.go | 11 ++- badorm/multitype/expression.go | 109 ++++++++++++++++++++-------- testintegration/expressions_test.go | 78 +++++++++++++++++++- 3 files changed, 160 insertions(+), 38 deletions(-) diff --git a/badorm/dynamic/expression.go b/badorm/dynamic/expression.go index 469b969a..331d093b 100644 --- a/badorm/dynamic/expression.go +++ b/badorm/dynamic/expression.go @@ -134,8 +134,11 @@ func (expr MultivalueExpression[T]) ToSQL(query *badorm.Query, columnName string ), values, nil } -func newMultivalueExpression[T any](sqlExpression expressions.SQLExpression, sqlConnector, sqlPrefix, sqlSuffix string, fields ...badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - // TODO no todos necesariamente dinamicos, pueden ser T o field[T] +func newMultivalueExpression[T any]( + sqlExpression expressions.SQLExpression, + sqlConnector, sqlPrefix, sqlSuffix string, + fields ...badorm.FieldIdentifier[T], +) badorm.DynamicExpression[T] { values := pie.Map(fields, func(field badorm.FieldIdentifier[T]) any { return field }) @@ -210,12 +213,12 @@ func GtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html // https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE -// Equivalent to v1 < value < v2 +// Equivalent to field1 < value < field2 func Between[T any](field1 badorm.FieldIdentifier[T], field2 badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { return newMultivalueExpression(expressions.Between, "AND", "", "", field1, field2) } -// Equivalent to NOT (v1 < value < v2) +// Equivalent to NOT (field1 < value < field2) func NotBetween[T any](field1 badorm.FieldIdentifier[T], field2 badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { return newMultivalueExpression(expressions.NotBetween, "AND", "", "", field1, field2) } diff --git a/badorm/multitype/expression.go b/badorm/multitype/expression.go index df0baac1..6246ac07 100644 --- a/badorm/multitype/expression.go +++ b/badorm/multitype/expression.go @@ -14,7 +14,10 @@ import ( ) // TODO ponerles mas informacion precisa a los errores -var ErrFieldTypeDoesNotMatch = errors.New("field type does not match expression type") +var ( + ErrFieldTypeDoesNotMatch = errors.New("field type does not match expression type") + ErrParamsNotValueOrField = errors.New("parameter is neither a value or a field") +) var nullableTypes = []reflect.Type{ reflect.TypeOf(sql.NullBool{}), @@ -32,20 +35,33 @@ func isNullable(fieldType reflect.Type) bool { return pie.Contains(nullableTypes, fieldType) } -func newMultitypeValueExpression[T1 any, T2 any](expression expressions.SQLExpression, field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - expressionType := reflect.TypeOf(*new(T1)) - fieldType := reflect.TypeOf(*new(T2)) +func verifyFieldType[TAttribute, TField any]() badorm.DynamicExpression[TAttribute] { + expressionType := reflect.TypeOf(*new(TAttribute)) + fieldType := reflect.TypeOf(*new(TField)) if fieldType != expressionType && !((isNullable(fieldType) && fieldType.Field(0).Type == expressionType) || (isNullable(expressionType) && expressionType.Field(0).Type == fieldType)) { - return badorm.NewInvalidExpression[T1](ErrFieldTypeDoesNotMatch) + return badorm.NewInvalidExpression[TAttribute](ErrFieldTypeDoesNotMatch) + } + + return nil +} + +func newValueExpression[TAttribute, TField any]( + expression expressions.SQLExpression, + field badorm.FieldIdentifier[TField], +) badorm.DynamicExpression[TAttribute] { + invalidExpression := verifyFieldType[TAttribute, TField]() + if invalidExpression != nil { + return invalidExpression } // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo // TODO que pasa si hay mas de uno, no se si me gusta mucho esto // creo que si hay mas de uno solo se tendria que aplicar en el primero, - return &dynamic.ValueExpression[T1]{ + // TODO soportar multivalue, no todos necesariamente dinamicos + return &dynamic.ValueExpression[TAttribute]{ SQLExpressions: []dynamic.LiteralSQLExpression{ { SQL: expressions.ToSQL[expression], @@ -54,7 +70,40 @@ func newMultitypeValueExpression[T1 any, T2 any](expression expressions.SQLExpre }, JoinNumber: dynamic.UndefinedJoinNumber, } - // TODO soportar multivalue, no todos necesariamente dinamicos +} + +func newMultivalueExpression[TAttribute, TField any]( + sqlExpression expressions.SQLExpression, + sqlConnector, sqlPrefix, sqlSuffix string, + values ...any, +) badorm.DynamicExpression[TAttribute] { + for _, value := range values { + _, isT1 := value.(TAttribute) + if isT1 { + continue + } + + _, isField := value.(badorm.FieldIdentifier[TField]) + if isField { + invalidExpression := verifyFieldType[TAttribute, TField]() + if invalidExpression != nil { + return invalidExpression + } + + continue + } + + return badorm.NewInvalidExpression[TAttribute](ErrParamsNotValueOrField) + } + + return &dynamic.MultivalueExpression[TAttribute]{ + Values: values, + SQLExpression: expressions.ToSQL[sqlExpression], + SQLConnector: sqlConnector, + SQLPrefix: sqlPrefix, + SQLSuffix: sqlSuffix, + JoinNumber: dynamic.UndefinedJoinNumber, + } } // Comparison Operators @@ -65,34 +114,34 @@ func newMultitypeValueExpression[T1 any, T2 any](expression expressions.SQLExpre // - SQLite: https://www.sqlite.org/lang_expr.html // EqualTo -func Eq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeValueExpression[T1, T2](expressions.Eq, field) +func Eq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { + return newValueExpression[TAttribute, TField](expressions.Eq, field) } // NotEqualTo -func NotEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeValueExpression[T1, T2](expressions.NotEq, field) +func NotEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { + return newValueExpression[TAttribute, TField](expressions.NotEq, field) } // LessThan -func Lt[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeValueExpression[T1, T2](expressions.Lt, field) +func Lt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { + return newValueExpression[TAttribute, TField](expressions.Lt, field) } // LessThanOrEqualTo -func LtOrEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeValueExpression[T1, T2](expressions.LtOrEq, field) +func LtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { + return newValueExpression[TAttribute, TField](expressions.LtOrEq, field) } // GreaterThan -func Gt[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { +func Gt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { // TODO invertir orden de parametros para que quede igual que en badorm/expression - return newMultitypeValueExpression[T1, T2](expressions.Gt, field) + return newValueExpression[TAttribute, TField](expressions.Gt, field) } // GreaterThanOrEqualTo -func GtOrEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeValueExpression[T1, T2](expressions.GtOrEq, field) +func GtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { + return newValueExpression[TAttribute, TField](expressions.GtOrEq, field) } // Comparison Predicates @@ -101,23 +150,23 @@ func GtOrEq[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpr // https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE // Equivalent to v1 < value < v2 -// func Between[T any](v1 T, v2 T) MultivalueExpression[T] { -// return NewMultivalueExpression("BETWEEN", "AND", "", "", v1, v2) -// } +func Between[TAttribute, TField any](v1 any, v2 any) badorm.DynamicExpression[TAttribute] { + return newMultivalueExpression[TAttribute, TField](expressions.Between, "AND", "", "", v1, v2) +} -// // Equivalent to NOT (v1 < value < v2) -// func NotBetween[T any](v1 T, v2 T) MultivalueExpression[T] { -// return NewMultivalueExpression("NOT BETWEEN", "AND", "", "", v1, v2) -// } +// Equivalent to NOT (field1 < value < field2) +func NotBetween[TAttribute, TField any](v1 any, v2 any) badorm.DynamicExpression[TAttribute] { + return newMultivalueExpression[TAttribute, TField](expressions.NotBetween, "AND", "", "", v1, v2) +} // Boolean Comparison Predicates // Not supported by: mysql -func IsDistinct[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeValueExpression[T1, T2](expressions.IsDistinct, field) +func IsDistinct[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { + return newValueExpression[TAttribute, TField](expressions.IsDistinct, field) } // Not supported by: mysql -func IsNotDistinct[T1 any, T2 any](field badorm.FieldIdentifier[T2]) badorm.DynamicExpression[T1] { - return newMultitypeValueExpression[T1, T2](expressions.IsNotDistinct, field) +func IsNotDistinct[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { + return newValueExpression[TAttribute, TField](expressions.IsNotDistinct, field) } diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index d7859ea4..6b713d52 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -3,6 +3,7 @@ package testintegration import ( "database/sql" "log" + "time" "gorm.io/gorm" @@ -1031,7 +1032,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBadORMModelAttribute() EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionWithFieldOfAnotherTypeReturnsError() { +func (ts *ExpressionIntTestSuite) TestMultitypeExpressionWithFieldOfAnotherTypeReturnsError() { _, err := ts.crudProductService.GetEntities( conditions.ProductInt( multitype.Eq[int](conditions.ProductStringField), @@ -1040,7 +1041,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionWithFieldOfAnoth ts.ErrorIs(err, multitype.ErrFieldTypeDoesNotMatch) } -func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForNullableTypeCanBeComparedWithNotNullType() { +func (ts *ExpressionIntTestSuite) TestMultitypeExpressionForNullableTypeCanBeComparedWithNotNullType() { match := ts.createProduct("", 1, 1.0, false, nil) match.NullFloat = sql.NullFloat64{Valid: true, Float64: 1.0} err := ts.db.Save(match).Error @@ -1058,7 +1059,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForNullableTypeC EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForNotNullTypeCanBeComparedWithNullableType() { +func (ts *ExpressionIntTestSuite) TestMultitypeExpressionForNotNullTypeCanBeComparedWithNullableType() { match := ts.createProduct("", 1, 1.0, false, nil) match.NullFloat = sql.NullFloat64{Valid: true, Float64: 1.0} err := ts.db.Save(match).Error @@ -1076,7 +1077,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForNotNullTypeCa EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForBadORMModelAttribute() { +func (ts *ExpressionIntTestSuite) TestMultitypeExpressionForBadORMModelAttribute() { match := ts.createProduct("", 1, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( @@ -1088,3 +1089,72 @@ func (ts *ExpressionIntTestSuite) TestMultitypeDynamicExpressionForBadORMModelAt EqualList(&ts.Suite, []*models.Product{match}, entities) } + +func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithValueOfAnotherTypeReturnsError() { + _, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + multitype.Between[int, int]("hola", 1), + ), + ) + ts.ErrorIs(err, multitype.ErrParamsNotValueOrField) +} + +func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithFieldOfAnotherTypeReturnsError() { + _, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + multitype.Between[int, int](1, conditions.ProductCreatedAtField), + ), + ) + ts.ErrorIs(err, multitype.ErrParamsNotValueOrField) +} + +func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithFieldOfNotRelatedTypeReturnsError() { + _, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + multitype.Between[int, time.Time](1, conditions.ProductCreatedAtField), + ), + ) + ts.ErrorIs(err, multitype.ErrFieldTypeDoesNotMatch) +} + +func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithAFieldAndAValue() { + match := ts.createProduct("", 1, 0.0, false, nil) + ts.createProduct("", 0, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductInt( + multitype.Between[int, int](1, conditions.ProductIntField), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} + +func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithAFieldRelatedAndAValue() { + match := ts.createProduct("", 1, 1.0, false, nil) + match.NullFloat = sql.NullFloat64{Valid: true, Float64: 2.0} + err := ts.db.Save(match).Error + ts.Nil(err) + + notMatch1 := ts.createProduct("", 0, 0.0, false, nil) + notMatch1.NullFloat = sql.NullFloat64{Valid: true, Float64: 2.0} + err = ts.db.Save(notMatch1).Error + ts.Nil(err) + + notMatch2 := ts.createProduct("", 0, 5.0, false, nil) + notMatch2.NullFloat = sql.NullFloat64{Valid: true, Float64: 2.0} + err = ts.db.Save(notMatch2).Error + ts.Nil(err) + + ts.createProduct("", 0, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + multitype.Between[float64, sql.NullFloat64](1.0, conditions.ProductNullFloatField), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} From f9d6f3e79dad2de386ab492aaa101c9c1d182043 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 5 Jul 2023 17:10:44 +0200 Subject: [PATCH 423/467] refactor: only one value expression --- badorm/dynamic/expression.go | 138 +---------- badorm/expression.go | 296 ------------------------ badorm/multitype/expression.go | 11 +- badorm/multivalue/multivalue.go | 33 --- badorm/multivalueExpression.go | 96 ++++++++ badorm/mysql/array.go | 5 +- badorm/operators.go | 234 +++++++++++++++++++ badorm/valueExpression.go | 114 +++++++++ testintegration/expressions_test.go | 5 +- testintegration/join_conditions_test.go | 2 +- 10 files changed, 459 insertions(+), 475 deletions(-) delete mode 100644 badorm/multivalue/multivalue.go create mode 100644 badorm/multivalueExpression.go create mode 100644 badorm/operators.go create mode 100644 badorm/valueExpression.go diff --git a/badorm/dynamic/expression.go b/badorm/dynamic/expression.go index 331d093b..adfe365f 100644 --- a/badorm/dynamic/expression.go +++ b/badorm/dynamic/expression.go @@ -1,139 +1,28 @@ package dynamic import ( - "errors" - "fmt" - "strings" - "github.com/elliotchance/pie/v2" "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/expressions" ) -// TODO ponerles mas informacion precisa a los errores -var ( - ErrFieldModelNotConcerned = errors.New("field's model is not concerned by the query so it can't be used in a expression") - ErrJoinMustBeSelected = errors.New("table is joined more than once, select which one you want to use") -) - -const UndefinedJoinNumber = -1 - -// TODO doc -type ValueExpression[T any] struct { - // TODO hacer el cambio de nombre en el anterior tambien? - SQLExpressions []LiteralSQLExpression - JoinNumber int -} - -type LiteralSQLExpression struct { - SQL string - Field badorm.IFieldIdentifier -} - -func (expr ValueExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func (expr *ValueExpression[T]) SelectJoin(joinNumber uint) badorm.DynamicExpression[T] { - expr.JoinNumber = int(joinNumber) - return expr -} - -// verificar que en las condiciones anteriores alguien usó el field con el que se intenta comparar -// obtener de ahi cual es el nombre de la table a usar con ese field. -// TODO doc a ingles -func (expr ValueExpression[T]) ToSQL(query *badorm.Query, columnName string) (string, []any, error) { - exprString := columnName - values := []any{} - - for _, sqlExpr := range expr.SQLExpressions { - modelTable, err := getModelTable(query, sqlExpr.Field, expr.JoinNumber) - if err != nil { - return "", nil, err - } - - exprString += fmt.Sprintf( - " "+sqlExpr.SQL+" %s", - sqlExpr.Field.ColumnSQL(query, modelTable), - ) - } - - return exprString, values, nil -} - func newValueExpression[T any](expression expressions.SQLExpression, field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo // TODO que pasa si hay mas de uno, no se si me gusta mucho esto // creo que si hay mas de uno solo se tendria que aplicar en el primero, // TODO soportar multivalue, no todos necesariamente dinamicos - return &ValueExpression[T]{ - SQLExpressions: []LiteralSQLExpression{ + return &badorm.ValueExpression[T]{ + SQLExpressions: []badorm.SQLExpressionAndValue{ { SQL: expressions.ToSQL[expression], Field: field, }, }, - JoinNumber: UndefinedJoinNumber, + JoinNumber: badorm.UndefinedJoinNumber, } } -// Expression that compares the value of the column against multiple values -// Example: value IN (v1, v2, v3, ..., vN) -type MultivalueExpression[T any] struct { - // TODO hacer el cambio de nombre en el anterior tambien? - // TODO con esto podria reemplazar el SQLExpressionAndValue para que todos sean por dentro dynamics - Values []any // the values to compare with - SQLExpression string // the expression used to compare, example: IN - SQLConnector string // the connector between values, example: ', ' - SQLPrefix string // something to put before the values, example: ( - SQLSuffix string // something to put after the values, example: ) - JoinNumber int -} - -func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func (expr *MultivalueExpression[T]) SelectJoin(joinNumber uint) badorm.DynamicExpression[T] { - expr.JoinNumber = int(joinNumber) - return expr -} - -func (expr MultivalueExpression[T]) ToSQL(query *badorm.Query, columnName string) (string, []any, error) { - placeholderList := []string{} - values := []any{} - - for _, value := range expr.Values { - field, isField := value.(badorm.IFieldIdentifier) - if isField { - // if it is a field, add the field column to the query - modelTable, err := getModelTable(query, field, expr.JoinNumber) - if err != nil { - return "", nil, err - } - - placeholderList = append(placeholderList, field.ColumnSQL(query, modelTable)) - } else { - // if it is not a field, it a value, ass the placeholder ? and the value to the list - placeholderList = append(placeholderList, "?") - values = append(values, value) - } - } - - placeholders := strings.Join(placeholderList, " "+expr.SQLConnector+" ") - - return fmt.Sprintf( - "%s %s %s"+placeholders+"%s", - columnName, - expr.SQLExpression, - expr.SQLPrefix, - expr.SQLSuffix, - ), values, nil -} - func newMultivalueExpression[T any]( sqlExpression expressions.SQLExpression, sqlConnector, sqlPrefix, sqlSuffix string, @@ -143,33 +32,16 @@ func newMultivalueExpression[T any]( return field }) - return &MultivalueExpression[T]{ + return &badorm.MultivalueExpression[T]{ Values: values, SQLExpression: expressions.ToSQL[sqlExpression], SQLConnector: sqlConnector, SQLPrefix: sqlPrefix, SQLSuffix: sqlSuffix, - JoinNumber: UndefinedJoinNumber, + JoinNumber: badorm.UndefinedJoinNumber, } } -func getModelTable(query *badorm.Query, field badorm.IFieldIdentifier, joinNumber int) (badorm.Table, error) { - modelTables := query.GetTables(field.GetModelType()) - if modelTables == nil { - return badorm.Table{}, ErrFieldModelNotConcerned - } - - if len(modelTables) == 1 { - return modelTables[0], nil - } - - if joinNumber == UndefinedJoinNumber { - return badorm.Table{}, ErrJoinMustBeSelected - } - - return modelTables[joinNumber], nil -} - // Comparison Operators // refs: // - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html diff --git a/badorm/expression.go b/badorm/expression.go index 598ea824..64892478 100644 --- a/badorm/expression.go +++ b/badorm/expression.go @@ -1,21 +1,7 @@ package badorm import ( - "database/sql" - "database/sql/driver" - "errors" "fmt" - "reflect" - "regexp" - - "github.com/elliotchance/pie/v2" - - "github.com/ditrit/badaas/badorm/expressions" -) - -var ( - ErrNotRelated = errors.New("value type not related with T") - ErrValueCantBeNull = errors.New("value to compare can't be null") ) type Expression[T any] interface { @@ -36,78 +22,6 @@ type DynamicExpression[T any] interface { SelectJoin(joinNumber uint) DynamicExpression[T] } -// Expression that compares the value of the column against a fixed value -// If ExpressionsAndValues has multiple entries, comparisons will be nested -// Example (single): value = v1 -// Example (multi): value LIKE v1 ESCAPE v2 -type ValueExpression[T any] struct { - ExpressionsAndValues []SQLExpressionAndValue -} - -type SQLExpressionAndValue struct { - SQLExpression string - Value any -} - -func (expr ValueExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func (expr ValueExpression[T]) ToSQL(_ *Query, columnName string) (string, []any, error) { - exprString := columnName - values := []any{} - - for _, sqlExprAndValue := range expr.ExpressionsAndValues { - exprString += " " + sqlExprAndValue.SQLExpression + " ?" - values = append(values, sqlExprAndValue.Value) - } - - return exprString, values, nil -} - -func NewValueExpression[T any](value any, sqlExpression expressions.SQLExpression) ValueExpression[T] { - expr := ValueExpression[T]{} - - return expr.AddSQLExpression(value, sqlExpression) -} - -var nullableKinds = []reflect.Kind{ - reflect.Chan, reflect.Func, - reflect.Map, reflect.Pointer, - reflect.UnsafePointer, reflect.Interface, - reflect.Slice, -} - -func NewCantBeNullValueExpression[T any](value any, sqlExpression expressions.SQLExpression) Expression[T] { - if value == nil || mapsToNull(value) { - return NewInvalidExpression[T](ErrValueCantBeNull) - } - - return NewValueExpression[T](value, sqlExpression) -} - -func NewMustBePOSIXValueExpression[T string | sql.NullString](pattern string, sqlExpression expressions.SQLExpression) Expression[T] { - _, err := regexp.CompilePOSIX(pattern) - if err != nil { - return NewInvalidExpression[T](err) - } - - return NewValueExpression[T](pattern, sqlExpression) -} - -func (expr *ValueExpression[T]) AddSQLExpression(value any, sqlExpression expressions.SQLExpression) ValueExpression[T] { - expr.ExpressionsAndValues = append( - expr.ExpressionsAndValues, - SQLExpressionAndValue{ - Value: value, - SQLExpression: expressions.ToSQL[sqlExpression], - }, - ) - - return *expr -} - // Expression that verifies a predicate // Example: value IS TRUE type PredicateExpression[T any] struct { @@ -152,213 +66,3 @@ func NewInvalidExpression[T any](err error) InvalidExpression[T] { Err: err, } } - -// Comparison Operators -// refs: -// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html -// - PostgreSQL: https://www.postgresql.org/docs/current/functions-comparison.html -// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 -// - SQLite: https://www.sqlite.org/lang_expr.html - -// EqualTo -// EqOrIsNull must be used in cases where value can be NULL -func Eq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.Eq) -} - -// if value is not NULL returns a Eq expression -// but if value is NULL returns a IsNull expression -// this must be used because ANSI SQL-92 standard defines: -// NULL = NULL evaluates to unknown, which is later considered a false -// -// this behavior can be also avoided in other ways: -// - in SQLServer you can: -// ** set ansi_nulls setting to off and use sqlserver.EqNullable -// ** use the IS NOT DISTINCT operator (implemented in IsNotDistinct) -// - in MySQL you can use the equal_to operator (implemented in mysql.IsEqual) -// - in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) -// - in SQLite you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) -func EqOrIsNull[T any](value any) Expression[T] { - return expressionFromValueOrNil[T](value, Eq[T], IsNull[T]()) -} - -// NotEqualTo -// NotEqOrNotIsNull must be used in cases where value can be NULL -func NotEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.NotEq) -} - -// if value is not NULL returns a NotEq expression -// but if value is NULL returns a IsNotNull expression -// this must be used because ANSI SQL-92 standard defines: -// NULL = NULL evaluates to unknown, which is later considered a false -// -// this behavior can be also avoided in other ways: -// - in SQLServer you can: -// ** set ansi_nulls setting to off and use sqlserver.NotEqNullable -// ** use the IS DISTINCT operator (implemented in IsDistinct) -// - in PostgreSQL you can use the IS DISTINCT operator (implemented in IsDistinct) -// - in SQLite you can use the IS DISTINCT operator (implemented in IsDistinct) -func NotEqOrIsNotNull[T any](value any) Expression[T] { - return expressionFromValueOrNil[T](value, NotEq[T], IsNotNull[T]()) -} - -func expressionFromValueOrNil[T any](value any, notNilFunc func(T) Expression[T], nilExpression Expression[T]) Expression[T] { - if value == nil { - return nilExpression - } - - valueTPointer, isTPointer := value.(*T) - if isTPointer { - if valueTPointer == nil { - return nilExpression - } - - return notNilFunc(*valueTPointer) - } - - valueT, isT := value.(T) - if isT { - if mapsToNull(value) { - return nilExpression - } - - return notNilFunc(valueT) - } - - return NewInvalidExpression[T](ErrNotRelated) -} - -func mapsToNull(value any) bool { - reflectVal := reflect.ValueOf(value) - isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) - // avoid nil is not nil behavior of go - if isNullableKind && reflectVal.IsNil() { - return true - } - - valuer, isValuer := value.(driver.Valuer) - if isValuer { - valuerValue, err := valuer.Value() - if err == nil && valuerValue == nil { - return true - } - } - - return false -} - -// LessThan -func Lt[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.Lt) -} - -// LessThanOrEqualTo -func LtOrEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.LtOrEq) -} - -// GreaterThan -func Gt[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.Gt) -} - -// GreaterThanOrEqualTo -func GtOrEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.GtOrEq) -} - -// Comparison Predicates -// refs: -// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html -// https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE - -func IsNull[T any]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS NULL") -} - -func IsNotNull[T any]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS NOT NULL") -} - -// Boolean Comparison Predicates - -// Not supported by: sqlserver -func IsTrue[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS TRUE") -} - -// Not supported by: sqlserver -func IsNotTrue[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS NOT TRUE") -} - -// Not supported by: sqlserver -func IsFalse[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS FALSE") -} - -// Not supported by: sqlserver -func IsNotFalse[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS NOT FALSE") -} - -// Not supported by: sqlserver, sqlite -func IsUnknown[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS UNKNOWN") -} - -// Not supported by: sqlserver, sqlite -func IsNotUnknown[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS NOT UNKNOWN") -} - -// Not supported by: mysql -func IsDistinct[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, expressions.IsDistinct) -} - -// Not supported by: mysql -func IsNotDistinct[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, expressions.IsNotDistinct) -} - -// Pattern Matching - -type LikeExpression[T string | sql.NullString] struct { - ValueExpression[T] -} - -func NewLikeExpression[T string | sql.NullString](pattern string, sqlExpression expressions.SQLExpression) LikeExpression[T] { - return LikeExpression[T]{ - ValueExpression: NewValueExpression[T](pattern, sqlExpression), - } -} - -func (expr LikeExpression[T]) Escape(escape rune) ValueExpression[T] { - return expr.AddSQLExpression(string(escape), expressions.Escape) -} - -// Pattern in all databases: -// - An underscore (_) in pattern stands for (matches) any single character. -// - A percent sign (%) matches any sequence of zero or more characters. -// -// Additionally in SQLServer: -// - Square brackets ([ ]) matches any single character within the specified range ([a-f]) or set ([abcdef]). -// - [^] matches any single character not within the specified range ([^a-f]) or set ([^abcdef]). -// -// WARNINGS: -// - SQLite: LIKE is case-insensitive unless case_sensitive_like pragma (https://www.sqlite.org/pragma.html#pragma_case_sensitive_like) is true. -// - SQLServer, MySQL: the case-sensitivity depends on the collation used in compared column. -// - PostgreSQL: LIKE is always case-sensitive, if you want case-insensitive use the ILIKE operator (implemented in psql.ILike) -// -// refs: -// - mysql: https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like -// - postgresql: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE -// - sqlserver: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver16 -// - sqlite: https://www.sqlite.org/lang_expr.html#like -func Like[T string | sql.NullString](pattern string) LikeExpression[T] { - return NewLikeExpression[T](pattern, expressions.Like) -} - -// TODO Subquery Expressions diff --git a/badorm/multitype/expression.go b/badorm/multitype/expression.go index 6246ac07..8f4b7a8c 100644 --- a/badorm/multitype/expression.go +++ b/badorm/multitype/expression.go @@ -9,7 +9,6 @@ import ( "gorm.io/gorm" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/dynamic" "github.com/ditrit/badaas/badorm/expressions" ) @@ -61,14 +60,14 @@ func newValueExpression[TAttribute, TField any]( // TODO que pasa si hay mas de uno, no se si me gusta mucho esto // creo que si hay mas de uno solo se tendria que aplicar en el primero, // TODO soportar multivalue, no todos necesariamente dinamicos - return &dynamic.ValueExpression[TAttribute]{ - SQLExpressions: []dynamic.LiteralSQLExpression{ + return &badorm.ValueExpression[TAttribute]{ + SQLExpressions: []badorm.SQLExpressionAndValue{ { SQL: expressions.ToSQL[expression], Field: field, }, }, - JoinNumber: dynamic.UndefinedJoinNumber, + JoinNumber: badorm.UndefinedJoinNumber, } } @@ -96,13 +95,13 @@ func newMultivalueExpression[TAttribute, TField any]( return badorm.NewInvalidExpression[TAttribute](ErrParamsNotValueOrField) } - return &dynamic.MultivalueExpression[TAttribute]{ + return &badorm.MultivalueExpression[TAttribute]{ Values: values, SQLExpression: expressions.ToSQL[sqlExpression], SQLConnector: sqlConnector, SQLPrefix: sqlPrefix, SQLSuffix: sqlSuffix, - JoinNumber: dynamic.UndefinedJoinNumber, + JoinNumber: badorm.UndefinedJoinNumber, } } diff --git a/badorm/multivalue/multivalue.go b/badorm/multivalue/multivalue.go deleted file mode 100644 index 4c4a1e2b..00000000 --- a/badorm/multivalue/multivalue.go +++ /dev/null @@ -1,33 +0,0 @@ -package multivalue - -import ( - "github.com/elliotchance/pie/v2" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/dynamic" - "github.com/ditrit/badaas/badorm/expressions" -) - -func NewMultivalueExpression[T any](sqlExpression expressions.SQLExpression, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) badorm.Expression[T] { - valuesAny := pie.Map(values, func(value T) any { - return value - }) - - return &dynamic.MultivalueExpression[T]{ - Values: valuesAny, - SQLExpression: expressions.ToSQL[sqlExpression], - SQLConnector: sqlConnector, - SQLPrefix: sqlPrefix, - SQLSuffix: sqlSuffix, - } -} - -// Equivalent to v1 < value < v2 -func Between[T any](v1 T, v2 T) badorm.Expression[T] { - return NewMultivalueExpression(expressions.Between, "AND", "", "", v1, v2) -} - -// Equivalent to NOT (v1 < value < v2) -func NotBetween[T any](v1 T, v2 T) badorm.Expression[T] { - return NewMultivalueExpression(expressions.NotBetween, "AND", "", "", v1, v2) -} diff --git a/badorm/multivalueExpression.go b/badorm/multivalueExpression.go new file mode 100644 index 00000000..3362d8e1 --- /dev/null +++ b/badorm/multivalueExpression.go @@ -0,0 +1,96 @@ +package badorm + +import ( + "fmt" + "strings" + + "github.com/elliotchance/pie/v2" + + "github.com/ditrit/badaas/badorm/expressions" +) + +// Expression that compares the value of the column against multiple values +// Example: value IN (v1, v2, v3, ..., vN) +type MultivalueExpression[T any] struct { + // TODO hacer el cambio de nombre en el anterior tambien? + // TODO con esto podria reemplazar el SQLExpressionAndValue para que todos sean por dentro dynamics + Values []any // the values to compare with + SQLExpression string // the expression used to compare, example: IN + SQLConnector string // the connector between values, example: ', ' + SQLPrefix string // something to put before the values, example: ( + SQLSuffix string // something to put after the values, example: ) + JoinNumber int +} + +func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + +func (expr *MultivalueExpression[T]) SelectJoin(joinNumber uint) DynamicExpression[T] { + expr.JoinNumber = int(joinNumber) + return expr +} + +func (expr MultivalueExpression[T]) ToSQL(query *Query, columnName string) (string, []any, error) { + placeholderList := []string{} + values := []any{} + + for _, value := range expr.Values { + field, isField := value.(IFieldIdentifier) + if isField { + // if it is a field, add the field column to the query + modelTable, err := getModelTable(query, field, expr.JoinNumber) + if err != nil { + return "", nil, err + } + + placeholderList = append(placeholderList, field.ColumnSQL(query, modelTable)) + } else { + // if it is not a field, it a value, ass the placeholder ? and the value to the list + placeholderList = append(placeholderList, "?") + values = append(values, value) + } + } + + placeholders := strings.Join(placeholderList, " "+expr.SQLConnector+" ") + + return fmt.Sprintf( + "%s %s %s"+placeholders+"%s", + columnName, + expr.SQLExpression, + expr.SQLPrefix, + expr.SQLSuffix, + ), values, nil +} + +func getModelTable(query *Query, field IFieldIdentifier, joinNumber int) (Table, error) { + modelTables := query.GetTables(field.GetModelType()) + if modelTables == nil { + return Table{}, ErrFieldModelNotConcerned + } + + if len(modelTables) == 1 { + return modelTables[0], nil + } + + if joinNumber == UndefinedJoinNumber { + return Table{}, ErrJoinMustBeSelected + } + + return modelTables[joinNumber], nil +} + +func NewMultivalueExpression[T any](sqlExpression expressions.SQLExpression, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) Expression[T] { + valuesAny := pie.Map(values, func(value T) any { + return value + }) + + return &MultivalueExpression[T]{ + Values: valuesAny, + SQLExpression: expressions.ToSQL[sqlExpression], + SQLConnector: sqlConnector, + SQLPrefix: sqlPrefix, + SQLSuffix: sqlSuffix, + } +} diff --git a/badorm/mysql/array.go b/badorm/mysql/array.go index 203024c8..0305a2b1 100644 --- a/badorm/mysql/array.go +++ b/badorm/mysql/array.go @@ -3,16 +3,15 @@ package mysql import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/expressions" - "github.com/ditrit/badaas/badorm/multivalue" ) // Row and Array Comparisons // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in func ArrayIn[T any](values ...T) badorm.Expression[T] { - return multivalue.NewMultivalueExpression(expressions.ArrayIn, ",", "(", ")", values...) + return badorm.NewMultivalueExpression(expressions.ArrayIn, ",", "(", ")", values...) } func ArrayNotIn[T any](values ...T) badorm.Expression[T] { - return multivalue.NewMultivalueExpression(expressions.ArrayNotIn, ",", "(", ")", values...) + return badorm.NewMultivalueExpression(expressions.ArrayNotIn, ",", "(", ")", values...) } diff --git a/badorm/operators.go b/badorm/operators.go new file mode 100644 index 00000000..2d412b81 --- /dev/null +++ b/badorm/operators.go @@ -0,0 +1,234 @@ +package badorm + +import ( + "database/sql" + "database/sql/driver" + "errors" + "reflect" + + "github.com/elliotchance/pie/v2" + + "github.com/ditrit/badaas/badorm/expressions" +) + +var ErrNotRelated = errors.New("value type not related with T") + +// Comparison Operators +// refs: +// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// - PostgreSQL: https://www.postgresql.org/docs/current/functions-comparison.html +// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 +// - SQLite: https://www.sqlite.org/lang_expr.html + +// EqualTo +// EqOrIsNull must be used in cases where value can be NULL +func Eq[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, expressions.Eq) +} + +// if value is not NULL returns a Eq expression +// but if value is NULL returns a IsNull expression +// this must be used because ANSI SQL-92 standard defines: +// NULL = NULL evaluates to unknown, which is later considered a false +// +// this behavior can be also avoided in other ways: +// - in SQLServer you can: +// ** set ansi_nulls setting to off and use sqlserver.EqNullable +// ** use the IS NOT DISTINCT operator (implemented in IsNotDistinct) +// - in MySQL you can use the equal_to operator (implemented in mysql.IsEqual) +// - in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) +// - in SQLite you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) +func EqOrIsNull[T any](value any) Expression[T] { + return expressionFromValueOrNil[T](value, Eq[T], IsNull[T]()) +} + +// NotEqualTo +// NotEqOrNotIsNull must be used in cases where value can be NULL +func NotEq[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, expressions.NotEq) +} + +// if value is not NULL returns a NotEq expression +// but if value is NULL returns a IsNotNull expression +// this must be used because ANSI SQL-92 standard defines: +// NULL = NULL evaluates to unknown, which is later considered a false +// +// this behavior can be also avoided in other ways: +// - in SQLServer you can: +// ** set ansi_nulls setting to off and use sqlserver.NotEqNullable +// ** use the IS DISTINCT operator (implemented in IsDistinct) +// - in PostgreSQL you can use the IS DISTINCT operator (implemented in IsDistinct) +// - in SQLite you can use the IS DISTINCT operator (implemented in IsDistinct) +func NotEqOrIsNotNull[T any](value any) Expression[T] { + return expressionFromValueOrNil[T](value, NotEq[T], IsNotNull[T]()) +} + +func expressionFromValueOrNil[T any](value any, notNilFunc func(T) Expression[T], nilExpression Expression[T]) Expression[T] { + if value == nil { + return nilExpression + } + + valueTPointer, isTPointer := value.(*T) + if isTPointer { + if valueTPointer == nil { + return nilExpression + } + + return notNilFunc(*valueTPointer) + } + + valueT, isT := value.(T) + if isT { + if mapsToNull(value) { + return nilExpression + } + + return notNilFunc(valueT) + } + + return NewInvalidExpression[T](ErrNotRelated) +} + +func mapsToNull(value any) bool { + reflectVal := reflect.ValueOf(value) + isNullableKind := pie.Contains(nullableKinds, reflectVal.Kind()) + // avoid nil is not nil behavior of go + if isNullableKind && reflectVal.IsNil() { + return true + } + + valuer, isValuer := value.(driver.Valuer) + if isValuer { + valuerValue, err := valuer.Value() + if err == nil && valuerValue == nil { + return true + } + } + + return false +} + +// LessThan +func Lt[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, expressions.Lt) +} + +// LessThanOrEqualTo +func LtOrEq[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, expressions.LtOrEq) +} + +// GreaterThan +func Gt[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, expressions.Gt) +} + +// GreaterThanOrEqualTo +func GtOrEq[T any](value T) Expression[T] { + return NewCantBeNullValueExpression[T](value, expressions.GtOrEq) +} + +// Comparison Predicates +// refs: +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE + +func IsNull[T any]() PredicateExpression[T] { + return NewPredicateExpression[T]("IS NULL") +} + +func IsNotNull[T any]() PredicateExpression[T] { + return NewPredicateExpression[T]("IS NOT NULL") +} + +// Equivalent to v1 < value < v2 +func Between[T any](v1 T, v2 T) Expression[T] { + return NewMultivalueExpression(expressions.Between, "AND", "", "", v1, v2) +} + +// Equivalent to NOT (v1 < value < v2) +func NotBetween[T any](v1 T, v2 T) Expression[T] { + return NewMultivalueExpression(expressions.NotBetween, "AND", "", "", v1, v2) +} + +// Boolean Comparison Predicates + +// Not supported by: sqlserver +func IsTrue[T bool | sql.NullBool]() PredicateExpression[T] { + return NewPredicateExpression[T]("IS TRUE") +} + +// Not supported by: sqlserver +func IsNotTrue[T bool | sql.NullBool]() PredicateExpression[T] { + return NewPredicateExpression[T]("IS NOT TRUE") +} + +// Not supported by: sqlserver +func IsFalse[T bool | sql.NullBool]() PredicateExpression[T] { + return NewPredicateExpression[T]("IS FALSE") +} + +// Not supported by: sqlserver +func IsNotFalse[T bool | sql.NullBool]() PredicateExpression[T] { + return NewPredicateExpression[T]("IS NOT FALSE") +} + +// Not supported by: sqlserver, sqlite +func IsUnknown[T bool | sql.NullBool]() PredicateExpression[T] { + return NewPredicateExpression[T]("IS UNKNOWN") +} + +// Not supported by: sqlserver, sqlite +func IsNotUnknown[T bool | sql.NullBool]() PredicateExpression[T] { + return NewPredicateExpression[T]("IS NOT UNKNOWN") +} + +// Not supported by: mysql +func IsDistinct[T any](value T) ValueExpression[T] { + return NewValueExpression[T](value, expressions.IsDistinct) +} + +// Not supported by: mysql +func IsNotDistinct[T any](value T) ValueExpression[T] { + return NewValueExpression[T](value, expressions.IsNotDistinct) +} + +// Pattern Matching + +type LikeExpression[T string | sql.NullString] struct { + ValueExpression[T] +} + +func NewLikeExpression[T string | sql.NullString](pattern string, sqlExpression expressions.SQLExpression) LikeExpression[T] { + return LikeExpression[T]{ + ValueExpression: NewValueExpression[T](pattern, sqlExpression), + } +} + +func (expr LikeExpression[T]) Escape(escape rune) ValueExpression[T] { + return expr.AddSQLExpression(string(escape), expressions.Escape) +} + +// Pattern in all databases: +// - An underscore (_) in pattern stands for (matches) any single character. +// - A percent sign (%) matches any sequence of zero or more characters. +// +// Additionally in SQLServer: +// - Square brackets ([ ]) matches any single character within the specified range ([a-f]) or set ([abcdef]). +// - [^] matches any single character not within the specified range ([^a-f]) or set ([^abcdef]). +// +// WARNINGS: +// - SQLite: LIKE is case-insensitive unless case_sensitive_like pragma (https://www.sqlite.org/pragma.html#pragma_case_sensitive_like) is true. +// - SQLServer, MySQL: the case-sensitivity depends on the collation used in compared column. +// - PostgreSQL: LIKE is always case-sensitive, if you want case-insensitive use the ILIKE operator (implemented in psql.ILike) +// +// refs: +// - mysql: https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like +// - postgresql: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE +// - sqlserver: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver16 +// - sqlite: https://www.sqlite.org/lang_expr.html#like +func Like[T string | sql.NullString](pattern string) LikeExpression[T] { + return NewLikeExpression[T](pattern, expressions.Like) +} + +// TODO Subquery Expressions diff --git a/badorm/valueExpression.go b/badorm/valueExpression.go new file mode 100644 index 00000000..0f015eb3 --- /dev/null +++ b/badorm/valueExpression.go @@ -0,0 +1,114 @@ +package badorm + +import ( + "database/sql" + "errors" + "fmt" + "reflect" + "regexp" + + "github.com/ditrit/badaas/badorm/expressions" +) + +// TODO ponerles mas informacion precisa a los errores +var ( + ErrFieldModelNotConcerned = errors.New("field's model is not concerned by the query so it can't be used in a expression") + ErrJoinMustBeSelected = errors.New("table is joined more than once, select which one you want to use") +) +var ErrValueCantBeNull = errors.New("value to compare can't be null") + +const UndefinedJoinNumber = -1 + +// Expression that compares the value of the column against a fixed value +// If ExpressionsAndValues has multiple entries, comparisons will be nested +// Example (single): value = v1 +// Example (multi): value LIKE v1 ESCAPE v2 +type ValueExpression[T any] struct { + SQLExpressions []SQLExpressionAndValue + JoinNumber int +} + +type SQLExpressionAndValue struct { + SQL string + Field IFieldIdentifier + Value any +} + +func (expr ValueExpression[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Expression[T] +} + +func (expr *ValueExpression[T]) SelectJoin(joinNumber uint) DynamicExpression[T] { + expr.JoinNumber = int(joinNumber) + return expr +} + +func (expr *ValueExpression[T]) AddSQLExpression(value any, sqlExpression expressions.SQLExpression) ValueExpression[T] { + expr.SQLExpressions = append( + expr.SQLExpressions, + SQLExpressionAndValue{ + Value: value, + SQL: expressions.ToSQL[sqlExpression], + }, + ) + + return *expr +} + +// verificar que en las condiciones anteriores alguien usó el field con el que se intenta comparar +// obtener de ahi cual es el nombre de la table a usar con ese field. +// TODO doc a ingles +func (expr ValueExpression[T]) ToSQL(query *Query, columnName string) (string, []any, error) { + exprString := columnName + values := []any{} + + for _, sqlExpr := range expr.SQLExpressions { + if sqlExpr.Field != nil { + modelTable, err := getModelTable(query, sqlExpr.Field, expr.JoinNumber) + if err != nil { + return "", nil, err + } + + exprString += fmt.Sprintf( + " "+sqlExpr.SQL+" %s", + sqlExpr.Field.ColumnSQL(query, modelTable), + ) + } else { + exprString += " " + sqlExpr.SQL + " ?" + values = append(values, sqlExpr.Value) + } + } + + return exprString, values, nil +} + +func NewValueExpression[T any](value any, sqlExpression expressions.SQLExpression) ValueExpression[T] { + expr := &ValueExpression[T]{} + + return expr.AddSQLExpression(value, sqlExpression) +} + +var nullableKinds = []reflect.Kind{ + reflect.Chan, reflect.Func, + reflect.Map, reflect.Pointer, + reflect.UnsafePointer, reflect.Interface, + reflect.Slice, +} + +func NewCantBeNullValueExpression[T any](value any, sqlExpression expressions.SQLExpression) Expression[T] { + if value == nil || mapsToNull(value) { + return NewInvalidExpression[T](ErrValueCantBeNull) + } + + return NewValueExpression[T](value, sqlExpression) +} + +func NewMustBePOSIXValueExpression[T string | sql.NullString](pattern string, sqlExpression expressions.SQLExpression) Expression[T] { + _, err := regexp.CompilePOSIX(pattern) + if err != nil { + return NewInvalidExpression[T](err) + } + + return NewValueExpression[T](pattern, sqlExpression) +} diff --git a/testintegration/expressions_test.go b/testintegration/expressions_test.go index 6b713d52..ef54cdb1 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/expressions_test.go @@ -10,7 +10,6 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/dynamic" "github.com/ditrit/badaas/badorm/multitype" - "github.com/ditrit/badaas/badorm/multivalue" "github.com/ditrit/badaas/badorm/mysql" "github.com/ditrit/badaas/badorm/psql" "github.com/ditrit/badaas/badorm/sqlite" @@ -365,7 +364,7 @@ func (ts *ExpressionIntTestSuite) TestBetween() { entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - multivalue.Between(3, 5), + badorm.Between(3, 5), ), ) ts.Nil(err) @@ -381,7 +380,7 @@ func (ts *ExpressionIntTestSuite) TestNotBetween() { entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - multivalue.NotBetween(0, 2), + badorm.NotBetween(0, 2), ), ) ts.Nil(err) diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 4cf4fbd7..b324b0bf 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -414,7 +414,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionJoinMoreThanOnceWitho ), conditions.ChildId(dynamic.Eq(conditions.ParentParentIdField)), ) - ts.ErrorIs(err, dynamic.ErrJoinMustBeSelected) + ts.ErrorIs(err, badorm.ErrJoinMustBeSelected) } func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionJoinMoreThanOnceWithSelectJoin() { From dc99fade59550920d9ff2fd95483f23b1f808f09 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 5 Jul 2023 18:13:10 +0200 Subject: [PATCH 424/467] refactor: expression to operator --- badorm/condition.go | 6 +- badorm/dynamic/expression.go | 108 -------- badorm/dynamic/multivalue.go | 27 ++ badorm/dynamic/operators.go | 71 +++++ badorm/dynamic/value.go | 25 ++ badorm/expression.go | 68 ----- badorm/multitype/expression.go | 171 ------------ badorm/multitype/multivalue.go | 40 +++ badorm/multitype/operators.go | 71 +++++ badorm/multitype/value.go | 72 +++++ ...lueExpression.go => multivalueOperator.go} | 44 ++- badorm/mysql/array.go | 10 +- badorm/mysql/comparison.go | 14 +- badorm/operator.go | 69 +++++ badorm/operators.go | 120 ++++---- badorm/psql/array.go | 4 +- badorm/psql/comparison.go | 18 +- badorm/shared/array.go | 10 +- .../sqlExpressions.go => sql/operators.go} | 12 +- badorm/sqlite/array.go | 4 +- badorm/sqlite/comparison.go | 6 +- badorm/sqlserver/array.go | 4 +- badorm/sqlserver/comparison.go | 18 +- badorm/valueExpression.go | 114 -------- badorm/valueOperator.go | 116 ++++++++ mocks/badorm/Expression.go | 63 ----- persistence/models/User.go | 4 +- testintegration/badorm_test.go | 6 +- .../conditions/bicycle_conditions.go | 24 +- .../conditions/brand_conditions.go | 20 +- .../conditions/child_conditions.go | 28 +- testintegration/conditions/city_conditions.go | 24 +- .../conditions/company_conditions.go | 20 +- .../conditions/country_conditions.go | 20 +- .../conditions/employee_conditions.go | 24 +- .../conditions/parent1_conditions.go | 20 +- .../conditions/parent2_conditions.go | 20 +- .../conditions/parent_parent_conditions.go | 20 +- .../conditions/person_conditions.go | 20 +- .../conditions/phone_conditions.go | 24 +- .../conditions/product_conditions.go | 60 ++-- testintegration/conditions/sale_conditions.go | 32 +-- .../conditions/seller_conditions.go | 28 +- .../conditions/university_conditions.go | 20 +- ...{expressions_test.go => operators_test.go} | 258 +++++++++--------- testintegration/where_conditions_test.go | 10 +- tools/badctl/cmd/gen/conditions/condition.go | 6 +- tools/badctl/cmd/gen/conditions/jenParam.go | 4 +- 48 files changed, 973 insertions(+), 1004 deletions(-) delete mode 100644 badorm/dynamic/expression.go create mode 100644 badorm/dynamic/multivalue.go create mode 100644 badorm/dynamic/operators.go create mode 100644 badorm/dynamic/value.go delete mode 100644 badorm/expression.go delete mode 100644 badorm/multitype/expression.go create mode 100644 badorm/multitype/multivalue.go create mode 100644 badorm/multitype/operators.go create mode 100644 badorm/multitype/value.go rename badorm/{multivalueExpression.go => multivalueOperator.go} (52%) create mode 100644 badorm/operator.go rename badorm/{expressions/sqlExpressions.go => sql/operators.go} (88%) delete mode 100644 badorm/valueExpression.go create mode 100644 badorm/valueOperator.go delete mode 100644 mocks/badorm/Expression.go rename testintegration/{expressions_test.go => operators_test.go} (78%) diff --git a/badorm/condition.go b/badorm/condition.go index b83aeec8..237dc40f 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -223,10 +223,10 @@ func NewCollectionPreloadCondition[T1 Model, T2 Model](collectionField string, n } // Condition that verifies the value of a field, -// using the Expression +// using the Operator type FieldCondition[TObject Model, TAtribute any] struct { FieldIdentifier FieldIdentifier[TAtribute] - Expression Expression[TAtribute] + Operator Operator[TAtribute] } //nolint:unused // see inside @@ -265,7 +265,7 @@ func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { } func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *Query, table Table) (string, []any, error) { - return condition.Expression.ToSQL( + return condition.Operator.ToSQL( query, condition.FieldIdentifier.ColumnSQL(query, table), ) diff --git a/badorm/dynamic/expression.go b/badorm/dynamic/expression.go deleted file mode 100644 index adfe365f..00000000 --- a/badorm/dynamic/expression.go +++ /dev/null @@ -1,108 +0,0 @@ -package dynamic - -import ( - "github.com/elliotchance/pie/v2" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/expressions" -) - -func newValueExpression[T any](expression expressions.SQLExpression, field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo - // TODO que pasa si hay mas de uno, no se si me gusta mucho esto - // creo que si hay mas de uno solo se tendria que aplicar en el primero, - // TODO soportar multivalue, no todos necesariamente dinamicos - return &badorm.ValueExpression[T]{ - SQLExpressions: []badorm.SQLExpressionAndValue{ - { - SQL: expressions.ToSQL[expression], - Field: field, - }, - }, - JoinNumber: badorm.UndefinedJoinNumber, - } -} - -func newMultivalueExpression[T any]( - sqlExpression expressions.SQLExpression, - sqlConnector, sqlPrefix, sqlSuffix string, - fields ...badorm.FieldIdentifier[T], -) badorm.DynamicExpression[T] { - values := pie.Map(fields, func(field badorm.FieldIdentifier[T]) any { - return field - }) - - return &badorm.MultivalueExpression[T]{ - Values: values, - SQLExpression: expressions.ToSQL[sqlExpression], - SQLConnector: sqlConnector, - SQLPrefix: sqlPrefix, - SQLSuffix: sqlSuffix, - JoinNumber: badorm.UndefinedJoinNumber, - } -} - -// Comparison Operators -// refs: -// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html -// - PostgreSQL: https://www.postgresql.org/docs/current/functions-comparison.html -// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 -// - SQLite: https://www.sqlite.org/lang_expr.html - -// EqualTo -func Eq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newValueExpression(expressions.Eq, field) -} - -// NotEqualTo -func NotEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newValueExpression(expressions.NotEq, field) -} - -// LessThan -func Lt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newValueExpression(expressions.Lt, field) -} - -// LessThanOrEqualTo -func LtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newValueExpression(expressions.LtOrEq, field) -} - -// GreaterThan -func Gt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - // TODO invertir orden de parametros para que quede igual que en badorm/expression - return newValueExpression(expressions.Gt, field) -} - -// GreaterThanOrEqualTo -func GtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newValueExpression(expressions.GtOrEq, field) -} - -// Comparison Predicates -// refs: -// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html -// https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE - -// Equivalent to field1 < value < field2 -func Between[T any](field1 badorm.FieldIdentifier[T], field2 badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newMultivalueExpression(expressions.Between, "AND", "", "", field1, field2) -} - -// Equivalent to NOT (field1 < value < field2) -func NotBetween[T any](field1 badorm.FieldIdentifier[T], field2 badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newMultivalueExpression(expressions.NotBetween, "AND", "", "", field1, field2) -} - -// Boolean Comparison Predicates - -// Not supported by: mysql -func IsDistinct[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newValueExpression(expressions.IsDistinct, field) -} - -// Not supported by: mysql -func IsNotDistinct[T any](field badorm.FieldIdentifier[T]) badorm.DynamicExpression[T] { - return newValueExpression(expressions.IsNotDistinct, field) -} diff --git a/badorm/dynamic/multivalue.go b/badorm/dynamic/multivalue.go new file mode 100644 index 00000000..1a569ae3 --- /dev/null +++ b/badorm/dynamic/multivalue.go @@ -0,0 +1,27 @@ +package dynamic + +import ( + "github.com/elliotchance/pie/v2" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" +) + +func newMultivalueOperator[T any]( + sqlOperator sql.Operator, + sqlConnector, sqlPrefix, sqlSuffix string, + fields ...badorm.FieldIdentifier[T], +) badorm.DynamicOperator[T] { + values := pie.Map(fields, func(field badorm.FieldIdentifier[T]) any { + return field + }) + + return &badorm.MultivalueOperator[T]{ + Values: values, + SQLOperator: sqlOperator, + SQLConnector: sqlConnector, + SQLPrefix: sqlPrefix, + SQLSuffix: sqlSuffix, + JoinNumber: badorm.UndefinedJoinNumber, + } +} diff --git a/badorm/dynamic/operators.go b/badorm/dynamic/operators.go new file mode 100644 index 00000000..f8f77649 --- /dev/null +++ b/badorm/dynamic/operators.go @@ -0,0 +1,71 @@ +package dynamic + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" +) + +// Comparison Operators +// refs: +// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// - PostgreSQL: https://www.postgresql.org/docs/current/functions-comparison.html +// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 +// - SQLite: https://www.sqlite.org/lang_expr.html + +// EqualTo +func Eq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return newValueOperator(sql.Eq, field) +} + +// NotEqualTo +func NotEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return newValueOperator(sql.NotEq, field) +} + +// LessThan +func Lt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return newValueOperator(sql.Lt, field) +} + +// LessThanOrEqualTo +func LtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return newValueOperator(sql.LtOrEq, field) +} + +// GreaterThan +func Gt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + // TODO invertir orden de parametros para que quede igual que en badorm/expression + return newValueOperator(sql.Gt, field) +} + +// GreaterThanOrEqualTo +func GtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return newValueOperator(sql.GtOrEq, field) +} + +// Comparison Predicates +// refs: +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE + +// Equivalent to field1 < value < field2 +func Between[T any](field1 badorm.FieldIdentifier[T], field2 badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return newMultivalueOperator(sql.Between, "AND", "", "", field1, field2) +} + +// Equivalent to NOT (field1 < value < field2) +func NotBetween[T any](field1 badorm.FieldIdentifier[T], field2 badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return newMultivalueOperator(sql.NotBetween, "AND", "", "", field1, field2) +} + +// Boolean Comparison Predicates + +// Not supported by: mysql +func IsDistinct[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return newValueOperator(sql.IsDistinct, field) +} + +// Not supported by: mysql +func IsNotDistinct[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return newValueOperator(sql.IsNotDistinct, field) +} diff --git a/badorm/dynamic/value.go b/badorm/dynamic/value.go new file mode 100644 index 00000000..956c6f6d --- /dev/null +++ b/badorm/dynamic/value.go @@ -0,0 +1,25 @@ +package dynamic + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" +) + +func newValueOperator[T any]( + sqlOperator sql.Operator, + field badorm.FieldIdentifier[T], +) badorm.DynamicOperator[T] { + // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo + // TODO que pasa si hay mas de uno, no se si me gusta mucho esto + // creo que si hay mas de uno solo se tendria que aplicar en el primero, + // TODO soportar multivalue, no todos necesariamente dinamicos + return &badorm.ValueOperator[T]{ + Operations: []badorm.Operation{ + { + SQLOperator: sqlOperator, + Field: field, + }, + }, + JoinNumber: badorm.UndefinedJoinNumber, + } +} diff --git a/badorm/expression.go b/badorm/expression.go deleted file mode 100644 index 64892478..00000000 --- a/badorm/expression.go +++ /dev/null @@ -1,68 +0,0 @@ -package badorm - -import ( - "fmt" -) - -type Expression[T any] interface { - // Transform the Expression to a SQL string and a list of values to use in the query - // columnName is used by the expression to determine which is the objective column. - ToSQL(query *Query, columnName string) (string, []any, error) - - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T], - // since if no method receives by parameter a type T, - // any other Expression[T2] would also be considered a Expression[T]. - InterfaceVerificationMethod(T) -} - -type DynamicExpression[T any] interface { - Expression[T] - - SelectJoin(joinNumber uint) DynamicExpression[T] -} - -// Expression that verifies a predicate -// Example: value IS TRUE -type PredicateExpression[T any] struct { - SQLExpression string -} - -func (expr PredicateExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func (expr PredicateExpression[T]) ToSQL(_ *Query, columnName string) (string, []any, error) { - return fmt.Sprintf("%s %s", columnName, expr.SQLExpression), []any{}, nil -} - -func NewPredicateExpression[T any](sqlExpression string) PredicateExpression[T] { - return PredicateExpression[T]{ - SQLExpression: sqlExpression, - } -} - -// Expression used to return an error -type InvalidExpression[T any] struct { - Err error -} - -func (expr InvalidExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func (expr InvalidExpression[T]) SelectJoin(joinNumber uint) DynamicExpression[T] { - return expr -} - -func (expr InvalidExpression[T]) ToSQL(_ *Query, _ string) (string, []any, error) { - return "", nil, expr.Err -} - -func NewInvalidExpression[T any](err error) InvalidExpression[T] { - return InvalidExpression[T]{ - Err: err, - } -} diff --git a/badorm/multitype/expression.go b/badorm/multitype/expression.go deleted file mode 100644 index 8f4b7a8c..00000000 --- a/badorm/multitype/expression.go +++ /dev/null @@ -1,171 +0,0 @@ -package multitype - -import ( - "database/sql" - "errors" - "reflect" - - "github.com/elliotchance/pie/v2" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/expressions" -) - -// TODO ponerles mas informacion precisa a los errores -var ( - ErrFieldTypeDoesNotMatch = errors.New("field type does not match expression type") - ErrParamsNotValueOrField = errors.New("parameter is neither a value or a field") -) - -var nullableTypes = []reflect.Type{ - reflect.TypeOf(sql.NullBool{}), - reflect.TypeOf(sql.NullByte{}), - reflect.TypeOf(sql.NullFloat64{}), - reflect.TypeOf(sql.NullInt16{}), - reflect.TypeOf(sql.NullInt32{}), - reflect.TypeOf(sql.NullInt64{}), - reflect.TypeOf(sql.NullString{}), - reflect.TypeOf(sql.NullTime{}), - reflect.TypeOf(gorm.DeletedAt{}), -} - -func isNullable(fieldType reflect.Type) bool { - return pie.Contains(nullableTypes, fieldType) -} - -func verifyFieldType[TAttribute, TField any]() badorm.DynamicExpression[TAttribute] { - expressionType := reflect.TypeOf(*new(TAttribute)) - fieldType := reflect.TypeOf(*new(TField)) - - if fieldType != expressionType && - !((isNullable(fieldType) && fieldType.Field(0).Type == expressionType) || - (isNullable(expressionType) && expressionType.Field(0).Type == fieldType)) { - return badorm.NewInvalidExpression[TAttribute](ErrFieldTypeDoesNotMatch) - } - - return nil -} - -func newValueExpression[TAttribute, TField any]( - expression expressions.SQLExpression, - field badorm.FieldIdentifier[TField], -) badorm.DynamicExpression[TAttribute] { - invalidExpression := verifyFieldType[TAttribute, TField]() - if invalidExpression != nil { - return invalidExpression - } - - // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo - // TODO que pasa si hay mas de uno, no se si me gusta mucho esto - // creo que si hay mas de uno solo se tendria que aplicar en el primero, - // TODO soportar multivalue, no todos necesariamente dinamicos - return &badorm.ValueExpression[TAttribute]{ - SQLExpressions: []badorm.SQLExpressionAndValue{ - { - SQL: expressions.ToSQL[expression], - Field: field, - }, - }, - JoinNumber: badorm.UndefinedJoinNumber, - } -} - -func newMultivalueExpression[TAttribute, TField any]( - sqlExpression expressions.SQLExpression, - sqlConnector, sqlPrefix, sqlSuffix string, - values ...any, -) badorm.DynamicExpression[TAttribute] { - for _, value := range values { - _, isT1 := value.(TAttribute) - if isT1 { - continue - } - - _, isField := value.(badorm.FieldIdentifier[TField]) - if isField { - invalidExpression := verifyFieldType[TAttribute, TField]() - if invalidExpression != nil { - return invalidExpression - } - - continue - } - - return badorm.NewInvalidExpression[TAttribute](ErrParamsNotValueOrField) - } - - return &badorm.MultivalueExpression[TAttribute]{ - Values: values, - SQLExpression: expressions.ToSQL[sqlExpression], - SQLConnector: sqlConnector, - SQLPrefix: sqlPrefix, - SQLSuffix: sqlSuffix, - JoinNumber: badorm.UndefinedJoinNumber, - } -} - -// Comparison Operators -// refs: -// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html -// - PostgreSQL: https://www.postgresql.org/docs/current/functions-comparison.html -// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 -// - SQLite: https://www.sqlite.org/lang_expr.html - -// EqualTo -func Eq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { - return newValueExpression[TAttribute, TField](expressions.Eq, field) -} - -// NotEqualTo -func NotEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { - return newValueExpression[TAttribute, TField](expressions.NotEq, field) -} - -// LessThan -func Lt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { - return newValueExpression[TAttribute, TField](expressions.Lt, field) -} - -// LessThanOrEqualTo -func LtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { - return newValueExpression[TAttribute, TField](expressions.LtOrEq, field) -} - -// GreaterThan -func Gt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { - // TODO invertir orden de parametros para que quede igual que en badorm/expression - return newValueExpression[TAttribute, TField](expressions.Gt, field) -} - -// GreaterThanOrEqualTo -func GtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { - return newValueExpression[TAttribute, TField](expressions.GtOrEq, field) -} - -// Comparison Predicates -// refs: -// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html -// https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE - -// Equivalent to v1 < value < v2 -func Between[TAttribute, TField any](v1 any, v2 any) badorm.DynamicExpression[TAttribute] { - return newMultivalueExpression[TAttribute, TField](expressions.Between, "AND", "", "", v1, v2) -} - -// Equivalent to NOT (field1 < value < field2) -func NotBetween[TAttribute, TField any](v1 any, v2 any) badorm.DynamicExpression[TAttribute] { - return newMultivalueExpression[TAttribute, TField](expressions.NotBetween, "AND", "", "", v1, v2) -} - -// Boolean Comparison Predicates - -// Not supported by: mysql -func IsDistinct[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { - return newValueExpression[TAttribute, TField](expressions.IsDistinct, field) -} - -// Not supported by: mysql -func IsNotDistinct[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicExpression[TAttribute] { - return newValueExpression[TAttribute, TField](expressions.IsNotDistinct, field) -} diff --git a/badorm/multitype/multivalue.go b/badorm/multitype/multivalue.go new file mode 100644 index 00000000..9cb0f783 --- /dev/null +++ b/badorm/multitype/multivalue.go @@ -0,0 +1,40 @@ +package multitype + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" +) + +func newMultivalueOperator[TAttribute, TField any]( + sqlOperator sql.Operator, + sqlConnector, sqlPrefix, sqlSuffix string, + values ...any, +) badorm.DynamicOperator[TAttribute] { + for _, value := range values { + _, isT1 := value.(TAttribute) + if isT1 { + continue + } + + _, isField := value.(badorm.FieldIdentifier[TField]) + if isField { + invalidOperator := verifyFieldType[TAttribute, TField]() + if invalidOperator != nil { + return invalidOperator + } + + continue + } + + return badorm.NewInvalidOperator[TAttribute](ErrParamsNotValueOrField) + } + + return &badorm.MultivalueOperator[TAttribute]{ + Values: values, + SQLOperator: sqlOperator, + SQLConnector: sqlConnector, + SQLPrefix: sqlPrefix, + SQLSuffix: sqlSuffix, + JoinNumber: badorm.UndefinedJoinNumber, + } +} diff --git a/badorm/multitype/operators.go b/badorm/multitype/operators.go new file mode 100644 index 00000000..41909c5d --- /dev/null +++ b/badorm/multitype/operators.go @@ -0,0 +1,71 @@ +package multitype + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" +) + +// Comparison Operators +// refs: +// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// - PostgreSQL: https://www.postgresql.org/docs/current/functions-comparison.html +// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 +// - SQLite: https://www.sqlite.org/lang_expr.html + +// EqualTo +func Eq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + return newValueOperator[TAttribute, TField](sql.Eq, field) +} + +// NotEqualTo +func NotEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + return newValueOperator[TAttribute, TField](sql.NotEq, field) +} + +// LessThan +func Lt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + return newValueOperator[TAttribute, TField](sql.Lt, field) +} + +// LessThanOrEqualTo +func LtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + return newValueOperator[TAttribute, TField](sql.LtOrEq, field) +} + +// GreaterThan +func Gt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + // TODO invertir orden de parametros para que quede igual que en badorm/expression + return newValueOperator[TAttribute, TField](sql.Gt, field) +} + +// GreaterThanOrEqualTo +func GtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + return newValueOperator[TAttribute, TField](sql.GtOrEq, field) +} + +// Comparison Predicates +// refs: +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE + +// Equivalent to v1 < value < v2 +func Between[TAttribute, TField any](v1 any, v2 any) badorm.DynamicOperator[TAttribute] { + return newMultivalueOperator[TAttribute, TField](sql.Between, "AND", "", "", v1, v2) +} + +// Equivalent to NOT (field1 < value < field2) +func NotBetween[TAttribute, TField any](v1 any, v2 any) badorm.DynamicOperator[TAttribute] { + return newMultivalueOperator[TAttribute, TField](sql.NotBetween, "AND", "", "", v1, v2) +} + +// Boolean Comparison Predicates + +// Not supported by: mysql +func IsDistinct[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + return newValueOperator[TAttribute, TField](sql.IsDistinct, field) +} + +// Not supported by: mysql +func IsNotDistinct[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + return newValueOperator[TAttribute, TField](sql.IsNotDistinct, field) +} diff --git a/badorm/multitype/value.go b/badorm/multitype/value.go new file mode 100644 index 00000000..ecee69ef --- /dev/null +++ b/badorm/multitype/value.go @@ -0,0 +1,72 @@ +package multitype + +import ( + "database/sql" + "errors" + "reflect" + + "github.com/elliotchance/pie/v2" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + badormSQL "github.com/ditrit/badaas/badorm/sql" +) + +// TODO ponerles mas informacion precisa a los errores +var ( + ErrFieldTypeDoesNotMatch = errors.New("field type does not match operator type") + ErrParamsNotValueOrField = errors.New("parameter is neither a value or a field") +) + +var nullableTypes = []reflect.Type{ + reflect.TypeOf(sql.NullBool{}), + reflect.TypeOf(sql.NullByte{}), + reflect.TypeOf(sql.NullFloat64{}), + reflect.TypeOf(sql.NullInt16{}), + reflect.TypeOf(sql.NullInt32{}), + reflect.TypeOf(sql.NullInt64{}), + reflect.TypeOf(sql.NullString{}), + reflect.TypeOf(sql.NullTime{}), + reflect.TypeOf(gorm.DeletedAt{}), +} + +func isNullable(fieldType reflect.Type) bool { + return pie.Contains(nullableTypes, fieldType) +} + +func verifyFieldType[TAttribute, TField any]() badorm.DynamicOperator[TAttribute] { + attributeType := reflect.TypeOf(*new(TAttribute)) + fieldType := reflect.TypeOf(*new(TField)) + + if fieldType != attributeType && + !((isNullable(fieldType) && fieldType.Field(0).Type == attributeType) || + (isNullable(attributeType) && attributeType.Field(0).Type == fieldType)) { + return badorm.NewInvalidOperator[TAttribute](ErrFieldTypeDoesNotMatch) + } + + return nil +} + +func newValueOperator[TAttribute, TField any]( + sqlOperator badormSQL.Operator, + field badorm.FieldIdentifier[TField], +) badorm.DynamicOperator[TAttribute] { + invalidOperator := verifyFieldType[TAttribute, TField]() + if invalidOperator != nil { + return invalidOperator + } + + // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo + // TODO que pasa si hay mas de uno, no se si me gusta mucho esto + // creo que si hay mas de uno solo se tendria que aplicar en el primero, + // TODO soportar multivalue, no todos necesariamente dinamicos + return &badorm.ValueOperator[TAttribute]{ + Operations: []badorm.Operation{ + { + SQLOperator: sqlOperator, + Field: field, + }, + }, + JoinNumber: badorm.UndefinedJoinNumber, + } +} diff --git a/badorm/multivalueExpression.go b/badorm/multivalueOperator.go similarity index 52% rename from badorm/multivalueExpression.go rename to badorm/multivalueOperator.go index 3362d8e1..a3dd9167 100644 --- a/badorm/multivalueExpression.go +++ b/badorm/multivalueOperator.go @@ -6,33 +6,31 @@ import ( "github.com/elliotchance/pie/v2" - "github.com/ditrit/badaas/badorm/expressions" + "github.com/ditrit/badaas/badorm/sql" ) -// Expression that compares the value of the column against multiple values +// Operator that compares the value of the column against multiple values // Example: value IN (v1, v2, v3, ..., vN) -type MultivalueExpression[T any] struct { - // TODO hacer el cambio de nombre en el anterior tambien? - // TODO con esto podria reemplazar el SQLExpressionAndValue para que todos sean por dentro dynamics - Values []any // the values to compare with - SQLExpression string // the expression used to compare, example: IN - SQLConnector string // the connector between values, example: ', ' - SQLPrefix string // something to put before the values, example: ( - SQLSuffix string // something to put after the values, example: ) - JoinNumber int +type MultivalueOperator[T any] struct { + Values []any // the values to compare with + SQLOperator sql.Operator // the operator used to compare, example: IN + SQLConnector string // the connector between values, example: ', ' + SQLPrefix string // something to put before the values, example: ( + SQLSuffix string // something to put after the values, example: ) + JoinNumber int } -func (expr MultivalueExpression[T]) InterfaceVerificationMethod(_ T) { +func (expr MultivalueOperator[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] + // that an object is of type Operator[T] } -func (expr *MultivalueExpression[T]) SelectJoin(joinNumber uint) DynamicExpression[T] { +func (expr *MultivalueOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { expr.JoinNumber = int(joinNumber) return expr } -func (expr MultivalueExpression[T]) ToSQL(query *Query, columnName string) (string, []any, error) { +func (expr MultivalueOperator[T]) ToSQL(query *Query, columnName string) (string, []any, error) { placeholderList := []string{} values := []any{} @@ -58,7 +56,7 @@ func (expr MultivalueExpression[T]) ToSQL(query *Query, columnName string) (stri return fmt.Sprintf( "%s %s %s"+placeholders+"%s", columnName, - expr.SQLExpression, + expr.SQLOperator, expr.SQLPrefix, expr.SQLSuffix, ), values, nil @@ -81,16 +79,16 @@ func getModelTable(query *Query, field IFieldIdentifier, joinNumber int) (Table, return modelTables[joinNumber], nil } -func NewMultivalueExpression[T any](sqlExpression expressions.SQLExpression, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) Expression[T] { +func NewMultivalueOperator[T any](sqlOperator sql.Operator, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) Operator[T] { valuesAny := pie.Map(values, func(value T) any { return value }) - return &MultivalueExpression[T]{ - Values: valuesAny, - SQLExpression: expressions.ToSQL[sqlExpression], - SQLConnector: sqlConnector, - SQLPrefix: sqlPrefix, - SQLSuffix: sqlSuffix, + return &MultivalueOperator[T]{ + Values: valuesAny, + SQLOperator: sqlOperator, + SQLConnector: sqlConnector, + SQLPrefix: sqlPrefix, + SQLSuffix: sqlSuffix, } } diff --git a/badorm/mysql/array.go b/badorm/mysql/array.go index 0305a2b1..62b83949 100644 --- a/badorm/mysql/array.go +++ b/badorm/mysql/array.go @@ -2,16 +2,16 @@ package mysql import ( "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/expressions" + "github.com/ditrit/badaas/badorm/sql" ) // Row and Array Comparisons // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in -func ArrayIn[T any](values ...T) badorm.Expression[T] { - return badorm.NewMultivalueExpression(expressions.ArrayIn, ",", "(", ")", values...) +func ArrayIn[T any](values ...T) badorm.Operator[T] { + return badorm.NewMultivalueOperator(sql.ArrayIn, ",", "(", ")", values...) } -func ArrayNotIn[T any](values ...T) badorm.Expression[T] { - return badorm.NewMultivalueExpression(expressions.ArrayNotIn, ",", "(", ")", values...) +func ArrayNotIn[T any](values ...T) badorm.Operator[T] { + return badorm.NewMultivalueOperator(sql.ArrayNotIn, ",", "(", ")", values...) } diff --git a/badorm/mysql/comparison.go b/badorm/mysql/comparison.go index 81b2f191..806685e0 100644 --- a/badorm/mysql/comparison.go +++ b/badorm/mysql/comparison.go @@ -4,15 +4,15 @@ import ( "database/sql" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/expressions" + badormSQL "github.com/ditrit/badaas/badorm/sql" ) // Comparison Predicates // preferred over eq // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal-to -func IsEqual[T any](value T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](value, expressions.MySQLIsEqual) +func IsEqual[T any](value T) badorm.ValueOperator[T] { + return badorm.NewValueOperator[T](value, badormSQL.MySQLIsEqual) } // Pattern Matching @@ -22,11 +22,11 @@ func Like[T string | sql.NullString | int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64](pattern string, -) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](pattern, expressions.Like) +) badorm.ValueOperator[T] { + return badorm.NewValueOperator[T](pattern, badormSQL.Like) } // ref: https://dev.mysql.com/doc/refman/8.0/en/regexp.html#operator_regexp -func RegexP[T string | sql.NullString](pattern string) badorm.Expression[T] { - return badorm.NewMustBePOSIXValueExpression[T](pattern, expressions.MySQLRegexp) +func RegexP[T string | sql.NullString](pattern string) badorm.Operator[T] { + return badorm.NewMustBePOSIXValueOperator[T](pattern, badormSQL.MySQLRegexp) } diff --git a/badorm/operator.go b/badorm/operator.go new file mode 100644 index 00000000..3e8816e4 --- /dev/null +++ b/badorm/operator.go @@ -0,0 +1,69 @@ +package badorm + +import ( + "fmt" +) + +type Operator[T any] interface { + // Transform the Operator to a SQL string and a list of values to use in the query + // columnName is used by the operator to determine which is the objective column. + ToSQL(query *Query, columnName string) (string, []any, error) + + // This method is necessary to get the compiler to verify + // that an object is of type Operator[T], + // since if no method receives by parameter a type T, + // any other Operator[T2] would also be considered a Operator[T]. + InterfaceVerificationMethod(T) +} + +type DynamicOperator[T any] interface { + Operator[T] + + SelectJoin(joinNumber uint) DynamicOperator[T] +} + +// Operator that verifies a predicate +// Example: value IS TRUE +type PredicateOperator[T any] struct { + // TODO pasar a sql.operator + SQLOperator string +} + +func (expr PredicateOperator[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Operator[T] +} + +func (expr PredicateOperator[T]) ToSQL(_ *Query, columnName string) (string, []any, error) { + return fmt.Sprintf("%s %s", columnName, expr.SQLOperator), []any{}, nil +} + +func NewPredicateOperator[T any](sqlOperator string) PredicateOperator[T] { + return PredicateOperator[T]{ + SQLOperator: sqlOperator, + } +} + +// Operator used to return an error +type InvalidOperator[T any] struct { + Err error +} + +func (expr InvalidOperator[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Operator[T] +} + +func (expr InvalidOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { + return expr +} + +func (expr InvalidOperator[T]) ToSQL(_ *Query, _ string) (string, []any, error) { + return "", nil, expr.Err +} + +func NewInvalidOperator[T any](err error) InvalidOperator[T] { + return InvalidOperator[T]{ + Err: err, + } +} diff --git a/badorm/operators.go b/badorm/operators.go index 2d412b81..6afb6001 100644 --- a/badorm/operators.go +++ b/badorm/operators.go @@ -8,7 +8,7 @@ import ( "github.com/elliotchance/pie/v2" - "github.com/ditrit/badaas/badorm/expressions" + badormSQL "github.com/ditrit/badaas/badorm/sql" ) var ErrNotRelated = errors.New("value type not related with T") @@ -22,12 +22,12 @@ var ErrNotRelated = errors.New("value type not related with T") // EqualTo // EqOrIsNull must be used in cases where value can be NULL -func Eq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.Eq) +func Eq[T any](value T) Operator[T] { + return NewCantBeNullValueOperator[T](value, badormSQL.Eq) } -// if value is not NULL returns a Eq expression -// but if value is NULL returns a IsNull expression +// if value is not NULL returns a Eq operator +// but if value is NULL returns a IsNull operator // this must be used because ANSI SQL-92 standard defines: // NULL = NULL evaluates to unknown, which is later considered a false // @@ -38,18 +38,18 @@ func Eq[T any](value T) Expression[T] { // - in MySQL you can use the equal_to operator (implemented in mysql.IsEqual) // - in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) // - in SQLite you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) -func EqOrIsNull[T any](value any) Expression[T] { - return expressionFromValueOrNil[T](value, Eq[T], IsNull[T]()) +func EqOrIsNull[T any](value any) Operator[T] { + return operatorFromValueOrNil[T](value, Eq[T], IsNull[T]()) } // NotEqualTo // NotEqOrNotIsNull must be used in cases where value can be NULL -func NotEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.NotEq) +func NotEq[T any](value T) Operator[T] { + return NewCantBeNullValueOperator[T](value, badormSQL.NotEq) } -// if value is not NULL returns a NotEq expression -// but if value is NULL returns a IsNotNull expression +// if value is not NULL returns a NotEq operator +// but if value is NULL returns a IsNotNull operator // this must be used because ANSI SQL-92 standard defines: // NULL = NULL evaluates to unknown, which is later considered a false // @@ -59,19 +59,19 @@ func NotEq[T any](value T) Expression[T] { // ** use the IS DISTINCT operator (implemented in IsDistinct) // - in PostgreSQL you can use the IS DISTINCT operator (implemented in IsDistinct) // - in SQLite you can use the IS DISTINCT operator (implemented in IsDistinct) -func NotEqOrIsNotNull[T any](value any) Expression[T] { - return expressionFromValueOrNil[T](value, NotEq[T], IsNotNull[T]()) +func NotEqOrIsNotNull[T any](value any) Operator[T] { + return operatorFromValueOrNil[T](value, NotEq[T], IsNotNull[T]()) } -func expressionFromValueOrNil[T any](value any, notNilFunc func(T) Expression[T], nilExpression Expression[T]) Expression[T] { +func operatorFromValueOrNil[T any](value any, notNilFunc func(T) Operator[T], nilOperator Operator[T]) Operator[T] { if value == nil { - return nilExpression + return nilOperator } valueTPointer, isTPointer := value.(*T) if isTPointer { if valueTPointer == nil { - return nilExpression + return nilOperator } return notNilFunc(*valueTPointer) @@ -80,13 +80,13 @@ func expressionFromValueOrNil[T any](value any, notNilFunc func(T) Expression[T] valueT, isT := value.(T) if isT { if mapsToNull(value) { - return nilExpression + return nilOperator } return notNilFunc(valueT) } - return NewInvalidExpression[T](ErrNotRelated) + return NewInvalidOperator[T](ErrNotRelated) } func mapsToNull(value any) bool { @@ -109,23 +109,23 @@ func mapsToNull(value any) bool { } // LessThan -func Lt[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.Lt) +func Lt[T any](value T) Operator[T] { + return NewCantBeNullValueOperator[T](value, badormSQL.Lt) } // LessThanOrEqualTo -func LtOrEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.LtOrEq) +func LtOrEq[T any](value T) Operator[T] { + return NewCantBeNullValueOperator[T](value, badormSQL.LtOrEq) } // GreaterThan -func Gt[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.Gt) +func Gt[T any](value T) Operator[T] { + return NewCantBeNullValueOperator[T](value, badormSQL.Gt) } // GreaterThanOrEqualTo -func GtOrEq[T any](value T) Expression[T] { - return NewCantBeNullValueExpression[T](value, expressions.GtOrEq) +func GtOrEq[T any](value T) Operator[T] { + return NewCantBeNullValueOperator[T](value, badormSQL.GtOrEq) } // Comparison Predicates @@ -133,80 +133,80 @@ func GtOrEq[T any](value T) Expression[T] { // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html // https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE -func IsNull[T any]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS NULL") +func IsNull[T any]() PredicateOperator[T] { + return NewPredicateOperator[T]("IS NULL") } -func IsNotNull[T any]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS NOT NULL") +func IsNotNull[T any]() PredicateOperator[T] { + return NewPredicateOperator[T]("IS NOT NULL") } // Equivalent to v1 < value < v2 -func Between[T any](v1 T, v2 T) Expression[T] { - return NewMultivalueExpression(expressions.Between, "AND", "", "", v1, v2) +func Between[T any](v1 T, v2 T) Operator[T] { + return NewMultivalueOperator(badormSQL.Between, "AND", "", "", v1, v2) } // Equivalent to NOT (v1 < value < v2) -func NotBetween[T any](v1 T, v2 T) Expression[T] { - return NewMultivalueExpression(expressions.NotBetween, "AND", "", "", v1, v2) +func NotBetween[T any](v1 T, v2 T) Operator[T] { + return NewMultivalueOperator(badormSQL.NotBetween, "AND", "", "", v1, v2) } // Boolean Comparison Predicates // Not supported by: sqlserver -func IsTrue[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS TRUE") +func IsTrue[T bool | sql.NullBool]() PredicateOperator[T] { + return NewPredicateOperator[T]("IS TRUE") } // Not supported by: sqlserver -func IsNotTrue[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS NOT TRUE") +func IsNotTrue[T bool | sql.NullBool]() PredicateOperator[T] { + return NewPredicateOperator[T]("IS NOT TRUE") } // Not supported by: sqlserver -func IsFalse[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS FALSE") +func IsFalse[T bool | sql.NullBool]() PredicateOperator[T] { + return NewPredicateOperator[T]("IS FALSE") } // Not supported by: sqlserver -func IsNotFalse[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS NOT FALSE") +func IsNotFalse[T bool | sql.NullBool]() PredicateOperator[T] { + return NewPredicateOperator[T]("IS NOT FALSE") } // Not supported by: sqlserver, sqlite -func IsUnknown[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS UNKNOWN") +func IsUnknown[T bool | sql.NullBool]() PredicateOperator[T] { + return NewPredicateOperator[T]("IS UNKNOWN") } // Not supported by: sqlserver, sqlite -func IsNotUnknown[T bool | sql.NullBool]() PredicateExpression[T] { - return NewPredicateExpression[T]("IS NOT UNKNOWN") +func IsNotUnknown[T bool | sql.NullBool]() PredicateOperator[T] { + return NewPredicateOperator[T]("IS NOT UNKNOWN") } // Not supported by: mysql -func IsDistinct[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, expressions.IsDistinct) +func IsDistinct[T any](value T) ValueOperator[T] { + return NewValueOperator[T](value, badormSQL.IsDistinct) } // Not supported by: mysql -func IsNotDistinct[T any](value T) ValueExpression[T] { - return NewValueExpression[T](value, expressions.IsNotDistinct) +func IsNotDistinct[T any](value T) ValueOperator[T] { + return NewValueOperator[T](value, badormSQL.IsNotDistinct) } // Pattern Matching -type LikeExpression[T string | sql.NullString] struct { - ValueExpression[T] +type LikeOperator[T string | sql.NullString] struct { + ValueOperator[T] } -func NewLikeExpression[T string | sql.NullString](pattern string, sqlExpression expressions.SQLExpression) LikeExpression[T] { - return LikeExpression[T]{ - ValueExpression: NewValueExpression[T](pattern, sqlExpression), +func NewLikeOperator[T string | sql.NullString](pattern string, sqlOperator badormSQL.Operator) LikeOperator[T] { + return LikeOperator[T]{ + ValueOperator: NewValueOperator[T](pattern, sqlOperator), } } -func (expr LikeExpression[T]) Escape(escape rune) ValueExpression[T] { - return expr.AddSQLExpression(string(escape), expressions.Escape) +func (expr LikeOperator[T]) Escape(escape rune) ValueOperator[T] { + return expr.AddOperation(string(escape), badormSQL.Escape) } // Pattern in all databases: @@ -227,8 +227,8 @@ func (expr LikeExpression[T]) Escape(escape rune) ValueExpression[T] { // - postgresql: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE // - sqlserver: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver16 // - sqlite: https://www.sqlite.org/lang_expr.html#like -func Like[T string | sql.NullString](pattern string) LikeExpression[T] { - return NewLikeExpression[T](pattern, expressions.Like) +func Like[T string | sql.NullString](pattern string) LikeOperator[T] { + return NewLikeOperator[T](pattern, badormSQL.Like) } -// TODO Subquery Expressions +// TODO Subquery Operators diff --git a/badorm/psql/array.go b/badorm/psql/array.go index 1b84451d..fdea0d6e 100644 --- a/badorm/psql/array.go +++ b/badorm/psql/array.go @@ -7,10 +7,10 @@ import ( // Row and Array Comparisons -func ArrayIn[T any](values ...T) badorm.ValueExpression[T] { +func ArrayIn[T any](values ...T) badorm.ValueOperator[T] { return shared.ArrayIn(values...) } -func ArrayNotIn[T any](values ...T) badorm.ValueExpression[T] { +func ArrayNotIn[T any](values ...T) badorm.ValueOperator[T] { return shared.ArrayNotIn(values...) } diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go index 8c5b3b63..031eff48 100644 --- a/badorm/psql/comparison.go +++ b/badorm/psql/comparison.go @@ -4,26 +4,26 @@ import ( "database/sql" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/expressions" + badormSQL "github.com/ditrit/badaas/badorm/sql" ) // Pattern Matching -func ILike[T string | sql.NullString](pattern string) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](pattern, expressions.PostgreSQLILike) +func ILike[T string | sql.NullString](pattern string) badorm.ValueOperator[T] { + return badorm.NewValueOperator[T](pattern, badormSQL.PostgreSQLILike) } // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP -func SimilarTo[T string | sql.NullString](pattern string) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](pattern, expressions.PostgreSQLSimilarTo) +func SimilarTo[T string | sql.NullString](pattern string) badorm.ValueOperator[T] { + return badorm.NewValueOperator[T](pattern, badormSQL.PostgreSQLSimilarTo) } // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP -func POSIXMatch[T string | sql.NullString](pattern string) badorm.Expression[T] { - return badorm.NewMustBePOSIXValueExpression[T](pattern, expressions.PostgreSQLPosixMatch) +func POSIXMatch[T string | sql.NullString](pattern string) badorm.Operator[T] { + return badorm.NewMustBePOSIXValueOperator[T](pattern, badormSQL.PostgreSQLPosixMatch) } // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP -func POSIXIMatch[T string | sql.NullString](pattern string) badorm.Expression[T] { - return badorm.NewMustBePOSIXValueExpression[T](pattern, expressions.PostgreSQLPosixIMatch) +func POSIXIMatch[T string | sql.NullString](pattern string) badorm.Operator[T] { + return badorm.NewMustBePOSIXValueOperator[T](pattern, badormSQL.PostgreSQLPosixIMatch) } diff --git a/badorm/shared/array.go b/badorm/shared/array.go index 7dca4c4f..67eff1a0 100644 --- a/badorm/shared/array.go +++ b/badorm/shared/array.go @@ -2,15 +2,15 @@ package shared import ( "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/expressions" + "github.com/ditrit/badaas/badorm/sql" ) // Row and Array Comparisons -func ArrayIn[T any](values ...T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](values, expressions.ArrayIn) +func ArrayIn[T any](values ...T) badorm.ValueOperator[T] { + return badorm.NewValueOperator[T](values, sql.ArrayIn) } -func ArrayNotIn[T any](values ...T) badorm.ValueExpression[T] { - return badorm.NewValueExpression[T](values, expressions.ArrayNotIn) +func ArrayNotIn[T any](values ...T) badorm.ValueOperator[T] { + return badorm.NewValueOperator[T](values, sql.ArrayNotIn) } diff --git a/badorm/expressions/sqlExpressions.go b/badorm/sql/operators.go similarity index 88% rename from badorm/expressions/sqlExpressions.go rename to badorm/sql/operators.go index 1b790b76..2320ffb7 100644 --- a/badorm/expressions/sqlExpressions.go +++ b/badorm/sql/operators.go @@ -1,9 +1,9 @@ -package expressions +package sql -type SQLExpression uint +type Operator uint const ( - Eq SQLExpression = iota + Eq Operator = iota NotEq Lt LtOrEq @@ -39,7 +39,11 @@ const ( SQLServerNotEqNullable = NotEq ) -var ToSQL = map[SQLExpression]string{ +func (op Operator) String() string { + return operatorToSQL[op] +} + +var operatorToSQL = map[Operator]string{ Eq: "=", NotEq: "<>", Lt: "<", diff --git a/badorm/sqlite/array.go b/badorm/sqlite/array.go index c6fb7c9f..b76c0d1b 100644 --- a/badorm/sqlite/array.go +++ b/badorm/sqlite/array.go @@ -7,10 +7,10 @@ import ( // Row and Array Comparisons -func ArrayIn[T any](values ...T) badorm.ValueExpression[T] { +func ArrayIn[T any](values ...T) badorm.ValueOperator[T] { return shared.ArrayIn(values...) } -func ArrayNotIn[T any](values ...T) badorm.ValueExpression[T] { +func ArrayNotIn[T any](values ...T) badorm.ValueOperator[T] { return shared.ArrayNotIn(values...) } diff --git a/badorm/sqlite/comparison.go b/badorm/sqlite/comparison.go index 0cc0cab1..0b40b062 100644 --- a/badorm/sqlite/comparison.go +++ b/badorm/sqlite/comparison.go @@ -4,10 +4,10 @@ import ( "database/sql" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/expressions" + badormSQL "github.com/ditrit/badaas/badorm/sql" ) // ref: https://www.sqlite.org/lang_expr.html#like -func Glob[T string | sql.NullString](pattern string) badorm.Expression[T] { - return badorm.NewMustBePOSIXValueExpression[T](pattern, expressions.SQLiteGlob) +func Glob[T string | sql.NullString](pattern string) badorm.Operator[T] { + return badorm.NewMustBePOSIXValueOperator[T](pattern, badormSQL.SQLiteGlob) } diff --git a/badorm/sqlserver/array.go b/badorm/sqlserver/array.go index 94e7c655..567607c6 100644 --- a/badorm/sqlserver/array.go +++ b/badorm/sqlserver/array.go @@ -5,10 +5,10 @@ import ( "github.com/ditrit/badaas/badorm/shared" ) -func ArrayIn[T any](values ...T) badorm.ValueExpression[T] { +func ArrayIn[T any](values ...T) badorm.ValueOperator[T] { return shared.ArrayIn(values...) } -func ArrayNotIn[T any](values ...T) badorm.ValueExpression[T] { +func ArrayNotIn[T any](values ...T) badorm.ValueOperator[T] { return shared.ArrayNotIn(values...) } diff --git a/badorm/sqlserver/comparison.go b/badorm/sqlserver/comparison.go index 1bb14fe2..3d959e23 100644 --- a/badorm/sqlserver/comparison.go +++ b/badorm/sqlserver/comparison.go @@ -2,7 +2,7 @@ package sqlserver import ( "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/expressions" + "github.com/ditrit/badaas/badorm/sql" ) // Comparison Operators @@ -10,20 +10,20 @@ import ( // EqNullable is the same as badorm.Eq but it supports value to be NULL // ansi_nulls must be set to off to avoid the NULL = NULL: unknown problem -func EqNullable[T any](value T) badorm.Expression[T] { - return badorm.NewValueExpression[T](value, expressions.SQLServerEqNullable) +func EqNullable[T any](value T) badorm.Operator[T] { + return badorm.NewValueOperator[T](value, sql.SQLServerEqNullable) } // NotEqNullable is the same as badorm.NotEq but it supports value to be NULL // ansi_nulls must be set to off to avoid the NULL = NULL: unknown problem -func NotEqNullable[T any](value T) badorm.Expression[T] { - return badorm.NewValueExpression[T](value, expressions.SQLServerNotEqNullable) +func NotEqNullable[T any](value T) badorm.Operator[T] { + return badorm.NewValueOperator[T](value, sql.SQLServerNotEqNullable) } -func NotLt[T any](value T) badorm.Expression[T] { - return badorm.NewCantBeNullValueExpression[T](value, expressions.SQLServerNotLt) +func NotLt[T any](value T) badorm.Operator[T] { + return badorm.NewCantBeNullValueOperator[T](value, sql.SQLServerNotLt) } -func NotGt[T any](value T) badorm.Expression[T] { - return badorm.NewCantBeNullValueExpression[T](value, expressions.SQLServerNotGt) +func NotGt[T any](value T) badorm.Operator[T] { + return badorm.NewCantBeNullValueOperator[T](value, sql.SQLServerNotGt) } diff --git a/badorm/valueExpression.go b/badorm/valueExpression.go deleted file mode 100644 index 0f015eb3..00000000 --- a/badorm/valueExpression.go +++ /dev/null @@ -1,114 +0,0 @@ -package badorm - -import ( - "database/sql" - "errors" - "fmt" - "reflect" - "regexp" - - "github.com/ditrit/badaas/badorm/expressions" -) - -// TODO ponerles mas informacion precisa a los errores -var ( - ErrFieldModelNotConcerned = errors.New("field's model is not concerned by the query so it can't be used in a expression") - ErrJoinMustBeSelected = errors.New("table is joined more than once, select which one you want to use") -) -var ErrValueCantBeNull = errors.New("value to compare can't be null") - -const UndefinedJoinNumber = -1 - -// Expression that compares the value of the column against a fixed value -// If ExpressionsAndValues has multiple entries, comparisons will be nested -// Example (single): value = v1 -// Example (multi): value LIKE v1 ESCAPE v2 -type ValueExpression[T any] struct { - SQLExpressions []SQLExpressionAndValue - JoinNumber int -} - -type SQLExpressionAndValue struct { - SQL string - Field IFieldIdentifier - Value any -} - -func (expr ValueExpression[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Expression[T] -} - -func (expr *ValueExpression[T]) SelectJoin(joinNumber uint) DynamicExpression[T] { - expr.JoinNumber = int(joinNumber) - return expr -} - -func (expr *ValueExpression[T]) AddSQLExpression(value any, sqlExpression expressions.SQLExpression) ValueExpression[T] { - expr.SQLExpressions = append( - expr.SQLExpressions, - SQLExpressionAndValue{ - Value: value, - SQL: expressions.ToSQL[sqlExpression], - }, - ) - - return *expr -} - -// verificar que en las condiciones anteriores alguien usó el field con el que se intenta comparar -// obtener de ahi cual es el nombre de la table a usar con ese field. -// TODO doc a ingles -func (expr ValueExpression[T]) ToSQL(query *Query, columnName string) (string, []any, error) { - exprString := columnName - values := []any{} - - for _, sqlExpr := range expr.SQLExpressions { - if sqlExpr.Field != nil { - modelTable, err := getModelTable(query, sqlExpr.Field, expr.JoinNumber) - if err != nil { - return "", nil, err - } - - exprString += fmt.Sprintf( - " "+sqlExpr.SQL+" %s", - sqlExpr.Field.ColumnSQL(query, modelTable), - ) - } else { - exprString += " " + sqlExpr.SQL + " ?" - values = append(values, sqlExpr.Value) - } - } - - return exprString, values, nil -} - -func NewValueExpression[T any](value any, sqlExpression expressions.SQLExpression) ValueExpression[T] { - expr := &ValueExpression[T]{} - - return expr.AddSQLExpression(value, sqlExpression) -} - -var nullableKinds = []reflect.Kind{ - reflect.Chan, reflect.Func, - reflect.Map, reflect.Pointer, - reflect.UnsafePointer, reflect.Interface, - reflect.Slice, -} - -func NewCantBeNullValueExpression[T any](value any, sqlExpression expressions.SQLExpression) Expression[T] { - if value == nil || mapsToNull(value) { - return NewInvalidExpression[T](ErrValueCantBeNull) - } - - return NewValueExpression[T](value, sqlExpression) -} - -func NewMustBePOSIXValueExpression[T string | sql.NullString](pattern string, sqlExpression expressions.SQLExpression) Expression[T] { - _, err := regexp.CompilePOSIX(pattern) - if err != nil { - return NewInvalidExpression[T](err) - } - - return NewValueExpression[T](pattern, sqlExpression) -} diff --git a/badorm/valueOperator.go b/badorm/valueOperator.go new file mode 100644 index 00000000..aa597409 --- /dev/null +++ b/badorm/valueOperator.go @@ -0,0 +1,116 @@ +package badorm + +import ( + "database/sql" + "errors" + "fmt" + "reflect" + "regexp" + + badormSQL "github.com/ditrit/badaas/badorm/sql" +) + +// TODO ponerles mas informacion precisa a los errores +var ( + ErrFieldModelNotConcerned = errors.New("field's model is not concerned by the query so it can't be used in a operator") + ErrJoinMustBeSelected = errors.New("table is joined more than once, select which one you want to use") + ErrValueCantBeNull = errors.New("value to compare can't be null") +) + +const UndefinedJoinNumber = -1 + +// Operator that compares the value of the column against a fixed value +// If SQLOperators has multiple entries, comparisons will be nested +// Example (single): value = v1 +// Example (multi): value LIKE v1 ESCAPE v2 +type ValueOperator[T any] struct { + Operations []Operation + // TODO join deberia estar en cada operator + JoinNumber int +} + +type Operation struct { + SQLOperator badormSQL.Operator + Field IFieldIdentifier + Value any +} + +func (expr ValueOperator[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Operator[T] +} + +func (expr *ValueOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { + expr.JoinNumber = int(joinNumber) + return expr +} + +func (expr *ValueOperator[T]) AddOperation(value any, sqlOperator badormSQL.Operator) ValueOperator[T] { + expr.Operations = append( + expr.Operations, + Operation{ + Value: value, + SQLOperator: sqlOperator, + }, + ) + + return *expr +} + +// verificar que en las condiciones anteriores alguien usó el field con el que se intenta comparar +// obtener de ahi cual es el nombre de la table a usar con ese field. +// TODO doc a ingles +func (expr ValueOperator[T]) ToSQL(query *Query, columnName string) (string, []any, error) { + operationString := columnName + values := []any{} + + for _, operation := range expr.Operations { + if operation.Field != nil { + modelTable, err := getModelTable(query, operation.Field, expr.JoinNumber) + if err != nil { + return "", nil, err + } + + operationString += fmt.Sprintf( + " %s %s", + operation.SQLOperator, + operation.Field.ColumnSQL(query, modelTable), + ) + } else { + operationString += " " + operation.SQLOperator.String() + " ?" + values = append(values, operation.Value) + } + } + + return operationString, values, nil +} + +func NewValueOperator[T any](value any, sqlOperator badormSQL.Operator) ValueOperator[T] { + expr := &ValueOperator[T]{} + + return expr.AddOperation(value, sqlOperator) +} + +var nullableKinds = []reflect.Kind{ + reflect.Chan, reflect.Func, + reflect.Map, reflect.Pointer, + reflect.UnsafePointer, reflect.Interface, + reflect.Slice, +} + +func NewCantBeNullValueOperator[T any](value any, sqlOperator badormSQL.Operator) Operator[T] { + if value == nil || mapsToNull(value) { + return NewInvalidOperator[T](ErrValueCantBeNull) + } + + return NewValueOperator[T](value, sqlOperator) +} + +func NewMustBePOSIXValueOperator[T string | sql.NullString](pattern string, sqlOperator badormSQL.Operator) Operator[T] { + _, err := regexp.CompilePOSIX(pattern) + if err != nil { + return NewInvalidOperator[T](err) + } + + return NewValueOperator[T](pattern, sqlOperator) +} diff --git a/mocks/badorm/Expression.go b/mocks/badorm/Expression.go deleted file mode 100644 index 73f44bb2..00000000 --- a/mocks/badorm/Expression.go +++ /dev/null @@ -1,63 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import mock "github.com/stretchr/testify/mock" - -// Expression is an autogenerated mock type for the Expression type -type Expression[T interface{}] struct { - mock.Mock -} - -// InterfaceVerificationMethod provides a mock function with given fields: _a0 -func (_m *Expression[T]) InterfaceVerificationMethod(_a0 T) { - _m.Called(_a0) -} - -// ToSQL provides a mock function with given fields: columnName -func (_m *Expression[T]) ToSQL(columnName string) (string, []interface{}, error) { - ret := _m.Called(columnName) - - var r0 string - var r1 []interface{} - var r2 error - if rf, ok := ret.Get(0).(func(string) (string, []interface{}, error)); ok { - return rf(columnName) - } - if rf, ok := ret.Get(0).(func(string) string); ok { - r0 = rf(columnName) - } else { - r0 = ret.Get(0).(string) - } - - if rf, ok := ret.Get(1).(func(string) []interface{}); ok { - r1 = rf(columnName) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).([]interface{}) - } - } - - if rf, ok := ret.Get(2).(func(string) error); ok { - r2 = rf(columnName) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -type mockConstructorTestingTNewExpression interface { - mock.TestingT - Cleanup(func()) -} - -// NewExpression creates a new instance of Expression. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewExpression[T interface{}](t mockConstructorTestingTNewExpression) *Expression[T] { - mock := &Expression[T]{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/persistence/models/User.go b/persistence/models/User.go index 5c02836d..3fae54f4 100644 --- a/persistence/models/User.go +++ b/persistence/models/User.go @@ -12,9 +12,9 @@ type User struct { Password []byte `gorm:"not null"` } -func UserEmailCondition(expr badorm.Expression[string]) badorm.WhereCondition[User] { +func UserEmailCondition(op badorm.Operator[string]) badorm.WhereCondition[User] { return badorm.FieldCondition[User, string]{ - Expression: expr, + Operator: op, FieldIdentifier: badorm.FieldIdentifier[string]{ Field: "Email", }, diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index b569dc89..b8659f0e 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -74,7 +74,7 @@ func TestBaDORM(t *testing.T) { fx.Provide(NewWhereConditionsIntTestSuite), fx.Provide(NewJoinConditionsIntTestSuite), fx.Provide(NewPreloadConditionsIntTestSuite), - fx.Provide(NewExpressionsIntTestSuite), + fx.Provide(NewOperatorIntTestSuite), fx.Invoke(runBaDORMTestSuites), ).Run() @@ -86,7 +86,7 @@ func runBaDORMTestSuites( tsWhereConditions *WhereConditionsIntTestSuite, tsJoinConditions *JoinConditionsIntTestSuite, tsPreloadConditions *PreloadConditionsIntTestSuite, - tsExpressions *ExpressionIntTestSuite, + tsOperators *OperatorIntTestSuite, shutdowner fx.Shutdowner, ) { suite.Run(tGlobal, tsCRUDRepository) @@ -94,7 +94,7 @@ func runBaDORMTestSuites( suite.Run(tGlobal, tsWhereConditions) suite.Run(tGlobal, tsJoinConditions) suite.Run(tGlobal, tsPreloadConditions) - suite.Run(tGlobal, tsExpressions) + suite.Run(tGlobal, tsOperators) shutdowner.Shutdown() } diff --git a/testintegration/conditions/bicycle_conditions.go b/testintegration/conditions/bicycle_conditions.go index afdd5a91..196d3df9 100644 --- a/testintegration/conditions/bicycle_conditions.go +++ b/testintegration/conditions/bicycle_conditions.go @@ -15,10 +15,10 @@ var BicycleIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: bicycleType, } -func BicycleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Bicycle] { +func BicycleId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, badorm.UUID]{ - Expression: expr, FieldIdentifier: BicycleIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var BicycleCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: bicycleType, } -func BicycleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Bicycle] { +func BicycleCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, time.Time]{ - Expression: expr, FieldIdentifier: BicycleCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var BicycleUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: bicycleType, } -func BicycleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Bicycle] { +func BicycleUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, time.Time]{ - Expression: expr, FieldIdentifier: BicycleUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var BicycleDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: bicycleType, } -func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Bicycle] { +func BicycleDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: BicycleDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var BicycleNameField = badorm.FieldIdentifier[string]{ ModelType: bicycleType, } -func BicycleName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { +func BicycleName(operator badorm.Operator[string]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, string]{ - Expression: expr, FieldIdentifier: BicycleNameField, + Operator: operator, } } func BicycleOwner(conditions ...badorm.Condition[models.Person]) badorm.IJoinCondition[models.Bicycle] { @@ -85,10 +85,10 @@ var BicycleOwnerNameField = badorm.FieldIdentifier[string]{ ModelType: bicycleType, } -func BicycleOwnerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Bicycle] { +func BicycleOwnerName(operator badorm.Operator[string]) badorm.WhereCondition[models.Bicycle] { return badorm.FieldCondition[models.Bicycle, string]{ - Expression: expr, FieldIdentifier: BicycleOwnerNameField, + Operator: operator, } } diff --git a/testintegration/conditions/brand_conditions.go b/testintegration/conditions/brand_conditions.go index 8ad0313d..aad2c026 100644 --- a/testintegration/conditions/brand_conditions.go +++ b/testintegration/conditions/brand_conditions.go @@ -15,10 +15,10 @@ var BrandIdField = badorm.FieldIdentifier[badorm.UIntID]{ ModelType: brandType, } -func BrandId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[models.Brand] { +func BrandId(operator badorm.Operator[badorm.UIntID]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, badorm.UIntID]{ - Expression: expr, FieldIdentifier: BrandIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var BrandCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: brandType, } -func BrandCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Brand] { +func BrandCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, time.Time]{ - Expression: expr, FieldIdentifier: BrandCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var BrandUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: brandType, } -func BrandUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Brand] { +func BrandUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, time.Time]{ - Expression: expr, FieldIdentifier: BrandUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var BrandDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: brandType, } -func BrandDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Brand] { +func BrandDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: BrandDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var BrandNameField = badorm.FieldIdentifier[string]{ ModelType: brandType, } -func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[models.Brand] { +func BrandName(operator badorm.Operator[string]) badorm.WhereCondition[models.Brand] { return badorm.FieldCondition[models.Brand, string]{ - Expression: expr, FieldIdentifier: BrandNameField, + Operator: operator, } } diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index 1debc38c..cc6b8116 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -15,10 +15,10 @@ var ChildIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: childType, } -func ChildId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { +func ChildId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ - Expression: expr, FieldIdentifier: ChildIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var ChildCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: childType, } -func ChildCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Child] { +func ChildCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, time.Time]{ - Expression: expr, FieldIdentifier: ChildCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var ChildUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: childType, } -func ChildUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Child] { +func ChildUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, time.Time]{ - Expression: expr, FieldIdentifier: ChildUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var ChildDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: childType, } -func ChildDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Child] { +func ChildDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: ChildDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var ChildNameField = badorm.FieldIdentifier[string]{ ModelType: childType, } -func ChildName(expr badorm.Expression[string]) badorm.WhereCondition[models.Child] { +func ChildName(operator badorm.Operator[string]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, string]{ - Expression: expr, FieldIdentifier: ChildNameField, + Operator: operator, } } func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.IJoinCondition[models.Child] { @@ -85,10 +85,10 @@ var ChildParent1IdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: childType, } -func ChildParent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { +func ChildParent1Id(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ - Expression: expr, FieldIdentifier: ChildParent1IdField, + Operator: operator, } } func ChildParent2(conditions ...badorm.Condition[models.Parent2]) badorm.IJoinCondition[models.Child] { @@ -107,10 +107,10 @@ var ChildParent2IdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: childType, } -func ChildParent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Child] { +func ChildParent2Id(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Child] { return badorm.FieldCondition[models.Child, badorm.UUID]{ - Expression: expr, FieldIdentifier: ChildParent2IdField, + Operator: operator, } } diff --git a/testintegration/conditions/city_conditions.go b/testintegration/conditions/city_conditions.go index 858b541e..18440a57 100644 --- a/testintegration/conditions/city_conditions.go +++ b/testintegration/conditions/city_conditions.go @@ -15,10 +15,10 @@ var CityIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: cityType, } -func CityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { +func CityId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, badorm.UUID]{ - Expression: expr, FieldIdentifier: CityIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var CityCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: cityType, } -func CityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.City] { +func CityCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, time.Time]{ - Expression: expr, FieldIdentifier: CityCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var CityUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: cityType, } -func CityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.City] { +func CityUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, time.Time]{ - Expression: expr, FieldIdentifier: CityUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var CityDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: cityType, } -func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.City] { +func CityDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: CityDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var CityNameField = badorm.FieldIdentifier[string]{ ModelType: cityType, } -func CityName(expr badorm.Expression[string]) badorm.WhereCondition[models.City] { +func CityName(operator badorm.Operator[string]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, string]{ - Expression: expr, FieldIdentifier: CityNameField, + Operator: operator, } } func CityCountry(conditions ...badorm.Condition[models.Country]) badorm.IJoinCondition[models.City] { @@ -85,10 +85,10 @@ var CityCountryIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: cityType, } -func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.City] { +func CityCountryId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.City] { return badorm.FieldCondition[models.City, badorm.UUID]{ - Expression: expr, FieldIdentifier: CityCountryIdField, + Operator: operator, } } diff --git a/testintegration/conditions/company_conditions.go b/testintegration/conditions/company_conditions.go index 6ce97259..dda5aa0d 100644 --- a/testintegration/conditions/company_conditions.go +++ b/testintegration/conditions/company_conditions.go @@ -15,10 +15,10 @@ var CompanyIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: companyType, } -func CompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Company] { +func CompanyId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, badorm.UUID]{ - Expression: expr, FieldIdentifier: CompanyIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var CompanyCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: companyType, } -func CompanyCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Company] { +func CompanyCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, time.Time]{ - Expression: expr, FieldIdentifier: CompanyCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var CompanyUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: companyType, } -func CompanyUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Company] { +func CompanyUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, time.Time]{ - Expression: expr, FieldIdentifier: CompanyUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var CompanyDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: companyType, } -func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Company] { +func CompanyDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: CompanyDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var CompanyNameField = badorm.FieldIdentifier[string]{ ModelType: companyType, } -func CompanyName(expr badorm.Expression[string]) badorm.WhereCondition[models.Company] { +func CompanyName(operator badorm.Operator[string]) badorm.WhereCondition[models.Company] { return badorm.FieldCondition[models.Company, string]{ - Expression: expr, FieldIdentifier: CompanyNameField, + Operator: operator, } } func CompanyPreloadSellers(nestedPreloads ...badorm.IJoinCondition[models.Seller]) badorm.Condition[models.Company] { diff --git a/testintegration/conditions/country_conditions.go b/testintegration/conditions/country_conditions.go index 7aeffe6a..e13bee47 100644 --- a/testintegration/conditions/country_conditions.go +++ b/testintegration/conditions/country_conditions.go @@ -15,10 +15,10 @@ var CountryIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: countryType, } -func CountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Country] { +func CountryId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, badorm.UUID]{ - Expression: expr, FieldIdentifier: CountryIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var CountryCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: countryType, } -func CountryCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Country] { +func CountryCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, time.Time]{ - Expression: expr, FieldIdentifier: CountryCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var CountryUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: countryType, } -func CountryUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Country] { +func CountryUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, time.Time]{ - Expression: expr, FieldIdentifier: CountryUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var CountryDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: countryType, } -func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Country] { +func CountryDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: CountryDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var CountryNameField = badorm.FieldIdentifier[string]{ ModelType: countryType, } -func CountryName(expr badorm.Expression[string]) badorm.WhereCondition[models.Country] { +func CountryName(operator badorm.Operator[string]) badorm.WhereCondition[models.Country] { return badorm.FieldCondition[models.Country, string]{ - Expression: expr, FieldIdentifier: CountryNameField, + Operator: operator, } } func CountryCapital(conditions ...badorm.Condition[models.City]) badorm.IJoinCondition[models.Country] { diff --git a/testintegration/conditions/employee_conditions.go b/testintegration/conditions/employee_conditions.go index 5097d360..2900b820 100644 --- a/testintegration/conditions/employee_conditions.go +++ b/testintegration/conditions/employee_conditions.go @@ -15,10 +15,10 @@ var EmployeeIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: employeeType, } -func EmployeeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { +func EmployeeId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, badorm.UUID]{ - Expression: expr, FieldIdentifier: EmployeeIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var EmployeeCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: employeeType, } -func EmployeeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Employee] { +func EmployeeCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, time.Time]{ - Expression: expr, FieldIdentifier: EmployeeCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var EmployeeUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: employeeType, } -func EmployeeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Employee] { +func EmployeeUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, time.Time]{ - Expression: expr, FieldIdentifier: EmployeeUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var EmployeeDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: employeeType, } -func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Employee] { +func EmployeeDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: EmployeeDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var EmployeeNameField = badorm.FieldIdentifier[string]{ ModelType: employeeType, } -func EmployeeName(expr badorm.Expression[string]) badorm.WhereCondition[models.Employee] { +func EmployeeName(operator badorm.Operator[string]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, string]{ - Expression: expr, FieldIdentifier: EmployeeNameField, + Operator: operator, } } func EmployeeBoss(conditions ...badorm.Condition[models.Employee]) badorm.IJoinCondition[models.Employee] { @@ -85,10 +85,10 @@ var EmployeeBossIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: employeeType, } -func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Employee] { +func EmployeeBossId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Employee] { return badorm.FieldCondition[models.Employee, badorm.UUID]{ - Expression: expr, FieldIdentifier: EmployeeBossIdField, + Operator: operator, } } diff --git a/testintegration/conditions/parent1_conditions.go b/testintegration/conditions/parent1_conditions.go index 6dfe49be..56b14dda 100644 --- a/testintegration/conditions/parent1_conditions.go +++ b/testintegration/conditions/parent1_conditions.go @@ -15,10 +15,10 @@ var Parent1IdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: parent1Type, } -func Parent1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { +func Parent1Id(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, badorm.UUID]{ - Expression: expr, FieldIdentifier: Parent1IdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var Parent1CreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: parent1Type, } -func Parent1CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent1] { +func Parent1CreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, time.Time]{ - Expression: expr, FieldIdentifier: Parent1CreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var Parent1UpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: parent1Type, } -func Parent1UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent1] { +func Parent1UpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, time.Time]{ - Expression: expr, FieldIdentifier: Parent1UpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var Parent1DeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: parent1Type, } -func Parent1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Parent1] { +func Parent1DeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: Parent1DeletedAtField, + Operator: operator, } } func Parent1ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.IJoinCondition[models.Parent1] { @@ -73,10 +73,10 @@ var Parent1ParentParentIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: parent1Type, } -func Parent1ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent1] { +func Parent1ParentParentId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Parent1] { return badorm.FieldCondition[models.Parent1, badorm.UUID]{ - Expression: expr, FieldIdentifier: Parent1ParentParentIdField, + Operator: operator, } } diff --git a/testintegration/conditions/parent2_conditions.go b/testintegration/conditions/parent2_conditions.go index acd7dc41..c1c8269d 100644 --- a/testintegration/conditions/parent2_conditions.go +++ b/testintegration/conditions/parent2_conditions.go @@ -15,10 +15,10 @@ var Parent2IdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: parent2Type, } -func Parent2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { +func Parent2Id(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, badorm.UUID]{ - Expression: expr, FieldIdentifier: Parent2IdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var Parent2CreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: parent2Type, } -func Parent2CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent2] { +func Parent2CreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, time.Time]{ - Expression: expr, FieldIdentifier: Parent2CreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var Parent2UpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: parent2Type, } -func Parent2UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Parent2] { +func Parent2UpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, time.Time]{ - Expression: expr, FieldIdentifier: Parent2UpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var Parent2DeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: parent2Type, } -func Parent2DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Parent2] { +func Parent2DeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: Parent2DeletedAtField, + Operator: operator, } } func Parent2ParentParent(conditions ...badorm.Condition[models.ParentParent]) badorm.IJoinCondition[models.Parent2] { @@ -73,10 +73,10 @@ var Parent2ParentParentIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: parent2Type, } -func Parent2ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Parent2] { +func Parent2ParentParentId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Parent2] { return badorm.FieldCondition[models.Parent2, badorm.UUID]{ - Expression: expr, FieldIdentifier: Parent2ParentParentIdField, + Operator: operator, } } diff --git a/testintegration/conditions/parent_parent_conditions.go b/testintegration/conditions/parent_parent_conditions.go index 33455a65..f739b014 100644 --- a/testintegration/conditions/parent_parent_conditions.go +++ b/testintegration/conditions/parent_parent_conditions.go @@ -15,10 +15,10 @@ var ParentParentIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: parentParentType, } -func ParentParentId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.ParentParent] { +func ParentParentId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, badorm.UUID]{ - Expression: expr, FieldIdentifier: ParentParentIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var ParentParentCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: parentParentType, } -func ParentParentCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.ParentParent] { +func ParentParentCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, time.Time]{ - Expression: expr, FieldIdentifier: ParentParentCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var ParentParentUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: parentParentType, } -func ParentParentUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.ParentParent] { +func ParentParentUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, time.Time]{ - Expression: expr, FieldIdentifier: ParentParentUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var ParentParentDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: parentParentType, } -func ParentParentDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.ParentParent] { +func ParentParentDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: ParentParentDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var ParentParentNameField = badorm.FieldIdentifier[string]{ ModelType: parentParentType, } -func ParentParentName(expr badorm.Expression[string]) badorm.WhereCondition[models.ParentParent] { +func ParentParentName(operator badorm.Operator[string]) badorm.WhereCondition[models.ParentParent] { return badorm.FieldCondition[models.ParentParent, string]{ - Expression: expr, FieldIdentifier: ParentParentNameField, + Operator: operator, } } diff --git a/testintegration/conditions/person_conditions.go b/testintegration/conditions/person_conditions.go index 35762329..cc062480 100644 --- a/testintegration/conditions/person_conditions.go +++ b/testintegration/conditions/person_conditions.go @@ -15,10 +15,10 @@ var PersonIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: personType, } -func PersonId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Person] { +func PersonId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, badorm.UUID]{ - Expression: expr, FieldIdentifier: PersonIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var PersonCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: personType, } -func PersonCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Person] { +func PersonCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, time.Time]{ - Expression: expr, FieldIdentifier: PersonCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var PersonUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: personType, } -func PersonUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Person] { +func PersonUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, time.Time]{ - Expression: expr, FieldIdentifier: PersonUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var PersonDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: personType, } -func PersonDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Person] { +func PersonDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: PersonDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var PersonNameField = badorm.FieldIdentifier[string]{ ModelType: personType, } -func PersonName(expr badorm.Expression[string]) badorm.WhereCondition[models.Person] { +func PersonName(operator badorm.Operator[string]) badorm.WhereCondition[models.Person] { return badorm.FieldCondition[models.Person, string]{ - Expression: expr, FieldIdentifier: PersonNameField, + Operator: operator, } } diff --git a/testintegration/conditions/phone_conditions.go b/testintegration/conditions/phone_conditions.go index 8c9064bc..344356dd 100644 --- a/testintegration/conditions/phone_conditions.go +++ b/testintegration/conditions/phone_conditions.go @@ -15,10 +15,10 @@ var PhoneIdField = badorm.FieldIdentifier[badorm.UIntID]{ ModelType: phoneType, } -func PhoneId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[models.Phone] { +func PhoneId(operator badorm.Operator[badorm.UIntID]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, badorm.UIntID]{ - Expression: expr, FieldIdentifier: PhoneIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var PhoneCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: phoneType, } -func PhoneCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Phone] { +func PhoneCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, time.Time]{ - Expression: expr, FieldIdentifier: PhoneCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var PhoneUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: phoneType, } -func PhoneUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Phone] { +func PhoneUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, time.Time]{ - Expression: expr, FieldIdentifier: PhoneUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var PhoneDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: phoneType, } -func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Phone] { +func PhoneDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: PhoneDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var PhoneNameField = badorm.FieldIdentifier[string]{ ModelType: phoneType, } -func PhoneName(expr badorm.Expression[string]) badorm.WhereCondition[models.Phone] { +func PhoneName(operator badorm.Operator[string]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, string]{ - Expression: expr, FieldIdentifier: PhoneNameField, + Operator: operator, } } func PhoneBrand(conditions ...badorm.Condition[models.Brand]) badorm.IJoinCondition[models.Phone] { @@ -85,10 +85,10 @@ var PhoneBrandIdField = badorm.FieldIdentifier[uint]{ ModelType: phoneType, } -func PhoneBrandId(expr badorm.Expression[uint]) badorm.WhereCondition[models.Phone] { +func PhoneBrandId(operator badorm.Operator[uint]) badorm.WhereCondition[models.Phone] { return badorm.FieldCondition[models.Phone, uint]{ - Expression: expr, FieldIdentifier: PhoneBrandIdField, + Operator: operator, } } diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index 22064624..ed15e1f3 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -16,10 +16,10 @@ var ProductIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: productType, } -func ProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Product] { +func ProductId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, badorm.UUID]{ - Expression: expr, FieldIdentifier: ProductIdField, + Operator: operator, } } @@ -28,10 +28,10 @@ var ProductCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: productType, } -func ProductCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Product] { +func ProductCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, time.Time]{ - Expression: expr, FieldIdentifier: ProductCreatedAtField, + Operator: operator, } } @@ -40,10 +40,10 @@ var ProductUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: productType, } -func ProductUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Product] { +func ProductUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, time.Time]{ - Expression: expr, FieldIdentifier: ProductUpdatedAtField, + Operator: operator, } } @@ -52,10 +52,10 @@ var ProductDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: productType, } -func ProductDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Product] { +func ProductDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: ProductDeletedAtField, + Operator: operator, } } @@ -64,10 +64,10 @@ var ProductStringField = badorm.FieldIdentifier[string]{ ModelType: productType, } -func ProductString(expr badorm.Expression[string]) badorm.WhereCondition[models.Product] { +func ProductString(operator badorm.Operator[string]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, string]{ - Expression: expr, FieldIdentifier: ProductStringField, + Operator: operator, } } @@ -76,10 +76,10 @@ var ProductIntField = badorm.FieldIdentifier[int]{ ModelType: productType, } -func ProductInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { +func ProductInt(operator badorm.Operator[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expression: expr, FieldIdentifier: ProductIntField, + Operator: operator, } } @@ -88,10 +88,10 @@ var ProductIntPointerField = badorm.FieldIdentifier[int]{ ModelType: productType, } -func ProductIntPointer(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { +func ProductIntPointer(operator badorm.Operator[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expression: expr, FieldIdentifier: ProductIntPointerField, + Operator: operator, } } @@ -100,10 +100,10 @@ var ProductFloatField = badorm.FieldIdentifier[float64]{ ModelType: productType, } -func ProductFloat(expr badorm.Expression[float64]) badorm.WhereCondition[models.Product] { +func ProductFloat(operator badorm.Operator[float64]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, float64]{ - Expression: expr, FieldIdentifier: ProductFloatField, + Operator: operator, } } @@ -112,10 +112,10 @@ var ProductNullFloatField = badorm.FieldIdentifier[sql.NullFloat64]{ ModelType: productType, } -func ProductNullFloat(expr badorm.Expression[sql.NullFloat64]) badorm.WhereCondition[models.Product] { +func ProductNullFloat(operator badorm.Operator[sql.NullFloat64]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, sql.NullFloat64]{ - Expression: expr, FieldIdentifier: ProductNullFloatField, + Operator: operator, } } @@ -124,10 +124,10 @@ var ProductBoolField = badorm.FieldIdentifier[bool]{ ModelType: productType, } -func ProductBool(expr badorm.Expression[bool]) badorm.WhereCondition[models.Product] { +func ProductBool(operator badorm.Operator[bool]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, bool]{ - Expression: expr, FieldIdentifier: ProductBoolField, + Operator: operator, } } @@ -136,10 +136,10 @@ var ProductNullBoolField = badorm.FieldIdentifier[sql.NullBool]{ ModelType: productType, } -func ProductNullBool(expr badorm.Expression[sql.NullBool]) badorm.WhereCondition[models.Product] { +func ProductNullBool(operator badorm.Operator[sql.NullBool]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, sql.NullBool]{ - Expression: expr, FieldIdentifier: ProductNullBoolField, + Operator: operator, } } @@ -148,10 +148,10 @@ var ProductByteArrayField = badorm.FieldIdentifier[[]uint8]{ ModelType: productType, } -func ProductByteArray(expr badorm.Expression[[]uint8]) badorm.WhereCondition[models.Product] { +func ProductByteArray(operator badorm.Operator[[]uint8]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, []uint8]{ - Expression: expr, FieldIdentifier: ProductByteArrayField, + Operator: operator, } } @@ -160,10 +160,10 @@ var ProductMultiStringField = badorm.FieldIdentifier[models.MultiString]{ ModelType: productType, } -func ProductMultiString(expr badorm.Expression[models.MultiString]) badorm.WhereCondition[models.Product] { +func ProductMultiString(operator badorm.Operator[models.MultiString]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, models.MultiString]{ - Expression: expr, FieldIdentifier: ProductMultiStringField, + Operator: operator, } } @@ -172,10 +172,10 @@ var ProductToBeEmbeddedEmbeddedIntField = badorm.FieldIdentifier[int]{ ModelType: productType, } -func ProductToBeEmbeddedEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { +func ProductToBeEmbeddedEmbeddedInt(operator badorm.Operator[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expression: expr, FieldIdentifier: ProductToBeEmbeddedEmbeddedIntField, + Operator: operator, } } @@ -185,10 +185,10 @@ var ProductGormEmbeddedIntField = badorm.FieldIdentifier[int]{ ModelType: productType, } -func ProductGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[models.Product] { +func ProductGormEmbeddedInt(operator badorm.Operator[int]) badorm.WhereCondition[models.Product] { return badorm.FieldCondition[models.Product, int]{ - Expression: expr, FieldIdentifier: ProductGormEmbeddedIntField, + Operator: operator, } } diff --git a/testintegration/conditions/sale_conditions.go b/testintegration/conditions/sale_conditions.go index 132d6a08..8e9a7d08 100644 --- a/testintegration/conditions/sale_conditions.go +++ b/testintegration/conditions/sale_conditions.go @@ -15,10 +15,10 @@ var SaleIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: saleType, } -func SaleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { +func SaleId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ - Expression: expr, FieldIdentifier: SaleIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var SaleCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: saleType, } -func SaleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Sale] { +func SaleCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, time.Time]{ - Expression: expr, FieldIdentifier: SaleCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var SaleUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: saleType, } -func SaleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Sale] { +func SaleUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, time.Time]{ - Expression: expr, FieldIdentifier: SaleUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var SaleDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: saleType, } -func SaleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Sale] { +func SaleDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: SaleDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var SaleCodeField = badorm.FieldIdentifier[int]{ ModelType: saleType, } -func SaleCode(expr badorm.Expression[int]) badorm.WhereCondition[models.Sale] { +func SaleCode(operator badorm.Operator[int]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, int]{ - Expression: expr, FieldIdentifier: SaleCodeField, + Operator: operator, } } @@ -75,10 +75,10 @@ var SaleDescriptionField = badorm.FieldIdentifier[string]{ ModelType: saleType, } -func SaleDescription(expr badorm.Expression[string]) badorm.WhereCondition[models.Sale] { +func SaleDescription(operator badorm.Operator[string]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, string]{ - Expression: expr, FieldIdentifier: SaleDescriptionField, + Operator: operator, } } func SaleProduct(conditions ...badorm.Condition[models.Product]) badorm.IJoinCondition[models.Sale] { @@ -97,10 +97,10 @@ var SaleProductIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: saleType, } -func SaleProductId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { +func SaleProductId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ - Expression: expr, FieldIdentifier: SaleProductIdField, + Operator: operator, } } func SaleSeller(conditions ...badorm.Condition[models.Seller]) badorm.IJoinCondition[models.Sale] { @@ -119,10 +119,10 @@ var SaleSellerIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: saleType, } -func SaleSellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Sale] { +func SaleSellerId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Sale] { return badorm.FieldCondition[models.Sale, badorm.UUID]{ - Expression: expr, FieldIdentifier: SaleSellerIdField, + Operator: operator, } } diff --git a/testintegration/conditions/seller_conditions.go b/testintegration/conditions/seller_conditions.go index 6ce76b83..08a0ce87 100644 --- a/testintegration/conditions/seller_conditions.go +++ b/testintegration/conditions/seller_conditions.go @@ -15,10 +15,10 @@ var SellerIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: sellerType, } -func SellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { +func SellerId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ - Expression: expr, FieldIdentifier: SellerIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var SellerCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: sellerType, } -func SellerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Seller] { +func SellerCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, time.Time]{ - Expression: expr, FieldIdentifier: SellerCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var SellerUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: sellerType, } -func SellerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.Seller] { +func SellerUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, time.Time]{ - Expression: expr, FieldIdentifier: SellerUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var SellerDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: sellerType, } -func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.Seller] { +func SellerDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: SellerDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var SellerNameField = badorm.FieldIdentifier[string]{ ModelType: sellerType, } -func SellerName(expr badorm.Expression[string]) badorm.WhereCondition[models.Seller] { +func SellerName(operator badorm.Operator[string]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, string]{ - Expression: expr, FieldIdentifier: SellerNameField, + Operator: operator, } } func SellerCompany(conditions ...badorm.Condition[models.Company]) badorm.IJoinCondition[models.Seller] { @@ -85,10 +85,10 @@ var SellerCompanyIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: sellerType, } -func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { +func SellerCompanyId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ - Expression: expr, FieldIdentifier: SellerCompanyIdField, + Operator: operator, } } func SellerUniversity(conditions ...badorm.Condition[models.University]) badorm.IJoinCondition[models.Seller] { @@ -107,10 +107,10 @@ var SellerUniversityIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: sellerType, } -func SellerUniversityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.Seller] { +func SellerUniversityId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.Seller] { return badorm.FieldCondition[models.Seller, badorm.UUID]{ - Expression: expr, FieldIdentifier: SellerUniversityIdField, + Operator: operator, } } diff --git a/testintegration/conditions/university_conditions.go b/testintegration/conditions/university_conditions.go index 36898cbd..1dbcc988 100644 --- a/testintegration/conditions/university_conditions.go +++ b/testintegration/conditions/university_conditions.go @@ -15,10 +15,10 @@ var UniversityIdField = badorm.FieldIdentifier[badorm.UUID]{ ModelType: universityType, } -func UniversityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[models.University] { +func UniversityId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[models.University] { return badorm.FieldCondition[models.University, badorm.UUID]{ - Expression: expr, FieldIdentifier: UniversityIdField, + Operator: operator, } } @@ -27,10 +27,10 @@ var UniversityCreatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: universityType, } -func UniversityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.University] { +func UniversityCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.University] { return badorm.FieldCondition[models.University, time.Time]{ - Expression: expr, FieldIdentifier: UniversityCreatedAtField, + Operator: operator, } } @@ -39,10 +39,10 @@ var UniversityUpdatedAtField = badorm.FieldIdentifier[time.Time]{ ModelType: universityType, } -func UniversityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[models.University] { +func UniversityUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[models.University] { return badorm.FieldCondition[models.University, time.Time]{ - Expression: expr, FieldIdentifier: UniversityUpdatedAtField, + Operator: operator, } } @@ -51,10 +51,10 @@ var UniversityDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ ModelType: universityType, } -func UniversityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[models.University] { +func UniversityDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[models.University] { return badorm.FieldCondition[models.University, gorm.DeletedAt]{ - Expression: expr, FieldIdentifier: UniversityDeletedAtField, + Operator: operator, } } @@ -63,10 +63,10 @@ var UniversityNameField = badorm.FieldIdentifier[string]{ ModelType: universityType, } -func UniversityName(expr badorm.Expression[string]) badorm.WhereCondition[models.University] { +func UniversityName(operator badorm.Operator[string]) badorm.WhereCondition[models.University] { return badorm.FieldCondition[models.University, string]{ - Expression: expr, FieldIdentifier: UniversityNameField, + Operator: operator, } } diff --git a/testintegration/expressions_test.go b/testintegration/operators_test.go similarity index 78% rename from testintegration/expressions_test.go rename to testintegration/operators_test.go index ef54cdb1..862f900d 100644 --- a/testintegration/expressions_test.go +++ b/testintegration/operators_test.go @@ -19,16 +19,16 @@ import ( "github.com/ditrit/badaas/testintegration/models" ) -type ExpressionIntTestSuite struct { +type OperatorIntTestSuite struct { CRUDServiceCommonIntTestSuite crudProductService badorm.CRUDService[models.Product, badorm.UUID] } -func NewExpressionsIntTestSuite( +func NewOperatorIntTestSuite( db *gorm.DB, crudProductService badorm.CRUDService[models.Product, badorm.UUID], -) *ExpressionIntTestSuite { - return &ExpressionIntTestSuite{ +) *OperatorIntTestSuite { + return &OperatorIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ db: db, }, @@ -36,7 +36,7 @@ func NewExpressionsIntTestSuite( } } -func (ts *ExpressionIntTestSuite) TestEqNullableNullReturnsError() { +func (ts *OperatorIntTestSuite) TestEqNullableNullReturnsError() { _, err := ts.crudProductService.GetEntities( conditions.ProductNullFloat( badorm.Eq(sql.NullFloat64{Valid: false}), @@ -45,7 +45,7 @@ func (ts *ExpressionIntTestSuite) TestEqNullableNullReturnsError() { ts.ErrorIs(err, badorm.ErrValueCantBeNull) } -func (ts *ExpressionIntTestSuite) TestEqPointers() { +func (ts *OperatorIntTestSuite) TestEqPointers() { intMatch := 1 match := ts.createProduct("match", 1, 0, false, &intMatch) @@ -63,7 +63,7 @@ func (ts *ExpressionIntTestSuite) TestEqPointers() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNotNil() { +func (ts *OperatorIntTestSuite) TestEqOrIsNullTNotNil() { match := ts.createProduct("match", 1, 0, false, nil) ts.createProduct("match", 3, 0, false, nil) @@ -77,7 +77,7 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNotNil() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNil() { +func (ts *OperatorIntTestSuite) TestEqOrIsNullTNil() { match := ts.createProduct("match", 1, 0, false, nil) notMatch := ts.createProduct("match", 3, 0, false, nil) notMatch.ByteArray = []byte{2, 3} @@ -94,7 +94,7 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNil() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNilOfType() { +func (ts *OperatorIntTestSuite) TestEqOrIsNullTNilOfType() { match := ts.createProduct("match", 1, 0, false, nil) notMatch := ts.createProduct("match", 3, 0, false, nil) notMatch.ByteArray = []byte{2, 3} @@ -113,7 +113,7 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullTNilOfType() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestEqOrIsNullNilPointer() { +func (ts *OperatorIntTestSuite) TestEqOrIsNullNilPointer() { match := ts.createProduct("match", 1, 0, false, nil) notMatchInt := 1 @@ -131,7 +131,7 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullNilPointer() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestEqOrIsNullNotNilPointer() { +func (ts *OperatorIntTestSuite) TestEqOrIsNullNotNilPointer() { matchInt := 1 match := ts.createProduct("match", 1, 0, false, &matchInt) @@ -147,7 +147,7 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullNotNilPointer() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestEqOrIsNullNullableNil() { +func (ts *OperatorIntTestSuite) TestEqOrIsNullNullableNil() { match := ts.createProduct("match", 1, 0, false, nil) notMatch := ts.createProduct("match", 3, 0, false, nil) @@ -165,7 +165,7 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullNullableNil() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestEqOrIsNullNullableNotNil() { +func (ts *OperatorIntTestSuite) TestEqOrIsNullNullableNotNil() { match := ts.createProduct("match", 1, 0, false, nil) match.NullFloat = sql.NullFloat64{Valid: true, Float64: 6} err := ts.db.Save(match).Error @@ -183,7 +183,7 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullNullableNotNil() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestEqOrIsNullNotRelated() { +func (ts *OperatorIntTestSuite) TestEqOrIsNullNotRelated() { notRelated := "not_related" _, err := ts.crudProductService.GetEntities( @@ -194,7 +194,7 @@ func (ts *ExpressionIntTestSuite) TestEqOrIsNullNotRelated() { ts.ErrorIs(err, badorm.ErrNotRelated) } -func (ts *ExpressionIntTestSuite) TestNotEqOrIsNotNullTNotNil() { +func (ts *OperatorIntTestSuite) TestNotEqOrIsNotNullTNotNil() { match := ts.createProduct("match", 1, 0, false, nil) ts.createProduct("match", 3, 0, false, nil) @@ -208,7 +208,7 @@ func (ts *ExpressionIntTestSuite) TestNotEqOrIsNotNullTNotNil() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestNotEqOrIsNotNullTNil() { +func (ts *OperatorIntTestSuite) TestNotEqOrIsNotNullTNil() { match := ts.createProduct("match", 1, 0, false, nil) match.ByteArray = []byte{2, 3} err := ts.db.Save(match).Error @@ -226,7 +226,7 @@ func (ts *ExpressionIntTestSuite) TestNotEqOrIsNotNullTNil() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestNotEq() { +func (ts *OperatorIntTestSuite) TestNotEq() { match1 := ts.createProduct("match", 1, 0, false, nil) match2 := ts.createProduct("match", 3, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) @@ -241,7 +241,7 @@ func (ts *ExpressionIntTestSuite) TestNotEq() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestLt() { +func (ts *OperatorIntTestSuite) TestLt() { match1 := ts.createProduct("match", 1, 0, false, nil) match2 := ts.createProduct("match", 2, 0, false, nil) ts.createProduct("not_match", 3, 0, false, nil) @@ -257,7 +257,7 @@ func (ts *ExpressionIntTestSuite) TestLt() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestLtNullableNullReturnsError() { +func (ts *OperatorIntTestSuite) TestLtNullableNullReturnsError() { _, err := ts.crudProductService.GetEntities( conditions.ProductNullFloat( badorm.Lt(sql.NullFloat64{Valid: false}), @@ -266,7 +266,7 @@ func (ts *ExpressionIntTestSuite) TestLtNullableNullReturnsError() { ts.ErrorIs(err, badorm.ErrValueCantBeNull) } -func (ts *ExpressionIntTestSuite) TestLtOrEq() { +func (ts *OperatorIntTestSuite) TestLtOrEq() { match1 := ts.createProduct("match", 1, 0, false, nil) match2 := ts.createProduct("match", 2, 0, false, nil) ts.createProduct("not_match", 3, 0, false, nil) @@ -282,7 +282,7 @@ func (ts *ExpressionIntTestSuite) TestLtOrEq() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestNotLt() { +func (ts *OperatorIntTestSuite) TestNotLt() { switch getDBDialector() { case configuration.SQLServer: match1 := ts.createProduct("match", 3, 0, false, nil) @@ -303,7 +303,7 @@ func (ts *ExpressionIntTestSuite) TestNotLt() { } } -func (ts *ExpressionIntTestSuite) TestGt() { +func (ts *OperatorIntTestSuite) TestGt() { match1 := ts.createProduct("match", 3, 0, false, nil) match2 := ts.createProduct("match", 4, 0, false, nil) ts.createProduct("not_match", 1, 0, false, nil) @@ -319,7 +319,7 @@ func (ts *ExpressionIntTestSuite) TestGt() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestGtOrEq() { +func (ts *OperatorIntTestSuite) TestGtOrEq() { match1 := ts.createProduct("match", 3, 0, false, nil) match2 := ts.createProduct("match", 4, 0, false, nil) ts.createProduct("not_match", 1, 0, false, nil) @@ -335,7 +335,7 @@ func (ts *ExpressionIntTestSuite) TestGtOrEq() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestNotGt() { +func (ts *OperatorIntTestSuite) TestNotGt() { switch getDBDialector() { case configuration.SQLServer: match1 := ts.createProduct("match", 1, 0, false, nil) @@ -356,7 +356,7 @@ func (ts *ExpressionIntTestSuite) TestNotGt() { } } -func (ts *ExpressionIntTestSuite) TestBetween() { +func (ts *OperatorIntTestSuite) TestBetween() { match1 := ts.createProduct("match", 3, 0, false, nil) match2 := ts.createProduct("match", 4, 0, false, nil) ts.createProduct("not_match", 6, 0, false, nil) @@ -372,7 +372,7 @@ func (ts *ExpressionIntTestSuite) TestBetween() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestNotBetween() { +func (ts *OperatorIntTestSuite) TestNotBetween() { match1 := ts.createProduct("match", 3, 0, false, nil) match2 := ts.createProduct("match", 4, 0, false, nil) ts.createProduct("not_match", 1, 0, false, nil) @@ -388,7 +388,7 @@ func (ts *ExpressionIntTestSuite) TestNotBetween() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestIsDistinct() { +func (ts *OperatorIntTestSuite) TestIsDistinct() { match1 := ts.createProduct("match", 3, 0, false, nil) match2 := ts.createProduct("match", 4, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) @@ -415,23 +415,23 @@ func (ts *ExpressionIntTestSuite) TestIsDistinct() { } } -func (ts *ExpressionIntTestSuite) TestIsNotDistinct() { +func (ts *OperatorIntTestSuite) TestIsNotDistinct() { match := ts.createProduct("match", 3, 0, false, nil) ts.createProduct("not_match", 4, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - var isNotEqualExpression badorm.Expression[int] + var isNotEqualOperator badorm.Operator[int] switch getDBDialector() { case configuration.MySQL: - isNotEqualExpression = mysql.IsEqual(3) + isNotEqualOperator = mysql.IsEqual(3) case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: - isNotEqualExpression = badorm.IsNotDistinct(3) + isNotEqualOperator = badorm.IsNotDistinct(3) } entities, err := ts.crudProductService.GetEntities( conditions.ProductInt( - isNotEqualExpression, + isNotEqualOperator, ), ) ts.Nil(err) @@ -439,7 +439,7 @@ func (ts *ExpressionIntTestSuite) TestIsNotDistinct() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestIsNotDistinctNullValue() { +func (ts *OperatorIntTestSuite) TestIsNotDistinctNullValue() { match := ts.createProduct("match", 3, 0, false, nil) notMatch := ts.createProduct("not_match", 4, 0, false, nil) @@ -447,18 +447,18 @@ func (ts *ExpressionIntTestSuite) TestIsNotDistinctNullValue() { err := ts.db.Save(notMatch).Error ts.Nil(err) - var isEqualExpression badorm.Expression[sql.NullFloat64] + var isEqualOperator badorm.Operator[sql.NullFloat64] switch getDBDialector() { case configuration.MySQL: - isEqualExpression = mysql.IsEqual(sql.NullFloat64{Valid: false}) + isEqualOperator = mysql.IsEqual(sql.NullFloat64{Valid: false}) case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: - isEqualExpression = badorm.IsNotDistinct(sql.NullFloat64{Valid: false}) + isEqualOperator = badorm.IsNotDistinct(sql.NullFloat64{Valid: false}) } entities, err := ts.crudProductService.GetEntities( conditions.ProductNullFloat( - isEqualExpression, + isEqualOperator, ), ) ts.Nil(err) @@ -466,7 +466,7 @@ func (ts *ExpressionIntTestSuite) TestIsNotDistinctNullValue() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestIsNull() { +func (ts *OperatorIntTestSuite) TestIsNull() { match := ts.createProduct("match", 0, 0, false, nil) int1 := 1 int2 := 2 @@ -484,7 +484,7 @@ func (ts *ExpressionIntTestSuite) TestIsNull() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestIsNullNotPointers() { +func (ts *OperatorIntTestSuite) TestIsNullNotPointers() { match := ts.createProduct("match", 0, 0, false, nil) notMatch := ts.createProduct("not_match", 0, 0, false, nil) @@ -502,7 +502,7 @@ func (ts *ExpressionIntTestSuite) TestIsNullNotPointers() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestIsNotNull() { +func (ts *OperatorIntTestSuite) TestIsNotNull() { int1 := 1 match := ts.createProduct("match", 0, 0, false, &int1) ts.createProduct("not_match", 0, 0, false, nil) @@ -518,7 +518,7 @@ func (ts *ExpressionIntTestSuite) TestIsNotNull() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestIsNotNullNotPointers() { +func (ts *OperatorIntTestSuite) TestIsNotNullNotPointers() { match := ts.createProduct("match", 0, 0, false, nil) match.NullFloat = sql.NullFloat64{Valid: true, Float64: 6} err := ts.db.Save(match).Error @@ -536,24 +536,24 @@ func (ts *ExpressionIntTestSuite) TestIsNotNullNotPointers() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestIsTrue() { +func (ts *OperatorIntTestSuite) TestIsTrue() { match := ts.createProduct("match", 0, 0, true, nil) ts.createProduct("not_match", 0, 0, false, nil) ts.createProduct("not_match", 0, 0, false, nil) - var isTrueExpression badorm.Expression[bool] + var isTrueOperator badorm.Operator[bool] switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - isTrueExpression = badorm.IsTrue[bool]() + isTrueOperator = badorm.IsTrue[bool]() case configuration.SQLServer: // sqlserver doesn't support IsTrue - isTrueExpression = badorm.Eq[bool](true) + isTrueOperator = badorm.Eq[bool](true) } entities, err := ts.crudProductService.GetEntities( conditions.ProductBool( - isTrueExpression, + isTrueOperator, ), ) ts.Nil(err) @@ -561,24 +561,24 @@ func (ts *ExpressionIntTestSuite) TestIsTrue() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestIsFalse() { +func (ts *OperatorIntTestSuite) TestIsFalse() { match := ts.createProduct("match", 0, 0, false, nil) ts.createProduct("not_match", 0, 0, true, nil) ts.createProduct("not_match", 0, 0, true, nil) - var isFalseExpression badorm.Expression[bool] + var isFalseOperator badorm.Operator[bool] switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - isFalseExpression = badorm.IsFalse[bool]() + isFalseOperator = badorm.IsFalse[bool]() case configuration.SQLServer: // sqlserver doesn't support IsFalse - isFalseExpression = badorm.Eq[bool](false) + isFalseOperator = badorm.Eq[bool](false) } entities, err := ts.crudProductService.GetEntities( conditions.ProductBool( - isFalseExpression, + isFalseOperator, ), ) ts.Nil(err) @@ -587,7 +587,7 @@ func (ts *ExpressionIntTestSuite) TestIsFalse() { } //nolint:dupl // not really duplicated -func (ts *ExpressionIntTestSuite) TestIsNotTrue() { +func (ts *OperatorIntTestSuite) TestIsNotTrue() { match1 := ts.createProduct("match", 0, 0, false, nil) match2 := ts.createProduct("match", 0, 0, false, nil) match2.NullBool = sql.NullBool{Valid: true, Bool: false} @@ -599,19 +599,19 @@ func (ts *ExpressionIntTestSuite) TestIsNotTrue() { err = ts.db.Save(notMatch).Error ts.Nil(err) - var isNotTrueExpression badorm.Expression[sql.NullBool] + var isNotTrueOperator badorm.Operator[sql.NullBool] switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - isNotTrueExpression = badorm.IsNotTrue[sql.NullBool]() + isNotTrueOperator = badorm.IsNotTrue[sql.NullBool]() case configuration.SQLServer: // sqlserver doesn't support IsNotTrue - isNotTrueExpression = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: true}) + isNotTrueOperator = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: true}) } entities, err := ts.crudProductService.GetEntities( conditions.ProductNullBool( - isNotTrueExpression, + isNotTrueOperator, ), ) ts.Nil(err) @@ -620,7 +620,7 @@ func (ts *ExpressionIntTestSuite) TestIsNotTrue() { } //nolint:dupl // not really duplicated -func (ts *ExpressionIntTestSuite) TestIsNotFalse() { +func (ts *OperatorIntTestSuite) TestIsNotFalse() { match1 := ts.createProduct("match", 0, 0, false, nil) match2 := ts.createProduct("match", 0, 0, false, nil) match2.NullBool = sql.NullBool{Valid: true, Bool: true} @@ -632,19 +632,19 @@ func (ts *ExpressionIntTestSuite) TestIsNotFalse() { err = ts.db.Save(notMatch).Error ts.Nil(err) - var isNotFalseExpression badorm.Expression[sql.NullBool] + var isNotFalseOperator badorm.Operator[sql.NullBool] switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - isNotFalseExpression = badorm.IsNotFalse[sql.NullBool]() + isNotFalseOperator = badorm.IsNotFalse[sql.NullBool]() case configuration.SQLServer: // sqlserver doesn't support IsNotFalse - isNotFalseExpression = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: false}) + isNotFalseOperator = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: false}) } entities, err := ts.crudProductService.GetEntities( conditions.ProductNullBool( - isNotFalseExpression, + isNotFalseOperator, ), ) ts.Nil(err) @@ -652,7 +652,7 @@ func (ts *ExpressionIntTestSuite) TestIsNotFalse() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestIsUnknown() { +func (ts *OperatorIntTestSuite) TestIsUnknown() { match := ts.createProduct("match", 0, 0, false, nil) notMatch1 := ts.createProduct("match", 0, 0, false, nil) @@ -665,19 +665,19 @@ func (ts *ExpressionIntTestSuite) TestIsUnknown() { err = ts.db.Save(notMatch2).Error ts.Nil(err) - var isUnknownExpression badorm.Expression[sql.NullBool] + var isUnknownOperator badorm.Operator[sql.NullBool] switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL: - isUnknownExpression = badorm.IsUnknown[sql.NullBool]() + isUnknownOperator = badorm.IsUnknown[sql.NullBool]() case configuration.SQLServer, configuration.SQLite: // sqlserver doesn't support IsUnknown - isUnknownExpression = badorm.IsNotDistinct[sql.NullBool](sql.NullBool{Valid: false}) + isUnknownOperator = badorm.IsNotDistinct[sql.NullBool](sql.NullBool{Valid: false}) } entities, err := ts.crudProductService.GetEntities( conditions.ProductNullBool( - isUnknownExpression, + isUnknownOperator, ), ) ts.Nil(err) @@ -685,7 +685,7 @@ func (ts *ExpressionIntTestSuite) TestIsUnknown() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestIsNotUnknown() { +func (ts *OperatorIntTestSuite) TestIsNotUnknown() { match1 := ts.createProduct("", 0, 0, false, nil) match1.NullBool = sql.NullBool{Valid: true, Bool: true} err := ts.db.Save(match1).Error @@ -698,19 +698,19 @@ func (ts *ExpressionIntTestSuite) TestIsNotUnknown() { ts.createProduct("", 0, 0, false, nil) - var isNotUnknownExpression badorm.Expression[sql.NullBool] + var isNotUnknownOperator badorm.Operator[sql.NullBool] switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL: - isNotUnknownExpression = badorm.IsNotUnknown[sql.NullBool]() + isNotUnknownOperator = badorm.IsNotUnknown[sql.NullBool]() case configuration.SQLServer, configuration.SQLite: // sqlserver doesn't support IsNotUnknown - isNotUnknownExpression = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: false}) + isNotUnknownOperator = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: false}) } entities, err := ts.crudProductService.GetEntities( conditions.ProductNullBool( - isNotUnknownExpression, + isNotUnknownOperator, ), ) ts.Nil(err) @@ -718,29 +718,29 @@ func (ts *ExpressionIntTestSuite) TestIsNotUnknown() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestArrayIn() { +func (ts *OperatorIntTestSuite) TestArrayIn() { match1 := ts.createProduct("s1", 0, 0, false, nil) match2 := ts.createProduct("s2", 0, 0, false, nil) ts.createProduct("ns1", 0, 0, false, nil) ts.createProduct("ns2", 0, 0, false, nil) - var arrayInExpression badorm.Expression[string] + var arrayInOperator badorm.Operator[string] switch getDBDialector() { case configuration.MySQL: - arrayInExpression = mysql.ArrayIn("s1", "s2", "s3") + arrayInOperator = mysql.ArrayIn("s1", "s2", "s3") case configuration.PostgreSQL: - arrayInExpression = psql.ArrayIn("s1", "s2", "s3") + arrayInOperator = psql.ArrayIn("s1", "s2", "s3") case configuration.SQLServer: - arrayInExpression = sqlserver.ArrayIn("s1", "s2", "s3") + arrayInOperator = sqlserver.ArrayIn("s1", "s2", "s3") case configuration.SQLite: - arrayInExpression = sqlite.ArrayIn("s1", "s2", "s3") + arrayInOperator = sqlite.ArrayIn("s1", "s2", "s3") } entities, err := ts.crudProductService.GetEntities( conditions.ProductString( - arrayInExpression, + arrayInOperator, ), ) ts.Nil(err) @@ -748,29 +748,29 @@ func (ts *ExpressionIntTestSuite) TestArrayIn() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestArrayNotIn() { +func (ts *OperatorIntTestSuite) TestArrayNotIn() { match1 := ts.createProduct("s1", 0, 0, false, nil) match2 := ts.createProduct("s2", 0, 0, false, nil) ts.createProduct("ns1", 0, 0, false, nil) ts.createProduct("ns2", 0, 0, false, nil) - var arrayNotInExpression badorm.Expression[string] + var arrayNotInOperator badorm.Operator[string] switch getDBDialector() { case configuration.MySQL: - arrayNotInExpression = mysql.ArrayNotIn("ns1", "ns2") + arrayNotInOperator = mysql.ArrayNotIn("ns1", "ns2") case configuration.PostgreSQL: - arrayNotInExpression = psql.ArrayNotIn("ns1", "ns2") + arrayNotInOperator = psql.ArrayNotIn("ns1", "ns2") case configuration.SQLServer: - arrayNotInExpression = sqlserver.ArrayNotIn("ns1", "ns2") + arrayNotInOperator = sqlserver.ArrayNotIn("ns1", "ns2") case configuration.SQLite: - arrayNotInExpression = sqlite.ArrayNotIn("ns1", "ns2") + arrayNotInOperator = sqlite.ArrayNotIn("ns1", "ns2") } entities, err := ts.crudProductService.GetEntities( conditions.ProductString( - arrayNotInExpression, + arrayNotInOperator, ), ) ts.Nil(err) @@ -778,25 +778,25 @@ func (ts *ExpressionIntTestSuite) TestArrayNotIn() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestLike() { +func (ts *OperatorIntTestSuite) TestLike() { match1 := ts.createProduct("basd", 0, 0, false, nil) match2 := ts.createProduct("cape", 0, 0, false, nil) ts.createProduct("bbsd", 0, 0, false, nil) ts.createProduct("bbasd", 0, 0, false, nil) - var likeExpression badorm.Expression[string] + var likeOperator badorm.Operator[string] switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - likeExpression = badorm.Like[string]("_a%") + likeOperator = badorm.Like[string]("_a%") case configuration.SQLServer: - likeExpression = badorm.Like[string]("[bc]a[^a]%") + likeOperator = badorm.Like[string]("[bc]a[^a]%") } entities, err := ts.crudProductService.GetEntities( conditions.ProductString( - likeExpression, + likeOperator, ), ) ts.Nil(err) @@ -804,25 +804,25 @@ func (ts *ExpressionIntTestSuite) TestLike() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestLikeEscape() { +func (ts *OperatorIntTestSuite) TestLikeEscape() { match1 := ts.createProduct("ba_sd", 0, 0, false, nil) match2 := ts.createProduct("ca_pe", 0, 0, false, nil) ts.createProduct("bb_sd", 0, 0, false, nil) ts.createProduct("bba_sd", 0, 0, false, nil) - var likeExpression badorm.Expression[string] + var likeOperator badorm.Operator[string] switch getDBDialector() { case configuration.MySQL, configuration.PostgreSQL, configuration.SQLite: - likeExpression = badorm.Like[string]("_a!_%").Escape('!') + likeOperator = badorm.Like[string]("_a!_%").Escape('!') case configuration.SQLServer: - likeExpression = badorm.Like[string]("[bc]a!_[^a]%").Escape('!') + likeOperator = badorm.Like[string]("[bc]a!_[^a]%").Escape('!') } entities, err := ts.crudProductService.GetEntities( conditions.ProductString( - likeExpression, + likeOperator, ), ) ts.Nil(err) @@ -830,7 +830,7 @@ func (ts *ExpressionIntTestSuite) TestLikeEscape() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } -func (ts *ExpressionIntTestSuite) TestLikeOnNumeric() { +func (ts *OperatorIntTestSuite) TestLikeOnNumeric() { switch getDBDialector() { case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: log.Println("Like with numeric not compatible") @@ -852,7 +852,7 @@ func (ts *ExpressionIntTestSuite) TestLikeOnNumeric() { } } -func (ts *ExpressionIntTestSuite) TestILike() { +func (ts *OperatorIntTestSuite) TestILike() { switch getDBDialector() { case configuration.MySQL, configuration.SQLServer, configuration.SQLite: log.Println("ILike not compatible") @@ -875,7 +875,7 @@ func (ts *ExpressionIntTestSuite) TestILike() { } } -func (ts *ExpressionIntTestSuite) TestSimilarTo() { +func (ts *OperatorIntTestSuite) TestSimilarTo() { switch getDBDialector() { case configuration.MySQL, configuration.SQLServer, configuration.SQLite: log.Println("SimilarTo not compatible") @@ -897,7 +897,7 @@ func (ts *ExpressionIntTestSuite) TestSimilarTo() { } } -func (ts *ExpressionIntTestSuite) TestPosixRegexCaseSensitive() { +func (ts *OperatorIntTestSuite) TestPosixRegexCaseSensitive() { match1 := ts.createProduct("ab", 0, 0, false, nil) match2 := ts.createProduct("ax", 0, 0, false, nil) @@ -905,21 +905,21 @@ func (ts *ExpressionIntTestSuite) TestPosixRegexCaseSensitive() { ts.createProduct("cx", 0, 0, false, nil) ts.createProduct("AB", 0, 0, false, nil) - var posixRegexExpression badorm.Expression[string] + var posixRegexOperator badorm.Operator[string] switch getDBDialector() { case configuration.SQLServer, configuration.MySQL: log.Println("PosixRegex not compatible") case configuration.PostgreSQL: - posixRegexExpression = psql.POSIXMatch[string]("^a(b|x)") + posixRegexOperator = psql.POSIXMatch[string]("^a(b|x)") case configuration.SQLite: - posixRegexExpression = sqlite.Glob[string]("a[bx]") + posixRegexOperator = sqlite.Glob[string]("a[bx]") } - if posixRegexExpression != nil { + if posixRegexOperator != nil { entities, err := ts.crudProductService.GetEntities( conditions.ProductString( - posixRegexExpression, + posixRegexOperator, ), ) ts.Nil(err) @@ -928,7 +928,7 @@ func (ts *ExpressionIntTestSuite) TestPosixRegexCaseSensitive() { } } -func (ts *ExpressionIntTestSuite) TestPosixRegexCaseInsensitive() { +func (ts *OperatorIntTestSuite) TestPosixRegexCaseInsensitive() { match1 := ts.createProduct("ab", 0, 0, false, nil) match2 := ts.createProduct("ax", 0, 0, false, nil) match3 := ts.createProduct("AB", 0, 0, false, nil) @@ -936,21 +936,21 @@ func (ts *ExpressionIntTestSuite) TestPosixRegexCaseInsensitive() { ts.createProduct("bb", 0, 0, false, nil) ts.createProduct("cx", 0, 0, false, nil) - var posixRegexExpression badorm.Expression[string] + var posixRegexOperator badorm.Operator[string] switch getDBDialector() { case configuration.SQLServer, configuration.SQLite: log.Println("PosixRegex Case Insensitive not compatible") case configuration.MySQL: - posixRegexExpression = mysql.RegexP[string]("^a(b|x)") + posixRegexOperator = mysql.RegexP[string]("^a(b|x)") case configuration.PostgreSQL: - posixRegexExpression = psql.POSIXIMatch[string]("^a(b|x)") + posixRegexOperator = psql.POSIXIMatch[string]("^a(b|x)") } - if posixRegexExpression != nil { + if posixRegexOperator != nil { entities, err := ts.crudProductService.GetEntities( conditions.ProductString( - posixRegexExpression, + posixRegexOperator, ), ) ts.Nil(err) @@ -959,31 +959,31 @@ func (ts *ExpressionIntTestSuite) TestPosixRegexCaseInsensitive() { } } -func (ts *ExpressionIntTestSuite) TestPosixRegexNotPosix() { - var posixRegexExpression badorm.Expression[string] +func (ts *OperatorIntTestSuite) TestPosixRegexNotPosix() { + var posixRegexOperator badorm.Operator[string] switch getDBDialector() { case configuration.SQLServer: log.Println("PosixRegex not compatible") case configuration.MySQL: - posixRegexExpression = mysql.RegexP[string]("^a(b|x") + posixRegexOperator = mysql.RegexP[string]("^a(b|x") case configuration.PostgreSQL: - posixRegexExpression = psql.POSIXMatch[string]("^a(b|x") + posixRegexOperator = psql.POSIXMatch[string]("^a(b|x") case configuration.SQLite: - posixRegexExpression = sqlite.Glob[string]("^a(b|x") + posixRegexOperator = sqlite.Glob[string]("^a(b|x") } - if posixRegexExpression != nil { + if posixRegexOperator != nil { _, err := ts.crudProductService.GetEntities( conditions.ProductString( - posixRegexExpression, + posixRegexOperator, ), ) ts.ErrorContains(err, "error parsing regexp") } } -func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBasicType() { +func (ts *OperatorIntTestSuite) TestDynamicOperatorForBasicType() { int1 := 1 product1 := ts.createProduct("", 1, 0.0, false, &int1) ts.createProduct("", 2, 0.0, false, &int1) @@ -999,7 +999,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBasicType() { EqualList(&ts.Suite, []*models.Product{product1}, entities) } -func (ts *ExpressionIntTestSuite) TestDynamicExpressionForCustomType() { +func (ts *OperatorIntTestSuite) TestDynamicOperatorForCustomType() { match := ts.createProduct("salut,hola", 1, 0.0, false, nil) match.MultiString = models.MultiString{"salut", "hola"} err := ts.db.Save(match).Error @@ -1018,7 +1018,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForCustomType() { EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBadORMModelAttribute() { +func (ts *OperatorIntTestSuite) TestDynamicOperatorForBadORMModelAttribute() { match := ts.createProduct("", 1, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( @@ -1031,7 +1031,7 @@ func (ts *ExpressionIntTestSuite) TestDynamicExpressionForBadORMModelAttribute() EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestMultitypeExpressionWithFieldOfAnotherTypeReturnsError() { +func (ts *OperatorIntTestSuite) TestMultitypeOperatorWithFieldOfAnotherTypeReturnsError() { _, err := ts.crudProductService.GetEntities( conditions.ProductInt( multitype.Eq[int](conditions.ProductStringField), @@ -1040,7 +1040,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeExpressionWithFieldOfAnotherTypeR ts.ErrorIs(err, multitype.ErrFieldTypeDoesNotMatch) } -func (ts *ExpressionIntTestSuite) TestMultitypeExpressionForNullableTypeCanBeComparedWithNotNullType() { +func (ts *OperatorIntTestSuite) TestMultitypeOperatorForNullableTypeCanBeComparedWithNotNullType() { match := ts.createProduct("", 1, 1.0, false, nil) match.NullFloat = sql.NullFloat64{Valid: true, Float64: 1.0} err := ts.db.Save(match).Error @@ -1058,7 +1058,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeExpressionForNullableTypeCanBeCom EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestMultitypeExpressionForNotNullTypeCanBeComparedWithNullableType() { +func (ts *OperatorIntTestSuite) TestMultitypeOperatorForNotNullTypeCanBeComparedWithNullableType() { match := ts.createProduct("", 1, 1.0, false, nil) match.NullFloat = sql.NullFloat64{Valid: true, Float64: 1.0} err := ts.db.Save(match).Error @@ -1076,7 +1076,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeExpressionForNotNullTypeCanBeComp EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestMultitypeExpressionForBadORMModelAttribute() { +func (ts *OperatorIntTestSuite) TestMultitypeOperatorForBadORMModelAttribute() { match := ts.createProduct("", 1, 0.0, false, nil) entities, err := ts.crudProductService.GetEntities( @@ -1089,7 +1089,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeExpressionForBadORMModelAttribute EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithValueOfAnotherTypeReturnsError() { +func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithValueOfAnotherTypeReturnsError() { _, err := ts.crudProductService.GetEntities( conditions.ProductInt( multitype.Between[int, int]("hola", 1), @@ -1098,7 +1098,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithValueOfAn ts.ErrorIs(err, multitype.ErrParamsNotValueOrField) } -func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithFieldOfAnotherTypeReturnsError() { +func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithFieldOfAnotherTypeReturnsError() { _, err := ts.crudProductService.GetEntities( conditions.ProductInt( multitype.Between[int, int](1, conditions.ProductCreatedAtField), @@ -1107,7 +1107,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithFieldOfAn ts.ErrorIs(err, multitype.ErrParamsNotValueOrField) } -func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithFieldOfNotRelatedTypeReturnsError() { +func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithFieldOfNotRelatedTypeReturnsError() { _, err := ts.crudProductService.GetEntities( conditions.ProductInt( multitype.Between[int, time.Time](1, conditions.ProductCreatedAtField), @@ -1116,7 +1116,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithFieldOfNo ts.ErrorIs(err, multitype.ErrFieldTypeDoesNotMatch) } -func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithAFieldAndAValue() { +func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithAFieldAndAValue() { match := ts.createProduct("", 1, 0.0, false, nil) ts.createProduct("", 0, 0.0, false, nil) @@ -1130,7 +1130,7 @@ func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithAFieldAnd EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *ExpressionIntTestSuite) TestMultitypeMultivalueExpressionWithAFieldRelatedAndAValue() { +func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithAFieldRelatedAndAValue() { match := ts.createProduct("", 1, 1.0, false, nil) match.NullFloat = sql.NullFloat64{Valid: true, Float64: 2.0} err := ts.db.Save(match).Error diff --git a/testintegration/where_conditions_test.go b/testintegration/where_conditions_test.go index 8fdf6846..88167af5 100644 --- a/testintegration/where_conditions_test.go +++ b/testintegration/where_conditions_test.go @@ -531,27 +531,27 @@ func (ts *WhereConditionsIntTestSuite) TestXor() { ts.createProduct("", 5, 0, false, nil) ts.createProduct("", 4, 0, false, nil) - var xorExpression badorm.WhereCondition[models.Product] + var xorCondition badorm.WhereCondition[models.Product] switch getDBDialector() { case configuration.PostgreSQL, configuration.SQLite, configuration.SQLServer: log.Println("Xor not compatible") case configuration.MySQL: - xorExpression = mysql.Xor( + xorCondition = mysql.Xor( conditions.ProductInt(badorm.Lt(6)), conditions.ProductInt(badorm.Gt(3)), ) } - if xorExpression != nil { - entities, err := ts.crudProductService.GetEntities(xorExpression) + if xorCondition != nil { + entities, err := ts.crudProductService.GetEntities(xorCondition) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) } } -func (ts *WhereConditionsIntTestSuite) TestMultipleConditionsDifferentExpressions() { +func (ts *WhereConditionsIntTestSuite) TestMultipleConditionsDifferentOperators() { match1 := ts.createProduct("match", 1, 0.0, true, nil) match2 := ts.createProduct("match", 1, 0.0, true, nil) diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 65759645..347119c9 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -18,8 +18,8 @@ const ( badORMIJoinCondition = "IJoinCondition" badORMFieldIdentifier = "FieldIdentifier" badORMNewCollectionPreload = "NewCollectionPreloadCondition" - // badorm/expression.go - badORMExpression = "Expression" + // badorm/operator.go + badORMOperator = "Operator" // badorm/baseModels.go uIntID = "UIntID" uuid = "UUID" @@ -185,7 +185,7 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { ).Block( jen.Return( fieldCondition.Clone().Values(jen.Dict{ - jen.Id("Expression"): jen.Id("expr"), + jen.Id("Operator"): jen.Id("operator"), jen.Id("FieldIdentifier"): condition.createFieldIdentifier( objectType.Name(), objectTypeQual, field, conditionName, diff --git a/tools/badctl/cmd/gen/conditions/jenParam.go b/tools/badctl/cmd/gen/conditions/jenParam.go index 174a6898..90d3911b 100644 --- a/tools/badctl/cmd/gen/conditions/jenParam.go +++ b/tools/badctl/cmd/gen/conditions/jenParam.go @@ -16,8 +16,8 @@ type JenParam struct { func NewJenParam() *JenParam { return &JenParam{ - statement: jen.Id("expr").Qual( - badORMPath, badORMExpression, + statement: jen.Id("operator").Qual( + badORMPath, badORMOperator, ), internalType: &jen.Statement{}, } From 382bb469c83d6a0b3cfc1760fcf8d3796c4a0299 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Jul 2023 10:11:44 +0200 Subject: [PATCH 425/467] add unsafe operators + refactor unsafe condition --- badorm/condition.go | 81 ++++++------------------ badorm/dynamic/operators.go | 4 +- badorm/dynamic/value.go | 2 +- badorm/multitype/operators.go | 6 +- badorm/multitype/value.go | 2 +- badorm/unsafe/condition.go | 45 +++++++++++++ badorm/unsafe/multivalue.go | 21 ++++++ badorm/unsafe/operators.go | 71 +++++++++++++++++++++ badorm/unsafe/value.go | 25 ++++++++ badorm/valueOperator.go | 8 +-- testintegration/join_conditions_test.go | 11 ++-- testintegration/operators_test.go | 33 ++++++++++ testintegration/where_conditions_test.go | 3 +- 13 files changed, 235 insertions(+), 77 deletions(-) create mode 100644 badorm/unsafe/condition.go create mode 100644 badorm/unsafe/multivalue.go create mode 100644 badorm/unsafe/operators.go create mode 100644 badorm/unsafe/value.go diff --git a/badorm/condition.go b/badorm/condition.go index 237dc40f..87243f97 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -26,7 +26,7 @@ type Condition[T Model] interface { // that an object is of type Condition[T], // since if no method receives by parameter a type T, // any other Condition[T2] would also be considered a Condition[T]. - interfaceVerificationMethod(T) + InterfaceVerificationMethod(T) } // Conditions that can be used in a where clause @@ -39,7 +39,7 @@ type WhereCondition[T Model] interface { // Returns true if the DeletedAt column if affected by the condition // If no condition affects the DeletedAt, the verification that it's null will be added automatically - affectsDeletedAt() bool + AffectsDeletedAt() bool } // Condition that contains a internal condition. @@ -50,13 +50,13 @@ type ContainerCondition[T Model] struct { } //nolint:unused // see inside -func (condition ContainerCondition[T]) interfaceVerificationMethod(_ T) { +func (condition ContainerCondition[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] } func (condition ContainerCondition[T]) ApplyTo(query *Query, table Table) error { - return applyWhereCondition[T](condition, query, table) + return ApplyWhereCondition[T](condition, query, table) } func (condition ContainerCondition[T]) GetSQL(query *Query, table Table) (string, []any, error) { @@ -71,8 +71,8 @@ func (condition ContainerCondition[T]) GetSQL(query *Query, table Table) (string } //nolint:unused // is used -func (condition ContainerCondition[T]) affectsDeletedAt() bool { - return condition.ConnectionCondition.affectsDeletedAt() +func (condition ContainerCondition[T]) AffectsDeletedAt() bool { + return condition.ConnectionCondition.AffectsDeletedAt() } // Condition that contains a internal condition. @@ -96,13 +96,13 @@ type ConnectionCondition[T Model] struct { } //nolint:unused // see inside -func (condition ConnectionCondition[T]) interfaceVerificationMethod(_ T) { +func (condition ConnectionCondition[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] } func (condition ConnectionCondition[T]) ApplyTo(query *Query, table Table) error { - return applyWhereCondition[T](condition, query, table) + return ApplyWhereCondition[T](condition, query, table) } func (condition ConnectionCondition[T]) GetSQL(query *Query, table Table) (string, []any, error) { @@ -124,9 +124,9 @@ func (condition ConnectionCondition[T]) GetSQL(query *Query, table Table) (strin } //nolint:unused // is used -func (condition ConnectionCondition[T]) affectsDeletedAt() bool { +func (condition ConnectionCondition[T]) AffectsDeletedAt() bool { return pie.Any(condition.Conditions, func(internalCondition WhereCondition[T]) bool { - return internalCondition.affectsDeletedAt() + return internalCondition.AffectsDeletedAt() }) } @@ -145,7 +145,7 @@ type PreloadCondition[T Model] struct { } //nolint:unused // see inside -func (condition PreloadCondition[T]) interfaceVerificationMethod(_ T) { +func (condition PreloadCondition[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] } @@ -173,7 +173,7 @@ type CollectionPreloadCondition[T1 Model, T2 Model] struct { } //nolint:unused // see inside -func (condition CollectionPreloadCondition[T1, T2]) interfaceVerificationMethod(_ T1) { +func (condition CollectionPreloadCondition[T1, T2]) InterfaceVerificationMethod(_ T1) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T1] } @@ -230,7 +230,7 @@ type FieldCondition[TObject Model, TAtribute any] struct { } //nolint:unused // see inside -func (condition FieldCondition[TObject, TAtribute]) interfaceVerificationMethod(_ TObject) { +func (condition FieldCondition[TObject, TAtribute]) InterfaceVerificationMethod(_ TObject) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] } @@ -238,16 +238,16 @@ func (condition FieldCondition[TObject, TAtribute]) interfaceVerificationMethod( // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value func (condition FieldCondition[TObject, TAtribute]) ApplyTo(query *Query, table Table) error { - return applyWhereCondition[TObject](condition, query, table) + return ApplyWhereCondition[TObject](condition, query, table) } -func applyWhereCondition[T Model](condition WhereCondition[T], query *Query, table Table) error { +func ApplyWhereCondition[T Model](condition WhereCondition[T], query *Query, table Table) error { sql, values, err := condition.GetSQL(query, table) if err != nil { return err } - if condition.affectsDeletedAt() { + if condition.AffectsDeletedAt() { query.Unscoped() } @@ -260,7 +260,7 @@ func applyWhereCondition[T Model](condition WhereCondition[T], query *Query, tab } //nolint:unused // is used -func (condition FieldCondition[TObject, TAtribute]) affectsDeletedAt() bool { +func (condition FieldCondition[TObject, TAtribute]) AffectsDeletedAt() bool { return condition.FieldIdentifier.Field == deletedAtField } @@ -293,7 +293,7 @@ type JoinCondition[T1 Model, T2 Model] struct { } //nolint:unused // see inside -func (condition JoinCondition[T1, T2]) interfaceVerificationMethod(_ T1) { +func (condition JoinCondition[T1, T2]) InterfaceVerificationMethod(_ T1) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] } @@ -349,7 +349,6 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *Query, t1Table Table) erro // apply WhereConditions to the join in the "on" clause connectionCondition := And(whereConditions...) - // TODO aca es donde tengo que mandar la lista correcta onQuery, onValues, err := connectionCondition.GetSQL(query, t2Table) if err != nil { return err @@ -359,7 +358,7 @@ func (condition JoinCondition[T1, T2]) ApplyTo(query *Query, t1Table Table) erro joinQuery += " AND " + onQuery } - if !connectionCondition.affectsDeletedAt() { + if !connectionCondition.AffectsDeletedAt() { joinQuery += fmt.Sprintf( " AND %s.deleted_at IS NULL", t2Table.Alias, @@ -449,51 +448,13 @@ func divideConditionsByType[T Model]( return } -// Condition that can be used to express conditions that are not supported (yet?) by BaDORM -// Example: table1.columnX = table2.columnY -type UnsafeCondition[T Model] struct { - SQLCondition string - Values []any -} - -//nolint:unused // see inside -func (condition UnsafeCondition[T]) interfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Condition[T] -} - -func (condition UnsafeCondition[T]) ApplyTo(query *Query, table Table) error { - return applyWhereCondition[T](condition, query, table) -} - -func (condition UnsafeCondition[T]) GetSQL(_ *Query, table Table) (string, []any, error) { - return fmt.Sprintf( - condition.SQLCondition, - table.Alias, - ), condition.Values, nil -} - -//nolint:unused // is used -func (condition UnsafeCondition[T]) affectsDeletedAt() bool { - return false -} - -// Condition that can be used to express conditions that are not supported (yet?) by BaDORM -// Example: table1.columnX = table2.columnY -func NewUnsafeCondition[T Model](condition string, values []any) UnsafeCondition[T] { - return UnsafeCondition[T]{ - SQLCondition: condition, - Values: values, - } -} - // Condition used to returns an error when the query is executed type InvalidCondition[T any] struct { Err error } //nolint:unused // see inside -func (condition InvalidCondition[T]) interfaceVerificationMethod(_ T) { +func (condition InvalidCondition[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Condition[T] } @@ -507,7 +468,7 @@ func (condition InvalidCondition[T]) GetSQL(_ *Query, _ Table) (string, []any, e } //nolint:unused // is used -func (condition InvalidCondition[T]) affectsDeletedAt() bool { +func (condition InvalidCondition[T]) AffectsDeletedAt() bool { return false } diff --git a/badorm/dynamic/operators.go b/badorm/dynamic/operators.go index f8f77649..e0a8b171 100644 --- a/badorm/dynamic/operators.go +++ b/badorm/dynamic/operators.go @@ -49,12 +49,12 @@ func GtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { // https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE // Equivalent to field1 < value < field2 -func Between[T any](field1 badorm.FieldIdentifier[T], field2 badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { +func Between[T any](field1, field2 badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { return newMultivalueOperator(sql.Between, "AND", "", "", field1, field2) } // Equivalent to NOT (field1 < value < field2) -func NotBetween[T any](field1 badorm.FieldIdentifier[T], field2 badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { +func NotBetween[T any](field1, field2 badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { return newMultivalueOperator(sql.NotBetween, "AND", "", "", field1, field2) } diff --git a/badorm/dynamic/value.go b/badorm/dynamic/value.go index 956c6f6d..eac5988d 100644 --- a/badorm/dynamic/value.go +++ b/badorm/dynamic/value.go @@ -17,7 +17,7 @@ func newValueOperator[T any]( Operations: []badorm.Operation{ { SQLOperator: sqlOperator, - Field: field, + Value: field, }, }, JoinNumber: badorm.UndefinedJoinNumber, diff --git a/badorm/multitype/operators.go b/badorm/multitype/operators.go index 41909c5d..bee712b3 100644 --- a/badorm/multitype/operators.go +++ b/badorm/multitype/operators.go @@ -49,12 +49,12 @@ func GtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm // https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE // Equivalent to v1 < value < v2 -func Between[TAttribute, TField any](v1 any, v2 any) badorm.DynamicOperator[TAttribute] { +func Between[TAttribute, TField any](v1, v2 any) badorm.DynamicOperator[TAttribute] { return newMultivalueOperator[TAttribute, TField](sql.Between, "AND", "", "", v1, v2) } -// Equivalent to NOT (field1 < value < field2) -func NotBetween[TAttribute, TField any](v1 any, v2 any) badorm.DynamicOperator[TAttribute] { +// Equivalent to NOT (v1 < value < v2) +func NotBetween[TAttribute, TField any](v1, v2 any) badorm.DynamicOperator[TAttribute] { return newMultivalueOperator[TAttribute, TField](sql.NotBetween, "AND", "", "", v1, v2) } diff --git a/badorm/multitype/value.go b/badorm/multitype/value.go index ecee69ef..50d52455 100644 --- a/badorm/multitype/value.go +++ b/badorm/multitype/value.go @@ -64,7 +64,7 @@ func newValueOperator[TAttribute, TField any]( Operations: []badorm.Operation{ { SQLOperator: sqlOperator, - Field: field, + Value: field, }, }, JoinNumber: badorm.UndefinedJoinNumber, diff --git a/badorm/unsafe/condition.go b/badorm/unsafe/condition.go new file mode 100644 index 00000000..e6b6d28b --- /dev/null +++ b/badorm/unsafe/condition.go @@ -0,0 +1,45 @@ +package unsafe + +import ( + "fmt" + + "github.com/ditrit/badaas/badorm" +) + +// Condition that can be used to express conditions that are not supported (yet?) by BaDORM +// Example: table1.columnX = table2.columnY +type Condition[T badorm.Model] struct { + SQLCondition string + Values []any +} + +//nolint:unused // see inside +func (condition Condition[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} + +func (condition Condition[T]) ApplyTo(query *badorm.Query, table badorm.Table) error { + return badorm.ApplyWhereCondition[T](condition, query, table) +} + +func (condition Condition[T]) GetSQL(_ *badorm.Query, table badorm.Table) (string, []any, error) { + return fmt.Sprintf( + condition.SQLCondition, + table.Alias, + ), condition.Values, nil +} + +//nolint:unused // is used +func (condition Condition[T]) AffectsDeletedAt() bool { + return false +} + +// Condition that can be used to express conditions that are not supported (yet?) by BaDORM +// Example: table1.columnX = table2.columnY +func NewCondition[T badorm.Model](condition string, values ...any) Condition[T] { + return Condition[T]{ + SQLCondition: condition, + Values: values, + } +} diff --git a/badorm/unsafe/multivalue.go b/badorm/unsafe/multivalue.go new file mode 100644 index 00000000..25531b24 --- /dev/null +++ b/badorm/unsafe/multivalue.go @@ -0,0 +1,21 @@ +package unsafe + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" +) + +func newMultivalueOperator[T any]( + sqlOperator sql.Operator, + sqlConnector, sqlPrefix, sqlSuffix string, + values ...any, +) badorm.DynamicOperator[T] { + return &badorm.MultivalueOperator[T]{ + Values: values, + SQLOperator: sqlOperator, + SQLConnector: sqlConnector, + SQLPrefix: sqlPrefix, + SQLSuffix: sqlSuffix, + JoinNumber: badorm.UndefinedJoinNumber, + } +} diff --git a/badorm/unsafe/operators.go b/badorm/unsafe/operators.go new file mode 100644 index 00000000..aa27f155 --- /dev/null +++ b/badorm/unsafe/operators.go @@ -0,0 +1,71 @@ +package unsafe + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" +) + +// Comparison Operators +// refs: +// - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// - PostgreSQL: https://www.postgresql.org/docs/current/functions-comparison.html +// - SQLServer: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 +// - SQLite: https://www.sqlite.org/lang_expr.html + +// EqualTo +func Eq[T any](value any) badorm.DynamicOperator[T] { + return newValueOperator[T](sql.Eq, value) +} + +// NotEqualTo +func NotEq[T any](value any) badorm.DynamicOperator[T] { + return newValueOperator[T](sql.NotEq, value) +} + +// LessThan +func Lt[T any](value any) badorm.DynamicOperator[T] { + return newValueOperator[T](sql.Lt, value) +} + +// LessThanOrEqualTo +func LtOrEq[T any](value any) badorm.DynamicOperator[T] { + return newValueOperator[T](sql.LtOrEq, value) +} + +// GreaterThan +func Gt[T any](value any) badorm.DynamicOperator[T] { + // TODO invertir orden de parametros para que quede igual que en badorm/expression + return newValueOperator[T](sql.Gt, value) +} + +// GreaterThanOrEqualTo +func GtOrEq[T any](value any) badorm.DynamicOperator[T] { + return newValueOperator[T](sql.GtOrEq, value) +} + +// Comparison Predicates +// refs: +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html +// https://www.postgresql.org/docs/current/functions-comparison.html#FUNCTIONS-COMPARISON-PRED-TABLE + +// Equivalent to v1 < value < v2 +func Between[T any](v1, v2 any) badorm.DynamicOperator[T] { + return newMultivalueOperator[T](sql.Between, "AND", "", "", v1, v2) +} + +// Equivalent to NOT (v1 < value < v2) +func NotBetween[T any](v1, v2 any) badorm.DynamicOperator[T] { + return newMultivalueOperator[T](sql.NotBetween, "AND", "", "", v1, v2) +} + +// Boolean Comparison Predicates + +// Not supported by: mysql +func IsDistinct[T any](value any) badorm.DynamicOperator[T] { + return newValueOperator[T](sql.IsDistinct, value) +} + +// Not supported by: mysql +func IsNotDistinct[T any](value any) badorm.DynamicOperator[T] { + return newValueOperator[T](sql.IsNotDistinct, value) +} diff --git a/badorm/unsafe/value.go b/badorm/unsafe/value.go new file mode 100644 index 00000000..f7e66090 --- /dev/null +++ b/badorm/unsafe/value.go @@ -0,0 +1,25 @@ +package unsafe + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" +) + +func newValueOperator[T any]( + sqlOperator sql.Operator, + value any, +) badorm.DynamicOperator[T] { + // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo + // TODO que pasa si hay mas de uno, no se si me gusta mucho esto + // creo que si hay mas de uno solo se tendria que aplicar en el primero, + // TODO soportar multivalue, no todos necesariamente dinamicos + return &badorm.ValueOperator[T]{ + Operations: []badorm.Operation{ + { + SQLOperator: sqlOperator, + Value: value, + }, + }, + JoinNumber: badorm.UndefinedJoinNumber, + } +} diff --git a/badorm/valueOperator.go b/badorm/valueOperator.go index aa597409..c60b49ac 100644 --- a/badorm/valueOperator.go +++ b/badorm/valueOperator.go @@ -31,7 +31,6 @@ type ValueOperator[T any] struct { type Operation struct { SQLOperator badormSQL.Operator - Field IFieldIdentifier Value any } @@ -65,8 +64,9 @@ func (expr ValueOperator[T]) ToSQL(query *Query, columnName string) (string, []a values := []any{} for _, operation := range expr.Operations { - if operation.Field != nil { - modelTable, err := getModelTable(query, operation.Field, expr.JoinNumber) + field, isField := operation.Value.(IFieldIdentifier) + if isField { + modelTable, err := getModelTable(query, field, expr.JoinNumber) if err != nil { return "", nil, err } @@ -74,7 +74,7 @@ func (expr ValueOperator[T]) ToSQL(query *Query, columnName string) (string, []a operationString += fmt.Sprintf( " %s %s", operation.SQLOperator, - operation.Field.ColumnSQL(query, modelTable), + field.ColumnSQL(query, modelTable), ) } else { operationString += " " + operation.SQLOperator.String() + " ?" diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index b324b0bf..e08da554 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -5,6 +5,7 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/dynamic" + "github.com/ditrit/badaas/badorm/unsafe" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" ) @@ -358,7 +359,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsMultipleTimes() { EqualList(&ts.Suite, []*models.Sale{match}, entities) } -func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2Tables() { +func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorOver2Tables() { company1 := ts.createCompany("ditrit") company2 := ts.createCompany("orness") @@ -377,7 +378,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2Tables() { EqualList(&ts.Suite, []*models.Seller{seller1}, entities) } -func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2TablesAtMoreLevel() { +func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorOver2TablesAtMoreLevel() { product1 := ts.createProduct("", 0, 0.0, false, nil) product2 := ts.createProduct("", 0, 0.0, false, nil) @@ -404,7 +405,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionOver2TablesAtMoreLeve EqualList(&ts.Suite, []*models.Sale{match}, entities) } -func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionJoinMoreThanOnceWithoutSelectJoinReturnsError() { +func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithoutSelectJoinReturnsError() { _, err := ts.crudChildService.GetEntities( conditions.ChildParent1( conditions.Parent1ParentParent(), @@ -417,7 +418,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionJoinMoreThanOnceWitho ts.ErrorIs(err, badorm.ErrJoinMustBeSelected) } -func (ts *JoinConditionsIntTestSuite) TestDynamicExpressionJoinMoreThanOnceWithSelectJoin() { +func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithSelectJoin() { parentParent := &models.ParentParent{Name: "franco"} parent1 := &models.Parent1{ParentParent: *parentParent} parent2 := &models.Parent2{ParentParent: *parentParent} @@ -457,7 +458,7 @@ func (ts *JoinConditionsIntTestSuite) TestJoinWithUnsafeCondition() { entities, err := ts.crudSaleService.GetEntities( conditions.SaleSeller( conditions.SellerCompany( - badorm.NewUnsafeCondition[models.Company]("%s.name = Seller.name", []any{}), + unsafe.NewCondition[models.Company]("%s.name = Seller.name"), ), ), ) diff --git a/testintegration/operators_test.go b/testintegration/operators_test.go index 862f900d..d714b0f5 100644 --- a/testintegration/operators_test.go +++ b/testintegration/operators_test.go @@ -14,6 +14,7 @@ import ( "github.com/ditrit/badaas/badorm/psql" "github.com/ditrit/badaas/badorm/sqlite" "github.com/ditrit/badaas/badorm/sqlserver" + "github.com/ditrit/badaas/badorm/unsafe" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" @@ -1157,3 +1158,35 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithAFieldRelated EqualList(&ts.Suite, []*models.Product{match}, entities) } + +func (ts *OperatorIntTestSuite) TestUnsafeOperatorReturnsDBErrorInCaseTypesNotMatch() { + _, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64]("string"), + ), + ) + ts.ErrorContains(err, "string") +} + +func (ts *OperatorIntTestSuite) TestUnsafeOperatorCanCompareFieldsThatMapToTheSameType() { + match := ts.createProduct("hola,chau", 1, 1.0, false, nil) + match.MultiString = models.MultiString{"hola", "chau"} + err := ts.db.Save(match).Error + ts.Nil(err) + + notMatch := ts.createProduct("chau", 0, 0.0, false, nil) + notMatch.MultiString = models.MultiString{"hola", "chau"} + err = ts.db.Save(notMatch).Error + ts.Nil(err) + + ts.createProduct("", 0, 0.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductString( + unsafe.Eq[string](conditions.ProductMultiStringField), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) +} diff --git a/testintegration/where_conditions_test.go b/testintegration/where_conditions_test.go index 88167af5..759b9be1 100644 --- a/testintegration/where_conditions_test.go +++ b/testintegration/where_conditions_test.go @@ -8,6 +8,7 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/mysql" + "github.com/ditrit/badaas/badorm/unsafe" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" @@ -575,7 +576,7 @@ func (ts *WhereConditionsIntTestSuite) TestUnsafeCondition() { ts.createProduct("not_match", 2, 0.0, true, nil) entities, err := ts.crudProductService.GetEntities( - badorm.NewUnsafeCondition[models.Product]("%s.int = ?", []any{1}), + unsafe.NewCondition[models.Product]("%s.int = ?", 1), ) ts.Nil(err) From ae22e1db6d1689b36890a5366382753926479434 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Jul 2023 11:00:10 +0200 Subject: [PATCH 426/467] refactor string to sql.Connector --- badorm/condition.go | 23 ++++++++++++++--------- badorm/dynamic/multivalue.go | 3 ++- badorm/dynamic/operators.go | 4 ++-- badorm/multitype/multivalue.go | 3 ++- badorm/multitype/operators.go | 4 ++-- badorm/multivalueOperator.go | 19 ++++++++++++------- badorm/mysql/array.go | 4 ++-- badorm/mysql/logical.go | 3 ++- badorm/operators.go | 4 ++-- badorm/sql/connectors.go | 24 ++++++++++++++++++++++++ badorm/unsafe/multivalue.go | 3 ++- badorm/unsafe/operators.go | 4 ++-- 12 files changed, 68 insertions(+), 30 deletions(-) create mode 100644 badorm/sql/connectors.go diff --git a/badorm/condition.go b/badorm/condition.go index 87243f97..1c35b2c2 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -7,6 +7,8 @@ import ( "github.com/elliotchance/pie/v2" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm/sql" ) const deletedAtField = "DeletedAt" @@ -46,7 +48,7 @@ type WhereCondition[T Model] interface { // Example: NOT (internal condition) type ContainerCondition[T Model] struct { ConnectionCondition WhereCondition[T] - Prefix string + Prefix sql.Connector } //nolint:unused // see inside @@ -65,7 +67,7 @@ func (condition ContainerCondition[T]) GetSQL(query *Query, table Table) (string return "", nil, err } - sqlString = condition.Prefix + " (" + sqlString + ")" + sqlString = condition.Prefix.String() + " (" + sqlString + ")" return sqlString, values, nil } @@ -77,7 +79,7 @@ func (condition ContainerCondition[T]) AffectsDeletedAt() bool { // Condition that contains a internal condition. // Example: NOT (internal condition) -func NewContainerCondition[T Model](prefix string, conditions ...WhereCondition[T]) WhereCondition[T] { +func NewContainerCondition[T Model](prefix sql.Connector, conditions ...WhereCondition[T]) WhereCondition[T] { if len(conditions) == 0 { return NewInvalidCondition[T](ErrEmptyConditions) } @@ -91,7 +93,7 @@ func NewContainerCondition[T Model](prefix string, conditions ...WhereCondition[ // Condition that connects multiple conditions. // Example: condition1 AND condition2 type ConnectionCondition[T Model] struct { - Connector string + Connector sql.Connector Conditions []WhereCondition[T] } @@ -120,7 +122,10 @@ func (condition ConnectionCondition[T]) GetSQL(query *Query, table Table) (strin values = append(values, exprValues...) } - return strings.Join(sqlStrings, " "+condition.Connector+" "), values, nil + return strings.Join( + sqlStrings, + " "+condition.Connector.String()+" ", + ), values, nil } //nolint:unused // is used @@ -132,7 +137,7 @@ func (condition ConnectionCondition[T]) AffectsDeletedAt() bool { // Condition that connects multiple conditions. // Example: condition1 AND condition2 -func NewConnectionCondition[T Model](connector string, conditions ...WhereCondition[T]) WhereCondition[T] { +func NewConnectionCondition[T Model](connector sql.Connector, conditions ...WhereCondition[T]) WhereCondition[T] { return ConnectionCondition[T]{ Connector: connector, Conditions: conditions, @@ -487,13 +492,13 @@ func NewInvalidCondition[T any](err error) InvalidCondition[T] { // - SQLite: https://www.sqlite.org/lang_expr.html func And[T Model](conditions ...WhereCondition[T]) WhereCondition[T] { - return NewConnectionCondition("AND", conditions...) + return NewConnectionCondition(sql.And, conditions...) } func Or[T Model](conditions ...WhereCondition[T]) WhereCondition[T] { - return NewConnectionCondition("OR", conditions...) + return NewConnectionCondition(sql.Or, conditions...) } func Not[T Model](conditions ...WhereCondition[T]) WhereCondition[T] { - return NewContainerCondition("NOT", conditions...) + return NewContainerCondition(sql.Not, conditions...) } diff --git a/badorm/dynamic/multivalue.go b/badorm/dynamic/multivalue.go index 1a569ae3..3734f375 100644 --- a/badorm/dynamic/multivalue.go +++ b/badorm/dynamic/multivalue.go @@ -9,7 +9,8 @@ import ( func newMultivalueOperator[T any]( sqlOperator sql.Operator, - sqlConnector, sqlPrefix, sqlSuffix string, + sqlConnector sql.Connector, + sqlPrefix, sqlSuffix string, fields ...badorm.FieldIdentifier[T], ) badorm.DynamicOperator[T] { values := pie.Map(fields, func(field badorm.FieldIdentifier[T]) any { diff --git a/badorm/dynamic/operators.go b/badorm/dynamic/operators.go index e0a8b171..422947bf 100644 --- a/badorm/dynamic/operators.go +++ b/badorm/dynamic/operators.go @@ -50,12 +50,12 @@ func GtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { // Equivalent to field1 < value < field2 func Between[T any](field1, field2 badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newMultivalueOperator(sql.Between, "AND", "", "", field1, field2) + return newMultivalueOperator(sql.Between, sql.And, "", "", field1, field2) } // Equivalent to NOT (field1 < value < field2) func NotBetween[T any](field1, field2 badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newMultivalueOperator(sql.NotBetween, "AND", "", "", field1, field2) + return newMultivalueOperator(sql.NotBetween, sql.And, "", "", field1, field2) } // Boolean Comparison Predicates diff --git a/badorm/multitype/multivalue.go b/badorm/multitype/multivalue.go index 9cb0f783..e379e380 100644 --- a/badorm/multitype/multivalue.go +++ b/badorm/multitype/multivalue.go @@ -7,7 +7,8 @@ import ( func newMultivalueOperator[TAttribute, TField any]( sqlOperator sql.Operator, - sqlConnector, sqlPrefix, sqlSuffix string, + sqlConnector sql.Connector, + sqlPrefix, sqlSuffix string, values ...any, ) badorm.DynamicOperator[TAttribute] { for _, value := range values { diff --git a/badorm/multitype/operators.go b/badorm/multitype/operators.go index bee712b3..433baf1e 100644 --- a/badorm/multitype/operators.go +++ b/badorm/multitype/operators.go @@ -50,12 +50,12 @@ func GtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm // Equivalent to v1 < value < v2 func Between[TAttribute, TField any](v1, v2 any) badorm.DynamicOperator[TAttribute] { - return newMultivalueOperator[TAttribute, TField](sql.Between, "AND", "", "", v1, v2) + return newMultivalueOperator[TAttribute, TField](sql.Between, sql.And, "", "", v1, v2) } // Equivalent to NOT (v1 < value < v2) func NotBetween[TAttribute, TField any](v1, v2 any) badorm.DynamicOperator[TAttribute] { - return newMultivalueOperator[TAttribute, TField](sql.NotBetween, "AND", "", "", v1, v2) + return newMultivalueOperator[TAttribute, TField](sql.NotBetween, sql.And, "", "", v1, v2) } // Boolean Comparison Predicates diff --git a/badorm/multivalueOperator.go b/badorm/multivalueOperator.go index a3dd9167..b52fe29b 100644 --- a/badorm/multivalueOperator.go +++ b/badorm/multivalueOperator.go @@ -12,11 +12,11 @@ import ( // Operator that compares the value of the column against multiple values // Example: value IN (v1, v2, v3, ..., vN) type MultivalueOperator[T any] struct { - Values []any // the values to compare with - SQLOperator sql.Operator // the operator used to compare, example: IN - SQLConnector string // the connector between values, example: ', ' - SQLPrefix string // something to put before the values, example: ( - SQLSuffix string // something to put after the values, example: ) + Values []any // the values to compare with + SQLOperator sql.Operator // the operator used to compare, example: IN + SQLConnector sql.Connector // the connector between values, example: ', ' + SQLPrefix string // something to put before the values, example: ( + SQLSuffix string // something to put after the values, example: ) JoinNumber int } @@ -51,7 +51,7 @@ func (expr MultivalueOperator[T]) ToSQL(query *Query, columnName string) (string } } - placeholders := strings.Join(placeholderList, " "+expr.SQLConnector+" ") + placeholders := strings.Join(placeholderList, " "+expr.SQLConnector.String()+" ") return fmt.Sprintf( "%s %s %s"+placeholders+"%s", @@ -79,7 +79,12 @@ func getModelTable(query *Query, field IFieldIdentifier, joinNumber int) (Table, return modelTables[joinNumber], nil } -func NewMultivalueOperator[T any](sqlOperator sql.Operator, sqlConnector, sqlPrefix, sqlSuffix string, values ...T) Operator[T] { +func NewMultivalueOperator[T any]( + sqlOperator sql.Operator, + sqlConnector sql.Connector, + sqlPrefix, sqlSuffix string, + values ...T, +) Operator[T] { valuesAny := pie.Map(values, func(value T) any { return value }) diff --git a/badorm/mysql/array.go b/badorm/mysql/array.go index 62b83949..baf6152b 100644 --- a/badorm/mysql/array.go +++ b/badorm/mysql/array.go @@ -9,9 +9,9 @@ import ( // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in func ArrayIn[T any](values ...T) badorm.Operator[T] { - return badorm.NewMultivalueOperator(sql.ArrayIn, ",", "(", ")", values...) + return badorm.NewMultivalueOperator(sql.ArrayIn, sql.Comma, "(", ")", values...) } func ArrayNotIn[T any](values ...T) badorm.Operator[T] { - return badorm.NewMultivalueOperator(sql.ArrayNotIn, ",", "(", ")", values...) + return badorm.NewMultivalueOperator(sql.ArrayNotIn, sql.Comma, "(", ")", values...) } diff --git a/badorm/mysql/logical.go b/badorm/mysql/logical.go index 89a8d8b7..1ed78ce3 100644 --- a/badorm/mysql/logical.go +++ b/badorm/mysql/logical.go @@ -2,8 +2,9 @@ package mysql import ( "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" ) func Xor[T badorm.Model](conditions ...badorm.WhereCondition[T]) badorm.WhereCondition[T] { - return badorm.NewConnectionCondition("XOR", conditions...) + return badorm.NewConnectionCondition(sql.MySQLXor, conditions...) } diff --git a/badorm/operators.go b/badorm/operators.go index 6afb6001..87a45b31 100644 --- a/badorm/operators.go +++ b/badorm/operators.go @@ -143,12 +143,12 @@ func IsNotNull[T any]() PredicateOperator[T] { // Equivalent to v1 < value < v2 func Between[T any](v1 T, v2 T) Operator[T] { - return NewMultivalueOperator(badormSQL.Between, "AND", "", "", v1, v2) + return NewMultivalueOperator(badormSQL.Between, badormSQL.And, "", "", v1, v2) } // Equivalent to NOT (v1 < value < v2) func NotBetween[T any](v1 T, v2 T) Operator[T] { - return NewMultivalueOperator(badormSQL.NotBetween, "AND", "", "", v1, v2) + return NewMultivalueOperator(badormSQL.NotBetween, badormSQL.And, "", "", v1, v2) } // Boolean Comparison Predicates diff --git a/badorm/sql/connectors.go b/badorm/sql/connectors.go new file mode 100644 index 00000000..707826c2 --- /dev/null +++ b/badorm/sql/connectors.go @@ -0,0 +1,24 @@ +package sql + +type Connector uint + +const ( + And Connector = iota + Or + Not + Comma + // mysql + MySQLXor +) + +func (con Connector) String() string { + return connectorToSQL[con] +} + +var connectorToSQL = map[Connector]string{ + And: "AND", + Or: "OR", + Not: "NOT", + Comma: ",", + MySQLXor: "XOR", +} diff --git a/badorm/unsafe/multivalue.go b/badorm/unsafe/multivalue.go index 25531b24..9d1a9d2e 100644 --- a/badorm/unsafe/multivalue.go +++ b/badorm/unsafe/multivalue.go @@ -7,7 +7,8 @@ import ( func newMultivalueOperator[T any]( sqlOperator sql.Operator, - sqlConnector, sqlPrefix, sqlSuffix string, + sqlConnector sql.Connector, + sqlPrefix, sqlSuffix string, values ...any, ) badorm.DynamicOperator[T] { return &badorm.MultivalueOperator[T]{ diff --git a/badorm/unsafe/operators.go b/badorm/unsafe/operators.go index aa27f155..118096b5 100644 --- a/badorm/unsafe/operators.go +++ b/badorm/unsafe/operators.go @@ -50,12 +50,12 @@ func GtOrEq[T any](value any) badorm.DynamicOperator[T] { // Equivalent to v1 < value < v2 func Between[T any](v1, v2 any) badorm.DynamicOperator[T] { - return newMultivalueOperator[T](sql.Between, "AND", "", "", v1, v2) + return newMultivalueOperator[T](sql.Between, sql.And, "", "", v1, v2) } // Equivalent to NOT (v1 < value < v2) func NotBetween[T any](v1, v2 any) badorm.DynamicOperator[T] { - return newMultivalueOperator[T](sql.NotBetween, "AND", "", "", v1, v2) + return newMultivalueOperator[T](sql.NotBetween, sql.And, "", "", v1, v2) } // Boolean Comparison Predicates From af226e6d5bcfc77d0c56ad49138c78ec70f4ab53 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Jul 2023 12:45:34 +0200 Subject: [PATCH 427/467] add each db dynamic, multitype and unsafe operator --- badorm/dynamic/multivalue.go | 2 +- badorm/dynamic/mysqldynamic/comparison.go | 15 +++++++++ badorm/dynamic/operators.go | 30 ++++++++++++------ badorm/dynamic/sqlserverdynamic/comparison.go | 18 +++++++++++ badorm/dynamic/value.go | 2 +- badorm/multitype/multivalue.go | 2 +- badorm/multitype/mysqlmultitype/comparison.go | 15 +++++++++ badorm/multitype/operators.go | 31 +++++++++++++------ .../sqlservermultitype/comparison.go | 18 +++++++++++ badorm/multitype/value.go | 2 +- badorm/mysql/array.go | 17 ---------- badorm/mysql/comparison.go | 6 ++-- badorm/operators.go | 31 +++++++++++++------ badorm/psql/array.go | 16 ---------- badorm/psql/comparison.go | 8 ++--- badorm/shared/array.go | 16 ---------- badorm/sqlite/array.go | 16 ---------- badorm/sqlite/comparison.go | 2 +- badorm/sqlserver/array.go | 14 --------- badorm/sqlserver/comparison.go | 8 ++--- badorm/unsafe/multivalue.go | 2 +- badorm/unsafe/mysqlunsafe/comparison.go | 15 +++++++++ badorm/unsafe/operators.go | 31 +++++++++++++------ badorm/unsafe/sqlserverunsafe/comparison.go | 18 +++++++++++ badorm/unsafe/value.go | 2 +- badorm/valueOperator.go | 14 ++++----- testintegration/operators_test.go | 30 ++---------------- 27 files changed, 209 insertions(+), 172 deletions(-) create mode 100644 badorm/dynamic/mysqldynamic/comparison.go create mode 100644 badorm/dynamic/sqlserverdynamic/comparison.go create mode 100644 badorm/multitype/mysqlmultitype/comparison.go create mode 100644 badorm/multitype/sqlservermultitype/comparison.go delete mode 100644 badorm/mysql/array.go delete mode 100644 badorm/psql/array.go delete mode 100644 badorm/shared/array.go delete mode 100644 badorm/sqlite/array.go delete mode 100644 badorm/sqlserver/array.go create mode 100644 badorm/unsafe/mysqlunsafe/comparison.go create mode 100644 badorm/unsafe/sqlserverunsafe/comparison.go diff --git a/badorm/dynamic/multivalue.go b/badorm/dynamic/multivalue.go index 3734f375..6bd18b2e 100644 --- a/badorm/dynamic/multivalue.go +++ b/badorm/dynamic/multivalue.go @@ -7,7 +7,7 @@ import ( "github.com/ditrit/badaas/badorm/sql" ) -func newMultivalueOperator[T any]( +func NewMultivalueOperator[T any]( sqlOperator sql.Operator, sqlConnector sql.Connector, sqlPrefix, sqlSuffix string, diff --git a/badorm/dynamic/mysqldynamic/comparison.go b/badorm/dynamic/mysqldynamic/comparison.go new file mode 100644 index 00000000..1970025e --- /dev/null +++ b/badorm/dynamic/mysqldynamic/comparison.go @@ -0,0 +1,15 @@ +package mysqldynamic + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/dynamic" + "github.com/ditrit/badaas/badorm/sql" +) + +// Comparison Predicates + +// preferred over eq +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal-to +func IsEqual[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return dynamic.NewValueOperator[T](sql.MySQLIsEqual, field) +} diff --git a/badorm/dynamic/operators.go b/badorm/dynamic/operators.go index 422947bf..e2cc3bd9 100644 --- a/badorm/dynamic/operators.go +++ b/badorm/dynamic/operators.go @@ -14,33 +14,33 @@ import ( // EqualTo func Eq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newValueOperator(sql.Eq, field) + return NewValueOperator(sql.Eq, field) } // NotEqualTo func NotEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newValueOperator(sql.NotEq, field) + return NewValueOperator(sql.NotEq, field) } // LessThan func Lt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newValueOperator(sql.Lt, field) + return NewValueOperator(sql.Lt, field) } // LessThanOrEqualTo func LtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newValueOperator(sql.LtOrEq, field) + return NewValueOperator(sql.LtOrEq, field) } // GreaterThan func Gt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { // TODO invertir orden de parametros para que quede igual que en badorm/expression - return newValueOperator(sql.Gt, field) + return NewValueOperator(sql.Gt, field) } // GreaterThanOrEqualTo func GtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newValueOperator(sql.GtOrEq, field) + return NewValueOperator(sql.GtOrEq, field) } // Comparison Predicates @@ -50,22 +50,32 @@ func GtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { // Equivalent to field1 < value < field2 func Between[T any](field1, field2 badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newMultivalueOperator(sql.Between, sql.And, "", "", field1, field2) + return NewMultivalueOperator(sql.Between, sql.And, "", "", field1, field2) } // Equivalent to NOT (field1 < value < field2) func NotBetween[T any](field1, field2 badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newMultivalueOperator(sql.NotBetween, sql.And, "", "", field1, field2) + return NewMultivalueOperator(sql.NotBetween, sql.And, "", "", field1, field2) } // Boolean Comparison Predicates // Not supported by: mysql func IsDistinct[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newValueOperator(sql.IsDistinct, field) + return NewValueOperator(sql.IsDistinct, field) } // Not supported by: mysql func IsNotDistinct[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - return newValueOperator(sql.IsNotDistinct, field) + return NewValueOperator(sql.IsNotDistinct, field) +} + +// Row and Array Comparisons + +func ArrayIn[T any](fields ...badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return NewMultivalueOperator(sql.ArrayIn, sql.Comma, "(", ")", fields...) +} + +func ArrayNotIn[T any](fields ...badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return NewMultivalueOperator(sql.ArrayNotIn, sql.Comma, "(", ")", fields...) } diff --git a/badorm/dynamic/sqlserverdynamic/comparison.go b/badorm/dynamic/sqlserverdynamic/comparison.go new file mode 100644 index 00000000..b94c0d5e --- /dev/null +++ b/badorm/dynamic/sqlserverdynamic/comparison.go @@ -0,0 +1,18 @@ +package sqlserverdynamic + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/dynamic" + "github.com/ditrit/badaas/badorm/sql" +) + +// Comparison Operators +// ref: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 + +func NotLt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return dynamic.NewValueOperator[T](sql.SQLServerNotLt, field) +} + +func NotGt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { + return dynamic.NewValueOperator[T](sql.SQLServerNotGt, field) +} diff --git a/badorm/dynamic/value.go b/badorm/dynamic/value.go index eac5988d..5475d2ce 100644 --- a/badorm/dynamic/value.go +++ b/badorm/dynamic/value.go @@ -5,7 +5,7 @@ import ( "github.com/ditrit/badaas/badorm/sql" ) -func newValueOperator[T any]( +func NewValueOperator[T any]( sqlOperator sql.Operator, field badorm.FieldIdentifier[T], ) badorm.DynamicOperator[T] { diff --git a/badorm/multitype/multivalue.go b/badorm/multitype/multivalue.go index e379e380..e4e5f391 100644 --- a/badorm/multitype/multivalue.go +++ b/badorm/multitype/multivalue.go @@ -5,7 +5,7 @@ import ( "github.com/ditrit/badaas/badorm/sql" ) -func newMultivalueOperator[TAttribute, TField any]( +func NewMultivalueOperator[TAttribute, TField any]( sqlOperator sql.Operator, sqlConnector sql.Connector, sqlPrefix, sqlSuffix string, diff --git a/badorm/multitype/mysqlmultitype/comparison.go b/badorm/multitype/mysqlmultitype/comparison.go new file mode 100644 index 00000000..7f4f7940 --- /dev/null +++ b/badorm/multitype/mysqlmultitype/comparison.go @@ -0,0 +1,15 @@ +package mysqlmultitype + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/multitype" + "github.com/ditrit/badaas/badorm/sql" +) + +// Comparison Predicates + +// preferred over eq +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal-to +func IsEqual[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + return multitype.NewValueOperator[TAttribute, TField](sql.MySQLIsEqual, field) +} diff --git a/badorm/multitype/operators.go b/badorm/multitype/operators.go index 433baf1e..b5408eaf 100644 --- a/badorm/multitype/operators.go +++ b/badorm/multitype/operators.go @@ -14,33 +14,33 @@ import ( // EqualTo func Eq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { - return newValueOperator[TAttribute, TField](sql.Eq, field) + return NewValueOperator[TAttribute, TField](sql.Eq, field) } // NotEqualTo func NotEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { - return newValueOperator[TAttribute, TField](sql.NotEq, field) + return NewValueOperator[TAttribute, TField](sql.NotEq, field) } // LessThan func Lt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { - return newValueOperator[TAttribute, TField](sql.Lt, field) + return NewValueOperator[TAttribute, TField](sql.Lt, field) } // LessThanOrEqualTo func LtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { - return newValueOperator[TAttribute, TField](sql.LtOrEq, field) + return NewValueOperator[TAttribute, TField](sql.LtOrEq, field) } // GreaterThan func Gt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { // TODO invertir orden de parametros para que quede igual que en badorm/expression - return newValueOperator[TAttribute, TField](sql.Gt, field) + return NewValueOperator[TAttribute, TField](sql.Gt, field) } // GreaterThanOrEqualTo func GtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { - return newValueOperator[TAttribute, TField](sql.GtOrEq, field) + return NewValueOperator[TAttribute, TField](sql.GtOrEq, field) } // Comparison Predicates @@ -50,22 +50,33 @@ func GtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm // Equivalent to v1 < value < v2 func Between[TAttribute, TField any](v1, v2 any) badorm.DynamicOperator[TAttribute] { - return newMultivalueOperator[TAttribute, TField](sql.Between, sql.And, "", "", v1, v2) + return NewMultivalueOperator[TAttribute, TField](sql.Between, sql.And, "", "", v1, v2) } // Equivalent to NOT (v1 < value < v2) func NotBetween[TAttribute, TField any](v1, v2 any) badorm.DynamicOperator[TAttribute] { - return newMultivalueOperator[TAttribute, TField](sql.NotBetween, sql.And, "", "", v1, v2) + return NewMultivalueOperator[TAttribute, TField](sql.NotBetween, sql.And, "", "", v1, v2) } // Boolean Comparison Predicates // Not supported by: mysql func IsDistinct[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { - return newValueOperator[TAttribute, TField](sql.IsDistinct, field) + return NewValueOperator[TAttribute, TField](sql.IsDistinct, field) } // Not supported by: mysql func IsNotDistinct[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { - return newValueOperator[TAttribute, TField](sql.IsNotDistinct, field) + return NewValueOperator[TAttribute, TField](sql.IsNotDistinct, field) +} + +// Row and Array Comparisons + +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in +func ArrayIn[TAttribute, TField any](values ...any) badorm.DynamicOperator[TAttribute] { + return NewMultivalueOperator[TAttribute, TField](sql.ArrayIn, sql.Comma, "(", ")", values...) +} + +func ArrayNotIn[TAttribute, TField any](values ...any) badorm.DynamicOperator[TAttribute] { + return NewMultivalueOperator[TAttribute, TField](sql.ArrayNotIn, sql.Comma, "(", ")", values...) } diff --git a/badorm/multitype/sqlservermultitype/comparison.go b/badorm/multitype/sqlservermultitype/comparison.go new file mode 100644 index 00000000..b361c9a3 --- /dev/null +++ b/badorm/multitype/sqlservermultitype/comparison.go @@ -0,0 +1,18 @@ +package sqlservermultitype + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/multitype" + "github.com/ditrit/badaas/badorm/sql" +) + +// Comparison Operators +// ref: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 + +func NotLt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + return multitype.NewValueOperator[TAttribute, TField](sql.SQLServerNotLt, field) +} + +func NotGt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { + return multitype.NewValueOperator[TAttribute, TField](sql.SQLServerNotGt, field) +} diff --git a/badorm/multitype/value.go b/badorm/multitype/value.go index 50d52455..cb11b41d 100644 --- a/badorm/multitype/value.go +++ b/badorm/multitype/value.go @@ -47,7 +47,7 @@ func verifyFieldType[TAttribute, TField any]() badorm.DynamicOperator[TAttribute return nil } -func newValueOperator[TAttribute, TField any]( +func NewValueOperator[TAttribute, TField any]( sqlOperator badormSQL.Operator, field badorm.FieldIdentifier[TField], ) badorm.DynamicOperator[TAttribute] { diff --git a/badorm/mysql/array.go b/badorm/mysql/array.go deleted file mode 100644 index baf6152b..00000000 --- a/badorm/mysql/array.go +++ /dev/null @@ -1,17 +0,0 @@ -package mysql - -import ( - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/sql" -) - -// Row and Array Comparisons - -// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in -func ArrayIn[T any](values ...T) badorm.Operator[T] { - return badorm.NewMultivalueOperator(sql.ArrayIn, sql.Comma, "(", ")", values...) -} - -func ArrayNotIn[T any](values ...T) badorm.Operator[T] { - return badorm.NewMultivalueOperator(sql.ArrayNotIn, sql.Comma, "(", ")", values...) -} diff --git a/badorm/mysql/comparison.go b/badorm/mysql/comparison.go index 806685e0..1f1f5bb6 100644 --- a/badorm/mysql/comparison.go +++ b/badorm/mysql/comparison.go @@ -12,7 +12,7 @@ import ( // preferred over eq // https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal-to func IsEqual[T any](value T) badorm.ValueOperator[T] { - return badorm.NewValueOperator[T](value, badormSQL.MySQLIsEqual) + return badorm.NewValueOperator[T](badormSQL.MySQLIsEqual, value) } // Pattern Matching @@ -23,10 +23,10 @@ func Like[T string | sql.NullString | uint | uint8 | uint16 | uint32 | uint64 | float32 | float64](pattern string, ) badorm.ValueOperator[T] { - return badorm.NewValueOperator[T](pattern, badormSQL.Like) + return badorm.NewValueOperator[T](badormSQL.Like, pattern) } // ref: https://dev.mysql.com/doc/refman/8.0/en/regexp.html#operator_regexp func RegexP[T string | sql.NullString](pattern string) badorm.Operator[T] { - return badorm.NewMustBePOSIXValueOperator[T](pattern, badormSQL.MySQLRegexp) + return badorm.NewMustBePOSIXValueOperator[T](badormSQL.MySQLRegexp, pattern) } diff --git a/badorm/operators.go b/badorm/operators.go index 87a45b31..381e00a4 100644 --- a/badorm/operators.go +++ b/badorm/operators.go @@ -23,7 +23,7 @@ var ErrNotRelated = errors.New("value type not related with T") // EqualTo // EqOrIsNull must be used in cases where value can be NULL func Eq[T any](value T) Operator[T] { - return NewCantBeNullValueOperator[T](value, badormSQL.Eq) + return NewCantBeNullValueOperator[T](badormSQL.Eq, value) } // if value is not NULL returns a Eq operator @@ -45,7 +45,7 @@ func EqOrIsNull[T any](value any) Operator[T] { // NotEqualTo // NotEqOrNotIsNull must be used in cases where value can be NULL func NotEq[T any](value T) Operator[T] { - return NewCantBeNullValueOperator[T](value, badormSQL.NotEq) + return NewCantBeNullValueOperator[T](badormSQL.NotEq, value) } // if value is not NULL returns a NotEq operator @@ -110,22 +110,22 @@ func mapsToNull(value any) bool { // LessThan func Lt[T any](value T) Operator[T] { - return NewCantBeNullValueOperator[T](value, badormSQL.Lt) + return NewCantBeNullValueOperator[T](badormSQL.Lt, value) } // LessThanOrEqualTo func LtOrEq[T any](value T) Operator[T] { - return NewCantBeNullValueOperator[T](value, badormSQL.LtOrEq) + return NewCantBeNullValueOperator[T](badormSQL.LtOrEq, value) } // GreaterThan func Gt[T any](value T) Operator[T] { - return NewCantBeNullValueOperator[T](value, badormSQL.Gt) + return NewCantBeNullValueOperator[T](badormSQL.Gt, value) } // GreaterThanOrEqualTo func GtOrEq[T any](value T) Operator[T] { - return NewCantBeNullValueOperator[T](value, badormSQL.GtOrEq) + return NewCantBeNullValueOperator[T](badormSQL.GtOrEq, value) } // Comparison Predicates @@ -185,12 +185,12 @@ func IsNotUnknown[T bool | sql.NullBool]() PredicateOperator[T] { // Not supported by: mysql func IsDistinct[T any](value T) ValueOperator[T] { - return NewValueOperator[T](value, badormSQL.IsDistinct) + return NewValueOperator[T](badormSQL.IsDistinct, value) } // Not supported by: mysql func IsNotDistinct[T any](value T) ValueOperator[T] { - return NewValueOperator[T](value, badormSQL.IsNotDistinct) + return NewValueOperator[T](badormSQL.IsNotDistinct, value) } // Pattern Matching @@ -201,12 +201,12 @@ type LikeOperator[T string | sql.NullString] struct { func NewLikeOperator[T string | sql.NullString](pattern string, sqlOperator badormSQL.Operator) LikeOperator[T] { return LikeOperator[T]{ - ValueOperator: NewValueOperator[T](pattern, sqlOperator), + ValueOperator: NewValueOperator[T](sqlOperator, pattern), } } func (expr LikeOperator[T]) Escape(escape rune) ValueOperator[T] { - return expr.AddOperation(string(escape), badormSQL.Escape) + return expr.AddOperation(badormSQL.Escape, string(escape)) } // Pattern in all databases: @@ -231,4 +231,15 @@ func Like[T string | sql.NullString](pattern string) LikeOperator[T] { return NewLikeOperator[T](pattern, badormSQL.Like) } +// Row and Array Comparisons + +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in +func ArrayIn[T any](values ...T) Operator[T] { + return NewMultivalueOperator(badormSQL.ArrayIn, badormSQL.Comma, "(", ")", values...) +} + +func ArrayNotIn[T any](values ...T) Operator[T] { + return NewMultivalueOperator(badormSQL.ArrayNotIn, badormSQL.Comma, "(", ")", values...) +} + // TODO Subquery Operators diff --git a/badorm/psql/array.go b/badorm/psql/array.go deleted file mode 100644 index fdea0d6e..00000000 --- a/badorm/psql/array.go +++ /dev/null @@ -1,16 +0,0 @@ -package psql - -import ( - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/shared" -) - -// Row and Array Comparisons - -func ArrayIn[T any](values ...T) badorm.ValueOperator[T] { - return shared.ArrayIn(values...) -} - -func ArrayNotIn[T any](values ...T) badorm.ValueOperator[T] { - return shared.ArrayNotIn(values...) -} diff --git a/badorm/psql/comparison.go b/badorm/psql/comparison.go index 031eff48..37bb5c24 100644 --- a/badorm/psql/comparison.go +++ b/badorm/psql/comparison.go @@ -10,20 +10,20 @@ import ( // Pattern Matching func ILike[T string | sql.NullString](pattern string) badorm.ValueOperator[T] { - return badorm.NewValueOperator[T](pattern, badormSQL.PostgreSQLILike) + return badorm.NewValueOperator[T](badormSQL.PostgreSQLILike, pattern) } // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-SIMILARTO-REGEXP func SimilarTo[T string | sql.NullString](pattern string) badorm.ValueOperator[T] { - return badorm.NewValueOperator[T](pattern, badormSQL.PostgreSQLSimilarTo) + return badorm.NewValueOperator[T](badormSQL.PostgreSQLSimilarTo, pattern) } // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP func POSIXMatch[T string | sql.NullString](pattern string) badorm.Operator[T] { - return badorm.NewMustBePOSIXValueOperator[T](pattern, badormSQL.PostgreSQLPosixMatch) + return badorm.NewMustBePOSIXValueOperator[T](badormSQL.PostgreSQLPosixMatch, pattern) } // ref: https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP func POSIXIMatch[T string | sql.NullString](pattern string) badorm.Operator[T] { - return badorm.NewMustBePOSIXValueOperator[T](pattern, badormSQL.PostgreSQLPosixIMatch) + return badorm.NewMustBePOSIXValueOperator[T](badormSQL.PostgreSQLPosixIMatch, pattern) } diff --git a/badorm/shared/array.go b/badorm/shared/array.go deleted file mode 100644 index 67eff1a0..00000000 --- a/badorm/shared/array.go +++ /dev/null @@ -1,16 +0,0 @@ -package shared - -import ( - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/sql" -) - -// Row and Array Comparisons - -func ArrayIn[T any](values ...T) badorm.ValueOperator[T] { - return badorm.NewValueOperator[T](values, sql.ArrayIn) -} - -func ArrayNotIn[T any](values ...T) badorm.ValueOperator[T] { - return badorm.NewValueOperator[T](values, sql.ArrayNotIn) -} diff --git a/badorm/sqlite/array.go b/badorm/sqlite/array.go deleted file mode 100644 index b76c0d1b..00000000 --- a/badorm/sqlite/array.go +++ /dev/null @@ -1,16 +0,0 @@ -package sqlite - -import ( - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/shared" -) - -// Row and Array Comparisons - -func ArrayIn[T any](values ...T) badorm.ValueOperator[T] { - return shared.ArrayIn(values...) -} - -func ArrayNotIn[T any](values ...T) badorm.ValueOperator[T] { - return shared.ArrayNotIn(values...) -} diff --git a/badorm/sqlite/comparison.go b/badorm/sqlite/comparison.go index 0b40b062..f8ffbbd8 100644 --- a/badorm/sqlite/comparison.go +++ b/badorm/sqlite/comparison.go @@ -9,5 +9,5 @@ import ( // ref: https://www.sqlite.org/lang_expr.html#like func Glob[T string | sql.NullString](pattern string) badorm.Operator[T] { - return badorm.NewMustBePOSIXValueOperator[T](pattern, badormSQL.SQLiteGlob) + return badorm.NewMustBePOSIXValueOperator[T](badormSQL.SQLiteGlob, pattern) } diff --git a/badorm/sqlserver/array.go b/badorm/sqlserver/array.go deleted file mode 100644 index 567607c6..00000000 --- a/badorm/sqlserver/array.go +++ /dev/null @@ -1,14 +0,0 @@ -package sqlserver - -import ( - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/shared" -) - -func ArrayIn[T any](values ...T) badorm.ValueOperator[T] { - return shared.ArrayIn(values...) -} - -func ArrayNotIn[T any](values ...T) badorm.ValueOperator[T] { - return shared.ArrayNotIn(values...) -} diff --git a/badorm/sqlserver/comparison.go b/badorm/sqlserver/comparison.go index 3d959e23..198dbf2b 100644 --- a/badorm/sqlserver/comparison.go +++ b/badorm/sqlserver/comparison.go @@ -11,19 +11,19 @@ import ( // EqNullable is the same as badorm.Eq but it supports value to be NULL // ansi_nulls must be set to off to avoid the NULL = NULL: unknown problem func EqNullable[T any](value T) badorm.Operator[T] { - return badorm.NewValueOperator[T](value, sql.SQLServerEqNullable) + return badorm.NewValueOperator[T](sql.SQLServerEqNullable, value) } // NotEqNullable is the same as badorm.NotEq but it supports value to be NULL // ansi_nulls must be set to off to avoid the NULL = NULL: unknown problem func NotEqNullable[T any](value T) badorm.Operator[T] { - return badorm.NewValueOperator[T](value, sql.SQLServerNotEqNullable) + return badorm.NewValueOperator[T](sql.SQLServerNotEqNullable, value) } func NotLt[T any](value T) badorm.Operator[T] { - return badorm.NewCantBeNullValueOperator[T](value, sql.SQLServerNotLt) + return badorm.NewCantBeNullValueOperator[T](sql.SQLServerNotLt, value) } func NotGt[T any](value T) badorm.Operator[T] { - return badorm.NewCantBeNullValueOperator[T](value, sql.SQLServerNotGt) + return badorm.NewCantBeNullValueOperator[T](sql.SQLServerNotGt, value) } diff --git a/badorm/unsafe/multivalue.go b/badorm/unsafe/multivalue.go index 9d1a9d2e..6dafbfb6 100644 --- a/badorm/unsafe/multivalue.go +++ b/badorm/unsafe/multivalue.go @@ -5,7 +5,7 @@ import ( "github.com/ditrit/badaas/badorm/sql" ) -func newMultivalueOperator[T any]( +func NewMultivalueOperator[T any]( sqlOperator sql.Operator, sqlConnector sql.Connector, sqlPrefix, sqlSuffix string, diff --git a/badorm/unsafe/mysqlunsafe/comparison.go b/badorm/unsafe/mysqlunsafe/comparison.go new file mode 100644 index 00000000..45e1f798 --- /dev/null +++ b/badorm/unsafe/mysqlunsafe/comparison.go @@ -0,0 +1,15 @@ +package mysqlunsafe + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" + "github.com/ditrit/badaas/badorm/unsafe" +) + +// Comparison Predicates + +// preferred over eq +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_equal-to +func IsEqual[T any](value any) badorm.DynamicOperator[T] { + return unsafe.NewValueOperator[T](sql.MySQLIsEqual, value) +} diff --git a/badorm/unsafe/operators.go b/badorm/unsafe/operators.go index 118096b5..c8515d06 100644 --- a/badorm/unsafe/operators.go +++ b/badorm/unsafe/operators.go @@ -14,33 +14,33 @@ import ( // EqualTo func Eq[T any](value any) badorm.DynamicOperator[T] { - return newValueOperator[T](sql.Eq, value) + return NewValueOperator[T](sql.Eq, value) } // NotEqualTo func NotEq[T any](value any) badorm.DynamicOperator[T] { - return newValueOperator[T](sql.NotEq, value) + return NewValueOperator[T](sql.NotEq, value) } // LessThan func Lt[T any](value any) badorm.DynamicOperator[T] { - return newValueOperator[T](sql.Lt, value) + return NewValueOperator[T](sql.Lt, value) } // LessThanOrEqualTo func LtOrEq[T any](value any) badorm.DynamicOperator[T] { - return newValueOperator[T](sql.LtOrEq, value) + return NewValueOperator[T](sql.LtOrEq, value) } // GreaterThan func Gt[T any](value any) badorm.DynamicOperator[T] { // TODO invertir orden de parametros para que quede igual que en badorm/expression - return newValueOperator[T](sql.Gt, value) + return NewValueOperator[T](sql.Gt, value) } // GreaterThanOrEqualTo func GtOrEq[T any](value any) badorm.DynamicOperator[T] { - return newValueOperator[T](sql.GtOrEq, value) + return NewValueOperator[T](sql.GtOrEq, value) } // Comparison Predicates @@ -50,22 +50,33 @@ func GtOrEq[T any](value any) badorm.DynamicOperator[T] { // Equivalent to v1 < value < v2 func Between[T any](v1, v2 any) badorm.DynamicOperator[T] { - return newMultivalueOperator[T](sql.Between, sql.And, "", "", v1, v2) + return NewMultivalueOperator[T](sql.Between, sql.And, "", "", v1, v2) } // Equivalent to NOT (v1 < value < v2) func NotBetween[T any](v1, v2 any) badorm.DynamicOperator[T] { - return newMultivalueOperator[T](sql.NotBetween, sql.And, "", "", v1, v2) + return NewMultivalueOperator[T](sql.NotBetween, sql.And, "", "", v1, v2) } // Boolean Comparison Predicates // Not supported by: mysql func IsDistinct[T any](value any) badorm.DynamicOperator[T] { - return newValueOperator[T](sql.IsDistinct, value) + return NewValueOperator[T](sql.IsDistinct, value) } // Not supported by: mysql func IsNotDistinct[T any](value any) badorm.DynamicOperator[T] { - return newValueOperator[T](sql.IsNotDistinct, value) + return NewValueOperator[T](sql.IsNotDistinct, value) +} + +// Row and Array Comparisons + +// https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_in +func ArrayIn[T any](values ...any) badorm.DynamicOperator[T] { + return NewMultivalueOperator[T](sql.ArrayIn, sql.Comma, "(", ")", values...) +} + +func ArrayNotIn[T any](values ...any) badorm.DynamicOperator[T] { + return NewMultivalueOperator[T](sql.ArrayNotIn, sql.Comma, "(", ")", values...) } diff --git a/badorm/unsafe/sqlserverunsafe/comparison.go b/badorm/unsafe/sqlserverunsafe/comparison.go new file mode 100644 index 00000000..08867999 --- /dev/null +++ b/badorm/unsafe/sqlserverunsafe/comparison.go @@ -0,0 +1,18 @@ +package sqlserverunsafe + +import ( + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" + "github.com/ditrit/badaas/badorm/unsafe" +) + +// Comparison Operators +// ref: https://learn.microsoft.com/en-us/sql/t-sql/language-elements/comparison-operators-transact-sql?view=sql-server-ver16 + +func NotLt[T any](value any) badorm.DynamicOperator[T] { + return unsafe.NewValueOperator[T](sql.SQLServerNotLt, value) +} + +func NotGt[T any](value any) badorm.DynamicOperator[T] { + return unsafe.NewValueOperator[T](sql.SQLServerNotGt, value) +} diff --git a/badorm/unsafe/value.go b/badorm/unsafe/value.go index f7e66090..a3f25c9a 100644 --- a/badorm/unsafe/value.go +++ b/badorm/unsafe/value.go @@ -5,7 +5,7 @@ import ( "github.com/ditrit/badaas/badorm/sql" ) -func newValueOperator[T any]( +func NewValueOperator[T any]( sqlOperator sql.Operator, value any, ) badorm.DynamicOperator[T] { diff --git a/badorm/valueOperator.go b/badorm/valueOperator.go index c60b49ac..f7119576 100644 --- a/badorm/valueOperator.go +++ b/badorm/valueOperator.go @@ -44,7 +44,7 @@ func (expr *ValueOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { return expr } -func (expr *ValueOperator[T]) AddOperation(value any, sqlOperator badormSQL.Operator) ValueOperator[T] { +func (expr *ValueOperator[T]) AddOperation(sqlOperator badormSQL.Operator, value any) ValueOperator[T] { expr.Operations = append( expr.Operations, Operation{ @@ -85,10 +85,10 @@ func (expr ValueOperator[T]) ToSQL(query *Query, columnName string) (string, []a return operationString, values, nil } -func NewValueOperator[T any](value any, sqlOperator badormSQL.Operator) ValueOperator[T] { +func NewValueOperator[T any](sqlOperator badormSQL.Operator, value any) ValueOperator[T] { expr := &ValueOperator[T]{} - return expr.AddOperation(value, sqlOperator) + return expr.AddOperation(sqlOperator, value) } var nullableKinds = []reflect.Kind{ @@ -98,19 +98,19 @@ var nullableKinds = []reflect.Kind{ reflect.Slice, } -func NewCantBeNullValueOperator[T any](value any, sqlOperator badormSQL.Operator) Operator[T] { +func NewCantBeNullValueOperator[T any](sqlOperator badormSQL.Operator, value any) Operator[T] { if value == nil || mapsToNull(value) { return NewInvalidOperator[T](ErrValueCantBeNull) } - return NewValueOperator[T](value, sqlOperator) + return NewValueOperator[T](sqlOperator, value) } -func NewMustBePOSIXValueOperator[T string | sql.NullString](pattern string, sqlOperator badormSQL.Operator) Operator[T] { +func NewMustBePOSIXValueOperator[T string | sql.NullString](sqlOperator badormSQL.Operator, pattern string) Operator[T] { _, err := regexp.CompilePOSIX(pattern) if err != nil { return NewInvalidOperator[T](err) } - return NewValueOperator[T](pattern, sqlOperator) + return NewValueOperator[T](sqlOperator, pattern) } diff --git a/testintegration/operators_test.go b/testintegration/operators_test.go index d714b0f5..ae0f44ed 100644 --- a/testintegration/operators_test.go +++ b/testintegration/operators_test.go @@ -726,22 +726,9 @@ func (ts *OperatorIntTestSuite) TestArrayIn() { ts.createProduct("ns1", 0, 0, false, nil) ts.createProduct("ns2", 0, 0, false, nil) - var arrayInOperator badorm.Operator[string] - - switch getDBDialector() { - case configuration.MySQL: - arrayInOperator = mysql.ArrayIn("s1", "s2", "s3") - case configuration.PostgreSQL: - arrayInOperator = psql.ArrayIn("s1", "s2", "s3") - case configuration.SQLServer: - arrayInOperator = sqlserver.ArrayIn("s1", "s2", "s3") - case configuration.SQLite: - arrayInOperator = sqlite.ArrayIn("s1", "s2", "s3") - } - entities, err := ts.crudProductService.GetEntities( conditions.ProductString( - arrayInOperator, + badorm.ArrayIn("s1", "s2", "s3"), ), ) ts.Nil(err) @@ -756,22 +743,9 @@ func (ts *OperatorIntTestSuite) TestArrayNotIn() { ts.createProduct("ns1", 0, 0, false, nil) ts.createProduct("ns2", 0, 0, false, nil) - var arrayNotInOperator badorm.Operator[string] - - switch getDBDialector() { - case configuration.MySQL: - arrayNotInOperator = mysql.ArrayNotIn("ns1", "ns2") - case configuration.PostgreSQL: - arrayNotInOperator = psql.ArrayNotIn("ns1", "ns2") - case configuration.SQLServer: - arrayNotInOperator = sqlserver.ArrayNotIn("ns1", "ns2") - case configuration.SQLite: - arrayNotInOperator = sqlite.ArrayNotIn("ns1", "ns2") - } - entities, err := ts.crudProductService.GetEntities( conditions.ProductString( - arrayNotInOperator, + badorm.ArrayNotIn("ns1", "ns2"), ), ) ts.Nil(err) From 51c2d790da709a9b95f82814d63d8e66d28e9234 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Jul 2023 12:53:32 +0200 Subject: [PATCH 428/467] remove old todos --- badorm/dynamic/operators.go | 1 - badorm/dynamic/value.go | 4 ---- badorm/multitype/operators.go | 1 - badorm/multitype/value.go | 4 ---- badorm/unsafe/operators.go | 1 - badorm/unsafe/value.go | 4 ---- 6 files changed, 15 deletions(-) diff --git a/badorm/dynamic/operators.go b/badorm/dynamic/operators.go index e2cc3bd9..1c389269 100644 --- a/badorm/dynamic/operators.go +++ b/badorm/dynamic/operators.go @@ -34,7 +34,6 @@ func LtOrEq[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { // GreaterThan func Gt[T any](field badorm.FieldIdentifier[T]) badorm.DynamicOperator[T] { - // TODO invertir orden de parametros para que quede igual que en badorm/expression return NewValueOperator(sql.Gt, field) } diff --git a/badorm/dynamic/value.go b/badorm/dynamic/value.go index 5475d2ce..3937e303 100644 --- a/badorm/dynamic/value.go +++ b/badorm/dynamic/value.go @@ -9,10 +9,6 @@ func NewValueOperator[T any]( sqlOperator sql.Operator, field badorm.FieldIdentifier[T], ) badorm.DynamicOperator[T] { - // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo - // TODO que pasa si hay mas de uno, no se si me gusta mucho esto - // creo que si hay mas de uno solo se tendria que aplicar en el primero, - // TODO soportar multivalue, no todos necesariamente dinamicos return &badorm.ValueOperator[T]{ Operations: []badorm.Operation{ { diff --git a/badorm/multitype/operators.go b/badorm/multitype/operators.go index b5408eaf..562dc3b8 100644 --- a/badorm/multitype/operators.go +++ b/badorm/multitype/operators.go @@ -34,7 +34,6 @@ func LtOrEq[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm // GreaterThan func Gt[TAttribute, TField any](field badorm.FieldIdentifier[TField]) badorm.DynamicOperator[TAttribute] { - // TODO invertir orden de parametros para que quede igual que en badorm/expression return NewValueOperator[TAttribute, TField](sql.Gt, field) } diff --git a/badorm/multitype/value.go b/badorm/multitype/value.go index cb11b41d..c87eedeb 100644 --- a/badorm/multitype/value.go +++ b/badorm/multitype/value.go @@ -56,10 +56,6 @@ func NewValueOperator[TAttribute, TField any]( return invalidOperator } - // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo - // TODO que pasa si hay mas de uno, no se si me gusta mucho esto - // creo que si hay mas de uno solo se tendria que aplicar en el primero, - // TODO soportar multivalue, no todos necesariamente dinamicos return &badorm.ValueOperator[TAttribute]{ Operations: []badorm.Operation{ { diff --git a/badorm/unsafe/operators.go b/badorm/unsafe/operators.go index c8515d06..b5ab4a99 100644 --- a/badorm/unsafe/operators.go +++ b/badorm/unsafe/operators.go @@ -34,7 +34,6 @@ func LtOrEq[T any](value any) badorm.DynamicOperator[T] { // GreaterThan func Gt[T any](value any) badorm.DynamicOperator[T] { - // TODO invertir orden de parametros para que quede igual que en badorm/expression return NewValueOperator[T](sql.Gt, value) } diff --git a/badorm/unsafe/value.go b/badorm/unsafe/value.go index a3f25c9a..2780bac6 100644 --- a/badorm/unsafe/value.go +++ b/badorm/unsafe/value.go @@ -9,10 +9,6 @@ func NewValueOperator[T any]( sqlOperator sql.Operator, value any, ) badorm.DynamicOperator[T] { - // TODO que pasa con los que solo aceptan cierto tipo, ver las de like por ejemplo - // TODO que pasa si hay mas de uno, no se si me gusta mucho esto - // creo que si hay mas de uno solo se tendria que aplicar en el primero, - // TODO soportar multivalue, no todos necesariamente dinamicos return &badorm.ValueOperator[T]{ Operations: []badorm.Operation{ { From 0b6ba7d3483711e8493768fe04a0bd113c00e02a Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 6 Jul 2023 16:43:11 +0200 Subject: [PATCH 429/467] add more information to conditions and operators errors --- badorm/condition.go | 23 +++--- badorm/errors.go | 82 ++++++++++++++++++++++ badorm/multitype/errors.go | 31 ++++++++ badorm/multitype/multivalue.go | 6 +- badorm/multitype/value.go | 15 ++-- badorm/multivalueOperator.go | 30 ++++---- badorm/operator.go | 1 - badorm/operators.go | 16 +++-- badorm/query.go | 6 +- badorm/sql/connectors.go | 12 ++++ badorm/sql/operators.go | 30 ++++++++ badorm/valueOperator.go | 45 ++++++------ testintegration/join_conditions_test.go | 10 +++ testintegration/operators_test.go | 15 ++-- testintegration/preload_conditions_test.go | 2 + 15 files changed, 243 insertions(+), 81 deletions(-) create mode 100644 badorm/errors.go create mode 100644 badorm/multitype/errors.go diff --git a/badorm/condition.go b/badorm/condition.go index 1c35b2c2..27db9af6 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -1,7 +1,6 @@ package badorm import ( - "errors" "fmt" "strings" @@ -13,11 +12,6 @@ import ( const deletedAtField = "DeletedAt" -var ( - ErrEmptyConditions = errors.New("condition must have at least one inner condition") - ErrOnlyPreloadsAllowed = errors.New("only conditions that do a preload are allowed") -) - type Condition[T Model] interface { // Applies the condition to the "query" // using the "tableName" as name for the table holding @@ -81,7 +75,7 @@ func (condition ContainerCondition[T]) AffectsDeletedAt() bool { // Example: NOT (internal condition) func NewContainerCondition[T Model](prefix sql.Connector, conditions ...WhereCondition[T]) WhereCondition[T] { if len(conditions) == 0 { - return NewInvalidCondition[T](ErrEmptyConditions) + return NewInvalidCondition[T](emptyConditionsError[T](prefix)) } return ContainerCondition[T]{ @@ -146,7 +140,7 @@ func NewConnectionCondition[T Model](connector sql.Connector, conditions ...Wher // Condition used to the preload the attributes of a model type PreloadCondition[T Model] struct { - Fields []IFieldIdentifier + Fields []iFieldIdentifier } //nolint:unused // see inside @@ -164,14 +158,14 @@ func (condition PreloadCondition[T]) ApplyTo(query *Query, table Table) error { } // Condition used to the preload the attributes of a model -func NewPreloadCondition[T Model](fields ...IFieldIdentifier) PreloadCondition[T] { +func NewPreloadCondition[T Model](fields ...iFieldIdentifier) PreloadCondition[T] { return PreloadCondition[T]{ Fields: fields, } } // Condition used to the preload a collection of models of a model -type CollectionPreloadCondition[T1 Model, T2 Model] struct { +type CollectionPreloadCondition[T1, T2 Model] struct { CollectionField string // For each model in the collection we can preload its relations NestedPreloads []IJoinCondition[T2] @@ -218,7 +212,7 @@ func NewCollectionPreloadCondition[T1 Model, T2 Model](collectionField string, n if pie.Any(nestedPreloads, func(nestedPreload IJoinCondition[T2]) bool { return !nestedPreload.makesPreload() || nestedPreload.makesFilter() }) { - return NewInvalidCondition[T1](ErrOnlyPreloadsAllowed) + return NewInvalidCondition[T1](onlyPreloadsAllowedError[T1](collectionField)) } return CollectionPreloadCondition[T1, T2]{ @@ -270,10 +264,15 @@ func (condition FieldCondition[TObject, TAtribute]) AffectsDeletedAt() bool { } func (condition FieldCondition[TObject, TAtribute]) GetSQL(query *Query, table Table) (string, []any, error) { - return condition.Operator.ToSQL( + sqlString, values, err := condition.Operator.ToSQL( query, condition.FieldIdentifier.ColumnSQL(query, table), ) + if err != nil { + return "", nil, conditionOperatorError[TObject](err, condition) + } + + return sqlString, values, nil } // Interface of a join condition that joins T with any other model diff --git a/badorm/errors.go b/badorm/errors.go new file mode 100644 index 00000000..fac7301a --- /dev/null +++ b/badorm/errors.go @@ -0,0 +1,82 @@ +package badorm + +import ( + "errors" + "fmt" + + "github.com/ditrit/badaas/badorm/sql" +) + +// operators + +var ( + ErrValueCantBeNull = errors.New("value to be compared can't be null") + ErrFieldModelNotConcerned = errors.New("field's model is not concerned by the query (not joined)") + ErrJoinMustBeSelected = errors.New("field's model is joined more than once, select which one you want to use with SelectJoin") + ErrNotRelated = errors.New("value type not related with T") +) + +func OperatorError(err error, sqlOperator sql.Operator) error { + return fmt.Errorf("%w; operator: %s", err, sqlOperator.Name()) +} + +func operatorNameError(err error, operatorName string) error { + return fmt.Errorf("%w; operator: %s", err, operatorName) +} + +func notRelatedError[T any](value any, operatorName string) error { + return operatorNameError(fmt.Errorf("%w; type: %T, T: %T", + ErrNotRelated, + value, + *new(T), + ), operatorName) +} + +func fieldModelNotConcernedError(field iFieldIdentifier, sqlOperator sql.Operator) error { + return OperatorError(fmt.Errorf("%w; not concerned model: %s", + ErrFieldModelNotConcerned, + field.GetModelType(), + ), sqlOperator) +} + +func joinMustBeSelectedError(field iFieldIdentifier, sqlOperator sql.Operator) error { + return OperatorError(fmt.Errorf("%w; joined multiple times model: %s", + ErrJoinMustBeSelected, + field.GetModelType(), + ), sqlOperator) +} + +// conditions + +var ( + ErrEmptyConditions = errors.New("condition must have at least one inner condition") + ErrOnlyPreloadsAllowed = errors.New("only conditions that do a preload are allowed") +) + +func conditionOperatorError[TObject Model, TAtribute any](operatorErr error, condition FieldCondition[TObject, TAtribute]) error { + return fmt.Errorf( + "%w; model: %s, field: %s", + operatorErr, + condition.FieldIdentifier.ModelType.String(), + // TODO que pasa aca si no esta definido, si solo hay column + condition.FieldIdentifier.Field, + ) +} + +func emptyConditionsError[T Model](connector sql.Connector) error { + return fmt.Errorf( + "%w; connector: %s; model: %T", + ErrEmptyConditions, + connector.Name(), + *new(T), + ) +} + +func onlyPreloadsAllowedError[T Model](fieldName string) error { + return fmt.Errorf( + "%w; model: %T, field: %s", + ErrOnlyPreloadsAllowed, + *new(T), + fieldName, + ) +} diff --git a/badorm/multitype/errors.go b/badorm/multitype/errors.go new file mode 100644 index 00000000..174c85fa --- /dev/null +++ b/badorm/multitype/errors.go @@ -0,0 +1,31 @@ +package multitype + +import ( + "errors" + "fmt" + "reflect" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/sql" +) + +var ( + ErrFieldTypeDoesNotMatch = errors.New("field type does not match attribute type") + ErrParamNotValueOrField = errors.New("parameter is neither a value nor a field of the attribute type") +) + +func fieldTypeDoesNotMatchError(fieldType, attributeType reflect.Type, sqlOperator sql.Operator) error { + return badorm.OperatorError(fmt.Errorf("%w; field type: %s, attribute type: %s", + ErrFieldTypeDoesNotMatch, + fieldType, + attributeType, + ), sqlOperator) +} + +func paramNotValueOrField[T any](value any, sqlOperator sql.Operator) error { + return badorm.OperatorError(fmt.Errorf("%w; parameter type: %T, attribute type: %T", + ErrParamNotValueOrField, + value, + *new(T), + ), sqlOperator) +} diff --git a/badorm/multitype/multivalue.go b/badorm/multitype/multivalue.go index e4e5f391..0e0c1ed8 100644 --- a/badorm/multitype/multivalue.go +++ b/badorm/multitype/multivalue.go @@ -19,7 +19,7 @@ func NewMultivalueOperator[TAttribute, TField any]( _, isField := value.(badorm.FieldIdentifier[TField]) if isField { - invalidOperator := verifyFieldType[TAttribute, TField]() + invalidOperator := verifyFieldType[TAttribute, TField](sqlOperator) if invalidOperator != nil { return invalidOperator } @@ -27,7 +27,9 @@ func NewMultivalueOperator[TAttribute, TField any]( continue } - return badorm.NewInvalidOperator[TAttribute](ErrParamsNotValueOrField) + return badorm.NewInvalidOperator[TAttribute]( + paramNotValueOrField[TAttribute](value, sqlOperator), + ) } return &badorm.MultivalueOperator[TAttribute]{ diff --git a/badorm/multitype/value.go b/badorm/multitype/value.go index c87eedeb..c91265c5 100644 --- a/badorm/multitype/value.go +++ b/badorm/multitype/value.go @@ -2,7 +2,6 @@ package multitype import ( "database/sql" - "errors" "reflect" "github.com/elliotchance/pie/v2" @@ -12,12 +11,6 @@ import ( badormSQL "github.com/ditrit/badaas/badorm/sql" ) -// TODO ponerles mas informacion precisa a los errores -var ( - ErrFieldTypeDoesNotMatch = errors.New("field type does not match operator type") - ErrParamsNotValueOrField = errors.New("parameter is neither a value or a field") -) - var nullableTypes = []reflect.Type{ reflect.TypeOf(sql.NullBool{}), reflect.TypeOf(sql.NullByte{}), @@ -34,14 +27,16 @@ func isNullable(fieldType reflect.Type) bool { return pie.Contains(nullableTypes, fieldType) } -func verifyFieldType[TAttribute, TField any]() badorm.DynamicOperator[TAttribute] { +func verifyFieldType[TAttribute, TField any](sqlOperator badormSQL.Operator) badorm.DynamicOperator[TAttribute] { attributeType := reflect.TypeOf(*new(TAttribute)) fieldType := reflect.TypeOf(*new(TField)) if fieldType != attributeType && !((isNullable(fieldType) && fieldType.Field(0).Type == attributeType) || (isNullable(attributeType) && attributeType.Field(0).Type == fieldType)) { - return badorm.NewInvalidOperator[TAttribute](ErrFieldTypeDoesNotMatch) + return badorm.NewInvalidOperator[TAttribute]( + fieldTypeDoesNotMatchError(fieldType, attributeType, sqlOperator), + ) } return nil @@ -51,7 +46,7 @@ func NewValueOperator[TAttribute, TField any]( sqlOperator badormSQL.Operator, field badorm.FieldIdentifier[TField], ) badorm.DynamicOperator[TAttribute] { - invalidOperator := verifyFieldType[TAttribute, TField]() + invalidOperator := verifyFieldType[TAttribute, TField](sqlOperator) if invalidOperator != nil { return invalidOperator } diff --git a/badorm/multivalueOperator.go b/badorm/multivalueOperator.go index b52fe29b..3b8b4b2a 100644 --- a/badorm/multivalueOperator.go +++ b/badorm/multivalueOperator.go @@ -20,25 +20,25 @@ type MultivalueOperator[T any] struct { JoinNumber int } -func (expr MultivalueOperator[T]) InterfaceVerificationMethod(_ T) { +func (operator MultivalueOperator[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Operator[T] } -func (expr *MultivalueOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { - expr.JoinNumber = int(joinNumber) - return expr +func (operator *MultivalueOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { + operator.JoinNumber = int(joinNumber) + return operator } -func (expr MultivalueOperator[T]) ToSQL(query *Query, columnName string) (string, []any, error) { +func (operator MultivalueOperator[T]) ToSQL(query *Query, columnName string) (string, []any, error) { placeholderList := []string{} values := []any{} - for _, value := range expr.Values { - field, isField := value.(IFieldIdentifier) + for _, value := range operator.Values { + field, isField := value.(iFieldIdentifier) if isField { // if it is a field, add the field column to the query - modelTable, err := getModelTable(query, field, expr.JoinNumber) + modelTable, err := getModelTable(query, field, operator.JoinNumber, operator.SQLOperator) if err != nil { return "", nil, err } @@ -51,21 +51,21 @@ func (expr MultivalueOperator[T]) ToSQL(query *Query, columnName string) (string } } - placeholders := strings.Join(placeholderList, " "+expr.SQLConnector.String()+" ") + placeholders := strings.Join(placeholderList, " "+operator.SQLConnector.String()+" ") return fmt.Sprintf( "%s %s %s"+placeholders+"%s", columnName, - expr.SQLOperator, - expr.SQLPrefix, - expr.SQLSuffix, + operator.SQLOperator, + operator.SQLPrefix, + operator.SQLSuffix, ), values, nil } -func getModelTable(query *Query, field IFieldIdentifier, joinNumber int) (Table, error) { +func getModelTable(query *Query, field iFieldIdentifier, joinNumber int, sqlOperator sql.Operator) (Table, error) { modelTables := query.GetTables(field.GetModelType()) if modelTables == nil { - return Table{}, ErrFieldModelNotConcerned + return Table{}, fieldModelNotConcernedError(field, sqlOperator) } if len(modelTables) == 1 { @@ -73,7 +73,7 @@ func getModelTable(query *Query, field IFieldIdentifier, joinNumber int) (Table, } if joinNumber == UndefinedJoinNumber { - return Table{}, ErrJoinMustBeSelected + return Table{}, joinMustBeSelectedError(field, sqlOperator) } return modelTables[joinNumber], nil diff --git a/badorm/operator.go b/badorm/operator.go index 3e8816e4..a8eeb0f0 100644 --- a/badorm/operator.go +++ b/badorm/operator.go @@ -25,7 +25,6 @@ type DynamicOperator[T any] interface { // Operator that verifies a predicate // Example: value IS TRUE type PredicateOperator[T any] struct { - // TODO pasar a sql.operator SQLOperator string } diff --git a/badorm/operators.go b/badorm/operators.go index 381e00a4..4f14e65c 100644 --- a/badorm/operators.go +++ b/badorm/operators.go @@ -3,7 +3,6 @@ package badorm import ( "database/sql" "database/sql/driver" - "errors" "reflect" "github.com/elliotchance/pie/v2" @@ -11,8 +10,6 @@ import ( badormSQL "github.com/ditrit/badaas/badorm/sql" ) -var ErrNotRelated = errors.New("value type not related with T") - // Comparison Operators // refs: // - MySQL: https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html @@ -39,7 +36,7 @@ func Eq[T any](value T) Operator[T] { // - in PostgreSQL you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) // - in SQLite you can use the IS NOT DISTINCT operator (implemented in IsNotDistinct) func EqOrIsNull[T any](value any) Operator[T] { - return operatorFromValueOrNil[T](value, Eq[T], IsNull[T]()) + return operatorFromValueOrNil[T](value, "EqOrIsNull", Eq[T], IsNull[T]()) } // NotEqualTo @@ -60,10 +57,13 @@ func NotEq[T any](value T) Operator[T] { // - in PostgreSQL you can use the IS DISTINCT operator (implemented in IsDistinct) // - in SQLite you can use the IS DISTINCT operator (implemented in IsDistinct) func NotEqOrIsNotNull[T any](value any) Operator[T] { - return operatorFromValueOrNil[T](value, NotEq[T], IsNotNull[T]()) + return operatorFromValueOrNil[T](value, "NotEqOrIsNotNull", NotEq[T], IsNotNull[T]()) } -func operatorFromValueOrNil[T any](value any, notNilFunc func(T) Operator[T], nilOperator Operator[T]) Operator[T] { +func operatorFromValueOrNil[T any]( + value any, operatorName string, + notNilFunc func(T) Operator[T], nilOperator Operator[T], +) Operator[T] { if value == nil { return nilOperator } @@ -86,7 +86,9 @@ func operatorFromValueOrNil[T any](value any, notNilFunc func(T) Operator[T], ni return notNilFunc(valueT) } - return NewInvalidOperator[T](ErrNotRelated) + return NewInvalidOperator[T]( + notRelatedError[T](value, operatorName), + ) } func mapsToNull(value any) bool { diff --git a/badorm/query.go b/badorm/query.go index e92ee726..3ac11839 100644 --- a/badorm/query.go +++ b/badorm/query.go @@ -7,7 +7,6 @@ import ( "gorm.io/gorm" ) -// TODO creo que estos podrian ser todos tipos privados type Table struct { Name string Alias string @@ -41,7 +40,7 @@ func (t Table) DeliverTable(query *Query, model Model, relationName string) (Tab }, nil } -type IFieldIdentifier interface { +type iFieldIdentifier interface { ColumnName(query *Query, table Table) string ColumnSQL(query *Query, table Table) string GetModelType() reflect.Type @@ -79,7 +78,7 @@ type Query struct { concernedModels map[reflect.Type][]Table } -func (query *Query) AddSelect(table Table, fieldID IFieldIdentifier) { +func (query *Query) AddSelect(table Table, fieldID iFieldIdentifier) { columnName := fieldID.ColumnName(query, table) query.gormDB.Statement.Selects = append( @@ -133,7 +132,6 @@ func (query *Query) GetTables(modelType reflect.Type) []Table { return tableList } -// TODO ver esta, porque no estoy usando los fields aca y que pasa si hay fk override y todo eso func (query Query) ColumnName(table Table, fieldName string) string { return query.gormDB.NamingStrategy.ColumnName(table.Name, fieldName) } diff --git a/badorm/sql/connectors.go b/badorm/sql/connectors.go index 707826c2..67c04925 100644 --- a/badorm/sql/connectors.go +++ b/badorm/sql/connectors.go @@ -22,3 +22,15 @@ var connectorToSQL = map[Connector]string{ Comma: ",", MySQLXor: "XOR", } + +func (con Connector) Name() string { + return connectorToName[con] +} + +var connectorToName = map[Connector]string{ + And: "And", + Or: "Or", + Not: "Not", + Comma: "Comma", + MySQLXor: "mysql.Xor", +} diff --git a/badorm/sql/operators.go b/badorm/sql/operators.go index 2320ffb7..c90b71f5 100644 --- a/badorm/sql/operators.go +++ b/badorm/sql/operators.go @@ -68,3 +68,33 @@ var operatorToSQL = map[Operator]string{ ArrayIn: "IN", ArrayNotIn: "NOT IN", } + +func (op Operator) Name() string { + return operatorToName[op] +} + +var operatorToName = map[Operator]string{ + Eq: "Eq", + NotEq: "NotEq", + Lt: "Lt", + LtOrEq: "LtOrEq", + Gt: "Gt", + GtOrEq: "GtOrEq", + Between: "Between", + NotBetween: "NotBetween", + IsDistinct: "IsDistinct", + IsNotDistinct: "IsNotDistinct", + Like: "Like", + Escape: "Escape", + MySQLIsEqual: "mysql.IsEqual", + MySQLRegexp: "mysql.Regexp", + SQLServerNotLt: "sqlserver.NotLt", + SQLServerNotGt: "sqlserver.NotGt", + PostgreSQLILike: "psql.ILike", + PostgreSQLSimilarTo: "psql.SimilarTo", + PostgreSQLPosixMatch: "psql.PosixMatch", + PostgreSQLPosixIMatch: "psql.PosixIMatch", + SQLiteGlob: "sqlite.Glob", + ArrayIn: "ArrayIn", + ArrayNotIn: "ArrayNotIn", +} diff --git a/badorm/valueOperator.go b/badorm/valueOperator.go index f7119576..e159b9a1 100644 --- a/badorm/valueOperator.go +++ b/badorm/valueOperator.go @@ -2,7 +2,6 @@ package badorm import ( "database/sql" - "errors" "fmt" "reflect" "regexp" @@ -10,13 +9,6 @@ import ( badormSQL "github.com/ditrit/badaas/badorm/sql" ) -// TODO ponerles mas informacion precisa a los errores -var ( - ErrFieldModelNotConcerned = errors.New("field's model is not concerned by the query so it can't be used in a operator") - ErrJoinMustBeSelected = errors.New("table is joined more than once, select which one you want to use") - ErrValueCantBeNull = errors.New("value to compare can't be null") -) - const UndefinedJoinNumber = -1 // Operator that compares the value of the column against a fixed value @@ -25,7 +17,6 @@ const UndefinedJoinNumber = -1 // Example (multi): value LIKE v1 ESCAPE v2 type ValueOperator[T any] struct { Operations []Operation - // TODO join deberia estar en cada operator JoinNumber int } @@ -34,39 +25,41 @@ type Operation struct { Value any } -func (expr ValueOperator[T]) InterfaceVerificationMethod(_ T) { +func (operator ValueOperator[T]) InterfaceVerificationMethod(_ T) { // This method is necessary to get the compiler to verify // that an object is of type Operator[T] } -func (expr *ValueOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { - expr.JoinNumber = int(joinNumber) - return expr +func (operator *ValueOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { + operator.JoinNumber = int(joinNumber) + return operator } -func (expr *ValueOperator[T]) AddOperation(sqlOperator badormSQL.Operator, value any) ValueOperator[T] { - expr.Operations = append( - expr.Operations, +func (operator *ValueOperator[T]) AddOperation(sqlOperator badormSQL.Operator, value any) ValueOperator[T] { + operator.Operations = append( + operator.Operations, Operation{ Value: value, SQLOperator: sqlOperator, }, ) - return *expr + return *operator } -// verificar que en las condiciones anteriores alguien usó el field con el que se intenta comparar -// obtener de ahi cual es el nombre de la table a usar con ese field. -// TODO doc a ingles -func (expr ValueOperator[T]) ToSQL(query *Query, columnName string) (string, []any, error) { +func (operator ValueOperator[T]) ToSQL(query *Query, columnName string) (string, []any, error) { operationString := columnName values := []any{} - for _, operation := range expr.Operations { - field, isField := operation.Value.(IFieldIdentifier) + // add each operation to the sql + for _, operation := range operator.Operations { + field, isField := operation.Value.(iFieldIdentifier) if isField { - modelTable, err := getModelTable(query, field, expr.JoinNumber) + // if the value of the operation is a field, + // verify that this field is concerned by the query + // (a join was performed with the model to which this field belongs) + // and get the alias of the table of this model. + modelTable, err := getModelTable(query, field, operator.JoinNumber, operation.SQLOperator) if err != nil { return "", nil, err } @@ -100,7 +93,9 @@ var nullableKinds = []reflect.Kind{ func NewCantBeNullValueOperator[T any](sqlOperator badormSQL.Operator, value any) Operator[T] { if value == nil || mapsToNull(value) { - return NewInvalidOperator[T](ErrValueCantBeNull) + return NewInvalidOperator[T]( + OperatorError(ErrValueCantBeNull, sqlOperator), + ) } return NewValueOperator[T](sqlOperator, value) diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index e08da554..82e6a176 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -405,6 +405,14 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorOver2TablesAtMoreLevel( EqualList(&ts.Suite, []*models.Sale{match}, entities) } +func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorWithNotJoinedModelReturnsError() { + _, err := ts.crudChildService.GetEntities( + conditions.ChildId(dynamic.Eq(conditions.ParentParentIdField)), + ) + ts.ErrorIs(err, badorm.ErrFieldModelNotConcerned) + ts.ErrorContains(err, "not concerned model: models.ParentParent; operator: Eq; model: models.Child, field: ID") +} + func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithoutSelectJoinReturnsError() { _, err := ts.crudChildService.GetEntities( conditions.ChildParent1( @@ -416,6 +424,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithout conditions.ChildId(dynamic.Eq(conditions.ParentParentIdField)), ) ts.ErrorIs(err, badorm.ErrJoinMustBeSelected) + ts.ErrorContains(err, "joined multiple times model: models.ParentParent; operator: Eq; model: models.Child, field: ID") } func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithSelectJoin() { @@ -491,4 +500,5 @@ func (ts *JoinConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesNo ), ) ts.ErrorIs(err, badorm.ErrEmptyConditions) + ts.ErrorContains(err, "connector: Not; model: models.Product") } diff --git a/testintegration/operators_test.go b/testintegration/operators_test.go index ae0f44ed..56c58a14 100644 --- a/testintegration/operators_test.go +++ b/testintegration/operators_test.go @@ -44,6 +44,7 @@ func (ts *OperatorIntTestSuite) TestEqNullableNullReturnsError() { ), ) ts.ErrorIs(err, badorm.ErrValueCantBeNull) + ts.ErrorContains(err, "operator: Eq; model: models.Product, field: NullFloat") } func (ts *OperatorIntTestSuite) TestEqPointers() { @@ -185,14 +186,13 @@ func (ts *OperatorIntTestSuite) TestEqOrIsNullNullableNotNil() { } func (ts *OperatorIntTestSuite) TestEqOrIsNullNotRelated() { - notRelated := "not_related" - _, err := ts.crudProductService.GetEntities( conditions.ProductFloat( - badorm.EqOrIsNull[float64](¬Related), + badorm.EqOrIsNull[float64]("not_related"), ), ) ts.ErrorIs(err, badorm.ErrNotRelated) + ts.ErrorContains(err, "type: string, T: float64; operator: EqOrIsNull; model: models.Product, field: Float") } func (ts *OperatorIntTestSuite) TestNotEqOrIsNotNullTNotNil() { @@ -265,6 +265,7 @@ func (ts *OperatorIntTestSuite) TestLtNullableNullReturnsError() { ), ) ts.ErrorIs(err, badorm.ErrValueCantBeNull) + ts.ErrorContains(err, "operator: Lt; model: models.Product, field: NullFloat") } func (ts *OperatorIntTestSuite) TestLtOrEq() { @@ -1013,6 +1014,7 @@ func (ts *OperatorIntTestSuite) TestMultitypeOperatorWithFieldOfAnotherTypeRetur ), ) ts.ErrorIs(err, multitype.ErrFieldTypeDoesNotMatch) + ts.ErrorContains(err, "field type: string, attribute type: int; operator: Eq; model: models.Product, field: Int") } func (ts *OperatorIntTestSuite) TestMultitypeOperatorForNullableTypeCanBeComparedWithNotNullType() { @@ -1070,7 +1072,8 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithValueOfAnothe multitype.Between[int, int]("hola", 1), ), ) - ts.ErrorIs(err, multitype.ErrParamsNotValueOrField) + ts.ErrorIs(err, multitype.ErrParamNotValueOrField) + ts.ErrorContains(err, "parameter type: string, attribute type: int; operator: Between; model: models.Product, field: Int") } func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithFieldOfAnotherTypeReturnsError() { @@ -1079,7 +1082,8 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithFieldOfAnothe multitype.Between[int, int](1, conditions.ProductCreatedAtField), ), ) - ts.ErrorIs(err, multitype.ErrParamsNotValueOrField) + ts.ErrorIs(err, multitype.ErrParamNotValueOrField) + ts.ErrorContains(err, "parameter type: badorm.FieldIdentifier[time.Time], attribute type: int; operator: Between; model: models.Product, field: Int") } func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithFieldOfNotRelatedTypeReturnsError() { @@ -1089,6 +1093,7 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithFieldOfNotRel ), ) ts.ErrorIs(err, multitype.ErrFieldTypeDoesNotMatch) + ts.ErrorContains(err, "field type: time.Time, attribute type: int; operator: Between; model: models.Product, field: Int") } func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithAFieldAndAValue() { diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index 79dca375..52884e5e 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -878,6 +878,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributesWithF ), ) ts.ErrorIs(err, badorm.ErrOnlyPreloadsAllowed) + ts.ErrorContains(err, "model: models.Company, field: Sellers") } func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributesWithoutPreloadReturnsError() { @@ -887,4 +888,5 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributesWitho ), ) ts.ErrorIs(err, badorm.ErrOnlyPreloadsAllowed) + ts.ErrorContains(err, "model: models.Company, field: Sellers") } From 6e20fed60baf1b8fc5db3f1113fe9014065c5d23 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 10:40:53 +0200 Subject: [PATCH 430/467] add info to posix error --- badorm/valueOperator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/badorm/valueOperator.go b/badorm/valueOperator.go index e159b9a1..2ac8dcf5 100644 --- a/badorm/valueOperator.go +++ b/badorm/valueOperator.go @@ -104,7 +104,7 @@ func NewCantBeNullValueOperator[T any](sqlOperator badormSQL.Operator, value any func NewMustBePOSIXValueOperator[T string | sql.NullString](sqlOperator badormSQL.Operator, pattern string) Operator[T] { _, err := regexp.CompilePOSIX(pattern) if err != nil { - return NewInvalidOperator[T](err) + return NewInvalidOperator[T](OperatorError(err, sqlOperator)) } return NewValueOperator[T](sqlOperator, pattern) From b170c826451d307168c541922c66cc9fafc87dbb Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 10:44:50 +0200 Subject: [PATCH 431/467] fix incorrect change of relative badctl path --- testintegration/conditions/badorm.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testintegration/conditions/badorm.go b/testintegration/conditions/badorm.go index cc0ad018..8891ae4d 100644 --- a/testintegration/conditions/badorm.go +++ b/testintegration/conditions/badorm.go @@ -1,3 +1,3 @@ package conditions -//go:generate ../../tools/badctl/badctl gen conditions ../models +//go:generate badctl gen conditions ../models From 1c65e99820e0ff1b0c0d2788a614833665f8438c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 10:48:48 +0200 Subject: [PATCH 432/467] always add field name to field identifier --- badorm/errors.go | 1 - testintegration/conditions/product_conditions.go | 1 + tools/badctl/cmd/gen/conditions/condition.go | 3 +-- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/badorm/errors.go b/badorm/errors.go index fac7301a..7774ffb0 100644 --- a/badorm/errors.go +++ b/badorm/errors.go @@ -58,7 +58,6 @@ func conditionOperatorError[TObject Model, TAtribute any](operatorErr error, con "%w; model: %s, field: %s", operatorErr, condition.FieldIdentifier.ModelType.String(), - // TODO que pasa aca si no esta definido, si solo hay column condition.FieldIdentifier.Field, ) } diff --git a/testintegration/conditions/product_conditions.go b/testintegration/conditions/product_conditions.go index ed15e1f3..8f47b064 100644 --- a/testintegration/conditions/product_conditions.go +++ b/testintegration/conditions/product_conditions.go @@ -61,6 +61,7 @@ func ProductDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCond var ProductStringField = badorm.FieldIdentifier[string]{ Column: "string_something_else", + Field: "String", ModelType: productType, } diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 347119c9..283b9f28 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -201,14 +201,13 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { func (condition *Condition) createFieldIdentifier(objectName string, objectTypeQual jen.Code, field Field, conditionName string) *jen.Statement { fieldIdentifierValues := jen.Dict{ jen.Id("ModelType"): jen.Id(getObjectTypeName(objectName)), + jen.Id("Field"): jen.Lit(field.Name), } columnName := field.getColumnName() if columnName != "" { fieldIdentifierValues[jen.Id("Column")] = jen.Lit(columnName) - } else { - fieldIdentifierValues[jen.Id("Field")] = jen.Lit(field.Name) } columnPrefix := field.ColumnPrefix From 459a3d7361fb38449334882f2818649dfca226c9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 10:58:39 +0200 Subject: [PATCH 433/467] fix lint --- badorm/condition.go | 46 +++----------------- badorm/operator.go | 3 +- badorm/unsafe/condition.go | 7 +-- tools/badctl/cmd/gen/conditions/condition.go | 5 +-- tools/badctl/cmd/gen/docker_test.go | 4 +- 5 files changed, 14 insertions(+), 51 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 27db9af6..6d8dd596 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -45,11 +45,7 @@ type ContainerCondition[T Model] struct { Prefix sql.Connector } -//nolint:unused // see inside -func (condition ContainerCondition[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Condition[T] -} +func (condition ContainerCondition[T]) InterfaceVerificationMethod(_ T) {} func (condition ContainerCondition[T]) ApplyTo(query *Query, table Table) error { return ApplyWhereCondition[T](condition, query, table) @@ -66,7 +62,6 @@ func (condition ContainerCondition[T]) GetSQL(query *Query, table Table) (string return sqlString, values, nil } -//nolint:unused // is used func (condition ContainerCondition[T]) AffectsDeletedAt() bool { return condition.ConnectionCondition.AffectsDeletedAt() } @@ -91,11 +86,7 @@ type ConnectionCondition[T Model] struct { Conditions []WhereCondition[T] } -//nolint:unused // see inside -func (condition ConnectionCondition[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Condition[T] -} +func (condition ConnectionCondition[T]) InterfaceVerificationMethod(_ T) {} func (condition ConnectionCondition[T]) ApplyTo(query *Query, table Table) error { return ApplyWhereCondition[T](condition, query, table) @@ -122,7 +113,6 @@ func (condition ConnectionCondition[T]) GetSQL(query *Query, table Table) (strin ), values, nil } -//nolint:unused // is used func (condition ConnectionCondition[T]) AffectsDeletedAt() bool { return pie.Any(condition.Conditions, func(internalCondition WhereCondition[T]) bool { return internalCondition.AffectsDeletedAt() @@ -143,11 +133,7 @@ type PreloadCondition[T Model] struct { Fields []iFieldIdentifier } -//nolint:unused // see inside -func (condition PreloadCondition[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Condition[T] -} +func (condition PreloadCondition[T]) InterfaceVerificationMethod(_ T) {} func (condition PreloadCondition[T]) ApplyTo(query *Query, table Table) error { for _, fieldID := range condition.Fields { @@ -171,11 +157,7 @@ type CollectionPreloadCondition[T1, T2 Model] struct { NestedPreloads []IJoinCondition[T2] } -//nolint:unused // see inside -func (condition CollectionPreloadCondition[T1, T2]) InterfaceVerificationMethod(_ T1) { - // This method is necessary to get the compiler to verify - // that an object is of type Condition[T1] -} +func (condition CollectionPreloadCondition[T1, T2]) InterfaceVerificationMethod(_ T1) {} func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *Query, _ Table) error { if len(condition.NestedPreloads) == 0 { @@ -228,11 +210,7 @@ type FieldCondition[TObject Model, TAtribute any] struct { Operator Operator[TAtribute] } -//nolint:unused // see inside -func (condition FieldCondition[TObject, TAtribute]) InterfaceVerificationMethod(_ TObject) { - // This method is necessary to get the compiler to verify - // that an object is of type Condition[T] -} +func (condition FieldCondition[TObject, TAtribute]) InterfaceVerificationMethod(_ TObject) {} // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value @@ -258,7 +236,6 @@ func ApplyWhereCondition[T Model](condition WhereCondition[T], query *Query, tab return nil } -//nolint:unused // is used func (condition FieldCondition[TObject, TAtribute]) AffectsDeletedAt() bool { return condition.FieldIdentifier.Field == deletedAtField } @@ -296,11 +273,7 @@ type JoinCondition[T1 Model, T2 Model] struct { T1PreloadCondition PreloadCondition[T1] } -//nolint:unused // see inside -func (condition JoinCondition[T1, T2]) InterfaceVerificationMethod(_ T1) { - // This method is necessary to get the compiler to verify - // that an object is of type Condition[T] -} +func (condition JoinCondition[T1, T2]) InterfaceVerificationMethod(_ T1) {} // Returns true if this condition or any nested condition makes a preload func (condition JoinCondition[T1, T2]) makesPreload() bool { @@ -457,11 +430,7 @@ type InvalidCondition[T any] struct { Err error } -//nolint:unused // see inside -func (condition InvalidCondition[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Condition[T] -} +func (condition InvalidCondition[T]) InterfaceVerificationMethod(_ T) {} func (condition InvalidCondition[T]) ApplyTo(_ *Query, _ Table) error { return condition.Err @@ -471,7 +440,6 @@ func (condition InvalidCondition[T]) GetSQL(_ *Query, _ Table) (string, []any, e return "", nil, condition.Err } -//nolint:unused // is used func (condition InvalidCondition[T]) AffectsDeletedAt() bool { return false } diff --git a/badorm/operator.go b/badorm/operator.go index a8eeb0f0..36b70208 100644 --- a/badorm/operator.go +++ b/badorm/operator.go @@ -53,7 +53,8 @@ func (expr InvalidOperator[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Operator[T] } -func (expr InvalidOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { +// InvalidOperator has SelectJoin to implement DynamicOperator +func (expr InvalidOperator[T]) SelectJoin(_ uint) DynamicOperator[T] { return expr } diff --git a/badorm/unsafe/condition.go b/badorm/unsafe/condition.go index e6b6d28b..353adb7c 100644 --- a/badorm/unsafe/condition.go +++ b/badorm/unsafe/condition.go @@ -13,11 +13,7 @@ type Condition[T badorm.Model] struct { Values []any } -//nolint:unused // see inside -func (condition Condition[T]) InterfaceVerificationMethod(_ T) { - // This method is necessary to get the compiler to verify - // that an object is of type Condition[T] -} +func (condition Condition[T]) InterfaceVerificationMethod(_ T) {} func (condition Condition[T]) ApplyTo(query *badorm.Query, table badorm.Table) error { return badorm.ApplyWhereCondition[T](condition, query, table) @@ -30,7 +26,6 @@ func (condition Condition[T]) GetSQL(_ *badorm.Query, table badorm.Table) (strin ), condition.Values, nil } -//nolint:unused // is used func (condition Condition[T]) AffectsDeletedAt() bool { return false } diff --git a/tools/badctl/cmd/gen/conditions/condition.go b/tools/badctl/cmd/gen/conditions/condition.go index 283b9f28..174ef1de 100644 --- a/tools/badctl/cmd/gen/conditions/condition.go +++ b/tools/badctl/cmd/gen/conditions/condition.go @@ -187,8 +187,7 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { fieldCondition.Clone().Values(jen.Dict{ jen.Id("Operator"): jen.Id("operator"), jen.Id("FieldIdentifier"): condition.createFieldIdentifier( - objectType.Name(), objectTypeQual, - field, conditionName, + objectType.Name(), field, conditionName, ), }), ), @@ -198,7 +197,7 @@ func (condition *Condition) generateWhere(objectType Type, field Field) { // create a variable containing the definition of the field identifier // to use it in the where condition and in the preload condition -func (condition *Condition) createFieldIdentifier(objectName string, objectTypeQual jen.Code, field Field, conditionName string) *jen.Statement { +func (condition *Condition) createFieldIdentifier(objectName string, field Field, conditionName string) *jen.Statement { fieldIdentifierValues := jen.Dict{ jen.Id("ModelType"): jen.Id(getObjectTypeName(objectName)), jen.Id("Field"): jen.Lit(field.Name), diff --git a/tools/badctl/cmd/gen/docker_test.go b/tools/badctl/cmd/gen/docker_test.go index 74d4f66d..497b0eb3 100644 --- a/tools/badctl/cmd/gen/docker_test.go +++ b/tools/badctl/cmd/gen/docker_test.go @@ -1,8 +1,8 @@ package gen import ( - "io/ioutil" "log" + "os" "testing" "github.com/magiconair/properties/assert" @@ -39,7 +39,7 @@ func checkFilesExist(t *testing.T) { } func checkDBPort(t *testing.T, port int) { - yamlFile, err := ioutil.ReadFile("badaas/config/badaas.yml") + yamlFile, err := os.ReadFile("badaas/config/badaas.yml") if err != nil { t.Error(err) } From 279693ec46a0d754be4ce91a7e6d4273dcdea838 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 11:16:37 +0200 Subject: [PATCH 434/467] fix unit tests --- tools/badctl/cmd/gen/conditions/main_test.go | 20 +- .../conditions/tests/results/basicpointers.go | 249 ++++++++++++------ .../conditions/tests/results/basicslices.go | 249 ++++++++++++------ .../tests/results/basicslicespointer.go | 249 ++++++++++++------ .../conditions/tests/results/basictypes.go | 249 ++++++++++++------ .../tests/results/belongsto_owned.go | 62 +++-- .../tests/results/belongsto_owner.go | 51 +++- .../tests/results/columndefinition.go | 63 +++-- .../conditions/tests/results/customtype.go | 62 +++-- .../conditions/tests/results/goembedded.go | 73 +++-- .../conditions/tests/results/gormembedded.go | 82 ++++-- .../tests/results/hasmany_company.go | 51 +++- .../tests/results/hasmany_seller.go | 62 +++-- .../results/hasmanywithpointers_company.go | 51 +++- .../results/hasmanywithpointers_seller.go | 62 +++-- .../conditions/tests/results/hasone_city.go | 62 +++-- .../tests/results/hasone_country.go | 51 +++- .../tests/results/multiplepackage_package1.go | 51 +++- .../tests/results/multiplepackage_package2.go | 62 +++-- .../results/overrideforeignkey_bicycle.go | 62 +++-- .../results/overrideforeignkey_person.go | 51 +++- .../overrideforeignkeyinverse_credit_card.go | 62 +++-- .../results/overrideforeignkeyinverse_user.go | 51 +++- .../tests/results/overridereferences_brand.go | 62 +++-- .../tests/results/overridereferences_phone.go | 62 +++-- .../overridereferencesinverse_computer.go | 62 +++-- .../overridereferencesinverse_processor.go | 62 +++-- .../tests/results/selfreferential.go | 62 +++-- .../gen/conditions/tests/results/uintmodel.go | 51 +++- .../gen/conditions/tests/results/uuidmodel.go | 51 +++- 30 files changed, 1748 insertions(+), 751 deletions(-) diff --git a/tools/badctl/cmd/gen/conditions/main_test.go b/tools/badctl/cmd/gen/conditions/main_test.go index 5f4960d4..29393827 100644 --- a/tools/badctl/cmd/gen/conditions/main_test.go +++ b/tools/badctl/cmd/gen/conditions/main_test.go @@ -86,47 +86,47 @@ func TestColumnDefinition(t *testing.T) { func TestBelongsTo(t *testing.T) { doTest(t, "./tests/belongsto", []Comparison{ + {Have: "./tests/belongsto/badorm.go", Expected: "./tests/belongsto/badorm_result.go"}, {Have: "owner_conditions.go", Expected: "./tests/results/belongsto_owner.go"}, {Have: "owned_conditions.go", Expected: "./tests/results/belongsto_owned.go"}, - {Have: "./tests/belongsto/badorm.go", Expected: "./tests/belongsto/badorm_result.go"}, }) } func TestHasOne(t *testing.T) { doTest(t, "./tests/hasone", []Comparison{ + {Have: "./tests/hasone/badorm.go", Expected: "./tests/hasone/badorm_result.go"}, {Have: "country_conditions.go", Expected: "./tests/results/hasone_country.go"}, {Have: "city_conditions.go", Expected: "./tests/results/hasone_city.go"}, - {Have: "./tests/hasone/badorm.go", Expected: "./tests/hasone/badorm_result.go"}, }) } func TestHasMany(t *testing.T) { doTest(t, "./tests/hasmany", []Comparison{ + {Have: "./tests/hasmany/badorm.go", Expected: "./tests/hasmany/badorm_result.go"}, {Have: "company_conditions.go", Expected: "./tests/results/hasmany_company.go"}, {Have: "seller_conditions.go", Expected: "./tests/results/hasmany_seller.go"}, - {Have: "./tests/hasmany/badorm.go", Expected: "./tests/hasmany/badorm_result.go"}, }) } func TestHasManyWithPointers(t *testing.T) { doTest(t, "./tests/hasmanywithpointers", []Comparison{ + {Have: "./tests/hasmanywithpointers/badorm.go", Expected: "./tests/hasmanywithpointers/badorm_result.go"}, {Have: "company_with_pointers_conditions.go", Expected: "./tests/results/hasmanywithpointers_company.go"}, {Have: "seller_in_pointers_conditions.go", Expected: "./tests/results/hasmanywithpointers_seller.go"}, - {Have: "./tests/hasmanywithpointers/badorm.go", Expected: "./tests/hasmanywithpointers/badorm_result.go"}, }) } func TestSelfReferential(t *testing.T) { doTest(t, "./tests/selfreferential", []Comparison{ - {Have: "employee_conditions.go", Expected: "./tests/results/selfreferential.go"}, {Have: "./tests/selfreferential/badorm.go", Expected: "./tests/selfreferential/badorm_result.go"}, + {Have: "employee_conditions.go", Expected: "./tests/results/selfreferential.go"}, }) } func TestMultiplePackage(t *testing.T) { doTest(t, "./tests/multiplepackage/package1", []Comparison{ - {Have: "package1_conditions.go", Expected: "./tests/results/multiplepackage_package1.go"}, {Have: "./tests/multiplepackage/package1/badorm.go", Expected: "./tests/multiplepackage/package1/badorm_result.go"}, + {Have: "package1_conditions.go", Expected: "./tests/results/multiplepackage_package1.go"}, }) doTest(t, "./tests/multiplepackage/package2", []Comparison{ {Have: "package2_conditions.go", Expected: "./tests/results/multiplepackage_package2.go"}, @@ -136,33 +136,33 @@ func TestMultiplePackage(t *testing.T) { func TestOverrideForeignKey(t *testing.T) { doTest(t, "./tests/overrideforeignkey", []Comparison{ + {Have: "./tests/overrideforeignkey/badorm.go", Expected: "./tests/overrideforeignkey/badorm_result.go"}, {Have: "bicycle_conditions.go", Expected: "./tests/results/overrideforeignkey_bicycle.go"}, {Have: "person_conditions.go", Expected: "./tests/results/overrideforeignkey_person.go"}, - {Have: "./tests/overrideforeignkey/badorm.go", Expected: "./tests/overrideforeignkey/badorm_result.go"}, }) } func TestOverrideReferences(t *testing.T) { doTest(t, "./tests/overridereferences", []Comparison{ + {Have: "./tests/overridereferences/badorm.go", Expected: "./tests/overridereferences/badorm_result.go"}, {Have: "phone_conditions.go", Expected: "./tests/results/overridereferences_phone.go"}, {Have: "brand_conditions.go", Expected: "./tests/results/overridereferences_brand.go"}, - {Have: "./tests/overridereferences/badorm.go", Expected: "./tests/overridereferences/badorm_result.go"}, }) } func TestOverrideForeignKeyInverse(t *testing.T) { doTest(t, "./tests/overrideforeignkeyinverse", []Comparison{ + {Have: "./tests/overrideforeignkeyinverse/badorm.go", Expected: "./tests/overrideforeignkeyinverse/badorm_result.go"}, {Have: "user_conditions.go", Expected: "./tests/results/overrideforeignkeyinverse_user.go"}, {Have: "credit_card_conditions.go", Expected: "./tests/results/overrideforeignkeyinverse_credit_card.go"}, - {Have: "./tests/overrideforeignkeyinverse/badorm.go", Expected: "./tests/overrideforeignkeyinverse/badorm_result.go"}, }) } func TestOverrideReferencesInverse(t *testing.T) { doTest(t, "./tests/overridereferencesinverse", []Comparison{ + {Have: "./tests/overridereferencesinverse/badorm.go", Expected: "./tests/overridereferencesinverse/badorm_result.go"}, {Have: "computer_conditions.go", Expected: "./tests/results/overridereferencesinverse_computer.go"}, {Have: "processor_conditions.go", Expected: "./tests/results/overridereferencesinverse_processor.go"}, - {Have: "./tests/overridereferencesinverse/badorm.go", Expected: "./tests/overridereferencesinverse/badorm_result.go"}, }) } diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go index 5e7b0134..0e2c9afc 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicpointers.go @@ -5,194 +5,273 @@ import ( badorm "github.com/ditrit/badaas/badorm" basicpointers "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/basicpointers" gorm "gorm.io/gorm" + "reflect" "time" ) -func BasicPointersId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basicpointers.BasicPointers] { +var basicPointersType = reflect.TypeOf(*new(basicpointers.BasicPointers)) +var BasicPointersIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: basicPointersType, +} + +func BasicPointersId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: BasicPointersIdField, + Operator: operator, } } -func BasicPointersCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicpointers.BasicPointers] { + +var BasicPointersCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: basicPointersType, +} + +func BasicPointersCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: BasicPointersCreatedAtField, + Operator: operator, } } -func BasicPointersUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicpointers.BasicPointers] { + +var BasicPointersUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: basicPointersType, +} + +func BasicPointersUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: BasicPointersUpdatedAtField, + Operator: operator, } } -func BasicPointersDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basicpointers.BasicPointers] { + +var BasicPointersDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: basicPointersType, +} + +func BasicPointersDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: BasicPointersDeletedAtField, + Operator: operator, } } -var basicPointersBoolFieldID = badorm.FieldIdentifier{Field: "Bool"} +var BasicPointersBoolField = badorm.FieldIdentifier[bool]{ + Field: "Bool", + ModelType: basicPointersType, +} -func BasicPointersBool(expr badorm.Expression[bool]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersBool(operator badorm.Operator[bool]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, bool]{ - Expression: expr, - FieldIdentifier: basicPointersBoolFieldID, + FieldIdentifier: BasicPointersBoolField, + Operator: operator, } } -var basicPointersIntFieldID = badorm.FieldIdentifier{Field: "Int"} +var BasicPointersIntField = badorm.FieldIdentifier[int]{ + Field: "Int", + ModelType: basicPointersType, +} -func BasicPointersInt(expr badorm.Expression[int]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersInt(operator badorm.Operator[int]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int]{ - Expression: expr, - FieldIdentifier: basicPointersIntFieldID, + FieldIdentifier: BasicPointersIntField, + Operator: operator, } } -var basicPointersInt8FieldID = badorm.FieldIdentifier{Field: "Int8"} +var BasicPointersInt8Field = badorm.FieldIdentifier[int8]{ + Field: "Int8", + ModelType: basicPointersType, +} -func BasicPointersInt8(expr badorm.Expression[int8]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersInt8(operator badorm.Operator[int8]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int8]{ - Expression: expr, - FieldIdentifier: basicPointersInt8FieldID, + FieldIdentifier: BasicPointersInt8Field, + Operator: operator, } } -var basicPointersInt16FieldID = badorm.FieldIdentifier{Field: "Int16"} +var BasicPointersInt16Field = badorm.FieldIdentifier[int16]{ + Field: "Int16", + ModelType: basicPointersType, +} -func BasicPointersInt16(expr badorm.Expression[int16]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersInt16(operator badorm.Operator[int16]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int16]{ - Expression: expr, - FieldIdentifier: basicPointersInt16FieldID, + FieldIdentifier: BasicPointersInt16Field, + Operator: operator, } } -var basicPointersInt32FieldID = badorm.FieldIdentifier{Field: "Int32"} +var BasicPointersInt32Field = badorm.FieldIdentifier[int32]{ + Field: "Int32", + ModelType: basicPointersType, +} -func BasicPointersInt32(expr badorm.Expression[int32]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersInt32(operator badorm.Operator[int32]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int32]{ - Expression: expr, - FieldIdentifier: basicPointersInt32FieldID, + FieldIdentifier: BasicPointersInt32Field, + Operator: operator, } } -var basicPointersInt64FieldID = badorm.FieldIdentifier{Field: "Int64"} +var BasicPointersInt64Field = badorm.FieldIdentifier[int64]{ + Field: "Int64", + ModelType: basicPointersType, +} -func BasicPointersInt64(expr badorm.Expression[int64]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersInt64(operator badorm.Operator[int64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, int64]{ - Expression: expr, - FieldIdentifier: basicPointersInt64FieldID, + FieldIdentifier: BasicPointersInt64Field, + Operator: operator, } } -var basicPointersUIntFieldID = badorm.FieldIdentifier{Field: "UInt"} +var BasicPointersUIntField = badorm.FieldIdentifier[uint]{ + Field: "UInt", + ModelType: basicPointersType, +} -func BasicPointersUInt(expr badorm.Expression[uint]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersUInt(operator badorm.Operator[uint]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint]{ - Expression: expr, - FieldIdentifier: basicPointersUIntFieldID, + FieldIdentifier: BasicPointersUIntField, + Operator: operator, } } -var basicPointersUInt8FieldID = badorm.FieldIdentifier{Field: "UInt8"} +var BasicPointersUInt8Field = badorm.FieldIdentifier[uint8]{ + Field: "UInt8", + ModelType: basicPointersType, +} -func BasicPointersUInt8(expr badorm.Expression[uint8]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersUInt8(operator badorm.Operator[uint8]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint8]{ - Expression: expr, - FieldIdentifier: basicPointersUInt8FieldID, + FieldIdentifier: BasicPointersUInt8Field, + Operator: operator, } } -var basicPointersUInt16FieldID = badorm.FieldIdentifier{Field: "UInt16"} +var BasicPointersUInt16Field = badorm.FieldIdentifier[uint16]{ + Field: "UInt16", + ModelType: basicPointersType, +} -func BasicPointersUInt16(expr badorm.Expression[uint16]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersUInt16(operator badorm.Operator[uint16]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint16]{ - Expression: expr, - FieldIdentifier: basicPointersUInt16FieldID, + FieldIdentifier: BasicPointersUInt16Field, + Operator: operator, } } -var basicPointersUInt32FieldID = badorm.FieldIdentifier{Field: "UInt32"} +var BasicPointersUInt32Field = badorm.FieldIdentifier[uint32]{ + Field: "UInt32", + ModelType: basicPointersType, +} -func BasicPointersUInt32(expr badorm.Expression[uint32]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersUInt32(operator badorm.Operator[uint32]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint32]{ - Expression: expr, - FieldIdentifier: basicPointersUInt32FieldID, + FieldIdentifier: BasicPointersUInt32Field, + Operator: operator, } } -var basicPointersUInt64FieldID = badorm.FieldIdentifier{Field: "UInt64"} +var BasicPointersUInt64Field = badorm.FieldIdentifier[uint64]{ + Field: "UInt64", + ModelType: basicPointersType, +} -func BasicPointersUInt64(expr badorm.Expression[uint64]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersUInt64(operator badorm.Operator[uint64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint64]{ - Expression: expr, - FieldIdentifier: basicPointersUInt64FieldID, + FieldIdentifier: BasicPointersUInt64Field, + Operator: operator, } } -var basicPointersUIntptrFieldID = badorm.FieldIdentifier{Field: "UIntptr"} +var BasicPointersUIntptrField = badorm.FieldIdentifier[uintptr]{ + Field: "UIntptr", + ModelType: basicPointersType, +} -func BasicPointersUIntptr(expr badorm.Expression[uintptr]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersUIntptr(operator badorm.Operator[uintptr]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uintptr]{ - Expression: expr, - FieldIdentifier: basicPointersUIntptrFieldID, + FieldIdentifier: BasicPointersUIntptrField, + Operator: operator, } } -var basicPointersFloat32FieldID = badorm.FieldIdentifier{Field: "Float32"} +var BasicPointersFloat32Field = badorm.FieldIdentifier[float32]{ + Field: "Float32", + ModelType: basicPointersType, +} -func BasicPointersFloat32(expr badorm.Expression[float32]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersFloat32(operator badorm.Operator[float32]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, float32]{ - Expression: expr, - FieldIdentifier: basicPointersFloat32FieldID, + FieldIdentifier: BasicPointersFloat32Field, + Operator: operator, } } -var basicPointersFloat64FieldID = badorm.FieldIdentifier{Field: "Float64"} +var BasicPointersFloat64Field = badorm.FieldIdentifier[float64]{ + Field: "Float64", + ModelType: basicPointersType, +} -func BasicPointersFloat64(expr badorm.Expression[float64]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersFloat64(operator badorm.Operator[float64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, float64]{ - Expression: expr, - FieldIdentifier: basicPointersFloat64FieldID, + FieldIdentifier: BasicPointersFloat64Field, + Operator: operator, } } -var basicPointersComplex64FieldID = badorm.FieldIdentifier{Field: "Complex64"} +var BasicPointersComplex64Field = badorm.FieldIdentifier[complex64]{ + Field: "Complex64", + ModelType: basicPointersType, +} -func BasicPointersComplex64(expr badorm.Expression[complex64]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersComplex64(operator badorm.Operator[complex64]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, complex64]{ - Expression: expr, - FieldIdentifier: basicPointersComplex64FieldID, + FieldIdentifier: BasicPointersComplex64Field, + Operator: operator, } } -var basicPointersComplex128FieldID = badorm.FieldIdentifier{Field: "Complex128"} +var BasicPointersComplex128Field = badorm.FieldIdentifier[complex128]{ + Field: "Complex128", + ModelType: basicPointersType, +} -func BasicPointersComplex128(expr badorm.Expression[complex128]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersComplex128(operator badorm.Operator[complex128]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, complex128]{ - Expression: expr, - FieldIdentifier: basicPointersComplex128FieldID, + FieldIdentifier: BasicPointersComplex128Field, + Operator: operator, } } -var basicPointersStringFieldID = badorm.FieldIdentifier{Field: "String"} +var BasicPointersStringField = badorm.FieldIdentifier[string]{ + Field: "String", + ModelType: basicPointersType, +} -func BasicPointersString(expr badorm.Expression[string]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersString(operator badorm.Operator[string]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, string]{ - Expression: expr, - FieldIdentifier: basicPointersStringFieldID, + FieldIdentifier: BasicPointersStringField, + Operator: operator, } } -var basicPointersByteFieldID = badorm.FieldIdentifier{Field: "Byte"} +var BasicPointersByteField = badorm.FieldIdentifier[uint8]{ + Field: "Byte", + ModelType: basicPointersType, +} -func BasicPointersByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basicpointers.BasicPointers] { +func BasicPointersByte(operator badorm.Operator[uint8]) badorm.WhereCondition[basicpointers.BasicPointers] { return badorm.FieldCondition[basicpointers.BasicPointers, uint8]{ - Expression: expr, - FieldIdentifier: basicPointersByteFieldID, + FieldIdentifier: BasicPointersByteField, + Operator: operator, } } -var BasicPointersPreloadAttributes = badorm.NewPreloadCondition[basicpointers.BasicPointers](basicPointersBoolFieldID, basicPointersIntFieldID, basicPointersInt8FieldID, basicPointersInt16FieldID, basicPointersInt32FieldID, basicPointersInt64FieldID, basicPointersUIntFieldID, basicPointersUInt8FieldID, basicPointersUInt16FieldID, basicPointersUInt32FieldID, basicPointersUInt64FieldID, basicPointersUIntptrFieldID, basicPointersFloat32FieldID, basicPointersFloat64FieldID, basicPointersComplex64FieldID, basicPointersComplex128FieldID, basicPointersStringFieldID, basicPointersByteFieldID) +var BasicPointersPreloadAttributes = badorm.NewPreloadCondition[basicpointers.BasicPointers](BasicPointersIdField, BasicPointersCreatedAtField, BasicPointersUpdatedAtField, BasicPointersDeletedAtField, BasicPointersBoolField, BasicPointersIntField, BasicPointersInt8Field, BasicPointersInt16Field, BasicPointersInt32Field, BasicPointersInt64Field, BasicPointersUIntField, BasicPointersUInt8Field, BasicPointersUInt16Field, BasicPointersUInt32Field, BasicPointersUInt64Field, BasicPointersUIntptrField, BasicPointersFloat32Field, BasicPointersFloat64Field, BasicPointersComplex64Field, BasicPointersComplex128Field, BasicPointersStringField, BasicPointersByteField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go index aa6b4822..e1cf97a8 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslices.go @@ -5,194 +5,273 @@ import ( badorm "github.com/ditrit/badaas/badorm" basicslices "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/basicslices" gorm "gorm.io/gorm" + "reflect" "time" ) -func BasicSlicesId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basicslices.BasicSlices] { +var basicSlicesType = reflect.TypeOf(*new(basicslices.BasicSlices)) +var BasicSlicesIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: basicSlicesType, +} + +func BasicSlicesId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: BasicSlicesIdField, + Operator: operator, } } -func BasicSlicesCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslices.BasicSlices] { + +var BasicSlicesCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: basicSlicesType, +} + +func BasicSlicesCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: BasicSlicesCreatedAtField, + Operator: operator, } } -func BasicSlicesUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslices.BasicSlices] { + +var BasicSlicesUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: basicSlicesType, +} + +func BasicSlicesUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: BasicSlicesUpdatedAtField, + Operator: operator, } } -func BasicSlicesDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basicslices.BasicSlices] { + +var BasicSlicesDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: basicSlicesType, +} + +func BasicSlicesDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: BasicSlicesDeletedAtField, + Operator: operator, } } -var basicSlicesBoolFieldID = badorm.FieldIdentifier{Field: "Bool"} +var BasicSlicesBoolField = badorm.FieldIdentifier[[]bool]{ + Field: "Bool", + ModelType: basicSlicesType, +} -func BasicSlicesBool(expr badorm.Expression[[]bool]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesBool(operator badorm.Operator[[]bool]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []bool]{ - Expression: expr, - FieldIdentifier: basicSlicesBoolFieldID, + FieldIdentifier: BasicSlicesBoolField, + Operator: operator, } } -var basicSlicesIntFieldID = badorm.FieldIdentifier{Field: "Int"} +var BasicSlicesIntField = badorm.FieldIdentifier[[]int]{ + Field: "Int", + ModelType: basicSlicesType, +} -func BasicSlicesInt(expr badorm.Expression[[]int]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesInt(operator badorm.Operator[[]int]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int]{ - Expression: expr, - FieldIdentifier: basicSlicesIntFieldID, + FieldIdentifier: BasicSlicesIntField, + Operator: operator, } } -var basicSlicesInt8FieldID = badorm.FieldIdentifier{Field: "Int8"} +var BasicSlicesInt8Field = badorm.FieldIdentifier[[]int8]{ + Field: "Int8", + ModelType: basicSlicesType, +} -func BasicSlicesInt8(expr badorm.Expression[[]int8]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesInt8(operator badorm.Operator[[]int8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int8]{ - Expression: expr, - FieldIdentifier: basicSlicesInt8FieldID, + FieldIdentifier: BasicSlicesInt8Field, + Operator: operator, } } -var basicSlicesInt16FieldID = badorm.FieldIdentifier{Field: "Int16"} +var BasicSlicesInt16Field = badorm.FieldIdentifier[[]int16]{ + Field: "Int16", + ModelType: basicSlicesType, +} -func BasicSlicesInt16(expr badorm.Expression[[]int16]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesInt16(operator badorm.Operator[[]int16]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int16]{ - Expression: expr, - FieldIdentifier: basicSlicesInt16FieldID, + FieldIdentifier: BasicSlicesInt16Field, + Operator: operator, } } -var basicSlicesInt32FieldID = badorm.FieldIdentifier{Field: "Int32"} +var BasicSlicesInt32Field = badorm.FieldIdentifier[[]int32]{ + Field: "Int32", + ModelType: basicSlicesType, +} -func BasicSlicesInt32(expr badorm.Expression[[]int32]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesInt32(operator badorm.Operator[[]int32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int32]{ - Expression: expr, - FieldIdentifier: basicSlicesInt32FieldID, + FieldIdentifier: BasicSlicesInt32Field, + Operator: operator, } } -var basicSlicesInt64FieldID = badorm.FieldIdentifier{Field: "Int64"} +var BasicSlicesInt64Field = badorm.FieldIdentifier[[]int64]{ + Field: "Int64", + ModelType: basicSlicesType, +} -func BasicSlicesInt64(expr badorm.Expression[[]int64]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesInt64(operator badorm.Operator[[]int64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []int64]{ - Expression: expr, - FieldIdentifier: basicSlicesInt64FieldID, + FieldIdentifier: BasicSlicesInt64Field, + Operator: operator, } } -var basicSlicesUIntFieldID = badorm.FieldIdentifier{Field: "UInt"} +var BasicSlicesUIntField = badorm.FieldIdentifier[[]uint]{ + Field: "UInt", + ModelType: basicSlicesType, +} -func BasicSlicesUInt(expr badorm.Expression[[]uint]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesUInt(operator badorm.Operator[[]uint]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint]{ - Expression: expr, - FieldIdentifier: basicSlicesUIntFieldID, + FieldIdentifier: BasicSlicesUIntField, + Operator: operator, } } -var basicSlicesUInt8FieldID = badorm.FieldIdentifier{Field: "UInt8"} +var BasicSlicesUInt8Field = badorm.FieldIdentifier[[]uint8]{ + Field: "UInt8", + ModelType: basicSlicesType, +} -func BasicSlicesUInt8(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesUInt8(operator badorm.Operator[[]uint8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint8]{ - Expression: expr, - FieldIdentifier: basicSlicesUInt8FieldID, + FieldIdentifier: BasicSlicesUInt8Field, + Operator: operator, } } -var basicSlicesUInt16FieldID = badorm.FieldIdentifier{Field: "UInt16"} +var BasicSlicesUInt16Field = badorm.FieldIdentifier[[]uint16]{ + Field: "UInt16", + ModelType: basicSlicesType, +} -func BasicSlicesUInt16(expr badorm.Expression[[]uint16]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesUInt16(operator badorm.Operator[[]uint16]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint16]{ - Expression: expr, - FieldIdentifier: basicSlicesUInt16FieldID, + FieldIdentifier: BasicSlicesUInt16Field, + Operator: operator, } } -var basicSlicesUInt32FieldID = badorm.FieldIdentifier{Field: "UInt32"} +var BasicSlicesUInt32Field = badorm.FieldIdentifier[[]uint32]{ + Field: "UInt32", + ModelType: basicSlicesType, +} -func BasicSlicesUInt32(expr badorm.Expression[[]uint32]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesUInt32(operator badorm.Operator[[]uint32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint32]{ - Expression: expr, - FieldIdentifier: basicSlicesUInt32FieldID, + FieldIdentifier: BasicSlicesUInt32Field, + Operator: operator, } } -var basicSlicesUInt64FieldID = badorm.FieldIdentifier{Field: "UInt64"} +var BasicSlicesUInt64Field = badorm.FieldIdentifier[[]uint64]{ + Field: "UInt64", + ModelType: basicSlicesType, +} -func BasicSlicesUInt64(expr badorm.Expression[[]uint64]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesUInt64(operator badorm.Operator[[]uint64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint64]{ - Expression: expr, - FieldIdentifier: basicSlicesUInt64FieldID, + FieldIdentifier: BasicSlicesUInt64Field, + Operator: operator, } } -var basicSlicesUIntptrFieldID = badorm.FieldIdentifier{Field: "UIntptr"} +var BasicSlicesUIntptrField = badorm.FieldIdentifier[[]uintptr]{ + Field: "UIntptr", + ModelType: basicSlicesType, +} -func BasicSlicesUIntptr(expr badorm.Expression[[]uintptr]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesUIntptr(operator badorm.Operator[[]uintptr]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uintptr]{ - Expression: expr, - FieldIdentifier: basicSlicesUIntptrFieldID, + FieldIdentifier: BasicSlicesUIntptrField, + Operator: operator, } } -var basicSlicesFloat32FieldID = badorm.FieldIdentifier{Field: "Float32"} +var BasicSlicesFloat32Field = badorm.FieldIdentifier[[]float32]{ + Field: "Float32", + ModelType: basicSlicesType, +} -func BasicSlicesFloat32(expr badorm.Expression[[]float32]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesFloat32(operator badorm.Operator[[]float32]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []float32]{ - Expression: expr, - FieldIdentifier: basicSlicesFloat32FieldID, + FieldIdentifier: BasicSlicesFloat32Field, + Operator: operator, } } -var basicSlicesFloat64FieldID = badorm.FieldIdentifier{Field: "Float64"} +var BasicSlicesFloat64Field = badorm.FieldIdentifier[[]float64]{ + Field: "Float64", + ModelType: basicSlicesType, +} -func BasicSlicesFloat64(expr badorm.Expression[[]float64]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesFloat64(operator badorm.Operator[[]float64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []float64]{ - Expression: expr, - FieldIdentifier: basicSlicesFloat64FieldID, + FieldIdentifier: BasicSlicesFloat64Field, + Operator: operator, } } -var basicSlicesComplex64FieldID = badorm.FieldIdentifier{Field: "Complex64"} +var BasicSlicesComplex64Field = badorm.FieldIdentifier[[]complex64]{ + Field: "Complex64", + ModelType: basicSlicesType, +} -func BasicSlicesComplex64(expr badorm.Expression[[]complex64]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesComplex64(operator badorm.Operator[[]complex64]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []complex64]{ - Expression: expr, - FieldIdentifier: basicSlicesComplex64FieldID, + FieldIdentifier: BasicSlicesComplex64Field, + Operator: operator, } } -var basicSlicesComplex128FieldID = badorm.FieldIdentifier{Field: "Complex128"} +var BasicSlicesComplex128Field = badorm.FieldIdentifier[[]complex128]{ + Field: "Complex128", + ModelType: basicSlicesType, +} -func BasicSlicesComplex128(expr badorm.Expression[[]complex128]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesComplex128(operator badorm.Operator[[]complex128]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []complex128]{ - Expression: expr, - FieldIdentifier: basicSlicesComplex128FieldID, + FieldIdentifier: BasicSlicesComplex128Field, + Operator: operator, } } -var basicSlicesStringFieldID = badorm.FieldIdentifier{Field: "String"} +var BasicSlicesStringField = badorm.FieldIdentifier[[]string]{ + Field: "String", + ModelType: basicSlicesType, +} -func BasicSlicesString(expr badorm.Expression[[]string]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesString(operator badorm.Operator[[]string]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []string]{ - Expression: expr, - FieldIdentifier: basicSlicesStringFieldID, + FieldIdentifier: BasicSlicesStringField, + Operator: operator, } } -var basicSlicesByteFieldID = badorm.FieldIdentifier{Field: "Byte"} +var BasicSlicesByteField = badorm.FieldIdentifier[[]uint8]{ + Field: "Byte", + ModelType: basicSlicesType, +} -func BasicSlicesByte(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslices.BasicSlices] { +func BasicSlicesByte(operator badorm.Operator[[]uint8]) badorm.WhereCondition[basicslices.BasicSlices] { return badorm.FieldCondition[basicslices.BasicSlices, []uint8]{ - Expression: expr, - FieldIdentifier: basicSlicesByteFieldID, + FieldIdentifier: BasicSlicesByteField, + Operator: operator, } } -var BasicSlicesPreloadAttributes = badorm.NewPreloadCondition[basicslices.BasicSlices](basicSlicesBoolFieldID, basicSlicesIntFieldID, basicSlicesInt8FieldID, basicSlicesInt16FieldID, basicSlicesInt32FieldID, basicSlicesInt64FieldID, basicSlicesUIntFieldID, basicSlicesUInt8FieldID, basicSlicesUInt16FieldID, basicSlicesUInt32FieldID, basicSlicesUInt64FieldID, basicSlicesUIntptrFieldID, basicSlicesFloat32FieldID, basicSlicesFloat64FieldID, basicSlicesComplex64FieldID, basicSlicesComplex128FieldID, basicSlicesStringFieldID, basicSlicesByteFieldID) +var BasicSlicesPreloadAttributes = badorm.NewPreloadCondition[basicslices.BasicSlices](BasicSlicesIdField, BasicSlicesCreatedAtField, BasicSlicesUpdatedAtField, BasicSlicesDeletedAtField, BasicSlicesBoolField, BasicSlicesIntField, BasicSlicesInt8Field, BasicSlicesInt16Field, BasicSlicesInt32Field, BasicSlicesInt64Field, BasicSlicesUIntField, BasicSlicesUInt8Field, BasicSlicesUInt16Field, BasicSlicesUInt32Field, BasicSlicesUInt64Field, BasicSlicesUIntptrField, BasicSlicesFloat32Field, BasicSlicesFloat64Field, BasicSlicesComplex64Field, BasicSlicesComplex128Field, BasicSlicesStringField, BasicSlicesByteField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go index 728e42dc..5cba7307 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basicslicespointer.go @@ -5,194 +5,273 @@ import ( badorm "github.com/ditrit/badaas/badorm" basicslicespointer "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/basicslicespointer" gorm "gorm.io/gorm" + "reflect" "time" ) -func BasicSlicesPointerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +var basicSlicesPointerType = reflect.TypeOf(*new(basicslicespointer.BasicSlicesPointer)) +var BasicSlicesPointerIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: basicSlicesPointerType, +} + +func BasicSlicesPointerId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: BasicSlicesPointerIdField, + Operator: operator, } } -func BasicSlicesPointerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + +var BasicSlicesPointerCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: basicSlicesPointerType, +} + +func BasicSlicesPointerCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: BasicSlicesPointerCreatedAtField, + Operator: operator, } } -func BasicSlicesPointerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + +var BasicSlicesPointerUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: basicSlicesPointerType, +} + +func BasicSlicesPointerUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: BasicSlicesPointerUpdatedAtField, + Operator: operator, } } -func BasicSlicesPointerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { + +var BasicSlicesPointerDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: basicSlicesPointerType, +} + +func BasicSlicesPointerDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: BasicSlicesPointerDeletedAtField, + Operator: operator, } } -var basicSlicesPointerBoolFieldID = badorm.FieldIdentifier{Field: "Bool"} +var BasicSlicesPointerBoolField = badorm.FieldIdentifier[[]bool]{ + Field: "Bool", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerBool(expr badorm.Expression[[]bool]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerBool(operator badorm.Operator[[]bool]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []bool]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerBoolFieldID, + FieldIdentifier: BasicSlicesPointerBoolField, + Operator: operator, } } -var basicSlicesPointerIntFieldID = badorm.FieldIdentifier{Field: "Int"} +var BasicSlicesPointerIntField = badorm.FieldIdentifier[[]int]{ + Field: "Int", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerInt(expr badorm.Expression[[]int]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerInt(operator badorm.Operator[[]int]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerIntFieldID, + FieldIdentifier: BasicSlicesPointerIntField, + Operator: operator, } } -var basicSlicesPointerInt8FieldID = badorm.FieldIdentifier{Field: "Int8"} +var BasicSlicesPointerInt8Field = badorm.FieldIdentifier[[]int8]{ + Field: "Int8", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerInt8(expr badorm.Expression[[]int8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerInt8(operator badorm.Operator[[]int8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int8]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerInt8FieldID, + FieldIdentifier: BasicSlicesPointerInt8Field, + Operator: operator, } } -var basicSlicesPointerInt16FieldID = badorm.FieldIdentifier{Field: "Int16"} +var BasicSlicesPointerInt16Field = badorm.FieldIdentifier[[]int16]{ + Field: "Int16", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerInt16(expr badorm.Expression[[]int16]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerInt16(operator badorm.Operator[[]int16]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int16]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerInt16FieldID, + FieldIdentifier: BasicSlicesPointerInt16Field, + Operator: operator, } } -var basicSlicesPointerInt32FieldID = badorm.FieldIdentifier{Field: "Int32"} +var BasicSlicesPointerInt32Field = badorm.FieldIdentifier[[]int32]{ + Field: "Int32", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerInt32(expr badorm.Expression[[]int32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerInt32(operator badorm.Operator[[]int32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int32]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerInt32FieldID, + FieldIdentifier: BasicSlicesPointerInt32Field, + Operator: operator, } } -var basicSlicesPointerInt64FieldID = badorm.FieldIdentifier{Field: "Int64"} +var BasicSlicesPointerInt64Field = badorm.FieldIdentifier[[]int64]{ + Field: "Int64", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerInt64(expr badorm.Expression[[]int64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerInt64(operator badorm.Operator[[]int64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []int64]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerInt64FieldID, + FieldIdentifier: BasicSlicesPointerInt64Field, + Operator: operator, } } -var basicSlicesPointerUIntFieldID = badorm.FieldIdentifier{Field: "UInt"} +var BasicSlicesPointerUIntField = badorm.FieldIdentifier[[]uint]{ + Field: "UInt", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerUInt(expr badorm.Expression[[]uint]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerUInt(operator badorm.Operator[[]uint]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerUIntFieldID, + FieldIdentifier: BasicSlicesPointerUIntField, + Operator: operator, } } -var basicSlicesPointerUInt8FieldID = badorm.FieldIdentifier{Field: "UInt8"} +var BasicSlicesPointerUInt8Field = badorm.FieldIdentifier[[]uint8]{ + Field: "UInt8", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerUInt8(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerUInt8(operator badorm.Operator[[]uint8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint8]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerUInt8FieldID, + FieldIdentifier: BasicSlicesPointerUInt8Field, + Operator: operator, } } -var basicSlicesPointerUInt16FieldID = badorm.FieldIdentifier{Field: "UInt16"} +var BasicSlicesPointerUInt16Field = badorm.FieldIdentifier[[]uint16]{ + Field: "UInt16", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerUInt16(expr badorm.Expression[[]uint16]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerUInt16(operator badorm.Operator[[]uint16]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint16]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerUInt16FieldID, + FieldIdentifier: BasicSlicesPointerUInt16Field, + Operator: operator, } } -var basicSlicesPointerUInt32FieldID = badorm.FieldIdentifier{Field: "UInt32"} +var BasicSlicesPointerUInt32Field = badorm.FieldIdentifier[[]uint32]{ + Field: "UInt32", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerUInt32(expr badorm.Expression[[]uint32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerUInt32(operator badorm.Operator[[]uint32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint32]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerUInt32FieldID, + FieldIdentifier: BasicSlicesPointerUInt32Field, + Operator: operator, } } -var basicSlicesPointerUInt64FieldID = badorm.FieldIdentifier{Field: "UInt64"} +var BasicSlicesPointerUInt64Field = badorm.FieldIdentifier[[]uint64]{ + Field: "UInt64", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerUInt64(expr badorm.Expression[[]uint64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerUInt64(operator badorm.Operator[[]uint64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint64]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerUInt64FieldID, + FieldIdentifier: BasicSlicesPointerUInt64Field, + Operator: operator, } } -var basicSlicesPointerUIntptrFieldID = badorm.FieldIdentifier{Field: "UIntptr"} +var BasicSlicesPointerUIntptrField = badorm.FieldIdentifier[[]uintptr]{ + Field: "UIntptr", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerUIntptr(expr badorm.Expression[[]uintptr]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerUIntptr(operator badorm.Operator[[]uintptr]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uintptr]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerUIntptrFieldID, + FieldIdentifier: BasicSlicesPointerUIntptrField, + Operator: operator, } } -var basicSlicesPointerFloat32FieldID = badorm.FieldIdentifier{Field: "Float32"} +var BasicSlicesPointerFloat32Field = badorm.FieldIdentifier[[]float32]{ + Field: "Float32", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerFloat32(expr badorm.Expression[[]float32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerFloat32(operator badorm.Operator[[]float32]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []float32]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerFloat32FieldID, + FieldIdentifier: BasicSlicesPointerFloat32Field, + Operator: operator, } } -var basicSlicesPointerFloat64FieldID = badorm.FieldIdentifier{Field: "Float64"} +var BasicSlicesPointerFloat64Field = badorm.FieldIdentifier[[]float64]{ + Field: "Float64", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerFloat64(expr badorm.Expression[[]float64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerFloat64(operator badorm.Operator[[]float64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []float64]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerFloat64FieldID, + FieldIdentifier: BasicSlicesPointerFloat64Field, + Operator: operator, } } -var basicSlicesPointerComplex64FieldID = badorm.FieldIdentifier{Field: "Complex64"} +var BasicSlicesPointerComplex64Field = badorm.FieldIdentifier[[]complex64]{ + Field: "Complex64", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerComplex64(expr badorm.Expression[[]complex64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerComplex64(operator badorm.Operator[[]complex64]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []complex64]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerComplex64FieldID, + FieldIdentifier: BasicSlicesPointerComplex64Field, + Operator: operator, } } -var basicSlicesPointerComplex128FieldID = badorm.FieldIdentifier{Field: "Complex128"} +var BasicSlicesPointerComplex128Field = badorm.FieldIdentifier[[]complex128]{ + Field: "Complex128", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerComplex128(expr badorm.Expression[[]complex128]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerComplex128(operator badorm.Operator[[]complex128]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []complex128]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerComplex128FieldID, + FieldIdentifier: BasicSlicesPointerComplex128Field, + Operator: operator, } } -var basicSlicesPointerStringFieldID = badorm.FieldIdentifier{Field: "String"} +var BasicSlicesPointerStringField = badorm.FieldIdentifier[[]string]{ + Field: "String", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerString(expr badorm.Expression[[]string]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerString(operator badorm.Operator[[]string]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []string]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerStringFieldID, + FieldIdentifier: BasicSlicesPointerStringField, + Operator: operator, } } -var basicSlicesPointerByteFieldID = badorm.FieldIdentifier{Field: "Byte"} +var BasicSlicesPointerByteField = badorm.FieldIdentifier[[]uint8]{ + Field: "Byte", + ModelType: basicSlicesPointerType, +} -func BasicSlicesPointerByte(expr badorm.Expression[[]uint8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { +func BasicSlicesPointerByte(operator badorm.Operator[[]uint8]) badorm.WhereCondition[basicslicespointer.BasicSlicesPointer] { return badorm.FieldCondition[basicslicespointer.BasicSlicesPointer, []uint8]{ - Expression: expr, - FieldIdentifier: basicSlicesPointerByteFieldID, + FieldIdentifier: BasicSlicesPointerByteField, + Operator: operator, } } -var BasicSlicesPointerPreloadAttributes = badorm.NewPreloadCondition[basicslicespointer.BasicSlicesPointer](basicSlicesPointerBoolFieldID, basicSlicesPointerIntFieldID, basicSlicesPointerInt8FieldID, basicSlicesPointerInt16FieldID, basicSlicesPointerInt32FieldID, basicSlicesPointerInt64FieldID, basicSlicesPointerUIntFieldID, basicSlicesPointerUInt8FieldID, basicSlicesPointerUInt16FieldID, basicSlicesPointerUInt32FieldID, basicSlicesPointerUInt64FieldID, basicSlicesPointerUIntptrFieldID, basicSlicesPointerFloat32FieldID, basicSlicesPointerFloat64FieldID, basicSlicesPointerComplex64FieldID, basicSlicesPointerComplex128FieldID, basicSlicesPointerStringFieldID, basicSlicesPointerByteFieldID) +var BasicSlicesPointerPreloadAttributes = badorm.NewPreloadCondition[basicslicespointer.BasicSlicesPointer](BasicSlicesPointerIdField, BasicSlicesPointerCreatedAtField, BasicSlicesPointerUpdatedAtField, BasicSlicesPointerDeletedAtField, BasicSlicesPointerBoolField, BasicSlicesPointerIntField, BasicSlicesPointerInt8Field, BasicSlicesPointerInt16Field, BasicSlicesPointerInt32Field, BasicSlicesPointerInt64Field, BasicSlicesPointerUIntField, BasicSlicesPointerUInt8Field, BasicSlicesPointerUInt16Field, BasicSlicesPointerUInt32Field, BasicSlicesPointerUInt64Field, BasicSlicesPointerUIntptrField, BasicSlicesPointerFloat32Field, BasicSlicesPointerFloat64Field, BasicSlicesPointerComplex64Field, BasicSlicesPointerComplex128Field, BasicSlicesPointerStringField, BasicSlicesPointerByteField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go index dd96d522..6018a927 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/basictypes.go @@ -5,194 +5,273 @@ import ( badorm "github.com/ditrit/badaas/badorm" basictypes "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/basictypes" gorm "gorm.io/gorm" + "reflect" "time" ) -func BasicTypesId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[basictypes.BasicTypes] { +var basicTypesType = reflect.TypeOf(*new(basictypes.BasicTypes)) +var BasicTypesIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: basicTypesType, +} + +func BasicTypesId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: BasicTypesIdField, + Operator: operator, } } -func BasicTypesCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basictypes.BasicTypes] { + +var BasicTypesCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: basicTypesType, +} + +func BasicTypesCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: BasicTypesCreatedAtField, + Operator: operator, } } -func BasicTypesUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[basictypes.BasicTypes] { + +var BasicTypesUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: basicTypesType, +} + +func BasicTypesUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: BasicTypesUpdatedAtField, + Operator: operator, } } -func BasicTypesDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[basictypes.BasicTypes] { + +var BasicTypesDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: basicTypesType, +} + +func BasicTypesDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: BasicTypesDeletedAtField, + Operator: operator, } } -var basicTypesBoolFieldID = badorm.FieldIdentifier{Field: "Bool"} +var BasicTypesBoolField = badorm.FieldIdentifier[bool]{ + Field: "Bool", + ModelType: basicTypesType, +} -func BasicTypesBool(expr badorm.Expression[bool]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesBool(operator badorm.Operator[bool]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, bool]{ - Expression: expr, - FieldIdentifier: basicTypesBoolFieldID, + FieldIdentifier: BasicTypesBoolField, + Operator: operator, } } -var basicTypesIntFieldID = badorm.FieldIdentifier{Field: "Int"} +var BasicTypesIntField = badorm.FieldIdentifier[int]{ + Field: "Int", + ModelType: basicTypesType, +} -func BasicTypesInt(expr badorm.Expression[int]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesInt(operator badorm.Operator[int]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int]{ - Expression: expr, - FieldIdentifier: basicTypesIntFieldID, + FieldIdentifier: BasicTypesIntField, + Operator: operator, } } -var basicTypesInt8FieldID = badorm.FieldIdentifier{Field: "Int8"} +var BasicTypesInt8Field = badorm.FieldIdentifier[int8]{ + Field: "Int8", + ModelType: basicTypesType, +} -func BasicTypesInt8(expr badorm.Expression[int8]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesInt8(operator badorm.Operator[int8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int8]{ - Expression: expr, - FieldIdentifier: basicTypesInt8FieldID, + FieldIdentifier: BasicTypesInt8Field, + Operator: operator, } } -var basicTypesInt16FieldID = badorm.FieldIdentifier{Field: "Int16"} +var BasicTypesInt16Field = badorm.FieldIdentifier[int16]{ + Field: "Int16", + ModelType: basicTypesType, +} -func BasicTypesInt16(expr badorm.Expression[int16]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesInt16(operator badorm.Operator[int16]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int16]{ - Expression: expr, - FieldIdentifier: basicTypesInt16FieldID, + FieldIdentifier: BasicTypesInt16Field, + Operator: operator, } } -var basicTypesInt32FieldID = badorm.FieldIdentifier{Field: "Int32"} +var BasicTypesInt32Field = badorm.FieldIdentifier[int32]{ + Field: "Int32", + ModelType: basicTypesType, +} -func BasicTypesInt32(expr badorm.Expression[int32]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesInt32(operator badorm.Operator[int32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int32]{ - Expression: expr, - FieldIdentifier: basicTypesInt32FieldID, + FieldIdentifier: BasicTypesInt32Field, + Operator: operator, } } -var basicTypesInt64FieldID = badorm.FieldIdentifier{Field: "Int64"} +var BasicTypesInt64Field = badorm.FieldIdentifier[int64]{ + Field: "Int64", + ModelType: basicTypesType, +} -func BasicTypesInt64(expr badorm.Expression[int64]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesInt64(operator badorm.Operator[int64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, int64]{ - Expression: expr, - FieldIdentifier: basicTypesInt64FieldID, + FieldIdentifier: BasicTypesInt64Field, + Operator: operator, } } -var basicTypesUIntFieldID = badorm.FieldIdentifier{Field: "UInt"} +var BasicTypesUIntField = badorm.FieldIdentifier[uint]{ + Field: "UInt", + ModelType: basicTypesType, +} -func BasicTypesUInt(expr badorm.Expression[uint]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesUInt(operator badorm.Operator[uint]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint]{ - Expression: expr, - FieldIdentifier: basicTypesUIntFieldID, + FieldIdentifier: BasicTypesUIntField, + Operator: operator, } } -var basicTypesUInt8FieldID = badorm.FieldIdentifier{Field: "UInt8"} +var BasicTypesUInt8Field = badorm.FieldIdentifier[uint8]{ + Field: "UInt8", + ModelType: basicTypesType, +} -func BasicTypesUInt8(expr badorm.Expression[uint8]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesUInt8(operator badorm.Operator[uint8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint8]{ - Expression: expr, - FieldIdentifier: basicTypesUInt8FieldID, + FieldIdentifier: BasicTypesUInt8Field, + Operator: operator, } } -var basicTypesUInt16FieldID = badorm.FieldIdentifier{Field: "UInt16"} +var BasicTypesUInt16Field = badorm.FieldIdentifier[uint16]{ + Field: "UInt16", + ModelType: basicTypesType, +} -func BasicTypesUInt16(expr badorm.Expression[uint16]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesUInt16(operator badorm.Operator[uint16]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint16]{ - Expression: expr, - FieldIdentifier: basicTypesUInt16FieldID, + FieldIdentifier: BasicTypesUInt16Field, + Operator: operator, } } -var basicTypesUInt32FieldID = badorm.FieldIdentifier{Field: "UInt32"} +var BasicTypesUInt32Field = badorm.FieldIdentifier[uint32]{ + Field: "UInt32", + ModelType: basicTypesType, +} -func BasicTypesUInt32(expr badorm.Expression[uint32]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesUInt32(operator badorm.Operator[uint32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint32]{ - Expression: expr, - FieldIdentifier: basicTypesUInt32FieldID, + FieldIdentifier: BasicTypesUInt32Field, + Operator: operator, } } -var basicTypesUInt64FieldID = badorm.FieldIdentifier{Field: "UInt64"} +var BasicTypesUInt64Field = badorm.FieldIdentifier[uint64]{ + Field: "UInt64", + ModelType: basicTypesType, +} -func BasicTypesUInt64(expr badorm.Expression[uint64]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesUInt64(operator badorm.Operator[uint64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint64]{ - Expression: expr, - FieldIdentifier: basicTypesUInt64FieldID, + FieldIdentifier: BasicTypesUInt64Field, + Operator: operator, } } -var basicTypesUIntptrFieldID = badorm.FieldIdentifier{Field: "UIntptr"} +var BasicTypesUIntptrField = badorm.FieldIdentifier[uintptr]{ + Field: "UIntptr", + ModelType: basicTypesType, +} -func BasicTypesUIntptr(expr badorm.Expression[uintptr]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesUIntptr(operator badorm.Operator[uintptr]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uintptr]{ - Expression: expr, - FieldIdentifier: basicTypesUIntptrFieldID, + FieldIdentifier: BasicTypesUIntptrField, + Operator: operator, } } -var basicTypesFloat32FieldID = badorm.FieldIdentifier{Field: "Float32"} +var BasicTypesFloat32Field = badorm.FieldIdentifier[float32]{ + Field: "Float32", + ModelType: basicTypesType, +} -func BasicTypesFloat32(expr badorm.Expression[float32]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesFloat32(operator badorm.Operator[float32]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, float32]{ - Expression: expr, - FieldIdentifier: basicTypesFloat32FieldID, + FieldIdentifier: BasicTypesFloat32Field, + Operator: operator, } } -var basicTypesFloat64FieldID = badorm.FieldIdentifier{Field: "Float64"} +var BasicTypesFloat64Field = badorm.FieldIdentifier[float64]{ + Field: "Float64", + ModelType: basicTypesType, +} -func BasicTypesFloat64(expr badorm.Expression[float64]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesFloat64(operator badorm.Operator[float64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, float64]{ - Expression: expr, - FieldIdentifier: basicTypesFloat64FieldID, + FieldIdentifier: BasicTypesFloat64Field, + Operator: operator, } } -var basicTypesComplex64FieldID = badorm.FieldIdentifier{Field: "Complex64"} +var BasicTypesComplex64Field = badorm.FieldIdentifier[complex64]{ + Field: "Complex64", + ModelType: basicTypesType, +} -func BasicTypesComplex64(expr badorm.Expression[complex64]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesComplex64(operator badorm.Operator[complex64]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, complex64]{ - Expression: expr, - FieldIdentifier: basicTypesComplex64FieldID, + FieldIdentifier: BasicTypesComplex64Field, + Operator: operator, } } -var basicTypesComplex128FieldID = badorm.FieldIdentifier{Field: "Complex128"} +var BasicTypesComplex128Field = badorm.FieldIdentifier[complex128]{ + Field: "Complex128", + ModelType: basicTypesType, +} -func BasicTypesComplex128(expr badorm.Expression[complex128]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesComplex128(operator badorm.Operator[complex128]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, complex128]{ - Expression: expr, - FieldIdentifier: basicTypesComplex128FieldID, + FieldIdentifier: BasicTypesComplex128Field, + Operator: operator, } } -var basicTypesStringFieldID = badorm.FieldIdentifier{Field: "String"} +var BasicTypesStringField = badorm.FieldIdentifier[string]{ + Field: "String", + ModelType: basicTypesType, +} -func BasicTypesString(expr badorm.Expression[string]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesString(operator badorm.Operator[string]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, string]{ - Expression: expr, - FieldIdentifier: basicTypesStringFieldID, + FieldIdentifier: BasicTypesStringField, + Operator: operator, } } -var basicTypesByteFieldID = badorm.FieldIdentifier{Field: "Byte"} +var BasicTypesByteField = badorm.FieldIdentifier[uint8]{ + Field: "Byte", + ModelType: basicTypesType, +} -func BasicTypesByte(expr badorm.Expression[uint8]) badorm.WhereCondition[basictypes.BasicTypes] { +func BasicTypesByte(operator badorm.Operator[uint8]) badorm.WhereCondition[basictypes.BasicTypes] { return badorm.FieldCondition[basictypes.BasicTypes, uint8]{ - Expression: expr, - FieldIdentifier: basicTypesByteFieldID, + FieldIdentifier: BasicTypesByteField, + Operator: operator, } } -var BasicTypesPreloadAttributes = badorm.NewPreloadCondition[basictypes.BasicTypes](basicTypesBoolFieldID, basicTypesIntFieldID, basicTypesInt8FieldID, basicTypesInt16FieldID, basicTypesInt32FieldID, basicTypesInt64FieldID, basicTypesUIntFieldID, basicTypesUInt8FieldID, basicTypesUInt16FieldID, basicTypesUInt32FieldID, basicTypesUInt64FieldID, basicTypesUIntptrFieldID, basicTypesFloat32FieldID, basicTypesFloat64FieldID, basicTypesComplex64FieldID, basicTypesComplex128FieldID, basicTypesStringFieldID, basicTypesByteFieldID) +var BasicTypesPreloadAttributes = badorm.NewPreloadCondition[basictypes.BasicTypes](BasicTypesIdField, BasicTypesCreatedAtField, BasicTypesUpdatedAtField, BasicTypesDeletedAtField, BasicTypesBoolField, BasicTypesIntField, BasicTypesInt8Field, BasicTypesInt16Field, BasicTypesInt32Field, BasicTypesInt64Field, BasicTypesUIntField, BasicTypesUInt8Field, BasicTypesUInt16Field, BasicTypesUInt32Field, BasicTypesUInt64Field, BasicTypesUIntptrField, BasicTypesFloat32Field, BasicTypesFloat64Field, BasicTypesComplex64Field, BasicTypesComplex128Field, BasicTypesStringField, BasicTypesByteField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go index 92039afc..02f71c23 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owned.go @@ -5,31 +5,56 @@ import ( badorm "github.com/ditrit/badaas/badorm" belongsto "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/belongsto" gorm "gorm.io/gorm" + "reflect" "time" ) -func OwnedId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { +var ownedType = reflect.TypeOf(*new(belongsto.Owned)) +var OwnedIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: ownedType, +} + +func OwnedId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: OwnedIdField, + Operator: operator, } } -func OwnedCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owned] { + +var OwnedCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: ownedType, +} + +func OwnedCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: OwnedCreatedAtField, + Operator: operator, } } -func OwnedUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owned] { + +var OwnedUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: ownedType, +} + +func OwnedUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: OwnedUpdatedAtField, + Operator: operator, } } -func OwnedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[belongsto.Owned] { + +var OwnedDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: ownedType, +} + +func OwnedDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: OwnedDeletedAtField, + Operator: operator, } } func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.IJoinCondition[belongsto.Owned] { @@ -43,14 +68,17 @@ func OwnedOwner(conditions ...badorm.Condition[belongsto.Owner]) badorm.IJoinCon } var OwnedPreloadOwner = OwnedOwner(OwnerPreloadAttributes) -var ownedOwnerIdFieldID = badorm.FieldIdentifier{Field: "OwnerID"} +var OwnedOwnerIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "OwnerID", + ModelType: ownedType, +} -func OwnedOwnerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { +func OwnedOwnerId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[belongsto.Owned] { return badorm.FieldCondition[belongsto.Owned, badorm.UUID]{ - Expression: expr, - FieldIdentifier: ownedOwnerIdFieldID, + FieldIdentifier: OwnedOwnerIdField, + Operator: operator, } } -var OwnedPreloadAttributes = badorm.NewPreloadCondition[belongsto.Owned](ownedOwnerIdFieldID) +var OwnedPreloadAttributes = badorm.NewPreloadCondition[belongsto.Owned](OwnedIdField, OwnedCreatedAtField, OwnedUpdatedAtField, OwnedDeletedAtField, OwnedOwnerIdField) var OwnedPreloadRelations = []badorm.Condition[belongsto.Owned]{OwnedPreloadOwner} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go index 1d6035a3..fea13eb2 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/belongsto_owner.go @@ -5,32 +5,57 @@ import ( badorm "github.com/ditrit/badaas/badorm" belongsto "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/belongsto" gorm "gorm.io/gorm" + "reflect" "time" ) -func OwnerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[belongsto.Owner] { +var ownerType = reflect.TypeOf(*new(belongsto.Owner)) +var OwnerIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: ownerType, +} + +func OwnerId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: OwnerIdField, + Operator: operator, } } -func OwnerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owner] { + +var OwnerCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: ownerType, +} + +func OwnerCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: OwnerCreatedAtField, + Operator: operator, } } -func OwnerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[belongsto.Owner] { + +var OwnerUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: ownerType, +} + +func OwnerUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: OwnerUpdatedAtField, + Operator: operator, } } -func OwnerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[belongsto.Owner] { + +var OwnerDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: ownerType, +} + +func OwnerDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[belongsto.Owner] { return badorm.FieldCondition[belongsto.Owner, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: OwnerDeletedAtField, + Operator: operator, } } -var OwnerPreloadAttributes = badorm.NewPreloadCondition[belongsto.Owner]() +var OwnerPreloadAttributes = badorm.NewPreloadCondition[belongsto.Owner](OwnerIdField, OwnerCreatedAtField, OwnerUpdatedAtField, OwnerDeletedAtField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go index c9aa62f9..9d4310dc 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/columndefinition.go @@ -5,41 +5,70 @@ import ( badorm "github.com/ditrit/badaas/badorm" columndefinition "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/columndefinition" gorm "gorm.io/gorm" + "reflect" "time" ) -func ColumnDefinitionId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[columndefinition.ColumnDefinition] { +var columnDefinitionType = reflect.TypeOf(*new(columndefinition.ColumnDefinition)) +var ColumnDefinitionIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: columnDefinitionType, +} + +func ColumnDefinitionId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: ColumnDefinitionIdField, + Operator: operator, } } -func ColumnDefinitionCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[columndefinition.ColumnDefinition] { + +var ColumnDefinitionCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: columnDefinitionType, +} + +func ColumnDefinitionCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: ColumnDefinitionCreatedAtField, + Operator: operator, } } -func ColumnDefinitionUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[columndefinition.ColumnDefinition] { + +var ColumnDefinitionUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: columnDefinitionType, +} + +func ColumnDefinitionUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: ColumnDefinitionUpdatedAtField, + Operator: operator, } } -func ColumnDefinitionDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[columndefinition.ColumnDefinition] { + +var ColumnDefinitionDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: columnDefinitionType, +} + +func ColumnDefinitionDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: ColumnDefinitionDeletedAtField, + Operator: operator, } } -var columnDefinitionStringFieldID = badorm.FieldIdentifier{Column: "string_something_else"} +var ColumnDefinitionStringField = badorm.FieldIdentifier[string]{ + Column: "string_something_else", + Field: "String", + ModelType: columnDefinitionType, +} -func ColumnDefinitionString(expr badorm.Expression[string]) badorm.WhereCondition[columndefinition.ColumnDefinition] { +func ColumnDefinitionString(operator badorm.Operator[string]) badorm.WhereCondition[columndefinition.ColumnDefinition] { return badorm.FieldCondition[columndefinition.ColumnDefinition, string]{ - Expression: expr, - FieldIdentifier: columnDefinitionStringFieldID, + FieldIdentifier: ColumnDefinitionStringField, + Operator: operator, } } -var ColumnDefinitionPreloadAttributes = badorm.NewPreloadCondition[columndefinition.ColumnDefinition](columnDefinitionStringFieldID) +var ColumnDefinitionPreloadAttributes = badorm.NewPreloadCondition[columndefinition.ColumnDefinition](ColumnDefinitionIdField, ColumnDefinitionCreatedAtField, ColumnDefinitionUpdatedAtField, ColumnDefinitionDeletedAtField, ColumnDefinitionStringField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go index 597bbfa0..8147bf6e 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/customtype.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/customtype.go @@ -5,41 +5,69 @@ import ( badorm "github.com/ditrit/badaas/badorm" customtype "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/customtype" gorm "gorm.io/gorm" + "reflect" "time" ) -func CustomTypeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[customtype.CustomType] { +var customTypeType = reflect.TypeOf(*new(customtype.CustomType)) +var CustomTypeIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: customTypeType, +} + +func CustomTypeId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: CustomTypeIdField, + Operator: operator, } } -func CustomTypeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[customtype.CustomType] { + +var CustomTypeCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: customTypeType, +} + +func CustomTypeCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: CustomTypeCreatedAtField, + Operator: operator, } } -func CustomTypeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[customtype.CustomType] { + +var CustomTypeUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: customTypeType, +} + +func CustomTypeUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: CustomTypeUpdatedAtField, + Operator: operator, } } -func CustomTypeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[customtype.CustomType] { + +var CustomTypeDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: customTypeType, +} + +func CustomTypeDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: CustomTypeDeletedAtField, + Operator: operator, } } -var customTypeCustomFieldID = badorm.FieldIdentifier{Field: "Custom"} +var CustomTypeCustomField = badorm.FieldIdentifier[customtype.MultiString]{ + Field: "Custom", + ModelType: customTypeType, +} -func CustomTypeCustom(expr badorm.Expression[customtype.MultiString]) badorm.WhereCondition[customtype.CustomType] { +func CustomTypeCustom(operator badorm.Operator[customtype.MultiString]) badorm.WhereCondition[customtype.CustomType] { return badorm.FieldCondition[customtype.CustomType, customtype.MultiString]{ - Expression: expr, - FieldIdentifier: customTypeCustomFieldID, + FieldIdentifier: CustomTypeCustomField, + Operator: operator, } } -var CustomTypePreloadAttributes = badorm.NewPreloadCondition[customtype.CustomType](customTypeCustomFieldID) +var CustomTypePreloadAttributes = badorm.NewPreloadCondition[customtype.CustomType](CustomTypeIdField, CustomTypeCreatedAtField, CustomTypeUpdatedAtField, CustomTypeDeletedAtField, CustomTypeCustomField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go index 2f1cc747..3f6fc728 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/goembedded.go @@ -5,50 +5,81 @@ import ( badorm "github.com/ditrit/badaas/badorm" goembedded "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/goembedded" gorm "gorm.io/gorm" + "reflect" "time" ) -func GoEmbeddedId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[goembedded.GoEmbedded] { +var goEmbeddedType = reflect.TypeOf(*new(goembedded.GoEmbedded)) +var GoEmbeddedIdField = badorm.FieldIdentifier[badorm.UIntID]{ + Field: "ID", + ModelType: goEmbeddedType, +} + +func GoEmbeddedId(operator badorm.Operator[badorm.UIntID]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, badorm.UIntID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: GoEmbeddedIdField, + Operator: operator, } } -func GoEmbeddedCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[goembedded.GoEmbedded] { + +var GoEmbeddedCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: goEmbeddedType, +} + +func GoEmbeddedCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: GoEmbeddedCreatedAtField, + Operator: operator, } } -func GoEmbeddedUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[goembedded.GoEmbedded] { + +var GoEmbeddedUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: goEmbeddedType, +} + +func GoEmbeddedUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: GoEmbeddedUpdatedAtField, + Operator: operator, } } -func GoEmbeddedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[goembedded.GoEmbedded] { + +var GoEmbeddedDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: goEmbeddedType, +} + +func GoEmbeddedDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: GoEmbeddedDeletedAtField, + Operator: operator, } } -var goEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "Int"} +var GoEmbeddedIntField = badorm.FieldIdentifier[int]{ + Field: "Int", + ModelType: goEmbeddedType, +} -func GoEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[goembedded.GoEmbedded] { +func GoEmbeddedInt(operator badorm.Operator[int]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, int]{ - Expression: expr, - FieldIdentifier: goEmbeddedIntFieldID, + FieldIdentifier: GoEmbeddedIntField, + Operator: operator, } } -var goEmbeddedToBeEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "Int"} +var GoEmbeddedToBeEmbeddedIntField = badorm.FieldIdentifier[int]{ + Field: "Int", + ModelType: goEmbeddedType, +} -func GoEmbeddedToBeEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[goembedded.GoEmbedded] { +func GoEmbeddedToBeEmbeddedInt(operator badorm.Operator[int]) badorm.WhereCondition[goembedded.GoEmbedded] { return badorm.FieldCondition[goembedded.GoEmbedded, int]{ - Expression: expr, - FieldIdentifier: goEmbeddedToBeEmbeddedIntFieldID, + FieldIdentifier: GoEmbeddedToBeEmbeddedIntField, + Operator: operator, } } -var GoEmbeddedPreloadAttributes = badorm.NewPreloadCondition[goembedded.GoEmbedded](goEmbeddedIntFieldID, goEmbeddedToBeEmbeddedIntFieldID) +var GoEmbeddedPreloadAttributes = badorm.NewPreloadCondition[goembedded.GoEmbedded](GoEmbeddedIdField, GoEmbeddedCreatedAtField, GoEmbeddedUpdatedAtField, GoEmbeddedDeletedAtField, GoEmbeddedIntField, GoEmbeddedToBeEmbeddedIntField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go index 14302c14..89ab20b0 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/gormembedded.go @@ -5,62 +5,94 @@ import ( badorm "github.com/ditrit/badaas/badorm" gormembedded "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/gormembedded" gorm "gorm.io/gorm" + "reflect" "time" ) -func GormEmbeddedId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[gormembedded.GormEmbedded] { +var gormEmbeddedType = reflect.TypeOf(*new(gormembedded.GormEmbedded)) +var GormEmbeddedIdField = badorm.FieldIdentifier[badorm.UIntID]{ + Field: "ID", + ModelType: gormEmbeddedType, +} + +func GormEmbeddedId(operator badorm.Operator[badorm.UIntID]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, badorm.UIntID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: GormEmbeddedIdField, + Operator: operator, } } -func GormEmbeddedCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[gormembedded.GormEmbedded] { + +var GormEmbeddedCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: gormEmbeddedType, +} + +func GormEmbeddedCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: GormEmbeddedCreatedAtField, + Operator: operator, } } -func GormEmbeddedUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[gormembedded.GormEmbedded] { + +var GormEmbeddedUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: gormEmbeddedType, +} + +func GormEmbeddedUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: GormEmbeddedUpdatedAtField, + Operator: operator, } } -func GormEmbeddedDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[gormembedded.GormEmbedded] { + +var GormEmbeddedDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: gormEmbeddedType, +} + +func GormEmbeddedDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: GormEmbeddedDeletedAtField, + Operator: operator, } } -var gormEmbeddedIntFieldID = badorm.FieldIdentifier{Field: "Int"} +var GormEmbeddedIntField = badorm.FieldIdentifier[int]{ + Field: "Int", + ModelType: gormEmbeddedType, +} -func GormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { +func GormEmbeddedInt(operator badorm.Operator[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, int]{ - Expression: expr, - FieldIdentifier: gormEmbeddedIntFieldID, + FieldIdentifier: GormEmbeddedIntField, + Operator: operator, } } -var gormEmbeddedGormEmbeddedIntFieldID = badorm.FieldIdentifier{ +var GormEmbeddedGormEmbeddedIntField = badorm.FieldIdentifier[int]{ ColumnPrefix: "gorm_embedded_", Field: "Int", + ModelType: gormEmbeddedType, } -func GormEmbeddedGormEmbeddedInt(expr badorm.Expression[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { +func GormEmbeddedGormEmbeddedInt(operator badorm.Operator[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, int]{ - Expression: expr, - FieldIdentifier: gormEmbeddedGormEmbeddedIntFieldID, + FieldIdentifier: GormEmbeddedGormEmbeddedIntField, + Operator: operator, } } -var gormEmbeddedGormEmbeddedNoPrefixIntFieldID = badorm.FieldIdentifier{Field: "Int"} +var GormEmbeddedGormEmbeddedNoPrefixIntField = badorm.FieldIdentifier[int]{ + Field: "Int", + ModelType: gormEmbeddedType, +} -func GormEmbeddedGormEmbeddedNoPrefixInt(expr badorm.Expression[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { +func GormEmbeddedGormEmbeddedNoPrefixInt(operator badorm.Operator[int]) badorm.WhereCondition[gormembedded.GormEmbedded] { return badorm.FieldCondition[gormembedded.GormEmbedded, int]{ - Expression: expr, - FieldIdentifier: gormEmbeddedGormEmbeddedNoPrefixIntFieldID, + FieldIdentifier: GormEmbeddedGormEmbeddedNoPrefixIntField, + Operator: operator, } } -var GormEmbeddedPreloadAttributes = badorm.NewPreloadCondition[gormembedded.GormEmbedded](gormEmbeddedIntFieldID, gormEmbeddedGormEmbeddedIntFieldID, gormEmbeddedGormEmbeddedNoPrefixIntFieldID) +var GormEmbeddedPreloadAttributes = badorm.NewPreloadCondition[gormembedded.GormEmbedded](GormEmbeddedIdField, GormEmbeddedCreatedAtField, GormEmbeddedUpdatedAtField, GormEmbeddedDeletedAtField, GormEmbeddedIntField, GormEmbeddedGormEmbeddedIntField, GormEmbeddedGormEmbeddedNoPrefixIntField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go index 9ce387ec..ba27164a 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_company.go @@ -5,36 +5,61 @@ import ( badorm "github.com/ditrit/badaas/badorm" hasmany "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasmany" gorm "gorm.io/gorm" + "reflect" "time" ) -func CompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Company] { +var companyType = reflect.TypeOf(*new(hasmany.Company)) +var CompanyIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: companyType, +} + +func CompanyId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: CompanyIdField, + Operator: operator, } } -func CompanyCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Company] { + +var CompanyCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: companyType, +} + +func CompanyCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: CompanyCreatedAtField, + Operator: operator, } } -func CompanyUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Company] { + +var CompanyUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: companyType, +} + +func CompanyUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: CompanyUpdatedAtField, + Operator: operator, } } -func CompanyDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasmany.Company] { + +var CompanyDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: companyType, +} + +func CompanyDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[hasmany.Company] { return badorm.FieldCondition[hasmany.Company, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: CompanyDeletedAtField, + Operator: operator, } } func CompanyPreloadSellers(nestedPreloads ...badorm.IJoinCondition[hasmany.Seller]) badorm.Condition[hasmany.Company] { return badorm.NewCollectionPreloadCondition[hasmany.Company, hasmany.Seller]("Sellers", nestedPreloads) } -var CompanyPreloadAttributes = badorm.NewPreloadCondition[hasmany.Company]() +var CompanyPreloadAttributes = badorm.NewPreloadCondition[hasmany.Company](CompanyIdField, CompanyCreatedAtField, CompanyUpdatedAtField, CompanyDeletedAtField) var CompanyPreloadRelations = []badorm.Condition[hasmany.Company]{CompanyPreloadSellers()} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go index cbacdc6e..cc7bb568 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmany_seller.go @@ -5,31 +5,56 @@ import ( badorm "github.com/ditrit/badaas/badorm" hasmany "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasmany" gorm "gorm.io/gorm" + "reflect" "time" ) -func SellerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Seller] { +var sellerType = reflect.TypeOf(*new(hasmany.Seller)) +var SellerIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: sellerType, +} + +func SellerId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: SellerIdField, + Operator: operator, } } -func SellerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Seller] { + +var SellerCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: sellerType, +} + +func SellerCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: SellerCreatedAtField, + Operator: operator, } } -func SellerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmany.Seller] { + +var SellerUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: sellerType, +} + +func SellerUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: SellerUpdatedAtField, + Operator: operator, } } -func SellerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasmany.Seller] { + +var SellerDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: sellerType, +} + +func SellerDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: SellerDeletedAtField, + Operator: operator, } } func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.IJoinCondition[hasmany.Seller] { @@ -43,14 +68,17 @@ func SellerCompany(conditions ...badorm.Condition[hasmany.Company]) badorm.IJoin } var SellerPreloadCompany = SellerCompany(CompanyPreloadAttributes) -var sellerCompanyIdFieldID = badorm.FieldIdentifier{Field: "CompanyID"} +var SellerCompanyIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "CompanyID", + ModelType: sellerType, +} -func SellerCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmany.Seller] { +func SellerCompanyId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[hasmany.Seller] { return badorm.FieldCondition[hasmany.Seller, badorm.UUID]{ - Expression: expr, - FieldIdentifier: sellerCompanyIdFieldID, + FieldIdentifier: SellerCompanyIdField, + Operator: operator, } } -var SellerPreloadAttributes = badorm.NewPreloadCondition[hasmany.Seller](sellerCompanyIdFieldID) +var SellerPreloadAttributes = badorm.NewPreloadCondition[hasmany.Seller](SellerIdField, SellerCreatedAtField, SellerUpdatedAtField, SellerDeletedAtField, SellerCompanyIdField) var SellerPreloadRelations = []badorm.Condition[hasmany.Seller]{SellerPreloadCompany} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_company.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_company.go index 44cd1b44..60fa1660 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_company.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_company.go @@ -5,36 +5,61 @@ import ( badorm "github.com/ditrit/badaas/badorm" hasmanywithpointers "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers" gorm "gorm.io/gorm" + "reflect" "time" ) -func CompanyWithPointersId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { +var companyWithPointersType = reflect.TypeOf(*new(hasmanywithpointers.CompanyWithPointers)) +var CompanyWithPointersIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: companyWithPointersType, +} + +func CompanyWithPointersId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { return badorm.FieldCondition[hasmanywithpointers.CompanyWithPointers, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: CompanyWithPointersIdField, + Operator: operator, } } -func CompanyWithPointersCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { + +var CompanyWithPointersCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: companyWithPointersType, +} + +func CompanyWithPointersCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { return badorm.FieldCondition[hasmanywithpointers.CompanyWithPointers, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: CompanyWithPointersCreatedAtField, + Operator: operator, } } -func CompanyWithPointersUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { + +var CompanyWithPointersUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: companyWithPointersType, +} + +func CompanyWithPointersUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { return badorm.FieldCondition[hasmanywithpointers.CompanyWithPointers, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: CompanyWithPointersUpdatedAtField, + Operator: operator, } } -func CompanyWithPointersDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { + +var CompanyWithPointersDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: companyWithPointersType, +} + +func CompanyWithPointersDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[hasmanywithpointers.CompanyWithPointers] { return badorm.FieldCondition[hasmanywithpointers.CompanyWithPointers, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: CompanyWithPointersDeletedAtField, + Operator: operator, } } func CompanyWithPointersPreloadSellers(nestedPreloads ...badorm.IJoinCondition[hasmanywithpointers.SellerInPointers]) badorm.Condition[hasmanywithpointers.CompanyWithPointers] { return badorm.NewCollectionPreloadCondition[hasmanywithpointers.CompanyWithPointers, hasmanywithpointers.SellerInPointers]("Sellers", nestedPreloads) } -var CompanyWithPointersPreloadAttributes = badorm.NewPreloadCondition[hasmanywithpointers.CompanyWithPointers]() +var CompanyWithPointersPreloadAttributes = badorm.NewPreloadCondition[hasmanywithpointers.CompanyWithPointers](CompanyWithPointersIdField, CompanyWithPointersCreatedAtField, CompanyWithPointersUpdatedAtField, CompanyWithPointersDeletedAtField) var CompanyWithPointersPreloadRelations = []badorm.Condition[hasmanywithpointers.CompanyWithPointers]{CompanyWithPointersPreloadSellers()} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_seller.go b/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_seller.go index e3359ce5..40ac3791 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_seller.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasmanywithpointers_seller.go @@ -5,31 +5,56 @@ import ( badorm "github.com/ditrit/badaas/badorm" hasmanywithpointers "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasmanywithpointers" gorm "gorm.io/gorm" + "reflect" "time" ) -func SellerInPointersId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { +var sellerInPointersType = reflect.TypeOf(*new(hasmanywithpointers.SellerInPointers)) +var SellerInPointersIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: sellerInPointersType, +} + +func SellerInPointersId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { return badorm.FieldCondition[hasmanywithpointers.SellerInPointers, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: SellerInPointersIdField, + Operator: operator, } } -func SellerInPointersCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { + +var SellerInPointersCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: sellerInPointersType, +} + +func SellerInPointersCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { return badorm.FieldCondition[hasmanywithpointers.SellerInPointers, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: SellerInPointersCreatedAtField, + Operator: operator, } } -func SellerInPointersUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { + +var SellerInPointersUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: sellerInPointersType, +} + +func SellerInPointersUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { return badorm.FieldCondition[hasmanywithpointers.SellerInPointers, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: SellerInPointersUpdatedAtField, + Operator: operator, } } -func SellerInPointersDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { + +var SellerInPointersDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: sellerInPointersType, +} + +func SellerInPointersDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { return badorm.FieldCondition[hasmanywithpointers.SellerInPointers, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: SellerInPointersDeletedAtField, + Operator: operator, } } func SellerInPointersCompany(conditions ...badorm.Condition[hasmanywithpointers.CompanyWithPointers]) badorm.IJoinCondition[hasmanywithpointers.SellerInPointers] { @@ -43,14 +68,17 @@ func SellerInPointersCompany(conditions ...badorm.Condition[hasmanywithpointers. } var SellerInPointersPreloadCompany = SellerInPointersCompany(CompanyWithPointersPreloadAttributes) -var sellerInPointersCompanyIdFieldID = badorm.FieldIdentifier{Field: "CompanyID"} +var SellerInPointersCompanyIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "CompanyID", + ModelType: sellerInPointersType, +} -func SellerInPointersCompanyId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { +func SellerInPointersCompanyId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[hasmanywithpointers.SellerInPointers] { return badorm.FieldCondition[hasmanywithpointers.SellerInPointers, badorm.UUID]{ - Expression: expr, - FieldIdentifier: sellerInPointersCompanyIdFieldID, + FieldIdentifier: SellerInPointersCompanyIdField, + Operator: operator, } } -var SellerInPointersPreloadAttributes = badorm.NewPreloadCondition[hasmanywithpointers.SellerInPointers](sellerInPointersCompanyIdFieldID) +var SellerInPointersPreloadAttributes = badorm.NewPreloadCondition[hasmanywithpointers.SellerInPointers](SellerInPointersIdField, SellerInPointersCreatedAtField, SellerInPointersUpdatedAtField, SellerInPointersDeletedAtField, SellerInPointersCompanyIdField) var SellerInPointersPreloadRelations = []badorm.Condition[hasmanywithpointers.SellerInPointers]{SellerInPointersPreloadCompany} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go index 79a0db98..db15efcb 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_city.go @@ -5,31 +5,56 @@ import ( badorm "github.com/ditrit/badaas/badorm" hasone "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasone" gorm "gorm.io/gorm" + "reflect" "time" ) -func CityId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.City] { +var cityType = reflect.TypeOf(*new(hasone.City)) +var CityIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: cityType, +} + +func CityId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: CityIdField, + Operator: operator, } } -func CityCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.City] { + +var CityCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: cityType, +} + +func CityCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: CityCreatedAtField, + Operator: operator, } } -func CityUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.City] { + +var CityUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: cityType, +} + +func CityUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: CityUpdatedAtField, + Operator: operator, } } -func CityDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasone.City] { + +var CityDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: cityType, +} + +func CityDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: CityDeletedAtField, + Operator: operator, } } func CityCountry(conditions ...badorm.Condition[hasone.Country]) badorm.IJoinCondition[hasone.City] { @@ -43,14 +68,17 @@ func CityCountry(conditions ...badorm.Condition[hasone.Country]) badorm.IJoinCon } var CityPreloadCountry = CityCountry(CountryPreloadAttributes) -var cityCountryIdFieldID = badorm.FieldIdentifier{Field: "CountryID"} +var CityCountryIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "CountryID", + ModelType: cityType, +} -func CityCountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.City] { +func CityCountryId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[hasone.City] { return badorm.FieldCondition[hasone.City, badorm.UUID]{ - Expression: expr, - FieldIdentifier: cityCountryIdFieldID, + FieldIdentifier: CityCountryIdField, + Operator: operator, } } -var CityPreloadAttributes = badorm.NewPreloadCondition[hasone.City](cityCountryIdFieldID) +var CityPreloadAttributes = badorm.NewPreloadCondition[hasone.City](CityIdField, CityCreatedAtField, CityUpdatedAtField, CityDeletedAtField, CityCountryIdField) var CityPreloadRelations = []badorm.Condition[hasone.City]{CityPreloadCountry} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go index c834823d..3e0a3616 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/hasone_country.go @@ -5,31 +5,56 @@ import ( badorm "github.com/ditrit/badaas/badorm" hasone "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/hasone" gorm "gorm.io/gorm" + "reflect" "time" ) -func CountryId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[hasone.Country] { +var countryType = reflect.TypeOf(*new(hasone.Country)) +var CountryIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: countryType, +} + +func CountryId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: CountryIdField, + Operator: operator, } } -func CountryCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.Country] { + +var CountryCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: countryType, +} + +func CountryCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: CountryCreatedAtField, + Operator: operator, } } -func CountryUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[hasone.Country] { + +var CountryUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: countryType, +} + +func CountryUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: CountryUpdatedAtField, + Operator: operator, } } -func CountryDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[hasone.Country] { + +var CountryDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: countryType, +} + +func CountryDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[hasone.Country] { return badorm.FieldCondition[hasone.Country, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: CountryDeletedAtField, + Operator: operator, } } func CountryCapital(conditions ...badorm.Condition[hasone.City]) badorm.IJoinCondition[hasone.Country] { @@ -43,5 +68,5 @@ func CountryCapital(conditions ...badorm.Condition[hasone.City]) badorm.IJoinCon } var CountryPreloadCapital = CountryCapital(CityPreloadAttributes) -var CountryPreloadAttributes = badorm.NewPreloadCondition[hasone.Country]() +var CountryPreloadAttributes = badorm.NewPreloadCondition[hasone.Country](CountryIdField, CountryCreatedAtField, CountryUpdatedAtField, CountryDeletedAtField) var CountryPreloadRelations = []badorm.Condition[hasone.Country]{CountryPreloadCapital} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go index 965f395b..4eb25fd7 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package1.go @@ -6,31 +6,56 @@ import ( package1 "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package1" package2 "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package2" gorm "gorm.io/gorm" + "reflect" "time" ) -func Package1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[package1.Package1] { +var package1Type = reflect.TypeOf(*new(package1.Package1)) +var Package1IdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: package1Type, +} + +func Package1Id(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: Package1IdField, + Operator: operator, } } -func Package1CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[package1.Package1] { + +var Package1CreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: package1Type, +} + +func Package1CreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: Package1CreatedAtField, + Operator: operator, } } -func Package1UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[package1.Package1] { + +var Package1UpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: package1Type, +} + +func Package1UpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: Package1UpdatedAtField, + Operator: operator, } } -func Package1DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[package1.Package1] { + +var Package1DeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: package1Type, +} + +func Package1DeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[package1.Package1] { return badorm.FieldCondition[package1.Package1, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: Package1DeletedAtField, + Operator: operator, } } func Package1Package2(conditions ...badorm.Condition[package2.Package2]) badorm.IJoinCondition[package1.Package1] { @@ -44,5 +69,5 @@ func Package1Package2(conditions ...badorm.Condition[package2.Package2]) badorm. } var Package1PreloadPackage2 = Package1Package2(Package2PreloadAttributes) -var Package1PreloadAttributes = badorm.NewPreloadCondition[package1.Package1]() +var Package1PreloadAttributes = badorm.NewPreloadCondition[package1.Package1](Package1IdField, Package1CreatedAtField, Package1UpdatedAtField, Package1DeletedAtField) var Package1PreloadRelations = []badorm.Condition[package1.Package1]{Package1PreloadPackage2} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go index 0193750d..0331c6fc 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/multiplepackage_package2.go @@ -5,41 +5,69 @@ import ( badorm "github.com/ditrit/badaas/badorm" package2 "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/multiplepackage/package2" gorm "gorm.io/gorm" + "reflect" "time" ) -func Package2Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[package2.Package2] { +var package2Type = reflect.TypeOf(*new(package2.Package2)) +var Package2IdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: package2Type, +} + +func Package2Id(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[package2.Package2] { return badorm.FieldCondition[package2.Package2, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: Package2IdField, + Operator: operator, } } -func Package2CreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[package2.Package2] { + +var Package2CreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: package2Type, +} + +func Package2CreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[package2.Package2] { return badorm.FieldCondition[package2.Package2, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: Package2CreatedAtField, + Operator: operator, } } -func Package2UpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[package2.Package2] { + +var Package2UpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: package2Type, +} + +func Package2UpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[package2.Package2] { return badorm.FieldCondition[package2.Package2, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: Package2UpdatedAtField, + Operator: operator, } } -func Package2DeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[package2.Package2] { + +var Package2DeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: package2Type, +} + +func Package2DeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[package2.Package2] { return badorm.FieldCondition[package2.Package2, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: Package2DeletedAtField, + Operator: operator, } } -var package2Package1IdFieldID = badorm.FieldIdentifier{Field: "Package1ID"} +var Package2Package1IdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "Package1ID", + ModelType: package2Type, +} -func Package2Package1Id(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[package2.Package2] { +func Package2Package1Id(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[package2.Package2] { return badorm.FieldCondition[package2.Package2, badorm.UUID]{ - Expression: expr, - FieldIdentifier: package2Package1IdFieldID, + FieldIdentifier: Package2Package1IdField, + Operator: operator, } } -var Package2PreloadAttributes = badorm.NewPreloadCondition[package2.Package2](package2Package1IdFieldID) +var Package2PreloadAttributes = badorm.NewPreloadCondition[package2.Package2](Package2IdField, Package2CreatedAtField, Package2UpdatedAtField, Package2DeletedAtField, Package2Package1IdField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_bicycle.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_bicycle.go index 6b0139c6..f60cf198 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_bicycle.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_bicycle.go @@ -5,31 +5,56 @@ import ( badorm "github.com/ditrit/badaas/badorm" overrideforeignkey "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overrideforeignkey" gorm "gorm.io/gorm" + "reflect" "time" ) -func BicycleId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkey.Bicycle] { +var bicycleType = reflect.TypeOf(*new(overrideforeignkey.Bicycle)) +var BicycleIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: bicycleType, +} + +func BicycleId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: BicycleIdField, + Operator: operator, } } -func BicycleCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkey.Bicycle] { + +var BicycleCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: bicycleType, +} + +func BicycleCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: BicycleCreatedAtField, + Operator: operator, } } -func BicycleUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkey.Bicycle] { + +var BicycleUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: bicycleType, +} + +func BicycleUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: BicycleUpdatedAtField, + Operator: operator, } } -func BicycleDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkey.Bicycle] { + +var BicycleDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: bicycleType, +} + +func BicycleDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: BicycleDeletedAtField, + Operator: operator, } } func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) badorm.IJoinCondition[overrideforeignkey.Bicycle] { @@ -43,14 +68,17 @@ func BicycleOwner(conditions ...badorm.Condition[overrideforeignkey.Person]) bad } var BicyclePreloadOwner = BicycleOwner(PersonPreloadAttributes) -var bicycleOwnerSomethingIdFieldID = badorm.FieldIdentifier{Field: "OwnerSomethingID"} +var BicycleOwnerSomethingIdField = badorm.FieldIdentifier[string]{ + Field: "OwnerSomethingID", + ModelType: bicycleType, +} -func BicycleOwnerSomethingId(expr badorm.Expression[string]) badorm.WhereCondition[overrideforeignkey.Bicycle] { +func BicycleOwnerSomethingId(operator badorm.Operator[string]) badorm.WhereCondition[overrideforeignkey.Bicycle] { return badorm.FieldCondition[overrideforeignkey.Bicycle, string]{ - Expression: expr, - FieldIdentifier: bicycleOwnerSomethingIdFieldID, + FieldIdentifier: BicycleOwnerSomethingIdField, + Operator: operator, } } -var BicyclePreloadAttributes = badorm.NewPreloadCondition[overrideforeignkey.Bicycle](bicycleOwnerSomethingIdFieldID) +var BicyclePreloadAttributes = badorm.NewPreloadCondition[overrideforeignkey.Bicycle](BicycleIdField, BicycleCreatedAtField, BicycleUpdatedAtField, BicycleDeletedAtField, BicycleOwnerSomethingIdField) var BicyclePreloadRelations = []badorm.Condition[overrideforeignkey.Bicycle]{BicyclePreloadOwner} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go index f375d0ef..24ec4abb 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkey_person.go @@ -5,32 +5,57 @@ import ( badorm "github.com/ditrit/badaas/badorm" overrideforeignkey "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overrideforeignkey" gorm "gorm.io/gorm" + "reflect" "time" ) -func PersonId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkey.Person] { +var personType = reflect.TypeOf(*new(overrideforeignkey.Person)) +var PersonIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: personType, +} + +func PersonId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[overrideforeignkey.Person] { return badorm.FieldCondition[overrideforeignkey.Person, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: PersonIdField, + Operator: operator, } } -func PersonCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkey.Person] { + +var PersonCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: personType, +} + +func PersonCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overrideforeignkey.Person] { return badorm.FieldCondition[overrideforeignkey.Person, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: PersonCreatedAtField, + Operator: operator, } } -func PersonUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkey.Person] { + +var PersonUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: personType, +} + +func PersonUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overrideforeignkey.Person] { return badorm.FieldCondition[overrideforeignkey.Person, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: PersonUpdatedAtField, + Operator: operator, } } -func PersonDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkey.Person] { + +var PersonDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: personType, +} + +func PersonDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkey.Person] { return badorm.FieldCondition[overrideforeignkey.Person, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: PersonDeletedAtField, + Operator: operator, } } -var PersonPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkey.Person]() +var PersonPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkey.Person](PersonIdField, PersonCreatedAtField, PersonUpdatedAtField, PersonDeletedAtField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go index af712da4..33118770 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_credit_card.go @@ -5,41 +5,69 @@ import ( badorm "github.com/ditrit/badaas/badorm" overrideforeignkeyinverse "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse" gorm "gorm.io/gorm" + "reflect" "time" ) -func CreditCardId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { +var creditCardType = reflect.TypeOf(*new(overrideforeignkeyinverse.CreditCard)) +var CreditCardIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: creditCardType, +} + +func CreditCardId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { return badorm.FieldCondition[overrideforeignkeyinverse.CreditCard, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: CreditCardIdField, + Operator: operator, } } -func CreditCardCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { + +var CreditCardCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: creditCardType, +} + +func CreditCardCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { return badorm.FieldCondition[overrideforeignkeyinverse.CreditCard, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: CreditCardCreatedAtField, + Operator: operator, } } -func CreditCardUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { + +var CreditCardUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: creditCardType, +} + +func CreditCardUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { return badorm.FieldCondition[overrideforeignkeyinverse.CreditCard, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: CreditCardUpdatedAtField, + Operator: operator, } } -func CreditCardDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { + +var CreditCardDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: creditCardType, +} + +func CreditCardDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { return badorm.FieldCondition[overrideforeignkeyinverse.CreditCard, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: CreditCardDeletedAtField, + Operator: operator, } } -var creditCardUserReferenceFieldID = badorm.FieldIdentifier{Field: "UserReference"} +var CreditCardUserReferenceField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "UserReference", + ModelType: creditCardType, +} -func CreditCardUserReference(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { +func CreditCardUserReference(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[overrideforeignkeyinverse.CreditCard] { return badorm.FieldCondition[overrideforeignkeyinverse.CreditCard, badorm.UUID]{ - Expression: expr, - FieldIdentifier: creditCardUserReferenceFieldID, + FieldIdentifier: CreditCardUserReferenceField, + Operator: operator, } } -var CreditCardPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkeyinverse.CreditCard](creditCardUserReferenceFieldID) +var CreditCardPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkeyinverse.CreditCard](CreditCardIdField, CreditCardCreatedAtField, CreditCardUpdatedAtField, CreditCardDeletedAtField, CreditCardUserReferenceField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_user.go b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_user.go index a5a22e9f..1915cf36 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_user.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overrideforeignkeyinverse_user.go @@ -5,31 +5,56 @@ import ( badorm "github.com/ditrit/badaas/badorm" overrideforeignkeyinverse "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overrideforeignkeyinverse" gorm "gorm.io/gorm" + "reflect" "time" ) -func UserId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overrideforeignkeyinverse.User] { +var userType = reflect.TypeOf(*new(overrideforeignkeyinverse.User)) +var UserIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: userType, +} + +func UserId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: UserIdField, + Operator: operator, } } -func UserCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.User] { + +var UserCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: userType, +} + +func UserCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: UserCreatedAtField, + Operator: operator, } } -func UserUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.User] { + +var UserUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: userType, +} + +func UserUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: UserUpdatedAtField, + Operator: operator, } } -func UserDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkeyinverse.User] { + +var UserDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: userType, +} + +func UserDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[overrideforeignkeyinverse.User] { return badorm.FieldCondition[overrideforeignkeyinverse.User, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: UserDeletedAtField, + Operator: operator, } } func UserCreditCard(conditions ...badorm.Condition[overrideforeignkeyinverse.CreditCard]) badorm.IJoinCondition[overrideforeignkeyinverse.User] { @@ -43,5 +68,5 @@ func UserCreditCard(conditions ...badorm.Condition[overrideforeignkeyinverse.Cre } var UserPreloadCreditCard = UserCreditCard(CreditCardPreloadAttributes) -var UserPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkeyinverse.User]() +var UserPreloadAttributes = badorm.NewPreloadCondition[overrideforeignkeyinverse.User](UserIdField, UserCreatedAtField, UserUpdatedAtField, UserDeletedAtField) var UserPreloadRelations = []badorm.Condition[overrideforeignkeyinverse.User]{UserPreloadCreditCard} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go index 91b120d4..3ad2e14b 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_brand.go @@ -5,41 +5,69 @@ import ( badorm "github.com/ditrit/badaas/badorm" overridereferences "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overridereferences" gorm "gorm.io/gorm" + "reflect" "time" ) -func BrandId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overridereferences.Brand] { +var brandType = reflect.TypeOf(*new(overridereferences.Brand)) +var BrandIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: brandType, +} + +func BrandId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[overridereferences.Brand] { return badorm.FieldCondition[overridereferences.Brand, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: BrandIdField, + Operator: operator, } } -func BrandCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferences.Brand] { + +var BrandCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: brandType, +} + +func BrandCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overridereferences.Brand] { return badorm.FieldCondition[overridereferences.Brand, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: BrandCreatedAtField, + Operator: operator, } } -func BrandUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferences.Brand] { + +var BrandUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: brandType, +} + +func BrandUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overridereferences.Brand] { return badorm.FieldCondition[overridereferences.Brand, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: BrandUpdatedAtField, + Operator: operator, } } -func BrandDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overridereferences.Brand] { + +var BrandDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: brandType, +} + +func BrandDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[overridereferences.Brand] { return badorm.FieldCondition[overridereferences.Brand, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: BrandDeletedAtField, + Operator: operator, } } -var brandNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var BrandNameField = badorm.FieldIdentifier[string]{ + Field: "Name", + ModelType: brandType, +} -func BrandName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferences.Brand] { +func BrandName(operator badorm.Operator[string]) badorm.WhereCondition[overridereferences.Brand] { return badorm.FieldCondition[overridereferences.Brand, string]{ - Expression: expr, - FieldIdentifier: brandNameFieldID, + FieldIdentifier: BrandNameField, + Operator: operator, } } -var BrandPreloadAttributes = badorm.NewPreloadCondition[overridereferences.Brand](brandNameFieldID) +var BrandPreloadAttributes = badorm.NewPreloadCondition[overridereferences.Brand](BrandIdField, BrandCreatedAtField, BrandUpdatedAtField, BrandDeletedAtField, BrandNameField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_phone.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_phone.go index 15a12a12..57e4229b 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_phone.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferences_phone.go @@ -5,31 +5,56 @@ import ( badorm "github.com/ditrit/badaas/badorm" overridereferences "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overridereferences" gorm "gorm.io/gorm" + "reflect" "time" ) -func PhoneId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overridereferences.Phone] { +var phoneType = reflect.TypeOf(*new(overridereferences.Phone)) +var PhoneIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: phoneType, +} + +func PhoneId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: PhoneIdField, + Operator: operator, } } -func PhoneCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferences.Phone] { + +var PhoneCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: phoneType, +} + +func PhoneCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: PhoneCreatedAtField, + Operator: operator, } } -func PhoneUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferences.Phone] { + +var PhoneUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: phoneType, +} + +func PhoneUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: PhoneUpdatedAtField, + Operator: operator, } } -func PhoneDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overridereferences.Phone] { + +var PhoneDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: phoneType, +} + +func PhoneDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: PhoneDeletedAtField, + Operator: operator, } } func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm.IJoinCondition[overridereferences.Phone] { @@ -43,14 +68,17 @@ func PhoneBrand(conditions ...badorm.Condition[overridereferences.Brand]) badorm } var PhonePreloadBrand = PhoneBrand(BrandPreloadAttributes) -var phoneBrandNameFieldID = badorm.FieldIdentifier{Field: "BrandName"} +var PhoneBrandNameField = badorm.FieldIdentifier[string]{ + Field: "BrandName", + ModelType: phoneType, +} -func PhoneBrandName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferences.Phone] { +func PhoneBrandName(operator badorm.Operator[string]) badorm.WhereCondition[overridereferences.Phone] { return badorm.FieldCondition[overridereferences.Phone, string]{ - Expression: expr, - FieldIdentifier: phoneBrandNameFieldID, + FieldIdentifier: PhoneBrandNameField, + Operator: operator, } } -var PhonePreloadAttributes = badorm.NewPreloadCondition[overridereferences.Phone](phoneBrandNameFieldID) +var PhonePreloadAttributes = badorm.NewPreloadCondition[overridereferences.Phone](PhoneIdField, PhoneCreatedAtField, PhoneUpdatedAtField, PhoneDeletedAtField, PhoneBrandNameField) var PhonePreloadRelations = []badorm.Condition[overridereferences.Phone]{PhonePreloadBrand} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_computer.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_computer.go index 1f5015d1..b5b04a86 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_computer.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_computer.go @@ -5,40 +5,68 @@ import ( badorm "github.com/ditrit/badaas/badorm" overridereferencesinverse "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse" gorm "gorm.io/gorm" + "reflect" "time" ) -func ComputerId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overridereferencesinverse.Computer] { +var computerType = reflect.TypeOf(*new(overridereferencesinverse.Computer)) +var ComputerIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: computerType, +} + +func ComputerId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: ComputerIdField, + Operator: operator, } } -func ComputerCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferencesinverse.Computer] { + +var ComputerCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: computerType, +} + +func ComputerCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: ComputerCreatedAtField, + Operator: operator, } } -func ComputerUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferencesinverse.Computer] { + +var ComputerUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: computerType, +} + +func ComputerUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: ComputerUpdatedAtField, + Operator: operator, } } -func ComputerDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overridereferencesinverse.Computer] { + +var ComputerDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: computerType, +} + +func ComputerDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: ComputerDeletedAtField, + Operator: operator, } } -var computerNameFieldID = badorm.FieldIdentifier{Field: "Name"} +var ComputerNameField = badorm.FieldIdentifier[string]{ + Field: "Name", + ModelType: computerType, +} -func ComputerName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferencesinverse.Computer] { +func ComputerName(operator badorm.Operator[string]) badorm.WhereCondition[overridereferencesinverse.Computer] { return badorm.FieldCondition[overridereferencesinverse.Computer, string]{ - Expression: expr, - FieldIdentifier: computerNameFieldID, + FieldIdentifier: ComputerNameField, + Operator: operator, } } func ComputerProcessor(conditions ...badorm.Condition[overridereferencesinverse.Processor]) badorm.IJoinCondition[overridereferencesinverse.Computer] { @@ -52,5 +80,5 @@ func ComputerProcessor(conditions ...badorm.Condition[overridereferencesinverse. } var ComputerPreloadProcessor = ComputerProcessor(ProcessorPreloadAttributes) -var ComputerPreloadAttributes = badorm.NewPreloadCondition[overridereferencesinverse.Computer](computerNameFieldID) +var ComputerPreloadAttributes = badorm.NewPreloadCondition[overridereferencesinverse.Computer](ComputerIdField, ComputerCreatedAtField, ComputerUpdatedAtField, ComputerDeletedAtField, ComputerNameField) var ComputerPreloadRelations = []badorm.Condition[overridereferencesinverse.Computer]{ComputerPreloadProcessor} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go index c9d0cbe3..6095d9d4 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/overridereferencesinverse_processor.go @@ -5,41 +5,69 @@ import ( badorm "github.com/ditrit/badaas/badorm" overridereferencesinverse "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/overridereferencesinverse" gorm "gorm.io/gorm" + "reflect" "time" ) -func ProcessorId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[overridereferencesinverse.Processor] { +var processorType = reflect.TypeOf(*new(overridereferencesinverse.Processor)) +var ProcessorIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: processorType, +} + +func ProcessorId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[overridereferencesinverse.Processor] { return badorm.FieldCondition[overridereferencesinverse.Processor, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: ProcessorIdField, + Operator: operator, } } -func ProcessorCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferencesinverse.Processor] { + +var ProcessorCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: processorType, +} + +func ProcessorCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overridereferencesinverse.Processor] { return badorm.FieldCondition[overridereferencesinverse.Processor, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: ProcessorCreatedAtField, + Operator: operator, } } -func ProcessorUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[overridereferencesinverse.Processor] { + +var ProcessorUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: processorType, +} + +func ProcessorUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[overridereferencesinverse.Processor] { return badorm.FieldCondition[overridereferencesinverse.Processor, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: ProcessorUpdatedAtField, + Operator: operator, } } -func ProcessorDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[overridereferencesinverse.Processor] { + +var ProcessorDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: processorType, +} + +func ProcessorDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[overridereferencesinverse.Processor] { return badorm.FieldCondition[overridereferencesinverse.Processor, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: ProcessorDeletedAtField, + Operator: operator, } } -var processorComputerNameFieldID = badorm.FieldIdentifier{Field: "ComputerName"} +var ProcessorComputerNameField = badorm.FieldIdentifier[string]{ + Field: "ComputerName", + ModelType: processorType, +} -func ProcessorComputerName(expr badorm.Expression[string]) badorm.WhereCondition[overridereferencesinverse.Processor] { +func ProcessorComputerName(operator badorm.Operator[string]) badorm.WhereCondition[overridereferencesinverse.Processor] { return badorm.FieldCondition[overridereferencesinverse.Processor, string]{ - Expression: expr, - FieldIdentifier: processorComputerNameFieldID, + FieldIdentifier: ProcessorComputerNameField, + Operator: operator, } } -var ProcessorPreloadAttributes = badorm.NewPreloadCondition[overridereferencesinverse.Processor](processorComputerNameFieldID) +var ProcessorPreloadAttributes = badorm.NewPreloadCondition[overridereferencesinverse.Processor](ProcessorIdField, ProcessorCreatedAtField, ProcessorUpdatedAtField, ProcessorDeletedAtField, ProcessorComputerNameField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go index 2acd3ad6..754c0b08 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/selfreferential.go @@ -5,31 +5,56 @@ import ( badorm "github.com/ditrit/badaas/badorm" selfreferential "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/selfreferential" gorm "gorm.io/gorm" + "reflect" "time" ) -func EmployeeId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { +var employeeType = reflect.TypeOf(*new(selfreferential.Employee)) +var EmployeeIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: employeeType, +} + +func EmployeeId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: EmployeeIdField, + Operator: operator, } } -func EmployeeCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[selfreferential.Employee] { + +var EmployeeCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: employeeType, +} + +func EmployeeCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: EmployeeCreatedAtField, + Operator: operator, } } -func EmployeeUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[selfreferential.Employee] { + +var EmployeeUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: employeeType, +} + +func EmployeeUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: EmployeeUpdatedAtField, + Operator: operator, } } -func EmployeeDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[selfreferential.Employee] { + +var EmployeeDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: employeeType, +} + +func EmployeeDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: EmployeeDeletedAtField, + Operator: operator, } } func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) badorm.IJoinCondition[selfreferential.Employee] { @@ -43,14 +68,17 @@ func EmployeeBoss(conditions ...badorm.Condition[selfreferential.Employee]) bado } var EmployeePreloadBoss = EmployeeBoss(EmployeePreloadAttributes) -var employeeBossIdFieldID = badorm.FieldIdentifier{Field: "BossID"} +var EmployeeBossIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "BossID", + ModelType: employeeType, +} -func EmployeeBossId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { +func EmployeeBossId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[selfreferential.Employee] { return badorm.FieldCondition[selfreferential.Employee, badorm.UUID]{ - Expression: expr, - FieldIdentifier: employeeBossIdFieldID, + FieldIdentifier: EmployeeBossIdField, + Operator: operator, } } -var EmployeePreloadAttributes = badorm.NewPreloadCondition[selfreferential.Employee](employeeBossIdFieldID) +var EmployeePreloadAttributes = badorm.NewPreloadCondition[selfreferential.Employee](EmployeeIdField, EmployeeCreatedAtField, EmployeeUpdatedAtField, EmployeeDeletedAtField, EmployeeBossIdField) var EmployeePreloadRelations = []badorm.Condition[selfreferential.Employee]{EmployeePreloadBoss} diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go index f829d9ef..d9fcb8a4 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uintmodel.go @@ -5,32 +5,57 @@ import ( badorm "github.com/ditrit/badaas/badorm" uintmodel "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/uintmodel" gorm "gorm.io/gorm" + "reflect" "time" ) -func UintModelId(expr badorm.Expression[badorm.UIntID]) badorm.WhereCondition[uintmodel.UintModel] { +var uintModelType = reflect.TypeOf(*new(uintmodel.UintModel)) +var UintModelIdField = badorm.FieldIdentifier[badorm.UIntID]{ + Field: "ID", + ModelType: uintModelType, +} + +func UintModelId(operator badorm.Operator[badorm.UIntID]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, badorm.UIntID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: UintModelIdField, + Operator: operator, } } -func UintModelCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uintmodel.UintModel] { + +var UintModelCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: uintModelType, +} + +func UintModelCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: UintModelCreatedAtField, + Operator: operator, } } -func UintModelUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uintmodel.UintModel] { + +var UintModelUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: uintModelType, +} + +func UintModelUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: UintModelUpdatedAtField, + Operator: operator, } } -func UintModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[uintmodel.UintModel] { + +var UintModelDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: uintModelType, +} + +func UintModelDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[uintmodel.UintModel] { return badorm.FieldCondition[uintmodel.UintModel, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: UintModelDeletedAtField, + Operator: operator, } } -var UintModelPreloadAttributes = badorm.NewPreloadCondition[uintmodel.UintModel]() +var UintModelPreloadAttributes = badorm.NewPreloadCondition[uintmodel.UintModel](UintModelIdField, UintModelCreatedAtField, UintModelUpdatedAtField, UintModelDeletedAtField) diff --git a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go index 24e2faa6..bb6f8132 100644 --- a/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go +++ b/tools/badctl/cmd/gen/conditions/tests/results/uuidmodel.go @@ -5,32 +5,57 @@ import ( badorm "github.com/ditrit/badaas/badorm" uuidmodel "github.com/ditrit/badaas/tools/badctl/cmd/gen/conditions/tests/uuidmodel" gorm "gorm.io/gorm" + "reflect" "time" ) -func UUIDModelId(expr badorm.Expression[badorm.UUID]) badorm.WhereCondition[uuidmodel.UUIDModel] { +var uuidModelType = reflect.TypeOf(*new(uuidmodel.UUIDModel)) +var UUIDModelIdField = badorm.FieldIdentifier[badorm.UUID]{ + Field: "ID", + ModelType: uuidModelType, +} + +func UUIDModelId(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, badorm.UUID]{ - Expression: expr, - FieldIdentifier: badorm.IDFieldID, + FieldIdentifier: UUIDModelIdField, + Operator: operator, } } -func UUIDModelCreatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uuidmodel.UUIDModel] { + +var UUIDModelCreatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "CreatedAt", + ModelType: uuidModelType, +} + +func UUIDModelCreatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.CreatedAtFieldID, + FieldIdentifier: UUIDModelCreatedAtField, + Operator: operator, } } -func UUIDModelUpdatedAt(expr badorm.Expression[time.Time]) badorm.WhereCondition[uuidmodel.UUIDModel] { + +var UUIDModelUpdatedAtField = badorm.FieldIdentifier[time.Time]{ + Field: "UpdatedAt", + ModelType: uuidModelType, +} + +func UUIDModelUpdatedAt(operator badorm.Operator[time.Time]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, time.Time]{ - Expression: expr, - FieldIdentifier: badorm.UpdatedAtFieldID, + FieldIdentifier: UUIDModelUpdatedAtField, + Operator: operator, } } -func UUIDModelDeletedAt(expr badorm.Expression[gorm.DeletedAt]) badorm.WhereCondition[uuidmodel.UUIDModel] { + +var UUIDModelDeletedAtField = badorm.FieldIdentifier[gorm.DeletedAt]{ + Field: "DeletedAt", + ModelType: uuidModelType, +} + +func UUIDModelDeletedAt(operator badorm.Operator[gorm.DeletedAt]) badorm.WhereCondition[uuidmodel.UUIDModel] { return badorm.FieldCondition[uuidmodel.UUIDModel, gorm.DeletedAt]{ - Expression: expr, - FieldIdentifier: badorm.DeletedAtFieldID, + FieldIdentifier: UUIDModelDeletedAtField, + Operator: operator, } } -var UUIDModelPreloadAttributes = badorm.NewPreloadCondition[uuidmodel.UUIDModel]() +var UUIDModelPreloadAttributes = badorm.NewPreloadCondition[uuidmodel.UUIDModel](UUIDModelIdField, UUIDModelCreatedAtField, UUIDModelUpdatedAtField, UUIDModelDeletedAtField) From 5d190b8fb318ce4d657b65810c2c33ce130121ad Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 11:49:45 +0200 Subject: [PATCH 435/467] fix mysql tests --- testintegration/operators_test.go | 66 ++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/testintegration/operators_test.go b/testintegration/operators_test.go index 56c58a14..d4c8e609 100644 --- a/testintegration/operators_test.go +++ b/testintegration/operators_test.go @@ -9,7 +9,9 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/dynamic" + "github.com/ditrit/badaas/badorm/dynamic/mysqldynamic" "github.com/ditrit/badaas/badorm/multitype" + "github.com/ditrit/badaas/badorm/multitype/mysqlmultitype" "github.com/ditrit/badaas/badorm/mysql" "github.com/ditrit/badaas/badorm/psql" "github.com/ditrit/badaas/badorm/sqlite" @@ -997,10 +999,17 @@ func (ts *OperatorIntTestSuite) TestDynamicOperatorForCustomType() { func (ts *OperatorIntTestSuite) TestDynamicOperatorForBadORMModelAttribute() { match := ts.createProduct("", 1, 0.0, false, nil) + var isNotDistinctOperator badorm.Operator[gorm.DeletedAt] + + switch getDBDialector() { + case configuration.MySQL: + isNotDistinctOperator = mysqldynamic.IsEqual(conditions.ProductDeletedAtField) + case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: + isNotDistinctOperator = dynamic.IsNotDistinct(conditions.ProductDeletedAtField) + } + entities, err := ts.crudProductService.GetEntities( - conditions.ProductDeletedAt( - dynamic.IsNotDistinct(conditions.ProductDeletedAtField), - ), + conditions.ProductDeletedAt(isNotDistinctOperator), ) ts.Nil(err) @@ -1056,11 +1065,22 @@ func (ts *OperatorIntTestSuite) TestMultitypeOperatorForNotNullTypeCanBeCompared func (ts *OperatorIntTestSuite) TestMultitypeOperatorForBadORMModelAttribute() { match := ts.createProduct("", 1, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( - conditions.ProductDeletedAt( + var isDistinctCondition badorm.Condition[models.Product] + + switch getDBDialector() { + case configuration.MySQL: + isDistinctCondition = badorm.Not[models.Product]( + conditions.ProductDeletedAt( + mysqlmultitype.IsEqual[gorm.DeletedAt](conditions.ProductCreatedAtField), + ), + ) + case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: + isDistinctCondition = conditions.ProductDeletedAt( multitype.IsDistinct[gorm.DeletedAt](conditions.ProductCreatedAtField), - ), - ) + ) + } + + entities, err := ts.crudProductService.GetEntities(isDistinctCondition) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) @@ -1138,13 +1158,31 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithAFieldRelated EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *OperatorIntTestSuite) TestUnsafeOperatorReturnsDBErrorInCaseTypesNotMatch() { - _, err := ts.crudProductService.GetEntities( - conditions.ProductFloat( - unsafe.Eq[float64]("string"), - ), - ) - ts.ErrorContains(err, "string") +func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatch() { + switch getDBDialector() { + case configuration.MySQL: + // in mysql comparisons between types are allowed + match1 := ts.createProduct("0", 1, 0, false, nil) + match2 := ts.createProduct("0.0", 2, 0.0, false, nil) + ts.createProduct("0.0", 2, 1.0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64]("string"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: + // on postgresql returns an error + _, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64]("string"), + ), + ) + ts.ErrorContains(err, "string") + } } func (ts *OperatorIntTestSuite) TestUnsafeOperatorCanCompareFieldsThatMapToTheSameType() { From 476179f9334f69481064140c81c37e5a5fc0a97d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 12:27:07 +0200 Subject: [PATCH 436/467] fix sqlite tests --- testintegration/operators_test.go | 97 +++++++++++++++++++++++++++++-- 1 file changed, 91 insertions(+), 6 deletions(-) diff --git a/testintegration/operators_test.go b/testintegration/operators_test.go index d4c8e609..41cb8bcf 100644 --- a/testintegration/operators_test.go +++ b/testintegration/operators_test.go @@ -1160,25 +1160,110 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithAFieldRelated func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatch() { switch getDBDialector() { + case configuration.SQLite, configuration.MySQL: + // comparisons between types are allowed + match := ts.createProduct("", 0, 2.1, false, nil) + ts.createProduct("", 0, 0, false, nil) + ts.createProduct("", 0, 2, false, nil) + ts.createProduct("", 0, 2.3, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64]("2.1"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) + case configuration.PostgreSQL, configuration.SQLServer: + // returns an error + _, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64]("0.0"), + ), + ) + ts.ErrorContains(err, "0.0") + } +} + +func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatchNotConvertible() { + switch getDBDialector() { + case configuration.SQLite: + // comparisons between types are allowed and matches nothing if not convertible + ts.createProduct("", 0, 0, false, nil) + ts.createProduct("", 0, 2, false, nil) + ts.createProduct("", 0, 2.3, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64]("not_convertible_to_float"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{}, entities) case configuration.MySQL: - // in mysql comparisons between types are allowed + // comparisons between types are allowed but matches 0s if not convertible + match := ts.createProduct("", 0, 0, false, nil) + ts.createProduct("", 0, 2, false, nil) + ts.createProduct("", 0, 2.3, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64]("not_convertible_to_float"), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match}, entities) + case configuration.PostgreSQL, configuration.SQLServer: + // returns an error + _, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64]("0.0"), + ), + ) + ts.ErrorContains(err, "0.0") + } +} + +func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseFieldWithTypesNotMatch() { + switch getDBDialector() { + case configuration.SQLite: + // in sqlite comparisons between fields with different types are allowed + match1 := ts.createProduct("0", 0, 0, false, nil) + match2 := ts.createProduct("1", 0, 1, false, nil) + ts.createProduct("0", 0, 1, false, nil) + ts.createProduct("not_convertible", 0, 0, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64](conditions.ProductStringField), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + case configuration.MySQL: + // in mysql comparisons between fields with different types are allowed but matches 0s on not convertible match1 := ts.createProduct("0", 1, 0, false, nil) - match2 := ts.createProduct("0.0", 2, 0.0, false, nil) + match2 := ts.createProduct("1", 2, 1, false, nil) + match3 := ts.createProduct("not_convertible", 2, 0, false, nil) ts.createProduct("0.0", 2, 1.0, false, nil) entities, err := ts.crudProductService.GetEntities( conditions.ProductFloat( - unsafe.Eq[float64]("string"), + unsafe.Eq[float64](conditions.ProductStringField), ), ) ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) - case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: + EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) + case configuration.PostgreSQL, configuration.SQLServer: // on postgresql returns an error _, err := ts.crudProductService.GetEntities( conditions.ProductFloat( - unsafe.Eq[float64]("string"), + unsafe.Eq[float64](conditions.ProductStringField), ), ) ts.ErrorContains(err, "string") From 77bbe404b49b807b9dcf8d0a62709902bd003f78 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 12:54:06 +0200 Subject: [PATCH 437/467] fix sqlserver tests --- testintegration/operators_test.go | 84 +++++++++++++++++++------------ 1 file changed, 52 insertions(+), 32 deletions(-) diff --git a/testintegration/operators_test.go b/testintegration/operators_test.go index 41cb8bcf..9de15008 100644 --- a/testintegration/operators_test.go +++ b/testintegration/operators_test.go @@ -1158,32 +1158,21 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithAFieldRelated EqualList(&ts.Suite, []*models.Product{match}, entities) } -func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatch() { - switch getDBDialector() { - case configuration.SQLite, configuration.MySQL: - // comparisons between types are allowed - match := ts.createProduct("", 0, 2.1, false, nil) - ts.createProduct("", 0, 0, false, nil) - ts.createProduct("", 0, 2, false, nil) - ts.createProduct("", 0, 2.3, false, nil) +func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatchConvertible() { + // comparisons between types are allowed when they are convertible + match := ts.createProduct("", 0, 2.1, false, nil) + ts.createProduct("", 0, 0, false, nil) + ts.createProduct("", 0, 2, false, nil) + ts.createProduct("", 0, 2.3, false, nil) - entities, err := ts.crudProductService.GetEntities( - conditions.ProductFloat( - unsafe.Eq[float64]("2.1"), - ), - ) - ts.Nil(err) + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64]("2.1"), + ), + ) + ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{match}, entities) - case configuration.PostgreSQL, configuration.SQLServer: - // returns an error - _, err := ts.crudProductService.GetEntities( - conditions.ProductFloat( - unsafe.Eq[float64]("0.0"), - ), - ) - ts.ErrorContains(err, "0.0") - } + EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatchNotConvertible() { @@ -1216,21 +1205,29 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatchNotConverti ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) - case configuration.PostgreSQL, configuration.SQLServer: + case configuration.SQLServer: + // returns an error + _, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64]("not_convertible_to_float"), + ), + ) + ts.ErrorContains(err, "mssql: Error converting data type nvarchar to float.") + case configuration.PostgreSQL: // returns an error _, err := ts.crudProductService.GetEntities( conditions.ProductFloat( - unsafe.Eq[float64]("0.0"), + unsafe.Eq[float64]("not_convertible_to_float"), ), ) - ts.ErrorContains(err, "0.0") + ts.ErrorContains(err, "not_convertible_to_float") } } func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseFieldWithTypesNotMatch() { switch getDBDialector() { case configuration.SQLite: - // in sqlite comparisons between fields with different types are allowed + // comparisons between fields with different types are allowed match1 := ts.createProduct("0", 0, 0, false, nil) match2 := ts.createProduct("1", 0, 1, false, nil) ts.createProduct("0", 0, 1, false, nil) @@ -1245,7 +1242,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseFieldWithTypesNotMatch() EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) case configuration.MySQL: - // in mysql comparisons between fields with different types are allowed but matches 0s on not convertible + // comparisons between fields with different types are allowed but matches 0s on not convertible match1 := ts.createProduct("0", 1, 0, false, nil) match2 := ts.createProduct("1", 2, 1, false, nil) match3 := ts.createProduct("not_convertible", 2, 0, false, nil) @@ -1259,14 +1256,37 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseFieldWithTypesNotMatch() ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) - case configuration.PostgreSQL, configuration.SQLServer: - // on postgresql returns an error + case configuration.SQLServer: + // comparisons between fields with different types are allowed and returns error only if at least one is not convertible + match1 := ts.createProduct("0", 1, 0, false, nil) + match2 := ts.createProduct("1", 2, 1, false, nil) + + entities, err := ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64](conditions.ProductStringField), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) + + ts.createProduct("not_convertible", 3, 0, false, nil) + ts.createProduct("0.0", 4, 1.0, false, nil) + + _, err = ts.crudProductService.GetEntities( + conditions.ProductFloat( + unsafe.Eq[float64](conditions.ProductStringField), + ), + ) + ts.ErrorContains(err, "mssql: Error converting data type nvarchar to float.") + case configuration.PostgreSQL: + // returns an error _, err := ts.crudProductService.GetEntities( conditions.ProductFloat( unsafe.Eq[float64](conditions.ProductStringField), ), ) - ts.ErrorContains(err, "string") + ts.ErrorContains(err, "ERROR: operator does not exist: numeric = text (SQLSTATE 42883)") } } From 03eca649f5d92854a2da1c7a123bca07375098ae Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 14:54:53 +0200 Subject: [PATCH 438/467] fix cockroach tests --- testintegration/operators_test.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/testintegration/operators_test.go b/testintegration/operators_test.go index 9de15008..847425fe 100644 --- a/testintegration/operators_test.go +++ b/testintegration/operators_test.go @@ -3,6 +3,7 @@ package testintegration import ( "database/sql" "log" + "strings" "time" "gorm.io/gorm" @@ -1286,7 +1287,16 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseFieldWithTypesNotMatch() unsafe.Eq[float64](conditions.ProductStringField), ), ) - ts.ErrorContains(err, "ERROR: operator does not exist: numeric = text (SQLSTATE 42883)") + + ts.True( + strings.Contains( + err.Error(), + "ERROR: operator does not exist: numeric = text (SQLSTATE 42883)", // postgresql + ) || strings.Contains( + err.Error(), + "ERROR: unsupported comparison operator: = (SQLSTATE 22023)", // cockroachdb + ), + ) } } From eab3c04bf612c4ed9bb90ea8d14f744a2f987c9d Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 15:25:33 +0200 Subject: [PATCH 439/467] add comments inside empty function again --- badorm/condition.go | 35 ++++++++++++++++++++++++++++------- badorm/unsafe/condition.go | 5 ++++- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/badorm/condition.go b/badorm/condition.go index 6d8dd596..ab14d197 100644 --- a/badorm/condition.go +++ b/badorm/condition.go @@ -45,7 +45,10 @@ type ContainerCondition[T Model] struct { Prefix sql.Connector } -func (condition ContainerCondition[T]) InterfaceVerificationMethod(_ T) {} +func (condition ContainerCondition[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} func (condition ContainerCondition[T]) ApplyTo(query *Query, table Table) error { return ApplyWhereCondition[T](condition, query, table) @@ -86,7 +89,10 @@ type ConnectionCondition[T Model] struct { Conditions []WhereCondition[T] } -func (condition ConnectionCondition[T]) InterfaceVerificationMethod(_ T) {} +func (condition ConnectionCondition[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} func (condition ConnectionCondition[T]) ApplyTo(query *Query, table Table) error { return ApplyWhereCondition[T](condition, query, table) @@ -133,7 +139,10 @@ type PreloadCondition[T Model] struct { Fields []iFieldIdentifier } -func (condition PreloadCondition[T]) InterfaceVerificationMethod(_ T) {} +func (condition PreloadCondition[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} func (condition PreloadCondition[T]) ApplyTo(query *Query, table Table) error { for _, fieldID := range condition.Fields { @@ -157,7 +166,10 @@ type CollectionPreloadCondition[T1, T2 Model] struct { NestedPreloads []IJoinCondition[T2] } -func (condition CollectionPreloadCondition[T1, T2]) InterfaceVerificationMethod(_ T1) {} +func (condition CollectionPreloadCondition[T1, T2]) InterfaceVerificationMethod(_ T1) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} func (condition CollectionPreloadCondition[T1, T2]) ApplyTo(query *Query, _ Table) error { if len(condition.NestedPreloads) == 0 { @@ -210,7 +222,10 @@ type FieldCondition[TObject Model, TAtribute any] struct { Operator Operator[TAtribute] } -func (condition FieldCondition[TObject, TAtribute]) InterfaceVerificationMethod(_ TObject) {} +func (condition FieldCondition[TObject, TAtribute]) InterfaceVerificationMethod(_ TObject) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} // Returns a gorm Where condition that can be used // to filter that the Field as a value of Value @@ -273,7 +288,10 @@ type JoinCondition[T1 Model, T2 Model] struct { T1PreloadCondition PreloadCondition[T1] } -func (condition JoinCondition[T1, T2]) InterfaceVerificationMethod(_ T1) {} +func (condition JoinCondition[T1, T2]) InterfaceVerificationMethod(_ T1) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} // Returns true if this condition or any nested condition makes a preload func (condition JoinCondition[T1, T2]) makesPreload() bool { @@ -430,7 +448,10 @@ type InvalidCondition[T any] struct { Err error } -func (condition InvalidCondition[T]) InterfaceVerificationMethod(_ T) {} +func (condition InvalidCondition[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} func (condition InvalidCondition[T]) ApplyTo(_ *Query, _ Table) error { return condition.Err diff --git a/badorm/unsafe/condition.go b/badorm/unsafe/condition.go index 353adb7c..61b22778 100644 --- a/badorm/unsafe/condition.go +++ b/badorm/unsafe/condition.go @@ -13,7 +13,10 @@ type Condition[T badorm.Model] struct { Values []any } -func (condition Condition[T]) InterfaceVerificationMethod(_ T) {} +func (condition Condition[T]) InterfaceVerificationMethod(_ T) { + // This method is necessary to get the compiler to verify + // that an object is of type Condition[T] +} func (condition Condition[T]) ApplyTo(query *badorm.Query, table badorm.Table) error { return badorm.ApplyWhereCondition[T](condition, query, table) From 4052bdbcc80ccfe13ebd1e6bdaffeadfb9120707 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Fri, 7 Jul 2023 16:35:26 +0200 Subject: [PATCH 440/467] allow choosing join number for each operation or value --- badorm/dynamic/multivalue.go | 1 - badorm/dynamic/value.go | 11 +---- badorm/multitype/multivalue.go | 1 - badorm/multitype/value.go | 12 ++---- badorm/multivalueOperator.go | 28 +++++++++--- badorm/operator.go | 8 +++- badorm/operators.go | 2 +- badorm/unsafe/multivalue.go | 1 - badorm/unsafe/value.go | 11 +---- badorm/valueOperator.go | 42 +++++++++++------- .../conditions/child_conditions.go | 14 +++++- .../conditions/parent_parent_conditions.go | 14 +++++- testintegration/join_conditions_test.go | 43 ++++++++++++++++++- testintegration/models/models.go | 6 ++- 14 files changed, 134 insertions(+), 60 deletions(-) diff --git a/badorm/dynamic/multivalue.go b/badorm/dynamic/multivalue.go index 6bd18b2e..e52eda2c 100644 --- a/badorm/dynamic/multivalue.go +++ b/badorm/dynamic/multivalue.go @@ -23,6 +23,5 @@ func NewMultivalueOperator[T any]( SQLConnector: sqlConnector, SQLPrefix: sqlPrefix, SQLSuffix: sqlSuffix, - JoinNumber: badorm.UndefinedJoinNumber, } } diff --git a/badorm/dynamic/value.go b/badorm/dynamic/value.go index 3937e303..364aff1c 100644 --- a/badorm/dynamic/value.go +++ b/badorm/dynamic/value.go @@ -9,13 +9,6 @@ func NewValueOperator[T any]( sqlOperator sql.Operator, field badorm.FieldIdentifier[T], ) badorm.DynamicOperator[T] { - return &badorm.ValueOperator[T]{ - Operations: []badorm.Operation{ - { - SQLOperator: sqlOperator, - Value: field, - }, - }, - JoinNumber: badorm.UndefinedJoinNumber, - } + op := badorm.NewValueOperator[T](sqlOperator, field) + return &op } diff --git a/badorm/multitype/multivalue.go b/badorm/multitype/multivalue.go index 0e0c1ed8..ca149908 100644 --- a/badorm/multitype/multivalue.go +++ b/badorm/multitype/multivalue.go @@ -38,6 +38,5 @@ func NewMultivalueOperator[TAttribute, TField any]( SQLConnector: sqlConnector, SQLPrefix: sqlPrefix, SQLSuffix: sqlSuffix, - JoinNumber: badorm.UndefinedJoinNumber, } } diff --git a/badorm/multitype/value.go b/badorm/multitype/value.go index c91265c5..9a8622d2 100644 --- a/badorm/multitype/value.go +++ b/badorm/multitype/value.go @@ -51,13 +51,7 @@ func NewValueOperator[TAttribute, TField any]( return invalidOperator } - return &badorm.ValueOperator[TAttribute]{ - Operations: []badorm.Operation{ - { - SQLOperator: sqlOperator, - Value: field, - }, - }, - JoinNumber: badorm.UndefinedJoinNumber, - } + op := badorm.NewValueOperator[TAttribute](sqlOperator, field) + + return &op } diff --git a/badorm/multivalueOperator.go b/badorm/multivalueOperator.go index 3b8b4b2a..a7af4afd 100644 --- a/badorm/multivalueOperator.go +++ b/badorm/multivalueOperator.go @@ -17,7 +17,7 @@ type MultivalueOperator[T any] struct { SQLConnector sql.Connector // the connector between values, example: ', ' SQLPrefix string // something to put before the values, example: ( SQLSuffix string // something to put after the values, example: ) - JoinNumber int + JoinNumbers map[uint]int // join number to use in each value } func (operator MultivalueOperator[T]) InterfaceVerificationMethod(_ T) { @@ -25,8 +25,19 @@ func (operator MultivalueOperator[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Operator[T] } -func (operator *MultivalueOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { - operator.JoinNumber = int(joinNumber) +// Allows to choose which number of join use +// for the value in position "valueNumber" +// when the value is a field and its model is joined more than once. +// Does nothing if the valueNumber is bigger than the amount of values. +func (operator *MultivalueOperator[T]) SelectJoin(valueNumber, joinNumber uint) DynamicOperator[T] { + joinNumbers := operator.JoinNumbers + if joinNumbers == nil { + joinNumbers = map[uint]int{} + } + + joinNumbers[valueNumber] = int(joinNumber) + operator.JoinNumbers = joinNumbers + return operator } @@ -34,11 +45,16 @@ func (operator MultivalueOperator[T]) ToSQL(query *Query, columnName string) (st placeholderList := []string{} values := []any{} - for _, value := range operator.Values { + for i, value := range operator.Values { field, isField := value.(iFieldIdentifier) if isField { + joinNumber, isPresent := operator.JoinNumbers[uint(i)] + if !isPresent { + joinNumber = undefinedJoinNumber + } + // if it is a field, add the field column to the query - modelTable, err := getModelTable(query, field, operator.JoinNumber, operator.SQLOperator) + modelTable, err := getModelTable(query, field, joinNumber, operator.SQLOperator) if err != nil { return "", nil, err } @@ -72,7 +88,7 @@ func getModelTable(query *Query, field iFieldIdentifier, joinNumber int, sqlOper return modelTables[0], nil } - if joinNumber == UndefinedJoinNumber { + if joinNumber == undefinedJoinNumber { return Table{}, joinMustBeSelectedError(field, sqlOperator) } diff --git a/badorm/operator.go b/badorm/operator.go index 36b70208..e0f378bd 100644 --- a/badorm/operator.go +++ b/badorm/operator.go @@ -19,7 +19,11 @@ type Operator[T any] interface { type DynamicOperator[T any] interface { Operator[T] - SelectJoin(joinNumber uint) DynamicOperator[T] + // Allows to choose which number of join use + // for the value in position "valueNumber" + // when the value is a field and its model is joined more than once. + // Does nothing if the valueNumber is bigger than the amount of values. + SelectJoin(valueNumber, joinNumber uint) DynamicOperator[T] } // Operator that verifies a predicate @@ -54,7 +58,7 @@ func (expr InvalidOperator[T]) InterfaceVerificationMethod(_ T) { } // InvalidOperator has SelectJoin to implement DynamicOperator -func (expr InvalidOperator[T]) SelectJoin(_ uint) DynamicOperator[T] { +func (expr InvalidOperator[T]) SelectJoin(_, _ uint) DynamicOperator[T] { return expr } diff --git a/badorm/operators.go b/badorm/operators.go index 4f14e65c..20341c2c 100644 --- a/badorm/operators.go +++ b/badorm/operators.go @@ -208,7 +208,7 @@ func NewLikeOperator[T string | sql.NullString](pattern string, sqlOperator bado } func (expr LikeOperator[T]) Escape(escape rune) ValueOperator[T] { - return expr.AddOperation(badormSQL.Escape, string(escape)) + return *expr.AddOperation(badormSQL.Escape, string(escape)) } // Pattern in all databases: diff --git a/badorm/unsafe/multivalue.go b/badorm/unsafe/multivalue.go index 6dafbfb6..98112fae 100644 --- a/badorm/unsafe/multivalue.go +++ b/badorm/unsafe/multivalue.go @@ -17,6 +17,5 @@ func NewMultivalueOperator[T any]( SQLConnector: sqlConnector, SQLPrefix: sqlPrefix, SQLSuffix: sqlSuffix, - JoinNumber: badorm.UndefinedJoinNumber, } } diff --git a/badorm/unsafe/value.go b/badorm/unsafe/value.go index 2780bac6..3acea704 100644 --- a/badorm/unsafe/value.go +++ b/badorm/unsafe/value.go @@ -9,13 +9,6 @@ func NewValueOperator[T any]( sqlOperator sql.Operator, value any, ) badorm.DynamicOperator[T] { - return &badorm.ValueOperator[T]{ - Operations: []badorm.Operation{ - { - SQLOperator: sqlOperator, - Value: value, - }, - }, - JoinNumber: badorm.UndefinedJoinNumber, - } + op := badorm.NewValueOperator[T](sqlOperator, value) + return &op } diff --git a/badorm/valueOperator.go b/badorm/valueOperator.go index 2ac8dcf5..151eddb8 100644 --- a/badorm/valueOperator.go +++ b/badorm/valueOperator.go @@ -9,20 +9,20 @@ import ( badormSQL "github.com/ditrit/badaas/badorm/sql" ) -const UndefinedJoinNumber = -1 +const undefinedJoinNumber = -1 // Operator that compares the value of the column against a fixed value // If SQLOperators has multiple entries, comparisons will be nested // Example (single): value = v1 // Example (multi): value LIKE v1 ESCAPE v2 type ValueOperator[T any] struct { - Operations []Operation - JoinNumber int + operations []operation } -type Operation struct { +type operation struct { SQLOperator badormSQL.Operator Value any + JoinNumber int } func (operator ValueOperator[T]) InterfaceVerificationMethod(_ T) { @@ -30,21 +30,33 @@ func (operator ValueOperator[T]) InterfaceVerificationMethod(_ T) { // that an object is of type Operator[T] } -func (operator *ValueOperator[T]) SelectJoin(joinNumber uint) DynamicOperator[T] { - operator.JoinNumber = int(joinNumber) +// Allows to choose which number of join use +// for the operation in position "operationNumber" +// when the value is a field and its model is joined more than once. +// Does nothing if the operationNumber is bigger than the amount of operations. +func (operator *ValueOperator[T]) SelectJoin(operationNumber, joinNumber uint) DynamicOperator[T] { + if operationNumber >= uint(len(operator.operations)) { + return operator + } + + operation := operator.operations[operationNumber] + operation.JoinNumber = int(joinNumber) + operator.operations[operationNumber] = operation + return operator } -func (operator *ValueOperator[T]) AddOperation(sqlOperator badormSQL.Operator, value any) ValueOperator[T] { - operator.Operations = append( - operator.Operations, - Operation{ +func (operator *ValueOperator[T]) AddOperation(sqlOperator badormSQL.Operator, value any) *ValueOperator[T] { + operator.operations = append( + operator.operations, + operation{ Value: value, SQLOperator: sqlOperator, + JoinNumber: undefinedJoinNumber, }, ) - return *operator + return operator } func (operator ValueOperator[T]) ToSQL(query *Query, columnName string) (string, []any, error) { @@ -52,14 +64,14 @@ func (operator ValueOperator[T]) ToSQL(query *Query, columnName string) (string, values := []any{} // add each operation to the sql - for _, operation := range operator.Operations { + for _, operation := range operator.operations { field, isField := operation.Value.(iFieldIdentifier) if isField { // if the value of the operation is a field, // verify that this field is concerned by the query // (a join was performed with the model to which this field belongs) // and get the alias of the table of this model. - modelTable, err := getModelTable(query, field, operator.JoinNumber, operation.SQLOperator) + modelTable, err := getModelTable(query, field, operation.JoinNumber, operation.SQLOperator) if err != nil { return "", nil, err } @@ -79,9 +91,7 @@ func (operator ValueOperator[T]) ToSQL(query *Query, columnName string) (string, } func NewValueOperator[T any](sqlOperator badormSQL.Operator, value any) ValueOperator[T] { - expr := &ValueOperator[T]{} - - return expr.AddOperation(sqlOperator, value) + return *new(ValueOperator[T]).AddOperation(sqlOperator, value) } var nullableKinds = []reflect.Kind{ diff --git a/testintegration/conditions/child_conditions.go b/testintegration/conditions/child_conditions.go index cc6b8116..ab343b28 100644 --- a/testintegration/conditions/child_conditions.go +++ b/testintegration/conditions/child_conditions.go @@ -69,6 +69,18 @@ func ChildName(operator badorm.Operator[string]) badorm.WhereCondition[models.Ch Operator: operator, } } + +var ChildNumberField = badorm.FieldIdentifier[int]{ + Field: "Number", + ModelType: childType, +} + +func ChildNumber(operator badorm.Operator[int]) badorm.WhereCondition[models.Child] { + return badorm.FieldCondition[models.Child, int]{ + FieldIdentifier: ChildNumberField, + Operator: operator, + } +} func ChildParent1(conditions ...badorm.Condition[models.Parent1]) badorm.IJoinCondition[models.Child] { return badorm.JoinCondition[models.Child, models.Parent1]{ Conditions: conditions, @@ -114,5 +126,5 @@ func ChildParent2Id(operator badorm.Operator[badorm.UUID]) badorm.WhereCondition } } -var ChildPreloadAttributes = badorm.NewPreloadCondition[models.Child](ChildIdField, ChildCreatedAtField, ChildUpdatedAtField, ChildDeletedAtField, ChildNameField, ChildParent1IdField, ChildParent2IdField) +var ChildPreloadAttributes = badorm.NewPreloadCondition[models.Child](ChildIdField, ChildCreatedAtField, ChildUpdatedAtField, ChildDeletedAtField, ChildNameField, ChildNumberField, ChildParent1IdField, ChildParent2IdField) var ChildPreloadRelations = []badorm.Condition[models.Child]{ChildPreloadParent1, ChildPreloadParent2} diff --git a/testintegration/conditions/parent_parent_conditions.go b/testintegration/conditions/parent_parent_conditions.go index f739b014..29c7a852 100644 --- a/testintegration/conditions/parent_parent_conditions.go +++ b/testintegration/conditions/parent_parent_conditions.go @@ -70,4 +70,16 @@ func ParentParentName(operator badorm.Operator[string]) badorm.WhereCondition[mo } } -var ParentParentPreloadAttributes = badorm.NewPreloadCondition[models.ParentParent](ParentParentIdField, ParentParentCreatedAtField, ParentParentUpdatedAtField, ParentParentDeletedAtField, ParentParentNameField) +var ParentParentNumberField = badorm.FieldIdentifier[int]{ + Field: "Number", + ModelType: parentParentType, +} + +func ParentParentNumber(operator badorm.Operator[int]) badorm.WhereCondition[models.ParentParent] { + return badorm.FieldCondition[models.ParentParent, int]{ + FieldIdentifier: ParentParentNumberField, + Operator: operator, + } +} + +var ParentParentPreloadAttributes = badorm.NewPreloadCondition[models.ParentParent](ParentParentIdField, ParentParentCreatedAtField, ParentParentUpdatedAtField, ParentParentDeletedAtField, ParentParentNameField, ParentParentNumberField) diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 82e6a176..580abab2 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -5,6 +5,7 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/badorm/dynamic" + "github.com/ditrit/badaas/badorm/multitype" "github.com/ditrit/badaas/badorm/unsafe" "github.com/ditrit/badaas/testintegration/conditions" "github.com/ditrit/badaas/testintegration/models" @@ -443,7 +444,47 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithSel conditions.Parent2ParentParent(), ), conditions.ChildName( - dynamic.Eq(conditions.ParentParentNameField).SelectJoin(0), + dynamic.Eq(conditions.ParentParentNameField).SelectJoin(0, 0), + ), + ) + ts.Nil(err) + + EqualList(&ts.Suite, []*models.Child{child}, entities) +} + +func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithoutSelectJoinOnMultivalueOperatorReturnsError() { + _, err := ts.crudChildService.GetEntities( + conditions.ChildParent1( + conditions.Parent1ParentParent(), + ), + conditions.ChildParent2( + conditions.Parent2ParentParent(), + ), + conditions.ChildId( + dynamic.Between(conditions.ParentParentIdField, conditions.ParentParentIdField), + ), + ) + ts.ErrorIs(err, badorm.ErrJoinMustBeSelected) + ts.ErrorContains(err, "joined multiple times model: models.ParentParent; operator: Between; model: models.Child, field: ID") +} + +func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithSelectJoinOnMultivalueOperator() { + parentParent := &models.ParentParent{Name: "franco", Number: 3} + parent1 := &models.Parent1{ParentParent: *parentParent} + parent2 := &models.Parent2{ParentParent: *parentParent} + child := &models.Child{Parent1: *parent1, Parent2: *parent2, Name: "franco", Number: 2} + err := ts.db.Create(child).Error + ts.Nil(err) + + entities, err := ts.crudChildService.GetEntities( + conditions.ChildParent1( + conditions.Parent1ParentParent(), + ), + conditions.ChildParent2( + conditions.Parent2ParentParent(), + ), + conditions.ChildNumber( + multitype.Between[int, int](1, conditions.ParentParentNumberField).SelectJoin(1, 0), ), ) ts.Nil(err) diff --git a/testintegration/models/models.go b/testintegration/models/models.go index 947e0271..d66a961d 100644 --- a/testintegration/models/models.go +++ b/testintegration/models/models.go @@ -205,7 +205,8 @@ func (m Phone) Equal(other Phone) bool { type ParentParent struct { badorm.UUIDModel - Name string + Name string + Number int } func (m ParentParent) Equal(other ParentParent) bool { @@ -237,7 +238,8 @@ func (m Parent2) Equal(other Parent2) bool { type Child struct { badorm.UUIDModel - Name string + Name string + Number int Parent1 Parent1 Parent1ID badorm.UUID From d6a9f38447060bbf44eb31e60a65974e3d7481e2 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 10 Jul 2023 10:31:21 +0200 Subject: [PATCH 441/467] fix lint --- badorm/valueOperator.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/badorm/valueOperator.go b/badorm/valueOperator.go index 151eddb8..b9ddd1d1 100644 --- a/badorm/valueOperator.go +++ b/badorm/valueOperator.go @@ -39,9 +39,9 @@ func (operator *ValueOperator[T]) SelectJoin(operationNumber, joinNumber uint) D return operator } - operation := operator.operations[operationNumber] - operation.JoinNumber = int(joinNumber) - operator.operations[operationNumber] = operation + operationSaved := operator.operations[operationNumber] + operationSaved.JoinNumber = int(joinNumber) + operator.operations[operationNumber] = operationSaved return operator } From 6509622331c1ef37daa229a156d602a850a885fc Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 12 Jul 2023 12:00:37 +0200 Subject: [PATCH 442/467] readme docs to readthedocs --- .gitignore | 7 +- README.md | 204 +------------------------------- badorm/README.md | 104 +--------------- configuration.md | 147 ----------------------- docs/Makefile | 29 +++++ docs/README.rst | 59 +++++++++ docs/badaas/configuration.rst | 182 ++++++++++++++++++++++++++++ docs/badaas/functionalities.rst | 72 +++++++++++ docs/badaas/quickstart.rst | 84 +++++++++++++ docs/badctl/commands.rst | 52 ++++++++ docs/badctl/index.rst | 5 + docs/badctl/installation.rst | 28 +++++ docs/badorm/functionalities.rst | 51 ++++++++ docs/badorm/index.rst | 10 ++ docs/badorm/quickstart.rst | 58 +++++++++ docs/conf.py | 28 +++++ docs/index.rst | 52 ++++++++ docs/make.bat | 35 ++++++ docs/requirements.in | 3 + docs/requirements.txt | 73 ++++++++++++ readthedocs.yml | 31 +++++ tools/badctl/README.md | 81 +------------ 22 files changed, 868 insertions(+), 527 deletions(-) delete mode 100644 configuration.md create mode 100644 docs/Makefile create mode 100644 docs/README.rst create mode 100644 docs/badaas/configuration.rst create mode 100644 docs/badaas/functionalities.rst create mode 100644 docs/badaas/quickstart.rst create mode 100644 docs/badctl/commands.rst create mode 100644 docs/badctl/index.rst create mode 100644 docs/badctl/installation.rst create mode 100644 docs/badorm/functionalities.rst create mode 100644 docs/badorm/index.rst create mode 100644 docs/badorm/quickstart.rst create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/make.bat create mode 100644 docs/requirements.in create mode 100644 docs/requirements.txt create mode 100644 readthedocs.yml diff --git a/.gitignore b/.gitignore index 57580cc4..7452fac1 100644 --- a/.gitignore +++ b/.gitignore @@ -32,9 +32,14 @@ testintegration/sqlite:* # binary output badaas +!docs/badaas/ badctl !tools/badctl/ +!docs/badctl/ # test results tools/badctl/cmd/gen/conditions/*_conditions.go -tools/badctl/cmd/gen/conditions/tests/**/badorm.go \ No newline at end of file +tools/badctl/cmd/gen/conditions/tests/**/badorm.go + +# Sphinx documentation +docs/_build/ \ No newline at end of file diff --git a/README.md b/README.md index e19fec69..3e3a0c6a 100644 --- a/README.md +++ b/README.md @@ -3,21 +3,7 @@ Badaas enables the effortless construction of ***distributed, resilient, highly available and secure applications by design***, while ensuring very simple deployment and management (NoOps). > **Warning** -> BaDaaS is still under development. Each of its components can have a different state of evolution that you can consult in [Features and components](#features-and-components) - -- [BADAAS: Backend And Distribution As A Service](#badaas-backend-and-distribution-as-a-service) - - [Features and components](#features-and-components) - - [Quickstart](#quickstart) - - [Example](#example) - - [Step-by-step instructions](#step-by-step-instructions) - - [Provided functionalities](#provided-functionalities) - - [InfoControllerModule](#infocontrollermodule) - - [AuthControllerModule](#authcontrollermodule) - - [EAVControllerModule](#eavcontrollermodule) - - [CRUDControllerModule](#crudcontrollermodule) - - [Configuration](#configuration) - - [Contributing](#contributing) - - [License](#license) +> BaDaaS is still under development and each of its components can have a different state of evolution ## Features and components @@ -28,194 +14,12 @@ Badaas provides several key features, each provided by a component that can be u - **Distribution**(todo): Badaas is built to run in clusters by default. Communications between nodes are TLS encrypted using [shoset](https://github.com/ditrit/shoset). - **Persistence**(wip_unstable): Applicative objects are persisted as well as user files. Those resources are shared across the clusters to increase resiliency. To achieve this, BaDaaS uses the [BaDorm](https://github.com/ditrit/badaas/badorm) component. - **Querying Resources**(unstable): Resources are accessible via a REST API. -- **Posix compliant**(stable): Badaas strives towards being a good unix citizen and respecting commonly accepted norms. (see [Configuration](#configuration)) +- **Posix compliant**(stable): Badaas strives towards being a good unix citizen and respecting commonly accepted norms. - **Advanced logs management**(todo): Badaas provides an interface to interact with the logs produced by the clusters. Logs are formatted in json by default. -## Quickstart - -### Example - -To quickly get badaas up and running, you can head to the [example](https://github.com/ditrit/badaas-example). This example will help you to see how to use badaas and as a template to start your own project. - -### Step-by-step instructions - -Once you have started your project with `go init`, you must add the dependency to badaas. To use badaas, your project must also use [`fx`](https://github.com/uber-go/fx) and [`verdeter`](https://github.com/ditrit/verdeter): - - -```bash -go get -u github.com/ditrit/badaas@83b120f0853bce9dccb32fd27e858aa0fd71d0e6 github.com/uber-go/fx github.com/ditrit/verdeter -``` - -Then, your application must be defined as a `verdeter command` and you have to call the configuration of this command: - -```go -var command = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ - Use: "badaas", - Short: "Backend and Distribution as a Service", - Run: runCommandFunc, -}) - -func main() { - err := configuration.NewCommandInitializer().Init(command) - if err != nil { - panic(err) - } - - command.Execute() -} -``` - -Then, in the Run function of your command, you must use `fx` and start the badaas functions: - -```go -func runCommandFunc(cmd *cobra.Command, args []string) { - fx.New( - badaas.BadaasModule, - - // Here you can add the functionalities provided by badaas - // Here you can start the rest of the modules that your project uses. - ).Run() -} -``` - -You are free to choose which badaas functionalities you wish to use. To add them, you must initialise the corresponding module: - -```go -func runCommandFunc(cmd *cobra.Command, args []string) { - fx.New( - badaas.BadaasModule, - - fx.Provide(NewAPIVersion), - // add routes provided by badaas - badaasControllers.InfoControllerModule, - badaasControllers.AuthControllerModule, - badaasControllers.EAVControllerModule, - // Here you can start the rest of the modules that your project uses. - ).Run() -} - -func NewAPIVersion() *semver.Version { - return semver.MustParse("0.0.0-unreleased") -} -``` - -Once you have defined the functionalities of your project (an http api for example), you can generate everything you need to run your application using `badctl`. - -For installing it, use: - - -```bash -go install github.com/ditrit/badaas/tools/badctl@cbd4c9e035709de25df59ec17e4b302b3a7b9931 -``` - -Then generate files to make this project work with `cockroach` as database: - -```bash -badctl gen --db_provider cockroachdb -``` - -For more information about `badctl` refer to [badctl docs](https://github.com/ditrit/badaas/tools/badctl/README.md). - -Finally, you can run the api with: - -```bash -badctl run -``` - -The api will be available at . - -### Provided functionalities - -#### InfoControllerModule - -`InfoControllerModule` adds the path `/info`, where the api version will be answered. To set the version we want to be responded to we must provide the version using fx: - -```go -func runCommandFunc(cmd *cobra.Command, args []string) { - fx.New( - badaas.BadaasModule, - - // provide api version - fx.Provide(NewAPIVersion), - // add /info route provided by badaas - badaasControllers.InfoControllerModule, - ).Run() -} - -func NewAPIVersion() *semver.Version { - return semver.MustParse("0.0.0-unreleased") -} -``` - -#### AuthControllerModule - -`AuthControllerModule` adds `/login` and `/logout`, which allow us to add authentication to our application in a simple way: - -```go -func runCommandFunc(cmd *cobra.Command, args []string) { - fx.New( - badaas.BadaasModule, - - // add /login and /logout routes provided by badaas - badaasControllers.AuthControllerModule, - ).Run() -} -``` - -#### EAVControllerModule - -`EAVControllerModule` adds `/eav/objects/{type}` and `/eav/objects/{type}/{id}`, where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to create, read, update and remove objects using an EAV model. For more information on how to use them, see the [example](https://github.com/ditrit/badaas-example). - -```go -func runCommandFunc(cmd *cobra.Command, args []string) { - fx.New( - badaas.BadaasModule, - - badaasControllers.EAVControllerModule, - ).Run() -} -``` - -#### CRUDControllerModule - -`CRUDControllerModule` adds `/objects/{type}` and `/objects/{type}/{id}`, where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to read objects. For more information on how to use them, see the [example](https://github.com/ditrit/badaas-example). - -```go -func runCommandFunc(cmd *cobra.Command, args []string) { - fx.New( - badaas.BadaasModule, - - router.GetCRUDRoutesModule[models.Company](), - ).Run() -} -``` - -### Configuration - -Badaas use [verdeter](https://github.com/ditrit/verdeter) to manage it's configuration, so Badaas is POSIX compliant by default. - -Badgen automatically generates a default configuration in `badaas/config/badaas.yml`, but you are free to modify it if you need to. - -This can be done using environment variables, configuration files or CLI flags. -CLI flags take priority on the environment variables and the environment variables take priority on the content of the configuration file. - -As an example we will define the `database.port` configuration key using the 3 methods: - -- Using a CLI flag: `--database.port=1222` -- Using an environment variable: `export BADAAS_DATABASE_PORT=1222` (*dots are replaced by underscores*) -- Using a config file (in YAML here): - - ```yml - # /etc/badaas/badaas.yml - database: - port: 1222 - ``` - -The config file can be placed at `/etc/badaas/badaas.yml` or `$HOME/.config/badaas/badaas.yml` or in the same folder as the badaas binary `./badaas.yml`. - -If needed, the location can be overridden using the config key `config_path`. +## Documentation -***For a full overview of the configuration keys: please head to the [configuration documentation](./configuration.md).*** + ## Contributing diff --git a/badorm/README.md b/badorm/README.md index 489015c8..4d3060f3 100644 --- a/badorm/README.md +++ b/badorm/README.md @@ -4,106 +4,6 @@ BaDorm is the BaDaaS component that allows for easy persistence and querying of BaDorm can be used both within a BaDaaS application and as a stand-alone application. -- [BaDorm: Backend and Distribution ORM (Object Relational Mapping)](#badorm-backend-and-distribution-orm-object-relational-mapping) - - [Quickstart](#quickstart) - - [Stand-alone Example](#stand-alone-example) - - [BaDaaS Example](#badaas-example) - - [Step-by-step instructions](#step-by-step-instructions) - - [Provided functionalities](#provided-functionalities) - - [Base models](#base-models) - - [CRUDServiceModule](#crudservicemodule) - - [CRUDUnsafeServiceModule](#crudunsafeservicemodule) +## Documentation -## Quickstart - -### Stand-alone Example - -To quickly understand the features provided by BaDorm, you can head to the [example](https://github.com/ditrit/badorm-example). This example will help you to see how to use BaDorm and as a template to start your own project. - -### BaDaaS Example - -If you are interested in using BaDorm within a BaDaaS application you can consult the [example](https://github.com/ditrit/badaas-example) in which besides using the services and repositories provided by BaDorm, BaDaaS adds a controller that allows the query of objects via an http api. - -### Step-by-step instructions - -Once you have started your project with `go init`, you must add the dependency to BaDaaS: - - -```bash -go get -u github.com/ditrit/badaas@7fae89e -``` - -In order to use BaDorm you will also need to use the following libraries: - -```bash -go get -u github.com/uber-go/fx github.com/uber-go/zap gorm.io/gorm -``` - -First of all, you will need to start your application with `fx`: - -```go -func main() { - fx.New( - fx.Provide(NewLogger), - - // DB modules - fx.Provide(NewGORMDBConnection), - // activate BaDORM - badorm.BaDORMModule, - // start example data - badorm.GetCRUDServiceModule[models.Company](), - badorm.GetCRUDServiceModule[models.Product](), - badorm.GetCRUDServiceModule[models.Seller](), - badorm.GetCRUDServiceModule[models.Sale](), - fx.Provide(CreateCRUDObjects), - fx.Invoke(QueryCRUDObjects), - ).Run() -} -``` - -There are some things you need to provide to the BaDORM module: - -- `NewLogger` is the function that provides a zap logger to the BaDorm components. -- `NewGORMDBConnection` if the function that establish the connection to the database where you data will be saved. - -After that, you can start the `badorm.BaDORMModule` and crete the CRUD services to your models using `badorm.GetCRUDServiceModule`. - -Finally, you can call your application functions as `CreateCRUDObjects` and `QueryCRUDObjects` where created CRUDServices can be injected to create, read, update and delete your models easily. - -## Provided functionalities - -### Base models - -BaDORM gives you two types of base models for your classes: `badorm.UUIDModel` and `badorm.UIntModel`. - -To use them, simply embed the desired model in any of your classes: - -```go -type MyClass struct { - badorm.UUIDModel - - // your code here -} -``` - -Once done your class will be considered a **BaDORM Model**. - -The difference between them is the type they will use as primary key: a random uuid and an auto incremental uint respectively. Both provide date created, edited and deleted (). - -### CRUDServiceModule - -`CRUDServiceModule` provides you a CRUDService and a CRUDRepository for your BaDORM Model. After calling it as, for example, `badorm.GetCRUDServiceModule[models.Company](),` the following can be used by dependency injection: - -- `crudCompanyService badorm.CRUDService[models.Company, uuid.UUID]` -- `crudCompanyRepository badorm.CRUDRepository[models.Company, uuid.UUID]` - -These classes will allow you to perform queries using the compilable query system generated with BaDctl. For details on how to do this visit [badctl docs](github.com/ditrit/badaas/tools/badctl/README.md#gen-conditions). - -### CRUDUnsafeServiceModule - -`CRUDUnsafeServiceModule` provides you a CRUDUnsafeService and a CRUDUnsafeRepository for your BaDORM Model. After calling it as, for example, `badorm.GetCRUDUnsafeServiceModule[models.Company](),` the following can be used by dependency injection: - -- `crudCompanyService badorm.CRUDUnsafeService[models.Company, uuid.UUID]` -- `crudCompanyRepository badorm.CRUDUnsafeRepository[models.Company, uuid.UUID]` - -These classes will allow you to perform queries using maps as conditions. **Its direct use is not recommended**, since using the compilable query system we can make sure that the query is correct at compile time, while here errors will happen at runtime in case your condition map is not well structured. This functionality is used internally by BaDaaS to provide an http api for queries. + \ No newline at end of file diff --git a/configuration.md b/configuration.md deleted file mode 100644 index c92161dc..00000000 --- a/configuration.md +++ /dev/null @@ -1,147 +0,0 @@ -# Configuration - -To see a complete example of a working config file: head to [`badaas.example.yml`](./badaas.example.yml). - -As said in the README: - -> Badaas can be configured using environment variables, CLI flags or a configuration file. -> CLI flags take priority on the environment variables and the environment variables take priority on the content of the configuration file. - -In this documentation file, we will mainly focus our attention on config files but we won't forget that we can use environment variables and CLI flags to change Badaas' config. - -The config file can be formatted in any syntax that [`viper`](https://github.com/spf13/viper) supports but we will only use YAML syntax in our docs. - -- [Configuration](#configuration) - - [Database](#database) - - [Logger](#logger) - - [HTTP Server](#http-server) - - [Default values](#default-values) - - [Session management](#session-management) - -## Database - -```yml -# The settings for the database. -database: - # The host of the database server. - # (mandatory) - host: e2e-db-1 - - # The port of the database server. - # (mandatory) - port: 26257 - - # The sslmode of the connection to the database server. - # (mandatory) - sslmode: disable - - # The username of the account on the database server. - # (mandatory) - username: root - - # The password of the account on the database server. - # (mandatory) - password: postgres - - # The settings for the initialization of the database server. - init: - # Number of time badaas will try to establish a connection to the database server. - # default (10) - retry: 10 - - # Waiting time between connection, in seconds. - # default (5) - retryTime: 5 -``` - -Please note that the init section `init:` is not mandatory. Badaas is suited with a simple but effective retry mechanism that will retry `database.init.retry` time to establish a connection with the database. Badaas will wait `database.init.retryTime` seconds between each retry. - -## Logger - -Badaas use a structured logger that can output json logs in production and user adapted logs for debug using the `logger.mode` key. - -Badaas offers the possibility to change the log message of the Middleware Logger but provides a sane default. It is formatted using the Jinja syntax. The values available are `method`, `url` and `protocol`. - -```yml -# The settings for the logger. -logger: - # Either `dev` or `prod` - # default (`prod`) - mode: prod - request: - # Change the log emitted when badaas receives a request on a valid endpoint. - template: "Receive {{method}} request on {{url}}" -``` - -## HTTP Server - -You can change the host Badaas will bind to, the port and the timeout in seconds. - -Additionally you can change the number of elements returned by default for a paginated response. - -```yml -# The settings for the http server. -server: - # The address to bind badaas to. - # default ("0.0.0.0") - host: "" - - # The port badaas should use. - # default (8000) - port: 8000 - - # The maximum timeout for the http server in seconds. - # default (15) - timeout: 15 - - # The settings for the pagination. - pagination: - page: - # The maximum number of record per page - # default (100) - max: 100 -``` - -## Default values - -The section allow to change some settings for the first run. - -```yml -# The settings for the first run. -default: - # The admin settings for the first run - admin: - # The admin password for the first run. Won't change is the admin user already exists. - password: admin -``` - -## Session management - -You can change the way the session service handle user sessions. -Session are extended if the user made a request to badaas in the "roll duration". The session duration and the refresh interval of the cache can be changed. They contains some good defaults. - -Please see the diagram below to see what is the roll duration relative to the session duration. - -```txt - | session duration | - |<----------------------------------------->| - ----|-------------------------|-----------------|----> time - | | | - |<--------------->| - roll duration -``` - -```yml -# The settings for session service -# This section contains some good defaults, don't change those value unless you need to. -session: - # The duration of a user session, in seconds - # Default (14400) equal to 4 hours - duration: 14400 - # The refresh interval in seconds. Badaas refresh it's internal session cache periodically. - # Default (30) - pullInterval: 30 - # The duration in which the user can renew it's session by making a request. - # Default (3600) equal to 1 hour - rollDuration: 3600 -``` diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..6283bf6c --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,29 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build +PYTHON = python3 + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +htmlview: html + @ls + $(PYTHON) -c "import webbrowser; from pathlib import Path; \ + webbrowser.open(Path('_build/html/index.html').resolve().as_uri())" + +watch: htmlview + watchmedo shell-command -p '*.rst' -c 'make html' -R -D + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/README.rst b/docs/README.rst new file mode 100644 index 00000000..75d490a5 --- /dev/null +++ b/docs/README.rst @@ -0,0 +1,59 @@ +:orphan: + +====================================== +BaDaaS documentation quick start guide +====================================== + +This file provides a quick guide on how to compile the BaDaaS documentation. + + +Setup the environment +--------------------- + +To compile the documentation you need Sphinx Python library. To install it +and all its dependencies run the following command from this dir + +:: + + pip install -r requirements.txt + + +Compile the documentation +------------------------- + +To compile the documentation (to classic HTML output) run the following command +from this dir:: + + make html + +Documentation will be generated (in HTML format) inside the ``_build/html`` dir. + + +View the documentation +---------------------- + +To view the documentation run the following command:: + + make htmlview + +This command will fire up your default browser and open the main page of your +(previously generated) HTML documentation. + + +Start over +---------- + +To clean up all generated documentation files and start from scratch run:: + + make clean + +Keep in mind that this command won't touch any documentation source files. + + +Recreating documentation on the fly +----------------------------------- + +There is a way to recreate the doc automatically when you make changes, you +need to install watchdog (``pip install watchdog``) and then use:: + + make watch diff --git a/docs/badaas/configuration.rst b/docs/badaas/configuration.rst new file mode 100644 index 00000000..38025de0 --- /dev/null +++ b/docs/badaas/configuration.rst @@ -0,0 +1,182 @@ +============================== +Configuration +============================== + +Methods +------------------------------- + +Badaas use `verdeter `_ to manage it's configuration, +so Badaas is POSIX compliant by default. + +Badctl automatically generates a default configuration in `badaas/config/badaas.yml`, +but you are free to modify it if you need to. + +This can be done using environment variables, configuration files or CLI flags. +CLI flags take priority on the environment variables and the environment variables take +priority on the content of the configuration file. + +As an example we will define the `database.port` configuration key using the 3 methods: + +- Using a CLI flag: :code:`--database.port=1222` +- Using an environment variable: :code:`export BADAAS_DATABASE_PORT=1222` (*dots are replaced by underscores*) +- Using a config file (in YAML here) + +:: + + # /etc/badaas/badaas.yml + database: + port: 1222 + +The config file can be placed at `/etc/badaas/badaas.yml` or `$HOME/.config/badaas/badaas.yml` +or in the same folder as the badaas binary `./badaas.yml`. + +If needed, the location can be overridden using the config key `config_path`. + +Config file +---------------------------- + +In this section, we will focus our attention on config files but +we won't forget that we can use environment variables and CLI flags to change Badaas' config. + +The config file can be formatted in any syntax that +`viper `_ supports but we will only use YAML syntax in our docs. + +To see a complete example of a working config file: head to +`badaas.example.yml `_. + +Database +^^^^^^^^^^^^^^^^^^^^^^^^ +:: + + # The settings for the database. + database: + # The host of the database server. + # (mandatory) + host: e2e-db-1 + + # The port of the database server. + # (mandatory) + port: 26257 + + # The sslmode of the connection to the database server. + # (mandatory) + sslmode: disable + + # The username of the account on the database server. + # (mandatory) + username: root + + # The password of the account on the database server. + # (mandatory) + password: postgres + + # The settings for the initialization of the database server. + init: + # Number of time badaas will try to establish a connection to the database server. + # default (10) + retry: 10 + + # Waiting time between connection, in seconds. + # default (5) + retryTime: 5 + +Please note that the init section `init:` is not mandatory. +Badaas is suited with a simple but effective retry mechanism that will retry +`database.init.retry` time to establish a connection with the database. +Badaas will wait `database.init.retryTime` seconds between each retry. + +Logger +^^^^^^^^^^^^^^^^^^^^^^^^ + +Badaas use a structured logger that can output json logs in +production and user adapted logs for debug using the `logger.mode` key. + +Badaas offers the possibility to change the log message of the +Middleware Logger but provides a sane default. It is formatted using the Jinja syntax. +The values available are `method`, `url` and `protocol`. +:: + + # The settings for the logger. + logger: + # Either `dev` or `prod` + # default (`prod`) + mode: prod + request: + # Change the log emitted when badaas receives a request on a valid endpoint. + template: "Receive {{method}} request on {{url}}" + +HTTP Server +^^^^^^^^^^^^^^^^^^^^^^^^ + +You can change the host Badaas will bind to, the port and the timeout in seconds. + +Additionally you can change the number of elements returned by default for a paginated response. +:: + + # The settings for the http server. + server: + # The address to bind badaas to. + # default ("0.0.0.0") + host: "" + + # The port badaas should use. + # default (8000) + port: 8000 + + # The maximum timeout for the http server in seconds. + # default (15) + timeout: 15 + + # The settings for the pagination. + pagination: + page: + # The maximum number of record per page + # default (100) + max: 100 + + +Default values +^^^^^^^^^^^^^^^^^^^^^^^^ + +The section allow to change some settings for the first run. +:: + + # The settings for the first run. + default: + # The admin settings for the first run + admin: + # The admin password for the first run. Won't change is the admin user already exists. + password: admin + +Session management +^^^^^^^^^^^^^^^^^^^^^^^^ + +You can change the way the session service handle user sessions. +Session are extended if the user made a request to badaas in the "roll duration". +The session duration and the refresh interval of the cache can be changed. +They contains some good defaults. + +Please see the diagram below to see what is the roll duration relative to the session duration. +:: + + | session duration | + |<----------------------------------------->| + ----|-------------------------|-----------------|----> time + | | | + |<--------------->| + roll duration + +:: + + # The settings for session service + # This section contains some good defaults, don't change those value unless you need to. + session: + # The duration of a user session, in seconds + # Default (14400) equal to 4 hours + duration: 14400 + # The refresh interval in seconds. Badaas refresh it's internal session cache periodically. + # Default (30) + pullInterval: 30 + # The duration in which the user can renew it's session by making a request. + # Default (3600) equal to 1 hour + rollDuration: 3600 \ No newline at end of file diff --git a/docs/badaas/functionalities.rst b/docs/badaas/functionalities.rst new file mode 100644 index 00000000..cd73fc74 --- /dev/null +++ b/docs/badaas/functionalities.rst @@ -0,0 +1,72 @@ +============================== +Functionalities +============================== + +InfoControllerModule +------------------------------- + +`InfoControllerModule` adds the path `/info`, where the api version will be answered. +To set the version we want to be responded to we must provide the version using fx:: + + func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + // provide api version + fx.Provide(NewAPIVersion), + // add /info route provided by badaas + badaasControllers.InfoControllerModule, + ).Run() + + func NewAPIVersion() *semver.Version { + return semver.MustParse("0.0.0-unreleased") + } + +AuthControllerModule +------------------------------- + +`AuthControllerModule` adds `/login` and `/logout`, +which allow us to add authentication to our application in a simple way:: + + func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + // add /login and /logout routes provided by badaas + badaasControllers.AuthControllerModule, + ).Run() + } + +EAVControllerModule +------------------------------- + +`EAVControllerModule` adds `/eav/objects/{type}` and `/eav/objects/{type}/{id}`, +where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to create, +read, update and remove objects using an EAV model. For more information on how to use them, +see the `example `_. +:: + + func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + badaasControllers.EAVControllerModule, + ).Run() + } + +CRUDControllerModule +------------------------------- + +`CRUDControllerModule` adds `/objects/{type}` and `/objects/{type}/{id}`, +where `{type}` is any defined type and `{id}` is any uuid. +These routes allow us to read objects. For more information on how to use them, +see the `example `_. +:: + + func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + router.GetCRUDRoutesModule[models.Company](), + ).Run() + } \ No newline at end of file diff --git a/docs/badaas/quickstart.rst b/docs/badaas/quickstart.rst new file mode 100644 index 00000000..d71dc1fa --- /dev/null +++ b/docs/badaas/quickstart.rst @@ -0,0 +1,84 @@ +============================== +Quickstart +============================== + +To quickly get badaas up and running, you can head to the `example `_. This example will help you to see how to use badaas and as a template to start your own project. + +Step-by-step instructions +----------------------------------- + +Once you have started your project with :code:`go init`, you must add the dependency to badaas. +To use badaas, your project must also use `fx `_ and +`verdeter `_:: + + go get -u github.com/ditrit/badaas github.com/uber-go/fx github.com/ditrit/verdeter + +Then, your application must be defined as a `verdeter command` and you have to call +the configuration of this command:: + + var command = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "badaas", + Short: "Backend and Distribution as a Service", + Run: runCommandFunc, + }) + + func main() { + err := configuration.NewCommandInitializer().Init(command) + if err != nil { + panic(err) + } + + command.Execute() + } + +Then, in the Run function of your command, you must use `fx` and start the badaas functions:: + + func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + // Here you can add the functionalities provided by badaas + // Here you can start the rest of the modules that your project uses. + ).Run() + } + +You are free to choose which badaas functionalities you wish to use. +To add them, you must initialise the corresponding module:: + + func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + fx.Provide(NewAPIVersion), + // add routes provided by badaas + badaasControllers.InfoControllerModule, + badaasControllers.AuthControllerModule, + badaasControllers.EAVControllerModule, + // Here you can start the rest of the modules that your project uses. + ).Run() + } + + func NewAPIVersion() *semver.Version { + return semver.MustParse("0.0.0-unreleased") + } + +For details visit :doc:`functionalities`. + +Once you have defined the functionalities of your project (an http api for example), +you can generate everything you need to run your application using `badctl`. + +For installing it, use:: + + go install github.com/ditrit/badaas/tools/badctl + +Then generate files to make this project work with `cockroach` as database:: + + badctl gen --db_provider cockroachdb + +For more information about `badctl` refer to :doc:`../badctl/index`. + +Finally, you can run the api with:: + + make badaas_run + +The api will be available at . \ No newline at end of file diff --git a/docs/badctl/commands.rst b/docs/badctl/commands.rst new file mode 100644 index 00000000..4abd3ba1 --- /dev/null +++ b/docs/badctl/commands.rst @@ -0,0 +1,52 @@ +============================== +Commands +============================== + +You can see the available commands by running:: + + badctl help + +For more information about the functionality provided and how to use each command use:: + + badctl help [command] + +gen docker +--------------------------- + +gen docker is the command you can use to generate the files and configurations +necessary for your project to use BadAss in a simple way. + +Depending of the `db_provider` chosen `gen` will generate the docker and +configuration files needed to run the application in the `badaas/docker/db` +and `badaas/config` folders respectively. It will also generate docker files +to run a http api in `badaas/docker/api`. + +The possible values for `db_provider` are `cockroachdb` and `postgres`. +CockroachDB is recommended since it's a distributed database from its +conception and postgres compatible. + +All these files can be modified in case you need different values than +those provided by default. For more information about the configuration +head to :doc:`/badaas/configuration` + +A Makefile will be generated for the execution of a badaas server, with the command:: + + make badaas_run + +gen conditions +--------------------------- + +gen conditions is the command you can use to generate +conditions to query your objects using BaDORM. +For each BaDORM Model found in the input packages a file +containing all possible Conditions on that object will be generated, +allowing you to use BaDORM in an easy way. + +Its use is recommended through `go generate`. +For that, you will only need to create a file with the following content:: + + package conditions + + //go:generate badctl gen conditions ../models + +An example can be found `here `_. \ No newline at end of file diff --git a/docs/badctl/index.rst b/docs/badctl/index.rst new file mode 100644 index 00000000..d72ee03a --- /dev/null +++ b/docs/badctl/index.rst @@ -0,0 +1,5 @@ +============================== +BaDctl |version| +============================== + +`badctl` is the command line tool that makes it possible to configure and run your BaDaaS applications easily. diff --git a/docs/badctl/installation.rst b/docs/badctl/installation.rst new file mode 100644 index 00000000..f01805d9 --- /dev/null +++ b/docs/badctl/installation.rst @@ -0,0 +1,28 @@ +================ +Installation +================ + +Install with go install +----------------------------------- + +For simply installing it, use:: + + go install github.com/ditrit/badaas/tools/badctl + +Or you can build it from sources. + +Build from sources +----------------------------------- + +Get the sources of the project, either by visiting the `releases `_ +page and downloading an archive or clone the main branch (please be aware that is it not a stable version). + +To build the project: + +- Install `go `_ +- :code:`cd tools/badctl` +- Install project dependencies: :code:`go get` +- Run build command: :code:`go build .` + +Well done, you have a binary `badctl` at the root of the project. + diff --git a/docs/badorm/functionalities.rst b/docs/badorm/functionalities.rst new file mode 100644 index 00000000..6f0699a7 --- /dev/null +++ b/docs/badorm/functionalities.rst @@ -0,0 +1,51 @@ +============================== +Functionalities +============================== + +Base models +----------------------- + +BaDORM gives you two types of base models for your classes: `badorm.UUIDModel` and `badorm.UIntModel`. + +To use them, simply embed the desired model in any of your classes:: + + type MyClass struct { + badorm.UUIDModel + + // your code here + } + +Once done your class will be considered a **BaDORM Model**. + +The difference between them is the type they will use as primary key: +a random uuid and an auto incremental uint respectively. +Both provide date created, edited and deleted (). + +CRUDServiceModule +----------------------- + +`CRUDServiceModule` provides you a CRUDService and a CRUDRepository for your BaDORM Model. +After calling it as, for example, `badorm.GetCRUDServiceModule[models.Company](),` +the following can be used by dependency injection: + +- `crudCompanyService badorm.CRUDService[models.Company, uuid.UUID]` +- `crudCompanyRepository badorm.CRUDRepository[models.Company, uuid.UUID]` + +These classes will allow you to perform queries using the compilable query system generated with BaDctl. +For details on how to do this visit :doc:`/badctl/commands` + +CRUDUnsafeServiceModule +----------------------- + +`CRUDUnsafeServiceModule` provides you a CRUDUnsafeService and a CRUDUnsafeRepository for your BaDORM Model. +After calling it as, for example, `badorm.GetCRUDUnsafeServiceModule[models.Company](),` +the following can be used by dependency injection: + +- `crudCompanyService badorm.CRUDUnsafeService[models.Company, uuid.UUID]` +- `crudCompanyRepository badorm.CRUDUnsafeRepository[models.Company, uuid.UUID]` + +These classes will allow you to perform queries using maps as conditions. +**Its direct use is not recommended**, since using the compilable query system we can make +sure that the query is correct at compile time, while here errors will happen at runtime in +case your condition map is not well structured. +This functionality is used internally by BaDaaS to provide an http api for queries. \ No newline at end of file diff --git a/docs/badorm/index.rst b/docs/badorm/index.rst new file mode 100644 index 00000000..48e504c3 --- /dev/null +++ b/docs/badorm/index.rst @@ -0,0 +1,10 @@ +============================== +BaDORM |version| +============================== + +BaDORM stands for Backend and Distribution ORM (Object Relational Mapping). +It's the BaDaaS component that allows for easy persistence and querying of objects. +It is built on top of `gorm `_ and adds for each model a service +and a repository that allows complex queries without any extra effort. + +BaDorm can be used both within a BaDaaS application and as a stand-alone application. \ No newline at end of file diff --git a/docs/badorm/quickstart.rst b/docs/badorm/quickstart.rst new file mode 100644 index 00000000..2b688066 --- /dev/null +++ b/docs/badorm/quickstart.rst @@ -0,0 +1,58 @@ +============================== +Quickstart +============================== + +BaDaaS Example +--------------------------- + +If you are interested in using BaDORM within a BaDaaS application you can +consult the `badaas example `_. +in which besides using the services and repositories provided by BaDorm, +BaDaaS adds a controller that allows the query of objects via an http api. + +Stand-alone Example +--------------------------- + +To quickly understand the features provided by BaDORM, you can head to the +`example `_. +This example will help you to see how to use BaDorm and as a template to start your own project. + +Step-by-step instructions +--------------------------- + +Once you have started your project with `go init`, you must add the dependency to BaDaaS:: + + go get -u github.com/ditrit/badaas github.com/uber-go/fx github.com/uber-go/zap + +First of all, you will need to start your application with `fx`:: + + func main() { + fx.New( + fx.Provide(NewLogger), + + // DB modules + fx.Provide(NewGORMDBConnection), + // activate BaDORM + badorm.BaDORMModule, + // start example data + badorm.GetCRUDServiceModule[models.Company](), + badorm.GetCRUDServiceModule[models.Product](), + badorm.GetCRUDServiceModule[models.Seller](), + badorm.GetCRUDServiceModule[models.Sale](), + fx.Provide(CreateCRUDObjects), + fx.Invoke(QueryCRUDObjects), + ).Run() + } + +There are some things you need to provide to the BaDORM module: + +- `NewLogger` is the function that provides a zap logger to the BaDorm components. +- `NewGORMDBConnection` if the function that establish the connection to the + database where you data will be saved. + +After that, you can start the `badorm.BaDORMModule` and crete the CRUD +services to your models using `badorm.GetCRUDServiceModule`. + +Finally, you can call your application functions as `CreateCRUDObjects` +and `QueryCRUDObjects` where created CRUDServices can be injected to create, +read, update and delete your models easily. \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..fad7923e --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,28 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'BaDaaS' +copyright = '2023, DitRit' +author = 'DitRit' +release = '0.0.1' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = ["myst_parser"] + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'alabaster' +html_static_path = ['_static'] diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..fbc1397c --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,52 @@ +.. _topics-index: + +============================== +BaDaaS |version| documentation +============================== + +Badaas enables the effortless construction of **distributed, resilient, +highly available and secure applications by design**, while ensuring very simple +deployment and management (NoOps). + +.. warning:: + BaDaaS is still under development and each of its components can have a different state of evolution + +Features and components +================================= + +Badaas provides several key features, +each provided by a component that can be used independently and has a different state of evolution: + +- **Authentication** (unstable): Badaas can authenticate users using its internal authentication scheme or externally by using protocols such as OIDC, SAML, Oauth2... +- **Authorization** (wip_unstable): On resource access, Badaas will check if the user is authorized using a RBAC model. +- **Distribution** (todo): Badaas is built to run in clusters by default. Communications between nodes are TLS encrypted using `shoset `_. +- **Persistence** (wip_unstable): Applicative objects are persisted as well as user files. Those resources are shared across the clusters to increase resiliency. To achieve this, BaDaaS uses the :doc:`badorm/index` component. +- **Querying Resources** (unstable): Resources are accessible via a REST API. +- **Posix compliant** (stable): Badaas strives towards being a good unix citizen and respecting commonly accepted norms. (see [Configuration](#configuration)) +- **Advanced logs management** (todo): Badaas provides an interface to interact with the logs produced by the clusters. Logs are formatted in json by default. + +Learn how to use BaDaaS following the :doc:`badaas/quickstart`. + +Index +=========== + +.. toctree:: + :caption: BaDaaS + + badaas/quickstart + badaas/functionalities + badaas/configuration + +.. toctree:: + :caption: BaDctl + + badctl/index + badctl/installation + badctl/commands + +.. toctree:: + :caption: BaDORM + + badorm/index + badorm/quickstart + badorm/functionalities \ No newline at end of file diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 00000000..32bb2452 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements.in b/docs/requirements.in new file mode 100644 index 00000000..4cb3091f --- /dev/null +++ b/docs/requirements.in @@ -0,0 +1,3 @@ +Sphinx +sphinx_rtd_theme +myst-parser \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 00000000..4f36d62c --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,73 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile docs/requirements.in +# +alabaster==0.7.13 + # via sphinx +babel==2.12.1 + # via sphinx +certifi==2023.5.7 + # via requests +charset-normalizer==3.2.0 + # via requests +docutils==0.18.1 + # via + # myst-parser + # sphinx + # sphinx-rtd-theme +idna==3.4 + # via requests +imagesize==1.4.1 + # via sphinx +jinja2==3.1.2 + # via + # myst-parser + # sphinx +markdown-it-py==3.0.0 + # via + # mdit-py-plugins + # myst-parser +markupsafe==2.1.3 + # via jinja2 +mdit-py-plugins==0.4.0 + # via myst-parser +mdurl==0.1.2 + # via markdown-it-py +myst-parser==2.0.0 + # via -r docs/requirements.in +packaging==23.1 + # via sphinx +pygments==2.15.1 + # via sphinx +pyyaml==6.0 + # via myst-parser +requests==2.31.0 + # via sphinx +snowballstemmer==2.2.0 + # via sphinx +sphinx==6.2.1 + # via + # -r docs/requirements.in + # myst-parser + # sphinx-rtd-theme + # sphinxcontrib-jquery +sphinx-rtd-theme==1.2.2 + # via -r docs/requirements.in +sphinxcontrib-applehelp==1.0.4 + # via sphinx +sphinxcontrib-devhelp==1.0.2 + # via sphinx +sphinxcontrib-htmlhelp==2.0.1 + # via sphinx +sphinxcontrib-jquery==4.1 + # via sphinx-rtd-theme +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==1.0.3 + # via sphinx +sphinxcontrib-serializinghtml==1.1.5 + # via sphinx +urllib3==2.0.3 + # via requests diff --git a/readthedocs.yml b/readthedocs.yml new file mode 100644 index 00000000..cfc86344 --- /dev/null +++ b/readthedocs.yml @@ -0,0 +1,31 @@ +# .readthedocs.yaml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the version of Python and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.10" + # You can also specify other tool versions: + # nodejs: "16" + # rust: "1.55" + # golang: "1.17" + +# Build documentation in the docs/ directory with Sphinx +sphinx: + configuration: docs/conf.py + +# If using Sphinx, optionally build your docs in additional formats such as PDF +formats: + - pdf + +# Optionally declare the Python requirements required to build your docs +python: + install: + - requirements: docs/requirements.txt + - method: pip + path: . \ No newline at end of file diff --git a/tools/badctl/README.md b/tools/badctl/README.md index ecee8f36..b06384c5 100644 --- a/tools/badctl/README.md +++ b/tools/badctl/README.md @@ -1,83 +1,10 @@ -# badctl: the BadAas controller +# badctl: the BaDaaS controller -`badctl` is the command line tool that makes it possible to configure and run your BadAas applications easily. +`badctl` is the command line tool that makes it possible to configure and run your BaDaaS applications easily. -- [badctl: the BadAas controller](#badctl-the-badaas-controller) - - [Install with go install](#install-with-go-install) - - [Build from sources](#build-from-sources) - - [Commands](#commands) - - [gen docker](#gen-docker) - - [gen conditions](#gen-conditions) - - [Contributing](#contributing) +## Documentation -## Install with go install - -For simply installing it, use: - - -```bash -go install github.com/ditrit/badaas/tools/badctl@bef1116 -``` - -Or you can build it from sources. - -## Build from sources - -Get the sources of the project, either by visiting the [releases](https://github.com/ditrit/badaas/releases) page and downloading an archive or clone the main branch (please be aware that is it not a stable version). - -To build the project: - -- [Install go](https://go.dev/dl/#go1.18.4) v1.18 -- `cd tools/badctl` -- Install project dependencies - - ```bash - go get - ``` - -- Run build command - - ```bash - go build . - ``` - -Well done, you have a binary `badctl` at the root of the project. - -## Commands - -You can see the available commands by running: - -```bash -badctl help -``` - -For more information about the functionality provided and how to use each command use: - -```bash -badctl help [command] -``` - -### gen docker - -gen docker is the command you can use to generate the files and configurations necessary for your project to use BadAss in a simple way. - -Depending of the `db_provider` chosen `gen` will generate the docker and configuration files needed to run the application in the `badaas/docker/db` and `badaas/config` folders respectively. It will also generate docker files to run a http api in `badaas/docker/api`. - -The possible values for `db_provider` are `cockroachdb` and `postgres`. CockroachDB is recommended since it's a distributed database from its conception and postgres compatible. - -All these files can be modified in case you need different values than those provided by default. For more information about the configuration head to [configuration docs](../../configuration.md). - -A Makefile will be generated for the execution of a badaas server, with the command: - -```bash -make badaas_run -``` - -### gen conditions - -gen conditions is the command you can use to generate conditions to query your objects using BaDORM.For each BaDORM Model found in the input packages a file containing all possible Conditions on that object will be generated, allowing you to use BaDORM in an easy way. - -Its use is recommended through `go generate`. To see an example of how to do it click [here](https://github.com/ditrit/badorm-example/blob/feature/gorm_compilable_queries/standalone/conditions/badorm.go). + ## Contributing From 910e56400bb5f5b3fbbe70b3c688d7b16004946f Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 13 Jul 2023 16:43:57 +0200 Subject: [PATCH 443/467] 2 --- badorm/README.md | 22 ++++- docs/badorm/concepts.rst | 154 +++++++++++++++++++++++++++++++++++ docs/badorm/index.rst | 59 +++++++++++++- docs/badorm/quickstart.rst | 159 ++++++++++++++++++++++++++++++------- docs/conf.py | 8 +- docs/index.rst | 1 + 6 files changed, 366 insertions(+), 37 deletions(-) create mode 100644 docs/badorm/concepts.rst diff --git a/badorm/README.md b/badorm/README.md index 4d3060f3..0da04e8a 100644 --- a/badorm/README.md +++ b/badorm/README.md @@ -1,9 +1,23 @@ -# BaDorm: Backend and Distribution ORM (Object Relational Mapping) +# BaDORM -BaDorm is the BaDaaS component that allows for easy persistence and querying of objects. It is built on top of gorm and adds for each entity a service and a repository that allows complex queries without any extra effort. +BaDORM stands for Backend and Distribution ORM (Object Relational Mapping). It's the BaDaaS' component that allows for easy and safe persistence and querying of objects but it can be used both within a BaDaaS application and independently. -BaDorm can be used both within a BaDaaS application and as a stand-alone application. +BaDORM is built on top of `gorm `_, a library that actually provides the functionality of an ORM: mapping objects to tables in the SQL database. While gorm does this job well with its automatic migration then performing queries on these objects is somewhat limited, forcing us to write SQL queries directly when they are complex. BaDORM seeks to address these limitations with a query system that: + +- Is compile-time safe: the BaDORM query system is validated at compile time to avoid errors such as comparing attributes that are of different types, trying to use attributes or navigate relationships that do not exist, using information from tables that are not included in the query, etc. +- Is easy to use: the use of this system does not require knowledge of databases, SQL languages or complex concepts. Writing queries only requires programming in go and the result is easy to read. +- Is designed for real applications: the query system is designed to work well in real-world cases where queries are complex, require navigating multiple relationships, performing multiple comparisons, etc. +- Is designed so that developers can focus on the business model: its queries allow easy retrieval of model relationships to apply business logic to the model and it provides mechanisms to avoid errors in the business logic due to mistakes in loading information from the database. +- It is designed for high performance: the query system avoids as much as possible the use of reflection and aims that all the necessary model data can be retrieved in a single query to the database. ## Documentation - \ No newline at end of file + + +## Contributing + +See [this section](../CONTRIBUTING.md). + +## License + +Badaas is Licensed under the [Mozilla Public License Version 2.0](../LICENSE). \ No newline at end of file diff --git a/docs/badorm/concepts.rst b/docs/badorm/concepts.rst new file mode 100644 index 00000000..1271ebfd --- /dev/null +++ b/docs/badorm/concepts.rst @@ -0,0 +1,154 @@ +============================== +Concepts +============================== + +Model +------------------------------ + +A model is any object (struct) of go that you want to persist +in the database and on which you can perform queries. +For this, the struct must have an embedded BaDORM base model. + +BaDORM base model +----------------------------- + +It is a struct that when embedded allows your structures to become BadORM models, +adding attributes ID, CreatedAt, UpdatedAt and DeletedAt attributes and the possibility to persist, +create conditions and perform queries on these structures. + +Model ID +----------------------------- + +The id is a unique identifier needed to persist a model in the database. +It can be an auto-incremental uint or a badorm.uuid, depending on the base model used. + +Auto Migration +---------------------------------------------------------- + +To persist the models it is necessary to migrate the database, +so that the structure of the tables corresponds to the definition of the model. +This migration is performed by gorm through the gormDB. +For details visit `gorm docs `_ + +GormDB +----------------------------- + +GormDB is a gorm.DB object that allows communication with the database. + +Condition +----------------------------- + +Conditions are the basis of the BaDORM query system, every query is composed of a set of conditions. +Conditions belong to a particular model and there are 4 different types: +WhereConditions, ConnectionConditions, JoinConditions and PreloadConditions. + +WhereCondition +----------------------------- + +Type of condition that allows filters to be made on the model to which they belong +and an attribute of this model. These filters are performed through operators. + +ConnectionCondition +----------------------------- + +Type of condition that allows the use of logical operators +(and, or, or, not) between WhereConditions. + +JoinCondition +----------------------------- + +Condition type that allows to navigate relationships between models, +which will result in a join in the executed query +(don't worry, if you don't know what a join is, +you don't need to understand the queries that badorm executes). + +PreloadCondition +----------------------------- + +Type of condition that allows retrieving information from a model as a result of the database (preload). +This information can be all its attributes and/or another model that is related to it. + +Operator +----------------------------- + +Concept similar to database operators, +which allow different operations to be performed on an attribute of a model, +such as comparisons, predicates, pattern matching, etc. + +Operators can be classified as static, dynamic, multitype and unsafe. + +Static operator +----------------------------- + +Static operators are those that perform operations on an attribute and static values, +such as a boolean value, an integer, etc. + +Dynamic operator +----------------------------- + +Dynamic operators are those that perform operations between an attribute and other attributes, +either from the same model or from a different model, as long as the type of these attributes is the same. + +Multitype operator +----------------------------- + +Multitype operators are those that can perform operations between an attribute +and static values or other attributes at the same time and, in addition, +these values and attributes can be of a type related to the type of the attribute. + +Unsafe operator +----------------------------- + +Unsafe operators are those that can perform operations between an attribute and +any type of value or attribute. + +Database specific operator +----------------------------- + +Since not all SQL databases support the same set of operators, +there are operators that only work for a specific database. + +CRUDService +----------------------------- + +A CrudService is a service that allows us to perform CRUD (create, read, update and delete) +operations on a specific model, executing all the necessary operations within a transaction. +Internally they use the CRUDRepository of that model. + +CRUDRepository +----------------------------- + +A CRUDRepository is an object that allows us to perform CRUD operations (create, read, update, delete) +on a model but, unlike services, its internal operations are performed within a transaction received +by parameter. +This is useful to be able to define services that perform multiple CRUD +operations within the same transaction. + +Compilable query system +----------------------------- + +The set of conditions that are received by the read operations of the CRUDService +and CRUDRepository form the BaDORM compilable query system. +It is so named because the conditions will verify at compile time that the query to be executed is correct. + +Conditions generation +---------------------------- + +Conditions are the basis of the compilable query system. +They are generated for each model and attribute and can then be used. +Their generation is done with BaDctl. + +Dependency injection +----------------------------------- + +Dependency injection is a programming technique in which an object or function +receives other objects or functions that it depends on. BaDORM is compatible with +`uber fx `_ to inject the CRUDServices and +CRUDRepositories in your objects and functions. + +Relation getter +----------------------------------- + +Relationships between objects can be loaded from the database using PreloadConditions. +In order to safely navigate the relations in the loaded model BaDORM provides methods +called "relation getters". \ No newline at end of file diff --git a/docs/badorm/index.rst b/docs/badorm/index.rst index 48e504c3..512190eb 100644 --- a/docs/badorm/index.rst +++ b/docs/badorm/index.rst @@ -3,8 +3,59 @@ BaDORM |version| ============================== BaDORM stands for Backend and Distribution ORM (Object Relational Mapping). -It's the BaDaaS component that allows for easy persistence and querying of objects. -It is built on top of `gorm `_ and adds for each model a service -and a repository that allows complex queries without any extra effort. +It's the BaDaaS' component that allows for easy and safe persistence and querying of objects but +it can be used both within a BaDaaS application and independently. -BaDorm can be used both within a BaDaaS application and as a stand-alone application. \ No newline at end of file +BaDORM is built on top of `gorm `_, +a library that actually provides the functionality of an ORM: mapping objects to tables in the SQL database. +While gorm does this job well with its automatic migration +then performing queries on these objects is somewhat limited, +forcing us to write SQL queries directly when they are complex. +BaDORM seeks to address these limitations with a query system that: + +- Is compile-time safe: + the BaDORM query system is validated at compile time to avoid errors such as + comparing attributes that are of different types, + trying to use attributes or navigate relationships that do not exist, + using information from tables that are not included in the query, etc. +- Is easy to use: + the use of this system does not require knowledge of databases, + SQL languages or complex concepts. + Writing queries only requires programming in go and the result is easy to read. +- Is designed for real applications: + the query system is designed to work well in real-world cases where queries are complex, + require navigating multiple relationships, performing multiple comparisons, etc. +- Is designed so that developers can focus on the business model: + its queries allow easy retrieval of model relationships to apply business logic to the model + and it provides mechanisms to avoid errors in the business logic due to mistakes in loading + information from the database. +- It is designed for high performance: + the query system avoids as much as possible the use of reflection and aims + that all the necessary model data can be retrieved in a single query to the database. + +To quickly see how BaDORM can be used you can read the :doc:`quickstart`. + +.. TODO +.. conceptos +.. model +.. service +.. repositorio +.. transaccion +.. conditions: dynamic, multitype, unsafe +.. operators +.. stand-alone: stand-alone (otra vez?) y con fx +.. migracion +.. gorm tags +.. mysql, sqlserver, etc +.. preloading +.. coneccion a la base de datos +.. errores? +.. uuid + +.. definicion del modelo: gorm, gorm tags, base models, uuid, relaciones, punteros, etc +.. persistencia: getModels y automigracion +.. connecion a la base de datos, bases de datos soportadas +.. Generacion de condiciones +.. Creacion de los servicios y repositorios +.. utilizacion de las condiciones y operadores +.. preloading y getters diff --git a/docs/badorm/quickstart.rst b/docs/badorm/quickstart.rst index 2b688066..4a74019e 100644 --- a/docs/badorm/quickstart.rst +++ b/docs/badorm/quickstart.rst @@ -2,43 +2,137 @@ Quickstart ============================== -BaDaaS Example +BaDORM example --------------------------- -If you are interested in using BaDORM within a BaDaaS application you can -consult the `badaas example `_. -in which besides using the services and repositories provided by BaDorm, -BaDaaS adds a controller that allows the query of objects via an http api. +To quickly understand how to use BaDORM, you can head to the +`example `_, where you will find two different variations: -Stand-alone Example ---------------------------- +- `standalone/` where BaDORM is used in the simplest possible way. +- `fx/` where BaDORM is used within the :ref:`fx dependency injection system ` -To quickly understand the features provided by BaDORM, you can head to the -`example `_. -This example will help you to see how to use BaDorm and as a template to start your own project. +File structure +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Step-by-step instructions ---------------------------- +Both variations follow the same file structure: + +- In `main.go` you will find the configuration required to use the BaDORM. +- In `example.go` you will find the actual example, where objects are created and then queried using BaDORM. +- In `models.go` you will find the :ref:`models ` definition. +- In `conditions/badorm.go` you will find the file that allows the :ref:`conditions generation `. + +Generate conditions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +After choosing the example you want to run (`cd standalone` or `cd fx`) +you will need to :ref:`generate the conditions ` for the models using `BaDctl`. + +Install `badctl`:: + + go install github.com/ditrit/badaas/tools/badctl + +Generate conditions:: + + go generate ./... + +Now you will find in `conditions/` the :ref:`conditions ` generated by badctl +that allow you query the models in `example.go` and in `models/badorm.go` the :ref:`relation getters `. + +Run it +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +First, we need a database to store the data, in this case we will use CockroachDB:: + + docker compose up -d + +After that, we can run the application:: + + go run . + +And you should see something like:: + + 2023/05/16 09:52:03 Setting up CRUD example + 2023/05/16 09:52:03 Finished creating CRUD example + 2023/05/16 09:52:03 Products with int = 1 are: + &{UUIDModel:{ID:1483487f-c585-4455-8d5b-2a58be27acbc CreatedAt:2023-05-16 09:50:12.025843 +0200 CEST UpdatedAt:2023-05-16 09:50:12.025843 +0200 CEST DeletedAt:{Time:0001-01-01 00:00:00 +0000 UTC Valid:false}} String: Int:1 Float:0 Bool:false} + +Understand it (optional) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In this section we will see the steps carried out to develop this example. + +**Standalone** + +Once you have started your project with `go init`, you must add the dependency to BaDaaS and others:: + + go get -u github.com/ditrit/badaas github.com/uber-go/zap gorm.io/gorm -Once you have started your project with `go init`, you must add the dependency to BaDaaS:: +.. TODO quisiera sacar esta dependencia de zap - go get -u github.com/ditrit/badaas github.com/uber-go/fx github.com/uber-go/zap +In models.go the :ref:`models ` are defined and +in conditions/badorm.go the file required to +:ref:`generate the conditions ` is created. -First of all, you will need to start your application with `fx`:: +In main.go a main function is created with the configuration required to use the BaDORM. +First, we need to create a :ref:`gormDB ` that allows connection with the database:: + + gormDB, err := NewGormDBConnection() + +After that, we have to call the :ref:`AutoMigrate ` +method of the gormDB with the models you want to be persisted:: + + err = gormDB.AutoMigrate( + models.Product{}, + models.Company{}, + models.Seller{}, + models.Sale{}, + ) + +From here, we can start to use BaDORM, getting the :ref:`CRUDService ` +and :ref:`CRUDRepository ` of a model with the GetCRUD function:: + + crudProductService, crudProductRepository := badorm.GetCRUD[models.Product, badorm.UUID](gormDB) + +As you can see, we need to specify the type of the model and the kind +of :ref:`id ` this model uses. + +Finally, you can use this service and repository to perform CRUD operations on your model:: + + CreateCRUDObjects(gormDB, crudProductRepository) + QueryCRUDObjects(crudProductService) + +This two functions are defined in `example.go`. +In `QueryCRUDObjects` you can find a basic usage of the +:ref:`compilable query system `. + +**Fx** + +Once you have started your project with `go init`, you must add the dependency to BaDaaS and others:: + + go get -u github.com/ditrit/badaas github.com/uber-go/fx github.com/uber-go/zap gorm.io/gorm + +.. TODO quisiera sacar esta dependencia de zap + +In models.go the :ref:`models ` are defined and +in conditions/badorm.go the file required to +:ref:`generate the conditions ` is created. + +In main.go a main function is created with the configuration required to use the BaDORM with fx. +First, we will need to start your application with `fx`:: func main() { fx.New( - fx.Provide(NewLogger), - - // DB modules - fx.Provide(NewGORMDBConnection), // activate BaDORM + fx.Provide(NewGormDBConnection), + fx.Provide(GetModels), badorm.BaDORMModule, + // start example data badorm.GetCRUDServiceModule[models.Company](), badorm.GetCRUDServiceModule[models.Product](), badorm.GetCRUDServiceModule[models.Seller](), badorm.GetCRUDServiceModule[models.Sale](), + fx.Provide(CreateCRUDObjects), fx.Invoke(QueryCRUDObjects), ).Run() @@ -46,13 +140,24 @@ First of all, you will need to start your application with `fx`:: There are some things you need to provide to the BaDORM module: -- `NewLogger` is the function that provides a zap logger to the BaDorm components. -- `NewGORMDBConnection` if the function that establish the connection to the - database where you data will be saved. +- `NewGORMDBConnection` is the function that we need to create + a :ref:`gormDB ` that allows connection with the database. +- `GetModels` is a function that returns in a `badorm.GetModelsResult` the list of models + you want to be persisted by the :ref:`auto migration `. -After that, you can start the `badorm.BaDORMModule` and crete the CRUD -services to your models using `badorm.GetCRUDServiceModule`. +After that, we need to start the `badorm.BaDORMModule` and we are ready create +:ref:`CRUDServices ` to your models using `badorm.GetCRUDServiceModule`. -Finally, you can call your application functions as `CreateCRUDObjects` -and `QueryCRUDObjects` where created CRUDServices can be injected to create, -read, update and delete your models easily. \ No newline at end of file +Finally, we call the functions `CreateCRUDObjects` +and `QueryCRUDObjects` where the CRUDServices are injected to create, +read, update and delete the models easily. This two functions are defined in `example.go`. +In `QueryCRUDObjects` yoIn `QueryCRUDObjects` you can find a basic usage of the compiled query system.u can find a basic usage of the +:ref:`compilable query system `. + +BaDaaS example +--------------------------- + +If you are interested in using BaDORM within a BaDaaS application you can +consult the `badaas example `_. +in which besides using the services and repositories provided by BaDorm, +BaDaaS adds a controller that allows the query of objects via an http api. \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index fad7923e..fc631ee5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,12 +14,16 @@ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = ["myst_parser"] +extensions = [ + "myst_parser", + "sphinx.ext.autosectionlabel", +] templates_path = ['_templates'] exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - +# Make sure the target is unique +autosectionlabel_prefix_document = True # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output diff --git a/docs/index.rst b/docs/index.rst index fbc1397c..26e6fad7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -49,4 +49,5 @@ Index badorm/index badorm/quickstart + badorm/concepts badorm/functionalities \ No newline at end of file From 9ca0e8f7130f9d5ccf00122372956d1f3a135689 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Jul 2023 18:25:30 +0200 Subject: [PATCH 444/467] refactor unsafe + finish badorm docs --- badorm/ModuleFx.go | 68 ++---- badorm/crudRepository.go | 14 +- badorm/crudService.go | 11 +- badorm/operators.go | 4 +- badorm/query.go | 4 +- badorm/unsafe/ModuleFx.go | 57 +++++ .../crudRepository.go} | 38 ++-- .../crudService.go} | 23 +- controllers/crud.go | 11 +- controllers/crud_test.go | 19 +- docs/badctl/index.rst | 5 +- docs/badctl/installation.rst | 4 +- docs/badorm/advanced_query.rst | 209 ++++++++++++++++++ docs/badorm/concepts.rst | 66 +++++- docs/badorm/connecting_to_a_database.rst | 38 ++++ docs/badorm/crud.rst | 70 ++++++ docs/badorm/declaring_models.rst | 173 +++++++++++++++ docs/badorm/functionalities.rst | 51 ----- docs/badorm/index.rst | 29 +-- docs/badorm/preloading.rst | 171 ++++++++++++++ docs/badorm/query.rst | 184 +++++++++++++++ docs/badorm/quickstart.rst | 50 +++-- docs/index.rst | 10 +- mocks/badorm/CRUDRepository.go | 30 +-- mocks/badorm/CRUDService.go | 56 ++--- mocks/badorm/Condition.go | 28 +-- mocks/badorm/DynamicOperator.go | 82 +++++++ mocks/badorm/IJoinCondition.go | 42 ++-- mocks/badorm/Operator.go | 66 ++++++ mocks/badorm/WhereCondition.go | 66 +++--- mocks/badorm/iFieldIdentifier.go | 74 +++++++ .../CRUDRepository.go} | 14 +- .../CRUDService.go} | 14 +- router/ModuleFx.go | 3 +- services/sessionservice/session.go | 2 +- testintegration/badorm_test.go | 23 +- testintegration/crudRepository.go | 16 -- testintegration/join_conditions_test.go | 50 ++--- testintegration/operators_test.go | 138 ++++++------ testintegration/preload_conditions_test.go | 56 ++--- ...vice_test.go => unsafeCRUDService_test.go} | 37 ++-- testintegration/where_conditions_test.go | 82 +++---- 42 files changed, 1602 insertions(+), 586 deletions(-) create mode 100644 badorm/unsafe/ModuleFx.go rename badorm/{crudUnsafeRepository.go => unsafe/crudRepository.go} (87%) rename badorm/{crudUnsafeService.go => unsafe/crudService.go} (51%) create mode 100644 docs/badorm/advanced_query.rst create mode 100644 docs/badorm/connecting_to_a_database.rst create mode 100644 docs/badorm/crud.rst create mode 100644 docs/badorm/declaring_models.rst delete mode 100644 docs/badorm/functionalities.rst create mode 100644 docs/badorm/preloading.rst create mode 100644 docs/badorm/query.rst create mode 100644 mocks/badorm/DynamicOperator.go create mode 100644 mocks/badorm/Operator.go create mode 100644 mocks/badorm/iFieldIdentifier.go rename mocks/badorm/{CRUDUnsafeRepository.go => unsafe/CRUDRepository.go} (56%) rename mocks/badorm/{CRUDUnsafeService.go => unsafe/CRUDService.go} (55%) rename testintegration/{crudUnsafeService_test.go => unsafeCRUDService_test.go} (91%) diff --git a/badorm/ModuleFx.go b/badorm/ModuleFx.go index f46eef1f..fac0b24e 100644 --- a/badorm/ModuleFx.go +++ b/badorm/ModuleFx.go @@ -32,7 +32,7 @@ func GetCRUDServiceModule[T Model]() fx.Option { entity, ) - kind := getBaDORMModelKind(entity) + kind := GetBaDORMModelKind(entity) switch kind { case KindUUIDModel: return fx.Module( @@ -52,64 +52,26 @@ func GetCRUDServiceModule[T Model]() fx.Option { ) case KindNotBaDORMModel: log.Printf("type %T is not a BaDORM Module\n", entity) - return fx.Invoke(failNotBadORMModule()) + return fx.Invoke(FailNotBadORMModule()) } - return fx.Invoke(failNotBadORMModule()) + return fx.Invoke(FailNotBadORMModule()) } -func failNotBadORMModule() error { +func FailNotBadORMModule() error { return fmt.Errorf("type is not a BaDORM Module") } -func GetCRUDUnsafeServiceModule[T Model]() fx.Option { - entity := *new(T) - - moduleName := fmt.Sprintf( - "%TCRUDUnsafeServiceModule", - entity, - ) - - kind := getBaDORMModelKind(entity) - switch kind { - case KindUUIDModel: - return fx.Module( - moduleName, - // models - fx.Invoke(AddUnsafeModel[T]), - // repository - fx.Provide(NewCRUDUnsafeRepository[T, UUID]), - // service - fx.Provide(NewCRUDUnsafeService[T, UUID]), - ) - case KindUIntModel: - return fx.Module( - moduleName, - // models - fx.Invoke(AddUnsafeModel[T]), - // repository - fx.Provide(NewCRUDUnsafeRepository[T, UIntID]), - // service - fx.Provide(NewCRUDUnsafeService[T, UIntID]), - ) - case KindNotBaDORMModel: - log.Printf("type %T is not a BaDORM Module\n", entity) - return fx.Invoke(failNotBadORMModule()) - } - - return fx.Invoke(failNotBadORMModule()) -} - -type modelKind uint +type ModelKind uint const ( - KindUUIDModel modelKind = iota + KindUUIDModel ModelKind = iota KindUIntModel KindNotBaDORMModel ) -func getBaDORMModelKind(entity Model) modelKind { - entityType := getEntityType(entity) +func GetBaDORMModelKind(entity Model) ModelKind { + entityType := GetEntityType(entity) _, isUUIDModel := entityType.FieldByName("UUIDModel") if isUUIDModel { @@ -124,10 +86,14 @@ func getBaDORMModelKind(entity Model) modelKind { return KindNotBaDORMModel } -var modelsMapping = map[string]reflect.Type{} - -func AddUnsafeModel[T Model]() { - entity := *new(T) +// Get the reflect.Type of any entity or pointer to entity +func GetEntityType(entity any) reflect.Type { entityType := reflect.TypeOf(entity) - modelsMapping[entityType.Name()] = entityType + + // entityType will be a pointer if the relation can be nullable + if entityType.Kind() == reflect.Pointer { + entityType = entityType.Elem() + } + + return entityType } diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index f0b2e519..446b1801 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -16,8 +16,7 @@ type CRUDRepository[T Model, ID ModelID] interface { // read GetByID(tx *gorm.DB, id ID) (*T, error) Get(tx *gorm.DB, conditions ...Condition[T]) (*T, error) - GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) - GetAll(tx *gorm.DB) ([]*T, error) + Query(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) // update Save(tx *gorm.DB, entity *T) error // delete @@ -68,7 +67,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, er // Get an object that matches "conditions" inside transaction "tx" func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Condition[T]) (*T, error) { - entities, err := repository.GetMultiple(tx, conditions...) + entities, err := repository.Query(tx, conditions...) if err != nil { return nil, err } @@ -84,7 +83,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Cond } // Get the list of objects that match "conditions" inside transaction "tx" -func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { +func (repository *CRUDRepositoryImpl[T, ID]) Query(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { query, err := NewQuery(tx, conditions) if err != nil { return nil, err @@ -100,7 +99,7 @@ func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions // Get the name of the table in "db" in which the data for "entity" is saved // returns error is table name can not be found by gorm, // probably because the type of "entity" is not registered using AddModel -func getTableName(db *gorm.DB, entity any) (string, error) { +func GetTableName(db *gorm.DB, entity any) (string, error) { schemaName, err := schema.Parse(entity, &sync.Map{}, db.NamingStrategy) if err != nil { return "", err @@ -108,8 +107,3 @@ func getTableName(db *gorm.DB, entity any) (string, error) { return schemaName.Table, nil } - -// Get the list of objects of type T -func (repository *CRUDRepositoryImpl[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { - return repository.GetMultiple(tx) -} diff --git a/badorm/crudService.go b/badorm/crudService.go index 22b995db..009304a6 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -6,9 +6,8 @@ import ( // T can be any model whose identifier attribute is of type ID type CRUDService[T Model, ID ModelID] interface { - GetEntity(id ID) (*T, error) - // GetEntities(conditions map[string]any) ([]*T, error) - GetEntities(conditions ...Condition[T]) ([]*T, error) + GetByID(id ID) (*T, error) + Query(conditions ...Condition[T]) ([]*T, error) } // check interface compliance @@ -32,11 +31,11 @@ func NewCRUDService[T Model, ID ModelID]( } // Get the object of type T that has the "id" -func (service *crudServiceImpl[T, ID]) GetEntity(id ID) (*T, error) { +func (service *crudServiceImpl[T, ID]) GetByID(id ID) (*T, error) { return service.repository.GetByID(service.db, id) } // Get entities of type T that match all "conditions" -func (service *crudServiceImpl[T, ID]) GetEntities(conditions ...Condition[T]) ([]*T, error) { - return service.repository.GetMultiple(service.db, conditions...) +func (service *crudServiceImpl[T, ID]) Query(conditions ...Condition[T]) ([]*T, error) { + return service.repository.Query(service.db, conditions...) } diff --git a/badorm/operators.go b/badorm/operators.go index 20341c2c..e62119cc 100644 --- a/badorm/operators.go +++ b/badorm/operators.go @@ -143,12 +143,12 @@ func IsNotNull[T any]() PredicateOperator[T] { return NewPredicateOperator[T]("IS NOT NULL") } -// Equivalent to v1 < value < v2 +// Equivalent to v1 < attribute < v2 func Between[T any](v1 T, v2 T) Operator[T] { return NewMultivalueOperator(badormSQL.Between, badormSQL.And, "", "", v1, v2) } -// Equivalent to NOT (v1 < value < v2) +// Equivalent to NOT (v1 < attribute < v2) func NotBetween[T any](v1 T, v2 T) Operator[T] { return NewMultivalueOperator(badormSQL.NotBetween, badormSQL.And, "", "", v1, v2) } diff --git a/badorm/query.go b/badorm/query.go index 3ac11839..0d96030f 100644 --- a/badorm/query.go +++ b/badorm/query.go @@ -21,7 +21,7 @@ func (t Table) IsInitial() bool { // Returns the related Table corresponding to the model func (t Table) DeliverTable(query *Query, model Model, relationName string) (Table, error) { // get the name of the table for the model - tableName, err := getTableName(query.gormDB, model) + tableName, err := GetTableName(query.gormDB, model) if err != nil { return Table{}, err } @@ -139,7 +139,7 @@ func (query Query) ColumnName(table Table, fieldName string) string { func NewQuery[T Model](db *gorm.DB, conditions []Condition[T]) (*Query, error) { model := *new(T) - initialTableName, err := getTableName(db, model) + initialTableName, err := GetTableName(db, model) if err != nil { return nil, err } diff --git a/badorm/unsafe/ModuleFx.go b/badorm/unsafe/ModuleFx.go new file mode 100644 index 00000000..ab1a6476 --- /dev/null +++ b/badorm/unsafe/ModuleFx.go @@ -0,0 +1,57 @@ +package unsafe + +import ( + "fmt" + "log" + "reflect" + + "go.uber.org/fx" + + "github.com/ditrit/badaas/badorm" +) + +func GetCRUDServiceModule[T badorm.Model]() fx.Option { + entity := *new(T) + + moduleName := fmt.Sprintf( + "unsafe.%TCRUDServiceModule", + entity, + ) + + kind := badorm.GetBaDORMModelKind(entity) + switch kind { + case badorm.KindUUIDModel: + return fx.Module( + moduleName, + // models + fx.Invoke(addUnsafeModel[T]), + // repository + fx.Provide(NewCRUDRepository[T, badorm.UUID]), + // service + fx.Provide(NewCRUDUnsafeService[T, badorm.UUID]), + ) + case badorm.KindUIntModel: + return fx.Module( + moduleName, + // models + fx.Invoke(addUnsafeModel[T]), + // repository + fx.Provide(NewCRUDRepository[T, badorm.UIntID]), + // service + fx.Provide(NewCRUDUnsafeService[T, badorm.UIntID]), + ) + case badorm.KindNotBaDORMModel: + log.Printf("type %T is not a BaDORM Module\n", entity) + return fx.Invoke(badorm.FailNotBadORMModule()) + } + + return fx.Invoke(badorm.FailNotBadORMModule()) +} + +var modelsMapping = map[string]reflect.Type{} + +func addUnsafeModel[T badorm.Model]() { + entity := *new(T) + entityType := reflect.TypeOf(entity) + modelsMapping[entityType.Name()] = entityType +} diff --git a/badorm/crudUnsafeRepository.go b/badorm/unsafe/crudRepository.go similarity index 87% rename from badorm/crudUnsafeRepository.go rename to badorm/unsafe/crudRepository.go index dfabf3ac..54ebcb19 100644 --- a/badorm/crudUnsafeRepository.go +++ b/badorm/unsafe/crudRepository.go @@ -1,15 +1,17 @@ -package badorm +package unsafe import ( "fmt" "reflect" "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" ) // Generic CRUD Repository // T can be any model whose identifier attribute is of type ID -type CRUDUnsafeRepository[T Model, ID ModelID] interface { +type CRUDRepository[T badorm.Model, ID badorm.ModelID] interface { GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) } @@ -26,20 +28,20 @@ var ( ) // Implementation of the Generic CRUD Repository -type CRUDUnsafeRepositoryImpl[T Model, ID ModelID] struct { - CRUDUnsafeRepository[T, ID] +type CRUDRepositoryImpl[T badorm.Model, ID badorm.ModelID] struct { + CRUDRepository[T, ID] } // Constructor of the Generic CRUD Repository -func NewCRUDUnsafeRepository[T Model, ID ModelID]() CRUDUnsafeRepository[T, ID] { - return &CRUDUnsafeRepositoryImpl[T, ID]{} +func NewCRUDRepository[T badorm.Model, ID badorm.ModelID]() CRUDRepository[T, ID] { + return &CRUDRepositoryImpl[T, ID]{} } // Get the list of objects that match "conditions" inside transaction "tx" // "conditions" is in {"attributeName": expectedValue} format // in case of join "conditions" can have the format: // {"relationAttributeName": {"attributeName": expectedValue}} -func (repository *CRUDUnsafeRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) { +func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) { thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) if err != nil { return nil, err @@ -53,7 +55,7 @@ func (repository *CRUDUnsafeRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, cond for joinAttributeName, joinConditions := range joinConditions { var tableName string - tableName, err = getTableName(tx, entity) + tableName, err = badorm.GetTableName(tx, entity) if err != nil { return nil, err } @@ -83,7 +85,7 @@ func (repository *CRUDUnsafeRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, cond // "conditions" is in {"attributeName": expectedValue} format // "previousEntity" is a pointer to a object from where we navigate the relationship // "previousTableName" is the name of the table where the previous object is saved and from we the join will we done -func (repository *CRUDUnsafeRepositoryImpl[T, ID]) addJoinToQuery( +func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( query *gorm.DB, previousEntity any, previousTableName, joinAttributeName string, conditions map[string]any, @@ -101,7 +103,7 @@ func (repository *CRUDUnsafeRepositoryImpl[T, ID]) addJoinToQuery( return err } - joinTableName, err := getTableName(query, relatedObject) + joinTableName, err := badorm.GetTableName(query, relatedObject) if err != nil { return err } @@ -184,7 +186,7 @@ func divideConditionsByEntity( for attributeName, expectedValue := range conditions { switch typedExpectedValue := expectedValue.(type) { case string: - uuid, err := ParseUUID(typedExpectedValue) + uuid, err := badorm.ParseUUID(typedExpectedValue) if err == nil { thisEntityConditions[attributeName] = uuid } else { @@ -207,7 +209,7 @@ func divideConditionsByEntity( // in the database is in the "entity"'s table. // Returns error if "entity" not a relation called "relationName". func getRelatedObject(entity any, relationName string) (any, bool, error) { - entityType := getEntityType(entity) + entityType := badorm.GetEntityType(entity) field, isPresent := entityType.FieldByName(relationName) if !isPresent { @@ -225,18 +227,6 @@ func getRelatedObject(entity any, relationName string) (any, bool, error) { return createObject(field.Type), isIDPresent, nil } -// Get the reflect.Type of any entity or pointer to entity -func getEntityType(entity any) reflect.Type { - entityType := reflect.TypeOf(entity) - - // entityType will be a pointer if the relation can be nullable - if entityType.Kind() == reflect.Pointer { - entityType = entityType.Elem() - } - - return entityType -} - // Returns an object of the type of the "entity" attribute called "relationName" + "ID" // Returns error if "entity" not a relation called "relationName" + "ID" func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, error) { diff --git a/badorm/crudUnsafeService.go b/badorm/unsafe/crudService.go similarity index 51% rename from badorm/crudUnsafeService.go rename to badorm/unsafe/crudService.go index 8d9d8928..bd708fad 100644 --- a/badorm/crudUnsafeService.go +++ b/badorm/unsafe/crudService.go @@ -1,29 +1,30 @@ -package badorm +package unsafe import ( "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" ) // T can be any model whose identifier attribute is of type ID -type CRUDUnsafeService[T Model, ID ModelID] interface { +type CRUDService[T badorm.Model, ID badorm.ModelID] interface { GetEntities(conditions map[string]any) ([]*T, error) } // check interface compliance -var _ CRUDUnsafeService[UUIDModel, UUID] = (*crudUnsafeServiceImpl[UUIDModel, UUID])(nil) +var _ CRUDService[badorm.UUIDModel, badorm.UUID] = (*crudServiceImpl[badorm.UUIDModel, badorm.UUID])(nil) // Implementation of the CRUD Service -type crudUnsafeServiceImpl[T Model, ID ModelID] struct { - CRUDService[T, ID] +type crudServiceImpl[T badorm.Model, ID badorm.ModelID] struct { db *gorm.DB - repository CRUDUnsafeRepository[T, ID] + repository CRUDRepository[T, ID] } -func NewCRUDUnsafeService[T Model, ID ModelID]( +func NewCRUDUnsafeService[T badorm.Model, ID badorm.ModelID]( db *gorm.DB, - repository CRUDUnsafeRepository[T, ID], -) CRUDUnsafeService[T, ID] { - return &crudUnsafeServiceImpl[T, ID]{ + repository CRUDRepository[T, ID], +) CRUDService[T, ID] { + return &crudServiceImpl[T, ID]{ db: db, repository: repository, } @@ -33,6 +34,6 @@ func NewCRUDUnsafeService[T Model, ID ModelID]( // "params" is in {"attributeName": expectedValue} format // in case of join "params" can have the format: // {"relationAttributeName": {"attributeName": expectedValue}} -func (service *crudUnsafeServiceImpl[T, ID]) GetEntities(conditions map[string]any) ([]*T, error) { +func (service *crudServiceImpl[T, ID]) GetEntities(conditions map[string]any) ([]*T, error) { return service.repository.GetMultiple(service.db, conditions) } diff --git a/controllers/crud.go b/controllers/crud.go index 0f1de812..d35ff3e3 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -9,6 +9,7 @@ import ( "go.uber.org/zap" "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/unsafe" "github.com/ditrit/badaas/httperrors" "github.com/ditrit/badaas/persistence/models" ) @@ -29,7 +30,7 @@ type CRUDRoute struct { func NewCRUDController[T badorm.Model]( logger *zap.Logger, crudService badorm.CRUDService[T, badorm.UUID], - crudUnsafeService badorm.CRUDUnsafeService[T, badorm.UUID], + unsafeCRUDService unsafe.CRUDService[T, badorm.UUID], ) CRUDRoute { fullTypeName := strings.ToLower(fmt.Sprintf("%T", *new(T))) // remove the package name of the type @@ -40,7 +41,7 @@ func NewCRUDController[T badorm.Model]( Controller: &crudControllerImpl[T]{ logger: logger, crudService: crudService, - crudUnsafeService: crudUnsafeService, + unsafeCRUDService: unsafeCRUDService, }, } } @@ -49,7 +50,7 @@ func NewCRUDController[T badorm.Model]( type crudControllerImpl[T badorm.Model] struct { logger *zap.Logger crudService badorm.CRUDService[T, badorm.UUID] - crudUnsafeService badorm.CRUDUnsafeService[T, badorm.UUID] + unsafeCRUDService unsafe.CRUDService[T, badorm.UUID] } // The handler responsible of the retrieval of one object @@ -59,7 +60,7 @@ func (controller *crudControllerImpl[T]) GetObject(_ http.ResponseWriter, r *htt return nil, herr } - entity, err := controller.crudService.GetEntity(entityID) + entity, err := controller.crudService.GetByID(entityID) return entity, mapServiceError(err) } @@ -71,7 +72,7 @@ func (controller *crudControllerImpl[T]) GetObjects(_ http.ResponseWriter, r *ht return nil, herr } - entities, err := controller.crudUnsafeService.GetEntities(params) + entities, err := controller.unsafeCRUDService.GetEntities(params) return entities, mapServiceError(err) } diff --git a/controllers/crud_test.go b/controllers/crud_test.go index 4007b812..a290532f 100644 --- a/controllers/crud_test.go +++ b/controllers/crud_test.go @@ -14,6 +14,7 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/controllers" mockBadorm "github.com/ditrit/badaas/mocks/badorm" + mockUnsafe "github.com/ditrit/badaas/mocks/badorm/unsafe" ) // ----------------------- GetObject ----------------------- @@ -24,7 +25,7 @@ type Model struct { func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) + crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) route := controllers.NewCRUDController[Model]( logger, @@ -44,7 +45,7 @@ func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { func TestCRUDGetWithEntityIDNotUUIDReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) + crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) route := controllers.NewCRUDController[Model]( logger, @@ -65,7 +66,7 @@ func TestCRUDGetWithEntityIDNotUUIDReturnsError(t *testing.T) { func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) + crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) uuid := badorm.NewUUID() @@ -93,7 +94,7 @@ func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) + crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) uuid := badorm.NewUUID() @@ -121,7 +122,7 @@ func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) + crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) uuid := badorm.NewUUID() entity := Model{} @@ -152,7 +153,7 @@ func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) + crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) crudUnsafeService. On("GetEntities", map[string]any{}). @@ -176,7 +177,7 @@ func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { func TestGetEntitiesWithoutParams(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) + crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) entity1 := &Model{} entity2 := &Model{} @@ -206,7 +207,7 @@ func TestGetEntitiesWithoutParams(t *testing.T) { func TestGetEntitiesWithParams(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) + crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) entity1 := &Model{} @@ -234,7 +235,7 @@ func TestGetEntitiesWithParams(t *testing.T) { func TestGetEntitiesWithParamsNotJsonReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockBadorm.NewCRUDUnsafeService[Model, badorm.UUID](t) + crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) route := controllers.NewCRUDController[Model]( logger, diff --git a/docs/badctl/index.rst b/docs/badctl/index.rst index d72ee03a..bbcdabe8 100644 --- a/docs/badctl/index.rst +++ b/docs/badctl/index.rst @@ -1,5 +1,6 @@ ============================== -BaDctl |version| +Introduction ============================== -`badctl` is the command line tool that makes it possible to configure and run your BaDaaS applications easily. +`badctl` is the command line tool that makes it possible to configure +and run your BaDaaS applications easily. diff --git a/docs/badctl/installation.rst b/docs/badctl/installation.rst index f01805d9..f2993a7b 100644 --- a/docs/badctl/installation.rst +++ b/docs/badctl/installation.rst @@ -5,7 +5,9 @@ Installation Install with go install ----------------------------------- -For simply installing it, use:: +For simply installing it, use + +.. code-block:: bash go install github.com/ditrit/badaas/tools/badctl diff --git a/docs/badorm/advanced_query.rst b/docs/badorm/advanced_query.rst new file mode 100644 index 00000000..26bafc82 --- /dev/null +++ b/docs/badorm/advanced_query.rst @@ -0,0 +1,209 @@ +============================== +Advanced query +============================== + +Dynamic operators +-------------------------------- + +In :doc:`/badorm/query` we have seen how to use the operators +to make comparisons between the attributes of a model and static values such as a string, +a number, etc. But if we want to make comparisons between two or more attributes of +the same type we need to use the dynamic operators. +These, instead of a dynamic value, receive a FieldIdentifier, that is, +an object that identifies the attribute with which the operation is to be performed. + +These identifiers are also generated during the generation of conditions and +their name of these FieldIdentifiers will be Field where + is the model type and is the attribute name. + +For example we query all YourModels that has the same value in its String attribute that +its related Related's String attribute. + +.. code-block:: go + + type Related struct { + badorm.UUIDModel + + String string + } + + type YourModel struct { + badorm.UUIDModel + + String string + + Related Related + RelatedID badorm.UUID + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelRelated( + conditions.RelatedString( + dynamic.Eq(conditions.YourModelStringField), + ), + ), + ) + +**Attention**, when using dynamic operators the verification that the FieldIdentifier +is concerned by the query is performed at run time, returning an error otherwise. +For example: + +.. code-block:: go + + type Related struct { + badorm.UUIDModel + + String string + } + + type YourModel struct { + badorm.UUIDModel + + String string + + Related Related + RelatedID badorm.UUID + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelString( + dynamic.Eq(conditions.RelatedStringField), + ), + ) + +will respond badorm.ErrFieldModelNotConcerned in err. + +All operators supported by BaDORM that receive any value are available in their dynamic version at +. +In turn, there are dynamic versions of the operators specific to each database that can be found at + and +. + +Select join +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In case the attribute to be used by the dynamic operator is present more +than once in the query, it will be necessary to select the join to be used, +to avoid getting the error badorm.ErrJoinMustBeSelected. +To do this, you must use the SelectJoin method, as in the following example: + +.. code-block:: go + + type ParentParent struct { + badorm.UUIDModel + } + + type Parent1 struct { + badorm.UUIDModel + + ParentParent ParentParent + ParentParentID badorm.UUID + } + + type Parent2 struct { + badorm.UUIDModel + + ParentParent ParentParent + ParentParentID badorm.UUID + } + + type Child struct { + badorm.UUIDModel + + Parent1 Parent1 + Parent1ID badorm.UUID + + Parent2 Parent2 + Parent2ID badorm.UUID + } + + models, err := ts.crudChildService.Query( + conditions.ChildParent1( + conditions.Parent1ParentParent(), + ), + conditions.ChildParent2( + conditions.Parent2ParentParent(), + ), + conditions.ChildName( + // for the value 0 (conditions.ParentParentNameField), + // choose the first (0) join (made by conditions.ChildParent1()) + dynamic.Eq(conditions.ParentParentNameField).SelectJoin(0, 0), + ), + ) + +Multitype operators +---------------------------- + +To make as many checks as possible at compile time to avoid run-time errors, +the dynamic operators only accept FieldIdentifiers that are of the same type as the condition attribute. +But there are cases in which we want to make this limitation more flexible, +either because we want to compare attributes of :ref:`nullable ` +and non-nullable type or because the operator accepts multiple values and we want +to combine both static and dynamic values, as in the following example: + +.. code-block:: go + + type YourModel struct { + badorm.UUIDModel + + Int int + NullableInt sql.NullInt32 + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelInt( + multitype.Between(1, conditions.YourModelNullableIntField), + ), + ) + +In case the type of any of the operator parameters is not related to the type of the condition's attribute, +err will be multitype.ErrFieldTypeDoesNotMatch. + +All operators supported by BaDORM that receive any value are available in their multitype version at +. +In turn, there are multitype versions of the operators specific to each database that can be found at + and +. + +Unsafe operators +-------------------------------- + +With multitype operators we add more flexibility to the operators at the cost of more validations +to be performed at runtime. +However, BaDORM will validate that the types of the values to be used inside the operator +are the same or related. + +In case you want to avoid this validation, unsafe operators should be used. +Although their use is not recommended, this can be useful when the database +used allows operations between different types or when attributes of different +types map at the same time in the database (see ). + +If it is neither of these two cases, the use of an unsafe operator will result in +an error in the execution of the query that depends on the database used. + +All operators supported by BaDORM that receive any value are available in their unsafe version at +. +In turn, there are unsafe versions of the operators specific to each database that can be found at + and +. + +Unsafe conditions (raw SQL) +-------------------------------- + +In case you need to use operators that are not supported by BaDORM +(please create an issue in our repository if you think we have forgotten any), +you can always run raw SQL with unsafe.NewCondition, as in the following example: + +.. code-block:: go + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelString( + unsafe.NewCondition[models.YourModel]("%s.name = NULL"), + ), + ) + +As you can see in the example, "%s" can be used in the raw SQL to be replaced +by the table name of the model to which the condition belongs. + +Of course, its use is not recommended because it can generate errors in the execution +of the query that will depend on the database used. \ No newline at end of file diff --git a/docs/badorm/concepts.rst b/docs/badorm/concepts.rst index 1271ebfd..5eefaf77 100644 --- a/docs/badorm/concepts.rst +++ b/docs/badorm/concepts.rst @@ -9,32 +9,41 @@ A model is any object (struct) of go that you want to persist in the database and on which you can perform queries. For this, the struct must have an embedded BaDORM base model. -BaDORM base model +For details visit :ref:`badorm/declaring_models:model declaration`. + +Base model ----------------------------- It is a struct that when embedded allows your structures to become BadORM models, adding attributes ID, CreatedAt, UpdatedAt and DeletedAt attributes and the possibility to persist, create conditions and perform queries on these structures. +For details visit :ref:`badorm/declaring_models:base models`. + Model ID ----------------------------- The id is a unique identifier needed to persist a model in the database. -It can be an auto-incremental uint or a badorm.uuid, depending on the base model used. +It can be a badorm.UIntID or a badorm.UUID, depending on the base model used. + +For details visit :ref:`badorm/declaring_models:base models`. Auto Migration ---------------------------------------------------------- To persist the models it is necessary to migrate the database, so that the structure of the tables corresponds to the definition of the model. -This migration is performed by gorm through the gormDB. -For details visit `gorm docs `_ +This migration is performed by gorm through the gormDB. + +For details visit :ref:`badorm/connecting_to_a_database:migration`. GormDB ----------------------------- GormDB is a gorm.DB object that allows communication with the database. +For details visit :ref:`badorm/connecting_to_a_database:connection`. + Condition ----------------------------- @@ -42,18 +51,24 @@ Conditions are the basis of the BaDORM query system, every query is composed of Conditions belong to a particular model and there are 4 different types: WhereConditions, ConnectionConditions, JoinConditions and PreloadConditions. +For details visit :doc:`/badorm/query`. + WhereCondition ----------------------------- Type of condition that allows filters to be made on the model to which they belong and an attribute of this model. These filters are performed through operators. +For details visit :doc:`/badorm/query`. + ConnectionCondition ----------------------------- Type of condition that allows the use of logical operators (and, or, or, not) between WhereConditions. +For details visit :doc:`/badorm/query`. + JoinCondition ----------------------------- @@ -62,12 +77,16 @@ which will result in a join in the executed query (don't worry, if you don't know what a join is, you don't need to understand the queries that badorm executes). +For details visit :doc:`/badorm/query`. + PreloadCondition ----------------------------- Type of condition that allows retrieving information from a model as a result of the database (preload). This information can be all its attributes and/or another model that is related to it. +For details visit :doc:`/badorm/preloading`. + Operator ----------------------------- @@ -77,24 +96,43 @@ such as comparisons, predicates, pattern matching, etc. Operators can be classified as static, dynamic, multitype and unsafe. +For details visit :doc:`/badorm/query`. + Static operator ----------------------------- Static operators are those that perform operations on an attribute and static values, such as a boolean value, an integer, etc. +For details visit :doc:`/badorm/query`. + Dynamic operator ----------------------------- Dynamic operators are those that perform operations between an attribute and other attributes, either from the same model or from a different model, as long as the type of these attributes is the same. +For details visit :doc:`/badorm/advanced_query`. + Multitype operator ----------------------------- Multitype operators are those that can perform operations between an attribute and static values or other attributes at the same time and, in addition, -these values and attributes can be of a type related to the type of the attribute. +these values and attributes can be of a type related to the type of the attribute +(nullable and not nullable types of the attribute). + +For details visit :doc:`/badorm/advanced_query`. + +Nullable types +----------------------------- + +Nullable types are the types provided by the sql library +that are a nullable version of the basic types: +sql.NullString, sql.NullTime, sql.NullInt64, sql.NullInt32, +sql.NullBool, sql.NullFloat64, etc.. + +For details visit . Unsafe operator ----------------------------- @@ -102,12 +140,16 @@ Unsafe operator Unsafe operators are those that can perform operations between an attribute and any type of value or attribute. +For details visit :doc:`/badorm/advanced_query`. + Database specific operator ----------------------------- Since not all SQL databases support the same set of operators, there are operators that only work for a specific database. +For details visit :doc:`/badorm/advanced_query`. + CRUDService ----------------------------- @@ -115,6 +157,8 @@ A CrudService is a service that allows us to perform CRUD (create, read, update operations on a specific model, executing all the necessary operations within a transaction. Internally they use the CRUDRepository of that model. +For details visit :ref:`badorm/crud:CRUDServices and CRUDRepositories`. + CRUDRepository ----------------------------- @@ -124,6 +168,8 @@ by parameter. This is useful to be able to define services that perform multiple CRUD operations within the same transaction. +For details visit :ref:`badorm/crud:CRUDServices and CRUDRepositories`. + Compilable query system ----------------------------- @@ -131,12 +177,16 @@ The set of conditions that are received by the read operations of the CRUDServic and CRUDRepository form the BaDORM compilable query system. It is so named because the conditions will verify at compile time that the query to be executed is correct. +For details visit :ref:`badorm/query:compilable query system`. + Conditions generation ---------------------------- Conditions are the basis of the compilable query system. They are generated for each model and attribute and can then be used. -Their generation is done with BaDctl. +Their generation is done with badctl. + +For details visit :ref:`badorm/query:Conditions generation`. Dependency injection ----------------------------------- @@ -151,4 +201,6 @@ Relation getter Relationships between objects can be loaded from the database using PreloadConditions. In order to safely navigate the relations in the loaded model BaDORM provides methods -called "relation getters". \ No newline at end of file +called "relation getters". + +For details visit :doc:`/badorm/preloading`. \ No newline at end of file diff --git a/docs/badorm/connecting_to_a_database.rst b/docs/badorm/connecting_to_a_database.rst new file mode 100644 index 00000000..5c8e0413 --- /dev/null +++ b/docs/badorm/connecting_to_a_database.rst @@ -0,0 +1,38 @@ +============================== +Connecting to a database +============================== + +Connection +----------------------------- + +BaDORM supports the databases MySQL, PostgreSQL, SQLite, SQL Server using gorm's driver. +Some databases may be compatible with the mysql or postgres dialect, +in which case you could just use the dialect for those databases (from which CockroachDB is tested). + +To communicate with the database BaDORM need a :ref:`GormDB ` object, +that can be created by following `gorm documentation `_. + +BaDORM also offers the `badorm.ConnectToDialector` method that will allow you to connect to a database +using the specified dialector with retrying. +It also configures the `gorm's logger `_ to work with +`zap logger `_. + +.. TODO verificar esto del logger si no es mejorable, y tambien en el ejemplo no haga falta el logger este. + +When using BaDORM with `fx` as :ref:`dependency injector ` you +will need to provide (`fx.Provide`) a function that returns a `*gorm.DB`. + +Migration +---------------------------- + +Migration is done by gorm using the `gormDB.AutoMigrate` method. +For details visit `gorm docs `_. + +When using BaDORM with `fx` as :ref:`dependency injector ` +this method can't be called directly. In that case, BaDORM will execute the migration by providing +`badorm.BaDORMModule` to fx. For this to work, you will need to provide also a method that returns +`badorm.GetModelsResult` with the models you want to include in the migration. +Remember that the order in this list is important for gorm to be able to execute the migration. + + + diff --git a/docs/badorm/crud.rst b/docs/badorm/crud.rst new file mode 100644 index 00000000..ef04946f --- /dev/null +++ b/docs/badorm/crud.rst @@ -0,0 +1,70 @@ +============================== +CRUD Operations +============================== + +CRUDServices and CRUDRepositories +-------------------------------------- + +CRUD operations are made to your models via the CRUDServices and CRUDRepositories. +The difference between them is that a CRUDService will execute this operations within a transaction +while the CRUDRepository will be executed within a transaction received by parameter, +thus allowing defining services that perform multiple CRUD operations within the same transaction. + +Create, Save and Delete methods are just hooks to the gorm's corresponding methods. +For details visit +, and . +On the other hand, read (query) operations are provided by BaDORM via its +:ref:`compilable query system ` +(see how in :doc:`/badorm/query`). + +Each pair of CRUDService and CRUDRepository corresponds to a model. To create them you must use +the `badorm.GetCRUD[, ](gormDB)` where +`` is the type of your :ref:`model `, +`` is the type of your :ref:`model's id ` +and `gormDB` is the :ref:`GormDB ` object. + +When using BaDORM with `fx` as :ref:`dependency injector ` you +will need to provide to fx `badorm.GetCRUDServiceModule[]()` +where `` is the type of your :ref:`model `. +After that the following can be used by dependency injection: + +- `crudYourModelService badorm.CRUDService[, ]` +- `crudYourModelRepository badorm.CRUDRepository[, ]` + +For example: + +.. code-block:: go + + + type YourModel struct { + badorm.UUIDModel + } + + func main() { + fx.New( + // activate BaDORM + fx.Provide(NewGormDBConnection), + fx.Provide(GetModels), + badorm.BaDORMModule, + + badorm.GetCRUDServiceModule[YourModel](), + fx.Invoke(QueryCRUDObjects), + ).Run() + } + + func QueryCRUDObjects(crudYourModelService badorm.CRUDService[YourModel, badorm.UUID]) { + // use crudYourModelService + } + +unsafe.CRUDService and unsafe.CRUDRepository +---------------------------------------------------- + +There is another version of the CRUDService and CRUDRepository found in +unsafe.CRUDService and unsafe.CRUDRepository respectively. +This version is not part of the compilable query system but allows to perform +queries through maps built on runtime (hence the name unsafe). + +**Its direct use is not recommended**, since using the compilable query system we can make +sure that the query is correct at compile time, while here errors will happen at runtime in +case your condition map is not well structured. +This functionality is used internally by BaDaaS to provide an HTTP api for queries. \ No newline at end of file diff --git a/docs/badorm/declaring_models.rst b/docs/badorm/declaring_models.rst new file mode 100644 index 00000000..16f42a34 --- /dev/null +++ b/docs/badorm/declaring_models.rst @@ -0,0 +1,173 @@ +============================== +Declaring models +============================== + +Model declaration +----------------------- + +The BaDORM :ref:`model ` declaration is based on the GORM model declaration, +so its definition, conventions, tags and associations are compatible with BaDORM. +For details see `gorm documentation `_. +On the contrary, BaDORM presents some differences/extras that are explained in this section. + +Base models +----------------------- + +To be considered a model, your structures must have embedded one of the +:ref:`base models ` provided by BaDORM: + +- `badorm.UUIDModel`: Model identified by a badorm.UUID (Random (Version 4) UUID). +- `badorm.UIntModel`: Model identified by a badorm.UIntID (auto-incremental uint). + +Both base models provide date created, updated and `deleted `_. + +To use them, simply embed the desired model in any of your structs: + +.. code-block:: go + + type MyModel struct { + badorm.UUIDModel + + Name string + Email *string + Age uint8 + Birthday *time.Time + MemberNumber sql.NullString + ActivatedAt sql.NullTime + // ... + } + +Type of attributes +----------------------- + +As we can see in the example in the previous section, +the attributes of your models can be of multiple types, +such as basic go types, pointers, and :ref:`nullable types `. + +This difference can generate differences in the information that is stored in the database, +since saving a model created as follows: + +.. code-block:: go + + MyModel{} + +will save a empty string for Name but a null for the Email and the MemberNumber. + +The use of nullable types is strongly recommended and BaDORM takes into account +their use in each of its functionalities. + +Associations +----------------------- + +All associations provided by GORM are supported. +For more information see , +, and +. +However, in this section we will give some differences in BaDORM and +details that are not clear in this documentation. + +IDs +^^^^^^^^^^^^^^^^^^^^^ + +Since BaDORM base models use badorm.UUID or badorm.UIntID to identify the models, +the type of id used in a reference to another model is the corresponding one of these two, +for example: + +.. code-block:: go + + type ModelWithUUID struct { + badorm.UUIDModel + } + + type ModelWithUIntID struct { + badorm.UIntModel + } + + type ModelWithReferences struct { + badorm.UUIDModel + + ModelWithUUID *ModelWithUUID + ModelWithUUIDID *badorm.UUID + + ModelWithUIntID *ModelWithUIntID + ModelWithUIntIDID *badorm.UIntID + } + +References +^^^^^^^^^^^^^^^^^^^^^ + +References to other models can be made with or without pointers: + +.. code-block:: go + + type ReferencedModel struct { + badorm.UUIDModel + } + + type ModelWithPointer struct { + badorm.UUIDModel + + // reference with pointer + PointerReference *ReferencedModel + PointerReferenceID *badorm.UUID + } + + type ModelWithoutPointer struct { + badorm.UUIDModel + + // reference without pointer + Reference ReferencedModel + ReferenceID badorm.UUID + } + +As in the case of attributes, +this can make a difference when persisting, since one created as follows: + +.. code-block:: go + + ModelWithoutPointer{} + +will also create and save an empty ReferencedModel{}, what may be undesired behavior. +For this reason, although both options are still compatible with BaDORM, +we recommend the use of pointers for references. +In case the relation is not nullable, use the `not null` tag in the id of the reference, for example: + +.. code-block:: go + + type ReferencedModel struct { + badorm.UUIDModel + } + + type ModelWithPointer struct { + badorm.UUIDModel + + // reference with pointer not null + PointerReference *ReferencedModel + PointerReferenceID *badorm.UUID `gorm:"not null"` + } + +Reverse reference +------------------------------------ + +Although no example within the `gorm's documentation `_ shows it, +when defining relations, we can also put a reference in the reverse direction +to add navigability to our model. +In addition, adding this reverse reference will allow the corresponding conditions +to be generated during condition generation. + +For example: + +.. code-block:: go + + type Related struct { + badorm.UUIDModel + + YourModel *YourModel + } + + type YourModel struct { + badorm.UUIDModel + + Related *Related + RelatedID *badorm.UUID + } \ No newline at end of file diff --git a/docs/badorm/functionalities.rst b/docs/badorm/functionalities.rst deleted file mode 100644 index 6f0699a7..00000000 --- a/docs/badorm/functionalities.rst +++ /dev/null @@ -1,51 +0,0 @@ -============================== -Functionalities -============================== - -Base models ------------------------ - -BaDORM gives you two types of base models for your classes: `badorm.UUIDModel` and `badorm.UIntModel`. - -To use them, simply embed the desired model in any of your classes:: - - type MyClass struct { - badorm.UUIDModel - - // your code here - } - -Once done your class will be considered a **BaDORM Model**. - -The difference between them is the type they will use as primary key: -a random uuid and an auto incremental uint respectively. -Both provide date created, edited and deleted (). - -CRUDServiceModule ------------------------ - -`CRUDServiceModule` provides you a CRUDService and a CRUDRepository for your BaDORM Model. -After calling it as, for example, `badorm.GetCRUDServiceModule[models.Company](),` -the following can be used by dependency injection: - -- `crudCompanyService badorm.CRUDService[models.Company, uuid.UUID]` -- `crudCompanyRepository badorm.CRUDRepository[models.Company, uuid.UUID]` - -These classes will allow you to perform queries using the compilable query system generated with BaDctl. -For details on how to do this visit :doc:`/badctl/commands` - -CRUDUnsafeServiceModule ------------------------ - -`CRUDUnsafeServiceModule` provides you a CRUDUnsafeService and a CRUDUnsafeRepository for your BaDORM Model. -After calling it as, for example, `badorm.GetCRUDUnsafeServiceModule[models.Company](),` -the following can be used by dependency injection: - -- `crudCompanyService badorm.CRUDUnsafeService[models.Company, uuid.UUID]` -- `crudCompanyRepository badorm.CRUDUnsafeRepository[models.Company, uuid.UUID]` - -These classes will allow you to perform queries using maps as conditions. -**Its direct use is not recommended**, since using the compilable query system we can make -sure that the query is correct at compile time, while here errors will happen at runtime in -case your condition map is not well structured. -This functionality is used internally by BaDaaS to provide an http api for queries. \ No newline at end of file diff --git a/docs/badorm/index.rst b/docs/badorm/index.rst index 512190eb..3aa93dd8 100644 --- a/docs/badorm/index.rst +++ b/docs/badorm/index.rst @@ -1,5 +1,5 @@ ============================== -BaDORM |version| +Introduction ============================== BaDORM stands for Backend and Distribution ORM (Object Relational Mapping). @@ -33,29 +33,4 @@ BaDORM seeks to address these limitations with a query system that: the query system avoids as much as possible the use of reflection and aims that all the necessary model data can be retrieved in a single query to the database. -To quickly see how BaDORM can be used you can read the :doc:`quickstart`. - -.. TODO -.. conceptos -.. model -.. service -.. repositorio -.. transaccion -.. conditions: dynamic, multitype, unsafe -.. operators -.. stand-alone: stand-alone (otra vez?) y con fx -.. migracion -.. gorm tags -.. mysql, sqlserver, etc -.. preloading -.. coneccion a la base de datos -.. errores? -.. uuid - -.. definicion del modelo: gorm, gorm tags, base models, uuid, relaciones, punteros, etc -.. persistencia: getModels y automigracion -.. connecion a la base de datos, bases de datos soportadas -.. Generacion de condiciones -.. Creacion de los servicios y repositorios -.. utilizacion de las condiciones y operadores -.. preloading y getters +To quickly see how BaDORM can be used you can read the :doc:`quickstart`. \ No newline at end of file diff --git a/docs/badorm/preloading.rst b/docs/badorm/preloading.rst new file mode 100644 index 00000000..605c20fc --- /dev/null +++ b/docs/badorm/preloading.rst @@ -0,0 +1,171 @@ +============================== +Preloading +============================== + +PreloadConditions +--------------------------- + +During the :ref:`conditions generation ` the following +PreloadConditions are also generated which are useful for preloading: + +- One PreloadCondition for each of your models, that will allow to preload this model when doing a query. + The name of these conditions will be PreloadAttributes where + is the model type. +- One PreloadCondition for each of the relations of your model, + to preload that the related object when doing a query. + This is really just a facility that translates to using the JoinCondition of + that relation and then the PreloadAttributes of the related model. + The name of these conditions will be Preload where + is the model type and is the name of the attribute that creates the relation. +- One PreloadCondition to preload all the related models of your model. + The name of these conditions will be PreloadRelations where + is the model type. + +Examples +---------------------------------- + +**Preload a related model** + +In this example we query all YourModels and preload whose related Related. + +.. code-block:: go + + type Related struct { + badorm.UUIDModel + } + + type YourModel struct { + badorm.UUIDModel + + Related Related + RelatedID badorm.UUID + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelRelated( + conditions.RelatedPreloadAttributes, + ), + ) + +Or using the PreloadCondition to avoid the JoinCondition +(only useful when you don't want to add other conditions to that Join): + +.. code-block:: go + + type Related struct { + badorm.UUIDModel + } + + type YourModel struct { + badorm.UUIDModel + + Related Related + RelatedID badorm.UUID + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelPreloadRelated, + ) + +**Preload a list of models** + +.. code-block:: go + + type Related struct { + badorm.UUIDModel + + YourModel *YourModel + YourModelID *badorm.UUID + } + + type YourModel struct { + badorm.UUIDModel + + Related *[]Related + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelPreloadRelated, + ) + +**Nested preloads** + +.. code-block:: go + + type Parent struct { + badorm.UUIDModel + } + + type Related struct { + badorm.UUIDModel + + Parent Parent + ParentID badorm.UUID + } + + type YourModel struct { + badorm.UUIDModel + + Related Related + RelatedID badorm.UUID + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelRelated( + conditions.RelatedPreloadParent, + ), + ) + +As we can see, it is not necessary to add the preload to all joins, +it is enough to do it in the deepest one, +to recover, in this example, both Related and Parent. + +Relation getters +-------------------------------------- + +At the moment, with the PreloadConditions, we can choose whether or not to preload a relation. +The problem is that once we get the result of the query, we cannot determine if a null value +corresponds to the fact that the relation is really null or that the preload was not performed, +which means a big risk of making decisions in our business logic on incomplete information. + +For this reason, BaDORM provides the Relation getters. +These are methods that will be added to your models to safely navigate a relation, +responding `badorm.ErrRelationNotLoaded` in case you try to navigate a relation +that was not loaded from the database. +They are created in a file called badorm.go in your model package when +:ref:`generating conditions `. + +Here is an example of its use: + +.. code-block:: go + + type Related struct { + badorm.UUIDModel + } + + type YourModel struct { + badorm.UUIDModel + + Related Related + RelatedID badorm.UUID + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelPreloadRelated, + ) + + if err == nil && len(yourModels) > 1 { + firstRelated, err := yourModels[0].GetRelated() + if err == nil { + // you can safely apply your business logic + } else { + // err is badorm.ErrRelationNotLoaded + } + } + +Unfortunately, these relation getters cannot be created in all cases but only in those in which: + +- The relation is made with an object directly instead of a pointer + (which is not recommended as described :ref:`here `). +- The relation is made with pointers and the foreign key (typically the ID) is in the same model. +- The relation is made with a pointer to a list. \ No newline at end of file diff --git a/docs/badorm/query.rst b/docs/badorm/query.rst new file mode 100644 index 00000000..abd3c090 --- /dev/null +++ b/docs/badorm/query.rst @@ -0,0 +1,184 @@ +============================== +Query +============================== + +Query methods +------------------------ + +In CRUDRepository you will find different methods that will +allow you to perform queries on the model to which that repository belongs: + +.. TODO ver si se mantienen estos nombres + +- GetByID: will allow you to obtain a model by its id. +- Get: will allow you to obtain the model that meets the conditions received by parameter. +- Query: will allow you to obtain the models that meet the conditions received by parameter. + +Compilable query system +------------------------ + +The set of conditions that are received by the read operations of the CRUDService +and CRUDRepository form the BaDORM compilable query system. +It is so named because the conditions will verify at compile time that the query to be executed is correct. + +These conditions are objects of type badorm.Condition that contain the +necessary information to perform the queries in a safe way. +They are generated from the definition of your models using badctl. + +Conditions generation +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The generation of conditions is done with badctl. For this, we need to install badctl: + +.. code-block:: bash + + go install github.com/ditrit/badaas/tools/badctl + +Then, inside our project we will have to create a package called conditions +(or another name if you wish) and inside it a file with the following content: + +.. code-block:: go + + package conditions + + //go:generate badctl gen conditions ../models_path_1 ../models_path_2 + +where ../models_path_1 ../models_path_2 are the relative paths between the package conditions +and the packages containing the definition of your models (can be only one). + +Now, from the root of your project you can execute: + +.. code-block:: bash + + go generate ./... + +and the conditions for each of your models will be created in the conditions package. + +Use of the conditions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +After generating the conditions you will have the following conditions: + +- One condition for each attribute of each of your models. + The name of these conditions will be where + is the model type and is the attribute name. + These conditions are of type WhereCondition. +- One condition for each relationship with another model that each of your models has. + The name of these conditions will be where + is the model type and is the name of the attribute that creates the relation. + These conditions are of type JoinCondition because using them will + mean performing a join within the executed query. + +Then, combining these conditions, the Connection Conditions (badorm.And, badorm.Or, badorm.Not) +and the Operators (badorm.Eq, badorm.Lt, etc.) you will be able to make all +the queries you need in a safe way. + +Examples +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**Filter by an attribute** + +In this example we query all YourModel that has "a_string" in the Attribute attribute. + +.. code-block:: go + + type YourModel struct { + badorm.UUIDModel + + Attribute string + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelAttribute(badorm.Eq("a_string")), + ) + +**Filter by an attribute of a related model** + +In this example we query all YourModels whose related Related has "a_string" in its Attribute attribute. + +.. code-block:: go + + type Related struct { + badorm.UUIDModel + + Attribute string + } + + type YourModel struct { + badorm.UUIDModel + + Related Related + RelatedID badorm.UUID + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelRelated( + conditions.RelatedAttribute(badorm.Eq("a_string")), + ), + ) + +**Multiple conditions** + +In this example we query all YourModels that has a 4 in the IntAttribute attribute and +whose related Related has "a_string" in its Attribute attribute. + +.. code-block:: go + + type Related struct { + badorm.UUIDModel + + Attribute string + } + + type YourModel struct { + badorm.UUIDModel + + IntAttribute int + + Related Related + RelatedID badorm.UUID + } + + yourModels, err := ts.crudYourModelService.Query( + conditions.YourModelIntAttribute(badorm.Eq(4)), + conditions.YourModelRelated( + conditions.RelatedAttribute(badorm.Eq("a_string")), + ), + ) + +Operators +------------------------ + +Below you will find the complete list of available operators: + +- badorm.Eq(value): EqualTo +- badorm.EqOrIsNull(value): if value is not NULL returns a Eq operator but if value is NULL returns a IsNull operator +- badorm.NotEq(value): NotEqualTo +- badorm.NotEqOrIsNotNull(value): if value is not NULL returns a NotEq operator but if value is NULL returns a IsNotNull operator +- badorm.Lt(value): LessThan +- badorm.LtOrEq(value): LessThanOrEqualTo +- badorm.Gt(value): GreaterThan +- badorm.GtOrEq(value): GreaterThanOrEqualTo +- badorm.IsNull() +- badorm.IsNotNull() +- badorm.Between(v1, v2): Equivalent to v1 < attribute < v2 +- badorm.NotBetween(v1, v2): Equivalent to NOT (v1 < attribute < v2) +- badorm.IsTrue() (Not supported by: sqlserver) +- badorm.IsNotTrue() (Not supported by: sqlserver) +- badorm.IsFalse() (Not supported by: sqlserver) +- badorm.IsNotFalse() (Not supported by: sqlserver) +- badorm.IsUnknown() (Not supported by: sqlserver, sqlite) +- badorm.IsNotUnknown() (Not supported by: sqlserver, sqlite) +- badorm.IsDistinct(value) (Not supported by: mysql) +- badorm.IsNotDistinct(value) (Not supported by: mysql) +- badorm.Like(pattern) +- badorm.Like(pattern).Escape(escape) +- badorm.ArrayIn(values) +- badorm.ArrayNotIn(values) + +In addition to these, BaDORM gives the possibility to use operators +that are only supported by a certain database (outside the standard). +These operators can be found in , +, + +and . \ No newline at end of file diff --git a/docs/badorm/quickstart.rst b/docs/badorm/quickstart.rst index 4a74019e..d4fc7b30 100644 --- a/docs/badorm/quickstart.rst +++ b/docs/badorm/quickstart.rst @@ -27,11 +27,15 @@ Generate conditions After choosing the example you want to run (`cd standalone` or `cd fx`) you will need to :ref:`generate the conditions ` for the models using `BaDctl`. -Install `badctl`:: +Install `badctl`: + +.. code-block:: bash go install github.com/ditrit/badaas/tools/badctl -Generate conditions:: +Generate conditions: + +.. code-block:: bash go generate ./... @@ -41,15 +45,21 @@ that allow you query the models in `example.go` and in `models/badorm.go` the :r Run it ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -First, we need a database to store the data, in this case we will use CockroachDB:: +First, we need a database to store the data, in this case we will use CockroachDB: + +.. code-block:: bash docker compose up -d -After that, we can run the application:: +After that, we can run the application: + +.. code-block:: bash go run . -And you should see something like:: +And you should see something like: + +.. code-block:: bash 2023/05/16 09:52:03 Setting up CRUD example 2023/05/16 09:52:03 Finished creating CRUD example @@ -63,7 +73,9 @@ In this section we will see the steps carried out to develop this example. **Standalone** -Once you have started your project with `go init`, you must add the dependency to BaDaaS and others:: +Once you have started your project with `go init`, you must add the dependency to BaDaaS and others: + +.. code-block:: bash go get -u github.com/ditrit/badaas github.com/uber-go/zap gorm.io/gorm @@ -74,7 +86,9 @@ in conditions/badorm.go the file required to :ref:`generate the conditions ` is created. In main.go a main function is created with the configuration required to use the BaDORM. -First, we need to create a :ref:`gormDB ` that allows connection with the database:: +First, we need to create a :ref:`gormDB ` that allows connection with the database: + +.. code-block:: go gormDB, err := NewGormDBConnection() @@ -89,17 +103,21 @@ method of the gormDB with the models you want to be persisted:: ) From here, we can start to use BaDORM, getting the :ref:`CRUDService ` -and :ref:`CRUDRepository ` of a model with the GetCRUD function:: +and :ref:`CRUDRepository ` of a model with the GetCRUD function: + +.. code-block:: go crudProductService, crudProductRepository := badorm.GetCRUD[models.Product, badorm.UUID](gormDB) As you can see, we need to specify the type of the model and the kind of :ref:`id ` this model uses. -Finally, you can use this service and repository to perform CRUD operations on your model:: +Finally, you can use this service and repository to perform CRUD operations on your model: + +.. code-block:: go - CreateCRUDObjects(gormDB, crudProductRepository) - QueryCRUDObjects(crudProductService) + CreateCRUDObjects(gormDB, crudProductRepository) + QueryCRUDObjects(crudProductService) This two functions are defined in `example.go`. In `QueryCRUDObjects` you can find a basic usage of the @@ -107,9 +125,11 @@ In `QueryCRUDObjects` you can find a basic usage of the **Fx** -Once you have started your project with `go init`, you must add the dependency to BaDaaS and others:: +Once you have started your project with `go init`, you must add the dependency to BaDaaS and others: - go get -u github.com/ditrit/badaas github.com/uber-go/fx github.com/uber-go/zap gorm.io/gorm +.. code-block:: bash + + go get -u github.com/ditrit/badaas github.com/uber-go/fx github.com/uber-go/zap gorm.io/gorm .. TODO quisiera sacar esta dependencia de zap @@ -118,7 +138,9 @@ in conditions/badorm.go the file required to :ref:`generate the conditions ` is created. In main.go a main function is created with the configuration required to use the BaDORM with fx. -First, we will need to start your application with `fx`:: +First, we will need to start your application with `fx`: + +.. code-block:: go func main() { fx.New( diff --git a/docs/index.rst b/docs/index.rst index 26e6fad7..7c2ad268 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,7 @@ .. _topics-index: ============================== -BaDaaS |version| documentation +Introduction ============================== Badaas enables the effortless construction of **distributed, resilient, @@ -33,6 +33,7 @@ Index .. toctree:: :caption: BaDaaS + self badaas/quickstart badaas/functionalities badaas/configuration @@ -50,4 +51,9 @@ Index badorm/index badorm/quickstart badorm/concepts - badorm/functionalities \ No newline at end of file + badorm/declaring_models + badorm/connecting_to_a_database + badorm/crud + badorm/query + badorm/advanced_query + badorm/preloading \ No newline at end of file diff --git a/mocks/badorm/CRUDRepository.go b/mocks/badorm/CRUDRepository.go index 6b681d4b..0a7cda11 100644 --- a/mocks/badorm/CRUDRepository.go +++ b/mocks/badorm/CRUDRepository.go @@ -75,32 +75,6 @@ func (_m *CRUDRepository[T, ID]) Get(tx *gorm.DB, conditions ...badorm.Condition return r0, r1 } -// GetAll provides a mock function with given fields: tx -func (_m *CRUDRepository[T, ID]) GetAll(tx *gorm.DB) ([]*T, error) { - ret := _m.Called(tx) - - var r0 []*T - var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB) ([]*T, error)); ok { - return rf(tx) - } - if rf, ok := ret.Get(0).(func(*gorm.DB) []*T); ok { - r0 = rf(tx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*T) - } - } - - if rf, ok := ret.Get(1).(func(*gorm.DB) error); ok { - r1 = rf(tx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // GetByID provides a mock function with given fields: tx, id func (_m *CRUDRepository[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, error) { ret := _m.Called(tx, id) @@ -127,8 +101,8 @@ func (_m *CRUDRepository[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, error) { return r0, r1 } -// GetMultiple provides a mock function with given fields: tx, conditions -func (_m *CRUDRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions ...badorm.Condition[T]) ([]*T, error) { +// Query provides a mock function with given fields: tx, conditions +func (_m *CRUDRepository[T, ID]) Query(tx *gorm.DB, conditions ...badorm.Condition[T]) ([]*T, error) { _va := make([]interface{}, len(conditions)) for _i := range conditions { _va[_i] = conditions[_i] diff --git a/mocks/badorm/CRUDService.go b/mocks/badorm/CRUDService.go index c13b3ad0..545bebe4 100644 --- a/mocks/badorm/CRUDService.go +++ b/mocks/badorm/CRUDService.go @@ -12,31 +12,25 @@ type CRUDService[T badorm.Model, ID badorm.ModelID] struct { mock.Mock } -// GetEntities provides a mock function with given fields: conditions -func (_m *CRUDService[T, ID]) GetEntities(conditions ...badorm.Condition[T]) ([]*T, error) { - _va := make([]interface{}, len(conditions)) - for _i := range conditions { - _va[_i] = conditions[_i] - } - var _ca []interface{} - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) +// GetByID provides a mock function with given fields: id +func (_m *CRUDService[T, ID]) GetByID(id ID) (*T, error) { + ret := _m.Called(id) - var r0 []*T + var r0 *T var r1 error - if rf, ok := ret.Get(0).(func(...badorm.Condition[T]) ([]*T, error)); ok { - return rf(conditions...) + if rf, ok := ret.Get(0).(func(ID) (*T, error)); ok { + return rf(id) } - if rf, ok := ret.Get(0).(func(...badorm.Condition[T]) []*T); ok { - r0 = rf(conditions...) + if rf, ok := ret.Get(0).(func(ID) *T); ok { + r0 = rf(id) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]*T) + r0 = ret.Get(0).(*T) } } - if rf, ok := ret.Get(1).(func(...badorm.Condition[T]) error); ok { - r1 = rf(conditions...) + if rf, ok := ret.Get(1).(func(ID) error); ok { + r1 = rf(id) } else { r1 = ret.Error(1) } @@ -44,25 +38,31 @@ func (_m *CRUDService[T, ID]) GetEntities(conditions ...badorm.Condition[T]) ([] return r0, r1 } -// GetEntity provides a mock function with given fields: id -func (_m *CRUDService[T, ID]) GetEntity(id ID) (*T, error) { - ret := _m.Called(id) +// Query provides a mock function with given fields: conditions +func (_m *CRUDService[T, ID]) Query(conditions ...badorm.Condition[T]) ([]*T, error) { + _va := make([]interface{}, len(conditions)) + for _i := range conditions { + _va[_i] = conditions[_i] + } + var _ca []interface{} + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) - var r0 *T + var r0 []*T var r1 error - if rf, ok := ret.Get(0).(func(ID) (*T, error)); ok { - return rf(id) + if rf, ok := ret.Get(0).(func(...badorm.Condition[T]) ([]*T, error)); ok { + return rf(conditions...) } - if rf, ok := ret.Get(0).(func(ID) *T); ok { - r0 = rf(id) + if rf, ok := ret.Get(0).(func(...badorm.Condition[T]) []*T); ok { + r0 = rf(conditions...) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*T) + r0 = ret.Get(0).([]*T) } } - if rf, ok := ret.Get(1).(func(ID) error); ok { - r1 = rf(id) + if rf, ok := ret.Get(1).(func(...badorm.Condition[T]) error); ok { + r1 = rf(conditions...) } else { r1 = ret.Error(1) } diff --git a/mocks/badorm/Condition.go b/mocks/badorm/Condition.go index c6601120..6910fafe 100644 --- a/mocks/badorm/Condition.go +++ b/mocks/badorm/Condition.go @@ -4,8 +4,6 @@ package mocks import ( badorm "github.com/ditrit/badaas/badorm" - gorm "gorm.io/gorm" - mock "github.com/stretchr/testify/mock" ) @@ -15,33 +13,21 @@ type Condition[T badorm.Model] struct { } // ApplyTo provides a mock function with given fields: query, table -func (_m *Condition[T]) ApplyTo(query *gorm.DB, table badorm.Table) (*gorm.DB, error) { +func (_m *Condition[T]) ApplyTo(query *badorm.Query, table badorm.Table) error { ret := _m.Called(query, table) - var r0 *gorm.DB - var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) (*gorm.DB, error)); ok { - return rf(query, table) - } - if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) *gorm.DB); ok { + var r0 error + if rf, ok := ret.Get(0).(func(*badorm.Query, badorm.Table) error); ok { r0 = rf(query, table) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*gorm.DB) - } - } - - if rf, ok := ret.Get(1).(func(*gorm.DB, badorm.Table) error); ok { - r1 = rf(query, table) - } else { - r1 = ret.Error(1) + r0 = ret.Error(0) } - return r0, r1 + return r0 } -// interfaceVerificationMethod provides a mock function with given fields: _a0 -func (_m *Condition[T]) interfaceVerificationMethod(_a0 T) { +// InterfaceVerificationMethod provides a mock function with given fields: _a0 +func (_m *Condition[T]) InterfaceVerificationMethod(_a0 T) { _m.Called(_a0) } diff --git a/mocks/badorm/DynamicOperator.go b/mocks/badorm/DynamicOperator.go new file mode 100644 index 00000000..d89cfe4b --- /dev/null +++ b/mocks/badorm/DynamicOperator.go @@ -0,0 +1,82 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + badorm "github.com/ditrit/badaas/badorm" + mock "github.com/stretchr/testify/mock" +) + +// DynamicOperator is an autogenerated mock type for the DynamicOperator type +type DynamicOperator[T interface{}] struct { + mock.Mock +} + +// InterfaceVerificationMethod provides a mock function with given fields: _a0 +func (_m *DynamicOperator[T]) InterfaceVerificationMethod(_a0 T) { + _m.Called(_a0) +} + +// SelectJoin provides a mock function with given fields: valueNumber, joinNumber +func (_m *DynamicOperator[T]) SelectJoin(valueNumber uint, joinNumber uint) badorm.DynamicOperator[T] { + ret := _m.Called(valueNumber, joinNumber) + + var r0 badorm.DynamicOperator[T] + if rf, ok := ret.Get(0).(func(uint, uint) badorm.DynamicOperator[T]); ok { + r0 = rf(valueNumber, joinNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(badorm.DynamicOperator[T]) + } + } + + return r0 +} + +// ToSQL provides a mock function with given fields: query, columnName +func (_m *DynamicOperator[T]) ToSQL(query *badorm.Query, columnName string) (string, []interface{}, error) { + ret := _m.Called(query, columnName) + + var r0 string + var r1 []interface{} + var r2 error + if rf, ok := ret.Get(0).(func(*badorm.Query, string) (string, []interface{}, error)); ok { + return rf(query, columnName) + } + if rf, ok := ret.Get(0).(func(*badorm.Query, string) string); ok { + r0 = rf(query, columnName) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(*badorm.Query, string) []interface{}); ok { + r1 = rf(query, columnName) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]interface{}) + } + } + + if rf, ok := ret.Get(2).(func(*badorm.Query, string) error); ok { + r2 = rf(query, columnName) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +type mockConstructorTestingTNewDynamicOperator interface { + mock.TestingT + Cleanup(func()) +} + +// NewDynamicOperator creates a new instance of DynamicOperator. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewDynamicOperator[T interface{}](t mockConstructorTestingTNewDynamicOperator) *DynamicOperator[T] { + mock := &DynamicOperator[T]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/badorm/IJoinCondition.go b/mocks/badorm/IJoinCondition.go index 81909f3c..8b50a24a 100644 --- a/mocks/badorm/IJoinCondition.go +++ b/mocks/badorm/IJoinCondition.go @@ -4,8 +4,6 @@ package mocks import ( badorm "github.com/ditrit/badaas/badorm" - gorm "gorm.io/gorm" - mock "github.com/stretchr/testify/mock" ) @@ -15,36 +13,38 @@ type IJoinCondition[T badorm.Model] struct { } // ApplyTo provides a mock function with given fields: query, table -func (_m *IJoinCondition[T]) ApplyTo(query *gorm.DB, table badorm.Table) (*gorm.DB, error) { +func (_m *IJoinCondition[T]) ApplyTo(query *badorm.Query, table badorm.Table) error { ret := _m.Called(query, table) - var r0 *gorm.DB - var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) (*gorm.DB, error)); ok { - return rf(query, table) - } - if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) *gorm.DB); ok { + var r0 error + if rf, ok := ret.Get(0).(func(*badorm.Query, badorm.Table) error); ok { r0 = rf(query, table) } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*gorm.DB) - } - } - - if rf, ok := ret.Get(1).(func(*gorm.DB, badorm.Table) error); ok { - r1 = rf(query, table) - } else { - r1 = ret.Error(1) + r0 = ret.Error(0) } - return r0, r1 + return r0 } -// interfaceVerificationMethod provides a mock function with given fields: _a0 -func (_m *IJoinCondition[T]) interfaceVerificationMethod(_a0 T) { +// InterfaceVerificationMethod provides a mock function with given fields: _a0 +func (_m *IJoinCondition[T]) InterfaceVerificationMethod(_a0 T) { _m.Called(_a0) } +// makesFilter provides a mock function with given fields: +func (_m *IJoinCondition[T]) makesFilter() bool { + ret := _m.Called() + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + // makesPreload provides a mock function with given fields: func (_m *IJoinCondition[T]) makesPreload() bool { ret := _m.Called() diff --git a/mocks/badorm/Operator.go b/mocks/badorm/Operator.go new file mode 100644 index 00000000..35bf5416 --- /dev/null +++ b/mocks/badorm/Operator.go @@ -0,0 +1,66 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + badorm "github.com/ditrit/badaas/badorm" + mock "github.com/stretchr/testify/mock" +) + +// Operator is an autogenerated mock type for the Operator type +type Operator[T interface{}] struct { + mock.Mock +} + +// InterfaceVerificationMethod provides a mock function with given fields: _a0 +func (_m *Operator[T]) InterfaceVerificationMethod(_a0 T) { + _m.Called(_a0) +} + +// ToSQL provides a mock function with given fields: query, columnName +func (_m *Operator[T]) ToSQL(query *badorm.Query, columnName string) (string, []interface{}, error) { + ret := _m.Called(query, columnName) + + var r0 string + var r1 []interface{} + var r2 error + if rf, ok := ret.Get(0).(func(*badorm.Query, string) (string, []interface{}, error)); ok { + return rf(query, columnName) + } + if rf, ok := ret.Get(0).(func(*badorm.Query, string) string); ok { + r0 = rf(query, columnName) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(*badorm.Query, string) []interface{}); ok { + r1 = rf(query, columnName) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]interface{}) + } + } + + if rf, ok := ret.Get(2).(func(*badorm.Query, string) error); ok { + r2 = rf(query, columnName) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +type mockConstructorTestingTNewOperator interface { + mock.TestingT + Cleanup(func()) +} + +// NewOperator creates a new instance of Operator. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewOperator[T interface{}](t mockConstructorTestingTNewOperator) *Operator[T] { + mock := &Operator[T]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/badorm/WhereCondition.go b/mocks/badorm/WhereCondition.go index 4dfdfdea..55e7ad34 100644 --- a/mocks/badorm/WhereCondition.go +++ b/mocks/badorm/WhereCondition.go @@ -4,8 +4,6 @@ package mocks import ( badorm "github.com/ditrit/badaas/badorm" - gorm "gorm.io/gorm" - mock "github.com/stretchr/testify/mock" ) @@ -14,49 +12,51 @@ type WhereCondition[T badorm.Model] struct { mock.Mock } -// ApplyTo provides a mock function with given fields: query, table -func (_m *WhereCondition[T]) ApplyTo(query *gorm.DB, table badorm.Table) (*gorm.DB, error) { - ret := _m.Called(query, table) +// AffectsDeletedAt provides a mock function with given fields: +func (_m *WhereCondition[T]) AffectsDeletedAt() bool { + ret := _m.Called() - var r0 *gorm.DB - var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) (*gorm.DB, error)); ok { - return rf(query, table) - } - if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) *gorm.DB); ok { - r0 = rf(query, table) + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*gorm.DB) - } + r0 = ret.Get(0).(bool) } - if rf, ok := ret.Get(1).(func(*gorm.DB, badorm.Table) error); ok { - r1 = rf(query, table) + return r0 +} + +// ApplyTo provides a mock function with given fields: query, table +func (_m *WhereCondition[T]) ApplyTo(query *badorm.Query, table badorm.Table) error { + ret := _m.Called(query, table) + + var r0 error + if rf, ok := ret.Get(0).(func(*badorm.Query, badorm.Table) error); ok { + r0 = rf(query, table) } else { - r1 = ret.Error(1) + r0 = ret.Error(0) } - return r0, r1 + return r0 } // GetSQL provides a mock function with given fields: query, table -func (_m *WhereCondition[T]) GetSQL(query *gorm.DB, table badorm.Table) (string, []interface{}, error) { +func (_m *WhereCondition[T]) GetSQL(query *badorm.Query, table badorm.Table) (string, []interface{}, error) { ret := _m.Called(query, table) var r0 string var r1 []interface{} var r2 error - if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) (string, []interface{}, error)); ok { + if rf, ok := ret.Get(0).(func(*badorm.Query, badorm.Table) (string, []interface{}, error)); ok { return rf(query, table) } - if rf, ok := ret.Get(0).(func(*gorm.DB, badorm.Table) string); ok { + if rf, ok := ret.Get(0).(func(*badorm.Query, badorm.Table) string); ok { r0 = rf(query, table) } else { r0 = ret.Get(0).(string) } - if rf, ok := ret.Get(1).(func(*gorm.DB, badorm.Table) []interface{}); ok { + if rf, ok := ret.Get(1).(func(*badorm.Query, badorm.Table) []interface{}); ok { r1 = rf(query, table) } else { if ret.Get(1) != nil { @@ -64,7 +64,7 @@ func (_m *WhereCondition[T]) GetSQL(query *gorm.DB, table badorm.Table) (string, } } - if rf, ok := ret.Get(2).(func(*gorm.DB, badorm.Table) error); ok { + if rf, ok := ret.Get(2).(func(*badorm.Query, badorm.Table) error); ok { r2 = rf(query, table) } else { r2 = ret.Error(2) @@ -73,22 +73,8 @@ func (_m *WhereCondition[T]) GetSQL(query *gorm.DB, table badorm.Table) (string, return r0, r1, r2 } -// affectsDeletedAt provides a mock function with given fields: -func (_m *WhereCondition[T]) affectsDeletedAt() bool { - ret := _m.Called() - - var r0 bool - if rf, ok := ret.Get(0).(func() bool); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -// interfaceVerificationMethod provides a mock function with given fields: _a0 -func (_m *WhereCondition[T]) interfaceVerificationMethod(_a0 T) { +// InterfaceVerificationMethod provides a mock function with given fields: _a0 +func (_m *WhereCondition[T]) InterfaceVerificationMethod(_a0 T) { _m.Called(_a0) } diff --git a/mocks/badorm/iFieldIdentifier.go b/mocks/badorm/iFieldIdentifier.go new file mode 100644 index 00000000..c20c1408 --- /dev/null +++ b/mocks/badorm/iFieldIdentifier.go @@ -0,0 +1,74 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + badorm "github.com/ditrit/badaas/badorm" + mock "github.com/stretchr/testify/mock" + + reflect "reflect" +) + +// iFieldIdentifier is an autogenerated mock type for the iFieldIdentifier type +type iFieldIdentifier struct { + mock.Mock +} + +// ColumnName provides a mock function with given fields: query, table +func (_m *iFieldIdentifier) ColumnName(query *badorm.Query, table badorm.Table) string { + ret := _m.Called(query, table) + + var r0 string + if rf, ok := ret.Get(0).(func(*badorm.Query, badorm.Table) string); ok { + r0 = rf(query, table) + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// ColumnSQL provides a mock function with given fields: query, table +func (_m *iFieldIdentifier) ColumnSQL(query *badorm.Query, table badorm.Table) string { + ret := _m.Called(query, table) + + var r0 string + if rf, ok := ret.Get(0).(func(*badorm.Query, badorm.Table) string); ok { + r0 = rf(query, table) + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// GetModelType provides a mock function with given fields: +func (_m *iFieldIdentifier) GetModelType() reflect.Type { + ret := _m.Called() + + var r0 reflect.Type + if rf, ok := ret.Get(0).(func() reflect.Type); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(reflect.Type) + } + } + + return r0 +} + +type mockConstructorTestingTnewIFieldIdentifier interface { + mock.TestingT + Cleanup(func()) +} + +// newIFieldIdentifier creates a new instance of iFieldIdentifier. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func newIFieldIdentifier(t mockConstructorTestingTnewIFieldIdentifier) *iFieldIdentifier { + mock := &iFieldIdentifier{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/badorm/CRUDUnsafeRepository.go b/mocks/badorm/unsafe/CRUDRepository.go similarity index 56% rename from mocks/badorm/CRUDUnsafeRepository.go rename to mocks/badorm/unsafe/CRUDRepository.go index c81201eb..bd893016 100644 --- a/mocks/badorm/CRUDUnsafeRepository.go +++ b/mocks/badorm/unsafe/CRUDRepository.go @@ -9,13 +9,13 @@ import ( mock "github.com/stretchr/testify/mock" ) -// CRUDUnsafeRepository is an autogenerated mock type for the CRUDUnsafeRepository type -type CRUDUnsafeRepository[T badorm.Model, ID badorm.ModelID] struct { +// CRUDRepository is an autogenerated mock type for the CRUDRepository type +type CRUDRepository[T badorm.Model, ID badorm.ModelID] struct { mock.Mock } // GetMultiple provides a mock function with given fields: tx, conditions -func (_m *CRUDUnsafeRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]interface{}) ([]*T, error) { +func (_m *CRUDRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]interface{}) ([]*T, error) { ret := _m.Called(tx, conditions) var r0 []*T @@ -40,14 +40,14 @@ func (_m *CRUDUnsafeRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions map[s return r0, r1 } -type mockConstructorTestingTNewCRUDUnsafeRepository interface { +type mockConstructorTestingTNewCRUDRepository interface { mock.TestingT Cleanup(func()) } -// NewCRUDUnsafeRepository creates a new instance of CRUDUnsafeRepository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDUnsafeRepository[T badorm.Model, ID badorm.ModelID](t mockConstructorTestingTNewCRUDUnsafeRepository) *CRUDUnsafeRepository[T, ID] { - mock := &CRUDUnsafeRepository[T, ID]{} +// NewCRUDRepository creates a new instance of CRUDRepository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewCRUDRepository[T badorm.Model, ID badorm.ModelID](t mockConstructorTestingTNewCRUDRepository) *CRUDRepository[T, ID] { + mock := &CRUDRepository[T, ID]{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/mocks/badorm/CRUDUnsafeService.go b/mocks/badorm/unsafe/CRUDService.go similarity index 55% rename from mocks/badorm/CRUDUnsafeService.go rename to mocks/badorm/unsafe/CRUDService.go index 1f4ee53e..652c172d 100644 --- a/mocks/badorm/CRUDUnsafeService.go +++ b/mocks/badorm/unsafe/CRUDService.go @@ -7,13 +7,13 @@ import ( mock "github.com/stretchr/testify/mock" ) -// CRUDUnsafeService is an autogenerated mock type for the CRUDUnsafeService type -type CRUDUnsafeService[T badorm.Model, ID badorm.ModelID] struct { +// CRUDService is an autogenerated mock type for the CRUDService type +type CRUDService[T badorm.Model, ID badorm.ModelID] struct { mock.Mock } // GetEntities provides a mock function with given fields: conditions -func (_m *CRUDUnsafeService[T, ID]) GetEntities(conditions map[string]interface{}) ([]*T, error) { +func (_m *CRUDService[T, ID]) GetEntities(conditions map[string]interface{}) ([]*T, error) { ret := _m.Called(conditions) var r0 []*T @@ -38,14 +38,14 @@ func (_m *CRUDUnsafeService[T, ID]) GetEntities(conditions map[string]interface{ return r0, r1 } -type mockConstructorTestingTNewCRUDUnsafeService interface { +type mockConstructorTestingTNewCRUDService interface { mock.TestingT Cleanup(func()) } -// NewCRUDUnsafeService creates a new instance of CRUDUnsafeService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDUnsafeService[T badorm.Model, ID badorm.ModelID](t mockConstructorTestingTNewCRUDUnsafeService) *CRUDUnsafeService[T, ID] { - mock := &CRUDUnsafeService[T, ID]{} +// NewCRUDService creates a new instance of CRUDService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewCRUDService[T badorm.Model, ID badorm.ModelID](t mockConstructorTestingTNewCRUDService) *CRUDService[T, ID] { + mock := &CRUDService[T, ID]{} mock.Mock.Test(t) t.Cleanup(func() { mock.AssertExpectations(t) }) diff --git a/router/ModuleFx.go b/router/ModuleFx.go index 61142f53..36c12aab 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -6,6 +6,7 @@ import ( "go.uber.org/fx" "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/unsafe" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/router/middlewares" "github.com/ditrit/badaas/services" @@ -77,7 +78,7 @@ func GetCRUDRoutesModule[T badorm.Model]() fx.Option { typeName+"CRUDRoutesModule", // service badorm.GetCRUDServiceModule[T](), - badorm.GetCRUDUnsafeServiceModule[T](), + unsafe.GetCRUDServiceModule[T](), // controller fx.Provide( diff --git a/services/sessionservice/session.go b/services/sessionservice/session.go index dad4dcaa..248a4049 100644 --- a/services/sessionservice/session.go +++ b/services/sessionservice/session.go @@ -132,7 +132,7 @@ func (sessionService *sessionServiceImpl) pullFromDB() { sessionService.mutex.Lock() defer sessionService.mutex.Unlock() - sessionsFromDatabase, err := sessionService.sessionRepository.GetAll(sessionService.db) + sessionsFromDatabase, err := sessionService.sessionRepository.Query(sessionService.db) if err != nil { panic(err) } diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index b8659f0e..5569a814 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -14,6 +14,7 @@ import ( "gorm.io/gorm" "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/unsafe" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/logger" "github.com/ditrit/badaas/testintegration/models" @@ -57,17 +58,17 @@ func TestBaDORM(t *testing.T) { badorm.GetCRUDServiceModule[models.Brand](), badorm.GetCRUDServiceModule[models.Child](), - badorm.GetCRUDUnsafeServiceModule[models.Company](), - badorm.GetCRUDUnsafeServiceModule[models.Seller](), - badorm.GetCRUDUnsafeServiceModule[models.Product](), - badorm.GetCRUDUnsafeServiceModule[models.Sale](), - badorm.GetCRUDUnsafeServiceModule[models.City](), - badorm.GetCRUDUnsafeServiceModule[models.Country](), - badorm.GetCRUDUnsafeServiceModule[models.Employee](), - badorm.GetCRUDUnsafeServiceModule[models.Person](), - badorm.GetCRUDUnsafeServiceModule[models.Bicycle](), - badorm.GetCRUDUnsafeServiceModule[models.Phone](), - badorm.GetCRUDUnsafeServiceModule[models.Brand](), + unsafe.GetCRUDServiceModule[models.Company](), + unsafe.GetCRUDServiceModule[models.Seller](), + unsafe.GetCRUDServiceModule[models.Product](), + unsafe.GetCRUDServiceModule[models.Sale](), + unsafe.GetCRUDServiceModule[models.City](), + unsafe.GetCRUDServiceModule[models.Country](), + unsafe.GetCRUDServiceModule[models.Employee](), + unsafe.GetCRUDServiceModule[models.Person](), + unsafe.GetCRUDServiceModule[models.Bicycle](), + unsafe.GetCRUDServiceModule[models.Phone](), + unsafe.GetCRUDServiceModule[models.Brand](), fx.Provide(NewCRUDUnsafeServiceIntTestSuite), fx.Provide(NewCRUDRepositoryIntTestSuite), diff --git a/testintegration/crudRepository.go b/testintegration/crudRepository.go index 9aecf67f..3e76825a 100644 --- a/testintegration/crudRepository.go +++ b/testintegration/crudRepository.go @@ -73,22 +73,6 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsEntityIfConditionsMatch() { assert.DeepEqual(ts.T(), product, productReturned) } -// ------------------------- GetAll -------------------------------- - -func (ts *CRUDRepositoryIntTestSuite) TestGetAllReturnsEmptyIfNotEntitiesCreated() { - productsReturned, err := ts.crudProductRepository.GetAll(ts.db) - ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{}, productsReturned) -} - -func (ts *CRUDRepositoryIntTestSuite) TestGetAllReturnsAllEntityIfConditionsMatch() { - product1 := ts.createProduct(0) - product2 := ts.createProduct(0) - productsReturned, err := ts.crudProductRepository.GetAll(ts.db) - ts.Nil(err) - EqualList(&ts.Suite, []*models.Product{product1, product2}, productsReturned) -} - // ------------------------- utils ------------------------- func (ts *CRUDRepositoryIntTestSuite) createProduct(intV int) *models.Product { diff --git a/testintegration/join_conditions_test.go b/testintegration/join_conditions_test.go index 580abab2..ccfee28c 100644 --- a/testintegration/join_conditions_test.go +++ b/testintegration/join_conditions_test.go @@ -56,7 +56,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsUintBelongsTo() { match := ts.createPhone("pixel", *brand1) ts.createPhone("iphone", *brand2) - entities, err := ts.crudPhoneService.GetEntities( + entities, err := ts.crudPhoneService.Query( conditions.PhoneBrand( conditions.BrandName(badorm.Eq("google")), ), @@ -73,7 +73,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsBelongsTo() { match := ts.createSale(0, product1, nil) ts.createSale(0, product2, nil) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleProduct( conditions.ProductInt(badorm.Eq(1)), ), @@ -94,7 +94,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsAndFiltersTheMainEnt ts.createSale(2, product2, seller2) ts.createSale(2, product1, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleCode(badorm.Eq(1)), conditions.SaleProduct( conditions.ProductInt(badorm.Eq(1)), @@ -115,7 +115,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsHasOneOptional() { match := ts.createSale(0, product1, seller1) ts.createSale(0, product2, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleSeller( conditions.SellerName(badorm.Eq("franco")), ), @@ -136,7 +136,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsHasOneSelfReferentia match := ts.createEmployee("franco", boss1) ts.createEmployee("pierre", boss2) - entities, err := ts.crudEmployeeService.GetEntities( + entities, err := ts.crudEmployeeService.Query( conditions.EmployeeBoss( conditions.EmployeeName(badorm.Eq("Xavier")), ), @@ -157,7 +157,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsOneToOne() { ts.createCountry("Argentina", capital1) ts.createCountry("France", capital2) - entities, err := ts.crudCityService.GetEntities( + entities, err := ts.crudCityService.Query( conditions.CityCountry( conditions.CountryName(badorm.Eq("Argentina")), ), @@ -178,7 +178,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsOneToOneReversed() { country1 := ts.createCountry("Argentina", capital1) ts.createCountry("France", capital2) - entities, err := ts.crudCountryService.GetEntities( + entities, err := ts.crudCountryService.Query( conditions.CountryCapital( conditions.CityName(badorm.Eq("Buenos Aires")), ), @@ -199,7 +199,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsWithEntityThatDefine match := ts.createBicycle("BMX", person1) ts.createBicycle("Shimano", person2) - entities, err := ts.crudBicycleService.GetEntities( + entities, err := ts.crudBicycleService.Query( conditions.BicycleOwner( conditions.PersonName(badorm.Eq("franco")), ), @@ -216,7 +216,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsOnHasMany() { match := ts.createSeller("franco", company1) ts.createSeller("agustin", company2) - entities, err := ts.crudSellerService.GetEntities( + entities, err := ts.crudSellerService.Query( conditions.SellerCompany( conditions.CompanyName(badorm.Eq("ditrit")), ), @@ -236,7 +236,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsOnDifferentAttribute match := ts.createSale(0, product1, seller1) ts.createSale(0, product2, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleProduct( conditions.ProductInt(badorm.Eq(1)), conditions.ProductString(badorm.Eq("match")), @@ -259,7 +259,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsAddsDeletedAtAutomat match := ts.createSale(0, product1, seller1) ts.createSale(0, product2, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleProduct( conditions.ProductString(badorm.Eq("match")), ), @@ -281,7 +281,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsOnDeletedAt() { match := ts.createSale(0, product1, seller1) ts.createSale(0, product2, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleProduct( conditions.ProductDeletedAt(badorm.Eq(product1.DeletedAt)), ), @@ -299,7 +299,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsAndFiltersByNil() { match := ts.createSale(0, product1, nil) ts.createSale(0, product2, nil) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleProduct( conditions.ProductIntPointer(badorm.IsNull[int]()), ), @@ -321,7 +321,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsDifferentEntities() ts.createSale(0, product1, seller2) ts.createSale(0, product2, seller1) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleProduct( conditions.ProductInt(badorm.Eq(1)), ), @@ -347,7 +347,7 @@ func (ts *JoinConditionsIntTestSuite) TestConditionThatJoinsMultipleTimes() { match := ts.createSale(0, product1, seller1) ts.createSale(0, product2, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleSeller( conditions.SellerName(badorm.Eq("franco")), conditions.SellerCompany( @@ -367,7 +367,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorOver2Tables() { seller1 := ts.createSeller("ditrit", company1) ts.createSeller("agustin", company2) - entities, err := ts.crudSellerService.GetEntities( + entities, err := ts.crudSellerService.Query( conditions.SellerCompany( conditions.CompanyName( dynamic.Eq(conditions.SellerNameField), @@ -392,7 +392,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorOver2TablesAtMoreLevel( match := ts.createSale(0, product1, seller1) ts.createSale(0, product2, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleSeller( conditions.SellerCompany( conditions.CompanyName( @@ -407,7 +407,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorOver2TablesAtMoreLevel( } func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorWithNotJoinedModelReturnsError() { - _, err := ts.crudChildService.GetEntities( + _, err := ts.crudChildService.Query( conditions.ChildId(dynamic.Eq(conditions.ParentParentIdField)), ) ts.ErrorIs(err, badorm.ErrFieldModelNotConcerned) @@ -415,7 +415,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorWithNotJoinedModelRetur } func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithoutSelectJoinReturnsError() { - _, err := ts.crudChildService.GetEntities( + _, err := ts.crudChildService.Query( conditions.ChildParent1( conditions.Parent1ParentParent(), ), @@ -436,7 +436,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithSel err := ts.db.Create(child).Error ts.Nil(err) - entities, err := ts.crudChildService.GetEntities( + entities, err := ts.crudChildService.Query( conditions.ChildParent1( conditions.Parent1ParentParent(), ), @@ -453,7 +453,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithSel } func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithoutSelectJoinOnMultivalueOperatorReturnsError() { - _, err := ts.crudChildService.GetEntities( + _, err := ts.crudChildService.Query( conditions.ChildParent1( conditions.Parent1ParentParent(), ), @@ -476,7 +476,7 @@ func (ts *JoinConditionsIntTestSuite) TestDynamicOperatorJoinMoreThanOnceWithSel err := ts.db.Create(child).Error ts.Nil(err) - entities, err := ts.crudChildService.GetEntities( + entities, err := ts.crudChildService.Query( conditions.ChildParent1( conditions.Parent1ParentParent(), ), @@ -505,7 +505,7 @@ func (ts *JoinConditionsIntTestSuite) TestJoinWithUnsafeCondition() { match := ts.createSale(0, product1, seller1) ts.createSale(0, product2, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleSeller( conditions.SellerCompany( unsafe.NewCondition[models.Company]("%s.name = Seller.name"), @@ -524,7 +524,7 @@ func (ts *JoinConditionsIntTestSuite) TestJoinWithEmptyConnectionConditionMakesN match1 := ts.createSale(0, product1, nil) match2 := ts.createSale(0, product2, nil) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleProduct( badorm.And[models.Product](), ), @@ -535,7 +535,7 @@ func (ts *JoinConditionsIntTestSuite) TestJoinWithEmptyConnectionConditionMakesN } func (ts *JoinConditionsIntTestSuite) TestJoinWithEmptyContainerConditionMakesNothing() { - _, err := ts.crudSaleService.GetEntities( + _, err := ts.crudSaleService.Query( conditions.SaleProduct( badorm.Not[models.Product](), ), diff --git a/testintegration/operators_test.go b/testintegration/operators_test.go index 847425fe..f95d11b8 100644 --- a/testintegration/operators_test.go +++ b/testintegration/operators_test.go @@ -41,7 +41,7 @@ func NewOperatorIntTestSuite( } func (ts *OperatorIntTestSuite) TestEqNullableNullReturnsError() { - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductNullFloat( badorm.Eq(sql.NullFloat64{Valid: false}), ), @@ -58,7 +58,7 @@ func (ts *OperatorIntTestSuite) TestEqPointers() { ts.createProduct("match", 3, 0, false, &intNotMatch) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductIntPointer( badorm.Eq(1), ), @@ -72,7 +72,7 @@ func (ts *OperatorIntTestSuite) TestEqOrIsNullTNotNil() { match := ts.createProduct("match", 1, 0, false, nil) ts.createProduct("match", 3, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.EqOrIsNull[int](1), ), @@ -89,7 +89,7 @@ func (ts *OperatorIntTestSuite) TestEqOrIsNullTNil() { err := ts.db.Save(notMatch).Error ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductByteArray( badorm.EqOrIsNull[[]byte](nil), ), @@ -108,7 +108,7 @@ func (ts *OperatorIntTestSuite) TestEqOrIsNullTNilOfType() { var nilOfType []byte - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductByteArray( badorm.EqOrIsNull[[]byte](nilOfType), ), @@ -126,7 +126,7 @@ func (ts *OperatorIntTestSuite) TestEqOrIsNullNilPointer() { var intPointer *int - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductIntPointer( badorm.EqOrIsNull[int](intPointer), ), @@ -142,7 +142,7 @@ func (ts *OperatorIntTestSuite) TestEqOrIsNullNotNilPointer() { ts.createProduct("match", 3, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.EqOrIsNull[int](&matchInt), ), @@ -160,7 +160,7 @@ func (ts *OperatorIntTestSuite) TestEqOrIsNullNullableNil() { err := ts.db.Save(notMatch).Error ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductNullFloat( badorm.EqOrIsNull[sql.NullFloat64](sql.NullFloat64{Valid: false}), ), @@ -178,7 +178,7 @@ func (ts *OperatorIntTestSuite) TestEqOrIsNullNullableNotNil() { ts.createProduct("match", 3, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductNullFloat( badorm.EqOrIsNull[sql.NullFloat64](sql.NullFloat64{Valid: true, Float64: 6}), ), @@ -189,7 +189,7 @@ func (ts *OperatorIntTestSuite) TestEqOrIsNullNullableNotNil() { } func (ts *OperatorIntTestSuite) TestEqOrIsNullNotRelated() { - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductFloat( badorm.EqOrIsNull[float64]("not_related"), ), @@ -202,7 +202,7 @@ func (ts *OperatorIntTestSuite) TestNotEqOrIsNotNullTNotNil() { match := ts.createProduct("match", 1, 0, false, nil) ts.createProduct("match", 3, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.NotEqOrIsNotNull[int](3), ), @@ -220,7 +220,7 @@ func (ts *OperatorIntTestSuite) TestNotEqOrIsNotNullTNil() { ts.createProduct("match", 3, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductByteArray( badorm.NotEqOrIsNotNull[[]byte](nil), ), @@ -235,7 +235,7 @@ func (ts *OperatorIntTestSuite) TestNotEq() { match2 := ts.createProduct("match", 3, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.NotEq(2), ), @@ -251,7 +251,7 @@ func (ts *OperatorIntTestSuite) TestLt() { ts.createProduct("not_match", 3, 0, false, nil) ts.createProduct("not_match", 4, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.Lt(3), ), @@ -262,7 +262,7 @@ func (ts *OperatorIntTestSuite) TestLt() { } func (ts *OperatorIntTestSuite) TestLtNullableNullReturnsError() { - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductNullFloat( badorm.Lt(sql.NullFloat64{Valid: false}), ), @@ -277,7 +277,7 @@ func (ts *OperatorIntTestSuite) TestLtOrEq() { ts.createProduct("not_match", 3, 0, false, nil) ts.createProduct("not_match", 4, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.LtOrEq(2), ), @@ -295,7 +295,7 @@ func (ts *OperatorIntTestSuite) TestNotLt() { ts.createProduct("not_match", 1, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( sqlserver.NotLt(3), ), @@ -314,7 +314,7 @@ func (ts *OperatorIntTestSuite) TestGt() { ts.createProduct("not_match", 1, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.Gt(2), ), @@ -330,7 +330,7 @@ func (ts *OperatorIntTestSuite) TestGtOrEq() { ts.createProduct("not_match", 1, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.GtOrEq(3), ), @@ -348,7 +348,7 @@ func (ts *OperatorIntTestSuite) TestNotGt() { ts.createProduct("not_match", 3, 0, false, nil) ts.createProduct("not_match", 4, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( sqlserver.NotGt(2), ), @@ -367,7 +367,7 @@ func (ts *OperatorIntTestSuite) TestBetween() { ts.createProduct("not_match", 6, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.Between(3, 5), ), @@ -383,7 +383,7 @@ func (ts *OperatorIntTestSuite) TestNotBetween() { ts.createProduct("not_match", 1, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.NotBetween(0, 2), ), @@ -400,7 +400,7 @@ func (ts *OperatorIntTestSuite) TestIsDistinct() { switch getDBDialector() { case configuration.PostgreSQL, configuration.SQLServer, configuration.SQLite: - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.IsDistinct(2), ), @@ -409,7 +409,7 @@ func (ts *OperatorIntTestSuite) TestIsDistinct() { EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) case configuration.MySQL: - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( badorm.Not[models.Product]( conditions.ProductInt(mysql.IsEqual(2)), ), @@ -434,7 +434,7 @@ func (ts *OperatorIntTestSuite) TestIsNotDistinct() { isNotEqualOperator = badorm.IsNotDistinct(3) } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( isNotEqualOperator, ), @@ -461,7 +461,7 @@ func (ts *OperatorIntTestSuite) TestIsNotDistinctNullValue() { isEqualOperator = badorm.IsNotDistinct(sql.NullFloat64{Valid: false}) } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductNullFloat( isEqualOperator, ), @@ -479,7 +479,7 @@ func (ts *OperatorIntTestSuite) TestIsNull() { ts.createProduct("not_match", 0, 0, false, &int1) ts.createProduct("not_match", 0, 0, false, &int2) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductIntPointer( badorm.IsNull[int](), ), @@ -497,7 +497,7 @@ func (ts *OperatorIntTestSuite) TestIsNullNotPointers() { err := ts.db.Save(notMatch).Error ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductNullFloat( badorm.IsNull[sql.NullFloat64](), ), @@ -513,7 +513,7 @@ func (ts *OperatorIntTestSuite) TestIsNotNull() { ts.createProduct("not_match", 0, 0, false, nil) ts.createProduct("not_match", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductIntPointer( badorm.IsNotNull[int](), ), @@ -531,7 +531,7 @@ func (ts *OperatorIntTestSuite) TestIsNotNullNotPointers() { ts.createProduct("not_match", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductNullFloat( badorm.IsNotNull[sql.NullFloat64](), ), @@ -556,7 +556,7 @@ func (ts *OperatorIntTestSuite) TestIsTrue() { isTrueOperator = badorm.Eq[bool](true) } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductBool( isTrueOperator, ), @@ -581,7 +581,7 @@ func (ts *OperatorIntTestSuite) TestIsFalse() { isFalseOperator = badorm.Eq[bool](false) } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductBool( isFalseOperator, ), @@ -614,7 +614,7 @@ func (ts *OperatorIntTestSuite) TestIsNotTrue() { isNotTrueOperator = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: true}) } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductNullBool( isNotTrueOperator, ), @@ -647,7 +647,7 @@ func (ts *OperatorIntTestSuite) TestIsNotFalse() { isNotFalseOperator = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: true, Bool: false}) } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductNullBool( isNotFalseOperator, ), @@ -680,7 +680,7 @@ func (ts *OperatorIntTestSuite) TestIsUnknown() { isUnknownOperator = badorm.IsNotDistinct[sql.NullBool](sql.NullBool{Valid: false}) } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductNullBool( isUnknownOperator, ), @@ -713,7 +713,7 @@ func (ts *OperatorIntTestSuite) TestIsNotUnknown() { isNotUnknownOperator = badorm.IsDistinct[sql.NullBool](sql.NullBool{Valid: false}) } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductNullBool( isNotUnknownOperator, ), @@ -730,7 +730,7 @@ func (ts *OperatorIntTestSuite) TestArrayIn() { ts.createProduct("ns1", 0, 0, false, nil) ts.createProduct("ns2", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( badorm.ArrayIn("s1", "s2", "s3"), ), @@ -747,7 +747,7 @@ func (ts *OperatorIntTestSuite) TestArrayNotIn() { ts.createProduct("ns1", 0, 0, false, nil) ts.createProduct("ns2", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( badorm.ArrayNotIn("ns1", "ns2"), ), @@ -773,7 +773,7 @@ func (ts *OperatorIntTestSuite) TestLike() { likeOperator = badorm.Like[string]("[bc]a[^a]%") } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( likeOperator, ), @@ -799,7 +799,7 @@ func (ts *OperatorIntTestSuite) TestLikeEscape() { likeOperator = badorm.Like[string]("[bc]a!_[^a]%").Escape('!') } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( likeOperator, ), @@ -820,7 +820,7 @@ func (ts *OperatorIntTestSuite) TestLikeOnNumeric() { ts.createProduct("", 20, 0, false, nil) ts.createProduct("", 3, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( mysql.Like[int]("1%"), ), @@ -843,7 +843,7 @@ func (ts *OperatorIntTestSuite) TestILike() { ts.createProduct("bbsd", 0, 0, false, nil) ts.createProduct("bbasd", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( psql.ILike[string]("_a%"), ), @@ -865,7 +865,7 @@ func (ts *OperatorIntTestSuite) TestSimilarTo() { ts.createProduct("aec", 0, 0, false, nil) ts.createProduct("aaaaa", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( psql.SimilarTo[string]("%(b|d)%"), ), @@ -896,7 +896,7 @@ func (ts *OperatorIntTestSuite) TestPosixRegexCaseSensitive() { } if posixRegexOperator != nil { - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( posixRegexOperator, ), @@ -927,7 +927,7 @@ func (ts *OperatorIntTestSuite) TestPosixRegexCaseInsensitive() { } if posixRegexOperator != nil { - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( posixRegexOperator, ), @@ -953,7 +953,7 @@ func (ts *OperatorIntTestSuite) TestPosixRegexNotPosix() { } if posixRegexOperator != nil { - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductString( posixRegexOperator, ), @@ -968,7 +968,7 @@ func (ts *OperatorIntTestSuite) TestDynamicOperatorForBasicType() { ts.createProduct("", 2, 0.0, false, &int1) ts.createProduct("", 0, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( dynamic.Eq(conditions.ProductIntPointerField), ), @@ -987,7 +987,7 @@ func (ts *OperatorIntTestSuite) TestDynamicOperatorForCustomType() { ts.createProduct("salut,hola", 1, 0.0, false, nil) ts.createProduct("hola", 1, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductMultiString( dynamic.Eq(conditions.ProductMultiStringField), ), @@ -1009,7 +1009,7 @@ func (ts *OperatorIntTestSuite) TestDynamicOperatorForBadORMModelAttribute() { isNotDistinctOperator = dynamic.IsNotDistinct(conditions.ProductDeletedAtField) } - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductDeletedAt(isNotDistinctOperator), ) ts.Nil(err) @@ -1018,7 +1018,7 @@ func (ts *OperatorIntTestSuite) TestDynamicOperatorForBadORMModelAttribute() { } func (ts *OperatorIntTestSuite) TestMultitypeOperatorWithFieldOfAnotherTypeReturnsError() { - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductInt( multitype.Eq[int](conditions.ProductStringField), ), @@ -1035,7 +1035,7 @@ func (ts *OperatorIntTestSuite) TestMultitypeOperatorForNullableTypeCanBeCompare ts.createProduct("", 1, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductNullFloat( multitype.Eq[sql.NullFloat64](conditions.ProductFloatField), ), @@ -1053,7 +1053,7 @@ func (ts *OperatorIntTestSuite) TestMultitypeOperatorForNotNullTypeCanBeCompared ts.createProduct("", 1, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductFloat( multitype.Eq[float64](conditions.ProductNullFloatField), ), @@ -1081,14 +1081,14 @@ func (ts *OperatorIntTestSuite) TestMultitypeOperatorForBadORMModelAttribute() { ) } - entities, err := ts.crudProductService.GetEntities(isDistinctCondition) + entities, err := ts.crudProductService.Query(isDistinctCondition) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) } func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithValueOfAnotherTypeReturnsError() { - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductInt( multitype.Between[int, int]("hola", 1), ), @@ -1098,7 +1098,7 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithValueOfAnothe } func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithFieldOfAnotherTypeReturnsError() { - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductInt( multitype.Between[int, int](1, conditions.ProductCreatedAtField), ), @@ -1108,7 +1108,7 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithFieldOfAnothe } func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithFieldOfNotRelatedTypeReturnsError() { - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductInt( multitype.Between[int, time.Time](1, conditions.ProductCreatedAtField), ), @@ -1121,7 +1121,7 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithAFieldAndAVal match := ts.createProduct("", 1, 0.0, false, nil) ts.createProduct("", 0, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( multitype.Between[int, int](1, conditions.ProductIntField), ), @@ -1149,7 +1149,7 @@ func (ts *OperatorIntTestSuite) TestMultitypeMultivalueOperatorWithAFieldRelated ts.createProduct("", 0, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductFloat( multitype.Between[float64, sql.NullFloat64](1.0, conditions.ProductNullFloatField), ), @@ -1166,7 +1166,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatchConvertible ts.createProduct("", 0, 2, false, nil) ts.createProduct("", 0, 2.3, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductFloat( unsafe.Eq[float64]("2.1"), ), @@ -1184,7 +1184,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatchNotConverti ts.createProduct("", 0, 2, false, nil) ts.createProduct("", 0, 2.3, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductFloat( unsafe.Eq[float64]("not_convertible_to_float"), ), @@ -1198,7 +1198,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatchNotConverti ts.createProduct("", 0, 2, false, nil) ts.createProduct("", 0, 2.3, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductFloat( unsafe.Eq[float64]("not_convertible_to_float"), ), @@ -1208,7 +1208,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatchNotConverti EqualList(&ts.Suite, []*models.Product{match}, entities) case configuration.SQLServer: // returns an error - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductFloat( unsafe.Eq[float64]("not_convertible_to_float"), ), @@ -1216,7 +1216,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseTypesNotMatchNotConverti ts.ErrorContains(err, "mssql: Error converting data type nvarchar to float.") case configuration.PostgreSQL: // returns an error - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductFloat( unsafe.Eq[float64]("not_convertible_to_float"), ), @@ -1234,7 +1234,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseFieldWithTypesNotMatch() ts.createProduct("0", 0, 1, false, nil) ts.createProduct("not_convertible", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductFloat( unsafe.Eq[float64](conditions.ProductStringField), ), @@ -1249,7 +1249,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseFieldWithTypesNotMatch() match3 := ts.createProduct("not_convertible", 2, 0, false, nil) ts.createProduct("0.0", 2, 1.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductFloat( unsafe.Eq[float64](conditions.ProductStringField), ), @@ -1262,7 +1262,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseFieldWithTypesNotMatch() match1 := ts.createProduct("0", 1, 0, false, nil) match2 := ts.createProduct("1", 2, 1, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductFloat( unsafe.Eq[float64](conditions.ProductStringField), ), @@ -1274,7 +1274,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseFieldWithTypesNotMatch() ts.createProduct("not_convertible", 3, 0, false, nil) ts.createProduct("0.0", 4, 1.0, false, nil) - _, err = ts.crudProductService.GetEntities( + _, err = ts.crudProductService.Query( conditions.ProductFloat( unsafe.Eq[float64](conditions.ProductStringField), ), @@ -1282,7 +1282,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorInCaseFieldWithTypesNotMatch() ts.ErrorContains(err, "mssql: Error converting data type nvarchar to float.") case configuration.PostgreSQL: // returns an error - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( conditions.ProductFloat( unsafe.Eq[float64](conditions.ProductStringField), ), @@ -1313,7 +1313,7 @@ func (ts *OperatorIntTestSuite) TestUnsafeOperatorCanCompareFieldsThatMapToTheSa ts.createProduct("", 0, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( unsafe.Eq[string](conditions.ProductMultiStringField), ), diff --git a/testintegration/preload_conditions_test.go b/testintegration/preload_conditions_test.go index 52884e5e..b655f002 100644 --- a/testintegration/preload_conditions_test.go +++ b/testintegration/preload_conditions_test.go @@ -56,7 +56,7 @@ func (ts *PreloadConditionsIntTestSuite) TestNoPreloadReturnsErrorOnGetRelation( seller := ts.createSeller("franco", nil) sale := ts.createSale(0, product, seller) - entities, err := ts.crudSaleService.GetEntities() + entities, err := ts.crudSaleService.Query() ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{sale}, entities) @@ -76,7 +76,7 @@ func (ts *PreloadConditionsIntTestSuite) TestNoPreloadWhenItsNullKnowsItsReallyN product := ts.createProduct("a_string", 1, 0.0, false, nil) sale := ts.createSale(10, product, nil) - entities, err := ts.crudSaleService.GetEntities() + entities, err := ts.crudSaleService.Query() ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{sale}, entities) @@ -102,7 +102,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadWithoutWhereConditionDoesNot withSeller := ts.createSale(0, product1, seller1) withoutSeller := ts.createSale(0, product2, nil) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SalePreloadSeller, ) ts.Nil(err) @@ -132,7 +132,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadNullableAtSecondLevel() { sale1 := ts.createSale(0, product1, withoutCompany) sale2 := ts.createSale(0, product2, withCompany) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleSeller( conditions.SellerPreloadCompany, ), @@ -172,7 +172,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadAtSecondLevelWorksWithManual sale1 := ts.createSale(0, product1, withoutCompany) sale2 := ts.createSale(0, product2, withCompany) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleSeller( conditions.SellerPreloadAttributes, conditions.SellerPreloadCompany, @@ -213,7 +213,7 @@ func (ts *PreloadConditionsIntTestSuite) TestNoPreloadNullableAtSecondLevel() { sale1 := ts.createSale(0, product1, withoutCompany) sale2 := ts.createSale(0, product2, withCompany) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SalePreloadSeller, ) ts.Nil(err) @@ -250,7 +250,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadWithoutWhereConditionDoesNot withSeller := ts.createSale(0, product1, seller1) withoutSeller := ts.createSale(0, product2, nil) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleSeller( conditions.SellerPreloadCompany, ), @@ -283,7 +283,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadUIntModel() { phone1 := ts.createPhone("pixel", *brand1) phone2 := ts.createPhone("iphone", *brand2) - entities, err := ts.crudPhoneService.GetEntities( + entities, err := ts.crudPhoneService.Query( conditions.PhonePreloadBrand, ) ts.Nil(err) @@ -307,7 +307,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadSelfReferential() { employee1 := ts.createEmployee("franco", boss1) employee2 := ts.createEmployee("pierre", nil) - entities, err := ts.crudEmployeeService.GetEntities( + entities, err := ts.crudEmployeeService.Query( conditions.EmployeePreloadBoss, ) ts.Nil(err) @@ -334,7 +334,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadSelfReferentialAtSecondLevel } employee := ts.createEmployee("franco", boss) - entities, err := ts.crudEmployeeService.GetEntities( + entities, err := ts.crudEmployeeService.Query( conditions.EmployeeBoss( conditions.EmployeeBoss( conditions.EmployeePreloadAttributes, @@ -367,7 +367,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadWithWhereConditionFilters() match := ts.createSale(0, product1, nil) ts.createSale(0, product2, nil) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleProduct( conditions.ProductPreloadAttributes, conditions.ProductInt(badorm.Eq(1)), @@ -395,7 +395,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadOneToOne() { country1 := ts.createCountry("Argentina", capital1) country2 := ts.createCountry("France", capital2) - entities, err := ts.crudCityService.GetEntities( + entities, err := ts.crudCityService.Query( conditions.CityPreloadCountry, ) ts.Nil(err) @@ -426,7 +426,7 @@ func (ts *PreloadConditionsIntTestSuite) TestNoPreloadOneToOne() { ts.createCountry("Argentina", capital1) - entities, err := ts.crudCityService.GetEntities() + entities, err := ts.crudCityService.Query() ts.Nil(err) EqualList(&ts.Suite, []*models.City{&capital1}, entities) @@ -445,7 +445,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadOneToOneReversed() { country1 := ts.createCountry("Argentina", capital1) country2 := ts.createCountry("France", capital2) - entities, err := ts.crudCountryService.GetEntities( + entities, err := ts.crudCountryService.Query( conditions.CountryPreloadCapital, ) ts.Nil(err) @@ -468,7 +468,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadHasManyReversed() { seller1 := ts.createSeller("franco", company1) seller2 := ts.createSeller("agustin", company2) - entities, err := ts.crudSellerService.GetEntities( + entities, err := ts.crudSellerService.Query( conditions.SellerPreloadCompany, ) ts.Nil(err) @@ -496,7 +496,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadDifferentEntitiesWithConditi ts.createSale(0, product1, seller2) ts.createSale(0, product2, seller1) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleProduct( conditions.ProductPreloadAttributes, conditions.ProductInt(badorm.Eq(1)), @@ -535,7 +535,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadDifferentEntitiesWithoutCond err = ts.db.Create(child).Error ts.Nil(err) - entities, err := ts.crudChildService.GetEntities( + entities, err := ts.crudChildService.Query( conditions.ChildPreloadParent1, conditions.ChildPreloadParent2, ) @@ -568,7 +568,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadRelations() { err = ts.db.Create(child).Error ts.Nil(err) - entities, err := ts.crudChildService.GetEntities( + entities, err := ts.crudChildService.Query( conditions.ChildPreloadRelations..., ) ts.Nil(err) @@ -600,7 +600,7 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithoutC err = ts.db.Create(child).Error ts.Nil(err) - entities, err := ts.crudChildService.GetEntities( + entities, err := ts.crudChildService.Query( conditions.ChildParent1( conditions.Parent1PreloadAttributes, conditions.Parent1PreloadParentParent, @@ -653,7 +653,7 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadWithCond err = ts.db.Create(child2).Error ts.Nil(err) - entities, err := ts.crudChildService.GetEntities( + entities, err := ts.crudChildService.Query( conditions.ChildParent1( conditions.Parent1PreloadAttributes, conditions.Parent1ParentParent( @@ -691,7 +691,7 @@ func (ts *PreloadConditionsIntTestSuite) TestJoinMultipleTimesAndPreloadDiamond( err = ts.db.Create(child).Error ts.Nil(err) - entities, err := ts.crudChildService.GetEntities( + entities, err := ts.crudChildService.Query( conditions.ChildParent1( conditions.Parent1PreloadParentParent, ), @@ -724,7 +724,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadCollection() { seller1 := ts.createSeller("1", company) seller2 := ts.createSeller("2", company) - entities, err := ts.crudCompanyService.GetEntities( + entities, err := ts.crudCompanyService.Query( conditions.CompanyPreloadSellers(), ) ts.Nil(err) @@ -738,7 +738,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadCollection() { func (ts *PreloadConditionsIntTestSuite) TestPreloadEmptyCollection() { company := ts.createCompany("ditrit") - entities, err := ts.crudCompanyService.GetEntities( + entities, err := ts.crudCompanyService.Query( conditions.CompanyPreloadSellers(), ) ts.Nil(err) @@ -752,7 +752,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadEmptyCollection() { func (ts *PreloadConditionsIntTestSuite) TestNoPreloadCollection() { company := ts.createCompany("ditrit") - entities, err := ts.crudCompanyService.GetEntities() + entities, err := ts.crudCompanyService.Query() ts.Nil(err) EqualList(&ts.Suite, []*models.Company{company}, entities) @@ -775,7 +775,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributes() { err = ts.db.Save(seller2).Error ts.Nil(err) - entities, err := ts.crudCompanyService.GetEntities( + entities, err := ts.crudCompanyService.Query( conditions.CompanyPreloadSellers( conditions.SellerPreloadUniversity, ), @@ -823,7 +823,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadMultipleListsAndNestedAttrib err = ts.db.Save(seller4).Error ts.Nil(err) - entities, err := ts.crudCompanyService.GetEntities( + entities, err := ts.crudCompanyService.Query( conditions.CompanyPreloadSellers( conditions.SellerPreloadUniversity, ), @@ -869,7 +869,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadMultipleListsAndNestedAttrib } func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributesWithFiltersReturnsError() { - _, err := ts.crudCompanyService.GetEntities( + _, err := ts.crudCompanyService.Query( conditions.CompanyPreloadSellers( conditions.SellerUniversity( conditions.UniversityPreloadAttributes, @@ -882,7 +882,7 @@ func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributesWithF } func (ts *PreloadConditionsIntTestSuite) TestPreloadListAndNestedAttributesWithoutPreloadReturnsError() { - _, err := ts.crudCompanyService.GetEntities( + _, err := ts.crudCompanyService.Query( conditions.CompanyPreloadSellers( conditions.SellerUniversity(), ), diff --git a/testintegration/crudUnsafeService_test.go b/testintegration/unsafeCRUDService_test.go similarity index 91% rename from testintegration/crudUnsafeService_test.go rename to testintegration/unsafeCRUDService_test.go index 22b95834..9fa49369 100644 --- a/testintegration/crudUnsafeService_test.go +++ b/testintegration/unsafeCRUDService_test.go @@ -4,34 +4,35 @@ import ( "gorm.io/gorm" "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/badorm/unsafe" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/testintegration/models" ) type CRUDUnsafeServiceIntTestSuite struct { CRUDServiceCommonIntTestSuite - crudProductService badorm.CRUDUnsafeService[models.Product, badorm.UUID] - crudSaleService badorm.CRUDUnsafeService[models.Sale, badorm.UUID] - crudSellerService badorm.CRUDUnsafeService[models.Seller, badorm.UUID] - crudCountryService badorm.CRUDUnsafeService[models.Country, badorm.UUID] - crudCityService badorm.CRUDUnsafeService[models.City, badorm.UUID] - crudEmployeeService badorm.CRUDUnsafeService[models.Employee, badorm.UUID] - crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, badorm.UUID] - crudBrandService badorm.CRUDUnsafeService[models.Brand, badorm.UIntID] - crudPhoneService badorm.CRUDUnsafeService[models.Phone, badorm.UIntID] + crudProductService unsafe.CRUDService[models.Product, badorm.UUID] + crudSaleService unsafe.CRUDService[models.Sale, badorm.UUID] + crudSellerService unsafe.CRUDService[models.Seller, badorm.UUID] + crudCountryService unsafe.CRUDService[models.Country, badorm.UUID] + crudCityService unsafe.CRUDService[models.City, badorm.UUID] + crudEmployeeService unsafe.CRUDService[models.Employee, badorm.UUID] + crudBicycleService unsafe.CRUDService[models.Bicycle, badorm.UUID] + crudBrandService unsafe.CRUDService[models.Brand, badorm.UIntID] + crudPhoneService unsafe.CRUDService[models.Phone, badorm.UIntID] } func NewCRUDUnsafeServiceIntTestSuite( db *gorm.DB, - crudProductService badorm.CRUDUnsafeService[models.Product, badorm.UUID], - crudSaleService badorm.CRUDUnsafeService[models.Sale, badorm.UUID], - crudSellerService badorm.CRUDUnsafeService[models.Seller, badorm.UUID], - crudCountryService badorm.CRUDUnsafeService[models.Country, badorm.UUID], - crudCityService badorm.CRUDUnsafeService[models.City, badorm.UUID], - crudEmployeeService badorm.CRUDUnsafeService[models.Employee, badorm.UUID], - crudBicycleService badorm.CRUDUnsafeService[models.Bicycle, badorm.UUID], - crudBrandService badorm.CRUDUnsafeService[models.Brand, badorm.UIntID], - crudPhoneService badorm.CRUDUnsafeService[models.Phone, badorm.UIntID], + crudProductService unsafe.CRUDService[models.Product, badorm.UUID], + crudSaleService unsafe.CRUDService[models.Sale, badorm.UUID], + crudSellerService unsafe.CRUDService[models.Seller, badorm.UUID], + crudCountryService unsafe.CRUDService[models.Country, badorm.UUID], + crudCityService unsafe.CRUDService[models.City, badorm.UUID], + crudEmployeeService unsafe.CRUDService[models.Employee, badorm.UUID], + crudBicycleService unsafe.CRUDService[models.Bicycle, badorm.UUID], + crudBrandService unsafe.CRUDService[models.Brand, badorm.UIntID], + crudPhoneService unsafe.CRUDService[models.Phone, badorm.UIntID], ) *CRUDUnsafeServiceIntTestSuite { return &CRUDUnsafeServiceIntTestSuite{ CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ diff --git a/testintegration/where_conditions_test.go b/testintegration/where_conditions_test.go index 759b9be1..98da17e0 100644 --- a/testintegration/where_conditions_test.go +++ b/testintegration/where_conditions_test.go @@ -37,33 +37,33 @@ func NewWhereConditionsIntTestSuite( } } -// ------------------------- GetEntity -------------------------------- +// ------------------------- GetByID -------------------------------- func (ts *WhereConditionsIntTestSuite) TestGetEntityReturnsErrorIfNotEntityCreated() { - _, err := ts.crudProductService.GetEntity(badorm.NilUUID) + _, err := ts.crudProductService.GetByID(badorm.NilUUID) ts.Error(err, gorm.ErrRecordNotFound) } func (ts *WhereConditionsIntTestSuite) TestGetEntityReturnsErrorIfNotEntityMatch() { ts.createProduct("", 0, 0, false, nil) - _, err := ts.crudProductService.GetEntity(badorm.NewUUID()) + _, err := ts.crudProductService.GetByID(badorm.NewUUID()) ts.Error(err, gorm.ErrRecordNotFound) } func (ts *WhereConditionsIntTestSuite) TestGetEntityReturnsTheEntityIfItIsCreate() { match := ts.createProduct("", 0, 0, false, nil) - entity, err := ts.crudProductService.GetEntity(match.ID) + entity, err := ts.crudProductService.GetByID(match.ID) ts.Nil(err) assert.DeepEqual(ts.T(), match, entity) } -// ------------------------- GetEntities -------------------------------- +// ------------------------- Query -------------------------------- func (ts *WhereConditionsIntTestSuite) TestGetEntitiesReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.crudProductService.GetEntities() + entities, err := ts.crudProductService.Query() ts.Nil(err) EqualList(&ts.Suite, []*models.Product{}, entities) @@ -72,7 +72,7 @@ func (ts *WhereConditionsIntTestSuite) TestGetEntitiesReturnsEmptyIfNotEntitiesC func (ts *WhereConditionsIntTestSuite) TestGetEntitiesReturnsTheOnlyOneIfOneEntityCreated() { match := ts.createProduct("", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities() + entities, err := ts.crudProductService.Query() ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) @@ -83,14 +83,14 @@ func (ts *WhereConditionsIntTestSuite) TestGetEntitiesReturnsTheListWhenMultiple match2 := ts.createProduct("", 0, 0, false, nil) match3 := ts.createProduct("", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities() + entities, err := ts.crudProductService.Query() ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) } func (ts *WhereConditionsIntTestSuite) TestConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( badorm.Eq("not_created"), ), @@ -103,7 +103,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionsReturnsEmptyIfNotEntitiesCr func (ts *WhereConditionsIntTestSuite) TestConditionsReturnsEmptyIfNothingMatch() { ts.createProduct("something_else", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( badorm.Eq("not_match"), ), @@ -117,7 +117,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionsReturnsOneIfOnlyOneMatch() match := ts.createProduct("match", 0, 0, false, nil) ts.createProduct("not_match", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( badorm.Eq("match"), ), @@ -132,7 +132,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionsReturnsMultipleIfMultipleMa match2 := ts.createProduct("match", 0, 0, false, nil) ts.createProduct("not_match", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString( badorm.Eq("match"), ), @@ -146,7 +146,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfIntType() { match := ts.createProduct("match", 1, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt( badorm.Eq(1), ), @@ -160,7 +160,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfFloatType() { match := ts.createProduct("match", 0, 1.1, false, nil) ts.createProduct("not_match", 0, 2.2, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductFloat( badorm.Eq(1.1), ), @@ -174,7 +174,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfBoolType() { match := ts.createProduct("match", 0, 0.0, true, nil) ts.createProduct("not_match", 0, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductBool( badorm.Eq(true), ), @@ -191,7 +191,7 @@ func (ts *WhereConditionsIntTestSuite) TestMultipleConditionsOfDifferentTypesWor ts.createProduct("not_match", 1, 0.0, true, nil) ts.createProduct("match", 2, 0.0, true, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString(badorm.Eq("match")), conditions.ProductInt(badorm.Eq(1)), conditions.ProductBool(badorm.Eq(true)), @@ -205,7 +205,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfID() { match := ts.createProduct("", 0, 0.0, false, nil) ts.createProduct("", 0, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductId( badorm.Eq(match.ID), ), @@ -219,7 +219,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfCreatedAt() { match := ts.createProduct("", 0, 0.0, false, nil) ts.createProduct("", 0, 0.0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductCreatedAt(badorm.Eq(match.CreatedAt)), ) ts.Nil(err) @@ -233,7 +233,7 @@ func (ts *WhereConditionsIntTestSuite) TestDeletedAtConditionIsAddedAutomaticall ts.Nil(ts.db.Delete(deleted).Error) - entities, err := ts.crudProductService.GetEntities() + entities, err := ts.crudProductService.Query() ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) @@ -247,7 +247,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfDeletedAtNotNil() { ts.Nil(ts.db.Delete(match).Error) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductDeletedAt(badorm.Eq(match.DeletedAt)), ) ts.Nil(err) @@ -264,7 +264,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfEmbedded() { err := ts.db.Save(match).Error ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductToBeEmbeddedEmbeddedInt(badorm.Eq(1)), ) ts.Nil(err) @@ -281,7 +281,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfGormEmbedded() { err := ts.db.Save(match).Error ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductGormEmbeddedInt(badorm.Eq(1)), ) ts.Nil(err) @@ -296,7 +296,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfPointerTypeWithValue() { ts.createProduct("not_match", 2, 0, false, &intNotMatch) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductIntPointer(badorm.Eq(1)), ) ts.Nil(err) @@ -318,7 +318,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfByteArrayWithContent() { err = ts.db.Save(notMatch1).Error ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductByteArray(badorm.Eq([]byte{1, 2})), ) ts.Nil(err) @@ -340,7 +340,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfByteArrayEmpty() { err = ts.db.Save(notMatch1).Error ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductByteArray(badorm.Eq([]byte{})), ) ts.Nil(err) @@ -362,7 +362,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfCustomType() { err = ts.db.Save(notMatch1).Error ts.Nil(err) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductMultiString(badorm.Eq(models.MultiString{"salut", "hola"})), ) ts.Nil(err) @@ -380,7 +380,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfRelationType() { match := ts.createSale(0, product1, seller1) ts.createSale(0, product2, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleProductId(badorm.Eq(product1.ID)), ) ts.Nil(err) @@ -398,7 +398,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfRelationTypeOptionalWithVa match := ts.createSale(0, product1, seller1) ts.createSale(0, product2, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleSellerId(badorm.Eq(seller1.ID)), ) ts.Nil(err) @@ -415,7 +415,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionOfRelationTypeOptionalByNil( match := ts.createSale(0, product1, nil) ts.createSale(0, product2, seller2) - entities, err := ts.crudSaleService.GetEntities( + entities, err := ts.crudSaleService.Query( conditions.SaleSellerId(badorm.IsNull[badorm.UUID]()), ) ts.Nil(err) @@ -427,7 +427,7 @@ func (ts *WhereConditionsIntTestSuite) TestConditionsOnUIntModel() { match := ts.createBrand("match") ts.createBrand("not_match") - entities, err := ts.crudBrandService.GetEntities( + entities, err := ts.crudBrandService.Query( conditions.BrandName(badorm.Eq("match")), ) ts.Nil(err) @@ -441,7 +441,7 @@ func (ts *WhereConditionsIntTestSuite) TestMultipleConditionsAreConnectedByAnd() ts.createProduct("not_match", 1, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductInt(badorm.GtOrEq(3)), conditions.ProductInt(badorm.LtOrEq(4)), conditions.ProductString(badorm.Eq("match")), @@ -458,7 +458,7 @@ func (ts *WhereConditionsIntTestSuite) TestNot() { ts.createProduct("not_match", 2, 0, false, nil) ts.createProduct("not_match", 2, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( badorm.Not(conditions.ProductInt(badorm.Eq(2))), ) ts.Nil(err) @@ -473,7 +473,7 @@ func (ts *WhereConditionsIntTestSuite) TestNotWithMultipleConditionsAreConnected ts.createProduct("not_match", 2, 0, false, nil) ts.createProduct("not_match", 3, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( badorm.Not( conditions.ProductInt(badorm.Gt(1)), conditions.ProductInt(badorm.Lt(4)), @@ -492,7 +492,7 @@ func (ts *WhereConditionsIntTestSuite) TestOr() { ts.createProduct("not_match", 1, 0, false, nil) ts.createProduct("not_match", 4, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( badorm.Or( conditions.ProductInt(badorm.Eq(2)), conditions.ProductInt(badorm.Eq(3)), @@ -512,8 +512,8 @@ func (ts *WhereConditionsIntTestSuite) TestNotOr() { ts.createProduct("not_match", 2, 0, false, nil) ts.createProduct("not_match_string", 3, 0, false, nil) - entities, err := ts.crudProductService.GetEntities( - badorm.Not[models.Product]( + entities, err := ts.crudProductService.Query( + badorm.Not( badorm.Or( conditions.ProductInt(badorm.Eq(2)), conditions.ProductString(badorm.Eq("not_match_string")), @@ -545,7 +545,7 @@ func (ts *WhereConditionsIntTestSuite) TestXor() { } if xorCondition != nil { - entities, err := ts.crudProductService.GetEntities(xorCondition) + entities, err := ts.crudProductService.Query(xorCondition) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) @@ -559,7 +559,7 @@ func (ts *WhereConditionsIntTestSuite) TestMultipleConditionsDifferentOperators( ts.createProduct("not_match", 1, 0.0, true, nil) ts.createProduct("match", 2, 0.0, true, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( conditions.ProductString(badorm.Eq("match")), conditions.ProductInt(badorm.Lt(2)), conditions.ProductBool(badorm.NotEq(false)), @@ -575,7 +575,7 @@ func (ts *WhereConditionsIntTestSuite) TestUnsafeCondition() { ts.createProduct("not_match", 2, 0.0, true, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( unsafe.NewCondition[models.Product]("%s.int = ?", 1), ) ts.Nil(err) @@ -587,7 +587,7 @@ func (ts *WhereConditionsIntTestSuite) TestEmptyConnectionConditionMakesNothing( match1 := ts.createProduct("match", 1, 0.0, true, nil) match2 := ts.createProduct("match", 1, 0.0, true, nil) - entities, err := ts.crudProductService.GetEntities( + entities, err := ts.crudProductService.Query( badorm.And[models.Product](), ) ts.Nil(err) @@ -596,7 +596,7 @@ func (ts *WhereConditionsIntTestSuite) TestEmptyConnectionConditionMakesNothing( } func (ts *WhereConditionsIntTestSuite) TestEmptyContainerConditionReturnsError() { - _, err := ts.crudProductService.GetEntities( + _, err := ts.crudProductService.Query( badorm.Not[models.Product](), ) ts.ErrorIs(err, badorm.ErrEmptyConditions) From 0b7e3084a93e7ef558e87ad648b92e2648011c8b Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Tue, 18 Jul 2023 19:05:56 +0200 Subject: [PATCH 445/467] readthedocs -> .readthedocs --- readthedocs.yml => .readthedocs.yml | 0 badorm/README.md | 2 +- docs/badaas/functionalities.rst | 14 +++++++++---- docs/badaas/quickstart.rst | 31 +++++++++++++++++++++-------- 4 files changed, 34 insertions(+), 13 deletions(-) rename readthedocs.yml => .readthedocs.yml (100%) diff --git a/readthedocs.yml b/.readthedocs.yml similarity index 100% rename from readthedocs.yml rename to .readthedocs.yml diff --git a/badorm/README.md b/badorm/README.md index 0da04e8a..6a4d6a2f 100644 --- a/badorm/README.md +++ b/badorm/README.md @@ -20,4 +20,4 @@ See [this section](../CONTRIBUTING.md). ## License -Badaas is Licensed under the [Mozilla Public License Version 2.0](../LICENSE). \ No newline at end of file +Badaas is Licensed under the [Mozilla Public License Version 2.0](../LICENSE). diff --git a/docs/badaas/functionalities.rst b/docs/badaas/functionalities.rst index cd73fc74..6fb66bc2 100644 --- a/docs/badaas/functionalities.rst +++ b/docs/badaas/functionalities.rst @@ -6,7 +6,9 @@ InfoControllerModule ------------------------------- `InfoControllerModule` adds the path `/info`, where the api version will be answered. -To set the version we want to be responded to we must provide the version using fx:: +To set the version we want to be responded to we must provide the version using fx: + +.. code-block:: go func runCommandFunc(cmd *cobra.Command, args []string) { fx.New( @@ -26,7 +28,9 @@ AuthControllerModule ------------------------------- `AuthControllerModule` adds `/login` and `/logout`, -which allow us to add authentication to our application in a simple way:: +which allow us to add authentication to our application in a simple way: + +.. code-block:: go func runCommandFunc(cmd *cobra.Command, args []string) { fx.New( @@ -44,7 +48,8 @@ EAVControllerModule where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to create, read, update and remove objects using an EAV model. For more information on how to use them, see the `example `_. -:: + +.. code-block:: go func runCommandFunc(cmd *cobra.Command, args []string) { fx.New( @@ -61,7 +66,8 @@ CRUDControllerModule where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to read objects. For more information on how to use them, see the `example `_. -:: + +.. code-block:: go func runCommandFunc(cmd *cobra.Command, args []string) { fx.New( diff --git a/docs/badaas/quickstart.rst b/docs/badaas/quickstart.rst index d71dc1fa..3f5fd8bf 100644 --- a/docs/badaas/quickstart.rst +++ b/docs/badaas/quickstart.rst @@ -2,19 +2,24 @@ Quickstart ============================== -To quickly get badaas up and running, you can head to the `example `_. This example will help you to see how to use badaas and as a template to start your own project. +To quickly get badaas up and running, you can head to the `example `_. +This example will help you to see how to use badaas and as a template to start your own project. Step-by-step instructions ----------------------------------- Once you have started your project with :code:`go init`, you must add the dependency to badaas. To use badaas, your project must also use `fx `_ and -`verdeter `_:: +`verdeter `_: + +.. code-block:: bash go get -u github.com/ditrit/badaas github.com/uber-go/fx github.com/ditrit/verdeter Then, your application must be defined as a `verdeter command` and you have to call -the configuration of this command:: +the configuration of this command: + +.. code-block:: go var command = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ Use: "badaas", @@ -31,7 +36,9 @@ the configuration of this command:: command.Execute() } -Then, in the Run function of your command, you must use `fx` and start the badaas functions:: +Then, in the Run function of your command, you must use `fx` and start the badaas functions: + +.. code-block:: go func runCommandFunc(cmd *cobra.Command, args []string) { fx.New( @@ -43,7 +50,9 @@ Then, in the Run function of your command, you must use `fx` and start the badaa } You are free to choose which badaas functionalities you wish to use. -To add them, you must initialise the corresponding module:: +To add them, you must initialise the corresponding module: + +.. code-block:: go func runCommandFunc(cmd *cobra.Command, args []string) { fx.New( @@ -67,17 +76,23 @@ For details visit :doc:`functionalities`. Once you have defined the functionalities of your project (an http api for example), you can generate everything you need to run your application using `badctl`. -For installing it, use:: +For installing it, use: + +.. code-block:: bash go install github.com/ditrit/badaas/tools/badctl -Then generate files to make this project work with `cockroach` as database:: +Then generate files to make this project work with `cockroach` as database + +.. code-block:: bash badctl gen --db_provider cockroachdb For more information about `badctl` refer to :doc:`../badctl/index`. -Finally, you can run the api with:: +Finally, you can run the api with + +.. code-block:: bash make badaas_run From ae94ff63bc83ce0adbce49d74eada55ef800e4ff Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 19 Jul 2023 10:05:54 +0200 Subject: [PATCH 446/467] change docs theme --- .readthedocs.yml | 10 ++-------- docs/badaas/quickstart.rst | 8 +++++--- docs/conf.py | 10 +++++++++- docs/index.rst | 24 +++++++++++++----------- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index cfc86344..7dcd5ee7 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -2,7 +2,6 @@ # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details -# Required version: 2 # Set the version of Python and other tools you might need @@ -10,10 +9,6 @@ build: os: ubuntu-22.04 tools: python: "3.10" - # You can also specify other tool versions: - # nodejs: "16" - # rust: "1.55" - # golang: "1.17" # Build documentation in the docs/ directory with Sphinx sphinx: @@ -22,10 +17,9 @@ sphinx: # If using Sphinx, optionally build your docs in additional formats such as PDF formats: - pdf + - epub # Optionally declare the Python requirements required to build your docs python: install: - - requirements: docs/requirements.txt - - method: pip - path: . \ No newline at end of file + - requirements: docs/requirements.txt \ No newline at end of file diff --git a/docs/badaas/quickstart.rst b/docs/badaas/quickstart.rst index 3f5fd8bf..8c835194 100644 --- a/docs/badaas/quickstart.rst +++ b/docs/badaas/quickstart.rst @@ -2,8 +2,10 @@ Quickstart ============================== -To quickly get badaas up and running, you can head to the `example `_. -This example will help you to see how to use badaas and as a template to start your own project. +To quickly get badaas up and running, you can head to the +`example `_. +By following its README.md, you will see how to use badaas and it will be util +as a template to start your own project. Step-by-step instructions ----------------------------------- @@ -86,7 +88,7 @@ Then generate files to make this project work with `cockroach` as database .. code-block:: bash - badctl gen --db_provider cockroachdb + badctl gen docker --db_provider cockroachdb For more information about `badctl` refer to :doc:`../badctl/index`. diff --git a/docs/conf.py b/docs/conf.py index fc631ee5..86279d51 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -10,12 +10,17 @@ copyright = '2023, DitRit' author = 'DitRit' release = '0.0.1' +version = '0.0.1' # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = [ "myst_parser", + 'sphinx.ext.duration', + 'sphinx.ext.doctest', + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', "sphinx.ext.autosectionlabel", ] @@ -28,5 +33,8 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'alabaster' +html_theme = 'sphinx_rtd_theme' html_static_path = ['_static'] + +# -- Options for EPUB output +epub_show_urls = 'footnote' diff --git a/docs/index.rst b/docs/index.rst index 7c2ad268..84877d6e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,5 +1,3 @@ -.. _topics-index: - ============================== Introduction ============================== @@ -17,19 +15,23 @@ Features and components Badaas provides several key features, each provided by a component that can be used independently and has a different state of evolution: -- **Authentication** (unstable): Badaas can authenticate users using its internal authentication scheme or externally by using protocols such as OIDC, SAML, Oauth2... -- **Authorization** (wip_unstable): On resource access, Badaas will check if the user is authorized using a RBAC model. -- **Distribution** (todo): Badaas is built to run in clusters by default. Communications between nodes are TLS encrypted using `shoset `_. -- **Persistence** (wip_unstable): Applicative objects are persisted as well as user files. Those resources are shared across the clusters to increase resiliency. To achieve this, BaDaaS uses the :doc:`badorm/index` component. +- **Authentication** (unstable): Badaas can authenticate users using its internal + authentication scheme or externally by using protocols such as OIDC, SAML, Oauth2... +- **Authorization** (wip_unstable): On resource access, Badaas will check if the user + is authorized using a RBAC model. +- **Distribution** (todo): Badaas is built to run in clusters by default. + Communications between nodes are TLS encrypted using `shoset `_. +- **Persistence** (wip_unstable): Applicative objects are persisted as well as user files. + Those resources are shared across the clusters to increase resiliency. + To achieve this, BaDaaS uses the :doc:`BaDORM ` component. - **Querying Resources** (unstable): Resources are accessible via a REST API. -- **Posix compliant** (stable): Badaas strives towards being a good unix citizen and respecting commonly accepted norms. (see [Configuration](#configuration)) -- **Advanced logs management** (todo): Badaas provides an interface to interact with the logs produced by the clusters. Logs are formatted in json by default. +- **Posix compliant** (stable): Badaas strives towards being a good unix citizen and + respecting commonly accepted norms. (see :doc:`badaas/configuration`) +- **Advanced logs management** (todo): Badaas provides an interface to interact with + the logs produced by the clusters. Logs are formatted in json by default. Learn how to use BaDaaS following the :doc:`badaas/quickstart`. -Index -=========== - .. toctree:: :caption: BaDaaS From 54f7f94941ac08a6d8ead6946e2aadd9a2afdad6 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 19 Jul 2023 10:30:13 +0200 Subject: [PATCH 447/467] fix unit tests --- controllers/crud_test.go | 6 +++--- services/sessionservice/session_test.go | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/controllers/crud_test.go b/controllers/crud_test.go index a290532f..d1ad8314 100644 --- a/controllers/crud_test.go +++ b/controllers/crud_test.go @@ -71,7 +71,7 @@ func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { uuid := badorm.NewUUID() crudService. - On("GetEntity", uuid). + On("GetByID", uuid). Return(nil, gorm.ErrRecordNotFound) route := controllers.NewCRUDController[Model]( @@ -99,7 +99,7 @@ func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { uuid := badorm.NewUUID() crudService. - On("GetEntity", uuid). + On("GetByID", uuid). Return(nil, errors.New("db error")) route := controllers.NewCRUDController[Model]( @@ -128,7 +128,7 @@ func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { entity := Model{} crudService. - On("GetEntity", uuid). + On("GetByID", uuid). Return(&entity, nil) route := controllers.NewCRUDController[Model]( diff --git a/services/sessionservice/session_test.go b/services/sessionservice/session_test.go index c64f72c1..ec29c534 100644 --- a/services/sessionservice/session_test.go +++ b/services/sessionservice/session_test.go @@ -285,7 +285,7 @@ func Test_pullFromDB(t *testing.T) { UserID: badorm.NilUUID, ExpiresAt: time.Now().Add(time.Hour), } - sessionRepositoryMock.On("GetAll", gormDB).Return([]*models.Session{session}, nil) + sessionRepositoryMock.On("Query", gormDB).Return([]*models.Session{session}, nil) service.pullFromDB() assert.Len(t, service.cache, 1) @@ -299,7 +299,7 @@ func Test_pullFromDB(t *testing.T) { func Test_pullFromDB_repoError(t *testing.T) { sessionRepositoryMock, service, _, _ := setupTest(t) - sessionRepositoryMock.On("GetAll", gormDB).Return(nil, ExampleErr) + sessionRepositoryMock.On("Query", gormDB).Return(nil, ExampleErr) assert.PanicsWithError(t, ExampleErr.Error(), func() { service.pullFromDB() }) } From f3d7a6fb276430a73f76f1b39b4a7b7daaec06fa Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 19 Jul 2023 10:50:29 +0200 Subject: [PATCH 448/467] exclude docs from sonarcloud --- sonar-project.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sonar-project.properties b/sonar-project.properties index 69edb6d7..7e94e742 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.organization=ditrit sonar.projectName=badaas sonar.host.url=https://sonarcloud.io sonar.sources=. -sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/gen/docker/api/Dockerfile +sonar.exclusions=**/*_test.go,mocks/***,vendor/***,tools/badctl/cmd/gen/docker/api/Dockerfile,docs/*** sonar.tests=. sonar.test.inclusions=**/*_test.go,testintegration/***,test_e2e/***,tools/badctl/cmd/gen/conditions/tests/*** sonar.go.coverage.reportPaths=*.out From a7237d691a27db56eb2d8ee58eb0026471cc65e9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Wed, 19 Jul 2023 15:34:51 +0200 Subject: [PATCH 449/467] add contributing to the docs --- .github/ISSUE_TEMPLATE/bug_report.md | 2 + .github/ISSUE_TEMPLATE/discussion.md | 8 ++ CODE_OF_CONDUCT.md | 132 ++++++++++++++++++ CONTRIBUTING.md | 132 ------------------ Makefile | 7 +- README.md | 14 +- badorm/README.md | 2 +- docs/contributing/contributing.md | 64 +++++++++ docs/contributing/developing.md | 90 ++++++++++++ docs/contributing/maintaining.md | 17 +++ docs/index.rst | 10 +- services/userservice/userservice.go | 4 +- tools/badctl/README.md | 2 + {validators => utils/validators}/email.go | 2 +- .../validators}/email_test.go | 14 +- 15 files changed, 350 insertions(+), 150 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/discussion.md create mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md create mode 100644 docs/contributing/contributing.md create mode 100644 docs/contributing/developing.md create mode 100644 docs/contributing/maintaining.md rename {validators => utils/validators}/email.go (92%) rename {validators => utils/validators}/email_test.go (53%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 9cc652d2..e46cb414 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -31,6 +31,8 @@ If applicable, add screenshots to help explain your problem. Please complete the following information: - badaas version [X.X.X] or commit hash +- go version +- database vendor and version (in case of bugs related with BaDORM) ## Additional context diff --git a/.github/ISSUE_TEMPLATE/discussion.md b/.github/ISSUE_TEMPLATE/discussion.md new file mode 100644 index 00000000..275023ed --- /dev/null +++ b/.github/ISSUE_TEMPLATE/discussion.md @@ -0,0 +1,8 @@ +--- +name: Discussion +about: Start a discussion for BaDaaS +title: '' +labels: Discussion +assignees: '' +--- + \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..41fe403e --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 22b19f78..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,132 +0,0 @@ -# Contribute to the development of badaas - -- [Contribute to the development of badaas](#contribute-to-the-development-of-badaas) - - [Tests](#tests) - - [Dependencies](#dependencies) - - [Linting](#linting) - - [Unit tests](#unit-tests) - - [Integration tests](#integration-tests) - - [Feature tests (or end to end tests)](#feature-tests-or-end-to-end-tests) - - [Logger](#logger) - - [Directory structure](#directory-structure) - - [Git](#git) - - [Branch naming policy](#branch-naming-policy) - - [Default branch](#default-branch) - - [How to release](#how-to-release) - -## Tests - -### Dependencies - -Running tests have some dependencies as: `mockery`, `gotestsum`, etc.. Install them with `make install dependencies`. - -### Linting - -We use `golangci-lint` for linting our code. You can test it with `make lint`. The configuration file is in the default path (`.golangci.yml`). The file `.vscode.settings.json.template` is a template for your `.vscode/settings.json` that formats the code according to our configuration. - -### Unit tests - -We use the standard test suite in combination with [github.com/stretchr/testify](https://github.com/stretchr/testify) to do our unit testing. Mocks are generated using [mockery](https://github.com/vektra/mockery) a mock generator using this command `make test_generate_mocks`. - -To run them, please run: - -```sh -make -k test_unit -``` - -### Integration tests - -Integration tests have a database and the dependency injection system. BaDaaS and BaDORM are tested on multiple databases (those supported by gorm, which is the base of BaDORM). By default, the database used will be postgresql: - -```sh -make test_integration -``` - -To run the tests on another database you can use: `make test_integration_postgresql`, `make test_integration_cockroachdb`, `make test_integration_mysql`, `make test_integration_sqlite`, `make test_integration_sqlserver`. All of them will be verified by our continuous integration system. - -### Feature tests (or end to end tests) - -We use docker to run a Badaas instance in combination with one node of CockroachDB. - -Run: - -```sh -make test_e2e -``` - -The feature files can be found in the `test_e2e/features` folder. - -## Logger - -We use uber's [zap](https://pkg.go.dev/go.uber.org/zap) to log stuff, please take `zap.Logger` as an argument for your services constructors. [fx](https://github.com/uber-go/fx) will provide your service with an instance. - -## Directory structure - -This is the directory structure we use for the project: - -- `configuration/` *(Go code)*: Contains all the configuration holders. Please only use the interfaces, they are all mocked for easy testing. -- `controllers/` *(Go code)*: Contains all the http controllers, they handle http requests and consume services. -- `docs/`: Contains the documentation. -- `test_e2e/`: Contains all the feature and steps for e2e tests. -- `test_integration/`: Contains all the integration tests. -- `logger/` *(Go code)*: Contains the logger creation logic. Please don't call it from your own services and code, use the dependency injection system. -- `persistance/` *(Go code)*: - - `gormdatabase/` *(Go code)*: Contains the logic to create a database. Also contains a go package named `gormzap`: it is a compatibility layer between *gorm.io/gorm* and *github.com/uber-go/zap*. - - `models/` *(Go code)*: Contains the models. (For a structure to me considered a valid model, it has to embed `badorm.UUIDModel` or `badorm.UIntModel`.). - - `dto/` *(Go code)*: Contains the Data Transfer Objects. They are used mainly to decode json payloads. - - `repository/` *(Go code)*: Contains the repository interfaces and implementations to manage queries to the database. -- `router/` *(Go code)*: Contains http router of badaas and the routes that can be added by the user. - - `middlewares/` *(Go code)*: Contains the various http middlewares that we use. -- `docker/` : Contains the docker, docker-compose file and configuration files for different environments. -- `services/` *(Go code)*: Contains services. - - `auth/protocols/`: Contains the implementations of authentication clients for different protocols. - - `basicauth/` *(Go code)*: Handle the authentication using email/password. - - `oidc/` *(Go code)*: Handle the authentication via Open-ID Connect. - - `sessionservice/` *(Go code)*: Handle sessions and their lifecycle. - - `userservice/` *(Go code)*: Handle users. -- `validators/` *(Go code)*: Contains validators such as an email validator. -- `badorm/` *(Go code)*: Contains the code of the orm used by badaas. - -At the root of the project, you will find: - -- The README. -- The changelog. -- The LICENSE file. - -## Git - -### Branch naming policy - -`[BRANCH_TYPE]/[BRANCH_NAME]` - -- `BRANCH_TYPE` is a prefix to describe the purpose of the branch. - Accepted prefixes are: - - `feature`, used for feature development - - `bugfix`, used for bug fix - - `improvement`, used for refactor - - `library`, used for updating library - - `prerelease`, used for preparing the branch for the release - - `release`, used for releasing project - - `hotfix`, used for applying a hotfix on main - - `poc`, used for proof of concept -- `BRANCH_NAME` is managed by this regex: `[a-z0-9._-]` (`_` is used as space character). - -### Default branch - -The default branch is `main`. Direct commit on it is forbidden. The only way to update the application is through pull request. - -Release tag are only done on the `main` branch. - -### How to release - -We use [Semantic Versioning](https://semver.org/spec/v2.0.0.html) as guideline for the version management. - -Steps to release: - -- Create a new branch labeled `release/vX.Y.Z` from the latest `main`. -- Improve the version number in `changelog.md` and `resources/api.go`. -- Verify the content of the `changelog.md`. -- Commit the modifications with the label `Release version X.Y.Z`. -- Create a pull request on github for this branch into `main`. -- Once the pull request validated and merged, tag the `main` branch with `vX.Y.Z`. -- After the tag is pushed, make the release on the tag in GitHub. diff --git a/Makefile b/Makefile index 91473b0b..2a56596b 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,9 @@ PATHS = $(shell go list ./... | tail -n +2 | grep -v testintegration) install_dependencies: go install gotest.tools/gotestsum@latest - go install github.com/vektra/mockery/v2@v2.20.0 + go install github.com/vektra/mockery/v2@latest go install github.com/ditrit/badaas/tools/badctl@latest + go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest lint: golangci-lint run @@ -21,10 +22,6 @@ test_unit: test_unit_badaas test_unit_badctl rmdb: docker stop badaas-test-db && docker rm badaas-test-db -test_db: - docker compose -f "docker/test_db/docker-compose.yml" up -d - ./docker/wait_for_api.sh 8080/health - postgresql: docker compose -f "docker/postgresql/docker-compose.yml" up -d ./docker/wait_for_db.sh diff --git a/README.md b/README.md index 3e3a0c6a..9bff31d5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,13 @@ # BADAAS: Backend And Distribution As A Service +[![Build Status](https://github.com/ditrit/badaas/actions/workflows/CI.yml/badge.svg?branch=main)](https://github.com/ditrit/badaas/actions) +[![Go Report Card](https://goreportcard.com/badge/github.com/ditrit/badaas)](https://goreportcard.com/report/github.com/ditrit/badaas) +[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ditrit_badaas&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=ditrit_badaas) +[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=ditrit_badaas&metric=coverage)](https://sonarcloud.io/summary/new_code?id=ditrit_badaas) +[![Go.Dev reference](https://img.shields.io/badge/go.dev-reference-blue?logo=go&logoColor=white)](https://pkg.go.dev/github.com/ditrit/badaas) + +[![Discord DitRit](https://dcbadge.vercel.app/api/server/zkKfj9gj2C?style=flat&theme=default-inverted)](https://discord.gg/zkKfj9gj2C) + Badaas enables the effortless construction of ***distributed, resilient, highly available and secure applications by design***, while ensuring very simple deployment and management (NoOps). > **Warning** @@ -23,7 +31,11 @@ Badaas provides several key features, each provided by a component that can be u ## Contributing -See [this section](./CONTRIBUTING.md). +See [this section](./docs/contributing/contributing.md). + +## Code of Conduct + +This project has adopted the [Contributor Covenant Code of Conduct](CODE_OF_CONDUCT.md) ## License diff --git a/badorm/README.md b/badorm/README.md index 6a4d6a2f..eee9208e 100644 --- a/badorm/README.md +++ b/badorm/README.md @@ -16,7 +16,7 @@ BaDORM is built on top of `gorm `_, a library that actually pr ## Contributing -See [this section](../CONTRIBUTING.md). +See [this section](../docs/contributing/contributing.md) to view the badaas contribution guidelines. ## License diff --git a/docs/contributing/contributing.md b/docs/contributing/contributing.md new file mode 100644 index 00000000..7e44f536 --- /dev/null +++ b/docs/contributing/contributing.md @@ -0,0 +1,64 @@ +# Contributing + +Thank you for your interest in BaDaaS! This document provides the guidelines for how to contribute to the project through issues and pull-requests. Contributions can also come in additional ways such as joining the [DitRit discord server](https://discord.gg/zkKfj9gj2C), commenting on issues or pull requests and more. + +## Issues + +### Issue types + +There are 3 types of issues: + +- Bug report: You've found a bug with the code, and want to report it, or create an issue to track the bug. +- Discussion: You have something on your mind, which requires input form others in a discussion, before it eventually manifests as a proposal. +- Feature request: Used for items that propose a new idea or functionality. This allows feedback from others before code is written. + +To ask questions and troubleshoot, please join the [DitRit discord server](https://discord.gg/zkKfj9gj2C) (use the BADAAS channel). + +### Before submitting + +Before you submit an issue, make sure you’ve checked the following: + +1. Check for existing issues + - Before you create a new issue, please do a search in [open issues](https://github.com/ditrit/badaas/issues) to see if the issue or feature request has already been filed. + - If you find your issue already exists, make relevant comments and add your reaction. +2. For bugs + - It’s not an environment issue. + - You have as much data as possible. This usually comes in the form of logs and/or stacktrace. + +## Pull Requests + +All contributions come through pull requests. To submit a proposed change, follow this workflow: + +1. Make sure there's an issue (bug report or feature request) opened, which sets the expectations for the contribution you are about to make +2. Fork the [repo](https://github.com/ditrit/badaas) and create a new [branch](#branch-naming-policy) +3. Install the necessary [development environment](developing.md#environment) +4. Create your change and the corresponding [tests](developing.md#tests) +5. Update relevant documentation for the change in `docs/` +6. If changes are necessary in [BaDaaS example](https://github.com/ditrit/badaas-example) and [BaDORM example](https://github.com/ditrit/badorm-example), follow the same workflow there +7. Open a PR (and add links to the example repos' PR if they exist) +8. Wait for the CI process to finish and make sure all checks are green +9. A maintainer of the project will be assigned + +### Use work-in-progress PRs for early feedback + +A good way to communicate before investing too much time is to create a "Work-in-progress" PR and share it with your reviewers. The standard way of doing this is to add a "[WIP]" prefix in your PR’s title and assign the do-not-merge label. This will let people looking at your PR know that it is not well baked yet. + +### Branch naming policy + +`[BRANCH_TYPE]/[BRANCH_NAME]` + +- `BRANCH_TYPE` is a prefix to describe the purpose of the branch. + Accepted prefixes are: + - `feature`, used for feature development + - `bugfix`, used for bug fix + - `improvement`, used for refactor + - `library`, used for updating library + - `prerelease`, used for preparing the branch for the release + - `release`, used for releasing project + - `hotfix`, used for applying a hotfix on main + - `poc`, used for proof of concept +- `BRANCH_NAME` is managed by this regex: `[a-z0-9._-]` (`_` is used as space character). + +## Code of Conduct + +This project has adopted the [Contributor Covenant Code of Conduct](https://github.com/ditrit/badaas/blob/main/CODE_OF_CONDUCT.md) diff --git a/docs/contributing/developing.md b/docs/contributing/developing.md new file mode 100644 index 00000000..f7fc7a41 --- /dev/null +++ b/docs/contributing/developing.md @@ -0,0 +1,90 @@ +# Developing + +This document provides the information you need to know before developing code for a pull request. + +## Environment + +- Install [go](https://go.dev/doc/install) >= v1.20 +- Install project dependencies: `go get` +- Install [docker](https://docs.docker.com/engine/install/) and [compose plugin](https://docs.docker.com/compose/install/) + +## Directory structure + +This is the directory structure we use for the project: + +- `badorm/`: Contains the code of the BaDORM component. +- `configuration/`: Contains all the configuration holders. Please only use the interfaces, they are all mocked for easy testing. +- `controllers/`: Contains all the http controllers, they handle http requests and consume services. +- `docker/` : Contains the docker, docker-compose and configuration files for different environments. +- `docs/`: Contains the documentation showed for readthedocs.io. +- `httperrors/`: Contains the http errors that can be responded by the http api. Should be moved to `controller/` when services stop using them. +- `logger/`: Contains the logger creation logic. Please don't call it from your own services and code, use the dependency injection system. +- `mocks/`: Contains the mocks generated with `mockery`. +- `persistance/`: + - `gormdatabase/`: Contains the logic to create a database. Also contains a go package named `gormzap`: it is a compatibility layer between *gorm.io/gorm* and *github.com/uber-go/zap*. + - `models/`: Contains the models. + - `dto/`: Contains the Data Transfer Objects. They are used mainly to decode json payloads. + - `repository/`: Contains the repository interfaces and implementations to manage queries to the database. +- `router/`: Contains http router of badaas and the routes that can be added by the user. + - `middlewares/`: Contains the various http middlewares that we use. +- `services/`: Contains services. + - `auth/protocols/`: Contains the implementations of authentication clients for different protocols. + - `basicauth/`: Handle the authentication using email/password. + - `oidc/`: Handle the authentication via Open-ID Connect. +- `test_e2e/`: Contains all the feature and steps for e2e tests. +- `testintegration/`: Contains all the integration tests. +- `tools/`: Contains the go tools necessary to use BaDaaS. + - `badctl`: Contains the command line tool that makes it possible to configure and run BaDaaS applications easily. +- `utils/`: Contains functions that can be util all around the project, as managing data structures, time, etc. + +At the root of the project, you will find: + +- The README. +- The changelog. +- The LICENSE file. + +## Tests + +### Dependencies + +Running tests have some dependencies as: `mockery`, `gotestsum`, etc.. Install them with `make install_dependencies`. + +### Linting + +We use `golangci-lint` for linting our code. You can test it with `make lint`. The configuration file is in the default path (`.golangci.yml`). The file `.vscode.settings.json.template` is a template for your `.vscode/settings.json` that formats the code according to our configuration. + +### Unit tests + +We use the standard test suite in combination with [github.com/stretchr/testify](https://github.com/stretchr/testify) to do our unit testing. Mocks are generated using [mockery](https://github.com/vektra/mockery) a mock generator using the command `make test_generate_mocks`. + +To run them, please run: + +```sh +make -k test_unit +``` + +### Integration tests + +Integration tests have a database and the dependency injection system. BaDaaS and BaDORM are tested on multiple databases (those supported by gorm, which is the base of BaDORM). By default, the database used will be postgresql: + +```sh +make test_integration +``` + +To run the tests on another database you can use: `make test_integration_postgresql`, `make test_integration_cockroachdb`, `make test_integration_mysql`, `make test_integration_sqlite`, `make test_integration_sqlserver`. All of them will be verified by our continuous integration system. + +### Feature tests (end to end tests) + +We use docker to run a Badaas instance in combination with one node of CockroachDB. + +Run: + +```sh +make test_e2e +``` + +The feature files can be found in the `test_e2e/features` folder. + +## Use of Third-party code + +Third-party code must include licenses. diff --git a/docs/contributing/maintaining.md b/docs/contributing/maintaining.md new file mode 100644 index 00000000..0a86e5c4 --- /dev/null +++ b/docs/contributing/maintaining.md @@ -0,0 +1,17 @@ +# Maintaining + +This document is intended for BaDaaS maintainers only. + +## How to release + +Release tag are only done on the `main` branch. We use [Semantic Versioning](https://semver.org/spec/v2.0.0.html) as guideline for the version management. + +Steps to release: + +- Create a new branch labeled `release/vX.Y.Z` from the latest `main`. +- Improve the version number in `changelog.md`, `tools/badctl/cmd/version/version.go` and `docs/conf.py`. +- Verify the content of the `changelog.md`. +- Commit the modifications with the label `Release version X.Y.Z`. +- Create a pull request on github for this branch into `main`. +- Once the pull request validated and merged, tag the `main` branch with `vX.Y.Z`. +- After the tag is pushed, make the release on the tag in GitHub. diff --git a/docs/index.rst b/docs/index.rst index 84877d6e..68cd3d72 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -58,4 +58,12 @@ Learn how to use BaDaaS following the :doc:`badaas/quickstart`. badorm/crud badorm/query badorm/advanced_query - badorm/preloading \ No newline at end of file + badorm/preloading + +.. toctree:: + :caption: Contributing + + contributing/contributing + contributing/developing + contributing/maintaining + Github diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index bccbe92c..b51a2fd4 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -11,7 +11,7 @@ import ( "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/persistence/models/dto" "github.com/ditrit/badaas/services/auth/protocols/basicauth" - validator "github.com/ditrit/badaas/validators" + "github.com/ditrit/badaas/utils/validators" ) // UserService provide functions related to Users @@ -47,7 +47,7 @@ func NewUserService( // Create a new user func (userService *userServiceImpl) NewUser(username, email, password string) (*models.User, error) { - sanitizedEmail, err := validator.ValidEmail(email) + sanitizedEmail, err := validators.ValidEmail(email) if err != nil { return nil, fmt.Errorf("the provided email is not valid") } diff --git a/tools/badctl/README.md b/tools/badctl/README.md index b06384c5..1259eae2 100644 --- a/tools/badctl/README.md +++ b/tools/badctl/README.md @@ -8,6 +8,8 @@ ## Contributing +See [this section](../../docs/contributing/contributing.md) to view the badaas contribution guidelines. + You can make modifications to the badctl source code and compile it locally with: ```bash diff --git a/validators/email.go b/utils/validators/email.go similarity index 92% rename from validators/email.go rename to utils/validators/email.go index b9984c2b..1a10ab72 100644 --- a/validators/email.go +++ b/utils/validators/email.go @@ -1,4 +1,4 @@ -package validator +package validators import "net/mail" diff --git a/validators/email_test.go b/utils/validators/email_test.go similarity index 53% rename from validators/email_test.go rename to utils/validators/email_test.go index ecd84f90..600741ed 100644 --- a/validators/email_test.go +++ b/utils/validators/email_test.go @@ -1,31 +1,31 @@ -package validator_test +package validators_test import ( "testing" "github.com/stretchr/testify/assert" - validator "github.com/ditrit/badaas/validators" + "github.com/ditrit/badaas/utils/validators" ) func TestValidEmail(t *testing.T) { - mail, err := validator.ValidEmail("bob.bobemail.com") + mail, err := validators.ValidEmail("bob.bobemail.com") assert.Error(t, err) assert.Equal(t, "", mail) - mail, err = validator.ValidEmail("bob.bob@") + mail, err = validators.ValidEmail("bob.bob@") assert.Error(t, err) assert.Equal(t, "", mail) - mail, err = validator.ValidEmail("bob.bob@email.com") + mail, err = validators.ValidEmail("bob.bob@email.com") assert.NoError(t, err) assert.Equal(t, "bob.bob@email.com", mail) - mail, err = validator.ValidEmail("Gopher ") + mail, err = validators.ValidEmail("Gopher ") assert.NoError(t, err) assert.Equal(t, "from@example.com", mail) - mail, err = validator.ValidEmail("bob.bob%@email.com") + mail, err = validators.ValidEmail("bob.bob%@email.com") assert.NoError(t, err) assert.Equal(t, "bob.bob%@email.com", mail) } From 84f72faad8b7c920b9edfa8ce50d684e33431210 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Jul 2023 10:13:19 +0200 Subject: [PATCH 450/467] better contributing guideline --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/discussion.md | 3 +-- .github/ISSUE_TEMPLATE/user_story.md | 2 +- README.md | 4 +++- docs/contributing/contributing.md | 18 ++++++++++-------- docs/contributing/developing.md | 16 ++++++++++++---- docs/index.rst | 14 +++++++------- 7 files changed, 35 insertions(+), 24 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index e46cb414..29cbd6fd 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Bug report about: Create a report to help us improve title: '' -labels: Bug +labels: bug --- ## Describe the bug diff --git a/.github/ISSUE_TEMPLATE/discussion.md b/.github/ISSUE_TEMPLATE/discussion.md index 275023ed..9835b3a0 100644 --- a/.github/ISSUE_TEMPLATE/discussion.md +++ b/.github/ISSUE_TEMPLATE/discussion.md @@ -2,7 +2,6 @@ name: Discussion about: Start a discussion for BaDaaS title: '' -labels: Discussion -assignees: '' +labels: question --- \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/user_story.md b/.github/ISSUE_TEMPLATE/user_story.md index 1112fab2..f9a6617a 100644 --- a/.github/ISSUE_TEMPLATE/user_story.md +++ b/.github/ISSUE_TEMPLATE/user_story.md @@ -2,7 +2,7 @@ name: Feature request about: Suggest an idea for this project title: '' -labels: User Story, To be verify +labels: enhancement --- ## Description diff --git a/README.md b/README.md index 9bff31d5..a569d499 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,13 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/ditrit/badaas)](https://goreportcard.com/report/github.com/ditrit/badaas) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ditrit_badaas&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=ditrit_badaas) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=ditrit_badaas&metric=coverage)](https://sonarcloud.io/summary/new_code?id=ditrit_badaas) +[![OpenSSF Best Practices](https://bestpractices.coreinfrastructure.org/projects/7624/badge)](https://bestpractices.coreinfrastructure.org/projects/7624) + [![Go.Dev reference](https://img.shields.io/badge/go.dev-reference-blue?logo=go&logoColor=white)](https://pkg.go.dev/github.com/ditrit/badaas) [![Discord DitRit](https://dcbadge.vercel.app/api/server/zkKfj9gj2C?style=flat&theme=default-inverted)](https://discord.gg/zkKfj9gj2C) -Badaas enables the effortless construction of ***distributed, resilient, highly available and secure applications by design***, while ensuring very simple deployment and management (NoOps). +BaDaaS enables the effortless construction of ***distributed, resilient, highly available and secure applications by design***, while ensuring very simple deployment and management (NoOps). > **Warning** > BaDaaS is still under development and each of its components can have a different state of evolution diff --git a/docs/contributing/contributing.md b/docs/contributing/contributing.md index 7e44f536..abd81493 100644 --- a/docs/contributing/contributing.md +++ b/docs/contributing/contributing.md @@ -24,20 +24,22 @@ Before you submit an issue, make sure you’ve checked the following: 2. For bugs - It’s not an environment issue. - You have as much data as possible. This usually comes in the form of logs and/or stacktrace. +3. You are assigned to the issue, a branch is created from the issue and the `wip` tag is added if you are also planning to develop the solution. ## Pull Requests All contributions come through pull requests. To submit a proposed change, follow this workflow: 1. Make sure there's an issue (bug report or feature request) opened, which sets the expectations for the contribution you are about to make -2. Fork the [repo](https://github.com/ditrit/badaas) and create a new [branch](#branch-naming-policy) -3. Install the necessary [development environment](developing.md#environment) -4. Create your change and the corresponding [tests](developing.md#tests) -5. Update relevant documentation for the change in `docs/` -6. If changes are necessary in [BaDaaS example](https://github.com/ditrit/badaas-example) and [BaDORM example](https://github.com/ditrit/badorm-example), follow the same workflow there -7. Open a PR (and add links to the example repos' PR if they exist) -8. Wait for the CI process to finish and make sure all checks are green -9. A maintainer of the project will be assigned +2. Assign yourself to the issue and add the `wip` tag +3. Fork the [repo](https://github.com/ditrit/badaas) and create a new [branch](#branch-naming-policy) from the issue +4. Install the necessary [development environment](developing.md#environment) +5. Create your change and the corresponding [tests](developing.md#tests) +6. Update relevant documentation for the change in `docs/` +7. If changes are necessary in [BaDaaS example](https://github.com/ditrit/badaas-example) and [BaDORM example](https://github.com/ditrit/badorm-example), follow the same workflow there +8. Open a PR (and add links to the example repos' PR if they exist) +9. Wait for the CI process to finish and make sure all checks are green +10. A maintainer of the project will be assigned ### Use work-in-progress PRs for early feedback diff --git a/docs/contributing/developing.md b/docs/contributing/developing.md index f7fc7a41..24a4df2a 100644 --- a/docs/contributing/developing.md +++ b/docs/contributing/developing.md @@ -55,9 +55,9 @@ We use `golangci-lint` for linting our code. You can test it with `make lint`. T ### Unit tests -We use the standard test suite in combination with [github.com/stretchr/testify](https://github.com/stretchr/testify) to do our unit testing. Mocks are generated using [mockery](https://github.com/vektra/mockery) a mock generator using the command `make test_generate_mocks`. +We use the standard test suite in combination with [github.com/stretchr/testify](https://github.com/stretchr/testify) to do our unit testing. Mocks are generated using [mockery](https://github.com/vektra/mockery) using the command `make test_generate_mocks`. -To run them, please run: +To run them, use: ```sh make -k test_unit @@ -65,7 +65,7 @@ make -k test_unit ### Integration tests -Integration tests have a database and the dependency injection system. BaDaaS and BaDORM are tested on multiple databases (those supported by gorm, which is the base of BaDORM). By default, the database used will be postgresql: +Integration tests have a database and the dependency injection system. BaDaaS and BaDORM are tested on multiple databases. By default, the database used will be postgresql: ```sh make test_integration @@ -75,7 +75,7 @@ To run the tests on another database you can use: `make test_integration_postgre ### Feature tests (end to end tests) -We use docker to run a Badaas instance in combination with one node of CockroachDB. +These are black box tests that test BaDaaS using its http api. We use docker to run a Badaas instance in combination with one node of CockroachDB. Run: @@ -85,6 +85,14 @@ make test_e2e The feature files can be found in the `test_e2e/features` folder. +## Requirements + +To be acceptable, contributions must: + +- Have a good quality of code, based on . +- Have at least 80 percent new code coverage (although a higher percentage may be required depending on the importance of the feature). The tests that contribute to coverage are unit tests and integration tests. +- The features defined in the PR base issue must be explicitly tested by an e2e test or by integration tests in case it is not possible (for BaDORM features for example). + ## Use of Third-party code Third-party code must include licenses. diff --git a/docs/index.rst b/docs/index.rst index 68cd3d72..55ce1e3f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -40,13 +40,6 @@ Learn how to use BaDaaS following the :doc:`badaas/quickstart`. badaas/functionalities badaas/configuration -.. toctree:: - :caption: BaDctl - - badctl/index - badctl/installation - badctl/commands - .. toctree:: :caption: BaDORM @@ -60,6 +53,13 @@ Learn how to use BaDaaS following the :doc:`badaas/quickstart`. badorm/advanced_query badorm/preloading +.. toctree:: + :caption: BaDctl + + badctl/index + badctl/installation + badctl/commands + .. toctree:: :caption: Contributing From 40c967ce617fbd8383e7cd6b94b7f89a9df59590 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Jul 2023 10:47:36 +0200 Subject: [PATCH 451/467] refactor: change crud methods name --- badorm/crudRepository.go | 75 +++++++++++------------ badorm/crudService.go | 17 ++++- badorm/query.go | 14 +++++ badorm/unsafe/crudRepository.go | 4 +- badorm/unsafe/crudService.go | 8 +-- controllers/crud.go | 17 ++--- controllers/crud_test.go | 36 +++++------ mocks/badorm/CRUDRepository.go | 66 ++++++++++---------- mocks/badorm/CRUDService.go | 32 ++++++++++ mocks/badorm/unsafe/CRUDRepository.go | 4 +- mocks/badorm/unsafe/CRUDService.go | 4 +- mocks/controllers/CRUDController.go | 8 +-- router/routes.go | 4 +- router/routes_test.go | 6 +- services/userservice/userservice.go | 2 +- services/userservice/userservice_test.go | 6 +- testintegration/crudRepository.go | 6 +- testintegration/unsafeCRUDService_test.go | 56 ++++++++--------- 18 files changed, 212 insertions(+), 153 deletions(-) diff --git a/badorm/crudRepository.go b/badorm/crudRepository.go index 446b1801..9438d70a 100644 --- a/badorm/crudRepository.go +++ b/badorm/crudRepository.go @@ -2,24 +2,32 @@ package badorm import ( "errors" - "sync" "gorm.io/gorm" - "gorm.io/gorm/schema" ) // Generic CRUD Repository // T can be any model whose identifier attribute is of type ID type CRUDRepository[T Model, ID ModelID] interface { - // create + // Create model "model" inside transaction "tx" Create(tx *gorm.DB, entity *T) error - // read + + // ----- read ----- + + // Get a model by its ID GetByID(tx *gorm.DB, id ID) (*T, error) - Get(tx *gorm.DB, conditions ...Condition[T]) (*T, error) + + // Get only one model that match "conditions" inside transaction "tx" + // or returns error if 0 or more than 1 are found. + QueryOne(tx *gorm.DB, conditions ...Condition[T]) (*T, error) + + // Get the list of models that match "conditions" inside transaction "tx" Query(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) - // update + + // Save model "model" inside transaction "tx" Save(tx *gorm.DB, entity *T) error - // delete + + // Delete model "model" inside transaction "tx" Delete(tx *gorm.DB, entity *T) error } @@ -29,44 +37,45 @@ var ( ) // Implementation of the Generic CRUD Repository -type CRUDRepositoryImpl[T Model, ID ModelID] struct { +type crudRepositoryImpl[T Model, ID ModelID] struct { CRUDRepository[T, ID] } // Constructor of the Generic CRUD Repository func NewCRUDRepository[T Model, ID ModelID]() CRUDRepository[T, ID] { - return &CRUDRepositoryImpl[T, ID]{} + return &crudRepositoryImpl[T, ID]{} } -// Create object "entity" inside transaction "tx" -func (repository *CRUDRepositoryImpl[T, ID]) Create(tx *gorm.DB, entity *T) error { - return tx.Create(entity).Error +// Create model "model" inside transaction "tx" +func (repository *crudRepositoryImpl[T, ID]) Create(tx *gorm.DB, model *T) error { + return tx.Create(model).Error } -// Delete object "entity" inside transaction "tx" -func (repository *CRUDRepositoryImpl[T, ID]) Delete(tx *gorm.DB, entity *T) error { - return tx.Delete(entity).Error +// Delete model "model" inside transaction "tx" +func (repository *crudRepositoryImpl[T, ID]) Delete(tx *gorm.DB, model *T) error { + return tx.Delete(model).Error } -// Save object "entity" inside transaction "tx" -func (repository *CRUDRepositoryImpl[T, ID]) Save(tx *gorm.DB, entity *T) error { - return tx.Save(entity).Error +// Save model "model" inside transaction "tx" +func (repository *crudRepositoryImpl[T, ID]) Save(tx *gorm.DB, model *T) error { + return tx.Save(model).Error } -// Get an object by "id" inside transaction "tx" -func (repository *CRUDRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, error) { - var entity T +// Get a model by its ID +func (repository *crudRepositoryImpl[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, error) { + var model T - err := tx.First(&entity, "id = ?", id).Error + err := tx.First(&model, "id = ?", id).Error if err != nil { return nil, err } - return &entity, nil + return &model, nil } -// Get an object that matches "conditions" inside transaction "tx" -func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Condition[T]) (*T, error) { +// Get only one model that match "conditions" inside transaction "tx" +// or returns error if 0 or more than 1 are found. +func (repository *crudRepositoryImpl[T, ID]) QueryOne(tx *gorm.DB, conditions ...Condition[T]) (*T, error) { entities, err := repository.Query(tx, conditions...) if err != nil { return nil, err @@ -82,8 +91,8 @@ func (repository *CRUDRepositoryImpl[T, ID]) Get(tx *gorm.DB, conditions ...Cond } } -// Get the list of objects that match "conditions" inside transaction "tx" -func (repository *CRUDRepositoryImpl[T, ID]) Query(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { +// Get the list of models that match "conditions" inside transaction "tx" +func (repository *crudRepositoryImpl[T, ID]) Query(tx *gorm.DB, conditions ...Condition[T]) ([]*T, error) { query, err := NewQuery(tx, conditions) if err != nil { return nil, err @@ -95,15 +104,3 @@ func (repository *CRUDRepositoryImpl[T, ID]) Query(tx *gorm.DB, conditions ...Co return entities, err } - -// Get the name of the table in "db" in which the data for "entity" is saved -// returns error is table name can not be found by gorm, -// probably because the type of "entity" is not registered using AddModel -func GetTableName(db *gorm.DB, entity any) (string, error) { - schemaName, err := schema.Parse(entity, &sync.Map{}, db.NamingStrategy) - if err != nil { - return "", err - } - - return schemaName.Table, nil -} diff --git a/badorm/crudService.go b/badorm/crudService.go index 009304a6..6b17c6de 100644 --- a/badorm/crudService.go +++ b/badorm/crudService.go @@ -6,7 +6,14 @@ import ( // T can be any model whose identifier attribute is of type ID type CRUDService[T Model, ID ModelID] interface { + // Get the model of type T that has the "id" GetByID(id ID) (*T, error) + + // Get only one model that match "conditions" + // or returns error if 0 or more than 1 are found. + QueryOne(conditions ...Condition[T]) (*T, error) + + // Get the list of models that match "conditions" Query(conditions ...Condition[T]) ([]*T, error) } @@ -30,12 +37,18 @@ func NewCRUDService[T Model, ID ModelID]( } } -// Get the object of type T that has the "id" +// Get the model of type T that has the "id" func (service *crudServiceImpl[T, ID]) GetByID(id ID) (*T, error) { return service.repository.GetByID(service.db, id) } -// Get entities of type T that match all "conditions" +// Get only one model that match "conditions" +// or returns error if 0 or more than 1 are found. +func (service *crudServiceImpl[T, ID]) QueryOne(conditions ...Condition[T]) (*T, error) { + return service.repository.QueryOne(service.db, conditions...) +} + +// Get the list of models that match "conditions" func (service *crudServiceImpl[T, ID]) Query(conditions ...Condition[T]) ([]*T, error) { return service.repository.Query(service.db, conditions...) } diff --git a/badorm/query.go b/badorm/query.go index 0d96030f..209c0c87 100644 --- a/badorm/query.go +++ b/badorm/query.go @@ -3,8 +3,10 @@ package badorm import ( "fmt" "reflect" + "sync" "gorm.io/gorm" + "gorm.io/gorm/schema" ) type Table struct { @@ -165,3 +167,15 @@ func NewQuery[T Model](db *gorm.DB, conditions []Condition[T]) (*Query, error) { return query, nil } + +// Get the name of the table in "db" in which the data for "model" is saved +// returns error is table name can not be found by gorm, +// probably because the type of "model" is not registered using AddModel +func GetTableName(db *gorm.DB, model any) (string, error) { + schemaName, err := schema.Parse(model, &sync.Map{}, db.NamingStrategy) + if err != nil { + return "", err + } + + return schemaName.Table, nil +} diff --git a/badorm/unsafe/crudRepository.go b/badorm/unsafe/crudRepository.go index 54ebcb19..28d7b6f5 100644 --- a/badorm/unsafe/crudRepository.go +++ b/badorm/unsafe/crudRepository.go @@ -12,7 +12,7 @@ import ( // Generic CRUD Repository // T can be any model whose identifier attribute is of type ID type CRUDRepository[T badorm.Model, ID badorm.ModelID] interface { - GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) + Query(tx *gorm.DB, conditions map[string]any) ([]*T, error) } var ( @@ -41,7 +41,7 @@ func NewCRUDRepository[T badorm.Model, ID badorm.ModelID]() CRUDRepository[T, ID // "conditions" is in {"attributeName": expectedValue} format // in case of join "conditions" can have the format: // {"relationAttributeName": {"attributeName": expectedValue}} -func (repository *CRUDRepositoryImpl[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]any) ([]*T, error) { +func (repository *CRUDRepositoryImpl[T, ID]) Query(tx *gorm.DB, conditions map[string]any) ([]*T, error) { thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) if err != nil { return nil, err diff --git a/badorm/unsafe/crudService.go b/badorm/unsafe/crudService.go index bd708fad..cd70f64f 100644 --- a/badorm/unsafe/crudService.go +++ b/badorm/unsafe/crudService.go @@ -8,7 +8,7 @@ import ( // T can be any model whose identifier attribute is of type ID type CRUDService[T badorm.Model, ID badorm.ModelID] interface { - GetEntities(conditions map[string]any) ([]*T, error) + Query(conditions map[string]any) ([]*T, error) } // check interface compliance @@ -30,10 +30,10 @@ func NewCRUDUnsafeService[T badorm.Model, ID badorm.ModelID]( } } -// Get entities of type T that match all "conditions" +// Query models of type T that match all "conditions" // "params" is in {"attributeName": expectedValue} format // in case of join "params" can have the format: // {"relationAttributeName": {"attributeName": expectedValue}} -func (service *crudServiceImpl[T, ID]) GetEntities(conditions map[string]any) ([]*T, error) { - return service.repository.GetMultiple(service.db, conditions) +func (service *crudServiceImpl[T, ID]) Query(conditions map[string]any) ([]*T, error) { + return service.repository.Query(service.db, conditions) } diff --git a/controllers/crud.go b/controllers/crud.go index d35ff3e3..50b66e39 100644 --- a/controllers/crud.go +++ b/controllers/crud.go @@ -15,8 +15,11 @@ import ( ) type CRUDController interface { - GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + // The handler responsible of the retrieval of one model + GetModel(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + + // The handler responsible of the retrieval of multiple models + GetModels(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) } // check interface compliance @@ -53,8 +56,8 @@ type crudControllerImpl[T badorm.Model] struct { unsafeCRUDService unsafe.CRUDService[T, badorm.UUID] } -// The handler responsible of the retrieval of one object -func (controller *crudControllerImpl[T]) GetObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +// The handler responsible of the retrieval of one model +func (controller *crudControllerImpl[T]) GetModel(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { entityID, herr := getEntityIDFromRequest(r) if herr != nil { return nil, herr @@ -65,14 +68,14 @@ func (controller *crudControllerImpl[T]) GetObject(_ http.ResponseWriter, r *htt return entity, mapServiceError(err) } -// The handler responsible of the retrieval of multiple objects -func (controller *crudControllerImpl[T]) GetObjects(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { +// The handler responsible of the retrieval of multiple models +func (controller *crudControllerImpl[T]) GetModels(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { params, herr := decodeJSONOptional(r) if herr != nil { return nil, herr } - entities, err := controller.unsafeCRUDService.GetEntities(params) + entities, err := controller.unsafeCRUDService.Query(params) return entities, mapServiceError(err) } diff --git a/controllers/crud_test.go b/controllers/crud_test.go index d1ad8314..38f9d51c 100644 --- a/controllers/crud_test.go +++ b/controllers/crud_test.go @@ -17,7 +17,7 @@ import ( mockUnsafe "github.com/ditrit/badaas/mocks/badorm/unsafe" ) -// ----------------------- GetObject ----------------------- +// ----------------------- GetModel ----------------------- type Model struct { badorm.UUIDModel @@ -39,7 +39,7 @@ func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { strings.NewReader(""), ) - _, err := route.Controller.GetObject(response, request) + _, err := route.Controller.GetModel(response, request) assert.ErrorIs(t, err, controllers.ErrEntityNotFound) } @@ -60,7 +60,7 @@ func TestCRUDGetWithEntityIDNotUUIDReturnsError(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"id": "not-uuid"}) - _, err := route.Controller.GetObject(response, request) + _, err := route.Controller.GetModel(response, request) assert.ErrorIs(t, err, controllers.ErrIDNotAnUUID) } @@ -88,7 +88,7 @@ func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { request = mux.SetURLVars(request, map[string]string{"id": uuid.String()}) - _, err := route.Controller.GetObject(response, request) + _, err := route.Controller.GetModel(response, request) assert.ErrorIs(t, err, controllers.ErrEntityNotFound) } @@ -116,7 +116,7 @@ func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { request = mux.SetURLVars(request, map[string]string{"id": uuid.String()}) - _, err := route.Controller.GetObject(response, request) + _, err := route.Controller.GetModel(response, request) assert.ErrorContains(t, err, "db error") } @@ -144,19 +144,19 @@ func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { ) request = mux.SetURLVars(request, map[string]string{"id": uuid.String()}) - entityReturned, err := route.Controller.GetObject(response, request) + entityReturned, err := route.Controller.GetModel(response, request) assert.Nil(t, err) assert.Equal(t, &entity, entityReturned) } -// ----------------------- GetEntities ----------------------- +// ----------------------- GetModels ----------------------- -func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { +func TestGetModelsWithErrorInDBReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) crudUnsafeService. - On("GetEntities", map[string]any{}). + On("Query", map[string]any{}). Return(nil, errors.New("db error")) route := controllers.NewCRUDController[Model]( @@ -171,11 +171,11 @@ func TestGetEntitiesWithErrorInDBReturnsError(t *testing.T) { strings.NewReader(""), ) - _, err := route.Controller.GetObjects(response, request) + _, err := route.Controller.GetModels(response, request) assert.ErrorContains(t, err, "db error") } -func TestGetEntitiesWithoutParams(t *testing.T) { +func TestGetModelsWithoutParams(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) @@ -183,7 +183,7 @@ func TestGetEntitiesWithoutParams(t *testing.T) { entity2 := &Model{} crudUnsafeService. - On("GetEntities", map[string]any{}). + On("Query", map[string]any{}). Return([]*Model{entity1, entity2}, nil) route := controllers.NewCRUDController[Model]( @@ -198,21 +198,21 @@ func TestGetEntitiesWithoutParams(t *testing.T) { strings.NewReader(""), ) - entitiesReturned, err := route.Controller.GetObjects(response, request) + entitiesReturned, err := route.Controller.GetModels(response, request) assert.Nil(t, err) assert.Len(t, entitiesReturned, 2) assert.Contains(t, entitiesReturned, entity1) assert.Contains(t, entitiesReturned, entity2) } -func TestGetEntitiesWithParams(t *testing.T) { +func TestGetModelsWithParams(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) entity1 := &Model{} crudUnsafeService. - On("GetEntities", map[string]any{"param1": "something"}). + On("Query", map[string]any{"param1": "something"}). Return([]*Model{entity1}, nil) route := controllers.NewCRUDController[Model]( @@ -227,13 +227,13 @@ func TestGetEntitiesWithParams(t *testing.T) { strings.NewReader("{\"param1\": \"something\"}"), ) - entitiesReturned, err := route.Controller.GetObjects(response, request) + entitiesReturned, err := route.Controller.GetModels(response, request) assert.Nil(t, err) assert.Len(t, entitiesReturned, 1) assert.Contains(t, entitiesReturned, entity1) } -func TestGetEntitiesWithParamsNotJsonReturnsError(t *testing.T) { +func TestGetModelsWithParamsNotJsonReturnsError(t *testing.T) { crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) @@ -249,6 +249,6 @@ func TestGetEntitiesWithParamsNotJsonReturnsError(t *testing.T) { strings.NewReader("bad json"), ) - _, err := route.Controller.GetObjects(response, request) + _, err := route.Controller.GetModels(response, request) assert.ErrorIs(t, err, controllers.HTTPErrRequestMalformed) } diff --git a/mocks/badorm/CRUDRepository.go b/mocks/badorm/CRUDRepository.go index 0a7cda11..1659e91e 100644 --- a/mocks/badorm/CRUDRepository.go +++ b/mocks/badorm/CRUDRepository.go @@ -42,39 +42,6 @@ func (_m *CRUDRepository[T, ID]) Delete(tx *gorm.DB, entity *T) error { return r0 } -// Get provides a mock function with given fields: tx, conditions -func (_m *CRUDRepository[T, ID]) Get(tx *gorm.DB, conditions ...badorm.Condition[T]) (*T, error) { - _va := make([]interface{}, len(conditions)) - for _i := range conditions { - _va[_i] = conditions[_i] - } - var _ca []interface{} - _ca = append(_ca, tx) - _ca = append(_ca, _va...) - ret := _m.Called(_ca...) - - var r0 *T - var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) (*T, error)); ok { - return rf(tx, conditions...) - } - if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) *T); ok { - r0 = rf(tx, conditions...) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*T) - } - } - - if rf, ok := ret.Get(1).(func(*gorm.DB, ...badorm.Condition[T]) error); ok { - r1 = rf(tx, conditions...) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // GetByID provides a mock function with given fields: tx, id func (_m *CRUDRepository[T, ID]) GetByID(tx *gorm.DB, id ID) (*T, error) { ret := _m.Called(tx, id) @@ -134,6 +101,39 @@ func (_m *CRUDRepository[T, ID]) Query(tx *gorm.DB, conditions ...badorm.Conditi return r0, r1 } +// QueryOne provides a mock function with given fields: tx, conditions +func (_m *CRUDRepository[T, ID]) QueryOne(tx *gorm.DB, conditions ...badorm.Condition[T]) (*T, error) { + _va := make([]interface{}, len(conditions)) + for _i := range conditions { + _va[_i] = conditions[_i] + } + var _ca []interface{} + _ca = append(_ca, tx) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *T + var r1 error + if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) (*T, error)); ok { + return rf(tx, conditions...) + } + if rf, ok := ret.Get(0).(func(*gorm.DB, ...badorm.Condition[T]) *T); ok { + r0 = rf(tx, conditions...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*T) + } + } + + if rf, ok := ret.Get(1).(func(*gorm.DB, ...badorm.Condition[T]) error); ok { + r1 = rf(tx, conditions...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Save provides a mock function with given fields: tx, entity func (_m *CRUDRepository[T, ID]) Save(tx *gorm.DB, entity *T) error { ret := _m.Called(tx, entity) diff --git a/mocks/badorm/CRUDService.go b/mocks/badorm/CRUDService.go index 545bebe4..90de4256 100644 --- a/mocks/badorm/CRUDService.go +++ b/mocks/badorm/CRUDService.go @@ -70,6 +70,38 @@ func (_m *CRUDService[T, ID]) Query(conditions ...badorm.Condition[T]) ([]*T, er return r0, r1 } +// QueryOne provides a mock function with given fields: conditions +func (_m *CRUDService[T, ID]) QueryOne(conditions ...badorm.Condition[T]) (*T, error) { + _va := make([]interface{}, len(conditions)) + for _i := range conditions { + _va[_i] = conditions[_i] + } + var _ca []interface{} + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + var r0 *T + var r1 error + if rf, ok := ret.Get(0).(func(...badorm.Condition[T]) (*T, error)); ok { + return rf(conditions...) + } + if rf, ok := ret.Get(0).(func(...badorm.Condition[T]) *T); ok { + r0 = rf(conditions...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*T) + } + } + + if rf, ok := ret.Get(1).(func(...badorm.Condition[T]) error); ok { + r1 = rf(conditions...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + type mockConstructorTestingTNewCRUDService interface { mock.TestingT Cleanup(func()) diff --git a/mocks/badorm/unsafe/CRUDRepository.go b/mocks/badorm/unsafe/CRUDRepository.go index bd893016..50466455 100644 --- a/mocks/badorm/unsafe/CRUDRepository.go +++ b/mocks/badorm/unsafe/CRUDRepository.go @@ -14,8 +14,8 @@ type CRUDRepository[T badorm.Model, ID badorm.ModelID] struct { mock.Mock } -// GetMultiple provides a mock function with given fields: tx, conditions -func (_m *CRUDRepository[T, ID]) GetMultiple(tx *gorm.DB, conditions map[string]interface{}) ([]*T, error) { +// Query provides a mock function with given fields: tx, conditions +func (_m *CRUDRepository[T, ID]) Query(tx *gorm.DB, conditions map[string]interface{}) ([]*T, error) { ret := _m.Called(tx, conditions) var r0 []*T diff --git a/mocks/badorm/unsafe/CRUDService.go b/mocks/badorm/unsafe/CRUDService.go index 652c172d..9a6be35f 100644 --- a/mocks/badorm/unsafe/CRUDService.go +++ b/mocks/badorm/unsafe/CRUDService.go @@ -12,8 +12,8 @@ type CRUDService[T badorm.Model, ID badorm.ModelID] struct { mock.Mock } -// GetEntities provides a mock function with given fields: conditions -func (_m *CRUDService[T, ID]) GetEntities(conditions map[string]interface{}) ([]*T, error) { +// Query provides a mock function with given fields: conditions +func (_m *CRUDService[T, ID]) Query(conditions map[string]interface{}) ([]*T, error) { ret := _m.Called(conditions) var r0 []*T diff --git a/mocks/controllers/CRUDController.go b/mocks/controllers/CRUDController.go index 93da4656..22b41e2c 100644 --- a/mocks/controllers/CRUDController.go +++ b/mocks/controllers/CRUDController.go @@ -14,8 +14,8 @@ type CRUDController struct { mock.Mock } -// GetObject provides a mock function with given fields: w, r -func (_m *CRUDController) GetObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { +// GetModel provides a mock function with given fields: w, r +func (_m *CRUDController) GetModel(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { ret := _m.Called(w, r) var r0 interface{} @@ -42,8 +42,8 @@ func (_m *CRUDController) GetObject(w http.ResponseWriter, r *http.Request) (int return r0, r1 } -// GetObjects provides a mock function with given fields: w, r -func (_m *CRUDController) GetObjects(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { +// GetModels provides a mock function with given fields: w, r +func (_m *CRUDController) GetModels(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { ret := _m.Called(w, r) var r0 interface{} diff --git a/router/routes.go b/router/routes.go index 9b2a4325..6dee8178 100644 --- a/router/routes.go +++ b/router/routes.go @@ -100,11 +100,11 @@ func AddCRUDRoutes( // read router.HandleFunc( objectsWithID, - jsonController.Wrap(crudRoute.Controller.GetObject), + jsonController.Wrap(crudRoute.Controller.GetModel), ).Methods(http.MethodGet) router.HandleFunc( objectsBase, - jsonController.Wrap(crudRoute.Controller.GetObjects), + jsonController.Wrap(crudRoute.Controller.GetModels), ).Methods(http.MethodGet) } } diff --git a/router/routes_test.go b/router/routes_test.go index 5dd951d9..0ae469b2 100644 --- a/router/routes_test.go +++ b/router/routes_test.go @@ -185,8 +185,8 @@ func TestAddCRUDRoutes(t *testing.T) { crudController := mockControllers.NewCRUDController(t) crudController. - On("GetObjects", mock.Anything, mock.Anything). - Return(map[string]string{"GetObjects": "called"}, nil) + On("GetModels", mock.Anything, mock.Anything). + Return(map[string]string{"GetModels": "called"}, nil) router := NewRouter() AddCRUDRoutes( @@ -209,5 +209,5 @@ func TestAddCRUDRoutes(t *testing.T) { router.ServeHTTP(response, request) assert.Equal(t, http.StatusOK, response.Code) - assert.Equal(t, "{\"GetObjects\":\"called\"}", response.Body.String()) + assert.Equal(t, "{\"GetModels\":\"called\"}", response.Body.String()) } diff --git a/services/userservice/userservice.go b/services/userservice/userservice.go index b51a2fd4..efeb31c4 100644 --- a/services/userservice/userservice.go +++ b/services/userservice/userservice.go @@ -74,7 +74,7 @@ func (userService *userServiceImpl) NewUser(username, email, password string) (* // Get user if the email and password provided are correct, return an error if not. func (userService *userServiceImpl) GetUser(userLoginDTO dto.UserLoginDTO) (*models.User, error) { - user, err := userService.userRepository.Get( + user, err := userService.userRepository.QueryOne( userService.db, models.UserEmailCondition(badorm.Eq(userLoginDTO.Email)), ) diff --git a/services/userservice/userservice_test.go b/services/userservice/userservice_test.go index d106d69a..b7440e7b 100644 --- a/services/userservice/userservice_test.go +++ b/services/userservice/userservice_test.go @@ -99,7 +99,7 @@ func TestGetUser(t *testing.T) { require.NoError(t, err) userRepositoryMock.On( - "Get", gormDB, models.UserEmailCondition(badorm.Eq("bob@email.com")), + "QueryOne", gormDB, models.UserEmailCondition(badorm.Eq("bob@email.com")), ).Return( user, nil, @@ -127,7 +127,7 @@ func TestGetUserNoUserFound(t *testing.T) { userRepositoryMock := badormMocks.NewCRUDRepository[models.User, badorm.UUID](t) userService := userservice.NewUserService(observedLogger, userRepositoryMock, gormDB) userRepositoryMock.On( - "Get", gormDB, models.UserEmailCondition(badorm.Eq("bobnotfound@email.com")), + "QueryOne", gormDB, models.UserEmailCondition(badorm.Eq("bobnotfound@email.com")), ).Return( &models.User{}, badorm.ErrObjectNotFound, @@ -154,7 +154,7 @@ func TestGetUserWrongPassword(t *testing.T) { require.NoError(t, err) userRepositoryMock.On( - "Get", gormDB, models.UserEmailCondition(badorm.Eq("bob@email.com")), + "QueryOne", gormDB, models.UserEmailCondition(badorm.Eq("bob@email.com")), ).Return( user, nil, diff --git a/testintegration/crudRepository.go b/testintegration/crudRepository.go index 3e76825a..39e10c43 100644 --- a/testintegration/crudRepository.go +++ b/testintegration/crudRepository.go @@ -51,11 +51,11 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetByIDReturnsEntityIfIDMatch() { assert.DeepEqual(ts.T(), product, productReturned) } -// ------------------------- Get -------------------------------- +// ------------------------- QueryOne -------------------------------- func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsErrorIfConditionsDontMatch() { ts.createProduct(0) - _, err := ts.crudProductRepository.Get( + _, err := ts.crudProductRepository.QueryOne( ts.db, conditions.ProductInt(badorm.Eq(1)), ) @@ -64,7 +64,7 @@ func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsErrorIfConditionsDontMatch() func (ts *CRUDRepositoryIntTestSuite) TestGetReturnsEntityIfConditionsMatch() { product := ts.createProduct(1) - productReturned, err := ts.crudProductRepository.Get( + productReturned, err := ts.crudProductRepository.QueryOne( ts.db, conditions.ProductInt(badorm.Eq(1)), ) diff --git a/testintegration/unsafeCRUDService_test.go b/testintegration/unsafeCRUDService_test.go index 9fa49369..00316b0d 100644 --- a/testintegration/unsafeCRUDService_test.go +++ b/testintegration/unsafeCRUDService_test.go @@ -50,10 +50,10 @@ func NewCRUDUnsafeServiceIntTestSuite( } } -// ------------------------- GetEntities -------------------------------- +// ------------------------- Query -------------------------------- func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.crudProductService.GetEntities(map[string]any{}) + entities, err := ts.crudProductService.Query(map[string]any{}) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{}, entities) @@ -62,7 +62,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsR func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { match := ts.createProduct("", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities(map[string]any{}) + entities, err := ts.crudProductService.Query(map[string]any{}) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) @@ -73,7 +73,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsR match2 := ts.createProduct("", 0, 0, false, nil) match3 := ts.createProduct("", 0, 0, false, nil) - entities, err := ts.crudProductService.GetEntities(map[string]any{}) + entities, err := ts.crudProductService.Query(map[string]any{}) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) @@ -83,7 +83,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsRetu params := map[string]any{ "string_something_else": "not_created", } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{}, entities) @@ -95,7 +95,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsRetu params := map[string]any{ "string_something_else": "not_match", } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{}, entities) @@ -108,7 +108,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsRetu params := map[string]any{ "string_something_else": "match", } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) @@ -122,7 +122,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsRetu params := map[string]any{ "string_something_else": "match", } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) @@ -134,7 +134,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatD params := map[string]any{ "not_exists": "not_exists", } - _, err := ts.crudProductService.GetEntities(params) + _, err := ts.crudProductService.Query(params) ts.NotNil(err) } @@ -145,7 +145,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfInt params := map[string]any{ "int": 1, } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) @@ -157,7 +157,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfInc params := map[string]any{ "int": "not_an_int", } - result, err := ts.crudProductService.GetEntities(params) + result, err := ts.crudProductService.Query(params) switch getDBDialector() { case configuration.MySQL, configuration.SQLite: @@ -177,7 +177,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfFlo params := map[string]any{ "float": 1.1, } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) @@ -190,7 +190,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfBoo params := map[string]any{ "bool": true, } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match}, entities) @@ -209,7 +209,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfRel params := map[string]any{ "product_id": product1.ID.String(), } - entities, err := ts.crudSaleService.GetEntities(params) + entities, err := ts.crudSaleService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{match}, entities) @@ -227,7 +227,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithMultipleCondit "int": 1, "bool": true, } - entities, err := ts.crudProductService.GetEntities(params) + entities, err := ts.crudProductService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) @@ -240,7 +240,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsOnUI params := map[string]any{ "name": "match", } - entities, err := ts.crudBrandService.GetEntities(params) + entities, err := ts.crudBrandService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Brand{match}, entities) @@ -258,7 +258,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ "name": "google", }, } - entities, err := ts.crudPhoneService.GetEntities(params) + entities, err := ts.crudPhoneService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Phone{match}, entities) @@ -276,7 +276,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ "int": 1, }, } - entities, err := ts.crudSaleService.GetEntities(params) + entities, err := ts.crudSaleService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{match}, entities) @@ -297,7 +297,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ "name": "franco", }, } - entities, err := ts.crudSaleService.GetEntities(params) + entities, err := ts.crudSaleService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{match}, entities) @@ -319,7 +319,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ "name": "Xavier", }, } - entities, err := ts.crudEmployeeService.GetEntities(params) + entities, err := ts.crudEmployeeService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Employee{match}, entities) @@ -341,7 +341,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ "name": "Argentina", }, } - entities, err := ts.crudCityService.GetEntities(params) + entities, err := ts.crudCityService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.City{&capital1}, entities) @@ -363,7 +363,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ "name": "Buenos Aires", }, } - entities, err := ts.crudCountryService.GetEntities(params) + entities, err := ts.crudCountryService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Country{country1}, entities) @@ -375,7 +375,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ "int": 1, }, } - _, err := ts.crudSaleService.GetEntities(params) + _, err := ts.crudSaleService.Query(params) ts.ErrorContains(err, "Sale has not attribute named NotExists or NotExistsID") } @@ -391,7 +391,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ "name": "ditrit", }, } - entities, err := ts.crudSellerService.GetEntities(params) + entities, err := ts.crudSellerService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Seller{match}, entities) @@ -413,7 +413,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ "string_something_else": "match", }, } - entities, err := ts.crudSaleService.GetEntities(params) + entities, err := ts.crudSaleService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{match}, entities) @@ -436,7 +436,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ }, "code": 1, } - entities, err := ts.crudSaleService.GetEntities(params) + entities, err := ts.crudSaleService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{match}, entities) @@ -462,7 +462,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ "name": "franco", }, } - entities, err := ts.crudSaleService.GetEntities(params) + entities, err := ts.crudSaleService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{match}, entities) @@ -489,7 +489,7 @@ func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJ }, }, } - entities, err := ts.crudSaleService.GetEntities(params) + entities, err := ts.crudSaleService.Query(params) ts.Nil(err) EqualList(&ts.Suite, []*models.Sale{match}, entities) From 76065c36e1b0e1e95d4bf90f8980efcfd5522421 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Thu, 20 Jul 2023 15:47:12 +0200 Subject: [PATCH 452/467] fix method name in docs --- docs/badorm/query.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/badorm/query.rst b/docs/badorm/query.rst index abd3c090..6a377cb1 100644 --- a/docs/badorm/query.rst +++ b/docs/badorm/query.rst @@ -8,10 +8,8 @@ Query methods In CRUDRepository you will find different methods that will allow you to perform queries on the model to which that repository belongs: -.. TODO ver si se mantienen estos nombres - - GetByID: will allow you to obtain a model by its id. -- Get: will allow you to obtain the model that meets the conditions received by parameter. +- QueryOne: will allow you to obtain the model that meets the conditions received by parameter. - Query: will allow you to obtain the models that meet the conditions received by parameter. Compilable query system From b9ad72622153215d6a0aef2d94f2a032055589ba Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 10:35:09 +0200 Subject: [PATCH 453/467] (prs) remove unsafe query system --- badorm/unsafe/ModuleFx.go | 57 --- badorm/unsafe/crudRepository.go | 250 ----------- badorm/unsafe/crudService.go | 39 -- controllers/crud.go | 81 ---- controllers/crud_test.go | 254 ----------- docs/badaas/functionalities.rst | 18 - docs/badorm/crud.rst | 15 +- mocks/badorm/unsafe/CRUDRepository.go | 56 --- mocks/badorm/unsafe/CRUDService.go | 54 --- mocks/controllers/CRUDController.go | 86 ---- router/ModuleFx.go | 29 -- router/routes.go | 22 - router/routes_test.go | 32 -- test_e2e/badaas_e2e_test.go | 3 - test_e2e/features/badorm.feature | 38 -- test_e2e/http_support_test.go | 52 --- test_e2e/test_api.go | 3 - testintegration/badorm_test.go | 16 - testintegration/unsafeCRUDService_test.go | 496 ---------------------- 19 files changed, 1 insertion(+), 1600 deletions(-) delete mode 100644 badorm/unsafe/ModuleFx.go delete mode 100644 badorm/unsafe/crudRepository.go delete mode 100644 badorm/unsafe/crudService.go delete mode 100644 controllers/crud.go delete mode 100644 controllers/crud_test.go delete mode 100644 mocks/badorm/unsafe/CRUDRepository.go delete mode 100644 mocks/badorm/unsafe/CRUDService.go delete mode 100644 mocks/controllers/CRUDController.go delete mode 100644 test_e2e/features/badorm.feature delete mode 100644 testintegration/unsafeCRUDService_test.go diff --git a/badorm/unsafe/ModuleFx.go b/badorm/unsafe/ModuleFx.go deleted file mode 100644 index ab1a6476..00000000 --- a/badorm/unsafe/ModuleFx.go +++ /dev/null @@ -1,57 +0,0 @@ -package unsafe - -import ( - "fmt" - "log" - "reflect" - - "go.uber.org/fx" - - "github.com/ditrit/badaas/badorm" -) - -func GetCRUDServiceModule[T badorm.Model]() fx.Option { - entity := *new(T) - - moduleName := fmt.Sprintf( - "unsafe.%TCRUDServiceModule", - entity, - ) - - kind := badorm.GetBaDORMModelKind(entity) - switch kind { - case badorm.KindUUIDModel: - return fx.Module( - moduleName, - // models - fx.Invoke(addUnsafeModel[T]), - // repository - fx.Provide(NewCRUDRepository[T, badorm.UUID]), - // service - fx.Provide(NewCRUDUnsafeService[T, badorm.UUID]), - ) - case badorm.KindUIntModel: - return fx.Module( - moduleName, - // models - fx.Invoke(addUnsafeModel[T]), - // repository - fx.Provide(NewCRUDRepository[T, badorm.UIntID]), - // service - fx.Provide(NewCRUDUnsafeService[T, badorm.UIntID]), - ) - case badorm.KindNotBaDORMModel: - log.Printf("type %T is not a BaDORM Module\n", entity) - return fx.Invoke(badorm.FailNotBadORMModule()) - } - - return fx.Invoke(badorm.FailNotBadORMModule()) -} - -var modelsMapping = map[string]reflect.Type{} - -func addUnsafeModel[T badorm.Model]() { - entity := *new(T) - entityType := reflect.TypeOf(entity) - modelsMapping[entityType.Name()] = entityType -} diff --git a/badorm/unsafe/crudRepository.go b/badorm/unsafe/crudRepository.go deleted file mode 100644 index 28d7b6f5..00000000 --- a/badorm/unsafe/crudRepository.go +++ /dev/null @@ -1,250 +0,0 @@ -package unsafe - -import ( - "fmt" - "reflect" - - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" -) - -// Generic CRUD Repository -// T can be any model whose identifier attribute is of type ID -type CRUDRepository[T badorm.Model, ID badorm.ModelID] interface { - Query(tx *gorm.DB, conditions map[string]any) ([]*T, error) -} - -var ( - ErrObjectsNotRelated = func(typeName, attributeName string) error { - return fmt.Errorf("%[1]s has not attribute named %[2]s or %[2]sID", typeName, attributeName) - } - ErrModelNotRegistered = func(typeName, attributeName string) error { - return fmt.Errorf( - "%[1]s has an attribute named %[2]s or %[2]sID but %[2]s is not registered as model (use badorm.AddUnsafeModel or badorm.GetCRUDUnsafeServiceModule)", - typeName, attributeName, - ) - } -) - -// Implementation of the Generic CRUD Repository -type CRUDRepositoryImpl[T badorm.Model, ID badorm.ModelID] struct { - CRUDRepository[T, ID] -} - -// Constructor of the Generic CRUD Repository -func NewCRUDRepository[T badorm.Model, ID badorm.ModelID]() CRUDRepository[T, ID] { - return &CRUDRepositoryImpl[T, ID]{} -} - -// Get the list of objects that match "conditions" inside transaction "tx" -// "conditions" is in {"attributeName": expectedValue} format -// in case of join "conditions" can have the format: -// {"relationAttributeName": {"attributeName": expectedValue}} -func (repository *CRUDRepositoryImpl[T, ID]) Query(tx *gorm.DB, conditions map[string]any) ([]*T, error) { - thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) - if err != nil { - return nil, err - } - - // TODO on column definition, conditions need to have the column name in place of the attribute name - query := tx.Where(thisEntityConditions) - - entity := new(T) - // only entities that match the conditions - for joinAttributeName, joinConditions := range joinConditions { - var tableName string - - tableName, err = badorm.GetTableName(tx, entity) - if err != nil { - return nil, err - } - - err = repository.addJoinToQuery( - query, - entity, - tableName, - joinAttributeName, - joinConditions, - ) - if err != nil { - return nil, err - } - } - - // execute query - var entities []*T - err = query.Find(&entities).Error - - return entities, err -} - -// Adds a join to the "query" by the "joinAttributeName" -// then, adds the verification that the joined values match "conditions" - -// "conditions" is in {"attributeName": expectedValue} format -// "previousEntity" is a pointer to a object from where we navigate the relationship -// "previousTableName" is the name of the table where the previous object is saved and from we the join will we done -func (repository *CRUDRepositoryImpl[T, ID]) addJoinToQuery( - query *gorm.DB, previousEntity any, - previousTableName, joinAttributeName string, - conditions map[string]any, -) error { - thisEntityConditions, joinConditions, err := divideConditionsByEntity(conditions) - if err != nil { - return err - } - - relatedObject, relationIDIsInPreviousTable, err := getRelatedObject( - previousEntity, - joinAttributeName, - ) - if err != nil { - return err - } - - joinTableName, err := badorm.GetTableName(query, relatedObject) - if err != nil { - return err - } - - tableWithSuffix := joinTableName + "_" + previousTableName - - var stringQuery string - if relationIDIsInPreviousTable { - stringQuery = fmt.Sprintf( - `JOIN %[1]s %[2]s ON - %[2]s.id = %[3]s.%[4]s_id - AND %[2]s.deleted_at IS NULL - `, - joinTableName, - tableWithSuffix, - previousTableName, - joinAttributeName, - ) - } else { - // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) - previousAttribute := reflect.TypeOf(previousEntity).Elem().Name() - stringQuery = fmt.Sprintf( - `JOIN %[1]s %[2]s ON - %[2]s.%[4]s_id = %[3]s.id - AND %[2]s.deleted_at IS NULL - `, - joinTableName, - tableWithSuffix, - previousTableName, - previousAttribute, - ) - } - - conditionsValues := []any{} - - for attributeName, conditionValue := range thisEntityConditions { - stringQuery += fmt.Sprintf( - `AND %[1]s.%[2]s = ? - `, - tableWithSuffix, attributeName, - ) - - conditionsValues = append(conditionsValues, conditionValue) - } - - query.Joins(stringQuery, conditionsValues...) - - for joinAttributeName, joinConditions := range joinConditions { - err = repository.addJoinToQuery( - query, - relatedObject, - tableWithSuffix, - joinAttributeName, - joinConditions, - ) - if err != nil { - return err - } - } - - return nil -} - -// Given a map of "conditions" that is in {"attributeName": expectedValue} format -// and in case of join "conditions" can have the format: -// -// {"relationAttributeName": {"attributeName": expectedValue}} -// -// it divides the map in two: -// the conditions that will be applied to the current entity ({"attributeName": expectedValue} format) -// the conditions that will generate a join with another entity ({"relationAttributeName": {"attributeName": expectedValue}} format) -// -// Returns error if any expectedValue is not of a supported type -func divideConditionsByEntity( - conditions map[string]any, -) (map[string]any, map[string]map[string]any, error) { - thisEntityConditions := map[string]any{} - joinConditions := map[string]map[string]any{} - - for attributeName, expectedValue := range conditions { - switch typedExpectedValue := expectedValue.(type) { - case string: - uuid, err := badorm.ParseUUID(typedExpectedValue) - if err == nil { - thisEntityConditions[attributeName] = uuid - } else { - thisEntityConditions[attributeName] = expectedValue - } - case float64, bool, int: - thisEntityConditions[attributeName] = expectedValue - case map[string]any: - joinConditions[attributeName] = typedExpectedValue - default: - return nil, nil, fmt.Errorf("unsupported type") - } - } - - return thisEntityConditions, joinConditions, nil -} - -// Returns an object of the type of the "entity" attribute called "relationName" -// and a boolean value indicating whether the id attribute that relates them -// in the database is in the "entity"'s table. -// Returns error if "entity" not a relation called "relationName". -func getRelatedObject(entity any, relationName string) (any, bool, error) { - entityType := badorm.GetEntityType(entity) - - field, isPresent := entityType.FieldByName(relationName) - if !isPresent { - // some gorm relations dont have a direct relation in the model, only the id - relatedObject, err := getRelatedObjectByID(entityType, relationName) - if err != nil { - return nil, false, err - } - - return relatedObject, true, nil - } - - _, isIDPresent := entityType.FieldByName(relationName + "ID") - - return createObject(field.Type), isIDPresent, nil -} - -// Returns an object of the type of the "entity" attribute called "relationName" + "ID" -// Returns error if "entity" not a relation called "relationName" + "ID" -func getRelatedObjectByID(entityType reflect.Type, relationName string) (any, error) { - _, isPresent := entityType.FieldByName(relationName + "ID") - if !isPresent { - return nil, ErrObjectsNotRelated(entityType.Name(), relationName) - } - - // TODO foreignKey can be redefined (https://gorm.io/docs/has_one.html#Override-References) - fieldType, isPresent := modelsMapping[relationName] - if !isPresent { - return nil, ErrModelNotRegistered(entityType.Name(), relationName) - } - - return createObject(fieldType), nil -} - -// Creates an object of type reflect.Type using reflection -func createObject(entityType reflect.Type) any { - return reflect.New(entityType).Elem().Interface() -} diff --git a/badorm/unsafe/crudService.go b/badorm/unsafe/crudService.go deleted file mode 100644 index cd70f64f..00000000 --- a/badorm/unsafe/crudService.go +++ /dev/null @@ -1,39 +0,0 @@ -package unsafe - -import ( - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" -) - -// T can be any model whose identifier attribute is of type ID -type CRUDService[T badorm.Model, ID badorm.ModelID] interface { - Query(conditions map[string]any) ([]*T, error) -} - -// check interface compliance -var _ CRUDService[badorm.UUIDModel, badorm.UUID] = (*crudServiceImpl[badorm.UUIDModel, badorm.UUID])(nil) - -// Implementation of the CRUD Service -type crudServiceImpl[T badorm.Model, ID badorm.ModelID] struct { - db *gorm.DB - repository CRUDRepository[T, ID] -} - -func NewCRUDUnsafeService[T badorm.Model, ID badorm.ModelID]( - db *gorm.DB, - repository CRUDRepository[T, ID], -) CRUDService[T, ID] { - return &crudServiceImpl[T, ID]{ - db: db, - repository: repository, - } -} - -// Query models of type T that match all "conditions" -// "params" is in {"attributeName": expectedValue} format -// in case of join "params" can have the format: -// {"relationAttributeName": {"attributeName": expectedValue}} -func (service *crudServiceImpl[T, ID]) Query(conditions map[string]any) ([]*T, error) { - return service.repository.Query(service.db, conditions) -} diff --git a/controllers/crud.go b/controllers/crud.go deleted file mode 100644 index 50b66e39..00000000 --- a/controllers/crud.go +++ /dev/null @@ -1,81 +0,0 @@ -package controllers - -import ( - "fmt" - "net/http" - "strings" - - "github.com/elliotchance/pie/v2" - "go.uber.org/zap" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/unsafe" - "github.com/ditrit/badaas/httperrors" - "github.com/ditrit/badaas/persistence/models" -) - -type CRUDController interface { - // The handler responsible of the retrieval of one model - GetModel(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - - // The handler responsible of the retrieval of multiple models - GetModels(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) -} - -// check interface compliance -var _ CRUDController = (*crudControllerImpl[models.User])(nil) - -type CRUDRoute struct { - TypeName string - Controller CRUDController -} - -func NewCRUDController[T badorm.Model]( - logger *zap.Logger, - crudService badorm.CRUDService[T, badorm.UUID], - unsafeCRUDService unsafe.CRUDService[T, badorm.UUID], -) CRUDRoute { - fullTypeName := strings.ToLower(fmt.Sprintf("%T", *new(T))) - // remove the package name of the type - typeName := pie.Last(strings.Split(fullTypeName, ".")) - - return CRUDRoute{ - TypeName: typeName, - Controller: &crudControllerImpl[T]{ - logger: logger, - crudService: crudService, - unsafeCRUDService: unsafeCRUDService, - }, - } -} - -// The concrete implementation of the CRUDController -type crudControllerImpl[T badorm.Model] struct { - logger *zap.Logger - crudService badorm.CRUDService[T, badorm.UUID] - unsafeCRUDService unsafe.CRUDService[T, badorm.UUID] -} - -// The handler responsible of the retrieval of one model -func (controller *crudControllerImpl[T]) GetModel(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityID, herr := getEntityIDFromRequest(r) - if herr != nil { - return nil, herr - } - - entity, err := controller.crudService.GetByID(entityID) - - return entity, mapServiceError(err) -} - -// The handler responsible of the retrieval of multiple models -func (controller *crudControllerImpl[T]) GetModels(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - params, herr := decodeJSONOptional(r) - if herr != nil { - return nil, herr - } - - entities, err := controller.unsafeCRUDService.Query(params) - - return entities, mapServiceError(err) -} diff --git a/controllers/crud_test.go b/controllers/crud_test.go deleted file mode 100644 index 38f9d51c..00000000 --- a/controllers/crud_test.go +++ /dev/null @@ -1,254 +0,0 @@ -package controllers_test - -import ( - "errors" - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/gorilla/mux" - "github.com/stretchr/testify/assert" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/controllers" - mockBadorm "github.com/ditrit/badaas/mocks/badorm" - mockUnsafe "github.com/ditrit/badaas/mocks/badorm/unsafe" -) - -// ----------------------- GetModel ----------------------- - -type Model struct { - badorm.UUIDModel -} - -func TestCRUDGetWithoutEntityIDReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) - - route := controllers.NewCRUDController[Model]( - logger, - crudService, - crudUnsafeService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader(""), - ) - - _, err := route.Controller.GetModel(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityNotFound) -} - -func TestCRUDGetWithEntityIDNotUUIDReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) - - route := controllers.NewCRUDController[Model]( - logger, - crudService, - crudUnsafeService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"id": "not-uuid"}) - - _, err := route.Controller.GetModel(response, request) - assert.ErrorIs(t, err, controllers.ErrIDNotAnUUID) -} - -func TestCRUDGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) - - uuid := badorm.NewUUID() - - crudService. - On("GetByID", uuid). - Return(nil, gorm.ErrRecordNotFound) - - route := controllers.NewCRUDController[Model]( - logger, - crudService, - crudUnsafeService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader(""), - ) - - request = mux.SetURLVars(request, map[string]string{"id": uuid.String()}) - - _, err := route.Controller.GetModel(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityNotFound) -} - -func TestCRUDGetWithErrorInDBReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) - - uuid := badorm.NewUUID() - - crudService. - On("GetByID", uuid). - Return(nil, errors.New("db error")) - - route := controllers.NewCRUDController[Model]( - logger, - crudService, - crudUnsafeService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader(""), - ) - - request = mux.SetURLVars(request, map[string]string{"id": uuid.String()}) - - _, err := route.Controller.GetModel(response, request) - assert.ErrorContains(t, err, "db error") -} - -func TestCRUDGetWithCorrectIDReturnsObject(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) - - uuid := badorm.NewUUID() - entity := Model{} - - crudService. - On("GetByID", uuid). - Return(&entity, nil) - - route := controllers.NewCRUDController[Model]( - logger, - crudService, - crudUnsafeService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader(""), - ) - - request = mux.SetURLVars(request, map[string]string{"id": uuid.String()}) - entityReturned, err := route.Controller.GetModel(response, request) - assert.Nil(t, err) - assert.Equal(t, &entity, entityReturned) -} - -// ----------------------- GetModels ----------------------- - -func TestGetModelsWithErrorInDBReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) - - crudUnsafeService. - On("Query", map[string]any{}). - Return(nil, errors.New("db error")) - - route := controllers.NewCRUDController[Model]( - logger, - crudService, - crudUnsafeService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader(""), - ) - - _, err := route.Controller.GetModels(response, request) - assert.ErrorContains(t, err, "db error") -} - -func TestGetModelsWithoutParams(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) - - entity1 := &Model{} - entity2 := &Model{} - - crudUnsafeService. - On("Query", map[string]any{}). - Return([]*Model{entity1, entity2}, nil) - - route := controllers.NewCRUDController[Model]( - logger, - crudService, - crudUnsafeService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader(""), - ) - - entitiesReturned, err := route.Controller.GetModels(response, request) - assert.Nil(t, err) - assert.Len(t, entitiesReturned, 2) - assert.Contains(t, entitiesReturned, entity1) - assert.Contains(t, entitiesReturned, entity2) -} - -func TestGetModelsWithParams(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) - - entity1 := &Model{} - - crudUnsafeService. - On("Query", map[string]any{"param1": "something"}). - Return([]*Model{entity1}, nil) - - route := controllers.NewCRUDController[Model]( - logger, - crudService, - crudUnsafeService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader("{\"param1\": \"something\"}"), - ) - - entitiesReturned, err := route.Controller.GetModels(response, request) - assert.Nil(t, err) - assert.Len(t, entitiesReturned, 1) - assert.Contains(t, entitiesReturned, entity1) -} - -func TestGetModelsWithParamsNotJsonReturnsError(t *testing.T) { - crudService := mockBadorm.NewCRUDService[Model, badorm.UUID](t) - crudUnsafeService := mockUnsafe.NewCRUDService[Model, badorm.UUID](t) - - route := controllers.NewCRUDController[Model]( - logger, - crudService, - crudUnsafeService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader("bad json"), - ) - - _, err := route.Controller.GetModels(response, request) - assert.ErrorIs(t, err, controllers.HTTPErrRequestMalformed) -} diff --git a/docs/badaas/functionalities.rst b/docs/badaas/functionalities.rst index 6fb66bc2..46cda02e 100644 --- a/docs/badaas/functionalities.rst +++ b/docs/badaas/functionalities.rst @@ -57,22 +57,4 @@ see the `example `_. badaasControllers.EAVControllerModule, ).Run() - } - -CRUDControllerModule -------------------------------- - -`CRUDControllerModule` adds `/objects/{type}` and `/objects/{type}/{id}`, -where `{type}` is any defined type and `{id}` is any uuid. -These routes allow us to read objects. For more information on how to use them, -see the `example `_. - -.. code-block:: go - - func runCommandFunc(cmd *cobra.Command, args []string) { - fx.New( - badaas.BadaasModule, - - router.GetCRUDRoutesModule[models.Company](), - ).Run() } \ No newline at end of file diff --git a/docs/badorm/crud.rst b/docs/badorm/crud.rst index ef04946f..2360c6d2 100644 --- a/docs/badorm/crud.rst +++ b/docs/badorm/crud.rst @@ -54,17 +54,4 @@ For example: func QueryCRUDObjects(crudYourModelService badorm.CRUDService[YourModel, badorm.UUID]) { // use crudYourModelService - } - -unsafe.CRUDService and unsafe.CRUDRepository ----------------------------------------------------- - -There is another version of the CRUDService and CRUDRepository found in -unsafe.CRUDService and unsafe.CRUDRepository respectively. -This version is not part of the compilable query system but allows to perform -queries through maps built on runtime (hence the name unsafe). - -**Its direct use is not recommended**, since using the compilable query system we can make -sure that the query is correct at compile time, while here errors will happen at runtime in -case your condition map is not well structured. -This functionality is used internally by BaDaaS to provide an HTTP api for queries. \ No newline at end of file + } \ No newline at end of file diff --git a/mocks/badorm/unsafe/CRUDRepository.go b/mocks/badorm/unsafe/CRUDRepository.go deleted file mode 100644 index 50466455..00000000 --- a/mocks/badorm/unsafe/CRUDRepository.go +++ /dev/null @@ -1,56 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import ( - badorm "github.com/ditrit/badaas/badorm" - gorm "gorm.io/gorm" - - mock "github.com/stretchr/testify/mock" -) - -// CRUDRepository is an autogenerated mock type for the CRUDRepository type -type CRUDRepository[T badorm.Model, ID badorm.ModelID] struct { - mock.Mock -} - -// Query provides a mock function with given fields: tx, conditions -func (_m *CRUDRepository[T, ID]) Query(tx *gorm.DB, conditions map[string]interface{}) ([]*T, error) { - ret := _m.Called(tx, conditions) - - var r0 []*T - var r1 error - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) ([]*T, error)); ok { - return rf(tx, conditions) - } - if rf, ok := ret.Get(0).(func(*gorm.DB, map[string]interface{}) []*T); ok { - r0 = rf(tx, conditions) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*T) - } - } - - if rf, ok := ret.Get(1).(func(*gorm.DB, map[string]interface{}) error); ok { - r1 = rf(tx, conditions) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type mockConstructorTestingTNewCRUDRepository interface { - mock.TestingT - Cleanup(func()) -} - -// NewCRUDRepository creates a new instance of CRUDRepository. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDRepository[T badorm.Model, ID badorm.ModelID](t mockConstructorTestingTNewCRUDRepository) *CRUDRepository[T, ID] { - mock := &CRUDRepository[T, ID]{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/mocks/badorm/unsafe/CRUDService.go b/mocks/badorm/unsafe/CRUDService.go deleted file mode 100644 index 9a6be35f..00000000 --- a/mocks/badorm/unsafe/CRUDService.go +++ /dev/null @@ -1,54 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import ( - badorm "github.com/ditrit/badaas/badorm" - mock "github.com/stretchr/testify/mock" -) - -// CRUDService is an autogenerated mock type for the CRUDService type -type CRUDService[T badorm.Model, ID badorm.ModelID] struct { - mock.Mock -} - -// Query provides a mock function with given fields: conditions -func (_m *CRUDService[T, ID]) Query(conditions map[string]interface{}) ([]*T, error) { - ret := _m.Called(conditions) - - var r0 []*T - var r1 error - if rf, ok := ret.Get(0).(func(map[string]interface{}) ([]*T, error)); ok { - return rf(conditions) - } - if rf, ok := ret.Get(0).(func(map[string]interface{}) []*T); ok { - r0 = rf(conditions) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*T) - } - } - - if rf, ok := ret.Get(1).(func(map[string]interface{}) error); ok { - r1 = rf(conditions) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type mockConstructorTestingTNewCRUDService interface { - mock.TestingT - Cleanup(func()) -} - -// NewCRUDService creates a new instance of CRUDService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDService[T badorm.Model, ID badorm.ModelID](t mockConstructorTestingTNewCRUDService) *CRUDService[T, ID] { - mock := &CRUDService[T, ID]{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/mocks/controllers/CRUDController.go b/mocks/controllers/CRUDController.go deleted file mode 100644 index 22b41e2c..00000000 --- a/mocks/controllers/CRUDController.go +++ /dev/null @@ -1,86 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import ( - http "net/http" - - httperrors "github.com/ditrit/badaas/httperrors" - mock "github.com/stretchr/testify/mock" -) - -// CRUDController is an autogenerated mock type for the CRUDController type -type CRUDController struct { - mock.Mock -} - -// GetModel provides a mock function with given fields: w, r -func (_m *CRUDController) GetModel(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(w, r) - - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { - return rf(w, r) - } - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(w, r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(w, r) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - -// GetModels provides a mock function with given fields: w, r -func (_m *CRUDController) GetModels(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(w, r) - - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { - return rf(w, r) - } - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(w, r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(w, r) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - -type mockConstructorTestingTNewCRUDController interface { - mock.TestingT - Cleanup(func()) -} - -// NewCRUDController creates a new instance of CRUDController. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewCRUDController(t mockConstructorTestingTNewCRUDController) *CRUDController { - mock := &CRUDController{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/router/ModuleFx.go b/router/ModuleFx.go index 36c12aab..485d2f11 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -1,12 +1,8 @@ package router import ( - "fmt" - "go.uber.org/fx" - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/unsafe" "github.com/ditrit/badaas/controllers" "github.com/ditrit/badaas/router/middlewares" "github.com/ditrit/badaas/services" @@ -16,12 +12,6 @@ import ( var RouterModule = fx.Module( "router", fx.Provide(NewRouter), - fx.Invoke( - fx.Annotate( - AddCRUDRoutes, - fx.ParamTags(`group:"crudControllers"`), - ), - ), // middlewares fx.Provide(middlewares.NewJSONController), fx.Provide(middlewares.NewMiddlewareLogger), @@ -70,22 +60,3 @@ var EAVRoutesModule = fx.Module( ), ), ) - -func GetCRUDRoutesModule[T badorm.Model]() fx.Option { - typeName := fmt.Sprintf("%T", *new(T)) - - return fx.Module( - typeName+"CRUDRoutesModule", - // service - badorm.GetCRUDServiceModule[T](), - unsafe.GetCRUDServiceModule[T](), - - // controller - fx.Provide( - fx.Annotate( - controllers.NewCRUDController[T], - fx.ResultTags(`group:"crudControllers"`), - ), - ), - ) -} diff --git a/router/routes.go b/router/routes.go index 6dee8178..d4fda271 100644 --- a/router/routes.go +++ b/router/routes.go @@ -86,25 +86,3 @@ func AddEAVCRUDRoutes( router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.UpdateObject)).Methods(http.MethodPut) router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.DeleteObject)).Methods(http.MethodDelete) } - -func AddCRUDRoutes( - crudRoutes []controllers.CRUDRoute, - router *mux.Router, - jsonController middlewares.JSONController, -) { - for _, crudRoute := range crudRoutes { - // Objects CRUD - objectsBase := "/objects/" + crudRoute.TypeName - objectsWithID := objectsBase + "/{id}" - // TODO create, update, delete - // read - router.HandleFunc( - objectsWithID, - jsonController.Wrap(crudRoute.Controller.GetModel), - ).Methods(http.MethodGet) - router.HandleFunc( - objectsBase, - jsonController.Wrap(crudRoute.Controller.GetModels), - ).Methods(http.MethodGet) - } -} diff --git a/router/routes_test.go b/router/routes_test.go index 0ae469b2..7d5e5874 100644 --- a/router/routes_test.go +++ b/router/routes_test.go @@ -179,35 +179,3 @@ func TestAddEAVRoutes(t *testing.T) { assert.Equal(t, http.StatusOK, response.Code) assert.Equal(t, "{\"GetObjects\":\"called\"}", response.Body.String()) } - -func TestAddCRUDRoutes(t *testing.T) { - jsonController := middlewares.NewJSONController(logger) - - crudController := mockControllers.NewCRUDController(t) - crudController. - On("GetModels", mock.Anything, mock.Anything). - Return(map[string]string{"GetModels": "called"}, nil) - - router := NewRouter() - AddCRUDRoutes( - []controllers.CRUDRoute{ - { - TypeName: "model", - Controller: crudController, - }, - }, - router, - jsonController, - ) - - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/model", - nil, - ) - - router.ServeHTTP(response, request) - assert.Equal(t, http.StatusOK, response.Code) - assert.Equal(t, "{\"GetModels\":\"called\"}", response.Body.String()) -} diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index b17178f8..b2dc9983 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -170,9 +170,6 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^I delete a "(.+)" with the object id$`, t.deleteWithObjectID) ctx.Step(`^I modify a "(.+)" with attributes$`, t.modifyWithAttributes) ctx.Step(`^a "(.+)" object exists with property "(.+)" related to last object and properties$`, t.objectExistsWithRelation) - ctx.Step(`^a sale object exists for product "(\d+)", code "(\d+)" and description "(.+)"$`, t.saleExists) - ctx.Step(`^I query all sale objects with conditions$`, t.querySalesWithConditions) - ctx.Step(`^there is a sale object with attributes$`, t.thereIsSaleWithAttributes) } func CleanDB(db *gorm.DB) { diff --git a/test_e2e/features/badorm.feature b/test_e2e/features/badorm.feature deleted file mode 100644 index 22061f47..00000000 --- a/test_e2e/features/badorm.feature +++ /dev/null @@ -1,38 +0,0 @@ -Feature: Saving and querying objects in the database using BaDORM - Scenario: Created objects can be queried by a property - Given a sale object exists for product "1", code "1" and description "sale1" - And a sale object exists for product "2", code "2" and description "sale2" - When I query all sale objects with conditions - | key | value | type | - | code | 1 | integer | - Then there are "1" "sale" objects - And there is a sale object with attributes - | key | value | type | - | Code | 1 | float | - | Description | sale1 | string | - - Scenario: Created objects can be queried by multiple properties - Given a sale object exists for product "1", code "1" and description "sale1" - And a sale object exists for product "2", code "2" and description "sale2" - When I query all sale objects with conditions - | key | value | type | - | code | 1 | integer | - | description | sale1 | string | - Then there are "1" "sale" objects - And there is a sale object with attributes - | key | value | type | - | Code | 1 | float | - | Description | sale1 | string | - - Scenario: Created objects can be queried doing joins - Given a sale object exists for product "1", code "1" and description "sale1" - And a sale object exists for product "2", code "2" and description "sale2" - When I query all sale objects with conditions - | key | value | type | - | code | 1 | integer | - | Product | {"int": "1"} | json | - Then there are "1" "sale" objects - And there is a sale object with attributes - | key | value | type | - | Code | 1 | float | - | Description | sale1 | string | \ No newline at end of file diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index b5b2581e..aeff142b 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -12,8 +12,6 @@ import ( "github.com/cucumber/godog" "github.com/cucumber/messages-go/v16" "github.com/elliotchance/pie/v2" - - "github.com/ditrit/badaas/testintegration/models" ) const BaseURL = "http://localhost:8000" @@ -426,56 +424,6 @@ func (t *TestContext) getIDFromJSON() string { return idString } -func (t *TestContext) saleExists(productInt int, code int, description string) { - product := &models.Product{ - Int: productInt, - } - - sale := &models.Sale{ - Code: code, - Description: description, - Product: *product, - } - - if err := t.db.Create(sale).Error; err != nil { - log.Fatalln(err) - } -} - -func (t *TestContext) querySalesWithConditions(jsonTable *godog.Table) error { - err := t.requestWithJSON( - "/objects/sale", - http.MethodGet, - jsonTable, - ) - if err != nil { - return err - } - - err = t.assertStatusCode(http.StatusOK) - if err != nil { - return err - } - - return nil -} - -func (t *TestContext) thereIsSaleWithAttributes(jsonTable *godog.Table) error { - expectedValues, err := buildMapFromTable(jsonTable) - if err != nil { - log.Fatalln(err) - } - - objectMapList := t.getObjectMapListFromJSON() - for _, objectMap := range objectMapList { - if t.areAllAttributesEqual(objectMap, expectedValues) { - return nil - } - } - - return fmt.Errorf("object with attributes %v not found in %v", expectedValues, objectMapList) -} - func (t *TestContext) getListFromJSON() []any { objectList, ok := t.json.([]any) if !ok { diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index cabf41c7..a13ffdb1 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -18,7 +18,6 @@ import ( "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/router" "github.com/ditrit/badaas/testintegration" - "github.com/ditrit/badaas/testintegration/models" "github.com/ditrit/verdeter" ) @@ -55,8 +54,6 @@ func runHTTPServer(_ *cobra.Command, _ []string) { router.AuthRoutesModule, router.EAVRoutesModule, - router.GetCRUDRoutesModule[models.Sale](), - // create httpServer fx.Provide(NewHTTPServer), diff --git a/testintegration/badorm_test.go b/testintegration/badorm_test.go index 5569a814..528fc5c2 100644 --- a/testintegration/badorm_test.go +++ b/testintegration/badorm_test.go @@ -14,7 +14,6 @@ import ( "gorm.io/gorm" "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/unsafe" "github.com/ditrit/badaas/configuration" "github.com/ditrit/badaas/logger" "github.com/ditrit/badaas/testintegration/models" @@ -58,19 +57,6 @@ func TestBaDORM(t *testing.T) { badorm.GetCRUDServiceModule[models.Brand](), badorm.GetCRUDServiceModule[models.Child](), - unsafe.GetCRUDServiceModule[models.Company](), - unsafe.GetCRUDServiceModule[models.Seller](), - unsafe.GetCRUDServiceModule[models.Product](), - unsafe.GetCRUDServiceModule[models.Sale](), - unsafe.GetCRUDServiceModule[models.City](), - unsafe.GetCRUDServiceModule[models.Country](), - unsafe.GetCRUDServiceModule[models.Employee](), - unsafe.GetCRUDServiceModule[models.Person](), - unsafe.GetCRUDServiceModule[models.Bicycle](), - unsafe.GetCRUDServiceModule[models.Phone](), - unsafe.GetCRUDServiceModule[models.Brand](), - - fx.Provide(NewCRUDUnsafeServiceIntTestSuite), fx.Provide(NewCRUDRepositoryIntTestSuite), fx.Provide(NewWhereConditionsIntTestSuite), fx.Provide(NewJoinConditionsIntTestSuite), @@ -83,7 +69,6 @@ func TestBaDORM(t *testing.T) { func runBaDORMTestSuites( tsCRUDRepository *CRUDRepositoryIntTestSuite, - tsCRUDUnsafeService *CRUDUnsafeServiceIntTestSuite, tsWhereConditions *WhereConditionsIntTestSuite, tsJoinConditions *JoinConditionsIntTestSuite, tsPreloadConditions *PreloadConditionsIntTestSuite, @@ -91,7 +76,6 @@ func runBaDORMTestSuites( shutdowner fx.Shutdowner, ) { suite.Run(tGlobal, tsCRUDRepository) - suite.Run(tGlobal, tsCRUDUnsafeService) suite.Run(tGlobal, tsWhereConditions) suite.Run(tGlobal, tsJoinConditions) suite.Run(tGlobal, tsPreloadConditions) diff --git a/testintegration/unsafeCRUDService_test.go b/testintegration/unsafeCRUDService_test.go deleted file mode 100644 index 00316b0d..00000000 --- a/testintegration/unsafeCRUDService_test.go +++ /dev/null @@ -1,496 +0,0 @@ -package testintegration - -import ( - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/badorm/unsafe" - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/testintegration/models" -) - -type CRUDUnsafeServiceIntTestSuite struct { - CRUDServiceCommonIntTestSuite - crudProductService unsafe.CRUDService[models.Product, badorm.UUID] - crudSaleService unsafe.CRUDService[models.Sale, badorm.UUID] - crudSellerService unsafe.CRUDService[models.Seller, badorm.UUID] - crudCountryService unsafe.CRUDService[models.Country, badorm.UUID] - crudCityService unsafe.CRUDService[models.City, badorm.UUID] - crudEmployeeService unsafe.CRUDService[models.Employee, badorm.UUID] - crudBicycleService unsafe.CRUDService[models.Bicycle, badorm.UUID] - crudBrandService unsafe.CRUDService[models.Brand, badorm.UIntID] - crudPhoneService unsafe.CRUDService[models.Phone, badorm.UIntID] -} - -func NewCRUDUnsafeServiceIntTestSuite( - db *gorm.DB, - crudProductService unsafe.CRUDService[models.Product, badorm.UUID], - crudSaleService unsafe.CRUDService[models.Sale, badorm.UUID], - crudSellerService unsafe.CRUDService[models.Seller, badorm.UUID], - crudCountryService unsafe.CRUDService[models.Country, badorm.UUID], - crudCityService unsafe.CRUDService[models.City, badorm.UUID], - crudEmployeeService unsafe.CRUDService[models.Employee, badorm.UUID], - crudBicycleService unsafe.CRUDService[models.Bicycle, badorm.UUID], - crudBrandService unsafe.CRUDService[models.Brand, badorm.UIntID], - crudPhoneService unsafe.CRUDService[models.Phone, badorm.UIntID], -) *CRUDUnsafeServiceIntTestSuite { - return &CRUDUnsafeServiceIntTestSuite{ - CRUDServiceCommonIntTestSuite: CRUDServiceCommonIntTestSuite{ - db: db, - }, - crudProductService: crudProductService, - crudSaleService: crudSaleService, - crudSellerService: crudSellerService, - crudCountryService: crudCountryService, - crudCityService: crudCityService, - crudEmployeeService: crudEmployeeService, - crudBicycleService: crudBicycleService, - crudBrandService: crudBrandService, - crudPhoneService: crudPhoneService, - } -} - -// ------------------------- Query -------------------------------- - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.crudProductService.Query(map[string]any{}) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { - match := ts.createProduct("", 0, 0, false, nil) - - entities, err := ts.crudProductService.Query(map[string]any{}) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithoutConditionsReturnsTheListWhenMultipleCreated() { - match1 := ts.createProduct("", 0, 0, false, nil) - match2 := ts.createProduct("", 0, 0, false, nil) - match3 := ts.createProduct("", 0, 0, false, nil) - - entities, err := ts.crudProductService.Query(map[string]any{}) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2, match3}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsReturnsEmptyIfNotEntitiesCreated() { - params := map[string]any{ - "string_something_else": "not_created", - } - entities, err := ts.crudProductService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsReturnsEmptyIfNothingMatch() { - ts.createProduct("something_else", 0, 0, false, nil) - - params := map[string]any{ - "string_something_else": "not_match", - } - entities, err := ts.crudProductService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsReturnsOneIfOnlyOneMatch() { - match := ts.createProduct("match", 0, 0, false, nil) - ts.createProduct("not_match", 0, 0, false, nil) - - params := map[string]any{ - "string_something_else": "match", - } - entities, err := ts.crudProductService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsReturnsMultipleIfMultipleMatch() { - match1 := ts.createProduct("match", 0, 0, false, nil) - match2 := ts.createProduct("match", 0, 0, false, nil) - ts.createProduct("not_match", 0, 0, false, nil) - - params := map[string]any{ - "string_something_else": "match", - } - entities, err := ts.crudProductService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatDoesNotExistReturnsDBError() { - ts.createProduct("match", 0, 0, false, nil) - - params := map[string]any{ - "not_exists": "not_exists", - } - _, err := ts.crudProductService.Query(params) - ts.NotNil(err) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfIntType() { - match := ts.createProduct("match", 1, 0, false, nil) - ts.createProduct("not_match", 2, 0, false, nil) - - params := map[string]any{ - "int": 1, - } - entities, err := ts.crudProductService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfIncorrectType() { - ts.createProduct("not_match", 1, 0, false, nil) - - params := map[string]any{ - "int": "not_an_int", - } - result, err := ts.crudProductService.Query(params) - - switch getDBDialector() { - case configuration.MySQL, configuration.SQLite: - // mysql and sqlite simply matches nothing - ts.Nil(err) - ts.Len(result, 0) - case configuration.PostgreSQL, configuration.SQLServer: - // postgresql and sqlserver do the verification - ts.NotNil(err) - } -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfFloatType() { - match := ts.createProduct("match", 0, 1.1, false, nil) - ts.createProduct("not_match", 0, 2.2, false, nil) - - params := map[string]any{ - "float": 1.1, - } - entities, err := ts.crudProductService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfBoolType() { - match := ts.createProduct("match", 0, 0.0, true, nil) - ts.createProduct("not_match", 0, 0.0, false, nil) - - params := map[string]any{ - "bool": true, - } - entities, err := ts.crudProductService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionOfRelationType() { - product1 := ts.createProduct("", 0, 0.0, false, nil) - product2 := ts.createProduct("", 0, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - params := map[string]any{ - "product_id": product1.ID.String(), - } - entities, err := ts.crudSaleService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithMultipleConditionsOfDifferentTypesWorks() { - match1 := ts.createProduct("match", 1, 0.0, true, nil) - match2 := ts.createProduct("match", 1, 0.0, true, nil) - - ts.createProduct("not_match", 1, 0.0, true, nil) - ts.createProduct("match", 2, 0.0, true, nil) - - params := map[string]any{ - "string_something_else": "match", - "int": 1, - "bool": true, - } - entities, err := ts.crudProductService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Product{match1, match2}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionsOnUIntModel() { - match := ts.createBrand("match") - ts.createBrand("not_match") - - params := map[string]any{ - "name": "match", - } - entities, err := ts.crudBrandService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Brand{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsUintBelongsTo() { - brand1 := ts.createBrand("google") - brand2 := ts.createBrand("apple") - - match := ts.createPhone("pixel", *brand1) - ts.createPhone("iphone", *brand2) - - params := map[string]any{ - "Brand": map[string]any{ - "name": "google", - }, - } - entities, err := ts.crudPhoneService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Phone{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsBelongsTo() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) - - match := ts.createSale(0, product1, nil) - ts.createSale(0, product2, nil) - - params := map[string]any{ - "Product": map[string]any{ - "int": 1, - }, - } - entities, err := ts.crudSaleService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsHasOneOptional() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - params := map[string]any{ - "Seller": map[string]any{ - "name": "franco", - }, - } - entities, err := ts.crudSaleService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsHasOneSelfReferential() { - boss1 := &models.Employee{ - Name: "Xavier", - } - boss2 := &models.Employee{ - Name: "Vincent", - } - - match := ts.createEmployee("franco", boss1) - ts.createEmployee("pierre", boss2) - - params := map[string]any{ - "Boss": map[string]any{ - "name": "Xavier", - }, - } - entities, err := ts.crudEmployeeService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Employee{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsOneToOne() { - capital1 := models.City{ - Name: "Buenos Aires", - } - capital2 := models.City{ - Name: "Paris", - } - - ts.createCountry("Argentina", capital1) - ts.createCountry("France", capital2) - - params := map[string]any{ - "Country": map[string]any{ - "name": "Argentina", - }, - } - entities, err := ts.crudCityService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.City{&capital1}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsOneToOneReversed() { - capital1 := models.City{ - Name: "Buenos Aires", - } - capital2 := models.City{ - Name: "Paris", - } - - country1 := ts.createCountry("Argentina", capital1) - ts.createCountry("France", capital2) - - params := map[string]any{ - "Capital": map[string]any{ - "name": "Buenos Aires", - }, - } - entities, err := ts.crudCountryService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Country{country1}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsReturnsErrorIfNoRelation() { - params := map[string]any{ - "NotExists": map[string]any{ - "int": 1, - }, - } - _, err := ts.crudSaleService.Query(params) - ts.ErrorContains(err, "Sale has not attribute named NotExists or NotExistsID") -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsOnHasMany() { - company1 := ts.createCompany("ditrit") - company2 := ts.createCompany("orness") - - match := ts.createSeller("franco", company1) - ts.createSeller("agustin", company2) - - params := map[string]any{ - "Company": map[string]any{ - "name": "ditrit", - }, - } - entities, err := ts.crudSellerService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Seller{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsOnDifferentAttributes() { - product1 := ts.createProduct("match", 1, 0.0, false, nil) - product2 := ts.createProduct("match", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - params := map[string]any{ - "Product": map[string]any{ - "int": 1, - "string_something_else": "match", - }, - } - entities, err := ts.crudSaleService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsAndFiltersTheMainEntity() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(1, product1, seller1) - ts.createSale(2, product2, seller2) - ts.createSale(2, product1, seller2) - - params := map[string]any{ - "Product": map[string]any{ - "int": 1, - }, - "code": 1, - } - entities, err := ts.crudSaleService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsDifferentEntities() { - product1 := ts.createProduct("", 1, 0.0, false, nil) - product2 := ts.createProduct("", 2, 0.0, false, nil) - - seller1 := ts.createSeller("franco", nil) - seller2 := ts.createSeller("agustin", nil) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - ts.createSale(0, product1, seller2) - ts.createSale(0, product2, seller1) - - params := map[string]any{ - "Product": map[string]any{ - "int": 1, - }, - "Seller": map[string]any{ - "name": "franco", - }, - } - entities, err := ts.crudSaleService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} - -func (ts *CRUDUnsafeServiceIntTestSuite) TestGetEntitiesUnsafeWithConditionThatJoinsMultipleTimes() { - product1 := ts.createProduct("", 0, 0.0, false, nil) - product2 := ts.createProduct("", 0, 0.0, false, nil) - - company1 := ts.createCompany("ditrit") - company2 := ts.createCompany("orness") - - seller1 := ts.createSeller("franco", company1) - seller2 := ts.createSeller("agustin", company2) - - match := ts.createSale(0, product1, seller1) - ts.createSale(0, product2, seller2) - - params := map[string]any{ - "Seller": map[string]any{ - "name": "franco", - "Company": map[string]any{ - "name": "ditrit", - }, - }, - } - entities, err := ts.crudSaleService.Query(params) - ts.Nil(err) - - EqualList(&ts.Suite, []*models.Sale{match}, entities) -} From b547c0080b9153d344e94840bd5e7b1b7e55af92 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 10:53:05 +0200 Subject: [PATCH 454/467] (prs) remove eav model --- changelog.md | 4 - controllers/eav.go | 165 ---- controllers/eav_test.go | 700 -------------- docs/badaas/functionalities.rst | 18 - docs/badaas/quickstart.rst | 1 - mocks/controllers/EAVController.go | 170 ---- mocks/services/EAVService.go | 148 --- persistence/models/Attribute.go | 80 -- persistence/models/Attribute_test.go | 84 -- persistence/models/Entity.go | 61 -- persistence/models/EntityType.go | 17 - persistence/models/Entity_test.go | 75 -- persistence/models/Value.go | 179 ---- persistence/models/Value_test.go | 224 ----- persistence/repository/EntityRepository.go | 198 ---- .../repository/EntityRepository_test.go | 245 ----- .../repository/EntityTypeRepository.go | 43 - persistence/repository/ValueRepository.go | 61 -- router/ModuleFx.go | 22 - router/routes.go | 15 - router/routes_test.go | 27 - services/ModuleFx.go | 25 - services/eav.go | 248 ----- services/transaction_executor.go | 42 - test_e2e/badaas_e2e_test.go | 58 -- test_e2e/features/eav.feature | 128 --- test_e2e/http_support_test.go | 203 ---- test_e2e/test_api.go | 1 - testintegration/asserts.go | 29 - testintegration/badaas_test.go | 65 -- testintegration/eavService.go | 881 ------------------ 31 files changed, 4217 deletions(-) delete mode 100644 controllers/eav.go delete mode 100644 controllers/eav_test.go delete mode 100644 mocks/controllers/EAVController.go delete mode 100644 mocks/services/EAVService.go delete mode 100644 persistence/models/Attribute.go delete mode 100644 persistence/models/Attribute_test.go delete mode 100644 persistence/models/Entity.go delete mode 100644 persistence/models/EntityType.go delete mode 100644 persistence/models/Entity_test.go delete mode 100644 persistence/models/Value.go delete mode 100644 persistence/models/Value_test.go delete mode 100644 persistence/repository/EntityRepository.go delete mode 100644 persistence/repository/EntityRepository_test.go delete mode 100644 persistence/repository/EntityTypeRepository.go delete mode 100644 persistence/repository/ValueRepository.go delete mode 100644 services/eav.go delete mode 100644 services/transaction_executor.go delete mode 100644 test_e2e/features/eav.feature delete mode 100644 testintegration/eavService.go diff --git a/changelog.md b/changelog.md index 98f72b64..968e3255 100644 --- a/changelog.md +++ b/changelog.md @@ -31,10 +31,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add a dto that is returned on a successful login. - Update verdeter to version v0.4.0. - Add integration tests. -- Add a eav controller to store objects in EAV format. -- Add some examples of data models. -- Add transaction executor to run services that lead to multiples queries. -- Add repositories to manage querying to the database. - Transform BadAas into a library. - Add BadCtl tool. - Add BaDORM to facilitate queries on sql databases. diff --git a/controllers/eav.go b/controllers/eav.go deleted file mode 100644 index ad299153..00000000 --- a/controllers/eav.go +++ /dev/null @@ -1,165 +0,0 @@ -package controllers - -import ( - "errors" - "fmt" - "net/http" - - "github.com/gorilla/mux" - "go.uber.org/zap" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/httperrors" - "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/services" -) - -type EAVController interface { - GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) - DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) -} - -// check interface compliance -var _ EAVController = (*eavControllerImpl)(nil) - -func NewEAVController( - logger *zap.Logger, - eavService services.EAVService, -) EAVController { - return &eavControllerImpl{ - logger: logger, - eavService: eavService, - } -} - -// The concrete implementation of the EAVController -type eavControllerImpl struct { - logger *zap.Logger - eavService services.EAVService -} - -// The handler responsible of the retrieval of one objects -func (controller *eavControllerImpl) GetObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) - if herr != nil { - return nil, herr - } - - entity, err := controller.eavService.GetEntity(entityTypeName, entityID) - - return entity, mapServiceError(err) -} - -// The handler responsible of the retrieval of multiple objects -func (controller *eavControllerImpl) GetObjects(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) - if herr != nil { - return nil, herr - } - - params, herr := decodeJSONOptional(r) - if herr != nil { - return nil, herr - } - - entities, err := controller.eavService.GetEntities(entityTypeName, params) - - return entities, mapEAVServiceError(err) -} - -// The handler responsible of the creation of a object -func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) - if herr != nil { - return nil, herr - } - - attrs, herr := decodeJSONOptional(r) - if herr != nil { - return nil, herr - } - - entity, err := controller.eavService.CreateEntity(entityTypeName, attrs) - if err != nil { - return nil, mapEAVServiceError(err) - } - - w.Header().Add("Location", buildEAVLocationString(entity)) - w.WriteHeader(http.StatusCreated) - - return entity, nil -} - -func buildEAVLocationString(et *models.Entity) string { - return fmt.Sprintf("eav/objects/%s/%s", et.EntityType.Name, et.ID.String()) -} - -// The handler responsible for the updates of one object -func (controller *eavControllerImpl) UpdateObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) - if herr != nil { - return nil, herr - } - - attrs, herr := decodeJSONOptional(r) - if herr != nil { - return nil, herr - } - - entity, err := controller.eavService.UpdateEntity(entityTypeName, entityID, attrs) - - return entity, mapServiceError(err) -} - -// The handler responsible for the deletion of a object -func (controller *eavControllerImpl) DeleteObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { - entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) - if herr != nil { - return nil, herr - } - - err := controller.eavService.DeleteEntity(entityTypeName, entityID) - - return nil, mapServiceError(err) -} - -func mapEAVServiceError(err error) httperrors.HTTPError { - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return ErrEntityTypeNotFound - } - - return mapServiceError(err) - } - - return nil -} - -// Extract the "type" parameter from url -func (controller *eavControllerImpl) getEntityTypeNameFromRequest(r *http.Request) (string, httperrors.HTTPError) { - entityTypeName, present := mux.Vars(r)["type"] - if !present { - return "", ErrEntityTypeNotFound - } - - return entityTypeName, nil -} - -// Extract the "type" and "id" parameters from url -func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Request) (string, badorm.UUID, httperrors.HTTPError) { - entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) - if herr != nil { - return "", badorm.NilUUID, herr - } - - entityID, herr := getEntityIDFromRequest(r) - if herr != nil { - return "", badorm.NilUUID, herr - } - - return entityTypeName, entityID, nil -} diff --git a/controllers/eav_test.go b/controllers/eav_test.go deleted file mode 100644 index c4db104e..00000000 --- a/controllers/eav_test.go +++ /dev/null @@ -1,700 +0,0 @@ -package controllers_test - -import ( - "errors" - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/gorilla/mux" - "github.com/stretchr/testify/assert" - "go.uber.org/zap" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/controllers" - mockServices "github.com/ditrit/badaas/mocks/services" - "github.com/ditrit/badaas/persistence/models" -) - -var logger, _ = zap.NewDevelopment() - -// ----------------------- GetObject ----------------------- - -func TestGetWithoutTypeReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/", - strings.NewReader(""), - ) - - _, err := controller.GetObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) -} - -func TestGetOfNotExistentTypeReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - uuid := badorm.NewUUID() - eavService. - On("GetEntity", "no-exists", uuid). - Return(nil, gorm.ErrRecordNotFound) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/no-exists/id", - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) - - _, err := controller.GetObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityNotFound) -} - -func TestGetWithoutEntityIDReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) - - _, err := controller.GetObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityNotFound) -} - -func TestGetWithEntityIDNotUUIDReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/not-uuid", - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": "not-uuid"}) - - _, err := controller.GetObject(response, request) - assert.ErrorIs(t, err, controllers.ErrIDNotAnUUID) -} - -func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - uuid := badorm.NewUUID() - - eavService. - On("GetEntity", entityType.Name, uuid). - Return(nil, gorm.ErrRecordNotFound) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/"+uuid.String(), - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - - _, err := controller.GetObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityNotFound) -} - -func TestGetWithErrorInDBReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - uuid := badorm.NewUUID() - - eavService. - On("GetEntity", entityType.Name, uuid). - Return(nil, errors.New("db error")) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/"+uuid.String(), - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - - _, err := controller.GetObject(response, request) - assert.ErrorContains(t, err, "db error") -} - -func TestGetWithCorrectIDReturnsObject(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - entity := &models.Entity{ - EntityType: entityType, - } - - uuid := badorm.NewUUID() - - eavService. - On("GetEntity", entityType.Name, uuid). - Return(entity, nil) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/"+uuid.String(), - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - - entityReturned, err := controller.GetObject(response, request) - assert.Nil(t, err) - assert.Equal(t, entity, entityReturned) -} - -// ----------------------- GetAll ----------------------- - -func TestGetAllWithoutTypeReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/", - strings.NewReader(""), - ) - - _, err := controller.GetObjects(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) -} - -func TestGetAllOfNotExistentTypeReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - eavService. - On("GetEntities", "no-exists", map[string]any{}). - Return(nil, gorm.ErrRecordNotFound) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/no-exists", - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) - - _, err := controller.GetObjects(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) -} - -func TestGetAllWithErrorInDBReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - eavService. - On("GetEntities", "no-exists", map[string]any{}). - Return(nil, errors.New("db error")) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/no-exists", - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) - - _, err := controller.GetObjects(response, request) - assert.ErrorContains(t, err, "db error") -} - -func TestGetAllWithoutParams(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - entity1 := &models.Entity{ - EntityType: entityType, - } - entity2 := &models.Entity{ - EntityType: entityType, - } - - eavService. - On("GetEntities", entityType.Name, map[string]any{}). - Return([]*models.Entity{entity1, entity2}, nil) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) - - entitiesReturned, err := controller.GetObjects(response, request) - assert.Nil(t, err) - assert.Len(t, entitiesReturned, 2) - assert.Contains(t, entitiesReturned, entity1) - assert.Contains(t, entitiesReturned, entity2) -} - -func TestGetAllWithParams(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - entity1 := &models.Entity{ - EntityType: entityType, - } - - eavService. - On("GetEntities", entityType.Name, map[string]any{"param1": "something"}). - Return([]*models.Entity{entity1}, nil) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/objects/exists/", - strings.NewReader("{\"param1\": \"something\"}"), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) - - entitiesReturned, err := controller.GetObjects(response, request) - assert.Nil(t, err) - assert.Len(t, entitiesReturned, 1) - assert.Contains(t, entitiesReturned, entity1) -} - -// ----------------------- DeleteObject ----------------------- - -func TestDeleteWithoutTypeReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodDelete, - "/objects/", - strings.NewReader(""), - ) - - _, err := controller.DeleteObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) -} - -func TestDeleteOfNotExistentTypeReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - uuid := badorm.NewUUID() - - eavService. - On("DeleteEntity", "no-exists", uuid). - Return(gorm.ErrRecordNotFound) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodDelete, - "/objects/no-exists/"+uuid.String(), - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) - - _, err := controller.DeleteObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityNotFound) -} - -func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - uuid := badorm.NewUUID() - - eavService. - On("DeleteEntity", entityType.Name, uuid). - Return(errors.New("db error")) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodDelete, - "/objects/exists/"+uuid.String(), - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - - _, err := controller.DeleteObject(response, request) - assert.ErrorContains(t, err, "db error") -} - -func TestDeleteObjectReturnsNil(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - uuid := badorm.NewUUID() - - eavService. - On("DeleteEntity", entityType.Name, uuid). - Return(nil) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodDelete, - "/objects/exists/"+uuid.String(), - strings.NewReader(""), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - - returned, err := controller.DeleteObject(response, request) - assert.Nil(t, err) - assert.Nil(t, returned) -} - -// ----------------------- CreateObject ----------------------- - -func TestCreateWithoutTypeReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodPost, - "/objects/", - strings.NewReader(""), - ) - - _, err := controller.CreateObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) -} - -func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodPost, - "/objects/exists", - strings.NewReader("bad json"), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) - - _, err := controller.CreateObject(response, request) - assert.ErrorContains(t, err, "The schema of the received data is not correct") -} - -func TestCreateOfNotExistentTypeReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - eavService. - On("CreateEntity", "no-exists", map[string]any{"1": "1"}). - Return(nil, gorm.ErrRecordNotFound) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodPost, - "/objects/no-exists", - strings.NewReader("{\"1\": \"1\"}"), - ) - request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) - - _, err := controller.CreateObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) -} - -func TestCreteObjectWithErrorInDBReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - eavService. - On("CreateEntity", entityType.Name, map[string]any{"1": "1"}). - Return(nil, errors.New("db error")) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodPost, - "/objects/exists", - strings.NewReader("{\"1\": \"1\"}"), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) - - _, err := controller.CreateObject(response, request) - assert.ErrorContains(t, err, "db error") -} - -func TestCreteObjectReturnsObject(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - entity := &models.Entity{ - EntityType: entityType, - } - - eavService. - On("CreateEntity", entityType.Name, map[string]any{"1": "1"}). - Return(entity, nil) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodPost, - "/objects/exists", - strings.NewReader("{\"1\": \"1\"}"), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) - - responded, err := controller.CreateObject(response, request) - assert.Nil(t, err) - assert.Equal(t, entity, responded) -} - -// ----------------------- UpdateObject ----------------------- - -func TestModifyWithoutTypeReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodPut, - "/objects/", - strings.NewReader(""), - ) - - _, err := controller.UpdateObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) -} - -func TestUpdateObjectWithBadJSONReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - uuid := badorm.NewUUID() - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodPut, - "/objects/exists", - strings.NewReader("bad json"), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - - _, err := controller.UpdateObject(response, request) - assert.ErrorContains(t, err, "The schema of the received data is not correct") -} - -func TestModifyOfNotExistentTypeReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - uuid := badorm.NewUUID() - - eavService. - On("UpdateEntity", "no-exists", uuid, map[string]any{"1": "1"}). - Return(nil, gorm.ErrRecordNotFound) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodPost, - "/objects/no-exists", - strings.NewReader("{\"1\": \"1\"}"), - ) - request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) - - _, err := controller.UpdateObject(response, request) - assert.ErrorIs(t, err, controllers.ErrEntityNotFound) -} - -func TestUpdateObjectWithErrorInDBReturnsError(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - uuid := badorm.NewUUID() - - eavService. - On("UpdateEntity", entityType.Name, uuid, map[string]any{"1": "1"}). - Return(nil, errors.New("db error")) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodPut, - "/objects/exists/"+uuid.String(), - strings.NewReader("{\"1\": \"1\"}"), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - - _, err := controller.UpdateObject(response, request) - assert.ErrorContains(t, err, "db error") -} - -func TestUpdateObjectReturnsObject(t *testing.T) { - eavService := mockServices.NewEAVService(t) - - entityType := &models.EntityType{ - Name: "entityType", - } - - uuid := badorm.NewUUID() - entity := &models.Entity{ - EntityType: entityType, - } - - eavService. - On("UpdateEntity", entityType.Name, uuid, map[string]any{"1": "1"}). - Return(entity, nil) - - controller := controllers.NewEAVController( - logger, - eavService, - ) - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodPut, - "/objects/exists/"+uuid.String(), - strings.NewReader("{\"1\": \"1\"}"), - ) - request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) - - responded, err := controller.UpdateObject(response, request) - assert.Nil(t, err) - assert.Equal(t, entity, responded) -} diff --git a/docs/badaas/functionalities.rst b/docs/badaas/functionalities.rst index 46cda02e..61104afd 100644 --- a/docs/badaas/functionalities.rst +++ b/docs/badaas/functionalities.rst @@ -39,22 +39,4 @@ which allow us to add authentication to our application in a simple way: // add /login and /logout routes provided by badaas badaasControllers.AuthControllerModule, ).Run() - } - -EAVControllerModule -------------------------------- - -`EAVControllerModule` adds `/eav/objects/{type}` and `/eav/objects/{type}/{id}`, -where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to create, -read, update and remove objects using an EAV model. For more information on how to use them, -see the `example `_. - -.. code-block:: go - - func runCommandFunc(cmd *cobra.Command, args []string) { - fx.New( - badaas.BadaasModule, - - badaasControllers.EAVControllerModule, - ).Run() } \ No newline at end of file diff --git a/docs/badaas/quickstart.rst b/docs/badaas/quickstart.rst index 8c835194..3bd0580e 100644 --- a/docs/badaas/quickstart.rst +++ b/docs/badaas/quickstart.rst @@ -64,7 +64,6 @@ To add them, you must initialise the corresponding module: // add routes provided by badaas badaasControllers.InfoControllerModule, badaasControllers.AuthControllerModule, - badaasControllers.EAVControllerModule, // Here you can start the rest of the modules that your project uses. ).Run() } diff --git a/mocks/controllers/EAVController.go b/mocks/controllers/EAVController.go deleted file mode 100644 index d9c4a47b..00000000 --- a/mocks/controllers/EAVController.go +++ /dev/null @@ -1,170 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import ( - http "net/http" - - httperrors "github.com/ditrit/badaas/httperrors" - mock "github.com/stretchr/testify/mock" -) - -// EAVController is an autogenerated mock type for the EAVController type -type EAVController struct { - mock.Mock -} - -// CreateObject provides a mock function with given fields: w, r -func (_m *EAVController) CreateObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(w, r) - - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { - return rf(w, r) - } - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(w, r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(w, r) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - -// DeleteObject provides a mock function with given fields: w, r -func (_m *EAVController) DeleteObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(w, r) - - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { - return rf(w, r) - } - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(w, r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(w, r) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - -// GetObject provides a mock function with given fields: w, r -func (_m *EAVController) GetObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(w, r) - - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { - return rf(w, r) - } - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(w, r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(w, r) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - -// GetObjects provides a mock function with given fields: w, r -func (_m *EAVController) GetObjects(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(w, r) - - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { - return rf(w, r) - } - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(w, r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(w, r) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - -// UpdateObject provides a mock function with given fields: w, r -func (_m *EAVController) UpdateObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { - ret := _m.Called(w, r) - - var r0 interface{} - var r1 httperrors.HTTPError - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { - return rf(w, r) - } - if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { - r0 = rf(w, r) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(interface{}) - } - } - - if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { - r1 = rf(w, r) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(httperrors.HTTPError) - } - } - - return r0, r1 -} - -type mockConstructorTestingTNewEAVController interface { - mock.TestingT - Cleanup(func()) -} - -// NewEAVController creates a new instance of EAVController. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewEAVController(t mockConstructorTestingTNewEAVController) *EAVController { - mock := &EAVController{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/mocks/services/EAVService.go b/mocks/services/EAVService.go deleted file mode 100644 index 20d3719f..00000000 --- a/mocks/services/EAVService.go +++ /dev/null @@ -1,148 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import ( - badorm "github.com/ditrit/badaas/badorm" - mock "github.com/stretchr/testify/mock" - - models "github.com/ditrit/badaas/persistence/models" -) - -// EAVService is an autogenerated mock type for the EAVService type -type EAVService struct { - mock.Mock -} - -// CreateEntity provides a mock function with given fields: entityTypeName, attributeValues -func (_m *EAVService) CreateEntity(entityTypeName string, attributeValues map[string]interface{}) (*models.Entity, error) { - ret := _m.Called(entityTypeName, attributeValues) - - var r0 *models.Entity - var r1 error - if rf, ok := ret.Get(0).(func(string, map[string]interface{}) (*models.Entity, error)); ok { - return rf(entityTypeName, attributeValues) - } - if rf, ok := ret.Get(0).(func(string, map[string]interface{}) *models.Entity); ok { - r0 = rf(entityTypeName, attributeValues) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*models.Entity) - } - } - - if rf, ok := ret.Get(1).(func(string, map[string]interface{}) error); ok { - r1 = rf(entityTypeName, attributeValues) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// DeleteEntity provides a mock function with given fields: entityTypeName, entityID -func (_m *EAVService) DeleteEntity(entityTypeName string, entityID badorm.UUID) error { - ret := _m.Called(entityTypeName, entityID) - - var r0 error - if rf, ok := ret.Get(0).(func(string, badorm.UUID) error); ok { - r0 = rf(entityTypeName, entityID) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// GetEntities provides a mock function with given fields: entityTypeName, conditions -func (_m *EAVService) GetEntities(entityTypeName string, conditions map[string]interface{}) ([]*models.Entity, error) { - ret := _m.Called(entityTypeName, conditions) - - var r0 []*models.Entity - var r1 error - if rf, ok := ret.Get(0).(func(string, map[string]interface{}) ([]*models.Entity, error)); ok { - return rf(entityTypeName, conditions) - } - if rf, ok := ret.Get(0).(func(string, map[string]interface{}) []*models.Entity); ok { - r0 = rf(entityTypeName, conditions) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*models.Entity) - } - } - - if rf, ok := ret.Get(1).(func(string, map[string]interface{}) error); ok { - r1 = rf(entityTypeName, conditions) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetEntity provides a mock function with given fields: entityTypeName, id -func (_m *EAVService) GetEntity(entityTypeName string, id badorm.UUID) (*models.Entity, error) { - ret := _m.Called(entityTypeName, id) - - var r0 *models.Entity - var r1 error - if rf, ok := ret.Get(0).(func(string, badorm.UUID) (*models.Entity, error)); ok { - return rf(entityTypeName, id) - } - if rf, ok := ret.Get(0).(func(string, badorm.UUID) *models.Entity); ok { - r0 = rf(entityTypeName, id) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*models.Entity) - } - } - - if rf, ok := ret.Get(1).(func(string, badorm.UUID) error); ok { - r1 = rf(entityTypeName, id) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// UpdateEntity provides a mock function with given fields: entityTypeName, entityID, newValues -func (_m *EAVService) UpdateEntity(entityTypeName string, entityID badorm.UUID, newValues map[string]interface{}) (*models.Entity, error) { - ret := _m.Called(entityTypeName, entityID, newValues) - - var r0 *models.Entity - var r1 error - if rf, ok := ret.Get(0).(func(string, badorm.UUID, map[string]interface{}) (*models.Entity, error)); ok { - return rf(entityTypeName, entityID, newValues) - } - if rf, ok := ret.Get(0).(func(string, badorm.UUID, map[string]interface{}) *models.Entity); ok { - r0 = rf(entityTypeName, entityID, newValues) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*models.Entity) - } - } - - if rf, ok := ret.Get(1).(func(string, badorm.UUID, map[string]interface{}) error); ok { - r1 = rf(entityTypeName, entityID, newValues) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -type mockConstructorTestingTNewEAVService interface { - mock.TestingT - Cleanup(func()) -} - -// NewEAVService creates a new instance of EAVService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewEAVService(t mockConstructorTestingTNewEAVService) *EAVService { - mock := &EAVService{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go deleted file mode 100644 index 459d454c..00000000 --- a/persistence/models/Attribute.go +++ /dev/null @@ -1,80 +0,0 @@ -package models - -import ( - "errors" - "fmt" - - "github.com/ditrit/badaas/badorm" -) - -// Describe the type of an attribute -type ValueTypeT string - -const ( - RelationValueType ValueTypeT = "relation" - BooleanValueType ValueTypeT = "bool" - StringValueType ValueTypeT = "string" - IntValueType ValueTypeT = "int" - FloatValueType ValueTypeT = "float" -) - -// Describe the attribute of a en EntityType -type Attribute struct { - badorm.UUIDModel - Name string `gorm:"uniqueIndex:unique_name_entity_type;type:varchar(255)"` - Unique bool // TODO validate this - Required bool - - Default bool // if there is a default value - - // Default values, only if Default == true - DefaultInt int - DefaultBool bool - DefaultString string - DefaultFloat float64 - - ValueType ValueTypeT // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" - // id of the EntityType to which a RelationValueType points to. Only if ValueType == RelationValueType - RelationTargetEntityTypeID badorm.UUID `gorm:"foreignKey:EntityType;index:fk_relation_target_entity_type"` - - // GORM relations - EntityTypeID badorm.UUID `gorm:"uniqueIndex:unique_name_entity_type"` -} - -var ErrNoDefaultValueSet = errors.New("no default value found") - -func NewRelationAttribute(entityType *EntityType, name string, - unique bool, required bool, - relationTargetEntityType *EntityType, -) *Attribute { - return &Attribute{ - EntityTypeID: entityType.ID, - Name: name, - ValueType: RelationValueType, - Required: required, - Unique: unique, - RelationTargetEntityTypeID: relationTargetEntityType.ID, - } -} - -// Get a new value with the default value associated with the attribute -func (a *Attribute) GetNewDefaultValue() (*Value, error) { - if !a.Default { - return nil, ErrNoDefaultValueSet - } - - switch a.ValueType { - case StringValueType: - return NewStringValue(a, a.DefaultString) - case IntValueType: - return NewIntValue(a, a.DefaultInt) - case FloatValueType: - return NewFloatValue(a, a.DefaultFloat) - case BooleanValueType: - return NewBoolValue(a, a.DefaultBool) - case RelationValueType: - return nil, fmt.Errorf("can't provide default value for relations") - default: - return nil, fmt.Errorf("unsupported ValueType") - } -} diff --git a/persistence/models/Attribute_test.go b/persistence/models/Attribute_test.go deleted file mode 100644 index e9120baf..00000000 --- a/persistence/models/Attribute_test.go +++ /dev/null @@ -1,84 +0,0 @@ -package models - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestNewDefaultValueReturnsErrorIfNotDefault(t *testing.T) { - attr := &Attribute{ - Default: false, - } - - _, err := attr.GetNewDefaultValue() - assert.ErrorIs(t, err, ErrNoDefaultValueSet) -} - -func TestNewDefaultValueReturnsDefaultIntForInt(t *testing.T) { - attr := &Attribute{ - ValueType: IntValueType, - Default: true, - DefaultInt: 1, - } - - value, err := attr.GetNewDefaultValue() - assert.Nil(t, err) - assert.Equal(t, 1, value.Value()) -} - -func TestNewDefaultValueReturnsDefaultFloatForFloat(t *testing.T) { - attr := &Attribute{ - ValueType: FloatValueType, - Default: true, - DefaultFloat: 1.0, - } - - value, err := attr.GetNewDefaultValue() - assert.Nil(t, err) - assert.Equal(t, 1.0, value.Value()) -} - -func TestNewDefaultValueReturnsDefaultStringForString(t *testing.T) { - attr := &Attribute{ - ValueType: StringValueType, - Default: true, - DefaultString: "salut", - } - - value, err := attr.GetNewDefaultValue() - assert.Nil(t, err) - assert.Equal(t, "salut", value.Value()) -} - -func TestNewDefaultValueReturnsDefaultBoolForBool(t *testing.T) { - attr := &Attribute{ - ValueType: BooleanValueType, - Default: true, - DefaultBool: true, - } - - value, err := attr.GetNewDefaultValue() - assert.Nil(t, err) - assert.Equal(t, true, value.Value()) -} - -func TestNewDefaultValueReturnsErrorForRelation(t *testing.T) { - attr := &Attribute{ - Default: true, - ValueType: RelationValueType, - } - - _, err := attr.GetNewDefaultValue() - assert.Error(t, err, "can't provide default value for relations") -} - -func TestNewDefaultValueReturnsErrorForUnsupportedType(t *testing.T) { - attr := &Attribute{ - Default: true, - ValueType: "something else", - } - - _, err := attr.GetNewDefaultValue() - assert.Error(t, err, "unsupported ValueType") -} diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go deleted file mode 100644 index e5e2fc0a..00000000 --- a/persistence/models/Entity.go +++ /dev/null @@ -1,61 +0,0 @@ -package models - -import ( - "encoding/json" - - "github.com/ditrit/badaas/badorm" -) - -// Describe an instance of an EntityType -type Entity struct { - badorm.UUIDModel - Fields []*Value - - // GORM relations - EntityTypeID badorm.UUID - EntityType *EntityType -} - -func NewEntity(entityType *EntityType) *Entity { - return &Entity{ - EntityType: entityType, - EntityTypeID: entityType.ID, - } -} - -// Encode the entity to json -// use the [encoding/json.Marshaler] interface -func (e *Entity) MarshalJSON() ([]byte, error) { - dto := make(map[string]any) - dto["id"] = e.ID - dto["type"] = e.EntityType.Name - dto["createdAt"] = e.CreatedAt - dto["updatedAt"] = e.UpdatedAt - dto["attrs"] = e.encodeValues() - - return json.Marshal(dto) -} - -// return the values in a json encoded string -func (e *Entity) encodeValues() map[string]any { - pairs := make(map[string]any, len(e.Fields)) - - for _, field := range e.Fields { - if field.IsNull { - continue - } - - pairs[field.Attribute.Name] = field.Value() - } - - return pairs -} - -func (e Entity) Equal(other Entity) bool { - return e.ID == other.ID && - e.EntityType.ID == other.EntityType.ID -} - -func (Entity) TableName() string { - return "entities" -} diff --git a/persistence/models/EntityType.go b/persistence/models/EntityType.go deleted file mode 100644 index 6bd6406a..00000000 --- a/persistence/models/EntityType.go +++ /dev/null @@ -1,17 +0,0 @@ -package models - -import "github.com/ditrit/badaas/badorm" - -// Describe an object type -type EntityType struct { - badorm.UUIDModel - Name string `gorm:"unique;not null"` - - // GORM relations - Attributes []*Attribute -} - -func (et EntityType) Equal(other EntityType) bool { - return et.ID == other.ID && - et.Name == other.Name -} diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go deleted file mode 100644 index 8ba27d48..00000000 --- a/persistence/models/Entity_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package models - -import ( - "testing" - - "github.com/google/uuid" - "github.com/stretchr/testify/assert" - - "github.com/ditrit/badaas/badorm" -) - -func TestMarshall(t *testing.T) { - id := badorm.UUID(uuid.MustParse("11e1d4b8-701d-47cc-852f-6d36922bcc75")) - ett := &EntityType{ - UUIDModel: badorm.UUIDModel{ID: id}, - Name: "bird", - Attributes: []*Attribute{ - { - UUIDModel: badorm.UUIDModel{ - ID: id, - }, - Name: "color", - DefaultString: "red", - ValueType: StringValueType, - EntityTypeID: id, - }, - { - UUIDModel: badorm.UUIDModel{ - ID: id, - }, - Name: "heigh", - ValueType: IntValueType, - EntityTypeID: id, - }, - }, - } - - et := &Entity{ - UUIDModel: badorm.UUIDModel{ - ID: id, - }, - Fields: []*Value{ - { - UUIDModel: badorm.UUIDModel{ - ID: id, - }, - - IsNull: false, - StringVal: "blue", - EntityID: id, - AttributeID: id, - Attribute: ett.Attributes[0], - }, - { - UUIDModel: badorm.UUIDModel{ - ID: id, - }, - - IsNull: true, - EntityID: id, - AttributeID: id, - Attribute: ett.Attributes[1], - }, - }, - EntityTypeID: id, - EntityType: ett, - } - - p, _ := et.MarshalJSON() - assert.JSONEq( - t, - `{"attrs":{"color":"blue"},"id":"11e1d4b8-701d-47cc-852f-6d36922bcc75","type":"bird", "createdAt":"0001-01-01T00:00:00Z", "updatedAt":"0001-01-01T00:00:00Z"}`, //nolint:lll - string(p), - ) -} diff --git a/persistence/models/Value.go b/persistence/models/Value.go deleted file mode 100644 index 908d6f55..00000000 --- a/persistence/models/Value.go +++ /dev/null @@ -1,179 +0,0 @@ -package models - -import ( - "errors" - "fmt" - - "github.com/ditrit/badaas/badorm" -) - -// Describe the attribute value of an Entity -type Value struct { - badorm.UUIDModel - IsNull bool - StringVal string - FloatVal float64 - IntVal int - BoolVal bool - RelationVal badorm.UUID `gorm:"foreignKey:Entity;index:fk_relation_val_entity"` - - // GORM relations - EntityID badorm.UUID `gorm:"uniqueIndex:unique_entity_attribute"` - AttributeID badorm.UUID `gorm:"uniqueIndex:unique_entity_attribute"` - Attribute *Attribute -} - -func (Value) TableName() string { - // rename table as values can be a keyword (in MySQL for example) - return "values_" -} - -var ErrAskingForWrongType = errors.New("attribute type doesn't match") - -// Create a new null value -func NewNullValue(attr *Attribute) (*Value, error) { - value := &Value{Attribute: attr, AttributeID: attr.ID} - return value, value.SetNull() -} - -// Create a new int value -func NewIntValue(attr *Attribute, i int) (*Value, error) { - value := &Value{Attribute: attr, AttributeID: attr.ID} - return value, value.SetIntVal(i) -} - -// Create a new bool value -func NewBoolValue(attr *Attribute, b bool) (*Value, error) { - value := &Value{Attribute: attr, AttributeID: attr.ID} - return value, value.SetBooleanVal(b) -} - -// Create a new float value -func NewFloatValue(attr *Attribute, f float64) (*Value, error) { - value := &Value{Attribute: attr, AttributeID: attr.ID} - return value, value.SetFloatVal(f) -} - -// Create a new string value -func NewStringValue(attr *Attribute, s string) (*Value, error) { - value := &Value{Attribute: attr, AttributeID: attr.ID} - return value, value.SetStringVal(s) -} - -// Create a new relation value. -// If et is nil, then the function returns an error -// If et is of the wrong types, then the function returns an error -func NewRelationValue(attr *Attribute, et *Entity) (*Value, error) { - value := &Value{Attribute: attr, AttributeID: attr.ID} - return value, value.SetRelationVal(et) -} - -// Return the underlying value as an interface -func (v *Value) Value() any { - if v.IsNull { - return nil - } - - switch v.Attribute.ValueType { - case StringValueType: - return v.StringVal - case IntValueType: - return v.IntVal - case FloatValueType: - return v.FloatVal - case BooleanValueType: - return v.BoolVal - case RelationValueType: - return v.RelationVal - } - - return nil -} - -func (v *Value) SetNull() error { - if v.Attribute.Required { - return fmt.Errorf("can't set null value for a required attribute") - } - - v.IsNull = true - v.IntVal = 0 - v.FloatVal = 0.0 - v.StringVal = "" - v.BoolVal = false - v.RelationVal = badorm.NilUUID - - return nil -} - -func (v *Value) SetStringVal(stringVal string) error { - if v.Attribute.ValueType != StringValueType { - return ErrAskingForWrongType - } - - v.IsNull = false - v.StringVal = stringVal - - return nil -} - -func (v *Value) SetIntVal(intVal int) error { - if v.Attribute.ValueType != IntValueType { - return ErrAskingForWrongType - } - - v.IsNull = false - v.IntVal = intVal - - return nil -} - -func (v *Value) SetFloatVal(floatVal float64) error { - if v.Attribute.ValueType != FloatValueType { - return ErrAskingForWrongType - } - - v.IsNull = false - v.FloatVal = floatVal - - return nil -} - -func (v *Value) SetBooleanVal(boolVal bool) error { - if v.Attribute.ValueType != BooleanValueType { - return ErrAskingForWrongType - } - - v.IsNull = false - v.BoolVal = boolVal - - return nil -} - -func (v *Value) SetRelationVal(entity *Entity) error { - if entity == nil { - return fmt.Errorf("can't create a new relation with a nil entity pointer") - } - - if v.Attribute.ValueType != RelationValueType { - return ErrAskingForWrongType - } - - if entity.EntityType.ID != v.Attribute.RelationTargetEntityTypeID { - return fmt.Errorf( - "can't create a relation with an entity of wrong EntityType (got the entityTypeID=%s, expected=%s)", - entity.EntityType.ID.String(), v.Attribute.RelationTargetEntityTypeID.String(), - ) - } - - v.IsNull = false - v.RelationVal = entity.ID - - return nil -} - -func (v Value) Equal(other Value) bool { - return v.ID == other.ID && - v.AttributeID == other.AttributeID && - v.EntityID == other.EntityID && - v.Value() == other.Value() -} diff --git a/persistence/models/Value_test.go b/persistence/models/Value_test.go deleted file mode 100644 index 2f0fba8c..00000000 --- a/persistence/models/Value_test.go +++ /dev/null @@ -1,224 +0,0 @@ -package models - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/ditrit/badaas/badorm" -) - -func TestRelationValueNeedsEntity(t *testing.T) { - brandEtt := &EntityType{ - Name: "brand", - } - - carEtt := &EntityType{ - Name: "car", - } - brandAttr := NewRelationAttribute(carEtt, "brand", false, true, brandEtt) - carEtt.Attributes = []*Attribute{brandAttr} - - _, err := NewRelationValue(brandAttr, nil) - assert.Error(t, err, "can't create a new relation with a nil entity pointer") -} - -func TestRelationValueEntityHasToBeTheTargetOfTheAttribute(t *testing.T) { - brandEttID := badorm.NewUUID() - carEttID := badorm.NewUUID() - - brandEtt := &EntityType{ - UUIDModel: badorm.UUIDModel{ - ID: brandEttID, - }, - Name: "brand", - } - - carEtt := &EntityType{ - UUIDModel: badorm.UUIDModel{ - ID: carEttID, - }, - Name: "car", - } - brandAttr := NewRelationAttribute(carEtt, "brand", false, true, brandEtt) - carEtt.Attributes = []*Attribute{brandAttr} - - car := &Entity{ - EntityType: carEtt, - } - - _, err := NewRelationValue(brandAttr, car) - assert.Error( - t, err, - fmt.Sprintf( - "can't create a relation with an entity of wrong EntityType (got the entityTypeID=%s, expected=%s)", - carEttID.String(), - brandEttID.String(), - ), - ) -} - -func TestRelationValueWithCorrespondingEntity(t *testing.T) { - brandEtt := &EntityType{ - UUIDModel: badorm.UUIDModel{ - ID: badorm.NewUUID(), - }, - Name: "brand", - } - - carEtt := &EntityType{ - UUIDModel: badorm.UUIDModel{ - ID: badorm.NewUUID(), - }, - Name: "car", - } - brandAttr := NewRelationAttribute(carEtt, "brand", false, true, brandEtt) - carEtt.Attributes = []*Attribute{brandAttr} - - brand := &Entity{ - EntityType: brandEtt, - } - - value, err := NewRelationValue(brandAttr, brand) - assert.Nil(t, err) - - assert.Equal(t, value.Value(), brand.ID) -} - -func TestNewNullValueRespondErrorIfAttributeIsRequired(t *testing.T) { - requiredAttr := &Attribute{ - Name: "attr", - ValueType: StringValueType, - Required: true, - } - - _, err := NewNullValue(requiredAttr) - assert.Error(t, err, "can't create new null value for a required attribute") -} - -func TestNewNullValueWorksIfAttributeIsNotRequired(t *testing.T) { - notRequiredAttr := &Attribute{ - Name: "attr", - ValueType: StringValueType, - Required: false, - } - - value, err := NewNullValue(notRequiredAttr) - assert.Nil(t, err) - assert.Nil(t, value.Value()) -} - -func TestNewIntValueRespondErrorIsAttributeIfNotIntType(t *testing.T) { - stringAttr := &Attribute{ - Name: "attr", - ValueType: StringValueType, - } - - _, err := NewIntValue(stringAttr, 5) - assert.ErrorIs(t, err, ErrAskingForWrongType) -} - -func TestNewIntValueWorks(t *testing.T) { - intAttr := &Attribute{ - Name: "attr", - ValueType: IntValueType, - } - - value, err := NewIntValue(intAttr, 5) - assert.Nil(t, err) - assert.Equal(t, value.Value(), 5) -} - -func TestNewFloatValueRespondErrorIsAttributeIfNotFloatType(t *testing.T) { - stringAttr := &Attribute{ - Name: "attr", - ValueType: StringValueType, - } - - _, err := NewFloatValue(stringAttr, 5.5) - assert.ErrorIs(t, err, ErrAskingForWrongType) -} - -func TestNewFloatValueWorks(t *testing.T) { - attr := &Attribute{ - Name: "attr", - ValueType: FloatValueType, - } - - value, err := NewFloatValue(attr, 5.5) - assert.Nil(t, err) - assert.Equal(t, value.Value(), 5.5) -} - -func TestNewBoolValueRespondErrorIsAttributeIfNotBoolType(t *testing.T) { - stringAttr := &Attribute{ - Name: "attr", - ValueType: StringValueType, - } - - _, err := NewBoolValue(stringAttr, true) - assert.ErrorIs(t, err, ErrAskingForWrongType) -} - -func TestNewBoolValueWorks(t *testing.T) { - attr := &Attribute{ - Name: "attr", - ValueType: BooleanValueType, - } - - value, err := NewBoolValue(attr, true) - assert.Nil(t, err) - assert.Equal(t, value.Value(), true) -} - -func TestNewStringValueRespondErrorIsAttributeIfNotStringType(t *testing.T) { - boolAttr := &Attribute{ - Name: "attr", - ValueType: BooleanValueType, - } - - _, err := NewStringValue(boolAttr, "salut") - assert.ErrorIs(t, err, ErrAskingForWrongType) -} - -func TestNewStringValueWorks(t *testing.T) { - attr := &Attribute{ - Name: "attr", - ValueType: StringValueType, - } - - value, err := NewStringValue(attr, "salut") - assert.Nil(t, err) - assert.Equal(t, value.Value(), "salut") -} - -func TestNewRelationValueRespondErrorIsAttributeIfNotRelationType(t *testing.T) { - brandEtt := &EntityType{ - Name: "brand", - } - brand := &Entity{ - EntityType: brandEtt, - } - - boolAttr := &Attribute{ - Name: "attr", - ValueType: BooleanValueType, - } - - _, err := NewRelationValue(boolAttr, brand) - assert.ErrorIs(t, err, ErrAskingForWrongType) -} - -func TestSetNullWorks(t *testing.T) { - attr := &Attribute{ - Name: "attr", - ValueType: StringValueType, - } - - value, err := NewStringValue(attr, "salut") - assert.Nil(t, err) - err = value.SetNull() - assert.Nil(t, err) - assert.Nil(t, value.Value()) -} diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go deleted file mode 100644 index 41832356..00000000 --- a/persistence/repository/EntityRepository.go +++ /dev/null @@ -1,198 +0,0 @@ -package repository - -import ( - "fmt" - "time" - - sq "github.com/Masterminds/squirrel" - "github.com/elliotchance/pie/v2" - "go.uber.org/zap" - "gorm.io/driver/postgres" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/models" -) - -type EntityRepository struct { - logger *zap.Logger - valueRepository *ValueRepository -} - -func NewEntityRepository( - logger *zap.Logger, - valueRepository *ValueRepository, -) *EntityRepository { - return &EntityRepository{ - logger: logger, - valueRepository: valueRepository, - } -} - -// Get the Entity of type with name "entityTypeName" that has the "id" -func (r *EntityRepository) Get(tx *gorm.DB, entityTypeName string, id badorm.UUID) (*models.Entity, error) { - var entity models.Entity - - query := tx.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType") - query = query.Joins( - `JOIN entity_types ON - entity_types.id = entities.entity_type_id`, - ) - - err := query.Where( - map[string]any{"entities.id": id, "entity_types.name": entityTypeName}, - ).First(&entity).Error - if err != nil { - return nil, err - } - - return &entity, nil -} - -var postgresDialectorName string = postgres.Dialector{}.Name() - -// Creates an entity and its values in the database -// must be used in place of gorm's db.Save(entity) because of the bug -// when using gorm with cockroachDB. For more info refer to: -// https://github.com/FrancoLiberali/cockroachdb_gorm_bug -func (r *EntityRepository) Create(tx *gorm.DB, entity *models.Entity) error { - if tx.Dialector.Name() != postgresDialectorName { - // in other than cockroachDB gorm's Save can be used normally - return tx.Save(entity).Error - } - - now := time.Now() - - entity.ID = badorm.NewUUID() - - query, values, err := sq.Insert("entities"). - Columns("id", "created_at", "updated_at", "entity_type_id"). - Values(entity.ID, now, now, entity.EntityType.ID). - PlaceholderFormat(sq.Dollar).ToSql() - if err != nil { - return err - } - - err = tx.Exec(query, values...).Error - if err != nil { - return err - } - - pie.Each(entity.Fields, func(value *models.Value) { - value.EntityID = entity.ID - }) - - if len(entity.Fields) > 0 { - err = r.valueRepository.Create(tx, entity.Fields) - if err != nil { - return err - } - } - - return nil -} - -// Adds to the "query" the verification that the value for "attribute" is "expectedValue" -func (r *EntityRepository) AddValueCheckToQuery(query *gorm.DB, attributeName string, expectedValue any) error { - return r.addValueCheckToQueryInternal(query, attributeName, expectedValue, "") -} - -// Adds to the "query" the verification that the value for "attribute" is "expectedValue" -func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attributeName string, expectedValue any, entitiesTableSuffix string) error { - attributesSuffix := entitiesTableSuffix + "_" + attributeName - queryArgs := []any{attributeName} - stringQuery := fmt.Sprintf( - `JOIN attributes attributes%[1]s ON - attributes%[1]s.entity_type_id = entities%[2]s.entity_type_id - AND attributes%[1]s.name = ? - JOIN values_ values%[1]s ON - values%[1]s.attribute_id = attributes%[1]s.id - AND values%[1]s.entity_id = entities%[2]s.id - `, - attributesSuffix, - entitiesTableSuffix, - ) - - switch expectedValueTyped := expectedValue.(type) { - case float64: - stringQuery += fmt.Sprintf( - "AND ((%s) OR (%s))", - getQueryCheckValueOfType(attributesSuffix, models.IntValueType), - getQueryCheckValueOfType(attributesSuffix, models.FloatValueType), - ) - - queryArgs = append(queryArgs, expectedValue, expectedValue) - case bool: - stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.BooleanValueType) - - queryArgs = append(queryArgs, expectedValue) - case string: - uuid, err := badorm.ParseUUID(expectedValueTyped) - if err == nil { - stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.RelationValueType) - - queryArgs = append(queryArgs, uuid) - } else { - stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.StringValueType) - - queryArgs = append(queryArgs, expectedValue) - } - case nil: - stringQuery += fmt.Sprintf( - "AND values%[1]s.is_null = ?", - attributesSuffix, - ) - - queryArgs = append(queryArgs, true) - case map[string]any: - return r.addJoinToQuery( - query, attributeName, expectedValueTyped, - attributesSuffix, stringQuery, - ) - default: - return fmt.Errorf("unsupported type") - } - - query.Joins(stringQuery, queryArgs...) - - return nil -} - -// Returns query string to check that the attribute is of type "valueType" and that the related value -// is the expected one -func getQueryCheckValueOfType(attributesSuffix string, valueType models.ValueTypeT) string { - return fmt.Sprintf( - "attributes%[1]s.value_type = '%[2]s' AND values%[1]s.%[2]s_val = ?", - attributesSuffix, string(valueType), - ) -} - -// Adds a join to the "query" by the "attributeName" that must be relation type -// then, adds the verification that the values for the joined entity are "expectedValues" - -// "expectedValues" is in {"attributeName": expectedValue} format -func (r *EntityRepository) addJoinToQuery( - query *gorm.DB, attributeName string, expectedValues map[string]any, - attributesSuffix, stringQuery string, -) error { - stringQuery += fmt.Sprintf(` - AND attributes%[1]s.value_type = 'relation' - JOIN entities entities%[1]s ON - entities%[1]s.id = values%[1]s.relation_val - AND entities%[1]s.deleted_at IS NULL - `, - attributesSuffix, - ) - - query.Joins(stringQuery, attributeName) - - var err error - for joinEntityAttribute, joinEntityValue := range expectedValues { - err = r.addValueCheckToQueryInternal(query, joinEntityAttribute, joinEntityValue, attributesSuffix) - if err != nil { - return err - } - } - - return nil -} diff --git a/persistence/repository/EntityRepository_test.go b/persistence/repository/EntityRepository_test.go deleted file mode 100644 index 2a178e86..00000000 --- a/persistence/repository/EntityRepository_test.go +++ /dev/null @@ -1,245 +0,0 @@ -package repository - -import ( - "database/sql" - "regexp" - "testing" - - "github.com/DATA-DOG/go-sqlmock" - "github.com/google/uuid" - "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" - "gorm.io/driver/postgres" - "gorm.io/gorm" - - "github.com/ditrit/badaas/persistence/models" -) - -type EntityRepositorySuite struct { - suite.Suite - DB *gorm.DB - mock sqlmock.Sqlmock - - repository EntityRepository - query *gorm.DB - uuid uuid.UUID -} - -func (s *EntityRepositorySuite) SetupSuite() { - s.repository = EntityRepository{} -} - -func (s *EntityRepositorySuite) SetupTest() { - var ( - db *sql.DB - err error - ) - - db, s.mock, err = sqlmock.New() - require.NoError(s.T(), err) - - dialector := postgres.New(postgres.Config{ - DSN: "sqlmock_db_0", - DriverName: "postgres", - Conn: db, - PreferSimpleProtocol: true, - }) - s.DB, err = gorm.Open(dialector, &gorm.Config{}) - require.NoError(s.T(), err) - - s.query = s.DB.Select("entities.*") - s.uuid = uuid.New() -} - -func Test(t *testing.T) { - suite.Run(t, new(EntityRepositorySuite)) -} - -type AttributeNameAndValue struct { - AttributeName string - AttributeValue any -} - -var ( - attributeName = "attrName" - aString = "a string" -) - -func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForString() { - attributeValue := aString - s.mock.ExpectQuery(regexp.QuoteMeta( - `SELECT entities.* FROM "entities" - JOIN attributes attributes_attrName ON - attributes_attrName.entity_type_id = entities.entity_type_id AND - attributes_attrName.name = $1 - JOIN values_ values_attrName ON - values_attrName.attribute_id = attributes_attrName.id AND - values_attrName.entity_id = entities.id AND - attributes_attrName.value_type = 'string' AND - values_attrName.string_val = $2 - WHERE entities.entity_type_id = $3 AND - "entities"."deleted_at" IS NULL`)). - WithArgs(attributeName, attributeValue, s.uuid). - WillReturnRows(sqlmock.NewRows(nil)) - - s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) -} - -func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForStringUUID() { - attributeValue := uuid.New().String() - s.mock.ExpectQuery(regexp.QuoteMeta( - `SELECT entities.* FROM "entities" - JOIN attributes attributes_attrName ON - attributes_attrName.entity_type_id = entities.entity_type_id AND - attributes_attrName.name = $1 - JOIN values_ values_attrName ON - values_attrName.attribute_id = attributes_attrName.id AND - values_attrName.entity_id = entities.id AND - attributes_attrName.value_type = 'relation' AND - values_attrName.relation_val = $2 - WHERE entities.entity_type_id = $3 AND - "entities"."deleted_at" IS NULL`)). - WithArgs(attributeName, attributeValue, s.uuid). - WillReturnRows(sqlmock.NewRows(nil)) - - s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) -} - -func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForBool() { - attributeValue := true - s.mock.ExpectQuery(regexp.QuoteMeta( - `SELECT entities.* FROM "entities" - JOIN attributes attributes_attrName ON - attributes_attrName.entity_type_id = entities.entity_type_id AND - attributes_attrName.name = $1 - JOIN values_ values_attrName ON - values_attrName.attribute_id = attributes_attrName.id AND - values_attrName.entity_id = entities.id AND - attributes_attrName.value_type = 'bool' AND - values_attrName.bool_val = $2 - WHERE entities.entity_type_id = $3 AND - "entities"."deleted_at" IS NULL`)). - WithArgs(attributeName, attributeValue, s.uuid). - WillReturnRows(sqlmock.NewRows(nil)) - - s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) -} - -func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForNil() { - s.mock.ExpectQuery(regexp.QuoteMeta( - `SELECT entities.* FROM "entities" - JOIN attributes attributes_attrName ON - attributes_attrName.entity_type_id = entities.entity_type_id AND - attributes_attrName.name = $1 - JOIN values_ values_attrName ON - values_attrName.attribute_id = attributes_attrName.id AND - values_attrName.entity_id = entities.id AND - values_attrName.is_null = $2 - WHERE entities.entity_type_id = $3 AND - "entities"."deleted_at" IS NULL`)). - WithArgs(attributeName, true, s.uuid). - WillReturnRows(sqlmock.NewRows(nil)) - - s.execQuery(AttributeNameAndValue{attributeName, nil}) -} - -func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckIntAndFloatForFloat() { - attributeValue := 1.2 - s.mock.ExpectQuery(regexp.QuoteMeta( - `SELECT entities.* FROM "entities" - JOIN attributes attributes_attrName ON - attributes_attrName.entity_type_id = entities.entity_type_id AND - attributes_attrName.name = $1 - JOIN values_ values_attrName ON - values_attrName.attribute_id = attributes_attrName.id AND - values_attrName.entity_id = entities.id AND - ((attributes_attrName.value_type = 'int' AND values_attrName.int_val = $2) OR - (attributes_attrName.value_type = 'float' AND values_attrName.float_val = $3)) - WHERE entities.entity_type_id = $4 AND "entities"."deleted_at" IS NULL`)). - WithArgs(attributeName, attributeValue, attributeValue, s.uuid). - WillReturnRows(sqlmock.NewRows(nil)) - - s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) -} - -func (s *EntityRepositorySuite) TestAddValueCheck2AddsValueCheckFor2Values() { - attributeName1 := "attrName1" - attributeValue1 := aString - attributeName2 := "attrName2" - attributeValue2 := true - s.mock.ExpectQuery(regexp.QuoteMeta( - `SELECT entities.* FROM "entities" - JOIN attributes attributes_attrName1 ON - attributes_attrName1.entity_type_id = entities.entity_type_id AND - attributes_attrName1.name = $1 - JOIN values_ values_attrName1 ON - values_attrName1.attribute_id = attributes_attrName1.id AND - values_attrName1.entity_id = entities.id AND - attributes_attrName1.value_type = 'string' AND - values_attrName1.string_val = $2 - JOIN attributes attributes_attrName2 ON - attributes_attrName2.entity_type_id = entities.entity_type_id AND - attributes_attrName2.name = $3 - JOIN values_ values_attrName2 ON - values_attrName2.attribute_id = attributes_attrName2.id AND - values_attrName2.entity_id = entities.id AND - attributes_attrName2.value_type = 'bool' AND - values_attrName2.bool_val = $4 - WHERE entities.entity_type_id = $5 AND - "entities"."deleted_at" IS NULL`)). - WithArgs(attributeName1, attributeValue1, attributeName2, attributeValue2, s.uuid). - WillReturnRows(sqlmock.NewRows(nil)) - - s.execQuery( - AttributeNameAndValue{attributeName1, attributeValue1}, - AttributeNameAndValue{attributeName2, attributeValue2}, - ) -} - -func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMap() { - innerAttributeName := "innerAttrName" - innerAttributeValue := aString - attributeValue := map[string]any{innerAttributeName: innerAttributeValue} - s.mock.ExpectQuery(regexp.QuoteMeta( - `SELECT entities.* FROM "entities" - JOIN attributes attributes_attrName ON - attributes_attrName.entity_type_id = entities.entity_type_id AND - attributes_attrName.name = $1 - JOIN values_ values_attrName ON - values_attrName.attribute_id = attributes_attrName.id AND - values_attrName.entity_id = entities.id AND - attributes_attrName.value_type = 'relation' - JOIN entities entities_attrName ON - entities_attrName.id = values_attrName.relation_val AND - entities_attrName.deleted_at IS NULL - JOIN attributes attributes_attrName_innerAttrName ON - attributes_attrName_innerAttrName.entity_type_id = entities_attrName.entity_type_id AND - attributes_attrName_innerAttrName.name = $2 - JOIN values_ values_attrName_innerAttrName ON - values_attrName_innerAttrName.attribute_id = attributes_attrName_innerAttrName.id AND - values_attrName_innerAttrName.entity_id = entities_attrName.id AND - attributes_attrName_innerAttrName.value_type = 'string' AND - values_attrName_innerAttrName.string_val = $3 - WHERE entities.entity_type_id = $4 AND - "entities"."deleted_at" IS NULL`)). - WithArgs(attributeName, innerAttributeName, innerAttributeValue, s.uuid). - WillReturnRows(sqlmock.NewRows(nil)) - - s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) -} - -func (s *EntityRepositorySuite) execQuery(attributes ...AttributeNameAndValue) { - for _, attribute := range attributes { - err := s.repository.AddValueCheckToQuery(s.query, attribute.AttributeName, attribute.AttributeValue) - require.NoError(s.T(), err) - } - - s.query.Where( - "entities.entity_type_id = ?", - s.uuid, - ) - - var entities []*models.Entity - err := s.query.Find(&entities).Error - require.NoError(s.T(), err) -} diff --git a/persistence/repository/EntityTypeRepository.go b/persistence/repository/EntityTypeRepository.go deleted file mode 100644 index e52a6c9c..00000000 --- a/persistence/repository/EntityTypeRepository.go +++ /dev/null @@ -1,43 +0,0 @@ -package repository - -import ( - "go.uber.org/zap" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/models" -) - -type EntityTypeRepository struct { - logger *zap.Logger -} - -func NewEntityTypeRepository( - logger *zap.Logger, -) *EntityTypeRepository { - return &EntityTypeRepository{ - logger: logger, - } -} - -func (r *EntityTypeRepository) Get(tx *gorm.DB, id badorm.UUID) (*models.EntityType, error) { - var entityType models.EntityType - - err := tx.Preload("Attributes").First(&entityType, id).Error - if err != nil { - return nil, err - } - - return &entityType, nil -} - -func (r *EntityTypeRepository) GetByName(tx *gorm.DB, name string) (*models.EntityType, error) { - var entityType models.EntityType - - err := tx.Preload("Attributes").First(&entityType, "name = ?", name).Error - if err != nil { - return nil, err - } - - return &entityType, nil -} diff --git a/persistence/repository/ValueRepository.go b/persistence/repository/ValueRepository.go deleted file mode 100644 index 99f9dee9..00000000 --- a/persistence/repository/ValueRepository.go +++ /dev/null @@ -1,61 +0,0 @@ -package repository - -import ( - "time" - - sq "github.com/Masterminds/squirrel" - "github.com/elliotchance/pie/v2" - "go.uber.org/zap" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/models" -) - -type ValueRepository struct { - logger *zap.Logger - db *gorm.DB -} - -func NewValueRepository( - logger *zap.Logger, - db *gorm.DB, -) *ValueRepository { - return &ValueRepository{ - logger: logger, - db: db, - } -} - -// Creates multiples values in the database -func (r *ValueRepository) Create(tx *gorm.DB, values []*models.Value) error { - now := time.Now() - - pie.Each(values, func(value *models.Value) { - value.ID = badorm.NewUUID() - }) - - query := sq.Insert("values_"). - Columns("id", "created_at", "updated_at", "is_null", "string_val", "float_val", "int_val", - "bool_val", "relation_val", "entity_id", "attribute_id") - - for _, value := range values { - query = query.Values(value.ID, now, now, value.IsNull, value.StringVal, - value.FloatVal, value.IntVal, value.BoolVal, - value.RelationVal, value.EntityID, value.Attribute.ID) - } - - queryString, queryValues, err := query. - PlaceholderFormat(sq.Dollar). - ToSql() - if err != nil { - return err - } - - err = tx.Exec(queryString, queryValues...).Error - if err != nil { - return err - } - - return nil -} diff --git a/router/ModuleFx.go b/router/ModuleFx.go index 485d2f11..654ba4a2 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -38,25 +38,3 @@ var AuthRoutesModule = fx.Module( fx.Provide(middlewares.NewAuthenticationMiddleware), fx.Invoke(AddAuthRoutes), ) - -var EAVRoutesModule = fx.Module( - "eavRoutes", - // service - services.EAVServiceModule, - - // controller - fx.Provide( - fx.Annotate( - controllers.NewEAVController, - fx.ResultTags(`name:"eavController"`), - ), - ), - - // routes - fx.Invoke( - fx.Annotate( - AddEAVCRUDRoutes, - fx.ParamTags(`name:"eavController"`), - ), - ), -) diff --git a/router/routes.go b/router/routes.go index d4fda271..19d528d6 100644 --- a/router/routes.go +++ b/router/routes.go @@ -71,18 +71,3 @@ func createSuperUser( return nil } - -func AddEAVCRUDRoutes( - eavController controllers.EAVController, - router *mux.Router, - jsonController middlewares.JSONController, -) { - // Objects CRUD - objectsBase := "/eav/objects/{type}" - objectsWithID := objectsBase + "/{id}" - router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.GetObject)).Methods(http.MethodGet) - router.HandleFunc(objectsBase, jsonController.Wrap(eavController.GetObjects)).Methods(http.MethodGet) - router.HandleFunc(objectsBase, jsonController.Wrap(eavController.CreateObject)).Methods(http.MethodPost) - router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.UpdateObject)).Methods(http.MethodPut) - router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.DeleteObject)).Methods(http.MethodDelete) -} diff --git a/router/routes_test.go b/router/routes_test.go index 7d5e5874..bcfd6dea 100644 --- a/router/routes_test.go +++ b/router/routes_test.go @@ -152,30 +152,3 @@ func TestAddLoginRoutes(t *testing.T) { assert.Equal(t, response.Code, http.StatusOK) assert.Equal(t, response.Body.String(), "{\"login\":\"called\"}") } - -func TestAddEAVRoutes(t *testing.T) { - jsonController := middlewares.NewJSONController(logger) - - eavController := mockControllers.NewEAVController(t) - eavController. - On("GetObjects", mock.Anything, mock.Anything). - Return(map[string]string{"GetObjects": "called"}, nil) - - router := NewRouter() - AddEAVCRUDRoutes( - eavController, - router, - jsonController, - ) - - response := httptest.NewRecorder() - request := httptest.NewRequest( - http.MethodGet, - "/eav/objects/posts", - nil, - ) - - router.ServeHTTP(response, request) - assert.Equal(t, http.StatusOK, response.Code) - assert.Equal(t, "{\"GetObjects\":\"called\"}", response.Body.String()) -} diff --git a/services/ModuleFx.go b/services/ModuleFx.go index 1bd35cf9..4b40de48 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -5,7 +5,6 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" ) @@ -31,27 +30,3 @@ func getAuthModels() badorm.GetModelsResult { }, } } - -var EAVServiceModule = fx.Module( - "eavService", - // models - fx.Provide(getEAVModels), - // repositories - fx.Provide(repository.NewValueRepository), - fx.Provide(repository.NewEntityRepository), - fx.Provide(repository.NewEntityTypeRepository), - - // service - fx.Provide(NewEAVService), -) - -func getEAVModels() badorm.GetModelsResult { - return badorm.GetModelsResult{ - Models: []any{ - models.EntityType{}, - models.Entity{}, - models.Attribute{}, - models.Value{}, - }, - } -} diff --git a/services/eav.go b/services/eav.go deleted file mode 100644 index 0721c9ae..00000000 --- a/services/eav.go +++ /dev/null @@ -1,248 +0,0 @@ -package services - -import ( - "errors" - "fmt" - - "go.uber.org/zap" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/repository" - "github.com/ditrit/badaas/utils" -) - -var ErrCantParseUUID = errors.New("can't parse uuid") - -// EAV service provide handle EAV objects -type EAVService interface { - GetEntity(entityTypeName string, id badorm.UUID) (*models.Entity, error) - GetEntities(entityTypeName string, conditions map[string]any) ([]*models.Entity, error) - CreateEntity(entityTypeName string, attributeValues map[string]any) (*models.Entity, error) - UpdateEntity(entityTypeName string, entityID badorm.UUID, newValues map[string]any) (*models.Entity, error) - DeleteEntity(entityTypeName string, entityID badorm.UUID) error -} - -type eavServiceImpl struct { - logger *zap.Logger - db *gorm.DB - entityTypeRepository *repository.EntityTypeRepository - entityRepository *repository.EntityRepository -} - -func NewEAVService( - logger *zap.Logger, - db *gorm.DB, - entityTypeRepository *repository.EntityTypeRepository, - entityRepository *repository.EntityRepository, -) EAVService { - return &eavServiceImpl{ - logger: logger, - db: db, - entityTypeRepository: entityTypeRepository, - entityRepository: entityRepository, - } -} - -// Get the Entity of type with name "entityTypeName" that has the "id" -func (eavService *eavServiceImpl) GetEntity(entityTypeName string, id badorm.UUID) (*models.Entity, error) { - return eavService.entityRepository.Get(eavService.db, entityTypeName, id) -} - -// Get entities of type with name "entityTypeName" that match all "conditions" -// -// "conditions" is in {"attributeName": expectedValue} format -// in case of join "conditions" can have the format: -// -// {"relationAttributeName": {"attributeName": expectedValue}} -func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions map[string]any) ([]*models.Entity, error) { - return ExecWithTransaction( - eavService.db, - func(tx *gorm.DB) ([]*models.Entity, error) { - entityType, err := eavService.entityTypeRepository.GetByName(tx, entityTypeName) - if err != nil { - return nil, err - } - - query := tx.Select("entities.*") - - // only entities that match the conditions - for attributeName, expectedValue := range conditions { - err = eavService.entityRepository.AddValueCheckToQuery(query, attributeName, expectedValue) - if err != nil { - return nil, err - } - } - - // only entities of type entityType - query.Where( - "entities.entity_type_id = ?", - entityType.ID, - ) - - // execute query - var entities []*models.Entity - query.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType") - err = query.Find(&entities).Error - - return entities, err - }, - ) -} - -// Creates a Entity of type "entityType" and its Values from the information provided in "attributeValues" -// not specified values are set with the default value (if exists) or a null value. -// entries in "attributeValues" that do not correspond to any attribute of "entityType" are ignored -// -// "attributeValues" are in {"attributeName": value} format -func (eavService *eavServiceImpl) CreateEntity(entityTypeName string, attributeValues map[string]any) (*models.Entity, error) { - return ExecWithTransaction( - eavService.db, - func(tx *gorm.DB) (*models.Entity, error) { - entityType, err := eavService.entityTypeRepository.GetByName(tx, entityTypeName) - if err != nil { - return nil, err - } - - entity := models.NewEntity(entityType) - for _, attribute := range entityType.Attributes { - value, err := eavService.createValue(tx, attribute, attributeValues) - if err != nil { - return nil, err - } - entity.Fields = append(entity.Fields, value) - } - - return entity, eavService.entityRepository.Create(tx, entity) - }, - ) -} - -// Creates a new Value for the "attribute" with the information provided in "attributesValues" -// or with the default value (if exists) -// or a null value if the value for "attribute" is not specified in "attributesValues" -// -// "attributesValues" is in {"attributeName": value} format -// -// returns error is the type of the value provided for "attribute" -// does not correspond with its ValueType -func (eavService *eavServiceImpl) createValue(tx *gorm.DB, attribute *models.Attribute, attributesValues map[string]any) (*models.Value, error) { - attributeValue, isPresent := attributesValues[attribute.Name] - if isPresent { - value := &models.Value{Attribute: attribute, AttributeID: attribute.ID} - - err := eavService.updateValue(tx, value, attributeValue) - if err != nil { - return nil, err - } - - return value, nil - } - - // attribute not present in params, set the default value (if exists) or a null value - if attribute.Default { - return attribute.GetNewDefaultValue() - } else if attribute.Required { - return nil, fmt.Errorf("field %s is missing and is required", attribute.Name) - } - - return models.NewNullValue(attribute) -} - -// Updates entity with type "entityTypeName" and "id" Values to the new values provided in "newValues" -// entries in "newValues" that do not correspond to any attribute of the EntityType are ignored -// -// "newValues" are in {"attributeName": newValue} format -func (eavService *eavServiceImpl) UpdateEntity(entityTypeName string, entityID badorm.UUID, newValues map[string]any) (*models.Entity, error) { - return ExecWithTransaction( - eavService.db, - func(tx *gorm.DB) (*models.Entity, error) { - entity, err := eavService.entityRepository.Get(tx, entityTypeName, entityID) - if err != nil { - return nil, err - } - - for _, value := range entity.Fields { - newValue, isPresent := newValues[value.Attribute.Name] - if isPresent { - err = eavService.updateValue(tx, value, newValue) - if err != nil { - return nil, err - } - } - } - - return entity, tx.Save(entity.Fields).Error - }, - ) -} - -// Updates Value "value" to have the value "newValue" -// -// returns error is the type of the "newValue" does not correspond -// with the type expected for the "value"'s attribute -func (eavService *eavServiceImpl) updateValue(tx *gorm.DB, value *models.Value, newValue any) error { - switch newValueTyped := newValue.(type) { - case string: - if value.Attribute.ValueType == models.RelationValueType { - return eavService.updateRelationValue(tx, value, newValueTyped) - } - - return value.SetStringVal(newValueTyped) - case int: - return value.SetIntVal(newValueTyped) - case float64: - if utils.IsAnInt(newValueTyped) && value.Attribute.ValueType == models.IntValueType { - return value.SetIntVal(int(newValueTyped)) - } - - return value.SetFloatVal(newValueTyped) - case bool: - return value.SetBooleanVal(newValueTyped) - case nil: - return value.SetNull() - default: - return fmt.Errorf("unsupported type") - } -} - -// Updates Value "value" to point to "newID" -// -// returns error if entity with "newID" does not exist -// or its type is not the same as the one pointed by the attribute's RelationTargetEntityTypeID -func (eavService *eavServiceImpl) updateRelationValue(tx *gorm.DB, value *models.Value, newID string) error { - uuidVal, err := badorm.ParseUUID(newID) - if err != nil { - return ErrCantParseUUID - } - - relationEntityType, err := eavService.entityTypeRepository.Get(tx, value.Attribute.RelationTargetEntityTypeID) - if err != nil { - return err - } - - relationEntity, err := eavService.entityRepository.Get(tx, relationEntityType.Name, uuidVal) - if err != nil { - return err - } - - return value.SetRelationVal(relationEntity) -} - -// Deletes Entity with type "entityTypeName" and id "entityID" and its values -func (eavService *eavServiceImpl) DeleteEntity(entityTypeName string, entityID badorm.UUID) error { - return eavService.db.Transaction(func(tx *gorm.DB) error { - entity, err := eavService.entityRepository.Get(tx, entityTypeName, entityID) - if err != nil { - return err - } - - err = tx.Where("entity_id = ?", entityID).Delete(&models.Value{}).Error - if err != nil { - return err - } - - return tx.Delete(entity).Error - }) -} diff --git a/services/transaction_executor.go b/services/transaction_executor.go deleted file mode 100644 index 05fa9372..00000000 --- a/services/transaction_executor.go +++ /dev/null @@ -1,42 +0,0 @@ -package services - -import ( - "database/sql" - - "gorm.io/gorm" -) - -// Executes the function "toExec" inside a transaction -// The transaction is automatically rolled back in case "toExec" returns an error -// opts can be used to pass arguments to the transaction -func ExecWithTransaction[RT any]( - db *gorm.DB, - toExec func(*gorm.DB) (RT, error), - opts ...*sql.TxOptions, -) (RT, error) { - nilValue := *new(RT) - tx := db.Begin(opts...) - - defer func() { - if r := recover(); r != nil { - tx.Rollback() - } - }() - - if err := tx.Error; err != nil { - return nilValue, err - } - - returnValue, err := toExec(tx) - if err != nil { - tx.Rollback() - return nilValue, err - } - - err = tx.Commit().Error - if err != nil { - return nilValue, err - } - - return returnValue, nil -} diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index b2dc9983..6d62ea8a 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -109,51 +109,6 @@ func InitializeScenario(ctx *godog.ScenarioContext) { log.Fatalln(err) } - userType := &models.EntityType{ - Name: "user", - } - nameAttr := &models.Attribute{ - EntityTypeID: userType.ID, - Name: "name", - ValueType: models.StringValueType, - Required: false, - } - userType.Attributes = append(userType.Attributes, - nameAttr, - ) - - err = db.Create(&userType).Error - if err != nil { - log.Fatalln(err) - } - - profileType := &models.EntityType{ - Name: "profile", - } - displayNameAttr := &models.Attribute{ - EntityTypeID: profileType.ID, - Name: "displayName", - ValueType: models.StringValueType, - Required: false, - } - yearOfBirthAttr := &models.Attribute{ - EntityTypeID: profileType.ID, - Name: "yearOfBirth", - ValueType: models.IntValueType, - Required: false, - } - userAttr := models.NewRelationAttribute(profileType, "userID", false, false, userType) - profileType.Attributes = append(profileType.Attributes, - displayNameAttr, - yearOfBirthAttr, - userAttr, - ) - - err = db.Create(&profileType).Error - if err != nil { - log.Fatalln(err) - } - return ctx, nil }) @@ -161,15 +116,6 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^status code is "(\d+)"$`, t.assertStatusCode) ctx.Step(`^response field "(.+)" is "(.+)"$`, t.assertResponseFieldIsEquals) ctx.Step(`^I request "(.+)" with method "(.+)" with json$`, t.requestWithJSON) - ctx.Step(`^a "(.+)" object exists with attributes$`, t.objectExists) - ctx.Step(`^I query a "(.+)" with the object id$`, t.queryWithObjectID) - ctx.Step(`^I query all "(.+)" objects$`, t.queryAllObjects) - ctx.Step(`^there are "(\d+)" "(.+)" objects$`, t.thereAreObjects) - ctx.Step(`^there is a "(.+)" object with attributes$`, t.thereIsObjectWithAttributes) - ctx.Step(`^I query all "(.+)" objects with conditions$`, t.queryObjectsWithConditions) - ctx.Step(`^I delete a "(.+)" with the object id$`, t.deleteWithObjectID) - ctx.Step(`^I modify a "(.+)" with attributes$`, t.modifyWithAttributes) - ctx.Step(`^a "(.+)" object exists with property "(.+)" related to last object and properties$`, t.objectExistsWithRelation) } func CleanDB(db *gorm.DB) { @@ -178,10 +124,6 @@ func CleanDB(db *gorm.DB) { []any{ models.Session{}, models.User{}, - models.Value{}, - models.Attribute{}, - models.Entity{}, - models.EntityType{}, }..., )) } diff --git a/test_e2e/features/eav.feature b/test_e2e/features/eav.feature deleted file mode 100644 index 798e03e8..00000000 --- a/test_e2e/features/eav.feature +++ /dev/null @@ -1,128 +0,0 @@ -Feature: Saving and querying objects in the database using the EAV Model - Scenario: Objects can be created with CreateObject - When I request "/eav/objects/profile" with method "POST" with json - | key | value | type | - | displayName | Jean Dupont | string | - | yearOfBirth | 1997 | integer | - Then status code is "201" - And response field "type" is "profile" - And response field "attrs.displayName" is "Jean Dupont" - And response field "attrs.yearOfBirth" is "1997" - - Scenario: Created object can be queried individually - Given a "profile" object exists with attributes - | key | value | type | - | displayName | Jean Dupont | string | - | yearOfBirth | 1997 | integer | - When I query a "profile" with the object id - Then response field "type" is "profile" - And response field "attrs.displayName" is "Jean Dupont" - And response field "attrs.yearOfBirth" is "1997" - - Scenario: Created objects can be queried together - Given a "profile" object exists with attributes - | key | value | type | - | displayName | Jean Dupont | string | - | yearOfBirth | 1997 | integer | - And a "profile" object exists with attributes - | key | value | type | - | displayName | Pierre Martin | string | - | yearOfBirth | 2001 | integer | - When I query all "profile" objects - Then there are "2" "profile" objects - And there is a "profile" object with attributes - | key | value | type | - | displayName | Jean Dupont | string | - | yearOfBirth | 1997 | float | - And there is a "profile" object with attributes - | key | value | type | - | displayName | Pierre Martin | string | - | yearOfBirth | 2001 | float | - - Scenario: Created objects can be queried by a property - Given a "profile" object exists with attributes - | key | value | type | - | displayName | Jean Dupont | string | - | yearOfBirth | 1997 | integer | - And a "profile" object exists with attributes - | key | value | type | - | displayName | Pierre Martin | string | - | yearOfBirth | 2001 | integer | - When I query all "profile" objects with conditions - | key | value | type | - | yearOfBirth | 2001 | integer | - Then there are "1" "profile" objects - And there is a "profile" object with attributes - | key | value | type | - | displayName | Pierre Martin | string | - | yearOfBirth | 2001 | float | - - Scenario: Created objects can be queried by multiple properties - Given a "profile" object exists with attributes - | key | value | type | - | displayName | Jean Dupont | string | - | yearOfBirth | 1997 | integer | - And a "profile" object exists with attributes - | key | value | type | - | displayName | Pierre Martin | string | - | yearOfBirth | 2001 | integer | - And a "profile" object exists with attributes - | key | value | type | - | displayName | Gabriel Bernard | string | - | yearOfBirth | 2001 | integer | - When I query all "profile" objects with conditions - | key | value | type | - | displayName | Pierre Martin | string | - | yearOfBirth | 2001 | integer | - Then there are "1" "profile" objects - And there is a "profile" object with attributes - | key | value | type | - | displayName | Pierre Martin | string | - | yearOfBirth | 2001 | float | - - Scenario: Created objects can be queried doing joins - Given a "user" object exists with attributes - | key | value | type | - | name | user1 | string | - And a "profile" object exists with property "userID" related to last object and properties - | key | value | type | - | displayName | Jean Dupont | string | - | yearOfBirth | 1997 | integer | - And a "user" object exists with attributes - | key | value | type | - | name | user2 | string | - And a "profile" object exists with property "userID" related to last object and properties - | key | value | type | - | displayName | Pierre Martin | string | - | yearOfBirth | 2001 | integer | - When I query all "profile" objects with conditions - | key | value | type | - | displayName | Jean Dupont | string | - | userID | {"name": "user1"} | json | - Then there are "1" "profile" objects - And there is a "profile" object with attributes - | key | value | type | - | displayName | Jean Dupont | string | - | yearOfBirth | 1997 | float | - - Scenario: Created objects can be deleted - Given a "profile" object exists with attributes - | key | value | type | - | displayName | Jean Dupont | string | - | yearOfBirth | 1997 | integer | - When I delete a "profile" with the object id - And I query all "profile" objects - Then there are "0" "profile" objects - - Scenario: Created objects can be modified - Given a "profile" object exists with attributes - | key | value | type | - | displayName | Jean Dupont | string | - | yearOfBirth | 1997 | integer | - When I modify a "profile" with attributes - | key | value | type | - | yearOfBirth | 1998 | integer | - And I query a "profile" with the object id - Then response field "type" is "profile" - And response field "attrs.displayName" is "Jean Dupont" - And response field "attrs.yearOfBirth" is "1998" \ No newline at end of file diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index aeff142b..04878051 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -255,206 +255,3 @@ func checkMethod(method string) (string, error) { return sanitizedMethod, nil } - -func (t *TestContext) objectExists(entityType string, jsonTable *godog.Table) error { - err := t.request( - "/eav/objects/"+entityType, - http.MethodPost, - jsonTable, - ) - if err != nil { - return err - } - - err = t.assertStatusCode(http.StatusCreated) - if err != nil { - return err - } - - return nil -} - -func (t *TestContext) objectExistsWithRelation(entityType string, relationAttribute string, jsonTable *godog.Table) error { - jsonTable.Rows = append(jsonTable.Rows, &messages.PickleTableRow{ - Cells: []*messages.PickleTableCell{ - { - Value: relationAttribute, - }, - { - Value: t.getIDFromJSON(), - }, - { - Value: stringValueType, - }, - }, - }) - - return t.objectExists(entityType, jsonTable) -} - -func (t *TestContext) queryWithObjectID(entityType string) error { - err := t.requestGet( - "/eav/objects/" + entityType + "/" + t.getIDFromJSON(), - ) - if err != nil { - return err - } - - err = t.assertStatusCode(http.StatusOK) - if err != nil { - return err - } - - return nil -} - -func (t *TestContext) queryObjectsWithConditions(entityType string, jsonTable *godog.Table) error { - err := t.requestWithJSON( - "/eav/objects/"+entityType, - http.MethodGet, - jsonTable, - ) - if err != nil { - return err - } - - err = t.assertStatusCode(http.StatusOK) - if err != nil { - return err - } - - return nil -} - -func (t *TestContext) queryAllObjects(entityType string) error { - err := t.requestGet( - "/eav/objects/" + entityType, - ) - if err != nil { - return err - } - - err = t.assertStatusCode(http.StatusOK) - if err != nil { - return err - } - - return nil -} - -func (t *TestContext) thereAreObjects(expectedAmount int, entityType string) error { - amount := len(t.getListFromJSON()) - if amount != expectedAmount { - return fmt.Errorf("expect amount %d, but there are %d objects of type %s", expectedAmount, amount, entityType) - } - - return nil -} - -func (t *TestContext) thereIsObjectWithAttributes(expectedEntityType string, jsonTable *godog.Table) error { - expectedValues, err := buildMapFromTable(jsonTable) - if err != nil { - log.Fatalln(err) - } - - objectMapList := t.getObjectMapListFromJSON() - for _, objectMap := range objectMapList { - objectAttrs, ok := objectMap["attrs"].(map[string]any) - if !ok { - log.Fatalln("attrs in object is not a map") - } - - if objectMap["type"] == expectedEntityType { - if t.areAllAttributesEqual(objectAttrs, expectedValues) { - return nil - } - } - } - - return fmt.Errorf("object with attributes %v not found in %v", expectedValues, objectMapList) -} - -func (t *TestContext) deleteWithObjectID(entityType string) error { - err := t.request( - "/eav/objects/"+entityType+"/"+t.getIDFromJSON(), - http.MethodDelete, - nil, - ) - if err != nil { - return err - } - - err = t.assertStatusCode(http.StatusOK) - if err != nil { - return err - } - - return nil -} - -func (t *TestContext) modifyWithAttributes(entityType string, jsonTable *godog.Table) error { - err := t.request( - "/eav/objects/"+entityType+"/"+t.getIDFromJSON(), - http.MethodPut, - jsonTable, - ) - if err != nil { - return err - } - - err = t.assertStatusCode(http.StatusOK) - if err != nil { - return err - } - - return nil -} - -func (t *TestContext) getIDFromJSON() string { - id, present := t.json.(map[string]any)["id"] - if !present { - log.Fatalln("object id not available") - } - - idString, ok := id.(string) - if !ok { - log.Fatalln("id in json is not a string") - } - - return idString -} - -func (t *TestContext) getListFromJSON() []any { - objectList, ok := t.json.([]any) - if !ok { - log.Fatalln("json is not a list") - } - - return objectList -} - -func (t *TestContext) getObjectMapListFromJSON() []map[string]any { - objectList := t.getListFromJSON() - - return pie.Map(objectList, func(object any) map[string]any { - objectMap, ok := object.(map[string]any) - if !ok { - log.Fatalln("object in json list is not a map") - } - - return objectMap - }) -} - -func (t *TestContext) areAllAttributesEqual(objectMap, expectedValues map[string]any) bool { - allEqual := true - - for attributeName, expectedValue := range expectedValues { - actualValue, isPresent := objectMap[attributeName] - if !isPresent || actualValue != expectedValue { - allEqual = false - } - } - - return allEqual -} diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index a13ffdb1..6c88b669 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -52,7 +52,6 @@ func runHTTPServer(_ *cobra.Command, _ []string) { // add routes provided by badaas router.InfoRouteModule, router.AuthRoutesModule, - router.EAVRoutesModule, // create httpServer fx.Provide(NewHTTPServer), diff --git a/testintegration/asserts.go b/testintegration/asserts.go index e205197f..6e514505 100644 --- a/testintegration/asserts.go +++ b/testintegration/asserts.go @@ -2,13 +2,9 @@ package testintegration import ( "log" - "sort" "github.com/stretchr/testify/suite" - "gotest.tools/assert" is "gotest.tools/assert/cmp" - - "github.com/ditrit/badaas/persistence/models" ) func EqualList[T any](ts *suite.Suite, expectedList, actualList []T) { @@ -37,28 +33,3 @@ func EqualList[T any](ts *suite.Suite, expectedList, actualList []T) { } } } - -func EqualEntityList(ts *suite.Suite, expected, actual []*models.Entity) { - ts.Len(actual, len(expected)) - - sort.SliceStable(expected, func(i, j int) bool { - return expected[i].ID.String() < expected[j].ID.String() - }) - - sort.SliceStable(actual, func(i, j int) bool { - return actual[i].ID.String() < actual[j].ID.String() - }) - - for i := range actual { - EqualEntity(ts, expected[i], actual[i]) - } -} - -func EqualEntity(ts *suite.Suite, expected, actual *models.Entity) { - assert.DeepEqual(ts.T(), expected, actual) - EqualList( - ts, - expected.Fields, - actual.Fields, - ) -} diff --git a/testintegration/badaas_test.go b/testintegration/badaas_test.go index 0d327bb3..159b16ba 100644 --- a/testintegration/badaas_test.go +++ b/testintegration/badaas_test.go @@ -1,72 +1,7 @@ package testintegration import ( - "os" - "path" - "path/filepath" - "runtime" "testing" - - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/stretchr/testify/suite" - "go.uber.org/fx" - "go.uber.org/fx/fxevent" - "go.uber.org/zap" - - "github.com/ditrit/badaas" - "github.com/ditrit/badaas/configuration" - "github.com/ditrit/badaas/services" - "github.com/ditrit/verdeter" ) var tGlobal *testing.T - -var testsCommand = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ - Run: injectDependencies, -}) - -// In order for 'go test' to run this suite, we need to create -// a normal test function and pass our suite to suite.Run -func TestBaDaaS(t *testing.T) { - _, b, _, _ := runtime.Caller(0) - basePath := filepath.Dir(b) - - viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) - viper.Set(configuration.DatabaseDialectorKey, os.Getenv(dbTypeEnvKey)) - - err := configuration.NewCommandInitializer().Init(testsCommand) - if err != nil { - panic(err) - } - - tGlobal = t - - testsCommand.Execute() -} - -func injectDependencies(_ *cobra.Command, _ []string) { - fx.New( - fx.Provide(GetModels), - badaas.BadaasModule, - - // logger for fx - fx.WithLogger(func(logger *zap.Logger) fxevent.Logger { - return &fxevent.ZapLogger{Logger: logger} - }), - - services.EAVServiceModule, - fx.Provide(NewEAVServiceIntTestSuite), - - fx.Invoke(runBaDaaSTestSuites), - ).Run() -} - -func runBaDaaSTestSuites( - tsEAVService *EAVServiceIntTestSuite, - shutdowner fx.Shutdowner, -) { - suite.Run(tGlobal, tsEAVService) - - shutdowner.Shutdown() -} diff --git a/testintegration/eavService.go b/testintegration/eavService.go deleted file mode 100644 index 0907bcd5..00000000 --- a/testintegration/eavService.go +++ /dev/null @@ -1,881 +0,0 @@ -package testintegration - -import ( - "fmt" - - "github.com/elliotchance/pie/v2" - "github.com/stretchr/testify/suite" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" - "github.com/ditrit/badaas/persistence/models" - "github.com/ditrit/badaas/persistence/repository" - "github.com/ditrit/badaas/services" - "github.com/ditrit/badaas/utils" -) - -type EAVServiceIntTestSuite struct { - suite.Suite - db *gorm.DB - eavService services.EAVService - entityRepository *repository.EntityRepository - entityType1 *models.EntityType - entityType2 *models.EntityType -} - -func NewEAVServiceIntTestSuite( - db *gorm.DB, - eavService services.EAVService, - entityRepository *repository.EntityRepository, -) *EAVServiceIntTestSuite { - return &EAVServiceIntTestSuite{ - db: db, - eavService: eavService, - entityRepository: entityRepository, - } -} - -func (ts *EAVServiceIntTestSuite) TearDownSuite() { - ts.cleanDB() -} - -func (ts *EAVServiceIntTestSuite) SetupTest() { - ts.cleanDB() - - ts.entityType1 = ts.createEntityType("entityType1", nil) - ts.entityType2 = ts.createEntityType("entityType2", ts.entityType1) -} - -func (ts *EAVServiceIntTestSuite) cleanDB() { - CleanDBTables( - ts.db, - []any{ - models.Value{}, - models.Attribute{}, - models.Entity{}, - models.EntityType{}, - }, - ) -} - -// ------------------------- GetEntity -------------------------------- - -func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityDoesNotExist() { - _, err := ts.eavService.GetEntity(ts.entityType1.Name, badorm.NewUUID()) - ts.ErrorContains(err, "record not found") -} - -func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityTypeDoesNotMatch() { - otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{}) - _, err := ts.eavService.GetEntity(ts.entityType2.Name, otherEntity1.ID) - ts.ErrorContains(err, "record not found") -} - -func (ts *EAVServiceIntTestSuite) TestGetEntityWorksIfEntityTypeMatch() { - entity1 := ts.createEntity(ts.entityType2, map[string]any{}) - - entityReturned, err := ts.eavService.GetEntity(ts.entityType2.Name, entity1.ID) - ts.Nil(err) - EqualEntity(&ts.Suite, entity1, entityReturned) -} - -// ------------------------- GetEntities -------------------------------- - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesOfNotExistentTypeReturnsError() { - _, err := ts.eavService.GetEntities("not-exists", map[string]any{}) - ts.ErrorIs(err, gorm.ErrRecordNotFound) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, map[string]any{}) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { - match := ts.createEntity(ts.entityType2, map[string]any{}) - - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, make(map[string]any)) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { - match1 := ts.createEntity(ts.entityType2, map[string]any{}) - match2 := ts.createEntity(ts.entityType2, map[string]any{}) - match3 := ts.createEntity(ts.entityType2, map[string]any{}) - - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, make(map[string]any)) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match1, match2, match3}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { - params := map[string]any{ - "string": "not_created", - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { - ts.createEntity(ts.entityType2, map[string]any{ - "string": "something_else", - }) - - params := map[string]any{ - "string": "not_match", - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { - match := ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "string": "something_else", - }) - - params := map[string]any{ - "string": "match", - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { - match1 := ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - }) - match2 := ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "string": "something_else", - }) - - params := map[string]any{ - "string": "match", - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match1, match2}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsEmpty() { - ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - }) - ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - }) - ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - }) - - params := map[string]any{ - "not_exists": "not_exists", - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { - match := ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - "int": 1, - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "string": "not_match", - "int": 2, - }) - - params := map[string]any{ - "int": 1.0, - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeReturnsEmptyList() { - ts.createEntity(ts.entityType2, map[string]any{ - "string": "not_match", - "int": 1, - }) - - params := map[string]any{ - "int": "not_an_int", - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - ts.Len(entities, 0) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { - match := ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - "float": 1.1, - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "string": "not_match", - "float": 2.0, - }) - - params := map[string]any{ - "float": 1.1, - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { - match := ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - "bool": true, - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "string": "not_match", - "bool": false, - }) - - params := map[string]any{ - "bool": true, - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { - otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{}) - otherEntity2 := ts.createEntity(ts.entityType1, map[string]any{}) - - match := ts.createEntity(ts.entityType2, map[string]any{ - "relation": otherEntity1.ID.String(), - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "relation": otherEntity2.ID.String(), - }) - - params := map[string]any{ - "relation": otherEntity1.ID.String(), - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionFilterByNull() { - match := ts.createEntity(ts.entityType2, map[string]any{ - "string": nil, - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "string": "something", - }) - - params := map[string]any{ - "string": nil, - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { - match1 := ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - "int": 1, - "bool": true, - }) - match2 := ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - "int": 1, - "bool": true, - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "string": "not_match", - "int": 1, - "bool": true, - }) - ts.createEntity(ts.entityType2, map[string]any{ - "string": "match", - "int": 2, - "bool": true, - }) - - params := map[string]any{ - "string": "match", - "int": 1.0, - "bool": true, - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match1, match2}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoins() { - otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{ - "int": 1, - }) - otherEntity2 := ts.createEntity(ts.entityType1, map[string]any{ - "int": 2, - }) - - match := ts.createEntity(ts.entityType2, map[string]any{ - "relation": otherEntity1.ID.String(), - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "relation": otherEntity2.ID.String(), - }) - - params := map[string]any{ - "relation": map[string]any{ - "int": 1.0, - }, - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { - otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{ - "int": 1, - "string": "match", - }) - otherEntity2 := ts.createEntity(ts.entityType1, map[string]any{ - "int": 2, - "string": "match", - }) - - match := ts.createEntity(ts.entityType2, map[string]any{ - "relation": otherEntity1.ID.String(), - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "relation": otherEntity2.ID.String(), - }) - - params := map[string]any{ - "relation": map[string]any{ - "int": 1.0, - "string": "match", - }, - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { - entityType3 := ts.createEntityType("entityType3", nil) - - otherEntity11 := ts.createEntity(ts.entityType1, map[string]any{ - "int": 1, - }) - otherEntity12 := ts.createEntity(ts.entityType1, map[string]any{ - "int": 2, - }) - - otherEntity31 := ts.createEntity(entityType3, map[string]any{ - "int": 3, - }) - otherEntity32 := ts.createEntity(entityType3, map[string]any{ - "int": 4, - }) - - relation3Attr := models.NewRelationAttribute( - ts.entityType2, "relation2", - false, false, entityType3, - ) - - ts.addAttributeToEntityType(ts.entityType2, relation3Attr) - - match := ts.createEntity(ts.entityType2, map[string]any{ - "relation": otherEntity11.ID.String(), - "relation2": otherEntity31.ID.String(), - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "relation": otherEntity12.ID.String(), - "relation2": otherEntity32.ID.String(), - }) - - params := map[string]any{ - "relation": map[string]any{ - "int": 1.0, - }, - "relation2": map[string]any{ - "int": 3.0, - }, - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { - entityType3 := ts.createEntityType("entityType3", nil) - - ts.addAttributeToEntityType(ts.entityType1, models.NewRelationAttribute( - ts.entityType1, "relation", - false, false, entityType3, - )) - - otherEntity31 := ts.createEntity(entityType3, map[string]any{ - "int": 3, - }) - otherEntity32 := ts.createEntity(entityType3, map[string]any{ - "int": 4, - }) - - otherEntity11 := ts.createEntity(ts.entityType1, map[string]any{ - "int": 1, - "relation": otherEntity31.ID.String(), - }) - otherEntity12 := ts.createEntity(ts.entityType1, map[string]any{ - "int": 2, - "relation": otherEntity32.ID.String(), - }) - - match := ts.createEntity(ts.entityType2, map[string]any{ - "relation": otherEntity11.ID.String(), - }) - - ts.createEntity(ts.entityType2, map[string]any{ - "relation": otherEntity12.ID.String(), - }) - - params := map[string]any{ - "relation": map[string]any{ - "int": 1.0, - "relation": map[string]any{ - "int": 3.0, - }, - }, - } - entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) - ts.Nil(err) - - EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) -} - -// ------------------------- CreateEntity -------------------------------- - -func (ts *EAVServiceIntTestSuite) TestCreateMultipleEntitiesDoesNotGenerateGormBug() { - stringAttr := utils.FindFirst(ts.entityType1.Attributes, func(attr *models.Attribute) bool { - return attr.ValueType == models.StringValueType - }) - - initialDisplayNameID := (*stringAttr).ID - - stringAttr2 := &models.Attribute{ - Name: "string2", - ValueType: models.StringValueType, - } - ts.addAttributeToEntityType(ts.entityType1, stringAttr2) - - initialDescriptionID := stringAttr2.ID - - for i := 0; i < 10; i++ { - params := map[string]any{ - "string": fmt.Sprintf("displayName%d", i), - "description": fmt.Sprintf("description%d", i), - } - entity, err := ts.eavService.CreateEntity(ts.entityType1.Name, params) - ts.Nil(err) - - for _, value := range entity.Fields { - if value.Attribute.Name == "string" { - ts.Equal(initialDisplayNameID, value.AttributeID) - } else if value.Attribute.Name == "string2" { - ts.Equal(initialDescriptionID, value.AttributeID) - } - } - } -} - -func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfEntityTypeDoesNotExist() { - _, err := ts.eavService.CreateEntity("not-exists", map[string]any{}) - ts.ErrorIs(err, gorm.ErrRecordNotFound) -} - -func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfTheTypeOfAValueIsUnsupported() { - params := map[string]any{ - "string": []string{"salut", "bonjour"}, - } - entity, err := ts.eavService.CreateEntity(ts.entityType1.Name, params) - ts.Nil(entity) - ts.ErrorContains(err, "unsupported type") -} - -func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfUUIDCantBeParsed() { - params := map[string]any{ - "relation": "not-a-uuid", - } - entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, params) - ts.Nil(entity) - ts.ErrorIs(err, services.ErrCantParseUUID) -} - -func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfRelationAttributePointsToNotExistentType() { - ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ - Name: "relation2", - ValueType: models.RelationValueType, - RelationTargetEntityTypeID: badorm.NewUUID(), - }) - - params := map[string]any{ - "relation2": badorm.NewUUID().String(), - } - entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, params) - ts.Nil(entity) - ts.ErrorIs(err, gorm.ErrRecordNotFound) -} - -func (ts *EAVServiceIntTestSuite) TestCreatesDefaultAttributes() { - ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ - Name: "default", - ValueType: models.IntValueType, - Default: true, - DefaultInt: 1, - }) - - entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, map[string]any{}) - ts.Nil(err) - ts.Len(entity.Fields, 6) - notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { - return !value.IsNull - }) - ts.Len(notNull, 1) - ts.Equal(1, notNull[0].Value()) -} - -func (ts *EAVServiceIntTestSuite) TestCreatesWithoutRequiredValueRespondsError() { - ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ - Name: "required", - Required: true, - ValueType: models.StringValueType, - }) - - entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, map[string]any{}) - ts.Nil(entity) - ts.ErrorContains(err, "field required is missing and is required") -} - -func (ts *EAVServiceIntTestSuite) TestCreatesIntAttributeEvenIfItIsInFloatFormat() { - entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, map[string]any{ - "int": 2.0, - }) - ts.Nil(err) - ts.Len(entity.Fields, 5) - notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { - return !value.IsNull - }) - ts.Len(notNull, 1) - ts.Equal(2, notNull[0].Value()) -} - -// // ------------------------- UpdateEntity -------------------------------- - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGormBug() { - stringAttr := utils.FindFirst(ts.entityType1.Attributes, func(attr *models.Attribute) bool { - return attr.ValueType == models.StringValueType - }) - - initialDisplayNameID := (*stringAttr).ID - - stringAttr2 := &models.Attribute{ - Name: "string2", - ValueType: models.StringValueType, - } - ts.addAttributeToEntityType(ts.entityType1, stringAttr2) - initialDescriptionID := stringAttr2.ID - - entity := ts.createEntity(ts.entityType1, map[string]any{ - "string": "displayName", - "string2": "description", - }) - - var err error - - for i := 0; i < 10; i++ { - params := map[string]any{ - "string": fmt.Sprintf("displayName%d", i), - "string2": fmt.Sprintf("description%d", i), - } - entity, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, params) - ts.Nil(err) - - for _, value := range entity.Fields { - if value.Attribute.Name == "string" { - ts.Equal(initialDisplayNameID, value.AttributeID) - } else if value.Attribute.Name == "string2" { - ts.Equal(initialDescriptionID, value.AttributeID) - } - } - } -} - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfEntityDoesNotExist() { - _, err := ts.eavService.UpdateEntity(ts.entityType1.Name, badorm.NewUUID(), map[string]any{}) - ts.ErrorIs(err, gorm.ErrRecordNotFound) -} - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityWorksForAllTheTypes() { - otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{}) - entity := ts.createEntity(ts.entityType2, map[string]any{ - "string": "displayName", - }) - - paramsUpdate := map[string]any{ - "string": nil, - "int": 1, - "float": 1.1, - "bool": true, - "relation": otherEntity1.ID.String(), - } - entity, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) - ts.Nil(err) - ts.Len(entity.Fields, 5) - notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { - return !value.IsNull - }) - ts.Len(notNull, 4) - values := pie.Map(notNull, func(v *models.Value) any { - return v.Value() - }) - ts.Contains(values, 1) - ts.Contains(values, 1.1) - ts.Contains(values, true) - ts.Contains(values, otherEntity1.ID) -} - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForIntType() { - entity := ts.createEntity(ts.entityType2, map[string]any{}) - - paramsUpdate := map[string]any{ - "int": "1", - } - _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) - ts.ErrorIs(err, models.ErrAskingForWrongType) -} - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForFloatType() { - entity := ts.createEntity(ts.entityType2, map[string]any{}) - - paramsUpdate := map[string]any{ - "float": "1", - } - _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) - ts.ErrorIs(err, models.ErrAskingForWrongType) -} - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForBoolType() { - entity := ts.createEntity(ts.entityType2, map[string]any{}) - - paramsUpdate := map[string]any{ - "bool": "1", - } - _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) - ts.ErrorIs(err, models.ErrAskingForWrongType) -} - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfIntForStringType() { - entity := ts.createEntity(ts.entityType2, map[string]any{}) - - paramsUpdate := map[string]any{ - "string": 1, - } - _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) - ts.ErrorIs(err, models.ErrAskingForWrongType) -} - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDCantBeParsedForRelationType() { - entity := ts.createEntity(ts.entityType2, map[string]any{}) - - paramsUpdate := map[string]any{ - "relation": "not-uuid", - } - _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) - ts.ErrorIs(err, services.ErrCantParseUUID) -} - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotExists() { - entity := ts.createEntity(ts.entityType2, map[string]any{}) - - paramsUpdate := map[string]any{ - "relation": badorm.NewUUID().String(), - } - _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) - ts.ErrorIs(err, gorm.ErrRecordNotFound) -} - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotCorrespondsToTheRelationEntityType() { - otherEntityType2 := &models.EntityType{ - Name: "other2", - } - - err := ts.db.Create(otherEntityType2).Error - ts.Nil(err) - - entity := ts.createEntity(ts.entityType2, map[string]any{}) - entityOther2 := ts.createEntity(otherEntityType2, map[string]any{}) - - paramsUpdate := map[string]any{ - "relation": entityOther2.ID.String(), - } - _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) - ts.ErrorIs(err, gorm.ErrRecordNotFound) -} - -func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFails() { - entity := ts.createEntity(ts.entityType2, map[string]any{}) - - paramsUpdate := map[string]any{ - "string": "something", - "int": "1", - } - _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) - ts.ErrorIs(err, models.ErrAskingForWrongType) - - entityReturned, err := ts.eavService.GetEntity(ts.entityType2.Name, entity.ID) - ts.Nil(err) - - notNull := pie.Filter(entityReturned.Fields, func(value *models.Value) bool { - return !value.IsNull - }) - ts.Len(notNull, 0) -} - -// ------------------------- DeleteEntity ------------------------- - -func (ts *EAVServiceIntTestSuite) TestDeleteEntityReturnsErrorIfEntityDoesNotExist() { - err := ts.eavService.DeleteEntity(ts.entityType2.Name, badorm.NewUUID()) - ts.ErrorIs(err, gorm.ErrRecordNotFound) -} - -func (ts *EAVServiceIntTestSuite) TestDeleteEntityReturnsErrorIfEntityTypeDoesNotMatch() { - entity1 := ts.createEntity(ts.entityType2, map[string]any{ - "string": "displayName", - }) - - err := ts.eavService.DeleteEntity(ts.entityType1.Name, entity1.ID) - ts.ErrorIs(err, gorm.ErrRecordNotFound) - - var values []models.Value - err = ts.db.Find(&values).Error - ts.Nil(err) - ts.Len(values, 5) -} - -func (ts *EAVServiceIntTestSuite) TestDeleteWorks() { - entity1 := ts.createEntity(ts.entityType2, map[string]any{ - "string": "displayName", - }) - - err := ts.eavService.DeleteEntity(entity1.EntityType.Name, entity1.ID) - ts.Nil(err) - - var profiles []models.Entity - err = ts.db.Find(&profiles).Error - ts.Nil(err) - ts.Len(profiles, 0) - - var values []models.Value - err = ts.db.Find(&values).Error - ts.Nil(err) - ts.Len(values, 0) -} - -// ------------------------- utils ------------------------- - -func (ts *EAVServiceIntTestSuite) createEntityType(name string, relationEntityType *models.EntityType) *models.EntityType { - entityType := &models.EntityType{ - Name: name, - } - - entityType.Attributes = []*models.Attribute{ - { - EntityTypeID: entityType.ID, - Name: "int", - ValueType: models.IntValueType, - }, - { - EntityTypeID: entityType.ID, - Name: "string", - ValueType: models.StringValueType, - }, - { - EntityTypeID: entityType.ID, - Name: "bool", - ValueType: models.BooleanValueType, - }, - { - EntityTypeID: entityType.ID, - Name: "float", - ValueType: models.FloatValueType, - }, - } - - if relationEntityType != nil { - entityType.Attributes = append(entityType.Attributes, models.NewRelationAttribute( - entityType, "relation", - false, false, relationEntityType, - )) - } - - err := ts.db.Create(&entityType).Error - ts.Nil(err) - - return entityType -} - -func (ts *EAVServiceIntTestSuite) addAttributeToEntityType(entityType *models.EntityType, attribute *models.Attribute) { - attribute.EntityTypeID = entityType.ID - entityType.Attributes = append(entityType.Attributes, attribute) - - err := ts.db.Save(&entityType).Error - ts.Nil(err) -} - -func (ts *EAVServiceIntTestSuite) createEntity(entityType *models.EntityType, values map[string]any) *models.Entity { - entity, err := ts.eavService.CreateEntity(entityType.Name, values) - ts.Nil(err) - - return entity -} From 5bf2b97413ce9914e4e1c11cbd8bc9867f8be492 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 10:55:33 +0200 Subject: [PATCH 455/467] remove link to badaas example from badorm --- docs/badorm/quickstart.rst | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/docs/badorm/quickstart.rst b/docs/badorm/quickstart.rst index d4fc7b30..bc25e8d6 100644 --- a/docs/badorm/quickstart.rst +++ b/docs/badorm/quickstart.rst @@ -173,13 +173,5 @@ After that, we need to start the `badorm.BaDORMModule` and we are ready create Finally, we call the functions `CreateCRUDObjects` and `QueryCRUDObjects` where the CRUDServices are injected to create, read, update and delete the models easily. This two functions are defined in `example.go`. -In `QueryCRUDObjects` yoIn `QueryCRUDObjects` you can find a basic usage of the compiled query system.u can find a basic usage of the -:ref:`compilable query system `. - -BaDaaS example ---------------------------- - -If you are interested in using BaDORM within a BaDaaS application you can -consult the `badaas example `_. -in which besides using the services and repositories provided by BaDorm, -BaDaaS adds a controller that allows the query of objects via an http api. \ No newline at end of file +In `QueryCRUDObjects` you can find a basic usage of the compiled query system.u can find a basic usage of the +:ref:`compilable query system `. \ No newline at end of file From 0c14e2f9ab9feb96cf850c22b56dd4f4749bf1a7 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 10:56:41 +0200 Subject: [PATCH 456/467] remove old todos --- badorm/badorm.go | 1 - docs/badorm/connecting_to_a_database.rst | 2 -- docs/badorm/quickstart.rst | 4 ---- 3 files changed, 7 deletions(-) diff --git a/badorm/badorm.go b/badorm/badorm.go index 9545d455..88d1ebc7 100644 --- a/badorm/badorm.go +++ b/badorm/badorm.go @@ -10,7 +10,6 @@ func GetCRUD[T Model, ID ModelID](db *gorm.DB) (CRUDService[T, ID], CRUDReposito return NewCRUDService(db, repository), repository } -// TODO auto migracion no obligatoria func autoMigrate(modelsLists [][]any, db *gorm.DB) error { allModels := pie.Flat(modelsLists) return db.AutoMigrate(allModels...) diff --git a/docs/badorm/connecting_to_a_database.rst b/docs/badorm/connecting_to_a_database.rst index 5c8e0413..e4262484 100644 --- a/docs/badorm/connecting_to_a_database.rst +++ b/docs/badorm/connecting_to_a_database.rst @@ -17,8 +17,6 @@ using the specified dialector with retrying. It also configures the `gorm's logger `_ to work with `zap logger `_. -.. TODO verificar esto del logger si no es mejorable, y tambien en el ejemplo no haga falta el logger este. - When using BaDORM with `fx` as :ref:`dependency injector ` you will need to provide (`fx.Provide`) a function that returns a `*gorm.DB`. diff --git a/docs/badorm/quickstart.rst b/docs/badorm/quickstart.rst index bc25e8d6..ca929d60 100644 --- a/docs/badorm/quickstart.rst +++ b/docs/badorm/quickstart.rst @@ -79,8 +79,6 @@ Once you have started your project with `go init`, you must add the dependency t go get -u github.com/ditrit/badaas github.com/uber-go/zap gorm.io/gorm -.. TODO quisiera sacar esta dependencia de zap - In models.go the :ref:`models ` are defined and in conditions/badorm.go the file required to :ref:`generate the conditions ` is created. @@ -131,8 +129,6 @@ Once you have started your project with `go init`, you must add the dependency t go get -u github.com/ditrit/badaas github.com/uber-go/fx github.com/uber-go/zap gorm.io/gorm -.. TODO quisiera sacar esta dependencia de zap - In models.go the :ref:`models ` are defined and in conditions/badorm.go the file required to :ref:`generate the conditions ` is created. From c4e02a01d037501b7d95dbf090a0dc1f9bc80a1c Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 11:00:24 +0200 Subject: [PATCH 457/467] add CONTRIBUTING.md to work in github --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..3621cc97 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,3 @@ +# Contributing + +See [this section](./docs/contributing/contributing.md). From 6732efe684c01ad6d8ece3d8c36736b3b0aa6467 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 11:07:21 +0200 Subject: [PATCH 458/467] (prs) remove eav model 2 --- controllers/utils.go | 68 +++++--------------------------------------- 1 file changed, 7 insertions(+), 61 deletions(-) diff --git a/controllers/utils.go b/controllers/utils.go index b265d7da..6d0ed920 100644 --- a/controllers/utils.go +++ b/controllers/utils.go @@ -2,29 +2,18 @@ package controllers import ( "encoding/json" - "errors" - "io" "net/http" - "github.com/gorilla/mux" - "gorm.io/gorm" - - "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" ) -var ( - // HTTPErrRequestMalformed is sent when the request is malformed - HTTPErrRequestMalformed httperrors.HTTPError = httperrors.NewHTTPError( - http.StatusBadRequest, - "Request malformed", - "The schema of the received data is not correct", - nil, - false, - ) - ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid object id") - ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists") - ErrIDNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") +// HTTPErrRequestMalformed is sent when the request is malformed +var HTTPErrRequestMalformed httperrors.HTTPError = httperrors.NewHTTPError( + http.StatusBadRequest, + "Request malformed", + "The schema of the received data is not correct", + nil, + false, ) // Decode json present in request body @@ -36,46 +25,3 @@ func decodeJSON(r *http.Request, to any) httperrors.HTTPError { return nil } - -// Decode json present in request body -func decodeJSONOptional(r *http.Request) (map[string]any, httperrors.HTTPError) { - to := map[string]any{} - err := json.NewDecoder(r.Body).Decode(&to) - - switch { - case errors.Is(err, io.EOF): - // empty body - return to, nil - case err != nil: - return nil, HTTPErrRequestMalformed - } - - return to, nil -} - -// Extract the "id" parameter from url -func getEntityIDFromRequest(r *http.Request) (badorm.UUID, httperrors.HTTPError) { - id, present := mux.Vars(r)["id"] - if !present { - return badorm.NilUUID, ErrEntityNotFound - } - - uuid, err := badorm.ParseUUID(id) - if err != nil { - return uuid, ErrIDNotAnUUID - } - - return uuid, nil -} - -func mapServiceError(err error) httperrors.HTTPError { - if err != nil { - if errors.Is(err, gorm.ErrRecordNotFound) { - return ErrEntityNotFound - } - - return httperrors.NewDBError(err) - } - - return nil -} From 4359f0a96e564940004ee2b6062c04211e2cbbae Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 12:00:59 +0200 Subject: [PATCH 459/467] add tests for commands initializer --- configuration/CommandsInitializer_test.go | 24 +++++++++ testintegration/authService_test.go | 50 +++++++++++++++++ testintegration/badaas_test.go | 65 +++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 configuration/CommandsInitializer_test.go create mode 100644 testintegration/authService_test.go diff --git a/configuration/CommandsInitializer_test.go b/configuration/CommandsInitializer_test.go new file mode 100644 index 00000000..52643541 --- /dev/null +++ b/configuration/CommandsInitializer_test.go @@ -0,0 +1,24 @@ +package configuration_test + +import ( + "testing" + + "github.com/spf13/cobra" + "github.com/stretchr/testify/assert" + + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/verdeter" +) + +var rootCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "badaas", + Short: "Backend and Distribution as a Service", + Run: doNothing, +}) + +func doNothing(_ *cobra.Command, _ []string) {} + +func TestInitCommandsInitializer(t *testing.T) { + err := configuration.NewCommandInitializer().Init(rootCfg) + assert.Nil(t, err) +} diff --git a/testintegration/authService_test.go b/testintegration/authService_test.go new file mode 100644 index 00000000..47faccbb --- /dev/null +++ b/testintegration/authService_test.go @@ -0,0 +1,50 @@ +package testintegration + +import ( + "github.com/stretchr/testify/suite" + "gorm.io/gorm" + + "github.com/ditrit/badaas/persistence/models/dto" + "github.com/ditrit/badaas/services/userservice" +) + +type AuthServiceIntTestSuite struct { + suite.Suite + db *gorm.DB + userService userservice.UserService +} + +func NewAuthServiceIntTestSuite( + db *gorm.DB, + userService userservice.UserService, +) *AuthServiceIntTestSuite { + return &AuthServiceIntTestSuite{ + db: db, + userService: userService, + } +} + +func (ts *AuthServiceIntTestSuite) SetupTest() { + CleanDB(ts.db) +} + +func (ts *AuthServiceIntTestSuite) TearDownSuite() { + CleanDB(ts.db) +} + +func (ts *AuthServiceIntTestSuite) TestGetUser() { + email := "franco@ditrit.io" + password := "1234" + + _, err := ts.userService.NewUser("franco", email, password) + ts.Nil(err) + + user, err := ts.userService.GetUser(dto.UserLoginDTO{ + Email: email, + Password: password, + }) + ts.Nil(err) + ts.Equal(user.Username, "franco") + ts.Equal(user.Email, email) + ts.NotEqual(user.Password, password) +} diff --git a/testintegration/badaas_test.go b/testintegration/badaas_test.go index 159b16ba..172bdcf9 100644 --- a/testintegration/badaas_test.go +++ b/testintegration/badaas_test.go @@ -1,7 +1,72 @@ package testintegration import ( + "os" + "path" + "path/filepath" + "runtime" "testing" + + "github.com/spf13/cobra" + "github.com/spf13/viper" + "github.com/stretchr/testify/suite" + "go.uber.org/fx" + "go.uber.org/fx/fxevent" + "go.uber.org/zap" + + "github.com/ditrit/badaas" + "github.com/ditrit/badaas/configuration" + "github.com/ditrit/badaas/services" + "github.com/ditrit/verdeter" ) var tGlobal *testing.T + +var testsCommand = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Run: injectDependencies, +}) + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestBaDaaS(t *testing.T) { + _, b, _, _ := runtime.Caller(0) + basePath := filepath.Dir(b) + + viper.Set("config_path", path.Join(basePath, "int_test_config.yml")) + viper.Set(configuration.DatabaseDialectorKey, os.Getenv(dbTypeEnvKey)) + + err := configuration.NewCommandInitializer().Init(testsCommand) + if err != nil { + panic(err) + } + + tGlobal = t + + testsCommand.Execute() +} + +func injectDependencies(_ *cobra.Command, _ []string) { + fx.New( + fx.Provide(GetModels), + badaas.BadaasModule, + + // logger for fx + fx.WithLogger(func(logger *zap.Logger) fxevent.Logger { + return &fxevent.ZapLogger{Logger: logger} + }), + + services.AuthServiceModule, + fx.Provide(NewAuthServiceIntTestSuite), + + fx.Invoke(runBaDaaSTestSuites), + ).Run() +} + +func runBaDaaSTestSuites( + tsAuthService *AuthServiceIntTestSuite, + shutdowner fx.Shutdowner, +) { + suite.Run(tGlobal, tsAuthService) + + shutdowner.Shutdown() +} From 8c1a8120b081650da5cecebfe6a9e7decd239cee Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 13:55:59 +0200 Subject: [PATCH 460/467] add docs to dockerignore --- .dockerignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index 9bf3003b..e562725f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -22,4 +22,5 @@ test_e2e/ !test_e2e/go.sum mocks/ docker/ -**/*_test.go \ No newline at end of file +**/*_test.go +docs/ \ No newline at end of file From 526da611def154aacb81b0747eb8ef86c9ff95f1 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 14:05:20 +0200 Subject: [PATCH 461/467] add all the possible dialectors --- badaas.example.yml | 2 +- docs/badaas/configuration.rst | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/badaas.example.yml b/badaas.example.yml index 112374eb..166127a6 100644 --- a/badaas.example.yml +++ b/badaas.example.yml @@ -30,7 +30,7 @@ database: # default (5) retryTime: 5 - # dialector to use in communication with database (postgresql | mysql) + # dialector to use in communication with database (postgresql | mysql | sqlite | sqlserver) # (mandatory) dialector: postgresql diff --git a/docs/badaas/configuration.rst b/docs/badaas/configuration.rst index 38025de0..b8b5dfa6 100644 --- a/docs/badaas/configuration.rst +++ b/docs/badaas/configuration.rst @@ -80,6 +80,10 @@ Database # default (5) retryTime: 5 + # dialector to use in communication with database (postgresql | mysql | sqlite | sqlserver) + # (mandatory) + dialector: postgresql + Please note that the init section `init:` is not mandatory. Badaas is suited with a simple but effective retry mechanism that will retry `database.init.retry` time to establish a connection with the database. From af728ba8e6407a96eee28805752ce30912817710 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 14:29:55 +0200 Subject: [PATCH 462/467] remove old mock --- mocks/configuration/ConfigurationHolder.go | 38 ---------------------- 1 file changed, 38 deletions(-) delete mode 100644 mocks/configuration/ConfigurationHolder.go diff --git a/mocks/configuration/ConfigurationHolder.go b/mocks/configuration/ConfigurationHolder.go deleted file mode 100644 index 4a047153..00000000 --- a/mocks/configuration/ConfigurationHolder.go +++ /dev/null @@ -1,38 +0,0 @@ -// Code generated by mockery v2.20.0. DO NOT EDIT. - -package mocks - -import ( - mock "github.com/stretchr/testify/mock" - zap "go.uber.org/zap" -) - -// ConfigurationHolder is an autogenerated mock type for the ConfigurationHolder type -type ConfigurationHolder struct { - mock.Mock -} - -// Log provides a mock function with given fields: logger -func (_m *ConfigurationHolder) Log(logger *zap.Logger) { - _m.Called(logger) -} - -// Reload provides a mock function with given fields: -func (_m *ConfigurationHolder) Reload() { - _m.Called() -} - -type mockConstructorTestingTNewConfigurationHolder interface { - mock.TestingT - Cleanup(func()) -} - -// NewConfigurationHolder creates a new instance of ConfigurationHolder. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewConfigurationHolder(t mockConstructorTestingTNewConfigurationHolder) *ConfigurationHolder { - mock := &ConfigurationHolder{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} From 4b2ce9f5e89a670ffbaa9c02f611e73722e3e426 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 14:32:40 +0200 Subject: [PATCH 463/467] remove unused files --- persistence/gormdatabase/helpers.go | 21 -------------- persistence/gormdatabase/helpers_test.go | 35 ------------------------ 2 files changed, 56 deletions(-) delete mode 100644 persistence/gormdatabase/helpers.go delete mode 100644 persistence/gormdatabase/helpers_test.go diff --git a/persistence/gormdatabase/helpers.go b/persistence/gormdatabase/helpers.go deleted file mode 100644 index 2b3c1669..00000000 --- a/persistence/gormdatabase/helpers.go +++ /dev/null @@ -1,21 +0,0 @@ -package gormdatabase - -import ( - "errors" - - "github.com/jackc/pgconn" -) - -func IsDuplicateKeyError(err error) bool { - // unique_violation code is equals to 23505 - return IsPostgresError(err, "23505") -} - -func IsPostgresError(err error, errCode string) bool { - var pgerr *pgconn.PgError - if ok := errors.As(err, &pgerr); ok { - return pgerr.Code == errCode - } - - return false -} diff --git a/persistence/gormdatabase/helpers_test.go b/persistence/gormdatabase/helpers_test.go deleted file mode 100644 index d63341d5..00000000 --- a/persistence/gormdatabase/helpers_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package gormdatabase - -import ( - "errors" - "testing" - - "github.com/jackc/pgconn" - "github.com/stretchr/testify/assert" -) - -func TestIsDuplicateError(t *testing.T) { - assert.False(t, IsDuplicateKeyError(errors.New("voila"))) - assert.False(t, IsDuplicateKeyError(&pgconn.PgError{ - Code: "235252551514", - })) - assert.True(t, IsDuplicateKeyError(&pgconn.PgError{ - Code: "23505", - })) -} - -func Test_isPostgresError(t *testing.T) { - var postgresErrorAsError error = &pgconn.PgError{Code: "1234"} - - assert.True(t, IsPostgresError( - postgresErrorAsError, - "1234", - )) - - postgresErrorAsError = &pgconn.PgError{Code: ""} - assert.False(t, IsPostgresError( - postgresErrorAsError, - "1234", - )) - assert.False(t, IsPostgresError(errors.New("a classic error"), "1234")) -} From 8526288f26d54793a6894d6092e4c789bd57fdfd Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 15:35:30 +0200 Subject: [PATCH 464/467] fix badaas quickstart docs --- docs/badaas/quickstart.rst | 45 ++++++++++++-------------------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/docs/badaas/quickstart.rst b/docs/badaas/quickstart.rst index 3bd0580e..bf2f3dbc 100644 --- a/docs/badaas/quickstart.rst +++ b/docs/badaas/quickstart.rst @@ -23,19 +23,20 @@ the configuration of this command: .. code-block:: go - var command = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ - Use: "badaas", - Short: "Backend and Distribution as a Service", - Run: runCommandFunc, + var rootCfg = verdeter.BuildVerdeterCommand(verdeter.VerdeterConfig{ + Use: "badaas-example", + Short: "Example of BadAss", + Long: "A HTTP server build over BadAas that uses its Login features", + Run: runHTTPServer, }) func main() { - err := configuration.NewCommandInitializer().Init(command) + err := configuration.NewCommandInitializer().Init(rootCfg) if err != nil { panic(err) } - command.Execute() + rootCfg.Execute() } Then, in the Run function of your command, you must use `fx` and start the badaas functions: @@ -44,6 +45,7 @@ Then, in the Run function of your command, you must use `fx` and start the badaa func runCommandFunc(cmd *cobra.Command, args []string) { fx.New( + fx.Provide(GetModels), badaas.BadaasModule, // Here you can add the functionalities provided by badaas @@ -58,12 +60,14 @@ To add them, you must initialise the corresponding module: func runCommandFunc(cmd *cobra.Command, args []string) { fx.New( + fx.Provide(GetModels), badaas.BadaasModule, fx.Provide(NewAPIVersion), // add routes provided by badaas - badaasControllers.InfoControllerModule, - badaasControllers.AuthControllerModule, + router.InfoRouteModule, + router.AuthRoutesModule, + // Here you can start the rest of the modules that your project uses. ).Run() } @@ -75,26 +79,5 @@ To add them, you must initialise the corresponding module: For details visit :doc:`functionalities`. Once you have defined the functionalities of your project (an http api for example), -you can generate everything you need to run your application using `badctl`. - -For installing it, use: - -.. code-block:: bash - - go install github.com/ditrit/badaas/tools/badctl - -Then generate files to make this project work with `cockroach` as database - -.. code-block:: bash - - badctl gen docker --db_provider cockroachdb - -For more information about `badctl` refer to :doc:`../badctl/index`. - -Finally, you can run the api with - -.. code-block:: bash - - make badaas_run - -The api will be available at . \ No newline at end of file +you can generate everything you need to run your application using `badctl`, +as described in the `README.md `_ of the example. \ No newline at end of file From fe37437fd98e17d0a6f36dda870e5c2cad3d86a9 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 16:57:11 +0200 Subject: [PATCH 465/467] Revert "(prs) remove eav model 2" This reverts commit 6732efe684c01ad6d8ece3d8c36736b3b0aa6467. --- controllers/utils.go | 68 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/controllers/utils.go b/controllers/utils.go index 6d0ed920..b265d7da 100644 --- a/controllers/utils.go +++ b/controllers/utils.go @@ -2,18 +2,29 @@ package controllers import ( "encoding/json" + "errors" + "io" "net/http" + "github.com/gorilla/mux" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/httperrors" ) -// HTTPErrRequestMalformed is sent when the request is malformed -var HTTPErrRequestMalformed httperrors.HTTPError = httperrors.NewHTTPError( - http.StatusBadRequest, - "Request malformed", - "The schema of the received data is not correct", - nil, - false, +var ( + // HTTPErrRequestMalformed is sent when the request is malformed + HTTPErrRequestMalformed httperrors.HTTPError = httperrors.NewHTTPError( + http.StatusBadRequest, + "Request malformed", + "The schema of the received data is not correct", + nil, + false, + ) + ErrEntityNotFound = httperrors.NewErrorNotFound("entity", "please use a valid object id") + ErrEntityTypeNotFound = httperrors.NewErrorNotFound("entity type", "please use a type that exists") + ErrIDNotAnUUID = httperrors.NewBadRequestError("id is not an uuid", "please use an uuid for the id value") ) // Decode json present in request body @@ -25,3 +36,46 @@ func decodeJSON(r *http.Request, to any) httperrors.HTTPError { return nil } + +// Decode json present in request body +func decodeJSONOptional(r *http.Request) (map[string]any, httperrors.HTTPError) { + to := map[string]any{} + err := json.NewDecoder(r.Body).Decode(&to) + + switch { + case errors.Is(err, io.EOF): + // empty body + return to, nil + case err != nil: + return nil, HTTPErrRequestMalformed + } + + return to, nil +} + +// Extract the "id" parameter from url +func getEntityIDFromRequest(r *http.Request) (badorm.UUID, httperrors.HTTPError) { + id, present := mux.Vars(r)["id"] + if !present { + return badorm.NilUUID, ErrEntityNotFound + } + + uuid, err := badorm.ParseUUID(id) + if err != nil { + return uuid, ErrIDNotAnUUID + } + + return uuid, nil +} + +func mapServiceError(err error) httperrors.HTTPError { + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return ErrEntityNotFound + } + + return httperrors.NewDBError(err) + } + + return nil +} From ab55d43cdd0692e9768d8a030f64ad71cd527d51 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 17:00:28 +0200 Subject: [PATCH 466/467] Revert "(prs) remove eav model" This reverts commit b547c0080b9153d344e94840bd5e7b1b7e55af92. --- changelog.md | 4 + controllers/eav.go | 165 ++++ controllers/eav_test.go | 700 ++++++++++++++ docs/badaas/functionalities.rst | 18 + docs/badaas/quickstart.rst | 1 + mocks/controllers/EAVController.go | 170 ++++ mocks/services/EAVService.go | 148 +++ persistence/models/Attribute.go | 80 ++ persistence/models/Attribute_test.go | 84 ++ persistence/models/Entity.go | 61 ++ persistence/models/EntityType.go | 17 + persistence/models/Entity_test.go | 75 ++ persistence/models/Value.go | 179 ++++ persistence/models/Value_test.go | 224 +++++ persistence/repository/EntityRepository.go | 198 ++++ .../repository/EntityRepository_test.go | 245 +++++ .../repository/EntityTypeRepository.go | 43 + persistence/repository/ValueRepository.go | 61 ++ router/ModuleFx.go | 22 + router/routes.go | 15 + router/routes_test.go | 27 + services/ModuleFx.go | 25 + services/eav.go | 248 +++++ services/transaction_executor.go | 42 + test_e2e/badaas_e2e_test.go | 58 ++ test_e2e/features/eav.feature | 128 +++ test_e2e/http_support_test.go | 203 ++++ test_e2e/test_api.go | 1 + testintegration/asserts.go | 29 + testintegration/badaas_test.go | 5 + testintegration/eavService.go | 881 ++++++++++++++++++ 31 files changed, 4157 insertions(+) create mode 100644 controllers/eav.go create mode 100644 controllers/eav_test.go create mode 100644 mocks/controllers/EAVController.go create mode 100644 mocks/services/EAVService.go create mode 100644 persistence/models/Attribute.go create mode 100644 persistence/models/Attribute_test.go create mode 100644 persistence/models/Entity.go create mode 100644 persistence/models/EntityType.go create mode 100644 persistence/models/Entity_test.go create mode 100644 persistence/models/Value.go create mode 100644 persistence/models/Value_test.go create mode 100644 persistence/repository/EntityRepository.go create mode 100644 persistence/repository/EntityRepository_test.go create mode 100644 persistence/repository/EntityTypeRepository.go create mode 100644 persistence/repository/ValueRepository.go create mode 100644 services/eav.go create mode 100644 services/transaction_executor.go create mode 100644 test_e2e/features/eav.feature create mode 100644 testintegration/eavService.go diff --git a/changelog.md b/changelog.md index 968e3255..98f72b64 100644 --- a/changelog.md +++ b/changelog.md @@ -31,6 +31,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add a dto that is returned on a successful login. - Update verdeter to version v0.4.0. - Add integration tests. +- Add a eav controller to store objects in EAV format. +- Add some examples of data models. +- Add transaction executor to run services that lead to multiples queries. +- Add repositories to manage querying to the database. - Transform BadAas into a library. - Add BadCtl tool. - Add BaDORM to facilitate queries on sql databases. diff --git a/controllers/eav.go b/controllers/eav.go new file mode 100644 index 00000000..ad299153 --- /dev/null +++ b/controllers/eav.go @@ -0,0 +1,165 @@ +package controllers + +import ( + "errors" + "fmt" + "net/http" + + "github.com/gorilla/mux" + "go.uber.org/zap" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/httperrors" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/services" +) + +type EAVController interface { + GetObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + GetObjects(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + UpdateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) + DeleteObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) +} + +// check interface compliance +var _ EAVController = (*eavControllerImpl)(nil) + +func NewEAVController( + logger *zap.Logger, + eavService services.EAVService, +) EAVController { + return &eavControllerImpl{ + logger: logger, + eavService: eavService, + } +} + +// The concrete implementation of the EAVController +type eavControllerImpl struct { + logger *zap.Logger + eavService services.EAVService +} + +// The handler responsible of the retrieval of one objects +func (controller *eavControllerImpl) GetObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) + if herr != nil { + return nil, herr + } + + entity, err := controller.eavService.GetEntity(entityTypeName, entityID) + + return entity, mapServiceError(err) +} + +// The handler responsible of the retrieval of multiple objects +func (controller *eavControllerImpl) GetObjects(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) + if herr != nil { + return nil, herr + } + + params, herr := decodeJSONOptional(r) + if herr != nil { + return nil, herr + } + + entities, err := controller.eavService.GetEntities(entityTypeName, params) + + return entities, mapEAVServiceError(err) +} + +// The handler responsible of the creation of a object +func (controller *eavControllerImpl) CreateObject(w http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) + if herr != nil { + return nil, herr + } + + attrs, herr := decodeJSONOptional(r) + if herr != nil { + return nil, herr + } + + entity, err := controller.eavService.CreateEntity(entityTypeName, attrs) + if err != nil { + return nil, mapEAVServiceError(err) + } + + w.Header().Add("Location", buildEAVLocationString(entity)) + w.WriteHeader(http.StatusCreated) + + return entity, nil +} + +func buildEAVLocationString(et *models.Entity) string { + return fmt.Sprintf("eav/objects/%s/%s", et.EntityType.Name, et.ID.String()) +} + +// The handler responsible for the updates of one object +func (controller *eavControllerImpl) UpdateObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) + if herr != nil { + return nil, herr + } + + attrs, herr := decodeJSONOptional(r) + if herr != nil { + return nil, herr + } + + entity, err := controller.eavService.UpdateEntity(entityTypeName, entityID, attrs) + + return entity, mapServiceError(err) +} + +// The handler responsible for the deletion of a object +func (controller *eavControllerImpl) DeleteObject(_ http.ResponseWriter, r *http.Request) (any, httperrors.HTTPError) { + entityTypeName, entityID, herr := controller.getEntityTypeNameAndEntityID(r) + if herr != nil { + return nil, herr + } + + err := controller.eavService.DeleteEntity(entityTypeName, entityID) + + return nil, mapServiceError(err) +} + +func mapEAVServiceError(err error) httperrors.HTTPError { + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return ErrEntityTypeNotFound + } + + return mapServiceError(err) + } + + return nil +} + +// Extract the "type" parameter from url +func (controller *eavControllerImpl) getEntityTypeNameFromRequest(r *http.Request) (string, httperrors.HTTPError) { + entityTypeName, present := mux.Vars(r)["type"] + if !present { + return "", ErrEntityTypeNotFound + } + + return entityTypeName, nil +} + +// Extract the "type" and "id" parameters from url +func (controller *eavControllerImpl) getEntityTypeNameAndEntityID(r *http.Request) (string, badorm.UUID, httperrors.HTTPError) { + entityTypeName, herr := controller.getEntityTypeNameFromRequest(r) + if herr != nil { + return "", badorm.NilUUID, herr + } + + entityID, herr := getEntityIDFromRequest(r) + if herr != nil { + return "", badorm.NilUUID, herr + } + + return entityTypeName, entityID, nil +} diff --git a/controllers/eav_test.go b/controllers/eav_test.go new file mode 100644 index 00000000..c4db104e --- /dev/null +++ b/controllers/eav_test.go @@ -0,0 +1,700 @@ +package controllers_test + +import ( + "errors" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/gorilla/mux" + "github.com/stretchr/testify/assert" + "go.uber.org/zap" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/controllers" + mockServices "github.com/ditrit/badaas/mocks/services" + "github.com/ditrit/badaas/persistence/models" +) + +var logger, _ = zap.NewDevelopment() + +// ----------------------- GetObject ----------------------- + +func TestGetWithoutTypeReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/", + strings.NewReader(""), + ) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestGetOfNotExistentTypeReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + uuid := badorm.NewUUID() + eavService. + On("GetEntity", "no-exists", uuid). + Return(nil, gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/no-exists/id", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + +func TestGetWithoutEntityIDReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/exists/", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + +func TestGetWithEntityIDNotUUIDReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/exists/not-uuid", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": "not-uuid"}) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrIDNotAnUUID) +} + +func TestGetWithEntityIDThatDoesNotExistReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := badorm.NewUUID() + + eavService. + On("GetEntity", entityType.Name, uuid). + Return(nil, gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) + + _, err := controller.GetObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + +func TestGetWithErrorInDBReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := badorm.NewUUID() + + eavService. + On("GetEntity", entityType.Name, uuid). + Return(nil, errors.New("db error")) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) + + _, err := controller.GetObject(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestGetWithCorrectIDReturnsObject(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + entity := &models.Entity{ + EntityType: entityType, + } + + uuid := badorm.NewUUID() + + eavService. + On("GetEntity", entityType.Name, uuid). + Return(entity, nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) + + entityReturned, err := controller.GetObject(response, request) + assert.Nil(t, err) + assert.Equal(t, entity, entityReturned) +} + +// ----------------------- GetAll ----------------------- + +func TestGetAllWithoutTypeReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/", + strings.NewReader(""), + ) + + _, err := controller.GetObjects(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestGetAllOfNotExistentTypeReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + eavService. + On("GetEntities", "no-exists", map[string]any{}). + Return(nil, gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/no-exists", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) + + _, err := controller.GetObjects(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestGetAllWithErrorInDBReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + eavService. + On("GetEntities", "no-exists", map[string]any{}). + Return(nil, errors.New("db error")) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/no-exists", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) + + _, err := controller.GetObjects(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestGetAllWithoutParams(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + entity1 := &models.Entity{ + EntityType: entityType, + } + entity2 := &models.Entity{ + EntityType: entityType, + } + + eavService. + On("GetEntities", entityType.Name, map[string]any{}). + Return([]*models.Entity{entity1, entity2}, nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/exists/", + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) + + entitiesReturned, err := controller.GetObjects(response, request) + assert.Nil(t, err) + assert.Len(t, entitiesReturned, 2) + assert.Contains(t, entitiesReturned, entity1) + assert.Contains(t, entitiesReturned, entity2) +} + +func TestGetAllWithParams(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + entity1 := &models.Entity{ + EntityType: entityType, + } + + eavService. + On("GetEntities", entityType.Name, map[string]any{"param1": "something"}). + Return([]*models.Entity{entity1}, nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/objects/exists/", + strings.NewReader("{\"param1\": \"something\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) + + entitiesReturned, err := controller.GetObjects(response, request) + assert.Nil(t, err) + assert.Len(t, entitiesReturned, 1) + assert.Contains(t, entitiesReturned, entity1) +} + +// ----------------------- DeleteObject ----------------------- + +func TestDeleteWithoutTypeReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodDelete, + "/objects/", + strings.NewReader(""), + ) + + _, err := controller.DeleteObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestDeleteOfNotExistentTypeReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + uuid := badorm.NewUUID() + + eavService. + On("DeleteEntity", "no-exists", uuid). + Return(gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodDelete, + "/objects/no-exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) + + _, err := controller.DeleteObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + +func TestDeleteObjectWithErrorInDBReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := badorm.NewUUID() + + eavService. + On("DeleteEntity", entityType.Name, uuid). + Return(errors.New("db error")) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodDelete, + "/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) + + _, err := controller.DeleteObject(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestDeleteObjectReturnsNil(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := badorm.NewUUID() + + eavService. + On("DeleteEntity", entityType.Name, uuid). + Return(nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodDelete, + "/objects/exists/"+uuid.String(), + strings.NewReader(""), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) + + returned, err := controller.DeleteObject(response, request) + assert.Nil(t, err) + assert.Nil(t, returned) +} + +// ----------------------- CreateObject ----------------------- + +func TestCreateWithoutTypeReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodPost, + "/objects/", + strings.NewReader(""), + ) + + _, err := controller.CreateObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestCreateObjectWithBadJSONReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodPost, + "/objects/exists", + strings.NewReader("bad json"), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) + + _, err := controller.CreateObject(response, request) + assert.ErrorContains(t, err, "The schema of the received data is not correct") +} + +func TestCreateOfNotExistentTypeReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + eavService. + On("CreateEntity", "no-exists", map[string]any{"1": "1"}). + Return(nil, gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodPost, + "/objects/no-exists", + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists"}) + + _, err := controller.CreateObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestCreteObjectWithErrorInDBReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + eavService. + On("CreateEntity", entityType.Name, map[string]any{"1": "1"}). + Return(nil, errors.New("db error")) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodPost, + "/objects/exists", + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) + + _, err := controller.CreateObject(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestCreteObjectReturnsObject(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + entity := &models.Entity{ + EntityType: entityType, + } + + eavService. + On("CreateEntity", entityType.Name, map[string]any{"1": "1"}). + Return(entity, nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodPost, + "/objects/exists", + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name}) + + responded, err := controller.CreateObject(response, request) + assert.Nil(t, err) + assert.Equal(t, entity, responded) +} + +// ----------------------- UpdateObject ----------------------- + +func TestModifyWithoutTypeReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodPut, + "/objects/", + strings.NewReader(""), + ) + + _, err := controller.UpdateObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityTypeNotFound) +} + +func TestUpdateObjectWithBadJSONReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := badorm.NewUUID() + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodPut, + "/objects/exists", + strings.NewReader("bad json"), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) + + _, err := controller.UpdateObject(response, request) + assert.ErrorContains(t, err, "The schema of the received data is not correct") +} + +func TestModifyOfNotExistentTypeReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + uuid := badorm.NewUUID() + + eavService. + On("UpdateEntity", "no-exists", uuid, map[string]any{"1": "1"}). + Return(nil, gorm.ErrRecordNotFound) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodPost, + "/objects/no-exists", + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": "no-exists", "id": uuid.String()}) + + _, err := controller.UpdateObject(response, request) + assert.ErrorIs(t, err, controllers.ErrEntityNotFound) +} + +func TestUpdateObjectWithErrorInDBReturnsError(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := badorm.NewUUID() + + eavService. + On("UpdateEntity", entityType.Name, uuid, map[string]any{"1": "1"}). + Return(nil, errors.New("db error")) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodPut, + "/objects/exists/"+uuid.String(), + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) + + _, err := controller.UpdateObject(response, request) + assert.ErrorContains(t, err, "db error") +} + +func TestUpdateObjectReturnsObject(t *testing.T) { + eavService := mockServices.NewEAVService(t) + + entityType := &models.EntityType{ + Name: "entityType", + } + + uuid := badorm.NewUUID() + entity := &models.Entity{ + EntityType: entityType, + } + + eavService. + On("UpdateEntity", entityType.Name, uuid, map[string]any{"1": "1"}). + Return(entity, nil) + + controller := controllers.NewEAVController( + logger, + eavService, + ) + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodPut, + "/objects/exists/"+uuid.String(), + strings.NewReader("{\"1\": \"1\"}"), + ) + request = mux.SetURLVars(request, map[string]string{"type": entityType.Name, "id": uuid.String()}) + + responded, err := controller.UpdateObject(response, request) + assert.Nil(t, err) + assert.Equal(t, entity, responded) +} diff --git a/docs/badaas/functionalities.rst b/docs/badaas/functionalities.rst index 61104afd..46cda02e 100644 --- a/docs/badaas/functionalities.rst +++ b/docs/badaas/functionalities.rst @@ -39,4 +39,22 @@ which allow us to add authentication to our application in a simple way: // add /login and /logout routes provided by badaas badaasControllers.AuthControllerModule, ).Run() + } + +EAVControllerModule +------------------------------- + +`EAVControllerModule` adds `/eav/objects/{type}` and `/eav/objects/{type}/{id}`, +where `{type}` is any defined type and `{id}` is any uuid. These routes allow us to create, +read, update and remove objects using an EAV model. For more information on how to use them, +see the `example `_. + +.. code-block:: go + + func runCommandFunc(cmd *cobra.Command, args []string) { + fx.New( + badaas.BadaasModule, + + badaasControllers.EAVControllerModule, + ).Run() } \ No newline at end of file diff --git a/docs/badaas/quickstart.rst b/docs/badaas/quickstart.rst index bf2f3dbc..7055f5fd 100644 --- a/docs/badaas/quickstart.rst +++ b/docs/badaas/quickstart.rst @@ -67,6 +67,7 @@ To add them, you must initialise the corresponding module: // add routes provided by badaas router.InfoRouteModule, router.AuthRoutesModule, + router.EAVRoutesModule, // Here you can start the rest of the modules that your project uses. ).Run() diff --git a/mocks/controllers/EAVController.go b/mocks/controllers/EAVController.go new file mode 100644 index 00000000..d9c4a47b --- /dev/null +++ b/mocks/controllers/EAVController.go @@ -0,0 +1,170 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + http "net/http" + + httperrors "github.com/ditrit/badaas/httperrors" + mock "github.com/stretchr/testify/mock" +) + +// EAVController is an autogenerated mock type for the EAVController type +type EAVController struct { + mock.Mock +} + +// CreateObject provides a mock function with given fields: w, r +func (_m *EAVController) CreateObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// DeleteObject provides a mock function with given fields: w, r +func (_m *EAVController) DeleteObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// GetObject provides a mock function with given fields: w, r +func (_m *EAVController) GetObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// GetObjects provides a mock function with given fields: w, r +func (_m *EAVController) GetObjects(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +// UpdateObject provides a mock function with given fields: w, r +func (_m *EAVController) UpdateObject(w http.ResponseWriter, r *http.Request) (interface{}, httperrors.HTTPError) { + ret := _m.Called(w, r) + + var r0 interface{} + var r1 httperrors.HTTPError + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) (interface{}, httperrors.HTTPError)); ok { + return rf(w, r) + } + if rf, ok := ret.Get(0).(func(http.ResponseWriter, *http.Request) interface{}); ok { + r0 = rf(w, r) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(interface{}) + } + } + + if rf, ok := ret.Get(1).(func(http.ResponseWriter, *http.Request) httperrors.HTTPError); ok { + r1 = rf(w, r) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(httperrors.HTTPError) + } + } + + return r0, r1 +} + +type mockConstructorTestingTNewEAVController interface { + mock.TestingT + Cleanup(func()) +} + +// NewEAVController creates a new instance of EAVController. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewEAVController(t mockConstructorTestingTNewEAVController) *EAVController { + mock := &EAVController{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/mocks/services/EAVService.go b/mocks/services/EAVService.go new file mode 100644 index 00000000..20d3719f --- /dev/null +++ b/mocks/services/EAVService.go @@ -0,0 +1,148 @@ +// Code generated by mockery v2.20.0. DO NOT EDIT. + +package mocks + +import ( + badorm "github.com/ditrit/badaas/badorm" + mock "github.com/stretchr/testify/mock" + + models "github.com/ditrit/badaas/persistence/models" +) + +// EAVService is an autogenerated mock type for the EAVService type +type EAVService struct { + mock.Mock +} + +// CreateEntity provides a mock function with given fields: entityTypeName, attributeValues +func (_m *EAVService) CreateEntity(entityTypeName string, attributeValues map[string]interface{}) (*models.Entity, error) { + ret := _m.Called(entityTypeName, attributeValues) + + var r0 *models.Entity + var r1 error + if rf, ok := ret.Get(0).(func(string, map[string]interface{}) (*models.Entity, error)); ok { + return rf(entityTypeName, attributeValues) + } + if rf, ok := ret.Get(0).(func(string, map[string]interface{}) *models.Entity); ok { + r0 = rf(entityTypeName, attributeValues) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*models.Entity) + } + } + + if rf, ok := ret.Get(1).(func(string, map[string]interface{}) error); ok { + r1 = rf(entityTypeName, attributeValues) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DeleteEntity provides a mock function with given fields: entityTypeName, entityID +func (_m *EAVService) DeleteEntity(entityTypeName string, entityID badorm.UUID) error { + ret := _m.Called(entityTypeName, entityID) + + var r0 error + if rf, ok := ret.Get(0).(func(string, badorm.UUID) error); ok { + r0 = rf(entityTypeName, entityID) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// GetEntities provides a mock function with given fields: entityTypeName, conditions +func (_m *EAVService) GetEntities(entityTypeName string, conditions map[string]interface{}) ([]*models.Entity, error) { + ret := _m.Called(entityTypeName, conditions) + + var r0 []*models.Entity + var r1 error + if rf, ok := ret.Get(0).(func(string, map[string]interface{}) ([]*models.Entity, error)); ok { + return rf(entityTypeName, conditions) + } + if rf, ok := ret.Get(0).(func(string, map[string]interface{}) []*models.Entity); ok { + r0 = rf(entityTypeName, conditions) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*models.Entity) + } + } + + if rf, ok := ret.Get(1).(func(string, map[string]interface{}) error); ok { + r1 = rf(entityTypeName, conditions) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetEntity provides a mock function with given fields: entityTypeName, id +func (_m *EAVService) GetEntity(entityTypeName string, id badorm.UUID) (*models.Entity, error) { + ret := _m.Called(entityTypeName, id) + + var r0 *models.Entity + var r1 error + if rf, ok := ret.Get(0).(func(string, badorm.UUID) (*models.Entity, error)); ok { + return rf(entityTypeName, id) + } + if rf, ok := ret.Get(0).(func(string, badorm.UUID) *models.Entity); ok { + r0 = rf(entityTypeName, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*models.Entity) + } + } + + if rf, ok := ret.Get(1).(func(string, badorm.UUID) error); ok { + r1 = rf(entityTypeName, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// UpdateEntity provides a mock function with given fields: entityTypeName, entityID, newValues +func (_m *EAVService) UpdateEntity(entityTypeName string, entityID badorm.UUID, newValues map[string]interface{}) (*models.Entity, error) { + ret := _m.Called(entityTypeName, entityID, newValues) + + var r0 *models.Entity + var r1 error + if rf, ok := ret.Get(0).(func(string, badorm.UUID, map[string]interface{}) (*models.Entity, error)); ok { + return rf(entityTypeName, entityID, newValues) + } + if rf, ok := ret.Get(0).(func(string, badorm.UUID, map[string]interface{}) *models.Entity); ok { + r0 = rf(entityTypeName, entityID, newValues) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*models.Entity) + } + } + + if rf, ok := ret.Get(1).(func(string, badorm.UUID, map[string]interface{}) error); ok { + r1 = rf(entityTypeName, entityID, newValues) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +type mockConstructorTestingTNewEAVService interface { + mock.TestingT + Cleanup(func()) +} + +// NewEAVService creates a new instance of EAVService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewEAVService(t mockConstructorTestingTNewEAVService) *EAVService { + mock := &EAVService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/persistence/models/Attribute.go b/persistence/models/Attribute.go new file mode 100644 index 00000000..459d454c --- /dev/null +++ b/persistence/models/Attribute.go @@ -0,0 +1,80 @@ +package models + +import ( + "errors" + "fmt" + + "github.com/ditrit/badaas/badorm" +) + +// Describe the type of an attribute +type ValueTypeT string + +const ( + RelationValueType ValueTypeT = "relation" + BooleanValueType ValueTypeT = "bool" + StringValueType ValueTypeT = "string" + IntValueType ValueTypeT = "int" + FloatValueType ValueTypeT = "float" +) + +// Describe the attribute of a en EntityType +type Attribute struct { + badorm.UUIDModel + Name string `gorm:"uniqueIndex:unique_name_entity_type;type:varchar(255)"` + Unique bool // TODO validate this + Required bool + + Default bool // if there is a default value + + // Default values, only if Default == true + DefaultInt int + DefaultBool bool + DefaultString string + DefaultFloat float64 + + ValueType ValueTypeT // the type the values of this attr are. Can be "int", "float", "string", "bool", "relation" + // id of the EntityType to which a RelationValueType points to. Only if ValueType == RelationValueType + RelationTargetEntityTypeID badorm.UUID `gorm:"foreignKey:EntityType;index:fk_relation_target_entity_type"` + + // GORM relations + EntityTypeID badorm.UUID `gorm:"uniqueIndex:unique_name_entity_type"` +} + +var ErrNoDefaultValueSet = errors.New("no default value found") + +func NewRelationAttribute(entityType *EntityType, name string, + unique bool, required bool, + relationTargetEntityType *EntityType, +) *Attribute { + return &Attribute{ + EntityTypeID: entityType.ID, + Name: name, + ValueType: RelationValueType, + Required: required, + Unique: unique, + RelationTargetEntityTypeID: relationTargetEntityType.ID, + } +} + +// Get a new value with the default value associated with the attribute +func (a *Attribute) GetNewDefaultValue() (*Value, error) { + if !a.Default { + return nil, ErrNoDefaultValueSet + } + + switch a.ValueType { + case StringValueType: + return NewStringValue(a, a.DefaultString) + case IntValueType: + return NewIntValue(a, a.DefaultInt) + case FloatValueType: + return NewFloatValue(a, a.DefaultFloat) + case BooleanValueType: + return NewBoolValue(a, a.DefaultBool) + case RelationValueType: + return nil, fmt.Errorf("can't provide default value for relations") + default: + return nil, fmt.Errorf("unsupported ValueType") + } +} diff --git a/persistence/models/Attribute_test.go b/persistence/models/Attribute_test.go new file mode 100644 index 00000000..e9120baf --- /dev/null +++ b/persistence/models/Attribute_test.go @@ -0,0 +1,84 @@ +package models + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewDefaultValueReturnsErrorIfNotDefault(t *testing.T) { + attr := &Attribute{ + Default: false, + } + + _, err := attr.GetNewDefaultValue() + assert.ErrorIs(t, err, ErrNoDefaultValueSet) +} + +func TestNewDefaultValueReturnsDefaultIntForInt(t *testing.T) { + attr := &Attribute{ + ValueType: IntValueType, + Default: true, + DefaultInt: 1, + } + + value, err := attr.GetNewDefaultValue() + assert.Nil(t, err) + assert.Equal(t, 1, value.Value()) +} + +func TestNewDefaultValueReturnsDefaultFloatForFloat(t *testing.T) { + attr := &Attribute{ + ValueType: FloatValueType, + Default: true, + DefaultFloat: 1.0, + } + + value, err := attr.GetNewDefaultValue() + assert.Nil(t, err) + assert.Equal(t, 1.0, value.Value()) +} + +func TestNewDefaultValueReturnsDefaultStringForString(t *testing.T) { + attr := &Attribute{ + ValueType: StringValueType, + Default: true, + DefaultString: "salut", + } + + value, err := attr.GetNewDefaultValue() + assert.Nil(t, err) + assert.Equal(t, "salut", value.Value()) +} + +func TestNewDefaultValueReturnsDefaultBoolForBool(t *testing.T) { + attr := &Attribute{ + ValueType: BooleanValueType, + Default: true, + DefaultBool: true, + } + + value, err := attr.GetNewDefaultValue() + assert.Nil(t, err) + assert.Equal(t, true, value.Value()) +} + +func TestNewDefaultValueReturnsErrorForRelation(t *testing.T) { + attr := &Attribute{ + Default: true, + ValueType: RelationValueType, + } + + _, err := attr.GetNewDefaultValue() + assert.Error(t, err, "can't provide default value for relations") +} + +func TestNewDefaultValueReturnsErrorForUnsupportedType(t *testing.T) { + attr := &Attribute{ + Default: true, + ValueType: "something else", + } + + _, err := attr.GetNewDefaultValue() + assert.Error(t, err, "unsupported ValueType") +} diff --git a/persistence/models/Entity.go b/persistence/models/Entity.go new file mode 100644 index 00000000..e5e2fc0a --- /dev/null +++ b/persistence/models/Entity.go @@ -0,0 +1,61 @@ +package models + +import ( + "encoding/json" + + "github.com/ditrit/badaas/badorm" +) + +// Describe an instance of an EntityType +type Entity struct { + badorm.UUIDModel + Fields []*Value + + // GORM relations + EntityTypeID badorm.UUID + EntityType *EntityType +} + +func NewEntity(entityType *EntityType) *Entity { + return &Entity{ + EntityType: entityType, + EntityTypeID: entityType.ID, + } +} + +// Encode the entity to json +// use the [encoding/json.Marshaler] interface +func (e *Entity) MarshalJSON() ([]byte, error) { + dto := make(map[string]any) + dto["id"] = e.ID + dto["type"] = e.EntityType.Name + dto["createdAt"] = e.CreatedAt + dto["updatedAt"] = e.UpdatedAt + dto["attrs"] = e.encodeValues() + + return json.Marshal(dto) +} + +// return the values in a json encoded string +func (e *Entity) encodeValues() map[string]any { + pairs := make(map[string]any, len(e.Fields)) + + for _, field := range e.Fields { + if field.IsNull { + continue + } + + pairs[field.Attribute.Name] = field.Value() + } + + return pairs +} + +func (e Entity) Equal(other Entity) bool { + return e.ID == other.ID && + e.EntityType.ID == other.EntityType.ID +} + +func (Entity) TableName() string { + return "entities" +} diff --git a/persistence/models/EntityType.go b/persistence/models/EntityType.go new file mode 100644 index 00000000..6bd6406a --- /dev/null +++ b/persistence/models/EntityType.go @@ -0,0 +1,17 @@ +package models + +import "github.com/ditrit/badaas/badorm" + +// Describe an object type +type EntityType struct { + badorm.UUIDModel + Name string `gorm:"unique;not null"` + + // GORM relations + Attributes []*Attribute +} + +func (et EntityType) Equal(other EntityType) bool { + return et.ID == other.ID && + et.Name == other.Name +} diff --git a/persistence/models/Entity_test.go b/persistence/models/Entity_test.go new file mode 100644 index 00000000..8ba27d48 --- /dev/null +++ b/persistence/models/Entity_test.go @@ -0,0 +1,75 @@ +package models + +import ( + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + + "github.com/ditrit/badaas/badorm" +) + +func TestMarshall(t *testing.T) { + id := badorm.UUID(uuid.MustParse("11e1d4b8-701d-47cc-852f-6d36922bcc75")) + ett := &EntityType{ + UUIDModel: badorm.UUIDModel{ID: id}, + Name: "bird", + Attributes: []*Attribute{ + { + UUIDModel: badorm.UUIDModel{ + ID: id, + }, + Name: "color", + DefaultString: "red", + ValueType: StringValueType, + EntityTypeID: id, + }, + { + UUIDModel: badorm.UUIDModel{ + ID: id, + }, + Name: "heigh", + ValueType: IntValueType, + EntityTypeID: id, + }, + }, + } + + et := &Entity{ + UUIDModel: badorm.UUIDModel{ + ID: id, + }, + Fields: []*Value{ + { + UUIDModel: badorm.UUIDModel{ + ID: id, + }, + + IsNull: false, + StringVal: "blue", + EntityID: id, + AttributeID: id, + Attribute: ett.Attributes[0], + }, + { + UUIDModel: badorm.UUIDModel{ + ID: id, + }, + + IsNull: true, + EntityID: id, + AttributeID: id, + Attribute: ett.Attributes[1], + }, + }, + EntityTypeID: id, + EntityType: ett, + } + + p, _ := et.MarshalJSON() + assert.JSONEq( + t, + `{"attrs":{"color":"blue"},"id":"11e1d4b8-701d-47cc-852f-6d36922bcc75","type":"bird", "createdAt":"0001-01-01T00:00:00Z", "updatedAt":"0001-01-01T00:00:00Z"}`, //nolint:lll + string(p), + ) +} diff --git a/persistence/models/Value.go b/persistence/models/Value.go new file mode 100644 index 00000000..908d6f55 --- /dev/null +++ b/persistence/models/Value.go @@ -0,0 +1,179 @@ +package models + +import ( + "errors" + "fmt" + + "github.com/ditrit/badaas/badorm" +) + +// Describe the attribute value of an Entity +type Value struct { + badorm.UUIDModel + IsNull bool + StringVal string + FloatVal float64 + IntVal int + BoolVal bool + RelationVal badorm.UUID `gorm:"foreignKey:Entity;index:fk_relation_val_entity"` + + // GORM relations + EntityID badorm.UUID `gorm:"uniqueIndex:unique_entity_attribute"` + AttributeID badorm.UUID `gorm:"uniqueIndex:unique_entity_attribute"` + Attribute *Attribute +} + +func (Value) TableName() string { + // rename table as values can be a keyword (in MySQL for example) + return "values_" +} + +var ErrAskingForWrongType = errors.New("attribute type doesn't match") + +// Create a new null value +func NewNullValue(attr *Attribute) (*Value, error) { + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetNull() +} + +// Create a new int value +func NewIntValue(attr *Attribute, i int) (*Value, error) { + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetIntVal(i) +} + +// Create a new bool value +func NewBoolValue(attr *Attribute, b bool) (*Value, error) { + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetBooleanVal(b) +} + +// Create a new float value +func NewFloatValue(attr *Attribute, f float64) (*Value, error) { + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetFloatVal(f) +} + +// Create a new string value +func NewStringValue(attr *Attribute, s string) (*Value, error) { + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetStringVal(s) +} + +// Create a new relation value. +// If et is nil, then the function returns an error +// If et is of the wrong types, then the function returns an error +func NewRelationValue(attr *Attribute, et *Entity) (*Value, error) { + value := &Value{Attribute: attr, AttributeID: attr.ID} + return value, value.SetRelationVal(et) +} + +// Return the underlying value as an interface +func (v *Value) Value() any { + if v.IsNull { + return nil + } + + switch v.Attribute.ValueType { + case StringValueType: + return v.StringVal + case IntValueType: + return v.IntVal + case FloatValueType: + return v.FloatVal + case BooleanValueType: + return v.BoolVal + case RelationValueType: + return v.RelationVal + } + + return nil +} + +func (v *Value) SetNull() error { + if v.Attribute.Required { + return fmt.Errorf("can't set null value for a required attribute") + } + + v.IsNull = true + v.IntVal = 0 + v.FloatVal = 0.0 + v.StringVal = "" + v.BoolVal = false + v.RelationVal = badorm.NilUUID + + return nil +} + +func (v *Value) SetStringVal(stringVal string) error { + if v.Attribute.ValueType != StringValueType { + return ErrAskingForWrongType + } + + v.IsNull = false + v.StringVal = stringVal + + return nil +} + +func (v *Value) SetIntVal(intVal int) error { + if v.Attribute.ValueType != IntValueType { + return ErrAskingForWrongType + } + + v.IsNull = false + v.IntVal = intVal + + return nil +} + +func (v *Value) SetFloatVal(floatVal float64) error { + if v.Attribute.ValueType != FloatValueType { + return ErrAskingForWrongType + } + + v.IsNull = false + v.FloatVal = floatVal + + return nil +} + +func (v *Value) SetBooleanVal(boolVal bool) error { + if v.Attribute.ValueType != BooleanValueType { + return ErrAskingForWrongType + } + + v.IsNull = false + v.BoolVal = boolVal + + return nil +} + +func (v *Value) SetRelationVal(entity *Entity) error { + if entity == nil { + return fmt.Errorf("can't create a new relation with a nil entity pointer") + } + + if v.Attribute.ValueType != RelationValueType { + return ErrAskingForWrongType + } + + if entity.EntityType.ID != v.Attribute.RelationTargetEntityTypeID { + return fmt.Errorf( + "can't create a relation with an entity of wrong EntityType (got the entityTypeID=%s, expected=%s)", + entity.EntityType.ID.String(), v.Attribute.RelationTargetEntityTypeID.String(), + ) + } + + v.IsNull = false + v.RelationVal = entity.ID + + return nil +} + +func (v Value) Equal(other Value) bool { + return v.ID == other.ID && + v.AttributeID == other.AttributeID && + v.EntityID == other.EntityID && + v.Value() == other.Value() +} diff --git a/persistence/models/Value_test.go b/persistence/models/Value_test.go new file mode 100644 index 00000000..2f0fba8c --- /dev/null +++ b/persistence/models/Value_test.go @@ -0,0 +1,224 @@ +package models + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/ditrit/badaas/badorm" +) + +func TestRelationValueNeedsEntity(t *testing.T) { + brandEtt := &EntityType{ + Name: "brand", + } + + carEtt := &EntityType{ + Name: "car", + } + brandAttr := NewRelationAttribute(carEtt, "brand", false, true, brandEtt) + carEtt.Attributes = []*Attribute{brandAttr} + + _, err := NewRelationValue(brandAttr, nil) + assert.Error(t, err, "can't create a new relation with a nil entity pointer") +} + +func TestRelationValueEntityHasToBeTheTargetOfTheAttribute(t *testing.T) { + brandEttID := badorm.NewUUID() + carEttID := badorm.NewUUID() + + brandEtt := &EntityType{ + UUIDModel: badorm.UUIDModel{ + ID: brandEttID, + }, + Name: "brand", + } + + carEtt := &EntityType{ + UUIDModel: badorm.UUIDModel{ + ID: carEttID, + }, + Name: "car", + } + brandAttr := NewRelationAttribute(carEtt, "brand", false, true, brandEtt) + carEtt.Attributes = []*Attribute{brandAttr} + + car := &Entity{ + EntityType: carEtt, + } + + _, err := NewRelationValue(brandAttr, car) + assert.Error( + t, err, + fmt.Sprintf( + "can't create a relation with an entity of wrong EntityType (got the entityTypeID=%s, expected=%s)", + carEttID.String(), + brandEttID.String(), + ), + ) +} + +func TestRelationValueWithCorrespondingEntity(t *testing.T) { + brandEtt := &EntityType{ + UUIDModel: badorm.UUIDModel{ + ID: badorm.NewUUID(), + }, + Name: "brand", + } + + carEtt := &EntityType{ + UUIDModel: badorm.UUIDModel{ + ID: badorm.NewUUID(), + }, + Name: "car", + } + brandAttr := NewRelationAttribute(carEtt, "brand", false, true, brandEtt) + carEtt.Attributes = []*Attribute{brandAttr} + + brand := &Entity{ + EntityType: brandEtt, + } + + value, err := NewRelationValue(brandAttr, brand) + assert.Nil(t, err) + + assert.Equal(t, value.Value(), brand.ID) +} + +func TestNewNullValueRespondErrorIfAttributeIsRequired(t *testing.T) { + requiredAttr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + Required: true, + } + + _, err := NewNullValue(requiredAttr) + assert.Error(t, err, "can't create new null value for a required attribute") +} + +func TestNewNullValueWorksIfAttributeIsNotRequired(t *testing.T) { + notRequiredAttr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + Required: false, + } + + value, err := NewNullValue(notRequiredAttr) + assert.Nil(t, err) + assert.Nil(t, value.Value()) +} + +func TestNewIntValueRespondErrorIsAttributeIfNotIntType(t *testing.T) { + stringAttr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + } + + _, err := NewIntValue(stringAttr, 5) + assert.ErrorIs(t, err, ErrAskingForWrongType) +} + +func TestNewIntValueWorks(t *testing.T) { + intAttr := &Attribute{ + Name: "attr", + ValueType: IntValueType, + } + + value, err := NewIntValue(intAttr, 5) + assert.Nil(t, err) + assert.Equal(t, value.Value(), 5) +} + +func TestNewFloatValueRespondErrorIsAttributeIfNotFloatType(t *testing.T) { + stringAttr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + } + + _, err := NewFloatValue(stringAttr, 5.5) + assert.ErrorIs(t, err, ErrAskingForWrongType) +} + +func TestNewFloatValueWorks(t *testing.T) { + attr := &Attribute{ + Name: "attr", + ValueType: FloatValueType, + } + + value, err := NewFloatValue(attr, 5.5) + assert.Nil(t, err) + assert.Equal(t, value.Value(), 5.5) +} + +func TestNewBoolValueRespondErrorIsAttributeIfNotBoolType(t *testing.T) { + stringAttr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + } + + _, err := NewBoolValue(stringAttr, true) + assert.ErrorIs(t, err, ErrAskingForWrongType) +} + +func TestNewBoolValueWorks(t *testing.T) { + attr := &Attribute{ + Name: "attr", + ValueType: BooleanValueType, + } + + value, err := NewBoolValue(attr, true) + assert.Nil(t, err) + assert.Equal(t, value.Value(), true) +} + +func TestNewStringValueRespondErrorIsAttributeIfNotStringType(t *testing.T) { + boolAttr := &Attribute{ + Name: "attr", + ValueType: BooleanValueType, + } + + _, err := NewStringValue(boolAttr, "salut") + assert.ErrorIs(t, err, ErrAskingForWrongType) +} + +func TestNewStringValueWorks(t *testing.T) { + attr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + } + + value, err := NewStringValue(attr, "salut") + assert.Nil(t, err) + assert.Equal(t, value.Value(), "salut") +} + +func TestNewRelationValueRespondErrorIsAttributeIfNotRelationType(t *testing.T) { + brandEtt := &EntityType{ + Name: "brand", + } + brand := &Entity{ + EntityType: brandEtt, + } + + boolAttr := &Attribute{ + Name: "attr", + ValueType: BooleanValueType, + } + + _, err := NewRelationValue(boolAttr, brand) + assert.ErrorIs(t, err, ErrAskingForWrongType) +} + +func TestSetNullWorks(t *testing.T) { + attr := &Attribute{ + Name: "attr", + ValueType: StringValueType, + } + + value, err := NewStringValue(attr, "salut") + assert.Nil(t, err) + err = value.SetNull() + assert.Nil(t, err) + assert.Nil(t, value.Value()) +} diff --git a/persistence/repository/EntityRepository.go b/persistence/repository/EntityRepository.go new file mode 100644 index 00000000..41832356 --- /dev/null +++ b/persistence/repository/EntityRepository.go @@ -0,0 +1,198 @@ +package repository + +import ( + "fmt" + "time" + + sq "github.com/Masterminds/squirrel" + "github.com/elliotchance/pie/v2" + "go.uber.org/zap" + "gorm.io/driver/postgres" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/persistence/models" +) + +type EntityRepository struct { + logger *zap.Logger + valueRepository *ValueRepository +} + +func NewEntityRepository( + logger *zap.Logger, + valueRepository *ValueRepository, +) *EntityRepository { + return &EntityRepository{ + logger: logger, + valueRepository: valueRepository, + } +} + +// Get the Entity of type with name "entityTypeName" that has the "id" +func (r *EntityRepository) Get(tx *gorm.DB, entityTypeName string, id badorm.UUID) (*models.Entity, error) { + var entity models.Entity + + query := tx.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType") + query = query.Joins( + `JOIN entity_types ON + entity_types.id = entities.entity_type_id`, + ) + + err := query.Where( + map[string]any{"entities.id": id, "entity_types.name": entityTypeName}, + ).First(&entity).Error + if err != nil { + return nil, err + } + + return &entity, nil +} + +var postgresDialectorName string = postgres.Dialector{}.Name() + +// Creates an entity and its values in the database +// must be used in place of gorm's db.Save(entity) because of the bug +// when using gorm with cockroachDB. For more info refer to: +// https://github.com/FrancoLiberali/cockroachdb_gorm_bug +func (r *EntityRepository) Create(tx *gorm.DB, entity *models.Entity) error { + if tx.Dialector.Name() != postgresDialectorName { + // in other than cockroachDB gorm's Save can be used normally + return tx.Save(entity).Error + } + + now := time.Now() + + entity.ID = badorm.NewUUID() + + query, values, err := sq.Insert("entities"). + Columns("id", "created_at", "updated_at", "entity_type_id"). + Values(entity.ID, now, now, entity.EntityType.ID). + PlaceholderFormat(sq.Dollar).ToSql() + if err != nil { + return err + } + + err = tx.Exec(query, values...).Error + if err != nil { + return err + } + + pie.Each(entity.Fields, func(value *models.Value) { + value.EntityID = entity.ID + }) + + if len(entity.Fields) > 0 { + err = r.valueRepository.Create(tx, entity.Fields) + if err != nil { + return err + } + } + + return nil +} + +// Adds to the "query" the verification that the value for "attribute" is "expectedValue" +func (r *EntityRepository) AddValueCheckToQuery(query *gorm.DB, attributeName string, expectedValue any) error { + return r.addValueCheckToQueryInternal(query, attributeName, expectedValue, "") +} + +// Adds to the "query" the verification that the value for "attribute" is "expectedValue" +func (r *EntityRepository) addValueCheckToQueryInternal(query *gorm.DB, attributeName string, expectedValue any, entitiesTableSuffix string) error { + attributesSuffix := entitiesTableSuffix + "_" + attributeName + queryArgs := []any{attributeName} + stringQuery := fmt.Sprintf( + `JOIN attributes attributes%[1]s ON + attributes%[1]s.entity_type_id = entities%[2]s.entity_type_id + AND attributes%[1]s.name = ? + JOIN values_ values%[1]s ON + values%[1]s.attribute_id = attributes%[1]s.id + AND values%[1]s.entity_id = entities%[2]s.id + `, + attributesSuffix, + entitiesTableSuffix, + ) + + switch expectedValueTyped := expectedValue.(type) { + case float64: + stringQuery += fmt.Sprintf( + "AND ((%s) OR (%s))", + getQueryCheckValueOfType(attributesSuffix, models.IntValueType), + getQueryCheckValueOfType(attributesSuffix, models.FloatValueType), + ) + + queryArgs = append(queryArgs, expectedValue, expectedValue) + case bool: + stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.BooleanValueType) + + queryArgs = append(queryArgs, expectedValue) + case string: + uuid, err := badorm.ParseUUID(expectedValueTyped) + if err == nil { + stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.RelationValueType) + + queryArgs = append(queryArgs, uuid) + } else { + stringQuery += "AND " + getQueryCheckValueOfType(attributesSuffix, models.StringValueType) + + queryArgs = append(queryArgs, expectedValue) + } + case nil: + stringQuery += fmt.Sprintf( + "AND values%[1]s.is_null = ?", + attributesSuffix, + ) + + queryArgs = append(queryArgs, true) + case map[string]any: + return r.addJoinToQuery( + query, attributeName, expectedValueTyped, + attributesSuffix, stringQuery, + ) + default: + return fmt.Errorf("unsupported type") + } + + query.Joins(stringQuery, queryArgs...) + + return nil +} + +// Returns query string to check that the attribute is of type "valueType" and that the related value +// is the expected one +func getQueryCheckValueOfType(attributesSuffix string, valueType models.ValueTypeT) string { + return fmt.Sprintf( + "attributes%[1]s.value_type = '%[2]s' AND values%[1]s.%[2]s_val = ?", + attributesSuffix, string(valueType), + ) +} + +// Adds a join to the "query" by the "attributeName" that must be relation type +// then, adds the verification that the values for the joined entity are "expectedValues" + +// "expectedValues" is in {"attributeName": expectedValue} format +func (r *EntityRepository) addJoinToQuery( + query *gorm.DB, attributeName string, expectedValues map[string]any, + attributesSuffix, stringQuery string, +) error { + stringQuery += fmt.Sprintf(` + AND attributes%[1]s.value_type = 'relation' + JOIN entities entities%[1]s ON + entities%[1]s.id = values%[1]s.relation_val + AND entities%[1]s.deleted_at IS NULL + `, + attributesSuffix, + ) + + query.Joins(stringQuery, attributeName) + + var err error + for joinEntityAttribute, joinEntityValue := range expectedValues { + err = r.addValueCheckToQueryInternal(query, joinEntityAttribute, joinEntityValue, attributesSuffix) + if err != nil { + return err + } + } + + return nil +} diff --git a/persistence/repository/EntityRepository_test.go b/persistence/repository/EntityRepository_test.go new file mode 100644 index 00000000..2a178e86 --- /dev/null +++ b/persistence/repository/EntityRepository_test.go @@ -0,0 +1,245 @@ +package repository + +import ( + "database/sql" + "regexp" + "testing" + + "github.com/DATA-DOG/go-sqlmock" + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "gorm.io/driver/postgres" + "gorm.io/gorm" + + "github.com/ditrit/badaas/persistence/models" +) + +type EntityRepositorySuite struct { + suite.Suite + DB *gorm.DB + mock sqlmock.Sqlmock + + repository EntityRepository + query *gorm.DB + uuid uuid.UUID +} + +func (s *EntityRepositorySuite) SetupSuite() { + s.repository = EntityRepository{} +} + +func (s *EntityRepositorySuite) SetupTest() { + var ( + db *sql.DB + err error + ) + + db, s.mock, err = sqlmock.New() + require.NoError(s.T(), err) + + dialector := postgres.New(postgres.Config{ + DSN: "sqlmock_db_0", + DriverName: "postgres", + Conn: db, + PreferSimpleProtocol: true, + }) + s.DB, err = gorm.Open(dialector, &gorm.Config{}) + require.NoError(s.T(), err) + + s.query = s.DB.Select("entities.*") + s.uuid = uuid.New() +} + +func Test(t *testing.T) { + suite.Run(t, new(EntityRepositorySuite)) +} + +type AttributeNameAndValue struct { + AttributeName string + AttributeValue any +} + +var ( + attributeName = "attrName" + aString = "a string" +) + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForString() { + attributeValue := aString + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values_ values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + attributes_attrName.value_type = 'string' AND + values_attrName.string_val = $2 + WHERE entities.entity_type_id = $3 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, attributeValue, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForStringUUID() { + attributeValue := uuid.New().String() + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values_ values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + attributes_attrName.value_type = 'relation' AND + values_attrName.relation_val = $2 + WHERE entities.entity_type_id = $3 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, attributeValue, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForBool() { + attributeValue := true + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values_ values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + attributes_attrName.value_type = 'bool' AND + values_attrName.bool_val = $2 + WHERE entities.entity_type_id = $3 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, attributeValue, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckForNil() { + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values_ values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + values_attrName.is_null = $2 + WHERE entities.entity_type_id = $3 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, true, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, nil}) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsValueCheckIntAndFloatForFloat() { + attributeValue := 1.2 + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values_ values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + ((attributes_attrName.value_type = 'int' AND values_attrName.int_val = $2) OR + (attributes_attrName.value_type = 'float' AND values_attrName.float_val = $3)) + WHERE entities.entity_type_id = $4 AND "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, attributeValue, attributeValue, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) TestAddValueCheck2AddsValueCheckFor2Values() { + attributeName1 := "attrName1" + attributeValue1 := aString + attributeName2 := "attrName2" + attributeValue2 := true + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName1 ON + attributes_attrName1.entity_type_id = entities.entity_type_id AND + attributes_attrName1.name = $1 + JOIN values_ values_attrName1 ON + values_attrName1.attribute_id = attributes_attrName1.id AND + values_attrName1.entity_id = entities.id AND + attributes_attrName1.value_type = 'string' AND + values_attrName1.string_val = $2 + JOIN attributes attributes_attrName2 ON + attributes_attrName2.entity_type_id = entities.entity_type_id AND + attributes_attrName2.name = $3 + JOIN values_ values_attrName2 ON + values_attrName2.attribute_id = attributes_attrName2.id AND + values_attrName2.entity_id = entities.id AND + attributes_attrName2.value_type = 'bool' AND + values_attrName2.bool_val = $4 + WHERE entities.entity_type_id = $5 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName1, attributeValue1, attributeName2, attributeValue2, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery( + AttributeNameAndValue{attributeName1, attributeValue1}, + AttributeNameAndValue{attributeName2, attributeValue2}, + ) +} + +func (s *EntityRepositorySuite) TestAddValueCheckAddsJoinWithEntitiesForMap() { + innerAttributeName := "innerAttrName" + innerAttributeValue := aString + attributeValue := map[string]any{innerAttributeName: innerAttributeValue} + s.mock.ExpectQuery(regexp.QuoteMeta( + `SELECT entities.* FROM "entities" + JOIN attributes attributes_attrName ON + attributes_attrName.entity_type_id = entities.entity_type_id AND + attributes_attrName.name = $1 + JOIN values_ values_attrName ON + values_attrName.attribute_id = attributes_attrName.id AND + values_attrName.entity_id = entities.id AND + attributes_attrName.value_type = 'relation' + JOIN entities entities_attrName ON + entities_attrName.id = values_attrName.relation_val AND + entities_attrName.deleted_at IS NULL + JOIN attributes attributes_attrName_innerAttrName ON + attributes_attrName_innerAttrName.entity_type_id = entities_attrName.entity_type_id AND + attributes_attrName_innerAttrName.name = $2 + JOIN values_ values_attrName_innerAttrName ON + values_attrName_innerAttrName.attribute_id = attributes_attrName_innerAttrName.id AND + values_attrName_innerAttrName.entity_id = entities_attrName.id AND + attributes_attrName_innerAttrName.value_type = 'string' AND + values_attrName_innerAttrName.string_val = $3 + WHERE entities.entity_type_id = $4 AND + "entities"."deleted_at" IS NULL`)). + WithArgs(attributeName, innerAttributeName, innerAttributeValue, s.uuid). + WillReturnRows(sqlmock.NewRows(nil)) + + s.execQuery(AttributeNameAndValue{attributeName, attributeValue}) +} + +func (s *EntityRepositorySuite) execQuery(attributes ...AttributeNameAndValue) { + for _, attribute := range attributes { + err := s.repository.AddValueCheckToQuery(s.query, attribute.AttributeName, attribute.AttributeValue) + require.NoError(s.T(), err) + } + + s.query.Where( + "entities.entity_type_id = ?", + s.uuid, + ) + + var entities []*models.Entity + err := s.query.Find(&entities).Error + require.NoError(s.T(), err) +} diff --git a/persistence/repository/EntityTypeRepository.go b/persistence/repository/EntityTypeRepository.go new file mode 100644 index 00000000..e52a6c9c --- /dev/null +++ b/persistence/repository/EntityTypeRepository.go @@ -0,0 +1,43 @@ +package repository + +import ( + "go.uber.org/zap" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/persistence/models" +) + +type EntityTypeRepository struct { + logger *zap.Logger +} + +func NewEntityTypeRepository( + logger *zap.Logger, +) *EntityTypeRepository { + return &EntityTypeRepository{ + logger: logger, + } +} + +func (r *EntityTypeRepository) Get(tx *gorm.DB, id badorm.UUID) (*models.EntityType, error) { + var entityType models.EntityType + + err := tx.Preload("Attributes").First(&entityType, id).Error + if err != nil { + return nil, err + } + + return &entityType, nil +} + +func (r *EntityTypeRepository) GetByName(tx *gorm.DB, name string) (*models.EntityType, error) { + var entityType models.EntityType + + err := tx.Preload("Attributes").First(&entityType, "name = ?", name).Error + if err != nil { + return nil, err + } + + return &entityType, nil +} diff --git a/persistence/repository/ValueRepository.go b/persistence/repository/ValueRepository.go new file mode 100644 index 00000000..99f9dee9 --- /dev/null +++ b/persistence/repository/ValueRepository.go @@ -0,0 +1,61 @@ +package repository + +import ( + "time" + + sq "github.com/Masterminds/squirrel" + "github.com/elliotchance/pie/v2" + "go.uber.org/zap" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/persistence/models" +) + +type ValueRepository struct { + logger *zap.Logger + db *gorm.DB +} + +func NewValueRepository( + logger *zap.Logger, + db *gorm.DB, +) *ValueRepository { + return &ValueRepository{ + logger: logger, + db: db, + } +} + +// Creates multiples values in the database +func (r *ValueRepository) Create(tx *gorm.DB, values []*models.Value) error { + now := time.Now() + + pie.Each(values, func(value *models.Value) { + value.ID = badorm.NewUUID() + }) + + query := sq.Insert("values_"). + Columns("id", "created_at", "updated_at", "is_null", "string_val", "float_val", "int_val", + "bool_val", "relation_val", "entity_id", "attribute_id") + + for _, value := range values { + query = query.Values(value.ID, now, now, value.IsNull, value.StringVal, + value.FloatVal, value.IntVal, value.BoolVal, + value.RelationVal, value.EntityID, value.Attribute.ID) + } + + queryString, queryValues, err := query. + PlaceholderFormat(sq.Dollar). + ToSql() + if err != nil { + return err + } + + err = tx.Exec(queryString, queryValues...).Error + if err != nil { + return err + } + + return nil +} diff --git a/router/ModuleFx.go b/router/ModuleFx.go index 654ba4a2..485d2f11 100644 --- a/router/ModuleFx.go +++ b/router/ModuleFx.go @@ -38,3 +38,25 @@ var AuthRoutesModule = fx.Module( fx.Provide(middlewares.NewAuthenticationMiddleware), fx.Invoke(AddAuthRoutes), ) + +var EAVRoutesModule = fx.Module( + "eavRoutes", + // service + services.EAVServiceModule, + + // controller + fx.Provide( + fx.Annotate( + controllers.NewEAVController, + fx.ResultTags(`name:"eavController"`), + ), + ), + + // routes + fx.Invoke( + fx.Annotate( + AddEAVCRUDRoutes, + fx.ParamTags(`name:"eavController"`), + ), + ), +) diff --git a/router/routes.go b/router/routes.go index 19d528d6..d4fda271 100644 --- a/router/routes.go +++ b/router/routes.go @@ -71,3 +71,18 @@ func createSuperUser( return nil } + +func AddEAVCRUDRoutes( + eavController controllers.EAVController, + router *mux.Router, + jsonController middlewares.JSONController, +) { + // Objects CRUD + objectsBase := "/eav/objects/{type}" + objectsWithID := objectsBase + "/{id}" + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.GetObject)).Methods(http.MethodGet) + router.HandleFunc(objectsBase, jsonController.Wrap(eavController.GetObjects)).Methods(http.MethodGet) + router.HandleFunc(objectsBase, jsonController.Wrap(eavController.CreateObject)).Methods(http.MethodPost) + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.UpdateObject)).Methods(http.MethodPut) + router.HandleFunc(objectsWithID, jsonController.Wrap(eavController.DeleteObject)).Methods(http.MethodDelete) +} diff --git a/router/routes_test.go b/router/routes_test.go index bcfd6dea..7d5e5874 100644 --- a/router/routes_test.go +++ b/router/routes_test.go @@ -152,3 +152,30 @@ func TestAddLoginRoutes(t *testing.T) { assert.Equal(t, response.Code, http.StatusOK) assert.Equal(t, response.Body.String(), "{\"login\":\"called\"}") } + +func TestAddEAVRoutes(t *testing.T) { + jsonController := middlewares.NewJSONController(logger) + + eavController := mockControllers.NewEAVController(t) + eavController. + On("GetObjects", mock.Anything, mock.Anything). + Return(map[string]string{"GetObjects": "called"}, nil) + + router := NewRouter() + AddEAVCRUDRoutes( + eavController, + router, + jsonController, + ) + + response := httptest.NewRecorder() + request := httptest.NewRequest( + http.MethodGet, + "/eav/objects/posts", + nil, + ) + + router.ServeHTTP(response, request) + assert.Equal(t, http.StatusOK, response.Code) + assert.Equal(t, "{\"GetObjects\":\"called\"}", response.Body.String()) +} diff --git a/services/ModuleFx.go b/services/ModuleFx.go index 4b40de48..1bd35cf9 100644 --- a/services/ModuleFx.go +++ b/services/ModuleFx.go @@ -5,6 +5,7 @@ import ( "github.com/ditrit/badaas/badorm" "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/persistence/repository" "github.com/ditrit/badaas/services/sessionservice" "github.com/ditrit/badaas/services/userservice" ) @@ -30,3 +31,27 @@ func getAuthModels() badorm.GetModelsResult { }, } } + +var EAVServiceModule = fx.Module( + "eavService", + // models + fx.Provide(getEAVModels), + // repositories + fx.Provide(repository.NewValueRepository), + fx.Provide(repository.NewEntityRepository), + fx.Provide(repository.NewEntityTypeRepository), + + // service + fx.Provide(NewEAVService), +) + +func getEAVModels() badorm.GetModelsResult { + return badorm.GetModelsResult{ + Models: []any{ + models.EntityType{}, + models.Entity{}, + models.Attribute{}, + models.Value{}, + }, + } +} diff --git a/services/eav.go b/services/eav.go new file mode 100644 index 00000000..0721c9ae --- /dev/null +++ b/services/eav.go @@ -0,0 +1,248 @@ +package services + +import ( + "errors" + "fmt" + + "go.uber.org/zap" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/persistence/repository" + "github.com/ditrit/badaas/utils" +) + +var ErrCantParseUUID = errors.New("can't parse uuid") + +// EAV service provide handle EAV objects +type EAVService interface { + GetEntity(entityTypeName string, id badorm.UUID) (*models.Entity, error) + GetEntities(entityTypeName string, conditions map[string]any) ([]*models.Entity, error) + CreateEntity(entityTypeName string, attributeValues map[string]any) (*models.Entity, error) + UpdateEntity(entityTypeName string, entityID badorm.UUID, newValues map[string]any) (*models.Entity, error) + DeleteEntity(entityTypeName string, entityID badorm.UUID) error +} + +type eavServiceImpl struct { + logger *zap.Logger + db *gorm.DB + entityTypeRepository *repository.EntityTypeRepository + entityRepository *repository.EntityRepository +} + +func NewEAVService( + logger *zap.Logger, + db *gorm.DB, + entityTypeRepository *repository.EntityTypeRepository, + entityRepository *repository.EntityRepository, +) EAVService { + return &eavServiceImpl{ + logger: logger, + db: db, + entityTypeRepository: entityTypeRepository, + entityRepository: entityRepository, + } +} + +// Get the Entity of type with name "entityTypeName" that has the "id" +func (eavService *eavServiceImpl) GetEntity(entityTypeName string, id badorm.UUID) (*models.Entity, error) { + return eavService.entityRepository.Get(eavService.db, entityTypeName, id) +} + +// Get entities of type with name "entityTypeName" that match all "conditions" +// +// "conditions" is in {"attributeName": expectedValue} format +// in case of join "conditions" can have the format: +// +// {"relationAttributeName": {"attributeName": expectedValue}} +func (eavService *eavServiceImpl) GetEntities(entityTypeName string, conditions map[string]any) ([]*models.Entity, error) { + return ExecWithTransaction( + eavService.db, + func(tx *gorm.DB) ([]*models.Entity, error) { + entityType, err := eavService.entityTypeRepository.GetByName(tx, entityTypeName) + if err != nil { + return nil, err + } + + query := tx.Select("entities.*") + + // only entities that match the conditions + for attributeName, expectedValue := range conditions { + err = eavService.entityRepository.AddValueCheckToQuery(query, attributeName, expectedValue) + if err != nil { + return nil, err + } + } + + // only entities of type entityType + query.Where( + "entities.entity_type_id = ?", + entityType.ID, + ) + + // execute query + var entities []*models.Entity + query.Preload("Fields").Preload("Fields.Attribute").Preload("EntityType.Attributes").Preload("EntityType") + err = query.Find(&entities).Error + + return entities, err + }, + ) +} + +// Creates a Entity of type "entityType" and its Values from the information provided in "attributeValues" +// not specified values are set with the default value (if exists) or a null value. +// entries in "attributeValues" that do not correspond to any attribute of "entityType" are ignored +// +// "attributeValues" are in {"attributeName": value} format +func (eavService *eavServiceImpl) CreateEntity(entityTypeName string, attributeValues map[string]any) (*models.Entity, error) { + return ExecWithTransaction( + eavService.db, + func(tx *gorm.DB) (*models.Entity, error) { + entityType, err := eavService.entityTypeRepository.GetByName(tx, entityTypeName) + if err != nil { + return nil, err + } + + entity := models.NewEntity(entityType) + for _, attribute := range entityType.Attributes { + value, err := eavService.createValue(tx, attribute, attributeValues) + if err != nil { + return nil, err + } + entity.Fields = append(entity.Fields, value) + } + + return entity, eavService.entityRepository.Create(tx, entity) + }, + ) +} + +// Creates a new Value for the "attribute" with the information provided in "attributesValues" +// or with the default value (if exists) +// or a null value if the value for "attribute" is not specified in "attributesValues" +// +// "attributesValues" is in {"attributeName": value} format +// +// returns error is the type of the value provided for "attribute" +// does not correspond with its ValueType +func (eavService *eavServiceImpl) createValue(tx *gorm.DB, attribute *models.Attribute, attributesValues map[string]any) (*models.Value, error) { + attributeValue, isPresent := attributesValues[attribute.Name] + if isPresent { + value := &models.Value{Attribute: attribute, AttributeID: attribute.ID} + + err := eavService.updateValue(tx, value, attributeValue) + if err != nil { + return nil, err + } + + return value, nil + } + + // attribute not present in params, set the default value (if exists) or a null value + if attribute.Default { + return attribute.GetNewDefaultValue() + } else if attribute.Required { + return nil, fmt.Errorf("field %s is missing and is required", attribute.Name) + } + + return models.NewNullValue(attribute) +} + +// Updates entity with type "entityTypeName" and "id" Values to the new values provided in "newValues" +// entries in "newValues" that do not correspond to any attribute of the EntityType are ignored +// +// "newValues" are in {"attributeName": newValue} format +func (eavService *eavServiceImpl) UpdateEntity(entityTypeName string, entityID badorm.UUID, newValues map[string]any) (*models.Entity, error) { + return ExecWithTransaction( + eavService.db, + func(tx *gorm.DB) (*models.Entity, error) { + entity, err := eavService.entityRepository.Get(tx, entityTypeName, entityID) + if err != nil { + return nil, err + } + + for _, value := range entity.Fields { + newValue, isPresent := newValues[value.Attribute.Name] + if isPresent { + err = eavService.updateValue(tx, value, newValue) + if err != nil { + return nil, err + } + } + } + + return entity, tx.Save(entity.Fields).Error + }, + ) +} + +// Updates Value "value" to have the value "newValue" +// +// returns error is the type of the "newValue" does not correspond +// with the type expected for the "value"'s attribute +func (eavService *eavServiceImpl) updateValue(tx *gorm.DB, value *models.Value, newValue any) error { + switch newValueTyped := newValue.(type) { + case string: + if value.Attribute.ValueType == models.RelationValueType { + return eavService.updateRelationValue(tx, value, newValueTyped) + } + + return value.SetStringVal(newValueTyped) + case int: + return value.SetIntVal(newValueTyped) + case float64: + if utils.IsAnInt(newValueTyped) && value.Attribute.ValueType == models.IntValueType { + return value.SetIntVal(int(newValueTyped)) + } + + return value.SetFloatVal(newValueTyped) + case bool: + return value.SetBooleanVal(newValueTyped) + case nil: + return value.SetNull() + default: + return fmt.Errorf("unsupported type") + } +} + +// Updates Value "value" to point to "newID" +// +// returns error if entity with "newID" does not exist +// or its type is not the same as the one pointed by the attribute's RelationTargetEntityTypeID +func (eavService *eavServiceImpl) updateRelationValue(tx *gorm.DB, value *models.Value, newID string) error { + uuidVal, err := badorm.ParseUUID(newID) + if err != nil { + return ErrCantParseUUID + } + + relationEntityType, err := eavService.entityTypeRepository.Get(tx, value.Attribute.RelationTargetEntityTypeID) + if err != nil { + return err + } + + relationEntity, err := eavService.entityRepository.Get(tx, relationEntityType.Name, uuidVal) + if err != nil { + return err + } + + return value.SetRelationVal(relationEntity) +} + +// Deletes Entity with type "entityTypeName" and id "entityID" and its values +func (eavService *eavServiceImpl) DeleteEntity(entityTypeName string, entityID badorm.UUID) error { + return eavService.db.Transaction(func(tx *gorm.DB) error { + entity, err := eavService.entityRepository.Get(tx, entityTypeName, entityID) + if err != nil { + return err + } + + err = tx.Where("entity_id = ?", entityID).Delete(&models.Value{}).Error + if err != nil { + return err + } + + return tx.Delete(entity).Error + }) +} diff --git a/services/transaction_executor.go b/services/transaction_executor.go new file mode 100644 index 00000000..05fa9372 --- /dev/null +++ b/services/transaction_executor.go @@ -0,0 +1,42 @@ +package services + +import ( + "database/sql" + + "gorm.io/gorm" +) + +// Executes the function "toExec" inside a transaction +// The transaction is automatically rolled back in case "toExec" returns an error +// opts can be used to pass arguments to the transaction +func ExecWithTransaction[RT any]( + db *gorm.DB, + toExec func(*gorm.DB) (RT, error), + opts ...*sql.TxOptions, +) (RT, error) { + nilValue := *new(RT) + tx := db.Begin(opts...) + + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + if err := tx.Error; err != nil { + return nilValue, err + } + + returnValue, err := toExec(tx) + if err != nil { + tx.Rollback() + return nilValue, err + } + + err = tx.Commit().Error + if err != nil { + return nilValue, err + } + + return returnValue, nil +} diff --git a/test_e2e/badaas_e2e_test.go b/test_e2e/badaas_e2e_test.go index 6d62ea8a..b2dc9983 100644 --- a/test_e2e/badaas_e2e_test.go +++ b/test_e2e/badaas_e2e_test.go @@ -109,6 +109,51 @@ func InitializeScenario(ctx *godog.ScenarioContext) { log.Fatalln(err) } + userType := &models.EntityType{ + Name: "user", + } + nameAttr := &models.Attribute{ + EntityTypeID: userType.ID, + Name: "name", + ValueType: models.StringValueType, + Required: false, + } + userType.Attributes = append(userType.Attributes, + nameAttr, + ) + + err = db.Create(&userType).Error + if err != nil { + log.Fatalln(err) + } + + profileType := &models.EntityType{ + Name: "profile", + } + displayNameAttr := &models.Attribute{ + EntityTypeID: profileType.ID, + Name: "displayName", + ValueType: models.StringValueType, + Required: false, + } + yearOfBirthAttr := &models.Attribute{ + EntityTypeID: profileType.ID, + Name: "yearOfBirth", + ValueType: models.IntValueType, + Required: false, + } + userAttr := models.NewRelationAttribute(profileType, "userID", false, false, userType) + profileType.Attributes = append(profileType.Attributes, + displayNameAttr, + yearOfBirthAttr, + userAttr, + ) + + err = db.Create(&profileType).Error + if err != nil { + log.Fatalln(err) + } + return ctx, nil }) @@ -116,6 +161,15 @@ func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^status code is "(\d+)"$`, t.assertStatusCode) ctx.Step(`^response field "(.+)" is "(.+)"$`, t.assertResponseFieldIsEquals) ctx.Step(`^I request "(.+)" with method "(.+)" with json$`, t.requestWithJSON) + ctx.Step(`^a "(.+)" object exists with attributes$`, t.objectExists) + ctx.Step(`^I query a "(.+)" with the object id$`, t.queryWithObjectID) + ctx.Step(`^I query all "(.+)" objects$`, t.queryAllObjects) + ctx.Step(`^there are "(\d+)" "(.+)" objects$`, t.thereAreObjects) + ctx.Step(`^there is a "(.+)" object with attributes$`, t.thereIsObjectWithAttributes) + ctx.Step(`^I query all "(.+)" objects with conditions$`, t.queryObjectsWithConditions) + ctx.Step(`^I delete a "(.+)" with the object id$`, t.deleteWithObjectID) + ctx.Step(`^I modify a "(.+)" with attributes$`, t.modifyWithAttributes) + ctx.Step(`^a "(.+)" object exists with property "(.+)" related to last object and properties$`, t.objectExistsWithRelation) } func CleanDB(db *gorm.DB) { @@ -124,6 +178,10 @@ func CleanDB(db *gorm.DB) { []any{ models.Session{}, models.User{}, + models.Value{}, + models.Attribute{}, + models.Entity{}, + models.EntityType{}, }..., )) } diff --git a/test_e2e/features/eav.feature b/test_e2e/features/eav.feature new file mode 100644 index 00000000..798e03e8 --- /dev/null +++ b/test_e2e/features/eav.feature @@ -0,0 +1,128 @@ +Feature: Saving and querying objects in the database using the EAV Model + Scenario: Objects can be created with CreateObject + When I request "/eav/objects/profile" with method "POST" with json + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + Then status code is "201" + And response field "type" is "profile" + And response field "attrs.displayName" is "Jean Dupont" + And response field "attrs.yearOfBirth" is "1997" + + Scenario: Created object can be queried individually + Given a "profile" object exists with attributes + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + When I query a "profile" with the object id + Then response field "type" is "profile" + And response field "attrs.displayName" is "Jean Dupont" + And response field "attrs.yearOfBirth" is "1997" + + Scenario: Created objects can be queried together + Given a "profile" object exists with attributes + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + And a "profile" object exists with attributes + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | integer | + When I query all "profile" objects + Then there are "2" "profile" objects + And there is a "profile" object with attributes + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | float | + And there is a "profile" object with attributes + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | float | + + Scenario: Created objects can be queried by a property + Given a "profile" object exists with attributes + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + And a "profile" object exists with attributes + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | integer | + When I query all "profile" objects with conditions + | key | value | type | + | yearOfBirth | 2001 | integer | + Then there are "1" "profile" objects + And there is a "profile" object with attributes + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | float | + + Scenario: Created objects can be queried by multiple properties + Given a "profile" object exists with attributes + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + And a "profile" object exists with attributes + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | integer | + And a "profile" object exists with attributes + | key | value | type | + | displayName | Gabriel Bernard | string | + | yearOfBirth | 2001 | integer | + When I query all "profile" objects with conditions + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | integer | + Then there are "1" "profile" objects + And there is a "profile" object with attributes + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | float | + + Scenario: Created objects can be queried doing joins + Given a "user" object exists with attributes + | key | value | type | + | name | user1 | string | + And a "profile" object exists with property "userID" related to last object and properties + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + And a "user" object exists with attributes + | key | value | type | + | name | user2 | string | + And a "profile" object exists with property "userID" related to last object and properties + | key | value | type | + | displayName | Pierre Martin | string | + | yearOfBirth | 2001 | integer | + When I query all "profile" objects with conditions + | key | value | type | + | displayName | Jean Dupont | string | + | userID | {"name": "user1"} | json | + Then there are "1" "profile" objects + And there is a "profile" object with attributes + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | float | + + Scenario: Created objects can be deleted + Given a "profile" object exists with attributes + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + When I delete a "profile" with the object id + And I query all "profile" objects + Then there are "0" "profile" objects + + Scenario: Created objects can be modified + Given a "profile" object exists with attributes + | key | value | type | + | displayName | Jean Dupont | string | + | yearOfBirth | 1997 | integer | + When I modify a "profile" with attributes + | key | value | type | + | yearOfBirth | 1998 | integer | + And I query a "profile" with the object id + Then response field "type" is "profile" + And response field "attrs.displayName" is "Jean Dupont" + And response field "attrs.yearOfBirth" is "1998" \ No newline at end of file diff --git a/test_e2e/http_support_test.go b/test_e2e/http_support_test.go index 04878051..aeff142b 100644 --- a/test_e2e/http_support_test.go +++ b/test_e2e/http_support_test.go @@ -255,3 +255,206 @@ func checkMethod(method string) (string, error) { return sanitizedMethod, nil } + +func (t *TestContext) objectExists(entityType string, jsonTable *godog.Table) error { + err := t.request( + "/eav/objects/"+entityType, + http.MethodPost, + jsonTable, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(http.StatusCreated) + if err != nil { + return err + } + + return nil +} + +func (t *TestContext) objectExistsWithRelation(entityType string, relationAttribute string, jsonTable *godog.Table) error { + jsonTable.Rows = append(jsonTable.Rows, &messages.PickleTableRow{ + Cells: []*messages.PickleTableCell{ + { + Value: relationAttribute, + }, + { + Value: t.getIDFromJSON(), + }, + { + Value: stringValueType, + }, + }, + }) + + return t.objectExists(entityType, jsonTable) +} + +func (t *TestContext) queryWithObjectID(entityType string) error { + err := t.requestGet( + "/eav/objects/" + entityType + "/" + t.getIDFromJSON(), + ) + if err != nil { + return err + } + + err = t.assertStatusCode(http.StatusOK) + if err != nil { + return err + } + + return nil +} + +func (t *TestContext) queryObjectsWithConditions(entityType string, jsonTable *godog.Table) error { + err := t.requestWithJSON( + "/eav/objects/"+entityType, + http.MethodGet, + jsonTable, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(http.StatusOK) + if err != nil { + return err + } + + return nil +} + +func (t *TestContext) queryAllObjects(entityType string) error { + err := t.requestGet( + "/eav/objects/" + entityType, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(http.StatusOK) + if err != nil { + return err + } + + return nil +} + +func (t *TestContext) thereAreObjects(expectedAmount int, entityType string) error { + amount := len(t.getListFromJSON()) + if amount != expectedAmount { + return fmt.Errorf("expect amount %d, but there are %d objects of type %s", expectedAmount, amount, entityType) + } + + return nil +} + +func (t *TestContext) thereIsObjectWithAttributes(expectedEntityType string, jsonTable *godog.Table) error { + expectedValues, err := buildMapFromTable(jsonTable) + if err != nil { + log.Fatalln(err) + } + + objectMapList := t.getObjectMapListFromJSON() + for _, objectMap := range objectMapList { + objectAttrs, ok := objectMap["attrs"].(map[string]any) + if !ok { + log.Fatalln("attrs in object is not a map") + } + + if objectMap["type"] == expectedEntityType { + if t.areAllAttributesEqual(objectAttrs, expectedValues) { + return nil + } + } + } + + return fmt.Errorf("object with attributes %v not found in %v", expectedValues, objectMapList) +} + +func (t *TestContext) deleteWithObjectID(entityType string) error { + err := t.request( + "/eav/objects/"+entityType+"/"+t.getIDFromJSON(), + http.MethodDelete, + nil, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(http.StatusOK) + if err != nil { + return err + } + + return nil +} + +func (t *TestContext) modifyWithAttributes(entityType string, jsonTable *godog.Table) error { + err := t.request( + "/eav/objects/"+entityType+"/"+t.getIDFromJSON(), + http.MethodPut, + jsonTable, + ) + if err != nil { + return err + } + + err = t.assertStatusCode(http.StatusOK) + if err != nil { + return err + } + + return nil +} + +func (t *TestContext) getIDFromJSON() string { + id, present := t.json.(map[string]any)["id"] + if !present { + log.Fatalln("object id not available") + } + + idString, ok := id.(string) + if !ok { + log.Fatalln("id in json is not a string") + } + + return idString +} + +func (t *TestContext) getListFromJSON() []any { + objectList, ok := t.json.([]any) + if !ok { + log.Fatalln("json is not a list") + } + + return objectList +} + +func (t *TestContext) getObjectMapListFromJSON() []map[string]any { + objectList := t.getListFromJSON() + + return pie.Map(objectList, func(object any) map[string]any { + objectMap, ok := object.(map[string]any) + if !ok { + log.Fatalln("object in json list is not a map") + } + + return objectMap + }) +} + +func (t *TestContext) areAllAttributesEqual(objectMap, expectedValues map[string]any) bool { + allEqual := true + + for attributeName, expectedValue := range expectedValues { + actualValue, isPresent := objectMap[attributeName] + if !isPresent || actualValue != expectedValue { + allEqual = false + } + } + + return allEqual +} diff --git a/test_e2e/test_api.go b/test_e2e/test_api.go index 6c88b669..a13ffdb1 100644 --- a/test_e2e/test_api.go +++ b/test_e2e/test_api.go @@ -52,6 +52,7 @@ func runHTTPServer(_ *cobra.Command, _ []string) { // add routes provided by badaas router.InfoRouteModule, router.AuthRoutesModule, + router.EAVRoutesModule, // create httpServer fx.Provide(NewHTTPServer), diff --git a/testintegration/asserts.go b/testintegration/asserts.go index 6e514505..e205197f 100644 --- a/testintegration/asserts.go +++ b/testintegration/asserts.go @@ -2,9 +2,13 @@ package testintegration import ( "log" + "sort" "github.com/stretchr/testify/suite" + "gotest.tools/assert" is "gotest.tools/assert/cmp" + + "github.com/ditrit/badaas/persistence/models" ) func EqualList[T any](ts *suite.Suite, expectedList, actualList []T) { @@ -33,3 +37,28 @@ func EqualList[T any](ts *suite.Suite, expectedList, actualList []T) { } } } + +func EqualEntityList(ts *suite.Suite, expected, actual []*models.Entity) { + ts.Len(actual, len(expected)) + + sort.SliceStable(expected, func(i, j int) bool { + return expected[i].ID.String() < expected[j].ID.String() + }) + + sort.SliceStable(actual, func(i, j int) bool { + return actual[i].ID.String() < actual[j].ID.String() + }) + + for i := range actual { + EqualEntity(ts, expected[i], actual[i]) + } +} + +func EqualEntity(ts *suite.Suite, expected, actual *models.Entity) { + assert.DeepEqual(ts.T(), expected, actual) + EqualList( + ts, + expected.Fields, + actual.Fields, + ) +} diff --git a/testintegration/badaas_test.go b/testintegration/badaas_test.go index 172bdcf9..605b31dd 100644 --- a/testintegration/badaas_test.go +++ b/testintegration/badaas_test.go @@ -58,15 +58,20 @@ func injectDependencies(_ *cobra.Command, _ []string) { services.AuthServiceModule, fx.Provide(NewAuthServiceIntTestSuite), + services.EAVServiceModule, + fx.Provide(NewEAVServiceIntTestSuite), + fx.Invoke(runBaDaaSTestSuites), ).Run() } func runBaDaaSTestSuites( tsAuthService *AuthServiceIntTestSuite, + tsEAVService *EAVServiceIntTestSuite, shutdowner fx.Shutdowner, ) { suite.Run(tGlobal, tsAuthService) + suite.Run(tGlobal, tsEAVService) shutdowner.Shutdown() } diff --git a/testintegration/eavService.go b/testintegration/eavService.go new file mode 100644 index 00000000..0907bcd5 --- /dev/null +++ b/testintegration/eavService.go @@ -0,0 +1,881 @@ +package testintegration + +import ( + "fmt" + + "github.com/elliotchance/pie/v2" + "github.com/stretchr/testify/suite" + "gorm.io/gorm" + + "github.com/ditrit/badaas/badorm" + "github.com/ditrit/badaas/persistence/models" + "github.com/ditrit/badaas/persistence/repository" + "github.com/ditrit/badaas/services" + "github.com/ditrit/badaas/utils" +) + +type EAVServiceIntTestSuite struct { + suite.Suite + db *gorm.DB + eavService services.EAVService + entityRepository *repository.EntityRepository + entityType1 *models.EntityType + entityType2 *models.EntityType +} + +func NewEAVServiceIntTestSuite( + db *gorm.DB, + eavService services.EAVService, + entityRepository *repository.EntityRepository, +) *EAVServiceIntTestSuite { + return &EAVServiceIntTestSuite{ + db: db, + eavService: eavService, + entityRepository: entityRepository, + } +} + +func (ts *EAVServiceIntTestSuite) TearDownSuite() { + ts.cleanDB() +} + +func (ts *EAVServiceIntTestSuite) SetupTest() { + ts.cleanDB() + + ts.entityType1 = ts.createEntityType("entityType1", nil) + ts.entityType2 = ts.createEntityType("entityType2", ts.entityType1) +} + +func (ts *EAVServiceIntTestSuite) cleanDB() { + CleanDBTables( + ts.db, + []any{ + models.Value{}, + models.Attribute{}, + models.Entity{}, + models.EntityType{}, + }, + ) +} + +// ------------------------- GetEntity -------------------------------- + +func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityDoesNotExist() { + _, err := ts.eavService.GetEntity(ts.entityType1.Name, badorm.NewUUID()) + ts.ErrorContains(err, "record not found") +} + +func (ts *EAVServiceIntTestSuite) TestGetEntityReturnsErrorIfEntityTypeDoesNotMatch() { + otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{}) + _, err := ts.eavService.GetEntity(ts.entityType2.Name, otherEntity1.ID) + ts.ErrorContains(err, "record not found") +} + +func (ts *EAVServiceIntTestSuite) TestGetEntityWorksIfEntityTypeMatch() { + entity1 := ts.createEntity(ts.entityType2, map[string]any{}) + + entityReturned, err := ts.eavService.GetEntity(ts.entityType2.Name, entity1.ID) + ts.Nil(err) + EqualEntity(&ts.Suite, entity1, entityReturned) +} + +// ------------------------- GetEntities -------------------------------- + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesOfNotExistentTypeReturnsError() { + _, err := ts.eavService.GetEntities("not-exists", map[string]any{}) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsEmptyIfNotEntitiesCreated() { + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, map[string]any{}) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheOnlyOneIfOneEntityCreated() { + match := ts.createEntity(ts.entityType2, map[string]any{}) + + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, make(map[string]any)) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithoutConditionsReturnsTheListWhenMultipleCreated() { + match1 := ts.createEntity(ts.entityType2, map[string]any{}) + match2 := ts.createEntity(ts.entityType2, map[string]any{}) + match3 := ts.createEntity(ts.entityType2, map[string]any{}) + + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, make(map[string]any)) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match1, match2, match3}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNotEntitiesCreated() { + params := map[string]any{ + "string": "not_created", + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsEmptyIfNothingMatch() { + ts.createEntity(ts.entityType2, map[string]any{ + "string": "something_else", + }) + + params := map[string]any{ + "string": "not_match", + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsOneIfOnlyOneMatch() { + match := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "string": "something_else", + }) + + params := map[string]any{ + "string": "match", + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionsReturnsMultipleIfMultipleMatch() { + match1 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + match2 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "string": "something_else", + }) + + params := map[string]any{ + "string": "match", + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match1, match2}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatDoesNotExistReturnsEmpty() { + ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + }) + + params := map[string]any{ + "not_exists": "not_exists", + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIntType() { + match := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "int": 1, + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "string": "not_match", + "int": 2, + }) + + params := map[string]any{ + "int": 1.0, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfIncorrectTypeReturnsEmptyList() { + ts.createEntity(ts.entityType2, map[string]any{ + "string": "not_match", + "int": 1, + }) + + params := map[string]any{ + "int": "not_an_int", + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + ts.Len(entities, 0) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfFloatType() { + match := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "float": 1.1, + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "string": "not_match", + "float": 2.0, + }) + + params := map[string]any{ + "float": 1.1, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfBoolType() { + match := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "bool": true, + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "string": "not_match", + "bool": false, + }) + + params := map[string]any{ + "bool": true, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionOfRelationType() { + otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{}) + otherEntity2 := ts.createEntity(ts.entityType1, map[string]any{}) + + match := ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity1.ID.String(), + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity2.ID.String(), + }) + + params := map[string]any{ + "relation": otherEntity1.ID.String(), + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionFilterByNull() { + match := ts.createEntity(ts.entityType2, map[string]any{ + "string": nil, + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "string": "something", + }) + + params := map[string]any{ + "string": nil, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithMultipleConditionsOfDifferentTypesWorks() { + match1 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "int": 1, + "bool": true, + }) + match2 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "int": 1, + "bool": true, + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "string": "not_match", + "int": 1, + "bool": true, + }) + ts.createEntity(ts.entityType2, map[string]any{ + "string": "match", + "int": 2, + "bool": true, + }) + + params := map[string]any{ + "string": "match", + "int": 1.0, + "bool": true, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match1, match2}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoins() { + otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 1, + }) + otherEntity2 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 2, + }) + + match := ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity1.ID.String(), + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity2.ID.String(), + }) + + params := map[string]any{ + "relation": map[string]any{ + "int": 1.0, + }, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsOnDifferentAttributes() { + otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 1, + "string": "match", + }) + otherEntity2 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 2, + "string": "match", + }) + + match := ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity1.ID.String(), + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity2.ID.String(), + }) + + params := map[string]any{ + "relation": map[string]any{ + "int": 1.0, + "string": "match", + }, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsDifferentEntities() { + entityType3 := ts.createEntityType("entityType3", nil) + + otherEntity11 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 1, + }) + otherEntity12 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 2, + }) + + otherEntity31 := ts.createEntity(entityType3, map[string]any{ + "int": 3, + }) + otherEntity32 := ts.createEntity(entityType3, map[string]any{ + "int": 4, + }) + + relation3Attr := models.NewRelationAttribute( + ts.entityType2, "relation2", + false, false, entityType3, + ) + + ts.addAttributeToEntityType(ts.entityType2, relation3Attr) + + match := ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity11.ID.String(), + "relation2": otherEntity31.ID.String(), + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity12.ID.String(), + "relation2": otherEntity32.ID.String(), + }) + + params := map[string]any{ + "relation": map[string]any{ + "int": 1.0, + }, + "relation2": map[string]any{ + "int": 3.0, + }, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +func (ts *EAVServiceIntTestSuite) TestGetEntitiesWithConditionThatJoinsMultipleTimes() { + entityType3 := ts.createEntityType("entityType3", nil) + + ts.addAttributeToEntityType(ts.entityType1, models.NewRelationAttribute( + ts.entityType1, "relation", + false, false, entityType3, + )) + + otherEntity31 := ts.createEntity(entityType3, map[string]any{ + "int": 3, + }) + otherEntity32 := ts.createEntity(entityType3, map[string]any{ + "int": 4, + }) + + otherEntity11 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 1, + "relation": otherEntity31.ID.String(), + }) + otherEntity12 := ts.createEntity(ts.entityType1, map[string]any{ + "int": 2, + "relation": otherEntity32.ID.String(), + }) + + match := ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity11.ID.String(), + }) + + ts.createEntity(ts.entityType2, map[string]any{ + "relation": otherEntity12.ID.String(), + }) + + params := map[string]any{ + "relation": map[string]any{ + "int": 1.0, + "relation": map[string]any{ + "int": 3.0, + }, + }, + } + entities, err := ts.eavService.GetEntities(ts.entityType2.Name, params) + ts.Nil(err) + + EqualEntityList(&ts.Suite, []*models.Entity{match}, entities) +} + +// ------------------------- CreateEntity -------------------------------- + +func (ts *EAVServiceIntTestSuite) TestCreateMultipleEntitiesDoesNotGenerateGormBug() { + stringAttr := utils.FindFirst(ts.entityType1.Attributes, func(attr *models.Attribute) bool { + return attr.ValueType == models.StringValueType + }) + + initialDisplayNameID := (*stringAttr).ID + + stringAttr2 := &models.Attribute{ + Name: "string2", + ValueType: models.StringValueType, + } + ts.addAttributeToEntityType(ts.entityType1, stringAttr2) + + initialDescriptionID := stringAttr2.ID + + for i := 0; i < 10; i++ { + params := map[string]any{ + "string": fmt.Sprintf("displayName%d", i), + "description": fmt.Sprintf("description%d", i), + } + entity, err := ts.eavService.CreateEntity(ts.entityType1.Name, params) + ts.Nil(err) + + for _, value := range entity.Fields { + if value.Attribute.Name == "string" { + ts.Equal(initialDisplayNameID, value.AttributeID) + } else if value.Attribute.Name == "string2" { + ts.Equal(initialDescriptionID, value.AttributeID) + } + } + } +} + +func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfEntityTypeDoesNotExist() { + _, err := ts.eavService.CreateEntity("not-exists", map[string]any{}) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + +func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfTheTypeOfAValueIsUnsupported() { + params := map[string]any{ + "string": []string{"salut", "bonjour"}, + } + entity, err := ts.eavService.CreateEntity(ts.entityType1.Name, params) + ts.Nil(entity) + ts.ErrorContains(err, "unsupported type") +} + +func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfUUIDCantBeParsed() { + params := map[string]any{ + "relation": "not-a-uuid", + } + entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, params) + ts.Nil(entity) + ts.ErrorIs(err, services.ErrCantParseUUID) +} + +func (ts *EAVServiceIntTestSuite) TestCreateReturnsErrorIfRelationAttributePointsToNotExistentType() { + ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ + Name: "relation2", + ValueType: models.RelationValueType, + RelationTargetEntityTypeID: badorm.NewUUID(), + }) + + params := map[string]any{ + "relation2": badorm.NewUUID().String(), + } + entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, params) + ts.Nil(entity) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + +func (ts *EAVServiceIntTestSuite) TestCreatesDefaultAttributes() { + ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ + Name: "default", + ValueType: models.IntValueType, + Default: true, + DefaultInt: 1, + }) + + entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, map[string]any{}) + ts.Nil(err) + ts.Len(entity.Fields, 6) + notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { + return !value.IsNull + }) + ts.Len(notNull, 1) + ts.Equal(1, notNull[0].Value()) +} + +func (ts *EAVServiceIntTestSuite) TestCreatesWithoutRequiredValueRespondsError() { + ts.addAttributeToEntityType(ts.entityType2, &models.Attribute{ + Name: "required", + Required: true, + ValueType: models.StringValueType, + }) + + entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, map[string]any{}) + ts.Nil(entity) + ts.ErrorContains(err, "field required is missing and is required") +} + +func (ts *EAVServiceIntTestSuite) TestCreatesIntAttributeEvenIfItIsInFloatFormat() { + entity, err := ts.eavService.CreateEntity(ts.entityType2.Name, map[string]any{ + "int": 2.0, + }) + ts.Nil(err) + ts.Len(entity.Fields, 5) + notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { + return !value.IsNull + }) + ts.Len(notNull, 1) + ts.Equal(2, notNull[0].Value()) +} + +// // ------------------------- UpdateEntity -------------------------------- + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityMultipleTimesDoesNotGenerateGormBug() { + stringAttr := utils.FindFirst(ts.entityType1.Attributes, func(attr *models.Attribute) bool { + return attr.ValueType == models.StringValueType + }) + + initialDisplayNameID := (*stringAttr).ID + + stringAttr2 := &models.Attribute{ + Name: "string2", + ValueType: models.StringValueType, + } + ts.addAttributeToEntityType(ts.entityType1, stringAttr2) + initialDescriptionID := stringAttr2.ID + + entity := ts.createEntity(ts.entityType1, map[string]any{ + "string": "displayName", + "string2": "description", + }) + + var err error + + for i := 0; i < 10; i++ { + params := map[string]any{ + "string": fmt.Sprintf("displayName%d", i), + "string2": fmt.Sprintf("description%d", i), + } + entity, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, params) + ts.Nil(err) + + for _, value := range entity.Fields { + if value.Attribute.Name == "string" { + ts.Equal(initialDisplayNameID, value.AttributeID) + } else if value.Attribute.Name == "string2" { + ts.Equal(initialDescriptionID, value.AttributeID) + } + } + } +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfEntityDoesNotExist() { + _, err := ts.eavService.UpdateEntity(ts.entityType1.Name, badorm.NewUUID(), map[string]any{}) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityWorksForAllTheTypes() { + otherEntity1 := ts.createEntity(ts.entityType1, map[string]any{}) + entity := ts.createEntity(ts.entityType2, map[string]any{ + "string": "displayName", + }) + + paramsUpdate := map[string]any{ + "string": nil, + "int": 1, + "float": 1.1, + "bool": true, + "relation": otherEntity1.ID.String(), + } + entity, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.Nil(err) + ts.Len(entity.Fields, 5) + notNull := pie.Filter(entity.Fields, func(value *models.Value) bool { + return !value.IsNull + }) + ts.Len(notNull, 4) + values := pie.Map(notNull, func(v *models.Value) any { + return v.Value() + }) + ts.Contains(values, 1) + ts.Contains(values, 1.1) + ts.Contains(values, true) + ts.Contains(values, otherEntity1.ID) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForIntType() { + entity := ts.createEntity(ts.entityType2, map[string]any{}) + + paramsUpdate := map[string]any{ + "int": "1", + } + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.ErrorIs(err, models.ErrAskingForWrongType) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForFloatType() { + entity := ts.createEntity(ts.entityType2, map[string]any{}) + + paramsUpdate := map[string]any{ + "float": "1", + } + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.ErrorIs(err, models.ErrAskingForWrongType) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfStringForBoolType() { + entity := ts.createEntity(ts.entityType2, map[string]any{}) + + paramsUpdate := map[string]any{ + "bool": "1", + } + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.ErrorIs(err, models.ErrAskingForWrongType) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfIntForStringType() { + entity := ts.createEntity(ts.entityType2, map[string]any{}) + + paramsUpdate := map[string]any{ + "string": 1, + } + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.ErrorIs(err, models.ErrAskingForWrongType) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDCantBeParsedForRelationType() { + entity := ts.createEntity(ts.entityType2, map[string]any{}) + + paramsUpdate := map[string]any{ + "relation": "not-uuid", + } + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.ErrorIs(err, services.ErrCantParseUUID) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotExists() { + entity := ts.createEntity(ts.entityType2, map[string]any{}) + + paramsUpdate := map[string]any{ + "relation": badorm.NewUUID().String(), + } + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityReturnsErrorIfUUIDDoesNotCorrespondsToTheRelationEntityType() { + otherEntityType2 := &models.EntityType{ + Name: "other2", + } + + err := ts.db.Create(otherEntityType2).Error + ts.Nil(err) + + entity := ts.createEntity(ts.entityType2, map[string]any{}) + entityOther2 := ts.createEntity(otherEntityType2, map[string]any{}) + + paramsUpdate := map[string]any{ + "relation": entityOther2.ID.String(), + } + _, err = ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + +func (ts *EAVServiceIntTestSuite) TestUpdateEntityDoesNotUpdateAValueIfOtherFails() { + entity := ts.createEntity(ts.entityType2, map[string]any{}) + + paramsUpdate := map[string]any{ + "string": "something", + "int": "1", + } + _, err := ts.eavService.UpdateEntity(entity.EntityType.Name, entity.ID, paramsUpdate) + ts.ErrorIs(err, models.ErrAskingForWrongType) + + entityReturned, err := ts.eavService.GetEntity(ts.entityType2.Name, entity.ID) + ts.Nil(err) + + notNull := pie.Filter(entityReturned.Fields, func(value *models.Value) bool { + return !value.IsNull + }) + ts.Len(notNull, 0) +} + +// ------------------------- DeleteEntity ------------------------- + +func (ts *EAVServiceIntTestSuite) TestDeleteEntityReturnsErrorIfEntityDoesNotExist() { + err := ts.eavService.DeleteEntity(ts.entityType2.Name, badorm.NewUUID()) + ts.ErrorIs(err, gorm.ErrRecordNotFound) +} + +func (ts *EAVServiceIntTestSuite) TestDeleteEntityReturnsErrorIfEntityTypeDoesNotMatch() { + entity1 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "displayName", + }) + + err := ts.eavService.DeleteEntity(ts.entityType1.Name, entity1.ID) + ts.ErrorIs(err, gorm.ErrRecordNotFound) + + var values []models.Value + err = ts.db.Find(&values).Error + ts.Nil(err) + ts.Len(values, 5) +} + +func (ts *EAVServiceIntTestSuite) TestDeleteWorks() { + entity1 := ts.createEntity(ts.entityType2, map[string]any{ + "string": "displayName", + }) + + err := ts.eavService.DeleteEntity(entity1.EntityType.Name, entity1.ID) + ts.Nil(err) + + var profiles []models.Entity + err = ts.db.Find(&profiles).Error + ts.Nil(err) + ts.Len(profiles, 0) + + var values []models.Value + err = ts.db.Find(&values).Error + ts.Nil(err) + ts.Len(values, 0) +} + +// ------------------------- utils ------------------------- + +func (ts *EAVServiceIntTestSuite) createEntityType(name string, relationEntityType *models.EntityType) *models.EntityType { + entityType := &models.EntityType{ + Name: name, + } + + entityType.Attributes = []*models.Attribute{ + { + EntityTypeID: entityType.ID, + Name: "int", + ValueType: models.IntValueType, + }, + { + EntityTypeID: entityType.ID, + Name: "string", + ValueType: models.StringValueType, + }, + { + EntityTypeID: entityType.ID, + Name: "bool", + ValueType: models.BooleanValueType, + }, + { + EntityTypeID: entityType.ID, + Name: "float", + ValueType: models.FloatValueType, + }, + } + + if relationEntityType != nil { + entityType.Attributes = append(entityType.Attributes, models.NewRelationAttribute( + entityType, "relation", + false, false, relationEntityType, + )) + } + + err := ts.db.Create(&entityType).Error + ts.Nil(err) + + return entityType +} + +func (ts *EAVServiceIntTestSuite) addAttributeToEntityType(entityType *models.EntityType, attribute *models.Attribute) { + attribute.EntityTypeID = entityType.ID + entityType.Attributes = append(entityType.Attributes, attribute) + + err := ts.db.Save(&entityType).Error + ts.Nil(err) +} + +func (ts *EAVServiceIntTestSuite) createEntity(entityType *models.EntityType, values map[string]any) *models.Entity { + entity, err := ts.eavService.CreateEntity(entityType.Name, values) + ts.Nil(err) + + return entity +} From dfd287ec4d8cce9d1da6e38edf2ecacb20e3fd79 Mon Sep 17 00:00:00 2001 From: Franco Liberali Date: Mon, 24 Jul 2023 17:03:20 +0200 Subject: [PATCH 467/467] fix int test clean --- testintegration/db_models.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/testintegration/db_models.go b/testintegration/db_models.go index 4bb0447c..d7553ec8 100644 --- a/testintegration/db_models.go +++ b/testintegration/db_models.go @@ -7,6 +7,7 @@ import ( "gorm.io/gorm" "github.com/ditrit/badaas/badorm" + badaasModels "github.com/ditrit/badaas/persistence/models" "github.com/ditrit/badaas/testintegration/models" ) @@ -26,6 +27,8 @@ var ListOfTables = []any{ models.Parent1{}, models.Parent2{}, models.Child{}, + badaasModels.User{}, + badaasModels.Session{}, } func GetModels() badorm.GetModelsResult {

    eD*QrU@t_f9ss6`q_91o+B)$(F)G8 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

    SAAD5)73nI$r{=f{5j37nRa)r_yP>> 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

    t8Kmok$g8P*A_4D1C z&o;gxCbBa-OTPB6c5P9|f4p3?R@Xiz<{Mk{g3;9A>zz@kz21Y_@b&KK@c-Vy>)p}e zp52kUu*3MSy~j@HYE$6gD}=K?OfrDq$(r2 zp_?YvUydv;V+4GuLwlKqCiJxO%1>s{b@FP9#DQwA&Kx={a(Wqsax$g1NG&tb%4#U5 zQ}rFxYAEs+Ur79w3oa193}w|32*$dsf^nZ!rzsMctMp-{vs3+N#K2N84>Z=cJG9C@vXXZ;}>oAcWr$qwliiH zx7T`yRK{w+)C9yXk_M{b!ognsB4~C~0kKd1Lb=~mPE=Jfw;Xx0OhO&X8pJL7pxqiP4eMHL9p|+K?qmNgx(HK`%LLbrbW#gnW)C^pQicd`4c!snnJ~C$iaNGC$ zT5387G!^PSlpq+5Dnm2ghlo1(vac&LA2}37ea;AOe;qOjw?|Poqoh~uQzxt0|IgLy zXOZYTy!-@pSt!aR=r#rA7|T-C?XZ0)-L4%i>X&rmo#=K$lx|nHKQ8OpP`68qBPyHf zc9l@KONd*_*6n4qyR4T&yTj+7F!LkLiuq1?6YcJea&$;^StWI5rMoZnQaSz4GNxoS zy3s_m?rE^C+&hE1T$WZW_zzu9S(O*by~3G$8AQnF#?yKJ&@v3KnLJdk#>cAB+jlCm zk&n0l7TAbfFd&;0aITCi80M@-#qYyW@r&hTHhg#}Z1{yv_xVoanNIuVPGecwIJL|i zaB|r{73`;bS{YhCppVY{p2ahWvrt97kY0U2N2pQ}5QBmnN!n9#I+Gc1v9-P<4mt;uPF;1187_B3sZ5ET z!dH1#432P&cHhg$qOLBSuVrsl*|@%J-(5DIDjN@%4Qf@0d&N8g}B8T?7smv}}eGB3vLN!9Uo|U!#8OFf~*vp^;LowdJFvqB392bBE3PbgN zzFf}65vfHk>Y6OIH_OpC%5hzMkZ?XukUtO@{YV_-z%@nGjDJEac6+TnyK2wg3xb^n zSZhKkpM+3{{q?PB!Z<5KL3w4%=FG|9z==t@hQ6MH|2z?juNZn}(}<5ifHnxRE)2m{XiS2-r_Qz~|=v8-Y|Rsm4kV!t%hxO1pjUO^yRqmEpf zG+s*%9=Ug@xM!&U;LxaS4eSRt9!VLOSB$GFS_Wx`Z0q=>3~^&6q3%$WPP@~=;Fg^g zXJ@L>yQxkGXNq_sS$}KNnMpO@WSN?ZCUMCzUjwTp-bvOkN*&bSo$FD2Q5pB&w5mjW zgJAkivb5{BfH$BR_V1__-7h=vt|^@7O#O4T{n-qkxx{=$5yXg%u#{pM#k?ABW9I8+ zy9m^!*{}1K<8E>G59*_;@ItWl;pESNDBB-4eu8nMwNOvnB`KK+;qK;VDf zptW(WDvfnvO}FSK2jy`>{#wyy9=Qv{3^(16dp6IlL|zW>X8?Pl{*26NJ`N&`b2XJU z^c#*MNn@SbNi40rIOI`BDv?m(%-ZHQMeKg2voth!n220AO7ZoS6!*0`i`ul!B{)mx z(Kh4nZARACOL{DWB}mnu`3-$K3bZ?$C35~G#lFlQC`y_t@GH0zZQPp&bd!wU-i*oP z&ym--w@N;3xc2{8e?=IEnO7w6jb)P1Q254y zB&Hl;Y+)1IP1OCLh}@nji>WH6QC`3a_XDA%7Cb%$<6k5VCj(oIP{p{lPW8^mVzu~4 zVV)2ENXd#{%E*S%y~x}3I(8CsG+@%2^tMukCvdlI@ey{*q}E{$6OBr0D-&~%6G3HR zxJ<54Ss0!~{HZ2msQylm*l+5Q!^aFr?OHc>ohvVQjjP-!euj)cSrEEP;fGP4a)vrD z=B;P)$!GHll>2iW!bFjOR6Fz*s9a-xKKWWcYE#EN=Nr?i1a_v5jLz8D4u9VsaGi0+ z-ugt@=Ww{BC*}1>l+z#+2|*l3$s3G_6iO$W+hxDd0aVRyHOG-{V!i;#9LfP7@#3RE&uSQ8imH4CamvjQfx|+* z0H~TlMF+&Jk#5o<8M||lV7CGC-tuGKUm)yO4I_;&=+RLLkG? z|7^7V{^hrz2A9i->iYX|z|0_Umk8 zqIt0>pTpUuKU*}PVy!({l#dq?B~u6l)idSBGp*X0vUa8yp7~fY`)|TeLIBD4uKX53 zN&Cjt4kKR~TVJ~JGuHA`SAL}a{t(p(z@nD>uPfxnE6o4(ig(@Y7o<9~ziO0U5blk) z{m1Rk8ylW$K|Oh~MLyR;#tel+d9lS&+s?BsLjrMHy?184f$y8&e|yQpefL{0^PN{T zGmraBPSU#Fm$&&*J-FHL8A9Y#=d4Qd&4T}OA+vLVcoCI%{Bl3J(%{LE$k>8cAoLz6%;k!5OLbkyw)HRTxTkT__w<(ut=f<#* zVJ`ez}N7L~Df+2OE6+o>3`aXVY)wabAFu+9gShOXRD*_9fq56=yAhNp%N9qEyZ z${Jy0od#!=J32FJ^jNEoj8J2vbwS+~0y~sB?nRMxN>0yKy_uee#qd55Hr1t1Ob~r} ztw&*e7ybqjH(pz&ZL&RmlkL%LZ^80|++?S^XtAj6_;hf?+jvHE#O}aIkzuC(Im_-W z3VhhbG8NoF8{)wz7K6V_tak~w9f@h$l4q!BxMmilTwfj(SvsyH^$W||MJNPjCvm-( zmaQww1aUJ&5*q&l_EohS!lpLa_ej}#jPqP1pgRFRxfv zRq{SlwoD9le<()}ue2RjG1gR!F;vt>QE`t7|5{zKPOp?s3%8rLudY{DoC_+mfi-ch zlZYksOq2Uw+4`{DG0WXdr$DKznbY0Ph!N5glhdm!{@M!jou}VX@$anU;nY-1pzdbB zz&iL)#s6nTnGh1DpGrg%XHerI6ue%<>!Sc$R2A$co?-{2?S2v}HDG{A1H)HX60)ae zahcS~eoW*k{MJZJN{y9i zSPW_?UIor3b%x0LnP$SWjuiEN-9Zq{$ScH%F%f&I`b^tIp6u=-UjuQC@Ga(ibR?2L zGQ!kie_gS@uQb=y%y8EZN}u>(4jHt(;gO6iWtfKX3L}pfBgRGS-*e~fB42f@`oy>% zxl>%-@w6e<*+ZHWH3L1*4-ND^+$}6wRH6(kVHJ_zbF=L*N03&Sd(DP?wu_w7qq0h1 z#Jzlof7OuYs*ztp%;7D@aEl4b!r#a(7IBN&INrHMF!D+3?DC9$5w2eC+!nbU zPZ?&!Gh5_oElhi-w#buNYfD??iE4dg##-Cmadb=1;+C2``FPC+NHpwB1r+Gg-{ZZz zLRL)71DJb<*K=!&+NP|w(E$coSvnV7P;F9wZKD=Jl)Q?MH`Aq{9~XcHLDH_m;F5y0x>@`pIc|YT8~~l7B1FwlmV!lilSP zxjaAZtLaljyJ=nt{r^pqqV1=BnBU=ykym{vB_gaE4-lN#|NK1 zNEkNQpR;?r9%vB{w`d>zggEYQk@r=JV{ME4n<9?eTjVW@C~j_%t82uup?m0xmY(Yd ziR0;7b3oJAh=W}0|MwT5M}`g($Nj2Vee}mAyhTC44Rxe?BIkh#61DdOs+M)6(7`)kHrp$xrx% z4pehY&yb^g{3Clhj_3hubV+*R%cVimRRx_O-7P4Rw2evHLG~-B>_?$xGfp!M(F@=3 zLQ4iH*~m10Q9#%5GZ*fg) zd5>{Pk9%>CbxBY0;vVt3d29_kP3t-=h z`GkyzNzxDrOfKBpC^9)$$KAru)He*sG7_A!`7ml>M>oC*nc*kH)Knib$pH4%{*VZ5T**&rxl20PWA zZ{f~k^(wUxuf|u&fsQ+n8FAskw0UvgFqwa%$A7Y?@I>yV9{=UA1*$UCM+AWq=6)nA$nRbPa{9UfZ^UH%M?HzqEb&&O z{G`WNT8HuP<3{5Hg&Yg)DIcLW=^GmNdc866Mx&wnL>Xtkt$n3k^+iGsp^ioxfY2B< zUw30ESp+)g06ihFM?m{ILG+?A7bt;g>;))wN@!HNhI-W)l@47Yrx72dN3IK-LwTno zdP6IT|4pMjs+Z>EL9&AI{iZPr1VdG}Oq#=%G|{N<8W;SlG5!^e!U&=ob)#0bk^BNu zCj+b;?L>XmuHhahsCL~!yMCjSIw)*ckOrP5iL>RRQ2VAuQbkn_Y6q496R1c@5<5r*9`ByM47tM6kFk5^2X<42C~`npAY z*P=bwTMJqVWBNkCru|Bb{8vjga0NWZh8DwZ@eDn9qSt@AH}O=j`(<|g^DQ+-d~S^q zpDGZ@j;Qfr$a<5BVgzK}D*7O6CGU?Hit}DTAjfhMjZmns5#6S{wv;tLGBtma-uPX@ z_%_kFIFUctIH>V-BfnfXF3`(Y*8A129t8@vSX-2Xm{HXP;7Vlq$Z&veK3X>fH#Q>U zi;N@04?4My(h*YdMaEZb)GGcHk6ByeUH-5CZIJ{2|DGsaB4mpZxobqq7VC=1S8Qe966mr^>tr6v#Pf`Okt$SIx$Zlul%R& zx~fh!jQ)~3nv#IXRoXSNwK=zQ>uf|0#~Hh2L?8ZeGVxGy%jz4bkmAEcbctt^5O6h{YhmiBaRNPOs_REDKH;9&>H?@tm~s$G=~ zq_1bv*St`tegL<)A|rlCX@{p{S7y{5*JQY1dF<_E{0f0E*8N_xru0H)RKN&RLyuDhxhteZQ~)>uL&)(M z-jkWA8!#(#>z43B^MKI{v5Ki)+7Z_zlslVmu$lS>3TrU1BMq9~pH>a(HuE%yVo~N~ zlyklN?-@i^=j=3k{9PG&FS?EO zQ};pMQ{ojwxg#2aOMFt;<#*8FIWVc6LxEsmrRu3E{api!N1A`3hb9qSB+FOm?CpN=1mFV%MAh8jiyN6V#%ut=8VpOWMW)fwaAT6pb$b|*{ zZ=t@dIUO!F*%*lEeRnpCvzoN?o2mf-=0nXY zmFX2teUCN|RBsQB;{8!#69Z?wLaHd{IRHjc4VM9R>jT0bYg9wCkKS@w_y&D1Hj5jZ zw41|QH%s%)@YZ)Wb-&YG`y#8=t@#|sZ6qE-aBC0f2_F!WjSDzd&5!k4Gim%WqW@7f zOv=p!NmSJ=p3%q)T-0|_+`K0wg~}i|pUQ{eoH3j;p2L7%)s2eWD7?i~daiaD7FE>2 zJh&H#143_`xm;|0f#8)kFsxX@3l72gNrQjQ{q~7O1_+E-51k%9w0%LcdeU5`khFpm zWfe5T4LO(DpBPB0DKEv)v(b-3T2>$|>*%sPp==*t4n;VL0Xn9xo~5@iJ%_Vrl$WJ8 zy1La?^z_DCp%!qfG2CihIr(_mc(!amQyx=o!%o$^sKn9a>W1dbQ)8H1pKaB8@VZ)Q&|XI(Wdt+B#ii^68*fAHO75VVO~_@E{qUtQ~3p^Y4n3aTSw&< zf}@U(Xr)rqbTC1NUve}biBDf4*#+(E)HmaJb6ZooxpurlV_~38V8Xa#QCE>=IMb66 zJvbq+9iQi0J4(DFxN3W@UmA^r2R%BvHVd#UTAx&ggIB??#{lVogmk1BVJ+N zmY?w)mhh@cwRDZGVeW>V6i*I|nP|A=C+Ih;OCRIXS`#-mEeKOKwhlHAv*<~+_T9iG z?#Q+g4I>$KyHq=^!g!_ARHwi?i~8hw(vy+TX1$oM=q0-iV=^EBc?7O|yNch-Zu5b4B~bqW?tEezrLOnWANqEG&`ClC2WP z8&#^glOdTSAUoX$c0HD=1f;U)u zW6@!`!7qXMZJ{5G8YznjF7MMXuu)?M-@?pNC0(lMMBB4$03NnI-{L)F-39vF)k?$J z<*MFrBK$pBZt_R1o?dw z_Ex2qpU1B%RhlD+tcu6=*{5hp?OP`Rx+xO7GEDu+#*IS$QxhivEERu}+L})LCOnh! z_D*9(r+uJ(dq>=`S9g-<#y&K1cc#+~G<{K>`9q$`U-Pzx zki65h04)%70r|P_k@8-q0p#Bd*rw#uX=GunsNU5XsVu5c^NNgh1LC=VV@9rF?cJ1- zw~|iA%OOXnYWYnzIX}80BmcMaqc>#?;NuxRY2}WoB3`BU?@oOYJ{a$?vizn~**(3Z z%2Ih{++)k;3F^p+Wx2G>(+W&zxf)VdT_^uvuVZHZ@w(u|^2VnwLfMF~PZ_VJNNVa- zE#~1KJKS>`rF}is=~TycZW4reL~j#vttwKJ{vLg-?%TNhp3EBw2UW^bs?^3kt7BYx ztsu5q&$!nMGTua23wf*XZV?Xq>b%Rtv7K?Q7T8!YTY*USZzL);xta0D31&YI6>=%>vn%phx0?bbKP(wE*5zpasTbcKcUJJ3A&u0BmA`Is~ctPHR;D@?w30q zmmsJNGKlE*=Q;bcobh=s|5+|jtcRVK3j6NF!n+doCFuherx(7HJm9eOtcSqph8*og zDuH6R<>!2RCga%{71dcMSTYFDDUk!8s+J^6BHW&l&1Lj#g34JL zmUzajZgX}{w2W(mLcT4VCR@y9$T$9sMLc&E>qXp-1j6~2Mp zsGMt>Ghy^hZ-zh9nBmVFJOYHh_+o(} z^*h-`#-`&l+T-HCjHcG*8Mze3QqA^bF3;E}WKeM9KPtG@Xn5|Y&Zbv^;lIUwv)br)LDaTU7a$DK13QKK8$~}ZXBcZ%V!>Nb6ZIL@w#4b8k+x}Ps85QVtZ4Hc z)glJY# zMtWN2o{|u3^f@VCmeH5U+d{qv`n1jyvSHc3cv_d0H@(SweO6?Isjws(On%$;G-T z>3bL)QShd_*n31(#dSGR>GeuVRO_hV^;Ia{;nh&OBMjv8rQ&*RiP$P)p6W#wYpn!U zplxg9vs8tuC^Q$%ISSi%q%ihQPBwNhMjGb|^6?hzPJ=mzmjOzq(&|td0PF@CF8k$F z_N4U&BB-fsW_0QeW{X`iD0iXRM&M>N>Lu{P2N?T?H3b0gAhdRXE+*8O4iTEjWi1h_XPkxf)Mk z+=YQQmk5129uf8ysg`NOnNV7J(s&-SaQCjr!#qTvA_roVc+3C*uqjP&w*V?vTuxOi zHdU#;UPEZ({BG25MQeV%oWk+!pi`B2rjJL;daChv|ml zi=k{}#QbgKSp&ZbAJ;WTR0r=wT8qNnNE>79lcX_tMGO5*hZ*5&v-Q-dH&1aRZx|yb zF+~=5Zr7o#4sqhdW227(VK8)SE2~qROS*-uk+8MoA;tt%eBNk_YW5!XfyU6dX?Ou9 z&9RNRlGUENxCaQ_Ceotlm5nJ358dr`i*|?69w0V05w^PVJbb^{nc@^{V@T$A(spj# z$@?Wisg{|H7m2~6P29)x>WwoY6}#f3c^H8`#Rj~H)bO4xs7IlbIF-r zQlCY4qgex5vq-eP#m?1Ez7iCG++WOBl=GfYDd|am9(r#gX_99&@M{>uNm3POz+(4S^Ftn2d|<@PKfHMDGLIerZ_6bPwQZf0!nO@K-p6wD~Q zQd_I7(8Nk@kshv^!`}(v@BP*a#4U5yuEkv*p)w@BJ3j0QB9c+dyVyQoh)?XuvsMS( zKv(n97iRG*!jDMuWml->H>AFqk46uGig0%Hb})uTCldMN8j~FOF$sO)+tijjq=2YW zT4AMDTG18O_!}(ydMkE=Wn6DLH&|&o>MpD6Zp*&QI$zvt#nmO$1&XI!%iTgl_6{c7 zIc_l z?s=BVsk7Ry%7;Ib$LVqh`6sfZZRs@lSHRrRZ84ghDCDEU>oQvuP@;o0IN!uDdm|w} zqLD!*io0AfF_lSbhS`M>K>cKT9-HLw5pKku8o5GFt+K2!a5m(P0@f_WyF=GyykDJz zjjl7YlKBYQ0P8CLfn*|__`@RV#06Mm#X@`8H=H{#xSPNVl$CLZXlE{|MguDiB}4KO z5NYUNu571oh+u5_l5lrO5Gc8TnND zkuO>7-B4kaKw&BvI6=sS$jCI_brVJp#+g@HDjpC^kV@_22u9UP52@sA`XhoDpuLYE zCO;-pgJE;vnOdOOaIV>rhNQ5KhLerUtBeC16^THH&?RpUbXd&Tc>m$RePrYst@OAs zo)r2MBEC-D{|WB@H1`KcpkA$Z|5i!w4BnqZDsZ#T7-xe1{ptM&xc^G=cd%PBcgmqaAGplHHmz=bm#D^+O_yCHp~}iemCi;%E&vfrz$wQ8P5}c%3Y!IOt&D=+IohY|x$jQushon5F&J>8`^cgSQF7&;WCTe*5D6@J;9 z=5sG5E7t$|$VJ9~-UV*D`CPtoJL(!-g$}z$P0Qb;@qn5~>gJb8{fi|0QIA)X5ldn! z!|&V(nh-C9`p%8|udsKc>Qkbad3YX-ZmE1nTO#FB`PU_q}O|4j!4MnCHaPSK5%b@%g*=&L2Up%lDbik+pe66fk-nLh1wJ>lsm z>+$fM?N8McN}f@wA~2aWk{zX;I&eVz9%i4YHgS>A_aX$dS59^^=72F2*W)zhm$u~> zjM*)jWnywX4I?QNeX9h+K#Q5H1R~Eg;&S5zjBQU$og@PI9Cx`aMeId_e99fkp$VG; zE0S{Lq&jZUZiWpKov&Q^wpgo2zB9%l*oaH@X=m%!S$g{wlzTB`$ML#-g6WFyuvc}k<%H^J2R_M$7Z6OVib^_&0aBJ$E zb9aypus7M6Wd2s{#`T-m6*!p7G;jP*M#6A35 zi#$viy;d??v>`H;%)lsQJc=PA!9E#}b@`Ph6cfviYG5cjtV)(3YNe+jDEoSQoWP<~ zhwu6BxUtpoOt@bdEiqUBSSpWrUb%A+wQmu-_e74f$fSs|j+|&D9N|~yi9XaAGa7+x zHf>9?8*yHyeJ7SnyLC1H<=<6VW8R`)KUBk8mDk@=>}91`rmYYv))Xu?aaTKyekkN2rUK(972BorgML=gc{e3jQ7 zVLpOo1Ttt))khFEz=iSDS=3(G$s}>mc9F=hVE7(oOO$<%;X_f=J+$3Ip0^gBH!5P! zz;Q7V8rnRv&Z3L!dF2ehOl{_2qHs9i7nCge(bK776*!*xm%6`7El9iVIA~Ri?h#mf zcH!xcZL2whDu8n&dOO+#OO>UWq`I zVGeH_k?*V-QX8NleP}WRrW~f3_lc(ah2i+494&4}Nd|7FFEZ^5O(Xn0O~P zcb#cpYx>uj1fXAQZokruXT{&ld210wtouxd^&O_a)-=*i5IkKD?cC!+JGUpXbN|$4 zeUe%7%)3O>-GCXqbiCMVak0JDjN5^Q?D!8e#f|PT`_}SkfAHqfyD4@d9x`{nz%;TX zk6vxsYs`8K-{KatZjEWIHgjuCJKW2!#~$1Gn>p-GiVK-@xJId&iWPh+5fR4lm4C)~ zpUbj<(e$h`RxMJuspZ>)?!K8ujT?tF^0*nPRWypyx@(VSVob6tr# zcg+oT7^QR6z_MAqg4-~R45@R9+lKu66D!Q%kXjzZb$ z!`!330SbFFVSjnK4U0-V2gH}C^e~y`FWI@5uBNkouYnNIMteJ})t)1!QMDywaF?*l zZ3W*@1`Qz|7v>y%vaZa9G2bx~r8~mk$@2m=V&_F&#B>p#A0yC;xMz8tc83&e<$5z* z@e5-)7}=R@zKkIX6w_ItX5#X<$uZ1-X2K-`PR)U57?CrbpHUIKGgbBQ^!(e+*E~Ew zDZyfI7;b-&RpHHFTJDE|i)D*X`z=u?{sUJ0LCbi++Tvj=Zf8<%V@ekf+40A0@uoHH zQ_KCtDs8Zk&VAV#PNU}2n){Sy3{IxOYnJ<})$qI}-mx64&_lvYdfz9xpLMeM&=Mb5 zzy8>=kdk7O?YW;?2|eC!)=jVWeG@X+IMQ=GtCEud9!@DCHI3<6jf#?-2Pa#=_88Hx zzQsOFJV!`#qH(A_-RiXWvs&z(@yc||DNdummvM*@56mcc9D{9Lb4-SDq6oK0OiRa8B0CM`yp$33W9V|T&aF4XnKa0``G%ZmP&302=(>(E zk%G2Wah#+1FwMVi8d;j#LVCTrrIck^;)tbAUHJRC2v_ytZ%_F9a&=er_+!;Sis6xw z;V%bTkk`D(i_UOnaq83Ql#?y%nNmENw-FLG+2A(H41gHqbop1ZMbvBcc3bW5KVs@G zX!T?22AXWb`p1 z)<@Q`_Y{^zEGmP=_hhROD|t@1y4DF-CsZR4dR9oLuG<8H?QFT(#`)t)#0p&B7Cwo% zppARij>Hh~BTu^Bp)D1cfYpEysp^KL4yVAc)bMVU@J-(D*;V=O0dFK4xO09-I74*& z+jVQ>_a*|1rX)M+WJGCn1p2}w6AeJ?(o?GZsoopd{ubpjhjP$$!|WR`1lvC$kIlia-c zuCKlBJC}IY#U2y1@#olDFMgBPE>m`+#jI_nb_u#kSJz|gnO@l*wtwQk-P|X``N;n< z!@0LQ&1U>G#W9dD;u+?1#o(0-g@b5tg<#Mz-oj~qz0ezFi}6SEa@!bT zkChdtk=n&c?@Gb!H3a7gf={=;5Di~mPJT_Ie1WR+9ZWGBuhs|*V^Q^0)MVjYX~(sg zgREZ9xVj1a3`OKso`CA{SRG$Y)~&Rb$`zJaXhH{cvq#IR`mhiSK_~_Zi+L20jtdG3Q-n?gT$c2>Ne5y?5l1Q2@F74 zM_Ea5jsweAM~D*xb$g{PrxYs?-(Z0i+i@9ttA`bBN@Us=t^xALbFj*V zezgoNI?uF5R9EfX?*)xHfE_!tsI{`nj^s76wG-YZ`w7BaMyw;+lA(x8j@MAFXkwdb z+!n`ytYD8VPSR=VAS_tDzIsEIsW^^{^aM*Dgh2Yew~y}J>T9?7{x`1mwQDZ*@+W#N zNV?!z$hIGEw2Ihw01L#;rWm$$7DgB;!wMu2O1$oB->Gad(G9NqwrfA_YDr}P7k9X~ zihGs6@jmwm@v!T^ZfWmZ{$;oXLJ0Jwu6_~QOe$Bp@){LUJ}QnXKDk6c!ir>i4p6y@0}fyFt+#3_z_qQkF#qLaDG zOk8TFuQHuW&E)>UF`jl5zMJIvg~B-n_o71P!h*lvds)2ZiC4Wn-txqo-a+qs!~PIE zrXhJ$gFK-jIKCnFh5Le7lZ{{N0gt+utD`r0_RSv2avt)?ZPB~Pi~ry{i#+Nz8{%ts zhwqrF#SvcjF`k`_o#oXXDlrXTtaewTECxldHXa!R=wXHez4ZJ@9?8*eB<*v>mLPwvir|M@}YuUR|p<2#8!B( z2wS_(%QwUx@aA6U#nsxm&a&!QrzbCuk-B3z0NhBw%W7T zdD`Qo6`lE@N9GjgW|EBN*A(h+EO@sTGPe|VlHvic?S3zQpLeRTH@lm|nFqX`|LGaO zn`Di-$=9CFYp40SYEvx|uRwd}`SKz^ILmLU?e%W*{hNJU6}R|v*4ECA55AUryN`5# zmp}hZ-^lh_9);eUul2R-eET|VtojOHuJY}xeLF!}scU_kuES|&TgvevuJ^ky@$HMl zy{rAi8b80zHPYZu-e&g0zo?*{9-Lq4icd{3-rP(KY?g?}w*?N|FyPxiL;4T#BcyrJ842rRN z+p^Z|mmB)tNlyI0MV3sC6j&J!=NwLoVXy(ef&Kkkqs9G&V*Z z)q*e`vUNNt-vN;Hiwog-SxrHcefNt>DpIBGU0>W4Udq(0)V?wb^egtH_DA(QZx zcLm9gnSUsUVLNp`STZ*_LPULdzMmuwNHRc&Z~?hEp)QeD#gEeD4#lx!Luc4o!);2- zW~fb<%hV_8(hW|bxlt?Tn+r`Yl|lW|%c4cJ?a?Ya4r-rRPO5w`ov|S=Fo9CpHZ|1l zGKb3Hy~EF+DRaJ~KbVnq_a6oSB>NWqfO9{CWB|L+AP1c=LSza^}@g;0g>hJQT*scF(_HLa&({{62q@20Cy};SMe$V8 zt=FHaH=gG&?S*>zvRbdNmv7W-uhv^h;^Q4Hp@1OT-<sSb{R9;3jN@(oU?6g%M3zG6hN5!IJ%Z)?~ zU4<~K5YTQpN{PCv#7r>I190x=EF~7dpZsRaW#qwFGfHn#OCy=IfVRki0LdkMg_~5C zJ_en?>Y}Sc}w;58@{T z#_>Vt*}9H({iHyAM)U~gb>jrx8MFvg76oESplks&g}ovw`8s;#Q_!2efU zwh3*GDz<&ZNa%>RS>^1Nb+04SFw~^WUiIwm9h95 zs=68-xfW(ON5c{3%A&eSyV21{WM{&N*J~+nuDuU1iWdb%W{k9%3TE4zwI7)=I$LtgIT_ERzY z>6nHQd5Q2}$JlJX=s8b$&eLA16Y~Y+jb7spSFUpa3VkFf7{N1PNDMmhZ7ls^%=jQS z?8CV6L43;lF?*!FEN-6^*LKu4^AX7mbE)qi>lqjh&(4e6Z^i9-4h1xTl>`mn z0u8jU4(!V?d=s$HPqn(M<1;S{YI_6Y(m>;aH{vaek!jZ+y>kRb&G@lmtbby`CQ;B|El{bO7sjY4e6;9qN{Jp#=9@jw3Uj4_6T z-+dwx$JqH^yg7Wi+=e(G-7wyc_iu=6Z^z|Dfp%fwv2BiOh!;jFVe^xC_lNN~FKvGt zPlQ(u`7lnENBcY8mE-@4PvH0mwPXF?#pCa4HQUE~TJUZBY4Lqrd=cO3t9b4Ql^CNw ziM;pk_|AtXjDmL)l-7ztL&4oJFe)fN+>c;Me&MkI-zZr1HjuZBH5A@tUF3`N;#0y8 zK5;|bGYeZ9y~Zf-YG0jE#~J1^K8elwlz=pD^9o*{UGVC(dXIXkFdt=| zXu@luu-qpLd8rU{6^e2UGY+}6P=d?w3nl551zr&;_Le0MI2>q46jcY>NV&&>Ixr;_ z6y>aJ5nFQg_Bd$gt6JE@n9znWl}_R83TGdL;@km?AzGEIOXAPrx>Ni@IWjw_c%z(g zouN~%4cmgtC|#_a>`v`@P2w+H4fa%QixeC((<>$ZnbU{J4to<`m_EPISK);?ZXBkbW;uibBz?9(-Dmp2J(wtI+kmGBP}-ss?BA!dP_DoE_*bK>dVcRZ#(|9~4lFhLHT%wrl z$1p%{I%)?Vn(j^&!TcEMA>@^|QuZmQ}m;R+|ekTdnqVEGaisNhyj;?^y1Ad@k?`a zQl19NuCH>ZfFXW@>2yqFajF>FVsz5nCTJfqRoFoivC9(frHSs#5>eZ|HsM^BFfL8F zS0$*MetlxARS7qS4_(d3Dd;(lO=up3r<9|*YGeA)3PzLezhsYB3A{;?f+7Tv6kruL zpKfKfWtMaSRc!@!39;@XmETy2by-S*9m(D%BA00t`jc+2K?29Pjm9)`!i3sA0f>b6 z%roZdj8R1Ya$pFu@gxvKTs=RsP6IClb4G%*h#>96DoEHQlyQqd(0WXCJ}QPpvJ{H= zSeq<|CN6NcP~!r&8S(=B3?7@)cOX^ zJnWl(z)m6V#z#G7V+1$egPUF;js?C0LCpw%Q{nF=%8+n@c&>V6+;Y{49U!C?`a{ya z4#-2vatQlk3`XrTEkfQIY3Wvsj~@*J>10spfq^RLw@i`19{Qjvjb>Uh7fq-2^_u&N z7JHLysxcX}3$jHotz%kt=t1hb+Mq-WNo+C>0IbHe+hV2T$jD{nsSci=!Z`{7eTEqqBMiE4xmJ8yEo&CPgR~jhd$hfAtXx z>~^3UcOOE)!NRKq6g7ushXeS^M@wFMPUJze2n2|n(3WoJ!CsJ+jSm5vx>7o8q`X$< zu9H5#WFzOErraf_bAWxOCeDDi8D!^bZcMysG`=r;Us1vGYTQ4efX;k?BA}Ur;hnZV zw+gv4v?m!Ce+V_z9CrRzu-k%U_MY7+dQ~1GNOT$WSdL`(iQ37LOm@nrY9~slcwVqq zxh3d24Qu@6ru8c)>+YA?}CD-C^x;k_&DwHhg?!^Zv{uy~;f zRYA4#RwY18!i*J?N*~O0PuZn$P^G7*P8GNx8#|ctBq&3F34ex1%o)?Ep;Y#jV#W%U zGY$S2S!GqMjID*E}?MLcOIVI7ApsZa zlE)!j=>(2*P$lXAn)evb81S*-8Ss_@pSp!D72EHLCQWB<#05dM!kjh0TP;{Eh`G*E zfaDFUlLr~gbo+E&oK}76(?mRUPc^1MAKW845U=9y!oCcFcb&{3qkxN+)zf2|Qjo{d zcf`)g@o0(7S_ovCP9}lY5l|pf#^+X@?q96iS1F8F_-a>R9H4qjBvL201wzM0d-WC} z9(fTlmOls(6khmybM=oyHraKV`~ej-dxyct>tSMUj9g*E&VjUvx+!!8fP#uJ6sCHnpD@N1du30t*Xb$rT4pTp6Tz$ckoWcAJ$=aS z`oMB)oVs29;^(09G2|=dwOOm9SsY&0CZXgO{H+y|5r6tRpJVk4775m6 zu64~C8|Sp@ny`#p4;+uKDe<9^nbiApQ~|@O?iV><=;7V8W<`fjsECgS7L`UsEp@vy z5uT?-9&?H)mf{gncv3W)^=1=Rq@rH*3bJUi;6;aG)DwTGaiI#6S5E&Oww~JTfc)6Q z>pg^MM23T(bKWBD2Q6HksQ(~4BH6Q5;X#bD!%;!KEPlM|lKL~H%jHZWPAyNIC>xgoN{2BzOhoXJdNuvos>4!R z^NmjT`*QqyGI^CF?lF5-nqrw#dS6ajrB7dOacJgyGPTI*sLFcR8YoHQ@n?Row56Fy z%yjBhMwbTiWvqTPIa95AdjuLngZ?`V=Ch0rtkQXukd?xoXAM!gz&Ze0mSG$>GV5%I z(jO&id~1m5K&bCg;fAjdJf_DJ@sgP2Opk|skiyEdvCp2U_Sv_r=(7*?TAy`8hlj9D zlpS5R*4@};Bq-V=3Iu$G{6D(vPT=rF`kTxPnv5pRnLY*Z&@A!F+l(vKS04@b)mx4@ z%o_WtDV}nm?(wVCkfg7s(T#Tw_SIp7ef6>Gt7#~)Kk2I%g}xnyc=y}bOBs5JDCc=r z$ELmX1-y0BURo{fu!k(+jwNYTqZn@u1mPwdbA6nMfU-<}Sw zSat)M>P^2uymgU6KgC!>vMF(lNVg!)7Bezm$jSObU2{WYL2qm*!nA;#++RhPJPqW8 zS>ORZ@|ZVVw;s^a4{Omzw-A3sE3Csg-X`l`(3)S?%$GFl4NbnTwef3C(1H`~-ec_G zXnV|eR`9Jg}Tq%Qc{bhDXq z2H11$HfsyF*9rVFUJy*-RP_aGAMK&)w|kQnOm;o^5${47Imz#|7Xd&oMJ zRF~)x{<_B=c_)AQ(V8N9B-vY#=Hu97lK9&c{x5`^t0*F36|@$8w%CD>F##4gUn^2# zI%MK5jZ?8aJ#cr0i%JO$+LXu|D(bc0k|d`~o#P`B^Xz5997DD!ze@;RnQ)X4@}_kccQxivZ*da-9c zR3`N`j?vJZRhcI!Z$BM_P)Qz0qLx;R<3Oe5$1vgno&`%p1M>taUS{awqm2rmV3Ax` zo!oC^)x>NgYqL#LM*DAbaq9F26yDfE{o_LY;W(-9G)D)R0F3J8l=#1A+!S)D7^ ztFb&Yx*!;b#1}=5N^g|;^&{hUL~-)ZlnC=ocs2}pFBR+A4)CKiJS2;BX^ec1{5Y-iV znMCMbs%(0HQ(@hFi6Z{4xdhDRfpqVyZwdR|0zvsIqV%cJGg|*SF>AvyqWwRVy?2~l zRk{Da*V=3CcFx(S&Y3g4XG)TpNt-lMNhl$WPNI^a2ucD(1T2>lnsgFTks=Tf5Tyj+ zsvuRW0sp_`fp$is8))st4 z0goDVEATz28j-xxmfR(U?YCi9t2B01V{Zrp+7R=@#12Ry<4re-;B}tta%@}FiA_%R zo1#!%sGJL8X~(b&qgStPL8xuk9jx{3_>+`*FbW=x)HlH2AjUt!gl@l$qba;8;_PAF z$KhT*$k_v&9kevYC3QniTCOW@o^neBqmxYN&$=vTN#zyQ`!U)V-LsTAU%C7&lk|&p z(|pQX_60Ov%Bohivx(VX2je&7x_)0CZ@N-DVq zOqd;6vRR3&$A2+r_5sqD|1#PCCfEb3Qd#{x{Zdk+&L86=@EWvKSIp09^`KvP%X8mr zj|$cnyyffUTcsUDZbu-;h6}o9M85Se-=-FH@3iC_ zMh?h1xN0t=Zc-*WHpH(J--jtb=i_^Q zu9kbIreCZD|5aP6qo-^6r)v7STJUZB|1(@O>iOR7wcHIgeQPcFLT!mpS~J~tORaQs zExNtdd|Pd03$d(v?&G!GgEjqlEqIJ%Uu_=FB6qR2HzVs|UDy-%w*C@= zN*gebO7htRKB+lZiu&L`D7o+QrV}YLioqnCE0tPdP8ib5LqE4)+?&Nr-Z(cNiTBIx zotqMm7WT{Uog0d$f}uXXa(GL7u&R1M!@DbMTDpNX9MCu@FEE?6_xf(f`JO;39~V2{ z?E$8`6q8+tjDnN_lU-a4#=vXnBd!3TV&kgjJk;Sq(?zN^hnYBN`H%KeTh!j%woP^B zI&^2y@gvo}SJ!7$Z&T0Yfn-#<4L!k7$KddA{lCF@w0Wd&dNRh`%t!$6=0LNM{~2gA zR;t7G!a4H2G>*7kR!;54VRP9KxYe8^8`*a|Ppc`{Fuv0UVgpQUof4nC%djK@?*_|&U~Nlcrq zh>@T_iD4F)Dj8gB1Aw)o2eaYhlGv*80Rp*LMzD%~HH&wYS?{nvX6wRRw>kpj-b8&_ z9m)Wu-`?1~D*oZ#@uG=O!kh6erfMPs1-sFR`M3kHN4q)^{25aTt={oe`$q;aOZl?&(!{h6b_8RwLOWQ z%>?_o`xfR9c>MlgNcbXZKg+8-Ff0`hudHQq$z{K$N;O-KE4iY2%a-4SlC;&>^}s4j z*c{_ZG=)4IT6p|UFPSQNwSaX95CnT^MK?qZBu_qWCDtjJ8#b`^tVbdwJ^=#|;Tv{C z7TwmxRFs}xjiMX9=mtdU*VP2>I1gyV|8vKdp&wOTa(BM>YQA>?6zUPK;QCHQ%G z5s$Q^?ntgXd9@`)v~qPoE1uSWeq>7&jYTsu`iE*34_q~V&wso^`oO(-;KAcR{<{Y* zY}B(@cEZC;TUGWo&;6_)O>?K$4z+9dCT1Y?+^S226_vc!9-P(@1y1UykvDoltqelD zG#BRZBj!NNjc=v;_qY}A1DTbZDsv}T=BF@85kZ>5Dq=5>?!1RLf=}N*(aV2!OoRhT`sgkU($s0 z=C0E5Wh!@tjxSZY(+U@8iQxgW4mj`%Eixg=skSQn6;-C-Qy8GvV1Y#i3DgL^8B96K zT192;v}`$};;!7UT>Uexj>LX5JKo4J|DDP$F8o~Q_b%yc$n;cS`kTR$vz(bdO06IXK&j+i4!b;Z0=meRn0Tgd3g$AptvU_GXZndL>OyA z7@eJ7eH?N(PBYRpYcskJ_F>OC;Xuh^lL)coP!DP`*>v1R&XY8!cywe1S-*jr{sL@V>zA@ET*nih zG|n45!L0F*#O^#fId@cbk$9~;myas>4ffPHT8vF~GhG10z{h@yJ&C%Iz%qq6S z4Q6Lc^>Vx@$lJAS%hU4wRO$0z`65=d6@ZF8P9b=Dr0qt zM#p&j){z$HUQ~8$0zlDtYiRQ-ZcAE!hjVM{uU&H;c`ZFTF44vlm5|S@en5QLE%>s{ zmE`B4$D5Dg82_m6M!2~)omn`U740Y%v03yCzP6b~sq>m%GzqPU4k0Gw@!JeIugfhy z$tyK&RrQ;ERuwK0zLfFX@Ri%R&Cp#*XRO}_&J#p~PwVT&Z&^zAv#wVY9di|Fjop6M zCS)c;C~RH`Aqv<9Mll{X(_HwHQGFp_j;H{_CZWqA-EmUYD)b>%72$#Dg$j^F4gaa| zKnkRnU&Nj9do0E<$!yoVghOU%7re;kI@kHSyO201FEV{)9G0FU;BsIx6Ge{BlE*r- z+U@P1k=}cUMq1?Fu*}cb%k};~$0wN;tbIw6@AZ$0)w_``Wb0Tr;Fz!D?{~Yk`H61+ z85$$Tq#fG6&eTEjR*=+WInKJ@BTW_PC0>vo`65h~H9Uf47`3QBc_Y|y67S6EX4pMU zz-qt?_^F!=zlZRyGsGb|fyNS2-{mZ~k{Rjayz1!jbeYDHE(g*9=SxgF<~#JA+;@S* zAt=BO6|2k-b@m0Jl9uO?P%a6WUqKc3;Pv1zZhEmyNx$q;%a~2OxbOO>#$U6zuGKNe zWlg3PM9EpodD3)332C!fL@T=ZR}AH*6y2!IwW{?xRbVxtTH!Nb%#>q$mYaP;x2BH< zqf|xYOCXHz2a?%=pfTw3Bis=rN3MG78I5pc%wTaVfMRULA+v_!K)M|#Sv8vI-0SOL zjW@_0V}9b6ur?ZXhnrOE?MzPv(`>ph2#9+cFOn&S*)l!-OX6kiABSuZ$=$5hNp~$_ z!>G8=F+-Tq_feCvbES>7InQKZyYdV^Hy9uMt%f_}ZHBD{`;{@sKEi6Ak$LX}j#I*v zAt6@#$Xz5~$}n5#+$(pw!$fz2%EN{!D1eOm-?XTIV!(v3*rjvl2DwM1u=fj#bG&dh zQ|Q74df_Oa;ev`|K&HHcKi@oW;ui!|#`uwmty;FVZhD-n^Ns2%mMsomXbEINU#;<|oJK)?-pB45r-`Gr^*LVRF-1E5h%r_O31u~UK z>L}e4*1@7TD4E`+JTvr|9som1ulrHzQsScb;3o+g2#`;|%EdL7qh4ihwhdph;TNs_ zlJ%v1bq%&3Fq3X0RPp6Z$m5b1|GV6rb?H44(Vas!t53mg`defhkmG_ku!_603eR5G z;+zYQkku32X1Rd|VOx`lwnBVBlWnGGcd3)Mixat+>`5Ok|9IQspNya)-_%V?UN3AU zOxn%F*?wCh`D|y%QRz8BGXbGq+x}_UE=S(gf#V!W0)kcEbma;4Ww+_12Q9;%%CojY zuee3r5rt$wE7^Zwk0aSF7&@ZW_=}#`EEX~#(FjWFZiwy*+rb<(=&63OCHCxjs`V2p zYR~1vu)^Anf0>?`4~m&=1~pUq$lrAu%y>FlR41vACt&mGc6;?y*hJp??dMe zIs=h;j2K8^;ff2hrqT{Hyb-QZXrNz@>>mKWct|mY{zlunva95-E3AyQB+bFq>40&Qm4F{2xR zrL1(PgUEa(652}I&UJqtF;e~(<^MvwQQ2#pwt!()@)}z}?T88e3n4CS`tfOIi-Oxi z{{efZd!NEY$_ZmkZ4U@dMa}-%c#qJdb^?o2-?n-LhRD4818MHv>K1pGELY(!*5BwB z@h%%Y(H0oP24^R+Y5_RIn7R)jKFXDA0Oy5&F$c&`vb!ePZS^EbDFQ;Wl%u7JON}=~{&;xq>r4`n__#neAsZkps*O zYQoO3*jg;p&B!&GOcD?wxBF_{k3VQGAu=Vc@w|Q}x!cFNnRnut^ICS2)|2VJlXTzE zgtk7fx6Yz+o?OgAF>IFW2J%bLT6wg^antb-1{5zz{jmN8nK=t=SyF07WH7iZM~Y)& zm55?zL7+n=&X=O@HXyE9Oqc|US-~JmAz|1_I`QXK0_fnV5IUVN!qoaZ{^`ynFa3TF zAOZST1w*a?>%~(+9m|UAS9q`{`fYzE@4i#5-XU(9Lb5+J z*+Z7dk+B`1NTTz|Ef>=c0Jn<}7{;gQjS(q~-x-ysR(sJ4CR715y633;xhSG;Hkcg6 zRh$iE6fZ7J-;5ZQ*`lbS2oAg8G)XD8lVJ$Flb96kwvb>3njGe5Xs_Wsim*W~qj=lY zgQ;CByk11u|F|BsUUaGJJd*Dx1h|?f!X02A{r7qm;S^&!Vl-LkZtc~|^SHB6yxyip zwkbV`aN z)EOMRRDL(vDWhx&giXCj|6A`4w+X8N31s?2pLnOvBJy#ibylFxs073)WFKInmnwmX zo^&R4^|W?w!V)N+P0#^pU7e$&w+PA*w_5@}w(j4RCDa?aJUU;Go~t9y;F8RrfKb}A zba1wQr%FO>ucKsZsS$Zr6$@;HY$rk9`%$9R$09C%lx>);z&3f+ zAO^}#7)F?bqOv=dce{lM5GK|TxGUXxCVU09$L;NNi>BI^akD*xX-7i6>k*OSSZLeb zebU?&ZRVE@5varNfI3WV)h~I;$9uQvV-X87&b`HB4EU1KU|P^zs1`^<4__2^1&f)> zk0yDG%lqZiSn}ZtRwZITn6b3WR2Y=w*0>Q7rRtJ@e3lOJ_vZ{&C+d?u5^gTE-YSD` zR3VsRkK@RCwt=+{?6Jhti{X_35tKeTH9d-N*jvjlQr9kG6&#+b3l`7p#ADMnZC9k$ ziHP!1u>H_!-J$g7EZ)3z8GfH&7Mi!Cr2B15y4?I^|AW-)nos`ePWHtebc^U(&$+VH z&$KHOaW^u+tOp0(61F| zto}HdV}9r}f5zxQ)BTBzqBPyU$$khs?^az*zRyke>Gw~X_}U8|6;zw2xbp% z++Hr-QYNI^g~%0w(tN7a_~}x?Egciq=pKL!gv+?37w7D+OHF?(;c_;Fvk=H$3GS){ zgI*kq{_HRRRHg9g3am^+xqdrPYvEf>hGb%nFZIzPji%OB9cUcv$y8Nl0n6h4!6-Ux z%{Io~K1F*+sqxW&-2LTpa78(o>XqWMZMJsx%jLo=g!>?&{J3l%FWZ>~e&c_vcNVeP ze6QT{BZB-V9@uygY9GRSW4R%0>}_o6&Qxu7$^mI_doBjMMf<$2$U4w%rn#iv zTI*Z2`lO3cEO~3jfWLi3na?ZtDKszWswIA-(It0T6YLv-e-faKZ@5uoID+x^RFu^! zu^M~DEjemEt~j%VsM9#Hb(V>>Y4t^l`9M@k!Tzs?ejKrR42eVl^u@5*%ckss(A3u# z@Kcc2W{j(lE0|@Dm)l%Dew%5l<~i|W3R~bo&M^dc!c5tXa0X$Cc({orDB!wmFIHuC zmtOgs`W$-#w_O2AOfu>34H8}i?Z*TuNNAxMosVMHl<1T3G0rD&KVTvuya*a5KT#pq zrz+$TqQosu&Mi4{3#C|qSq-RkM|*b#%@8#%g-S0She|J?^hp%tJhaT7x~6#-YEKE1 z+XNm{&D)A-mvK4Jt=>C2Ws<{=)G!x z0yoA1v!?ys6^UBY@%wrXtE-frMioqS$`P~F^|3}ITIv_5h5>3}*z}-~a_0@)xxzMW zWYCHC;m#A;<`dCFAOeKMP?#WtV3a#gwO^pBJf(Q4YCl_58?d9SFpIhKWNzf_!#yXW zlYv}osigZ2Axl%8wJ=j3YaTxM5;5f-w-xKVR5RKZ8jWV3B+2@N^q`1c&OEl zHT>3%E%+lqj4A7RYGj%dKdGFrV|-8ByFtB+K9eAW+8`X8Xv6?a#wfwr`pyGbi6p~p zkBh7#3aBjgGH?vzx4mmpcl$Ow_Lz+@d*_^2 zDBO?Oeud=td+j=ZWpJJCS`2T5`CzWe`8giF@C4jZ=Ci2R*qpQAI}+7dW1;E8o}XA$ z+kv<5msln@O+PVoUUTzZT#@-W<|k~v znY)zpkeLmQZ22nJT#24zFLv!^@+melGdWXN|34#fZS>KVguV28hp4^f<%XHVMW8|& z<9u%QxHJK3&eu@e_Ppt`~>(Qye!mQKX(hibT<~F83*bp7m<7}8Tnrl`XB%{-86Cy zDu!Vx>NLGZ9|KuoN8m%bxE|KN8dQ@LRn~`|-~y-z(JJY1eOQePmI4Vz?|0ZavFTr~ zovZCKlfem}r+KaIKn!2$!PcG5uYXa}CQ=&>w8MxQAYNTe8k=UJeq5&571?qpQqgC` zJ-H7%kDwkvsHbB*5JN%mDf0LfVJYG!=R&(4F&;{pc-;K{M&0~As2AY>NG;uwi+1Fk z0c7#RJZJq)qCte~$h~(c)!Gf*LuH#t7W0~$*rc2Ii^_I;_&J9%tnJBT3r0E{OR zJLB1}CY6V(D$^z)*vmo3icCdI8etT+#NQ+4n*;Kj7&yxsU%tnRUyPuaqC)?91t zb=GdN_Ht`4^zs)W@OT$vK8w@tKC!gfE?XM!F9 z+Zjd85@6ITu|J>FhP1VF2*zBF0abzr0NuIhy@WEiT1xg!PrCi4vlU@WW;hvHF(O8h z5$0zmIs)9izrfDiDn%5o z6B#Dro+y${(Win%Nk2VN(o0)pIIky<#Xin%uOB(I`wC;uqWv9<~J`A;e8`8g8ffg7*9 zt(Q9H3kr(~@@M8UMIS#)Wg9XKa+jXint_e^5`Q1G*nD%)2p}y+=qlAR;qR>bhSfi| z(lK9${*-(%5Zo2~OwfpuiyVfL&qaRi#+Tv!H?3D6C9lxQK-wX!=7YT&m<32C;n|&T zq2gm&Yr>9^?RQ7B=NOla7w17VfFb8x6U>B_4YuUM%!<1-9l1Ltfr(LF`V34+r=iGx zK%uxg&h5(Fga4IW0oI@C9b&5yp(D^MdOjEKgNOFF24{ss?kkt2gm!fC`}J4=XbtWK zunu9@ZuNOOxKvm!{KbH=$n zAYnK3tgq_l;o&nEy3XCfFw$|Pa4nmS?x5}?&jcM@Y<|}WPV&Zj*Pjcu#3a~#fHL#5 zAeev1^c-*clgzA@6X|>OwzMMia3{{sdP${5&|WNc9tvjQbp!cpT1@Q*-`?n(Px3lddt(tar1xtE{ad zt8&65*8DH>nxYq?3j#A|TA0soVz7v?|1Xuo-li$+f)klIKUArezp63sjfwmNTH0o# z-Kgm@M*ZKZqPI<9RI8z=*3~PXj+j{A4o+1qTJ2t*XJbs6oHj<#2@#to3DJ%WUtjSA z$u016atlz~M=>E>={he$;0TmLHQ!r*o_8Nzu7DR1G0fOTLD^u0HEl6j+c*-JGZk`) zVKrZ5% zs7g*tI7VL$yXlk|x>zV0MRt_RzF4}db(|&jg<^p$6pbu(-C9KIP3O7PWFuRRttt6r z;rkNK=5PvLeNrRpVV;WFlN`laP&qbk4zu7~vjxALsRBtXXNf>7HxpOn!J`>90XU3J z(_no8{B7MhdZPI|gwA45Bz>R$i_5b|cd8NOfetLIk225ej&G^j(`xvzAwBdfJ%(|yWjf~aS^99u7)gFo!!UHT!Rc%Y zJxP{oXCO_w4tOc*oYWDJ8P=?li#0HKmNJ17WZjzlI@m#syrU0u%wg#X!!#Br3~)lX zoUo*0-gsi!{jp0{C1+_x_?$bD7JH?V?^GuqxQUxd7RPik?*NzDMGrFv-tJ{@^X%=O zP4*qPdH&sA*OxsypEMuxLz0yEW7xonbGICx#@aPQoy+3#ueak_pH(Lg%Cp9pC(>uN z@vL6Vgl6n^FTcmL+LCAWe%V`=J_`#qh(UTAP8Bk^SPoA!U4SIlF(m%wZoK%ij(t0M z67koDEvdX!3@C1~KXr2?b+h{2tH>V<^n|&K%pe$byAwUHsm*W2AJ&wc6fSZX7t5@N z;65bnPz&51VSk#MhTf8-fLKpUaQV~doOPkA=`Qm}z1^t0Ol3PsWzCTwxS!L`kJNj# zn$Z?#heopp;d*cOCTC~%(TxQX^{5bS-c=Xz&Q|6>bQh;g)_Y|*VHTc>zcZ5^NuVS* zLaO_O2$r4X95Nrq|3~;WuKO$lwpAC;Q{{^k#x*6FhNR_htKar;LpC>3eI(wGNuYby zsl}2|tgMd0J0r5uX8oLbTdB=@^lboo=6=Cv%twI2Tewx%ur5FYf#JrrIpA+l>mY7h z%mgfm?YPa7x_eM%9|6mrdram36Ks)iM+Y|Qq>0+_fp~5!-q2#c*ws)^O>~iHEIT!N z9#wmxGLI<}u(0YZ+vse@1{$dP z;x@<{T1%4;qd=rTEPI#padH#OKV#0x?{b#4J0}S4WZ_{8aI&994%f8Ly^FF?&nv+q z_DKi&0Oush=)HV{v%Z8-3{!17vPpC$m@to7{5b2JY~{=Y^K{YUosXBO4)QJ8I`$_{ z4B71>X30e*NkJZOdRA50PHUQVG%}Q85Z{{Ff_W( zx3qINHRm3mJbQgaB62ICFy*5v@2+m>WypbOv2_-RsZ8uM)X|8g z$s->Uni0X$Y*i1X&uU5}UowY0D(`uE@~o33AH_7h)BQUBP}9b`sw@wihdwJVXat~> z34iG`8BwHbW|@14%&PKM=!8uO(=v{Kk&ffa^ZF)0V3!SMI>ZgO5F2;ST}tH$s$*VF#4q$Hv&%ncSgY5>yyVuhTS_xz$N2Gz)!-ylh_i)2pHY3 zI@>$yM!>AsnHT{{zd|yQe=-36ylw#e0Jl6~+yFR_js=oOn1aOs7#-t8Fb8&sWHEXK zwxa2Yy-1IS#AZjYDn|@<*c|}_78&{f_9>!Z5D&wz_`Kg5O>rpcA^1p zKHS;ULG|pz*NJS2VQelF>-*Wd060Z|QFY@O9M3pQC97mnXAk7yF*8ZeI4Tj!~| zcytOpA~ndi-T^X=VCk4H)5G5RK_@yD%h;*uB+{oOZRP}-6B^Ar#KNuax78L`ZFN7C z?4P#D$Mxy4p)HsPxXPw@lzJjeRT7Uey zVJ8M#L7PPC5a$twQqv-DVSaA3u-^s!B-83ihz+c`%NZtF)_smP;k;}zOT|n!ex>-^ zE>>q^bY93Yq%(EA^DL!mTH!5k+BaH0Mcl12Ua)K=zTKngQF1#D_nTR6kMNoN<5G=B z_7ao$ZNg;#Eq{kv?Zgjdorj2K5D#yl21-qZzV zNv21YS(QtmRV2bfULPt#=~>2Dt37nxNhBX7TbAAzIVGzX?d>kf=^-o=m8I@JB~0|L zOG*?7BHjJ)$LWD-?q1$pJBMf)-Fm2d7)CCl%}`zRIyY}KIn?ovuxEAprazVS;6x^- zEGp$pB0pY`1JJ(e6|9CsRE{vI2GB^nKRMou2vrl()dOVJeN>@HQM?r>$V;#n_nE2Y zDAx3!U__60sBoFfV+Kejah8h%^z&l*d_leDJ}-nd4bL;%#}`7%=1(Rk#(ea0?AH&t zL-5bzCNGdad4@aSV!gwFNCrvki-2<~Bv<77hzR(q#mqUMR$slhFs}qaspv$j0q2-0c`j?dW!(i1EwD zxf($^YdRSxHkyT9A{#A1+R3nzn7&|mF<6&&^kPU++-MLEPHdM<3L@5>D~VM5>7>U{ z-^@qJyuFaAnSltm>!>#>V8=n)b{ig=i?p*7;SyYhX3k1dc8NP&7;nkT^~Rn*F*K5& z?5HQ^jA+wACt`QsqMWx(4;pdu+FBo;uG%wzLnaDSkJ(7$ZN{&E=0skMs7~9jSL2ZE z7O;nmnZsG;X3=Np7QDy8L;+uWvM!QmzSAj~I zSF3o#3(2{$EcRdhtS2s`X%MFy%PIWnPeG@{3WeEW~69L|rb;ZR|i zIkg89_$A(axEJgf%>fUXk^HR3m^`zOn<((lvg*(rv6O{pZSb}U|6~Xeof-6+ly~cjcY$mT%;r{e6cep|gf89j)nF(U5z?U8>mqdJ| zZH*^liSZt#$5xGcYLD}~ZU?Smh!)K}XUpHVHZ%KaTYcM<_isFx_Ho^w$lh)29j2Dc zJYX`?uccByn@zj&Ddro>y+pwceX4(AG~0ez1s}?MMlsK?&^uI-vnOCJ*qU{mHE?zw zYr5Q`M*;v6<+7N1{pQ2r5yY}~C>kxhnWXSq#UnX5R59LO@jlgTue z@!~9RU{FZ?T?R$4stA41-n9bE$mVG< znFYR4pQ+X`W=6&SBM9?nnP-^zccv46m`wkRl6@iBPkNrp{*0$K{kn$i zU}yvwMN|hMQE7Mav4(m4@deu#)ZpUE+5}iNo#WPqjpTLhftH|?tNMag3k!8b2w<=L z${JD31i4!79e4}|-(-$p1)g|*!q6u)u}q35s6@r#(#?l(#Cf2xzheh-8$ z%h%!0BV5N%L3`m3VHx&W#=@w~>KOF8ZCLS!sHh%r`po}SG{G25YTedrG93UDp-n(` z0!g4J(v!sO%ZdP-0?Ec1XAPJig<8RS6(31#axNBMxbM0^YsGeMWoxNdc#JPBs}4i! zd$<0p;BAEGlGGs6&=%df5WDiDR5jqpq^h44o7^__6N4>#8*csUQP(P8!5)w7S5R-b z&U*=Pgom->=7|=aMQ%01<$VOHxFTzUvTaz^hg~os*w)d;;LrM_wf`f1Hn4Bl!XFUH zsBj9Fr$?pV#t6pE>JbvE;1(&*GX2oIHtFd_7M*IfvB}T)@sy7A9hP9}AYFej1B}=12jO||LO&BA+E(=dA}&6eD5I}s9s@rLDq~(5nGDaY1 z3@35(&FVb@Dl5wFD4`+r&YUSs6VA#MbDc%PB>dT)9E##E>REc(+Z3qNB|=tqArTq*aGqe(W}vYW-PP9U~6@ z5T49`e#dLcro;w`4paA0`Ln8mQIs^Y|b(w_8l=}EJ(Hcm;MQ3vWn3G?YB z*aEiGPH|gxV**~wT=OZJp(TB`TK!p43$8wL6|8h$GtOmpfM5elwc?XP+v%P9q<-nqF~#x0wUbJ*zHMH)N;_KVx@=YIoSU3kys2w`7DQox^bK zSKLC_BmFiI=JDQAPb=Ru3D$OXkgJwDY@t{v_pnUsVJy}yLARcv=N#ZJ&tWNVJb;x{ z6f;So`napkL^)0t+n1C%ih10uCM*~f9A^zuFp>@G>TbPemsY!VIoUrIBp(Ow(tA18 zJ5{lz)Ls0HDm4^yq{!G87M+il#)_*-GmBH8nj-!-D89c`E*@Ok%lUyfM!k}|z>@_J zDma8O7!88bcdXjKxIFx(wYj!?Y%h|3!?@)Cx@D@k)aEYY)4$X*6N7IQ>3_l{HoDk; z^fEhksa-{o62bw(^C#0YPz1IS5Yu?6y+Wx(V@Qu&XqTO*T0ZBMukmbV&a%qAA|r`7 z{|%$oqm-`EzjIS*YMaJ!xyEiFQy%^Mbx96+Ek3f`Fyzi~bqj)f%wYK67GNqNs8&;H zWGw8~eP)ww2y)P`O61i9w4{%QWAUooOxkNS-$BVez++GiE%RE+e6!6+}l- zylzVsucw3{Z?k)x=v~zpiTlFEj+u)%aA&R6pU{^Ze@HJo{y@ynp#u zUf4x%mRA0GChhB2EAv4z$Mn1BYB(Pbv`3mT0$C4qPmV^zW1_|3aQ3(imx$)}DuB}$ zg|SFNfSD878tb1q{ORasbUn$j(87A2F$c$-bQIpGeuiPJLJ-Uj3&kHqhXgD@IyWQpGz| zY2V^fhFqo8M$?DIL7HupZ5EAPnU!wm8W5ChJSeGu?X2#3;KUkXy8@G}};%FNythvImjeKuw0BtB~bRu z>d<7m`%p5&U8s|f^StEauw9xJ;%-&EOO?)5#YNOE3ATHS8>woKQ5P`IY-uv1FoIw& zss9W^vETW0I298Xa%n;PZL_*Zg2qB;>9c{_zi`mRJ#8F!kwB4Iy%zKp;15dFMMguY z+jd9=j@vw5^`jsA5_3uHhrE1taU6M_s1;H~lg>@(r~k01QaH?Y`z zB4E|h&A&-+1$dJQ^bJ4ywZGv!)%K^L{6A9tZv~mZ2SdAqa0+XYG{6qYd&pY#VFKKM zx~%e_QqgREQ055lz4l|6I7afLBt_xmVdS6J6zGz_dJZl%+M=K)nGf4@r4cZ0U^m#T z{9Y^_#2IJG=mZ5;Cc(~4W?=NH3Hhk7!L-#IBNLb1Mp9z`?BCVgFaEXWHi!R5&210% zsJS~Km8TT91bfun_x@3H-%o4qnZWxd6Hf3%5Ih^0X9D~EwB{a6ZBbf|G>RgsYIV@kVV;3>Xse<6>1xW5ZG*G#ZZwV-2grU;z^( z$k(-+m?t?XWXN~R%f6siC))fO$^M9BKUY!)RBv{j*K&Pg{vd6{7OZ4?LewI0O^L8R zDs;EEsY0dqYL&>iUsHKtNJj~q8c4mv^GE1;L|+xx0kc!tY0)^s|G%MskRJYZ@Nv|| zQ&fB(sh;VQ@)cMW-c7+9O-sU_remKc?8$V>9zyhDwkyZ7{Z6UZB;}oz><5xke_K1} z63bQ($2w5&7tMR8%m*c*Sncl=uqBEq8=+WrJ>!%0vJt^P=-L z!8IKsLd2WyQfOp8af;PHE9ViSVs)YRL@xSjF3-G-JMjKo^hgdZ`H5UXK8sYnKOTNb zz-m$*Cz475lT+#?hzKSZvj&(FHaf3b|1a-6F?r|a=kfDZ@4=b-k9USu=vIk+d*`+9 zu7{vu<$;bm7}&m}EeNY|E#? zXULeJjqMe&`ai1 z_C0^8Og$_A&g@;VZ^vDm^U>S!X=mrvIq45bfN$k_`nxX3w_f;15_5cU*&M$GyG2?p-Dk-JX0m&?OEkwMLjc` zrieJ2=pLUP(aWIyk&7naKHZgb955$=+QeLn1ve4@CYcZUg07iOx~}DXp2>C++XBSE z4yZc2Py|j3SsAkhhw*h)KMCr!*o#X5HFS?qJKT~1pGo#Va+8nZE~R&?IQgEQlq z6>SE3L|ruHay~5f7F*gg4Mf%vu}4f@$(vcUZx(vDj^EGPdMw=si@}s&s$}c2Q-USv z=wB|`XG;=A=RQ+ve6bYjjsv5E@VrWzy!xFxG5{~8)T@41op$(9MV8EFK^zkAw1J$V z`a-S#Tf>wi)7pU97uc9N-Mt!s!OujE0TkZrK483F`zy>S<5kD%{-HXirLtY%znRWA&5HE&_acSBxiJUdY{`OD>o(^w>&`-JUcuF)9~sGvf)$;R?IIL+IMe5t z2`jr+xGMuaVO3p@8OGXU>o8WJq7!(1ewl!f>0*GR4ApJ!&F=NC+UDMxOFk~Q*CVe6 z-vJld@U0xXKgzd{IbT)7LFgB%*}~*=RB*0nY8CH%6(8fik1*3uD0}9Jp79C1xENsD z?E7%wK%JE_op$zMH%!mZDDy0G0nQEF4ukmDTyHGMkzT~kHDj!!weUVH|D?+S-i%W# zn53s)1lAyE!=rK*^KeisfTzejpzMRmuhahBuMa8v@W1=@Zk1n!f;9P^ZOr!O)|j;o z-&Xm{MOGTtnP-*#HrI~msjsQr-gZgwvE(JV@2t;dtO*MU9o13)v8;c{?K?x2M zD)g)dmiltZaS**_F^uUok^$;ykP5?UC6gclri(Dpzuz_!(sKZQqoZN&=NtCKC zYPdR^XKA0!c8qY?x+m25Vk`U zpNnd$rV6%J?P$=|W`e*&E}4QQi9XuIT;1oqXqw)1f#639zAuz9>D4$!rixFbQFi;E z+2aJ=1#A(mw&g0=f=u^UjJnqt((2uY53DRs0iaq#2bT_s^WF05Wfr}%%hztLl)xho z_ewDL5^_2S#_Z#4S+;@$Hy#Nc%3NOc8p#-lw?#EzmFa@)k=}tLJ(nqv8A%Y!;G5oq z{1vXFG@n+^Wlfa~68`qXSl%o@gHKuFKxEJg)B*4+dwIZM@SQ%8u`Xe*f5 zh2zMS_oU0^bWtWm&h9ZMIai8=>Nt7hQ;4nl9J@uL%AeI+0GXJZ1Lya40@nSS2Z|$$ z0oR)8U`rakW^Lzpv&6KqkxmJRK@G%Zz=m&-4n5H;&+Nqm15yli%NCaFS!O>s$mLsb zTZ$O83Vake{{hy7ZV7tspa=Hq8-;2O#yBa`3XN6|GL}3hpH^yy$%iYVOF_D(@R3fv zLrT0`|28$5{N7DWCUbU?K)@V(#?;fJGfqDJgfo_%KKYE%(>wSK&akKF&hSpRXWXVv zFP|~_^e*QLe}cedvL)?5XffM>gGa^nC$oB|(!^L~|n zh+ZmkAVKES^zpVuQZfSkf~zGnN;WxKTre`{GeX>N;Nm@&)-9+mw1Sh>3FNq&jFn>~ z>%fK$+(evkF>JBD_OPHWC(gXGY6!cebAOo5T_z&(UVkxhzk3U@jr8hE>RQh_ zGgDUUSg3S$SP4 z5!9rT)Ukm+3o|dDRixX+9Bbw~u`rV$Oljbsq~;EQFz+6hx4>?^#Jeg1KnjWP{dAs} zzyc^NZi*txD}4(DLQE)wsU4PGce}B5qCAl+!7nu1?;~y23#xKENQx9Xu2k%omoqq zZ3LK==>ZdXfXuSZ<7tL)3MNLggK!N8OsuRnHGpJGmE7V5wJ2%3FWNoYbH_XFIqZBj z7}B9MVFLnYvmn3HX2k8K=IS*xV<%R#Y5Iwz8KZK!)B^C=>t=D123(Oe;Nr^@n%!*3T7zMhZ@p9r5DemZ*eg>sED%66HOrO$Xnfn9eGi*KP}n+ zGTh@(`oo_4_awg_oa}GV$;az_FnAE!+SQdpe|2S!+Ii7pbKHmCf{9SCth8MiwqFvC zFo*!~pg;A31zcB(;-2^DKo_b%Dy%&_aN66bLMtl5GPnG1RuWyg0Ww zfQEXnSGXzLj&OuxBN78eZ&jA4Hsp3V-UZ^aR|9P@+S43ljfD_wd`C?^=Q1~RV z{v^-6Oj&{}E>jYP7H04k$UYR(RVuvdqL{5K+XB3#h+rpSIi zDzM)tT1tF@YGkBqeQ>sEQm((bv*kSFzfMG3G?tm6d!k+~pOXv4DY`IHxK6dt&d>3^ z>ALWFXu~~Kxx@q)o9Ge-e*_j2YKxLP*B+1LDgE;m5BUO9@N~U|YG~k}eMJOxocEbE z>Im}z_ubxZrQhxE9fg_eRNRpJa6DNr)FVZ%2QchjgGBddfL#LlM@lb<7VG<0X)*>& zPTmhnpK0kRIS=H>?k-{CG9PuOQ%WPAcaBs{58dDq^?f(7rA$foA9gRuIj`pkgz#vAg8FqP_-)4ClR;)7W}F-zo_D^N{bpAGCS!MJ z<{66Ky~@iXo=|7d#t|I+G}#{zt2{FM-G^5<$s~Ir2Bo{+WV|! z@7k|e`&CN^B;$9q6g5{m*vAmm3Z%<|4sSjRi_qrM`++S-ydTr-LcUBgH!FRp-rM)1 zi9By&*pOY5Nm9D?y8o-q(L{zzKg6?2#egQpSCeJ3w(3D{S13VzNCY= zA>V~%uH|CSzY;I;%>KxXWeyLg?m&Ft?JxI&PkPbiUZeit(z@OUw4+}WD<`kogSRAI zWWT3OH{o89yH9W;v4O3ml5X`IvNPQiWI3K;PIDi1pn_sdRm1$FVA88w zb1Mr7fgC)UzW<$SoHGmcf zUxF<3sGz2Rds%{hwH_mVbRb!&NSs1CS#T&!ZoU?mED`tCPR8zpF#mi!?S;7daNNEv zZrL7Zo{q^jo%WD<*ha?K&Xz!k?R8ycDp>bZ+*zc%UL8yYZ&(vquLf$LlxDL@S35R3q)o$hl{4M^J)E-8QnJMta3=Ks%94^iq* z{d1|W9WV9hc&WeTCPulmG^T@6fA{}?X?~G!-#Zq0>( zb7gVBWTsZ8V6GW+VXq{S_cS}LFeb=~(`F!j&B=|pQx{IbMBV2CA0j&w%QWDy-j?z6 z*F?e#Hy~G>+7AKAoLq-Xz7x7qEhy0|A;8IF2VuI416Bm`#X=oSD79B4SR&{q3&7;e zC@|dFb%kuFNY8f)Meewh5WnCURptWWA*H->&xXc5^l+?mh2%b8!V2X55^FHrRL(Re z0T)rkW#aZ2v;|2V-~%9W(We%8E$I(_ge+vebE$ZUBwcSWvIJ=RJE7{&poEJBeJ69( z4#70;B%pwgTC$(I1Chr(qc(;c?8c4_FR6_q8wNL$oMU6>hN|;wQI;nkn?w{GDd_!s z^5IQ+do2l=%6H~lkRf{zGxyWo7Z*n^D;AoX{!p-&2zlFA@>yHCF<VA}R!gpWdPh0#k&}XrR;&5w(q$)@QT}G(Glk zexXEjp&U9%A8s4T4wy_~-R^~2;$!DBw_l)9;HEiml!UVz>QE7>?B&ret9ILgU3QLR z&T?U`TFD5z(08_$XEL(}V5Lvf!OGGKeS{Z!MLRcMnU8XZ4(GB}&yOE0)}Ac7OE|JO zUMn4xY)4onqxBTzk1v+m-+)2W4gCd{cD2FY0Nf5_TN5wHEyf+l%33g!N*rq< z=t6(6lq>p6^-5GBZsbvSM)zTynZSlKA0nspleh$1ZVMW6gL6`;i8SI(`VPaib1@b+ zs9~ls{09)BW=Opptj|QGA~^Z|HVF1t@Qr>(0oGh%r<(h<>CSPJL1>+yVzoNU#oV=$ zd6YU3Aom~C7FnwrlYO|y_q@a}ub)H5U2cqY0j%tL;gs%4 z_M6@0qb=E=4|g;LnFqSE97T*JxCS9y2}-C~){jxvfn0}gY3H~x2zbbg9v5dvpL6}s zxatbiyu;1r8Ys04xAT?T8%;&o-}eHybe3z+cI|oCq`kAf+AiyVSf9`b6OC#2E>P1b zxLC+mG7wszdSA%<3CeFVpC7?l`aV8O;7!*ipUw2BME74zHiRm&>K#DX=;_1Ji^@L> zsJqya3hw`+hRkCoD0|6U0Jr#|j!LXSHjLw1j-1mO-s0;pD8u)-#Z8 z{6?)qoLDi|27h(qjLBmY*{UzVT z^|1CsyJh43C+YUJWABQb&AQ_(RXbY^-=W%nYr219+IO4o$4vX(iP0Gtv`gAfhm14cGm_w>^SK;y1Ft#&@ZiEnj(igdS)U5q6dBllv*5%~a-1VOpPe5SK2gX9`yqU^CSafS=6A39i!v4Dx;{P{M3&E1W$55bEYouqn5h8@lbvRZ&H3l z!w2PF>DM)x{A~zW+TQ4xn%bd?Wn+I@=Pv!M*#}Xha5!;5XxmF*h|z4 zR1-HT&FrK!x?di<(ylnfG5uKOzO7yOGVUQVI%%i*X*nmdz9i**4~3QIv#{VDk2D~3zT3x(&0 z&nt7k_*kU0hU6-`yqZ9Z$P8Bdq^Vv|<}ldPi`55d8meQ8?2O`EUA59!d!C*B=d(jI zU7Bl;v(tOK^?QF)(i|VmI#9p&==iX61b6gbJx$&TQQ*>WM4?qvtE!KK&zfg6}CH%?A^i3Q-Y!{LpWN z6`DL5uT#OXAD7DN6C~tJY%`;4MlcL+aDKo=pasU~tWos&VlrnrEqZ@>h#B3FXY6#@ zg>0uf=1%KejUmjERvJJ!Z1N>oRG>>CUX}n-vp=?jZvI*lEeOmU$q3tYC(#U&AF!zd zu?tBC{jv~Ej@sc@mbjTR!koq9NSJ@}Ckz^R#7-4S{0dA>g#5gMbAVn$FwxmARD>uM zy5TnE-ma=&RQgWU&#a|M4{B$mFOAHVq=o@yHj!Ydyc`$Mnvfk%V``-CxkJCYT-3_l zYI!2vzJ(hJA$Lx)e<=MYg)meTx%Up=+2(el!35a`zqF*g!R>atfbDmcO*q4y6A^*g zYQR@R0Ue@$cVgcK=FhWE0EgCO^D%LH%t*u>={N_nMP()u2IQv9&t%jhnj-`BB#%k? zKo2H_?r4zM8@~t&CLTw8{Yj%6{X%v}r#32p?+58q@kXx>k1_-LBc_~+x8!6~CH*4d z!T$*QYDqNOziMZ*so|wVE%kr9$$CPPD3>k zY3^79t=bILnk>%HT}#~#x&I@XZiwm>4*8CH4U3Pqm0ZNm?Z{XorkB3AehezW$FVm} z9=Gw#MMk8JHrr36qz` zUpA1n*m0)Q0uncHy9jJ|>9a6<6BYkklYBhuCLdo<50XuupN`zFS3BljgInwv1mTys zojsN>KXRR?{V{s*tU?ZJZS{pCts+m7TxPv8c5=P!Ga+UqJs#2(#U5mt%> zh(UIbjiXGlZqeneO8Z&DLis0SYIaU;6^R6v+5LODpFPV4uVEksIelEX0kCzmJ2B`a zYewWw(NoYiaTT9ukITU!84#8HLS!--7#|lk4Ld zowkE)5dR-(?*VT`b@un@0opO)~s3c ztf%~*-y^MeEcaKaq+Fxh8xF8873E~rm;G+ilu6!6koQOU19vYzHQaVsvt_%SNKnOw z>T!r3fptSqtC7YVw7bTxVn8f-z(RwZJ|EB5)i&(g)kndJFYCy<(vXQI4|=dQaN^KR;xmGVB8LX``%`{1X>W7)T}d%_#c=hZ`HG8 z|9*A-nfOjYIVA*0)e3dWU7}~Y+#>u(M9$0I&F-j4vzUNSVb;X=I$k5=8g&Y4Z*0^X zgyJVZoCIMumFHs5&n%#c?f9(lj=httb?bLnml@#0%|axkh)h&iZVn$s_}byB!<$CLv=XCJ~vO+uD*fMx{uq> z8hvI@51$bCZkOsuSsZ#d{)L{8mz(Qxb*a_^7ZL&PW)b3MvH$+Y3g&+GH*mhToiK^P zz~rFAB!m7btiOrwzYFVqA;#C(%TfDH5+60vg)E&!PXu(8#Hh%Mnh5dE0C_<`xOJnj zIILM^Z!$5+yfO?=R4onoX7 zp!;PEX6XlC)`9jMIYSFu-MpuHf}>Fnm~QyJX8#$ELZ$Nu+Ohbh*xkS=c~y=#RMmdr zzO^uaS6wE<%Qb0WFJ2M!?<(3{YkV5F@-mUUQkXcgt`zQN!ltgLZYxaby0LKM#;si` ztc!$yp=iHo=N>Zw+Vv7(^>Le*nB$FQELWS+y+?F+gipYzx<3>4WARxZj?enY&T~8{ ztoww2uV}w-=N>ZwGW?P6&w3YU+|2S!eAf3x@*`oAM@vlSePO>BpY@&itncnT$97@8 zA^g`x`x`s=n2FbgeE0jazQP&*$O8A&pj4}&4l({tWzT9cg1HMi#n@6&|{!4&;20#06ASh_mR6i?=(C%V099d5eB;-;np zT$?1rdpe1zEv6($`N?7CQ^S(~@pJ#^VoH6=_aFA%N4nJgU8K)%l;%xR{#^QZbjsU1 z{RavZKzHsVV$e&a??Gh_-|#@lOJ^XPj+G+$kcD5|9^}`Ufu!M z{h$ds@?jGivy=L$DfwYj^3$fo`%RFR#K(M&ecI%I(&T^Cl=`qqe%cg%(lpR+m-X*9 z^?$!9^+8kce$&ZTiC_b@9h;c^I5YMC&?7EETwssR+U!m6O(l09Jcirsxu z9u<4TI@AO}w+zNs2IGy^e(^}{hzDQ`;Eon!qlH-pfb17BfXvs(vAgUp*{)`y&s58H zdzM|B@U^d3_ue!VgTr}sPeUeJhA|C_u;b+s5F&6~(=h)At=FG5o&2O6dEII`)fnu0 zLQUBI`XxCmZrAQw@t{B=_|)zNahx`pqkpO9ieB8}UTUg7 z`=K-IjBhE~qS>o^LHW(OYgHdv(K@ttJpahJ3JT>Pj^4+&)}0wx!{bx+MG0t$=96X2 zCwO0Dzw6A^q_n6zP2)Ld0C70&4>yrEgb|?KAw`}!+RK<^OpK?thwseVSy%+Vw=PVj zdU<4=#JnfQ>JhRV98o_~x=C5qrM)oMw4e3L*tLqE6~^PmBCHB7ruJTn>SX_Rrn?!Z z59}m0m?<4!_yB%ojO$KvyCR4 zcs{c$af6t&{bE7DQkOmh*Z2njjQ}pbl*U?jH%c9l3@mG~{Un9ZP?Z&~n22{)U!aQf z??b$eccnzc8{w)MaXYjcwYzNbbTI?!M#SO!wPK4PN1|$rjQ#N_f0K$+oU40F#-TWzB4e6uXW zB@pD5_UakXl#25}=G22mjIMC9ngNoluX~0*`x=2Jcsl9IxU!0i)splMQ!G}8??A$< z6|&TzV}EecTcv6APZ5cx_b_Y{U*JP^0)3{w}>W%!6|J`5BL zcei8RZTw11t=j(1}E8mV19j{RiRz z^MJN6K`=69Srbs~LX0@3QL7h%B*CPCUraV=z=3H(eW*Rj7U`!hBg979X!t60K@2+` z%lAxxt$-+rku^bJNOnFvVtBx1Bi=eUFiEer$mn&GeRRA(!O5x5Bk+d}qu&a*nbobb zuI56~3+%407paSpF>`A z41g3kiX7UrukqXOucA+Pjy~OA;#1w}xodYl)%o9_YWNSQS|6RtjZU?Myx+LNS0|&! zJm|UC_MG9N?~na9KDNbkH})L+==)@i z@R(PR(H*&`Bo=-HitE0*qvsKiXK$0*NYkJ^W)ubj+I4+YKxi=fZuWDO^wE z`_rC72)6XA9!6qG5tVbUyCz5=xO>m}e@X+1XOSY}4?niOHalFVhS=P6wv8~2^->$+-nj69-6@Yd_aHG85|_ak%@gEq42okC{lj7M#MC>&t+r>Vv(UAUDGUPL zT&unRz2VI>KM|_aTpBPa#yzYtXaP%M>=5I|4E5h-GyM-74(uW~hT;J+FuBZdA}Am3 za{#URu+}VP+akx4O{;n_&&4sEsnlvEF@__xlvDUUDN~t9>mQMFjV0Nv4*)-bL8gaA zfsw6IE!vz&_u}~4EMOX}f}Z0I(J|_&CvS=py^cIBYXo71h$NfZQ1eX5QQr?b@2 zaDTdI9@C-oogwp)NXI5Rut1X-#dT7L&UMIq4i@DElvU8r@l+QF&pQd8@9mxdM6Kj> z;2=y7z)^^ASl@7yp&Axj-VPmR9vT<-=r)Y_2rr>d&{W-Ds`@WT<;1KTgeTGMm+6m_ zOyBD`^q4Bc=m%L_t3IrW%bk8L+Uwefj$&%;bG?*`p3_lQMrqa8Gr!(^#Hb``Nky4kbae(cC2eq^2^)ua=lIh8|0GzqsB zuk?Vzq$&(4ZJIy}?r6KDNgM6ZXtik8(1?n2l~B(LZg#v_MAx@aEAe1>A`E@W`voNl zOwz9~QGXkiocL6HDWVAB@MukTGu}r;8qYB)U_ST`-w$!`earh&`5M3!6iQ5USz#Ux&{`#C2|@a+5e#^ zXKo~Lic^gxoT_O+WkkiVO%2#tGbV?^T48Br>A_`aG^GOunOAkBKBj8Tk@`KoK#XlP zNH<2p!=>F%KZR;@wyqW9kDEFcx1=5(Gf7C`H7FytQ@U<|ww31?=%>(k8LtRB^%jx7 zQE(ChD8%ozmas-ljLc(LCNYu^S}o)nF>ke~H|#CcJLWBbwa$mFmQ$t7RC1oZpd6X{ z@bvZ|jwUk8T$J}Vflk=^DY`{ZFF<4H5wKpc&;!Sd^ z^e@Ss6LOx}$A%xCi@*wSAoa)?oNvn)rew2>?=J; z^t-4SkerD?~>QW!LhOy3NZXZuqZT7B|n>?}EJ1bg)Sk+(77t!XPcr!5i zvOYfa`*`2^@i!uY`uD$xH$C5aHqXU7r)~1Mr)#T?Rp#(CPKLBjRD^FtojKJVo&lzu zBM?kTcC~cY%I0E#p&l*IiSR{X{z||@2qv-Kt1~+*gMFD?XdbO=Tv43NFOsv7)Sq0! zR(&b-0d~>mKZaY?V93DgdDfX(Po3GYNwf}v(!i4qI`je3ivaI~Y(OC}y%NQWn2d){@elTiMF+9DChd+Kta5dc*mSY_$p)Z-W+D~fJMiOXx?v4~#bbhJ+F@>0ip z;urjXeBRTr>2U@2OqrCof5dL=4H~|WY)Q2;*yF8si-F*?S={O7o&WsFaOr8R?#lbh++!tw&3=@6o`S0!u?W z6;(C#x;g=nMEWOooG`(#PdAo0(Di6p*B_~XtgC=c++A;a^_(vL|m zfe^Gbh6}}l;wW~VaU%z+^-kPdlMQ>aai9KWDw!zsBB0QK511v;Kj5qsb`S-`vDB}> z(E8FgvBwKKY4osY4Nvtr!(NCFc7gG%(=MH+pjlT@0H>4i)8ZO?!u57l;G5(E>vo8=7Lr#bC=8Fr3w*sHG`8TQF)}xQiX40VP z4vP7rYuUq$$KoH}BD~v(^_VM7^_@fuvUFfn|1iT38S84?-a8w1i19}^XFI%WPw*r{ z0G`XtQrsGBbz(pw&GQ67qQ>pP{|xK-zrXWO-X@c9f_1N6t9wm#p9zxaHQ^Cvy2*5J z-g%m{cixmk_Kbq4&~rjkdpKn{?jo(SKCf4av3(8ur>1c&^&ZlzrGLGYUpTNmf9y<^ z$sLZj%q`v`&5cstBCTl6=#_6uhmP1T&3~Gtp_wO}UoquLbEya~65g%SyiH2hBpQ4p z9XjGvc^s*B{N^^1Io?N#k?@*HY9cWGNSUG9v`+Yfi(a<*-&OXN^j&R_0n|U8>Ytw2!1O9+uwEWq7G_*Qy+jcZSHN3^P4Obm7nx z=x2zLfp^DUT4&h%82|RHCtdN3JLq}W`IYvxSsL(7+*SLJ-!*cfo_dA7sneM z!g!)aL~C2q<=86)kZ5w&cxBo|1G>>(Hqso8xE3XOpmC9po81p!W~4^DIp{iX!u4LQ z3&d)Nmwv-DU-#NR_RP&*&Q9Er%a!ckd*=Pjyv_#+>n1Pd47k-Bcbiw6Dy{P>mw2_? zJ^PKF)K-`v4e|<&d^#09jz=0}~%yQ3|a;0xx;){!+3s5V3|8djYifqZL+%HTs zfzQ7^9#_=Gik$zaqW`h0R%strmyS+hUzxZ8ZK_O~X1ikOfIC8K-PQ#wW zIBkZwRxr)ZF#buOBg8Q4G%=;P+jk&<^s|9QBuo4keA4DqzIcJHddAOYG8X2*7)T!2 zOyc!#hPq2ot8Ip%B^y`~m@3#E8doN)>wIT}FRt^=%WY?sp8AygC*S*s$N-I}s>b2>|a*o9_7u@1lf!nOeinTfTS`K4z0`e3}tjs_0GIG`*5v})**5jge%?`7-VV{iHTB^w3?4mwV`Zd+-ZDs$iXTs{U%_?3= zIJZ{j)`{IO=To)JT_$?}RsbEtsTVvi(ks}TmBD(FCVJ_>leSBqQSoDWQz%lHERFu} z0t-}UkI}#AQvb!2wkMW7?-%cXA8L|}C&zNE*E_j;A{`D0fY;(zden^kO8ID=iPqU2 z7;pAhdMf_4G%ioJgZc~3x2jiIq-mtRRFJMhf`mJiwb;^0tEpTWVrbZFRFYt2FAd(UtWq4r8TIhcac%tH%gKXEDA#&kFb z_9SSOQUWRyX=z1{TlQeb(<0!(AbQc4@a|7C>{Th_>Y(Li$9mN<|KNBlm`L|p=~%1y zZ;N~ZO8d&=E_JN6(RWMDxk8sdnEFn_=9B=vty$Iakybd{4q@i{^z`Mj3T z2S)$lPp;cTAAQT=Kep@t(3x#;DG;8`5QJJpp@}4)X5lI?O>5epBhx??9zdG8KChSI zSP=(yc9UJ0ft;AzS%^Oo7v*dVC^ z%RZgp;#nNIRCrPP zHtgGS>^U4bjej|r11p8MO86`JmkDRE`xIO6L^X-$N5+a5085c=3q^H#4xK8A6(=-eohO=yZS<{^Aezon=>+XI}x#p9ucZah=K!9|s zu4;rp@sR|}%sy;iT!VlQ71cG&GzP#PEW>X)n z+A8Qtq6;Gv<5Cw%9LXCv9R64noIQ?q0JcnGDf-wFgTBA921}EM5H$X|xmrSoGbvh6 zjMjCliCx<}v^=_%5y$-nX37ncxnDT7i8i=DWbmjHNugJr%CFs63N<`OB6=)^v}bRk zYEssp9r+i>kJf{0a&nMUzf+ce)+0*~)40QF_99-cHYDkA9pmm&-y%tmR<)vyRGvr{ zITdPBD2n+!#N@$al;SDvz8E(Ne`k@$5 zv{Wkw2SEkTkyiiUQ>6c;R!junD;!?h;uftBp5w26hGNnI-2}#%eJ>*rT zutwouq5sb?Sf0u(ONE8VooUPGdrBanxb(x=ZkA_i8XJvS`x63sZ|+e+h%k%tFbOj8 zeK+YGOd+^VD9i((1(+jqjF(bn-&Bwq2gROQ)J{V!6Lt*QDgsmep}j8-ME_w{(87(KN8>1NwI^F+d$!lXfRG-}7$X;s!erhjAx^PVUlOcOekMKWi`0}aQ%zLcK?lp> z;QyEB{9AjeDv9$`{N(uGr&}*fPrfMKB;}vH{Cl1q?|wDix-va^Rk}%42X&b`r!jVf zJV7M|d4pty$F-G+Lqrk*6%iz6z3q0SY6sEqvOF%)ON^Ht{@!Z;)MUN2H;J8G5sy<_ z<`V6KJC)^RXOKU|+b8KHQpC8APqk(zXIk?4oK4L7_^Q_G$z|^Eu8ehe!oMe>^=GXI zYRL-ZY?B7G*F@`E!MHOzf31wonJ#o!R9>Ag!$`8yQ$z6dRQ~LjOIP(uQkg!I+Eub2 zfKZRZ!?jh6GCe`8=%LM=q9)@I-OC(m9-z+DRzR1!4(UPx)BO-7{REhO?a00&c4U{< z%e@SHJ*q4QqVf04xSq=gR`3VE<~>q&C@-b8v658|U-R8R`r-4WU!jkE;Fn)d1d%@0 z@M_|}NkX{nw7bsS#jKZGu}?v1hUpNcM%nM zyX;Fvf}adkN9x!=%|Dj7`Xp@qut!xZV>%)py%+U+vkh0SCP}sld2Y-OCOsmQjtjqR z{Kg(hXg3$XjQ2)DbQ(f*@>qWV3YJb*3)1#TkU}>S&|&(e!1YgGX`oQ_VlPtTV}ojU zc`ELi1^eLxOTrLrPegRiG~UftekrYAaiZFnyy>Y@20GObGEm( z&d@53_w znajNyIBx}|Hv{!nz)PRQ`YF-JreW`4e4F$C8YDgr67L7$2LVQ)1;7($9EE|9eIyK) zH#i&2^^Vx!JP~hBh`y|jzdR|UZ%g7$)q3r+8N%ClWRDbhRk)`j7N+O`-#=nOF~~i~ znS!8ba*yT63~R1&Nq&G-U*vq5`#hH>wBi9J!O``vWcj;f?z*fN2mj2q-jbWVG1p{Q z?_ZiTQYS<#4{Fv1kRCj&fAHf~`PMDDDO+<*KMhQf%Z~)|{vdoH@a@Fy$>g}$@;ac)9O$5Mkh;&X<<#E zS%H6?Y0Xc`HHBnal13hS1-vd4V`3_82f%r@mR}8nnx`}kYUNwols=PtH+2emOyAc2 zGy2VCl+PN7f$hy4V%TRI@8!$z08o?@3~w~9cSF0t_d_O=IYy&?7va81Kd5sA4reK| z_$;bV=J-TqsI^b;?{ErlOHn^=4qdE2>uo_R7Fq6*#Ql5$f|$einwGhtLju z6F7@Q`A*(xv>OId2iW_2-t($!5`V~}_&tl`nLJwc5RItEF96k{S%ojU8ZW;|EE4}J zA~Yn;$q6LH!#2Jhgju1BHfiH-bL`Ri0quih2h0!aFj~j_$gB@G?B&XMqR=9pU;ohf z3XN~zR?^X}u(mg+s$}ZnF#km8q5pUgcBT5~lDd9gKdSO2Qz_UXlIB6Nc)7_G`)lP4 zBEY`#bc?+$>OEe%&YnBTqb6uqpoweIfrZyjw1%iEDehJ`est8tONcqq-nr4b_ZG^> z*qa^W0@CHsa8qj}juz78l0Qw;jdZ#HR-n85)0Fi|%3P90=$mgQ%NI}?1wWvF8=y<; zMbFyigvi?KN;#c$b;p<;5&g05sCP93gBI546ti*JtLFot`kw3~W(A@>57(j;2+?lxw72mh9YRz$}T{r<=I3yf8m00ZP;6KATP z!88mw$#ke^AUx_dplCtQO#?va=)g{i45B^Z?Lc1aj=ZpEW@Z6q(f>Gu*fH_=Zqf@H zwRD(-KmZp|&#Whz4%P6vcQ&j_|6lzEhZ&0BkB@&pK{ux=`sKJI(HyviHZ@c?zl|&W5E2OAbh(G) z^gmUpAR3VXdPZ*y(@1nV914mWeVOCyeq z8*#L5w1Z2KDrWQy-ekulBRXpS!kuR>a^`B2>=b?0$fZwg!~2;lpLNYR-tkMfRinhB zZf1DxJf-$f>gs4Awesl8(>Nh8dk_qyB{tBXWB?F&0^Z%Y86PW=5c_kl;WN+t+>@;D z5O~oupLtaGI7?wv6x34Qp~fg8U<2MW8DC@yTN(14ROM^S|H|T#`6tdKUDiHf;E6cg z2cnSdXQ+YS*_Hp;`^CfOKwb>;BtP{tGEynEs4{ zp^OlOiNj@0k*Am)udq%ysr<+}#koAOi`zD_E+M;d+j=)7n9M2&Sckcgh^HBl=I>da zt}(CD$IuI;zqbG<(I;a@u_G@oTn|wP--7|^KdMi4QNrDlkVo(0$~}ru<%x=LobF+= zDRBOSlXZRV%61@ZQt9J4J9<+K(4@G3r8yuPvpF4`+oVTrJa$<_5pat3ytmkJzY3k6 zsvn5{2Trti{PgQ79H-1W{q*ZM*gb~&EyP&i3XC520eTq6<}?o(VBjn*&JyPiT&&3o z^!vJi4hJMNjWNV4*r?+uod4kX{Ecde994XzYk`-<5E!RzT5!8(+WZhFq0m=SaP>!nl#3e$SOh! zph=VQ0fozVkCMb=0x?GCEs8pIjncfl;9XX*E-$oSTCmm@{7VaJZNZB^x34Z(YYP7A zf?87uqtCrBE?Aco{EG|fl7bg~ZeLljRu%k}1+}W+MW5T37pxTpe|bTzCRE83#SEKfIfmtgo~Z4f`zqhKxX`jAAAX(pKFc?Mop1RnAAX+q{+4h4 zJm2zJK1AJnKVSZPzU6QEf?T9B3GMy%Dd8J$kJj52g+nhbjEZmlV+C?;F3X;xg=w`B zy))jP9fPS}QEHt9@hG%kI?tt6&6F>CAkgq{SZL)fB8%U=7DH4=ZW`?tg3F%M?6we# z^}J@k#S00smy<1t%~mo^XbSPpUnVM+vq8Km*K4oZ&p`qYHlA|_<5P0Pek!$lN&90KTmO(dlvqp{Fxu=Et;g(Oc2+N1#*N-=>5p|M<;Kc!_+0Ks zOQF+)SsogN6I_3jJQJwg|Rm`0{#TGHn>8Ouuc>lOO624l7-T)4R7zP+<0p& zvqA(iX-Abo5pBR~&SB(eR>MZRv<65U`CxqK27W2!J5m>cI+ze5B%T1Zv?`_;n7EQz ze9<62)fW94F)Dgx%hCGEnEWskeSt)ZL@Y{BKkN0PkMUxYajcmuIMpfcPf91rlhenL zPWk=KQERa0=A2z`PHn^$!Ob0BTd*n+mqyR#cHRv9f9a|SVrEMipWxo*jT(wA%pK4{ zorKZWMTx&9bpc^@K}NW77&lakZ%Balk8Vf%wDfJYiYL+9%bTs=sZEyHY@HOXe=2s} z43EB4Hd)n%TIvy?o=t4wa*>7^{SuKTJhMqZCZM@8xdaMX7s}|=wT0YI3!a_&dnRbD zt!w!QJ4znCI2)|aUX1z(8lOSYBu)?e@gT~ z0kMeb6dx)10VaNnhvmsY?jLx_kmZs}WA8vRLK#+_adqOA0wv%P$*RC|ILnbN-U(30 z{Mj;oOYVjHS7CiD(tj4z&ZJ834?W@kkt)#PdjwI~&pT5i= z{GULrEm@bAvR9Ro>!7K$c!>xj@>k51mV{s;Hlw2(MyNJR!x)Pus4 z#o-Fg4R-lI#?Grg(d!wrzLENZsrnWG_mZ7>NnihWfqiqye!-V7`MF>FLtYEi#*%eQ zDZHx`-dWNmwTeC0FJ($^1zi8O==#I74$8on-1m^^%E(J`q`oqtE)CgU5V|`kljMFExL@h*mx22kTmPSd`!}}E$ASC4-u@+USBLHz zA{JR$Tph|a;dstBCWEljv+6PxOR)Xba}a-7?5$TnWljY@+J<#TJ?`(9ET2JmMT;v2 z(eiuHFc|52kf(ZSS!7eDVQ`UKDjo&}YD}JP!Z%kBu zLjg?d)4=^EmHjp~kldG~|6bDmQ!;~?{5Ehu2{@SkQ!??CaGw;3kCNiUWc7bPWJQO< zkCWo|ME*&^*8#8b(7kU&sPn;=$@*2oUT2mTOY1689RaX3&)zcAjMjiwS-e0d*K^O28=8W=7`#ZjeZ(|*Ik9dzEk^L&s?+0$G4h;0 z5YG9+-@{uXX%hc8CK7p;n2)BYi6m%YGilbkjBQp8LYIQ_Lhukdly=ek`9$d_XkxzK zr^^Xo(&b559RPoOFSp*dgA(wx>VVv57Lx_~WXDUd6RE?9eQC>o){(s16&8CYZ`o#H z+*pP+*rvJ`!Upm?sz=!0rKxyhfu93SSCeFxLw$9i_DwCdP}d}4N~mpzbPnxoq1i8C9rlLlgUS=^_a{&D6NNN z@St>F72Z5(0(ScO6P|H>HIn;FmHk3_FNv@8*nLOXaPic?)BtM{iX8okA(k;SY+vYJ^B@qI=XaJ&6`{!k{);cpA^%% zu~IsiJd6J_)on_S*Gj3**V?kWN=$3#h`1Mui6nQUV{CU4RwKrCbhN%1#epxayX=}C zeSU{uO)}JLzHwuv%N+#-Xhtr5kUO{LAagD$V@{uJFVFx;I49*&Qq%P)&RY!=8np*U zr_GpQKAY19cUoXRkUG!q9k!ht+D0cc}lrS)Uf|@7(2R*J_D4xY#vrtlO_zmb2h| zj*tu7xmij|C_IK%DVS(ZcEG<=uwI&7YJi<|9Gld5=q_f4F8aK!sZ>vv!)hsTH`Z&! z2|f;Z$suIBLFv$tX|Ng^8~Qa2C1ZSwHMNQomzqq~$`IC()P$nEbP9h_dTv9nQr_(d z+xCdX^urEeS*?IdHIxA8I%(fQaNXl*E94^&lQ;!q-b3OO0axAyY`BXxrm?00s4`7T zFSSIAcb8?~X=U!Q+`IMK`KuDUdG}b>-B#T_F#hFv6vyrqRo@5(Xj9zjeQ;QIs&R5R zd6<44_2fiFNucD6&BHg@Zp)BqIJp8t*pFmi50h zd;JQtYlxbMCpS{U`#|YrVJh`ztIZ~@f9K-~XoXPM36tNQ!Z3MPOSm=SVff!+J-8*! zk0D8omahMwpa07=4(cyqCzI3U6tc$u_j+V)vXZIIEb#f&l<2P;0_TjEKk$b=Q)G7{ zOlA`Kb)xdE?EFSnE-*XKH!ByJT^E{_6=vshv$D$UTxnJ=F}p4{D{IWo)n;X_*?Fm1 zx!ml!%&c5#c3xptt};8YW;Y+})E)>}OiqbM-L9hK|@SJdOH$i_=5NJgPuH+$qBeiHWOG>6n?;Q^xW{KJG5bZj1I@3T3rQ zwe$o$&J-P}#0_ZTjdBVPMCV|3@wq?Mr#vx%S1g)uMiNi?-X9azkxDt zdisIO%)Hjtz@0#YcFIh%5aQ|g&|ffQz6ZJ5Jp#w7_MVPJbP(;(Sa9q-FbP}D7c}|G z21q$k3j~~V?+W^H5+$Ms$~mf7r9wb=)Dy|&`^gqC3e&L~;03Y82ilId{l5ucX9#Nh zLpxLy=HD+MAkY%9n*x=!Og)6)_)k(M`^spd z%uwi|_bMu+y)E+F!P%;7ETgl9XJ1RARWAwoJ=%LnhxE5H6w|U2833l;q(qLBeRLvA zZC=lMx{uC6ML0=}1qoh{H>MG5x;@(VD4U0IwrO&?knnn?BkFnnuZ2Jk`o@7YV~w~D zHxs`7%Se5rwx%%$j}QHj2kM4>img2g*G?PRTVyc&TbOeoEBqbvE_uUpYziG82yn{I z*5D1&t$}6`xHU~Wi^tYLQ@Hg`m;ru)YHJO5_khKMUus&Jhk0O^!L}-V!Bu5(t9%vS zWU*BiwrED3yCo@q6o(Qi_cWA49t^f$QFovQ&;VqLdi5mmkwaos_6{INf;?nixb<;_ z_{1%mtn*nLm?&B+Cc#4PN8i&NI5&xwG{^(xOk_(HTpLBvmmf#BaJ~>{a@|=lDpq)5 zO7f;2ez^xM(oSvSGW@WFGV+wNS%6Rmgs9Pjzx`*(|eIe(Ym zKPy&Cn*XIpCsHy^Mh8oZ99=oc>)WaG@w^cfF7 zqvvLbDZSfN;tD0NROS`RX1!Xa)+lqiqVCTSbErSe?6wA(gEf^?0j|2`qPis1ER$&*oClY%UX!xChNWeaRAkg--N0UxHQO$w)yt+k#O z*0V%cn@J{=)T*uW@Oi@jiFzVci_Q$la4KIqE!N}IGTrqrsh^5|;xD-I6Mxu7Fs7|* zg*{t8_g3|`8@c8PzmO^c@R>Yq6GaHRl_WSB%ezk`$vh0!3W`JLVe_pPH4dG{b2D!+ zSDRvuIbyYm$}~Ieq_)EtrDi`XohJzlx^@eCHymw@=qy>Eqvc`t$Q*BvZcZD0-B%n2 zZq$_ajk0iqlvm28%eazG zdqyS`QnD|S$tWHQslWHQDW5UpcxV;1RPfB}Mhtd6BtB~Ir?Ph24oi3?fkSPng5 zib2)8oOzxk?zhO;Y&A-CAwo79Ki5+wt3;RjZpBJw@x;k0g1i*7kX31!4+6+uiBjTy zWASVJOxm%oL(V5F+CkMy^U%kjc+B~VCk!u;5l7H z`xg90613T!B{e@`v_5JY2lnOy3EbQRWe%5iWW%&9==sW2jO*46B# z4llw1)bHY*Y&f^*wsO_p>NZLF=spDE(mI!}yw$$Z++vHZV8Ejdih%w$C|VDU)^q;X zp6>s(XGFATX?&_fqc8EUk-Pjf{@f7lxjp{rjOfc@yZpnL=ySY||KXP^+I3yrK)6G6 z1AoS5pwYUG&@IE;MS;n}mYvAlCvx|Sn)^iYUUATUqHwRc!CEDnR*Lj0K|RY2V0|0z z6&u-Cw^Gbq!D|z&6knPv#I4Lf)(SCvxkyFp`V}I-T=*-rn6Xy~js`1)w;Ye^Dlvq@ zn5zW;*tkk0R*G?}#DJAz%qlUSwXqoZIF&KfA-+4*9ikT^4YHP?owARYgVc$3w=Gtf zB`IE3so#jqc_Oz&n3_iMxZ?44I-4Bjy0?hJMq#^fPm=TON{Y2J3c;+a!IUmd!r`jF z4c6b(@V3F$pv=grWYafYDqvY$BG9y?Y*oF}0TPgG#D+C8*Jw4Q(lT4)jVkn3qwJC8 zQO6B-MvZO!iH_k{)Mc!gJrX@zYacN; zI6aVspCo=f?krayr=Segul1H{eb!3Rs~vvGkcjC|z@Yx{?}7fA|GY@viT@$8>s|>k zIV6VN9VU4RsOacr@0((+37B<0>ck>Rt=4*IE>0lK66vCk2=H`I340vGdyQ5eTH??z zc}4#qubBLi^^#H$LQIrhsbTgS)4Ez@9~7Bx`(Ji=4k=vLgzV@M(z%_ zPO;xg5zBlHu;4DEm|!(2%Wlr8@r&L;$wJ}=D{LYkM+O^2x*>H7TB)qd%`Gx;tG+ag zXJ`kAx<)`Nj%ZVDKbxxR>?D*Hud#G)(&MX&Hjkq>ZHLNkwNPRO94u{qH+ z4(1U+z!=e1)0oCgbUY1qYz!i3F#*mU7__Z@vvV@18yCnH={{jM*+ZVR4?~CSvEV-H zVcHrAxn+y2x2m&J}OfDWm3xpA_r zim?17(BtV7t*O1J^DB^AU1}N`5@K(r-4y3c&mi*evP?=r`FPqdz=}Us-p{a^@uS$68%@8>?bZ)x=~P;M8(VQ}pr6d^6*34p-Lx&F2ZU z(;m|0FG9Ga$@a~lrTAzmAsK(@W2#7w7>>J|SbEwYm+eQ z1Fp?%{UUN>!4koAeUDzXu&mb~iY!(0#~6b<&S^gTFlu5ihUf5Xb>o0T9^@o}%t1+J``nw1bVUf#|{p8_}Ks{~%kPj85#-7&(~+G*C2KPlE=B zpBFK;GZzSXX7Vh*XpOeob*3Psz)(h2fh|tf0SDHd{vQid)iI1MLLF|_!457bl8Bwr zXyG>XPlZvjuVHl1{f7}DS&SYAC;l+hnt*q- zV)W(BM6}r+|GNB%d6+TyL%Gk>6cO1cIs1Tp3bX%X=DTuJXLZaxxNle2@6CKu?j|{_ zapps^Z%fzP7)Ivd3W;$G?)8-N|QlJW9A;F5B;73bdOO^Vm?K1%OrbFQ8LCzlfU18*!IAKe_(&0flynoM zjg}I9tuV71H%|Cie5}5<1=CV{lpEb)b=?6jXE%{(OE*cj+E5(9ayAQa$2QO{hl_)F&MmSD1G9{0f-imevM*n# z4X?`z_Ynv4-sA2;!}8@{0XOberB#UzbMx` z|5K6MB8p8+w!0T9sA}r8a%~a*kHvy%>qU?RB2nhN$<{;>BHCKo-=+GikBPW{DCN@v z{U#|6PzCcprrl*tbvsBs>+*hYCYusB$*?hah(wkYV@HZ8dqj z+RGUHH&N&+l9yckcVMirkCI-=E#r|O$EftU39;2q*=U|!ItTgTKBMH>GMz?18RL1~93>y7;q5+E9OvB4X> z%ld%m^IcZ7nZL_{{Ce*QWAL+yC8FUx@wB-_k_+I1`F> z-dgz+JNXZ?rcft_eWtw6)evvU@FC8D`y`;?0a@hNCmJBbOkvv%WLTB#%+vBB~*Zeo6Ffj8uFJO8$IMBM$jejorB=i;5?LlO=0*LL)wU9OdkeXRV)v=Z1M zAD~WIHR zDROxxfsm5HEuWV!;IbNgk!fsjCi;{g@l~`?6opwZq4p!e6#68yPMW~qsOn*7%5AaO zcuC^2Ll3xE5WmHHBOQq1hBBrh2w0^X0AKM^D1~*&vki%PV(s<74BogeN@yuCSH+abfw8xUhk8oyU!x-FBU7X`S!V``D}(pa2W9!|)#8@!pg8C+Aka31Mm^I0dkuI&-M&5T*eStxX(0B>@UTXU|QRrxoLA=%_fWK zh;AVNkE~};+?GvFOHZ^WRolV3oJVbQ@pZY;PJUIML9bHNiP)zi2GKv!?zIOjR(oeS z2xzpH$(uF)=}cTwDYh+i;|CHqBCpE;)J1Tnp9@tKPs32B_XMI1i9H887s3dlzc~Xw zf36_foH5C+1g!*&=>A!3a>Zshv&(u`^f|G~tv0%UC+uo#C{<(&q+VAW_aTO=?9g5+ zW>?S3!laU&3E~My5wU#IzJi}*f74L??I>;zY{>Rhhq5_ zc>W;P%3F&U$}L5)wYb!ZHU~uOa7*zRqx);u_zhY>T1=JIZZ8DFJij-(NwdpTs+}c| z3Hywi1CwFxF>xR5iE6r#G-+Lzk>S>i5UrPuxUR>s9l=PSh$TKsz(-*iq?_}09wh%v zI<0pM4Ov|Ekh7yG7FQh*t>;DS`O$j+T|UQqGCPV#8{MyoF>RyI7}GKO51z4vgc;q? z3JuNQXSUr7D1Z_Mcoaw8YxBlhkN*q zeza>fo~xb)@4SJbe4og&2M>P_B!yna;<=BP!+LINIBL~M{KAXmQgVg@&ib0xw$6ai zm{y{xH2+?0Zx(MiUmZjn3IgkI>t(!&zcqh<=we}XzwDGJR$r3n+pkOZ?dW>IGMD>%x6T+2H~`HL-M=|-9f(= z3+R9eK(}4-k;bIf0@*xLQix8&R$I{>bCfx%i=Mw81G)>#jE8;Mj-wm(zH_Xo!j}jU~~^>tYQLhFni0C zE8cTPyyFbPRM6%EmAw5?AUX?48<#goU z!u6aJg($dIt`Ee9AQ!D`cdqM=?veQDG3&A@+{Rlb{)u~>F?Tv6WCv9(vhOP@iMV#wP~q#ff?2JFmC4bc(H= z^P=_ARJ1uVTJIOF!!4a>8QrI#cpt~ONy#bV(t@!}opLWg(9{DFe9kq2oT!@Lmc9Qf zJI!X3^-9_2g|B(EoCa;7(7f zEPHU)&FEi+j1R422Th6AHmzf~m?O~L{Z5%2V;+?rk@nDW$GFj_?h$PJTg4jb;b)?3 zbaaijbIrvf*ekJ5+j#;NG?;BJa=l(?QKc+DpJUY}<)T(-I;!^HH*7d7eh#}cs88To z^r1!P@=8#~jOq=|NTeLGnH;Fb96+I-FB;%Ij?tn=|I{AEGSBu~J@~bLua_6J61wvX z??wsDB*)Kl%;Bf$cj856mK^PL_+_oIye?&;mL{G;iAHEjlU#@J4iDO*da z%IHj0oZF*i-P0h*)ao`B*0M(T2;*09jwVo*kb5<*=x{1{R9@&;&;R zQJZw_snMHA-s=9DI3s!HD74`-TF!)c*!a#Rtp>kMkZMT>j^}u8l~engMU+&Icm~vE zQO?5rg?uC{`+aB?@UoPCZZ*ZtZ6-8+8eWXD_USV+bpyN9ry5g1(N}qhmF0@;d6xZD z)l7;}VzsHz+_bkBCfv0!;qGO0FU$xmlPd2&0#?U`&%5F`u6-S4mU36S{h4mG`wtE% ziud-|=Ks+1QZe=#o}o^WWA%aFsz0{A2C2Y(1Ym`eG20CJ+FLzDtQoRhM4Q)Tw8=&5 zJDpv=%!)p@M(anbRu6%)q|4rkK8qq;#H(M;k^U5<;DorHv945SXnb2T=1u>VOenmFCEOV6V6*oZT zPqfOpk{m0ZIf4uPI|8@&PcbioS6s7(Oe~Fwztj!Zxb79MbG<9qL7kepib^g`xaS&% zru$~pso~K?jFIa_keBAc2frl}Z;K6ib5p+8ZF%q3d~S2zXFvtF=1aHbL)OkdXfu1N z{K=`$h54Dtl+tgA(r4(cPs8N)mvsBmf<6^xv|th z@EFuEzBcJSk}>bkG?H*~XD0VRCc4m_8JChK?p>Mi&dm20BWy6iZo5KF}UHu39Hhx9AQVPU}K`vf($H#?_u6(mKG|oUc7E#>_0s_{skK zFoMZq1QVB_vi!+>h4s85PjDhg2b?hfMkZmenTbYXq%O-}VP2X?3%$Uk`fYqOOZPI< zED@ZZ`pC_E;wD37%~%9q2{EigYEMzYIwq#YERxjwE7ti$8;VZc<|8*QFp-SfWcp2g zX5E`oyHeSEQwJHt-?!muy&ut+QFS)OtVXpAjSQX}TV|y`lKFiJFTD z-VGGVC$v4%xX5GOuGnG!PH(r>4*M$8KWvZrhnqRn0^NSvsY}(Kr~pnr zq5t6*0N+v zl3mf&1N=lRrLY@EVA5krPlD6HIY_r6-g>%!quE3_m6a2MA87>mL4VRr;#IdQ_ZI9zogd&Q8TmV{Kh}dj(zmIbm3yzU^F^jm7jOIz z6cc9VMRnR@bBWuRBQ(M!wOJIvca-^S(2#D#K38Si?DpwLAlydHh^q@*Fy(^oa}vb% zhj0pEXf^+iGjixPywl|43htTjs3ZZ5V&OuLcZ#8yyD0eI8+wwtI=M+fyJ)AoZ&!`b z{*whj13$5D7IR|lN_%+A{3;Gs6AY+XmB?xkJvdPKEl}T&Q-ND?cvtxX%xGI z*V|k$#$A~`O%G(n!3Wig&jHb$E4g%-Xhf16d%jaI(e zJ>6by&M;@@=~wYN`q0q979qvp?q-^c%tH&jy7*Fkbm$1n=_h9oHIFk_=5ffzPtfZ^ zCr1EsA2H}ro^%oQ?5f0+2ZbUc2>&`K%y3qhu^H#WG0Mpn$_~q>piDJpevNG_rcPxp{4(3Q ziYe0fVXwemw^Y9@EYTwHG?e*Q=~sYGXbLFhE^OtYBi%+HCOOn$LKhgXrjM28o{1aU^e9(#qyB|p=~ome!4guUqX=mFUz)OGoac_cl?MIB>il8N!RirHke zm|6{kFatfwoPt<%4D=pcfW=p03iC<;dfwb&bJE7l1;(@r`bWM`6&Mw$0{tkctPI#N zApj+~0ho<3vw2!{Qg~u$Du#*a6Qff*jrld&9T+_}d=zXi-S+V5tD=LGL4HjKGQ&pS z{!Cq9Xj9eJa$)}?Lz>3hZZ!MPBBblnRTPLU+860Z&KY9NY@?9KL_O7>W=lcyCYpTI zQ>PiL8+2$!^w`Kzdb&Nso@-anTV>9+XX)Abz7U|*6xlC8y)@w#Zgh^9ZzQmtd}l@* zMWTF2^HA(OCCDpo;55sOnZu@~Cwa6_g7!(!2`*Gs<@Pz5MBRgQ z==Ail-ck0K6Q|o}CsNbXRcD%CvCq_BDcDPb`e8(EMCLkJdgx&EiV^sg_^K7V&fS7h zU}7U4LDX}&oTi&q<@Pz5N_?zdBmU-?pc3+uq!M(H8T((-I^#~M#Ca+$uW7SNoF~vY zyJkiyb-n^>U}JpSs*;k;Ooq$FGF=T&ews6>OsBI(zM?YL*UOcWmnD_4VLa`7S?i1k zq?F5pQZ7@8%au(=hPD~~Q|P5vDPUciID2ljN80rU{9;qEl zdaiW8J#@dR#>}2+3A*3Du0OZj^_O9^9;icisf3I)0Kj)C`yOSFpS#Kgm5pZm4Q^D% zrF?}V`>FBLzFqj@>YY{cjlfdgqXXb+rT_H}fw|=&u*`T}DoREX8C(x2`$1)sDti_c zeMG_COD1gT2fvn!o(L}5qikYopH}u_F2Z8@J*COp;&+y})GySV@}4G7OZo#@1{3dT z&V?#k?kww!kJV`HJ`b@Q1wN;|=av1kvX7Z_Z1hECzNG9I6eTewOMZgFb0ItEaMJGT34yY?M>4GPp;XX;~K@=`Cm zBAmq70E;*A&LJ=l@wx~>3(46INpR*prVdU`gQH(9-k}Z-A!A}s$nUY--Ilw@>ey|; zW)D6Mlttb5tToQkht<45sQScKM%s$-Xc!cq?1R&`t z7ugk`TDeWOz0vl7kZiPpAXuK6#OTFmC0c#zU$ME9gNV2Ub8qGtV zxw8LBaq3^{xD7fNwv+w)%*YFnvcwTRLzV`SZU*UdbhG3Jl>DzBFwc&rHjX}y(zUmC z)S7uLj@O`EwMJ`&f>zKF;{$`+NC1hPX|>jH2{hIvmJgTryKq<#zWV_%YPK%Hs__JrNoj|L)c0wr>f^YZ|J{$>D_U$9%y z=r;rq_07@U4#CQ5n}en8A37Ns5$k`YI%?t3%!o%%PTGl%^5+ZPWYejIqm#zEHe#-- ztb-*pHueIj!C{@W5pZWhv^Zv6@>H9nUgw?~!)PI?-ebUTg?2KhhgnI>o?ksDfjcvW zeZ(HO0JK#Ci8GG|lLht@)v(t_&>+$Ok`vu*vX~r@X-~EdKYEPL9}_-SA5%$AMyx3I z#k%8g&Ji}JmsducLgBihg%tj=F_v4f+mi)M!e&>*j3(g}u~uW_DUyA7ZM+K4X`OlM zhxo9uMc=OqXE`18Gf{{xw|KMfXtbKBT8GuQQ{Q2u-b_HIBfn^qUJu%3IQq{~V9dq` z-LXwC(5qk=TcPh)=1>&H7;hl2Ly=;%Rd>Y-(H0VB-@sg}u2k7M*oH>1O7%Kx^>=+Y z2lk-#;$7aTY6~K$ZzBju{X@bbVu%v%LX5~7=!+fhh%StTkzp@%y(SVCL_s!`y z+DC}}1E3gqv2E&2OFGMmr!}u%jDoQ;xhjEuE>Tr}gPY8wBI_CwRmq9;o6VX8gNKn| zaQ-MpU~!is%68?o1fA9?6B`5?xc#_D097uH947ugjNabN+d@N&?83Q(p+O>(vfdQOWG<)0rPvz+pXOup^yXo{m-<2sMrk#Wt;lCYiu(o<1Z%Q z33sw>dr&@&8=OhQIbT*%}5NB0aR>mukK--#0ZrOhub6V`4rZG8G0yCs1uwi z1Io~o?HWaQGT`cr8VlySoySL$8VQnMicDRY$q5>T(xad3kX=sFGw5~vc&JsUp9&e5 zn4;gkr5-om6fAkd-(Sp9U82e}7UfRKRx~ckoMKhPE8`W3MWI6n@!x^x3M;CXmsT9V zJhGy=yktCP%KU?OPpd0+t{Iw+M?mtZYjkF$MHZ;nRQy9F?h*TL9lDy3B4}}R$P?MIs5ex1gz{pRwdxxN!Lz+1Xb6AwuPY}WYql2>b*>$^Ji_<@b} zRB-JFa_tY~S_}>s=s4Hf;lHTl8!B3g{YxxL=HFO-Fv$E_X%_B}m1&ZiF=(PsgqZ{{ z_C)=R7TO#%vAlj?GjPr!Rg6U&sCvI$pb{V*QD3{%`|T2@UE=9vs=_xP4E4iR9tu4CXQ3wT$)sba8FC5CS}8rPyb!2>ZBYvuA#AP6D&E zFuVX#Ob@;+kkZ0vmiBBCCq{Io86M${Y&*yt1$v^xP9#PO^I+176|#692MohHAU%1I zx?3~lO+j;7EyH=J7}RH&N#{^e-iugx9>>Qzmbya7t3W@ns-H?o^2fa0r4mFrTr&*_ z`)w9MouqRF=}jRvubpkdnpVU8R2l!Itt{Ml)Q^?(8dNWn={09{2(_fm{0|_`kGiuS zR1PWZ%eL+xiNZ{kPDPgERE_l(y{L&_YUayIxB?G?FKf`nisTOUY$qERVb8IyhvQuvi+qq=+w?wPSZ@oz2F zy+K)7|K8m2NN(23w%BlgtBkkgrqjwd?MlG3+lIhRn-AXC2y^_KUaP=Zb5kh%%WZ(5 zE^UyJ7y2{B8~=@f@fqd+Vdx^UsweMm8a@m>@>lH(-fLzDKHTyBqL&`dKY5IqyB4W%3i zk(TyVD?FTjhogC{v>o54@oo_(dIH(U0(mbHmzt96j&VZY80Pln0T ziDhC{u;ygr5|)3q)r3fKh;A3olm=@d^UgN<>>yr83lpdez$^?hHc$vK{}l>4fcy?~ z;dWE)Fu&vahaYSIa4#HroP3A>It=&j#7@=kF6Hf1$T+c`3a=Gs@Ke+QNWV*&J5{B> zpXFbJrwfTEewT80D(^1!t}^~?bvoEBoS&&MKt~ySzfpB=s->#gJ-bp@pP9DI@no$S zXCLICyT*p=fh7XS3!Mb8^m2ZhJ<&fuP7m|XcS~MZ;x*>6aL=`8IG~9uNO3Y4NPPV$ zth0RQEry!@PRVZsB3;~G-3Yy$2mJTJ+U@IuN`k? z4r^Odm}L=AM_OX167L5QMIf8pcx4e>a;TkLRzw>Swv7mgF2Tz(eMpfNWW55VnXr?U zBpSsF5TTRcPsUz0|?(30)UjL2Ih{1 zP7f&A3^Y5P=nnHjVJ`!!q?74kUbqE*5<5DZ4ThZdcpa?t^Vv44Sa*CzEEb&=NjN9i zZBBtenPflm152to2Q~qnsKYN{CM(%yaXvzW#Zj=m#MxF+)d-scuc(20RmPtI z7!uxI<-MYs_o~7x%JpXk&ct59Huo#1LEF2X)RP#h$i}1-&p4T99s3z4{H)_W<9O@= zT_>J*3NJYB^Mu|x-t$h3y%iP40BMl(bYSwt?Qf1|(9@~SL1}}4=&vtelIVxN zIgp4X8*`5>&OFqDW_JM}clTe)EgmDo;QxNx z^luU4WB$0Yo|ZyFd(DKLiwA4z)29BdN$_6Z6*dp+x91ioXit#7gP7y33l&CQX~%hb z1(?@mm|AYpN=~(~X5m3a9fh0_{VIldY$*?tRoGp_UNpkM5k5WYYWC+@928h9$@G=6 z$Ub3#074>&#q!m1J;W|t=k_m<3ptn0=2bBjB@8Ly7O;$Js|u*o3=tT{vyRDHHV0rC zYuN~y>>0@;Wg4^GSQoVFCa>0sRqHC)Hz6ED7}>5Y1kMcDFfu|PLc;gY5CL}s!svi|n2a6Z0 zn0F~>r<#42T4emjMNrkc)#_)qWSTMFfNYC6IVYn&o`0iYpYU^cngW|S-5g_& zPMiVG=Bo;mpVu_W&Y_A7BxtrK-{ue&G+ZRU9Q471K1Vb980DXWP2Da~S= z#un4C0^uo-A2&h!e#In8EFDWVnRWQKC#FszKT_0$jEhc0oMI{se`$THB}aIbOF%jj z6df0_dLWR`LM1%eF%_!_4=megt_TM!IX1oHn z96E|7g2cB>!}=k{qY4XuE*^#rCWf^gdbjouIGW_Y_;$^kxPT6w@TF@c@Y8mxgZwUz zy#0`6JQwK!D-5S4c8WS=Hk&wrA*5IKyoj6pWjOJ(u=~@nel~pCGvNwcgXvep`uTAD z1+1vBW8#V+4DlH+^MYqT;f0}lOFZJ8_OQp2!52b4iEI!uqnQXX(7W)ynf%JbQd@`% z@q!Hf?}}6BTG`=CYXQvCjC|xj-z2?D=_VY-x3O56C<7&6+d3jy5nC{J{)+YI0*%=o z{0}(agJ_tz8sp0&{ms*?QRaEtm??|V26gf|KnA0tR^`sg8IHvGg#W3i(tTV7LiT+??wpbAVjwK z*tFp+HIB{d95LBG@}nJ;H)eq>dMOu)Tvs)giWG>c4?Uzh9|SkC7lY6GNS4$yE{!h zy$6)x+29;00}lZDO{JNQl|)~c*89)0jtLMQQr5Xz@X=D%H?;57dW#@A-=JInrkZa! zPniHJTm2^y2xzwNNm?TfCe{VHJ9YZvqfE!-%rrX88m51SPgwjx34NXBb&J#NMVw}8 zm#VlI>ObcJXx)AL1B58to}?PDiK6|MveJ=C6O*$PaBE)y(oSKV7DJS8rtU@y`mwTC zNc{_XrzY=>aVUcQvzmhTsE_n+1r*_Bf2Kr78qNNr%Kq6e zvtUPGP@zgu%%$M(|7XE-_r0)IY~?;IVG*1tR3h&_qe9fAgPL4yDL#Ffnvmc`kREUA zkCggYRez+G8qWKsvB8uUh4b3)8{XG+_G(&+-ce(gfhG5UvE&9u*TEvdOt5C*x3M?U z{aS%E-lNr*4C81@`beI6#o4T-x5)wzke>0cxo_-0Cl4-?q_9AtaZDXG@i9!!( zNU8{JR`?bsDnt65;WFSe=TsZfQ;aFtHJ$#1m6j*pdBNn{Z8dU6-qxo+1I`WO<29$l5kSlJU z5&es4T&sHM$wXYCUn0*T`;T^E)@DsS$EpTYULmw4GNq^21Y9FedBRf2x7oK$uH9tTz9q32RcM#@^S{a76n(Yb8#-giXd> zgygX(-+U5+n|}paSX1{3HS{2VU$|F~Hli8`SGXvw-O?(AOx1zGEW4N{nKvqc4@=bu`Mw2n+S{gKyiEEK1TFf{+No=( z{x_7d0rzi<@&|_2GlSYr#z@1NR%iV zr0@H0i3s8O0ILRimQA8bvV4Rx9@bBYeld)ah8dlZkUufKN{`y3e`4(>n{CgHw(%Z4 zs?&vRhUHv5TNNz-$o)ua5*=#8z7c^as2cgJfwQ(d9^t^YhD!!VG|^53?nKD6Vv-{e z_>k>1NY-d+>srD1Vhkiwd&sxkaVQcQ`eE~jPUj}3lBj4 zO^|i@Z{~!^iTjKP2(X}tcuTwt-v&<)Xz6e|6~BvO(1!_qgF>7L&Bjdo@z0&2TXCyME8cdTRb@ML|a z7{irk7M!A4m{ttys(w}_DIcO97XP98^r)RnAlr#xTdB{<+NmtdL2`wP5t0ULUp}2{ z&0|v{o{Csk{k+PiBZGks*-q9OSzj2zM3`^Sw~k#9cmZFrnX|Jj^2F!!?)Wehqlp}a z4*PPgPSN)X;+y9Dfwp?}9ME*`Url|aUZ~H~PpZVw^q|zZ^z0P(8_&=pS_K%(-5%22 z9n7r1lw3}>CP2@|mB0=t;E!#5%nM{K_*AhFJSV$LWY@7~l+i;@svXui!cyWqu;~rZ z>%uW{Px+5~7J(#ZyB(>rn1s&+t(Ll;FCPjlu+#Xbz&1XZbHQl7W)gBUit)a|y4v~N zR2!`9=Vs2>iF9(48gR2p+@#|EK6bOZkpbFxy?R0!!#j1gHC`qrWJ^FnsE17U@l+AR zU`0Zl{6+k&18Th{t1X=a^TL%Sv_vMXB|3jImXFd+pkr)Oy?UU|a-@^u6<~i!S*b#< zlv{*MEtA&snpP*Uyg@>3eR+Sh9-=!Sv~4zzbO4rg(U7rlw+9_Yf60K;!VGmMqUOhF zgZzMetSs9%YJ>`Ey%UVZDS}j3`%hM#waN0ftbELrk5QJHo$4p*)Kau&W%1O|I(=#~ zTD8*S(<9pW6`{UG7UFQIknG4JD~g7egZ8GBgjjcd#<4F}%u&d+$x-;T)*}{tTZP0i zYGd9?LD(<(H!Wsh3pF`ap9MP~MGW)>l|2@#8P&(I(BJHFTI?3Ed=ps!2ZjbfDB$t0Xf=VTi87tiBF zagTv>%ISs>>XN-u9Bd)cHP0u7OH5W35yE~iud$rk`$}a^MDY!v<5#iDPejMFO}LG+ zDn%J|NAofJbFDTY6MU|xQj4wnCbjftmA*;As2RIS**B}2n-pQuoOf`ygi*Gs0HQ9okif zl`@HK%!Yn^5Z+WrDofm${pTR_T+Qbe`RC3L^3UDPL2s}*H;;#Y(J?+Ie{eeLC6ejC z07@iXQ_0$@3Kz@gDytM@sT8!rFHGu2c!V!lZj>;wKPnhBDuC(?BmzuU)Glh*C9~Bn zB53a6b?z2zXn_#R?^JbPRSw{Vud2}1Y7?EttlJWE&WkyY`m-7OBegyQgkTg?jH_do zFI31oJrdn(T_8sE;GtQi=7@$_=UZ@b>7osXOztLf<2`}gxI^8Gq_b0Xl2z?$)#jJy zd{q(nl)=b^1+?~RoD;?_v-5*!__xujczllzeOEg_i@Lv!+Qs-UbnI>0!fy6U2#6(w z3i2Uq8vP+vmUI3nhKn&lozB2YG04G0v9&DQd_Y(0R*^ng>?6$_%nKAU8B(DcSRLKYN4{zeyianuE)b5bl6Z&S_KYT0r z?}FfPp57grZ?t~PiX@_+qp#R^IW@%S*0eLD$g!&Q+mP`Rp4+el_6>?=ow2lZ&YPk~ zKA{p6$tb^vQN(Hqwy8bp81%vQ=f-Z&Rr#rlxaMf$xhpjiXep|Iulk%os<5D|<@tb;pBVhsAF;-E61^I$y8X`x^V2))e*;!eW>h_1&)4rLq6~?lEsmzb;{hD}N$JZ$O@GU>5-Q4yI+%y=QDKNz_N*S$ljYq_aB&N~9NHrPZ@rS(2c!0Co+o6_kSFX_tn8zN(0*={G zt~{D6k>W@4RvXO_bJS((&w;u7@B_r`*rjTr(fUoxc-9%1#plS?4qBr&yAVrTqx~3$ z(a>`8*d1xb8q7&Vp~i?X#%`O4NE!QpE2MIAN9{X?BnadPGq zeR9Jo=E>$M!%o(xgij_^uK!2`J$~*EwL;LY#i8#5%wbs{_L+nf|*m2}f2&)8*k^!31fDP63c}c@2l^rJ%*ADfvOn5s~ zd^=gE$F=H0#bN%8Is}1qL9wzBFZLKK8wksW$icy}4Sy9T71qq?_W^_8IC+YpkZaT} z3z{qI;*BJ*mKS@qMx7C7Nm%;L3XpgV8izdBqORz3ne8b_AI9?xAuw_Q1nY6WB;q(c z+b1#Hp|?XRF>YqTF3zb?)isLPfNhGn=^!ph=gi^5RHtWU;)ApqpNV}}$R%2}lSqbn zowD*mNZU-%p}+7hu#Sal5i7;8M(Im3HH8`nx92SrEiE5v*n`7u%q%=C^RWLPoE z#mJMi_o)yK`UfiLBn{wOEtXArl6$q`RT&SN<|3CwC8WSGENqh|Q+?9-p=qAro*0~! z$KB{ZZcLuJAdNh7f^uS0cWC2vsT4fFRO$((!noAqte{prTs5npjQzd3}h|MG(2^<1P{ zE>w3ZV+3pL+49_th2s`+o9eEv-#K zSbxGOv4l^A!%*a(*Q zmUC76X62r%5}OrRjOb=~F(wsxc(sC%l33`lkXFB^OIsgl`>#6sM<~)+2c=7&6RerF zh-aQmM=i`fE|NKp7qfx_2HmX&<|*MtWgJo?77aEplnZ`502^tVEyetRQ%G92O-wkz z0dOk+(DL2L^#|+|{^#s=o#U2EPs*(R8B%j$v%)E9ZC0L-A{lV5GB+#u2y&ZI@r|P= z=!(j)<+Zq@)tHK5gwpB-0fiSn-LTc<=JSP&m9=uL{SEduZQrGZA73#G7nUZz|k$Hw1^({y&*F zX{cRluW5V(bplJJ2ugYimM0)L<^PtGqrjudhgFoPyCpRBO14>S!vg2mFs9_=i87q3 znw{x(vy8pNn*AV z-&6Ju6?4p66kbpX_=(>@eZjR}qFg}t*DCj*;+TwzVCS@)0{MVK|InqkR7*lAPV!e_ zjELk5d=(Qxo}fyybJ&o86ttcY8ynw>qu9JqIa@#_XUu^nt43OgVz42>5SvLb+?=~7ye(o)GnB6L{eb$Z72 zy59_QCRMpXmoC#SW6g1VPDaA1!!zVslA6Uqlkwd<0r$>O~5y1 zk#DHniC#tgoI=PuI@wjRyt1)^GTN+%l9+D%SBKd~fDT>QhfR4jyNLBAZB{`f6mm1ZVpj={^- z-eqc~I1YA+f9-MHz%7HDht!Mw*x#&Yz;7_$#{h;MY?!})()169ehwGgF7+S`o^+;4 z`b#CO10eo+kv8sbrn3SobEC1x91LY&CDA0>P2iA>RT6}S<&|YRhrV8VU01%QOE2ll z)Tnm5O=3218OlrjC@1L@7V<{+M%k$Y0sZ*Xole3+ad;6Y&`#!7P z`cUu;+N*0KD(5~`7!e;?V+<`|M zACcq@Hfi-DZU*3sW%Yvx9iyyChz*kf6u-=K0D%NIhEr6$Y^hARFR4A6dIeT4e7uqv z>L~hU4{_9ztZ*Nj2@EFaHS7x%ddxxTQLi(-)({g4kn1HY{XG70(gI*L4x|0s!T|_G z(W?NOo%9)M9iNFA%p8akyIq;rZuC z0S_qSPHqes$*)#&3_cez^A&F@}O1X4p}#9JXS4~<@y6X+5d zb-o9bMIjz5>nPWhO=q*9>Esj%pb>t#*ABRE{kPG!T@B@)Pg%xGL^HNJcGk?~v$z|G zg3Nd=Xp}1fEkLW7P7phYJBZL;zD?SactTI(yIMOFi^PToje3>1Ay_@LdLr_JE7pv) zy35?5okp8WqGo7bUAI3z~&P1S)CFN-UH_o&(=yO>?cN#KK^`lUCciUx_$P z8t|NRTDi$3wsEUfLvD4mD@hg}na5)gjzJO&TFA7E% z-6Xp2BkE$)r~}cTb#)e!B5Ww2%S;HVVSw?XT0BE+*G zNIYV=LlGTHRg-Ba>R2(`JGk6E--QNT+5%1OL0{#lA(DgHcNa?Jy#jQ&gM;3s?>Fz& z5w7~9!ZDv_PHha0q(!3cpS01^XOwC8jWQ{#TZ}S~s)~m(%8(T6N%2%P-b_KTd_JXU z>ge;BScZhr#+6N{tim1P>9Iubre%I6iYw^&I_D;8`^+%SREU1|h+CbB~+T&3{c_vc8=CQs&Et z7^_Qok*riUpGh?am^95y-XZR&>6ls*at;P%v!6A=AVQC95lr@n@RC+s3_%vDbm|GR zL$Mr=DhTbXD1tEb!Vh;Y5Qp4rO z_Xanv<;Jig&*jFXjXChfPX#wFzeWGX`!z{X_yfh2n?I}Ualy^8DU=o0r?jz>dk&5E z{Ezn(3G=!@w0zL=v#r+q5+?gL<8k$zn(Uh4>51O(^iVINX!}7o>Neqz(*3>4-U_=d z+W$gj^k?$1p@7cRI*cWh1zR^e4VRhjlXm!BmvyMge#{L&1HQ?A-Bk~}?G90#5tCUE zlprB1*tIce;%P$(p6oMGP4ZfLo9&6wNwqZ%B$a2dN~3N?&mdbmqTf?-0LvD)n$S=aeTVnurCnb8o>z&PBX z))aVVCa#6h$^%EANQdyXKY>2ip=cBGU>FmvnVjX#U5-Qx=4^nmM-45`Enu-NGAVjT z&po0VGXwgt)Oiu!qyFd%y#F>N#?>b0he8=iNSl|OpGX@|s?`R;5@D+nG1Nsb2q(a7 z7O)mf173y(FPQ5c>e0YyS@5U+OM`zJ{C`^feQ7&Lk0;d`@B~PHOvyZJCc5Da2qzy? z#uSn^qSUsa(lhLQYQG%r+WS?%aPe`W2{7*={+Zu>OIU-#ICEL|G%~QO+sN_T&#cV> zi;(AeNqBi^)G^jUs625ZJ5iSS?hI799K&#|Zy4=nD27c6ev+X$m!XLD_Yc^6f!Y-P z{jmppUe)(mzobX`pHnaDRmRyn6-;;e0Xdv*Y=jZF9EFS~ri%Ws{gpydC(8P4$%4ba zJ7M<>7|4XwWsQkNJUtH03j$W6A}g%HbO8U8Gm-`+BmvKUs~R(Sv^mBdy_<-c{PU_SIrs+EHE^)m)t{|( z@K5E;wfoPs4Zd4-#Rg})Hmbo*OWeiwk~xc6gFaBlLI6;7)tbT8u;QKp_)5o*a<>WL zc_czGL}Gd0KgZFBXIMIe$=#i9_9i$+I2JkDrRva4wF zJmIPZ@ebHUFV~n)hxp$Q7y=SSBuCmA?8MEyoqtWG-&5hNr1rzJ!YY^*Om^&SeR}K+ zeOhci3FNTEXjp4-8N@D9DE_gnDt@I-p8fyt(yA-}Rhdok^#zqvB0;8`4<$Tiw3TRmr4ogh3%z-fGIn1k}s}neY0u zwLyl}3V~w`g(t?bwC{5%AIoL)8&$3eGAdjlg>l%amdJ?Jm)Vz!OZ*b$AAYR;L*jsa z?tstXOZ8mi?1$Bu5u<+y4GM#=ck!t5u`*YgXK2=zM{fVYs1CozeVcO!kiCjPgukf~ z?{UWoq1WopH_H5o#?gwOWFTc_Ph>f~;v##8&E5DC~k$T(j zZS>9Olzv9Vo>kWORP6gob6)z}8%qCF#Q;?QM8#fJ@wavD?b^Hz9i`z`ZQjC^SNE3A zhLX8tDj&jE7JeMyyWiU$5|8Z$lNI$Ow%>_e%T;~?Dc|37BVZ zV!7z8+NwzO5+uuATC73($0(0@%EUQ^c3CiiT8IjYz%B~3+Z(F%D#Mj~t3CQ2aHAad5@W(4alk(3e-7`~Q;f6sT4P3yex~n* zROYJlJNLhc_Q7NoyVE>`v6>v@)@D;~Iz2dIeW1 zMaT@1tZocm+&g;IfiLcH?S5Mq9@VSdws*Dtp0?lBy}!|wx0uy;f=Ed{rOOk`E^Xee zW2EA_L&xsa7UyMhc~YA`bbuJ(*rPiBlv(?MHh(Lx>NnbapKI#AZ}O^QysC$FcoUE3 zzo@?|=!yo?{{29@As)BrPc?7s_rV)$(`!{3wqs2ffI_R&sh@__rTpTSrEH zayecFV6CuR4Ku#4dLC3QeuPQ=4^@~UxFEC4s1#=Sgr`11Q7C=nbbiRO;$kO!m_FQg zW*=3w;yGkikuh-Y2tA+g@tltoJ&u`aW#E%3;?w^eMXHBWw%LiwPP8eR&Vz{G?YPp5 z6kqqCs^}}Y)95K$?i-F2HAl~-sDle;*(h-W<%m@08U~!^da<0ZLk|f1j?_+LT+wk~ z_J28%m_KKBZvle^lHz>|MeS+T)g@Gqp}}@~?!@TePB_qNboO3`qj@x(Tgrxoaq8Sv zWEkJar@EdQT=ID#U$i4I)xztFT#wibj8b?91xAaMiefYu5JRW&hTQQx`|k*4;{xvZ zxPQl>BBlSTNC%PtKYM2X&xp5Q&d(s?vN0)169*N+^{~Gpd?OVBL-=16>ENL^5L1Hj z<7sthSFHThGyJFiD?L(7(C{zAVr!@KuB^Ra)M)B!fCVVr z)z*rj0s7;clQV7UuLZun>tuibXAD9Zzf$+A0Z8?KQp57p#Gd3uGSTBA z(P8Frdzc=+&}eF~h~r>&fPcc*MsjHG;et)>M3ML^bQ(StqT>eUsi%FsH_Qu##~n8; z+9g03J-8T4H1K%BmbiHKXr$2#Z`;bNo0>_#lT6gV5ZUI zbshAQJxFpLIQ+ZAlVqw-nVT)E+b||jnk1IHP+1EZE(2l4IE10tVNWuqEj8Be4?~+) zK(-C7>pXRu@ge%Ox!OD_bW-QKAl8gN{I=j!E8u0BMhdde7?FJeWa7c^@ICmL@B2LX ztwH~NIB>1kpe6-QW?@pG+Fc}-`nw`i3U4PNE5-!6?%eD5JBD+{v^we&!P0|I_gYjk zcak{~-S}aZ-s7A5Z2fxRCdN=ML*-0LNHAvmN*c*Kqog6Q$h@fpjwWu;3$=LIQMBPE z_wT$*?%Zw;;Lgve^h^JB=N>%2{?Do2SNB)1HmDw2`!BdbiXM~K1TP%mwLaOej#No9 zZisi?pH8|kIsU5bxX$Z9|Cj1;r!SUJ3QG9CHvTMCESNO2+MSy4Rfkh0|it9=B5g@|ya>**6@Y7$Py33`yATjDFuQw*+$WG7)?(@7N20LG4)GYVQYr*Edw4h;J` z85@ikd-sKXAunHCj{EwFHm0Y?dlM?gH%`E|lm0t$07~Ca`{KS{Vty+}#xRB$*c;SH zv1Lk>*YtJ9bnzFr?~n3Yz#Cyu_xMp>4C)o~24>GubDP-0b2^Rb-&V$oept`(X|y`W88()pcX7@p;|dZu3F*sH)KM*l=RW zM2vnnjp=iQI|f*z)i5y;iwd~YtviU24FrCIBC$%g9^?)uUJaC3)4`M`vj=>XexTC_ z%KC%SgY6@o)oPhl5#s9}Yo-1@4|jnDQpv@W13mL}0-cDN;&Bng%Z5;S#t2(AoLkdB zLVi{a=$j=(W?K&lB?{3JSqtmS)4+Fyy@8uTS8AiCV_6>AVU$=5 z=@r4E?48I$=&yrfRryI^NV$t*=Nos z0HwiS1L@C8um{&z>%oIpJBJ4mC{Pfys?_0oFu_+;N#1K`9y})l%Qh=!Mcu2SAkH_d zuNc$*b6J5)!B`gKy9tEo=ri4~T&QL(oULaKoIQTlAsjnqPcl}NSBiV=@HcJ!fbHJD zf2H_DR*FAq{dYa^Z^26OS6L}Ol9Ue}e=4sOo5Aw0-#^34GW{!-=AjhZu*P1ST|%Omx%&i2Cw+wFYW z=Ia_uD482rJy{-6e``%{`yo%cSrtw<&j=0g95&6^#IkBGF&Bq6s!kk6ei$>sbaU1W z;WFX~uF$RCU;!P=qPvhX=raS!!sX*5fD>bGlI{RhPW)U|+lkWMtj;%y12`boSipLH z@yvASK#V#N;3bo>-~G$+%tuP?{di`dL-uHTb;hsJgUWaeZ#RS8C1g1W9?<%%{q-6y zxQ#4;1u`vaaO~gLyA?S02Enm!R(G1l>-#I_WFt@UTMqGU}68aZ%ofk>~lo%K( z2S1ab)em-V=3c{WPBvS65a0T1Y^tWX%TTH}1vv9T5=OdNecduHGkchUWsVO!xlqEd zGTFArM7jh^D6_||U{S9vSGf_vz*j+M6G*|LemO<-;Ai=fRvQ)fB#in_sD34^xg19Q zEuFnbmdhZFT8xe_2S&%*7xiKM0t?+9zZL|j$y(vp;Tdf;MCycMNb2wpNi`;*uqIZW zFt)w1YLWDoqpUA!%si)uBq~K}ah=KV+pLJKe%<`9*y?w5_C3EM`(vv&D`KFxU}ZTV z1{ywEPrsHV8w>lbR@pBBrTEQs!;Pt{+O`bS5|SCWS;$_diGkn^gLA?~IDm8_yto zGX2kBssDN3QvdS)rT$+m;+xbue~K+H@4O*%oBbjzwVTv0ZR7ABd=_3jny}LhGwD!K z7j?86m}4BWHWxfS+($Y2q7s`E2(JOGd=si|`Hm>obST+eUN{+t(+T08uNMR}$l0(I z)S=p&0~z@eDvTWt5@SZz2J?0B5yPm#+xn#OtKnq0LUm$Hio^@lql5;P@!)J@IhxD# zLY$8l6CGe?sv@!#&gM#Sr^2IwFErVV&Mp1uEtBbi6$vBe5Zw$YdaC-CFHUw^e`7s* zTN6)5Sx6J+&&@Z@gt_w~x^VhXHL3z?y%JNH!3vYL=Xv6muB% ztMw)wD`#(D&~!1qJx1J;RA!HLo!%{ktz-TDg#m5r3jd!`{=T+ve;AdSa+16H4>tP6 z2pzj3A=BtDO^14sc$#`)kqzo~kt$3&pkB;DQm;EqWFnHz`V-HNa=q4>XHl)|sn!TQ zqIX+LK2GsxTnduaYo)(YCR*r_C^2D8j?{$x@N!50 zxf~78oH1K>NG^{e-R~MCT^@U-|5!Kh@OqE6$p7bx;Neg8Pc8IMHSD$y_8&XBy8Wc& z>hCzlZ{*RRlocd#CA?ym*?5KN-V>3gxR|CG&MS)26kypIG1j3t%L@zrj|Zn3!wZ9k zxZh%WxClBBnG?>_;-DO_H!1V$@`k=7Edd;Ci*4~yS|S1d##O9AAA8YCIY1HJBVU6nx=y}clwR>4UvFhB8n3c&^{LMP z!M(CoM1~I!{QiIDP1&koKDm}bDfjswm`}FKn!C#vJ@&1+@2KosK8=V^U9wdc#ApAT zY~)jw-S8g^;#OG@Kk*COM+$PA&fdJA6hw@`FW4yYd-P%cKI88R?~+q3yY(@~7WH?> zofQHZ)35@_mj=cW)}8U;Rqn{-h+==c%`Jst5|33&EKf4$I&Lynr4RVeO(Y>f05M|6 z$;xgM<6|dFWPIxTTud~B1Fi?UAc{^lR^K|SUv+K2%+Wz_xiG{OG7(2G9rPV7-LcWZ z4L`v>21j*$h^r2_-Uaq)-KfmpL9@eD3TxLa35*6Idlmqa7@SL6)Fa9`9)%9|b+Hu} z|Na_&pFI89HyrF;hO$AKRvd#RpJ`F}8(-GOdH_mt9+SVE|x?8Nf)3cWPFOfSkGdK}oC zp!|wO*)j8j*MrGCDF5If_H4R!yB{~^5E#gqc42OmnZH~CbT@^QEQ=tFHu@cfye=}k zaC^#@B{qGFx*w=FBLHd>y?#qidWv*^Ka8hOP4yVP&{h^B1XDq$`?+6Jn&m6s_W=DtktG(kEW5 zN*}9y8kBdXUQM8bYKQ?tAx0xIik>mMVYeIx`wk&iI4 zZ3)=Jm->25FuRVEDQryp(6|{*jSt#lhs>>&3URR@j5I*mWufZ)@>DMPfxxbrli^_Cm8aW>8b{AieqdAJfCsm7|dyjm|PXB)f@;r@mZwz_ z)~Af&%Glz`$lalS&pMkltnTDti5ba*6JwH#@P_^OHWmo-uyJ)Ybt~%*?mVP)aC><> z@bh-_ka}DhB@7tBCZE@BRKKw5?h74T@&Wq$_MKTbGjg-y{~kL*$WGCz-lOx6#Pt2K zu<3GqIOaYX!`ygFG&GK^9&bcKPV&=4cf4?)PW^vf2HD+5iSDR(`+r}Cy=ULuxa^(8 zka+&u|MRk+$YtC9&&!@k42kAHQ~y=B|0wi3a@i;U=VkZGW$*o;m)*i;QRFgDJrN6C zrLd_xq5I8Y@0fL0S#|H5b^SV9OU>;qrN;KAQhjGbskXhYMBH#G)A@AB(-X>nUE!!l z?!Iq@>gRRNFU@J6Tbk8AyELP7W~sORS$yuzSL#|XbZGYx?3Z*O#eP}$F?C+(@DVez zuJe-aeob?HSr7lI9QW$(Z_*(N;M8qwP2tvRaAM{nPtNrH`QP;YSARrj=@GmAVY~FW z-Tqy>^t9diXhPj@h29R2{H;@Z!)-s*`>m4*#srwDTJ%A7>wzv~YW$yfV;G@zY@KZF zToY_x{M^c1QToC*9>3%luaV!`{#J+TSK7CY#$Y#y{|B)s$ngo$02lM)D=hL&9#~=% z-^%}1CqVoTN=d$53 z+5P8;B?A8_*Je|_)d!rf!2A}Rujp+$;Cwy(A~;{)+kU|LHr>B`zOA?Wfb+Pq%ICX! zM;&l}1gr_ceMXF(0A&;2#_;4})9ZTcX4cK8vz5o9!uQM|_bLK4H@AG~3=kpA|rG}{f zp@I}kDL6LouP_^aOpdqyfaqwDygv`$FW-Bnq;5}S35A36 z*O>jm`5%$veUXgU*jIYa(u1R?J%)5B>ej5}a6%=C@isU)+_6@}UY&bPHyFlDi_maZ z0RF{K(ZKz#eMVvr&YH~HqM?V8EZW&j$*MK{9iX3MPn-Hlv*{qrfBFo3T%r#ANJ=-F z{lb9-CO(Z}=gDamY2(N~D^qf?C6BzN-u+O@sRCtKf8Cj^Q`^_oJZ8=N#CKSI7hVG^}8EM{j(wR-pyVd8YBb2Qmj*E1*i3csOG$JC9*g&CHWyVARcVK)N|&lL zGFwW9o=gsb=S=0Q8zjfwo?=*&Ukcej40%5df%03c3-8;>3!DI}H@3qGU*J@J!kH2b z4_W95-6C2uhGDxTp0`=|LJpH*CLSi<6tKBAkO*CA(ikBOCi3T8T0I6oI3Mrb+E3tb!8&ENp)MBz3PQb+7LC+&a<3*?G2hQB!bSvRzWQfkk!{VXPO%~7fR*B~}sk!ot zG_EkK<2^V150|-?8;~NzEN9-X#%?=uyW+f52>9Q0;}+puW4N^wmT=}1gG=}Ow~fy{VK#}@I#VvKQx#nL)};PSvVu#J zGh5-`^U7_rx2x*lhigbmVcD(VhifGT`ctAl4PWK2bqV?R`}PbAw;G5CKjJ5)mj3db z4U_O!eTD`r9YI;?wURB}%+|xUlseI`6F&*-`4|PRll7!>JX1nLInl4kk+$t~4 z7*rN!@>N7np-C?3T3Wgdt8SwEGvMfC*d9Rx4B|KBR)(-@oE7VS=}^0G%>PFgd; zu>R!WASqh*yUKlA*}HLjj(t!?=|w^R1fBYtYWt>2r@fr#bke!Y^~_M1kZV!9^cB#} zKW12M-9OnJh|s)>Z+=fjQS%?@1Yku^B-^4ECnkVWW;$EQx^}TNA$X2{7ULXM!fdWX zGS{ImNX~Yh{;Up+&kHry^mfI5n#3&AwQ$(Z0G(;0-k_hOn-u)tkGp?Jx@V=}NOvTHu2?Zw`iYJlq;i(CI{C1t7f?!<}dp@{lh`DHsp992vg|YXH_k^O z?GX2H8gz|g>`B(3Xfq?wNi&(jq~>WVN-oD!i%+n^f34k5FD2_;%lKwwJmyWll>C~a zF%@p8TC>q?vVW^8g^9yRL)xlN!oDJ4uGm0Dm|n=*t*ku+_?m=GfRyl@($-8_Q9n}l zPl;`$t)yd*H9OjP2FgifM8jz-5(cJrG)Lev4PUrMUU;Ov%9@W`SWl-FBKjg6N`D_x zUB!w>;oUe2vP%=Yp346#IpNP`E$uQV`b~zuANAiV{ntVNHRZovuKc%4g17(R4d8+6 zDi9GZ$O6~3=t*0VtYJ<~(nt{+RcPImS?GB6*nF%y{te|ls@!iW`ZUHAoTS#$Ro_yk zzmGW{V$|<_6dXVgMx+dnt z$HQi6GE}fmH>s&6DnwMG81E`|#=3yLV^8%TmHC!(f1(Ia+LMVHh1IZBOGXf`ANW?e zbK~<$b7S)k{be-x<=OGGN+kS)rzXlGT)g%p6(y*xG2}b5HPus*kekfrE1pm;Q;L-{ zp~kF@3G~EsD)zKePl4u|l^>EtRh>T9tf{WGYg%AM3B5)-N9zx##%EUQ1?e@JF1bnzl`js7UQeN!y{4#E91AVR(E+I`u@XE-4NJwv zns2vCQYM2!j8t|69H9;&>LQ?B^}b2@Z_J%aBv7J(b|~(hMV2kNpGZF!@XHb%E~k=b z8)dU2@pvf~ix0&>=~1)sQ}3YX3f97@i7SNht?fhfUM})?Ia>~~?5vq&cqfyRKR|et ztj{*ttN?7pj_KS6k*aRyGo<&~0@c36M$aoa&epf#C={04slj zteulF$BBqIl9wdD+X=R4<|jkem53nXjH=$Lvn6yF?|#M^7c;B^)Y65kprgDU@)WJ6Jx{~#Yj*9wJ2jvD`mG#*Xn8tSVQT@JF+s!+I()RP;*VTq~rEOfth>Ufz0G?TQ zs_-_TGJKl-52-a|kQeB=QX$g#G#mMX9k_6owr!SD;=?GT3fwzoeD^S?|{f#TP=xduA8vb8VMf zmq^s;>bMyj%Qga?CZQaXM8t|`@ebqO7(0M@SbDB~n2)2WU}Z8F*cX(F2Jrn8X* z^|~nhm7p9xuUcZIOoLNL&r#`HE(?=DW2e5uBH%h9SabvW2)%*SPJNrwL&R>5)cv4@ zNsnfE<~#BE=65-N4|AK7vDkDp!B!RV{P#qJ z4)oQD2h3!1Vn>)_xL>GbE`f|m++79oAAR00Gus{o*f05b$hq7MU1nw<4TY`r7L`V|ow`e8O*RJ1yG+FiyMe$$! zOm~ZWhCAR6L?+sOVZFqcQ}K_K_f9n@+5OEnb#=q$w8%j6Iy@it+E6%sv9dpJ*`KzW zDDRrMOC@hpc9Xf@sdUb%KbQKIb?L8IxrZ#eHhzuLW7=`vq0Bo~Hfn}Z6!i*=M6}44 z0PGE0$6>Xk@YPbK{yjD3r@)!g`I7Kr%JZyDo7+Cn?XFAqhI``cOfsrX6YEZGa)?h}TS)9lpI z`xLR>f?o1nWj>`QFG|k0SA@dJ@pg5b(xbGyWQR7v&4h)g^pcBdzoC=B54ObxwroW) z5iY7E*vFC9VpUZ_5S(>wESjuBN_V&=GE7owYJGO|}U7Xal+~t{baRs)+ zLmEn1ECK9=_AA=;LVs7*MDyd;50rD3{kG%2tU{kx&g+U;Q0%PuODa4RJ&_u^B-kyV z3eh167(BhPYHan|JhwXDdIShO4C!m|7|hia))E&F!BlHi$iAB#6!TieR?2a%fyT4GmTotVptDe@?k^Em( z?U)*mW@Pu^US{-V%qr&hS5f+dO1fv;P@%mPtmm7)nPgBaVAR$T+c1 znK#NY>2StlZ1Mf`D9^b%8Bua$ASnlaxbNZyMnDT}3dy+KRufrjVG6P2w(8V2 zb0LGhWj-$86kC!8m`n1$f2xQ-D;dVi-$A)CK7OFfdUh&Yu0Ua|FF`AwWPXZQv>)Fm z%8$4g*;BGk_YdB>Q*AUhw_uBRX-|r@<b&gC0q{cKM1i;d5A%HiwtmR+-!9VcTWv=2$7=PJ>i8RRCLVX63g55# z?o&37#WnY-`MXSG!V%8(s)BAT)$v%Q4LcxCG7k0;+zKcaH>IQS9ts1(nMxBB)>t;p z|ClJ_@X#MVeZApvecg7O8Yw!L;ih4F3n7c5leAaiAZv?cVP_^oZNk|nQ8)Y@h3@%9 zrB)Ea$G{mNrvTzhQhEg|jo^dI1(f((Koay?y$JWusrqv&mWa3Ly^7BxV6J63VH<_N zcfl8aEEU!CtfxU#*y@9(lvSi4$mS`NG2^TlvvQUC6-9aY%%bET7|C__tHga=*EnAg zHrtL$9MglP6hqVO3`axgeg4W2hom^l8T5&gbvs?~<-{TT-^>>+*5m||BJz_U$GGB3 z&8QFDuU7a2Jv!XCsrh)A?~+=FOUN<{9WrD$RI_p1~9`NxIpvVXU% z)aABW*=V+=&=Zpmv7dC=|2dB63OPM@DBZx_#sj(AOV*VNlhp8ACBDuapotIS@YrGr zXAw`Ezl1@*GMOfBcF9BHSc)z_Fjr^#WsS_$-72v)(cdJ~1$IqTd|n48t9EpFa8mxMIEzyt}iz5Vc9UYXeSC##;n(~UWf1uPz!P%~;r^kImCa$h>+UoGB%N(9T z{>?b`gkpBc8yrR_fvg5Fh;Y>5Aow*H@@}gjlQxPMein}VZPqGAeTq-d1^kG%KQeTI zS6ga)4mZ}ohh=<P|S1Xz$R zeX8y?H~Z(`j;6KIKmV||6@;ed_f>8?HyGN1CQ;NwZ$^h-=lrJx=U?TYpQxi+CpUY7 zwcecUq=d!htP$%r&fm=Sn{en3!(qjx_g%GL9d9H7>Uv5a#TeybqY27xeHwVSoU6LZ zI*HZ8&KzZU;ydGq&-26MjN~IEDEdFFgo`F5$5e=i^c+6{X_d8^AF@+^_$z)$d~Dga zHiN#6MtvTSK1)rQ|1rT5EKqQskTseYNdb?cbYFN(!ha24$>9~9_o$w`)xvvJ_-_7f zZP1Y?RTcdJ<4=>@*iJ=V@+lR5J~*-9v(`Ziz8r1^g>xN2a!xN^j&H(pfUYEe3@~$} zB4*4Gw)T$tU6B1W=55J=3cro;tQdQbns~Q*oE$Q)S#Kn^Zc zZ&BgTj!If`u>43@H*_=`<9D7!U309iUCh8(q80d~!g6M)Z4<<1*>0;{>m*}iefhXv zA&p zA=gzFu(S4RZhJ}h;#T7~3}S=es|tloWD?#;_=} zFY_xTxCCBVKRWa4%<`;*P&tp(eP~P%3XeEs+MdNFY)z`@Gbg%#_UgakugD)`z*t9A44XsjYkh!y8;!rR zRt^r^MW*~WIu?F#R-FHBMg~o)wus(o63R$2n@IsanoH&$Z+WP9i;;;LnW_cx`E|xX zRXk3hfo!-g;u5uF#AQBY4AN~14w13y!X&-r0lld)GC&{+Xk+Jdm~m1)0RT^8 z&N9Li(4!#FHb!_l1GEbUDQV`J-zsBEJL$ZjypAsKCHPpqV1+LvstWsR_jNTufj3Jh z#0-T{*Wsv0F#-umvzGIp8RSY%LaWcnK0ty&MBz$%(13S?#+CV_GVW9}_!a15_EEvm ze_Fs1ppE%p0%l|}Go+tK)CZQW8F)(i}G%6XPk;9c-Swk~KyRB?Wl#(lr6(wyx7%e@( zN-Qh6a|0!Jn1S<^-19|~E=e+F@Y9V(Wm}>)xmD`(%zLA?cOP8DbAtsu1Zy~jp~ueM zYE+`=y!=)Gc35{l%GH*vQUxJg{5t=6z!Ci{i+e;dXo!CxWKIkVo7LxwB18ryaAPgL%woFKFxH8oIS zF6NL^j2zzD35LQiiHDEj!F;1+0jRqlBemm9Jza+c=2^Ve z_e0H}l(Z-=Ay?mnpS@r>)Equ(wqR%BA=aA#pJ;Lfk+n)9Jv`M6rVdPICn+N>m(1f~ ztL2iPl^H&QHS`gLaWWY49m+bAT(RGy;p^@QX-+NF6W(YUPS$vbqFQk7;3dO7LoN99 z;p?~!D}=WRSC!-l=4JxfO+L4qC*GPU4k_m><0d$)P*4%VaM2*rx|$ zy$VxdDmU5|+-Sj`?i9JvV?{2^Ufg0hXB%IKTte-QZJsI*@`7NH>#ZW3)gNY?AHYN! z$sv~&KF43+5&!iotoByJc@&M>#t|k(wz@eHHEnPBX;t?O*UIbq@2U7RbZRa0R$NBD ziaOI82iXk6)0WFFo7*;~g0`iiT-h-Xl>?V1Xzev{5ADHS>XrLZS$Fd|LuKOx#>ug6jGa@I|gYj)?AL5(27Y zz9*&Ilp?{o{JIHGfNefz8n-(TBl#HjDM`gx7`)K@_!`r=*BP(X8FqWy9Dp;O`eo+w z6iP@uw8&l*C;`%1W<2XP&;%wB7&@0L7N`wP2$Vn$-{0#(%v`U{9FIi$r!dg%)F8-Z zmINkgj8G5^vFLR%W zlv-G^H<9FGEws+2JJE6{@04+?wAfnA? zYt$Oii-6piY=J)hxQWgGgbCnWX5vY5`@&2}#>3r?S`{*DeFc99+neC9^y|fKk9!Qk1rW9i~>(RftAEZk)78vRRx$$i@AZHZ`pvr zU&yvsB!2_jQZ{jQ3PyD+TkRQoON96M8C>KY+qj2b7rhWP>sT`pK4u!<2~!v4 zhQkSnH;k1nMbV3_`H>v1%$S*uM8o9s3Qu`oBTwNe%k_WLaufxe=GrFT)p4nd=?;Xn zJVHXh)|bqk(tu!#|GJZI1U)S3knuYTHo~BvMDupBM}>4zaoDnVjU#MMmm}!XdGNoSWMeVH^F9XVJiBObw{Ln zGwF0PQ=R5lEtq%jGFaD(zfL0Uz1-1N=9952O?8zCj%eO+cEpWWJe=ez7tNDhY8}<; zl}O<#dIhZ;d%bb#YOhKl@oV*|)n1JU5GAx2J z*I_Pyn*Uw!|2RiD&s2S4UB5hIyLm;-LLBxPzlda5LFJU^0@n~`vlo(ojJn!)BjgDF zp58R^-w^X!$!&XfIrHK3lE{M&f2=h?%)LT()Ah`h1o;A5+2z6V`2_5Mb47L%5OTmW zzdV}LMBbXCtwc_PAdw>hFu&%c&l*%?Waqi4N==57F>Z>o+**x$qU26mapQ@oYdCr1 zxoF<7K%vKun<6IQ8_}`aY>77>F#U!D({EB>`i-?t!*h(B_EB$spwBqTcq^KVdz2Q@ z>oIJ{(==I^MMMLoYsG&sRk%2%KW0sLPoRzB6oHf?E zK=|k`HEE~XU^sA(OJhB-rLvDvQ<3BUs)u{x2R#;^oBUPQ56vqrb(QtD^54GcTuC;g z^KjI-E;gAmZFswf^od1nGZUkq$r$XvG>XU)((|UW2$CR_M}#oOo4u|hoy1%S1-9$W z)wHdrlHloZ%`@Q`s!i#8;rKIQqBOBZUk%qk6zqFA9Dj(U*vr-R;nGcEkUg-LN;ih% zH-zm7Dw?d_?et`VK9JEk7p5WBst{{Esvj3#i+&-JMF|Flr`pWp&vn3(~LTVc*}I(2_!R=f|vGbX{wS?%UOBZhHX2$OWS%nsV$Y*M5?t(=nmaU!0L zBA2Ejm%@un#v3tAB&W&qVxCEcjcBFwS)S+%{fsCYn74L4`RRX%HR#X-uG`-5DY8r% zpAdA}0mg!3^DDwXx&doY82dM%Oq8>$Xj>H@L)Kp6M%t;zZzuknCE2Edh)^a{*2(sk zV_AKG@*j^mkqF^X04511zhTTnK>H4y;$We|_%eB}VH92*=j6zEf-Nn#Dz#1AYAcCb zHL#Oi`pQt%fUZm{eQOZ)OwfB?gRwYxl1oEEW5)s-i;4q3xcdU z&LuG^Nj830IG0o}dxf8RO?tBBv_`C0Eon2DAhBxRA&3;_Zvpgv8AJiEX|l#8R_d;4 zB*^MMI$Eb4>MECK=i=0wlbqt{^gxT<;my?J8ogLV{3oK`T8rd;|yHnC`MP=OnR1RRuYv`G&~sVRRMnU zqsr&6tNqtYf`7{U7W@0g`>$|eMq)kHQooNHuO()k?|z)_oj-S}zH{Q_-e~FCd6lMn z=*b@CRyFo`hnk$OnB{i4ZcPt~)$NX(>(oc!jcIb->gMv$)E5$Q*ZY2ywj@tR?c>~4 zyA-h=(g*>i9-;4%p0Y6FW}TQd;ah?Ni-(wzdPI5mF)W#TVPDOb98^cbgPvG5!HG#1 zT^X}a$AU5Yh`!!J{Lymo(6$%y}* zg&|eJh|zJy{5~88%6%%}sX3psf&j{Zd|w-HBpWO*V^>u{q)v|Yjp%aFOA?qI;0r+E zbkA_}=~&<&bLik1+}VT5nu>Al1PuU760tnqr_m=uJ_-IaphsvBt@&QhxF9uMyLeQi zeO^xp4XXyktO~D@6z?HY86!=0!fm$u>_(3~kBTOR*b>ymI}Zb~L zSV~SXjgUbTwSv{uzV}M4IGx;q=|e=+TZ_fbmG>{SWdYA#!InH@tWgceofSBQON1cH z;Xv&-DR711FEWFe&CH#6u&bNXrOX;*CDk8$qNOk5=k>kVnt0qo&EZFIE9@z;gvEPM zA|xV`eBMrVvQgd6Z?_ohi6h( zT%($x+(n8u#=g&ZPB0x5z)qK6&h|4S*qOttbel4&i8Ee@S3QN3%1?$kn$TS?NPy@U z@2EH#9u7Rl|G`^_QQJ9KGwtdRc#OmGbZm_HyjW-z&I;1I=b0t(7&n(grpGB%W*EXQ z3HwLT7b=kC+>dyS=`9x;@uunzM>tq~#t)Qz#$2T~a2S945QlN?yV^Lhh@V0n#&xVV zYtBKB@qSsG%MpB>yC0CqanSzosK@w4(K7e&IJ?X3mD-Kkzo9d+l+7v{K~?I&c}!=R z1(-vgjbBJ;nRu^ce>cfVJFO*puH6%Ok6-quE(_(kiZBNY<}O(<6V8}q)Z!(*Ror1P z7rJ|i_joMzXI*-XOWG6T{tMSRiMKSa$(1tg;!w(X#ZmuS;70Dk$!U|R;Kx1> zx{+5|O(uGz4Bt+!EN*1ZU5gv}UCw`~8@YC$%Jx=nHZIZ)`&I5WaU=g4Rvm=VKjFKP z<&fdZt<+#N|5oJ$5IIC48iz8U^(O`V1Ysfk zMDkynjry2T{}JI3M@W3A9%?PehgKQ&umd7%a?hjepuV}Plv`sgWz9blEq&Er^Y!iQ z+hVL@Eq^Imy3b$B^(@iz53bO97UAWGEW%>vK+WWTACzG@X_EK924yOtwa+TdhYtj0 zXneyG3&JwRm{DX29f-Lcx`e3IggjRJOGcK;?FW`hn^D})O-q0!<_B1u95p(uk=B5O z&wzBt2A-NuY{ZeE=*~u13U`aK#2oMkWrdpT9a5dM0V2hBb@ZHDE zx66qKICtZ3vlts*QcJ6jT-Ohrb$fw$0rqxshw7>D{f61ygH_5hQlGx_1?+a z*W{yD=AA!fJv@OGPURzx_pswV;?!Iowv~Q7VLy?edhy%fAEol%tBLsQ37ipu_^yW6 z^y)u~1EY=2k$jqc3YjuPuL#GYkqAc$v;H~E`Xy4Y&_*1!4#moIYsk>05XK(Ho}%2} zE0!=)8m1X1W=J?G8z(J+aZ-@ssVSG<|iN#E5AkrqNSAn!Iz!-`@|YatmRpHZnGK$X)QQ4I z#G00kp1Qb9TQx~c!f;!0YNn~!(8mS|8n(I9-(1sPJKwk;`!Doq3tR7D z$-xG$6#YZ&)>eiofg2|wIh2C(eV!1$n11tp&bn9oJe34t&INAaqrQ>vxlK-u?#3w@ zweZiQz6x`c8Tgb)vgtUIDtONXd~~Vqpe=-Gc{z#@Z`C+c8b;vEVo(81E(}Wg-g4K| zh+Z_EE({HH--Ge+kw8HjdoUip*l3CwO;uClQ=}tdE?!kr@ny}8DxgP_8IudAypm_##Nj%K(h$R%hl3y$Nc6p~{8yZ?>Y zI*M4ufIgSdm|XCy2b939(N5OD0VS}eoHdXQ9>UjmBx?Yk)z2A%tN{QS;2RGG0*!0| z?)iTL-4B1V4plnHaY?ORgj7q8N;O~e>kj5)9Keak$QP0~Kw!wgfuo)fp+iBkl917a zZIg`lf2;R}y2KI=GC2>^`HIZcAv)gzeVWPlXQ3-Yf-+hEIFK)pH`>V;IH>2<9LN`- zd`vh7Kx~pPz?CGWc5zvp@#XpC37l=T_jXs0LyG--MUI)Gw`8p&y6L|ta~&*&QDv?j zq1C=mHTE{q(~S4wrmaRhLaQC2)p5Gf5i>eQgwki9Q8YR}B+Ga*9M9+F3((Nun6V}afPX?-NZp(4e;RW>=~8jzNd%4ZKDm9F3U zx)0r_4ofa6lkk~Lp(K|u?&JLAk}{Dzue(@PTN^pZmo zego}C(o2L)%G%EYy*dyA3DVJoToMY*jV{RJ5FLK)K^?xUx1)OO+yA!$L(1&GQ($sj z_g@s4r9_3xTD)X2iWbk=yP%A&eQHc^>t_FbxOJ=11!Z(W8Qq(VZcI55OlnC3;@95URo)p$oWKdo}l zaDveDtlPjIy3tRonZSHpbC^9ef!W!0m_5`xVl=UYVQa?)f$%P)mw{}dn*jq^WDpnG z6nqHF8G>2E=wRw^2BHTfyk1gkzYsz+atpj7+(lf_5>! zjfnGGcansY7X?T#p72g!El5IkrSE`gHG0WuT{=1{RXAYE>u+1I_PVWO5tzNRJL|i) z8Yf|I&99)}o%>F-{tjRE_0H>T?K;!gLMG->70bmRUy- zMS5zA8T&|hw2Xth{HV;z3u=2{CXpRoW%R>1SQDh`G*fEatY?VJ855!^n4xYpf(vd4 z+!epO^F%0ofgYAFNnUp+d6)gi8#ghBh0zQdVTEu7nlhTrqNmO9FZlC7kR_gno%erU zlgJ{Z5Ox6m7J&;N7HT+`=bAvUN3wO{)D6~hYD45p5xSog{bWfK7xopCr9okt9Cl#L1yGAsXw!OADQJY)2~FRcw^**D{8YMyBK z53%gSvbN<;M@OY*)P6h~+xfuC2cQLg7rrl<``byqd0*0&JJ)kp|wQ z(9Z&PZie8XQ_CHVVr%PgRV7Jr)Ovb2VZpfx3l|eT(so3fN=C?6<-lHuFflgxp4hk$V z1n<Tix)_Q2SR(o`Ew{A72{!JSzhmn0@=O$$i2f{+e z`-yUX-7@Q+3UNVrhE4*a@4be;H`|zcwVK%3rzW=aEipE?cCyUJwRUxOrk;&v&x) zJ6o)*bq%Ay&%V#kjx?r%KX#8gj-RdLXXU6Ou!epG=ZO>wSIf>8@R@#s6Lg)Ct0Frj zW;PpxF{2@73`UIBh=_-=6d(*9X>{aCTEu@U4xMhu9qEwA1>q;!(;!=#xCCJ)DJ&gC z1MCa@s!b*p4-}V*0e{L)wbmG%IjO0CqcIQCo)RB0CwuQjo4&R zj1zlXtos?Gc2sARmDvP|%ehXMVurz4lUn=N8_QV;Gvo9JbKi@$euZ=SS!|k0At{6L zE0;EMF7~!rU*KGw{<&P;3X2p$Dg~uWjlmt-IBOm`3waPH64EY32;|;!50xXWg_zUq z%z+*K4bf{}P>=Gv4aOiI$_u$;`JohBF&Xm1ZN}+)iT{ z^|pak;@+UbwzU>uhATlw*NES+ZLVl|RQ)OShFM*~=8ZB@ss0e{`-&ntVqGvJ?Z zH<8^oV;DoCua0T*^d?Yl%ItC_KX1mOj0YOl3Yx$&sC87;f``tphd-x=dbk%9yFjH* zP&m`#9hM$HhZ{H~HU0uc*puf;XjDW}dOss6z0t*aWB7SxtmF>xaWx$%KrEZK-D)ig zf7!DA80Ci?9y2zw zr?y!W!`adLtgn>y&lTj`wyU^kpLG_uHVhvV`|MC1e0ZOl+&i$@xJxx$rgHT3)uF2y zFk%w#MtfiPb#OUkcwj3vQO(z@+zp%{^qD{he>Xb(vd@BtVW~fcvJMv54I?$*@b`>X z&PivC=gj@m6N3gA1!H7>)3Qd@Kp)WI!f{5|cnF3z2$$<+muNLd(JeRA-9?NaAauf} z1)3aAq93H$iU4%Ks_Q~Uc`V7SITEQbo5>tft2sp#l~KO(y%dq1*Vhti4GjwPLf*XH zwD>e1CWBj-W+9g=R?sAS*gOt4v5SVqewaS*zovG=a7UIj9Pf6vwKX^;)$Xa`G4Y&N z<>eZx++3onH|Hk9V_J=2@i(boxLL@vO6Pw>`XI612p+0GxX!Q1JXPMuJ-4qX{)FQ_ z?s!j>9o64UxX+5C`uhoB*I!DwHz&f=p-|yvzcvHXoCyO0Ar|x81#UIm9$l%xJ`)Cz zGk<|Dw8S~y>{M;!AS&0>!{KJL(qx3UR(@`11_T91kMGq(0va;D=O>J`h3Y=6`l2EZH&Z>566s=O~$#S6nY_K zad4#({GOVaXpDS}n!GB!&@sV`6;@e~VHr~sV3#8)xOmF2QpN~myo;Y7O2;FR>VqF3 z)scN_O7GOon2`+-A%etgOkNQCXLL4WoOqw)a>y_gOX*TnCERI88=n-5&uh z5l??Bv!4yGO~#$cWU zCTu|gn54--gk*12DSk2@|IOvF{6V}_XCPL%kCWgG-0~Gcq8kZrIb+7>Rc)eXyJ{J3 z?rCwFbH*khMXY%cL$W8)mx{!|XCacw44_R~X>3B2c;P2^YkP^bFqfe4;}I+rJ==*>M^bMlK~iEPn-G67`1BdqZMl=A3il%-^?Nwn%|5S&MC%Ff*T)vCibfhukCN-^ha3!7jX6O*v@=#GL zmc-YfA`}IYO0zhHs9uAC5;5Oe=$AY5tyJ-ey)+*WLN9_=&iWh9y1|&STTL4r+>8Rc zT!+5ulW+SQ(ZSt5`TA#-B5JXR=L8zfar7yje6Wc6Vib+z^m0Au7f`=|oA!BBycz#c z^dKD~Cq-%t%evfrgynFc%FQCEb7W8)A@~v0zKXow$8Xm#OvEwpt@dfD%vc>fn%u;K zplo#ozg+_t@teI>!0S%cuwoRO(Z|N8%2I!yZblOORpG9HQa(#nJ@e^4(S0A!;xQ|&e zW7dPZX}Gbc$!R=vmFVLCzD6F@3?BK86tx{f|Gy6C|I~x@KWkQ|kjA*qr@!?7hyIC< z9iacy{+0e=50#Pv>Wi>L7eHHi0SpEU;0o)I1;B-8LF=<_QbWDND~(yZ)zIMZW@8pa zF^kF7`MvHd_G7Nv>u&I0zp4GVi> zPd3-Nac6FMs*yl&hXLu&IjKC+RJ63P7RS(Mriz4@jlMLW$LI4%ojsj&v~%zq$^3r= z))fnAU>WJL;0=(lxB|?eFKWBlT>>9H4}QAT?$;Zfi>NL8FG}-@DoH~&I@EL$D zk^i^pXmy0gJx^HdF8eNLCs{pqW+(ReobQ;mXS*YfEwxUKYKp1prP&Q`sR+lUAVeR5 zoK1kHHwNX?$!K+rn<2Ja)P*0>p*^CL!!38Z&SzY8V(jB_cVgx2tecDqN}Q1OsXW+w ziY0oN8TbH>)pM~xZxnx5ou-058w)3=>*Xn@!ja#!;azwHfk7q6+2)99@x^{jPY=%q zda=ljzvg_&+V7~>oCg2(>)L;-+wU|ObC%WHb*g?o^NVsdoPSbPQzhUxoZc<0|j;urng?m4KfO~(|=iYO6t0M+SHXCmV z6aL--CVaEcgy*nquG0s3=^U2Oormzpd8ZrmV#d4?W8Mxpe7!Z>EE@AL@a8p5FU?qK z%xjxoJ7cRc4?q4q;yw#Tj0GIGfCCmZ%`DAYX)I`;Su^WQV*v*&z|p^Gld&jfEFy5a zsBw0~oMVhdZL@3VY&8}U%v{6?mYi-Zi5W{c#}dx5q-kzx-b!Oh+uYiDTa6{0V+qGB z-DE6{8B0furI^o4Ic#au{L%tK+HLb|7o2G<<*=m^eh z#OcLp5MqXF{1iez4uyMnVG!ahuvSI%9Y;4D331*f6#RkAoE3hE^Bh8)%VWlJjJj1t zJdTpucCZ#&1mYtI#8ItuIiAT2S=PEL=?5;uesp7@?`SxwW%)j}uy@gB+A&cT(34sTMCvT>+4_cVErfv#~Mu|{jmK%V%6qwkY zb*4$6S#gx0hb{*tX$YfqcwNwkLQ}EeOQ(r2URRu684@>o1m_;Zb(6TfoNbxyc$;;1 za$2IF1`f5;YABYW?h?lfli3X$z(vxXj3&Us?0!>4e=YWNH>oU?6nL+xllCiISB{?} zS83>>f!4``hBcINxl*U=!V#N@WHwecrS zZQG)rjbB+FdKvx{>%a#18J{Buw$g#mlIo2XaSQ_K9aOIKXu=|oM1k}z;r;q#qw*Ou z5#jmFhN@DwG)YCfwHTPamGH}FFVowpD}sn zY1&k8D(eCT&YNjzvt9EXA)W)UFlTS_eX5cww+(#Bn*4}L#FEPr$z&$6OF2pZq38Sm z-Y);zjKK>3-#bRXo$LRLd<+g=fo(QkFKS9_KsrO9hA}E+gNKrck1(*p)j*TT)*_8Y zO`;i9ZWa%F(m8V6j3}U=a;i^-T-QLxFs5v&-9Va~C z6;2DZfJc*tu}y!;QfFFe(4ayl^%V9pnu=uHUEDkUv~*}bsQMX4<|Ja12C^cajAi0? z@NL43>)70iWGYjEnU_qPU`Vcju3s?kR?nO21@lGizg=uSZ}u3KKQspllS7oFR1Uml zPF`SKikT2qIX90}($(6oq)UUV+@wpDG8nGJ{it6cO-llAE)37k2;J@S16c_21g~jv5b2oP&#^7vD zmgG^B$iiL}B}kSb{Jl#_ETfj?u3vXt-NvrASv0ATBkz*X{6a;oURjCA*C?{ZkoFa2~3Hf&ZUN zY6eApGm(J;q;BH|rE8DB z0c3&o?m8`Y!s#Nr(z4ef#m^(y)=H*Z7h|wJ64uTC<9UAq-rat}^B(rxN4l)9bXg(Q zWR_@-zPC$1*5y4@rT&o%?NQ!?*$_S#+j1VyLYF-)?TIlAbCX@Nx;@MTn?{FKS?`zW zat`UQ(#uD)qIwzgkHa<#yki$MkO$@4n9pbuYqGk9vhwNTduz3B*7|rwARnMBlXhd0 zF6k+-@=cq18;l>w%Zt+YDdr{fGO;WOvm^XNEel(0R+iL zWlnLlBmY21DjL`Db$&F-r~?&&uN(2%lY1K9@>g{RgNhpSo{3%s6@d)xc4G=qx9-#k zl#fa;EbTgG5j?3Hr$ zkIQ4+EK%QQkbqwo;AWn-%7-_@6Q=`9GiN!y^%XLWdryaK9q^zpLG+wEbNjeu`u;&!w-# zq>SBLUbq_ji*XwQMoq>N-56jLlL;ghsD#L z$o`@{Q1=$5KFpS3`URTpE{A5nNhcHy6E)UR>ILI~gXU~6of!>xUt4AzlbF~+`k(ul zi#eJHr7WUY_~3uz?$m0RuJK>{cj_L)T4I4p$xVbAQl?2-K~wr@nP)>yWR_5a4?Z}P z?+_&K;JNgT!3db^NI?^BY*X; zc%eh0`m0Gh?Cwua`(5xJek~bXF7)f9ekEzW?7u#l41cDi?<~ddD0Tff8U8`izP;qy z;Tuc(_EP+|Qtr`2^jiu2QX=z%M9oHTi+(nde>ze1A#W>DydBCtKQceFL|a+;Xn)+C z;EpteY7_Bpvr~7qTqb(Gi0^&jKuVuYiDZ@a5gK4*fn~lzg-XuZcE2+hU8T;hb2@n6 zpf)(&VPA5)`Y9CDB?O&)0-#eb-OlVfAndZP6*}8f+KG5^6a`>>T=1F0DJN5v?#h`} zp-PqASZ(JM)tP)nEytmM#|qQf!hqV7N-vuZV<*H*UBz(0Zb~)krg&qnCEBc8Gh@cI z=i49zsjK~_d8GgrycCquUaI~7t_c3S*!KSe%zz_a48GdQSCB0Vo@9fB%o?jmB7DT8 zo$?9PW{MDuo0G_bNMXj@Z&JDFK$Qikn^b$KHEQB{kHLN{a{{LzeHRLFAkQlJ8!t4Q zF`GErLmC|E)3bbzQSu!#7qXO&HU1D<23%^`3rDiG>Q*6#(0fiK?^HYga6&3{|it8SrbI_!}o95q4_sdpXXHqzME^PC~@4)|f$v<_0@cM)oJw*I! z$hT2v9xWzcE~b7_%>KN%=?YFVF*wPmvr0IPQ~`8)N3hgKY`Zw$2Iv;C6P#S1-0#+C5R=g$7GahBUeetJ zg!f?&I{@yxnoh@Nol~h#QiE1WKZq|ZJl@H>n?h5qerJ_E(H>)Nf?LI`-uSp!$t)53 z&0oo9_mf5P+Gc8`XuKR?Why6*AdQ~=`Ed0|Ik zEa+4DJ>DPnZcpv;o-qBlA6dISy~lf6`Tt!Ty#1lp|L>0Azl8tKp|6)lcYA$?^)U<| zSw4SIESD$@9O=zMOVX$u4X(tFC`W+r<#YAxP3!mrEAMKHwfL?Gizp}H_$mxCmmHhtJwO@Pa8tu!w|69HLRoC6)I`F{Qvq_e9;vu)jatC6Q-AW8HhQO_kH8?u*JCy`B*;(^d zXY`!zL%_La#vq{4Y#g`pm(jxO(b9$S_>QReC#AQ?9UXf==3W>Fl0|>BCG)kGmUmS0 zWwghvZl0H$U){Xswu2|Tos(rdV-Jn-IYi(8#v%5E0BHxyozT?SUE zqL*?1V=i@~mpD#vc0RwWy??m&r`#F;qx>K0>T%clr&vt;#OJ)K?|aGTJomd^G1{o> z-fZ%RYtsKRT;4y!^<8E(Myu02T{hyn9Zw_cRcEitsIL^vM+$NLcdgpFIz#^)y6U~| zCUkdjEAP2ZBn-o|p9rq;zcFp^POskM8d~);|#s819U*pwRbM|Jt(5a_6brZ~}`&`8Q3F`b5FY+htzRM**kob#s|B4ly z*W)a>vYYuN+Gi46rU`#J#65`R;=IL}BvPne;VY;uDc{DLbZS zg4^e!ZftRmjGU6)NgF(826&6jp}o4oxY_meRJKQMZy?@7RZG^_+Q*nr|+pt-(9!#+t5>am|qP! zQ{~D_+`i-vmA*)2vvzZuQn%oS*q!rl2jr6iyCz<$7R#~jMDdZBygPlliA_L0MEcC0 zF}-Gw$rkH1o6R-u7Q52z0pYDVZG+NqXEgc67*#Xkbo#N#55WiCC%z^@A$!Fvf0)TX zdtAPHQkoO}L8Q*TCf4% zj8_W*wI1%+i@m%Fe6?lv68Aj4Db!D-=EIQ%6leSYG&o7Tx$$UXuja7@h7gXzS)%a<>>s812`aasIyo|q0k2^BVuuR5S`xd6`$ME2x6{t;I z)x-vvf+iS6@kJdE*SKUcgx^rne%g?^k+tzctb{rcO{NoADG6PXN!_V4{XlKF>F!E} z6ZH@QnV(b46zY(DkEw=eDbo~b4D)`4YKb)8VYUvAFd+gU#S5;@S%k5m-t%xHZJawYy88x6Vtfo)?oEjXOW)8a3^23MA=fw0| z)jT<7#oRm9qNxkbMef4Ym;o| zn$(G@6XI)aE4)sxPp`X7t;K@F+nL_5^pv5KO_t5wHqOC5EV@1F)*w%)hRC^zPkVpXk9lgZcciqwo zbLLFB({A6r_ikZ#*+So?t`zBAk*3(i*rTxlJ zKTeL%jQdP$;hHVxX}x3AKRiv}Pk%w}*kg-AF&giOz8lG2lP7K#X#I*^sMgBKX=N_$ zIdhg?qub+stZzcB!ocK(UeTkTq|N^EBZ@i@Ho4p11$zDzG(apX+%0213Qn~8N8Y@H zomX7^LGccDJ5J~#7R?8Ap*__?7I7EnjNT%YOp;RiaRpw{H|krh&C^1iP_0eb#F=<+ zxVK7OP?uj`CoigtF05N4{+>$9Asip|NOMqi3St$GU_P3SFSCwEe`J24L&E8QrdH&6w+RU}vEbp7 z*e_QqFIK#bmExdOnH7H+dD}!L68HMZ_w3uD*X-rpugl>ZWp7it z^j^8`&2scwIs0z8=AClp7Qb+-KkpXbztvZ#!FMxusqg&8N~xAhEqT6`xxi|{anHtN zIp;=P;7^g>U&`SVW$$n0$`fT5KGTfVjvKHapL(~c>`~?skC(%D%GnRfrT5F3-}!~# z`wM>O`@i?qcPI^$uJT(SC`W%RXCEk+?k|VW`-K<$+0Xm_3%yj=H5+55U&{HlDHn46mG?b5WqlK)dhK2(VwtlT25j0&ZmJ|8i+FjZ(Sw4ts?KP_nghU;pGukDT6- z_((UPb7=?|>?~oPWM5jzU0jiuSNz{_;Zs~V=FL|B{7P_X#lNJI+3Xb-`SUh={vu!f zm6K!d@~jpzO+A^^=D+p6q&D8Fp#RcJbXq05tWrF)l3DH-R`@$D_x%;VdX3vmdd{oa zqxhBx-xc=Sa{i{WyuBRVRwe~#uP;5y7cGg@csrfVcnl)V-6=oHqybf!pJeQfrQ$zI z^377_jZ)^0ps+4DSKJZ!>jHH~keAz>9W<1+cb1>L%}@GD^SzAyQK|TTNq$<&e^Sa^ z6BMo`q02Rae{Go*j_NCc#U%x*T3n_O2~gEcc4C9!f2% z%kCu%D_mSw@P+UfV}3MOmUHKoy;bGX#pN|(W!XQcoV}o2I=>vA9u$@Yb50NZC4qXL z;*EdYhdD6<$D9>(+Kw^}{Xhlla{oyFUoCU19XW#owJsmbUmUxF=( zfABYjhLVD2Y801|;8y?9hd-L-XFG7`cP| ziCiY+nA8Y0&OJzL9z%hFISaies3^zD1KOw!LtsU%kHJ;QkBbVjMuBPL9O@eYeRjD0b7*}&ZcDvd}HNDSId(U$Qv@8w(R#_wCgb&hOe` zWXqT?f&otx-IFtgmYw)>C^V-_#ONuRsVx&mE)rt~di`O|9k*SkcWu9!C(jsC7_-g3 zLyO#P;MC)%Y@aFBr-xSDU8iSfbN`vg%^2)FsqxyiblOPO1kJ2`dXmn1o(E+cfvivy zFeD+!0!(e!33mdTT0WKaN~wHM@Q;G*LPgWU9Z56kWs2#S0kq3(zMiyAUQMakRuh24 z$d+nqGZ@h3kw#9{&#iMB`{N?WH0;?lqu1<~u-PNp>uK2<_RhAJdS}`TZ3|G3RG$SM zt^K0D*?y(I;ebN_*#rFkYS7$)_2@xkx6*^6p`&4h@kSL#{!@&}kCw1C+#<%#+Ez?- zCaCdZoHsd~Bq#fmmWrwQDROEw@ z=Fi*FpRX3o-D$usKi1~byZ7HG`bl=5;!m`fc&GjReboUA_8)st{y=$9bl~5`!G!A_ zGUc!#huTLJp~cM{o;j*;OZ+WsOyiNvAZ!LQs!QdFy{0|V_@=Z8E{zE;AP-ET4abPK z3BRtPjyTe>BWYK|P{Mikmj@vzIj`N4r)an2dhvjHpC)el$$h{tzRsY9qPyp{<=~kx z^&CmSgXhEa3t{T{F!e&%D#hJ;8!7xdg?+d1)}Ysf7&>uC_yPIT_k^_pyQv+z5GOa} z(|IfJ7xL6e`^(9cn|g7j;GaHO}Tf_2e3|=qh7lwn3>YBkSr2$IEq5>iQ@ZzxP&I z7i(i^f^ZPK;4ByZPPSbxrZ76R6^gb-G>L1X;KsyV|Q7a5s|BO=|2WI-3&M?i}yp9eyZKiS|;28iknX7Btsrz zT#J>xh`kqY7jeCKPjs$%w0<-pmmgc|fY?*>v)Dy*K@u~u(u@Bp{nvZ1_{fbgACgP` zqSW@;?F!pl+l}77-*yk$#>U(rtaTaJ56G2>!GlE}EC+B9z|(1l0jL5Tr|%|^R#IHZI<6$;9$gms0mRtpab$W)_Ovszdeixd`fYn5Qc*U16=Lc0=OpE&}b z=5f|iVVxrI)E;jg=VIZtmx}NV8jswwc&sQxh%K6$))VBY$nXdub^OiClRL*rzGHK1 ztbSuL*VoZ?)lUx)0tA|W%4gR@0vO$&x7OuV(0yAT*x2p)v^`nS=)=Nu1T{O%I@CLU zhd%Ki-tm@OzzrGS%^k@d^AvlGot&iX+m=U`o$^8D#!kyk``OUPAxGxxt^WDGWrbE- zpcCEc>2*tn;mlb0SZGY?3`tzybU8k?%v9Id?$ttb^ACdaAjIYM7F59(q33`Su*7IM zjp-cNqa|cb8rr#Y{66AC*=$5#2snXY<`I197EQ)I09bsv2mTax1^*CzUlHLyg!c-D zgZ-UdUKHJb;hMNOZ$#&*03K>n z*-wQ10cVXV=nkIsGejDHw6TD$z~Q;o&-Gk>O6h4l?&Kjx^pu6yo@9GY9-?$u|8Qya z!x=GzB|TNK@-E5u7`hs3Mse zmAJ-m7@aEFhMr{BF)%}WOp^C5Ew8lz1?)X$Va|wlF`hLG7;-T8x2U$5_Hpk)2=h%G zZ4;0s^+PB@mQ?e!yiIP9MI(9z%07ie_A10%xHjv!3Fo{Vm&#~YydEd#XjDCn1+mzh ziw zrt((CtO9112-LuVJcg0ji(nSb5Z7Uru-R}y^)|XkFHArqrB_L>6di2!;Rjh>h3dw% z)`o24RBN21eFQ31+dPEB=4OX`u@Ci@mxaO&xe2!03 z+5eXdJ}pp&GmG-vV(Oe?z7)Kf8}XtXv7|8KyL)tW9G@LmAJq9f8ed|t(2GHhY|qfl1ep#lyOkDR z{Q=-Lxa0}>LS-LUsjmFL&ALy`TnIfJIH9;b*9n+e_X0k264KY!T&Xi*l{g3|-p&A& z%BjYnS(ZaCZec2epEb@jSqAX`nYx7Qk$(5-79mT^1vV6~WE~(0b8_p`Mbap9i2scn zrA3i11Qm0mRxvm0Hyx{*`Hxqr`nUenuS)#4jK6PvZFymb5zTP=xqlZ1* zXWep8cIwhOw_M1M%=+2OGUb~x9Z7}m6c{aE)^Asu2rc@%3kVi)07TYUt3Npa+Vyue z7Pl5F>YKvkhb4??XE=s2gFxGXu(<7uHaO6o;w&}ozzoUm$0%tZH^o>DW4KNnJUJOq z{b@VoP7C6CGHtd<9=chGMec!~P_LET1s$EHCA-lXQ+M_3cwtk1=LFu~u$sy#eL zXE?<7)LMg>mh591QU?d!esAXE{8&}|os6}>e)0Q*{6V$$he;9talF!9B1jJTgszeg z7G#?7v@=iU@5+dO)c6}~v}j2qTAWz4xPQ&ayAeAHj>Y?P#=18h-jS|FaY`zfsjVY5 ziT6QM{Xd%ydsL2kO!oe`DgEyze|=_~7c-PwFL^g7c7`0`DZR9BWX_q($9-;6Yyo=8@#!>V05FYd~>5)SiyuaI)JeB{Sn*@X<;$EwpkS)eDo>B$RRdh*ls|LnfPE@x2EZ^)67we&ED&p3U@U5i!7Q4t5_B2~8;Wps^#@>QrJz)3LAyK?@i13oij^-4@uMvCOP;O$ zG+$#TAabUA4cypK2ZKnf3t&%?6p0FPo}m3_7*Dz#OCl!dZ;S5rMa4?Y|1%?rfmJI8 z=R|S^KU3#L<^_D37e;bb#1jAOh`yj^02@_KwWLT}Ldb%5Zq$86G^4t%NHJMU$nydH zG8focI$7ekINPFj*MaqmgeDV&_FSZ6dlY&VK>rlqLy{8G!ZYHEoRT=4s0cD4sYp@* zYb$-|TwR%I#_Mj!b4^s{%s%e9eX4rPi%s(7CW`)#Cixs1Hs4-rvfku~e5*;mtIxdG zB>&Y!r9Nze4xLT0u2lMmO1<9H{Yg`GzWhlh1BlEU{bb9QN^!PD?XRP^PujXpNnK)N zbG2Te_T!NQdCT|a8co}BwOk_?7|}=^!V=l-jcOcek5VJcJLudF)~uh8X&il%X^pWL z7~i@e{r>7Wm!c)Pe-7l60lHPndN}aTcN#mSCHzv^>X{L zy8YH|ybGshn+yhnp0LwEQTk1ACS$`>nMp^zYEIf{4*k1hU0vvYCRmWj!25LIi=H`? zz|oHpb9HY%A=M%DCJpJdcr|jS-|3zv9DXoDeJV7L>1zh%NWj+-{g@|HUL)WR<&*>F zg0cWrG^X#Axk=ffXujR>#cTV}=}E5hTN5+U3Cp$c-;K^CC1gCKwq-e!R*pn3@ify? zHPMs@S5LG8Rv*PoBWC&8)Xvge)XP1k7bxo`y`tGX^^c9#b*{D1wTEj5`+yr<|CM$S zzPB~XyBc$MHfm)U`%H@J5b0RPhAGL?ohi7B8n^nf+imud8(dre)Y%MsbYpZ{V@K%y zwR*QR8s*uIxw9IHdb~K*u?o``u- zmD<@Rp@cQU-BXsBo*A!bcUmKoRi$3ui&C~5vxLk*Xa`!rZ0q?VhgO?&K-4FPLfaMz zXmxPJNz~b#-gm(S}~V7}mTMb`;N^pR;?gl8hfF{ld$)CW~@2ghD;C z`%aM?;MY_K0z8>DzzekV4_-Hhmcy*l_-Io|B85XL%xDt+mW zvPQb2GQQIhj>5G#G-_4Np6sTD`4dg_H&65SEWZ%Fe1lwyRdm z3xoQ)DQ{Rs<0lbXnZDVuSaCB}5racNm*1y~ZuR$G-^%NeM!#I<*}{4}AXJKdm-&3) zy%3ns1h$<=QDwyYR(7{!us&|X&cdX}56$GBB5Ry_pkOJ^PDLHq$hdqTo1;{w&qh?Q zEYvCi?e{WH4bYEqR_IuCy=~i-cor{-3T(lYvWJeUXi-=5147RqOTx@A^Wtdp?+HYo zZ$z`K2@H@9t^MTf`vl6ZM0MzmpmeQ0?RP97hF=2LvTNwPHIgqO88_z{7X-6D_kU0) z^e}R=0een&c_6=pvdoR~)ZQ5&&}#^bXqZZnNp}+|B1f;S&)-l#Rvy4c$?6Oj>rLV2 zP%e(@PK#QkxRhDtot1M}wU{#RiC}7evLTYnY_dqb9;U9w)*hYVEYS$d5LT7A)Sl( zeocej0@Q|mUm71-Z~2*G*O7u!Xfly~hp}a&U!D@`Q1+lHXC^`zgv%*HUM&b;Y*VZ= za|o-dRb5$W&LJvt5Eh+n$}GIkDadW6!Nw-y!VDNE7o6! zBfUGsV*&%jeS)YfDBPUhL|3@po~d`Npw)j!M8kyMPGzk%A~QKX1{YE&w}%so=#&N6 zIHK8&Mnq1?#{=Gs?TL|W)Ek|yaUtfqn}c2SsL(mhJ&8>UW3Fgm=*;;mp^I}eq+^XP zkjC32Fl#}R)o{dZ+zN>svtdgznxL3!ff_01MjIdxU@J4&BG8k??`);zS&|}9- zM9`Ifu#B-&6+xHyDdGMW1A_m1S6=5v*E6J0V-V2J8yxL=9fEkb&$}+Xi3G1zWD~8Q zB1>Ff*<5QiiRGz-R+1x;RBo`a(7~nhl%9E|( zZaquTAO&XKJp$83E-0oW9COU}G?2J7KOdnM3Hg9xxP;;qnjK~ZB%dpWuz0iypzjnX zvWB=L>CisTYr;Dybp$ePrpDf?XY4gftW_QH`xWLIwPg-=fjBN;mnztgE81{{wl;;< zY$n@d;j9O||2f(I&yx>%da~(YtK2gl4d(S~^gsX;o=}ON4PY1gd*Hkj6kZHmCT}l! zxIGuhq8bPquaVg^1So1|XE6LEG8a0*bUz;QB!;?7yQ}{y#g#uA_g!KS z8p`4II9NaD3gL}TjbQT@5;!}LtY^D0Q1|{w8!r-L1mk=b$)zt9#3wcyUxp>%&6$tf zzVEw3-GZFxWdG%6KI2R*1_?`QAto`7j_xaW*XbQpRt|RBbl`@z6?ou!^epTvi2NkX zkB7mwCN~IrW4Bn1&jFn?Rz=&%^!tIotZd8FuLHR{$Xyt)g0qqDCJx5~kqBZI+kph6 z>E)@h7Q#2mq>Xk`PlJ53INFDW<3%308|$N1!*h^$F!|WOM2*a2<>I!~ z=-X2xmQ>QGSHfpgv)@TkH?41dX8rdFIY+7v(!#^I);}H~MSmag6aO(lrYLAZmYJem zKAsGanXzE(q%GRSeB|OL>GpCi|MB2>8T0$QTN)0N`~eI1#4$jc*QgJ`)&^Ba+}j>W ziyk6&){}c0u^$KMet?pJan;4JdR>pLXkn`nogx}*8e~^*RJGbpzsr{GgQpv-(wGlL z;7Xuj6VH!oRz>okVOkbG4(0o#FZ4eR{ZB%h8Nfy|zmolPV5jSPCj)?}1JELdaTsH8 z0CBO+#N2U8$D}FXVHYwISVVw2s@~YTYl$`CnbvgV!wM3hFIQOJiTb)bjr$47E#0Zu zRWnYnAVU;p4y!b~LN}uWRW&MgA7YuWsT$LFRoKG@3&#Z4Hxewh&Pa!1I7h35N9(s8 z_1ihIo_K!zUO2g6MD@%=k5@N&?povTdHXOn*ooa-+s1J@qIx8Dans%r$&_qxbsV0{ zIlWgj?fs0G(j}>$)Zig|t=`ezTykzATVG^Zo^!L4xyeCsN0f2;?#R25UviBy??lOs zG`$UB86;ABG%_EL)UBSlg-5EF$?Y2NmtVEzo3?txcHh=}=67tliBI#Nw*1I8KeS1Q ziSn%ODOWe7_m#~Dn6>7EW%*dye6%bd=PwDc>@WK0hO&INY(7)wSE|sr>USQ5!1$eJ z1^Z?7)spyPj+Ms~$t<1|1USaN=k3jNG1AmCRLO^e#O|hdTD>F)Djyz}1KO7nX|IsZ zQypAVV66%%US@tra-(W*uBkP9xu}pjF8=Fh#B&W#wSv|M@IFLFhbPxq$G|Tmv5aEg!cA|vy;#?U)#m$lk~|HU znVY!GhC(2HlKem?u>(iY57-3(m}xmB@thS*ay)7?`*Jrnuy3DdV#2;JAh^ zHB8GaHLPXpqidLwgRwVmUBgmb!(65Af7Y-sP=~ba-l~Sqk7`J$UR=XrTrprv4b8ZQ zxazjl(8^MlxQ10%)st>d>~}kO5P7P}h7KQHCk)AL{BD{~1Rkdoca11zJex})t3Q&9 zH3;A%S^J@+q8~tVo8v8(lw%Qf722vJx$TwO)x|9asr5`%6-V*vePeH4t;Wl_yc{U& zL3t9(9}EnA5$PoDWK@M@sN>b>)ef<-BxOH{)W*uG-yn-&q15#6>=!CL2Y>dZvrDh^c?YWMc+-Ec% z$O+Tg>h|VWXAAvPYzuJrsX5s5T>ve6vx%IE!Ja%aA|$D$)zLdD*>1iM=S}tv1f{FG zdC`P?mfh%gqH>QQ#SJV6cKtn~^hcVq8IJBdv3WG#E=o5EGQRVkxmlPu2|xbc7k|4~ zGvZ1CM8Up5R0vtAZ35GPk(14L_k|(_NzH0ef<`lw0W1VQXqhOT!5zgN`N4PPQ+7XD z88mjFPYqMj1yhcW+})e4)ljHN`$CwcrJte!u<93QLa&#HP9bO4xy|G-ZSwsHGFKE+ zhjC7*_8WO?MWGk!wr1>kL7rcL-i6SpT2*;2Z$FXupUlgL^T8wetSvswLFy&l4{{ZP zGV1QkPrf^!k>eGql-s?}M5g3hrvF6VdNUUsiq}Xl1f6V^#;_PXDp+)0(*W>42=Oag zw~R`a$I+X|#QrM@uUHdn&j9w(dD#mFNK#JbWQLK5dRNIonY!p1gvnUF^jaWY7LF61+y#pHQX-XqN=(q1g`7m1qlL|u(e zVy%abl+nC;jc4;8NLm&P6mOWi<-jS z*gO4Rp}~_wk@fJ_cwV|EjO_HlW$bsAmz0Ph|n5w z31QSJX|6_}G0&0ar83AyJ*ft6*GVjf#fmiKZjK&Wzr-8 z)HUQ=E_6-uX4*5H$yO&B)SCh)h=S3|3G>Hw&ZM?$$H`%JQ3PiLx>9L^{^`I?? z7m$;=h5${BMKj3UAxEjcCRdvI`Iv_3y}B4<(w43+C#U;~+~1$Af!W`NZR%oy5{Vi= z-hwN=k2B0&O9psov{WB+v!`i~LUF!B6mPvnkOVu8ib;Cgl1UxWV^0$crx`8qlbuAK zCFG?8TSm_IdeS^Y?iP2%Xx8;%npC@lyuFHF65#)y6T6NE$G*VsE9CA*%P(lj=dEl9 zE!mwrHoHx3H{)utEg?HYrO1W_Pj=Z}j?KzkwEZ2e2`a03DS%uB)Cd+!xWKYy7a_-^iGl2- zCMj6k`6Q8+MQf_H;wI&tx@Ze+c!{RrA`* zZem_rBGg$z{s}OdbB6HFhz)GR)i&}4*D!uTD?g8eXG<&Bn8yOu({!QZ|E^gqT6u-A zQG0)uuu*>`bndzja7nwe*C)dKlre37ra=)O3;W+Ocq^i5va*)=%vu!{ha?lDhF@gR zk$x=_wdrBOQqZN-L^Kfhd@uWB=tYFUzym=Qx~GkZFg)Kl*f+e1#;x4AO`u>zfLloJE`uEt@A5nv%yX?LgY;LnNgn186YN!cPhl#%IgLKxCUKD$Pe$LK>d{1Ob zjFCUrSK=5$Y91u+rZ%fZY*vJFeg|ErMY>L@&RXMZ>Vc4B&bLCJf@dpCY3>l+jD2ZF z8#6{8RfU_cWGlca>2(d|x0Sd(8VwI>z)JyunW-9fZSdBi{inl*q&4@U3HaqqT#OvS z^iL8sZFK0|p!r8;#P8e2?;|$|`Lvi7e;@nf<6JpCJ~AeLe@AQ(&4x$fm9-$b%wD-B z{aA>6pm&k%65C}uYhsDx6T#LlGYy<$gf#jlZ4{sHi+@C)Pse{X>-R=T1~@X#`q*km zqgrF7Cjk!Bt*{-fP~la>tB$d(^C$NFt&jDoo=du-8FM3PoDIf@`U(%Y8Y6$|aHo>` zN)b9>7U2o%XGv4Kn0;wZE9J)xYGd?HT690v zp<7hn?8L2FbadQ8AJRf}%o(^|z}1+ii`%?~|ovz+=+iDGdipEo7 z6A#W&*WfyK>nsX~SzK092TCB^@dM{6(&`L|pPKa7_VH79j^E$q*>u><`2Ex5k9_>c zr1<^4Er;mt7n6d1=^1M&D5zfrnF*#Pb(1LEOp#k980ivRTy!LKUNZd`E?6g?(0iAj zLn?I-CYN>M4w?zpo;YPPSE|(Ys-0PLWqdeuH9x#g{6?jBs@54gRe*u5Od>Ak)l>Hl zzL$_zJ%8)-C6vH@kVCp{TKRjgc+zcYr&-7eIMiy?IQf8Z`o>=lGk;?C;oBH_pjkBA z`L>Nbz=<33B7q^wF!pAy1G;=k0NVM7u#Ry5CfH6tAyP@pYO`FkvC^XdPLX|1)%)QU zN}j32GHS9`oPo5dj?Zb7XdjICB`hx0v3Fc70`{;vb;pe$bXD-Jj*;qP@D@E|?`bhH z?vn2K{ez@q{0*YT@UAh9t9i7A8XqvDJ9tlJ0r}|`{U=NzL2Yciv(c~H5f5$H8e8SQ z)n=(<_)x+71R(Y?@_;0N)yY~pCzBPX8nWt*iAT@UV#Y?mE zrK;caOi!Iuysr#G>lL$ul00Rmv(@h0ljrB@HeHsUa#V-$=ALrIt$(kOaD9?30L7c! z+gccrHlF9dnT*AMO5+vE(4cE>Sr1X;--$oKwOD=5z_`A;!L{7oG6d*TEp!h^rpf}` za@r2|SN(*Kf4JM)_-@z4cUuBoQS~90#fQ&}4`2Gj;id86?|^}8_eD=i~5VJ>?VjuzB`l(K6gKN}bSw3p$rw!gfkh#rgr++pjI zl~`N!U63{B32u|rGm-TlC*ARmG`{2(p{}20-AF0ci7N@LuGX)i+U-5Fwc6!p{77<5 zmS<7UJtTk^I^64;NBOe6{LV(>Y=ChAGDDB>oF8bJs&K`e-G0t8Pwa zgZFo7Y~;3aCtKD7wEFMGAL84_OH|;94EK+JxY^qHX4l0x zTMVka`i#rt!xzSfFZ$u|+414i;=|YfaQFmWpd)oP@BZQ7LHgiAeelU24ld9KXX%5l z{BUrxJ~&z*{OE^+L-fJE`rxUlEyZfm2W$1gRVkZxT11+h7}{3c>bw zE|}qTnl1nEp+=u~Nv(*_S>SadqD@nvSa>R6b;UTSQ4_>4VP6SqQEK-B!#-S_0JRNK z;v6HzjRs9Ef_wm$*nt>%rV`ZN<`tb!@mRX-HsuM0V*j!$Dt~r4^}a zocnpHwr}j>*_rB}=VS)U;JyqsBE)qS@|DvjVZhUH*ew8TafTK%dr z%FdE^nS?TtbO-yYu!+El1L3Vv*jKTqq^1&xB{F;q;f;&u!UDGVdb_RlZ}|TJ!YE#} z+kE1?`spE7G56N|yD|42SA5PDyy6jxIEf7eV*oJqT;6D21jLDnF@75qdV5@Ue9pi= z8A4yA1}rhd(;={mpF9cWnW7FOpd3d+as?OW(3jPK6=rU^-b9S#Y>Pgt4`WQ+p2=2c z$hxRK%tUpDsynzHx>XV*)iJ9xl2cySc&@4MZ0th2Z=$|dR7>WP`mobbP3xp}hqUgY zb#i}_-o2Os3U^9YPc0RGLR|=C>W3y`L9b(@!Lf%4(UT_`hIX8QU13vH&uWV`L4`b> z5IVJ7^DGit!w2O%l4m#T^6e0YQ8VSkez8pR$T`9#M$1_Nl_Ms1F0WsCX4OuF3Z{l(h zH<>Vj$kgvm|KFNI>iKwhP#j5>Q1>dNdNxyBFOe9XkHM9}Yy04^qEG z@jbyXhNv8_-?HhWb+l3G4)n%AdwP@FA;)SdK`yG{RWVfUI!oQ8yqgt8_#!TXdRXMv zGiNBygBIVAg}+eDzgqPRy-R>{k^2{{9BWrjCSq}oUJstu0XY5XF)#WFzEaiyaohT{ z?LBS(WP=@h{cTNW#li|bCYiKG$Ue?+ZABx|8+@5eU%HSDh`0BYg>`$=`Mo0Ol1ZsN z&QQHhb?j3dZ?O}e=8Q|adnR`RK+p@-lvoJe)qCl^q|I$YG0q@nF$i;Hka-BJuC5Wb zZq;rWnpBtp?Tz2AI=XpKGw6ShhqV~0SzF$qsj}qr`6X#vIMiQ) zyE5Ur1&o^GQ4L(j*d#15Dunfn&+Bb@ot?QEI~Z23TkLvWiK%+H5_^t@N?E+F!#Zob zYIG%_3TWEWtxXmS^RjXUnCwILB)I1+zd;lcU+gGUB&WgV-fd#U_pk*=SDE z_iF8|W7@^n_3dfjj2XA?w#oU*59e!>_RnZB)1Xiqz43jYrp{jVO|gWRsP>SU>R}sbInkk}=mC0@-uF&`{yW$OV`<3`f@Z%78t|8LU9ryr zc1wFxuJm3m*p&0}J@_x?(6jFnYP6ns7@dIS??OA5n1aos39Hf~bFqxw)AgHWpGBl# zlaqqSM4ZELhM^`sn|n+=lgm7tt9d3jBXNh!M-!`vUy^~Yx8&xyLuzOoW2kx*O<k?e;DSYB=aZ)|qMPCt-GfW$drT4LzWRPE z^(Aqlx9O_|O`&_|P_99g=xlC#Cr5Urop>;zWCE<0*`}4b0`g74Y1YQTT*T_AZN;;; zyroYj-ne-3wuZXRBz2Z5zF{9LqCgd(h3z!3kD-5LG_|9>8 zV=Ybz;%)G`G7a@FhS7#ps*Dja&#~$Q?ar)muYMRQp)5|Nw1_2S$HvfOY)hwj+?}rl zeAG<};p)wqh-@v+hVZrzq~o)V6((Vgr^~_;pzxrQA#(+6M*J-7v00s=N*k39MW18t z%+^1juYcMJ7w=f(Dt;PVEX%71F@?2PU)@i&ft9HK>>$JFL^~Kuldl#)-2n&Q%06cm zI2%k|Kz(@_Q&YF=SUg$^m8>H%b&eptn#n1R+>R41Y!sKH?v{;5%uaer1#S^n4$R+j zYPOWz;XpA7irzT=(nf*fgTp#N_j*=(a(6yquhGdnlXRVblJOr8i}>TGYiNG;wQpR` z{g{%~Jhdxh*Q5n(mGg!$I26v;qw!u*Q4OrOgTVr*xwf75n(U1ObtKM z0f!CdCB9x}*K1!xjpm@TF!qWA-QNgjqPJJd4`%u+HTrmw5D*+>a|Kun@NDnRUt?=? zHKFAZW*&;r8BZUMe?r?UXY$JMsvk$IT@RlJ&}%n6J(Et)HQr`r>GP?TF4t9pPpl!U zW$H?4T_qu*#eZO7N>u|cm1!8CZCG^#nuxBR?*7L#=`Xt`fF^;Mp(g7IQBs!+cIFyy zL?R_DRirb(MFd3JnhwHfE+zU%tdSpTSHho@k8vMzL$w;eTKc!jSjt8|Y$He!%$zRz^}_tfRICEiu}0?1L3WAA>wTT9cVKEr zu+Vp-v0)IB7c*qx8&G&foa#)b)|;gA^oSN^_BEqhKHGj zMUSpu>*|m$D7K0oPu$H%IuF=H!kNj$urK3Dvr{vk`kVI>7GxM}g+a_`-q=)*utp6}Aut=)`yy-VW+fL{9h;R{WX+4;2@=zP zT#$Sm7yq$M{QjHd5G$j;pkMsHS;QYZ#_zr3_nQBo_luI>4USKD#_!v0RD>c^bPM;tr`Cd8y@{p!5%Vm=8$yPpUr+>o9m zrcYTISCh^WN^Q`IT7b=r;XCYn`5JyGGCFgC{+{oy5js&IBCfnU?8Ss=^R?Gvw#n5W zwjI;T-WRu&mvw^(RJTqyuv)xpULgeHBz|waLJOC-MJ9{HQ)yffE1f2&4ruI@MKT8K zdNX&8DKo>@ntr)Z3D%ecduMM_7T)bvwbq2pL%Z2({;n)gMe)dIH5mI4#Oc}RmG?JQ zC|8BcZ%sz`=wx(vkbd(-w!JR`7fFPoW&Q@#(v-N~K8tc-4s>x+n95NoI4#7E2#`<6 z@30~8U?l*JW}Ty!TVjRvk&Hh+5%I^f$zPu(f9(_>+jTi}NL`vX);oh4k;HI5K z0e?MEsP>@aD+a|6qw!;WrN@59p=2qfLNh;CIfnNS*G&FeB()W3gp)h3nugaerI zlX1QM2P&6d@P*oDndKF0Ls~*(A^xC8$aQ-BAe^+-i*GjyvAw)sj~ZtAXi1J^Inw&V zmJ`J{rrRwK(;Ai@9`6CNf#|iThpnXuTj-1QcmPaLJv=%4GnTyMXlJx>iGH&iEcv7w#;*0!W5V>{2VEb;jzI)+<+te; z{)8EO6U^9Rg?VH0*G};t{&Hdn)ccNc839l@Xz$>u7(uJT<7O*&CkM8)`h;7p+!I#e zSvIDClicD4P9EP=#wV?ux!^U+e?VhxwbaE~8aMw0{cS9}qSz2J0uRD_rm7diu{hh^ zBF-bLvy$KG=ujLXSI2G6@>gx$34V^qf6v^OPC%KVYT1J_ei}4XG=3zCMfW&4eiom$ zRxoZA@JqHDf1w54k3|k30!k{*XSAw<%&5W7i~I}B$Z9JhW#VDcAWtCd)PrxP%7|~7 zPohS&F=;f_aVw8nFOI~XzaA_L5@@|hYdV}wJO!S=z|lm4YzFcCd40~eMf!xEHo3qK zZnD!W?CSGQle9x!^2}B_OJ+>ag|WX>tDgTrT|Y(80?U#P#7G)<;97YndJExfw-C-I z*UAf%zg|r~My`QpLOtxjATkI6PDEgnnt3OM*tc4U3AfvM3{HRG&=$#km!12o9X)P) zf42R{Y*4(M(Bu7TCckv`Onn|0k=RHr9Zr?7s~F#>{zo@l=WNvt*E_-e zPWozCHFQUQmULmixFh}h1kJZW8drPzE+o8A*2DaE%hY>_gbMwias0;}Dy@rxXc>$2 zh|>sZ$HH4$)N-!-hpE?1#r2BNb-w7#8>+QZ5Bqzz4F76fRNuF*$#@(*TyTEMk;RoM z2|^*2JvRkExw^}X?u1f-i1}N+NE=l21KI!J|1*qv1TGBWfgCPjTBub!v-ii?W)l;o z@w5>jlqO>rVeBUiBGh%m|60)S_TfdtUZzPf*`iXe#{qhk$&!M}A43I3p`Ygu3lFsq zs@AU;w)+xbvG!yDw93hFbHEIwJG~p}*>f8<=ldPr%diPSd5)>wfja7;fNBpfUJ0v#J*~GCjNZ0 zuVIfhzQlo9MjUIK!Coil4EqFQ6+&UB9tpiKH{^GH<813(hR5kae2{p?3LAiG*@viq zXiibh?XVipmF-L)$`&<@0#S33xJiuho)U$}law(w8?G8X6SUey5X zW_Unc8kz7ekLxX`Gj2M$0hr=~)yue%uGUM#H!KbG8wvH+@-!r9Rfd4HEn#@k8FFIT zwWC@mdRF>V*t~j2Oo;nDYuNp;4C^k>8c$PEsJH$til2%wrr@bAOWP-vZo`9YTO8}h zjuyIa-Av4s7gRh)#%ZXUU4l~8f%V4Xu9h0WtBbwGe46A$KwD|ts@LfD8AtoPEK5HZ z$2%7j4CINLWzssjc#L)Q07##@j(2}StGQ8HL>CG3LP4_mmgBwSj=WNsR|)4B^XT*m z;zX_p_~n)>e*R1E964@@q}}v{Xrpltq7|BmnP5dA+Y(>)qI+i~jeR0!meoQHl{2mV zA>J!Nx)*tVDsJ^5vSN*}Khc;xqXgY-2-&LB{D_~YydZDp%`(;96n9zIX`-`eK)OtR)M{V#p*-3dTV#_$AWj%Q! zv5oACX~mvRPmRNvll0W(CN?`6-X}{B$nbt?-y^F%wO`UxO{yaMG59z-j(Yd>)kg8W zcJFNzpO~)#eXuVTWRJFB8%iUJEWn9Sj+#^BW6d0k_0{Fb?F^i0AiImOID`e=X&cLe@JYyyH_9 z=ybS+mUa`6cCWKcFV%F_L)6#8T%fnwhd{XC+9Q~kb1^o44lYPbzRTF^F}D6>me!l$ zeWrakl0jQHUzggj*#{)-|Cr=M7%I$E4`gDaalIqZ|kD^?G_`PZV z&h+{2dUu%i&8Bse83JY2)R94out?AsJ-=vJXIgid6Ye&xKbZNuxj_7hbD8*Vlj8f- z-^=q;_bdMaHul~fYTL`SJx@=n2*h?@=FtSvEcfGc3PY@gO;SMsdqta>mh{6zLLF}& zWY1(0${dSTr(c~@o6tZGVJ`K74#SHfdJto1R1Sipjc({88kkF6$Tn~agm94s0CB2w zqSdG3W(aB!m%5WyT6#{c;0du7aH?F625UcK8mq8a#hSphNi!>i<5e|*NxRY(J5H~p ztJ6kn0+m=3D94&WC7CE%6PRm{k}E~Ro~BiSig|HW6*yGwiYl<9Immb#!=jeHBn!nC z&sGLoh*|X?L`+DW09p^osd11=1q`RPAdc4vu~y(@YBB64)e`qRs{>=;L|z56#rO#0 zAzSLxR8_L2S6Sx87OR`NR9R=J%BjjbMV)xI@_u6#F11>cKIw}lc50#}#L>2==|yWS za?N(QqNKLfAp8+J=7=K8W*%EzmgoTJ29#26kUq&uRg|AAYRZH9<+*&SmDE#y&l~_ zci9z*ovvd!qT1ex!956tz@*{zL?FDKm;M~e-&e4JqA6s+=`|WR6R6eVTK~5EO;)R( z1s^IsrXvx(!oDYNrsnP5RpvX&-=wTZmGxNs-fZ*Ndn(sdZPYDSUo0L`=EEwCwFc{1 zm3hnRc%f(CSu3U!cU#Y^MNZ~(AvpZ*WOTnHSnd|k$n&g5x2%^7wlVT43?y-7XyjH( zP4u6+9ixTCB8E1w^fSzJsI*OtL|0slK46Dj0My$}#`FWW?u8ZNT>Ovp!!6QyjDA?8 zbJoVQ@9O{3+WxGywhw^0e{PfZJUZf9t*RFe-y(y@(T>yN!PRJdYnLvx#45|V6WJKA z$CV2#>wIh4D$BdUE?jF@=eSmkwrBWirIRi`8fAGb(kY(7+q2T_Lw_ey6lPM3DX+(F zqp`%H@ZOw5XP06)P;TJZK?RKl(K`G98nHDo^bS$u**= zr^ui3opF1iQ(WbQ7d!S!^dxO9zX5BxTrE4U(BpO&cCOj#B(7Dv(BU46tRA}=UY-2C zT94gYF4ALnkvmAXDeFGRy$1pzai6V6E-_ha9dnJNC-|jy?H}#AEmkwpGUgv_?;hK| z#I`QAtxIgL*^V*HVKRcZ`qe72$~G^y)5!?F%Ff>Ablj*1q*e@S@lDk;a(6}*n9k>Z zVmplNai21RKNE6CtJe?1_XUP;T&ErxLC(5bIhPtq#wf{H;z3M?J}s;1)8=>(uhN59 z+eIww-N_(c;abK;*fio{tL5IiiQMa0!@6icLTUmuogAXUvx{k+znKs~&@hvwrLCuo8iBlnxA^8l7$Y)OJODFuou|KYM)4fC| zh}ClL6=?eQY^@Ern3%KbD7pi*1^qUjjc-Bi&EGmjtxnCRX*IwSn{ei3)LgXjjaaf6 zD_1zWpF-BzBUU@^6;5uolf9B-$!a;_Qpdc+DPKhdSLzzqz0vJQbJ4puaYd-7*yV2F z24_JF0bTKxVT-lYv2JkO8y)Km$8EObPpjGM5lv{amx(WJ^9wt7rBGJ^R&_F0x^tJg z>^gLpE?{a-V$mAHlADE4Cnd(Sf2pB8`Y~l|2(X_mHM|C0?k1t=f%}CzP0AgeMiQTL z4{ae^jsavgo!no{q3R`Ek2!b;^fEhvzAVGB?E2$bb_exh<5~iPLltqSwPL00Sv%>|ZLrqs{i6qoMl2zEVGd&945KJ|%0bHOZC}ks z*ZQ+leA4lraLyHfalBXE!ppiHwHh;pwpx)anQ>qgjlE5E$&B}R^Dvg_G;sAOJP|b= zfFH5vdGY@Go|LZP-lvL%MdJaUU1{5{eajlDvw06l*2f`Oz_3iCEW+#IRb%}U-VFED&#OUfUS@SuYZv(|p zATPU^wcb5a*!s66WbW!TEWe6aKykLjTy?4dkr1^WO0bZ&Hr9@%0kFGxM*JZmKTv(^x2D zbx|+zhyQq?oD(mUEyhFC;qiclve#G&UTgd-u#HcXQr(=Cs`u8VnjM#_xAApQI^P!; z`OY0dPpMY=)_MNyi+u08pm252`-f63h)WeSAZW#7Dy8D=)~ojHxG=qq#bG=J31cf7 z%fgbZ>)7sxUD|N=`va3HIEuv?xid7LiPwkmn(^nL^kfh|5!jCe$-e9cFW#5^1vD%I zW+6W33VM@^ryl#pg#s$J<$85+czNb7NckF;4;PC_S^ZYapgbvhv`}1V4l{0tUqnZo z5X-B*S)O>yua1$@>w#PG%I*{Xv`xPIp5NVL!PsJ>x<$O}i?f1ctG4B+**pQopy})Y z#K-&kX2nE*+ZE~SJn5TH_}&M8@SU$!^Q?5g_uUVDEA1_U!9{%1^YATq8}_O1e&SF3 zl*~Fof$TG1{nr)8eeHW^h51vtS$snRoVnd8V&TU@Q3urO`KwK5u<3yN zzrjJBG|V*FtrEb6GeOwHtzB8sEcn|^&r1cl$yrFhg_jL*$TgwAxMCQb3lsCIRH#L} zl}%-{;)>(SUOhdmt=xia1Ny~EH_Uif4?$SOu9q7$i`Yl7i1D#G`KZ~T?K>~o#s^`$ zM1um_<;jsN#8n7@iaGLx%f&A$=9s1%MXyRwqkTzwfnTH-rLx#v?j3(Fko%wjm1)4L zmkt9wiW^j40B>CFbZl3*v)G>|_Km`tj67Q*Rwc{tA4&WbHOM_3h)%bx zQNN7uKQESRNC4up_%|4jV3HidGBFt&C&2a-FJF8AYGK8=I~rn5wFy4a-9HRN+Mq-x zj>LS6q#Por5}9&O6dLzNisv73TOtyEv=`Yi772~U`l$3`AYKZbuYlMldyy9c>-k{E z7Xt6Su&^oIYA>>TEE2ZtMYgMI^jmE~cC0G$FIP+W3WeC16k^@~D8$ayLcAW8z6r#) zfdf}&wGdwi)>pyKUkBbqcLh-l_-IrDG}d zd{lZV3SW%uXCuAAcv`;V!~O)0z*E6+JTf{1q zK|ZlbPL$RM((V5jidRDOyQD%NMVS}FF|UN~Kf+nBgvI+qAp8q~_Fh3AuCzAD64)iM zn0qgU=8Iu*W0;rX^e7QNX_m{_ux>U_M1f5&iQLnp;*uzRdfL58xbKGIy|60Qwn&zv zH-(vRqPhQyn6Y{^_hXqk2cHAZM!vC#jY2pyKq=M=z@T34jsdT#t)3<1{$d1vJ7P{I z$e*QlviGoy{vN?(zY+W{MnFw(-L6KO8ywZmH#$FV8`KCF*j*9*Rm+9p)Cf)lfGy1L zVyb|%w;36!x8f5~Wz(S>6~i>M+|3Gdn3%cMUM0y{dFHI&_b@pEf)DnxYv4&fEu&Ew|3iTy>I-J8olO^D;n-M!q}?`d1^&j z3u-{NE-B$-D{pg1=BaGJ4k}o*9}gdA}g{H>XS3 z^EC%!7tXNWa<+I!aQ}_iAYxBI^eUBh?~?>Ip=`>)wA{nh&$Z!L-*zAN8%HF?+<`9# zGAlS!V*7iXg56Bt=Ntlf@F?7qd?dH~MiMuyZ+8H<^X1Rv1Sjfg0T?KzQHt2Qbeqr+ z1)TvnzAJ+s1aS*fWuyG9d==EPi_7(M_CPr(mG_2ivqOsc=>^lYlTnYq-)ZzU(rpj< z3P2t`fPiUH)p_z@p+klC;8tr%wz)?8#qBkuH*r5Sjmuz|Xha%X_5dP)h)`E14wAHM zL3&mrr!(;m&)YilhJFNLAn^`$3eVq`pOJo3;&%)=-Hsvb7L!I;FD?UdG}UlFlEy=F z6dQAkv@Wv0S)+4U=yn{!On6WvbW=wwLZ?xI8)RM+QK9b=S$?mubzwJ}=a8>>sNp_m z;vU;c7EhFN59uD?MSo6Ib9BOWU8oC9mRRb2q;Y=3-vZpJsOeRu1FEay^i8umvAoz z<3<(lRH6-HH^co(00HuXvQOm~ne%YKH_AgHic{WZ(_5s>F27Mtu}za(lr z@~h(%cuve`$s#^iY^x5JP3ADs;I`AQEnz%Zi{_2g>??su!edCs4ZKLKkDU)0oDY|q zEo^uqnz)VtdNH7Oq&doyeMXyOxEy1gO|nh^&I3miqMgyE65ak0<82E2keHGP6Sp?- zR}xbR%*e9d{GEXBwSYyHA7}=+|6>&WjE*$vI+MlF#EW(`O|e4Ugr+#ta8I|4yUhj= zqne~uX+;WaAu5Uvkz*rc!g-VZ-nGAQ<(DqhOn99Nu5{9$x#DwbOAL(5k*{3qYuD1p zlW$+SN@Tuu&2L;MdH1{`V0c}FLG;^5YLLUobFoHVu**N3=sEc8yUfY+5W2B+i>p@ z=C=50&(%4!Jzi7QMrn4dg~q?k!{iQ*nIlp>DyP~B8*gNzIzl$1jp>M#P7NuMjz5r4 zPi#pfZ0ZBMl_&dRqzRHf!ofu!H4UllwihPD@H2s@rxUM3fZ)*Cd zC36T?-i5{ou%PMQT+Tm0RY&MO+Y;uG#ym_wmn#F(_p;Tk+rj8U8XFCcWe6g%0)BEB z5l=u?wUd^3Z+)j}@r{m+-)rOdXsaW9?_~f=1rCl9Z)cE=Y5oPW5NIkN0L9S91Rd$t z5w!ytN}4aOI&@3y7t^d5xI3G$2`OB~v8sfmyc|QcHfOh}&nZLsY3JM221h*Y{CopS zo(qx0FnTwmlK^4~02E^C%>#SgyG`Q-kOl`|V-CC4G_Nr;*P2Dz3a%CA?NRcGid(ki z{t^eKx5)Hz;(il)&xeS(kL=(ve=B=*I#fg;$#U$?V7I%rOWLjiEn-xm})Oio@`Q>kyy*8r7x!;1wWL z$qF%8zNo|rh~>$|!JD-x1HTb)h5Ub{y#<(E)!Fxb*4k_P*~fL{%o*2AGI2ME5+#rp zC{m=Q6pEBmN}tjYJXjJ!2qi#pDG-Wl6SR0ztat(s#UW^Mczl;Ay#Mw&bNLC#bySYp24)lBy5b+?Vozx?yfMm zPgTERw9$aKwdNV%T%704$WpUc9i#@{D~BOaBFYBV+CK!wroY0+`3 zFm9n&>bO}LH?geI-OY^xk|8Sd6C%;TyXh|V8iDY05U&I7Pgh?0YQR7mib4(DUd!A= zB|d;pC6=ijc>5hsSJ2qVq7LZP4~I@SK)xj?@G{-W zk9jD1l3wVbZzB6l736P!s6X%%m z)#i`X=(X~&>&QM|Z2};nJLI$d?^g9s&L%VufHC-vzY84C33-U>fE7h+Z5n@iJRfU2 z`azN#9}6F}&TSF5mkIAMx0edC$hZRT&rU5iiG^}<;JDfO%R75cuvUM?TS4JJSqbc&S;v+Ozh; zC&R1B;^x@f=}j@QId-?bDK;5_fz%WKw0~wX+C4tKPhW&B_qLVQFpFzR%0ATkC(sgHhN;L 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%0A9s;s*na23=wMlcE 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

  • eD*QrU@t_f9ss6`q_91o+B)$(F)G8 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

    SAAD5)73nI$r{=f{5j37nRa)r_yP>> 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

    t8Kmok$g8P*A_4D1C z&o;gxCbBa-OTPB6c5P9|f4p3?R@Xiz<{Mk{g3;9A>zz@kz21Y_@b&KK@c-Vy>)p}e zp52kUu*3MSy~j@HYE$6gD}=K?OfrDq$(r2 zp_?YvUydv;V+4GuLwlKqCiJxO%1>s{b@FP9#DQwA&Kx={a(Wqsax$g1NG&tb%4#U5 zQ}rFxYAEs+Ur79w3oa193}w|32*$dsf^nZ!rzsMctMp-{vs3+N#K2N84>Z=cJG9C@vXXZ;}>oAcWr$qwliiH zx7T`yRK{w+)C9yXk_M{b!ognsB4~C~0kKd1Lb=~mPE=Jfw;Xx0OhO&X8pJL7pxqiP4eMHL9p|+K?qmNgx(HK`%LLbrbW#gnW)C^pQicd`4c!snnJ~C$iaNGC$ zT5387G!^PSlpq+5Dnm2ghlo1(vac&LA2}37ea;AOe;qOjw?|Poqoh~uQzxt0|IgLy zXOZYTy!-@pSt!aR=r#rA7|T-C?XZ0)-L4%i>X&rmo#=K$lx|nHKQ8OpP`68qBPyHf zc9l@KONd*_*6n4qyR4T&yTj+7F!LkLiuq1?6YcJea&$;^StWI5rMoZnQaSz4GNxoS zy3s_m?rE^C+&hE1T$WZW_zzu9S(O*by~3G$8AQnF#?yKJ&@v3KnLJdk#>cAB+jlCm zk&n0l7TAbfFd&;0aITCi80M@-#qYyW@r&hTHhg#}Z1{yv_xVoanNIuVPGecwIJL|i zaB|r{73`;bS{YhCppVY{p2ahWvrt97kY0U2N2pQ}5QBmnN!n9#I+Gc1v9-P<4mt;uPF;1187_B3sZ5ET z!dH1#432P&cHhg$qOLBSuVrsl*|@%J-(5DIDjN@%4Qf@0d&N8g}B8T?7smv}}eGB3vLN!9Uo|U!#8OFf~*vp^;LowdJFvqB392bBE3PbgN zzFf}65vfHk>Y6OIH_OpC%5hzMkZ?XukUtO@{YV_-z%@nGjDJEac6+TnyK2wg3xb^n zSZhKkpM+3{{q?PB!Z<5KL3w4%=FG|9z==t@hQ6MH|2z?juNZn}(}<5ifHnxRE)2m{XiS2-r_Qz~|=v8-Y|Rsm4kV!t%hxO1pjUO^yRqmEpf zG+s*%9=Ug@xM!&U;LxaS4eSRt9!VLOSB$GFS_Wx`Z0q=>3~^&6q3%$WPP@~=;Fg^g zXJ@L>yQxkGXNq_sS$}KNnMpO@WSN?ZCUMCzUjwTp-bvOkN*&bSo$FD2Q5pB&w5mjW zgJAkivb5{BfH$BR_V1__-7h=vt|^@7O#O4T{n-qkxx{=$5yXg%u#{pM#k?ABW9I8+ zy9m^!*{}1K<8E>G59*_;@ItWl;pESNDBB-4eu8nMwNOvnB`KK+;qK;VDf zptW(WDvfnvO}FSK2jy`>{#wyy9=Qv{3^(16dp6IlL|zW>X8?Pl{*26NJ`N&`b2XJU z^c#*MNn@SbNi40rIOI`BDv?m(%-ZHQMeKg2voth!n220AO7ZoS6!*0`i`ul!B{)mx z(Kh4nZARACOL{DWB}mnu`3-$K3bZ?$C35~G#lFlQC`y_t@GH0zZQPp&bd!wU-i*oP z&ym--w@N;3xc2{8e?=IEnO7w6jb)P1Q254y zB&Hl;Y+)1IP1OCLh}@nji>WH6QC`3a_XDA%7Cb%$<6k5VCj(oIP{p{lPW8^mVzu~4 zVV)2ENXd#{%E*S%y~x}3I(8CsG+@%2^tMukCvdlI@ey{*q}E{$6OBr0D-&~%6G3HR zxJ<54Ss0!~{HZ2msQylm*l+5Q!^aFr?OHc>ohvVQjjP-!euj)cSrEEP;fGP4a)vrD z=B;P)$!GHll>2iW!bFjOR6Fz*s9a-xKKWWcYE#EN=Nr?i1a_v5jLz8D4u9VsaGi0+ z-ugt@=Ww{BC*}1>l+z#+2|*l3$s3G_6iO$W+hxDd0aVRyHOG-{V!i;#9LfP7@#3RE&uSQ8imH4CamvjQfx|+* z0H~TlMF+&Jk#5o<8M||lV7CGC-tuGKUm)yO4I_;&=+RLLkG? z|7^7V{^hrz2A9i->iYX|z|0_Umk8 zqIt0>pTpUuKU*}PVy!({l#dq?B~u6l)idSBGp*X0vUa8yp7~fY`)|TeLIBD4uKX53 zN&Cjt4kKR~TVJ~JGuHA`SAL}a{t(p(z@nD>uPfxnE6o4(ig(@Y7o<9~ziO0U5blk) z{m1Rk8ylW$K|Oh~MLyR;#tel+d9lS&+s?BsLjrMHy?184f$y8&e|yQpefL{0^PN{T zGmraBPSU#Fm$&&*J-FHL8A9Y#=d4Qd&4T}OA+vLVcoCI%{Bl3J(%{LE$k>8cAoLz6%;k!5OLbkyw)HRTxTkT__w<(ut=f<#* zVJ`ez}N7L~Df+2OE6+o>3`aXVY)wabAFu+9gShOXRD*_9fq56=yAhNp%N9qEyZ z${Jy0od#!=J32FJ^jNEoj8J2vbwS+~0y~sB?nRMxN>0yKy_uee#qd55Hr1t1Ob~r} ztw&*e7ybqjH(pz&ZL&RmlkL%LZ^80|++?S^XtAj6_;hf?+jvHE#O}aIkzuC(Im_-W z3VhhbG8NoF8{)wz7K6V_tak~w9f@h$l4q!BxMmilTwfj(SvsyH^$W||MJNPjCvm-( zmaQww1aUJ&5*q&l_EohS!lpLa_ej}#jPqP1pgRFRxfv zRq{SlwoD9le<()}ue2RjG1gR!F;vt>QE`t7|5{zKPOp?s3%8rLudY{DoC_+mfi-ch zlZYksOq2Uw+4`{DG0WXdr$DKznbY0Ph!N5glhdm!{@M!jou}VX@$anU;nY-1pzdbB zz&iL)#s6nTnGh1DpGrg%XHerI6ue%<>!Sc$R2A$co?-{2?S2v}HDG{A1H)HX60)ae zahcS~eoW*k{MJZJN{y9i zSPW_?UIor3b%x0LnP$SWjuiEN-9Zq{$ScH%F%f&I`b^tIp6u=-UjuQC@Ga(ibR?2L zGQ!kie_gS@uQb=y%y8EZN}u>(4jHt(;gO6iWtfKX3L}pfBgRGS-*e~fB42f@`oy>% zxl>%-@w6e<*+ZHWH3L1*4-ND^+$}6wRH6(kVHJ_zbF=L*N03&Sd(DP?wu_w7qq0h1 z#Jzlof7OuYs*ztp%;7D@aEl4b!r#a(7IBN&INrHMF!D+3?DC9$5w2eC+!nbU zPZ?&!Gh5_oElhi-w#buNYfD??iE4dg##-Cmadb=1;+C2``FPC+NHpwB1r+Gg-{ZZz zLRL)71DJb<*K=!&+NP|w(E$coSvnV7P;F9wZKD=Jl)Q?MH`Aq{9~XcHLDH_m;F5y0x>@`pIc|YT8~~l7B1FwlmV!lilSP zxjaAZtLaljyJ=nt{r^pqqV1=BnBU=ykym{vB_gaE4-lN#|NK1 zNEkNQpR;?r9%vB{w`d>zggEYQk@r=JV{ME4n<9?eTjVW@C~j_%t82uup?m0xmY(Yd ziR0;7b3oJAh=W}0|MwT5M}`g($Nj2Vee}mAyhTC44Rxe?BIkh#61DdOs+M)6(7`)kHrp$xrx% z4pehY&yb^g{3Clhj_3hubV+*R%cVimRRx_O-7P4Rw2evHLG~-B>_?$xGfp!M(F@=3 zLQ4iH*~m10Q9#%5GZ*fg) zd5>{Pk9%>CbxBY0;vVt3d29_kP3t-=h z`GkyzNzxDrOfKBpC^9)$$KAru)He*sG7_A!`7ml>M>oC*nc*kH)Knib$pH4%{*VZ5T**&rxl20PWA zZ{f~k^(wUxuf|u&fsQ+n8FAskw0UvgFqwa%$A7Y?@I>yV9{=UA1*$UCM+AWq=6)nA$nRbPa{9UfZ^UH%M?HzqEb&&O z{G`WNT8HuP<3{5Hg&Yg)DIcLW=^GmNdc866Mx&wnL>Xtkt$n3k^+iGsp^ioxfY2B< zUw30ESp+)g06ihFM?m{ILG+?A7bt;g>;))wN@!HNhI-W)l@47Yrx72dN3IK-LwTno zdP6IT|4pMjs+Z>EL9&AI{iZPr1VdG}Oq#=%G|{N<8W;SlG5!^e!U&=ob)#0bk^BNu zCj+b;?L>XmuHhahsCL~!yMCjSIw)*ckOrP5iL>RRQ2VAuQbkn_Y6q496R1c@5<5r*9`ByM47tM6kFk5^2X<42C~`npAY z*P=bwTMJqVWBNkCru|Bb{8vjga0NWZh8DwZ@eDn9qSt@AH}O=j`(<|g^DQ+-d~S^q zpDGZ@j;Qfr$a<5BVgzK}D*7O6CGU?Hit}DTAjfhMjZmns5#6S{wv;tLGBtma-uPX@ z_%_kFIFUctIH>V-BfnfXF3`(Y*8A129t8@vSX-2Xm{HXP;7Vlq$Z&veK3X>fH#Q>U zi;N@04?4My(h*YdMaEZb)GGcHk6ByeUH-5CZIJ{2|DGsaB4mpZxobqq7VC=1S8Qe966mr^>tr6v#Pf`Okt$SIx$Zlul%R& zx~fh!jQ)~3nv#IXRoXSNwK=zQ>uf|0#~Hh2L?8ZeGVxGy%jz4bkmAEcbctt^5O6h{YhmiBaRNPOs_REDKH;9&>H?@tm~s$G=~ zq_1bv*St`tegL<)A|rlCX@{p{S7y{5*JQY1dF<_E{0f0E*8N_xru0H)RKN&RLyuDhxhteZQ~)>uL&)(M z-jkWA8!#(#>z43B^MKI{v5Ki)+7Z_zlslVmu$lS>3TrU1BMq9~pH>a(HuE%yVo~N~ zlyklN?-@i^=j=3k{9PG&FS?EO zQ};pMQ{ojwxg#2aOMFt;<#*8FIWVc6LxEsmrRu3E{api!N1A`3hb9qSB+FOm?CpN=1mFV%MAh8jiyN6V#%ut=8VpOWMW)fwaAT6pb$b|*{ zZ=t@dIUO!F*%*lEeRnpCvzoN?o2mf-=0nXY zmFX2teUCN|RBsQB;{8!#69Z?wLaHd{IRHjc4VM9R>jT0bYg9wCkKS@w_y&D1Hj5jZ zw41|QH%s%)@YZ)Wb-&YG`y#8=t@#|sZ6qE-aBC0f2_F!WjSDzd&5!k4Gim%WqW@7f zOv=p!NmSJ=p3%q)T-0|_+`K0wg~}i|pUQ{eoH3j;p2L7%)s2eWD7?i~daiaD7FE>2 zJh&H#143_`xm;|0f#8)kFsxX@3l72gNrQjQ{q~7O1_+E-51k%9w0%LcdeU5`khFpm zWfe5T4LO(DpBPB0DKEv)v(b-3T2>$|>*%sPp==*t4n;VL0Xn9xo~5@iJ%_Vrl$WJ8 zy1La?^z_DCp%!qfG2CihIr(_mc(!amQyx=o!%o$^sKn9a>W1dbQ)8H1pKaB8@VZ)Q&|XI(Wdt+B#ii^68*fAHO75VVO~_@E{qUtQ~3p^Y4n3aTSw&< zf}@U(Xr)rqbTC1NUve}biBDf4*#+(E)HmaJb6ZooxpurlV_~38V8Xa#QCE>=IMb66 zJvbq+9iQi0J4(DFxN3W@UmA^r2R%BvHVd#UTAx&ggIB??#{lVogmk1BVJ+N zmY?w)mhh@cwRDZGVeW>V6i*I|nP|A=C+Ih;OCRIXS`#-mEeKOKwhlHAv*<~+_T9iG z?#Q+g4I>$KyHq=^!g!_ARHwi?i~8hw(vy+TX1$oM=q0-iV=^EBc?7O|yNch-Zu5b4B~bqW?tEezrLOnWANqEG&`ClC2WP z8&#^glOdTSAUoX$c0HD=1f;U)u zW6@!`!7qXMZJ{5G8YznjF7MMXuu)?M-@?pNC0(lMMBB4$03NnI-{L)F-39vF)k?$J z<*MFrBK$pBZt_R1o?dw z_Ex2qpU1B%RhlD+tcu6=*{5hp?OP`Rx+xO7GEDu+#*IS$QxhivEERu}+L})LCOnh! z_D*9(r+uJ(dq>=`S9g-<#y&K1cc#+~G<{K>`9q$`U-Pzx zki65h04)%70r|P_k@8-q0p#Bd*rw#uX=GunsNU5XsVu5c^NNgh1LC=VV@9rF?cJ1- zw~|iA%OOXnYWYnzIX}80BmcMaqc>#?;NuxRY2}WoB3`BU?@oOYJ{a$?vizn~**(3Z z%2Ih{++)k;3F^p+Wx2G>(+W&zxf)VdT_^uvuVZHZ@w(u|^2VnwLfMF~PZ_VJNNVa- zE#~1KJKS>`rF}is=~TycZW4reL~j#vttwKJ{vLg-?%TNhp3EBw2UW^bs?^3kt7BYx ztsu5q&$!nMGTua23wf*XZV?Xq>b%Rtv7K?Q7T8!YTY*USZzL);xta0D31&YI6>=%>vn%phx0?bbKP(wE*5zpasTbcKcUJJ3A&u0BmA`Is~ctPHR;D@?w30q zmmsJNGKlE*=Q;bcobh=s|5+|jtcRVK3j6NF!n+doCFuherx(7HJm9eOtcSqph8*og zDuH6R<>!2RCga%{71dcMSTYFDDUk!8s+J^6BHW&l&1Lj#g34JL zmUzajZgX}{w2W(mLcT4VCR@y9$T$9sMLc&E>qXp-1j6~2Mp zsGMt>Ghy^hZ-zh9nBmVFJOYHh_+o(} z^*h-`#-`&l+T-HCjHcG*8Mze3QqA^bF3;E}WKeM9KPtG@Xn5|Y&Zbv^;lIUwv)br)LDaTU7a$DK13QKK8$~}ZXBcZ%V!>Nb6ZIL@w#4b8k+x}Ps85QVtZ4Hc z)glJY# zMtWN2o{|u3^f@VCmeH5U+d{qv`n1jyvSHc3cv_d0H@(SweO6?Isjws(On%$;G-T z>3bL)QShd_*n31(#dSGR>GeuVRO_hV^;Ia{;nh&OBMjv8rQ&*RiP$P)p6W#wYpn!U zplxg9vs8tuC^Q$%ISSi%q%ihQPBwNhMjGb|^6?hzPJ=mzmjOzq(&|td0PF@CF8k$F z_N4U&BB-fsW_0QeW{X`iD0iXRM&M>N>Lu{P2N?T?H3b0gAhdRXE+*8O4iTEjWi1h_XPkxf)Mk z+=YQQmk5129uf8ysg`NOnNV7J(s&-SaQCjr!#qTvA_roVc+3C*uqjP&w*V?vTuxOi zHdU#;UPEZ({BG25MQeV%oWk+!pi`B2rjJL;daChv|ml zi=k{}#QbgKSp&ZbAJ;WTR0r=wT8qNnNE>79lcX_tMGO5*hZ*5&v-Q-dH&1aRZx|yb zF+~=5Zr7o#4sqhdW227(VK8)SE2~qROS*-uk+8MoA;tt%eBNk_YW5!XfyU6dX?Ou9 z&9RNRlGUENxCaQ_Ceotlm5nJ358dr`i*|?69w0V05w^PVJbb^{nc@^{V@T$A(spj# z$@?Wisg{|H7m2~6P29)x>WwoY6}#f3c^H8`#Rj~H)bO4xs7IlbIF-r zQlCY4qgex5vq-eP#m?1Ez7iCG++WOBl=GfYDd|am9(r#gX_99&@M{>uNm3POz+(4S^Ftn2d|<@PKfHMDGLIerZ_6bPwQZf0!nO@K-p6wD~Q zQd_I7(8Nk@kshv^!`}(v@BP*a#4U5yuEkv*p)w@BJ3j0QB9c+dyVyQoh)?XuvsMS( zKv(n97iRG*!jDMuWml->H>AFqk46uGig0%Hb})uTCldMN8j~FOF$sO)+tijjq=2YW zT4AMDTG18O_!}(ydMkE=Wn6DLH&|&o>MpD6Zp*&QI$zvt#nmO$1&XI!%iTgl_6{c7 zIc_l z?s=BVsk7Ry%7;Ib$LVqh`6sfZZRs@lSHRrRZ84ghDCDEU>oQvuP@;o0IN!uDdm|w} zqLD!*io0AfF_lSbhS`M>K>cKT9-HLw5pKku8o5GFt+K2!a5m(P0@f_WyF=GyykDJz zjjl7YlKBYQ0P8CLfn*|__`@RV#06Mm#X@`8H=H{#xSPNVl$CLZXlE{|MguDiB}4KO z5NYUNu571oh+u5_l5lrO5Gc8TnND zkuO>7-B4kaKw&BvI6=sS$jCI_brVJp#+g@HDjpC^kV@_22u9UP52@sA`XhoDpuLYE zCO;-pgJE;vnOdOOaIV>rhNQ5KhLerUtBeC16^THH&?RpUbXd&Tc>m$RePrYst@OAs zo)r2MBEC-D{|WB@H1`KcpkA$Z|5i!w4BnqZDsZ#T7-xe1{ptM&xc^G=cd%PBcgmqaAGplHHmz=bm#D^+O_yCHp~}iemCi;%E&vfrz$wQ8P5}c%3Y!IOt&D=+IohY|x$jQushon5F&J>8`^cgSQF7&;WCTe*5D6@J;9 z=5sG5E7t$|$VJ9~-UV*D`CPtoJL(!-g$}z$P0Qb;@qn5~>gJb8{fi|0QIA)X5ldn! z!|&V(nh-C9`p%8|udsKc>Qkbad3YX-ZmE1nTO#FB`PU_q}O|4j!4MnCHaPSK5%b@%g*=&L2Up%lDbik+pe66fk-nLh1wJ>lsm z>+$fM?N8McN}f@wA~2aWk{zX;I&eVz9%i4YHgS>A_aX$dS59^^=72F2*W)zhm$u~> zjM*)jWnywX4I?QNeX9h+K#Q5H1R~Eg;&S5zjBQU$og@PI9Cx`aMeId_e99fkp$VG; zE0S{Lq&jZUZiWpKov&Q^wpgo2zB9%l*oaH@X=m%!S$g{wlzTB`$ML#-g6WFyuvc}k<%H^J2R_M$7Z6OVib^_&0aBJ$E zb9aypus7M6Wd2s{#`T-m6*!p7G;jP*M#6A35 zi#$viy;d??v>`H;%)lsQJc=PA!9E#}b@`Ph6cfviYG5cjtV)(3YNe+jDEoSQoWP<~ zhwu6BxUtpoOt@bdEiqUBSSpWrUb%A+wQmu-_e74f$fSs|j+|&D9N|~yi9XaAGa7+x zHf>9?8*yHyeJ7SnyLC1H<=<6VW8R`)KUBk8mDk@=>}91`rmYYv))Xu?aaTKyekkN2rUK(972BorgML=gc{e3jQ7 zVLpOo1Ttt))khFEz=iSDS=3(G$s}>mc9F=hVE7(oOO$<%;X_f=J+$3Ip0^gBH!5P! zz;Q7V8rnRv&Z3L!dF2ehOl{_2qHs9i7nCge(bK776*!*xm%6`7El9iVIA~Ri?h#mf zcH!xcZL2whDu8n&dOO+#OO>UWq`I zVGeH_k?*V-QX8NleP}WRrW~f3_lc(ah2i+494&4}Nd|7FFEZ^5O(Xn0O~P zcb#cpYx>uj1fXAQZokruXT{&ld210wtouxd^&O_a)-=*i5IkKD?cC!+JGUpXbN|$4 zeUe%7%)3O>-GCXqbiCMVak0JDjN5^Q?D!8e#f|PT`_}SkfAHqfyD4@d9x`{nz%;TX zk6vxsYs`8K-{KatZjEWIHgjuCJKW2!#~$1Gn>p-GiVK-@xJId&iWPh+5fR4lm4C)~ zpUbj<(e$h`RxMJuspZ>)?!K8ujT?tF^0*nPRWypyx@(VSVob6tr# zcg+oT7^QR6z_MAqg4-~R45@R9+lKu66D!Q%kXjzZb$ z!`!330SbFFVSjnK4U0-V2gH}C^e~y`FWI@5uBNkouYnNIMteJ})t)1!QMDywaF?*l zZ3W*@1`Qz|7v>y%vaZa9G2bx~r8~mk$@2m=V&_F&#B>p#A0yC;xMz8tc83&e<$5z* z@e5-)7}=R@zKkIX6w_ItX5#X<$uZ1-X2K-`PR)U57?CrbpHUIKGgbBQ^!(e+*E~Ew zDZyfI7;b-&RpHHFTJDE|i)D*X`z=u?{sUJ0LCbi++Tvj=Zf8<%V@ekf+40A0@uoHH zQ_KCtDs8Zk&VAV#PNU}2n){Sy3{IxOYnJ<})$qI}-mx64&_lvYdfz9xpLMeM&=Mb5 zzy8>=kdk7O?YW;?2|eC!)=jVWeG@X+IMQ=GtCEud9!@DCHI3<6jf#?-2Pa#=_88Hx zzQsOFJV!`#qH(A_-RiXWvs&z(@yc||DNdummvM*@56mcc9D{9Lb4-SDq6oK0OiRa8B0CM`yp$33W9V|T&aF4XnKa0``G%ZmP&302=(>(E zk%G2Wah#+1FwMVi8d;j#LVCTrrIck^;)tbAUHJRC2v_ytZ%_F9a&=er_+!;Sis6xw z;V%bTkk`D(i_UOnaq83Ql#?y%nNmENw-FLG+2A(H41gHqbop1ZMbvBcc3bW5KVs@G zX!T?22AXWb`p1 z)<@Q`_Y{^zEGmP=_hhROD|t@1y4DF-CsZR4dR9oLuG<8H?QFT(#`)t)#0p&B7Cwo% zppARij>Hh~BTu^Bp)D1cfYpEysp^KL4yVAc)bMVU@J-(D*;V=O0dFK4xO09-I74*& z+jVQ>_a*|1rX)M+WJGCn1p2}w6AeJ?(o?GZsoopd{ubpjhjP$$!|WR`1lvC$kIlia-c zuCKlBJC}IY#U2y1@#olDFMgBPE>m`+#jI_nb_u#kSJz|gnO@l*wtwQk-P|X``N;n< z!@0LQ&1U>G#W9dD;u+?1#o(0-g@b5tg<#Mz-oj~qz0ezFi}6SEa@!bT zkChdtk=n&c?@Gb!H3a7gf={=;5Di~mPJT_Ie1WR+9ZWGBuhs|*V^Q^0)MVjYX~(sg zgREZ9xVj1a3`OKso`CA{SRG$Y)~&Rb$`zJaXhH{cvq#IR`mhiSK_~_Zi+L20jtdG3Q-n?gT$c2>Ne5y?5l1Q2@F74 zM_Ea5jsweAM~D*xb$g{PrxYs?-(Z0i+i@9ttA`bBN@Us=t^xALbFj*V zezgoNI?uF5R9EfX?*)xHfE_!tsI{`nj^s76wG-YZ`w7BaMyw;+lA(x8j@MAFXkwdb z+!n`ytYD8VPSR=VAS_tDzIsEIsW^^{^aM*Dgh2Yew~y}J>T9?7{x`1mwQDZ*@+W#N zNV?!z$hIGEw2Ihw01L#;rWm$$7DgB;!wMu2O1$oB->Gad(G9NqwrfA_YDr}P7k9X~ zihGs6@jmwm@v!T^ZfWmZ{$;oXLJ0Jwu6_~QOe$Bp@){LUJ}QnXKDk6c!ir>i4p6y@0}fyFt+#3_z_qQkF#qLaDG zOk8TFuQHuW&E)>UF`jl5zMJIvg~B-n_o71P!h*lvds)2ZiC4Wn-txqo-a+qs!~PIE zrXhJ$gFK-jIKCnFh5Le7lZ{{N0gt+utD`r0_RSv2avt)?ZPB~Pi~ry{i#+Nz8{%ts zhwqrF#SvcjF`k`_o#oXXDlrXTtaewTECxldHXa!R=wXHez4ZJ@9?8*eB<*v>mLPwvir|M@}YuUR|p<2#8!B( z2wS_(%QwUx@aA6U#nsxm&a&!QrzbCuk-B3z0NhBw%W7T zdD`Qo6`lE@N9GjgW|EBN*A(h+EO@sTGPe|VlHvic?S3zQpLeRTH@lm|nFqX`|LGaO zn`Di-$=9CFYp40SYEvx|uRwd}`SKz^ILmLU?e%W*{hNJU6}R|v*4ECA55AUryN`5# zmp}hZ-^lh_9);eUul2R-eET|VtojOHuJY}xeLF!}scU_kuES|&TgvevuJ^ky@$HMl zy{rAi8b80zHPYZu-e&g0zo?*{9-Lq4icd{3-rP(KY?g?}w*?N|FyPxiL;4T#BcyrJ842rRN z+p^Z|mmB)tNlyI0MV3sC6j&J!=NwLoVXy(ef&Kkkqs9G&V*Z z)q*e`vUNNt-vN;Hiwog-SxrHcefNt>DpIBGU0>W4Udq(0)V?wb^egtH_DA(QZx zcLm9gnSUsUVLNp`STZ*_LPULdzMmuwNHRc&Z~?hEp)QeD#gEeD4#lx!Luc4o!);2- zW~fb<%hV_8(hW|bxlt?Tn+r`Yl|lW|%c4cJ?a?Ya4r-rRPO5w`ov|S=Fo9CpHZ|1l zGKb3Hy~EF+DRaJ~KbVnq_a6oSB>NWqfO9{CWB|L+AP1c=LSza^}@g;0g>hJQT*scF(_HLa&({{62q@20Cy};SMe$V8 zt=FHaH=gG&?S*>zvRbdNmv7W-uhv^h;^Q4Hp@1OT-<sSb{R9;3jN@(oU?6g%M3zG6hN5!IJ%Z)?~ zU4<~K5YTQpN{PCv#7r>I190x=EF~7dpZsRaW#qwFGfHn#OCy=IfVRki0LdkMg_~5C zJ_en?>Y}Sc}w;58@{T z#_>Vt*}9H({iHyAM)U~gb>jrx8MFvg76oESplks&g}ovw`8s;#Q_!2efU zwh3*GDz<&ZNa%>RS>^1Nb+04SFw~^WUiIwm9h95 zs=68-xfW(ON5c{3%A&eSyV21{WM{&N*J~+nuDuU1iWdb%W{k9%3TE4zwI7)=I$LtgIT_ERzY z>6nHQd5Q2}$JlJX=s8b$&eLA16Y~Y+jb7spSFUpa3VkFf7{N1PNDMmhZ7ls^%=jQS z?8CV6L43;lF?*!FEN-6^*LKu4^AX7mbE)qi>lqjh&(4e6Z^i9-4h1xTl>`mn z0u8jU4(!V?d=s$HPqn(M<1;S{YI_6Y(m>;aH{vaek!jZ+y>kRb&G@lmtbby`CQ;B|El{bO7sjY4e6;9qN{Jp#=9@jw3Uj4_6T z-+dwx$JqH^yg7Wi+=e(G-7wyc_iu=6Z^z|Dfp%fwv2BiOh!;jFVe^xC_lNN~FKvGt zPlQ(u`7lnENBcY8mE-@4PvH0mwPXF?#pCa4HQUE~TJUZBY4Lqrd=cO3t9b4Ql^CNw ziM;pk_|AtXjDmL)l-7ztL&4oJFe)fN+>c;Me&MkI-zZr1HjuZBH5A@tUF3`N;#0y8 zK5;|bGYeZ9y~Zf-YG0jE#~J1^K8elwlz=pD^9o*{UGVC(dXIXkFdt=| zXu@luu-qpLd8rU{6^e2UGY+}6P=d?w3nl551zr&;_Le0MI2>q46jcY>NV&&>Ixr;_ z6y>aJ5nFQg_Bd$gt6JE@n9znWl}_R83TGdL;@km?AzGEIOXAPrx>Ni@IWjw_c%z(g zouN~%4cmgtC|#_a>`v`@P2w+H4fa%QixeC((<>$ZnbU{J4to<`m_EPISK);?ZXBkbW;uibBz?9(-Dmp2J(wtI+kmGBP}-ss?BA!dP_DoE_*bK>dVcRZ#(|9~4lFhLHT%wrl z$1p%{I%)?Vn(j^&!TcEMA>@^|QuZmQ}m;R+|ekTdnqVEGaisNhyj;?^y1Ad@k?`a zQl19NuCH>ZfFXW@>2yqFajF>FVsz5nCTJfqRoFoivC9(frHSs#5>eZ|HsM^BFfL8F zS0$*MetlxARS7qS4_(d3Dd;(lO=up3r<9|*YGeA)3PzLezhsYB3A{;?f+7Tv6kruL zpKfKfWtMaSRc!@!39;@XmETy2by-S*9m(D%BA00t`jc+2K?29Pjm9)`!i3sA0f>b6 z%roZdj8R1Ya$pFu@gxvKTs=RsP6IClb4G%*h#>96DoEHQlyQqd(0WXCJ}QPpvJ{H= zSeq<|CN6NcP~!r&8S(=B3?7@)cOX^ zJnWl(z)m6V#z#G7V+1$egPUF;js?C0LCpw%Q{nF=%8+n@c&>V6+;Y{49U!C?`a{ya z4#-2vatQlk3`XrTEkfQIY3Wvsj~@*J>10spfq^RLw@i`19{Qjvjb>Uh7fq-2^_u&N z7JHLysxcX}3$jHotz%kt=t1hb+Mq-WNo+C>0IbHe+hV2T$jD{nsSci=!Z`{7eTEqqBMiE4xmJ8yEo&CPgR~jhd$hfAtXx z>~^3UcOOE)!NRKq6g7ushXeS^M@wFMPUJze2n2|n(3WoJ!CsJ+jSm5vx>7o8q`X$< zu9H5#WFzOErraf_bAWxOCeDDi8D!^bZcMysG`=r;Us1vGYTQ4efX;k?BA}Ur;hnZV zw+gv4v?m!Ce+V_z9CrRzu-k%U_MY7+dQ~1GNOT$WSdL`(iQ37LOm@nrY9~slcwVqq zxh3d24Qu@6ru8c)>+YA?}CD-C^x;k_&DwHhg?!^Zv{uy~;f zRYA4#RwY18!i*J?N*~O0PuZn$P^G7*P8GNx8#|ctBq&3F34ex1%o)?Ep;Y#jV#W%U zGY$S2S!GqMjID*E}?MLcOIVI7ApsZa zlE)!j=>(2*P$lXAn)evb81S*-8Ss_@pSp!D72EHLCQWB<#05dM!kjh0TP;{Eh`G*E zfaDFUlLr~gbo+E&oK}76(?mRUPc^1MAKW845U=9y!oCcFcb&{3qkxN+)zf2|Qjo{d zcf`)g@o0(7S_ovCP9}lY5l|pf#^+X@?q96iS1F8F_-a>R9H4qjBvL201wzM0d-WC} z9(fTlmOls(6khmybM=oyHraKV`~ej-dxyct>tSMUj9g*E&VjUvx+!!8fP#uJ6sCHnpD@N1du30t*Xb$rT4pTp6Tz$ckoWcAJ$=aS z`oMB)oVs29;^(09G2|=dwOOm9SsY&0CZXgO{H+y|5r6tRpJVk4775m6 zu64~C8|Sp@ny`#p4;+uKDe<9^nbiApQ~|@O?iV><=;7V8W<`fjsECgS7L`UsEp@vy z5uT?-9&?H)mf{gncv3W)^=1=Rq@rH*3bJUi;6;aG)DwTGaiI#6S5E&Oww~JTfc)6Q z>pg^MM23T(bKWBD2Q6HksQ(~4BH6Q5;X#bD!%;!KEPlM|lKL~H%jHZWPAyNIC>xgoN{2BzOhoXJdNuvos>4!R z^NmjT`*QqyGI^CF?lF5-nqrw#dS6ajrB7dOacJgyGPTI*sLFcR8YoHQ@n?Row56Fy z%yjBhMwbTiWvqTPIa95AdjuLngZ?`V=Ch0rtkQXukd?xoXAM!gz&Ze0mSG$>GV5%I z(jO&id~1m5K&bCg;fAjdJf_DJ@sgP2Opk|skiyEdvCp2U_Sv_r=(7*?TAy`8hlj9D zlpS5R*4@};Bq-V=3Iu$G{6D(vPT=rF`kTxPnv5pRnLY*Z&@A!F+l(vKS04@b)mx4@ z%o_WtDV}nm?(wVCkfg7s(T#Tw_SIp7ef6>Gt7#~)Kk2I%g}xnyc=y}bOBs5JDCc=r z$ELmX1-y0BURo{fu!k(+jwNYTqZn@u1mPwdbA6nMfU-<}Sw zSat)M>P^2uymgU6KgC!>vMF(lNVg!)7Bezm$jSObU2{WYL2qm*!nA;#++RhPJPqW8 zS>ORZ@|ZVVw;s^a4{Omzw-A3sE3Csg-X`l`(3)S?%$GFl4NbnTwef3C(1H`~-ec_G zXnV|eR`9Jg}Tq%Qc{bhDXq z2H11$HfsyF*9rVFUJy*-RP_aGAMK&)w|kQnOm;o^5${47Imz#|7Xd&oMJ zRF~)x{<_B=c_)AQ(V8N9B-vY#=Hu97lK9&c{x5`^t0*F36|@$8w%CD>F##4gUn^2# zI%MK5jZ?8aJ#cr0i%JO$+LXu|D(bc0k|d`~o#P`B^Xz5997DD!ze@;RnQ)X4@}_kccQxivZ*da-9c zR3`N`j?vJZRhcI!Z$BM_P)Qz0qLx;R<3Oe5$1vgno&`%p1M>taUS{awqm2rmV3Ax` zo!oC^)x>NgYqL#LM*DAbaq9F26yDfE{o_LY;W(-9G)D)R0F3J8l=#1A+!S)D7^ ztFb&Yx*!;b#1}=5N^g|;^&{hUL~-)ZlnC=ocs2}pFBR+A4)CKiJS2;BX^ec1{5Y-iV znMCMbs%(0HQ(@hFi6Z{4xdhDRfpqVyZwdR|0zvsIqV%cJGg|*SF>AvyqWwRVy?2~l zRk{Da*V=3CcFx(S&Y3g4XG)TpNt-lMNhl$WPNI^a2ucD(1T2>lnsgFTks=Tf5Tyj+ zsvuRW0sp_`fp$is8))st4 z0goDVEATz28j-xxmfR(U?YCi9t2B01V{Zrp+7R=@#12Ry<4re-;B}tta%@}FiA_%R zo1#!%sGJL8X~(b&qgStPL8xuk9jx{3_>+`*FbW=x)HlH2AjUt!gl@l$qba;8;_PAF z$KhT*$k_v&9kevYC3QniTCOW@o^neBqmxYN&$=vTN#zyQ`!U)V-LsTAU%C7&lk|&p z(|pQX_60Ov%Bohivx(VX2je&7x_)0CZ@N-DVq zOqd;6vRR3&$A2+r_5sqD|1#PCCfEb3Qd#{x{Zdk+&L86=@EWvKSIp09^`KvP%X8mr zj|$cnyyffUTcsUDZbu-;h6}o9M85Se-=-FH@3iC_ zMh?h1xN0t=Zc-*WHpH(J--jtb=i_^Q zu9kbIreCZD|5aP6qo-^6r)v7STJUZB|1(@O>iOR7wcHIgeQPcFLT!mpS~J~tORaQs zExNtdd|Pd03$d(v?&G!GgEjqlEqIJ%Uu_=FB6qR2HzVs|UDy-%w*C@= zN*gebO7htRKB+lZiu&L`D7o+QrV}YLioqnCE0tPdP8ib5LqE4)+?&Nr-Z(cNiTBIx zotqMm7WT{Uog0d$f}uXXa(GL7u&R1M!@DbMTDpNX9MCu@FEE?6_xf(f`JO;39~V2{ z?E$8`6q8+tjDnN_lU-a4#=vXnBd!3TV&kgjJk;Sq(?zN^hnYBN`H%KeTh!j%woP^B zI&^2y@gvo}SJ!7$Z&T0Yfn-#<4L!k7$KddA{lCF@w0Wd&dNRh`%t!$6=0LNM{~2gA zR;t7G!a4H2G>*7kR!;54VRP9KxYe8^8`*a|Ppc`{Fuv0UVgpQUof4nC%djK@?*_|&U~Nlcrq zh>@T_iD4F)Dj8gB1Aw)o2eaYhlGv*80Rp*LMzD%~HH&wYS?{nvX6wRRw>kpj-b8&_ z9m)Wu-`?1~D*oZ#@uG=O!kh6erfMPs1-sFR`M3kHN4q)^{25aTt={oe`$q;aOZl?&(!{h6b_8RwLOWQ z%>?_o`xfR9c>MlgNcbXZKg+8-Ff0`hudHQq$z{K$N;O-KE4iY2%a-4SlC;&>^}s4j z*c{_ZG=)4IT6p|UFPSQNwSaX95CnT^MK?qZBu_qWCDtjJ8#b`^tVbdwJ^=#|;Tv{C z7TwmxRFs}xjiMX9=mtdU*VP2>I1gyV|8vKdp&wOTa(BM>YQA>?6zUPK;QCHQ%G z5s$Q^?ntgXd9@`)v~qPoE1uSWeq>7&jYTsu`iE*34_q~V&wso^`oO(-;KAcR{<{Y* zY}B(@cEZC;TUGWo&;6_)O>?K$4z+9dCT1Y?+^S226_vc!9-P(@1y1UykvDoltqelD zG#BRZBj!NNjc=v;_qY}A1DTbZDsv}T=BF@85kZ>5Dq=5>?!1RLf=}N*(aV2!OoRhT`sgkU($s0 z=C0E5Wh!@tjxSZY(+U@8iQxgW4mj`%Eixg=skSQn6;-C-Qy8GvV1Y#i3DgL^8B96K zT192;v}`$};;!7UT>Uexj>LX5JKo4J|DDP$F8o~Q_b%yc$n;cS`kTR$vz(bdO06IXK&j+i4!b;Z0=meRn0Tgd3g$AptvU_GXZndL>OyA z7@eJ7eH?N(PBYRpYcskJ_F>OC;Xuh^lL)coP!DP`*>v1R&XY8!cywe1S-*jr{sL@V>zA@ET*nih zG|n45!L0F*#O^#fId@cbk$9~;myas>4ffPHT8vF~GhG10z{h@yJ&C%Iz%qq6S z4Q6Lc^>Vx@$lJAS%hU4wRO$0z`65=d6@ZF8P9b=Dr0qt zM#p&j){z$HUQ~8$0zlDtYiRQ-ZcAE!hjVM{uU&H;c`ZFTF44vlm5|S@en5QLE%>s{ zmE`B4$D5Dg82_m6M!2~)omn`U740Y%v03yCzP6b~sq>m%GzqPU4k0Gw@!JeIugfhy z$tyK&RrQ;ERuwK0zLfFX@Ri%R&Cp#*XRO}_&J#p~PwVT&Z&^zAv#wVY9di|Fjop6M zCS)c;C~RH`Aqv<9Mll{X(_HwHQGFp_j;H{_CZWqA-EmUYD)b>%72$#Dg$j^F4gaa| zKnkRnU&Nj9do0E<$!yoVghOU%7re;kI@kHSyO201FEV{)9G0FU;BsIx6Ge{BlE*r- z+U@P1k=}cUMq1?Fu*}cb%k};~$0wN;tbIw6@AZ$0)w_``Wb0Tr;Fz!D?{~Yk`H61+ z85$$Tq#fG6&eTEjR*=+WInKJ@BTW_PC0>vo`65h~H9Uf47`3QBc_Y|y67S6EX4pMU zz-qt?_^F!=zlZRyGsGb|fyNS2-{mZ~k{Rjayz1!jbeYDHE(g*9=SxgF<~#JA+;@S* zAt=BO6|2k-b@m0Jl9uO?P%a6WUqKc3;Pv1zZhEmyNx$q;%a~2OxbOO>#$U6zuGKNe zWlg3PM9EpodD3)332C!fL@T=ZR}AH*6y2!IwW{?xRbVxtTH!Nb%#>q$mYaP;x2BH< zqf|xYOCXHz2a?%=pfTw3Bis=rN3MG78I5pc%wTaVfMRULA+v_!K)M|#Sv8vI-0SOL zjW@_0V}9b6ur?ZXhnrOE?MzPv(`>ph2#9+cFOn&S*)l!-OX6kiABSuZ$=$5hNp~$_ z!>G8=F+-Tq_feCvbES>7InQKZyYdV^Hy9uMt%f_}ZHBD{`;{@sKEi6Ak$LX}j#I*v zAt6@#$Xz5~$}n5#+$(pw!$fz2%EN{!D1eOm-?XTIV!(v3*rjvl2DwM1u=fj#bG&dh zQ|Q74df_Oa;ev`|K&HHcKi@oW;ui!|#`uwmty;FVZhD-n^Ns2%mMsomXbEINU#;<|oJK)?-pB45r-`Gr^*LVRF-1E5h%r_O31u~UK z>L}e4*1@7TD4E`+JTvr|9som1ulrHzQsScb;3o+g2#`;|%EdL7qh4ihwhdph;TNs_ zlJ%v1bq%&3Fq3X0RPp6Z$m5b1|GV6rb?H44(Vas!t53mg`defhkmG_ku!_603eR5G z;+zYQkku32X1Rd|VOx`lwnBVBlWnGGcd3)Mixat+>`5Ok|9IQspNya)-_%V?UN3AU zOxn%F*?wCh`D|y%QRz8BGXbGq+x}_UE=S(gf#V!W0)kcEbma;4Ww+_12Q9;%%CojY zuee3r5rt$wE7^Zwk0aSF7&@ZW_=}#`EEX~#(FjWFZiwy*+rb<(=&63OCHCxjs`V2p zYR~1vu)^Anf0>?`4~m&=1~pUq$lrAu%y>FlR41vACt&mGc6;?y*hJp??dMe zIs=h;j2K8^;ff2hrqT{Hyb-QZXrNz@>>mKWct|mY{zlunva95-E3AyQB+bFq>40&Qm4F{2xR zrL1(PgUEa(652}I&UJqtF;e~(<^MvwQQ2#pwt!()@)}z}?T88e3n4CS`tfOIi-Oxi z{{efZd!NEY$_ZmkZ4U@dMa}-%c#qJdb^?o2-?n-LhRD4818MHv>K1pGELY(!*5BwB z@h%%Y(H0oP24^R+Y5_RIn7R)jKFXDA0Oy5&F$c&`vb!ePZS^EbDFQ;Wl%u7JON}=~{&;xq>r4`n__#neAsZkps*O zYQoO3*jg;p&B!&GOcD?wxBF_{k3VQGAu=Vc@w|Q}x!cFNnRnut^ICS2)|2VJlXTzE zgtk7fx6Yz+o?OgAF>IFW2J%bLT6wg^antb-1{5zz{jmN8nK=t=SyF07WH7iZM~Y)& zm55?zL7+n=&X=O@HXyE9Oqc|US-~JmAz|1_I`QXK0_fnV5IUVN!qoaZ{^`ynFa3TF zAOZST1w*a?>%~(+9m|UAS9q`{`fYzE@4i#5-XU(9Lb5+J z*+Z7dk+B`1NTTz|Ef>=c0Jn<}7{;gQjS(q~-x-ysR(sJ4CR715y633;xhSG;Hkcg6 zRh$iE6fZ7J-;5ZQ*`lbS2oAg8G)XD8lVJ$Flb96kwvb>3njGe5Xs_Wsim*W~qj=lY zgQ;CByk11u|F|BsUUaGJJd*Dx1h|?f!X02A{r7qm;S^&!Vl-LkZtc~|^SHB6yxyip zwkbV`aN z)EOMRRDL(vDWhx&giXCj|6A`4w+X8N31s?2pLnOvBJy#ibylFxs073)WFKInmnwmX zo^&R4^|W?w!V)N+P0#^pU7e$&w+PA*w_5@}w(j4RCDa?aJUU;Go~t9y;F8RrfKb}A zba1wQr%FO>ucKsZsS$Zr6$@;HY$rk9`%$9R$09C%lx>);z&3f+ zAO^}#7)F?bqOv=dce{lM5GK|TxGUXxCVU09$L;NNi>BI^akD*xX-7i6>k*OSSZLeb zebU?&ZRVE@5varNfI3WV)h~I;$9uQvV-X87&b`HB4EU1KU|P^zs1`^<4__2^1&f)> zk0yDG%lqZiSn}ZtRwZITn6b3WR2Y=w*0>Q7rRtJ@e3lOJ_vZ{&C+d?u5^gTE-YSD` zR3VsRkK@RCwt=+{?6Jhti{X_35tKeTH9d-N*jvjlQr9kG6&#+b3l`7p#ADMnZC9k$ ziHP!1u>H_!-J$g7EZ)3z8GfH&7Mi!Cr2B15y4?I^|AW-)nos`ePWHtebc^U(&$+VH z&$KHOaW^u+tOp0(61F| zto}HdV}9r}f5zxQ)BTBzqBPyU$$khs?^az*zRyke>Gw~X_}U8|6;zw2xbp% z++Hr-QYNI^g~%0w(tN7a_~}x?Egciq=pKL!gv+?37w7D+OHF?(;c_;Fvk=H$3GS){ zgI*kq{_HRRRHg9g3am^+xqdrPYvEf>hGb%nFZIzPji%OB9cUcv$y8Nl0n6h4!6-Ux z%{Io~K1F*+sqxW&-2LTpa78(o>XqWMZMJsx%jLo=g!>?&{J3l%FWZ>~e&c_vcNVeP ze6QT{BZB-V9@uygY9GRSW4R%0>}_o6&Qxu7$^mI_doBjMMf<$2$U4w%rn#iv zTI*Z2`lO3cEO~3jfWLi3na?ZtDKszWswIA-(It0T6YLv-e-faKZ@5uoID+x^RFu^! zu^M~DEjemEt~j%VsM9#Hb(V>>Y4t^l`9M@k!Tzs?ejKrR42eVl^u@5*%ckss(A3u# z@Kcc2W{j(lE0|@Dm)l%Dew%5l<~i|W3R~bo&M^dc!c5tXa0X$Cc({orDB!wmFIHuC zmtOgs`W$-#w_O2AOfu>34H8}i?Z*TuNNAxMosVMHl<1T3G0rD&KVTvuya*a5KT#pq zrz+$TqQosu&Mi4{3#C|qSq-RkM|*b#%@8#%g-S0She|J?^hp%tJhaT7x~6#-YEKE1 z+XNm{&D)A-mvK4Jt=>C2Ws<{=)G!x z0yoA1v!?ys6^UBY@%wrXtE-frMioqS$`P~F^|3}ITIv_5h5>3}*z}-~a_0@)xxzMW zWYCHC;m#A;<`dCFAOeKMP?#WtV3a#gwO^pBJf(Q4YCl_58?d9SFpIhKWNzf_!#yXW zlYv}osigZ2Axl%8wJ=j3YaTxM5;5f-w-xKVR5RKZ8jWV3B+2@N^q`1c&OEl zHT>3%E%+lqj4A7RYGj%dKdGFrV|-8ByFtB+K9eAW+8`X8Xv6?a#wfwr`pyGbi6p~p zkBh7#3aBjgGH?vzx4mmpcl$Ow_Lz+@d*_^2 zDBO?Oeud=td+j=ZWpJJCS`2T5`CzWe`8giF@C4jZ=Ci2R*qpQAI}+7dW1;E8o}XA$ z+kv<5msln@O+PVoUUTzZT#@-W<|k~v znY)zpkeLmQZ22nJT#24zFLv!^@+melGdWXN|34#fZS>KVguV28hp4^f<%XHVMW8|& z<9u%QxHJK3&eu@e_Ppt`~>(Qye!mQKX(hibT<~F83*bp7m<7}8Tnrl`XB%{-86Cy zDu!Vx>NLGZ9|KuoN8m%bxE|KN8dQ@LRn~`|-~y-z(JJY1eOQePmI4Vz?|0ZavFTr~ zovZCKlfem}r+KaIKn!2$!PcG5uYXa}CQ=&>w8MxQAYNTe8k=UJeq5&571?qpQqgC` zJ-H7%kDwkvsHbB*5JN%mDf0LfVJYG!=R&(4F&;{pc-;K{M&0~As2AY>NG;uwi+1Fk z0c7#RJZJq)qCte~$h~(c)!Gf*LuH#t7W0~$*rc2Ii^_I;_&J9%tnJBT3r0E{OR zJLB1}CY6V(D$^z)*vmo3icCdI8etT+#NQ+4n*;Kj7&yxsU%tnRUyPuaqC)?91t zb=GdN_Ht`4^zs)W@OT$vK8w@tKC!gfE?XM!F9 z+Zjd85@6ITu|J>FhP1VF2*zBF0abzr0NuIhy@WEiT1xg!PrCi4vlU@WW;hvHF(O8h z5$0zmIs)9izrfDiDn%5o z6B#Dro+y${(Win%Nk2VN(o0)pIIky<#Xin%uOB(I`wC;uqWv9<~J`A;e8`8g8ffg7*9 zt(Q9H3kr(~@@M8UMIS#)Wg9XKa+jXint_e^5`Q1G*nD%)2p}y+=qlAR;qR>bhSfi| z(lK9${*-(%5Zo2~OwfpuiyVfL&qaRi#+Tv!H?3D6C9lxQK-wX!=7YT&m<32C;n|&T zq2gm&Yr>9^?RQ7B=NOla7w17VfFb8x6U>B_4YuUM%!<1-9l1Ltfr(LF`V34+r=iGx zK%uxg&h5(Fga4IW0oI@C9b&5yp(D^MdOjEKgNOFF24{ss?kkt2gm!fC`}J4=XbtWK zunu9@ZuNOOxKvm!{KbH=$n zAYnK3tgq_l;o&nEy3XCfFw$|Pa4nmS?x5}?&jcM@Y<|}WPV&Zj*Pjcu#3a~#fHL#5 zAeev1^c-*clgzA@6X|>OwzMMia3{{sdP${5&|WNc9tvjQbp!cpT1@Q*-`?n(Px3lddt(tar1xtE{ad zt8&65*8DH>nxYq?3j#A|TA0soVz7v?|1Xuo-li$+f)klIKUArezp63sjfwmNTH0o# z-Kgm@M*ZKZqPI<9RI8z=*3~PXj+j{A4o+1qTJ2t*XJbs6oHj<#2@#to3DJ%WUtjSA z$u016atlz~M=>E>={he$;0TmLHQ!r*o_8Nzu7DR1G0fOTLD^u0HEl6j+c*-JGZk`) zVKrZ5% zs7g*tI7VL$yXlk|x>zV0MRt_RzF4}db(|&jg<^p$6pbu(-C9KIP3O7PWFuRRttt6r z;rkNK=5PvLeNrRpVV;WFlN`laP&qbk4zu7~vjxALsRBtXXNf>7HxpOn!J`>90XU3J z(_no8{B7MhdZPI|gwA45Bz>R$i_5b|cd8NOfetLIk225ej&G^j(`xvzAwBdfJ%(|yWjf~aS^99u7)gFo!!UHT!Rc%Y zJxP{oXCO_w4tOc*oYWDJ8P=?li#0HKmNJ17WZjzlI@m#syrU0u%wg#X!!#Br3~)lX zoUo*0-gsi!{jp0{C1+_x_?$bD7JH?V?^GuqxQUxd7RPik?*NzDMGrFv-tJ{@^X%=O zP4*qPdH&sA*OxsypEMuxLz0yEW7xonbGICx#@aPQoy+3#ueak_pH(Lg%Cp9pC(>uN z@vL6Vgl6n^FTcmL+LCAWe%V`=J_`#qh(UTAP8Bk^SPoA!U4SIlF(m%wZoK%ij(t0M z67koDEvdX!3@C1~KXr2?b+h{2tH>V<^n|&K%pe$byAwUHsm*W2AJ&wc6fSZX7t5@N z;65bnPz&51VSk#MhTf8-fLKpUaQV~doOPkA=`Qm}z1^t0Ol3PsWzCTwxS!L`kJNj# zn$Z?#heopp;d*cOCTC~%(TxQX^{5bS-c=Xz&Q|6>bQh;g)_Y|*VHTc>zcZ5^NuVS* zLaO_O2$r4X95Nrq|3~;WuKO$lwpAC;Q{{^k#x*6FhNR_htKar;LpC>3eI(wGNuYby zsl}2|tgMd0J0r5uX8oLbTdB=@^lboo=6=Cv%twI2Tewx%ur5FYf#JrrIpA+l>mY7h z%mgfm?YPa7x_eM%9|6mrdram36Ks)iM+Y|Qq>0+_fp~5!-q2#c*ws)^O>~iHEIT!N z9#wmxGLI<}u(0YZ+vse@1{$dP z;x@<{T1%4;qd=rTEPI#padH#OKV#0x?{b#4J0}S4WZ_{8aI&994%f8Ly^FF?&nv+q z_DKi&0Oush=)HV{v%Z8-3{!17vPpC$m@to7{5b2JY~{=Y^K{YUosXBO4)QJ8I`$_{ z4B71>X30e*NkJZOdRA50PHUQVG%}Q85Z{{Ff_W( zx3qINHRm3mJbQgaB62ICFy*5v@2+m>WypbOv2_-RsZ8uM)X|8g z$s->Uni0X$Y*i1X&uU5}UowY0D(`uE@~o33AH_7h)BQUBP}9b`sw@wihdwJVXat~> z34iG`8BwHbW|@14%&PKM=!8uO(=v{Kk&ffa^ZF)0V3!SMI>ZgO5F2;ST}tH$s$*VF#4q$Hv&%ncSgY5>yyVuhTS_xz$N2Gz)!-ylh_i)2pHY3 zI@>$yM!>AsnHT{{zd|yQe=-36ylw#e0Jl6~+yFR_js=oOn1aOs7#-t8Fb8&sWHEXK zwxa2Yy-1IS#AZjYDn|@<*c|}_78&{f_9>!Z5D&wz_`Kg5O>rpcA^1p zKHS;ULG|pz*NJS2VQelF>-*Wd060Z|QFY@O9M3pQC97mnXAk7yF*8ZeI4Tj!~| zcytOpA~ndi-T^X=VCk4H)5G5RK_@yD%h;*uB+{oOZRP}-6B^Ar#KNuax78L`ZFN7C z?4P#D$Mxy4p)HsPxXPw@lzJjeRT7Uey zVJ8M#L7PPC5a$twQqv-DVSaA3u-^s!B-83ihz+c`%NZtF)_smP;k;}zOT|n!ex>-^ zE>>q^bY93Yq%(EA^DL!mTH!5k+BaH0Mcl12Ua)K=zTKngQF1#D_nTR6kMNoN<5G=B z_7ao$ZNg;#Eq{kv?Zgjdorj2K5D#yl21-qZzV zNv21YS(QtmRV2bfULPt#=~>2Dt37nxNhBX7TbAAzIVGzX?d>kf=^-o=m8I@JB~0|L zOG*?7BHjJ)$LWD-?q1$pJBMf)-Fm2d7)CCl%}`zRIyY}KIn?ovuxEAprazVS;6x^- zEGp$pB0pY`1JJ(e6|9CsRE{vI2GB^nKRMou2vrl()dOVJeN>@HQM?r>$V;#n_nE2Y zDAx3!U__60sBoFfV+Kejah8h%^z&l*d_leDJ}-nd4bL;%#}`7%=1(Rk#(ea0?AH&t zL-5bzCNGdad4@aSV!gwFNCrvki-2<~Bv<77hzR(q#mqUMR$slhFs}qaspv$j0q2-0c`j?dW!(i1EwD zxf($^YdRSxHkyT9A{#A1+R3nzn7&|mF<6&&^kPU++-MLEPHdM<3L@5>D~VM5>7>U{ z-^@qJyuFaAnSltm>!>#>V8=n)b{ig=i?p*7;SyYhX3k1dc8NP&7;nkT^~Rn*F*K5& z?5HQ^jA+wACt`QsqMWx(4;pdu+FBo;uG%wzLnaDSkJ(7$ZN{&E=0skMs7~9jSL2ZE z7O;nmnZsG;X3=Np7QDy8L;+uWvM!QmzSAj~I zSF3o#3(2{$EcRdhtS2s`X%MFy%PIWnPeG@{3WeEW~69L|rb;ZR|i zIkg89_$A(axEJgf%>fUXk^HR3m^`zOn<((lvg*(rv6O{pZSb}U|6~Xeof-6+ly~cjcY$mT%;r{e6cep|gf89j)nF(U5z?U8>mqdJ| zZH*^liSZt#$5xGcYLD}~ZU?Smh!)K}XUpHVHZ%KaTYcM<_isFx_Ho^w$lh)29j2Dc zJYX`?uccByn@zj&Ddro>y+pwceX4(AG~0ez1s}?MMlsK?&^uI-vnOCJ*qU{mHE?zw zYr5Q`M*;v6<+7N1{pQ2r5yY}~C>kxhnWXSq#UnX5R59LO@jlgTue z@!~9RU{FZ?T?R$4stA41-n9bE$mVG< znFYR4pQ+X`W=6&SBM9?nnP-^zccv46m`wkRl6@iBPkNrp{*0$K{kn$i zU}yvwMN|hMQE7Mav4(m4@deu#)ZpUE+5}iNo#WPqjpTLhftH|?tNMag3k!8b2w<=L z${JD31i4!79e4}|-(-$p1)g|*!q6u)u}q35s6@r#(#?l(#Cf2xzheh-8$ z%h%!0BV5N%L3`m3VHx&W#=@w~>KOF8ZCLS!sHh%r`po}SG{G25YTedrG93UDp-n(` z0!g4J(v!sO%ZdP-0?Ec1XAPJig<8RS6(31#axNBMxbM0^YsGeMWoxNdc#JPBs}4i! zd$<0p;BAEGlGGs6&=%df5WDiDR5jqpq^h44o7^__6N4>#8*csUQP(P8!5)w7S5R-b z&U*=Pgom->=7|=aMQ%01<$VOHxFTzUvTaz^hg~os*w)d;;LrM_wf`f1Hn4Bl!XFUH zsBj9Fr$?pV#t6pE>JbvE;1(&*GX2oIHtFd_7M*IfvB}T)@sy7A9hP9}AYFej1B}=12jO||LO&BA+E(=dA}&6eD5I}s9s@rLDq~(5nGDaY1 z3@35(&FVb@Dl5wFD4`+r&YUSs6VA#MbDc%PB>dT)9E##E>REc(+Z3qNB|=tqArTq*aGqe(W}vYW-PP9U~6@ z5T49`e#dLcro;w`4paA0`Ln8mQIs^Y|b(w_8l=}EJ(Hcm;MQ3vWn3G?YB z*aEiGPH|gxV**~wT=OZJp(TB`TK!p43$8wL6|8h$GtOmpfM5elwc?XP+v%P9q<-nqF~#x0wUbJ*zHMH)N;_KVx@=YIoSU3kys2w`7DQox^bK zSKLC_BmFiI=JDQAPb=Ru3D$OXkgJwDY@t{v_pnUsVJy}yLARcv=N#ZJ&tWNVJb;x{ z6f;So`napkL^)0t+n1C%ih10uCM*~f9A^zuFp>@G>TbPemsY!VIoUrIBp(Ow(tA18 zJ5{lz)Ls0HDm4^yq{!G87M+il#)_*-GmBH8nj-!-D89c`E*@Ok%lUyfM!k}|z>@_J zDma8O7!88bcdXjKxIFx(wYj!?Y%h|3!?@)Cx@D@k)aEYY)4$X*6N7IQ>3_l{HoDk; z^fEhksa-{o62bw(^C#0YPz1IS5Yu?6y+Wx(V@Qu&XqTO*T0ZBMukmbV&a%qAA|r`7 z{|%$oqm-`EzjIS*YMaJ!xyEiFQy%^Mbx96+Ek3f`Fyzi~bqj)f%wYK67GNqNs8&;H zWGw8~eP)ww2y)P`O61i9w4{%QWAUooOxkNS-$BVez++GiE%RE+e6!6+}l- zylzVsucw3{Z?k)x=v~zpiTlFEj+u)%aA&R6pU{^Ze@HJo{y@ynp#u zUf4x%mRA0GChhB2EAv4z$Mn1BYB(Pbv`3mT0$C4qPmV^zW1_|3aQ3(imx$)}DuB}$ zg|SFNfSD878tb1q{ORasbUn$j(87A2F$c$-bQIpGeuiPJLJ-Uj3&kHqhXgD@IyWQpGz| zY2V^fhFqo8M$?DIL7HupZ5EAPnU!wm8W5ChJSeGu?X2#3;KUkXy8@G}};%FNythvImjeKuw0BtB~bRu z>d<7m`%p5&U8s|f^StEauw9xJ;%-&EOO?)5#YNOE3ATHS8>woKQ5P`IY-uv1FoIw& zss9W^vETW0I298Xa%n;PZL_*Zg2qB;>9c{_zi`mRJ#8F!kwB4Iy%zKp;15dFMMguY z+jd9=j@vw5^`jsA5_3uHhrE1taU6M_s1;H~lg>@(r~k01QaH?Y`z zB4E|h&A&-+1$dJQ^bJ4ywZGv!)%K^L{6A9tZv~mZ2SdAqa0+XYG{6qYd&pY#VFKKM zx~%e_QqgREQ055lz4l|6I7afLBt_xmVdS6J6zGz_dJZl%+M=K)nGf4@r4cZ0U^m#T z{9Y^_#2IJG=mZ5;Cc(~4W?=NH3Hhk7!L-#IBNLb1Mp9z`?BCVgFaEXWHi!R5&210% zsJS~Km8TT91bfun_x@3H-%o4qnZWxd6Hf3%5Ih^0X9D~EwB{a6ZBbf|G>RgsYIV@kVV;3>Xse<6>1xW5ZG*G#ZZwV-2grU;z^( z$k(-+m?t?XWXN~R%f6siC))fO$^M9BKUY!)RBv{j*K&Pg{vd6{7OZ4?LewI0O^L8R zDs;EEsY0dqYL&>iUsHKtNJj~q8c4mv^GE1;L|+xx0kc!tY0)^s|G%MskRJYZ@Nv|| zQ&fB(sh;VQ@)cMW-c7+9O-sU_remKc?8$V>9zyhDwkyZ7{Z6UZB;}oz><5xke_K1} z63bQ($2w5&7tMR8%m*c*Sncl=uqBEq8=+WrJ>!%0vJt^P=-L z!8IKsLd2WyQfOp8af;PHE9ViSVs)YRL@xSjF3-G-JMjKo^hgdZ`H5UXK8sYnKOTNb zz-m$*Cz475lT+#?hzKSZvj&(FHaf3b|1a-6F?r|a=kfDZ@4=b-k9USu=vIk+d*`+9 zu7{vu<$;bm7}&m}EeNY|E#? zXULeJjqMe&`ai1 z_C0^8Og$_A&g@;VZ^vDm^U>S!X=mrvIq45bfN$k_`nxX3w_f;15_5cU*&M$GyG2?p-Dk-JX0m&?OEkwMLjc` zrieJ2=pLUP(aWIyk&7naKHZgb955$=+QeLn1ve4@CYcZUg07iOx~}DXp2>C++XBSE z4yZc2Py|j3SsAkhhw*h)KMCr!*o#X5HFS?qJKT~1pGo#Va+8nZE~R&?IQgEQlq z6>SE3L|ruHay~5f7F*gg4Mf%vu}4f@$(vcUZx(vDj^EGPdMw=si@}s&s$}c2Q-USv z=wB|`XG;=A=RQ+ve6bYjjsv5E@VrWzy!xFxG5{~8)T@41op$(9MV8EFK^zkAw1J$V z`a-S#Tf>wi)7pU97uc9N-Mt!s!OujE0TkZrK483F`zy>S<5kD%{-HXirLtY%znRWA&5HE&_acSBxiJUdY{`OD>o(^w>&`-JUcuF)9~sGvf)$;R?IIL+IMe5t z2`jr+xGMuaVO3p@8OGXU>o8WJq7!(1ewl!f>0*GR4ApJ!&F=NC+UDMxOFk~Q*CVe6 z-vJld@U0xXKgzd{IbT)7LFgB%*}~*=RB*0nY8CH%6(8fik1*3uD0}9Jp79C1xENsD z?E7%wK%JE_op$zMH%!mZDDy0G0nQEF4ukmDTyHGMkzT~kHDj!!weUVH|D?+S-i%W# zn53s)1lAyE!=rK*^KeisfTzejpzMRmuhahBuMa8v@W1=@Zk1n!f;9P^ZOr!O)|j;o z-&Xm{MOGTtnP-*#HrI~msjsQr-gZgwvE(JV@2t;dtO*MU9o13)v8;c{?K?x2M zD)g)dmiltZaS**_F^uUok^$;ykP5?UC6gclri(Dpzuz_!(sKZQqoZN&=NtCKC zYPdR^XKA0!c8qY?x+m25Vk`U zpNnd$rV6%J?P$=|W`e*&E}4QQi9XuIT;1oqXqw)1f#639zAuz9>D4$!rixFbQFi;E z+2aJ=1#A(mw&g0=f=u^UjJnqt((2uY53DRs0iaq#2bT_s^WF05Wfr}%%hztLl)xho z_ewDL5^_2S#_Z#4S+;@$Hy#Nc%3NOc8p#-lw?#EzmFa@)k=}tLJ(nqv8A%Y!;G5oq z{1vXFG@n+^Wlfa~68`qXSl%o@gHKuFKxEJg)B*4+dwIZM@SQ%8u`Xe*f5 zh2zMS_oU0^bWtWm&h9ZMIai8=>Nt7hQ;4nl9J@uL%AeI+0GXJZ1Lya40@nSS2Z|$$ z0oR)8U`rakW^Lzpv&6KqkxmJRK@G%Zz=m&-4n5H;&+Nqm15yli%NCaFS!O>s$mLsb zTZ$O83Vake{{hy7ZV7tspa=Hq8-;2O#yBa`3XN6|GL}3hpH^yy$%iYVOF_D(@R3fv zLrT0`|28$5{N7DWCUbU?K)@V(#?;fJGfqDJgfo_%KKYE%(>wSK&akKF&hSpRXWXVv zFP|~_^e*QLe}cedvL)?5XffM>gGa^nC$oB|(!^L~|n zh+ZmkAVKES^zpVuQZfSkf~zGnN;WxKTre`{GeX>N;Nm@&)-9+mw1Sh>3FNq&jFn>~ z>%fK$+(evkF>JBD_OPHWC(gXGY6!cebAOo5T_z&(UVkxhzk3U@jr8hE>RQh_ zGgDUUSg3S$SP4 z5!9rT)Ukm+3o|dDRixX+9Bbw~u`rV$Oljbsq~;EQFz+6hx4>?^#Jeg1KnjWP{dAs} zzyc^NZi*txD}4(DLQE)wsU4PGce}B5qCAl+!7nu1?;~y23#xKENQx9Xu2k%omoqq zZ3LK==>ZdXfXuSZ<7tL)3MNLggK!N8OsuRnHGpJGmE7V5wJ2%3FWNoYbH_XFIqZBj z7}B9MVFLnYvmn3HX2k8K=IS*xV<%R#Y5Iwz8KZK!)B^C=>t=D123(Oe;Nr^@n%!*3T7zMhZ@p9r5DemZ*eg>sED%66HOrO$Xnfn9eGi*KP}n+ zGTh@(`oo_4_awg_oa}GV$;az_FnAE!+SQdpe|2S!+Ii7pbKHmCf{9SCth8MiwqFvC zFo*!~pg;A31zcB(;-2^DKo_b%Dy%&_aN66bLMtl5GPnG1RuWyg0Ww zfQEXnSGXzLj&OuxBN78eZ&jA4Hsp3V-UZ^aR|9P@+S43ljfD_wd`C?^=Q1~RV z{v^-6Oj&{}E>jYP7H04k$UYR(RVuvdqL{5K+XB3#h+rpSIi zDzM)tT1tF@YGkBqeQ>sEQm((bv*kSFzfMG3G?tm6d!k+~pOXv4DY`IHxK6dt&d>3^ z>ALWFXu~~Kxx@q)o9Ge-e*_j2YKxLP*B+1LDgE;m5BUO9@N~U|YG~k}eMJOxocEbE z>Im}z_ubxZrQhxE9fg_eRNRpJa6DNr)FVZ%2QchjgGBddfL#LlM@lb<7VG<0X)*>& zPTmhnpK0kRIS=H>?k-{CG9PuOQ%WPAcaBs{58dDq^?f(7rA$foA9gRuIj`pkgz#vAg8FqP_-)4ClR;)7W}F-zo_D^N{bpAGCS!MJ z<{66Ky~@iXo=|7d#t|I+G}#{zt2{FM-G^5<$s~Ir2Bo{+WV|! z@7k|e`&CN^B;$9q6g5{m*vAmm3Z%<|4sSjRi_qrM`++S-ydTr-LcUBgH!FRp-rM)1 zi9By&*pOY5Nm9D?y8o-q(L{zzKg6?2#egQpSCeJ3w(3D{S13VzNCY= zA>V~%uH|CSzY;I;%>KxXWeyLg?m&Ft?JxI&PkPbiUZeit(z@OUw4+}WD<`kogSRAI zWWT3OH{o89yH9W;v4O3ml5X`IvNPQiWI3K;PIDi1pn_sdRm1$FVA88w zb1Mr7fgC)UzW<$SoHGmcf zUxF<3sGz2Rds%{hwH_mVbRb!&NSs1CS#T&!ZoU?mED`tCPR8zpF#mi!?S;7daNNEv zZrL7Zo{q^jo%WD<*ha?K&Xz!k?R8ycDp>bZ+*zc%UL8yYZ&(vquLf$LlxDL@S35R3q)o$hl{4M^J)E-8QnJMta3=Ks%94^iq* z{d1|W9WV9hc&WeTCPulmG^T@6fA{}?X?~G!-#Zq0>( zb7gVBWTsZ8V6GW+VXq{S_cS}LFeb=~(`F!j&B=|pQx{IbMBV2CA0j&w%QWDy-j?z6 z*F?e#Hy~G>+7AKAoLq-Xz7x7qEhy0|A;8IF2VuI416Bm`#X=oSD79B4SR&{q3&7;e zC@|dFb%kuFNY8f)Meewh5WnCURptWWA*H->&xXc5^l+?mh2%b8!V2X55^FHrRL(Re z0T)rkW#aZ2v;|2V-~%9W(We%8E$I(_ge+vebE$ZUBwcSWvIJ=RJE7{&poEJBeJ69( z4#70;B%pwgTC$(I1Chr(qc(;c?8c4_FR6_q8wNL$oMU6>hN|;wQI;nkn?w{GDd_!s z^5IQ+do2l=%6H~lkRf{zGxyWo7Z*n^D;AoX{!p-&2zlFA@>yHCF<VA}R!gpWdPh0#k&}XrR;&5w(q$)@QT}G(Glk zexXEjp&U9%A8s4T4wy_~-R^~2;$!DBw_l)9;HEiml!UVz>QE7>?B&ret9ILgU3QLR z&T?U`TFD5z(08_$XEL(}V5Lvf!OGGKeS{Z!MLRcMnU8XZ4(GB}&yOE0)}Ac7OE|JO zUMn4xY)4onqxBTzk1v+m-+)2W4gCd{cD2FY0Nf5_TN5wHEyf+l%33g!N*rq< z=t6(6lq>p6^-5GBZsbvSM)zTynZSlKA0nspleh$1ZVMW6gL6`;i8SI(`VPaib1@b+ zs9~ls{09)BW=Opptj|QGA~^Z|HVF1t@Qr>(0oGh%r<(h<>CSPJL1>+yVzoNU#oV=$ zd6YU3Aom~C7FnwrlYO|y_q@a}ub)H5U2cqY0j%tL;gs%4 z_M6@0qb=E=4|g;LnFqSE97T*JxCS9y2}-C~){jxvfn0}gY3H~x2zbbg9v5dvpL6}s zxatbiyu;1r8Ys04xAT?T8%;&o-}eHybe3z+cI|oCq`kAf+AiyVSf9`b6OC#2E>P1b zxLC+mG7wszdSA%<3CeFVpC7?l`aV8O;7!*ipUw2BME74zHiRm&>K#DX=;_1Ji^@L> zsJqya3hw`+hRkCoD0|6U0Jr#|j!LXSHjLw1j-1mO-s0;pD8u)-#Z8 z{6?)qoLDi|27h(qjLBmY*{UzVT z^|1CsyJh43C+YUJWABQb&AQ_(RXbY^-=W%nYr219+IO4o$4vX(iP0Gtv`gAfhm14cGm_w>^SK;y1Ft#&@ZiEnj(igdS)U5q6dBllv*5%~a-1VOpPe5SK2gX9`yqU^CSafS=6A39i!v4Dx;{P{M3&E1W$55bEYouqn5h8@lbvRZ&H3l z!w2PF>DM)x{A~zW+TQ4xn%bd?Wn+I@=Pv!M*#}Xha5!;5XxmF*h|z4 zR1-HT&FrK!x?di<(ylnfG5uKOzO7yOGVUQVI%%i*X*nmdz9i**4~3QIv#{VDk2D~3zT3x(&0 z&nt7k_*kU0hU6-`yqZ9Z$P8Bdq^Vv|<}ldPi`55d8meQ8?2O`EUA59!d!C*B=d(jI zU7Bl;v(tOK^?QF)(i|VmI#9p&==iX61b6gbJx$&TQQ*>WM4?qvtE!KK&zfg6}CH%?A^i3Q-Y!{LpWN z6`DL5uT#OXAD7DN6C~tJY%`;4MlcL+aDKo=pasU~tWos&VlrnrEqZ@>h#B3FXY6#@ zg>0uf=1%KejUmjERvJJ!Z1N>oRG>>CUX}n-vp=?jZvI*lEeOmU$q3tYC(#U&AF!zd zu?tBC{jv~Ej@sc@mbjTR!koq9NSJ@}Ckz^R#7-4S{0dA>g#5gMbAVn$FwxmARD>uM zy5TnE-ma=&RQgWU&#a|M4{B$mFOAHVq=o@yHj!Ydyc`$Mnvfk%V``-CxkJCYT-3_l zYI!2vzJ(hJA$Lx)e<=MYg)meTx%Up=+2(el!35a`zqF*g!R>atfbDmcO*q4y6A^*g zYQR@R0Ue@$cVgcK=FhWE0EgCO^D%LH%t*u>={N_nMP()u2IQv9&t%jhnj-`BB#%k? zKo2H_?r4zM8@~t&CLTw8{Yj%6{X%v}r#32p?+58q@kXx>k1_-LBc_~+x8!6~CH*4d z!T$*QYDqNOziMZ*so|wVE%kr9$$CPPD3>k zY3^79t=bILnk>%HT}#~#x&I@XZiwm>4*8CH4U3Pqm0ZNm?Z{XorkB3AehezW$FVm} z9=Gw#MMk8JHrr36qz` zUpA1n*m0)Q0uncHy9jJ|>9a6<6BYkklYBhuCLdo<50XuupN`zFS3BljgInwv1mTys zojsN>KXRR?{V{s*tU?ZJZS{pCts+m7TxPv8c5=P!Ga+UqJs#2(#U5mt%> zh(UIbjiXGlZqeneO8Z&DLis0SYIaU;6^R6v+5LODpFPV4uVEksIelEX0kCzmJ2B`a zYewWw(NoYiaTT9ukITU!84#8HLS!--7#|lk4Ld zowkE)5dR-(?*VT`b@un@0opO)~s3c ztf%~*-y^MeEcaKaq+Fxh8xF8873E~rm;G+ilu6!6koQOU19vYzHQaVsvt_%SNKnOw z>T!r3fptSqtC7YVw7bTxVn8f-z(RwZJ|EB5)i&(g)kndJFYCy<(vXQI4|=dQaN^KR;xmGVB8LX``%`{1X>W7)T}d%_#c=hZ`HG8 z|9*A-nfOjYIVA*0)e3dWU7}~Y+#>u(M9$0I&F-j4vzUNSVb;X=I$k5=8g&Y4Z*0^X zgyJVZoCIMumFHs5&n%#c?f9(lj=httb?bLnml@#0%|axkh)h&iZVn$s_}byB!<$CLv=XCJ~vO+uD*fMx{uq> z8hvI@51$bCZkOsuSsZ#d{)L{8mz(Qxb*a_^7ZL&PW)b3MvH$+Y3g&+GH*mhToiK^P zz~rFAB!m7btiOrwzYFVqA;#C(%TfDH5+60vg)E&!PXu(8#Hh%Mnh5dE0C_<`xOJnj zIILM^Z!$5+yfO?=R4onoX7 zp!;PEX6XlC)`9jMIYSFu-MpuHf}>Fnm~QyJX8#$ELZ$Nu+Ohbh*xkS=c~y=#RMmdr zzO^uaS6wE<%Qb0WFJ2M!?<(3{YkV5F@-mUUQkXcgt`zQN!ltgLZYxaby0LKM#;si` ztc!$yp=iHo=N>Zw+Vv7(^>Le*nB$FQELWS+y+?F+gipYzx<3>4WARxZj?enY&T~8{ ztoww2uV}w-=N>ZwGW?P6&w3YU+|2S!eAf3x@*`oAM@vlSePO>BpY@&itncnT$97@8 zA^g`x`x`s=n2FbgeE0jazQP&*$O8A&pj4}&4l({tWzT9cg1HMi#n@6&|{!4&;20#06ASh_mR6i?=(C%V099d5eB;-;np zT$?1rdpe1zEv6($`N?7CQ^S(~@pJ#^VoH6=_aFA%N4nJgU8K)%l;%xR{#^QZbjsU1 z{RavZKzHsVV$e&a??Gh_-|#@lOJ^XPj+G+$kcD5|9^}`Ufu!M z{h$ds@?jGivy=L$DfwYj^3$fo`%RFR#K(M&ecI%I(&T^Cl=`qqe%cg%(lpR+m-X*9 z^?$!9^+8kce$&ZTiC_b@9h;c^I5YMC&?7EETwssR+U!m6O(l09Jcirsxu z9u<4TI@AO}w+zNs2IGy^e(^}{hzDQ`;Eon!qlH-pfb17BfXvs(vAgUp*{)`y&s58H zdzM|B@U^d3_ue!VgTr}sPeUeJhA|C_u;b+s5F&6~(=h)At=FG5o&2O6dEII`)fnu0 zLQUBI`XxCmZrAQw@t{B=_|)zNahx`pqkpO9ieB8}UTUg7 z`=K-IjBhE~qS>o^LHW(OYgHdv(K@ttJpahJ3JT>Pj^4+&)}0wx!{bx+MG0t$=96X2 zCwO0Dzw6A^q_n6zP2)Ld0C70&4>yrEgb|?KAw`}!+RK<^OpK?thwseVSy%+Vw=PVj zdU<4=#JnfQ>JhRV98o_~x=C5qrM)oMw4e3L*tLqE6~^PmBCHB7ruJTn>SX_Rrn?!Z z59}m0m?<4!_yB%ojO$KvyCR4 zcs{c$af6t&{bE7DQkOmh*Z2njjQ}pbl*U?jH%c9l3@mG~{Un9ZP?Z&~n22{)U!aQf z??b$eccnzc8{w)MaXYjcwYzNbbTI?!M#SO!wPK4PN1|$rjQ#N_f0K$+oU40F#-TWzB4e6uXW zB@pD5_UakXl#25}=G22mjIMC9ngNoluX~0*`x=2Jcsl9IxU!0i)splMQ!G}8??A$< z6|&TzV}EecTcv6APZ5cx_b_Y{U*JP^0)3{w}>W%!6|J`5BL zcei8RZTw11t=j(1}E8mV19j{RiRz z^MJN6K`=69Srbs~LX0@3QL7h%B*CPCUraV=z=3H(eW*Rj7U`!hBg979X!t60K@2+` z%lAxxt$-+rku^bJNOnFvVtBx1Bi=eUFiEer$mn&GeRRA(!O5x5Bk+d}qu&a*nbobb zuI56~3+%407paSpF>`A z41g3kiX7UrukqXOucA+Pjy~OA;#1w}xodYl)%o9_YWNSQS|6RtjZU?Myx+LNS0|&! zJm|UC_MG9N?~na9KDNbkH})L+==)@i z@R(PR(H*&`Bo=-HitE0*qvsKiXK$0*NYkJ^W)ubj+I4+YKxi=fZuWDO^wE z`_rC72)6XA9!6qG5tVbUyCz5=xO>m}e@X+1XOSY}4?niOHalFVhS=P6wv8~2^->$+-nj69-6@Yd_aHG85|_ak%@gEq42okC{lj7M#MC>&t+r>Vv(UAUDGUPL zT&unRz2VI>KM|_aTpBPa#yzYtXaP%M>=5I|4E5h-GyM-74(uW~hT;J+FuBZdA}Am3 za{#URu+}VP+akx4O{;n_&&4sEsnlvEF@__xlvDUUDN~t9>mQMFjV0Nv4*)-bL8gaA zfsw6IE!vz&_u}~4EMOX}f}Z0I(J|_&CvS=py^cIBYXo71h$NfZQ1eX5QQr?b@2 zaDTdI9@C-oogwp)NXI5Rut1X-#dT7L&UMIq4i@DElvU8r@l+QF&pQd8@9mxdM6Kj> z;2=y7z)^^ASl@7yp&Axj-VPmR9vT<-=r)Y_2rr>d&{W-Ds`@WT<;1KTgeTGMm+6m_ zOyBD`^q4Bc=m%L_t3IrW%bk8L+Uwefj$&%;bG?*`p3_lQMrqa8Gr!(^#Hb``Nky4kbae(cC2eq^2^)ua=lIh8|0GzqsB zuk?Vzq$&(4ZJIy}?r6KDNgM6ZXtik8(1?n2l~B(LZg#v_MAx@aEAe1>A`E@W`voNl zOwz9~QGXkiocL6HDWVAB@MukTGu}r;8qYB)U_ST`-w$!`earh&`5M3!6iQ5USz#Ux&{`#C2|@a+5e#^ zXKo~Lic^gxoT_O+WkkiVO%2#tGbV?^T48Br>A_`aG^GOunOAkBKBj8Tk@`KoK#XlP zNH<2p!=>F%KZR;@wyqW9kDEFcx1=5(Gf7C`H7FytQ@U<|ww31?=%>(k8LtRB^%jx7 zQE(ChD8%ozmas-ljLc(LCNYu^S}o)nF>ke~H|#CcJLWBbwa$mFmQ$t7RC1oZpd6X{ z@bvZ|jwUk8T$J}Vflk=^DY`{ZFF<4H5wKpc&;!Sd^ z^e@Ss6LOx}$A%xCi@*wSAoa)?oNvn)rew2>?=J; z^t-4SkerD?~>QW!LhOy3NZXZuqZT7B|n>?}EJ1bg)Sk+(77t!XPcr!5i zvOYfa`*`2^@i!uY`uD$xH$C5aHqXU7r)~1Mr)#T?Rp#(CPKLBjRD^FtojKJVo&lzu zBM?kTcC~cY%I0E#p&l*IiSR{X{z||@2qv-Kt1~+*gMFD?XdbO=Tv43NFOsv7)Sq0! zR(&b-0d~>mKZaY?V93DgdDfX(Po3GYNwf}v(!i4qI`je3ivaI~Y(OC}y%NQWn2d){@elTiMF+9DChd+Kta5dc*mSY_$p)Z-W+D~fJMiOXx?v4~#bbhJ+F@>0ip z;urjXeBRTr>2U@2OqrCof5dL=4H~|WY)Q2;*yF8si-F*?S={O7o&WsFaOr8R?#lbh++!tw&3=@6o`S0!u?W z6;(C#x;g=nMEWOooG`(#PdAo0(Di6p*B_~XtgC=c++A;a^_(vL|m zfe^Gbh6}}l;wW~VaU%z+^-kPdlMQ>aai9KWDw!zsBB0QK511v;Kj5qsb`S-`vDB}> z(E8FgvBwKKY4osY4Nvtr!(NCFc7gG%(=MH+pjlT@0H>4i)8ZO?!u57l;G5(E>vo8=7Lr#bC=8Fr3w*sHG`8TQF)}xQiX40VP z4vP7rYuUq$$KoH}BD~v(^_VM7^_@fuvUFfn|1iT38S84?-a8w1i19}^XFI%WPw*r{ z0G`XtQrsGBbz(pw&GQ67qQ>pP{|xK-zrXWO-X@c9f_1N6t9wm#p9zxaHQ^Cvy2*5J z-g%m{cixmk_Kbq4&~rjkdpKn{?jo(SKCf4av3(8ur>1c&^&ZlzrGLGYUpTNmf9y<^ z$sLZj%q`v`&5cstBCTl6=#_6uhmP1T&3~Gtp_wO}UoquLbEya~65g%SyiH2hBpQ4p z9XjGvc^s*B{N^^1Io?N#k?@*HY9cWGNSUG9v`+Yfi(a<*-&OXN^j&R_0n|U8>Ytw2!1O9+uwEWq7G_*Qy+jcZSHN3^P4Obm7nx z=x2zLfp^DUT4&h%82|RHCtdN3JLq}W`IYvxSsL(7+*SLJ-!*cfo_dA7sneM z!g!)aL~C2q<=86)kZ5w&cxBo|1G>>(Hqso8xE3XOpmC9po81p!W~4^DIp{iX!u4LQ z3&d)Nmwv-DU-#NR_RP&*&Q9Er%a!ckd*=Pjyv_#+>n1Pd47k-Bcbiw6Dy{P>mw2_? zJ^PKF)K-`v4e|<&d^#09jz=0}~%yQ3|a;0xx;){!+3s5V3|8djYifqZL+%HTs zfzQ7^9#_=Gik$zaqW`h0R%strmyS+hUzxZ8ZK_O~X1ikOfIC8K-PQ#wW zIBkZwRxr)ZF#buOBg8Q4G%=;P+jk&<^s|9QBuo4keA4DqzIcJHddAOYG8X2*7)T!2 zOyc!#hPq2ot8Ip%B^y`~m@3#E8doN)>wIT}FRt^=%WY?sp8AygC*S*s$N-I}s>b2>|a*o9_7u@1lf!nOeinTfTS`K4z0`e3}tjs_0GIG`*5v})**5jge%?`7-VV{iHTB^w3?4mwV`Zd+-ZDs$iXTs{U%_?3= zIJZ{j)`{IO=To)JT_$?}RsbEtsTVvi(ks}TmBD(FCVJ_>leSBqQSoDWQz%lHERFu} z0t-}UkI}#AQvb!2wkMW7?-%cXA8L|}C&zNE*E_j;A{`D0fY;(zden^kO8ID=iPqU2 z7;pAhdMf_4G%ioJgZc~3x2jiIq-mtRRFJMhf`mJiwb;^0tEpTWVrbZFRFYt2FAd(UtWq4r8TIhcac%tH%gKXEDA#&kFb z_9SSOQUWRyX=z1{TlQeb(<0!(AbQc4@a|7C>{Th_>Y(Li$9mN<|KNBlm`L|p=~%1y zZ;N~ZO8d&=E_JN6(RWMDxk8sdnEFn_=9B=vty$Iakybd{4q@i{^z`Mj3T z2S)$lPp;cTAAQT=Kep@t(3x#;DG;8`5QJJpp@}4)X5lI?O>5epBhx??9zdG8KChSI zSP=(yc9UJ0ft;AzS%^Oo7v*dVC^ z%RZgp;#nNIRCrPP zHtgGS>^U4bjej|r11p8MO86`JmkDRE`xIO6L^X-$N5+a5085c=3q^H#4xK8A6(=-eohO=yZS<{^Aezon=>+XI}x#p9ucZah=K!9|s zu4;rp@sR|}%sy;iT!VlQ71cG&GzP#PEW>X)n z+A8Qtq6;Gv<5Cw%9LXCv9R64noIQ?q0JcnGDf-wFgTBA921}EM5H$X|xmrSoGbvh6 zjMjCliCx<}v^=_%5y$-nX37ncxnDT7i8i=DWbmjHNugJr%CFs63N<`OB6=)^v}bRk zYEssp9r+i>kJf{0a&nMUzf+ce)+0*~)40QF_99-cHYDkA9pmm&-y%tmR<)vyRGvr{ zITdPBD2n+!#N@$al;SDvz8E(Ne`k@$5 zv{Wkw2SEkTkyiiUQ>6c;R!junD;!?h;uftBp5w26hGNnI-2}#%eJ>*rT zutwouq5sb?Sf0u(ONE8VooUPGdrBanxb(x=ZkA_i8XJvS`x63sZ|+e+h%k%tFbOj8 zeK+YGOd+^VD9i((1(+jqjF(bn-&Bwq2gROQ)J{V!6Lt*QDgsmep}j8-ME_w{(87(KN8>1NwI^F+d$!lXfRG-}7$X;s!erhjAx^PVUlOcOekMKWi`0}aQ%zLcK?lp> z;QyEB{9AjeDv9$`{N(uGr&}*fPrfMKB;}vH{Cl1q?|wDix-va^Rk}%42X&b`r!jVf zJV7M|d4pty$F-G+Lqrk*6%iz6z3q0SY6sEqvOF%)ON^Ht{@!Z;)MUN2H;J8G5sy<_ z<`V6KJC)^RXOKU|+b8KHQpC8APqk(zXIk?4oK4L7_^Q_G$z|^Eu8ehe!oMe>^=GXI zYRL-ZY?B7G*F@`E!MHOzf31wonJ#o!R9>Ag!$`8yQ$z6dRQ~LjOIP(uQkg!I+Eub2 zfKZRZ!?jh6GCe`8=%LM=q9)@I-OC(m9-z+DRzR1!4(UPx)BO-7{REhO?a00&c4U{< z%e@SHJ*q4QqVf04xSq=gR`3VE<~>q&C@-b8v658|U-R8R`r-4WU!jkE;Fn)d1d%@0 z@M_|}NkX{nw7bsS#jKZGu}?v1hUpNcM%nM zyX;Fvf}adkN9x!=%|Dj7`Xp@qut!xZV>%)py%+U+vkh0SCP}sld2Y-OCOsmQjtjqR z{Kg(hXg3$XjQ2)DbQ(f*@>qWV3YJb*3)1#TkU}>S&|&(e!1YgGX`oQ_VlPtTV}ojU zc`ELi1^eLxOTrLrPegRiG~UftekrYAaiZFnyy>Y@20GObGEm( z&d@53_w znajNyIBx}|Hv{!nz)PRQ`YF-JreW`4e4F$C8YDgr67L7$2LVQ)1;7($9EE|9eIyK) zH#i&2^^Vx!JP~hBh`y|jzdR|UZ%g7$)q3r+8N%ClWRDbhRk)`j7N+O`-#=nOF~~i~ znS!8ba*yT63~R1&Nq&G-U*vq5`#hH>wBi9J!O``vWcj;f?z*fN2mj2q-jbWVG1p{Q z?_ZiTQYS<#4{Fv1kRCj&fAHf~`PMDDDO+<*KMhQf%Z~)|{vdoH@a@Fy$>g}$@;ac)9O$5Mkh;&X<<#E zS%H6?Y0Xc`HHBnal13hS1-vd4V`3_82f%r@mR}8nnx`}kYUNwols=PtH+2emOyAc2 zGy2VCl+PN7f$hy4V%TRI@8!$z08o?@3~w~9cSF0t_d_O=IYy&?7va81Kd5sA4reK| z_$;bV=J-TqsI^b;?{ErlOHn^=4qdE2>uo_R7Fq6*#Ql5$f|$einwGhtLju z6F7@Q`A*(xv>OId2iW_2-t($!5`V~}_&tl`nLJwc5RItEF96k{S%ojU8ZW;|EE4}J zA~Yn;$q6LH!#2Jhgju1BHfiH-bL`Ri0quih2h0!aFj~j_$gB@G?B&XMqR=9pU;ohf z3XN~zR?^X}u(mg+s$}ZnF#km8q5pUgcBT5~lDd9gKdSO2Qz_UXlIB6Nc)7_G`)lP4 zBEY`#bc?+$>OEe%&YnBTqb6uqpoweIfrZyjw1%iEDehJ`est8tONcqq-nr4b_ZG^> z*qa^W0@CHsa8qj}juz78l0Qw;jdZ#HR-n85)0Fi|%3P90=$mgQ%NI}?1wWvF8=y<; zMbFyigvi?KN;#c$b;p<;5&g05sCP93gBI546ti*JtLFot`kw3~W(A@>57(j;2+?lxw72mh9YRz$}T{r<=I3yf8m00ZP;6KATP z!88mw$#ke^AUx_dplCtQO#?va=)g{i45B^Z?Lc1aj=ZpEW@Z6q(f>Gu*fH_=Zqf@H zwRD(-KmZp|&#Whz4%P6vcQ&j_|6lzEhZ&0BkB@&pK{ux=`sKJI(HyviHZ@c?zl|&W5E2OAbh(G) z^gmUpAR3VXdPZ*y(@1nV914mWeVOCyeq z8*#L5w1Z2KDrWQy-ekulBRXpS!kuR>a^`B2>=b?0$fZwg!~2;lpLNYR-tkMfRinhB zZf1DxJf-$f>gs4Awesl8(>Nh8dk_qyB{tBXWB?F&0^Z%Y86PW=5c_kl;WN+t+>@;D z5O~oupLtaGI7?wv6x34Qp~fg8U<2MW8DC@yTN(14ROM^S|H|T#`6tdKUDiHf;E6cg z2cnSdXQ+YS*_Hp;`^CfOKwb>;BtP{tGEynEs4{ zp^OlOiNj@0k*Am)udq%ysr<+}#koAOi`zD_E+M;d+j=)7n9M2&Sckcgh^HBl=I>da zt}(CD$IuI;zqbG<(I;a@u_G@oTn|wP--7|^KdMi4QNrDlkVo(0$~}ru<%x=LobF+= zDRBOSlXZRV%61@ZQt9J4J9<+K(4@G3r8yuPvpF4`+oVTrJa$<_5pat3ytmkJzY3k6 zsvn5{2Trti{PgQ79H-1W{q*ZM*gb~&EyP&i3XC520eTq6<}?o(VBjn*&JyPiT&&3o z^!vJi4hJMNjWNV4*r?+uod4kX{Ecde994XzYk`-<5E!RzT5!8(+WZhFq0m=SaP>!nl#3e$SOh! zph=VQ0fozVkCMb=0x?GCEs8pIjncfl;9XX*E-$oSTCmm@{7VaJZNZB^x34Z(YYP7A zf?87uqtCrBE?Aco{EG|fl7bg~ZeLljRu%k}1+}W+MW5T37pxTpe|bTzCRE83#SEKfIfmtgo~Z4f`zqhKxX`jAAAX(pKFc?Mop1RnAAX+q{+4h4 zJm2zJK1AJnKVSZPzU6QEf?T9B3GMy%Dd8J$kJj52g+nhbjEZmlV+C?;F3X;xg=w`B zy))jP9fPS}QEHt9@hG%kI?tt6&6F>CAkgq{SZL)fB8%U=7DH4=ZW`?tg3F%M?6we# z^}J@k#S00smy<1t%~mo^XbSPpUnVM+vq8Km*K4oZ&p`qYHlA|_<5P0Pek!$lN&90KTmO(dlvqp{Fxu=Et;g(Oc2+N1#*N-=>5p|M<;Kc!_+0Ks zOQF+)SsogN6I_3jJQJwg|Rm`0{#TGHn>8Ouuc>lOO624l7-T)4R7zP+<0p& zvqA(iX-Abo5pBR~&SB(eR>MZRv<65U`CxqK27W2!J5m>cI+ze5B%T1Zv?`_;n7EQz ze9<62)fW94F)Dgx%hCGEnEWskeSt)ZL@Y{BKkN0PkMUxYajcmuIMpfcPf91rlhenL zPWk=KQERa0=A2z`PHn^$!Ob0BTd*n+mqyR#cHRv9f9a|SVrEMipWxo*jT(wA%pK4{ zorKZWMTx&9bpc^@K}NW77&lakZ%Balk8Vf%wDfJYiYL+9%bTs=sZEyHY@HOXe=2s} z43EB4Hd)n%TIvy?o=t4wa*>7^{SuKTJhMqZCZM@8xdaMX7s}|=wT0YI3!a_&dnRbD zt!w!QJ4znCI2)|aUX1z(8lOSYBu)?e@gT~ z0kMeb6dx)10VaNnhvmsY?jLx_kmZs}WA8vRLK#+_adqOA0wv%P$*RC|ILnbN-U(30 z{Mj;oOYVjHS7CiD(tj4z&ZJ834?W@kkt)#PdjwI~&pT5i= z{GULrEm@bAvR9Ro>!7K$c!>xj@>k51mV{s;Hlw2(MyNJR!x)Pus4 z#o-Fg4R-lI#?Grg(d!wrzLENZsrnWG_mZ7>NnihWfqiqye!-V7`MF>FLtYEi#*%eQ zDZHx`-dWNmwTeC0FJ($^1zi8O==#I74$8on-1m^^%E(J`q`oqtE)CgU5V|`kljMFExL@h*mx22kTmPSd`!}}E$ASC4-u@+USBLHz zA{JR$Tph|a;dstBCWEljv+6PxOR)Xba}a-7?5$TnWljY@+J<#TJ?`(9ET2JmMT;v2 z(eiuHFc|52kf(ZSS!7eDVQ`UKDjo&}YD}JP!Z%kBu zLjg?d)4=^EmHjp~kldG~|6bDmQ!;~?{5Ehu2{@SkQ!??CaGw;3kCNiUWc7bPWJQO< zkCWo|ME*&^*8#8b(7kU&sPn;=$@*2oUT2mTOY1689RaX3&)zcAjMjiwS-e0d*K^O28=8W=7`#ZjeZ(|*Ik9dzEk^L&s?+0$G4h;0 z5YG9+-@{uXX%hc8CK7p;n2)BYi6m%YGilbkjBQp8LYIQ_Lhukdly=ek`9$d_XkxzK zr^^Xo(&b559RPoOFSp*dgA(wx>VVv57Lx_~WXDUd6RE?9eQC>o){(s16&8CYZ`o#H z+*pP+*rvJ`!Upm?sz=!0rKxyhfu93SSCeFxLw$9i_DwCdP}d}4N~mpzbPnxoq1i8C9rlLlgUS=^_a{&D6NNN z@St>F72Z5(0(ScO6P|H>HIn;FmHk3_FNv@8*nLOXaPic?)BtM{iX8okA(k;SY+vYJ^B@qI=XaJ&6`{!k{);cpA^%% zu~IsiJd6J_)on_S*Gj3**V?kWN=$3#h`1Mui6nQUV{CU4RwKrCbhN%1#epxayX=}C zeSU{uO)}JLzHwuv%N+#-Xhtr5kUO{LAagD$V@{uJFVFx;I49*&Qq%P)&RY!=8np*U zr_GpQKAY19cUoXRkUG!q9k!ht+D0cc}lrS)Uf|@7(2R*J_D4xY#vrtlO_zmb2h| zj*tu7xmij|C_IK%DVS(ZcEG<=uwI&7YJi<|9Gld5=q_f4F8aK!sZ>vv!)hsTH`Z&! z2|f;Z$suIBLFv$tX|Ng^8~Qa2C1ZSwHMNQomzqq~$`IC()P$nEbP9h_dTv9nQr_(d z+xCdX^urEeS*?IdHIxA8I%(fQaNXl*E94^&lQ;!q-b3OO0axAyY`BXxrm?00s4`7T zFSSIAcb8?~X=U!Q+`IMK`KuDUdG}b>-B#T_F#hFv6vyrqRo@5(Xj9zjeQ;QIs&R5R zd6<44_2fiFNucD6&BHg@Zp)BqIJp8t*pFmi50h zd;JQtYlxbMCpS{U`#|YrVJh`ztIZ~@f9K-~XoXPM36tNQ!Z3MPOSm=SVff!+J-8*! zk0D8omahMwpa07=4(cyqCzI3U6tc$u_j+V)vXZIIEb#f&l<2P;0_TjEKk$b=Q)G7{ zOlA`Kb)xdE?EFSnE-*XKH!ByJT^E{_6=vshv$D$UTxnJ=F}p4{D{IWo)n;X_*?Fm1 zx!ml!%&c5#c3xptt};8YW;Y+})E)>}OiqbM-L9hK|@SJdOH$i_=5NJgPuH+$qBeiHWOG>6n?;Q^xW{KJG5bZj1I@3T3rQ zwe$o$&J-P}#0_ZTjdBVPMCV|3@wq?Mr#vx%S1g)uMiNi?-X9azkxDt zdisIO%)Hjtz@0#YcFIh%5aQ|g&|ffQz6ZJ5Jp#w7_MVPJbP(;(Sa9q-FbP}D7c}|G z21q$k3j~~V?+W^H5+$Ms$~mf7r9wb=)Dy|&`^gqC3e&L~;03Y82ilId{l5ucX9#Nh zLpxLy=HD+MAkY%9n*x=!Og)6)_)k(M`^spd z%uwi|_bMu+y)E+F!P%;7ETgl9XJ1RARWAwoJ=%LnhxE5H6w|U2833l;q(qLBeRLvA zZC=lMx{uC6ML0=}1qoh{H>MG5x;@(VD4U0IwrO&?knnn?BkFnnuZ2Jk`o@7YV~w~D zHxs`7%Se5rwx%%$j}QHj2kM4>img2g*G?PRTVyc&TbOeoEBqbvE_uUpYziG82yn{I z*5D1&t$}6`xHU~Wi^tYLQ@Hg`m;ru)YHJO5_khKMUus&Jhk0O^!L}-V!Bu5(t9%vS zWU*BiwrED3yCo@q6o(Qi_cWA49t^f$QFovQ&;VqLdi5mmkwaos_6{INf;?nixb<;_ z_{1%mtn*nLm?&B+Cc#4PN8i&NI5&xwG{^(xOk_(HTpLBvmmf#BaJ~>{a@|=lDpq)5 zO7f;2ez^xM(oSvSGW@WFGV+wNS%6Rmgs9Pjzx`*(|eIe(Ym zKPy&Cn*XIpCsHy^Mh8oZ99=oc>)WaG@w^cfF7 zqvvLbDZSfN;tD0NROS`RX1!Xa)+lqiqVCTSbErSe?6wA(gEf^?0j|2`qPis1ER$&*oClY%UX!xChNWeaRAkg--N0UxHQO$w)yt+k#O z*0V%cn@J{=)T*uW@Oi@jiFzVci_Q$la4KIqE!N}IGTrqrsh^5|;xD-I6Mxu7Fs7|* zg*{t8_g3|`8@c8PzmO^c@R>Yq6GaHRl_WSB%ezk`$vh0!3W`JLVe_pPH4dG{b2D!+ zSDRvuIbyYm$}~Ieq_)EtrDi`XohJzlx^@eCHymw@=qy>Eqvc`t$Q*BvZcZD0-B%n2 zZq$_ajk0iqlvm28%eazG zdqyS`QnD|S$tWHQslWHQDW5UpcxV;1RPfB}Mhtd6BtB~Ir?Ph24oi3?fkSPng5 zib2)8oOzxk?zhO;Y&A-CAwo79Ki5+wt3;RjZpBJw@x;k0g1i*7kX31!4+6+uiBjTy zWASVJOxm%oL(V5F+CkMy^U%kjc+B~VCk!u;5l7H z`xg90613T!B{e@`v_5JY2lnOy3EbQRWe%5iWW%&9==sW2jO*46B# z4llw1)bHY*Y&f^*wsO_p>NZLF=spDE(mI!}yw$$Z++vHZV8Ejdih%w$C|VDU)^q;X zp6>s(XGFATX?&_fqc8EUk-Pjf{@f7lxjp{rjOfc@yZpnL=ySY||KXP^+I3yrK)6G6 z1AoS5pwYUG&@IE;MS;n}mYvAlCvx|Sn)^iYUUATUqHwRc!CEDnR*Lj0K|RY2V0|0z z6&u-Cw^Gbq!D|z&6knPv#I4Lf)(SCvxkyFp`V}I-T=*-rn6Xy~js`1)w;Ye^Dlvq@ zn5zW;*tkk0R*G?}#DJAz%qlUSwXqoZIF&KfA-+4*9ikT^4YHP?owARYgVc$3w=Gtf zB`IE3so#jqc_Oz&n3_iMxZ?44I-4Bjy0?hJMq#^fPm=TON{Y2J3c;+a!IUmd!r`jF z4c6b(@V3F$pv=grWYafYDqvY$BG9y?Y*oF}0TPgG#D+C8*Jw4Q(lT4)jVkn3qwJC8 zQO6B-MvZO!iH_k{)Mc!gJrX@zYacN; zI6aVspCo=f?krayr=Segul1H{eb!3Rs~vvGkcjC|z@Yx{?}7fA|GY@viT@$8>s|>k zIV6VN9VU4RsOacr@0((+37B<0>ck>Rt=4*IE>0lK66vCk2=H`I340vGdyQ5eTH??z zc}4#qubBLi^^#H$LQIrhsbTgS)4Ez@9~7Bx`(Ji=4k=vLgzV@M(z%_ zPO;xg5zBlHu;4DEm|!(2%Wlr8@r&L;$wJ}=D{LYkM+O^2x*>H7TB)qd%`Gx;tG+ag zXJ`kAx<)`Nj%ZVDKbxxR>?D*Hud#G)(&MX&Hjkq>ZHLNkwNPRO94u{qH+ z4(1U+z!=e1)0oCgbUY1qYz!i3F#*mU7__Z@vvV@18yCnH={{jM*+ZVR4?~CSvEV-H zVcHrAxn+y2x2m&J}OfDWm3xpA_r zim?17(BtV7t*O1J^DB^AU1}N`5@K(r-4y3c&mi*evP?=r`FPqdz=}Us-p{a^@uS$68%@8>?bZ)x=~P;M8(VQ}pr6d^6*34p-Lx&F2ZU z(;m|0FG9Ga$@a~lrTAzmAsK(@W2#7w7>>J|SbEwYm+eQ z1Fp?%{UUN>!4koAeUDzXu&mb~iY!(0#~6b<&S^gTFlu5ihUf5Xb>o0T9^@o}%t1+J``nw1bVUf#|{p8_}Ks{~%kPj85#-7&(~+G*C2KPlE=B zpBFK;GZzSXX7Vh*XpOeob*3Psz)(h2fh|tf0SDHd{vQid)iI1MLLF|_!457bl8Bwr zXyG>XPlZvjuVHl1{f7}DS&SYAC;l+hnt*q- zV)W(BM6}r+|GNB%d6+TyL%Gk>6cO1cIs1Tp3bX%X=DTuJXLZaxxNle2@6CKu?j|{_ zapps^Z%fzP7)Ivd3W;$G?)8-N|QlJW9A;F5B;73bdOO^Vm?K1%OrbFQ8LCzlfU18*!IAKe_(&0flynoM zjg}I9tuV71H%|Cie5}5<1=CV{lpEb)b=?6jXE%{(OE*cj+E5(9ayAQa$2QO{hl_)F&MmSD1G9{0f-imevM*n# z4X?`z_Ynv4-sA2;!}8@{0XOberB#UzbMx` z|5K6MB8p8+w!0T9sA}r8a%~a*kHvy%>qU?RB2nhN$<{;>BHCKo-=+GikBPW{DCN@v z{U#|6PzCcprrl*tbvsBs>+*hYCYusB$*?hah(wkYV@HZ8dqj z+RGUHH&N&+l9yckcVMirkCI-=E#r|O$EftU39;2q*=U|!ItTgTKBMH>GMz?18RL1~93>y7;q5+E9OvB4X> z%ld%m^IcZ7nZL_{{Ce*QWAL+yC8FUx@wB-_k_+I1`F> z-dgz+JNXZ?rcft_eWtw6)evvU@FC8D`y`;?0a@hNCmJBbOkvv%WLTB#%+vBB~*Zeo6Ffj8uFJO8$IMBM$jejorB=i;5?LlO=0*LL)wU9OdkeXRV)v=Z1M zAD~WIHR zDROxxfsm5HEuWV!;IbNgk!fsjCi;{g@l~`?6opwZq4p!e6#68yPMW~qsOn*7%5AaO zcuC^2Ll3xE5WmHHBOQq1hBBrh2w0^X0AKM^D1~*&vki%PV(s<74BogeN@yuCSH+abfw8xUhk8oyU!x-FBU7X`S!V``D}(pa2W9!|)#8@!pg8C+Aka31Mm^I0dkuI&-M&5T*eStxX(0B>@UTXU|QRrxoLA=%_fWK zh;AVNkE~};+?GvFOHZ^WRolV3oJVbQ@pZY;PJUIML9bHNiP)zi2GKv!?zIOjR(oeS z2xzpH$(uF)=}cTwDYh+i;|CHqBCpE;)J1Tnp9@tKPs32B_XMI1i9H887s3dlzc~Xw zf36_foH5C+1g!*&=>A!3a>Zshv&(u`^f|G~tv0%UC+uo#C{<(&q+VAW_aTO=?9g5+ zW>?S3!laU&3E~My5wU#IzJi}*f74L??I>;zY{>Rhhq5_ zc>W;P%3F&U$}L5)wYb!ZHU~uOa7*zRqx);u_zhY>T1=JIZZ8DFJij-(NwdpTs+}c| z3Hywi1CwFxF>xR5iE6r#G-+Lzk>S>i5UrPuxUR>s9l=PSh$TKsz(-*iq?_}09wh%v zI<0pM4Ov|Ekh7yG7FQh*t>;DS`O$j+T|UQqGCPV#8{MyoF>RyI7}GKO51z4vgc;q? z3JuNQXSUr7D1Z_Mcoaw8YxBlhkN*q zeza>fo~xb)@4SJbe4og&2M>P_B!yna;<=BP!+LINIBL~M{KAXmQgVg@&ib0xw$6ai zm{y{xH2+?0Zx(MiUmZjn3IgkI>t(!&zcqh<=we}XzwDGJR$r3n+pkOZ?dW>IGMD>%x6T+2H~`HL-M=|-9f(= z3+R9eK(}4-k;bIf0@*xLQix8&R$I{>bCfx%i=Mw81G)>#jE8;Mj-wm(zH_Xo!j}jU~~^>tYQLhFni0C zE8cTPyyFbPRM6%EmAw5?AUX?48<#goU z!u6aJg($dIt`Ee9AQ!D`cdqM=?veQDG3&A@+{Rlb{)u~>F?Tv6WCv9(vhOP@iMV#wP~q#ff?2JFmC4bc(H= z^P=_ARJ1uVTJIOF!!4a>8QrI#cpt~ONy#bV(t@!}opLWg(9{DFe9kq2oT!@Lmc9Qf zJI!X3^-9_2g|B(EoCa;7(7f zEPHU)&FEi+j1R422Th6AHmzf~m?O~L{Z5%2V;+?rk@nDW$GFj_?h$PJTg4jb;b)?3 zbaaijbIrvf*ekJ5+j#;NG?;BJa=l(?QKc+DpJUY}<)T(-I;!^HH*7d7eh#}cs88To z^r1!P@=8#~jOq=|NTeLGnH;Fb96+I-FB;%Ij?tn=|I{AEGSBu~J@~bLua_6J61wvX z??wsDB*)Kl%;Bf$cj856mK^PL_+_oIye?&;mL{G;iAHEjlU#@J4iDO*da z%IHj0oZF*i-P0h*)ao`B*0M(T2;*09jwVo*kb5<*=x{1{R9@&;&;R zQJZw_snMHA-s=9DI3s!HD74`-TF!)c*!a#Rtp>kMkZMT>j^}u8l~engMU+&Icm~vE zQO?5rg?uC{`+aB?@UoPCZZ*ZtZ6-8+8eWXD_USV+bpyN9ry5g1(N}qhmF0@;d6xZD z)l7;}VzsHz+_bkBCfv0!;qGO0FU$xmlPd2&0#?U`&%5F`u6-S4mU36S{h4mG`wtE% ziud-|=Ks+1QZe=#o}o^WWA%aFsz0{A2C2Y(1Ym`eG20CJ+FLzDtQoRhM4Q)Tw8=&5 zJDpv=%!)p@M(anbRu6%)q|4rkK8qq;#H(M;k^U5<;DorHv945SXnb2T=1u>VOenmFCEOV6V6*oZT zPqfOpk{m0ZIf4uPI|8@&PcbioS6s7(Oe~Fwztj!Zxb79MbG<9qL7kepib^g`xaS&% zru$~pso~K?jFIa_keBAc2frl}Z;K6ib5p+8ZF%q3d~S2zXFvtF=1aHbL)OkdXfu1N z{K=`$h54Dtl+tgA(r4(cPs8N)mvsBmf<6^xv|th z@EFuEzBcJSk}>bkG?H*~XD0VRCc4m_8JChK?p>Mi&dm20BWy6iZo5KF}UHu39Hhx9AQVPU}K`vf($H#?_u6(mKG|oUc7E#>_0s_{skK zFoMZq1QVB_vi!+>h4s85PjDhg2b?hfMkZmenTbYXq%O-}VP2X?3%$Uk`fYqOOZPI< zED@ZZ`pC_E;wD37%~%9q2{EigYEMzYIwq#YERxjwE7ti$8;VZc<|8*QFp-SfWcp2g zX5E`oyHeSEQwJHt-?!muy&ut+QFS)OtVXpAjSQX}TV|y`lKFiJFTD z-VGGVC$v4%xX5GOuGnG!PH(r>4*M$8KWvZrhnqRn0^NSvsY}(Kr~pnr zq5t6*0N+v zl3mf&1N=lRrLY@EVA5krPlD6HIY_r6-g>%!quE3_m6a2MA87>mL4VRr;#IdQ_ZI9zogd&Q8TmV{Kh}dj(zmIbm3yzU^F^jm7jOIz z6cc9VMRnR@bBWuRBQ(M!wOJIvca-^S(2#D#K38Si?DpwLAlydHh^q@*Fy(^oa}vb% zhj0pEXf^+iGjixPywl|43htTjs3ZZ5V&OuLcZ#8yyD0eI8+wwtI=M+fyJ)AoZ&!`b z{*whj13$5D7IR|lN_%+A{3;Gs6AY+XmB?xkJvdPKEl}T&Q-ND?cvtxX%xGI z*V|k$#$A~`O%G(n!3Wig&jHb$E4g%-Xhf16d%jaI(e zJ>6by&M;@@=~wYN`q0q979qvp?q-^c%tH&jy7*Fkbm$1n=_h9oHIFk_=5ffzPtfZ^ zCr1EsA2H}ro^%oQ?5f0+2ZbUc2>&`K%y3qhu^H#WG0Mpn$_~q>piDJpevNG_rcPxp{4(3Q ziYe0fVXwemw^Y9@EYTwHG?e*Q=~sYGXbLFhE^OtYBi%+HCOOn$LKhgXrjM28o{1aU^e9(#qyB|p=~ome!4guUqX=mFUz)OGoac_cl?MIB>il8N!RirHke zm|6{kFatfwoPt<%4D=pcfW=p03iC<;dfwb&bJE7l1;(@r`bWM`6&Mw$0{tkctPI#N zApj+~0ho<3vw2!{Qg~u$Du#*a6Qff*jrld&9T+_}d=zXi-S+V5tD=LGL4HjKGQ&pS z{!Cq9Xj9eJa$)}?Lz>3hZZ!MPBBblnRTPLU+860Z&KY9NY@?9KL_O7>W=lcyCYpTI zQ>PiL8+2$!^w`Kzdb&Nso@-anTV>9+XX)Abz7U|*6xlC8y)@w#Zgh^9ZzQmtd}l@* zMWTF2^HA(OCCDpo;55sOnZu@~Cwa6_g7!(!2`*Gs<@Pz5MBRgQ z==Ail-ck0K6Q|o}CsNbXRcD%CvCq_BDcDPb`e8(EMCLkJdgx&EiV^sg_^K7V&fS7h zU}7U4LDX}&oTi&q<@Pz5N_?zdBmU-?pc3+uq!M(H8T((-I^#~M#Ca+$uW7SNoF~vY zyJkiyb-n^>U}JpSs*;k;Ooq$FGF=T&ews6>OsBI(zM?YL*UOcWmnD_4VLa`7S?i1k zq?F5pQZ7@8%au(=hPD~~Q|P5vDPUciID2ljN80rU{9;qEl zdaiW8J#@dR#>}2+3A*3Du0OZj^_O9^9;icisf3I)0Kj)C`yOSFpS#Kgm5pZm4Q^D% zrF?}V`>FBLzFqj@>YY{cjlfdgqXXb+rT_H}fw|=&u*`T}DoREX8C(x2`$1)sDti_c zeMG_COD1gT2fvn!o(L}5qikYopH}u_F2Z8@J*COp;&+y})GySV@}4G7OZo#@1{3dT z&V?#k?kww!kJV`HJ`b@Q1wN;|=av1kvX7Z_Z1hECzNG9I6eTewOMZgFb0ItEaMJGT34yY?M>4GPp;XX;~K@=`Cm zBAmq70E;*A&LJ=l@wx~>3(46INpR*prVdU`gQH(9-k}Z-A!A}s$nUY--Ilw@>ey|; zW)D6Mlttb5tToQkht<45sQScKM%s$-Xc!cq?1R&`t z7ugk`TDeWOz0vl7kZiPpAXuK6#OTFmC0c#zU$ME9gNV2Ub8qGtV zxw8LBaq3^{xD7fNwv+w)%*YFnvcwTRLzV`SZU*UdbhG3Jl>DzBFwc&rHjX}y(zUmC z)S7uLj@O`EwMJ`&f>zKF;{$`+NC1hPX|>jH2{hIvmJgTryKq<#zWV_%YPK%Hs__JrNoj|L)c0wr>f^YZ|J{$>D_U$9%y z=r;rq_07@U4#CQ5n}en8A37Ns5$k`YI%?t3%!o%%PTGl%^5+ZPWYejIqm#zEHe#-- ztb-*pHueIj!C{@W5pZWhv^Zv6@>H9nUgw?~!)PI?-ebUTg?2KhhgnI>o?ksDfjcvW zeZ(HO0JK#Ci8GG|lLht@)v(t_&>+$Ok`vu*vX~r@X-~EdKYEPL9}_-SA5%$AMyx3I z#k%8g&Ji}JmsducLgBihg%tj=F_v4f+mi)M!e&>*j3(g}u~uW_DUyA7ZM+K4X`OlM zhxo9uMc=OqXE`18Gf{{xw|KMfXtbKBT8GuQQ{Q2u-b_HIBfn^qUJu%3IQq{~V9dq` z-LXwC(5qk=TcPh)=1>&H7;hl2Ly=;%Rd>Y-(H0VB-@sg}u2k7M*oH>1O7%Kx^>=+Y z2lk-#;$7aTY6~K$ZzBju{X@bbVu%v%LX5~7=!+fhh%StTkzp@%y(SVCL_s!`y z+DC}}1E3gqv2E&2OFGMmr!}u%jDoQ;xhjEuE>Tr}gPY8wBI_CwRmq9;o6VX8gNKn| zaQ-MpU~!is%68?o1fA9?6B`5?xc#_D097uH947ugjNabN+d@N&?83Q(p+O>(vfdQOWG<)0rPvz+pXOup^yXo{m-<2sMrk#Wt;lCYiu(o<1Z%Q z33sw>dr&@&8=OhQIbT*%}5NB0aR>mukK--#0ZrOhub6V`4rZG8G0yCs1uwi z1Io~o?HWaQGT`cr8VlySoySL$8VQnMicDRY$q5>T(xad3kX=sFGw5~vc&JsUp9&e5 zn4;gkr5-om6fAkd-(Sp9U82e}7UfRKRx~ckoMKhPE8`W3MWI6n@!x^x3M;CXmsT9V zJhGy=yktCP%KU?OPpd0+t{Iw+M?mtZYjkF$MHZ;nRQy9F?h*TL9lDy3B4}}R$P?MIs5ex1gz{pRwdxxN!Lz+1Xb6AwuPY}WYql2>b*>$^Ji_<@b} zRB-JFa_tY~S_}>s=s4Hf;lHTl8!B3g{YxxL=HFO-Fv$E_X%_B}m1&ZiF=(PsgqZ{{ z_C)=R7TO#%vAlj?GjPr!Rg6U&sCvI$pb{V*QD3{%`|T2@UE=9vs=_xP4E4iR9tu4CXQ3wT$)sba8FC5CS}8rPyb!2>ZBYvuA#AP6D&E zFuVX#Ob@;+kkZ0vmiBBCCq{Io86M${Y&*yt1$v^xP9#PO^I+176|#692MohHAU%1I zx?3~lO+j;7EyH=J7}RH&N#{^e-iugx9>>Qzmbya7t3W@ns-H?o^2fa0r4mFrTr&*_ z`)w9MouqRF=}jRvubpkdnpVU8R2l!Itt{Ml)Q^?(8dNWn={09{2(_fm{0|_`kGiuS zR1PWZ%eL+xiNZ{kPDPgERE_l(y{L&_YUayIxB?G?FKf`nisTOUY$qERVb8IyhvQuvi+qq=+w?wPSZ@oz2F zy+K)7|K8m2NN(23w%BlgtBkkgrqjwd?MlG3+lIhRn-AXC2y^_KUaP=Zb5kh%%WZ(5 zE^UyJ7y2{B8~=@f@fqd+Vdx^UsweMm8a@m>@>lH(-fLzDKHTyBqL&`dKY5IqyB4W%3i zk(TyVD?FTjhogC{v>o54@oo_(dIH(U0(mbHmzt96j&VZY80Pln0T ziDhC{u;ygr5|)3q)r3fKh;A3olm=@d^UgN<>>yr83lpdez$^?hHc$vK{}l>4fcy?~ z;dWE)Fu&vahaYSIa4#HroP3A>It=&j#7@=kF6Hf1$T+c`3a=Gs@Ke+QNWV*&J5{B> zpXFbJrwfTEewT80D(^1!t}^~?bvoEBoS&&MKt~ySzfpB=s->#gJ-bp@pP9DI@no$S zXCLICyT*p=fh7XS3!Mb8^m2ZhJ<&fuP7m|XcS~MZ;x*>6aL=`8IG~9uNO3Y4NPPV$ zth0RQEry!@PRVZsB3;~G-3Yy$2mJTJ+U@IuN`k? z4r^Odm}L=AM_OX167L5QMIf8pcx4e>a;TkLRzw>Swv7mgF2Tz(eMpfNWW55VnXr?U zBpSsF5TTRcPsUz0|?(30)UjL2Ih{1 zP7f&A3^Y5P=nnHjVJ`!!q?74kUbqE*5<5DZ4ThZdcpa?t^Vv44Sa*CzEEb&=NjN9i zZBBtenPflm152to2Q~qnsKYN{CM(%yaXvzW#Zj=m#MxF+)d-scuc(20RmPtI z7!uxI<-MYs_o~7x%JpXk&ct59Huo#1LEF2X)RP#h$i}1-&p4T99s3z4{H)_W<9O@= zT_>J*3NJYB^Mu|x-t$h3y%iP40BMl(bYSwt?Qf1|(9@~SL1}}4=&vtelIVxN zIgp4X8*`5>&OFqDW_JM}clTe)EgmDo;QxNx z^luU4WB$0Yo|ZyFd(DKLiwA4z)29BdN$_6Z6*dp+x91ioXit#7gP7y33l&CQX~%hb z1(?@mm|AYpN=~(~X5m3a9fh0_{VIldY$*?tRoGp_UNpkM5k5WYYWC+@928h9$@G=6 z$Ub3#074>&#q!m1J;W|t=k_m<3ptn0=2bBjB@8Ly7O;$Js|u*o3=tT{vyRDHHV0rC zYuN~y>>0@;Wg4^GSQoVFCa>0sRqHC)Hz6ED7}>5Y1kMcDFfu|PLc;gY5CL}s!svi|n2a6Z0 zn0F~>r<#42T4emjMNrkc)#_)qWSTMFfNYC6IVYn&o`0iYpYU^cngW|S-5g_& zPMiVG=Bo;mpVu_W&Y_A7BxtrK-{ue&G+ZRU9Q471K1Vb980DXWP2Da~S= z#un4C0^uo-A2&h!e#In8EFDWVnRWQKC#FszKT_0$jEhc0oMI{se`$THB}aIbOF%jj z6df0_dLWR`LM1%eF%_!_4=megt_TM!IX1oHn z96E|7g2cB>!}=k{qY4XuE*^#rCWf^gdbjouIGW_Y_;$^kxPT6w@TF@c@Y8mxgZwUz zy#0`6JQwK!D-5S4c8WS=Hk&wrA*5IKyoj6pWjOJ(u=~@nel~pCGvNwcgXvep`uTAD z1+1vBW8#V+4DlH+^MYqT;f0}lOFZJ8_OQp2!52b4iEI!uqnQXX(7W)ynf%JbQd@`% z@q!Hf?}}6BTG`=CYXQvCjC|xj-z2?D=_VY-x3O56C<7&6+d3jy5nC{J{)+YI0*%=o z{0}(agJ_tz8sp0&{ms*?QRaEtm??|V26gf|KnA0tR^`sg8IHvGg#W3i(tTV7LiT+??wpbAVjwK z*tFp+HIB{d95LBG@}nJ;H)eq>dMOu)Tvs)giWG>c4?Uzh9|SkC7lY6GNS4$yE{!h zy$6)x+29;00}lZDO{JNQl|)~c*89)0jtLMQQr5Xz@X=D%H?;57dW#@A-=JInrkZa! zPniHJTm2^y2xzwNNm?TfCe{VHJ9YZvqfE!-%rrX88m51SPgwjx34NXBb&J#NMVw}8 zm#VlI>ObcJXx)AL1B58to}?PDiK6|MveJ=C6O*$PaBE)y(oSKV7DJS8rtU@y`mwTC zNc{_XrzY=>aVUcQvzmhTsE_n+1r*_Bf2Kr78qNNr%Kq6e zvtUPGP@zgu%%$M(|7XE-_r0)IY~?;IVG*1tR3h&_qe9fAgPL4yDL#Ffnvmc`kREUA zkCggYRez+G8qWKsvB8uUh4b3)8{XG+_G(&+-ce(gfhG5UvE&9u*TEvdOt5C*x3M?U z{aS%E-lNr*4C81@`beI6#o4T-x5)wzke>0cxo_-0Cl4-?q_9AtaZDXG@i9!!( zNU8{JR`?bsDnt65;WFSe=TsZfQ;aFtHJ$#1m6j*pdBNn{Z8dU6-qxo+1I`WO<29$l5kSlJU z5&es4T&sHM$wXYCUn0*T`;T^E)@DsS$EpTYULmw4GNq^21Y9FedBRf2x7oK$uH9tTz9q32RcM#@^S{a76n(Yb8#-giXd> zgygX(-+U5+n|}paSX1{3HS{2VU$|F~Hli8`SGXvw-O?(AOx1zGEW4N{nKvqc4@=bu`Mw2n+S{gKyiEEK1TFf{+No=( z{x_7d0rzi<@&|_2GlSYr#z@1NR%iV zr0@H0i3s8O0ILRimQA8bvV4Rx9@bBYeld)ah8dlZkUufKN{`y3e`4(>n{CgHw(%Z4 zs?&vRhUHv5TNNz-$o)ua5*=#8z7c^as2cgJfwQ(d9^t^YhD!!VG|^53?nKD6Vv-{e z_>k>1NY-d+>srD1Vhkiwd&sxkaVQcQ`eE~jPUj}3lBj4 zO^|i@Z{~!^iTjKP2(X}tcuTwt-v&<)Xz6e|6~BvO(1!_qgF>7L&Bjdo@z0&2TXCyME8cdTRb@ML|a z7{irk7M!A4m{ttys(w}_DIcO97XP98^r)RnAlr#xTdB{<+NmtdL2`wP5t0ULUp}2{ z&0|v{o{Csk{k+PiBZGks*-q9OSzj2zM3`^Sw~k#9cmZFrnX|Jj^2F!!?)Wehqlp}a z4*PPgPSN)X;+y9Dfwp?}9ME*`Url|aUZ~H~PpZVw^q|zZ^z0P(8_&=pS_K%(-5%22 z9n7r1lw3}>CP2@|mB0=t;E!#5%nM{K_*AhFJSV$LWY@7~l+i;@svXui!cyWqu;~rZ z>%uW{Px+5~7J(#ZyB(>rn1s&+t(Ll;FCPjlu+#Xbz&1XZbHQl7W)gBUit)a|y4v~N zR2!`9=Vs2>iF9(48gR2p+@#|EK6bOZkpbFxy?R0!!#j1gHC`qrWJ^FnsE17U@l+AR zU`0Zl{6+k&18Th{t1X=a^TL%Sv_vMXB|3jImXFd+pkr)Oy?UU|a-@^u6<~i!S*b#< zlv{*MEtA&snpP*Uyg@>3eR+Sh9-=!Sv~4zzbO4rg(U7rlw+9_Yf60K;!VGmMqUOhF zgZzMetSs9%YJ>`Ey%UVZDS}j3`%hM#waN0ftbELrk5QJHo$4p*)Kau&W%1O|I(=#~ zTD8*S(<9pW6`{UG7UFQIknG4JD~g7egZ8GBgjjcd#<4F}%u&d+$x-;T)*}{tTZP0i zYGd9?LD(<(H!Wsh3pF`ap9MP~MGW)>l|2@#8P&(I(BJHFTI?3Ed=ps!2ZjbfDB$t0Xf=VTi87tiBF zagTv>%ISs>>XN-u9Bd)cHP0u7OH5W35yE~iud$rk`$}a^MDY!v<5#iDPejMFO}LG+ zDn%J|NAofJbFDTY6MU|xQj4wnCbjftmA*;As2RIS**B}2n-pQuoOf`ygi*Gs0HQ9okif zl`@HK%!Yn^5Z+WrDofm${pTR_T+Qbe`RC3L^3UDPL2s}*H;;#Y(J?+Ie{eeLC6ejC z07@iXQ_0$@3Kz@gDytM@sT8!rFHGu2c!V!lZj>;wKPnhBDuC(?BmzuU)Glh*C9~Bn zB53a6b?z2zXn_#R?^JbPRSw{Vud2}1Y7?EttlJWE&WkyY`m-7OBegyQgkTg?jH_do zFI31oJrdn(T_8sE;GtQi=7@$_=UZ@b>7osXOztLf<2`}gxI^8Gq_b0Xl2z?$)#jJy zd{q(nl)=b^1+?~RoD;?_v-5*!__xujczllzeOEg_i@Lv!+Qs-UbnI>0!fy6U2#6(w z3i2Uq8vP+vmUI3nhKn&lozB2YG04G0v9&DQd_Y(0R*^ng>?6$_%nKAU8B(DcSRLKYN4{zeyianuE)b5bl6Z&S_KYT0r z?}FfPp57grZ?t~PiX@_+qp#R^IW@%S*0eLD$g!&Q+mP`Rp4+el_6>?=ow2lZ&YPk~ zKA{p6$tb^vQN(Hqwy8bp81%vQ=f-Z&Rr#rlxaMf$xhpjiXep|Iulk%os<5D|<@tb;pBVhsAF;-E61^I$y8X`x^V2))e*;!eW>h_1&)4rLq6~?lEsmzb;{hD}N$JZ$O@GU>5-Q4yI+%y=QDKNz_N*S$ljYq_aB&N~9NHrPZ@rS(2c!0Co+o6_kSFX_tn8zN(0*={G zt~{D6k>W@4RvXO_bJS((&w;u7@B_r`*rjTr(fUoxc-9%1#plS?4qBr&yAVrTqx~3$ z(a>`8*d1xb8q7&Vp~i?X#%`O4NE!QpE2MIAN9{X?BnadPGq zeR9Jo=E>$M!%o(xgij_^uK!2`J$~*EwL;LY#i8#5%wbs{_L+nf|*m2}f2&)8*k^!31fDP63c}c@2l^rJ%*ADfvOn5s~ zd^=gE$F=H0#bN%8Is}1qL9wzBFZLKK8wksW$icy}4Sy9T71qq?_W^_8IC+YpkZaT} z3z{qI;*BJ*mKS@qMx7C7Nm%;L3XpgV8izdBqORz3ne8b_AI9?xAuw_Q1nY6WB;q(c z+b1#Hp|?XRF>YqTF3zb?)isLPfNhGn=^!ph=gi^5RHtWU;)ApqpNV}}$R%2}lSqbn zowD*mNZU-%p}+7hu#Sal5i7;8M(Im3HH8`nx92SrEiE5v*n`7u%q%=C^RWLPoE z#mJMi_o)yK`UfiLBn{wOEtXArl6$q`RT&SN<|3CwC8WSGENqh|Q+?9-p=qAro*0~! z$KB{ZZcLuJAdNh7f^uS0cWC2vsT4fFRO$((!noAqte{prTs5npjQzd3}h|MG(2^<1P{ zE>w3ZV+3pL+49_th2s`+o9eEv-#K zSbxGOv4l^A!%*a(*Q zmUC76X62r%5}OrRjOb=~F(wsxc(sC%l33`lkXFB^OIsgl`>#6sM<~)+2c=7&6RerF zh-aQmM=i`fE|NKp7qfx_2HmX&<|*MtWgJo?77aEplnZ`502^tVEyetRQ%G92O-wkz z0dOk+(DL2L^#|+|{^#s=o#U2EPs*(R8B%j$v%)E9ZC0L-A{lV5GB+#u2y&ZI@r|P= z=!(j)<+Zq@)tHK5gwpB-0fiSn-LTc<=JSP&m9=uL{SEduZQrGZA73#G7nUZz|k$Hw1^({y&*F zX{cRluW5V(bplJJ2ugYimM0)L<^PtGqrjudhgFoPyCpRBO14>S!vg2mFs9_=i87q3 znw{x(vy8pNn*AV z-&6Ju6?4p66kbpX_=(>@eZjR}qFg}t*DCj*;+TwzVCS@)0{MVK|InqkR7*lAPV!e_ zjELk5d=(Qxo}fyybJ&o86ttcY8ynw>qu9JqIa@#_XUu^nt43OgVz42>5SvLb+?=~7ye(o)GnB6L{eb$Z72 zy59_QCRMpXmoC#SW6g1VPDaA1!!zVslA6Uqlkwd<0r$>O~5y1 zk#DHniC#tgoI=PuI@wjRyt1)^GTN+%l9+D%SBKd~fDT>QhfR4jyNLBAZB{`f6mm1ZVpj={^- z-eqc~I1YA+f9-MHz%7HDht!Mw*x#&Yz;7_$#{h;MY?!})()169ehwGgF7+S`o^+;4 z`b#CO10eo+kv8sbrn3SobEC1x91LY&CDA0>P2iA>RT6}S<&|YRhrV8VU01%QOE2ll z)Tnm5O=3218OlrjC@1L@7V<{+M%k$Y0sZ*Xole3+ad;6Y&`#!7P z`cUu;+N*0KD(5~`7!e;?V+<`|M zACcq@Hfi-DZU*3sW%Yvx9iyyChz*kf6u-=K0D%NIhEr6$Y^hARFR4A6dIeT4e7uqv z>L~hU4{_9ztZ*Nj2@EFaHS7x%ddxxTQLi(-)({g4kn1HY{XG70(gI*L4x|0s!T|_G z(W?NOo%9)M9iNFA%p8akyIq;rZuC z0S_qSPHqes$*)#&3_cez^A&F@}O1X4p}#9JXS4~<@y6X+5d zb-o9bMIjz5>nPWhO=q*9>Esj%pb>t#*ABRE{kPG!T@B@)Pg%xGL^HNJcGk?~v$z|G zg3Nd=Xp}1fEkLW7P7phYJBZL;zD?SactTI(yIMOFi^PToje3>1Ay_@LdLr_JE7pv) zy35?5okp8WqGo7bUAI3z~&P1S)CFN-UH_o&(=yO>?cN#KK^`lUCciUx_$P z8t|NRTDi$3wsEUfLvD4mD@hg}na5)gjzJO&TFA7E% z-6Xp2BkE$)r~}cTb#)e!B5Ww2%S;HVVSw?XT0BE+*G zNIYV=LlGTHRg-Ba>R2(`JGk6E--QNT+5%1OL0{#lA(DgHcNa?Jy#jQ&gM;3s?>Fz& z5w7~9!ZDv_PHha0q(!3cpS01^XOwC8jWQ{#TZ}S~s)~m(%8(T6N%2%P-b_KTd_JXU z>ge;BScZhr#+6N{tim1P>9Iubre%I6iYw^&I_D;8`^+%SREU1|h+CbB~+T&3{c_vc8=CQs&Et z7^_Qok*riUpGh?am^95y-XZR&>6ls*at;P%v!6A=AVQC95lr@n@RC+s3_%vDbm|GR zL$Mr=DhTbXD1tEb!Vh;Y5Qp4rO z_Xanv<;Jig&*jFXjXChfPX#wFzeWGX`!z{X_yfh2n?I}Ualy^8DU=o0r?jz>dk&5E z{Ezn(3G=!@w0zL=v#r+q5+?gL<8k$zn(Uh4>51O(^iVINX!}7o>Neqz(*3>4-U_=d z+W$gj^k?$1p@7cRI*cWh1zR^e4VRhjlXm!BmvyMge#{L&1HQ?A-Bk~}?G90#5tCUE zlprB1*tIce;%P$(p6oMGP4ZfLo9&6wNwqZ%B$a2dN~3N?&mdbmqTf?-0LvD)n$S=aeTVnurCnb8o>z&PBX z))aVVCa#6h$^%EANQdyXKY>2ip=cBGU>FmvnVjX#U5-Qx=4^nmM-45`Enu-NGAVjT z&po0VGXwgt)Oiu!qyFd%y#F>N#?>b0he8=iNSl|OpGX@|s?`R;5@D+nG1Nsb2q(a7 z7O)mf173y(FPQ5c>e0YyS@5U+OM`zJ{C`^feQ7&Lk0;d`@B~PHOvyZJCc5Da2qzy? z#uSn^qSUsa(lhLQYQG%r+WS?%aPe`W2{7*={+Zu>OIU-#ICEL|G%~QO+sN_T&#cV> zi;(AeNqBi^)G^jUs625ZJ5iSS?hI799K&#|Zy4=nD27c6ev+X$m!XLD_Yc^6f!Y-P z{jmppUe)(mzobX`pHnaDRmRyn6-;;e0Xdv*Y=jZF9EFS~ri%Ws{gpydC(8P4$%4ba zJ7M<>7|4XwWsQkNJUtH03j$W6A}g%HbO8U8Gm-`+BmvKUs~R(Sv^mBdy_<-c{PU_SIrs+EHE^)m)t{|( z@K5E;wfoPs4Zd4-#Rg})Hmbo*OWeiwk~xc6gFaBlLI6;7)tbT8u;QKp_)5o*a<>WL zc_czGL}Gd0KgZFBXIMIe$=#i9_9i$+I2JkDrRva4wF zJmIPZ@ebHUFV~n)hxp$Q7y=SSBuCmA?8MEyoqtWG-&5hNr1rzJ!YY^*Om^&SeR}K+ zeOhci3FNTEXjp4-8N@D9DE_gnDt@I-p8fyt(yA-}Rhdok^#zqvB0;8`4<$Tiw3TRmr4ogh3%z-fGIn1k}s}neY0u zwLyl}3V~w`g(t?bwC{5%AIoL)8&$3eGAdjlg>l%amdJ?Jm)Vz!OZ*b$AAYR;L*jsa z?tstXOZ8mi?1$Bu5u<+y4GM#=ck!t5u`*YgXK2=zM{fVYs1CozeVcO!kiCjPgukf~ z?{UWoq1WopH_H5o#?gwOWFTc_Ph>f~;v##8&E5DC~k$T(j zZS>9Olzv9Vo>kWORP6gob6)z}8%qCF#Q;?QM8#fJ@wavD?b^Hz9i`z`ZQjC^SNE3A zhLX8tDj&jE7JeMyyWiU$5|8Z$lNI$Ow%>_e%T;~?Dc|37BVZ zV!7z8+NwzO5+uuATC73($0(0@%EUQ^c3CiiT8IjYz%B~3+Z(F%D#Mj~t3CQ2aHAad5@W(4alk(3e-7`~Q;f6sT4P3yex~n* zROYJlJNLhc_Q7NoyVE>`v6>v@)@D;~Iz2dIeW1 zMaT@1tZocm+&g;IfiLcH?S5Mq9@VSdws*Dtp0?lBy}!|wx0uy;f=Ed{rOOk`E^Xee zW2EA_L&xsa7UyMhc~YA`bbuJ(*rPiBlv(?MHh(Lx>NnbapKI#AZ}O^QysC$FcoUE3 zzo@?|=!yo?{{29@As)BrPc?7s_rV)$(`!{3wqs2ffI_R&sh@__rTpTSrEH zayecFV6CuR4Ku#4dLC3QeuPQ=4^@~UxFEC4s1#=Sgr`11Q7C=nbbiRO;$kO!m_FQg zW*=3w;yGkikuh-Y2tA+g@tltoJ&u`aW#E%3;?w^eMXHBWw%LiwPP8eR&Vz{G?YPp5 z6kqqCs^}}Y)95K$?i-F2HAl~-sDle;*(h-W<%m@08U~!^da<0ZLk|f1j?_+LT+wk~ z_J28%m_KKBZvle^lHz>|MeS+T)g@Gqp}}@~?!@TePB_qNboO3`qj@x(Tgrxoaq8Sv zWEkJar@EdQT=ID#U$i4I)xztFT#wibj8b?91xAaMiefYu5JRW&hTQQx`|k*4;{xvZ zxPQl>BBlSTNC%PtKYM2X&xp5Q&d(s?vN0)169*N+^{~Gpd?OVBL-=16>ENL^5L1Hj z<7sthSFHThGyJFiD?L(7(C{zAVr!@KuB^Ra)M)B!fCVVr z)z*rj0s7;clQV7UuLZun>tuibXAD9Zzf$+A0Z8?KQp57p#Gd3uGSTBA z(P8Frdzc=+&}eF~h~r>&fPcc*MsjHG;et)>M3ML^bQ(StqT>eUsi%FsH_Qu##~n8; z+9g03J-8T4H1K%BmbiHKXr$2#Z`;bNo0>_#lT6gV5ZUI zbshAQJxFpLIQ+ZAlVqw-nVT)E+b||jnk1IHP+1EZE(2l4IE10tVNWuqEj8Be4?~+) zK(-C7>pXRu@ge%Ox!OD_bW-QKAl8gN{I=j!E8u0BMhdde7?FJeWa7c^@ICmL@B2LX ztwH~NIB>1kpe6-QW?@pG+Fc}-`nw`i3U4PNE5-!6?%eD5JBD+{v^we&!P0|I_gYjk zcak{~-S}aZ-s7A5Z2fxRCdN=ML*-0LNHAvmN*c*Kqog6Q$h@fpjwWu;3$=LIQMBPE z_wT$*?%Zw;;Lgve^h^JB=N>%2{?Do2SNB)1HmDw2`!BdbiXM~K1TP%mwLaOej#No9 zZisi?pH8|kIsU5bxX$Z9|Cj1;r!SUJ3QG9CHvTMCESNO2+MSy4Rfkh0|it9=B5g@|ya>**6@Y7$Py33`yATjDFuQw*+$WG7)?(@7N20LG4)GYVQYr*Edw4h;J` z85@ikd-sKXAunHCj{EwFHm0Y?dlM?gH%`E|lm0t$07~Ca`{KS{Vty+}#xRB$*c;SH zv1Lk>*YtJ9bnzFr?~n3Yz#Cyu_xMp>4C)o~24>GubDP-0b2^Rb-&V$oept`(X|y`W88()pcX7@p;|dZu3F*sH)KM*l=RW zM2vnnjp=iQI|f*z)i5y;iwd~YtviU24FrCIBC$%g9^?)uUJaC3)4`M`vj=>XexTC_ z%KC%SgY6@o)oPhl5#s9}Yo-1@4|jnDQpv@W13mL}0-cDN;&Bng%Z5;S#t2(AoLkdB zLVi{a=$j=(W?K&lB?{3JSqtmS)4+Fyy@8uTS8AiCV_6>AVU$=5 z=@r4E?48I$=&yrfRryI^NV$t*=Nos z0HwiS1L@C8um{&z>%oIpJBJ4mC{Pfys?_0oFu_+;N#1K`9y})l%Qh=!Mcu2SAkH_d zuNc$*b6J5)!B`gKy9tEo=ri4~T&QL(oULaKoIQTlAsjnqPcl}NSBiV=@HcJ!fbHJD zf2H_DR*FAq{dYa^Z^26OS6L}Ol9Ue}e=4sOo5Aw0-#^34GW{!-=AjhZu*P1ST|%Omx%&i2Cw+wFYW z=Ia_uD482rJy{-6e``%{`yo%cSrtw<&j=0g95&6^#IkBGF&Bq6s!kk6ei$>sbaU1W z;WFX~uF$RCU;!P=qPvhX=raS!!sX*5fD>bGlI{RhPW)U|+lkWMtj;%y12`boSipLH z@yvASK#V#N;3bo>-~G$+%tuP?{di`dL-uHTb;hsJgUWaeZ#RS8C1g1W9?<%%{q-6y zxQ#4;1u`vaaO~gLyA?S02Enm!R(G1l>-#I_WFt@UTMqGU}68aZ%ofk>~lo%K( z2S1ab)em-V=3c{WPBvS65a0T1Y^tWX%TTH}1vv9T5=OdNecduHGkchUWsVO!xlqEd zGTFArM7jh^D6_||U{S9vSGf_vz*j+M6G*|LemO<-;Ai=fRvQ)fB#in_sD34^xg19Q zEuFnbmdhZFT8xe_2S&%*7xiKM0t?+9zZL|j$y(vp;Tdf;MCycMNb2wpNi`;*uqIZW zFt)w1YLWDoqpUA!%si)uBq~K}ah=KV+pLJKe%<`9*y?w5_C3EM`(vv&D`KFxU}ZTV z1{ywEPrsHV8w>lbR@pBBrTEQs!;Pt{+O`bS5|SCWS;$_diGkn^gLA?~IDm8_yto zGX2kBssDN3QvdS)rT$+m;+xbue~K+H@4O*%oBbjzwVTv0ZR7ABd=_3jny}LhGwD!K z7j?86m}4BWHWxfS+($Y2q7s`E2(JOGd=si|`Hm>obST+eUN{+t(+T08uNMR}$l0(I z)S=p&0~z@eDvTWt5@SZz2J?0B5yPm#+xn#OtKnq0LUm$Hio^@lql5;P@!)J@IhxD# zLY$8l6CGe?sv@!#&gM#Sr^2IwFErVV&Mp1uEtBbi6$vBe5Zw$YdaC-CFHUw^e`7s* zTN6)5Sx6J+&&@Z@gt_w~x^VhXHL3z?y%JNH!3vYL=Xv6muB% ztMw)wD`#(D&~!1qJx1J;RA!HLo!%{ktz-TDg#m5r3jd!`{=T+ve;AdSa+16H4>tP6 z2pzj3A=BtDO^14sc$#`)kqzo~kt$3&pkB;DQm;EqWFnHz`V-HNa=q4>XHl)|sn!TQ zqIX+LK2GsxTnduaYo)(YCR*r_C^2D8j?{$x@N!50 zxf~78oH1K>NG^{e-R~MCT^@U-|5!Kh@OqE6$p7bx;Neg8Pc8IMHSD$y_8&XBy8Wc& z>hCzlZ{*RRlocd#CA?ym*?5KN-V>3gxR|CG&MS)26kypIG1j3t%L@zrj|Zn3!wZ9k zxZh%WxClBBnG?>_;-DO_H!1V$@`k=7Edd;Ci*4~yS|S1d##O9AAA8YCIY1HJBVU6nx=y}clwR>4UvFhB8n3c&^{LMP z!M(CoM1~I!{QiIDP1&koKDm}bDfjswm`}FKn!C#vJ@&1+@2KosK8=V^U9wdc#ApAT zY~)jw-S8g^;#OG@Kk*COM+$PA&fdJA6hw@`FW4yYd-P%cKI88R?~+q3yY(@~7WH?> zofQHZ)35@_mj=cW)}8U;Rqn{-h+==c%`Jst5|33&EKf4$I&Lynr4RVeO(Y>f05M|6 z$;xgM<6|dFWPIxTTud~B1Fi?UAc{^lR^K|SUv+K2%+Wz_xiG{OG7(2G9rPV7-LcWZ z4L`v>21j*$h^r2_-Uaq)-KfmpL9@eD3TxLa35*6Idlmqa7@SL6)Fa9`9)%9|b+Hu} z|Na_&pFI89HyrF;hO$AKRvd#RpJ`F}8(-GOdH_mt9+SVE|x?8Nf)3cWPFOfSkGdK}oC zp!|wO*)j8j*MrGCDF5If_H4R!yB{~^5E#gqc42OmnZH~CbT@^QEQ=tFHu@cfye=}k zaC^#@B{qGFx*w=FBLHd>y?#qidWv*^Ka8hOP4yVP&{h^B1XDq$`?+6Jn&m6s_W=DtktG(kEW5 zN*}9y8kBdXUQM8bYKQ?tAx0xIik>mMVYeIx`wk&iI4 zZ3)=Jm->25FuRVEDQryp(6|{*jSt#lhs>>&3URR@j5I*mWufZ)@>DMPfxxbrli^_Cm8aW>8b{AieqdAJfCsm7|dyjm|PXB)f@;r@mZwz_ z)~Af&%Glz`$lalS&pMkltnTDti5ba*6JwH#@P_^OHWmo-uyJ)Ybt~%*?mVP)aC><> z@bh-_ka}DhB@7tBCZE@BRKKw5?h74T@&Wq$_MKTbGjg-y{~kL*$WGCz-lOx6#Pt2K zu<3GqIOaYX!`ygFG&GK^9&bcKPV&=4cf4?)PW^vf2HD+5iSDR(`+r}Cy=ULuxa^(8 zka+&u|MRk+$YtC9&&!@k42kAHQ~y=B|0wi3a@i;U=VkZGW$*o;m)*i;QRFgDJrN6C zrLd_xq5I8Y@0fL0S#|H5b^SV9OU>;qrN;KAQhjGbskXhYMBH#G)A@AB(-X>nUE!!l z?!Iq@>gRRNFU@J6Tbk8AyELP7W~sORS$yuzSL#|XbZGYx?3Z*O#eP}$F?C+(@DVez zuJe-aeob?HSr7lI9QW$(Z_*(N;M8qwP2tvRaAM{nPtNrH`QP;YSARrj=@GmAVY~FW z-Tqy>^t9diXhPj@h29R2{H;@Z!)-s*`>m4*#srwDTJ%A7>wzv~YW$yfV;G@zY@KZF zToY_x{M^c1QToC*9>3%luaV!`{#J+TSK7CY#$Y#y{|B)s$ngo$02lM)D=hL&9#~=% z-^%}1CqVoTN=d$53 z+5P8;B?A8_*Je|_)d!rf!2A}Rujp+$;Cwy(A~;{)+kU|LHr>B`zOA?Wfb+Pq%ICX! zM;&l}1gr_ceMXF(0A&;2#_;4})9ZTcX4cK8vz5o9!uQM|_bLK4H@AG~3=kpA|rG}{f zp@I}kDL6LouP_^aOpdqyfaqwDygv`$FW-Bnq;5}S35A36 z*O>jm`5%$veUXgU*jIYa(u1R?J%)5B>ej5}a6%=C@isU)+_6@}UY&bPHyFlDi_maZ z0RF{K(ZKz#eMVvr&YH~HqM?V8EZW&j$*MK{9iX3MPn-Hlv*{qrfBFo3T%r#ANJ=-F z{lb9-CO(Z}=gDamY2(N~D^qf?C6BzN-u+O@sRCtKf8Cj^Q`^_oJZ8=N#CKSI7hVG^}8EM{j(wR-pyVd8YBb2Qmj*E1*i3csOG$JC9*g&CHWyVARcVK)N|&lL zGFwW9o=gsb=S=0Q8zjfwo?=*&Ukcej40%5df%03c3-8;>3!DI}H@3qGU*J@J!kH2b z4_W95-6C2uhGDxTp0`=|LJpH*CLSi<6tKBAkO*CA(ikBOCi3T8T0I6oI3Mrb+E3tb!8&ENp)MBz3PQb+7LC+&a<3*?G2hQB!bSvRzWQfkk!{VXPO%~7fR*B~}sk!ot zG_EkK<2^V150|-?8;~NzEN9-X#%?=uyW+f52>9Q0;}+puW4N^wmT=}1gG=}Ow~fy{VK#}@I#VvKQx#nL)};PSvVu#J zGh5-`^U7_rx2x*lhigbmVcD(VhifGT`ctAl4PWK2bqV?R`}PbAw;G5CKjJ5)mj3db z4U_O!eTD`r9YI;?wURB}%+|xUlseI`6F&*-`4|PRll7!>JX1nLInl4kk+$t~4 z7*rN!@>N7np-C?3T3Wgdt8SwEGvMfC*d9Rx4B|KBR)(-@oE7VS=}^0G%>PFgd; zu>R!WASqh*yUKlA*}HLjj(t!?=|w^R1fBYtYWt>2r@fr#bke!Y^~_M1kZV!9^cB#} zKW12M-9OnJh|s)>Z+=fjQS%?@1Yku^B-^4ECnkVWW;$EQx^}TNA$X2{7ULXM!fdWX zGS{ImNX~Yh{;Up+&kHry^mfI5n#3&AwQ$(Z0G(;0-k_hOn-u)tkGp?Jx@V=}NOvTHu2?Zw`iYJlq;i(CI{C1t7f?!<}dp@{lh`DHsp992vg|YXH_k^O z?GX2H8gz|g>`B(3Xfq?wNi&(jq~>WVN-oD!i%+n^f34k5FD2_;%lKwwJmyWll>C~a zF%@p8TC>q?vVW^8g^9yRL)xlN!oDJ4uGm0Dm|n=*t*ku+_?m=GfRyl@($-8_Q9n}l zPl;`$t)yd*H9OjP2FgifM8jz-5(cJrG)Lev4PUrMUU;Ov%9@W`SWl-FBKjg6N`D_x zUB!w>;oUe2vP%=Yp346#IpNP`E$uQV`b~zuANAiV{ntVNHRZovuKc%4g17(R4d8+6 zDi9GZ$O6~3=t*0VtYJ<~(nt{+RcPImS?GB6*nF%y{te|ls@!iW`ZUHAoTS#$Ro_yk zzmGW{V$|<_6dXVgMx+dnt z$HQi6GE}fmH>s&6DnwMG81E`|#=3yLV^8%TmHC!(f1(Ia+LMVHh1IZBOGXf`ANW?e zbK~<$b7S)k{be-x<=OGGN+kS)rzXlGT)g%p6(y*xG2}b5HPus*kekfrE1pm;Q;L-{ zp~kF@3G~EsD)zKePl4u|l^>EtRh>T9tf{WGYg%AM3B5)-N9zx##%EUQ1?e@JF1bnzl`js7UQeN!y{4#E91AVR(E+I`u@XE-4NJwv zns2vCQYM2!j8t|69H9;&>LQ?B^}b2@Z_J%aBv7J(b|~(hMV2kNpGZF!@XHb%E~k=b z8)dU2@pvf~ix0&>=~1)sQ}3YX3f97@i7SNht?fhfUM})?Ia>~~?5vq&cqfyRKR|et ztj{*ttN?7pj_KS6k*aRyGo<&~0@c36M$aoa&epf#C={04slj zteulF$BBqIl9wdD+X=R4<|jkem53nXjH=$Lvn6yF?|#M^7c;B^)Y65kprgDU@)WJ6Jx{~#Yj*9wJ2jvD`mG#*Xn8tSVQT@JF+s!+I()RP;*VTq~rEOfth>Ufz0G?TQ zs_-_TGJKl-52-a|kQeB=QX$g#G#mMX9k_6owr!SD;=?GT3fwzoeD^S?|{f#TP=xduA8vb8VMf zmq^s;>bMyj%Qga?CZQaXM8t|`@ebqO7(0M@SbDB~n2)2WU}Z8F*cX(F2Jrn8X* z^|~nhm7p9xuUcZIOoLNL&r#`HE(?=DW2e5uBH%h9SabvW2)%*SPJNrwL&R>5)cv4@ zNsnfE<~#BE=65-N4|AK7vDkDp!B!RV{P#qJ z4)oQD2h3!1Vn>)_xL>GbE`f|m++79oAAR00Gus{o*f05b$hq7MU1nw<4TY`r7L`V|ow`e8O*RJ1yG+FiyMe$$! zOm~ZWhCAR6L?+sOVZFqcQ}K_K_f9n@+5OEnb#=q$w8%j6Iy@it+E6%sv9dpJ*`KzW zDDRrMOC@hpc9Xf@sdUb%KbQKIb?L8IxrZ#eHhzuLW7=`vq0Bo~Hfn}Z6!i*=M6}44 z0PGE0$6>Xk@YPbK{yjD3r@)!g`I7Kr%JZyDo7+Cn?XFAqhI``cOfsrX6YEZGa)?h}TS)9lpI z`xLR>f?o1nWj>`QFG|k0SA@dJ@pg5b(xbGyWQR7v&4h)g^pcBdzoC=B54ObxwroW) z5iY7E*vFC9VpUZ_5S(>wESjuBN_V&=GE7owYJGO|}U7Xal+~t{baRs)+ zLmEn1ECK9=_AA=;LVs7*MDyd;50rD3{kG%2tU{kx&g+U;Q0%PuODa4RJ&_u^B-kyV z3eh167(BhPYHan|JhwXDdIShO4C!m|7|hia))E&F!BlHi$iAB#6!TieR?2a%fyT4GmTotVptDe@?k^Em( z?U)*mW@Pu^US{-V%qr&hS5f+dO1fv;P@%mPtmm7)nPgBaVAR$T+c1 znK#NY>2StlZ1Mf`D9^b%8Bua$ASnlaxbNZyMnDT}3dy+KRufrjVG6P2w(8V2 zb0LGhWj-$86kC!8m`n1$f2xQ-D;dVi-$A)CK7OFfdUh&Yu0Ua|FF`AwWPXZQv>)Fm z%8$4g*;BGk_YdB>Q*AUhw_uBRX-|r@<b&gC0q{cKM1i;d5A%HiwtmR+-!9VcTWv=2$7=PJ>i8RRCLVX63g55# z?o&37#WnY-`MXSG!V%8(s)BAT)$v%Q4LcxCG7k0;+zKcaH>IQS9ts1(nMxBB)>t;p z|ClJ_@X#MVeZApvecg7O8Yw!L;ih4F3n7c5leAaiAZv?cVP_^oZNk|nQ8)Y@h3@%9 zrB)Ea$G{mNrvTzhQhEg|jo^dI1(f((Koay?y$JWusrqv&mWa3Ly^7BxV6J63VH<_N zcfl8aEEU!CtfxU#*y@9(lvSi4$mS`NG2^TlvvQUC6-9aY%%bET7|C__tHga=*EnAg zHrtL$9MglP6hqVO3`axgeg4W2hom^l8T5&gbvs?~<-{TT-^>>+*5m||BJz_U$GGB3 z&8QFDuU7a2Jv!XCsrh)A?~+=FOUN<{9WrD$RI_p1~9`NxIpvVXU% z)aABW*=V+=&=Zpmv7dC=|2dB63OPM@DBZx_#sj(AOV*VNlhp8ACBDuapotIS@YrGr zXAw`Ezl1@*GMOfBcF9BHSc)z_Fjr^#WsS_$-72v)(cdJ~1$IqTd|n48t9EpFa8mxMIEzyt}iz5Vc9UYXeSC##;n(~UWf1uPz!P%~;r^kImCa$h>+UoGB%N(9T z{>?b`gkpBc8yrR_fvg5Fh;Y>5Aow*H@@}gjlQxPMein}VZPqGAeTq-d1^kG%KQeTI zS6ga)4mZ}ohh=<P|S1Xz$R zeX8y?H~Z(`j;6KIKmV||6@;ed_f>8?HyGN1CQ;NwZ$^h-=lrJx=U?TYpQxi+CpUY7 zwcecUq=d!htP$%r&fm=Sn{en3!(qjx_g%GL9d9H7>Uv5a#TeybqY27xeHwVSoU6LZ zI*HZ8&KzZU;ydGq&-26MjN~IEDEdFFgo`F5$5e=i^c+6{X_d8^AF@+^_$z)$d~Dga zHiN#6MtvTSK1)rQ|1rT5EKqQskTseYNdb?cbYFN(!ha24$>9~9_o$w`)xvvJ_-_7f zZP1Y?RTcdJ<4=>@*iJ=V@+lR5J~*-9v(`Ziz8r1^g>xN2a!xN^j&H(pfUYEe3@~$} zB4*4Gw)T$tU6B1W=55J=3cro;tQdQbns~Q*oE$Q)S#Kn^Zc zZ&BgTj!If`u>43@H*_=`<9D7!U309iUCh8(q80d~!g6M)Z4<<1*>0;{>m*}iefhXv zA&p zA=gzFu(S4RZhJ}h;#T7~3}S=es|tloWD?#;_=} zFY_xTxCCBVKRWa4%<`;*P&tp(eP~P%3XeEs+MdNFY)z`@Gbg%#_UgakugD)`z*t9A44XsjYkh!y8;!rR zRt^r^MW*~WIu?F#R-FHBMg~o)wus(o63R$2n@IsanoH&$Z+WP9i;;;LnW_cx`E|xX zRXk3hfo!-g;u5uF#AQBY4AN~14w13y!X&-r0lld)GC&{+Xk+Jdm~m1)0RT^8 z&N9Li(4!#FHb!_l1GEbUDQV`J-zsBEJL$ZjypAsKCHPpqV1+LvstWsR_jNTufj3Jh z#0-T{*Wsv0F#-umvzGIp8RSY%LaWcnK0ty&MBz$%(13S?#+CV_GVW9}_!a15_EEvm ze_Fs1ppE%p0%l|}Go+tK)CZQW8F)(i}G%6XPk;9c-Swk~KyRB?Wl#(lr6(wyx7%e@( zN-Qh6a|0!Jn1S<^-19|~E=e+F@Y9V(Wm}>)xmD`(%zLA?cOP8DbAtsu1Zy~jp~ueM zYE+`=y!=)Gc35{l%GH*vQUxJg{5t=6z!Ci{i+e;dXo!CxWKIkVo7LxwB18ryaAPgL%woFKFxH8oIS zF6NL^j2zzD35LQiiHDEj!F;1+0jRqlBemm9Jza+c=2^Ve z_e0H}l(Z-=Ay?mnpS@r>)Equ(wqR%BA=aA#pJ;Lfk+n)9Jv`M6rVdPICn+N>m(1f~ ztL2iPl^H&QHS`gLaWWY49m+bAT(RGy;p^@QX-+NF6W(YUPS$vbqFQk7;3dO7LoN99 z;p?~!D}=WRSC!-l=4JxfO+L4qC*GPU4k_m><0d$)P*4%VaM2*rx|$ zy$VxdDmU5|+-Sj`?i9JvV?{2^Ufg0hXB%IKTte-QZJsI*@`7NH>#ZW3)gNY?AHYN! z$sv~&KF43+5&!iotoByJc@&M>#t|k(wz@eHHEnPBX;t?O*UIbq@2U7RbZRa0R$NBD ziaOI82iXk6)0WFFo7*;~g0`iiT-h-Xl>?V1Xzev{5ADHS>XrLZS$Fd|LuKOx#>ug6jGa@I|gYj)?AL5(27Y zz9*&Ilp?{o{JIHGfNefz8n-(TBl#HjDM`gx7`)K@_!`r=*BP(X8FqWy9Dp;O`eo+w z6iP@uw8&l*C;`%1W<2XP&;%wB7&@0L7N`wP2$Vn$-{0#(%v`U{9FIi$r!dg%)F8-Z zmINkgj8G5^vFLR%W zlv-G^H<9FGEws+2JJE6{@04+?wAfnA? zYt$Oii-6piY=J)hxQWgGgbCnWX5vY5`@&2}#>3r?S`{*DeFc99+neC9^y|fKk9!Qk1rW9i~>(RftAEZk)78vRRx$$i@AZHZ`pvr zU&yvsB!2_jQZ{jQ3PyD+TkRQoON96M8C>KY+qj2b7rhWP>sT`pK4u!<2~!v4 zhQkSnH;k1nMbV3_`H>v1%$S*uM8o9s3Qu`oBTwNe%k_WLaufxe=GrFT)p4nd=?;Xn zJVHXh)|bqk(tu!#|GJZI1U)S3knuYTHo~BvMDupBM}>4zaoDnVjU#MMmm}!XdGNoSWMeVH^F9XVJiBObw{Ln zGwF0PQ=R5lEtq%jGFaD(zfL0Uz1-1N=9952O?8zCj%eO+cEpWWJe=ez7tNDhY8}<; zl}O<#dIhZ;d%bb#YOhKl@oV*|)n1JU5GAx2J z*I_Pyn*Uw!|2RiD&s2S4UB5hIyLm;-LLBxPzlda5LFJU^0@n~`vlo(ojJn!)BjgDF zp58R^-w^X!$!&XfIrHK3lE{M&f2=h?%)LT()Ah`h1o;A5+2z6V`2_5Mb47L%5OTmW zzdV}LMBbXCtwc_PAdw>hFu&%c&l*%?Waqi4N==57F>Z>o+**x$qU26mapQ@oYdCr1 zxoF<7K%vKun<6IQ8_}`aY>77>F#U!D({EB>`i-?t!*h(B_EB$spwBqTcq^KVdz2Q@ z>oIJ{(==I^MMMLoYsG&sRk%2%KW0sLPoRzB6oHf?E zK=|k`HEE~XU^sA(OJhB-rLvDvQ<3BUs)u{x2R#;^oBUPQ56vqrb(QtD^54GcTuC;g z^KjI-E;gAmZFswf^od1nGZUkq$r$XvG>XU)((|UW2$CR_M}#oOo4u|hoy1%S1-9$W z)wHdrlHloZ%`@Q`s!i#8;rKIQqBOBZUk%qk6zqFA9Dj(U*vr-R;nGcEkUg-LN;ih% zH-zm7Dw?d_?et`VK9JEk7p5WBst{{Esvj3#i+&-JMF|Flr`pWp&vn3(~LTVc*}I(2_!R=f|vGbX{wS?%UOBZhHX2$OWS%nsV$Y*M5?t(=nmaU!0L zBA2Ejm%@un#v3tAB&W&qVxCEcjcBFwS)S+%{fsCYn74L4`RRX%HR#X-uG`-5DY8r% zpAdA}0mg!3^DDwXx&doY82dM%Oq8>$Xj>H@L)Kp6M%t;zZzuknCE2Edh)^a{*2(sk zV_AKG@*j^mkqF^X04511zhTTnK>H4y;$We|_%eB}VH92*=j6zEf-Nn#Dz#1AYAcCb zHL#Oi`pQt%fUZm{eQOZ)OwfB?gRwYxl1oEEW5)s-i;4q3xcdU z&LuG^Nj830IG0o}dxf8RO?tBBv_`C0Eon2DAhBxRA&3;_Zvpgv8AJiEX|l#8R_d;4 zB*^MMI$Eb4>MECK=i=0wlbqt{^gxT<;my?J8ogLV{3oK`T8rd;|yHnC`MP=OnR1RRuYv`G&~sVRRMnU zqsr&6tNqtYf`7{U7W@0g`>$|eMq)kHQooNHuO()k?|z)_oj-S}zH{Q_-e~FCd6lMn z=*b@CRyFo`hnk$OnB{i4ZcPt~)$NX(>(oc!jcIb->gMv$)E5$Q*ZY2ywj@tR?c>~4 zyA-h=(g*>i9-;4%p0Y6FW}TQd;ah?Ni-(wzdPI5mF)W#TVPDOb98^cbgPvG5!HG#1 zT^X}a$AU5Yh`!!J{Lymo(6$%y}* zg&|eJh|zJy{5~88%6%%}sX3psf&j{Zd|w-HBpWO*V^>u{q)v|Yjp%aFOA?qI;0r+E zbkA_}=~&<&bLik1+}VT5nu>Al1PuU760tnqr_m=uJ_-IaphsvBt@&QhxF9uMyLeQi zeO^xp4XXyktO~D@6z?HY86!=0!fm$u>_(3~kBTOR*b>ymI}Zb~L zSV~SXjgUbTwSv{uzV}M4IGx;q=|e=+TZ_fbmG>{SWdYA#!InH@tWgceofSBQON1cH z;Xv&-DR711FEWFe&CH#6u&bNXrOX;*CDk8$qNOk5=k>kVnt0qo&EZFIE9@z;gvEPM zA|xV`eBMrVvQgd6Z?_ohi6h( zT%($x+(n8u#=g&ZPB0x5z)qK6&h|4S*qOttbel4&i8Ee@S3QN3%1?$kn$TS?NPy@U z@2EH#9u7Rl|G`^_QQJ9KGwtdRc#OmGbZm_HyjW-z&I;1I=b0t(7&n(grpGB%W*EXQ z3HwLT7b=kC+>dyS=`9x;@uunzM>tq~#t)Qz#$2T~a2S945QlN?yV^Lhh@V0n#&xVV zYtBKB@qSsG%MpB>yC0CqanSzosK@w4(K7e&IJ?X3mD-Kkzo9d+l+7v{K~?I&c}!=R z1(-vgjbBJ;nRu^ce>cfVJFO*puH6%Ok6-quE(_(kiZBNY<}O(<6V8}q)Z!(*Ror1P z7rJ|i_joMzXI*-XOWG6T{tMSRiMKSa$(1tg;!w(X#ZmuS;70Dk$!U|R;Kx1> zx{+5|O(uGz4Bt+!EN*1ZU5gv}UCw`~8@YC$%Jx=nHZIZ)`&I5WaU=g4Rvm=VKjFKP z<&fdZt<+#N|5oJ$5IIC48iz8U^(O`V1Ysfk zMDkynjry2T{}JI3M@W3A9%?PehgKQ&umd7%a?hjepuV}Plv`sgWz9blEq&Er^Y!iQ z+hVL@Eq^Imy3b$B^(@iz53bO97UAWGEW%>vK+WWTACzG@X_EK924yOtwa+TdhYtj0 zXneyG3&JwRm{DX29f-Lcx`e3IggjRJOGcK;?FW`hn^D})O-q0!<_B1u95p(uk=B5O z&wzBt2A-NuY{ZeE=*~u13U`aK#2oMkWrdpT9a5dM0V2hBb@ZHDE zx66qKICtZ3vlts*QcJ6jT-Ohrb$fw$0rqxshw7>D{f61ygH_5hQlGx_1?+a z*W{yD=AA!fJv@OGPURzx_pswV;?!Iowv~Q7VLy?edhy%fAEol%tBLsQ37ipu_^yW6 z^y)u~1EY=2k$jqc3YjuPuL#GYkqAc$v;H~E`Xy4Y&_*1!4#moIYsk>05XK(Ho}%2} zE0!=)8m1X1W=J?G8z(J+aZ-@ssVSG<|iN#E5AkrqNSAn!Iz!-`@|YatmRpHZnGK$X)QQ4I z#G00kp1Qb9TQx~c!f;!0YNn~!(8mS|8n(I9-(1sPJKwk;`!Doq3tR7D z$-xG$6#YZ&)>eiofg2|wIh2C(eV!1$n11tp&bn9oJe34t&INAaqrQ>vxlK-u?#3w@ zweZiQz6x`c8Tgb)vgtUIDtONXd~~Vqpe=-Gc{z#@Z`C+c8b;vEVo(81E(}Wg-g4K| zh+Z_EE({HH--Ge+kw8HjdoUip*l3CwO;uClQ=}tdE?!kr@ny}8DxgP_8IudAypm_##Nj%K(h$R%hl3y$Nc6p~{8yZ?>Y zI*M4ufIgSdm|XCy2b939(N5OD0VS}eoHdXQ9>UjmBx?Yk)z2A%tN{QS;2RGG0*!0| z?)iTL-4B1V4plnHaY?ORgj7q8N;O~e>kj5)9Keak$QP0~Kw!wgfuo)fp+iBkl917a zZIg`lf2;R}y2KI=GC2>^`HIZcAv)gzeVWPlXQ3-Yf-+hEIFK)pH`>V;IH>2<9LN`- zd`vh7Kx~pPz?CGWc5zvp@#XpC37l=T_jXs0LyG--MUI)Gw`8p&y6L|ta~&*&QDv?j zq1C=mHTE{q(~S4wrmaRhLaQC2)p5Gf5i>eQgwki9Q8YR}B+Ga*9M9+F3((Nun6V}afPX?-NZp(4e;RW>=~8jzNd%4ZKDm9F3U zx)0r_4ofa6lkk~Lp(K|u?&JLAk}{Dzue(@PTN^pZmo zego}C(o2L)%G%EYy*dyA3DVJoToMY*jV{RJ5FLK)K^?xUx1)OO+yA!$L(1&GQ($sj z_g@s4r9_3xTD)X2iWbk=yP%A&eQHc^>t_FbxOJ=11!Z(W8Qq(VZcI55OlnC3;@95URo)p$oWKdo}l zaDveDtlPjIy3tRonZSHpbC^9ef!W!0m_5`xVl=UYVQa?)f$%P)mw{}dn*jq^WDpnG z6nqHF8G>2E=wRw^2BHTfyk1gkzYsz+atpj7+(lf_5>! zjfnGGcansY7X?T#p72g!El5IkrSE`gHG0WuT{=1{RXAYE>u+1I_PVWO5tzNRJL|i) z8Yf|I&99)}o%>F-{tjRE_0H>T?K;!gLMG->70bmRUy- zMS5zA8T&|hw2Xth{HV;z3u=2{CXpRoW%R>1SQDh`G*fEatY?VJ855!^n4xYpf(vd4 z+!epO^F%0ofgYAFNnUp+d6)gi8#ghBh0zQdVTEu7nlhTrqNmO9FZlC7kR_gno%erU zlgJ{Z5Ox6m7J&;N7HT+`=bAvUN3wO{)D6~hYD45p5xSog{bWfK7xopCr9okt9Cl#L1yGAsXw!OADQJY)2~FRcw^**D{8YMyBK z53%gSvbN<;M@OY*)P6h~+xfuC2cQLg7rrl<``byqd0*0&JJ)kp|wQ z(9Z&PZie8XQ_CHVVr%PgRV7Jr)Ovb2VZpfx3l|eT(so3fN=C?6<-lHuFflgxp4hk$V z1n<Tix)_Q2SR(o`Ew{A72{!JSzhmn0@=O$$i2f{+e z`-yUX-7@Q+3UNVrhE4*a@4be;H`|zcwVK%3rzW=aEipE?cCyUJwRUxOrk;&v&x) zJ6o)*bq%Ay&%V#kjx?r%KX#8gj-RdLXXU6Ou!epG=ZO>wSIf>8@R@#s6Lg)Ct0Frj zW;PpxF{2@73`UIBh=_-=6d(*9X>{aCTEu@U4xMhu9qEwA1>q;!(;!=#xCCJ)DJ&gC z1MCa@s!b*p4-}V*0e{L)wbmG%IjO0CqcIQCo)RB0CwuQjo4&R zj1zlXtos?Gc2sARmDvP|%ehXMVurz4lUn=N8_QV;Gvo9JbKi@$euZ=SS!|k0At{6L zE0;EMF7~!rU*KGw{<&P;3X2p$Dg~uWjlmt-IBOm`3waPH64EY32;|;!50xXWg_zUq z%z+*K4bf{}P>=Gv4aOiI$_u$;`JohBF&Xm1ZN}+)iT{ z^|pak;@+UbwzU>uhATlw*NES+ZLVl|RQ)OShFM*~=8ZB@ss0e{`-&ntVqGvJ?Z zH<8^oV;DoCua0T*^d?Yl%ItC_KX1mOj0YOl3Yx$&sC87;f``tphd-x=dbk%9yFjH* zP&m`#9hM$HhZ{H~HU0uc*puf;XjDW}dOss6z0t*aWB7SxtmF>xaWx$%KrEZK-D)ig zf7!DA80Ci?9y2zw zr?y!W!`adLtgn>y&lTj`wyU^kpLG_uHVhvV`|MC1e0ZOl+&i$@xJxx$rgHT3)uF2y zFk%w#MtfiPb#OUkcwj3vQO(z@+zp%{^qD{he>Xb(vd@BtVW~fcvJMv54I?$*@b`>X z&PivC=gj@m6N3gA1!H7>)3Qd@Kp)WI!f{5|cnF3z2$$<+muNLd(JeRA-9?NaAauf} z1)3aAq93H$iU4%Ks_Q~Uc`V7SITEQbo5>tft2sp#l~KO(y%dq1*Vhti4GjwPLf*XH zwD>e1CWBj-W+9g=R?sAS*gOt4v5SVqewaS*zovG=a7UIj9Pf6vwKX^;)$Xa`G4Y&N z<>eZx++3onH|Hk9V_J=2@i(boxLL@vO6Pw>`XI612p+0GxX!Q1JXPMuJ-4qX{)FQ_ z?s!j>9o64UxX+5C`uhoB*I!DwHz&f=p-|yvzcvHXoCyO0Ar|x81#UIm9$l%xJ`)Cz zGk<|Dw8S~y>{M;!AS&0>!{KJL(qx3UR(@`11_T91kMGq(0va;D=O>J`h3Y=6`l2EZH&Z>566s=O~$#S6nY_K zad4#({GOVaXpDS}n!GB!&@sV`6;@e~VHr~sV3#8)xOmF2QpN~myo;Y7O2;FR>VqF3 z)scN_O7GOon2`+-A%etgOkNQCXLL4WoOqw)a>y_gOX*TnCERI88=n-5&uh z5l??Bv!4yGO~#$cWU zCTu|gn54--gk*12DSk2@|IOvF{6V}_XCPL%kCWgG-0~Gcq8kZrIb+7>Rc)eXyJ{J3 z?rCwFbH*khMXY%cL$W8)mx{!|XCacw44_R~X>3B2c;P2^YkP^bFqfe4;}I+rJ==*>M^bMlK~iEPn-G67`1BdqZMl=A3il%-^?Nwn%|5S&MC%Ff*T)vCibfhukCN-^ha3!7jX6O*v@=#GL zmc-YfA`}IYO0zhHs9uAC5;5Oe=$AY5tyJ-ey)+*WLN9_=&iWh9y1|&STTL4r+>8Rc zT!+5ulW+SQ(ZSt5`TA#-B5JXR=L8zfar7yje6Wc6Vib+z^m0Au7f`=|oA!BBycz#c z^dKD~Cq-%t%evfrgynFc%FQCEb7W8)A@~v0zKXow$8Xm#OvEwpt@dfD%vc>fn%u;K zplo#ozg+_t@teI>!0S%cuwoRO(Z|N8%2I!yZblOORpG9HQa(#nJ@e^4(S0A!;xQ|&e zW7dPZX}Gbc$!R=vmFVLCzD6F@3?BK86tx{f|Gy6C|I~x@KWkQ|kjA*qr@!?7hyIC< z9iacy{+0e=50#Pv>Wi>L7eHHi0SpEU;0o)I1;B-8LF=<_QbWDND~(yZ)zIMZW@8pa zF^kF7`MvHd_G7Nv>u&I0zp4GVi> zPd3-Nac6FMs*yl&hXLu&IjKC+RJ63P7RS(Mriz4@jlMLW$LI4%ojsj&v~%zq$^3r= z))fnAU>WJL;0=(lxB|?eFKWBlT>>9H4}QAT?$;Zfi>NL8FG}-@DoH~&I@EL$D zk^i^pXmy0gJx^HdF8eNLCs{pqW+(ReobQ;mXS*YfEwxUKYKp1prP&Q`sR+lUAVeR5 zoK1kHHwNX?$!K+rn<2Ja)P*0>p*^CL!!38Z&SzY8V(jB_cVgx2tecDqN}Q1OsXW+w ziY0oN8TbH>)pM~xZxnx5ou-058w)3=>*Xn@!ja#!;azwHfk7q6+2)99@x^{jPY=%q zda=ljzvg_&+V7~>oCg2(>)L;-+wU|ObC%WHb*g?o^NVsdoPSbPQzhUxoZc<0|j;urng?m4KfO~(|=iYO6t0M+SHXCmV z6aL--CVaEcgy*nquG0s3=^U2Oormzpd8ZrmV#d4?W8Mxpe7!Z>EE@AL@a8p5FU?qK z%xjxoJ7cRc4?q4q;yw#Tj0GIGfCCmZ%`DAYX)I`;Su^WQV*v*&z|p^Gld&jfEFy5a zsBw0~oMVhdZL@3VY&8}U%v{6?mYi-Zi5W{c#}dx5q-kzx-b!Oh+uYiDTa6{0V+qGB z-DE6{8B0furI^o4Ic#au{L%tK+HLb|7o2G<<*=m^eh z#OcLp5MqXF{1iez4uyMnVG!ahuvSI%9Y;4D331*f6#RkAoE3hE^Bh8)%VWlJjJj1t zJdTpucCZ#&1mYtI#8ItuIiAT2S=PEL=?5;uesp7@?`SxwW%)j}uy@gB+A&cT(34sTMCvT>+4_cVErfv#~Mu|{jmK%V%6qwkY zb*4$6S#gx0hb{*tX$YfqcwNwkLQ}EeOQ(r2URRu684@>o1m_;Zb(6TfoNbxyc$;;1 za$2IF1`f5;YABYW?h?lfli3X$z(vxXj3&Us?0!>4e=YWNH>oU?6nL+xllCiISB{?} zS83>>f!4``hBcINxl*U=!V#N@WHwecrS zZQG)rjbB+FdKvx{>%a#18J{Buw$g#mlIo2XaSQ_K9aOIKXu=|oM1k}z;r;q#qw*Ou z5#jmFhN@DwG)YCfwHTPamGH}FFVowpD}sn zY1&k8D(eCT&YNjzvt9EXA)W)UFlTS_eX5cww+(#Bn*4}L#FEPr$z&$6OF2pZq38Sm z-Y);zjKK>3-#bRXo$LRLd<+g=fo(QkFKS9_KsrO9hA}E+gNKrck1(*p)j*TT)*_8Y zO`;i9ZWa%F(m8V6j3}U=a;i^-T-QLxFs5v&-9Va~C z6;2DZfJc*tu}y!;QfFFe(4ayl^%V9pnu=uHUEDkUv~*}bsQMX4<|Ja12C^cajAi0? z@NL43>)70iWGYjEnU_qPU`Vcju3s?kR?nO21@lGizg=uSZ}u3KKQspllS7oFR1Uml zPF`SKikT2qIX90}($(6oq)UUV+@wpDG8nGJ{it6cO-llAE)37k2;J@S16c_21g~jv5b2oP&#^7vD zmgG^B$iiL}B}kSb{Jl#_ETfj?u3vXt-NvrASv0ATBkz*X{6a;oURjCA*C?{ZkoFa2~3Hf&ZUN zY6eApGm(J;q;BH|rE8DB z0c3&o?m8`Y!s#Nr(z4ef#m^(y)=H*Z7h|wJ64uTC<9UAq-rat}^B(rxN4l)9bXg(Q zWR_@-zPC$1*5y4@rT&o%?NQ!?*$_S#+j1VyLYF-)?TIlAbCX@Nx;@MTn?{FKS?`zW zat`UQ(#uD)qIwzgkHa<#yki$MkO$@4n9pbuYqGk9vhwNTduz3B*7|rwARnMBlXhd0 zF6k+-@=cq18;l>w%Zt+YDdr{fGO;WOvm^XNEel(0R+iL zWlnLlBmY21DjL`Db$&F-r~?&&uN(2%lY1K9@>g{RgNhpSo{3%s6@d)xc4G=qx9-#k zl#fa;EbTgG5j?3Hr$ zkIQ4+EK%QQkbqwo;AWn-%7-_@6Q=`9GiN!y^%XLWdryaK9q^zpLG+wEbNjeu`u;&!w-# zq>SBLUbq_ji*XwQMoq>N-56jLlL;ghsD#L z$o`@{Q1=$5KFpS3`URTpE{A5nNhcHy6E)UR>ILI~gXU~6of!>xUt4AzlbF~+`k(ul zi#eJHr7WUY_~3uz?$m0RuJK>{cj_L)T4I4p$xVbAQl?2-K~wr@nP)>yWR_5a4?Z}P z?+_&K;JNgT!3db^NI?^BY*X; zc%eh0`m0Gh?Cwua`(5xJek~bXF7)f9ekEzW?7u#l41cDi?<~ddD0Tff8U8`izP;qy z;Tuc(_EP+|Qtr`2^jiu2QX=z%M9oHTi+(nde>ze1A#W>DydBCtKQceFL|a+;Xn)+C z;EpteY7_Bpvr~7qTqb(Gi0^&jKuVuYiDZ@a5gK4*fn~lzg-XuZcE2+hU8T;hb2@n6 zpf)(&VPA5)`Y9CDB?O&)0-#eb-OlVfAndZP6*}8f+KG5^6a`>>T=1F0DJN5v?#h`} zp-PqASZ(JM)tP)nEytmM#|qQf!hqV7N-vuZV<*H*UBz(0Zb~)krg&qnCEBc8Gh@cI z=i49zsjK~_d8GgrycCquUaI~7t_c3S*!KSe%zz_a48GdQSCB0Vo@9fB%o?jmB7DT8 zo$?9PW{MDuo0G_bNMXj@Z&JDFK$Qikn^b$KHEQB{kHLN{a{{LzeHRLFAkQlJ8!t4Q zF`GErLmC|E)3bbzQSu!#7qXO&HU1D<23%^`3rDiG>Q*6#(0fiK?^HYga6&3{|it8SrbI_!}o95q4_sdpXXHqzME^PC~@4)|f$v<_0@cM)oJw*I! z$hT2v9xWzcE~b7_%>KN%=?YFVF*wPmvr0IPQ~`8)N3hgKY`Zw$2Iv;C6P#S1-0#+C5R=g$7GahBUeetJ zg!f?&I{@yxnoh@Nol~h#QiE1WKZq|ZJl@H>n?h5qerJ_E(H>)Nf?LI`-uSp!$t)53 z&0oo9_mf5P+Gc8`XuKR?Why6*AdQ~=`Ed0|Ik zEa+4DJ>DPnZcpv;o-qBlA6dISy~lf6`Tt!Ty#1lp|L>0Azl8tKp|6)lcYA$?^)U<| zSw4SIESD$@9O=zMOVX$u4X(tFC`W+r<#YAxP3!mrEAMKHwfL?Gizp}H_$mxCmmHhtJwO@Pa8tu!w|69HLRoC6)I`F{Qvq_e9;vu)jatC6Q-AW8HhQO_kH8?u*JCy`B*;(^d zXY`!zL%_La#vq{4Y#g`pm(jxO(b9$S_>QReC#AQ?9UXf==3W>Fl0|>BCG)kGmUmS0 zWwghvZl0H$U){Xswu2|Tos(rdV-Jn-IYi(8#v%5E0BHxyozT?SUE zqL*?1V=i@~mpD#vc0RwWy??m&r`#F;qx>K0>T%clr&vt;#OJ)K?|aGTJomd^G1{o> z-fZ%RYtsKRT;4y!^<8E(Myu02T{hyn9Zw_cRcEitsIL^vM+$NLcdgpFIz#^)y6U~| zCUkdjEAP2ZBn-o|p9rq;zcFp^POskM8d~);|#s819U*pwRbM|Jt(5a_6brZ~}`&`8Q3F`b5FY+htzRM**kob#s|B4ly z*W)a>vYYuN+Gi46rU`#J#65`R;=IL}BvPne;VY;uDc{DLbZS zg4^e!ZftRmjGU6)NgF(826&6jp}o4oxY_meRJKQMZy?@7RZG^_+Q*nr|+pt-(9!#+t5>am|qP! zQ{~D_+`i-vmA*)2vvzZuQn%oS*q!rl2jr6iyCz<$7R#~jMDdZBygPlliA_L0MEcC0 zF}-Gw$rkH1o6R-u7Q52z0pYDVZG+NqXEgc67*#Xkbo#N#55WiCC%z^@A$!Fvf0)TX zdtAPHQkoO}L8Q*TCf4% zj8_W*wI1%+i@m%Fe6?lv68Aj4Db!D-=EIQ%6leSYG&o7Tx$$UXuja7@h7gXzS)%a<>>s812`aasIyo|q0k2^BVuuR5S`xd6`$ME2x6{t;I z)x-vvf+iS6@kJdE*SKUcgx^rne%g?^k+tzctb{rcO{NoADG6PXN!_V4{XlKF>F!E} z6ZH@QnV(b46zY(DkEw=eDbo~b4D)`4YKb)8VYUvAFd+gU#S5;@S%k5m-t%xHZJawYy88x6Vtfo)?oEjXOW)8a3^23MA=fw0| z)jT<7#oRm9qNxkbMef4Ym;o| zn$(G@6XI)aE4)sxPp`X7t;K@F+nL_5^pv5KO_t5wHqOC5EV@1F)*w%)hRC^zPkVpXk9lgZcciqwo zbLLFB({A6r_ikZ#*+So?t`zBAk*3(i*rTxlJ zKTeL%jQdP$;hHVxX}x3AKRiv}Pk%w}*kg-AF&giOz8lG2lP7K#X#I*^sMgBKX=N_$ zIdhg?qub+stZzcB!ocK(UeTkTq|N^EBZ@i@Ho4p11$zDzG(apX+%0213Qn~8N8Y@H zomX7^LGccDJ5J~#7R?8Ap*__?7I7EnjNT%YOp;RiaRpw{H|krh&C^1iP_0eb#F=<+ zxVK7OP?uj`CoigtF05N4{+>$9Asip|NOMqi3St$GU_P3SFSCwEe`J24L&E8QrdH&6w+RU}vEbp7 z*e_QqFIK#bmExdOnH7H+dD}!L68HMZ_w3uD*X-rpugl>ZWp7it z^j^8`&2scwIs0z8=AClp7Qb+-KkpXbztvZ#!FMxusqg&8N~xAhEqT6`xxi|{anHtN zIp;=P;7^g>U&`SVW$$n0$`fT5KGTfVjvKHapL(~c>`~?skC(%D%GnRfrT5F3-}!~# z`wM>O`@i?qcPI^$uJT(SC`W%RXCEk+?k|VW`-K<$+0Xm_3%yj=H5+55U&{HlDHn46mG?b5WqlK)dhK2(VwtlT25j0&ZmJ|8i+FjZ(Sw4ts?KP_nghU;pGukDT6- z_((UPb7=?|>?~oPWM5jzU0jiuSNz{_;Zs~V=FL|B{7P_X#lNJI+3Xb-`SUh={vu!f zm6K!d@~jpzO+A^^=D+p6q&D8Fp#RcJbXq05tWrF)l3DH-R`@$D_x%;VdX3vmdd{oa zqxhBx-xc=Sa{i{WyuBRVRwe~#uP;5y7cGg@csrfVcnl)V-6=oHqybf!pJeQfrQ$zI z^377_jZ)^0ps+4DSKJZ!>jHH~keAz>9W<1+cb1>L%}@GD^SzAyQK|TTNq$<&e^Sa^ z6BMo`q02Rae{Go*j_NCc#U%x*T3n_O2~gEcc4C9!f2% z%kCu%D_mSw@P+UfV}3MOmUHKoy;bGX#pN|(W!XQcoV}o2I=>vA9u$@Yb50NZC4qXL z;*EdYhdD6<$D9>(+Kw^}{Xhlla{oyFUoCU19XW#owJsmbUmUxF=( zfABYjhLVD2Y801|;8y?9hd-L-XFG7`cP| ziCiY+nA8Y0&OJzL9z%hFISaies3^zD1KOw!LtsU%kHJ;QkBbVjMuBPL9O@eYeRjD0b7*}&ZcDvd}HNDSId(U$Qv@8w(R#_wCgb&hOe` zWXqT?f&otx-IFtgmYw)>C^V-_#ONuRsVx&mE)rt~di`O|9k*SkcWu9!C(jsC7_-g3 zLyO#P;MC)%Y@aFBr-xSDU8iSfbN`vg%^2)FsqxyiblOPO1kJ2`dXmn1o(E+cfvivy zFeD+!0!(e!33mdTT0WKaN~wHM@Q;G*LPgWU9Z56kWs2#S0kq3(zMiyAUQMakRuh24 z$d+nqGZ@h3kw#9{&#iMB`{N?WH0;?lqu1<~u-PNp>uK2<_RhAJdS}`TZ3|G3RG$SM zt^K0D*?y(I;ebN_*#rFkYS7$)_2@xkx6*^6p`&4h@kSL#{!@&}kCw1C+#<%#+Ez?- zCaCdZoHsd~Bq#fmmWrwQDROEw@ z=Fi*FpRX3o-D$usKi1~byZ7HG`bl=5;!m`fc&GjReboUA_8)st{y=$9bl~5`!G!A_ zGUc!#huTLJp~cM{o;j*;OZ+WsOyiNvAZ!LQs!QdFy{0|V_@=Z8E{zE;AP-ET4abPK z3BRtPjyTe>BWYK|P{Mikmj@vzIj`N4r)an2dhvjHpC)el$$h{tzRsY9qPyp{<=~kx z^&CmSgXhEa3t{T{F!e&%D#hJ;8!7xdg?+d1)}Ysf7&>uC_yPIT_k^_pyQv+z5GOa} z(|IfJ7xL6e`^(9cn|g7j;GaHO}Tf_2e3|=qh7lwn3>YBkSr2$IEq5>iQ@ZzxP&I z7i(i^f^ZPK;4ByZPPSbxrZ76R6^gb-G>L1X;KsyV|Q7a5s|BO=|2WI-3&M?i}yp9eyZKiS|;28iknX7Btsrz zT#J>xh`kqY7jeCKPjs$%w0<-pmmgc|fY?*>v)Dy*K@u~u(u@Bp{nvZ1_{fbgACgP` zqSW@;?F!pl+l}77-*yk$#>U(rtaTaJ56G2>!GlE}EC+B9z|(1l0jL5Tr|%|^R#IHZI<6$;9$gms0mRtpab$W)_Ovszdeixd`fYn5Qc*U16=Lc0=OpE&}b z=5f|iVVxrI)E;jg=VIZtmx}NV8jswwc&sQxh%K6$))VBY$nXdub^OiClRL*rzGHK1 ztbSuL*VoZ?)lUx)0tA|W%4gR@0vO$&x7OuV(0yAT*x2p)v^`nS=)=Nu1T{O%I@CLU zhd%Ki-tm@OzzrGS%^k@d^AvlGot&iX+m=U`o$^8D#!kyk``OUPAxGxxt^WDGWrbE- zpcCEc>2*tn;mlb0SZGY?3`tzybU8k?%v9Id?$ttb^ACdaAjIYM7F59(q33`Su*7IM zjp-cNqa|cb8rr#Y{66AC*=$5#2snXY<`I197EQ)I09bsv2mTax1^*CzUlHLyg!c-D zgZ-UdUKHJb;hMNOZ$#&*03K>n z*-wQ10cVXV=nkIsGejDHw6TD$z~Q;o&-Gk>O6h4l?&Kjx^pu6yo@9GY9-?$u|8Qya z!x=GzB|TNK@-E5u7`hs3Mse zmAJ-m7@aEFhMr{BF)%}WOp^C5Ew8lz1?)X$Va|wlF`hLG7;-T8x2U$5_Hpk)2=h%G zZ4;0s^+PB@mQ?e!yiIP9MI(9z%07ie_A10%xHjv!3Fo{Vm&#~YydEd#XjDCn1+mzh ziw zrt((CtO9112-LuVJcg0ji(nSb5Z7Uru-R}y^)|XkFHArqrB_L>6di2!;Rjh>h3dw% z)`o24RBN21eFQ31+dPEB=4OX`u@Ci@mxaO&xe2!03 z+5eXdJ}pp&GmG-vV(Oe?z7)Kf8}XtXv7|8KyL)tW9G@LmAJq9f8ed|t(2GHhY|qfl1ep#lyOkDR z{Q=-Lxa0}>LS-LUsjmFL&ALy`TnIfJIH9;b*9n+e_X0k264KY!T&Xi*l{g3|-p&A& z%BjYnS(ZaCZec2epEb@jSqAX`nYx7Qk$(5-79mT^1vV6~WE~(0b8_p`Mbap9i2scn zrA3i11Qm0mRxvm0Hyx{*`Hxqr`nUenuS)#4jK6PvZFymb5zTP=xqlZ1* zXWep8cIwhOw_M1M%=+2OGUb~x9Z7}m6c{aE)^Asu2rc@%3kVi)07TYUt3Npa+Vyue z7Pl5F>YKvkhb4??XE=s2gFxGXu(<7uHaO6o;w&}ozzoUm$0%tZH^o>DW4KNnJUJOq z{b@VoP7C6CGHtd<9=chGMec!~P_LET1s$EHCA-lXQ+M_3cwtk1=LFu~u$sy#eL zXE?<7)LMg>mh591QU?d!esAXE{8&}|os6}>e)0Q*{6V$$he;9talF!9B1jJTgszeg z7G#?7v@=iU@5+dO)c6}~v}j2qTAWz4xPQ&ayAeAHj>Y?P#=18h-jS|FaY`zfsjVY5 ziT6QM{Xd%ydsL2kO!oe`DgEyze|=_~7c-PwFL^g7c7`0`DZR9BWX_q($9-;6Yyo=8@#!>V05FYd~>5)SiyuaI)JeB{Sn*@X<;$EwpkS)eDo>B$RRdh*ls|LnfPE@x2EZ^)67we&ED&p3U@U5i!7Q4t5_B2~8;Wps^#@>QrJz)3LAyK?@i13oij^-4@uMvCOP;O$ zG+$#TAabUA4cypK2ZKnf3t&%?6p0FPo}m3_7*Dz#OCl!dZ;S5rMa4?Y|1%?rfmJI8 z=R|S^KU3#L<^_D37e;bb#1jAOh`yj^02@_KwWLT}Ldb%5Zq$86G^4t%NHJMU$nydH zG8focI$7ekINPFj*MaqmgeDV&_FSZ6dlY&VK>rlqLy{8G!ZYHEoRT=4s0cD4sYp@* zYb$-|TwR%I#_Mj!b4^s{%s%e9eX4rPi%s(7CW`)#Cixs1Hs4-rvfku~e5*;mtIxdG zB>&Y!r9Nze4xLT0u2lMmO1<9H{Yg`GzWhlh1BlEU{bb9QN^!PD?XRP^PujXpNnK)N zbG2Te_T!NQdCT|a8co}BwOk_?7|}=^!V=l-jcOcek5VJcJLudF)~uh8X&il%X^pWL z7~i@e{r>7Wm!c)Pe-7l60lHPndN}aTcN#mSCHzv^>X{L zy8YH|ybGshn+yhnp0LwEQTk1ACS$`>nMp^zYEIf{4*k1hU0vvYCRmWj!25LIi=H`? zz|oHpb9HY%A=M%DCJpJdcr|jS-|3zv9DXoDeJV7L>1zh%NWj+-{g@|HUL)WR<&*>F zg0cWrG^X#Axk=ffXujR>#cTV}=}E5hTN5+U3Cp$c-;K^CC1gCKwq-e!R*pn3@ify? zHPMs@S5LG8Rv*PoBWC&8)Xvge)XP1k7bxo`y`tGX^^c9#b*{D1wTEj5`+yr<|CM$S zzPB~XyBc$MHfm)U`%H@J5b0RPhAGL?ohi7B8n^nf+imud8(dre)Y%MsbYpZ{V@K%y zwR*QR8s*uIxw9IHdb~K*u?o``u- zmD<@Rp@cQU-BXsBo*A!bcUmKoRi$3ui&C~5vxLk*Xa`!rZ0q?VhgO?&K-4FPLfaMz zXmxPJNz~b#-gm(S}~V7}mTMb`;N^pR;?gl8hfF{ld$)CW~@2ghD;C z`%aM?;MY_K0z8>DzzekV4_-Hhmcy*l_-Io|B85XL%xDt+mW zvPQb2GQQIhj>5G#G-_4Np6sTD`4dg_H&65SEWZ%Fe1lwyRdm z3xoQ)DQ{Rs<0lbXnZDVuSaCB}5racNm*1y~ZuR$G-^%NeM!#I<*}{4}AXJKdm-&3) zy%3ns1h$<=QDwyYR(7{!us&|X&cdX}56$GBB5Ry_pkOJ^PDLHq$hdqTo1;{w&qh?Q zEYvCi?e{WH4bYEqR_IuCy=~i-cor{-3T(lYvWJeUXi-=5147RqOTx@A^Wtdp?+HYo zZ$z`K2@H@9t^MTf`vl6ZM0MzmpmeQ0?RP97hF=2LvTNwPHIgqO88_z{7X-6D_kU0) z^e}R=0een&c_6=pvdoR~)ZQ5&&}#^bXqZZnNp}+|B1f;S&)-l#Rvy4c$?6Oj>rLV2 zP%e(@PK#QkxRhDtot1M}wU{#RiC}7evLTYnY_dqb9;U9w)*hYVEYS$d5LT7A)Sl( zeocej0@Q|mUm71-Z~2*G*O7u!Xfly~hp}a&U!D@`Q1+lHXC^`zgv%*HUM&b;Y*VZ= za|o-dRb5$W&LJvt5Eh+n$}GIkDadW6!Nw-y!VDNE7o6! zBfUGsV*&%jeS)YfDBPUhL|3@po~d`Npw)j!M8kyMPGzk%A~QKX1{YE&w}%so=#&N6 zIHK8&Mnq1?#{=Gs?TL|W)Ek|yaUtfqn}c2SsL(mhJ&8>UW3Fgm=*;;mp^I}eq+^XP zkjC32Fl#}R)o{dZ+zN>svtdgznxL3!ff_01MjIdxU@J4&BG8k??`);zS&|}9- zM9`Ifu#B-&6+xHyDdGMW1A_m1S6=5v*E6J0V-V2J8yxL=9fEkb&$}+Xi3G1zWD~8Q zB1>Ff*<5QiiRGz-R+1x;RBo`a(7~nhl%9E|( zZaquTAO&XKJp$83E-0oW9COU}G?2J7KOdnM3Hg9xxP;;qnjK~ZB%dpWuz0iypzjnX zvWB=L>CisTYr;Dybp$ePrpDf?XY4gftW_QH`xWLIwPg-=fjBN;mnztgE81{{wl;;< zY$n@d;j9O||2f(I&yx>%da~(YtK2gl4d(S~^gsX;o=}ON4PY1gd*Hkj6kZHmCT}l! zxIGuhq8bPquaVg^1So1|XE6LEG8a0*bUz;QB!;?7yQ}{y#g#uA_g!KS z8p`4II9NaD3gL}TjbQT@5;!}LtY^D0Q1|{w8!r-L1mk=b$)zt9#3wcyUxp>%&6$tf zzVEw3-GZFxWdG%6KI2R*1_?`QAto`7j_xaW*XbQpRt|RBbl`@z6?ou!^epTvi2NkX zkB7mwCN~IrW4Bn1&jFn?Rz=&%^!tIotZd8FuLHR{$Xyt)g0qqDCJx5~kqBZI+kph6 z>E)@h7Q#2mq>Xk`PlJ53INFDW<3%308|$N1!*h^$F!|WOM2*a2<>I!~ z=-X2xmQ>QGSHfpgv)@TkH?41dX8rdFIY+7v(!#^I);}H~MSmag6aO(lrYLAZmYJem zKAsGanXzE(q%GRSeB|OL>GpCi|MB2>8T0$QTN)0N`~eI1#4$jc*QgJ`)&^Ba+}j>W ziyk6&){}c0u^$KMet?pJan;4JdR>pLXkn`nogx}*8e~^*RJGbpzsr{GgQpv-(wGlL z;7Xuj6VH!oRz>okVOkbG4(0o#FZ4eR{ZB%h8Nfy|zmolPV5jSPCj)?}1JELdaTsH8 z0CBO+#N2U8$D}FXVHYwISVVw2s@~YTYl$`CnbvgV!wM3hFIQOJiTb)bjr$47E#0Zu zRWnYnAVU;p4y!b~LN}uWRW&MgA7YuWsT$LFRoKG@3&#Z4Hxewh&Pa!1I7h35N9(s8 z_1ihIo_K!zUO2g6MD@%=k5@N&?povTdHXOn*ooa-+s1J@qIx8Dans%r$&_qxbsV0{ zIlWgj?fs0G(j}>$)Zig|t=`ezTykzATVG^Zo^!L4xyeCsN0f2;?#R25UviBy??lOs zG`$UB86;ABG%_EL)UBSlg-5EF$?Y2NmtVEzo3?txcHh=}=67tliBI#Nw*1I8KeS1Q ziSn%ODOWe7_m#~Dn6>7EW%*dye6%bd=PwDc>@WK0hO&INY(7)wSE|sr>USQ5!1$eJ z1^Z?7)spyPj+Ms~$t<1|1USaN=k3jNG1AmCRLO^e#O|hdTD>F)Djyz}1KO7nX|IsZ zQypAVV66%%US@tra-(W*uBkP9xu}pjF8=Fh#B&W#wSv|M@IFLFhbPxq$G|Tmv5aEg!cA|vy;#?U)#m$lk~|HU znVY!GhC(2HlKem?u>(iY57-3(m}xmB@thS*ay)7?`*Jrnuy3DdV#2;JAh^ zHB8GaHLPXpqidLwgRwVmUBgmb!(65Af7Y-sP=~ba-l~Sqk7`J$UR=XrTrprv4b8ZQ zxazjl(8^MlxQ10%)st>d>~}kO5P7P}h7KQHCk)AL{BD{~1Rkdoca11zJex})t3Q&9 zH3;A%S^J@+q8~tVo8v8(lw%Qf722vJx$TwO)x|9asr5`%6-V*vePeH4t;Wl_yc{U& zL3t9(9}EnA5$PoDWK@M@sN>b>)ef<-BxOH{)W*uG-yn-&q15#6>=!CL2Y>dZvrDh^c?YWMc+-Ec% z$O+Tg>h|VWXAAvPYzuJrsX5s5T>ve6vx%IE!Ja%aA|$D$)zLdD*>1iM=S}tv1f{FG zdC`P?mfh%gqH>QQ#SJV6cKtn~^hcVq8IJBdv3WG#E=o5EGQRVkxmlPu2|xbc7k|4~ zGvZ1CM8Up5R0vtAZ35GPk(14L_k|(_NzH0ef<`lw0W1VQXqhOT!5zgN`N4PPQ+7XD z88mjFPYqMj1yhcW+})e4)ljHN`$CwcrJte!u<93QLa&#HP9bO4xy|G-ZSwsHGFKE+ zhjC7*_8WO?MWGk!wr1>kL7rcL-i6SpT2*;2Z$FXupUlgL^T8wetSvswLFy&l4{{ZP zGV1QkPrf^!k>eGql-s?}M5g3hrvF6VdNUUsiq}Xl1f6V^#;_PXDp+)0(*W>42=Oag zw~R`a$I+X|#QrM@uUHdn&j9w(dD#mFNK#JbWQLK5dRNIonY!p1gvnUF^jaWY7LF61+y#pHQX-XqN=(q1g`7m1qlL|u(e zVy%abl+nC;jc4;8NLm&P6mOWi<-jS z*gO4Rp}~_wk@fJ_cwV|EjO_HlW$bsAmz0Ph|n5w z31QSJX|6_}G0&0ar83AyJ*ft6*GVjf#fmiKZjK&Wzr-8 z)HUQ=E_6-uX4*5H$yO&B)SCh)h=S3|3G>Hw&ZM?$$H`%JQ3PiLx>9L^{^`I?? z7m$;=h5${BMKj3UAxEjcCRdvI`Iv_3y}B4<(w43+C#U;~+~1$Af!W`NZR%oy5{Vi= z-hwN=k2B0&O9psov{WB+v!`i~LUF!B6mPvnkOVu8ib;Cgl1UxWV^0$crx`8qlbuAK zCFG?8TSm_IdeS^Y?iP2%Xx8;%npC@lyuFHF65#)y6T6NE$G*VsE9CA*%P(lj=dEl9 zE!mwrHoHx3H{)utEg?HYrO1W_Pj=Z}j?KzkwEZ2e2`a03DS%uB)Cd+!xWKYy7a_-^iGl2- zCMj6k`6Q8+MQf_H;wI&tx@Ze+c!{RrA`* zZem_rBGg$z{s}OdbB6HFhz)GR)i&}4*D!uTD?g8eXG<&Bn8yOu({!QZ|E^gqT6u-A zQG0)uuu*>`bndzja7nwe*C)dKlre37ra=)O3;W+Ocq^i5va*)=%vu!{ha?lDhF@gR zk$x=_wdrBOQqZN-L^Kfhd@uWB=tYFUzym=Qx~GkZFg)Kl*f+e1#;x4AO`u>zfLloJE`uEt@A5nv%yX?LgY;LnNgn186YN!cPhl#%IgLKxCUKD$Pe$LK>d{1Ob zjFCUrSK=5$Y91u+rZ%fZY*vJFeg|ErMY>L@&RXMZ>Vc4B&bLCJf@dpCY3>l+jD2ZF z8#6{8RfU_cWGlca>2(d|x0Sd(8VwI>z)JyunW-9fZSdBi{inl*q&4@U3HaqqT#OvS z^iL8sZFK0|p!r8;#P8e2?;|$|`Lvi7e;@nf<6JpCJ~AeLe@AQ(&4x$fm9-$b%wD-B z{aA>6pm&k%65C}uYhsDx6T#LlGYy<$gf#jlZ4{sHi+@C)Pse{X>-R=T1~@X#`q*km zqgrF7Cjk!Bt*{-fP~la>tB$d(^C$NFt&jDoo=du-8FM3PoDIf@`U(%Y8Y6$|aHo>` zN)b9>7U2o%XGv4Kn0;wZE9J)xYGd?HT690v zp<7hn?8L2FbadQ8AJRf}%o(^|z}1+ii`%?~|ovz+=+iDGdipEo7 z6A#W&*WfyK>nsX~SzK092TCB^@dM{6(&`L|pPKa7_VH79j^E$q*>u><`2Ex5k9_>c zr1<^4Er;mt7n6d1=^1M&D5zfrnF*#Pb(1LEOp#k980ivRTy!LKUNZd`E?6g?(0iAj zLn?I-CYN>M4w?zpo;YPPSE|(Ys-0PLWqdeuH9x#g{6?jBs@54gRe*u5Od>Ak)l>Hl zzL$_zJ%8)-C6vH@kVCp{TKRjgc+zcYr&-7eIMiy?IQf8Z`o>=lGk;?C;oBH_pjkBA z`L>Nbz=<33B7q^wF!pAy1G;=k0NVM7u#Ry5CfH6tAyP@pYO`FkvC^XdPLX|1)%)QU zN}j32GHS9`oPo5dj?Zb7XdjICB`hx0v3Fc70`{;vb;pe$bXD-Jj*;qP@D@E|?`bhH z?vn2K{ez@q{0*YT@UAh9t9i7A8XqvDJ9tlJ0r}|`{U=NzL2Yciv(c~H5f5$H8e8SQ z)n=(<_)x+71R(Y?@_;0N)yY~pCzBPX8nWt*iAT@UV#Y?mE zrK;caOi!Iuysr#G>lL$ul00Rmv(@h0ljrB@HeHsUa#V-$=ALrIt$(kOaD9?30L7c! z+gccrHlF9dnT*AMO5+vE(4cE>Sr1X;--$oKwOD=5z_`A;!L{7oG6d*TEp!h^rpf}` za@r2|SN(*Kf4JM)_-@z4cUuBoQS~90#fQ&}4`2Gj;id86?|^}8_eD=i~5VJ>?VjuzB`l(K6gKN}bSw3p$rw!gfkh#rgr++pjI zl~`N!U63{B32u|rGm-TlC*ARmG`{2(p{}20-AF0ci7N@LuGX)i+U-5Fwc6!p{77<5 zmS<7UJtTk^I^64;NBOe6{LV(>Y=ChAGDDB>oF8bJs&K`e-G0t8Pwa zgZFo7Y~;3aCtKD7wEFMGAL84_OH|;94EK+JxY^qHX4l0x zTMVka`i#rt!xzSfFZ$u|+414i;=|YfaQFmWpd)oP@BZQ7LHgiAeelU24ld9KXX%5l z{BUrxJ~&z*{OE^+L-fJE`rxUlEyZfm2W$1gRVkZxT11+h7}{3c>bw zE|}qTnl1nEp+=u~Nv(*_S>SadqD@nvSa>R6b;UTSQ4_>4VP6SqQEK-B!#-S_0JRNK z;v6HzjRs9Ef_wm$*nt>%rV`ZN<`tb!@mRX-HsuM0V*j!$Dt~r4^}a zocnpHwr}j>*_rB}=VS)U;JyqsBE)qS@|DvjVZhUH*ew8TafTK%dr z%FdE^nS?TtbO-yYu!+El1L3Vv*jKTqq^1&xB{F;q;f;&u!UDGVdb_RlZ}|TJ!YE#} z+kE1?`spE7G56N|yD|42SA5PDyy6jxIEf7eV*oJqT;6D21jLDnF@75qdV5@Ue9pi= z8A4yA1}rhd(;={mpF9cWnW7FOpd3d+as?OW(3jPK6=rU^-b9S#Y>Pgt4`WQ+p2=2c z$hxRK%tUpDsynzHx>XV*)iJ9xl2cySc&@4MZ0th2Z=$|dR7>WP`mobbP3xp}hqUgY zb#i}_-o2Os3U^9YPc0RGLR|=C>W3y`L9b(@!Lf%4(UT_`hIX8QU13vH&uWV`L4`b> z5IVJ7^DGit!w2O%l4m#T^6e0YQ8VSkez8pR$T`9#M$1_Nl_Ms1F0WsCX4OuF3Z{l(h zH<>Vj$kgvm|KFNI>iKwhP#j5>Q1>dNdNxyBFOe9XkHM9}Yy04^qEG z@jbyXhNv8_-?HhWb+l3G4)n%AdwP@FA;)SdK`yG{RWVfUI!oQ8yqgt8_#!TXdRXMv zGiNBygBIVAg}+eDzgqPRy-R>{k^2{{9BWrjCSq}oUJstu0XY5XF)#WFzEaiyaohT{ z?LBS(WP=@h{cTNW#li|bCYiKG$Ue?+ZABx|8+@5eU%HSDh`0BYg>`$=`Mo0Ol1ZsN z&QQHhb?j3dZ?O}e=8Q|adnR`RK+p@-lvoJe)qCl^q|I$YG0q@nF$i;Hka-BJuC5Wb zZq;rWnpBtp?Tz2AI=XpKGw6ShhqV~0SzF$qsj}qr`6X#vIMiQ) zyE5Ur1&o^GQ4L(j*d#15Dunfn&+Bb@ot?QEI~Z23TkLvWiK%+H5_^t@N?E+F!#Zob zYIG%_3TWEWtxXmS^RjXUnCwILB)I1+zd;lcU+gGUB&WgV-fd#U_pk*=SDE z_iF8|W7@^n_3dfjj2XA?w#oU*59e!>_RnZB)1Xiqz43jYrp{jVO|gWRsP>SU>R}sbInkk}=mC0@-uF&`{yW$OV`<3`f@Z%78t|8LU9ryr zc1wFxuJm3m*p&0}J@_x?(6jFnYP6ns7@dIS??OA5n1aos39Hf~bFqxw)AgHWpGBl# zlaqqSM4ZELhM^`sn|n+=lgm7tt9d3jBXNh!M-!`vUy^~Yx8&xyLuzOoW2kx*O<k?e;DSYB=aZ)|qMPCt-GfW$drT4LzWRPE z^(Aqlx9O_|O`&_|P_99g=xlC#Cr5Urop>;zWCE<0*`}4b0`g74Y1YQTT*T_AZN;;; zyroYj-ne-3wuZXRBz2Z5zF{9LqCgd(h3z!3kD-5LG_|9>8 zV=Ybz;%)G`G7a@FhS7#ps*Dja&#~$Q?ar)muYMRQp)5|Nw1_2S$HvfOY)hwj+?}rl zeAG<};p)wqh-@v+hVZrzq~o)V6((Vgr^~_;pzxrQA#(+6M*J-7v00s=N*k39MW18t z%+^1juYcMJ7w=f(Dt;PVEX%71F@?2PU)@i&ft9HK>>$JFL^~Kuldl#)-2n&Q%06cm zI2%k|Kz(@_Q&YF=SUg$^m8>H%b&eptn#n1R+>R41Y!sKH?v{;5%uaer1#S^n4$R+j zYPOWz;XpA7irzT=(nf*fgTp#N_j*=(a(6yquhGdnlXRVblJOr8i}>TGYiNG;wQpR` z{g{%~Jhdxh*Q5n(mGg!$I26v;qw!u*Q4OrOgTVr*xwf75n(U1ObtKM z0f!CdCB9x}*K1!xjpm@TF!qWA-QNgjqPJJd4`%u+HTrmw5D*+>a|Kun@NDnRUt?=? zHKFAZW*&;r8BZUMe?r?UXY$JMsvk$IT@RlJ&}%n6J(Et)HQr`r>GP?TF4t9pPpl!U zW$H?4T_qu*#eZO7N>u|cm1!8CZCG^#nuxBR?*7L#=`Xt`fF^;Mp(g7IQBs!+cIFyy zL?R_DRirb(MFd3JnhwHfE+zU%tdSpTSHho@k8vMzL$w;eTKc!jSjt8|Y$He!%$zRz^}_tfRICEiu}0?1L3WAA>wTT9cVKEr zu+Vp-v0)IB7c*qx8&G&foa#)b)|;gA^oSN^_BEqhKHGj zMUSpu>*|m$D7K0oPu$H%IuF=H!kNj$urK3Dvr{vk`kVI>7GxM}g+a_`-q=)*utp6}Aut=)`yy-VW+fL{9h;R{WX+4;2@=zP zT#$Sm7yq$M{QjHd5G$j;pkMsHS;QYZ#_zr3_nQBo_luI>4USKD#_!v0RD>c^bPM;tr`Cd8y@{p!5%Vm=8$yPpUr+>o9m zrcYTISCh^WN^Q`IT7b=r;XCYn`5JyGGCFgC{+{oy5js&IBCfnU?8Ss=^R?Gvw#n5W zwjI;T-WRu&mvw^(RJTqyuv)xpULgeHBz|waLJOC-MJ9{HQ)yffE1f2&4ruI@MKT8K zdNX&8DKo>@ntr)Z3D%ecduMM_7T)bvwbq2pL%Z2({;n)gMe)dIH5mI4#Oc}RmG?JQ zC|8BcZ%sz`=wx(vkbd(-w!JR`7fFPoW&Q@#(v-N~K8tc-4s>x+n95NoI4#7E2#`<6 z@30~8U?l*JW}Ty!TVjRvk&Hh+5%I^f$zPu(f9(_>+jTi}NL`vX);oh4k;HI5K z0e?MEsP>@aD+a|6qw!;WrN@59p=2qfLNh;CIfnNS*G&FeB()W3gp)h3nugaerI zlX1QM2P&6d@P*oDndKF0Ls~*(A^xC8$aQ-BAe^+-i*GjyvAw)sj~ZtAXi1J^Inw&V zmJ`J{rrRwK(;Ai@9`6CNf#|iThpnXuTj-1QcmPaLJv=%4GnTyMXlJx>iGH&iEcv7w#;*0!W5V>{2VEb;jzI)+<+te; z{)8EO6U^9Rg?VH0*G};t{&Hdn)ccNc839l@Xz$>u7(uJT<7O*&CkM8)`h;7p+!I#e zSvIDClicD4P9EP=#wV?ux!^U+e?VhxwbaE~8aMw0{cS9}qSz2J0uRD_rm7diu{hh^ zBF-bLvy$KG=ujLXSI2G6@>gx$34V^qf6v^OPC%KVYT1J_ei}4XG=3zCMfW&4eiom$ zRxoZA@JqHDf1w54k3|k30!k{*XSAw<%&5W7i~I}B$Z9JhW#VDcAWtCd)PrxP%7|~7 zPohS&F=;f_aVw8nFOI~XzaA_L5@@|hYdV}wJO!S=z|lm4YzFcCd40~eMf!xEHo3qK zZnD!W?CSGQle9x!^2}B_OJ+>ag|WX>tDgTrT|Y(80?U#P#7G)<;97YndJExfw-C-I z*UAf%zg|r~My`QpLOtxjATkI6PDEgnnt3OM*tc4U3AfvM3{HRG&=$#km!12o9X)P) zf42R{Y*4(M(Bu7TCckv`Onn|0k=RHr9Zr?7s~F#>{zo@l=WNvt*E_-e zPWozCHFQUQmULmixFh}h1kJZW8drPzE+o8A*2DaE%hY>_gbMwias0;}Dy@rxXc>$2 zh|>sZ$HH4$)N-!-hpE?1#r2BNb-w7#8>+QZ5Bqzz4F76fRNuF*$#@(*TyTEMk;RoM z2|^*2JvRkExw^}X?u1f-i1}N+NE=l21KI!J|1*qv1TGBWfgCPjTBub!v-ii?W)l;o z@w5>jlqO>rVeBUiBGh%m|60)S_TfdtUZzPf*`iXe#{qhk$&!M}A43I3p`Ygu3lFsq zs@AU;w)+xbvG!yDw93hFbHEIwJG~p}*>f8<=ldPr%diPSd5)>wfja7;fNBpfUJ0v#J*~GCjNZ0 zuVIfhzQlo9MjUIK!Coil4EqFQ6+&UB9tpiKH{^GH<813(hR5kae2{p?3LAiG*@viq zXiibh?XVipmF-L)$`&<@0#S33xJiuho)U$}law(w8?G8X6SUey5X zW_Unc8kz7ekLxX`Gj2M$0hr=~)yue%uGUM#H!KbG8wvH+@-!r9Rfd4HEn#@k8FFIT zwWC@mdRF>V*t~j2Oo;nDYuNp;4C^k>8c$PEsJH$til2%wrr@bAOWP-vZo`9YTO8}h zjuyIa-Av4s7gRh)#%ZXUU4l~8f%V4Xu9h0WtBbwGe46A$KwD|ts@LfD8AtoPEK5HZ z$2%7j4CINLWzssjc#L)Q07##@j(2}StGQ8HL>CG3LP4_mmgBwSj=WNsR|)4B^XT*m z;zX_p_~n)>e*R1E964@@q}}v{Xrpltq7|BmnP5dA+Y(>)qI+i~jeR0!meoQHl{2mV zA>J!Nx)*tVDsJ^5vSN*}Khc;xqXgY-2-&LB{D_~YydZDp%`(;96n9zIX`-`eK)OtR)M{V#p*-3dTV#_$AWj%Q! zv5oACX~mvRPmRNvll0W(CN?`6-X}{B$nbt?-y^F%wO`UxO{yaMG59z-j(Yd>)kg8W zcJFNzpO~)#eXuVTWRJFB8%iUJEWn9Sj+#^BW6d0k_0{Fb?F^i0AiImOID`e=X&cLe@JYyyH_9 z=ybS+mUa`6cCWKcFV%F_L)6#8T%fnwhd{XC+9Q~kb1^o44lYPbzRTF^F}D6>me!l$ zeWrakl0jQHUzggj*#{)-|Cr=M7%I$E4`gDaalIqZ|kD^?G_`PZV z&h+{2dUu%i&8Bse83JY2)R94out?AsJ-=vJXIgid6Ye&xKbZNuxj_7hbD8*Vlj8f- z-^=q;_bdMaHul~fYTL`SJx@=n2*h?@=FtSvEcfGc3PY@gO;SMsdqta>mh{6zLLF}& zWY1(0${dSTr(c~@o6tZGVJ`K74#SHfdJto1R1Sipjc({88kkF6$Tn~agm94s0CB2w zqSdG3W(aB!m%5WyT6#{c;0du7aH?F625UcK8mq8a#hSphNi!>i<5e|*NxRY(J5H~p ztJ6kn0+m=3D94&WC7CE%6PRm{k}E~Ro~BiSig|HW6*yGwiYl<9Immb#!=jeHBn!nC z&sGLoh*|X?L`+DW09p^osd11=1q`RPAdc4vu~y(@YBB64)e`qRs{>=;L|z56#rO#0 zAzSLxR8_L2S6Sx87OR`NR9R=J%BjjbMV)xI@_u6#F11>cKIw}lc50#}#L>2==|yWS za?N(QqNKLfAp8+J=7=K8W*%EzmgoTJ29#26kUq&uRg|AAYRZH9<+*&SmDE#y&l~_ zci9z*ovvd!qT1ex!956tz@*{zL?FDKm;M~e-&e4JqA6s+=`|WR6R6eVTK~5EO;)R( z1s^IsrXvx(!oDYNrsnP5RpvX&-=wTZmGxNs-fZ*Ndn(sdZPYDSUo0L`=EEwCwFc{1 zm3hnRc%f(CSu3U!cU#Y^MNZ~(AvpZ*WOTnHSnd|k$n&g5x2%^7wlVT43?y-7XyjH( zP4u6+9ixTCB8E1w^fSzJsI*OtL|0slK46Dj0My$}#`FWW?u8ZNT>Ovp!!6QyjDA?8 zbJoVQ@9O{3+WxGywhw^0e{PfZJUZf9t*RFe-y(y@(T>yN!PRJdYnLvx#45|V6WJKA z$CV2#>wIh4D$BdUE?jF@=eSmkwrBWirIRi`8fAGb(kY(7+q2T_Lw_ey6lPM3DX+(F zqp`%H@ZOw5XP06)P;TJZK?RKl(K`G98nHDo^bS$u**= zr^ui3opF1iQ(WbQ7d!S!^dxO9zX5BxTrE4U(BpO&cCOj#B(7Dv(BU46tRA}=UY-2C zT94gYF4ALnkvmAXDeFGRy$1pzai6V6E-_ha9dnJNC-|jy?H}#AEmkwpGUgv_?;hK| z#I`QAtxIgL*^V*HVKRcZ`qe72$~G^y)5!?F%Ff>Ablj*1q*e@S@lDk;a(6}*n9k>Z zVmplNai21RKNE6CtJe?1_XUP;T&ErxLC(5bIhPtq#wf{H;z3M?J}s;1)8=>(uhN59 z+eIww-N_(c;abK;*fio{tL5IiiQMa0!@6icLTUmuogAXUvx{k+znKs~&@hvwrLCuo8iBlnxA^8l7$Y)OJODFuou|KYM)4fC| zh}ClL6=?eQY^@Ern3%KbD7pi*1^qUjjc-Bi&EGmjtxnCRX*IwSn{ei3)LgXjjaaf6 zD_1zWpF-BzBUU@^6;5uolf9B-$!a;_Qpdc+DPKhdSLzzqz0vJQbJ4puaYd-7*yV2F z24_JF0bTKxVT-lYv2JkO8y)Km$8EObPpjGM5lv{amx(WJ^9wt7rBGJ^R&_F0x^tJg z>^gLpE?{a-V$mAHlADE4Cnd(Sf2pB8`Y~l|2(X_mHM|C0?k1t=f%}CzP0AgeMiQTL z4{ae^jsavgo!no{q3R`Ek2!b;^fEhvzAVGB?E2$bb_exh<5~iPLltqSwPL00Sv%>|ZLrqs{i6qoMl2zEVGd&945KJ|%0bHOZC}ks z*ZQ+leA4lraLyHfalBXE!ppiHwHh;pwpx)anQ>qgjlE5E$&B}R^Dvg_G;sAOJP|b= zfFH5vdGY@Go|LZP-lvL%MdJaUU1{5{eajlDvw06l*2f`Oz_3iCEW+#IRb%}U-VFED&#OUfUS@SuYZv(|p zATPU^wcb5a*!s66WbW!TEWe6aKykLjTy?4dkr1^WO0bZ&Hr9@%0kFGxM*JZmKTv(^x2D zbx|+zhyQq?oD(mUEyhFC;qiclve#G&UTgd-u#HcXQr(=Cs`u8VnjM#_xAApQI^P!; z`OY0dPpMY=)_MNyi+u08pm252`-f63h)WeSAZW#7Dy8D=)~ojHxG=qq#bG=J31cf7 z%fgbZ>)7sxUD|N=`va3HIEuv?xid7LiPwkmn(^nL^kfh|5!jCe$-e9cFW#5^1vD%I zW+6W33VM@^ryl#pg#s$J<$85+czNb7NckF;4;PC_S^ZYapgbvhv`}1V4l{0tUqnZo z5X-B*S)O>yua1$@>w#PG%I*{Xv`xPIp5NVL!PsJ>x<$O}i?f1ctG4B+**pQopy})Y z#K-&kX2nE*+ZE~SJn5TH_}&M8@SU$!^Q?5g_uUVDEA1_U!9{%1^YATq8}_O1e&SF3 zl*~Fof$TG1{nr)8eeHW^h51vtS$snRoVnd8V&TU@Q3urO`KwK5u<3yN zzrjJBG|V*FtrEb6GeOwHtzB8sEcn|^&r1cl$yrFhg_jL*$TgwAxMCQb3lsCIRH#L} zl}%-{;)>(SUOhdmt=xia1Ny~EH_Uif4?$SOu9q7$i`Yl7i1D#G`KZ~T?K>~o#s^`$ zM1um_<;jsN#8n7@iaGLx%f&A$=9s1%MXyRwqkTzwfnTH-rLx#v?j3(Fko%wjm1)4L zmkt9wiW^j40B>CFbZl3*v)G>|_Km`tj67Q*Rwc{tA4&WbHOM_3h)%bx zQNN7uKQESRNC4up_%|4jV3HidGBFt&C&2a-FJF8AYGK8=I~rn5wFy4a-9HRN+Mq-x zj>LS6q#Por5}9&O6dLzNisv73TOtyEv=`Yi772~U`l$3`AYKZbuYlMldyy9c>-k{E z7Xt6Su&^oIYA>>TEE2ZtMYgMI^jmE~cC0G$FIP+W3WeC16k^@~D8$ayLcAW8z6r#) zfdf}&wGdwi)>pyKUkBbqcLh-l_-IrDG}d zd{lZV3SW%uXCuAAcv`;V!~O)0z*E6+JTf{1q zK|ZlbPL$RM((V5jidRDOyQD%NMVS}FF|UN~Kf+nBgvI+qAp8q~_Fh3AuCzAD64)iM zn0qgU=8Iu*W0;rX^e7QNX_m{_ux>U_M1f5&iQLnp;*uzRdfL58xbKGIy|60Qwn&zv zH-(vRqPhQyn6Y{^_hXqk2cHAZM!vC#jY2pyKq=M=z@T34jsdT#t)3<1{$d1vJ7P{I z$e*QlviGoy{vN?(zY+W{MnFw(-L6KO8ywZmH#$FV8`KCF*j*9*Rm+9p)Cf)lfGy1L zVyb|%w;36!x8f5~Wz(S>6~i>M+|3Gdn3%cMUM0y{dFHI&_b@pEf)DnxYv4&fEu&Ew|3iTy>I-J8olO^D;n-M!q}?`d1^&j z3u-{NE-B$-D{pg1=BaGJ4k}o*9}gdA}g{H>XS3 z^EC%!7tXNWa<+I!aQ}_iAYxBI^eUBh?~?>Ip=`>)wA{nh&$Z!L-*zAN8%HF?+<`9# zGAlS!V*7iXg56Bt=Ntlf@F?7qd?dH~MiMuyZ+8H<^X1Rv1Sjfg0T?KzQHt2Qbeqr+ z1)TvnzAJ+s1aS*fWuyG9d==EPi_7(M_CPr(mG_2ivqOsc=>^lYlTnYq-)ZzU(rpj< z3P2t`fPiUH)p_z@p+klC;8tr%wz)?8#qBkuH*r5Sjmuz|Xha%X_5dP)h)`E14wAHM zL3&mrr!(;m&)YilhJFNLAn^`$3eVq`pOJo3;&%)=-Hsvb7L!I;FD?UdG}UlFlEy=F z6dQAkv@Wv0S)+4U=yn{!On6WvbW=wwLZ?xI8)RM+QK9b=S$?mubzwJ}=a8>>sNp_m z;vU;c7EhFN59uD?MSo6Ib9BOWU8oC9mRRb2q;Y=3-vZpJsOeRu1FEay^i8umvAoz z<3<(lRH6-HH^co(00HuXvQOm~ne%YKH_AgHic{WZ(_5s>F27Mtu}za(lr z@~h(%cuve`$s#^iY^x5JP3ADs;I`AQEnz%Zi{_2g>??su!edCs4ZKLKkDU)0oDY|q zEo^uqnz)VtdNH7Oq&doyeMXyOxEy1gO|nh^&I3miqMgyE65ak0<82E2keHGP6Sp?- zR}xbR%*e9d{GEXBwSYyHA7}=+|6>&WjE*$vI+MlF#EW(`O|e4Ugr+#ta8I|4yUhj= zqne~uX+;WaAu5Uvkz*rc!g-VZ-nGAQ<(DqhOn99Nu5{9$x#DwbOAL(5k*{3qYuD1p zlW$+SN@Tuu&2L;MdH1{`V0c}FLG;^5YLLUobFoHVu**N3=sEc8yUfY+5W2B+i>p@ z=C=50&(%4!Jzi7QMrn4dg~q?k!{iQ*nIlp>DyP~B8*gNzIzl$1jp>M#P7NuMjz5r4 zPi#pfZ0ZBMl_&dRqzRHf!ofu!H4UllwihPD@H2s@rxUM3fZ)*Cd zC36T?-i5{ou%PMQT+Tm0RY&MO+Y;uG#ym_wmn#F(_p;Tk+rj8U8XFCcWe6g%0)BEB z5l=u?wUd^3Z+)j}@r{m+-)rOdXsaW9?_~f=1rCl9Z)cE=Y5oPW5NIkN0L9S91Rd$t z5w!ytN}4aOI&@3y7t^d5xI3G$2`OB~v8sfmyc|QcHfOh}&nZLsY3JM221h*Y{CopS zo(qx0FnTwmlK^4~02E^C%>#SgyG`Q-kOl`|V-CC4G_Nr;*P2Dz3a%CA?NRcGid(ki z{t^eKx5)Hz;(il)&xeS(kL=(ve=B=*I#fg;$#U$?V7I%rOWLjiEn-xm})Oio@`Q>kyy*8r7x!;1wWL z$qF%8zNo|rh~>$|!JD-x1HTb)h5Ub{y#<(E)!Fxb*4k_P*~fL{%o*2AGI2ME5+#rp zC{m=Q6pEBmN}tjYJXjJ!2qi#pDG-Wl6SR0ztat(s#UW^Mczl;Ay#Mw&bNLC#bySYp24)lBy5b+?Vozx?yfMm zPgTERw9$aKwdNV%T%704$WpUc9i#@{D~BOaBFYBV+CK!wroY0+`3 zFm9n&>bO}LH?geI-OY^xk|8Sd6C%;TyXh|V8iDY05U&I7Pgh?0YQR7mib4(DUd!A= zB|d;pC6=ijc>5hsSJ2qVq7LZP4~I@SK)xj?@G{-W zk9jD1l3wVbZzB6l736P!s6X%%m z)#i`X=(X~&>&QM|Z2};nJLI$d?^g9s&L%VufHC-vzY84C33-U>fE7h+Z5n@iJRfU2 z`azN#9}6F}&TSF5mkIAMx0edC$hZRT&rU5iiG^}<;JDfO%R75cuvUM?TS4JJSqbc&S;v+Ozh; zC&R1B;^x@f=}j@QId-?bDK;5_fz%WKw0~wX+C4tKPhW&B_qLVQFpFzR%0ATkC(sgHhN;L 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%0A9s;s*na23=wMlcE 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

  • f*Ym0+jOy@W-?f85 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