source: iknow-api/Controllers/UserController.cs@ f7c8acf

Last change on this file since f7c8acf was ea40556, checked in by Stefan-Saveski <stefansaveski19@…>, 8 days ago
  • ready for presentation
  • Property mode set to 100644
File size: 16.5 KB
Line 
1using iknow_api.DTOs;
2using iknow_api.Models;
3using Microsoft.AspNetCore.Authorization;
4using Microsoft.AspNetCore.Mvc;
5using iknow_api.Services;
6
7namespace iknow_api.Controllers
8{
9 [ApiController]
10 [Route("api/[controller]")]
11 public class UserController : Controller
12 {
13 IUserService _userService;
14 public UserController(IUserService userService)
15 {
16 _userService = userService;
17 }
18
19 // "birthInfo": {
20 // "placeOfBirth": "Скопје",
21 // "municipalityOfBirth": "Скопје",
22 // "country": "Република Северна Македонија"
23 // },
24 // "previousEducation": {
25 // "type": "Гимназиско образование",
26 // "profession": "",
27 // "average": "54,857",
28 // "language": "Македонски",
29 // "country": "",
30 // "previousUniversity": "Гимназиско образование",
31 // "previousFaculty": "",
32 // "previousStudyMode": ""
33 // },
34 // "enrollmentInfo": {
35 // "enrollmentYear": "2023",
36 // "status": "Редовен",
37 // "cycle": "Прв циклус",
38 // "program": "Примена на информациски технологии",
39 // "quota": "Кофинансирање-Редовен (2023, 24600)",
40 // "secondaryEducationNumber": "",
41 // "previousEducationCredits": ""
42 // },
43 // "contact": {
44 // "placeOfResidence": "Скопје",
45 // "municipalityOfResidence": "Кисела Вода - Скопје",
46 // "country": "Република Северна Македонија",
47 // "address": "Драчево",
48 // "temporaryAddress": "",
49 // "phone": "",
50 // "mobilePhone": "075295582",
51 // "passportNumber": "",
52 // "passportExpiryDate": "",
53 // "email": "stefansaveski19@gmail.com",
54 // "microsoftEmail": "stefan.saveski@students.finki.ukim.mk"
55 // }
56 //}
57 [Authorize]
58 [HttpGet("getUser")]
59 public async Task<IActionResult> getUser()
60 {
61 //{
62 // "personalInfo": {
63 // "index": "233149/2023",
64 // "embg": "/////////////",
65 // "lastName": "Савески",
66 // "middleName": "Дејан",
67 // "firstName": "Стефан",
68 // "maidenName": "",
69 // "dateOfBirth": "19.08.2004",
70 // "gender": "машки",
71 // "nationality": "Македонец",
72 // "citizenship": "Република Северна Македонија",
73 // "scholarship": "Користи",
74 // "currentPlan": "2023",
75 // "registryNumber": "",
76 // "notes": "Систематски преглед Студира 3 години",
77 // "studyGroup": ""
78 // },
79 var authHeader = Request.Headers["Authorization"].ToString();
80 if (authHeader.StartsWith("Bearer "))
81 {
82 var token = authHeader.Substring("Bearer ".Length).Trim();
83 // token = your JWT
84 var userData = await _userService.GetUserData(token);
85 if (userData == null) return Ok(new { info = "can't get info" });
86
87 // The study programme comes from the student's most recent
88 // enrolment. Within an academic year winter precedes summer,
89 // so order by year first and put winter ahead of summer.
90 var currentEnrolment = userData.Enrolments?
91 .Where(es => es.Semester != null)
92 .OrderByDescending(es => es.Semester!.Year)
93 .ThenByDescending(es => es.Semester!.Type == sType.summer)
94 .FirstOrDefault();
95
96 var personalInfo = new
97 {
98 index = userData.Index ?? "",
99 embg = userData.EMBG ?? "",
100 lastName = userData.Surname ?? "",
101 middleName = "", // Not an attribute of Users in the ER model
102 firstName = userData.Name ?? "",
103 maidenName = "", // Property doesn't exist in User model
104 dateOfBirth = userData.Bday?.ToString("dd.MM.yyyy") ?? "",
105 gender = "", // Not an attribute of Users in the ER model
106 nationality = "", // Not an attribute of Users in the ER model
107 citizenship = "", // Not an attribute of Users in the ER model
108 scholarship = "",
109 currentPlan = userData.EnrollmentYear?.ToString() ?? "",
110 registryNumber = "",
111 notes = "",
112 studyGroup = ""
113 };
114 var birthInfo = new
115 {
116 placeOfBirth = userData.ContactInfo?.City ?? "",
117 municipalityOfBirth = userData.ContactInfo?.Municipality ?? "",
118 country = "" // Not an attribute of Users in the ER model
119 };
120 var previousEducation = new
121 {
122 type = userData.HighSchool?.HighSchoolType.ToString() ?? "",
123 profession = "",
124 average = userData.HighSchool?.GPA.ToString() ?? "",
125 language = "", // Not an attribute of HighSchool in the ER model
126 country = "",
127 previousUniversity = userData.HighSchool?.HighSchoolType.ToString() ?? "",
128 previousFaculty = "", // Property doesn't exist in HighSchool model
129 previousStudyMode = "" // Property doesn't exist in HighSchool model
130 };
131 var enrollmentInfo = new
132 {
133 enrollmentYear = userData.EnrollmentYear?.ToString() ?? "",
134 status = "", // Not an attribute of Users in the ER model
135 cycle = "Прв циклус",
136 program = currentEnrolment?.Major?.Name ?? "",
137 quota = userData.Quota?.ToString() ?? "",
138 secondaryEducationNumber = "",
139 previousEducationCredits = ""
140 };
141 var contact = new
142 {
143 placeOfResidence = userData.ContactInfo?.City ?? "",
144 municipalityOfResidence = userData.ContactInfo?.Municipality ?? "",
145 country = "", // Not an attribute of Users in the ER model
146 address = userData.ContactInfo?.Address ?? "",
147 temporaryAddress = "",
148 phone = "",
149 mobilePhone = userData.ContactInfo?.PhoneNumber ?? "",
150 passportNumber = "",
151 passportExpiryDate = "",
152 email = userData.Email ?? "",
153 microsoftEmail = userData.ContactInfo?.MicrosoftEmail ?? ""
154 };
155 return Ok(new { personalInfo = personalInfo, birthInfo = birthInfo, previousEducation = previousEducation, enrollmentInfo = enrollmentInfo, contact = contact });
156 //return Ok(new { User = userData });
157 }
158 return null;
159
160 }
161 [Authorize]
162 [HttpGet("getSemesters")]
163 public async Task<IActionResult> getSemesters()
164 {
165 var authHeader = Request.Headers["Authorization"].ToString();
166 if (authHeader.StartsWith("Bearer "))
167 {
168 var token = authHeader.Substring("Bearer ".Length).Trim();
169 // token = your JWT
170 var userData = await _userService.GetUserSemesters(token);
171 var results = new List<object>();
172
173 for (int i = 0; i < userData.Count; i++)
174 {
175 var newResult = new
176 {
177 id = userData[i].Id,
178 // sType declares summer first, so compare against the member
179 // rather than the ordinal - == 0 meant summer, not winter.
180 semester = (userData[i].Semester.Type == sType.winter ? "Зимски" : "Летен") + $"({userData[i].Semester.Year}/{userData[i].Semester.Year + 1})",
181 direction = userData[i].Major?.Name ?? "",
182 quota = userData[i].QuotaType.ToString(),
183 note = userData[i].Note ?? "",
184 studentCom = userData[i].StudentComment ?? "",
185 sum = "0,00",
186 paid = "0,00",
187 ukim = "",
188 createdOn = userData[i].CratedAt.ToString("dd.MM.yyyy"),
189 dateChanged = userData[i].LastChange?.ToString("dd.MM.yyyy") ?? "",
190 credits = "0,00",
191 type = "Ред.",
192 doc = "Не",
193 doc1 = "Не",
194 verified = "Не",
195 taxes = "0,00",
196 signatures = "0/5",
197 status = "валиден",
198 completed = userData[i].Verified.HasValue ? "Да" : "Не"
199 };
200 results.Add(newResult);
201 }
202 if (userData == null) return Ok(new { info = "can't get info" });
203 return Ok(new { semesters = results });
204 }
205 return null;
206 }
207
208 [Authorize]
209 [HttpGet("getSubjects")]
210 public async Task<IActionResult> getSubjects()
211 {
212 var authHeader = Request.Headers["Authorization"].ToString();
213 var token = authHeader.Substring("Bearer ".Length).Trim();
214 // token = your JWT
215 var userData = await _userService.GetUserSemesters(token);
216 var results = new List<object>();
217 var random = new Random();
218 for (int i = 0; i < userData.Count; i++)
219 {
220 var newResult = new
221 {
222 id = userData[i].Id,
223 name = (userData[i].Semester.Type == sType.winter ? "Зимски" : "Летен") + $"({userData[i].Semester.Year}/{userData[i].Semester.Year + 1})",
224 status = "валиден",
225 serviceNumber = 1000000 + random.Next(10000, 100000)
226 };
227 results.Add(newResult);
228 }
229
230
231 var subjectsBySemester = new Dictionary<string, List<object>>();
232
233 foreach (var enrollment in userData)
234 {
235 // Create semester key like "winter_2025_2026" or "summer_2025_2026"
236 var semesterType = enrollment.Semester.Type == sType.winter ? "winter" : "summer";
237 var semesterKey = $"{semesterType}_{enrollment.Semester.Year}_{enrollment.Semester.Year + 1}";
238
239 // Initialize list if this semester key doesn't exist
240 if (!subjectsBySemester.ContainsKey(semesterKey))
241 {
242 subjectsBySemester[semesterKey] = new List<object>();
243 }
244
245 // Add subjects from this semester enrollment
246 if (enrollment.SemesterSubjects != null)
247 {
248 foreach (var semesterSubject in enrollment.SemesterSubjects)
249 {
250 var subject = semesterSubject.Subject;
251 if (subject != null)
252 {
253 var subjectData = new
254 {
255 id = subject.Id,
256 code = subject.Code ?? "",
257 hours = "2+4", // You may need to add this to your Subject model
258 kojPat = 1, // You may need to add this field
259 name = subject.Name ?? "",
260 semester = 5, // You may need to calculate or add this field
261 status = "Зад.", // Determine based on PassedSubject or other logic
262 signature = semesterSubject.Signature ? "Да" : "Не",
263 group = "", // You may need to add this field
264 professor = semesterSubject.Professor?.Name + " " + semesterSubject.Professor?.Surname ?? "",
265 };
266 subjectsBySemester[semesterKey].Add(subjectData);
267 }
268 }
269 }
270
271 }
272 var currentSemester = userData.FirstOrDefault(); // Get the most recent/current semester
273 var semesterTypeGlobal = currentSemester.Semester.Type == sType.winter ? "winter" : "summer";
274 var semesterData = new
275 {
276 id = $"{semesterTypeGlobal}_{currentSemester.Semester.Year}_{currentSemester.Semester.Year + 1}",
277 name = (currentSemester.Semester.Type == sType.winter ? "Зимски" : "Летен") + $" ({currentSemester.Semester.Year}/{currentSemester.Semester.Year + 1})",
278 status = "валиден",
279 serviceNumber = (1000000 + random.Next(10000, 100000)).ToString(),
280 ticketNumber = random.Next(100000, 1000000).ToString(),
281 debt = "0,00",
282 financialInfo = new
283 {
284 sum = 1,
285 paid = "0,00",
286 due = "0,00",
287 materialCosts = "Осигурување, Административна такса, Тетратки (испити), зимски семестар: 1000,00",
288 credits = "30,00",
289 totalCredits = "30,00",
290 MKSA = "750,00",
291 electronicRegistration = "100,00",
292 eUKIM = "350,00",
293 bankProvision = "25,00",
294 total = "2226,00"
295 }
296 };
297 if (userData == null) return Ok(new { info = "can't get info" });
298 //return Ok(new { semester = userData });
299 return Ok(new { semesters = results, currentSemestar = semesterData, subjectsBySemester = subjectsBySemester });
300 }
301
302 [Authorize]
303 [HttpGet("getPassedSubjects")]
304 public async Task<IActionResult> getPassedSubjects()
305 {
306 var authHeader = Request.Headers["Authorization"].ToString();
307 if (!authHeader.StartsWith("Bearer "))
308 return Unauthorized();
309
310 var token = authHeader.Substring("Bearer ".Length).Trim();
311 var passedSubjects = await _userService.GetUserPassedSubjects(token);
312
313 if (passedSubjects == null || !passedSubjects.Any())
314 return Ok(new { info = "No passed subjects found", passedSubjects = new List<object>() });
315
316 var results = new List<object>();
317
318 foreach (var passed in passedSubjects)
319 {
320 if (passed.SemesterSubject?.Subject != null)
321 {
322 var result = new
323 {
324 id = passed.Id,
325 subjectId = passed.SemesterSubject.Subject.Id,
326 code = passed.SemesterSubject.Subject.Code ?? "",
327 subject = passed.SemesterSubject.Subject.Name ?? "",
328 credits = passed.SemesterSubject.Subject.AwardedCredits ?? 0,
329 grade = (int)passed.Grade,
330 gradeText = passed.Grade.ToString(),
331 date = passed.DatePassed.ToString("dd.MM.yyyy"),
332 semester = passed.SemesterSubject.EnrolledSemester?.Semester != null
333 ? (passed.SemesterSubject.EnrolledSemester.Semester.Type == sType.winter ? "Зимски" : "Летен") +
334 $" ({passed.SemesterSubject.EnrolledSemester.Semester.Year}/{passed.SemesterSubject.EnrolledSemester.Semester.Year + 1})"
335 : "",
336 professor = passed.SemesterSubject.Professor != null
337 ? $"{passed.SemesterSubject.Professor.Name} {passed.SemesterSubject.Professor.Surname}".Trim()
338 : ""
339 };
340 results.Add(result);
341 }
342 }
343
344 return Ok(new { passedSubjects = results });
345 }
346
347 }
348}
Note: See TracBrowser for help on using the repository browser.