示例#1
0
        public IActionResult GetById(int id, DateTimeOffset?timestamp = null)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var status = _entityIndex.Status(ResourceType.Tag, id) ?? ContentStatus.Published;

            if (!UserPermissions.IsAllowedToGet(User.Identity, status, _entityIndex.Owner(ResourceType.Tag, id)))
            {
                return(Forbid());
            }

            var tag = _db.Database.GetCollection <Tag>(ResourceType.Tag.Name)
                      .AsQueryable()
                      .FirstOrDefault(x => x.Id == id);

            if (tag == null)
            {
                return(NotFound());
            }

            if (timestamp != null && tag.Timestamp <= timestamp.Value)
            {
                return(StatusCode(304));
            }

            var tagResult = new TagResult(tag)
            {
                Timestamp = _referencesIndex.LastModificationCascading(ResourceType.Tag, id)
            };

            return(Ok(tagResult));
        }
        // APIs to get the state of an entity at a specific point in time

        /*
         * [HttpGet("/api/Exhibits/{id}/History/{timestamp}")]
         * public Task<IActionResult> GetExhibitVersion(int id, DateTimeOffset timestamp) =>
         *  GetVersionAsync<Exhibit>(ResourceType.Exhibit, id, timestamp);
         *
         * [HttpGet("/api/Exhibits/Pages/{id}/History/{timestamp}")]
         * public Task<IActionResult> GetExhibitPageVersion(int id, DateTimeOffset timestamp) =>
         *  GetVersionAsync<ExhibitPage>(ResourceType.ExhibitPage, id, timestamp);
         *
         * [HttpGet("/api/Media/{id}/History/{timestamp}")]
         * public Task<IActionResult> GetMediaVersion(int id, DateTimeOffset timestamp) =>
         *  GetVersionAsync<MediaElement>(ResourceType.Media, id, timestamp);
         *
         * [HttpGet("/api/Routes/{id}/History/{timestamp}")]
         * public Task<IActionResult> GetRouteVersion(int id, DateTimeOffset timestamp) =>
         *  GetVersionAsync<Route>(ResourceType.Route, id, timestamp);
         *
         * [HttpGet("/api/Tags/{id}/History/{timestamp}")]
         * public Task<IActionResult> GetTagVersion(int id, DateTimeOffset timestamp) =>
         *  GetVersionAsync<Route>(ResourceType.Tag, id, timestamp);
         */


        // Private helper methods

        private async Task <IActionResult> GetSummaryAsync(ResourceType type, int id)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (!UserPermissions.IsAllowedToGetHistory(User.Identity, _entityIndex.Owner(type, id)))
            {
                return(Forbid());
            }

            var summary = await HistoryUtil.GetSummaryAsync(_eventStore.EventStream, (type, id));

            return(Ok(summary));
        }
        public IActionResult GetById(int id, DateTimeOffset?timestamp = null)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var status = _entityIndex.Status(ResourceType.Media, id) ?? ContentStatus.Published;

            if (!UserPermissions.IsAllowedToGet(User.Identity, status, _entityIndex.Owner(ResourceType.Media, id)))
            {
                return(Forbid());
            }

            var media = _db.Database.GetCollection <MediaElement>(ResourceType.Media.Name)
                        .AsQueryable()
                        .FirstOrDefault(x => x.Id == id);

            if (media == null)
            {
                return(NotFound());
            }

            // Media instance wasn`t modified after timestamp
            if (timestamp != null && media.Timestamp <= timestamp)
            {
                return(StatusCode(304));
            }

            var result = new MediaResult(media)
            {
                File      = GenerateFileUrl(media),
                Timestamp = _referencesIndex.LastModificationCascading(ResourceType.Media, id)
            };

            return(Ok(result));
        }