evid3nt / System-For-Monitoring-Class-Attendance

GNU General Public License v3.0
0 stars 0 forks source link

[Web][BE] Pregled prisutstva #26

Closed Karlito16 closed 3 weeks ago

Karlito16 commented 3 weeks ago

Student će imati screen na kojem može vidjeti svoja prisutstva. Vidi na kojim je predavanjima bio - početak predavanja, kraj predavanja, ime predmeta, učionica. Dodatno se možda može prikazat i vrijeme kad se skenirao za ulaz i kad se skenirao za izlaz.

Profesori imaju sličan screen. Imaju popis svih predavanja za sve svoje predmete, poredane kronološki po početku predavanja.

Admin ima isti screen kao i profesor, ali nema ograničenje na vidljive predmete - vidi sve predmete i sva predavanja iz svakog predmeta.

Za svaki screen se može napravit filter, tipa da se prikažu samo podaci iz dvorane B4, ili samo za predmet "Matematička analiza 1", ili samo prisutstva za odabrani vremenski interval, al to stavim u drugi ticket kao manji prioritet.

Karlito16 commented 3 weeks ago

Raw SQL query za prisutstva usera:

SELECT "CourseName",
        "LectureStart",
        "LectureEnd",
        "ClassroomName",
        SUM(CASE
            WHEN (
                    "ScanIn"."ScanTime" BETWEEN "LectureStart" - INTERVAL '15 min' AND "LectureStart" + INTERVAL '15 min'
                ) AND (
                    "ScanOut"."ScanTime" BETWEEN "LectureEnd" - INTERVAL '15 min' AND "LectureEnd" + INTERVAL '15 min'
                ) THEN 1
        ELSE
            0
        END) AS "Attendance"
    FROM "Users"
        JOIN "UsersCourses"
            ON "Users"."Id" = "UsersCourses"."UserId" AND "Users"."Id" = 'e8a2ed0b-9e38-4ffe-b6fc-8465e3a61e7a'
        JOIN "Courses"
            ON "UsersCourses"."CourseId" = "Courses"."Id"
        JOIN "Lectures"
            ON "Courses"."Id" = "Lectures"."CourseId"
        JOIN "Classrooms"
            ON "Lectures"."ClassroomId" = "Classrooms"."Id"
        LEFT OUTER JOIN "Telemetrys" AS "ScanIn"
            ON "Classrooms"."Id" = "ScanIn"."ClassroomId"
                AND "ScanIn"."UserId" = 'e8a2ed0b-9e38-4ffe-b6fc-8465e3a61e7a'
        LEFT OUTER JOIN "Telemetrys" AS "ScanOut"
             ON "Classrooms"."Id" = "ScanOut"."ClassroomId"
                 AND "ScanOut"."UserId" = 'e8a2ed0b-9e38-4ffe-b6fc-8465e3a61e7a'
    GROUP BY "CourseName", "LectureStart", "LectureEnd", "ClassroomName"
    ORDER BY "LectureStart" DESC
    OFFSET 0
    LIMIT 10;

Dakle, query vraća n-torke, svaka n-torka ima 5 zapisa:

Također, u queryju vidite user id, on je ovdje hardcodiran kao primjer, njega će trebat ubacit u query kao parametar (user id od aktivnog usera za kojeg se traži pregled prisutstva).

Također, ubacio sam template za paginaciju, to je ovaj dio sa OFFSET 0 LIMIT 10, ovo također treba parametrizirati ako mislimo radit paginaciju (OFFSET je page, LIMIT je page size).

Preporučam da onda BACKEND generira sljedeć JSONi RESPONSE prema FRONTENDU:

{
    "attendances": [
        {
            "courseName": "Internet Stvari",
            "lectureStart": 2024-05-10T14:00:00+00:00, 
            "lectureEnd": 2024-05-10T16:00:00+00:00,
            "classroom": "b2",
            "attendance": true
        },
        { 
            ...
        }, 
        ...
    ]
}

Uočiti da se Attendance mapira iz int u boolean:

Bacite oko na WhatsApp i primjer izvršavanja queryja. Happy coding!

Karlito16 commented 3 weeks ago

Nice all