Files
phishingclub/backend/repository/attachment.go
2025-08-21 16:14:09 +02:00

184 lines
4.4 KiB
Go

package repository
import (
"context"
"github.com/google/uuid"
"github.com/oapi-codegen/nullable"
"github.com/phishingclub/phishingclub/database"
"github.com/phishingclub/phishingclub/errs"
"github.com/phishingclub/phishingclub/model"
"github.com/phishingclub/phishingclub/vo"
"gorm.io/gorm"
)
var attachmentAllowedColumns = assignTableToColumns(database.ATTACHMENT_TABLE, []string{
"created_at",
"updated_at",
"name",
"description",
"embedded_content",
"filename",
})
// Attachment is a attachment repository
type Attachment struct {
DB *gorm.DB
}
// Insert inserts a new attachment
func (r *Attachment) Insert(
ctx context.Context,
attachment *model.Attachment,
) (*uuid.UUID, error) {
id := uuid.New()
row := attachment.ToDBMap()
row["id"] = id
AddTimestamps(row)
res := r.DB.Model(&database.Attachment{}).Create(row)
if res.Error != nil {
return nil, res.Error
}
return &id, nil
}
// GetAllByContext gets all attachments by global context and company id
func (r *Attachment) GetAllByContext(
ctx context.Context,
companyID *uuid.UUID,
query *vo.QueryArgs,
) (*model.Result[model.Attachment], error) {
result := model.NewEmptyResult[model.Attachment]()
db, err := useQuery(r.DB, database.ATTACHMENT_TABLE, query, attachmentAllowedColumns...)
if err != nil {
return result, errs.Wrap(err)
}
var dbModels []database.Attachment
dbRes := db.
Where("(company_id = ? OR company_id IS NULL)", companyID).
Find(&dbModels)
if dbRes.Error != nil {
return result, dbRes.Error
}
hasNextPage, err := useHasNextPage(db, database.ATTACHMENT_TABLE, query, attachmentAllowedColumns...)
if err != nil {
return result, errs.Wrap(err)
}
result.HasNextPage = hasNextPage
for _, dbModel := range dbModels {
result.Rows = append(result.Rows, ToAttachment(&dbModel))
}
return result, nil
}
// GetAllByGlobalContext gets all global attachments
func (r *Attachment) GetAllByGlobalContext(
ctx context.Context,
query *vo.QueryArgs,
) (*model.Result[model.Attachment], error) {
result := model.NewEmptyResult[model.Attachment]()
var dbModels []database.Attachment
db, err := useQuery(r.DB, database.ATTACHMENT_TABLE, query, attachmentAllowedColumns...)
if err != nil {
return result, errs.Wrap(err)
}
dbRes := db.
Where("company_id IS NULL").
Find(&dbModels)
if dbRes.Error != nil {
return result, dbRes.Error
}
hasNextPage, err := useHasNextPage(db, database.ATTACHMENT_TABLE, query, attachmentAllowedColumns...)
if err != nil {
return result, errs.Wrap(err)
}
result.HasNextPage = hasNextPage
for _, dbModel := range dbModels {
result.Rows = append(result.Rows, ToAttachment(&dbModel))
}
return result, nil
}
// GetByID gets an attachment by id
func (r *Attachment) GetByID(
ctx context.Context,
id *uuid.UUID,
) (*model.Attachment, error) {
var dbModel database.Attachment
result := r.DB.Where("id = ?", id).First(&dbModel)
if result.Error != nil {
return nil, result.Error
}
return ToAttachment(&dbModel), nil
}
// UpdateByID updates an attachment by id
func (r *Attachment) UpdateByID(
ctx context.Context,
id *uuid.UUID,
attachment *model.Attachment,
) error {
row := attachment.ToDBMap()
AddUpdatedAt(row)
res := r.DB.Model(&database.Attachment{}).
Where("id = ?", id).
Updates(row)
if res.Error != nil {
return res.Error
}
return nil
}
// DeleteByID deletes an attachment by id
func (r *Attachment) DeleteByID(
ctx context.Context,
id *uuid.UUID,
) error {
result := r.DB.Where("id = ?", id).Delete(&database.Attachment{})
if result.Error != nil {
return result.Error
}
return nil
}
// ToAttachment converts a attachment database row to a model
func ToAttachment(row *database.Attachment) *model.Attachment {
id := nullable.NewNullableWithValue(*row.ID)
name := nullable.NewNullableWithValue(
*vo.NewOptionalString127Must(row.Name),
)
description := nullable.NewNullableWithValue(
*vo.NewOptionalString255Must(row.Description),
)
filename := nullable.NewNullableWithValue(
*vo.NewFileNameMust(row.Filename),
)
embeddedContent := nullable.NewNullableWithValue(row.EmbeddedContent)
attachment := &model.Attachment{
ID: id,
CreatedAt: row.CreatedAt,
UpdatedAt: row.UpdatedAt,
Name: name,
Description: description,
FileName: filename,
EmbeddedContent: embeddedContent,
}
attachment.CompanyID = nullable.NewNullNullable[uuid.UUID]()
if row.CompanyID != nil {
attachment.CompanyID.Set(*row.CompanyID)
}
return attachment
}