mirror of
https://github.com/phishingclub/phishingclub.git
synced 2026-02-12 16:12:44 +00:00
110 lines
3.4 KiB
Go
110 lines
3.4 KiB
Go
package model
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/go-errors/errors"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/oapi-codegen/nullable"
|
|
"github.com/phishingclub/phishingclub/utils"
|
|
"github.com/phishingclub/phishingclub/validate"
|
|
)
|
|
|
|
// CampaignRecipient is a campaign recipient
|
|
// this model must not be consumed from a endpoint
|
|
type CampaignRecipient struct {
|
|
ID nullable.Nullable[uuid.UUID] `json:"id"`
|
|
CreatedAt *time.Time `json:"createdAt"`
|
|
UpdatedAt *time.Time `json:"updatedAt"`
|
|
CancelledAt nullable.Nullable[time.Time] `json:"cancelledAt"`
|
|
SendAt nullable.Nullable[time.Time] `json:"sendAt"`
|
|
LastAttemptAt nullable.Nullable[time.Time] `json:"lastAttemptAt"`
|
|
SentAt nullable.Nullable[time.Time] `json:"sentAt"`
|
|
SelfManaged nullable.Nullable[bool] `json:"selfManaged"`
|
|
AnonymizedID nullable.Nullable[uuid.UUID] `json:"anonymizedID"`
|
|
CampaignID nullable.Nullable[uuid.UUID] `json:"campaignID"`
|
|
Campaign *Campaign `json:"campaign"`
|
|
// null recipientID means that the data has been anonymized
|
|
RecipientID nullable.Nullable[uuid.UUID] `json:"recipientID"`
|
|
Recipient *Recipient `json:"recipient"`
|
|
NotableEventID nullable.Nullable[uuid.UUID] `json:"notableEventID"`
|
|
NotableEventName string `json:"notableEventName"`
|
|
}
|
|
|
|
// Validate validates the campaign recipient
|
|
func (c *CampaignRecipient) Validate() error {
|
|
if err := validate.NullableFieldRequired("campaignID", c.CampaignID); err != nil {
|
|
return err
|
|
}
|
|
anonymizedAtErr := validate.NullableFieldRequired("anonymizedID", c.AnonymizedID)
|
|
recipientIDErr := validate.NullableFieldRequired("recipientID", c.RecipientID)
|
|
if anonymizedAtErr == nil && recipientIDErr == nil {
|
|
return recipientIDErr
|
|
}
|
|
if anonymizedAtErr != nil && recipientIDErr != nil {
|
|
return validate.WrapErrorWithField(
|
|
errors.New("AnonymizedID can not be set with recipientID"),
|
|
"recipientID",
|
|
)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ToDBMap converts the fields that can be stored or updated to a map
|
|
// if the value is nullable and not set, it is not included
|
|
// if the value is nullable and set, it is included, if it is null, it is set to nil
|
|
func (c *CampaignRecipient) ToDBMap() map[string]any {
|
|
m := map[string]any{}
|
|
if c.CancelledAt.IsSpecified() {
|
|
m["cancelled_at"] = nil
|
|
if v, err := c.CancelledAt.Get(); err == nil {
|
|
m["cancelled_at"] = utils.RFC3339UTC(v)
|
|
}
|
|
}
|
|
if c.SendAt.IsSpecified() {
|
|
m["send_at"] = nil
|
|
if v, err := c.SendAt.Get(); err == nil {
|
|
m["send_at"] = utils.RFC3339UTC(v)
|
|
}
|
|
}
|
|
if c.LastAttemptAt.IsSpecified() {
|
|
m["last_attempt_at"] = nil
|
|
if v, err := c.LastAttemptAt.Get(); err == nil {
|
|
m["last_attempt_at"] = utils.RFC3339UTC(v)
|
|
}
|
|
}
|
|
if c.SentAt.IsSpecified() {
|
|
m["sent_at"] = nil
|
|
if v, err := c.SentAt.Get(); err == nil {
|
|
m["sent_at"] = utils.RFC3339UTC(v)
|
|
}
|
|
}
|
|
if c.SelfManaged.IsSpecified() {
|
|
m["self_managed"] = nil
|
|
if v, err := c.SelfManaged.Get(); err == nil {
|
|
m["self_managed"] = v
|
|
}
|
|
}
|
|
if c.CampaignID.IsSpecified() {
|
|
m["campaign_id"] = nil
|
|
if v, err := c.CampaignID.Get(); err == nil {
|
|
m["campaign_id"] = v
|
|
}
|
|
}
|
|
if c.RecipientID.IsSpecified() {
|
|
m["recipient_id"] = nil
|
|
if v, err := c.RecipientID.Get(); err == nil {
|
|
m["recipient_id"] = v
|
|
}
|
|
}
|
|
if c.NotableEventID.IsSpecified() {
|
|
m["notable_event_id"] = nil
|
|
if v, err := c.NotableEventID.Get(); err == nil {
|
|
m["notable_event_id"] = v
|
|
}
|
|
}
|
|
|
|
return m
|
|
}
|