maps-service/pkg/service/scripts.go
2024-12-06 18:19:35 -08:00

109 lines
2.6 KiB
Go

package service
import (
"context"
"fmt"
"git.itzana.me/strafesnet/maps-service/pkg/api"
"git.itzana.me/strafesnet/maps-service/pkg/datastore"
"git.itzana.me/strafesnet/maps-service/pkg/model"
"github.com/dchest/siphash"
)
// CreateScript implements createScript operation.
//
// Create a new script.
//
// POST /scripts
func (svc *Service) CreateScript(ctx context.Context, req *api.ScriptCreate) (*api.ID, error){
userInfo, ok := ctx.Value("UserInfo").(*UserInfo)
if !ok{
return nil, ErrUserInfo
}
if !userInfo.Roles.ScriptWrite{
return nil, ErrPermissionDenied
}
script, err := svc.DB.Scripts().Create(ctx, model.Script{
ID: 0,
Hash: siphash.Hash(0,0,[]byte(req.Source)),
Source: req.Source,
SubmissionID: req.SubmissionID.Or(0),
})
if err != nil{
return nil, err
}
return &api.ID{
ID:script.ID,
}, nil
}
// DeleteScript implements deleteScript operation.
//
// Delete the specified script by ID.
//
// DELETE /scripts/{ScriptID}
func (svc *Service) DeleteScript(ctx context.Context, params api.DeleteScriptParams) error{
userInfo, ok := ctx.Value("UserInfo").(*UserInfo)
if !ok{
return ErrUserInfo
}
if !userInfo.Roles.ScriptWrite{
return ErrPermissionDenied
}
return svc.DB.Scripts().Delete(ctx, params.ScriptID)
}
// GetScript implements getScript operation.
//
// Get the specified script by ID.
//
// GET /scripts/{ScriptID}
func (svc *Service) GetScript(ctx context.Context, params api.GetScriptParams) (*api.Script, error){
_, ok := ctx.Value("UserInfo").(*UserInfo)
if !ok{
return nil, ErrUserInfo
}
// Read permission for scripts only requires you to be logged in
script, err := svc.DB.Scripts().Get(ctx, params.ScriptID)
if err != nil{
return nil, err
}
return &api.Script{
ID: script.ID,
Hash: fmt.Sprintf("%x",script.Hash),
Source: script.Source,
SubmissionID: script.SubmissionID,
}, nil
}
// UpdateScript implements updateScript operation.
//
// Update the specified script by ID.
//
// PATCH /scripts/{ScriptID}
func (svc *Service) UpdateScript(ctx context.Context, req *api.ScriptUpdate, params api.UpdateScriptParams) error{
userInfo, ok := ctx.Value("UserInfo").(*UserInfo)
if !ok{
return ErrUserInfo
}
if !userInfo.Roles.ScriptWrite{
return ErrPermissionDenied
}
pmap := datastore.Optional()
if source,ok:=req.Source.Get();ok{
pmap.Add("source",source)
pmap.Add("hash",siphash.Hash(0,0,[]byte(source)))
}
if SubmissionID,ok:=req.SubmissionID.Get();ok{
pmap.Add("submission_id",SubmissionID)
}
return svc.DB.Scripts().Update(ctx, req.ID, pmap)
}