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

231 lines
4.4 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"
)
// PageColumnsMap 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 PageColumnsMap = map[string]string{
"created_at": repository.TableColumn(database.PAGE_TABLE, "created_at"),
"updated_at": repository.TableColumn(database.PAGE_TABLE, "updated_at"),
"name": repository.TableColumn(database.PAGE_TABLE, "name"),
}
// Page is a Page controller
type Page struct {
Common
PageService *service.Page
TemplateService *service.Template
}
// Create creates a page
func (p *Page) Create(g *gin.Context) {
// handle session
session, _, ok := p.handleSession(g)
if !ok {
return
}
// parse req
var req model.Page
if ok := p.handleParseRequest(g, &req); !ok {
return
}
// save page
id, err := p.PageService.Create(
g.Request.Context(),
session,
&req,
)
// handle response
if ok := p.handleErrors(g, err); !ok {
return
}
p.Response.OK(
g,
gin.H{
"id": id.String(),
},
)
}
// GetContentByID serves a page by id
func (p *Page) GetContentByID(g *gin.Context) {
session, _, ok := p.handleSession(g)
if !ok {
return
}
// parse request
id, ok := p.handleParseIDParam(g)
if !ok {
return
}
// get page
page, err := p.PageService.GetByID(
g,
session,
id,
&repository.PageOption{},
)
// handle response
if ok := p.handleErrors(g, err); !ok {
return
}
content, err := page.Content.Get()
if ok := p.handleErrors(g, err); !ok {
return
}
// build response
phishingPage, err := p.TemplateService.ApplyPageMock(content.String())
if ok := p.handleErrors(g, err); !ok {
return
}
p.Response.OK(g, phishingPage.String())
}
// GetAll gets pages using pagination
func (p *Page) GetAll(g *gin.Context) {
session, _, ok := p.handleSession(g)
if !ok {
return
}
// parse request
queryArgs, ok := p.handleQueryArgs(g)
if !ok {
return
}
queryArgs.DefaultSortByUpdatedAt()
companyID := companyIDFromRequestQuery(g)
// get pages
pages, err := p.PageService.GetAll(
g,
session,
companyID,
&repository.PageOption{
QueryArgs: queryArgs,
},
)
// handle response
if ok := p.handleErrors(g, err); !ok {
return
}
p.Response.OK(g, pages)
}
// GetOverview gets pages overview using pagination
func (p *Page) GetOverview(g *gin.Context) {
session, _, ok := p.handleSession(g)
if !ok {
return
}
// parse request
queryArgs, ok := p.handleQueryArgs(g)
if !ok {
return
}
queryArgs.DefaultSortByUpdatedAt()
companyID := companyIDFromRequestQuery(g)
// get pages
pages, err := p.PageService.GetAll(
g,
session,
companyID,
&repository.PageOption{
Fields: []string{"id", "created_at", "updated_at", "name", "company_id"},
QueryArgs: queryArgs,
},
)
// handle response
if ok := p.handleErrors(g, err); !ok {
return
}
p.Response.OK(g, pages)
}
// GetByID gets a page by id
func (p *Page) GetByID(g *gin.Context) {
session, _, ok := p.handleSession(g)
if !ok {
return
}
// parse request
id, ok := p.handleParseIDParam(g)
if !ok {
return
}
// get page
page, err := p.PageService.GetByID(
g.Request.Context(),
session,
id,
// do I really need to preload this?
&repository.PageOption{
WithCompany: true,
},
)
// handle response
if ok := p.handleErrors(g, err); !ok {
return
}
p.Response.OK(g, page)
}
// UpdateByID updates a page by id
func (p *Page) UpdateByID(g *gin.Context) {
session, _, ok := p.handleSession(g)
if !ok {
return
}
// parse request
id, ok := p.handleParseIDParam(g)
if !ok {
return
}
var req model.Page
if ok := p.handleParseRequest(g, &req); !ok {
return
}
// update page
err := p.PageService.UpdateByID(
g.Request.Context(),
session,
id,
&req,
)
// handle response
if ok := p.handleErrors(g, err); !ok {
return
}
p.Response.OK(g, gin.H{})
}
// DeleteByID deletes a page by id
func (p *Page) DeleteByID(g *gin.Context) {
session, _, ok := p.handleSession(g)
if !ok {
return
}
// parse request
id, ok := p.handleParseIDParam(g)
if !ok {
return
}
// delete page
err := p.PageService.DeleteByID(
g.Request.Context(),
session,
id,
)
// handle response
if ok := p.handleErrors(g, err); !ok {
return
}
p.Response.OK(g, gin.H{})
}