Пример #1
0
 private async Task <RegistrationContext> LoadContext(GamespaceRegistration reg)
 {
     return(new RegistrationContext
     {
         Request = reg,
         Workspace = await _workspaceStore.Load(reg.ResourceId)
     });
 }
Пример #2
0
        private async Task _validate(GamespaceRegistration model)
        {
            if (!await WorkspaceExists(model.ResourceId))
            {
                throw new ResourceNotFound();
            }

            await Task.CompletedTask;
        }
Пример #3
0
        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));
        }
Пример #4
0
        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));
        }
Пример #5
0
        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);
        }