maps-service/pkg/service/submissions.go

144 lines
5.0 KiB
Go
Raw Normal View History

2024-11-26 23:30:58 +00:00
package service
2024-11-26 23:28:48 +00:00
import (
2024-11-27 23:38:17 +00:00
"time"
2024-11-26 23:28:48 +00:00
"context"
"git.itzana.me/strafesnet/maps-service/pkg/api"
2024-11-27 23:38:17 +00:00
"git.itzana.me/strafesnet/maps-service/pkg/model"
2024-11-28 00:38:22 +00:00
"git.itzana.me/strafesnet/maps-service/pkg/datastore"
2024-11-26 23:28:48 +00:00
)
// POST /submissions
2024-11-27 23:38:17 +00:00
func (svc *Service) CreateSubmission(ctx context.Context, request api.OptSubmissionCreate) (*api.ID, error) {
//I don't know how to read the http body
submission, err := svc.DB.Submissions().Create(ctx, model.Submission{
ID: 0,
DisplayName: request.Value.DisplayName.Value,
Creator: request.Value.Creator.Value,
GameID: request.Value.GameID.Value,
Date: time.Now(),
Submitter: request.Value.Submitter.Value,
AssetID: request.Value.AssetID.Value,
AssetVersion: request.Value.AssetVersion.Value,
Completed: false,
TargetAssetID: request.Value.TargetAssetID.Value,
2024-11-28 01:27:22 +00:00
StatusID: model.UnderConstruction,
2024-11-27 23:38:17 +00:00
})
if err != nil{
return nil, err
}
return &api.ID{
ID:api.NewOptInt64(submission.ID),
}, nil
2024-11-26 23:28:48 +00:00
}
// GetSubmission implements getSubmission operation.
//
// Retrieve map with ID.
//
// GET /submissions/{SubmissionID}
2024-11-26 23:30:58 +00:00
func (svc *Service) GetSubmission(ctx context.Context, params api.GetSubmissionParams) (*api.Submission, error) {
2024-11-26 23:55:56 +00:00
submission, err := svc.DB.Submissions().Get(ctx, params.SubmissionID)
if err != nil{
return nil, err
}
return &api.Submission{
ID: api.NewOptInt64(submission.ID),
DisplayName: api.NewOptString(submission.DisplayName),
Creator: api.NewOptString(submission.Creator),
GameID: api.NewOptInt32(submission.GameID),
Date: api.NewOptInt64(submission.Date.Unix()),
Submitter: api.NewOptInt64(submission.Submitter),
AssetID: api.NewOptInt64(submission.AssetID),
AssetVersion: api.NewOptInt64(submission.AssetVersion),
Completed: api.NewOptBool(submission.Completed),
TargetAssetID: api.NewOptInt64(submission.TargetAssetID),
2024-11-28 01:27:22 +00:00
StatusID: api.NewOptInt32(int32(submission.StatusID)),
2024-11-26 23:55:56 +00:00
}, nil
2024-11-26 23:28:48 +00:00
}
// ListSubmissions implements listSubmissions operation.
//
// Get list of submissions.
//
// GET /submissions
2024-11-28 00:38:22 +00:00
func (svc *Service) ListSubmissions(ctx context.Context, request api.ListSubmissionsParams) ([]api.Submission, error) {
filter := datastore.Optional()
//fmt.Println(request)
if request.Filter.IsSet() {
filter.AddNotNil("display_name", request.Filter.Value.DisplayName)
filter.AddNotNil("creator", request.Filter.Value.Creator)
filter.AddNotNil("game_id", request.Filter.Value.GameID)
}
items, err := svc.DB.Submissions().List(ctx, filter, model.Page{
Number: request.Page.GetPage(),
Size: request.Page.GetLimit(),
})
if err != nil{
return nil, err
}
var resp []api.Submission
for i := 0; i < len(items); i++ {
resp = append(resp, api.Submission{
ID: api.NewOptInt64(items[i].ID),
DisplayName: api.NewOptString(items[i].DisplayName),
Creator: api.NewOptString(items[i].Creator),
GameID: api.NewOptInt32(items[i].GameID),
Date: api.NewOptInt64(items[i].Date.Unix()),
Submitter: api.NewOptInt64(items[i].Submitter),
AssetID: api.NewOptInt64(items[i].AssetID),
AssetVersion: api.NewOptInt64(items[i].AssetVersion),
Completed: api.NewOptBool(items[i].Completed),
TargetAssetID: api.NewOptInt64(items[i].TargetAssetID),
2024-11-28 01:27:22 +00:00
StatusID: api.NewOptInt32(int32(items[i].StatusID)),
2024-11-28 00:38:22 +00:00
})
}
return resp, nil
2024-11-26 23:28:48 +00:00
}
// PatchSubmissionCompleted implements patchSubmissionCompleted operation.
//
// Retrieve map with ID.
//
// PATCH /submissions/{SubmissionID}/completed
2024-11-26 23:30:58 +00:00
func (svc *Service) PatchSubmissionCompleted(ctx context.Context, params api.PatchSubmissionCompletedParams) error {
2024-11-28 01:27:40 +00:00
// check if caller has MaptestGame role (request must originate from a maptest roblox game)
2024-11-28 00:44:50 +00:00
pmap := datastore.Optional()
2024-11-28 01:22:59 +00:00
pmap.Add("completed", true)
2024-11-28 00:44:50 +00:00
err := svc.DB.Submissions().Update(ctx, params.SubmissionID, pmap)
return err
2024-11-26 23:28:48 +00:00
}
// PatchSubmissionModel implements patchSubmissionModel operation.
//
// Update model following role restrictions.
//
// PATCH /submissions/{SubmissionID}/model
2024-11-26 23:30:58 +00:00
func (svc *Service) PatchSubmissionModel(ctx context.Context, params api.PatchSubmissionModelParams) error {
2024-11-28 01:27:40 +00:00
// check if caller has Submitter role
// check if Status is ChangesRequested|Submitted|UnderConstruction
// PROBLEM how to deal with async? data may become out of date
2024-11-28 00:44:50 +00:00
pmap := datastore.Optional()
pmap.AddNotNil("asset_id", params.ModelID)
pmap.AddNotNil("asset_version", params.VersionID)
//always reset completed when model changes
pmap.Add("completed",false)
2024-11-28 00:44:50 +00:00
err := svc.DB.Submissions().Update(ctx, params.SubmissionID, pmap)
return err
2024-11-26 23:28:48 +00:00
}
// PatchSubmissionStatus implements patchSubmissionStatus operation.
//
// Update status following role restrictions.
//
// PATCH /submissions/{SubmissionID}/status
2024-11-26 23:30:58 +00:00
func (svc *Service) PatchSubmissionStatus(ctx context.Context, params api.PatchSubmissionStatusParams) error {
2024-11-28 00:44:50 +00:00
pmap := datastore.Optional()
pmap.AddNotNil("status", params.Status)
err := svc.DB.Submissions().Update(ctx, params.SubmissionID, pmap)
return err
2024-11-26 23:28:48 +00:00
}