public IHttpActionResult GetCompetitions(int userId)
        {
            using (var db = new AndroidCaseCompetitionEntities())
            {
                var user = db.Users.Find(userId);
                if (user == null)
                {
                    return(NotFound());
                }

                var competitions = db.Competitions
                                   .Where(x => user.SubjectId == null || x.SubjectId == user.SubjectId)
                                   .Include(x => x.Subject)
                                   .Select(x => new
                {
                    x.Id,
                    x.Name,
                    x.SubjectId,
                    SubjectName = x.Subject.Name,
                    x.DateTimeStart,
                    x.DateTimeEnd,
                    x.UploadFileName
                })
                                   .ToArray();

                return(Ok(competitions));
            }
        }
        public IHttpActionResult PostUser(PostUser postUser)
        {
            using (var db = new AndroidCaseCompetitionEntities())
            {
                var user = db.Users
                           .Include(x => x.Subject)
                           .Include(x => x.UserType)
                           .FirstOrDefault(x => x.Name == postUser.Name && x.Password == postUser.Password);

                if (user == null)
                {
                    return(NotFound());
                }

                return(Ok(new
                {
                    user.Id,
                    user.Name,
                    user.Password,
                    user.UserTypeId,
                    UserTypeName = user.UserType.Name,
                    user.SubjectId
                }));
            }
        }
        public IHttpActionResult GetCompetitorSubmissionDownload(int competitorSubmissionId)
        {
            using (var db = new AndroidCaseCompetitionEntities())
            {
                var submission = db.CompetitorSubmissions.Find(competitorSubmissionId);
                if (submission == null)
                {
                    return(NotFound());
                }

                var bytes    = File.ReadAllBytes(Path.Combine(AppData, submission.UploadFileName));
                var response = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new ByteArrayContent(bytes)
                };

                response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = submission.UploadFileName
                };

                response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

                return(ResponseMessage(response));
            }
        }
 public IHttpActionResult DeleteCompetition(int id)
 {
     using (var db = new AndroidCaseCompetitionEntities())
     {
         db.Database.ExecuteSqlCommand($"delete from Competition where Id = {id}");
         return(Ok());
     }
 }
        public IHttpActionResult GetSubjects()
        {
            using (var db = new AndroidCaseCompetitionEntities())
            {
                var subjects = db.Subjects.Select(x => new
                {
                    x.Id,
                    x.Name
                }).ToArray();

                return(Ok(subjects));
            }
        }
        public IHttpActionResult PostCompetitorSubmission(PostCompetitorSubmission postSubmission)
        {
            using (var db = new AndroidCaseCompetitionEntities())
            {
                var submission = new CompetitorSubmission
                {
                    CompetitionId  = postSubmission.CompetitionId,
                    CompetitorId   = postSubmission.CompetitorId,
                    SubmitDateTime = DateTime.Now,
                    UploadFileName = $"{Guid.NewGuid()}.{postSubmission.UploadFileExtension}"
                };

                var bytes = Convert.FromBase64String(postSubmission.UploadFile);
                File.WriteAllBytes(Path.Combine(AppData, submission.UploadFileName), bytes);

                db.CompetitorSubmissions.Add(submission);
                db.SaveChanges();
                return(Ok());
            }
        }
        public IHttpActionResult PutCompetition(int id, PostCompetition postCompetition)
        {
            using (var db = new AndroidCaseCompetitionEntities())
            {
                var competition = db.Competitions.Find(id);
                competition.Name          = postCompetition.Name;
                competition.DateTimeStart = postCompetition.DateTimeStart;
                competition.DateTimeEnd   = postCompetition.DateTimeEnd;
                competition.SubjectId     = postCompetition.SubjectId;

                File.Delete(Path.Combine(AppData, competition.UploadFileName));
                competition.UploadFileName = $"{Guid.NewGuid()}.{postCompetition.UploadFileExtension}";
                var bytes = Convert.FromBase64String(postCompetition.UploadFile);
                File.WriteAllBytes(Path.Combine(AppData, competition.UploadFileName), bytes);

                db.Competitions.Attach(competition);
                db.SaveChanges();
                return(Ok());
            }
        }
        public IHttpActionResult PostCompetition(PostCompetition postCompetition)
        {
            using (var db = new AndroidCaseCompetitionEntities())
            {
                var competition = new Competition
                {
                    Name           = postCompetition.Name,
                    DateTimeStart  = postCompetition.DateTimeStart,
                    DateTimeEnd    = postCompetition.DateTimeEnd,
                    UploadFileName = $"{Guid.NewGuid()}.{postCompetition.UploadFileExtension}",
                    SubjectId      = postCompetition.SubjectId
                };

                var bytes = Convert.FromBase64String(postCompetition.UploadFile);
                File.WriteAllBytes(Path.Combine(AppData, competition.UploadFileName), bytes);

                db.Competitions.Add(competition);
                db.SaveChanges();
                return(Ok());
            }
        }
        public IHttpActionResult GetCompetitorSubmissions(int competitionId)
        {
            using (var db = new AndroidCaseCompetitionEntities())
            {
                var submissions = db.CompetitorSubmissions
                                  .Where(x => x.CompetitionId == competitionId)
                                  .Include(x => x.User)
                                  .Select(x => new
                {
                    x.Id,
                    x.CompetitionId,
                    x.CompetitorId,
                    CompetitorName = x.User.Name,
                    x.SubmitDateTime,
                    x.UploadFileName
                })
                                  .ToArray();

                return(Ok(submissions));
            }
        }