public ActionResult Index(string id)
        {
            string observationId = VerbosifyId <Observation>(id);

            if (!_permissionManager.DoesExist <Observation>(observationId))
            {
                return(HttpNotFound());
            }

            dynamic viewModel = new ExpandoObject();

            viewModel.Observation = _sightingViewModelQuery.BuildSighting(observationId);

            return(RestfulResult(
                       viewModel,
                       "observations",
                       "index"));
        }
        public ActionResult Index(string id)
        {
            string postId = VerbosifyId <Post>(id);

            if (!_permissionManager.DoesExist <Post>(postId))
            {
                return(HttpNotFound());
            }

            dynamic viewModel = new ExpandoObject();

            viewModel.Post = _postViewModelQuery.BuildPost(postId);

            return(RestfulResult(
                       viewModel,
                       "posts",
                       "index"));
        }
        public ActionResult Index(string id)
        {
            string recordId = VerbosifyId <Record>(id);

            if (!_permissionManager.DoesExist <Record>(recordId))
            {
                return(HttpNotFound());
            }

            var viewModel = new
            {
                Record = _sightingViewModelQuery.BuildSighting(recordId)
            };

            return(RestfulResult(
                       viewModel,
                       "records",
                       "index"));
        }
        public ActionResult Posts(string id, PostsQueryInput queryInput)
        {
            string organisationId = VerbosifyId <Organisation>(id);

            if (!_permissionManager.DoesExist <Organisation>(organisationId))
            {
                return(HttpNotFound());
            }

            queryInput.PageSize = 10;

            if (string.IsNullOrWhiteSpace(queryInput.Sort) ||
                (queryInput.Sort.ToLower() != "newest" &&
                 queryInput.Sort.ToLower() != "oldest" &&
                 queryInput.Sort.ToLower() != "a-z" &&
                 queryInput.Sort.ToLower() != "z-a"))
            {
                queryInput.Sort = "newest";
            }

            queryInput.Query = queryInput.Query ?? string.Empty;
            queryInput.Field = queryInput.Field ?? string.Empty;

            var organisationResult = _documentSession
                                     .Query <All_Groups.Result, All_Groups>()
                                     .AsProjection <All_Groups.Result>()
                                     .First(x => x.GroupId == organisationId);

            dynamic viewModel = new ExpandoObject();

            viewModel.Organisation         = _organisationViewModelQuery.BuildOrganisation(organisationId);
            viewModel.Posts                = _postViewModelQuery.BuildGroupPostList(organisationId, queryInput);
            viewModel.UserCountDescription = "Member" + (organisationResult.UserCount == 1 ? string.Empty : "s");
            viewModel.PostCountDescription = "Post" + (organisationResult.PostCount == 1 ? string.Empty : "s");
            viewModel.Query                = new
            {
                Id = organisationId,
                queryInput.Page,
                queryInput.PageSize,
                queryInput.Sort,
                queryInput.Query,
                queryInput.Field
            };
            viewModel.ShowPosts       = true;
            viewModel.FieldSelectList = new[]
            {
                new
                {
                    Text     = "Title",
                    Value    = "title",
                    Selected = queryInput.Field.ToLower() == "title"
                },
                new
                {
                    Text     = "Body",
                    Value    = "body",
                    Selected = queryInput.Field.ToLower() == "body"
                }
            };

            return(RestfulResult(
                       viewModel,
                       "organisations",
                       "posts"));
        }
        public ActionResult Sightings(string id, SightingsQueryInput queryInput)
        {
            string projectId = VerbosifyId <Project>(id);

            if (!_permissionManager.DoesExist <Project>(projectId))
            {
                return(HttpNotFound());
            }

            if (queryInput.View.ToLower() == "thumbnails")
            {
                queryInput.PageSize = 15;
            }

            if (queryInput.View.ToLower() == "details")
            {
                queryInput.PageSize = 10;
            }

            if (string.IsNullOrWhiteSpace(queryInput.Sort) ||
                (queryInput.Sort.ToLower() != "newest" &&
                 queryInput.Sort.ToLower() != "oldest" &&
                 queryInput.Sort.ToLower() != "a-z" &&
                 queryInput.Sort.ToLower() != "z-a"))
            {
                queryInput.Sort = "newest";
            }

            queryInput.Category = queryInput.Category ?? string.Empty;
            if (!string.IsNullOrWhiteSpace(queryInput.Category) && !Categories.IsValidCategory(queryInput.Category))
            {
                queryInput.Category = string.Empty;
            }

            queryInput.Query = queryInput.Query ?? string.Empty;
            queryInput.Field = queryInput.Field ?? string.Empty;

            queryInput.Taxonomy = queryInput.Taxonomy ?? string.Empty;

            var projectResult = _documentSession
                                .Query <All_Groups.Result, All_Groups>()
                                .AsProjection <All_Groups.Result>()
                                .Where(x => x.GroupId == projectId)
                                .First();

            dynamic viewModel = new ExpandoObject();

            viewModel.Project                  = _projectViewModelQuery.BuildProject(projectId);
            viewModel.Sightings                = _sightingViewModelQuery.BuildGroupSightingList(projectId, queryInput);
            viewModel.UserCountDescription     = "Member" + (projectResult.UserCount == 1 ? string.Empty : "s");
            viewModel.SightingCountDescription = "Sighting" + (projectResult.SightingCount == 1 ? string.Empty : "s");
            viewModel.PostCountDescription     = "Post" + (projectResult.PostCount == 1 ? string.Empty : "s");
            viewModel.CategorySelectList       = Categories.GetSelectList(queryInput.Category);
            viewModel.Categories               = Categories.GetAll();
            viewModel.Query = new
            {
                Id = projectId,
                queryInput.Page,
                queryInput.PageSize,
                queryInput.Sort,
                queryInput.View,
                queryInput.Category,
                queryInput.NeedsId,
                queryInput.Query,
                queryInput.Field,
                queryInput.Taxonomy,
                IsThumbnailsView = queryInput.View == "thumbnails",
                IsDetailsView    = queryInput.View == "details",
                IsMapView        = queryInput.View == "map"
            };
            viewModel.ShowSightings   = true;
            viewModel.FieldSelectList = new[]
            {
                new
                {
                    Text     = "Sighting Title",
                    Value    = "title",
                    Selected = queryInput.Field.ToLower() == "title"
                },
                new
                {
                    Text     = "Descriptions",
                    Value    = "descriptions",
                    Selected = queryInput.Field.ToLower() == "descriptions"
                },
                new
                {
                    Text     = "Tags",
                    Value    = "tags",
                    Selected = queryInput.Field.ToLower() == "tags"
                },
                new
                {
                    Text     = "Scientific Name",
                    Value    = "scientificname",
                    Selected = queryInput.Field.ToLower() == "scientificname"
                },
                new
                {
                    Text     = "Common Name",
                    Value    = "commonname",
                    Selected = queryInput.Field.ToLower() == "commonname"
                }
            };

            return(RestfulResult(
                       viewModel,
                       "projects",
                       "sightings"));
        }