Files
Ronni Skansing d1f100968e added report delivery
Signed-off-by: Ronni Skansing <rskansing@gmail.com>
2026-06-13 12:46:49 +02:00

111 lines
2.9 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/utils"
"github.com/phishingclub/phishingclub/vo"
"gorm.io/gorm"
)
var reportSendLogAllowedColumns = assignTableToColumns(database.REPORT_SEND_LOG_TABLE, []string{
"created_at",
"status",
"trigger",
"campaign_name",
"group_name",
"recipient_count",
})
// ReportSendLogOption is for query options
type ReportSendLogOption struct {
*vo.QueryArgs
}
// ReportSendLog is the repository for report delivery logs
type ReportSendLog struct {
DB *gorm.DB
}
// Insert inserts a report send log row
func (r *ReportSendLog) Insert(
ctx context.Context,
log *model.ReportSendLog,
) (*uuid.UUID, error) {
id := uuid.New()
row := log.ToDBMap()
row["id"] = id
// the log is append only and has no updated_at column
row["created_at"] = utils.NowRFC3339UTC()
res := r.DB.
Model(&database.ReportSendLog{}).
Create(row)
if res.Error != nil {
return nil, errs.Wrap(res.Error)
}
return &id, nil
}
// GetAllByCompanyID returns the report send logs for a company using pagination
func (r *ReportSendLog) GetAllByCompanyID(
ctx context.Context,
companyID *uuid.UUID,
options *ReportSendLogOption,
) (*model.Result[model.ReportSendLog], error) {
result := model.NewEmptyResult[model.ReportSendLog]()
var rows []database.ReportSendLog
db := whereCompany(r.DB, database.REPORT_SEND_LOG_TABLE, companyID)
db, err := useQuery(db, database.REPORT_SEND_LOG_TABLE, options.QueryArgs, reportSendLogAllowedColumns...)
if err != nil {
return result, errs.Wrap(err)
}
if res := db.Find(&rows); res.Error != nil {
return result, errs.Wrap(res.Error)
}
hasNextPage, err := useHasNextPage(db, database.REPORT_SEND_LOG_TABLE, options.QueryArgs, reportSendLogAllowedColumns...)
if err != nil {
return result, errs.Wrap(err)
}
result.HasNextPage = hasNextPage
for _, row := range rows {
result.Rows = append(result.Rows, ToReportSendLog(&row))
}
return result, nil
}
// ToReportSendLog maps a database row to the business model
func ToReportSendLog(row *database.ReportSendLog) *model.ReportSendLog {
id := nullable.NewNullableWithValue(*row.ID)
companyID := nullable.NewNullNullable[uuid.UUID]()
if row.CompanyID != nil {
companyID.Set(*row.CompanyID)
}
campaignID := nullable.NewNullNullable[uuid.UUID]()
if row.CampaignID != nil {
campaignID.Set(*row.CampaignID)
}
return &model.ReportSendLog{
ID: id,
CreatedAt: row.CreatedAt,
CompanyID: companyID,
CampaignID: campaignID,
CampaignName: row.CampaignName,
GroupName: row.GroupName,
Trigger: row.Trigger,
Status: row.Status,
RecipientCount: row.RecipientCount,
Recipients: row.Recipients,
SenderEmail: row.SenderEmail,
ErrorMessage: row.ErrorMessage,
}
}