Skip to content

Commit 30b77b7

Browse files
update students roll no and update user (#26)
2 parents 1cc718f + 4af7216 commit 30b77b7

18 files changed

Lines changed: 3260 additions & 40 deletions

MarkMe.Core/DTOs/AttendanceDTO.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace MarkMe.Core.DTOs
99
public class AddAttendanceDTO
1010
{
1111
public int CourseId { get; set; }
12-
public List<int> StudentIds { get; set; }
12+
public string StudentsRollNos { get; set; }
1313
}
1414

1515
public class AttendanceDTO

MarkMe.Core/DTOs/AttendanceDataModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ public class AttendanceDataModel
1515
public string UniversityRollNo { get; set; }
1616
public string CollegeRollNo { get; set; }
1717
public DateTime DateMarked { get; set; }
18-
public string Code { get; set; }
19-
public string Title { get; set; }
18+
public string CourseCode { get; set; }
19+
public string CourseTitle { get; set; }
2020
public int Semester { get; set; }
2121
public string MarkedBy { get; set; }
2222
public string Status { get; set; } = "Present";

MarkMe.Core/DTOs/CoursesDTO.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace MarkMe.Core.DTOs
2+
{
3+
public class CoursesDTO
4+
{
5+
public int CourseId { get; set; }
6+
public string CourseName { get; set; }
7+
public string CourseCode { get; set; }
8+
}
9+
}

MarkMe.Core/DTOs/ValidStudents.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace MarkMe.Core.DTOs
8+
{
9+
public class ValidStudents
10+
{
11+
public int StudentId { get; set; }
12+
public string RollNo { get; set; }
13+
}
14+
}

MarkMe.Core/Repositories/AttendanceRepository.cs

Lines changed: 56 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,29 @@ namespace MarkMe.Core.Repositories
66
{
77
public class AttendanceRepository(IDatabase _database) : IAttendanceRepository
88
{
9-
public async Task<IEnumerable<AttendanceDataModel>> AddAsync(AttendanceDTO obj)
9+
public async Task<IEnumerable<AttendanceDataModel>> AddAsync(AttendanceDTO obj, string courseTitle, string userEmail)
1010
{
11+
// In place of Class Representative Student Id we will use when the login of the CR will be created and then we will use it's id.
12+
var description = $"Marked Attendance for {courseTitle}.";
1113
var sql = """
1214
INSERT INTO Attendances (StudentId, CourseId, MarkedBy, DateMarked)
13-
VALUES (@StudentId, @CourseId, 1, GETDATE())
15+
VALUES (@StudentId, @CourseId, (Select UserId from Users where Email =@Email), GETDATE())
16+
17+
IF EXISTS(Select * from Users where Email =@Email AND UserId = 3)
18+
BEGIN
19+
INSERT INTO Activities (Description, Date, ClassRepresentativeStudentId, ClassRepresentativeCourseId)
20+
Values (@description, GETDATE(), 2, @CourseId)
21+
END
1422
""";
15-
var rowsEffected = await _database.ExecuteAsync(sql, parameters: obj.StudentIds.Select(studentId => new { CourseId = obj.CourseId, StudentId = studentId }));
23+
var parameters = obj.StudentIds.Select(studentId => new
24+
{
25+
obj.CourseId,
26+
StudentId = studentId,
27+
Email = userEmail,
28+
description
29+
});
1630

17-
// Query Added
31+
var rowsAffected = await _database.ExecuteAsync(sql, parameters);
1832
var attendanceDTO = await GetByCourseIdAsync(obj.CourseId);
1933
return attendanceDTO!;
2034
}
@@ -50,23 +64,26 @@ public async Task<bool> BulkDeleteAsync(BulkDeleteAttendanceDTO attendanceIds)
5064
public async Task<IEnumerable<AttendanceDataModel>> GetAllAsync()
5165
{
5266
var sql = """
53-
SELECT a.AttendanceId, a.CourseId, a.StudentId, (s.FirstName + ' ' + s.LastName) AS Name, s.UniversityRollNo, s.CollegeRollNo, c.Code, c.Title, c.Semester, a.DateMarked, (u.FirstName + ' ' + u.LastName ) AS MarkedBy
67+
SELECT a.AttendanceId, a.CourseId, a.StudentId, (s.FirstName + ' ' + s.LastName) AS Name, s.UniversityRollNo, s.CollegeRollNo, c.Code AS CourseCode, c.Title AS CourseTitle, c.Semester, a.DateMarked, (u.FirstName + ' ' + u.LastName ) AS MarkedBy
5468
FROM Attendances a
5569
INNER JOIN Students s
5670
ON s.StudentId = a.StudentId
5771
INNER JOIN Users u
5872
ON a.MarkedBy = u.UserId
5973
INNER JOIN Courses c
60-
ON a.CourseId = c.CourseId
74+
ON a.CourseId = c.CourseId
75+
ORDER BY a.DateMarked DESC
6176
""";
6277
var attendance = await _database.QueryAsync<AttendanceDataModel>(sql);
6378
return attendance;
6479
}
6580

81+
82+
6683
public async Task<IEnumerable<AttendanceDataModel?>> GetByCourseIdAsync(int courseId)
6784
{
6885
var sql = """
69-
SELECT a.AttendanceId, a.CourseId, a.StudentId, (s.FirstName + ' ' + s.LastName) AS Name, s.UniversityRollNo, s.CollegeRollNo, c.Code, c.Title, c.Semester, a.DateMarked, (u.FirstName + ' ' + u.LastName ) AS MarkedBy
86+
SELECT a.AttendanceId, a.CourseId, a.StudentId, (s.FirstName + ' ' + s.LastName) AS Name, s.UniversityRollNo, s.CollegeRollNo, c.Code AS CourseCode, c.Title AS CourseTitle, c.Semester, a.DateMarked, (u.FirstName + ' ' + u.LastName ) AS MarkedBy
7087
FROM Attendances a
7188
INNER JOIN Students s
7289
ON s.StudentId = a.StudentId
@@ -75,6 +92,7 @@ INNER JOIN Users u
7592
INNER JOIN Courses c
7693
ON a.CourseId = c.CourseId
7794
WHERE a.CourseId = @CourseId
95+
ORDER BY a.DateMarked DESC
7896
""";
7997
var attendance = await _database.QueryAsync<AttendanceDataModel>(sql, new { CourseId = courseId });
8098
return attendance;
@@ -94,18 +112,47 @@ public async Task<AttendanceDataModel> UpdateAsync(int attendanceId, UpdateAtten
94112
public async Task<AttendanceDataModel?> GetByIdAsync(int attendanceId)
95113
{
96114
var sql = """
97-
SELECT a.AttendanceId, a.CourseId, a.StudentId, (s.FirstName + ' ' + s.LastName) AS Name, s.UniversityRollNo, s.CollegeRollNo, c.Code, c.Title, c.Semester, a.DateMarked, (u.FirstName + ' ' + u.LastName ) AS MarkedBy
115+
SELECT a.AttendanceId, a.CourseId, a.StudentId, (s.FirstName + ' ' + s.LastName) AS Name, s.UniversityRollNo, s.CollegeRollNo, c.Code AS CourseCode, c.Title AS CourseTitle, c.Semester, a.DateMarked, (u.FirstName + ' ' + u.LastName ) AS MarkedBy
98116
FROM Attendances a
99117
INNER JOIN Students s
100118
ON s.StudentId = a.StudentId
101119
INNER JOIN Users u
102120
ON a.MarkedBy = u.UserId
103121
INNER JOIN Courses c
104122
ON a.CourseId = c.CourseId
105-
WHERE a.AttendanceId = @attendanceId
123+
WHERE a.AttendanceId = @attendanceId
124+
ORDER BY a.DateMarked DESC
106125
""";
107126
var attendance = await _database.QuerySingleAsync<AttendanceDataModel>(sql, new { attendanceId });
108127
return attendance;
109128
}
129+
130+
public async Task<IEnumerable<CoursesDTO>> GetCoursesAsync()
131+
{
132+
var sql = """
133+
SELECT c.CourseId, c.Title AS CourseName, c.Code AS CourseCode FROM ClassRepresentatives cr
134+
INNER JOIN Courses c ON cr.CourseId = c.CourseId
135+
WHERE StudentId = 2
136+
""";
137+
return await _database.QueryAsync<CoursesDTO>(sql);
138+
}
139+
140+
public async Task<IEnumerable<CoursesDTO>> GetTutorCoursesAsync(string email)
141+
{
142+
var sql = """
143+
Select CourseId, Code AS CourseCode, Title AS CourseName from Courses Where AssignedTo = (Select UserId from Users where Email =@Email)
144+
""";
145+
return await _database.QueryAsync<CoursesDTO>(sql, new {Email = email });
146+
}
147+
148+
public async Task<IEnumerable<ValidStudents>> GetValidStudents(List<string> rollNos)
149+
{
150+
var sql = """
151+
SELECT StudentId, CollegeRollNo AS RollNo FROM Students
152+
WHERE CollegeRollNo IN @RollNo
153+
""";
154+
var validStudents = await _database.QueryAsync<ValidStudents>(sql, new { RollNo = rollNos } );
155+
return validStudents;
156+
}
110157
}
111158
}

MarkMe.Core/Repositories/Interface/IAttendanceRepository.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ namespace MarkMe.Core.Repositories.Interface
1010
public interface IAttendanceRepository
1111
{
1212
Task<IEnumerable<AttendanceDataModel>> GetAllAsync();
13+
Task<IEnumerable<CoursesDTO>> GetCoursesAsync();
14+
Task<IEnumerable<CoursesDTO>> GetTutorCoursesAsync(string email);
1315
Task<IEnumerable<AttendanceDataModel?>> GetByCourseIdAsync(int courseId);
14-
Task<IEnumerable<AttendanceDataModel>> AddAsync(AttendanceDTO obj);
16+
Task<IEnumerable<ValidStudents>> GetValidStudents(List<string> rollNos);
17+
Task<IEnumerable<AttendanceDataModel>> AddAsync(AttendanceDTO obj, string courseTitle, string userEmail);
1518
Task<AttendanceDataModel> UpdateAsync(int id, UpdateAttendanceDTO obj);
1619
Task<bool> DeleteAsync(int id);
1720
Task<AttendanceDataModel?> GetByIdAsync(int id);

MarkMe.Core/Repositories/StudentRepository.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ public async Task<bool> DeleteStudentAsync(int id)
2323
{
2424
var sql = "UPDATE Students SET IsDeleted = 1 WHERE StudentId = @Id";
2525
await _database.ExecuteAsync(sql, new { Id = id });
26+
27+
var sql1 = """
28+
IF EXISTS(SELECT 1 FROM ClassRepresentatives WHERE StudentId = @Id)
29+
BEGIN
30+
UPDATE ClassRepresentatives SET IsDeleted = 1 WHERE StudentId = @Id
31+
END
32+
""";
33+
var rows = await _database.ExecuteAsync(sql1, new { Id = id });
2634
return true;
2735
}
2836
catch (Exception)

MarkMe.Core/Services/AttendanceService.cs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,39 @@
44

55
namespace MarkMe.Core.Services
66
{
7-
public class AttendanceService(IAttendanceRepository _attendanceRepository) : IAttendanceService
7+
public class AttendanceService(IAttendanceRepository _attendanceRepository, ICourseRepository _courseRepository) : IAttendanceService
88
{
99
public async Task<IEnumerable<AttendanceDataModel>> GetAllAsync()
1010
{
1111
return await _attendanceRepository.GetAllAsync();
1212
}
1313

14+
public async Task<IEnumerable<CoursesDTO?>> GetCRCoursesAsync()
15+
{
16+
return await _attendanceRepository.GetCoursesAsync();
17+
}
18+
19+
public async Task<IEnumerable<CoursesDTO?>> GetTutorCourses(string email)
20+
{
21+
return await _attendanceRepository.GetTutorCoursesAsync(email);
22+
}
23+
1424
public async Task<IEnumerable<AttendanceDataModel?>> GetByCourseId(int courseId)
1525
{
1626
return await _attendanceRepository.GetByCourseIdAsync(courseId);
1727
}
1828

19-
public async Task<IEnumerable<AttendanceDataModel>> AddAsync(AddAttendanceDTO obj)
29+
public async Task<IEnumerable<AttendanceDataModel>> AddAsync(AttendanceDTO obj, string userEmail)
2030
{
21-
var attendance = new AttendanceDTO
31+
var course = await _courseRepository.GetAsync(obj.CourseId);
32+
if (course == null)
2233
{
23-
CourseId = obj.CourseId,
24-
StudentIds = obj.StudentIds,
25-
};
26-
return await _attendanceRepository.AddAsync(attendance);
34+
throw new Exception("Course not found");
35+
}
36+
var attend = await _attendanceRepository.AddAsync(obj, course.Title, userEmail);
37+
return attend;
38+
39+
2740
}
2841

2942
public async Task<AttendanceDataModel> UpdateAsync(int attendanceId, UpdateAttendanceDTO obj)
@@ -44,5 +57,10 @@ public async Task<bool> BulkDeleteAsync(BulkDeleteAttendanceDTO attendanceIds)
4457
{
4558
return await _attendanceRepository.BulkDeleteAsync(attendanceIds);
4659
}
60+
61+
public async Task<IEnumerable<ValidStudents>> GetValidStudentsByRollNumbersAsync(List<string> rollNos)
62+
{
63+
return await _attendanceRepository.GetValidStudents(rollNos);
64+
}
4765
}
4866
}

MarkMe.Core/Services/Interface/IAttendanceService.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ namespace MarkMe.Core.Services.Interface
55
public interface IAttendanceService
66
{
77
Task<IEnumerable<AttendanceDataModel>> GetAllAsync();
8+
Task<IEnumerable<CoursesDTO>> GetCRCoursesAsync();
9+
Task<IEnumerable<CoursesDTO>> GetTutorCourses(string email);
810
Task<IEnumerable<AttendanceDataModel?>> GetByCourseId(int courseId);
9-
Task<IEnumerable<AttendanceDataModel>> AddAsync(AddAttendanceDTO obj);
11+
Task<IEnumerable<AttendanceDataModel>> AddAsync(AttendanceDTO obj,string userEmail);
12+
Task<IEnumerable<ValidStudents>> GetValidStudentsByRollNumbersAsync(List<string> rollNos);
1013
Task<AttendanceDataModel> UpdateAsync(int attendanceId, UpdateAttendanceDTO obj);
1114
Task<bool> DeleteAsync(int attendanceId);
1215
Task<bool> BulkDeleteAsync(BulkDeleteAttendanceDTO attendanceIds);

MarkMe.Database/AppDbContext.cs

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
4949
StudentId = 1,
5050
FirstName = "Mousa",
5151
LastName="Naeem",
52-
CollegeRollNo="537",
53-
RegistrationNo="2021gsr439",
54-
UniversityRollNo="070941",
52+
CollegeRollNo="501",
53+
RegistrationNo="2021gsr407",
54+
UniversityRollNo="070982",
5555
Section="G1",
5656
Session="20212025",
5757
IsDeleted = false
@@ -219,16 +219,24 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
219219
UserId = 1,
220220
FirstName = "Zubair",
221221
LastName = "Jamil",
222-
Email = "xubairjamil@gmail.com",
223-
Password = "123456",
222+
Email = "markmetutor@tohru.org",
223+
Password = "MarkMe@12",
224224
IsDeleted = false
225225
},
226226
new User() {
227227
UserId = 2,
228228
FirstName = "Umair",
229229
LastName = "Jamil",
230-
Email = "umairjamil@gmail.com",
231-
Password = "123456",
230+
Email = "markmeadmin@tohru.org",
231+
Password = "MarkMe@12",
232+
IsDeleted = false
233+
},
234+
new User() {
235+
UserId = 3,
236+
FirstName = "Mousa",
237+
LastName = "Naeem",
238+
Email = "markmecr@tohru.org",
239+
Password = "MarkMe@12",
232240
IsDeleted = false
233241
}
234242
});
@@ -315,6 +323,34 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
315323
IsDeleted = 0
316324
},
317325
new ClassRepresentative
326+
{
327+
StudentId = 2,
328+
CourseId = 1,
329+
NominatedBy = 1,
330+
IsDeleted = 0
331+
},
332+
new ClassRepresentative
333+
{
334+
StudentId = 2,
335+
CourseId = 3,
336+
NominatedBy = 1,
337+
IsDeleted = 0
338+
},
339+
new ClassRepresentative
340+
{
341+
StudentId = 2,
342+
CourseId = 4,
343+
NominatedBy = 1,
344+
IsDeleted = 0
345+
},
346+
new ClassRepresentative
347+
{
348+
StudentId = 2,
349+
CourseId = 5,
350+
NominatedBy = 1,
351+
IsDeleted = 0
352+
},
353+
new ClassRepresentative
318354
{
319355
StudentId = 3,
320356
CourseId = 3,
@@ -536,7 +572,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
536572
new Menu { MenuId = 15, Label = "Courses", Url = "courses", Role = Role.Member },
537573
new Menu { MenuId = 16, Label = "Students", Url = "students", Role = Role.Member },
538574
new Menu { MenuId = 17, Label = "Class Representative", Url = "class-representatives", Role = Role.Member },
539-
});
575+
});
540576
}
541577
}
542578
}

0 commit comments

Comments
 (0)