Files
2026-06-12 10:30:52 +02:00

178 lines
4.4 KiB
Go

package controller
import (
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/phishingclub/phishingclub/errs"
"github.com/phishingclub/phishingclub/service"
)
// CompanyScimConfig is the SCIM configuration controller
type CompanyScimConfig struct {
Common
CompanyScimConfigService *service.CompanyScimConfig
ScimService *service.Scim
}
// Prune removes the company's SCIM-disabled recipients whose retention window has elapsed.
func (c *CompanyScimConfig) Prune(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
companyID, err := uuid.Parse(g.Param("companyID"))
if err != nil {
c.Logger.Debugw("failed to parse companyID param", "error", err)
c.Response.BadRequestMessage(g, errs.MsgFailedToParseUUID)
return
}
pruned, err := c.ScimService.PruneSoftDeletedAuthorized(
g.Request.Context(),
session,
&companyID,
)
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, gin.H{"pruned": pruned})
}
// Restore clears the SCIM-disabled mark from the company's deprovisioned recipients.
func (c *CompanyScimConfig) Restore(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
companyID, err := uuid.Parse(g.Param("companyID"))
if err != nil {
c.Logger.Debugw("failed to parse companyID param", "error", err)
c.Response.BadRequestMessage(g, errs.MsgFailedToParseUUID)
return
}
restored, err := c.ScimService.RestoreSoftDeletedAuthorized(
g.Request.Context(),
session,
&companyID,
)
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, gin.H{"restored": restored})
}
// upsertScimRequest is the request body for the Upsert handler
type upsertScimRequest struct {
Enabled bool `json:"enabled"`
}
// GetByCompanyID returns the SCIM configuration for the given company
func (c *CompanyScimConfig) GetByCompanyID(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
// parse companyID from url param
companyID, err := uuid.Parse(g.Param("companyID"))
if err != nil {
c.Logger.Debugw("failed to parse companyID param", "error", err)
c.Response.BadRequestMessage(g, errs.MsgFailedToParseUUID)
return
}
// get
config, err := c.CompanyScimConfigService.GetByCompanyID(
g.Request.Context(),
session,
&companyID,
)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, config)
}
// Upsert creates or updates the SCIM configuration for the given company
func (c *CompanyScimConfig) Upsert(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
// parse companyID from url param
companyID, err := uuid.Parse(g.Param("companyID"))
if err != nil {
c.Logger.Debugw("failed to parse companyID param", "error", err)
c.Response.BadRequestMessage(g, errs.MsgFailedToParseUUID)
return
}
// parse request body
var req upsertScimRequest
if ok := c.handleParseRequest(g, &req); !ok {
return
}
// upsert
result, err := c.CompanyScimConfigService.Upsert(
g.Request.Context(),
session,
&companyID,
req.Enabled,
)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, result)
}
// RotateToken generates a new bearer token for the given company's SCIM config.
// the plain token is returned once and must be stored by the caller.
func (c *CompanyScimConfig) RotateToken(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
// parse companyID from url param
companyID, err := uuid.Parse(g.Param("companyID"))
if err != nil {
c.Logger.Debugw("failed to parse companyID param", "error", err)
c.Response.BadRequestMessage(g, errs.MsgFailedToParseUUID)
return
}
// rotate
result, err := c.CompanyScimConfigService.RotateToken(
g.Request.Context(),
session,
&companyID,
)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, result)
}
// Delete removes the SCIM configuration for the given company
func (c *CompanyScimConfig) Delete(g *gin.Context) {
session, _, ok := c.handleSession(g)
if !ok {
return
}
// parse companyID from url param
companyID, err := uuid.Parse(g.Param("companyID"))
if err != nil {
c.Logger.Debugw("failed to parse companyID param", "error", err)
c.Response.BadRequestMessage(g, errs.MsgFailedToParseUUID)
return
}
// delete
err = c.CompanyScimConfigService.DeleteByCompanyID(
g.Request.Context(),
session,
&companyID,
)
// handle response
if ok := c.handleErrors(g, err); !ok {
return
}
c.Response.OK(g, gin.H{})
}