Product Datenbank Schnittstelle angefangen

This commit is contained in:
2026-08-10 18:28:10 +02:00
parent fe52b3cf5c
commit 132f0de90b
6 changed files with 288 additions and 0 deletions
@@ -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"`
}
@@ -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"`
}
@@ -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"`
}
@@ -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"`
}
@@ -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
}
@@ -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,
}
}