コード例 #1
0
        public override void OnActionExecuting(HttpActionContext context)
        {
            var supported = ApiVersion.GetSupported();

            try
            {
                if (!context.Request.Headers.Contains(ApiHeaders.XExperienceApiVersion))
                {
                    throw new Exception($"Missing '{ApiHeaders.XExperienceApiVersion}' header.");
                }

                IEnumerable <string> headerValues = context.Request.Headers.GetValues(ApiHeaders.XExperienceApiVersion);
                string requestVersion             = headerValues.FirstOrDefault();
                if (string.IsNullOrEmpty(requestVersion))
                {
                    throw new Exception($"'{ApiHeaders.XExperienceApiVersion}' header or it's null or empty.");
                }

                try
                {
                    ApiVersion version = requestVersion;
                }
                catch (Exception)
                {
                    throw new Exception($"'{ApiHeaders.XExperienceApiVersion}' header is '{requestVersion}' which is not supported.");
                }
            }
            catch (Exception ex)
            {
                var response = context.Request.CreateResponse(System.Net.HttpStatusCode.BadRequest, ex.Message + " Supported Versions are: " + string.Join(", ", supported.Select(x => x.Key)));
                context.Response = response;
                context.Response.Headers.Add(ApiHeaders.XExperienceApiVersion, ApiVersion.GetLatest().ToString());
            }
        }
コード例 #2
0
        private static bool ValidateParameters(PagedStatementsQuery parameters)
        {
            var otherParameters = parameters.ToParameterMap(ApiVersion.GetLatest());

            otherParameters.Remove("attachments");
            otherParameters.Remove("format");
            return(otherParameters.Count == 0);
        }
コード例 #3
0
        /// <summary>
        /// Creates statement without saving to database
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns>Guid of the created statement</returns>
        public async Task <Guid> Handle(CreateStatementCommand request, CancellationToken cancellationToken)
        {
            await _mediator.Publish(StatementCreating.Create(), cancellationToken);

            // Prepare statement for mapping
            if (request.Statement.Id.HasValue)
            {
                bool any = await _context.Statements.AnyAsync(x => x.StatementId == request.Statement.Id, cancellationToken);

                if (any)
                {
                    return(request.Statement.Id.Value);
                }
            }

            request.Statement.Stamp();

            // Ensure statement version and stored date
            request.Statement.Version = request.Statement.Version ?? ApiVersion.GetLatest().ToString();
            request.Statement.Stored  = request.Statement.Stored ?? DateTimeOffset.UtcNow;

            if (request.Statement.Authority == null)
            {
                // Set authority before saving JSON encoded statement
                request.Statement.Authority = _clientContext.GetClientAuthority();
            }
            else
            {
                // TODO: Validate authority
                var client = await _mediator.Send(ClientByAgentQuery.Create(request.Statement.Authority));
            }

            // Start mapping statement
            StatementEntity newStatement = new StatementEntity();

            newStatement.StatementId = request.Statement.Id.GetValueOrDefault();
            newStatement.ClientId    = _clientContext.GetClientId();

            await HandleStatementBase(request.Statement, newStatement, cancellationToken);

            newStatement.Stored        = request.Statement.Stored;
            newStatement.Timestamp     = request.Statement.Timestamp;
            newStatement.Version       = request.Statement.Version.ToString();
            newStatement.FullStatement = request.Statement.ToJson();

            _context.Statements.Add(newStatement);

            await _context.SaveChangesAsync(cancellationToken);

            await _mediator.Publish(StatementCreated.Create(newStatement), cancellationToken);

            return(newStatement.StatementId);
        }
コード例 #4
0
        public bool PutStatement(Guid?statementId, Statement statement, out HttpStatusCode statusCode)
        {
            statusCode   = HttpStatusCode.Conflict;
            statement.Id = statementId;

            if (statement.Id.HasValue)
            {
                if (CheckIfExists(statementId))
                {
                    return(true);
                }
            }

            if (statement.Verb.Id == KnownVerbs.Voided)
            {
                StatementRef stRf = statement.Object as StatementRef;
                if (IsVoidedOrVoiding(stRf.Id))
                {
                    return(true);
                }
            }

            statement.Stamp();
            // Ensure statement version and stored date
            statement.Version = statement.Version ?? ApiVersion.GetLatest().ToString();
            statement.Stored  = statement.Stored ?? DateTimeOffset.UtcNow;

            if (statement.Authority == null)
            {
                // Set authority before saving JSON encoded statement
                var agent = new Agent();
                agent.Mbox          = new Mbox("mailto:" + "*****@*****.**");
                agent.Name          = "Manu";
                statement.Authority = agent;
            }


            //to do map to Statement Entity
            StatementEntity newStatement = new StatementEntity();

            newStatement.Id            = statement.Id;
            newStatement.Stored        = statement.Stored;
            newStatement.Version       = statement.Version.ToString();
            newStatement.FullStatement = statement.ToJson();

            StoreStatement(newStatement);


            return(false);
        }
コード例 #5
0
 public Group(JsonString jsonString) : this(jsonString.ToJToken(), ApiVersion.GetLatest())
 {
 }
コード例 #6
0
 protected InteractionActivityDefinitionBase(JsonString jsonString) : this(jsonString.ToJToken(), ApiVersion.GetLatest())
 {
 }
コード例 #7
0
 public StatementCollection(JsonString jsonString) : this(jsonString.ToJToken(), ApiVersion.GetLatest())
 {
 }
コード例 #8
0
        public async Task ExecuteResultAsync(ActionContext context)
        {
            string      strJson     = _statement.ToJson(_format);
            HttpContent httpContent = new StringContent(strJson, Encoding.UTF8, MediaTypes.Application.Json);

            var attachmentsWithPayload = _statement.Attachments.Where(a => a.Payload != null);

            if (_statement.Attachments.Any(x => x.Payload != null))
            {
                string boundary = Guid.NewGuid().ToString();
                httpContent = new MultipartContent("mixed", boundary)
                {
                    httpContent
                };

                foreach (var attachment in _statement.Attachments)
                {
                    if (attachment.Payload != null)
                    {
                        ((MultipartContent)httpContent).AddAttachment(attachment);
                    }
                }
            }

            foreach (var header in httpContent.Headers)
            {
                context.HttpContext.Response.Headers.Add(
                    header.Key,
                    new StringValues(header.Value.ToArray())
                    );
            }

            context.HttpContext.Response.Headers.Add(ApiHeaders.XExperienceApiVersion, ApiVersion.GetLatest().ToString());
            await httpContent.CopyToAsync(context.HttpContext.Response.Body);

            httpContent.Dispose();
        }
コード例 #9
0
 public InteractionComponent(JsonString jsonString) : this(jsonString.ToJToken(), ApiVersion.GetLatest())
 {
 }
コード例 #10
0
ファイル: StatementsResult.cs プロジェクト: eMelgooG/LRS-xApi
 public StatementsResult(JsonString jsonString)
     : this(jsonString.ToJToken(), ApiVersion.GetLatest())
 {
 }
コード例 #11
0
 public Statement(JToken jtoken) : this(jtoken, ApiVersion.GetLatest())
 {
 }
コード例 #12
0
 public Context(JsonString jsonString) : this(jsonString.ToJToken(), ApiVersion.GetLatest())
 {
 }
コード例 #13
0
        private ActivityDefinition GetActivityInteraction(int interactionIndex)
        {
            ActivityDefinition interactionDef = null;

            using (SqlConnection connection = new SqlConnection(DbUtils.GetConnectionString()))
            {
                SqlDataReader reader  = null;
                SqlCommand    command = new SqlCommand(GetActivityInteractionQuery, connection);
                command.Parameters.AddWithValue("@id", interactionIndex);
                try
                {
                    connection.Open();
                    reader = command.ExecuteReader();
                    if (reader.Read())
                    {
                        InteractionType type = reader.GetString(1);
                        interactionDef = type.CreateInstance(new JObject(), ApiVersion.GetLatest());
                        if (!reader.IsDBNull(2))
                        {
                            JsonString json  = reader.GetString(2);
                            var        sList = new List <string>();
                            var        crp   = json.ToJArray();
                            foreach (var jstring in crp)
                            {
                                sList.Add(jstring.Value <string>());
                            }
                            (interactionDef as InteractionActivityDefinitionBase).CorrectResponsesPattern = sList.ToArray();
                        }
                        if (!reader.IsDBNull(3))
                        {
                            Choice     cho = interactionDef as Choice;
                            Sequencing seq = interactionDef as Sequencing;
                            if (cho != null)
                            {
                                cho.Choices = new InteractionComponentCollection(reader.GetString(3));
                            }
                            else if (seq != null)
                            {
                                seq.Choices = new InteractionComponentCollection(reader.GetString(3));
                            }
                        }
                        if (!reader.IsDBNull(4))
                        {
                            Likert def = interactionDef as Likert;
                            if (def != null)
                            {
                                def.Scale = new InteractionComponentCollection(reader.GetString(4));
                            }
                        }
                        if (!reader.IsDBNull(5))
                        {
                            Matching match = interactionDef as Matching;
                            if (match != null)
                            {
                                match.Source = new InteractionComponentCollection(reader.GetString(5));
                            }
                        }
                        if (!reader.IsDBNull(6))
                        {
                            Matching match = interactionDef as Matching;
                            if (match != null)
                            {
                                match.Target = new InteractionComponentCollection(reader.GetString(6));
                            }
                        }
                        if (!reader.IsDBNull(7))
                        {
                            Performance perf = interactionDef as Performance;
                            if (perf != null)
                            {
                                perf.Steps = new InteractionComponentCollection(reader.GetString(7));
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    return(null);
                }
                finally
                {
                    if (reader != null && !reader.IsClosed)
                    {
                        reader.Close();
                    }
                }
            }
            return(interactionDef);
        }
コード例 #14
0
ファイル: Verb.cs プロジェクト: eMelgooG/LRS-xApi
 public Verb(JToken verb) : this(verb, ApiVersion.GetLatest())
 {
 }
コード例 #15
0
        /// <summary>
        /// Creates statement without saving to database
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns>Guid of the created statement</returns>
        public async Task <Guid> Handle(CreateStatementCommand request, CancellationToken cancellationToken)
        {
            if (request.Statement.Id.HasValue)
            {
                int count = await _context.Statements.CountAsync(x => x.StatementId == request.Statement.Id, cancellationToken);

                if (count > 0)
                {
                    return(request.Statement.Id.Value);
                }
            }

            request.Statement.Stamp();

            // Ensure statement version and stored date
            request.Statement.Version = request.Statement.Version ?? ApiVersion.GetLatest().ToString();
            request.Statement.Stored  = request.Statement.Stored ?? DateTimeOffset.UtcNow;

            if (request.Statement.Authority == null)
            {
                request.Statement.Authority = _authorityContext.Authority;
            }
            else
            {
                // TODO: Validate authority
            }

            StatementEntity newStatement = _mapper.Map <StatementEntity>(request.Statement);

            newStatement.Verb = (VerbEntity)await _mediator.Send(MergeVerbCommand.Create(request.Statement.Verb), cancellationToken).ConfigureAwait(false);

            newStatement.Actor = (AgentEntity)await _mediator.Send(MergeActorCommand.Create(request.Statement.Actor), cancellationToken).ConfigureAwait(false);

            newStatement.Authority = (AgentEntity)await _mediator.Send(MergeActorCommand.Create(request.Statement.Authority), cancellationToken).ConfigureAwait(false);

            if (newStatement.Context != null)
            {
                var context = newStatement.Context;
                if (context.Instructor != null)
                {
                    context.Instructor = (AgentEntity)await _mediator.Send(MergeActorCommand.Create(request.Statement.Context.Instructor), cancellationToken);
                }
                if (context.Team != null)
                {
                    context.Team = (AgentEntity)await _mediator.Send(MergeActorCommand.Create(request.Statement.Context.Team), cancellationToken);
                }
            }

            var objType = newStatement.Object.ObjectType;

            if (objType == EntityObjectType.Activity)
            {
                newStatement.Object.Activity = (ActivityEntity)await _mediator.Send(MergeActivityCommand.Create((IActivity)request.Statement.Object));
            }
            else if (objType == EntityObjectType.Agent || objType == EntityObjectType.Group)
            {
                newStatement.Object.Agent = (AgentEntity)await _mediator.Send(MergeActorCommand.Create((IAgent)request.Statement.Object));
            }
            else if (objType == EntityObjectType.SubStatement)
            {
                newStatement.Object.SubStatement = (SubStatementEntity)await _mediator.Send(CreateSubStatementCommand.Create((ISubStatement)request.Statement.Object));
            }
            else if (objType == EntityObjectType.StatementRef)
            {
                // It's already mapped from automapper
                // TODO: Additional logic should be performed here
            }

            newStatement.FullStatement = request.Statement.ToJson();

            _context.Statements.Add(newStatement);

            await _mediator.Publish(StatementAdded.Create(newStatement), cancellationToken);

            return(newStatement.StatementId);
        }
コード例 #16
0
ファイル: LanguageMap.cs プロジェクト: eMelgooG/LRS-xApi
 /// <exception cref="LanguageTagException" />
 public LanguageMap(JsonString jsonString) : this(jsonString.ToJToken(), ApiVersion.GetLatest())
 {
 }
コード例 #17
0
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            var supported = ApiVersion.GetSupported();

            try
            {
                if (!context.HttpContext.Request.Headers.ContainsKey(ApiHeaders.XExperienceApiVersion))
                {
                    throw new Exception($"Missing '{ApiHeaders.XExperienceApiVersion}' header.");
                }

                string requestVersion = context.HttpContext.Request.Headers[ApiHeaders.XExperienceApiVersion];
                if (string.IsNullOrEmpty(requestVersion))
                {
                    throw new Exception($"'{ApiHeaders.XExperienceApiVersion}' header or it's null or empty.");
                }

                try
                {
                    ApiVersion version = requestVersion;
                }
                catch (Exception)
                {
                    throw new Exception($"'{ApiHeaders.XExperienceApiVersion}' header is '{requestVersion}' which is not supported.");
                }

                await next();
            }
            catch (Exception ex)
            {
                context.HttpContext.Response.Headers.Add(ApiHeaders.XExperienceApiVersion, ApiVersion.GetLatest().ToString());
                context.Result = new BadRequestObjectResult(ex.Message + " Supported Versions are: " + string.Join(", ", supported.Select(x => x.Key)));
            }
        }
コード例 #18
0
        /// <summary>
        /// Creates statement without saving to database
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns>Guid of the created statement</returns>
        public async Task <Guid> Handle(CreateStatementCommand request, CancellationToken cancellationToken)
        {
            // Prepare statement for mapping
            if (request.Statement.Id.HasValue)
            {
                bool any = await _context.Statements.AnyAsync(x => x.StatementId == request.Statement.Id, cancellationToken).ConfigureAwait(false);

                if (any)
                {
                    return(request.Statement.Id.Value);
                }
            }

            request.Statement.Stamp();

            // Ensure statement version and stored date
            request.Statement.Version = request.Statement.Version ?? ApiVersion.GetLatest().ToString();
            request.Statement.Stored  = request.Statement.Stored ?? DateTimeOffset.UtcNow;

            if (request.Statement.Authority == null)
            {
                // TODO: Map group?
                request.Statement.Authority = _mapper.Map <Agent>(_authorityContext.Authority);
            }
            else
            {
                // TODO: Validate authority
            }

            // Start mapping statement
            StatementEntity newStatement = new StatementEntity();

            newStatement.StatementId = request.Statement.Id.GetValueOrDefault();
            newStatement.Verb        = (VerbEntity)await _mediator.Send(UpsertVerbCommand.Create(request.Statement.Verb), cancellationToken).ConfigureAwait(false);

            newStatement.Actor = (AgentEntity)await _mediator.Send(UpsertActorCommand.Create(request.Statement.Actor), cancellationToken).ConfigureAwait(false);

            newStatement.Authority = (AgentEntity)await _mediator.Send(UpsertActorCommand.Create(request.Statement.Authority), cancellationToken).ConfigureAwait(false);

            if (request.Statement.Context != null)
            {
                newStatement.Context = _mapper.Map <ContextEntity>(request.Statement.Context);
                ContextEntity context = newStatement.Context;
                if (context.Instructor != null)
                {
                    context.Instructor = (AgentEntity)await _mediator.Send(UpsertActorCommand.Create(request.Statement.Context.Instructor), cancellationToken).ConfigureAwait(false);
                }
                if (context.Team != null)
                {
                    context.Team = (AgentEntity)await _mediator.Send(UpsertActorCommand.Create(request.Statement.Context.Team), cancellationToken).ConfigureAwait(false);
                }
            }

            var objType = request.Statement.Object.ObjectType;

            newStatement.Object = new StatementObjectEntity();
            if (objType == ObjectType.Activity)
            {
                newStatement.Object.Activity = (ActivityEntity)await _mediator.Send(UpsertActivityCommand.Create((Activity)request.Statement.Object), cancellationToken).ConfigureAwait(false);
            }
            else if (objType == ObjectType.Agent || objType == ObjectType.Group)
            {
                newStatement.Object.Agent = (AgentEntity)await _mediator.Send(UpsertActorCommand.Create((Agent)request.Statement.Object), cancellationToken).ConfigureAwait(false);
            }
            else if (objType == ObjectType.SubStatement)
            {
                newStatement.Object.SubStatement = (SubStatementEntity)await _mediator.Send(CreateSubStatementCommand.Create((SubStatement)request.Statement.Object), cancellationToken).ConfigureAwait(false);
            }
            else if (objType == ObjectType.StatementRef)
            {
                newStatement.Object.StatementRef = _mapper.Map <StatementRefEntity>((StatementRef)request.Statement.Object);
            }

            if (request.Statement.Result != null)
            {
                newStatement.Result = _mapper.Map <ResultEntity>(request.Statement.Result);
            }
            newStatement.Stored        = request.Statement.Stored;
            newStatement.Timestamp     = request.Statement.Timestamp;
            newStatement.Version       = request.Statement.Version.ToString();
            newStatement.FullStatement = request.Statement.ToJson();

            _context.Statements.Add(newStatement);

            // await _context.SaveChangesAsync(cancellationToken);
            await _mediator.Publish(StatementAdded.Create(newStatement), cancellationToken).ConfigureAwait(false);

            if (request.Persist)
            {
                await _context.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
            }

            return(newStatement.StatementId);
        }
コード例 #19
0
 public AttachmentCollection(JToken jarr) : this(jarr, ApiVersion.GetLatest())
 {
 }
コード例 #20
0
ファイル: Attachment.cs プロジェクト: eMelgooG/LRS-xApi
 public Attachment(JsonString jsonString) : this(jsonString.ToJToken(), ApiVersion.GetLatest())
 {
 }
コード例 #21
0
ファイル: StatementRef.cs プロジェクト: eMelgooG/LRS-xApi
 public StatementRef(JToken jobj) : this(jobj, ApiVersion.GetLatest())
 {
 }
コード例 #22
0
 public ApiJsonSerializer()
     : this(ApiVersion.GetLatest())
 {
 }
コード例 #23
0
 public ActivityCollection(JsonString jsonString) : this(jsonString.ToJToken(), ApiVersion.GetLatest())
 {
 }
コード例 #24
0
 public ExtensionsDictionary(JToken jobj) : this(jobj, ApiVersion.GetLatest())
 {
 }