mirror of
https://github.com/phishingclub/phishingclub.git
synced 2026-02-12 16:12:44 +00:00
231 lines
4.4 KiB
Go
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{})
|
|
}
|