Skip to content

Commit 7066c22

Browse files
authored
Merge pull request #261 from makeopensource/117-attendence
117 attendence
2 parents 8c01e96 + 7a27eb7 commit 7066c22

13 files changed

+978
-0
lines changed
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
import { NextFunction, Request, Response } from 'express'
2+
3+
import { GenericResponse, NotFound } from '../../utils/apiResponse.utils'
4+
5+
import AttendanceService from './attendance.service'
6+
import { AttendanceRequest } from 'devu-shared-modules'
7+
import { serialize } from './attendance.serializer'
8+
import AttendanceSubmissionService from './attendanceSubmission.service'
9+
import { serialize as submissionSerialize } from './attendanceSubmission.serializer'
10+
11+
export async function getSessionById(req: Request, res: Response, next: NextFunction) {
12+
try {
13+
const id = parseInt(req.params.id)
14+
if (isNaN(id)) {
15+
return res.status(400).json(new GenericResponse('Invalid ID parameter.'))
16+
}
17+
18+
const session = await AttendanceService.getSessionById(id)
19+
20+
if (!session) {
21+
return res.status(404).json(NotFound)
22+
}
23+
24+
res.status(200).json(serialize(session))
25+
} catch (err) {
26+
next(err)
27+
}
28+
}
29+
30+
31+
export async function getAllSubmissions(req: Request, res: Response, next: NextFunction) {
32+
try {
33+
const id = parseInt(req.params.id)
34+
35+
const session = await AttendanceService.getSessionById(id)
36+
if (!session) {
37+
return res.status(404).json(NotFound)
38+
}
39+
40+
const submissions = await AttendanceSubmissionService.getAllSubmissionsSessionId(session.id)
41+
res.status(200).json(submissions.map(submissionSerialize))
42+
} catch (err) {
43+
next(err)
44+
}
45+
}
46+
47+
export async function getSessionsByCourse(req: Request, res: Response, next: NextFunction) {
48+
try {
49+
const courseId = parseInt(req.params.courseId)
50+
if (isNaN(courseId)) {
51+
return res.status(400).json(new GenericResponse('Invalid course ID parameter.'))
52+
}
53+
54+
const sessions = await AttendanceService.getSessionsByCourse(courseId)
55+
56+
res.status(200).json(sessions.map(serialize))
57+
} catch (err) {
58+
next(err)
59+
}
60+
}
61+
62+
export async function createSession(req: Request, res: Response, next: NextFunction) {
63+
try {
64+
const sessionInput = <AttendanceRequest>{
65+
timeLimitSeconds: req.body.timeLimitSeconds!,
66+
maxTries: req.body.maxTries!,
67+
courseId: parseInt(req.params.courseId),
68+
}
69+
const createdByUserId = req.currentUser!.userId! as number
70+
71+
const newSessionResponse = await AttendanceService.create(sessionInput, createdByUserId)
72+
73+
res.status(201).json(newSessionResponse)
74+
} catch (err) {
75+
next(err)
76+
}
77+
}
78+
79+
export async function submitAttendance(req: Request, res: Response, next: NextFunction) {
80+
try {
81+
const sessionId = parseInt(req.params.sessionId)
82+
const { attendanceCode } = req.body
83+
84+
const studentUserId = req.currentUser!.userId! as number
85+
86+
const submissionResult = await AttendanceService.submitCode(sessionId, studentUserId, attendanceCode)
87+
88+
res.status(200).json(submissionResult)
89+
} catch (err) {
90+
next(err)
91+
}
92+
}
93+
94+
95+
export async function deleteSession(req: Request, res: Response, next: NextFunction) {
96+
try {
97+
const id = parseInt(req.params.id)
98+
const results = await AttendanceService.deleteSession(id)
99+
100+
if (!results.affected || results.affected === 0) {
101+
return res.status(404).json(NotFound)
102+
}
103+
104+
res.status(204).send()
105+
} catch (err) {
106+
next(err)
107+
}
108+
}
109+
110+
export default {
111+
getSessionById,
112+
getSessionsByCourse,
113+
createSession,
114+
submitAttendance,
115+
deleteSession,
116+
getAllSubmissions
117+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import {
2+
Column,
3+
CreateDateColumn,
4+
DeleteDateColumn,
5+
Entity,
6+
Index,
7+
JoinColumn,
8+
ManyToOne,
9+
PrimaryGeneratedColumn,
10+
UpdateDateColumn,
11+
} from 'typeorm'
12+
13+
import CourseModel from '../course/course.model'
14+
import UserModel from '../user/user.model'
15+
16+
@Entity('attendance_sessions')
17+
export default class AttendanceSessionModel {
18+
@PrimaryGeneratedColumn()
19+
id: number
20+
21+
@Column({ name: 'course_id' })
22+
courseId: number
23+
24+
@ManyToOne(() => CourseModel)
25+
@JoinColumn({ name: 'course_id' })
26+
course: CourseModel
27+
28+
@Column({ name: 'created_by' })
29+
createdByUserId: number
30+
31+
@ManyToOne(() => UserModel)
32+
@JoinColumn({ name: 'created_by' })
33+
instructor: UserModel
34+
35+
@Index()
36+
@Column({ name: 'attendance_code', length: 16 })
37+
attendanceCode: string
38+
39+
@Column({ name: 'time_limit_seconds' })
40+
timeLimitSeconds: number
41+
42+
@Column({ name: 'max_tries', default: 1 })
43+
maxTries: number
44+
45+
@Column({ name: 'expires_at' })
46+
expiresAt: Date
47+
48+
@CreateDateColumn({ name: 'created_at' })
49+
createdAt: Date
50+
51+
@UpdateDateColumn({ name: 'updated_at' })
52+
updatedAt: Date
53+
54+
@DeleteDateColumn({ name: 'deleted_at', nullable: true })
55+
deletedAt?: Date
56+
}

0 commit comments

Comments
 (0)