package service import ( "context" "git.itzana.me/strafesnet/maps-service/pkg/api" "git.itzana.me/strafesnet/maps-service/pkg/datastore" "git.itzana.me/strafesnet/maps-service/pkg/model" ) // 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, Name: req.Name, Hash: model.HashSource(req.Source), Source: req.Source, SubmissionID: req.SubmissionID.Or(0), }) if err != nil { return nil, err } return &api.ID{ ID: script.ID, }, nil } // ListScripts implements listScripts operation. // // Get list of scripts. // // GET /scripts func (svc *Service) ListScripts(ctx context.Context, params api.ListScriptsParams) ([]api.Script, error) { filter := datastore.Optional() if params.Hash.IsSet(){ hash, err := model.HashParse(params.Hash.Value) if err != nil { return nil, err } filter.AddNotNil("hash", hash) } if params.Name.IsSet(){ filter.AddNotNil("name", params.Name.Value) } if params.Source.IsSet(){ filter.AddNotNil("source", params.Source.Value) } if params.SubmissionID.IsSet(){ filter.AddNotNil("submission_id", params.SubmissionID.Value) } items, err := svc.DB.Scripts().List(ctx, filter, model.Page{ Number: params.Page, Size: params.Limit, }) if err != nil { return nil, err } var resp []api.Script for i := 0; i < len(items); i++ { resp = append(resp, api.Script{ ID: items[i].ID, Hash: model.HashFormat(items[i].Hash), Source: items[i].Source, SubmissionID: items[i].SubmissionID, }) } return resp, 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, Name: script.Name, Hash: model.HashFormat(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 Name, ok := req.Name.Get(); ok { pmap.Add("name", Name) } if source, ok := req.Source.Get(); ok { pmap.Add("source", source) pmap.Add("hash", model.HashSource(source)) } if SubmissionID, ok := req.SubmissionID.Get(); ok { pmap.Add("submission_id", SubmissionID) } return svc.DB.Scripts().Update(ctx, req.ID, pmap) }