示例#1
0
        public async Task <ActionResult <JobApplicationMinWithJoRes> > Post([FromBody] JobApplicationWithJoReq request)
        {
            int userId = int.Parse(HttpContext.User.Identity.Name);

            var response = await _jobApplicationService.CreateAsync(request, userId);

            return(StatusCode(201, response));
        }
        /// <summary>
        /// Create JobApplication
        /// </summary>
        /// <param name="model">JobApplication DTO</param>
        /// <param name="userId">User ID</param>
        /// <returns>JobApplication DTO</returns>
        public async Task <JobApplicationMinWithJoRes> CreateAsync(JobApplicationWithJoReq model, int userId)
        {
            JobOffer jobOffer = await _context.JobOffers
                                .Include(jo => jo.Group)
                                .Include(jo => jo.Address)
                                .FirstOrDefaultAsync(jo => jo.JobOfferId == model.JobOfferId);

            // jobOffer not found
            if (jobOffer == null)
            {
                throw new AppLogicException("Nabídka nenalezena");
            }

            Student student = await _context.Students
                              .Include(student => student.User)
                              .Where(student => student.User.UserId == userId)
                              .Include(st => st.JobApplications)
                              .ThenInclude(ja => ja.JobOffer)
                              .FirstOrDefaultAsync();

            // check if job offer start date is in future
            if (jobOffer.Start <= DateTime.UtcNow)
            {
                throw new AppLogicException("Nabídka již započala");
            }

            // check if job offer is not full yet
            int freeSpaces = await _jobOfferService.GetFreeSpacesAsync(jobOffer.JobOfferId);

            if (freeSpaces <= 0)
            {
                throw new AppLogicException("Nejsou žádná volná místa");
            }

            // check if job application for this job offer already exists
            bool applicationExists = await _context.JobApplications.AnyAsync((ja) =>
                                                                             ja.JobOfferId == jobOffer.JobOfferId &&
                                                                             ja.StudentId == student.StudentId);

            if (applicationExists)
            {
                throw new AppLogicException("Přihláška pro tuto nabídku již existuje");
            }

            // check if job application in the same time interval already exists
            foreach (var ja in student.JobApplications)
            {
                if (ja.JobOffer.Start <= jobOffer.End && ja.JobOffer.End >= jobOffer.Start)
                {
                    throw new AppLogicException("Přihláška se překrývá s termínem jiné přihlášky");
                }
            }

            // create job application
            JobApplication jobApplication = new JobApplication
            {
                State    = JobApplicationStates.Pending,
                Student  = student,
                JobOffer = jobOffer
            };

            _context.JobApplications.Add(jobApplication);
            await _context.SaveChangesAsync();

            return(new JobApplicationMinWithJoRes(jobApplication));
        }