Skip to content

⚙️ 45773 backend [ templates ] Add FieldSets#211

Open
pneumojoseph wants to merge 65 commits into
masterfrom
backend/fieldsets/45773__fieldsets
Open

⚙️ 45773 backend [ templates ] Add FieldSets#211
pneumojoseph wants to merge 65 commits into
masterfrom
backend/fieldsets/45773__fieldsets

Conversation

@pneumojoseph

@pneumojoseph pneumojoseph commented May 6, 2026

Copy link
Copy Markdown
Collaborator

Note

Medium Risk
Touches core template/workflow field creation, task completion validation, and DB schema migrations; incorrect fieldset or rule handling could break form saves or block task completion.

Overview
Adds reusable fieldsets so kickoff and task template forms can group fields with layout metadata and validation rules, wired through template editing into running workflows.

New template models FieldsetTemplate / FieldsetTemplateRule and runtime FieldSet / FieldSetRule (migration 0255_add_fieldsets) support shared definitions (is_shared, shared_fieldset copies), attachment to kickoff or task templates, and fields linked via fieldset FK plus M2M rules. sum_equal rules require number fields whose values sum to a configured target; workflow kickoff updates and task completion now validate those rules (including OR when multiple rules share a type).

Template and workflow APIs gain fieldsets on kickoff/task serializers, FieldsetMixin for create/update from shared fieldset IDs, and FieldSetTemplateService / FieldSetService for instantiation. Output-field resolution on Template and Workflow now includes fields nested under fieldsets, not only direct task/kickoff fields.

Supporting changes: RelatedApiNameField / RelatedApiNameListField for account+template-scoped api_name resolution, extracted FieldTemplateService, default delete() on BaseModelService, and template “fields only” read serializers moved to template_fields.py. SystemVariable.TASK_VARS is aligned with workflow name variables for task naming.

Reviewed by Cursor Bugbot for commit 07df431. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add FieldSet support to templates, tasks, and kickoffs with file service integration

  • Introduces FieldsetTemplate, FieldSet, and related rule models to group fields under templates, tasks, and kickoffs; existing querysets, serializers, versioning services, and workflow action services are updated to create, update, and validate fieldsets and their rules.
  • Replaces legacy Google Cloud Storage file handling with a new file service (src.storage): a FastAPI microservice backed by SeaweedFS/S3, with FileServiceAuthMiddleware, AttachmentService, guardian object permissions, and management commands for migrating existing attachments.
  • Comment and field attachment submission no longer accepts attachments in API payloads; attachments are now derived by parsing markdown in text content and synced via refresh_attachments/sync_storage_attachments_for_scope.
  • Frontend RichText component is rewritten to use a markdown-it pipeline with sanitized HTML, line clamping via maxLines, and support for interactive checklists, embedded video, and image placeholders.
  • uploadFiles now uploads to the file service (batched in groups of 3), returns string IDs and markdown links, and no longer requires accountId or Google Cloud signed URLs.
  • Nginx configs gain a file-service upstream, /files/ proxy location, default server blocks returning 444 for unknown hosts, and a Railway-specific dynamic config with envsubst entrypoint.
  • Risk: /workflows/attachments and /workflows/public/attachments endpoints are removed and will return 404; FieldMixin no longer inherits AccountBaseMixin, affecting any model that depended on that behavior.

Macroscope summarized 0e1408e.

@pneumojoseph pneumojoseph added the Backend API changes request label May 6, 2026
Comment thread backend/src/processes/models/templates/fieldset.py Outdated
Comment thread backend/src/processes/serializers/workflows/kickoff_value.py
Comment thread backend/src/processes/models/templates/fieldset.py
Comment thread backend/src/processes/services/workflows/fieldsets/fieldset_rule.py Outdated
Comment thread backend/src/processes/models/templates/template.py
Comment thread backend/src/processes/serializers/templates/kickoff.py
@pneumojoseph pneumojoseph self-assigned this May 6, 2026
Comment thread backend/src/processes/models/templates/fieldset.py
Comment thread backend/src/processes/serializers/templates/kickoff.py
Comment thread backend/src/processes/services/tasks/field.py
Comment thread backend/src/processes/services/tasks/task_version.py
Comment thread backend/src/processes/models/workflows/fieldset.py
Comment thread backend/src/processes/services/tasks/task_version.py Outdated
Comment thread backend/src/processes/services/fieldsets/fieldset_rule.py Outdated
Comment thread backend/src/processes/services/templates/field_template.py
Comment thread backend/src/processes/services/fieldsets/fieldset.py
Comment thread backend/src/processes/services/workflows/fieldsets/fieldset.py
Comment thread backend/src/processes/services/workflow_action.py
Comment thread backend/src/processes/services/fieldsets/fieldset_rule.py
Comment thread backend/src/processes/services/workflows/fieldsets/fieldset_rule.py
Comment thread backend/src/processes/models/templates/template.py Outdated
Comment thread backend/src/processes/services/workflows/fieldsets/fieldset_rule.py Outdated
Comment thread backend/src/processes/services/tasks/task_version.py
Comment thread backend/src/processes/migrations/0255_add_shared_fieldsets.py Outdated
Comment thread backend/src/processes/services/fieldsets/fieldset.py
Comment thread backend/src/processes/services/fieldsets/fieldset.py
Comment thread backend/src/processes/services/fieldsets/fieldset.py Outdated
Comment thread backend/src/processes/serializers/workflows/kickoff_value.py Outdated
Comment thread backend/src/processes/management/commands/migrate_fieldsets.py Outdated
Comment thread backend/src/processes/management/commands/migrate_fieldsets.py Outdated
Comment thread backend/src/processes/management/commands/migrate_fieldsets.py Outdated
Comment thread backend/src/processes/migrations/0255_add_shared_fieldsets.py Outdated
Comment thread backend/src/processes/management/commands/migrate_fieldsets.py Outdated
Comment thread backend/src/processes/management/commands/migrate_fieldsets.py Outdated
Comment thread backend/src/processes/services/tasks/task_version.py Outdated
Comment thread backend/src/processes/serializers/templates/task.py Outdated
commit 6302334fa4214c76bc57f5a35499a8fc8f4d611b
Merge: 42cd8a2e 9b207d45
Author: Joseph Vreeken <Joseph.Vreeken@pneumatic.app>
Date:   Tue Jul 14 16:01:58 2026 +0500

    Merge pull request #272 from pneumaticapp/nginx/48124__filtering_spam

    ⚙️ 48124 backend [ nginx ] Filtering spam requests at the Nginx level

commit 9b207d4598c39e6660f11126b4aa5c033a755d80
Author: joseph.vreeken <joseph.vreeken@pneumatic.app>
Date:   Tue Jul 14 15:58:56 2026 +0500

    48124 feat(nginx): filtering spam requests (by domain and patch)

commit 42cd8a2ef7a0f501f2f5b5d4bb7c5e6919f427ec
Merge: 911cec6c b9724173
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Mon Jul 13 18:24:17 2026 +0400

    Merge pull request #264 from pneumaticapp/frontend/errors/47991_show_permission_denied_banner_for_403_response_status

    47991 frontend [ errors ] Show "Permission denied" banner for 403 response status

commit 911cec6ca0a2c5b8525a4de929416bffb02ed198
Merge: 98a2907c 83d58ee6
Author: Joseph Vreeken <Joseph.Vreeken@pneumatic.app>
Date:   Fri Jul 10 15:55:20 2026 +0500

    Merge pull request #265 from pneumaticapp/backend/docker/restore_dockerfile

    hotfix(docker): restore backend Dockerfile

commit 83d58ee690eb04a87c7cd7e2a122b51094c64daa
Author: joseph.vreeken <joseph.vreeken@pneumatic.app>
Date:   Fri Jul 10 15:50:16 2026 +0500

    hotfix(docker): fixed postgres host for backend  development

commit 47c13e07ba6b8162b298872ffa6f5183b33bf8fc
Author: joseph.vreeken <joseph.vreeken@pneumatic.app>
Date:   Fri Jul 10 15:30:26 2026 +0500

    hotfix(docker): restore backend Dockerfile

commit b9724173496606c501ba3d218bcd62504eef75f3
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Fri Jul 10 13:09:36 2026 +0400

    47991 fix(errors): show DRF detail in banner instead of UNKNOWN_ERROR

commit 98a2907c1c52ee70371952f59fcdd883bb897e4e
Merge: 337b8ad5 93938d58
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jul 8 16:21:51 2026 +0500

    Merge pull request #254 from pneumaticapp/backend/highlights/44521__use_new_group_performer_events

    44521 backend [ Highlights ] Use new group performer events

commit 337b8ad54319ed0861c0af061bf4d33963f8b74d
Merge: 53452870 6d9990d1
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jul 8 16:21:00 2026 +0500

    Merge pull request #252 from pneumaticapp/backend/websockets/47498__add_missing_data_websockets

    47498 backend [ websockets ] Add missing data to WebSocket events (user, group, event)

commit 93938d5805dd297c26ad5f4b48909bc04b49264b
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Mon Jul 6 03:21:08 2026 +0500

    44521 fix(reports): add target_group_id to highlights SQL query

commit eb622439e31dda69c8c72f5ed2d0b14b624bbc37
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri Jul 3 17:25:21 2026 +0500

    44521 feat(highlights): add performer group events to highlights feed

commit 6d9990d1f4b87f4aef3a922bf1781964549b303a
Merge: cefd0d38 7c48e129
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Jul 2 06:56:12 2026 +0500

    Merge branch 'backend/websockets/47498__add_missing_data_websockets' of https://github.com/pneumaticapp/pneumaticworkflow into backend/websockets/47498__add_missing_data_websockets

    # Conflicts:
    #	backend/src/accounts/services/user.py

commit cefd0d38aab4aa24a754dc8be15dc6b0e17878c1
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Jul 2 05:14:42 2026 +0500

    47498 feat(accounts): add WebSocket notifications for user lifecycle events

commit 7c48e129c5e82bef9f5af9b06dcfeb5cc4d891d2
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Jul 2 05:14:42 2026 +0500

    47498 feat(accounts): add WebSocket notifications for user lifecycle events

commit 534528701246d9604556e5eaa401299424156c2c
Merge: 727562a4 0d21f833
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Wed Jul 1 16:11:35 2026 +0400

    Merge pull request #251 from pneumaticapp/frontend/errors/47817__remove_technical_error_information_from_the_banner

    47817 frontend [ errors ] remove technical error information from the banner

commit 0d21f8331802e20b9da3389f499f0b27a7c2dd10
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Wed Jul 1 15:23:35 2026 +0400

    47817 fix(errors): prevent technical JSON/HTML from leaking into user-facing error toasts

commit 727562a4957224f19a1eec3823f49297a50e7381
Merge: 0a02a3bd 4445de77
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jul 1 14:05:21 2026 +0300

    Merge pull request #250 from pneumaticapp/frontend/test/47820__fix_test

    🔧 47820 frontend [ tests ] Fix tests

commit 4445de77c6609a3d4bc47526ed78adb9f81abb62
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jul 1 13:58:21 2026 +0300

    47820 test(EditableField): improve click handling tests for caret positioning

    Refactor tests to directly set the field reference in the EditableField component, enhancing the simulation of click events and ensuring the caret is positioned correctly. This change improves the reliability of the tests by removing reliance on mocked refs.

commit 0a02a3bdcb779dff7dd33af1d43525d4bee2a70e
Merge: d99dc430 f72590f9
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jul 1 12:25:33 2026 +0300

    Merge pull request #248 from pneumaticapp/frontend/ui/23041__Kick_off_form_Design_review_comments

    [frontend] Kick off form - Design review comments

commit f72590f91aa158a3b1a74c65e280aedb3ce455a9
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jul 1 00:47:13 2026 +0300

    test(RichText): enhance tests for markdown image rendering and entity type resolution

    Add a test to verify that markdown image syntax renders correctly as a document attachment without displaying an image. Update the entity type resolution logic to ensure it correctly identifies attachment types based on filename, improving handling of links without extensions.

commit d0575b433836fa9e1bba4c1a6b06d8caf93c74a3
Merge: 6dd2f775 d99dc430
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jul 1 00:39:17 2026 +0300

    Merge branch 'master' into frontend/ui/23041__Kick_off_form_Design_review_comments

commit 6dd2f775f81893161087f59d445c0bdd2df5462e
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jul 1 00:36:58 2026 +0300

    23041 test(RichText): add tests for markdown image rendering and entity type handling

    Introduce tests to verify rendering of standard markdown images and document attachments based on entity types. Ensure images are displayed correctly without links for standard markdown and that document attachments are rendered as text when specified.

commit ef5eff25cbd68ec61ed87a0cc6c83eb570aa3dfc
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 20:49:03 2026 +0300

    style(Attachments): add gap between document attachments in list

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 3621494b4e2b54123b008f76bc61eee1e964bd71
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 20:49:02 2026 +0300

    test(RichText): cover escaping, hooks, and file-service attachments

    Add regression tests for mention brackets, HTML escaping, stable hook order,
    embed URLs, and filename-based attachment rendering.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 4d7525b02cac4b4dbbeb520bf3784eb6b9555608
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 20:48:59 2026 +0300

    fix(RichText): harden linkify and embed video URL matching

    Skip URLs inside existing anchor tags and avoid global regex state when
    extracting YouTube and Loom embed IDs.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit ec137f04f75d79353dc4f16e6bd8d90d0acb495e
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 20:48:51 2026 +0300

    fix(RichText): escape mentions and raw HTML in plain-text mode

    Support escaped brackets in mention names and prevent raw HTML injection
    when markdown mode is disabled.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 464d0ba1af5150792f23875b970b9bfac5015a55
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 20:48:40 2026 +0300

    fix(RichText): resolve attachment type from link filename

    Use filename extension when URL has no extension so file-service links
    render as images or documents instead of plain anchors.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 53324aa3d6fe1d576a1c30c96d276467d46dbc83
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 20:48:31 2026 +0300

    fix(RichEditor): add getAttachmentEntityTypeByFilename helper

    Map attachment entity type from link text when the URL has no file extension,
    which is required for file-service links in RichText rendering.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 0588918d23594303c83cb745c6c831fd4cba37dd
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 20:48:20 2026 +0300

    chore(tsconfig): enable esModuleInterop and migrate CJS default imports

    Align Jest, webpack, and Storybook module interop so default imports work
    consistently for CommonJS packages like markdown-it and classnames.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 8335930bd065bed32932a809355d8b3a66696dfe
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 18:00:08 2026 +0300

    23041 fix(WorkflowModal): truncate workflow description with maxLines

    Pass maxLines={5} to RichText so long workflow descriptions collapse with
    a more-link in the modal popup.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit b5de19b8ae1520eb43945c75db6cbb1cd10be18a
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 17:59:38 2026 +0300

    23041 fix(SideModalCard): remove hover background override

    Drop the hover state that forced a white background and reset title color,
    which conflicted with the kick-off form design review.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 7fd5fa06411f4695bf124861172b3b8286f4cbba
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 17:59:09 2026 +0300

    23041 fix(Attachments): improve document filename truncation

    Use RTL ellipsis trick with nested span so long filenames truncate from the
    middle while keeping the file extension visible in narrow containers.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 99f9ad038bfd38ed98a0c2c320d6fa2116c46110
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 17:59:03 2026 +0300

    23041 chore(RichText): extend Storybook with long overflow content

    Add long filenames and checklist labels to stories for visual regression
    of text truncation and line-clamp behavior.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 3d6e739300bd4c6f5bd019761fc9c96a9d8b655f
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 17:58:56 2026 +0300

    23041 refactor(RichText): adopt BEM classes and improve truncation UX

    Restructure checklist, progressbar, and collapse styles with BEM naming.
    Move RichTextMoreLink to components/, replace anchor with button, and fix
    more-link overlay positioning for line-clamped content.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 0b31614a1fd1f6b1839e8f59c0cbfb8634de86fd
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Tue Jun 30 17:57:51 2026 +0300

    23041 refactor(RichText): simplify markdown-it and DOMPurify imports

    Replace namespace import workarounds with default imports now that module
    resolution is consistent across the build toolchain.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 842518dc3eab6aafdb055ac87b89af4b791e2686
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Mon Jun 29 22:12:58 2026 +0300

    23041 fix(ui): improve global media sizing and export menu label

    Cap img/video width globally and capitalize workflows export menu text.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 3adeca36d007f0d0c39a84fe79b27a9563ee5eb0
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Mon Jun 29 22:12:57 2026 +0300

    23041 chore(frontend): remove unused whatwg-fetch polyfill

    fetch is natively supported in all target browsers.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 0f01e6d21c1b66f597a811df05c4945dd82cf48a
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Mon Jun 29 22:12:52 2026 +0300

    23041 feat(RichText): extend Storybook with interactive checklist stories

    Add InteractiveRichText helper with local state for checklists and
    progress bars without API calls in Storybook.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 8a43c1a22efbf4738cfd5ae085120e451555aa92
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Mon Jun 29 22:12:35 2026 +0300

    23041 feat(RichText): migrate from remarkable to markdown-it with DOMPurify

    - Replace Remarkable renderer with markdown-it plugins (mentions, variables,
      links, checklists, linkify)
    - Sanitize rendered HTML via DOMPurify instead of xss-filters
    - Refactor embed video HTML with video-container wrapper
    - Remove whatwg-fetch and xss-filters dependencies
    - Fix mentions regex and checklist renderer closing tag

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 872a7f47b9558b7ec7b61ea2852271d4ae40b03d
Merge: 85e85c2c 300432c1
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Mon Jun 29 17:18:32 2026 +0300

    23041 Merge branch 'master' into frontend/ui/23041__Kick_off_form_Design_review_comments

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit d99dc4303f3baf8b4cfbd75b9b507e47ed8027fd
Merge: ac3c02aa d5ddd8e7
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 30 16:14:40 2026 +0500

    Merge pull request #247 from pneumaticapp/backend/attachment/47800__fix_import_fileattachment

    47800 backend [ attachment ] fix import FileAttachment

commit d5ddd8e7cd514f179ff81aee1237c0208cf4b432
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 30 16:11:24 2026 +0500

    47800 fix(tasks): remove merge-artifact prefetch causing 500

commit ac3c02aa66c4c061f1cdabc3f936c3a6c1b84498
Merge: 300432c1 5fa01bc9
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 30 13:56:39 2026 +0500

    Merge pull request #53 from pneumaticapp/41526__create_file_service

    41526 Storage [Backend] Create a file service

commit 85e85c2c356d129eb66a847c4e1bd49f85358052
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Mon Jun 29 17:16:13 2026 +0300

    23041 feat(RichText): add Storybook stories and improve rendering logic

    - Introduced Storybook stories for the RichText component, showcasing various text formats, including plain text, HTML, video links, and interactive checklists.
    - Removed outdated logic for rendering new lines in markdown to prevent appending trailing spaces to paragraphs separated by blank lines.
    - Added a test case to ensure paragraphs are rendered correctly without trailing spaces.

commit 5fa01bc9c2a73ddf1874e8c2111f2b76e1945c44
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat Jun 27 04:38:20 2026 +0500

    41526 fix(storage): fix GCS uploads failing for files

commit 1afe4feed7cb54f1e7d5892d5de5530b5bef09c3
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri Jun 26 18:42:19 2026 +0500

    41526 fix(backend): add SSL mode to file DB migration commands

commit 300432c169e446f6d9ee8fef92ad5442549b5503
Merge: e136f48a 08eb42e8
Author: Joseph Vreeken <Joseph.Vreeken@pneumatic.app>
Date:   Fri Jun 26 06:27:27 2026 +0500

    Merge pull request #245 from pneumaticapp/backend/accounts/47721__api_key

    ⚙️ 47721 backend [ accounts ] New API endpoint: get all account users

commit 08eb42e815badee36b9f95c0c26c34a35ead8939
Author: joseph.vreeken <joseph.vreeken@pneumatic.app>
Date:   Fri Jun 26 06:22:58 2026 +0500

    47721 fix(accounts): review fixes

commit 572ee57841d2961e253ebce2d0d2659f36fcdafd
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri Jun 26 02:36:20 2026 +0500

    41526 fix(storage): fix cookie domain and upload timeout

commit a0cf42e90274427a574aac80b6a39d2d734be333
Author: joseph.vreeken <joseph.vreeken@pneumatic.app>
Date:   Thu Jun 25 20:47:01 2026 +0500

    47721 feat(accounts): new endpoint GET /accounts/users/api-key

commit b6446f4b73329010e8fda5f41c43ff303b42334f
Merge: c9968416 359fb6d1
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 24 03:38:13 2026 +0500

    Merge branch '41526__create_file_service' of https://github.com/pneumaticapp/pneumaticworkflow into 41526__create_file_service

    # Conflicts:
    #	start.sh

commit c9968416b38674e97fd3d76eac590bc56d60abd3
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 24 03:09:15 2026 +0500

    41526 fix(start): auto-generate file-service credentials on first setup

commit 359fb6d1399e5d1f242d07ebe3056fecc221f21b
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 24 03:09:15 2026 +0500

    41526 fix(start): auto-generate file-service credentials on first setup

commit afcaf43327bc40ccf3e41c18ef1dc5c886f952d3
Merge: e7850574 e136f48a
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 23 22:52:01 2026 +0500

    Merge remote-tracking branch 'origin/master' into 41526__create_file_service

    # Conflicts:
    #	frontend/src/public/api/commonRequest.ts
    #	frontend/src/public/components/Workflows/WorkflowLog/WorkflowLogEvents/WorkflowLogTaskComment/WorkflowLogTaskComment.tsx
    #	frontend/src/public/redux/realtime/utils/mapWorkflowLogEventFromWs.ts
    #	frontend/src/public/redux/workflows/saga.ts
    #	frontend/src/public/types/workflow.ts

commit e7850574fe22d58f1d54fbe7fde55c8834858b82
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 23 16:34:35 2026 +0500

    41526 fix(storage): prevent RuntimeError on streaming download failures

commit e136f48ad3336d8c915f559ea8743b49c6ea8df6
Merge: 517dd277 f3ac87c1
Author: Artyom Maslov <artyom.maslov@aicarma.com>
Date:   Tue Jun 23 13:17:04 2026 +0300

    Merge pull request #244 from pneumaticapp/frontend/tests/47673__Fix_failed_tests

    47673 fix(tests): update RichText snapshots

commit 5f9d1c136e703363b57cd6fe8b969200a4b51891
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 23 06:21:43 2026 +0500

    41526 fix(storage): resolve migration constraints and standardize startup

commit f3ac87c1f7939226bc50fcfb3e352315d641038e
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Mon Jun 22 16:22:54 2026 +0300

    47673 fix(tests): update RichText snapshots

commit 517dd2774830475ca46d51b712449b2740c95c9a
Merge: 540870a0 573785a4
Author: Artyom Maslov <artyom.maslov@aicarma.com>
Date:   Mon Jun 22 14:26:49 2026 +0300

    Merge pull request #243 from pneumaticapp/frontend/tasks/47616_fix_incorrect_urgent_task_position

    47616 frontend [ tasks ] Insert urgent tasks after urgent block

commit 540870a03203fa030fa0fcac6e4cebd86f3b3ed7
Merge: 1090749c 601c5941
Author: Artyom Maslov <artyom.maslov@aicarma.com>
Date:   Mon Jun 22 14:26:23 2026 +0300

    Merge pull request #242 from pneumaticapp/frontend/tasks/47610_fix_updating_workflow_name_into_tasks

    47610 frontend [ tasks ] Update workflow names after rename

commit 1090749c507f3f3db7b9f112ae6b3adc371392c9
Merge: c703883c f44ff8d3
Author: Artyom Maslov <artyom.maslov@aicarma.com>
Date:   Mon Jun 22 14:25:19 2026 +0300

    Merge pull request #239 from pneumaticapp/frontend/workflows/47589__fix_completion_icon_in_highlights_section

    47589 frontend [workflows] Show workflow complete events as finished with ended icon

commit ce42e6f93adfd77eebcb82becd17e215cb5f526b
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sun Jun 21 15:43:50 2026 +0500

    41526 fix(storage): prevent redundant Set-Cookie on every response

commit 7d3d6d50c98b774c1ca91d6f78d0de0b841aa8fa
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sun Jun 21 14:58:27 2026 +0500

    41526 fix(nginx): increase client_max_body_size to prevent network error on 100MB uploads

commit 573785a46bd718b383d3b2d7424f573d1a5353f5
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Sat Jun 20 01:20:50 2026 +0300

    47616 fix(tasks): insert urgent tasks after urgent block

commit c703883ce6cba0366c163c16872ccb9f3d8cf13f
Merge: da2f07b9 853a445d
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 19 19:48:12 2026 +0300

    Merge pull request #198 from pneumaticapp/frontend/refactoring/8830__Layout_errors_on_the_template_creation_page

    8830 refactoring(styles): Layout errors on the template creation page

commit da2f07b9840976d34f2d651deb14b86e71903033
Merge: 22b787b7 734bd843
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 19 19:47:52 2026 +0300

    Merge pull request #241 from pneumaticapp/frontend/process/47594__Make_markdown_output_support_for_template_description

    47594 frontend [ process ] Make markdown output support for template description

commit 22b787b7a161277c7b3fba3536394d23bc60e8cf
Merge: 8d8769d6 d971733d
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 19 19:47:16 2026 +0300

    Merge pull request #240 from pneumaticapp/frontend/websocket/47593__Catch_errors_for_websockets

    47593 frontend [ websocket ] Catch errors for websockets

commit 601c5941277cb6264bcbd97a71b9930fa48253fb
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Fri Jun 19 17:45:18 2026 +0300

    47610 chore(tasks): extract workflow rename sync helper

commit 7214f563d108c04d46d4d1c77b44a999965f15ae
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Fri Jun 19 16:35:41 2026 +0300

    47610 fix(tasks): update workflow names after rename

commit 853a445d7405b2fc85998b72f056676c38b0f695
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 19 13:41:38 2026 +0300

    8830 refactor(ExtraField): remove unused inputClassName from kickoff field in ExtraFieldCreatable and ExtraFieldUser components

commit 0acee1d107d48b26855fb8954fb67715877a6479
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 19 13:36:37 2026 +0300

    8830 refactor(FieldWithName): remove unused layout effect and related logic

commit e012a7503126b2a1452479aab168af35e8d58724
Merge: 3a3ee10f 8d8769d6
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 19 13:31:04 2026 +0300

    Merge branch 'master' into frontend/refactoring/8830__Layout_errors_on_the_template_creation_page

commit 734bd843d24fdca9daf0cf1f290de21e6fbe1219
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 19 13:26:08 2026 +0300

    47954 fix(RichText): Enhance image loading error handling in useRichTextContainer

    - Added error handling for image loading in useRichTextContainer to remove loading class on image load failure.
    - Improved existing logic to ensure loading class is removed when images are fully loaded.

    These changes improve the reliability of image rendering in the RichText component.

commit 7382029d047e82e42b19f8be386560c79faa3977
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 19 13:21:42 2026 +0300

    47594 fix(RichText): Improve image loading handling and fix anchor tag closure

    - Refactored image loading logic in useRichTextContainer and useRichTextLineClamp hooks to enhance performance and reliability.
    - Fixed anchor tag closure in createAttachmentRenderer to ensure proper HTML rendering.

    These changes enhance the user experience by ensuring images load correctly and links function as intended.

commit d262e20dc57cf6cd96ffde481d56c77204774147
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 19 01:01:30 2026 +0300

    47594 feat(RichText): Enhance RichText component with new features and styling improvements

    - Added support for heading styles (h1-h6) in LexicalEditorContent.css.
    - Updated LexicalEditorContent.tsx to utilize combined markdown transformers for better formatting.
    - Refactored RichText.css to improve layout and styling, including margin adjustments and new class definitions for headings.
    - Introduced RichTextMoreLink component for expandable text functionality.
    - Implemented useRichTextLineClamp and useRichTextContainer hooks for better text handling and image loading.
    - Enhanced RichText component to render descriptions in WorkflowEditPopup and TemplateSystemCard using the new RichText component.
    - Added utility functions for preparing rich text HTML and rendering attachments.

    This commit improves the overall user experience by providing better text formatting and handling in rich text areas.

commit d971733deab260e628dbcff38f5d1933ba2d53de
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Thu Jun 18 21:13:27 2026 +0300

    47593 refactor(WebSocket): streamline WebSocket event handling and connection management

commit a7d066722ad6287cb0613d9c02a25e76eeb16993
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Thu Jun 18 21:09:27 2026 +0300

    47593 (websocket) Enhance WebSocket error handling: log errors for invalid messages and unhandled events

commit f44ff8d3f23ecde46d4910d13533988dc5482ed8
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Thu Jun 18 17:21:39 2026 +0300

    47589 fix(workflows): apply class name to workflow ended icon

commit 4bce46632c8ee58573b3f59b88a42fccfa847cbb
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Thu Jun 18 17:14:04 2026 +0300

    47589 fix(workflows): show workflow complete events as finished with ended icon

commit 8d8769d6719d928c97bbcf104d3a3116268a1a19
Merge: 87236998 26403bf8
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jun 17 16:50:31 2026 +0300

    Merge pull request #237 from pneumaticapp/frontend/ui/47561__Banner_in_the_Team_section

    🔧 47561 frontend [ UI ] Banner in the Team section

commit 26403bf84167ce13d42a75dbef15d6e11a173024
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jun 17 15:29:37 2026 +0300

    47561 refactor(AddGuestsBanner): rename local storage key to reflect groups functionality

commit a6854bbadc22596da081d96d0b44778e1a67c59a
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jun 17 15:25:33 2026 +0300

    47561 fix(links): update support article URLs to remove '/en' from paths

commit b9ae7460da53229886167e894cddf312dd80df08
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jun 17 15:24:35 2026 +0300

    47561 fix(Groups): reorder PageTitle component to improve layout

commit 872369985e833c31b0e927dfceec46619d2c9366
Merge: a1734c9d 7ca60b25
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jun 17 14:16:27 2026 +0300

    Merge pull request #233 from pneumaticapp/frontend/websockets/47328__Some_events_are_processed_incorrectly_in_websockets

    47328 frontend [ websockets ] Some events are processed incorrectly in websockets.

commit 7ca60b2517d0c22d56f53b2029e2c7e7df94f54c
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jun 17 14:06:03 2026 +0300

    47328 refactor(WorkflowLog): simplify user ID handling in comments and reactions

commit 1f6bcbc292a5632b95f3cf5c1fee7649bbae1fda
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jun 17 13:57:38 2026 +0300

    47328 fix(WorkflowLog): update comment reaction count to reflect reacted user IDs

commit d008efec19df58028246d75ad51448516cdfed40
Merge: 4850685d a1734c9d
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Jun 17 13:49:07 2026 +0300

    Merge branch 'master' into frontend/websockets/47328__Some_events_are_processed_incorrectly_in_websockets

commit a1734c9dca7ceeffe0e9a431c97071b84be514ce
Merge: 287c50d3 536fccf8
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Wed Jun 17 14:43:28 2026 +0400

    Merge pull request #236 from pneumaticapp/frontend/error/47550__fix_message_for_users

    47550 frontend [ error ] fix message for users

commit 536fccf8077773e398c790325cb84af800cdbae9
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Wed Jun 17 13:08:50 2026 +0400

    47550 fix(interceptor): remove technical JSON payload from InterceptorError message

commit 287c50d351cc9b30d4e19bb509797778477a1c3f
Merge: a8914df4 a6f54807
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Wed Jun 17 08:26:46 2026 +0400

    Merge pull request #234 from pneumaticapp/frontend/sentry/47518__19t_getuserpublic_failed_to_get_account_context

    47518 frontend [ sentry ] 19T (getUserPublic - failed to get account context)

commit a8914df4a52abe6108dc80278095699c854c26be
Merge: 6064c039 a55b3990
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Wed Jun 17 08:26:25 2026 +0400

    Merge pull request #235 from pneumaticapp/frontend/sentry/47490__18p_18r_19k_request_error

    47490 frontend [ sentry ] 18P, 18R, 19K (Request Error)

commit 53c7500b3d15b4f8bf6b753c51c67253d5d99e68
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 17 03:32:18 2026 +0500

    41526 fix(storage): update CSP test assertion

commit 30c69a9ac43241acb2fafcbb2f21a33030b7c3aa
Merge: 340324c6 6064c039
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 17 02:59:46 2026 +0500

    Merge remote-tracking branch 'origin/master' into 41526__create_file_service

    # Conflicts:
    #	frontend/src/public/api/commonRequest.ts

commit 340324c6e2d4a1b4e2b79cf90d6d5f2e4d49eb3a
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 17 01:45:02 2026 +0500

    41526 fix(workflow-log): restore Attachments tab after file-service migration

    - Add SVG and WEBP to IMAGE_FILE_EXTENSIONS for correct <img> rendering
    - Implement filename-based fallback in getLinkEntityType for UUID URLs
      that lack file extensions (customMarkdownPlugins.ts)
    - Create getAttachmentEntityTypeByFilename to classify attachments by
      extension (Image/Video/File/Link) as single source of truth
    - Replace duplicated IMAGE_EXTENSION_RE regex in parseMarkdownFiles.ts
      with canonical getAttachmentTypeByFilename function
    - Add comprehensive unit/integration tests for new detection logic

commit 54537700a2cee70109dc3b87f157087beb50bba0
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 17 01:02:32 2026 +0500

    41526 refactor(storage): migrate attachment model to scoped uniqueness

    - Add SVG and WEBP to IMAGE_FILE_EXTENSIONS for correct <img> rendering
    - Implement filename-based fallback in getLinkEntityType for UUID URLs
      that lack file extensions (customMarkdownPlugins.ts)
    - Create getAttachmentEntityTypeByFilename to classify attachments by
      extension (Image/Video/File/Link) as single source of truth
    - Replace duplicated IMAGE_EXTENSION_RE regex in parseMarkdownFiles.ts
      with canonical getAttachmentTypeByFilename function
    - Add comprehensive unit/integration tests for new detection logic

commit 6064c039521ffb3117dfb15552f3f02ff75d3f4b
Merge: bed21a10 ae93a07e
Author: Artyom Maslov <artyom.maslov@aicarma.com>
Date:   Tue Jun 16 12:40:15 2026 +0300

    Merge pull request #232 from pneumaticapp/frontend/workflows/47348__printed_view

    47348 feature(workflows): add printed workflow view

commit a55b3990214e129c428b68c3c61a61ef2a5b8bec
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Tue Jun 16 13:34:05 2026 +0400

    fix(sentry): prevent token leakage, deduplicate interceptor/catch logs with InterceptorError, downgrade expected error patterns to info

commit a6f548072a821ad2697f083f66622754268aabe9
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Tue Jun 16 09:11:22 2026 +0400

    47581 fix(forms): log 'Authentication credentials were not provided' as info in getUserPublic to suppress Sentry noise

commit fbf18a8f8aa526d82e7d6c71b4e53b722d1ea543
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 16 02:05:07 2026 +0500

    41526 fix(frontend): restore image preview for file attachments

    - Add SVG and WEBP to IMAGE_FILE_EXTENSIONS for correct <img> rendering
    - Implement filename-based fallback in getLinkEntityType for UUID URLs
      that lack file extensions (customMarkdownPlugins.ts)
    - Create getAttachmentEntityTypeByFilename to classify attachments by
      extension (Image/Video/File/Link) as single source of truth
    - Replace duplicated IMAGE_EXTENSION_RE regex in parseMarkdownFiles.ts
      with canonical getAttachmentTypeByFilename function
    - Add comprehensive unit/integration tests for new detection logic

commit 67a9f3d3851f151885320e0adb1172cf633bc318
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Mon Jun 15 22:43:33 2026 +0500

    41526 refactor(storage): replace flat config with class-based settings hierarchy

    Migrated from single Settings class with 7 scattered CONFIG string checks to BaseAppSettings -> TestingSettings / DevelopmentSettings / ProductionSettings class hierarchy.

    Changes:

    - config.py: class-based inheritance with environment-specific flags (HSTS_ENABLED, RATE_LIMIT_ENABLED, RELOAD, WORKERS)

    - main.py: removed all CONFIG string comparisons, docs always enabled, added root_path derived from FASTAPI_BASE_URL

    - security_headers.py: CSP updated to allow Swagger/ReDoc CDN resources

    - DI container + API: Settings -> BaseAppSettings type hints

    - Tests: CONFIG=Testing in conftest, updated imports

commit ae93a07e05e4e461604fb4cf917e62ef853925cc
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Mon Jun 15 15:54:26 2026 +0300

    47348 fix(workflows): improve workflow print mode

commit 7a498d4ae7e4d9ea84508dae0280269da81fdc6f
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Mon Jun 15 16:59:15 2026 +0500

    41526 fix(migrations): resolve conflicting migration numbering after merge

commit 281631e0e6014b4af8253f6d9c949680ea26dda0
Merge: bd86f4d6 8845a1ef
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Mon Jun 15 16:13:51 2026 +0500

    Merge branch 'master' into 41526__create_file_service

commit 1c9a38b69700794df2264f8bcbf8752fa5ce822c
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Mon Jun 15 02:06:44 2026 +0300

    47348 fix(workflows): improve workflow modal print layout

commit bd86f4d635fc2b02ef5a61ea4d067531d8dafce4
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sun Jun 14 06:03:38 2026 +0500

    41526 chore(file-service): harden docker config and clean up service metadata

commit a924194bdcc79c0ab6c5e0f2850fb26076b3a351
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sun Jun 14 04:44:58 2026 +0500

    41526 feat(storage): add public template support for file access permissions

commit 4850685d96d82ae5d939e21ddc3c8c39af1242a1
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 12 21:17:02 2026 +0300

    47328 test(realtime): add unit tests for WebSocket utility functions

    Cover isWorkflowEndedEventType, mapWorkflowLogEventFromWs and
    unwrapNotificationCreated envelope handling.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 5712c61728603f0bd7a2dea8debc32c7e08fbc46
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 12 21:16:55 2026 +0300

    47328 fix(ui): resolve watch list rendering and TaskCard invalid markup

    Use getUserById for comment watchers instead of nested UserData render prop,
    add missing React keys, replace p with div for RichText block content.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 4f5c760a57b355a21ee52ae1e9febb5812b170c3
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 12 21:16:38 2026 +0300

    47328 refactor(realtime): extract WS event routing into dedicated module

    Move routeRealtimeEvent out of watchWsEvents, handle user/group/task/notification
    and workflow log events in one switch, remove completed tasks on workflow end.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit dc4f16fca5d585a55dbc69af003c9dccc1dcae8b
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 12 21:16:30 2026 +0300

    47328 feat(accounts): sync users from WebSocket events

    Add upsertUserFromWs and removeUserFromWs reducers to keep users and team
    lists in sync when user_created/updated/deleted events arrive.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 6f546bb9e1a80a7b595a510b0bc4f661888024bb
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 12 21:16:10 2026 +0300

    47328 refactor(groups): migrate groups store to RTK slice

    Replace legacy actions/reducer with createSlice, add upsertGroupFromWs and
    removeGroupFromWs handlers, redirect from deleted group page via getRouteParamId.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 80a1c1b9f0549d96732df6484be55ec92688b2f6
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 12 21:16:04 2026 +0300

    47328 fix(realtime): correct WS mappers for notifications and workflow log

    Use backend IWorkflowLogItem shape directly for event_created/updated,
    route notifications through notification_created envelope with snooze_workflow
    rename and complete_task support, fix task_created date field mapping.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit 75b37e6734d8c03195e390cfb923584387bd4374
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Jun 12 21:15:56 2026 +0300

    47328 refactor(realtime): consolidate WebSocket payload types into types.ts

    Move all WS envelope and data interfaces from wsPayloads.ts into types.ts,
    introduce ERealtimeEnvelopeType enum and notification_created envelope shape.

    Co-authored-by: Cursor <cursoragent@cursor.com>

commit fb3f7eaf2a8fea340fe5bafa9706187842f46344
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri Jun 12 07:06:14 2026 +0500

    41526 fix(infra): extract file-service proxy, replace named volumes with host binds

commit 5085be1a9a4350a420eef47be886434efc137556
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri Jun 12 04:12:17 2026 +0500

    41526 refactor(storage): remove legacy STORAGE feature flag and env vars

commit e7d52e091cc81107b03814f59c431da6a9bf55f3
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Wed Jun 10 23:14:58 2026 +0300

    47348 fix(workflows): adjust workflow print styles

commit 7fcad0bea338d237a32186d89e6979f90c80babb
Merge: c03d06f5 5ece484e
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Jun 11 00:22:16 2026 +0500

    Merge branch '41526__create_file_service' of https://github.com/pneumaticapp/pneumaticworkflow into 41526__create_file_service

commit c03d06f5561fc227f90a6537bc6c435d855c85a6
Merge: 496b9106 c487fddf
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Jun 11 00:02:31 2026 +0500

    Merge branch '41526__create_file_service' of https://github.com/pneumaticapp/pneumaticworkflow into 41526__create_file_service

commit 5ece484ed232392acb3bc7fa8ae80c8f48eb71f8
Merge: 496b9106 c487fddf
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Jun 11 00:02:31 2026 +0500

    Merge branch '41526__create_file_service' of https://github.com/pneumaticapp/pneumaticworkflow into 41526__create_file_service

commit 496b9106011b44fdc2b49cf3b839046b24d85f4b
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 10 23:41:59 2026 +0500

    41526 feat(nginx): add Railway-specific reverse proxy config

    - Add Dockerfile, entrypoint, and nginx.conf for Railway single-port deployment
    - Regex-based path routing: API to backend, /files/ to file-service, /ws/ to WebSocket
    - Dynamic DNS resolver via /etc/resolv.conf for Railway internal networking
    - Private backend server on port 80 for frontend SSR proxy calls
    - Add .gitattributes to enforce LF line endings for shell scripts
    - Add guard for missing DNS resolver in entrypoint (fail fast)

commit c487fddf974794f32eb040412307fea9c306d742
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 10 23:41:59 2026 +0500

    41526 feat(nginx): add Railway-specific nginx reverse proxy config

commit 6a5c2b41601513c57d3a3c45b084f302bcce50e2
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 10 18:37:35 2026 +0500

    41526 fix(workflows): remove invalid prefetch causing 500 on workflow detail

commit ba71c0de67173ec7a59bb9b9b7f8c2a0093bb2e6
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 10 03:26:53 2026 +0500

    41526 fix(storage): sort URL mapping by key length and fix file service URLs

commit 099e5f36bf3fc0228c82ad268a73e4440992d249
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Wed Jun 10 00:52:53 2026 +0300

    47348 fix(workflows): hide app during workflow printing

commit 9f6b16a40152d3c87155818c8c741731065faa74
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Wed Jun 10 00:47:08 2026 +0300

    47348 fix(workflows): scope workflow print styles

commit 85d9febda15137b7ae6bd53606ef6c6712a60f86
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 10 02:35:46 2026 +0500

    41526 feat(storage): redirect browser to login on unauthenticated file access

commit d2f4d89a038001b4b2c5eb33e839c7505359231a
Author: aicarma-artyom-maslov <artyom.maslov@aicarma.com>
Date:   Tue Jun 9 23:31:38 2026 +0300

    47348 feature(workflows): add printed workflow view

commit 3bbbe9df11f3a94d6e3fb1edf35f3e730cec5af0
Merge: 8d60fb5b 72553ad6
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 9 22:02:35 2026 +0500

    Merge branch '41526__create_file_service' of https://github.com/pneumaticapp/pneumaticworkflow into 41526__create_file_service

commit 8d60fb5ba377ebc866edccf0dff4179cac0ba622
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 9 20:23:19 2026 +0500

    41526 fix(storage): handle non-ASCII file_id in URLs and regex extraction

    - Accept str instead of uuid.UUID in FastAPI download route to support
    legacy file_ids (migration creates string-based identifiers, not UUIDs)
    - Add . and %% to regex character class and extend max length from 64
    to 512 for URL-encoded cyrillic file_ids
    - Apply unquote() after regex extraction so encoded file_ids match
    decoded values stored in DB
    - URL-encode file_id with quote() in replace_storage_links migration
    to produce valid markdown-compatible URLs
    - URL-encode file_id in get_file_service_file_url for API responses
    - Add comprehensive tests for all fixed paths

commit 72553ad62acb98d14e91c6f29f0c3c9daf61b039
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 9 20:23:19 2026 +0500

    41526 fix(storage): handle non-ASCII file_id in URLs and regex extraction

    - Accept str instead of uuid.UUID in FastAPI download route to support
    legacy file_ids (migration creates string-based identifiers, not UUIDs)
    - Add . and %% to regex character class and extend max length from 64
    to 512 for URL-encoded cyrillic file_ids
    - Apply unquote() after regex extraction so encoded file_ids match
    decoded values stored in DB
    - URL-encode file_id with quote() in replace_storage_links migration
    to produce valid markdown-compatible URLs
    - URL-encode file_id in get_file_service_file_url for API responses
    - Add comprehensive tests for all fixed paths

commit 34ccf8b73e5a9543237d7936a05888693af3d3a3
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 9 06:13:04 2026 +0500

    41526 fix(storage): sync file permissions on performer changes

commit 7b3cf322052914f282e1067fe1cebbb984f7591d
Merge: 9e9569c1 e8ee4b23
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 9 03:53:59 2026 +0500

    Merge branch '41526__create_file_service' of https://github.com/pneumaticapp/pneumaticworkflow into 41526__create_file_service

commit 9e9569c1d181924965e08e9bc9bcfa20f3c23eef
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 9 02:31:20 2026 +0500

    41526 fix(error-handling): unify File Service error mapping across frontend and backend

commit e8ee4b233d959c1f79b50d239d164660d6048df2
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 9 02:31:20 2026 +0500

    41526 fix(error-handling): unify File Service error mapping across frontend and backend

commit 76c6e9fda269aabec0f23d2a5970fe01a9b17d1a
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 9 00:31:28 2026 +0500

    41526 fix(storage): cookie auth mismatch, debug mode bug, review cleanup

commit b69479e384ac2a15f78d2dc5489f40970587b69f
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Mon Jun 8 22:17:13 2026 +0500

    41526 fix(auth): allow public/embed token auth in file service

commit 9d26471c8849dce824530725f8f923af7c4369e3
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Mon Jun 8 20:04:27 2026 +0500

    41526 fix(file-service): harden CORS, infrastructure, and error handling

commit 7f92bc115a81f7a985cfdad413ce5e591d7eaeac
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat Jun 6 21:16:41 2026 +0500

    41526 feat(file-migration): add guardian permissions and comprehensive tests

commit e94ca02a2d6ff08fba12f2c2a67b3855d3c9fad3
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat Jun 6 06:30:51 2026 +0500

    41526 fix(file-service): address review findings across security, performance, and migration

commit f6dab7abe55c3075b6556149774b5dcf9c56bf2b
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri Jun 5 04:04:39 2026 +0500

    41526 refactor(files): replace attachment IDs with markdown links, remove legacy attachment API

commit 69e9f701d04cf8bba18bdbc0833f1c85181b1acd
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Jun 4 23:39:47 2026 +0500

    41526 docs(config): add File Service env vars to default.env

commit 5d6c9dcc8cbc726b828aeeabde5da9b38a959f6b
Merge: 4ff96088 fb529730
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Jun 4 23:19:29 2026 +0500

    Merge branch 'master' into 41526__create_file_service

    # Conflicts:
    #	frontend/src/public/redux/workflows/saga.ts

commit 4ff960889e1f5078db970fd0481a0899ab7d521b
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Jun 3 05:16:17 2026 +0500

    41526 refactor(infra): migrate file service to subpath routing and stabilize tests

commit 241e27206849b6e5edbe25eb963dc705d4372455
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 2 22:05:35 2026 +0500

    41526 fix(storage): harden security and clean architecture violations

commit 99ec169a8efb582012fbf64c6c343e19a67ead44
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 2 14:22:25 2026 +0500

    41526 fix(nginx): add file-service upstream and server block to ssl_forms_templates

commit 7b1970629fa0a8cb01ac3ced0174b4c6c000d56d
Merge: f6b1bb98 6be75e74
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Jun 2 06:36:26 2026 +0500

    merge: resolve conflicts from master merge

commit f6b1bb98db2c50a4dc9ced87b1b48c90d73cecf4
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat May 30 06:35:27 2026 +0500

    41526 fix(accounts): reset user photo on upload failure and fix linting exclusions

commit 69273e4f7e6a5bde8c292c38e6acfaee7460291d
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat May 30 06:17:15 2026 +0500

    41526 fix(storage): resolve code review comments and resource leaks

commit 21b5545d6e0a7361b234a3976f6ff41a9d215050
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat May 30 05:36:27 2026 +0500

    41526 fix(storage): fix db connection leak and range header handling

commit 65e21eda0d7d7ce116cbbcf1a31499114084430e
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat May 30 05:20:40 2026 +0500

    41526 chore(repo): unify pre-commit configs, fix linter errors, and patch critical bugs

    - Pre-commit: Merge backend/ and storage/ configurations into a single root .pre-commit-config.yaml to streamline the development workflow.
    - Storage (Bug): Fix HTTP 416 behavior on invalid Range requests to prevent negative Content-Length calculations.
    - Storage (Refactor): Resolve over 300 ruff and mypy violations. Migrate enums to StrEnum, update imports to collections.abc, and enforce safe dict casting for Redis token payloads.
    - Storage (Config): Update ruff.toml to ignore docstrings (D), boolean traps (FBT), and test secrets (S) strictly within the test directory.
    - Backend (Bug): Prevent DB connection leaks in sync_files_to_file_service by explicitly closing the cursor and connection on early exit.
    - Backend (Bug): Add a conditional guard (old_photo != new_photo) before calling sync_account_file_fields in the user update view to prevent unnecessary database queries.
    - Tests: Add unit and E2E tests covering the Range header logic, DB connection closure, and the file sync behavior.

commit afb4945df8a54237be09d8cc2db11bc6c547ea73
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat May 30 04:47:33 2026 +0500

    41526 fix(core): address code review issues across accounts, processes, and storage

commit 76e1e3cb825118f9bfe2fc155559634e4427df1f
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat May 30 04:15:04 2026 +0500

    41526 refactor(tests): enforce unit-test and code review standards

commit 76fe78254915f12027b6d74f829911957e875fce
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat May 30 03:16:58 2026 +0500

    41526 refactor(storage): rewrite unit tests

commit 7e664a2908ff083dd6f3ae839231029587dad2a2
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Sat May 30 02:48:27 2026 +0500

    41526 feat(storage): harden security, improve performance, and expand test coverage

    Security:
    - Add Content-Type sanitization (XSS prevention via MIME whitelist)
    - Add SecurityHeadersMiddleware (OWASP headers, HSTS in production)
    - Add RateLimitMiddleware (sliding window per IP, 10 uploads/60s)
    - Add X-Content-Type-Options: nosniff to download responses
    - Remove insecure default for DJANGO_SECRET_KEY (now required)
    - Fix DenyPublicToken returning True for anonymous users
    Performance:
    - Cache PBKDF2 token hashing with LRU (256 entries), run inline
    - Use StorageServiceHolder singleton (avoid re-creating S3 clients)
    - Use lru_cache for RedisAuthClient singleton
    - Add explicit HTTP client timeouts (30s total, 10s connect)
    - Set SQLAlchemy echo to 'debug' level in DEBUG mode
    - Pre-compile regex patterns in secure_filename
    Resource management:
    - Add graceful shutdown for StorageService, Redis, and HTTP client
    - Add RedisAuthClient.close() with cache clearing
    Code quality:
    - Improve secure_filename to preserve Unicode (Cyrillic, CJK)
    - Move mypy suppression from module-level to per-line in mapper
    - Use Field(default_factory=dict) for GuestToken.payload
    - Extract error messages to variables (TRY003 compliance)
    - Add StorageError.delete_failed() factory method
    - Handle anonymous user_id in FileAccessDeniedError
    Tests:
    - Add 7 new test modules (config, content_type, guest_token,
      permissions, rate_limit, secure_filename, security_headers,
      storage_holder)
    - Expand token_auth tests (PBKDF2 cache, inline execution, errors)
    - Expand redis_client tests (close, cache clearing)
    - Expand exception tests (new error codes, edge cases)
    - Expand http_client tests (timeout, connection errors)

commit 4a2aeb26b9129a1b02dbca9f7e1880a8cac3715c
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri May 29 07:19:17 2026 +0500

    41526 fix(storage): block pickle deserialization RCE

commit 36398e71551e507c2893de22696cb027a9503e93
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri May 29 05:59:35 2026 +0500

    41526 fix(file-service): improve sync reliability and test coverage

commit dbcf7dd01d8b6a4c0d501289c2efb8ac279a7052
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu May 28 19:24:57 2026 +0500

    41526 refactor(frontend): remove comment attachments from API, fix test fixtures and field serializer

commit 3dfa00f0184fd2ef65e19dea739e1eb575efab58
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed May 27 09:25:53 2026 +0500

    41526 feat(storage): migrate file service to path-based routing and harden API

commit 316d0b86e6594cf233b412b74df7e6586eca77b8
Merge: 2b43acf3 2915748e
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed May 27 03:05:26 2026 +0500

    Merge branch 'master' into feature/file-storage-service

commit 3a3ee10fdc8043d1513e25c9fba7768c6b0dfb1f
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Fri Apr 10 11:18:38 2026 +0300

    8830 style: Enhance FieldWithName component and KickoffRedux styles for improved layout and debugging

commit 21cfd021026648ee36c411fc36b9c020753462d4
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Apr 8 16:46:59 2026 +0300

    8830 style: Add text-small mixin to kickoff-create-field-add-option in Checkbox, Creatable, and Radio components

commit de83dda06dd05c46ee891c9b3b6e29474045a796
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Apr 8 16:26:08 2026 +0300

    8830 style: Simplify padding and positioning in ExtraFieldCheckbox and KickoffRedux styles

commit 9cf596ad4db46524a878fc74b40e9c0f2c8468e8
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Apr 8 15:56:26 2026 +0300

    8830 style: Consolidate margin-top styles for label elements in KickoffRedux.css

commit 648605f30e602ebf3f0387bf854fdc2c2ee2af1e
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Apr 8 15:49:49 2026 +0300

    8830 style: Update ExtraField styles by adding margin-top to kickoff-create-field-options and removing redundant kickoff-dropdown-field margin

commit 065cb5f8c53387eab6d0b5d9e8919ce7249ff816
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Apr 8 14:32:34 2026 +0300

    8830 refactor(TaskForm): Remove title prop from TaskDescriptionEditor and TaskForm components for cleaner code

commit c4c158afbed6922339ea8764f6f58c82a59bc023
Author: Cedric Illya <ilya.cedrik@pneumatic.app>
Date:   Wed Apr 8 14:24:19 2026 +0300

    8830 refactor: Enhance task view styling: Add text overflow handling for description elements in TemplateEdit.css

commit 2b43acf33396812619f9f6333eb736999334e075
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri Mar 13 02:53:08 2026 +0500

    41526 fix(attachment): fix Microsoft authentication service with Graph API integration and shared error codes.

commit 17b06644eeeecbdb3ac8329e3fbe282b0ec50548
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri Mar 13 01:48:29 2026 +0500

    41526 fix(attachment): fix user update and attachment management services, alongside new tests and a Docker Compose configuration.

commit 2c5f970a19ae1df06e10cdbe7fe6e854b884c326
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Mar 12 23:11:49 2026 +0500

    41526 feat(attachments): Implement a new file storage service with a dedicated Attachment model and migration commands for existing attachments.

commit f087c3fceca63f1b4593b8b2daff9a97e1a8ef7b
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Mar 11 17:44:37 2026 +0500

    41526 fix(tests): fix migration and tests

commit c13c36aa8d931c2e797638ebbcfc0b20aff72a48
Merge: af437247 25fd6623
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Mar 11 15:38:32 2026 +0500

    Merge branch 'master' into 41526__create_file_service

    # Conflicts:
    #	backend/docker-compose.yml
    #	backend/src/accounts/services/user.py
    #	backend/src/accounts/tests/views/test_user/test_update.py
    #	backend/src/accounts/views/user.py
    #	backend/src/processes/enums.py
    #	backend/src/processes/models/workflows/attachment.py
    #	backend/src/processes/tests/fixtures.py
    #	backend/src/processes/tests/test_services/test_attachments.py
    #	backend/src/processes/tests/test_services/test_workflows/test_workflow_version_service.py
    #	docker-compose.src.yml
    #	docker-compose.yml
    #	frontend/docker-compose.yml

commit af43724755d9fe358986935123c17ac2eea8397a
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Feb 25 04:51:13 2026 +0500

    41526 refactor(tasks): Wrap attachment retrieval in a transaction to ensure atomicity

commit 3423399390a6092b7b29c3ea4acc4aabf5d58409
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Feb 25 03:38:05 2026 +0500

    41526 refactor(account): Optimize logo sync logic by preventing unnecessary calls and add tests for logo update scenarios

commit 7068a7c3855e9946fe3e1744410eb7707a13d775
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Feb 25 03:10:02 2026 +0500

    41526 fix(docker, authentication): Correct ALLOWED_ORIGINS, improve user photo upload logic

commit c4ea917b02ee614a1a8853a17e7eb806281db8dc
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Feb 25 01:58:14 2026 +0500

    41526 refactor(forms, admin): Simplify exception handling by removing redundant FileServiceConnectionException imports

commit da63083300d11328624f661cfd7056cb941a9c9f
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Feb 25 01:14:40 2026 +0500

    41526 feat(authentication): Enhance photo update process to sync account file fields

commit 6dd89efd61cd5b395e3a639843f5af3deb409006
Merge: 1ffc20c7 b9f359a3
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Feb 24 16:39:30 2026 +0500

    Merge branch '41526__create_file_service' of https://github.com/pneumaticapp/pneumaticworkflow into 41526__create_file_service

commit b9f359a375bb1e59e45161f25a0c1ef8d851eaeb
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Fri Feb 20 11:21:52 2026 +0400

    41526 refactor(fileservice): change file name

commit 1ffc20c7dade90103532cd9a5f121a12d254d8b3
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Feb 19 23:33:30 2026 +0500

    41526 feat(attachments): Add kickoff description handling for workflows and templates

commit a12df909529f3e2b1bbc088499ac5337f68dfb1b
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Thu Feb 19 15:13:07 2026 +0400

    41526 feat(upload): Switch all attachment upload calls to the new function

commit 47e9b41db7f74d69c83f8294431e29fa81858199
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Thu Feb 19 00:54:02 2026 +0500

    41526 fix(docker): Update ALLOWED_ORIGINS in docker-compose files

commit 672e522a1cb2c9d24ef65aeb5b2d403e8147c7a8
Merge: 93557ff3 c12db45e
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Feb 18 18:47:31 2026 +0500

    Merge branch 'master' into 41526__create_file_service

commit 93557ff3b73a07ed6bc498ff1d74472ee6020a37
Merge: 2b9dd71e 2de8b2e0
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Wed Feb 18 15:16:42 2026 +0400

    Merge branch '41526__create_file_service' of github.com:pneumaticapp/pneumaticworkflow into 41526__create_file_service

commit 2b9dd71ec2ef5e1ee87dd396a5bf28a7d4d9bdf5
Author: Maria Lordwill <MariaLordwill@pneumatic.app>
Date:   Wed Feb 18 15:11:55 2026 +0400

    41526 feat(API): Implement uploadFileToFileService for POST /upload

commit 2de8b2e0efa4a0321fe16492b179e991cfa9fcbb
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Feb 18 02:17:01 2026 +0500

    41526 refactor(docker): remove local-storage profiles from seaweedfs services in docker-compose

commit 4eb446b4f9ca0f605c0c6266b004b3355b194764
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Feb 18 02:03:15 2026 +0500

    41526 refactor(settings): remove STORAGE configuration and docker-compose

    - Eliminated STORAGE configuration from settings and removed associated validation checks in UserAdminChangeForm, ContactAdminForm, and IntegrationCreateForm.
    - Updated MicrosoftGraphApiMixin to simplify photo upload logic by removing dependency on STORAGE setting.
    - Cleaned up tests to reflect the removal of STORAGE-related assertions and mocks.

commit 05071ff589c66d2cef4513d555ac9e129ce0acf6
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Wed Feb 18 01:08:30 2026 +0500

    41526 refactor(attachments): update refresh_attachments_for_event to return attachment status

commit 539446df09371560a59e95f6ac3c0e2ee8a7e3ab
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Feb 17 23:59:54 2026 +0500

    41526 fix(attachments): ensure guardian permissions are cleared on attachment deletion

    - Implemented `clear_guardian_permissions_for_attachment_ids` to remove permissions associated with attachments before deletion.
    - Updated `Attachment` model's `delete` method to call the new permission cleanup function.
    - Modified various services to ensure permissions are cleared when attachments are removed, enhancing security and data integrity.
    - Added tests to verify that permissions are correctly removed upon attachment deletion.

commit fad05077eb35e7ddad37210b425c7f9d9760f695
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Feb 17 22:35:12 2026 +0500

    41526 refactor(attachments): streamline permission assignment and remove unused methods

commit b78924b3e32a15614e9764818009c7637b2c0794
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Feb 17 19:38:55 2026 +0500

    41526 refactor(docker): standardize environment variable syntax in docker-compose files

commit 6889daf25c109ea64c8bc638d943651dc2a5e184
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Feb 17 19:32:07 2026 +0500

    41526 fix(comments): enforce mandatory comment text in CommentCreateSerializer

    - Updated validation logic in CommentCreateSerializer to require non-empty comment text.
    - Adjusted error message for missing or blank comment text to provide clearer feedback.
    - Added tests to verify validation behavior for empty and blank comment submissions.

commit d6f0686a13d2b5f182996c2bb1d9f3ee85fa04d3
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Tue Feb 17 18:34:03 2026 +0500

    41526 refactor(tasks): update TaskFieldService to handle full URLs for file attachments

    - Modified methods in TaskFieldService to return full URLs instead of file IDs for better clarity and usability.
    - Updated tests to reflect changes in expected output, ensuring consistency with the new URL handling.
    - Enhanced regex patterns in storage utilities to support full URL extraction from markdown links.

commit 673b3ac2af50b53a4d3a7f334507e5ef8bdd7b4d
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Mon Feb 16 23:54:44 2026 +0500

    41526 fix(database): update alembic.ini script location to use relative path

commit 42831dd20ed1bbde3e2af588b048d953c9d95c2b
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Mon Feb 16 22:37:26 2026 +0500

    41526 refactor(docker): standardize file-service configurations and update PostgreSQL version

    - Renamed `container_name` for `file-service` to use hyphens for consistency.
    - Updated `DEBUG` and `CONFIG` environment variables for `file-service` to set `DEBUG` to false and `CONFIG` to Production across all docker-compose files.
    - Changed PostgreSQL image version from 13 to 15-bookworm in all relevant services.
    - Adjusted service dependencies and environment variables for improved clarity and functionality.

commit 153adac1a64795bdd8d91d1340b85c709b2b1090
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Mon Feb 16 19:41:34 2026 +0500

    41526 feat(attachments): implement pagination and filtering for attachment listing

    - Added `raw_list_query` method to `AttachmentQuerySet` for executing raw queries with pagination support.
    - Introduced `AttachmentListPagination` class to handle pagination logic in the attachment listing.
    - Updated `AttachmentListQuery` to include limit and offset parameters for optimized SQL queries.
    - Enhanced `AttachmentViewSet` to utilize the new pagination and filtering capabilities, returning structured response with count and results.
    - Updated tests to verify pagination functionality and ensure correct behavior of the attachment listing API.

commit 848c6a777decfec2929e7ad06b341671aa0b4aa5
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Mon Feb 16 18:26:21 2026 +0500

    41526 refactor(tasks): optimize attachment handling with transaction management

    - Wrapped attachment updates in a transaction to ensure atomicity during partial updates in TaskFieldService.
    - Enhanced refresh_attachments_for_event and refresh_attachments_for_text functions to delete and create attachments within a single transaction, improving data integrity.
    - Cleared existing permissions for attachments before reassigning in AttachmentService to maintain accurate access control.

commit 280c0682c0a9c9c35955b0e5895a3149a36c78e8
Author: Eugen Birkenfeld <EBirkenfeld@pneumatic.app>
Date:   Fri Feb 13 23:50:23 2026 +0500

    41526 fix(storage): preserve comm…
@macroscopeapp

macroscopeapp Bot commented Jul 14, 2026

Copy link
Copy Markdown

Macroscope has since reviewed this pull request. An earlier review was skipped by a cost limit; a review has now completed, so that notice no longer applies.

Comment thread backend/src/applications/admin.py
Comment thread backend/src/accounts/admin.py Outdated
Comment thread backend/src/accounts/views/users.py
user=user,
old_values=old_values,
new_values=[],
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Photo sync omits new file values

Medium Severity

apply_photo_to_user calls sync_account_file_fields with new_values=[] after setting user.photo. That only removes the old attachment and never registers the new photo URL through the sync path used everywhere else for account file fields.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 0e1408e. Configure here.

Comment on lines +271 to +276
if fieldset.order != fieldset_data['order']:
update_kwargs['order'] = fieldset_data['order']
if fieldset.title != fieldset_data['title']:
update_kwargs['title'] = fieldset_data['title']
if fieldset.description != fieldset_data['description']:
update_kwargs['description'] = fieldset_data['description']

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High templates/mixins.py:271

create_or_update_fieldsets raises KeyError when updating an existing fieldset whose payload omits title or description. Both fields are optional/blankable, so a valid request that references an existing api_name without those keys returns a 500 instead of preserving the current values. The update_kwargs comparisons index fieldset_data['title'] and fieldset_data['description'] unconditionally, but those keys may be absent — the later partial_update_instance call already uses .get() correctly. Use .get() in the comparison checks as well.

Suggested change
if fieldset.order != fieldset_data['order']:
update_kwargs['order'] = fieldset_data['order']
if fieldset.title != fieldset_data['title']:
update_kwargs['title'] = fieldset_data['title']
if fieldset.description != fieldset_data['description']:
update_kwargs['description'] = fieldset_data['description']
if fieldset.order != fieldset_data['order']:
update_kwargs['order'] = fieldset_data['order']
if fieldset.title != fieldset_data.get('title'):
update_kwargs['title'] = fieldset_data.get('title')
if fieldset.description != fieldset_data.get('description'):
update_kwargs['description'] = fieldset_data.get('description')
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @backend/src/processes/serializers/templates/mixins.py around lines 271-276:

`create_or_update_fieldsets` raises `KeyError` when updating an existing fieldset whose payload omits `title` or `description`. Both fields are optional/blankable, so a valid request that references an existing `api_name` without those keys returns a 500 instead of preserving the current values. The `update_kwargs` comparisons index `fieldset_data['title']` and `fieldset_data['description']` unconditionally, but those keys may be absent — the later `partial_update_instance` call already uses `.get()` correctly. Use `.get()` in the comparison checks as well.

Comment on lines +257 to +260
api_name=fieldset_data['api_name'],
defaults={
'account_id': self.instance.account_id,
'name': fieldset_data['name'],

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium tasks/task_version.py:257

_update_fieldsets never copies fieldset_data['title'] into the FieldSet defaults, so newly added fieldsets lose their configured title and title edits in a new template version are not propagated to running workflows — task forms display an empty or stale heading. Consider adding 'title': fieldset_data['title'] to the defaults dict.

Suggested change
api_name=fieldset_data['api_name'],
defaults={
'account_id': self.instance.account_id,
'name': fieldset_data['name'],
'account_id': self.instance.account_id,
'name': fieldset_data['name'],
'title': fieldset_data['title'],
'description': fieldset_data['description'],
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @backend/src/processes/services/tasks/task_version.py around lines 257-260:

`_update_fieldsets` never copies `fieldset_data['title']` into the `FieldSet` `defaults`, so newly added fieldsets lose their configured title and title edits in a new template version are not propagated to running workflows — task forms display an empty or stale heading. Consider adding `'title': fieldset_data['title']` to the `defaults` dict.


# TODO Move to TaskFieldService

return TaskField.objects.update_or_create(

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High tasks/task_version.py:179

When a template update moves an existing field into, out of, or between fieldsets, _update_field creates a new TaskField with an empty value and the cleanup deletes the old row, silently discarding the field's existing workflow value and selections. The fieldset foreign key is included in the update_or_create lookup, so moving the field changes the lookup identity and triggers a create-then-delete instead of an update. Move fieldset out of the lookup and into defaults so the existing row is updated in place.

🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @backend/src/processes/services/tasks/task_version.py around line 179:

When a template update moves an existing field into, out of, or between fieldsets, `_update_field` creates a new `TaskField` with an empty `value` and the cleanup deletes the old row, silently discarding the field's existing workflow value and selections. The `fieldset` foreign key is included in the `update_or_create` lookup, so moving the field changes the lookup identity and triggers a create-then-delete instead of an update. Move `fieldset` out of the lookup and into `defaults` so the existing row is updated in place.

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.

There are 2 total unresolved issues (including 1 from previous review).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 07df431. Configure here.

'label_position': fieldset_data['label_position'],
'layout': fieldset_data['layout'],
},
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fieldset title dropped on version sync

Medium Severity

_update_fieldsets omits title from update_or_create defaults even though version schemas include it. When a template version updates a running workflow, fieldset titles stay blank or stale while name, description, layout, and other attributes sync correctly.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 07df431. Configure here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Backend API changes request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant