using _2021_backend.Data; using _2021_backend.Models; using _2021_backend.Utils; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using System.Security.Cryptography; namespace _2021_backend.Controllers { [Route("api")] public class SubmissionController : Controller { public BackendContext context; public SubmissionController(BackendContext context) { this.context = context; } [HttpPost("checkCaptcha")] public async Task CheckCaptcha([FromQuery] string stuid, [FromQuery] string captcha) { var stu = context.Students.FirstOrDefault(e => e.Stuid == stuid); if (stu == null) return Ok(ApiResponse.Error("INVALID_STUID")); else if (captcha == stu.LastCaptcha) { if (DateTime.Now - stu.LastCaptchaTime > TimeSpan.FromMinutes(15)) return Ok(ApiResponse.Error("CAPTCHA_TIMEOUT")); return Ok(ApiResponse.Success("success")); } else return Ok(ApiResponse.Error("INVALID_CAPTCHA")); } [HttpPost("getCaptcha")] public async Task GetCaptcha([FromQuery] string stuid) { var stu = context.Students.FirstOrDefault(e => e.Stuid == stuid); if (stu == null) return Ok(ApiResponse.Error("INVALID_STUID")); else if (DateTime.Now - stu.LastCaptchaTime < TimeSpan.FromMinutes(1)) return Ok(ApiResponse.Error($"ALREADY_SENT,{DateTime.Now.ToString("f")},{stu.LastCaptchaTime.ToString("f")}")); var result = await TencentSMS.Send(context, SMSType.Captcha, stu, "smsbot"); if (!result) return Ok(ApiResponse.Error("SEND_ERROR")); return Ok(ApiResponse.Success("success")); } [HttpPost("submit")] public async Task PostSubmit([FromForm] string dto) { var aDto = JsonSerializer.Deserialize(dto); string ip = Request.Headers["X-Real-IP"].FirstOrDefault(); if (aDto.Iscomplete() == false) return StatusCode(400, ApiResponse.Error("TICKET_INFO_INCOMPLETE")); if (aDto.Check() == false) return StatusCode(400, ApiResponse.Error("TICKET_NOT_LEGEAL")); Submission sub = new Submission(aDto, ip); foreach (var tm in context.Sessions) { if(aDto.Timelist != null)if (aDto.Timelist.Any(it => it.Day.Day == tm.Day.Day && it.BeginTime.TimeOfDay == tm.BeginTime.TimeOfDay)) { sub.Timelist.Add(tm.Id); } } var q = context.Students.Where(stu => (stu.Name == aDto.Name || stu.Stuid == aDto.Stuid)); Student stu; if (q.Count() == 0) { stu = Student.create(sub); stu.Status = status.刚报名; context.Students.Add(stu); context.SaveChanges(); sub.Host = stu.Id; context.Submissions.Add(sub); context.SaveChanges(); stu.Submissions.Add(sub.Id); context.SaveChanges(); } else { stu = q.FirstOrDefault(); sub.Host = stu.Id; context.Submissions.Add(sub); context.SaveChanges(); stu.Update(sub); context.SaveChanges(); } await TencentSMS.Send(context, SMSType.Signed, stu, _2021_backend.Models.User.Bot.stuID); return Ok(ApiResponse.Success("success")); } [HttpGet("sessionlist")] public IActionResult GetSessions() { var query = context.Sessions.OrderBy(r => r.Day).ThenBy(r => r.BeginTime).ThenBy(r => r.Place).Where(e => e.Capacity > e.Students.Count).Select(r => new SessionDto { BeginTime = r.BeginTime, Day = r.Day, }); return Ok(ApiResponse.Success(query.ToList().FindAll(it => it.Day.Add(it.BeginTime.TimeOfDay).CompareTo(DateTime.Now) > 0).Distinct(new SessionDtoComparer()).ToList())); //return Ok(ApiResponse.Success("报名结束了")); } [HttpGet("fileinfo")] public async Task GetInfo([FromQuery] string? stuid) { if (stuid == null || (!context.Students.Any(e => e.Stuid == stuid))) { return Ok(ApiResponse.Error("INVALID_STUID")); } else { var student = context.Students.FirstOrDefault(e => e.Stuid == stuid.ToString()); if (student.Uploads == null) { student.Uploads = new List { }; context.SaveChangesAsync(); return Ok(ApiResponse.Error("NO_FILES")); } var fileIdx = student.Uploads.Last(); var file = context.FileDesc.Find(fileIdx); var oldNameSplit = file.Name.Split("."); var oldName = ""; var oldNameExtension = oldNameSplit.LastOrDefault(); for (int i = 0; i < oldNameSplit.Count() - 1; i++) { oldName += oldNameSplit[i]; } file.Path = "***.***.****"; if (oldName.Count() >= 2) { file.Name = $"{oldName[0]}***{oldName}.{oldNameExtension}"; } else { file.Name = $"**.{oldNameExtension}"; } return Ok(ApiResponse.Success(file)); } } [HttpPost("upload")] public async Task UploadFile([FromQuery] string? stuid,[FromQuery]string filename, [FromQuery] string filepath, [FromQuery] float fileSizeInKB) { var filedesc = new FileDesc { Name = filename, Path = $"jphd-3dprint-2022.oss-cn-hangzhou.aliyuncs.com/uploads/{stuid}/{filename}", Size = Convert.ToInt32(fileSizeInKB), UploadTime = DateTime.Now }; if (!context.Students.Any(e => e.Stuid == stuid)) return Ok(ApiResponse.Error("INVALID_STUID")); else { var s = context.Students.First(e => e.Stuid == stuid); filedesc.OwnerId = s.Id; if (s.Uploads == null) s.Uploads = new List { }; context.FileDesc.Add(filedesc); await context.SaveChangesAsync(); s.Uploads.Add(filedesc.Id); s.Status = status.已提交; await context.SaveChangesAsync(); return Ok(ApiResponse.Success("success")); } } [HttpPost("postsession")] public async Task Post([FromQuery] string stuid, [FromQuery] string selection) { Student stu = context.Students.FirstOrDefault(r => r.Stuid == stuid); if (stu == null) { return StatusCode(400, ApiResponse.Error("INVALID_STUDENT_int")); } SessionDto time; try { time = JsonSerializer.Deserialize(selection); } catch (Exception ex) { Console.WriteLine(ex); return StatusCode(400, ApiResponse.Error("MALFORMED_DATA")); }; //get the selected session ints; int targetSession = 0; var sessions = context.Sessions.ToList(); var s = sessions.Find((Session s) => { return time.Day == s.Day && time.BeginTime == s.BeginTime; }); var overwritten = false; if (s.Students.Count >= s.Capacity) return Ok(ApiResponse.Error("OUT_OF_CAPACITY")); if (context.Sessions.Find(stu.InterviewTime) != null) { var olds = context.Sessions.Find(stu.InterviewTime); olds.Students.Remove(stu.Id); context.SaveChanges(); overwritten = true; } targetSession = s.Id; s.Students.Add(stu.Id); stu.Timelist = new List { targetSession }; stu.Status = status.已选时间; stu.InterviewTime = s.Id; await TencentSMS.Send(context, SMSType.TimeSet, stu, "smsbot"); context.SaveChanges(); if (overwritten) return Ok(ApiResponse.Success("overwritten")); return Ok(ApiResponse.Success("success")); //return Ok(ApiResponse.Success("报名结束了")); } } }