mirror of
https://github.com/phishingclub/phishingclub.git
synced 2026-02-12 16:12:44 +00:00
184 lines
4.4 KiB
Go
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
|
|
}
|