public async Task <MaintenanceRequest> OpenMaintenanceRequest(int userId,
                                                                      DataModel.MaintenanceRequestModel data)
        {
            if (data == null)
            {
                return(null);
            }

            var user = await _context.Users
                       .Where(u => u.UserId == userId)
                       .FirstOrDefaultAsync();

            MaintenanceRequest maintenanceRequest = new MaintenanceRequest
            {
                OpeningUserId          = user.UserId,
                TimeOpened             = DateTime.Now,
                MaintenanceRequestType = data.MaintenanceRequestType,
                OpenNotes  = data.OpenNotes,
                UnitNumber = data.UnitNumber,
            };

            _context.MaintenanceRequests.Add(maintenanceRequest);
            await _context.SaveChangesAsync();

            return(maintenanceRequest);
        }
        public async Task <IActionResult> UpdateMaintenanceRequest(DataModel.MaintenanceRequestModel model)
        {
            var userId = this.UserIdFromApiKey();

            if (this.UserInRole(Role.Tenant))
            {
                var tenantId = await _tenantRepository.TenantIdFromUserId(userId);

                if (tenantId == null)
                {
                    var err = new DTO.ErrorBuilder()
                              .Message("Not a tenant.")
                              .Code(400)
                              .Build();
                    return(err);
                }

                var unit = await _tenantRepository.UnitFromTenantId((int)tenantId);

                if (unit == null)
                {
                    var err = new DTO.ErrorBuilder()
                              .Message("Tenant not assigned a unit.")
                              .Code(400)
                              .Build();
                    return(err);
                }

                // Set the unit number to the tenant's unit number so they cannot schedule maintenance for other
                // tenants.
                model.UnitNumber = unit.UnitNumber;

                var existingRequest = await _maintenanceRepository.GetMaintenanceRequest(model.MaintenanceRequestId);

                if (existingRequest != null)
                {
                    if (existingRequest.UnitNumber == unit.UnitNumber)
                    {
                        existingRequest = await _maintenanceRepository.UpdateMaintenanceRequest(existingRequest, model, userId);

                        var flatRequest = await DTO.MaintenanceRequestDTO.Build(existingRequest, _userRepository);

                        return(new ObjectResult(flatRequest));
                    }
                    else
                    {
                        var err = new DTO.ErrorBuilder()
                                  .Message("Maintenance request does not exist for provided unit number.")
                                  .Code(404)
                                  .Build();
                        return(err);
                    }
                }
                else
                {
                    var newRequest = await _maintenanceRepository.OpenMaintenanceRequest(userId, model);

                    var flatRequest = await DTO.MaintenanceRequestDTO.Build(newRequest, _userRepository);

                    return(new ObjectResult(flatRequest));
                }
            }
            else if (this.UserInRole(Role.Manager) || this.UserInRole(Role.Admin))
            {
                var existingRequest = await _maintenanceRepository.GetMaintenanceRequest(model.MaintenanceRequestId);

                if (existingRequest != null)
                {
                    existingRequest = await _maintenanceRepository.UpdateMaintenanceRequest(existingRequest, model, userId);

                    var flatRequest = await DTO.MaintenanceRequestDTO.Build(existingRequest, _userRepository);

                    return(new ObjectResult(flatRequest));
                }
                else
                {
                    var newRequest = await _maintenanceRepository.OpenMaintenanceRequest(userId, model);

                    var flatRequest = await DTO.MaintenanceRequestDTO.Build(newRequest, _userRepository);

                    return(new ObjectResult(flatRequest));
                }
            }
            else
            {
                var err = new DTO.ErrorBuilder()
                          .Message("You are not authorized to make maintenance requests.")
                          .Code(403)
                          .Build();
                return(err);
            }
        }