Repository navigation
Changelog
Simone Di Mambro edited this page Oct 12, 2026
·
16 revisions
- People for everyone: the collector now reads the participants of all classes of the club for today and tomorrow (one profile per club, ≤ 1 read per class every 3 hours, 2 s apart), besides the tracked/booked classes of the next 7 days. Users without bookings (and administrators without their own mywellness profile) see the club's people and leaderboard too.
-
Fix (web UI behind Cloudflare):
app.js,i18n.jsandapp.cssare now served withCache-Control: no-storeand referenced with?v=<version>fromindex.html. Cloudflare was caching the oldapp.jsfor 4 hours, so after an update the page (new) ran with the old script: the new "Persone" page and the 👥 button did not work until the cache expired.
- Leaderboard reads use the official widget's date formats (ISO-week Monday
yyyymmdd, monthyyyymm) and also read the previous week/month. Note: for Wellness Town the public leaderboard API answers an empty list even when authenticated; the "Classifica Settimanale" of the mobile app comes from an endpoint not present in the web widget, still to be identified.
-
People (new, separate from the booking engine): the gateway keeps a SQLite database (
/config/people.db, pure-Go driver, no cgo) with the public member data mywellness exposes — nickname, picture, "private profile" flag — plus attendance and the club's MOVEs leaderboard. A low-frequency collector reads the participants of the classes you track or booked (every 15 minutes it checks; at most one read per class every 3 hours, plus one in the 40 minutes before the start) and the weekly/monthly leaderboard hourly. Reads are authenticated but rare and do not touch the booking timing. - API:
GET /profiles/{id}/classes/{classId}/{date}/participants(live read + history: seen count, classes attended, best leaderboard positions),GET /people/members[?facility&q],GET /people/members/{id}(attendance history, leaderboard rows),GET /people/leaderboard?facility&trend=week|month[&period],GET /people/stats. Visibility follows the caller's profiles (club). - Web UI: new Persone page (podium + leaderboard with past periods, classmates with search, member card); a 👥 button on every class in Lezioni opens the live participant list. iOS app 1.2.0 (build 20): Participants section in the class sheet, "Persone del centro" in Altro.
- Privacy: only data the Technogym app already shows to every member; private profiles stay anonymous; no personal data of third parties beyond that is collected.
-
Readable profile card:
GET /profilesreturnscard, the mywellness identity normalized (fullName, nickName, email, gender, birthDate YYYY-MM-DD, culture, measurementSystem, memberSince RFC 3339, timeZoneWindowsId, userId, extra), so clients can format dates, language, units and time zone in the user's language. The web user dialog shows the card (name, nickname, email, gender, date of birth with age, language, units, member since, time zone) with the user ID and other technical fields in a collapsible "Dati tecnici"; the iOS app (build 19) shows the same layout.
-
Removing a tracked class now cancels it on mywellness too:
DELETE /items/{id}unbooks a booked class and leaves the waiting list for a waiting-list class before removing it; with?rule=1the whole recurrence is stopped and every future booked/waiting class of the series is cancelled. The response reportsremoved,unbooked,leftWaitingListanderrors; a class whose cancellation fails (e.g. past the cancellation deadline) stays in the list with the error. Web UI and iOS app (build 18) confirm before removing and show the outcome. Before, "Rimuovi" only dropped the gateway entry and the booking stayed on Technogym.
-
Per-user scheduler settings: every gateway user, administrator or not, has their own settings (opening rules with per-rule quota, lead, burst, watching cadence, days ahead, priority notifications). They apply to the classes of that user's profiles. The administrator's old global settings become the defaults for users who have not customised anything.
GET/PUT /settingsnow read/write the caller's own settings (customtells whether they differ from the defaults),DELETE /settingsgoes back to the defaults,?scope=default(admin) edits the defaults. Web UI: Impostazioni editable by everyone, with a scope selector for the administrator; iOS: Scheduler e osservazione editable by everyone, with "Torna alle predefinite".
-
Several Technogym clubs per mywellness account: a profile is "one account at one club";
POST /profileswithcopyFromProfileIdadds another club for the same account, copying credentials, owner and visibility (no password needed). The web user dialog lists every club of the account (label, limit, counters, re-login, remove) with "+ Add club"; the iOS app shows a club switcher at the top of Classes and Bookings and a Clubs section in the profile page. -
GET /profilesalso returnsidentityon profiles created as additional clubs.
-
Watching ("Osservazione") is now aggressive and account-safe: free places are read from the public schedule (no token, one request per club and day shared by every profile and class) every
pollSeconds(default 15 s, minimum 5) and everynearPollSeconds(default 3 s, minimum 2) in the lastnearHourshours (default 4). An authenticated read every 60 s still updates participation and waiting-list position. A place is taken whenavailablePlaces > 0,numberOfParticipants < maxParticipantsor the user'sbookingUserStatusisCanBook; the booking is retried up to 3 times 0.7 s apart. Existing settings at the old default (60 s) are migrated to 15 s. Background: on 8 October a Reformer place freed, mywellness notified the waiting list, and the 30 s polling lost the race. -
Fix (false cancellations): when a schedule read would turn a booked class into "cancelled", the session is verified first (
GetLoginStatus) and re-read after a new login if the token had expired. This stops the hourly "disdetta rilevata"/"già prenotata" flapping. -
Profile identity: the whole mywellness
userContext(minus tokens/passwords) is stored at login and returned asidentityinGET /profiles, for the profile page of the iOS app. - Watching network errors are logged (at most every 10 minutes per class);
waitingListCountershown in the class status.
-
Fix (limits): classes covered by a rule with its own
maxBookings(e.g. Reformer 3) now have a separate quota: they are no longer counted in the profile-wide limit (default 5) and are checked only against their own rule. Before, a profile with 5 active bookings including Reformer classes could not book anything else, and vice versa; this blocked the Reformer booking of 5 October at the Wellness Town club.activeBookingsinGET /profilesnow excludes classes with their own quota;limitskeeps the per-rule counters.
-
Fix: mywellness session tokens expire after about an hour and the schedule API then answers as an anonymous user (no
isParticipant), so active bookings dropped to 0 and limits/cancellation detection were wrong. The gateway now verifies the session withGetLoginStatus(at most every 5 minutes) before authenticated reads, books, cancellations and waiting-list operations, and logs in again automatically when the token is invalid.
- User isolation: devices that log in with
selfOnly: true(the iOS app) see only the signed-in person's profile, items, bookings and log, even for administrators; user management is web-only. Existing app devices are migrated. Regular users are isolated on the web too; administrators keep the family view in the web UI.
- Human-like traffic: watching every 60 s by default (minimum 15), 30 s in the 4 hours before the class, ±15% jitter; one schedule request per profile and day shared by all tracked classes of that day (10 s cache); browser User-Agent. Existing settings below 30 s are migrated to 60 s.
- Booking time always comes from the matching rule (hour:minute); "follow the club" now decides only the opening day. Fixes rules set to 05:01 still showing 05:00.
- Per-rule active-bookings limit (
maxBookingson a rule, e.g. Reformer 3) in addition to the per-profile limit;GET /profilesreturnslimitscounters.
- Opening rules: a named rule always decides the booking time (even with "follow the club" on); the club's reported opening time applies only to classes covered by
*.
- Local-only administrators (no mywellness account) can be created; the mywellness account is required only for regular users.
- Profiles created before 0.1.6 reload their mywellness identity (name, picture) automatically at the first refresh.
- Visibility: non-admin users see only their own profile (and profiles explicitly shared with them); administrators see every profile and can switch between them in the app and the web UI.
- Profile identity from mywellness (
firstName,lastName,nickName,email,pictureUrl,thumbUrl) stored at login and exposed inGET /profiles; avatars in the web UI.
- Recurrences attach only occurrences on or after the chosen class.
- Users: per-user dialog (gateway access, role, mywellness account with link/re-login/unlink/remove, assign an orphan account); role changes and deletion allowed for any admin as long as one admin remains; deleting a user keeps their mywellness account as orphan.
- Leave the mywellness waiting list from the gateway (
POST /profiles/{id}/leave-waiting-list{classId, partitionDate, removeItem}→ item becomescancelled); Unbook result codes handled (TooLate= less than 2 hours before,BookingNotAvailable); outline eye icon on password fields.
- Web UI: "Utenti e account mywellness" merges users and profiles: adding a user requires their mywellness email/password and creates the person's profile; every profile has Modifica (label, mywellness password, max bookings, visibility, owner user); link an account to an existing user.
- Theme and language selectors moved into Settings; eye toggle on password fields.
- Edit existing users (
PUT /users/{id}: username, displayName, isAdmin, password) and link a mywellness account to an existing user from the users table;GET /usersreturnsprofileId/profileLabel; hint on the Profiles page when the signed-in person has no own profile.
- Web UI: theme (system/light/dark) and language (it/en/es/fr/de) selectors in the header; automatic refresh (20 s, and on tab focus) of bookings, classes and log.
- Gateway users can own their mywellness profile (
userId): created with the user (setup / add user with optional mywellness credentials) or linked withmine: true;GET /mereturnsmyProfileIdand clients default to it. - Web UI: profile selector in every section, "Ultime attività" card on the bookings page, log filters (profile, level), opening-rules table with matched-classes preview and explicit add/delete, stale-view fix.
- First release: multi-profile engine (scheduler at opening time, waiting list, continuous watching of freed spots, weekly recurrences, per-club booking limit), external cancellation sync, APNs Time Sensitive push, web UI with walkthrough, REST API for the Wellness Booking iOS app, Unraid template, GHCR multi-arch image.
wellness-gateway