diff --git a/buildtime/server/src/scpq-editor-server/models/product.go b/buildtime/server/src/scpq-editor-server/models/product.go new file mode 100644 index 000000000..0d5f213ab --- /dev/null +++ b/buildtime/server/src/scpq-editor-server/models/product.go @@ -0,0 +1,11 @@ +package models + +type Product struct { + ID int `json:"id"` + Label string `json:"label"` + ProductIdentifier string `json:"product_identifier"` + Properties []Property `json:"properties"` + Products []Product `json:"products"` + ProductStructureNodes []ProductStructureNode `json:"productStructureNodes"` + IsEqualPropertiesEqualValues bool `json:"isEqualPropertiesEqualValues"` +} diff --git a/buildtime/server/src/scpq-editor-server/models/productStructureNode.go b/buildtime/server/src/scpq-editor-server/models/productStructureNode.go new file mode 100644 index 000000000..bf70dd435 --- /dev/null +++ b/buildtime/server/src/scpq-editor-server/models/productStructureNode.go @@ -0,0 +1,8 @@ +package models + +type ProductStructureNode struct { + ID int `json:"id"` + Label string `json:"label"` + IsOneOfStructure bool `json:"isOneOfStructure"` + Products []Product `json:"products"` +} diff --git a/buildtime/server/src/scpq-editor-server/models/productgroup.go b/buildtime/server/src/scpq-editor-server/models/productgroup.go new file mode 100644 index 000000000..1b7f2fcc1 --- /dev/null +++ b/buildtime/server/src/scpq-editor-server/models/productgroup.go @@ -0,0 +1,12 @@ +package models + +type Productgroup struct { + ID int `json:"id"` + Label string `json:"label"` + ParentProductGroupID int `json:"parentProductGroupID"` + IsVisible bool `json:"isVisible"` + Path string `json:"path"` + ChildProductGroups []Productgroup `json:"childProductGroups"` + PropertyTypes []PropertyType `json:"propertyTypes"` + Products []Product `json:"products"` +} diff --git a/buildtime/server/src/scpq-editor-server/models/property.go b/buildtime/server/src/scpq-editor-server/models/property.go new file mode 100644 index 000000000..f164da23e --- /dev/null +++ b/buildtime/server/src/scpq-editor-server/models/property.go @@ -0,0 +1,8 @@ +package models + +type Property struct { + ID int `json:"id"` + Value string `json:"value"` + PropertyTypeId int `json:"propertyTypeID"` + IsTerminal bool `json:"isTerminal"` +} diff --git a/buildtime/server/src/scpq-editor-server/repositories/productgroupRepository.go b/buildtime/server/src/scpq-editor-server/repositories/productgroupRepository.go new file mode 100644 index 000000000..bf2bcefc0 --- /dev/null +++ b/buildtime/server/src/scpq-editor-server/repositories/productgroupRepository.go @@ -0,0 +1,234 @@ +package repositories + +import ( + "database/sql" + "log" + "net/http" + "scpq-editor-server/models" + "strconv" +) + +type ProductgroupRepository struct { + dbHandler *sql.DB + m map[int]*models.Productgroup +} + +func NewProductgroupRepository(dbHandler *sql.DB) *ProductgroupRepository { + return &ProductgroupRepository{ + dbHandler: dbHandler, + m: make(map[int]*models.Productgroup), + } +} + +func (rr ProductgroupRepository) CreateProductgroup(Productgroup *models.Productgroup) (*models.Productgroup, *models.ResponseError) { + query := `INSERT INTO product_groups(label, description) VALUES($1,$2) RETURNING id` + rows, err := rr.dbHandler.Query(query, Productgroup.Label, Productgroup.Description) + if err != nil { + return nil, &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + + defer rows.Close() + var idstr string + for rows.Next() { + err := rows.Scan(&idstr) + if err != nil { + return nil, &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + } + if rows.Err() != nil { + return nil, &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + PropertygroupId, err := strconv.Atoi(idstr) + if err != nil { + return nil, &models.ResponseError{ + Message: "Propertygroup id not int", + Status: http.StatusInternalServerError, + } + } + + pg := &models.Productgroup{ + ID: ProductgroupId, + Label: Productgroup.Label, + Description: Productgroup.Description, + } + + rr.m[pg.ID] = pg + return pg, nil +} + +func (rr ProductgroupRepository) UpdateProductgroup(Productgroup *models.Productgroup) *models.ResponseError { + query := `UPDATE product_groups SET label=$1, description=$2 WHERE id=$3` + res, err := rr.dbHandler.Exec(query, Productgroup.Label, Productgroup.Description, Productgroup.ID) + if err != nil { + return &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + + rowsAffeced, err := res.RowsAffected() + if err != nil { + return &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + if rowsAffeced == 0 { + return &models.ResponseError{ + Message: "No Productgroup found with the given id", + Status: http.StatusNotFound, + } + } + rr.m[Productgroup.ID] = Productgroup + return nil +} + +func findIndex(slice []*models.Productgroup, target models.Productgroup) int { + for i, v := range slice { + if v.ID == target.ID { + return i + } + } + return -1 +} + +func RemoveAt[T any](slice []T, index int) []T { + return append(slice[:index], slice[index+1:]...) +} + +func (rr ProductgroupRepository) DeleteProductgroup(ProductgroupId int) *models.ResponseError { + query := `DELETE FROM product_groups WHERE id=$1` + res, err := rr.dbHandler.Exec(query, ProductgroupId) + if err != nil { + return &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + + rowsAffeced, err := res.RowsAffected() + if err != nil { + return &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + if rowsAffeced == 0 { + return &models.ResponseError{ + Message: "No Productgroup found with the given id", + Status: http.StatusNotFound, + } + } + rr.m[ProductgroupId] = nil + return nil +} + +func (rr ProductgroupRepository) GetProductgroup(ProductgroupId int) (*models.Productgroup, *models.ResponseError) { + + if pg, exists := rr.m[ProductgroupId]; exists { + return pg, nil + } + + query := `SELECT id, label, description FROM product_groups WHERE id=$1` + rows, err := rr.dbHandler.Query(query, ProductgroupId) + if err != nil { + return nil, &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + + defer rows.Close() + var idstr, label, description string + for rows.Next() { + err := rows.Scan(&idstr, &label, &description) + if err != nil { + return nil, &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + } + if rows.Err() != nil { + return nil, &models.ResponseError{ + Message: "product group id not found", + Status: http.StatusNotFound, + } + } + id, err := strconv.Atoi(idstr) + if err != nil { + return nil, &models.ResponseError{ + Message: "Productgroup id not int", + Status: http.StatusInternalServerError, + } + } + + pg := &models.Productgroup{ + ID: id, + Label: label, + Description: description, + } + + rr.m[pg.ID] = pg + return pg, nil +} + +func (rr ProductgroupRepository) GetAllProductgroups() ([]*models.Productgroup, *models.ResponseError) { + var Productgroups []*models.Productgroup + query := `SELECT id FROM product_groups` + rows, err := rr.dbHandler.Query(query) + if err != nil { + return nil, &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + + defer rows.Close() + var idstr string + for rows.Next() { + err := rows.Scan(&idstr) + log.Println("Productgroup id", idstr) + if err != nil { + return nil, &models.ResponseError{ + Message: err.Error(), + Status: http.StatusInternalServerError, + } + } + id, err := strconv.Atoi(idstr) + if err != nil { + return nil, &models.ResponseError{ + Message: "Productgroup id not int " + idstr, + Status: http.StatusInternalServerError, + } + } + pg, err2 := rr.GetProductgroup(id) + if err2 != nil { + return nil, &models.ResponseError{ + Message: "Productgroup not found with the given id " + idstr, + Status: http.StatusInternalServerError, + } + } + if pg != nil { + rr.m[pg.ID] = pg + Productgroups = append(Productgroups, pg) + } + + } + if rows.Err() != nil { + return nil, &models.ResponseError{ + Message: rows.Err().Error(), + Status: http.StatusInternalServerError, + } + } + return Productgroups, nil +} diff --git a/buildtime/server/src/scpq-editor-server/services/productgroupService.go b/buildtime/server/src/scpq-editor-server/services/productgroupService.go new file mode 100644 index 000000000..63afbae10 --- /dev/null +++ b/buildtime/server/src/scpq-editor-server/services/productgroupService.go @@ -0,0 +1,15 @@ +package services + +import ( + "scpq-editor-server/repositories" +) + +type ProductgroupService struct { + ProductgroupRepository *repositories.ProductgroupRepository +} + +func NewProductgroupService(ProductgroupRepository *repositories.ProductgroupRepository) *ProductgroupService { + return &ProductgroupService{ + ProductgroupRepository: ProductgroupRepository, + } +}