public async Task <ActionResult <UULResponse> > DeleteHabitant(HabitantDTO habitantDTO)
        {
            var         currentUser = HttpContext.User;
            UULResponse response;

            try {
                var userInfo = SecHelper.GetUserInfo(currentUser.Claims);
                var user     = await _context.Users.Where(u => u.Login.Equals(userInfo.Login) && u.ApartmentCode.Equals(userInfo.ApartmentCode)).FirstAsync();

                var existentHabitants = await _context.Habitants.Where(h => h.User.ID == user.ID).Select(h => new HabitantDTO(h)).ToListAsync();

                if (existentHabitants.Count <= 1)
                {
                    return(Error.ProfileLastHabitantDeletion.CreateErrorResponse(_logger, "DeleteHabitant"));
                }
                var habitant = await _context.Habitants.FindAsync(habitantDTO.ID);

                _context.Habitants.Remove(habitant);
                await _context.SaveChangesAsync();

                var habitants = await _context.Habitants.Where(h => h.User.ID == user.ID).Select(h => new HabitantDTO(h)).ToListAsync();

                userInfo.IsActivated = user.IsActivated;
                userInfo.Habitants   = habitants;
                response             = new UULResponse()
                {
                    Success = true, Message = "Habitant was deleted", Data = userInfo
                };
            } catch (Exception e) {
                response = Error.ProfileDeleteHabitantFailed.CreateErrorResponse(_logger, "DeleteHabitant", e);
            }
            return(response);
        }
        public async Task <ActionResult <UULResponse> > AddHabitant(HabitantDTO habitantDTO) // TODO check rules before adding
        {
            var         currentUser = HttpContext.User;
            UULResponse response;

            try {
                var userInfo = SecHelper.GetUserInfo(currentUser.Claims);
                var user     = await _context.Users.Where(u => u.Login.Equals(userInfo.Login) && u.ApartmentCode.Equals(userInfo.ApartmentCode)).SingleOrDefaultAsync();

                if (user == null)
                {
                    return(Error.ProfileNotFound.CreateErrorResponse(_logger, "AddHabitant"));
                }
                var habitant = new Habitant(habitantDTO)
                {
                    User = user
                };
                _context.Habitants.Add(habitant);
                await _context.SaveChangesAsync();

                var habitants = await _context.Habitants.Where(h => h.User.ID == user.ID).Select(h => new HabitantDTO(h)).ToListAsync();

                userInfo.IsActivated = user.IsActivated;
                userInfo.Habitants   = habitants;
                response             = new UULResponse()
                {
                    Success = true, Message = "Habitant was added", Data = userInfo
                };
            } catch (Exception e) {
                response = Error.ProfileAddHabitantFailed.CreateErrorResponse(_logger, "AddHabitant", e);
            }
            return(response);
        }
Exemple #3
0
        public async Task <ActionResult <ICollection <UserWebInfoDTO> > > UpdateUser(UserWebInfoDTO userWebInfoDTO)
        {
            var userInfo = SecHelper.GetUserInfo(HttpContext.User.Claims);

            try {
                var user = await _context.Users.Where(u => u.Login.Equals(userInfo.Login) && u.ApartmentCode.Equals(userInfo.ApartmentCode)).SingleOrDefaultAsync();

                if (!SecHelper.IsAdmin(user))   // TODO move to claims
                {
                    throw new Exception("Not admin");
                }
                var userToUpdate = await _context.Users.FindAsync(userWebInfoDTO.ID);

                if (userToUpdate == null)
                {
                    return(new NotFoundResult());
                }
                userToUpdate.IsActivated = userWebInfoDTO.IsActivated; // currently only this
                _context.Users.Update(userToUpdate);
                await _context.SaveChangesAsync();

                return(new OkObjectResult(userWebInfoDTO));
            } catch {
                return(new ForbidResult());
            }
        }
Exemple #4
0
        public static async Task <User> GetUserFromClaimsOrDefault(UULContext _context, ClaimsPrincipal currentUser)
        {
            var userInfo = SecHelper.GetUserInfo(currentUser.Claims);
            var user     = await _context.Users.Where(u => u.Login.Equals(userInfo.Login) && u.ApartmentCode.Equals(userInfo.ApartmentCode)).SingleOrDefaultAsync();

            return(user);
        }
Exemple #5
0
        public async Task <ActionResult <ICollection <UserWebInfoDTO> > > GetUsers()
        {
            var userInfo = SecHelper.GetUserInfo(HttpContext.User.Claims);

            try {
                var user = await _context.Users.Where(u => u.Login.Equals(userInfo.Login) && u.ApartmentCode.Equals(userInfo.ApartmentCode)).SingleOrDefaultAsync();

                if (!SecHelper.IsAdmin(user))   // TODO move to claims
                {
                    throw new Exception("Not admin");
                }
                var userDTOs = await _context.Users.Where(u => !u.Login.Equals(userInfo.Login) && !u.ApartmentCode.Equals(userInfo.ApartmentCode)).OrderBy(u => u.ApartmentCode).Select(u => new UserWebInfoDTO(u)).ToListAsync();

                return(new OkObjectResult(userDTOs));
            } catch {
                return(new ForbidResult());
            }
        }
        public async Task <ActionResult <UULResponse> > EditHabitant(HabitantDTO habitantDTO)
        {
            var         currentUser = HttpContext.User;
            UULResponse response;

            try {
                var userInfo = SecHelper.GetUserInfo(currentUser.Claims);
                var user     = await _context.Users.Where(u => u.Login.Equals(userInfo.Login) && u.ApartmentCode.Equals(userInfo.ApartmentCode)).SingleOrDefaultAsync();

                if (user == null)
                {
                    return(Error.ProfileNotFound.CreateErrorResponse(_logger, "EditHabitant"));
                }
                var habitant = await _context.Habitants.FindAsync(habitantDTO.ID);

                if (habitant == null)
                {
                    return(Error.ProfileHabitantLookupFailed.CreateErrorResponse(_logger, "EditHabitant"));
                }
                habitant.Name      = habitantDTO.Name;
                habitant.AvatarSrc = habitantDTO.AvatarSrc;
                _context.Habitants.Update(habitant);
                await _context.SaveChangesAsync();

                var habitants = await _context.Habitants.Where(h => h.User.ID == user.ID).Select(h => new HabitantDTO(h)).ToListAsync();

                userInfo.IsActivated = user.IsActivated;
                userInfo.Habitants   = habitants;
                response             = new UULResponse()
                {
                    Success = true, Message = "Habitant was updated", Data = userInfo
                };
            } catch (Exception e) {
                response = Error.ProfileEditHabitantFailed.CreateErrorResponse(_logger, "EditHabitant", e);
            }
            return(response);
        }
Exemple #7
0
        public async Task <ActionResult <UULResponse> > GetMyUserInfo()
        {
            var         currentUser = HttpContext.User;
            UULResponse response;

            try {
                var userInfo = SecHelper.GetUserInfo(currentUser.Claims);
                var user     = await UserDao.GetUserByDetailsOrThrow(_context, userInfo.Login, userInfo.ApartmentCode);

                var habitants = await _context.Habitants.Where(h => h.User.ID == user.ID).Select(h => new HabitantDTO(h)).ToListAsync();

                userInfo.IsActivated = user.IsActivated;
                userInfo.Habitants   = habitants;
                response             = new UULResponse()
                {
                    Success = true, Message = "", Data = userInfo
                };
            } catch (UserProfileNotFoundException e) {
                response = Error.ProfileNotFound.CreateErrorResponse(_logger, "ProfileInfo", e);
            } catch (Exception e) {
                response = Error.ProfileGetInfoFailed.CreateErrorResponse(_logger, "ProfileInfo", e);
            }
            return(response);
        }
Exemple #8
0
        private async Task <ActionResult <UULResponse> > BookTimeSlotByGym(BookTimeSlotDTO dto, int gymId)
        {
            UULResponse response; // TODO refactor to use exceptions
            var         currentUser = HttpContext.User;

            try {
                var userInfo = SecHelper.GetUserInfo(currentUser.Claims);
                var user     = await _context.Users.Where(u => u.Login.Equals(userInfo.Login) && u.ApartmentCode.Equals(userInfo.ApartmentCode)).SingleOrDefaultAsync();

                if (user is null)
                {
                    return(Error.ProfileNotFound.CreateErrorResponse(_logger, "BookTimeSlotsByGym"));
                }
                if (!user.IsActivated)
                {
                    return(Error.ProfileNotActivated.CreateErrorResponse(_logger, "BookTimesSlotsByGym"));
                }
                var timeSlot = await _context.TimeSlots
                               .Include(t => t.OccupiedBy)
                               .Include(t => t.Gym)
                               .FirstOrDefaultAsync(t => t.ID == dto.TimeslotId);

                if (timeSlot is null)
                {
                    return(Error.TimeSlotNotFound.CreateErrorResponse(_logger, "BookTimesSlotsByGym"));
                }
                var rulesDto = await RulesDao.GetCurrentRulesDTOOrDefault(_context);

                if (rulesDto is null)
                {
                    return(Error.RulesNotFound.CreateErrorResponse(_logger, "BookTimesSlotsByGym"));
                }
                DateOperations.GetTodayTimeSlotsBoundsUtc(rulesDto.TimeSlotSpan, out DateTime todayStart, out DateTime todayEnd);

                if (!timeSlot.Gym.IsOpen)
                {
                    return(Error.GymClosed.CreateErrorResponse(_logger, "BookTimesSlotsByGym"));
                }
                if (!(timeSlot.Start.IsWithinBounds(todayStart, todayEnd)))
                {
                    return(Error.TimeSlotNotToday.CreateErrorResponse(_logger, "BookTimesSlotsByGym"));
                }
                if (timeSlot.OccupiedBy.Count >= rulesDto.PersonsPerTimeSlot)
                {
                    return(Error.TimeSlotFull.CreateErrorResponse(_logger, "BookTimesSlotsByGym"));
                }
                if (await AlreadyBookedInBoundsUTC(dto.HabitantId, todayStart, todayEnd))
                {
                    return(Error.TimeSlotOverbooking.CreateErrorResponse(_logger, "BookTimesSlotsByGym"));
                }

                Habitant habitant = await _context.Habitants.FindAsync(dto.HabitantId);

                if (habitant is null)
                {
                    return(Error.ProfileHabitantLookupFailed.CreateErrorResponse(_logger, "BookTimesSlotsByGym"));
                }
                timeSlot.OccupiedBy.Add(habitant);
                habitant.LastGymVisit = timeSlot.Start;
                _context.TimeSlots.Update(timeSlot);
                _context.Habitants.Update(habitant);
                var success = await _context.SaveChangesAsync() != 0;

                var slots = gymId == -1 ? await TimeSlotsDao.GetTimeSlotsByUtcBounds(_context, todayStart, todayEnd) : await TimeSlotsDao.GetTimeSlotsByUtcBounds(_context, gymId, todayStart, todayEnd);

                var data = new ScheduleDTO()
                {
                    Date = todayStart.Year + "/" + todayStart.Month + "/" + todayStart.Day, GymId = gymId == -1 ? null : gymId, TimeSlots = slots
                };
                response = new UULResponse()
                {
                    Success = success, Message = "Booked", Data = data
                };
            } catch (Exception e) {
                response = Error.TimeSlotsBookingFailed.CreateErrorResponse(_logger, "BookTimesSlotsByGym", e);
            }
            return(response);
        }