mirror of
https://github.com/phishingclub/phishingclub.git
synced 2026-02-12 16:12:44 +00:00
255 lines
8.6 KiB
Go
255 lines
8.6 KiB
Go
//go:build dev
|
|
|
|
package seed
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/go-errors/errors"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/oapi-codegen/nullable"
|
|
"github.com/phishingclub/phishingclub/data"
|
|
"github.com/phishingclub/phishingclub/errs"
|
|
"github.com/phishingclub/phishingclub/model"
|
|
"github.com/phishingclub/phishingclub/repository"
|
|
"github.com/phishingclub/phishingclub/vo"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// SeedDevelopmentCampaignTemplates seeds templates
|
|
func SeedDevelopmentCampaignTemplates(
|
|
apiRepository *repository.APISender,
|
|
domainRepository *repository.Domain,
|
|
pageRepository *repository.Page,
|
|
emailRepository *repository.Email,
|
|
smtpRepository *repository.SMTPConfiguration,
|
|
templateRepository *repository.CampaignTemplate,
|
|
identifierRepository *repository.Identifier,
|
|
) error {
|
|
templates := []struct {
|
|
Name string
|
|
DomainName string
|
|
LandingPageName string
|
|
LandingPageTypeName string
|
|
BeforeLandingPageName string
|
|
BeforeLandingPageTypeName string
|
|
AfterLandingPageName string
|
|
AfterLandingPageTypeName string
|
|
AfterLandingPageRedirectURL string
|
|
EmailName string
|
|
SMTPConfigName string
|
|
APISenderName string
|
|
UrlIdentifierName string
|
|
StateIdentifierName string
|
|
}{
|
|
{
|
|
Name: "Phishing",
|
|
DomainName: TEST_DOMAIN_NAME_1,
|
|
LandingPageName: TEST_PAGE_NAME_1,
|
|
LandingPageTypeName: data.PAGE_TYPE_LANDING,
|
|
EmailName: TEST_EMAIL_NAME_1,
|
|
SMTPConfigName: TEST_SMTP_CONFIGURATION_NAME_1,
|
|
UrlIdentifierName: TEST_URL_IDENTIFIER_NAME,
|
|
StateIdentifierName: TEST_STATE_IDENTIFIER_NAME,
|
|
},
|
|
{
|
|
Name: "Test API - Forgot password",
|
|
DomainName: TEST_DOMAIN_NAME_1,
|
|
LandingPageName: TEST_PAGE_NAME_1,
|
|
LandingPageTypeName: data.PAGE_TYPE_LANDING,
|
|
EmailName: TEST_EMAIL_NAME_1,
|
|
APISenderName: TEST_API_SENDER_NAME_1,
|
|
UrlIdentifierName: TEST_URL_IDENTIFIER_NAME,
|
|
StateIdentifierName: TEST_STATE_IDENTIFIER_NAME,
|
|
},
|
|
}
|
|
for _, template := range templates {
|
|
urlIdentifier, err := identifierRepository.GetByName(
|
|
context.Background(),
|
|
template.UrlIdentifierName,
|
|
)
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
if urlIdentifier == nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, "URL param key not found")
|
|
}
|
|
stateKeyIdentifier, err := identifierRepository.GetByName(
|
|
context.Background(),
|
|
template.StateIdentifierName,
|
|
)
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
if stateKeyIdentifier == nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, "state param key not found")
|
|
}
|
|
domainName, err := vo.NewString255(template.DomainName)
|
|
if err != nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
domain, err := domainRepository.GetByName(
|
|
context.Background(),
|
|
domainName,
|
|
&repository.DomainOption{},
|
|
)
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
if domain == nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, "domain not found")
|
|
}
|
|
landingPageName, err := vo.NewString64(template.LandingPageName)
|
|
if err != nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
var beforeLandingPageID nullable.Nullable[uuid.UUID]
|
|
if template.BeforeLandingPageName != "" {
|
|
beforeLandingPageName, err := vo.NewString64(template.BeforeLandingPageName)
|
|
if err != nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
beforeLandingPage, err := pageRepository.GetByNameAndCompanyID(
|
|
context.Background(),
|
|
beforeLandingPageName,
|
|
nil,
|
|
&repository.PageOption{},
|
|
)
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
if beforeLandingPage == nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, "before landing page not found")
|
|
}
|
|
beforeLandingPageID = beforeLandingPage.ID
|
|
}
|
|
var afterLandingPageUUID nullable.Nullable[uuid.UUID]
|
|
if template.AfterLandingPageName != "" {
|
|
afterLandingPageName, err := vo.NewString64(template.AfterLandingPageName)
|
|
if err != nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
afterLandingPage, err := pageRepository.GetByNameAndCompanyID(
|
|
context.Background(),
|
|
afterLandingPageName,
|
|
nil,
|
|
&repository.PageOption{},
|
|
)
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
if afterLandingPage == nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, "before landing page not found")
|
|
}
|
|
afterLandingPageUUID = afterLandingPage.ID
|
|
}
|
|
|
|
landingPage, err := pageRepository.GetByNameAndCompanyID(
|
|
context.Background(),
|
|
landingPageName,
|
|
nil,
|
|
&repository.PageOption{},
|
|
)
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
if landingPage == nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, "landing page not found")
|
|
}
|
|
t, err := templateRepository.GetByNameAndCompanyID(
|
|
context.Background(),
|
|
template.Name,
|
|
nil,
|
|
&repository.CampaignTemplateOption{},
|
|
)
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
if t != nil {
|
|
continue
|
|
}
|
|
emailName, err := vo.NewString64(template.EmailName)
|
|
if err != nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
email, err := emailRepository.GetByNameAndCompanyID(
|
|
context.Background(),
|
|
emailName,
|
|
nil,
|
|
&repository.EmailOption{},
|
|
)
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
if email == nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, "email not found")
|
|
}
|
|
var smtpConfigID nullable.Nullable[uuid.UUID]
|
|
if template.SMTPConfigName != "" {
|
|
smtpConfigurationName, err := vo.NewString127(template.SMTPConfigName)
|
|
if err != nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
smtpConfiguration, err := smtpRepository.GetByNameAndCompanyID(
|
|
context.Background(),
|
|
smtpConfigurationName,
|
|
nil,
|
|
&repository.SMTPConfigurationOption{},
|
|
)
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
if smtpConfiguration == nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, "smtp configuration not found")
|
|
}
|
|
smtpConfigID = smtpConfiguration.ID
|
|
}
|
|
var apiSenderID nullable.Nullable[uuid.UUID]
|
|
if template.APISenderName != "" {
|
|
APISenderName, err := vo.NewString64(template.APISenderName)
|
|
if err != nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
apiSender, err := apiRepository.GetByName(
|
|
context.Background(),
|
|
APISenderName,
|
|
nil,
|
|
&repository.APISenderOption{},
|
|
)
|
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
if apiSender == nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, "API sender not found")
|
|
}
|
|
apiSenderID = apiSender.ID
|
|
}
|
|
id := nullable.NewNullableWithValue(uuid.New())
|
|
name := nullable.NewNullableWithValue(*vo.NewString64Must(template.Name))
|
|
domainID := nullable.NewNullableWithValue(domain.ID.MustGet())
|
|
landingPageID := nullable.NewNullableWithValue(landingPage.ID.MustGet())
|
|
afterLandingPageRedirectURL := nullable.NewNullableWithValue(*vo.NewOptionalString255Must(template.AfterLandingPageRedirectURL))
|
|
|
|
createTemplate := model.CampaignTemplate{
|
|
ID: id,
|
|
Name: name,
|
|
DomainID: domainID,
|
|
LandingPageID: landingPageID,
|
|
BeforeLandingPageID: beforeLandingPageID,
|
|
AfterLandingPageID: afterLandingPageUUID,
|
|
AfterLandingPageRedirectURL: afterLandingPageRedirectURL,
|
|
EmailID: email.ID,
|
|
SMTPConfigurationID: smtpConfigID,
|
|
APISenderID: apiSenderID,
|
|
URLIdentifierID: nullable.NewNullableWithValue(urlIdentifier.ID.MustGet()),
|
|
StateIdentifierID: nullable.NewNullableWithValue(stateKeyIdentifier.ID.MustGet()),
|
|
}
|
|
_, err = templateRepository.Insert(context.TODO(), &createTemplate)
|
|
if err != nil {
|
|
return errors.Errorf("%w: %s", errs.ErrDBSeedFailure, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|