Commit Graph
1618 Commits
Author SHA1 Message Date
kolaente 8de2bd8ea5 fix(kanban): stop bucket search leaking into other filter buckets
In filter bucket mode a bucket's search was written into the shared search options and never reset, so buckets processed afterwards (random map order) inherited it.
2026-11-07 17:38:21 +01:00
kolaente 8ba44b4122 fix(filters): apply stored search text of saved filters
TaskCollection.ReadAll built the saved filter's collection but recursed with the request search only, so filters.s was never applied. The stored search now takes precedence, matching view and bucket filter searches.
2026-11-07 12:58:48 +01:00
kolaente fa6d9941fd fix(projects): only respread positions of projects the user can write
Moving a project to a position below 0.1 respread the positions of all
sibling projects on the instance. It now only touches the siblings the
user can write, plus the moved project itself.
2026-11-05 15:42:45 +01:00
kolaente 0ca8618a5c fix(link-shares): hide creator emails in the share list
Share creators are now loaded through the same helper as other user
listings, which blanks email addresses.
2026-11-05 15:42:45 +01:00
kolaente 8f9b9aba68 feat(migration): index the columns that reference stored files
Adds indexes on task_attachments.file_id, users.avatar_file_id,
users.export_file_id, projects.background_file_id and
migration_status.upload_file_id.
2026-11-05 15:42:45 +01:00
kolaente 70451f4e4a fix(projects): never take the background from a project create request
The background of a new project is only ever set by the background
endpoints. Duplicating a project now hands the source background to the
copy step explicitly instead of relying on the field surviving creation.
2026-11-05 15:42:45 +01:00
kolaente e3acf407fb fix(export): export related tasks as references
The user data export embedded every related task in full, repeating its
description once per relation. Related tasks are now exported as id and
project id only, since every related task is part of the export anyway.

The importer resolves such references across all imported projects and
creates relations once every project exists, so relations between
projects survive the round trip instead of duplicating the related task.
Exports with the full related task shape import as before.
2026-11-05 15:42:45 +01:00
kolaente 1f79a8e01a fix(migration): reject repeated csv column mappings, cap labels per row
- Reject a config that maps a column more than once, already when the
  import is started or previewed.
- Import repeated labels of a row once and reject rows with more than
  MaxLabelsPerTask (100) labels.
- Count items while converting rows so a file over the import item limit
  fails before the whole structure is built.
- Walk mappings sorted by column so a row only visits the cells it has.
2026-11-05 15:42:45 +01:00
kolaente c6f18e405c fix(caldav): build iCalendar output linearly, cap reminders and titles
Every VALARM repeats the task title and the output was built with string
concatenation, so rendering cost grew quadratically with the number of
reminders. Build it with a strings.Builder instead.

Tasks may now have at most MaxRemindersPerTask (100) reminders and a
title of at most MaxTaskTitleLength (1000) characters, checked through
v1, v2 and CalDAV. On update the reminder limit only applies when the
count grows and the title limit only when the title changes, so existing
tasks stay editable.
2026-11-05 15:42:45 +01:00
kolaente 9fdd7f212e fix(tasks): keep the deleting user's data out of the task deleted event
The event no longer carries the deleting user's related tasks, favorite
and subscription.
2026-11-05 15:42:45 +01:00
kolaente b728feb9e8 fix(reminders): limit overdue task events to the recipient's projects 2026-11-05 15:42:45 +01:00
kolaente 111e332379 fix(filters): limit business day offsets in date math
The business day offsets in the date values of a task or time entry
filter may now add up to at most MaxDatemathBusinessDays (10000). Larger
filters are rejected with the invalid filter value error before any value
is evaluated. The frontend date math parser applies the same limit.
2026-11-05 15:42:45 +01:00
kolaenteandTink c661314940 feat(models): add errors for linking user identities 2026-11-05 12:44:50 +01:00
kolaenteandTink 934ced938e feat(auth): persist linked OIDC identities and authenticate local accounts 2026-11-05 12:44:49 +01:00
kolaenteandTink 61f8af603f refactor(user): share password and TOTP reauthentication 2026-11-05 12:44:49 +01:00
kolaente bab08e90c7 fix(tasks): lock views before tasks and recheck restores
Address PR Swarm lock-order decision across task writes, restoration, and project/user purges. Reject moves discovered after view locks without acquiring views out of order.
2026-11-05 11:29:33 +01:00
kolaente 5174bda98d style(tasks): format literals and trim comments
Address pr-swarm finding: follow the repository one-field-per-line convention in changed literals.
2026-11-05 11:29:33 +01:00
kolaente f5421cb272 fix(projects): archive duplicates after copying attachments
Address pr-swarm finding: keep the destination writable while populating an archived project duplicate.
2026-11-05 11:29:33 +01:00
kolaente 0472f02cd0 fix(tasks): recheck child writes and relation endpoints under row locks
Covers comments, attachments, labels, assignees, relations, reactions and task duplication. Assignee access is now checked against the project the task is in after the lock.
2026-11-05 11:29:33 +01:00
kolaente 97518e71ce fix(tasks): recheck write permission and view fit under the row lock for bucket and position moves
A task moved into another project between the check and the write would otherwise get a bucket or position in a view of its old project.
2026-11-05 11:29:33 +01:00
kolaente c8bdd3f87b fix(tasks): recheck write permission under the row lock before deleting a task 2026-11-05 11:29:33 +01:00
kolaente 1179b21227 refactor(tasks): extract locked write-permission recheck into lockTaskForWrite
The locked re-read now also drops the stale memoized task so later reads in the same session see the row the lock returned.
2026-11-05 11:29:33 +01:00
kolaenteandTink 6df6a9ae46 style(projects): simplify and format project trash code
Address pr-swarm finding: restating and multi-line comments
2026-11-04 23:14:28 +01:00
kolaenteandTink 205f721ded test(projects): share trash admin and webhook test setup
Address pr-swarm finding: setup copied inline
2026-11-04 23:14:28 +01:00
kolaenteandTink a34e7bb926 test(projects): cover purge retention and stored invariants 2026-11-04 23:14:28 +01:00
kolaenteandTink a7ed70ca22 feat(projects): count trash and preserve other users deletions 2026-11-04 23:14:28 +01:00
kolaenteandTink 1c0cca9b3f feat(projects): audit and announce permanent project deletion
Maintainer decision: ProjectPurgedEvent (project.purged) per purged project, like TaskPurgedEvent
2026-11-04 23:14:28 +01:00
kolaenteandTink 253ca2fc20 fix(time-tracking): enforce project trash container permissions
Maintainer decision: one timeEntryInTrashCond for lists, marking and permission checks
2026-11-04 23:14:28 +01:00
kolaenteandTink 0c97e7f09d fix(webhooks): route project trash events through ancestors
Address pr-swarm finding: read check skipped for trashed rows
2026-11-04 23:14:28 +01:00
kolaenteandTink 96150b84f8 fix(projects): share background removal across API versions
Address pr-swarm finding: removal passed a stub project, file never deleted
2026-11-04 23:14:28 +01:00
kolaenteandTink 87b85a8ae5 fix(projects): defer background deletion until purge commits
Address pr-swarm finding: blobs deleted before commit
2026-11-04 23:14:28 +01:00
kolaenteandTink b8b58806da fix(projects): preserve trashed data during user cleanup 2026-11-04 23:14:28 +01:00
kolaenteandTink 01ed69c709 feat(projects): exclude trashed projects from instance counts 2026-11-04 23:14:28 +01:00
kolaenteandTink 48f164c46c refactor(projects): build trash queries with the query builder
Address pr-swarm finding: hand-built SQL strings
2026-11-04 23:14:28 +01:00
kolaenteandTink 80ddaad487 feat(projects): skip trashed projects in reminder jobs 2026-11-04 23:14:28 +01:00
kolaenteandTink 8b5ffbb950 feat(projects): suspend link shares while projects are trashed 2026-11-04 23:14:28 +01:00
kolaenteandTink 90201882f4 refactor(projects): return a dedicated trash list type
Maintainer decision: trashed_sub_projects lives on a TrashedProject wrapper, not the core Project model
2026-11-04 23:14:28 +01:00
kolaenteandTink dd4826cd8e feat(api): expose project trash and subtree counts 2026-11-04 23:14:28 +01:00
kolaenteandTink 4af98b7d1e fix(projects): reserve identifiers and repair trashed orphans 2026-11-04 23:14:28 +01:00
kolaenteandTink 9bc2fbf399 fix(tasks): preserve project trash details in task errors
Address pr-swarm finding: database errors fell through to CanWrite
2026-11-04 23:14:28 +01:00
kolaenteandTink 8a08b66c7d refactor(projects): centralize trashed project authorization
Address pr-swarm finding: can_restore ignored a trashed or archived parent
2026-11-04 23:14:28 +01:00
kolaenteandTink 1deda2d1c8 feat(projects): expose blocked restore root details
Address pr-swarm finding: missing IsErr helpers
2026-11-04 23:14:28 +01:00
kolaenteandTink 150e17d826 feat(projects): trash and restore project trees 2026-11-04 23:14:28 +01:00
kolaenteandTink f81799d2cc feat(projects): add trash metadata and access filtering 2026-11-04 23:14:28 +01:00
kolaenteandTink c429112b2a refactor(trash): share the retention setting
rg -l TaskDeleteRetention pkg | xargs sed -i 's/TaskDeleteRetention/TrashRetention/g'
2026-11-04 23:14:28 +01:00
kolaenteandTink 4b5f4a682a fix(time-tracking): remove private entries when deleting their author
Address pr-swarm finding: author-only entries outlived account deletion
2026-11-04 23:14:28 +01:00
kolaenteandTink 13acda8fa4 feat(time-tracking): support entries without a container 2026-11-04 23:14:28 +01:00
kolaenteandTink 82dcceca55 fix(caldav): invalidate sync tokens after permanent deletion
Implement the approved last_purged_at decision with an advancing purge generation so same-second purges invalidate old tokens and full resync tokens remain usable.
2026-11-04 23:14:28 +01:00
kolaenteandTink 375738ff7e feat(tasks): audit and announce task trash events
Address pr-swarm finding: reloadTaskInEvent dropped task.deleted on ErrTaskIsInTrash
2026-11-04 23:14:28 +01:00
kolaenteandTink 94f501c61d feat(tasks): add task trash lifecycle and permissions 2026-11-04 23:14:28 +01:00