Files
simpleorm/repository/repository.go
T
2026-05-23 20:19:25 +02:00

137 lines
2.8 KiB
Go

package repository
import (
"errors"
"reflect"
"strings"
"git.gdulai.com/gdulai/simpleorm"
"git.gdulai.com/gdulai/simpleorm/exec"
log "gitlab.com/gdulai/simpleloglvl"
)
type HasPK interface {
IsInsertable() bool
}
type Repository[T HasPK] struct {
conn *simpleorm.DBConnection
orm *simpleorm.ORM
}
func NewRepository[T HasPK](conn *simpleorm.DBConnection, orm *simpleorm.ORM) *Repository[T] {
return &Repository[T]{conn: conn, orm: orm}
}
func (r *Repository[T]) SelectAll() []*T {
selectExec, err := exec.CreateSelect[T](r.orm, "")
if err != nil {
log.LogError("Failed to create select execution: %s", err)
return []*T{}
}
err = selectExec.Execute(r.conn)
if err != nil {
log.LogError("Failed to load projects: %s", err)
return []*T{}
}
selecRes := selectExec.GetResult()
res := make([]*T, 0, len(selecRes))
for i := range selecRes {
res = append(res, &selecRes[i])
}
return res
}
func (r *Repository[T]) SelectByPk(pks ...any) *T {
table, ok := r.orm.Cache().Get(reflect.TypeFor[T]().Name())
if !ok {
log.LogError("Could not get cached Table!")
return nil
}
var whereStmtBuilder strings.Builder
for _, constr := range table.Constraints {
if constr.Type != "pk" {
continue
}
for i, col := range constr.Columns {
if i != 0 {
whereStmtBuilder.WriteString(" AND ")
}
whereStmtBuilder.WriteString(col.Name + " = ?")
}
}
selectExec, err := exec.CreateSelect[T](r.orm, whereStmtBuilder.String(), pks)
if err != nil {
log.LogError("Failed to create select execution: %s", err)
return nil
}
err = selectExec.Execute(r.conn)
res := selectExec.GetResult()
if err != nil {
log.LogError("Failed to load entity: %s", err)
return nil
}
if len(res) != 1 {
log.LogError("Invalid result number of results: %s", len(res))
return nil
}
return &res[0]
}
func (r *Repository[T]) Save(entity T) (*T, error) {
// Insert
if entity.IsInsertable() {
insertExec, err := exec.NewInsert[T](r.orm, entity)
if err != nil {
log.LogError("Failed to create insert execution: %s", err)
return nil, errors.New("")
}
if err = insertExec.Execute(r.conn); err != nil {
log.LogError("Insert failed for entity: %s", entity)
}
return &entity, nil
}
updateExec, err := exec.NewUpdate[T](r.orm, entity)
if err != nil {
log.LogError("Failed to create update execution: %s", err)
return nil, errors.New("")
}
err = updateExec.Execute(r.conn)
if err != nil {
log.LogError("Update failed: %s", err)
return nil, errors.New("")
}
return &entity, nil
}
func (r *Repository[T]) Delete(entity T) {
deleteExec, err := exec.NewDelete[T](r.orm, entity)
if err != nil {
log.LogError("Failed to create delete execution: %s", err)
return
}
err = deleteExec.Execute(r.conn)
if err != nil {
log.LogError("Delete failed: %s", err)
return
}
}