Commit Graph

176 Commits

Author SHA1 Message Date
Rafael Foster 72fca92066 feat(documents): add family document management 2026-04-29 06:14:29 -03:00
Rafael Foster 9759f5e267 feat(tasks): add archived status support in API and schema 2026-04-29 05:33:06 -03:00
Rafael Foster 4d3c2688fe Prevent deletion of family members from contact list 2026-04-28 22:17:21 -03:00
Rafael Foster 5062e1e61f Improve account profile and sidebar details 2026-04-28 21:11:49 -03:00
Rafael Foster 69897666fb Refine family settings and calendar dentist icon 2026-04-28 20:28:50 -03:00
Rafael Foster 7b85db9b07 Sync family members with contacts and birthdays 2026-04-28 20:04:13 -03:00
Ulas Kalayci 6f8cc712a7 chore: release v0.30.3 2026-04-28 22:40:36 +02:00
Rafael Foster b4d74f239b Expand calendar event icon options 2026-04-27 22:22:30 -03:00
Rafael Foster 1d1d2291e5 Add calendar event icons and flexible date inputs 2026-04-27 21:38:06 -03:00
Ulas Kalayci 74dca56850 fix(google-sync): db.transaction → db.get().transaction in upsertGoogleEvents 2026-04-27 22:34:23 +02:00
ulsklyc 19e6569281 fix(google-sync): skip null items and await initial sync (#93)
Null/undefined items in the Google Calendar API response caused a
TypeError on `item.status` access, silently aborting the sync while
the OAuth callback had already redirected to the success page.

- Filter null items in `upsertGoogleEvents` with an early `continue`
- Await `sync()` in the OAuth callback so errors surface as
  `sync_error=google` redirects instead of false success

Resolves #92

Co-authored-by: Ulas Kalayci <ulas.kalayci@googlemail.com>
2026-04-27 17:24:37 +02:00
Rafael Foster 7e4db48a9f Merge branch 'main' of github.com:rafaelfoster/oikos 2026-04-27 08:52:18 -03:00
Rafael Foster 6e410cb671 Add member editing and profile pictures 2026-04-27 08:09:00 -03:00
Rafael Foster b82a86c4b3 Add family roles to member management 2026-04-27 07:53:43 -03:00
Ulas Kalayci 6a575520aa chore: release v0.26.5 2026-04-27 12:51:10 +02:00
Ulas Kalayci 1821b7147a fix: path is not defined in renderPage and HAVING clause SQL error
- router.js: route-announcer used bare `path` variable which is not in scope
  inside renderPage(); replaced with `route.path`
- dashboard.js: shoppingLists query used `HAVING open_count > 0` without GROUP BY;
  SQLite rejects this — replaced with a WHERE subquery

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 12:24:39 +02:00
Rafael Foster 08199495b6 A lot of change in this commit. Changing the dashboard to get more data and the new features added 2026-04-26 21:18:59 -03:00
Rafael Foster 3c5a8c7eb3 Adding option for allowing users to define the Application visible name 2026-04-26 19:32:19 -03:00
Rafael Foster b0c1b8b6f9 Merge branch 'main' of github.com:rafaelfoster/oikos 2026-04-26 07:50:59 -03:00
Rafael Foster 394b4ea84e Adding Birthday tracking feature - to compete with FamilyWall 2026-04-26 07:36:53 -03:00
Ulas Kalayci cd68bbfae7 fix: remove CDN swagger UI, revert CSP, translate apiToken i18n keys to German
- Delete public/doc-assets/swagger.html and swagger-init.js (CDN dependency violates project constraints)
- Remove /docs route from server/index.js
- Revert styleSrc and fontSrc in CSP to not include cdn.jsdelivr.net
- Translate all 22 settings.apiToken* keys in de.json from English to German

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 08:57:21 +02:00
Rafael Foster 112b05508b Adding /api/v1/budget/categories and /api/v1/budget/categories endpoints 2026-04-25 12:58:38 -03:00
Rafael Foster 71c0552e34 Adding Rest API documentation page with Swgger download on the /docs endpoint 2026-04-25 12:50:50 -03:00
Rafael Foster bb44a90d48 Fixing API Token conflict with req.session 2026-04-25 12:34:10 -03:00
Rafael Foster 6e2dec66e8 Merge branch 'main' of github.com:rafaelfoster/oikos 2026-04-25 12:24:35 -03:00
Rafael Foster f43dee4cc0 Adding Rest API token with expiration and revocation options. 2026-04-25 12:22:58 -03:00
Ulas Kalayci 95934bac23 fix: review corrections for PR #86
- Remove .codex (Codex CLI artifact, not part of project)
- Restore CHANGELOG.md v0.23.17 entry (was deleted by contributor's fork)
- Restore version to 0.23.17 in package.json and package-lock.json
- Restore native translations for catFood, catLeisure, catEducation in ar, el,
  hi, ja, ru, sv, tr, uk, zh (PR had replaced them with English strings)
- Replace Portuguese seed names in migration 16 with English (housing, food,
  transport, personal_health, leisure, shopping_clothing, education,
  financial_other and all subcategory display names)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 17:01:06 +02:00
Rafael Foster bdd6e559d5 Replacing entire backend messages (especially logs) with English instead of Germany 2026-04-25 10:56:46 -03:00
Rafael Foster 140fa78ca1 Initial commit after fork. Moving Budget categories to Database and adding subcategories, with customization options 2026-04-25 10:05:27 -03:00
Ulas Kalayci e1ea0bdb7e fix(weather): show correct wind speed and unit for imperial units
When OPENWEATHER_UNITS=imperial, OpenWeatherMap returns wind speed in
mph directly — the server was incorrectly multiplying by 3.6 (m/s→km/h)
on top of that. All locale strings also hardcoded the unit label instead
of using a {{windUnit}} placeholder, so the label always read km/h.

Resolves #79

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 07:39:13 +02:00
Konrad M. 583d2543fb fix(tasks): overdue always first; sort by due date, priority as tiebreaker
effectiveDue() and sortTasks() added — same logic on client (tasks.js)
and server (dashboard.js urgentTasks moved from SQL to JS sort).
Applies in list-group, Kanban, and dashboard widget views.
SQLite DATE('now') replaced with new Date() for timezone-safe due_time.
2026-04-21 22:18:14 +02:00
Konrad M. 69c72f3abd feat(calendar): track external calendar name and color through Google/Apple sync
Google and Apple sync services now fetch calendar metadata and persist it via
upsertExternalCalendar(). The /calendar and /upcoming endpoints JOIN on
external_calendars to return cal_name and cal_color with every event.
2026-04-21 22:18:14 +02:00
Konrad M. 6cae070061 feat(db): add external_calendars table and link to calendar events (migration v14)
Stores display name and color per synced Google/Apple calendar.
calendar_events gains a calendar_ref_id FK for join-based name/color lookup.
2026-04-21 22:18:14 +02:00
Ulas Kalayci 9f321851f8 chore: release v0.22.2
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 17:23:30 +02:00
Ulas Kalayci a253f0a7fa chore: release v0.22.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 14:23:53 +02:00
Serhiy Bobrov 0b54fe255b feat: add recipes module with CRUD functionality and integrate with meals
- Implemented new recipes page with UI for managing recipes.
- Added REST API routes for recipes including create, read, update, and delete operations.
- Introduced database schema for recipes and recipe ingredients.
- Updated meals to link with recipes, allowing meals to reference specific recipes.
- Enhanced validation for recipe-related fields in meals.
- Added styles for the recipes page and components.
2026-04-21 14:15:39 +02:00
Ulas Kalayci 41467a84b6 chore: release v0.21.1
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 14:03:33 +02:00
Ulas Kalayci e4b97368fb feat(api): add first-run setup endpoint for admin bootstrap
POST /api/v1/auth/setup — unauthenticated, only succeeds when the
users table is empty. Enables first-admin creation via HTTP for
Docker deployments without shell access to the container volume.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-21 13:10:41 +02:00
ulsklyc d1ec7367a0 fix(auth): resolve post-login navigate race condition and add version display (#68) (#70)
Root cause: when auth.me() failed during initial navigation, the catch block
called navigate('/login') without clearing _pendingLoginRedirect. The outer
finally then fired a second concurrent navigate('/login'), which held
isNavigating=true while running. If the user submitted the login form (or
iCloud Keychain autofilled credentials) before the second navigation
completed, navigate('/', user) was silently blocked by the isNavigating guard —
login appeared to succeed but the app never advanced to the dashboard.

Fix: clear _pendingLoginRedirect in the catch block so the finally handler
does not spawn the duplicate navigation.

Also adds a GET /api/v1/version endpoint (no auth required) and shows the
version on the login page, so users can verify their PWA has received the
latest cached JS.

Resolves #68

Co-authored-by: Ulas Kalayci <ulas.kalayci@googlemail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 08:19:53 +02:00
Ulas Kalayci 3cd5f31c0d fix(calendar): NaN guard on subscription IDs, user_modified for all external sources 2026-04-20 23:57:15 +02:00
Ulas Kalayci ed0618cf75 fix(calendar): apply ICS visibility filter to /upcoming endpoint 2026-04-20 23:55:20 +02:00
Ulas Kalayci 466860074a feat(calendar): add ICS subscription routes and sync integration
- Add CRUD routes for /subscriptions (GET, POST, PATCH, DELETE)
- Add manual sync trigger: POST /subscriptions/:id/sync
- Add ICS visibility filter to GET /calendar (private vs. shared)
- Set user_modified=1 on PUT /:id for ICS events
- Add POST /:id/reset to clear user_modified on ICS events
- Wire icsSubscription.sync() into runSync() in server/index.js
2026-04-20 23:53:53 +02:00
Ulas Kalayci 3445e504a2 fix(ics): add color to ON CONFLICT DO UPDATE and per-iteration try/catch in sync loop 2026-04-20 23:46:06 +02:00
Ulas Kalayci 4d585fb288 fix(calendar): extend SSRF guard to cover fd00::/8 IPv6 ULA range 2026-04-20 23:40:38 +02:00
Ulas Kalayci 7f1a199e33 feat(calendar): add ICS subscription service (fetchAndParse, sync, CRUD) 2026-04-20 23:38:46 +02:00
Ulas Kalayci a4250b46ab fix(calendar): add IF NOT EXISTS to idx_calendar_sub_extid unique index 2026-04-20 23:36:48 +02:00
Ulas Kalayci 8e042ad932 fix(calendar): add missing idx_calendar_sub to db-schema-test MIGRATIONS_SQL[11] 2026-04-20 23:34:41 +02:00
Ulas Kalayci a64635b669 feat(calendar): add ics_subscriptions table and calendar_events columns (migrations v10-v11) 2026-04-20 23:32:42 +02:00
Ulas Kalayci 8479072afd refactor(calendar): fix ics-parser module header and test chain consistency 2026-04-20 23:29:28 +02:00
Ulas Kalayci 583a1bdf23 refactor(calendar): extract ICS parser into shared ics-parser.js module 2026-04-20 23:25:50 +02:00