Commit message (Collapse) | Author | Age | Files | Lines | |
---|---|---|---|---|---|
* | deploy.sh: Update sed expression | Runxi Yu | 2024-10-10 | 1 | -1/+1 |
| | |||||
* | student.js: Use wss://cca.runxiyu.org/wsv0.1.9 | Runxi Yu | 2024-10-10 | 1 | -1/+1 |
| | |||||
* | README.md: Remove "(WIP)" | Runxi Yu | 2024-10-10 | 1 | -1/+1 |
| | |||||
* | Revert "auth.go: Set SameSite=Strict" | Runxi Yu | 2024-10-10 | 1 | -1/+1 |
| | | | | | | | This reverts commit a6a5db47eb7a2040cd70dbd39e16d7de3fd9bd9f. Users are unable to log in with it. I'll look for another way to prevent CSRF. | ||||
* | *.html: s/IA Docs/IA/g | Runxi Yu | 2024-10-10 | 4 | -4/+4 |
| | |||||
* | auth.go: Set SameSite=Strict | Runxi Yu | 2024-10-10 | 1 | -1/+1 |
| | | | | | We use GET requests for some administration endpoints (most importantly, the ones managing the global state). | ||||
* | Implement course selection started/stopped states | Runxi Yu | 2024-10-10 | 10 | -21/+135 |
| | | | | Implements: https://todo.sr.ht/~runxiyu/cca/13 | ||||
* | staff.html: Add search functionality | Runxi Yu | 2024-10-10 | 1 | -0/+11 |
| | |||||
* | state.go: Cancel connections when setting state 0 | Runxi Yu | 2024-10-10 | 1 | -8/+16 |
| | |||||
* | newcourses.go: setupCourses must be run after commit | Runxi Yu | 2024-10-10 | 1 | -10/+11 |
| | | | | Otherwise it reads an old snapshot of the database... | ||||
* | wsc.go: Check newCtx.Done() when entering other event cases | Runxi Yu | 2024-10-10 | 1 | -12/+25 |
| | | | | | | | | | | We select the context done channel when entering other cases too (see below) because we need to make sure the context cancel works even if both the cancel signal and another event arrive while processing a select cycle. It's a bit verbose and looks repetitive but is technically more correct than code without it. | ||||
* | wsh.go: Remove old TODO about limiting connections per user | Runxi Yu | 2024-10-10 | 1 | -7/+0 |
| | | | | This has been implemented quite a while ago. | ||||
* | wsh.go: Remove TODO about checking pgErr | Runxi Yu | 2024-10-10 | 1 | -1/+0 |
| | | | | | | | If the UUIDs actually collide, we're doomed anyway. Okay... this isn't the best way to write software that must be ultra-reliable, but this doesn't need to be ultra-reliable. | ||||
* | export.go: Remove unnecessary TODO | Runxi Yu | 2024-10-10 | 1 | -1/+1 |
| | |||||
* | auth.go: Remove access token expiration fields and related TODO | Runxi Yu | 2024-10-10 | 1 | -14/+5 |
| | | | | | We're only using the token immediately after it is issued, so it's a bit unnecessary. | ||||
* | auth.go: Remove TODO about implementing nonce checks | Runxi Yu | 2024-10-10 | 1 | -7/+0 |
| | | | | It's the OAuth provider that's responsible for checking this nonce. | ||||
* | auth.go: Remove TODO about using ON CONFLICT | Runxi Yu | 2024-10-10 | 1 | -7/+0 |
| | | | | | | I think using the pgErr method actually makes the logic easier to follow especially since I'm not updating the "confirmed" field when UPDATEing but it's being initialized to false during INSERT. | ||||
* | Replace tcourse.sql with an example importable CSV | Runxi Yu | 2024-10-10 | 3 | -14/+15 |
| | |||||
* | Validate course group and course type when importing from CSV | Runxi Yu | 2024-10-10 | 1 | -0/+24 |
| | |||||
* | Allow staff to upload a CSV containing courses | Runxi Yu | 2024-10-10 | 6 | -39/+432 |
| | | | | Implements: https://todo.sr.ht/~runxiyu/cca/2 | ||||
* | export.go: Remove unnecessary fields from user query | Runxi Yu | 2024-10-10 | 1 | -3/+3 |
| | |||||
* | style.css: Fix file selector buttons | Runxi Yu | 2024-10-10 | 1 | -1/+7 |
| | |||||
* | {wsp,wsx}.go: Move comment about RFC1459-like message format | Runxi Yu | 2024-10-09 | 2 | -23/+23 |
| | |||||
* | auth.go, schema.sql: Add "confirmed" field to users | Runxi Yu | 2024-10-09 | 2 | -2/+3 |
| | |||||
* | index.go, student_disabled.html: Repsect state = 0 | Runxi Yu | 2024-10-09 | 3 | -17/+98 |
| | | | | References: https://todo.sr.ht/~runxiyu/cca/13 | ||||
* | *.go, schema.sql, staff.html: Implement state setting | Runxi Yu | 2024-10-09 | 7 | -3/+187 |
| | | | | References: https://todo.sr.ht/~runxiyu/cca/13 | ||||
* | *.go, tmpl/staff.html: Allow staff to export choices | Runxi Yu | 2024-10-09 | 6 | -2/+250 |
| | | | | Implements: https://todo.sr.ht/~runxiyu/cca/3 | ||||
* | staff.html: Update from students.html and only display link to /export | Runxi Yu | 2024-10-09 | 1 | -112/+5 |
| | |||||
* | docs/fields.txt: Remove | Runxi Yu | 2024-10-09 | 1 | -27/+0 |
| | |||||
* | {courses,wsc}.go: Atomic 64-bit alignment | Runxi Yu | 2024-10-09 | 2 | -4/+7 |
| | |||||
* | wsc.go: Use sync.Map for cancelPool to reduce lock contention | Runxi Yu | 2024-10-09 | 1 | -21/+10 |
| | |||||
* | student.html: Use separate columns for Selected and Max | Runxi Yu | 2024-10-09 | 1 | -2/+9 |
| | |||||
* | eslint.sh: Call eslint directly rather than through npx | Runxi Yu | 2024-10-09 | 1 | -1/+1 |
| | |||||
* | *.go: Update comments | Runxi Yu | 2024-10-09 | 8 | -30/+17 |
| | |||||
* | bench.go: Update number of courses | Runxi Yu | 2024-10-09 | 1 | -1/+1 |
| | |||||
* | student.js: Don't N then Y the same course on selectv0.1.8 | Runxi Yu | 2024-10-09 | 1 | -1/+1 |
| | |||||
* | student.{html,js}: Deselect courses in the same group when selecting | Runxi Yu | 2024-10-09 | 2 | -5/+7 |
| | |||||
* | student.html: Slightly better looks around tickbox | Runxi Yu | 2024-10-09 | 1 | -8/+10 |
| | |||||
* | tcourse.sql: Add more example CCAs | Runxi Yu | 2024-10-09 | 1 | -5/+13 |
| | |||||
* | {courses,index}.go, student.html, style.css: Group by course group | Runxi Yu | 2024-10-09 | 4 | -20/+34 |
| | |||||
* | student.html: Simplify JS | Runxi Yu | 2024-10-09 | 1 | -2/+1 |
| | |||||
* | index.go, {login,student}.html: Use structs rather than maps for tmpl | Runxi Yu | 2024-10-09 | 3 | -22/+28 |
| | |||||
* | *.go: Use sync.Map instead of map[int]*courseT for courses | Runxi Yu | 2024-10-09 | 6 | -73/+115 |
| | | | | I'm not sure whether this is actually better than locking. | ||||
* | {courses,wsc,wsp}.go: Usems should be sync.Map | Runxi Yu | 2024-10-09 | 3 | -19/+12 |
| | | | | | This is a classic few-reads, many-writes situation where a sync.Map would lead to substantially less lock contention. | ||||
* | {courses,wsc,wsm}.go: map[courseGroupT](bool->struct{}) | Runxi Yu | 2024-10-08 | 3 | -8/+8 |
| | | | | | This makes it use slightly less memory. Approximately courseGroupT bits per connection! | ||||
* | style.css: Work around Firefox bug 217769 | Runxi Yu | 2024-10-08 | 1 | -0/+8 |
| | | | | | | | Firefox eats the left, bottom, and right borders when tbody is empty. This is a bug known for 21 years (that was Firefox 37 or something). References: https://bugzilla.mozilla.org/show_bug.cgi?id=217769 | ||||
* | *.go: Further wrap errors | Runxi Yu | 2024-10-08 | 6 | -24/+52 |
| | |||||
* | err.go: Create, and unify some error definitions | Runxi Yu | 2024-10-08 | 5 | -38/+55 |
| | |||||
* | Revert "latexify-source.sh: \subsection{\texttt{%s}}" | Runxi Yu | 2024-10-07 | 1 | -11/+11 |
| | | | | This reverts commit a9916b3a7df327836f18011edcbf8cc218260f89. | ||||
* | student.js: Use "let" rather than "var"v0.1.7 | Runxi Yu | 2024-10-07 | 1 | -2/+2 |
| |