Beispiel #1
0
        public async Task <IActionResult> GetYearList(int year)
        {
            string userId = HttpContext.User.FindUserId();

            if (string.IsNullOrEmpty(userId))
            {
                return(Unauthorized());
            }

            if (!await premiumProvider.HasPremiumAsync(userId))
            {
                return(PremiumRequired());
            }

            var result = await shareStatus
                         .OwnedByOrExplicitlySharedWithUser(dataContext, dataContext.Entries, userId)
                         .Where(e => e.When.Year == year)
                         .OrderByDescending(e => e.When)
                         .Select(e => new CalendarEntryModel()
            {
                Id    = e.Id,
                Title = e.Title,
                When  = e.When
            })
                         .AsNoTracking()
                         .ToListAsync();

            return(Ok(result));
        }
Beispiel #2
0
        public async Task <ActionResult <List <StoryListModel> > > GetList()
        {
            string userId = HttpContext.User.FindUserId();

            if (userId == null)
            {
                return(Unauthorized());
            }

            List <Story> entities = await shareStatus.OwnedByOrExplicitlySharedWithUser(db, db.Stories, userId)
                                    .OrderByDescending(s => s.Order)
                                    .ToListAsync();

            List <StoryListModel> models = new List <StoryListModel>();

            foreach (Story entity in entities)
            {
                var model = new StoryListModel();
                models.Add(model);

                MapEntityToModel(entity, model);

                int chapters = await db.Stories
                               .Where(s => s.Id == entity.Id)
                               .SelectMany(s => s.Chapters)
                               .CountAsync();

                int entries = await shareStatus.OwnedByOrExplicitlySharedWithUser(db, db.Entries, userId)
                              .Where(e => e.Story.Id == entity.Id || e.Chapter.Story.Id == entity.Id)
                              .CountAsync();

                model.Chapters = chapters;
                model.Entries  = entries;

                if (entries > 0)
                {
                    DateTime minDate = await shareStatus.OwnedByOrExplicitlySharedWithUser(db, db.Entries, userId)
                                       .Where(e => e.Story.Id == entity.Id || e.Chapter.Story.Id == entity.Id)
                                       .MinAsync(e => e.When);

                    DateTime maxDate = await shareStatus.OwnedByOrExplicitlySharedWithUser(db, db.Entries, userId)
                                       .Where(e => e.Story.Id == entity.Id || e.Chapter.Story.Id == entity.Id)
                                       .MaxAsync(e => e.When);

                    model.MinDate = minDate;
                    model.MaxDate = maxDate;
                }
            }

            var userNames = await this.userNames.GetUserNamesAsync(models.Select(e => e.UserId).ToArray());

            for (int i = 0; i < models.Count; i++)
            {
                models[i].UserName = userNames[i];
            }

            return(Ok(models));
        }
Beispiel #3
0
        public async Task <ActionResult <List <StoryEntryModel> > > GetStoryEntryList(string storyId)
        {
            string userId = HttpContext.User.FindUserId();
            var    models = await shareStatus.OwnedByOrExplicitlySharedWithUser(db, db.Entries, userId)
                            .Where(e => e.Story.Id == storyId)
                            .OrderBy(e => e.When)
                            .Select(e => new StoryEntryModel()
            {
                Id    = e.Id,
                Title = e.Title
            })
                            .ToListAsync();

            return(Ok(models));
        }
Beispiel #4
0
        public async Task <IActionResult> List()
        {
            string userId = HttpContext.User.FindUserId();

            if (string.IsNullOrEmpty(userId))
            {
                return(Unauthorized());
            }

            List <MapEntryModel> results = await shareStatus
                                           .OwnedByOrExplicitlySharedWithUser(dataContext, dataContext.Entries, userId)
                                           .Select(e => new MapEntryModel()
            {
                Id       = e.Id,
                Title    = e.Title,
                Location = e.Locations.Select(l => new LocationModel()
                {
                    Latitude  = l.Latitude,
                    Longitude = l.Longitude,
                    Altitude  = l.Altitude
                }).FirstOrDefault()
            })
                                           .ToListAsync();

            List <MapEntryModel> toRemove = new List <MapEntryModel>();

            foreach (var item in results)
            {
                if (HasLocationValue(item))
                {
                    var location = await dataContext.Images
                                   .Where(i => i.Entry.Id == item.Id && i.Location.Latitude != null && i.Location.Longitude != null)
                                   .Select(i => new LocationModel()
                    {
                        Latitude  = i.Location.Latitude,
                        Longitude = i.Location.Longitude,
                        Altitude  = i.Location.Altitude
                    })
                                   .FirstOrDefaultAsync();

                    item.Location = location;
                }

                if (HasLocationValue(item))
                {
                    toRemove.Add(item);
                }
            }

            foreach (var item in toRemove)
            {
                results.Remove(item);
            }

            return(Ok(results));
        }
Beispiel #5
0
        public Task <IActionResult> Update(string entryId, EntryStoryUpdateModel model) => RunEntryAsync(entryId, Permission.Write, async entry =>
        {
            string userId        = HttpContext.User.FindUserId();
            Story story          = null;
            StoryChapter chapter = null;

            if (model.StoryId != null)
            {
                story = await shareStatus.OwnedByOrExplicitlySharedWithUser(db, db.Stories, userId)
                        .Where(s => s.Id == model.StoryId)
                        .Include(s => s.Chapters)
                        .FirstOrDefaultAsync();

                if (story == null)
                {
                    model.StoryId   = null;
                    model.ChapterId = null;
                }
                else if (story.UserId != entry.UserId)
                {
                    return(BadRequest());
                }
            }

            if (model.ChapterId != null)
            {
                chapter = story.Chapters.FirstOrDefault(c => c.Id == model.ChapterId);
                if (chapter == null)
                {
                    story = null;
                }
            }

            if (story == null)
            {
                entry.Story   = null;
                entry.Chapter = null;
            }
            else if (chapter == null)
            {
                entry.Story   = story;
                entry.Chapter = null;
            }
            else
            {
                entry.Story   = null;
                entry.Chapter = chapter;
            }

            db.Entries.Update(entry);
            await db.SaveChangesAsync();

            return(NoContent());
        });
Beispiel #6
0
        public async Task <ActionResult <List <BeingListModel> > > GetList()
        {
            string userId = HttpContext.User.FindUserId();

            if (userId == null)
            {
                return(Unauthorized());
            }

            List <Being> entities = await shareStatus.OwnedByOrExplicitlySharedWithUser(db, db.Beings, userId)
                                    .OrderBy(b => b.Name)
                                    .ToListAsync();

            List <BeingListModel> models = new List <BeingListModel>();

            foreach (Being entity in entities)
            {
                var model = new BeingListModel();
                models.Add(model);

                MapEntityToModel(entity, model);

                int entries = await shareStatus.OwnedByOrExplicitlySharedWithUser(db, db.Entries, userId)
                              .Where(e => e.Beings.Contains(entity))
                              .CountAsync();

                model.Entries = entries;
            }

            var userNames = await this.userNames.GetUserNamesAsync(models.Select(e => e.UserId).ToArray());

            for (int i = 0; i < models.Count; i++)
            {
                models[i].UserName = userNames[i];
            }

            return(Ok(models));
        }
Beispiel #7
0
        public async Task <IActionResult> Get([FromQuery(Name = "q")] string query, int offset)
        {
            Ensure.PositiveOrZero(offset, "offset");

            if (String.IsNullOrEmpty(query) || String.IsNullOrWhiteSpace(query))
            {
                return(BadRequest());
            }

            string userId = HttpContext.User.FindUserId();

            if (string.IsNullOrEmpty(userId))
            {
                return(Unauthorized());
            }

            List <SearchEntryModel> result = await shareStatus
                                             .OwnedByOrExplicitlySharedWithUser(dataContext, dataContext.Entries, userId)
                                             .OrderByDescending(e => e.When)
                                             .Where(e => EF.Functions.Like(e.Title, $"%{query}%") || EF.Functions.Like(e.Text, $"%{query}%") || EF.Functions.Like(e.Story.Title, $"%{query}%") || EF.Functions.Like(e.Chapter.Story.Title, $"%{query}%") || EF.Functions.Like(e.Chapter.Title, $"%{query}%"))
                                             .Skip(offset)
                                             .Take(PageSize)
                                             .Select(e => new SearchEntryModel()
            {
                Id           = e.Id,
                UserId       = e.UserId,
                Title        = e.Title,
                When         = e.When,
                Text         = e.Text,
                StoryTitle   = e.Story.Title ?? e.Chapter.Story.Title,
                ChapterTitle = e.Chapter.Title,
                GpsCount     = e.Locations.Count,
                ImageCount   = dataContext.Images.Count(i => i.Entry.Id == e.Id)
            })
                                             .ToListAsync();

            var userNames = await this.userNames.GetUserNamesAsync(result.Select(e => e.UserId).ToArray());

            for (int i = 0; i < result.Count; i++)
            {
                result[i].UserName = userNames[i];
            }

            return(Ok(new SearchResponse(result, result.Count == PageSize)));
        }
Beispiel #8
0
        public Task <IActionResult> Update(string entryId, List <string> beingIds) => RunEntryAsync(entryId, Permission.Write, async entry =>
        {
            string userId = HttpContext.User.FindUserId();
            if (userId == null)
            {
                return(Unauthorized());
            }

            var toRemove = new List <Being>();
            foreach (var being in entry.Beings)
            {
                if (!beingIds.Contains(being.Id))
                {
                    toRemove.Add(being);
                }
                else
                {
                    beingIds.Remove(being.Id);
                }
            }

            foreach (var being in toRemove)
            {
                entry.Beings.Remove(being);
            }

            var toAdd = await shareStatus.OwnedByOrExplicitlySharedWithUser(db, db.Beings, userId)
                        .Where(b => beingIds.Contains(b.Id))
                        .ToListAsync();

            foreach (var being in toAdd)
            {
                entry.Beings.Add(being);
            }

            await db.SaveChangesAsync();

            return(NoContent());
        });
Beispiel #9
0
        public async Task <IActionResult> List(int offset)
        {
            Ensure.PositiveOrZero(offset, "offset");

            string userId = HttpContext.User.FindUserId();

            if (string.IsNullOrEmpty(userId))
            {
                return(Unauthorized());
            }

            var result = await shareStatus
                         .OwnedByOrExplicitlySharedWithUser(dataContext, dataContext.Entries, userId)
                         .OrderByDescending(e => e.When)
                         .Skip(offset)
                         .Take(PageSize)
                         .Select(e => new
            {
                Model = new TimelineEntryModel()
                {
                    Id           = e.Id,
                    UserId       = e.UserId,
                    Title        = e.Title,
                    When         = e.When,
                    StoryTitle   = e.Story.Title ?? e.Chapter.Story.Title,
                    ChapterTitle = e.Chapter.Title,
                    GpsCount     = e.Locations.Count,
                    ImageCount   = dataContext.Images.Count(i => i.Entry.Id == e.Id),
                    //Beings = e.Beings
                    //    .Select(b => new TimelineEntryBeingModel()
                    //    {
                    //        Name = b.Name,
                    //        Icon = b.Icon
                    //    }).ToList()
                },
                BeingCount = e.Beings.Count(),
                Text       = e.Text
            })
                         .AsNoTracking()
                         .AsSplitQuery()
                         .ToListAsync();

            foreach (var entry in result)
            {
                if (entry.BeingCount > 0)
                {
                    entry.Model.Beings = await shareStatus
                                         .OwnedByOrExplicitlySharedWithUser(dataContext, dataContext.Entries, userId)
                                         .Where(e => e.Id == entry.Model.Id)
                                         .SelectMany(e => e.Beings)
                                         .OrderBy(b => b.Name)
                                         .Select(b => new TimelineEntryBeingModel()
                    {
                        Name = b.Name,
                        Icon = b.Icon
                    })
                                         .ToListAsync();
                }

                if (!String.IsNullOrEmpty(entry.Text))
                {
                    entry.Model.TextWordCount = entry.Text.Split(' ', StringSplitOptions.RemoveEmptyEntries).Length;
                }
            }

            var userNames = await this.userNames.GetUserNamesAsync(result.Select(e => e.Model.UserId).ToArray());

            for (int i = 0; i < result.Count; i++)
            {
                result[i].Model.UserName = userNames[i];
            }

            return(Ok(new TimelineListResponse(result.Select(e => e.Model).ToList(), result.Count == PageSize)));
        }