Files
phishingclub/backend/controller/smtpConfiguration.go
2025-08-21 16:14:09 +02:00

270 lines
6.0 KiB
Go

package controller
import (
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/phishingclub/phishingclub/api"
"github.com/phishingclub/phishingclub/database"
"github.com/phishingclub/phishingclub/errs"
"github.com/phishingclub/phishingclub/model"
"github.com/phishingclub/phishingclub/repository"
"github.com/phishingclub/phishingclub/service"
"github.com/phishingclub/phishingclub/vo"
)
// SMTPConfigurationColumnsMap 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 SMTPConfigurationColumnsMap = map[string]string{
"created_at": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "created_at"),
"updated_at": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "updated_at"),
"name": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "name"),
"host": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "host"),
"port": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "port"),
"username": repository.TableColumn(database.SMTP_CONFIGURATION_TABLE, "username"),
}
// SMTPConfiguration is a controller
type SMTPConfiguration struct {
Common
SMTPConfigurationService *service.SMTPConfiguration
}
// Create creates a new SMTPConfiguration
func (c *SMTPConfiguration) Create(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
// parse request
var req model.SMTPConfiguration
if ok := c.handleParseRequest(g, &req); !ok {
return
}
// save SMTP configuration
id, err := c.SMTPConfigurationService.Create(g, session, &req)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(
g,
gin.H{
"id": id.String(),
},
)
}
// GetAll gets SMTP configurations
func (c *SMTPConfiguration) GetAll(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
// parse request
queryArgs, ok := c.handleQueryArgs(g)
if !ok {
return
}
queryArgs.DefaultSortByUpdatedAt()
queryArgs.RemapOrderBy(SMTPConfigurationColumnsMap)
companyID := companyIDFromRequestQuery(g)
// get
smtpConfigs, err := c.SMTPConfigurationService.GetAll(
g.Request.Context(),
session,
companyID,
&repository.SMTPConfigurationOption{
QueryArgs: queryArgs,
WithCompany: true,
WithHeaders: true,
},
)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, smtpConfigs)
}
// GetByID gets a SMTP configuration by an ID
func (c *SMTPConfiguration) GetByID(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
// parse request
id, ok := c.handleParseIDParam(g)
if !ok {
return
}
// get SMTP configuration
smtpConfig, err := c.SMTPConfigurationService.GetByID(
g.Request.Context(),
session,
id,
&repository.SMTPConfigurationOption{
WithCompany: true,
WithHeaders: true,
},
)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, smtpConfig)
}
type SMTPConfigurationTestEmailRequest struct {
Email vo.Email `json:"email" binding:"required,email"`
MailFrom vo.Email `json:"mailFrom" binding:"required,mailFrom"`
}
// TestEmail tests the connection to a SMTP configuration
func (c *SMTPConfiguration) TestEmail(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
// parse request
id, ok := c.handleParseIDParam(g)
if !ok {
return
}
var req SMTPConfigurationTestEmailRequest
if ok := c.handleParseRequest(g, &req); !ok {
return
}
// test dial
err := c.SMTPConfigurationService.SendTestEmail(
g,
session,
id,
&req.Email,
&req.MailFrom,
)
// handle any error as a validation error
if err != nil {
err = errs.NewValidationError(err)
}
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, gin.H{})
}
// UpdateByID updates a SMTP configuration - but not the headers
func (c *SMTPConfiguration) 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.SMTPConfiguration
if ok := c.handleParseRequest(g, &req); !ok {
return
}
err := c.SMTPConfigurationService.UpdateByID(
g.Request.Context(),
session,
id,
&req,
)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, gin.H{})
}
// AddHeader adds a header to a SMTP configuration
func (c *SMTPConfiguration) AddHeader(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
// parse request
var req model.SMTPHeader
if ok := c.handleParseRequest(g, &req); !ok {
return
}
// save header
smtpID, ok := c.handleParseIDParam(g)
if !ok {
return
}
createdID, err := c.SMTPConfigurationService.AddHeader(
g.Request.Context(),
session,
smtpID,
&req,
)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, gin.H{
"id": createdID.String(),
})
}
// RemoveHeader removes a header from a SMTP configuration
func (c *SMTPConfiguration) RemoveHeader(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
// parse request
id, ok := c.handleParseIDParam(g)
if !ok {
return
}
headerID, err := uuid.Parse(g.Param("headerID"))
if err != nil {
c.Logger.Debugw("invalid header id",
"headerID", g.Param("headerID"),
"error", err,
)
c.Response.BadRequestMessage(g, api.InvalidSMTPConfigurationID)
return
}
// remove header
err = c.SMTPConfigurationService.RemoveHeader(
g.Request.Context(),
session,
id,
&headerID,
)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, gin.H{})
}
// DeleteByID deletes a SMTP configuration
func (c *SMTPConfiguration) 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.SMTPConfigurationService.DeleteByID(g, session, id)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, gin.H{})
}