mirror of
https://github.com/phishingclub/phishingclub.git
synced 2026-07-03 02:55:54 +02:00
d1f100968e
Signed-off-by: Ronni Skansing <rskansing@gmail.com>
111 lines
2.9 KiB
Go
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,
|
|
}
|
|
}
|