private async Task <RegistrationContext> LoadContext(GamespaceRegistration reg) { return(new RegistrationContext { Request = reg, Workspace = await _workspaceStore.Load(reg.ResourceId) }); }
private async Task _validate(GamespaceRegistration model) { if (!await WorkspaceExists(model.ResourceId)) { throw new ResourceNotFound(); } await Task.CompletedTask; }
public async Task <GameState> Register(GamespaceRegistration request, User actor) { var gamespace = await _Register(request, actor); if (request.StartGamespace) { await Deploy(gamespace, actor.IsBuilder); } return(await LoadState(gamespace, request.AllowPreview)); }
public async Task <ActionResult <GameState> > RegisterGamespace([FromBody] GamespaceRegistration model, CancellationToken ct) { await Validate(model); AuthorizeAny( () => Actor.IsAdmin, () => _svc.HasValidUserScope(model.ResourceId, Actor.Scope, Actor.Id).Result ); if (string.IsNullOrEmpty(model.GraderUrl)) { model.GraderUrl = string.Format( "{0}://{1}{2}", Request.Scheme, Request.Host, Url.Action("GradeChallenge") ); } var result = await _svc.Register(model, Actor); string token = Guid.NewGuid().ToString("n"); if (model.Players.Any()) { string key = $"{TicketAuthentication.TicketCachePrefix}{token}"; string value = model.Players .Select(p => $"{p.SubjectId}#{p.SubjectName}") .First(); await _distCache.SetStringAsync(key, value, _cacheOpts, ct); } result.LaunchpointUrl = $"{_options.LaunchUrl}?t={token}&g={result.Id}"; // if url is relative, make absolute if (!result.LaunchpointUrl.Contains("://")) { result.LaunchpointUrl = string.Format("{0}://{1}{2}{3}", Request.Scheme, Request.Host, Request.PathBase, result.LaunchpointUrl ); } return(Ok(result)); }
private async Task <TopoMojo.Api.Data.Gamespace> _Register(GamespaceRegistration request, User actor) { string playerId = request.Players.FirstOrDefault()?.SubjectId ?? actor.Id; var gamespace = await _store.LoadActiveByContext( request.ResourceId, playerId ); if (gamespace is Data.Gamespace) { return(gamespace); } if (!await _store.IsBelowGamespaceLimit(actor.Id, actor.GamespaceLimit)) { throw new ClientGamespaceLimitReached(); } string lockKey = $"{playerId}{request.ResourceId}"; var ctx = await LoadContext(request); if (!await _locker.Lock(lockKey)) { throw new ResourceIsLocked(); } try { await Create(ctx, actor); } finally { await _locker.Unlock(lockKey); } return(ctx.Gamespace); }