mirror of
https://github.com/phishingclub/phishingclub.git
synced 2026-02-12 16:12:44 +00:00
206 lines
5.5 KiB
Go
206 lines
5.5 KiB
Go
package controller
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/phishingclub/phishingclub/database"
|
|
"github.com/phishingclub/phishingclub/model"
|
|
"github.com/phishingclub/phishingclub/repository"
|
|
"github.com/phishingclub/phishingclub/service"
|
|
)
|
|
|
|
// CampaignTemplateColumnsMap is a map between the frontend and the backend
|
|
// so the frontend has user friendly names instead of direct references
|
|
// to the database schema
|
|
// this is tied to a slice in the repository package
|
|
var CampaignTemplateColumnsMap = map[string]string{
|
|
"created_at": repository.TableColumn(database.CAMPAIGN_TEMPLATE_TABLE, "created_at"),
|
|
"updated_at": repository.TableColumn(database.CAMPAIGN_TEMPLATE_TABLE, "updated_at"),
|
|
"name": repository.TableColumn(database.CAMPAIGN_TEMPLATE_TABLE, "name"),
|
|
"after_landing_page_redirect_url": repository.TableColumn(database.CAMPAIGN_TEMPLATE_TABLE, "after_landing_page_redirect_url"),
|
|
"is_complete": repository.TableColumn(database.CAMPAIGN_TEMPLATE_TABLE, "is_usable"),
|
|
"domain": repository.TableColumn(database.DOMAIN_TABLE, "name"),
|
|
"before_landing_page": repository.TableColumn("before_landing_page", "name"),
|
|
"landing_page": repository.TableColumn("landing_page", "name"),
|
|
"after_landing_page": repository.TableColumn("after_landing_page", "name"),
|
|
"smtp": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "name"),
|
|
"api_sender": repository.TableColumn(database.API_SENDER_TABLE, "name"),
|
|
"email": repository.TableColumn(database.EMAIL_TABLE, "name"),
|
|
}
|
|
|
|
// CampaignTemplate is a campaign template controller
|
|
type CampaignTemplate struct {
|
|
Common
|
|
CampaignTemplateService *service.CampaignTemplate
|
|
}
|
|
|
|
// Create creates a campaign template
|
|
func (c *CampaignTemplate) Create(g *gin.Context) {
|
|
session, _, ok := c.handleSession(g)
|
|
if !ok {
|
|
return
|
|
}
|
|
// parse request
|
|
var req model.CampaignTemplate
|
|
if ok := c.handleParseRequest(g, &req); !ok {
|
|
return
|
|
}
|
|
// save
|
|
ctx := g.Request.Context()
|
|
id, err := c.CampaignTemplateService.Create(ctx, session, &req)
|
|
// handle response
|
|
if ok := c.handleErrors(g, err); !ok {
|
|
return
|
|
}
|
|
c.Response.OK(
|
|
g,
|
|
gin.H{
|
|
"id": id.String(),
|
|
},
|
|
)
|
|
}
|
|
|
|
// GetByID gets a campaign template by id
|
|
func (c *CampaignTemplate) GetByID(g *gin.Context) {
|
|
session, _, ok := c.handleSession(g)
|
|
if !ok {
|
|
return
|
|
}
|
|
// parse request
|
|
id, ok := c.handleParseIDParam(g)
|
|
if !ok {
|
|
return
|
|
}
|
|
// check if full data set should be loaded
|
|
options := &repository.CampaignTemplateOption{}
|
|
_, ok = g.GetQuery("full")
|
|
if ok {
|
|
options = &repository.CampaignTemplateOption{
|
|
WithDomain: true,
|
|
WithSMTPConfiguration: true,
|
|
WithAPISender: true,
|
|
WithEmail: true,
|
|
WithLandingPage: true,
|
|
WithBeforeLandingPage: true,
|
|
WithAfterLandingPage: true,
|
|
WithLandingProxy: true,
|
|
WithBeforeLandingProxy: true,
|
|
WithAfterLandingProxy: true,
|
|
WithIdentifier: true,
|
|
}
|
|
}
|
|
// get
|
|
ctx := g.Request.Context()
|
|
campaignTemplate, err := c.CampaignTemplateService.GetByID(
|
|
ctx,
|
|
session,
|
|
id,
|
|
options,
|
|
)
|
|
// handle response
|
|
if ok := c.handleErrors(g, err); !ok {
|
|
return
|
|
}
|
|
c.Response.OK(g, campaignTemplate)
|
|
}
|
|
|
|
// GetAll gets all campaign templates
|
|
func (c *CampaignTemplate) GetAll(g *gin.Context) {
|
|
session, _, ok := c.handleSession(g)
|
|
if !ok {
|
|
return
|
|
}
|
|
// parse request
|
|
pagination, ok := c.handlePagination(g)
|
|
if !ok {
|
|
return
|
|
}
|
|
companyID := companyIDFromRequestQuery(g)
|
|
queryArgs, ok := c.handleQueryArgs(g)
|
|
if !ok {
|
|
return
|
|
}
|
|
usableOnlyQuery := g.Query("usableOnly")
|
|
usableOnly := false
|
|
if usableOnlyQuery == "true" {
|
|
usableOnly = true
|
|
}
|
|
queryArgs.DefaultSortByUpdatedAt()
|
|
queryArgs.RemapOrderBy(CampaignTemplateColumnsMap)
|
|
columns := repository.SelectTable(database.CAMPAIGN_TEMPLATE_TABLE)
|
|
templates, err := c.CampaignTemplateService.GetAll(
|
|
g,
|
|
session,
|
|
companyID,
|
|
pagination,
|
|
&repository.CampaignTemplateOption{
|
|
QueryArgs: queryArgs,
|
|
Columns: columns,
|
|
WithDomain: true,
|
|
WithSMTPConfiguration: true,
|
|
WithAPISender: true,
|
|
WithEmail: true,
|
|
WithLandingPage: true,
|
|
WithBeforeLandingPage: true,
|
|
WithAfterLandingPage: true,
|
|
WithLandingProxy: true,
|
|
WithBeforeLandingProxy: true,
|
|
WithAfterLandingProxy: true,
|
|
UsableOnly: usableOnly,
|
|
},
|
|
)
|
|
// handle response
|
|
if ok := c.handleErrors(g, err); !ok {
|
|
return
|
|
}
|
|
c.Response.OK(g, templates)
|
|
}
|
|
|
|
// UpdateByID updates a campaign template by id
|
|
func (c *CampaignTemplate) UpdateByID(g *gin.Context) {
|
|
session, _, ok := c.handleSession(g)
|
|
if !ok {
|
|
return
|
|
}
|
|
// parse request
|
|
id, ok := c.handleParseIDParam(g)
|
|
if !ok {
|
|
return
|
|
}
|
|
var req model.CampaignTemplate
|
|
if ok := c.handleParseRequest(g, &req); !ok {
|
|
return
|
|
}
|
|
// update
|
|
err := c.CampaignTemplateService.UpdateByID(
|
|
g.Request.Context(),
|
|
session,
|
|
id,
|
|
&req,
|
|
)
|
|
// handle response
|
|
if ok := c.handleErrors(g, err); !ok {
|
|
return
|
|
}
|
|
c.Response.OK(g, gin.H{})
|
|
}
|
|
|
|
// DeleteByID deletes a campaign template by id
|
|
func (c *CampaignTemplate) DeleteByID(g *gin.Context) {
|
|
session, _, ok := c.handleSession(g)
|
|
if !ok {
|
|
return
|
|
}
|
|
// parse request
|
|
id, ok := c.handleParseIDParam(g)
|
|
if !ok {
|
|
return
|
|
}
|
|
// delete
|
|
err := c.CampaignTemplateService.DeleteByID(g, session, id)
|
|
// handle response
|
|
if ok := c.handleErrors(g, err); !ok {
|
|
return
|
|
}
|
|
c.Response.OK(g, gin.H{})
|
|
}
|