102 lines
2.5 KiB
Go

package models
import (
"context"
"errors"
"github.com/oklog/ulid/v2"
"gorm.io/gorm"
)
// Company repräsentiert ein Unternehmen im System
type Company struct {
EntityBase
Name string `gorm:"column:name"`
}
// TableName gibt den Tabellennamen für GORM an
func (Company) TableName() string {
return "companies"
}
// CompanyCreate enthält die Felder zum Erstellen eines neuen Unternehmens
type CompanyCreate struct {
Name string
}
// CompanyUpdate enthält die aktualisierbaren Felder eines Unternehmens
type CompanyUpdate struct {
ID ulid.ULID `gorm:"-"` // Ausschließen von Updates
Name *string `gorm:"column:name"`
}
// GetCompanyByID sucht ein Unternehmen anhand seiner ID
func GetCompanyByID(ctx context.Context, id ulid.ULID) (*Company, error) {
var company Company
result := GetEngine(ctx).Where("id = ?", id).First(&company)
if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
return nil, nil
}
return nil, result.Error
}
return &company, nil
}
// GetAllCompanies gibt alle Unternehmen zurück
func GetAllCompanies(ctx context.Context) ([]Company, error) {
var companies []Company
result := GetEngine(ctx).Find(&companies)
if result.Error != nil {
return nil, result.Error
}
return companies, nil
}
func GetCustomersByCompanyID(ctx context.Context, companyID int) ([]Customer, error) {
var customers []Customer
result := GetEngine(ctx).Where("company_id = ?", companyID).Find(&customers)
if result.Error != nil {
return nil, result.Error
}
return customers, nil
}
// CreateCompany erstellt ein neues Unternehmen
func CreateCompany(ctx context.Context, create CompanyCreate) (*Company, error) {
company := Company{
Name: create.Name,
}
result := GetEngine(ctx).Create(&company)
if result.Error != nil {
return nil, result.Error
}
return &company, nil
}
// UpdateCompany aktualisiert ein bestehendes Unternehmen
func UpdateCompany(ctx context.Context, update CompanyUpdate) (*Company, error) {
company, err := GetCompanyByID(ctx, update.ID)
if err != nil {
return nil, err
}
if company == nil {
return nil, errors.New("company nicht gefunden")
}
// Generische Update-Funktion verwenden
if err := UpdateModel(ctx, company, update); err != nil {
return nil, err
}
// Aktualisierte Daten aus der Datenbank laden
return GetCompanyByID(ctx, update.ID)
}
// DeleteCompany löscht ein Unternehmen anhand seiner ID
func DeleteCompany(ctx context.Context, id ulid.ULID) error {
result := GetEngine(ctx).Delete(&Company{}, id)
return result.Error
}