-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
130 lines (113 loc) · 2.92 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
const reader = require('rpi-mfrc522-nodejs');
const { request, gql } = require('graphql-request');
const READER_PINS = [[2, 22]]; // GPIO pins
let queueId = null;
const courseId = '636fe6844498e9db2cf95605';
const resolveStudentId = async function (cardId) {
try {
const res = await request({
url: process.env.API_URL,
document: gql`
query studentByCardId($cardId: CardId!) {
studentByCardId(cardId: $cardId) {
id
}
}
`,
variables: { cardId },
});
if (!res?.studentByCardId?.id) throw 'Could not resolve student ID';
return res.studentByCardId.id;
} catch (e) {
console.error(e);
return null;
}
};
const createAttendanceQueue = async function () {
try {
const foundQueue = await request({
url: process.env.API_URL,
document: gql`
query attendanceQueueByCourseId($courseId: ObjectID!) {
attendanceQueueByCourseId(courseId: $courseId) {
id
}
}
`,
variables: { courseId },
});
if (!!foundQueue?.attendanceQueueByCourseId?.id) return (queueId = foundQueue.attendanceQueueByCourseId.id);
const res = await request({
url: process.env.API_URL,
document: gql`
mutation attendanceQueueCreate($attendanceQueue: AttendanceQueueInput!) {
attendanceQueueCreate(attendanceQueue: $attendanceQueue) {
id
}
}
`,
variables: {
attendanceQueue: {
courseId,
},
},
});
if (!res?.attendanceQueueCreate?.id) throw 'Could not create attendance queue';
queueId = res.attendanceQueueCreate.id;
return res.attendanceQueueCreate.id;
} catch (e) {
console.error(e);
return null;
}
};
const addStudentToQueue = async function (studentId) {
if (!queueId) await createAttendanceQueue();
console.log('queueId', queueId);
const res = await request({
url: process.env.API_URL,
document: gql`
mutation attendanceQueueAddStudent($queueId: ObjectID!, $studentId: Int!) {
attendanceQueueAddStudent(queueId: $queueId, studentId: $studentId) {
id
}
}
`,
variables: {
queueId,
studentId,
},
});
console.log('addStudentToQueue', res);
return res;
};
let currently_reading = false;
const handleRead = async function (data) {
const [card_id] = data ?? [];
if (!card_id) return; // ignore empty reads
// throttle taps to prevent spam
if (currently_reading) return;
currently_reading = true;
try {
console.log('received input', card_id);
console.log(process.env.API_URL);
const studentId = await resolveStudentId(card_id);
console.log('studentId', studentId);
// ignore unknown NFC cards that don't map to students
if (!studentId) {
//TODO: display error in terminal
currently_reading = false;
return;
}
// add student to queue
await addStudentToQueue(studentId);
} catch (e) {
throw e;
} finally {
currently_reading = false;
}
};
// listen to new card reads
reader.onRfidChange(READER_PINS, handleRead);
process.on('unhandledRejection', (err) => {
console.error(err);
});