Skip to content

feat(contact): creation - #15

Merged
Sinoj-flycatch merged 2 commits into
devfrom
feat/contact
Sep 1, 2026
Merged

feat(contact): creation#15
Sinoj-flycatch merged 2 commits into
devfrom
feat/contact

Conversation

@athulrajtflycatchtech

Copy link
Copy Markdown

Changes

  • Table bulk deletion & added bulk unpublish added
  • Add the following 4 new sections to the Administration UI: Contact Download flycatch Saudi arabia Subscription

Reviewer

@bprahul017 & @Sinoj-flycatch

…tch Saudi Arabia, and subscriptions; enhance API integration and navigation for improved content administration
…ple components; add BulkActionsBar, BulkDeleteDialog, RowSelectCell, and SelectAllHeader for enhanced user experience in managing lists
@Sinoj-flycatch
Sinoj-flycatch merged commit 453a34f into dev Sep 1, 2026
3 of 4 checks passed
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Add four admin catalogs and reusable bulk actions

✨ Enhancement 🧪 Tests 📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Adds administration and public APIs for four new catalog resources.
• Enables permission-aware bulk unpublish and deletion across administration tables.
• Documents and tests catalog, RBAC, validation, and bulk-action behavior.
Diagram

sequenceDiagram
  actor Staff
  participant AdminUI as Admin UI
  participant AdminAPI as Admin API
  participant RBAC
  participant Services
  participant Database
  actor Public as Public Client
  Staff->>AdminUI: Manage catalogs
  AdminUI->>AdminAPI: CRUD or bulk action
  AdminAPI->>RBAC: Authorize action
  RBAC-->>AdminAPI: Permission result
  AdminAPI->>Services: Validate and process
  Services->>Database: Persist records
  Database-->>Services: Catalog data
  Services-->>AdminUI: Admin response
  Public->>AdminAPI: Read published data
  AdminAPI->>Services: Query published rows
  Services->>Database: Filter by status
  Database-->>Public: Public projection
Loading
High-Level Assessment

The PR appropriately extends the generic catalog CRUD architecture and introduces shared bulk route, service, hook, and control abstractions. Bespoke routers and tables would duplicate authorization, pagination, validation, and selection logic, so the reusable approach is preferable.

Files changed (129) +7027 / -40

Enhancement (64) +2396 / -38
AiServicesList.tsxAdd bulk actions to AI services +21/-1

Add bulk actions to AI services

• Adds row selection, bulk unpublish/delete controls, and empty-page pagination recovery.

apps/Administration-FE/src/components/AiServicesList.tsx

AuthorsList.tsxAdd bulk actions to authors +19/-0

Add bulk actions to authors

• Adds reusable selection and bulk unpublish/delete controls to the authors table.

apps/Administration-FE/src/components/AuthorsList.tsx

BlogsList.tsxAdd bulk actions to blogs +21/-2

Add bulk actions to blogs

• Adds bulk selection and actions while centralizing paginated reload handling.

apps/Administration-FE/src/components/BlogsList.tsx

BulkTableControls.tsxCreate reusable bulk table controls +95/-0

Create reusable bulk table controls

• Introduces accessible select-all, row-selection, action-bar, and delete-confirmation components.

apps/Administration-FE/src/components/BulkTableControls.tsx

CaseStudiesList.tsxAdd bulk actions to case studies +21/-2

Add bulk actions to case studies

• Integrates shared bulk selection, unpublish, deletion, and pagination recovery.

apps/Administration-FE/src/components/CaseStudiesList.tsx

CaseStudyCategoriesList.tsxAdd bulk actions to case study categories +21/-2

Add bulk actions to case study categories

• Integrates shared bulk controls and pagination recovery into the category list.

apps/Administration-FE/src/components/CaseStudyCategoriesList.tsx

CatalogForm.tsxSupport required media and repeatable service fields +159/-0

Support required media and repeatable service fields

• Adds required-media validation and repeatable nested fields with per-item uploads for Saudi service content.

apps/Administration-FE/src/components/CatalogForm.tsx

CatalogList.tsxExtend generic catalogs with bulk actions +27/-1

Extend generic catalogs with bulk actions

• Adds shared bulk controls, boolean columns, and empty-page recovery to generic catalogs.

apps/Administration-FE/src/components/CatalogList.tsx

CategoriesList.tsxAdd bulk actions to blog categories +19/-0

Add bulk actions to blog categories

• Adds reusable row selection and bulk unpublish/delete controls.

apps/Administration-FE/src/components/CategoriesList.tsx

ClientLogosList.tsxAdd bulk actions to client logos +21/-2

Add bulk actions to client logos

• Integrates shared bulk actions and paginated reload handling.

apps/Administration-FE/src/components/ClientLogosList.tsx

ClientTestimonialsList.tsxAdd bulk actions to testimonials +21/-2

Add bulk actions to testimonials

• Integrates shared bulk actions and paginated reload handling.

apps/Administration-FE/src/components/ClientTestimonialsList.tsx

CloudServicesList.tsxConfigure cloud-services bulk endpoint +1/-0

Configure cloud-services bulk endpoint

• Supplies the cloud-services API path to the shared named-page list.

apps/Administration-FE/src/components/CloudServicesList.tsx

DataAnalyticsList.tsxConfigure data-analytics bulk endpoint +1/-0

Configure data-analytics bulk endpoint

• Supplies the data-analytics API path to the shared named-page list.

apps/Administration-FE/src/components/DataAnalyticsList.tsx

DigitalTransformationList.tsxAdd bulk actions to digital transformation +21/-1

Add bulk actions to digital transformation

• Integrates selection, bulk operations, and pagination recovery into the list.

apps/Administration-FE/src/components/DigitalTransformationList.tsx

HomesList.tsxAdd bulk actions to home entries +21/-2

Add bulk actions to home entries

• Integrates shared bulk actions and paginated reload handling.

apps/Administration-FE/src/components/HomesList.tsx

IndustriesList.tsxAdd bulk actions to industries +21/-2

Add bulk actions to industries

• Integrates shared bulk actions and paginated reload handling.

apps/Administration-FE/src/components/IndustriesList.tsx

LandingList.tsxAdd bulk actions to landing pages +20/-1

Add bulk actions to landing pages

• Adds selection, bulk operations, and empty-page recovery to generic landing lists.

apps/Administration-FE/src/components/LandingList.tsx

NamedPageList.tsxAdd bulk support to named-page lists +22/-1

Add bulk support to named-page lists

• Accepts a bulk API path and provides selection, unpublish, deletion, and page recovery.

apps/Administration-FE/src/components/NamedPageList.tsx

RolesList.tsxAdd guarded bulk role deletion +25/-2

Add guarded bulk role deletion

• Allows bulk deletion only for non-system roles without assigned users and disables unpublish.

apps/Administration-FE/src/components/RolesList.tsx

SolutionDetailsList.tsxAdd bulk actions to solution details +21/-1

Add bulk actions to solution details

• Integrates shared bulk operations and pagination recovery into the list.

apps/Administration-FE/src/components/SolutionDetailsList.tsx

SolutionProductsList.tsxAdd bulk actions to solution products +21/-1

Add bulk actions to solution products

• Integrates shared bulk operations and pagination recovery into the list.

apps/Administration-FE/src/components/SolutionProductsList.tsx

SolutionsList.tsxAdd bulk actions to solutions +21/-1

Add bulk actions to solutions

• Integrates shared bulk operations and pagination recovery into the list.

apps/Administration-FE/src/components/SolutionsList.tsx

TechnologiesList.tsxAdd bulk actions to technologies +21/-2

Add bulk actions to technologies

• Integrates shared bulk actions and paginated reload handling.

apps/Administration-FE/src/components/TechnologiesList.tsx

en.jsonLocalize bulk actions and new catalogs +147/-1

Localize bulk actions and new catalogs

• Adds English labels, validation messages, table text, and form copy for bulk actions and all four resources.

apps/Administration-FE/src/i18n/en.json

AdminLayout.astroLoad Poppins for administration pages +6/-0

Load Poppins for administration pages

• Preconnects to Google Fonts and loads the Poppins font family.

apps/Administration-FE/src/layouts/AdminLayout.astro

admin-api.tsAdd generic bulk API requests +17/-0

Add generic bulk API requests

• Adds helpers for posting record IDs to bulk-unpublish and bulk-delete endpoints.

apps/Administration-FE/src/lib/admin-api.ts

admin-routes.tsRegister four administration routes +12/-0

Register four administration routes

• Adds list/form views and canonical URLs for all four new catalog sections.

apps/Administration-FE/src/lib/admin-routes.ts

catalog-sections.tsDefine four new catalog sections +110/-3

Define four new catalog sections

• Configures contacts, downloads, Saudi content, and subscriptions, including repeatable fields and required PDFs.

apps/Administration-FE/src/lib/catalog-sections.ts

use-bulk-table.tsCreate shared bulk-table state hook +123/-0

Create shared bulk-table state hook

• Manages eligible selections, indeterminate state, bulk requests, errors, reloads, and empty-page fallback.

apps/Administration-FE/src/lib/use-bulk-table.ts

contacts.astroAdd contacts administration page +4/-0

Add contacts administration page

• Exposes the shared administration application at the contacts route.

apps/Administration-FE/src/pages/admin/contacts.astro

downloads.astroAdd downloads administration page +4/-0

Add downloads administration page

• Exposes the shared administration application at the downloads route.

apps/Administration-FE/src/pages/admin/downloads.astro

flycatch-saudi-arabia.astroAdd Saudi Arabia administration page +4/-0

Add Saudi Arabia administration page

• Exposes the shared administration application at the Saudi Arabia route.

apps/Administration-FE/src/pages/admin/flycatch-saudi-arabia.astro

subscriptions.astroAdd subscriptions administration page +4/-0

Add subscriptions administration page

• Exposes the shared administration application at the subscriptions route.

apps/Administration-FE/src/pages/admin/subscriptions.astro

admin.cssStyle bulk controls and administration typography +86/-4

Style bulk controls and administration typography

• Adds responsive bulk-action and selection styles, applies the base font to controls, and adjusts tables.

apps/Administration-FE/src/styles/admin.css

admin_ai_services.pyExpose AI-services bulk routes +4/-0

Expose AI-services bulk routes

• Attaches generic bulk unpublish and delete endpoints to AI services.

apps/Backend/src/flycatch_api/api/admin_ai_services.py

admin_authors.pyExpose guarded author bulk routes +10/-0

Expose guarded author bulk routes

• Adds bulk endpoints while preventing deletion of authors referenced by blogs or news.

apps/Backend/src/flycatch_api/api/admin_authors.py

admin_blogs.pyExpose blog bulk routes +5/-0

Expose blog bulk routes

• Attaches generic bulk unpublish and delete endpoints to blogs.

apps/Backend/src/flycatch_api/api/admin_blogs.py

admin_case_studies.pyExpose case-study bulk routes +4/-0

Expose case-study bulk routes

• Attaches generic bulk unpublish and delete endpoints to case studies.

apps/Backend/src/flycatch_api/api/admin_case_studies.py

admin_case_study_categories.pyExpose case-study-category bulk routes +4/-0

Expose case-study-category bulk routes

• Attaches generic bulk endpoints to case study categories.

apps/Backend/src/flycatch_api/api/admin_case_study_categories.py

admin_categories.pyExpose guarded category bulk routes +10/-0

Expose guarded category bulk routes

• Adds bulk endpoints while preventing deletion of categories referenced by blogs.

apps/Backend/src/flycatch_api/api/admin_categories.py

admin_client_logos.pyExpose client-logo bulk routes +4/-0

Expose client-logo bulk routes

• Attaches generic bulk endpoints to client logos.

apps/Backend/src/flycatch_api/api/admin_client_logos.py

admin_client_testimonials.pyExpose testimonial bulk routes +4/-0

Expose testimonial bulk routes

• Attaches generic bulk endpoints to client testimonials.

apps/Backend/src/flycatch_api/api/admin_client_testimonials.py

admin_cloud_services.pyExpose cloud-service bulk routes +4/-0

Expose cloud-service bulk routes

• Attaches generic bulk endpoints to cloud services.

apps/Backend/src/flycatch_api/api/admin_cloud_services.py

admin_data_analytics.pyExpose data-analytics bulk routes +4/-0

Expose data-analytics bulk routes

• Attaches generic bulk endpoints to data analytics.

apps/Backend/src/flycatch_api/api/admin_data_analytics.py

admin_digital_transformation.pyExpose transformation bulk routes +4/-0

Expose transformation bulk routes

• Attaches generic bulk endpoints to digital transformation records.

apps/Backend/src/flycatch_api/api/admin_digital_transformation.py

admin_homes.pyExpose home bulk routes +4/-0

Expose home bulk routes

• Attaches generic bulk endpoints to home records.

apps/Backend/src/flycatch_api/api/admin_homes.py

admin_industries.pyExpose industry bulk routes +4/-0

Expose industry bulk routes

• Attaches generic bulk endpoints to industries.

apps/Backend/src/flycatch_api/api/admin_industries.py

admin_roles.pyExpose guarded bulk role deletion +13/-0

Expose guarded bulk role deletion

• Adds bulk deletion with role authorization plus system-role and assignment guards.

apps/Backend/src/flycatch_api/api/admin_roles.py

admin_solution_details.pyExpose solution-detail bulk routes +4/-0

Expose solution-detail bulk routes

• Attaches generic bulk endpoints to solution details.

apps/Backend/src/flycatch_api/api/admin_solution_details.py

admin_solution_products.pyExpose solution-product bulk routes +4/-0

Expose solution-product bulk routes

• Attaches generic bulk endpoints to solution products.

apps/Backend/src/flycatch_api/api/admin_solution_products.py

admin_solutions.pyExpose solution bulk routes +4/-0

Expose solution bulk routes

• Attaches generic bulk endpoints to solutions.

apps/Backend/src/flycatch_api/api/admin_solutions.py

admin_technologies.pyExpose technology bulk routes +4/-0

Expose technology bulk routes

• Attaches generic bulk endpoints to technologies.

apps/Backend/src/flycatch_api/api/admin_technologies.py

bulk_routes.pyCreate permission-aware bulk route factory +116/-0

Create permission-aware bulk route factory

• Generates bulk endpoints with RBAC checks and deletion guards for authors, categories, and roles.

apps/Backend/src/flycatch_api/api/bulk_routes.py

catalog.pyExpose new catalog and bulk APIs +84/-0

Expose new catalog and bulk APIs

• Registers admin CRUD, public published reads, and generic bulk routes for catalog-backed resources.

apps/Backend/src/flycatch_api/api/catalog.py

landing_routers.pyAttach bulk routes to landing catalogs +8/-0

Attach bulk routes to landing catalogs

• Extends the landing router factory with shared bulk endpoints.

apps/Backend/src/flycatch_api/api/landing_routers.py

main.pyMount new admin and public routers +8/-0

Mount new admin and public routers

• Registers all four resources under the versioned admin and public API prefixes.

apps/Backend/src/flycatch_api/main.py

__init__.pyExport new catalog models +8/-0

Export new catalog models

• Makes the four new ORM models available through the model package.

apps/Backend/src/flycatch_api/models/init.py

catalog.pyModel four new catalog entities +69/-0

Model four new catalog entities

• Defines ORM mappings for contacts, downloads, Saudi page content, and unique-email subscriptions.

apps/Backend/src/flycatch_api/models/catalog.py

admin_bulk.pyDefine bulk-action schemas +15/-0

Define bulk-action schemas

• Validates batches of one to 100 UUIDs and returns the affected-record count.

apps/Backend/src/flycatch_api/schemas/admin_bulk.py

admin_catalog.pyDefine administration schemas for new catalogs +182/-0

Define administration schemas for new catalogs

• Adds strict detail, summary, list, and write models for all four resources.

apps/Backend/src/flycatch_api/schemas/admin_catalog.py

public_catalog.pyDefine public schemas for new catalogs +93/-2

Define public schemas for new catalogs

• Adds status-free public projections and paginated lists for the four resources.

apps/Backend/src/flycatch_api/schemas/public_catalog.py

bulk_service.pyImplement atomic bulk operations +62/-0

Implement atomic bulk operations

• Loads unique IDs, fails on missing records, validates deletions, and commits batch changes.

apps/Backend/src/flycatch_api/services/bulk_service.py

catalog_service.pyImplement four catalog services +475/-2

Implement four catalog services

• Adds CRUD, search, validation, public projections, PDF enforcement, nested services, and subscription uniqueness.

apps/Backend/src/flycatch_api/services/catalog_service.py

role_service.pyAdd new resources to RBAC catalogue +4/-0

Add new resources to RBAC catalogue

• Registers permissions for contacts, downloads, Saudi content, and subscriptions.

apps/Backend/src/flycatch_api/services/role_service.py

Tests (7) +315 / -1
admin-catalog.spec.tsTest navigation to new catalogs +19/-0

Test navigation to new catalogs

• Verifies all four navigation entries, routes, headings, and the contact creation form.

apps/Administration-FE/tests/e2e/admin-catalog.spec.ts

admin-routes.test.tsTest new administration route helpers +8/-0

Test new administration route helpers

• Covers location parsing and list URL generation for all four resources.

apps/Administration-FE/tests/unit/admin-routes.test.ts

catalog-sections.test.tsTest new catalog configurations +16/-1

Test new catalog configurations

• Verifies resource registration, required PDF configuration, and Saudi list projections.

apps/Administration-FE/tests/unit/catalog-sections.test.ts

test_openapi_parity.pyCheck new contracts against OpenAPI +8/-0

Check new contracts against OpenAPI

• Adds all eight administration and public contracts to parity validation.

apps/Backend/tests/contract/test_openapi_parity.py

test_admin_bulk.pyTest bulk actions and authorization +148/-0

Test bulk actions and authorization

• Covers authentication, permission denial, unpublishing, deletion, counts, and catalog integration.

apps/Backend/tests/integration/test_admin_bulk.py

test_admin_catalog.pyTest new catalog APIs +111/-0

Test new catalog APIs

• Covers validation, public filtering, PDF requirements, Saudi projections, uniqueness, and publish permissions.

apps/Backend/tests/integration/test_admin_catalog.py

test_admin_roles.pyTest new RBAC resources +5/-0

Test new RBAC resources

• Verifies the four resources appear in the role catalogue.

apps/Backend/tests/integration/test_admin_roles.py

Documentation (54) +4224 / -0
admin-roles.v1.yamlDocument bulk role deletion +30/-0

Document bulk role deletion

• Adds the authenticated bulk-delete operation for up to 100 role UUIDs.

specs/002-auth-rbac/contracts/admin-roles.v1.yaml

admin-blogs.v1.yamlDocument blog-domain bulk actions +177/-0

Document blog-domain bulk actions

• Adds bulk unpublish/delete contracts for blogs, authors, and categories.

specs/004-admin-blogs/contracts/admin-blogs.v1.yaml

admin-case-studies.v1.yamlDocument case-study bulk actions +236/-0

Document case-study bulk actions

• Adds bulk unpublish/delete contracts for case-study resources.

specs/005-admin-case-studies/contracts/admin-case-studies.v1.yaml

admin-client-logos.v1.yamlDocument client-logo bulk actions +59/-0

Document client-logo bulk actions

• Adds bulk unpublish and delete operations for client logos.

specs/006-admin-client-logos/contracts/admin-client-logos.v1.yaml

admin-client-testimonials.v1.yamlDocument testimonial bulk actions +59/-0

Document testimonial bulk actions

• Adds bulk unpublish and delete operations for client testimonials.

specs/007-admin-client-testimonials/contracts/admin-client-testimonials.v1.yaml

admin-homes.v1.yamlDocument home bulk actions +59/-0

Document home bulk actions

• Adds bulk unpublish and delete operations for home records.

specs/008-admin-home/contracts/admin-homes.v1.yaml

admin-solutions.v1.yamlDocument solution bulk actions +59/-0

Document solution bulk actions

• Adds bulk unpublish and delete operations for solutions.

specs/009-admin-solutions/contracts/admin-solutions.v1.yaml

admin-solution-details.v1.yamlDocument solution-detail bulk actions +59/-0

Document solution-detail bulk actions

• Adds bulk unpublish and delete operations for solution details.

specs/010-admin-solution-details/contracts/admin-solution-details.v1.yaml

admin-solution-products.v1.yamlDocument solution-product bulk actions +59/-0

Document solution-product bulk actions

• Adds bulk unpublish and delete operations for solution products.

specs/011-admin-solution-products/contracts/admin-solution-products.v1.yaml

admin-ai-services.v1.yamlDocument AI-service bulk actions +59/-0

Document AI-service bulk actions

• Adds bulk unpublish and delete operations for AI services.

specs/012-admin-ai-services/contracts/admin-ai-services.v1.yaml

admin-cloud-services.v1.yamlDocument cloud-service bulk actions +59/-0

Document cloud-service bulk actions

• Adds bulk unpublish and delete operations for cloud services.

specs/013-admin-cloud-services/contracts/admin-cloud-services.v1.yaml

admin-data-analytics.v1.yamlDocument data-analytics bulk actions +59/-0

Document data-analytics bulk actions

• Adds bulk unpublish and delete operations for data analytics.

specs/014-admin-data-analytics/contracts/admin-data-analytics.v1.yaml

admin-digital-transformation.v1.yamlDocument transformation bulk actions +59/-0

Document transformation bulk actions

• Adds bulk unpublish and delete operations for digital transformation.

specs/015-admin-digital-transformation/contracts/admin-digital-transformation.v1.yaml

admin-devops-consult.v1.yamlDocument DevOps bulk actions +59/-0

Document DevOps bulk actions

• Adds bulk unpublish and delete operations for DevOps consultation records.

specs/016-admin-devops-consult/contracts/admin-devops-consult.v1.yaml

admin-infrastructure-management.v1.yamlDocument infrastructure bulk actions +59/-0

Document infrastructure bulk actions

• Adds bulk actions for infrastructure-management records.

specs/017-admin-infrastructure-management/contracts/admin-infrastructure-management.v1.yaml

admin-application-development.v1.yamlDocument application-development bulk actions +59/-0

Document application-development bulk actions

• Adds bulk actions for application-development records.

specs/018-admin-application-development/contracts/admin-application-development.v1.yaml

admin-application-modernization.v1.yamlDocument modernization bulk actions +59/-0

Document modernization bulk actions

• Adds bulk actions for application-modernization records.

specs/019-admin-application-modernization/contracts/admin-application-modernization.v1.yaml

admin-mobile-application-development.v1.yamlDocument mobile-development bulk actions +59/-0

Document mobile-development bulk actions

• Adds bulk actions for mobile-development records.

specs/020-admin-mobile-application-development/contracts/admin-mobile-application-development.v1.yaml

admin-user-centered-design.v1.yamlDocument design bulk actions +59/-0

Document design bulk actions

• Adds bulk actions for user-centered-design records.

specs/021-admin-user-centered-design/contracts/admin-user-centered-design.v1.yaml

admin-overview.v1.yamlDocument overview bulk actions +59/-0

Document overview bulk actions

• Adds bulk unpublish and delete operations for overview records.

specs/022-admin-overview/contracts/admin-overview.v1.yaml

admin-applications.v1.yamlDocument application bulk actions +59/-0

Document application bulk actions

• Adds bulk unpublish and delete operations for job applications.

specs/023-admin-applications/contracts/admin-applications.v1.yaml

admin-openings.v1.yamlDocument opening bulk actions +59/-0

Document opening bulk actions

• Adds bulk unpublish and delete operations for openings.

specs/024-admin-openings/contracts/admin-openings.v1.yaml

admin-employee-testimonials.v1.yamlDocument employee-testimonial bulk actions +59/-0

Document employee-testimonial bulk actions

• Adds bulk actions for employee testimonials.

specs/025-admin-employee-testimonials/contracts/admin-employee-testimonials.v1.yaml

admin-email-configuration.v1.yamlDocument email-configuration bulk actions +59/-0

Document email-configuration bulk actions

• Adds bulk actions for email configurations.

specs/026-admin-email-configuration/contracts/admin-email-configuration.v1.yaml

admin-email-templates.v1.yamlDocument email-template bulk actions +59/-0

Document email-template bulk actions

• Adds bulk actions for email templates.

specs/027-admin-email-templates/contracts/admin-email-templates.v1.yaml

admin-news-categories.v1.yamlDocument news-category bulk actions +59/-0

Document news-category bulk actions

• Adds bulk actions for news categories.

specs/028-admin-news-categories/contracts/admin-news-categories.v1.yaml

admin-news.v1.yamlDocument news bulk actions +59/-0

Document news bulk actions

• Adds bulk unpublish and delete operations for news records.

specs/029-admin-news/contracts/admin-news.v1.yaml

admin-resource-categories.v1.yamlDocument resource-category bulk actions +59/-0

Document resource-category bulk actions

• Adds bulk actions for resource categories.

specs/030-admin-resource-categories/contracts/admin-resource-categories.v1.yaml

admin-resources.v1.yamlDocument resource bulk actions +59/-0

Document resource bulk actions

• Adds bulk unpublish and delete operations for resources.

specs/031-admin-resources/contracts/admin-resources.v1.yaml

admin-memberships.v1.yamlDocument membership bulk actions +59/-0

Document membership bulk actions

• Adds bulk unpublish and delete operations for memberships.

specs/032-admin-memberships/contracts/admin-memberships.v1.yaml

requirements.mdAdd contacts specification checklist +34/-0

Add contacts specification checklist

• Records completed quality and readiness checks for the contacts specification.

specs/033-admin-contacts/checklists/requirements.md

admin-contacts.v1.yamlDefine contacts administration contract +295/-0

Define contacts administration contract

• Documents CRUD, search, pagination, bulk actions, validation, and responses.

specs/033-admin-contacts/contracts/admin-contacts.v1.yaml

public-contacts.v1.yamlDefine contacts public contract +109/-0

Define contacts public contract

• Documents unauthenticated published-only contact list and detail responses.

specs/033-admin-contacts/contracts/public-contacts.v1.yaml

data-model.mdDocument the contact data model +27/-0

Document the contact data model

• Defines contact fields, lifecycle states, defaults, and searchable attributes.

specs/033-admin-contacts/data-model.md

quickstart.mdAdd contacts validation quickstart +14/-0

Add contacts validation quickstart

• Provides migration, CRUD, publish, and public-read verification steps.

specs/033-admin-contacts/quickstart.md

spec.mdSpecify contacts administration +69/-0

Specify contacts administration

• Defines scope, permissions, scenarios, public filtering, and contract boundaries.

specs/033-admin-contacts/spec.md

requirements.mdAdd downloads specification checklist +34/-0

Add downloads specification checklist

• Records completed quality and readiness checks for the downloads specification.

specs/034-admin-downloads/checklists/requirements.md

admin-downloads.v1.yamlDefine downloads administration contract +279/-0

Define downloads administration contract

• Documents CRUD, required PDF data, pagination, and bulk actions.

specs/034-admin-downloads/contracts/admin-downloads.v1.yaml

public-downloads.v1.yamlDefine downloads public contract +102/-0

Define downloads public contract

• Documents published-only download list and detail responses.

specs/034-admin-downloads/contracts/public-downloads.v1.yaml

data-model.mdDocument the download data model +20/-0

Document the download data model

• Defines fields, required PDF key, lifecycle states, and search behavior.

specs/034-admin-downloads/data-model.md

quickstart.mdAdd downloads validation quickstart +14/-0

Add downloads validation quickstart

• Provides steps for validating PDF requirements, CRUD, and public filtering.

specs/034-admin-downloads/quickstart.md

spec.mdSpecify downloads administration +67/-0

Specify downloads administration

• Defines staff workflows, required PDFs, permissions, and published public reads.

specs/034-admin-downloads/spec.md

requirements.mdAdd Saudi feature specification checklist +34/-0

Add Saudi feature specification checklist

• Records quality and readiness checks for the Saudi Arabia specification.

specs/035-admin-flycatch-saudi-arabia/checklists/requirements.md

admin-flycatch-saudi-arabia.v1.yamlDefine Saudi content administration contract +320/-0

Define Saudi content administration contract

• Documents CRUD, nested services, SEO, media, projections, and bulk actions.

specs/035-admin-flycatch-saudi-arabia/contracts/admin-flycatch-saudi-arabia.v1.yaml

public-flycatch-saudi-arabia.v1.yamlDefine Saudi content public contract +130/-0

Define Saudi content public contract

• Documents published Saudi content with nested services, video, and SEO.

specs/035-admin-flycatch-saudi-arabia/contracts/public-flycatch-saudi-arabia.v1.yaml

data-model.mdDocument the Saudi content model +38/-0

Document the Saudi content model

• Defines page fields, service items, lifecycle, search, and projections.

specs/035-admin-flycatch-saudi-arabia/data-model.md

quickstart.mdAdd Saudi content validation quickstart +14/-0

Add Saudi content validation quickstart

• Provides steps for validating CRUD, nested services, publishing, and public reads.

specs/035-admin-flycatch-saudi-arabia/quickstart.md

spec.mdSpecify Saudi content administration +70/-0

Specify Saudi content administration

• Defines repeatable services, media, SEO, permissions, and public reads.

specs/035-admin-flycatch-saudi-arabia/spec.md

requirements.mdAdd subscriptions specification checklist +34/-0

Add subscriptions specification checklist

• Records quality and readiness checks for the subscriptions specification.

specs/036-admin-subscriptions/checklists/requirements.md

admin-subscriptions.v1.yamlDefine subscriptions administration contract +279/-0

Define subscriptions administration contract

• Documents CRUD, unique emails, active state, pagination, and bulk actions.

specs/036-admin-subscriptions/contracts/admin-subscriptions.v1.yaml

public-subscriptions.v1.yamlDefine subscriptions public contract +102/-0

Define subscriptions public contract

• Documents published-only subscription responses, including active state.

specs/036-admin-subscriptions/contracts/public-subscriptions.v1.yaml

data-model.mdDocument the subscription data model +20/-0

Document the subscription data model

• Defines unique email, active flag, publication lifecycle, and search behavior.

specs/036-admin-subscriptions/data-model.md

quickstart.mdAdd subscriptions validation quickstart +14/-0

Add subscriptions validation quickstart

• Provides steps for validating uniqueness, CRUD, publishing, and public reads.

specs/036-admin-subscriptions/quickstart.md

spec.mdSpecify subscriptions administration +69/-0

Specify subscriptions administration

• Defines workflows, unique-email and active-state rules, permissions, and public filtering.

specs/036-admin-subscriptions/spec.md

Other (4) +92 / -1
check-contract-drift.mjsRequire generated clients for four new catalogs +4/-0

Require generated clients for four new catalogs

• Adds the four administration contract clients to drift verification.

apps/Administration-FE/scripts/check-contract-drift.mjs

generate-client.mjsGenerate clients for new catalog contracts +11/-0

Generate clients for new catalog contracts

• Registers contacts, downloads, Saudi Arabia, and subscriptions contracts for client generation.

apps/Administration-FE/scripts/generate-client.mjs

tokens.cssUse Poppins as the base font +1/-1

Use Poppins as the base font

• Changes the administration typography token to prefer Poppins.

apps/Administration-FE/src/styles/tokens.css

026_contacts_downloads_saudi_subscriptions.pyCreate four catalog tables +76/-0

Create four catalog tables

• Adds contacts, downloads, Saudi content, and subscriptions tables plus the unique subscription email index.

apps/Backend/alembic/versions/026_contacts_downloads_saudi_subscriptions.py

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (5) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Public contacts expose PII 🐞 Bug ⛨ Security
Description
The unauthenticated public contacts endpoints enumerate published records containing names, email
addresses, phone numbers, companies, subjects, and message details. Publishing a contact therefore
exposes private inquiry data to arbitrary callers.
Code

apps/Backend/src/flycatch_api/api/catalog.py[R397-400]

+public_contacts = public_uuid(
+    prefix="/public/contacts",
+    tags="public-contacts",
+    list_model=public.PublicContactList,
Evidence
The shared public route factory accepts no session or authorization dependency, and the newly
registered contact service serializes all inquiry identity, contact, and message fields into its
public response.

apps/Backend/src/flycatch_api/api/catalog.py[117-127]
apps/Backend/src/flycatch_api/main.py[165-168]
apps/Backend/src/flycatch_api/schemas/public_catalog.py[246-268]
apps/Backend/src/flycatch_api/services/catalog_service.py[1466-1478]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The public contact list and detail routes expose inquiry PII without authentication. Remove these routes or require appropriate administrative authorization, and remove the corresponding public contract/schema if contacts are not genuinely public content.

## Issue Context
`public_uuid` has no authentication dependency, while `PublicContact` includes identifying and message data.

## Fix Focus Areas
- apps/Backend/src/flycatch_api/api/catalog.py[397-404]
- apps/Backend/src/flycatch_api/main.py[165-165]
- apps/Backend/src/flycatch_api/schemas/public_catalog.py[246-268]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1395-1410]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1466-1478]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Public subscriptions expose emails 🐞 Bug ⛨ Security
Description
The unauthenticated public subscriptions endpoints enumerate subscriber email addresses, activity
state, and creation timestamps. Publishing a subscription therefore discloses the mailing list to
arbitrary callers.
Code

apps/Backend/src/flycatch_api/api/catalog.py[R421-424]

+public_subscriptions = public_uuid(
+    prefix="/public/subscriptions",
+    tags="public-subscriptions",
+    list_model=public.PublicSubscriptionList,
Evidence
The newly registered subscription router uses an unauthenticated factory, and its public schema and
serializer return subscriber email addresses directly.

apps/Backend/src/flycatch_api/api/catalog.py[117-127]
apps/Backend/src/flycatch_api/main.py[165-168]
apps/Backend/src/flycatch_api/schemas/public_catalog.py[319-334]
apps/Backend/src/flycatch_api/services/catalog_service.py[1706-1723]
apps/Backend/src/flycatch_api/services/catalog_service.py[1765-1766]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The public subscription list and detail routes disclose subscriber email addresses without authentication. Remove these routes or require suitable administrative authorization, and remove the corresponding public contract/schema if subscription records are not public content.

## Issue Context
`public_uuid` has no authentication dependency, and `PublicSubscription` directly includes each subscriber's email address.

## Fix Focus Areas
- apps/Backend/src/flycatch_api/api/catalog.py[421-428]
- apps/Backend/src/flycatch_api/main.py[168-168]
- apps/Backend/src/flycatch_api/schemas/public_catalog.py[319-334]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1706-1723]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1765-1766]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Referenced categories cause bulk failure 🐞 Bug ≡ Correctness
Description
Bulk deletion of case-study categories, industries, and technologies bypasses their existing in-use
checks and attempts direct deletion. Because their case-study link foreign keys do not cascade,
deleting referenced records fails at commit with an unhandled integrity error instead of the
established 409 response from the individual deletion endpoints.
Code

apps/Backend/src/flycatch_api/api/admin_case_study_categories.py[95]

+attach_bulk_routes(router, resource=RESOURCE, model=BulkModel, not_found_key='admin.case_study_categories.not_found')
Evidence
The added routes use generic bulk deletion without supplying a validate_delete callback, so the
bulk helper skips the relation checks performed by the individual category, industry, and technology
services and issues direct ORM deletes. Because the corresponding case-study link models reference
these records through non-cascading foreign keys, the database rejects deletion of referenced rows
at commit rather than returning a handled in-use conflict.

apps/Backend/src/flycatch_api/api/admin_case_study_categories.py[95-95]
apps/Backend/src/flycatch_api/services/case_study_category_service.py[117-135]
apps/Backend/src/flycatch_api/services/bulk_service.py[55-62]
apps/Backend/src/flycatch_api/models/case_study_category.py[33-44]
apps/Backend/src/flycatch_api/api/admin_industries.py[86-86]
apps/Backend/src/flycatch_api/services/industry_service.py[103-119]
apps/Backend/src/flycatch_api/models/industry.py[33-44]
apps/Backend/src/flycatch_api/api/admin_technologies.py[89-89]
apps/Backend/src/flycatch_api/services/technology_service.py[120-137]
apps/Backend/src/flycatch_api/models/technology.py[33-44]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Bulk deletion must enforce the same reference guards as single-record deletion for case-study categories, industries, and technologies so referenced records produce the established 409 response instead of an unhandled integrity error.

## Issue Context
`attach_bulk_routes` uses the generic direct ORM deletion path unless a `validate_delete` callback is supplied. The category, industry, and technology bulk routes supply no validator, bypassing the linked-case-study checks in their individual services; their non-cascading link foreign keys then cause deletion of referenced records to fail at commit.

## Fix Focus Areas
- apps/Backend/src/flycatch_api/api/admin_case_study_categories.py[95-95]
- apps/Backend/src/flycatch_api/services/case_study_category_service.py[117-135]
- apps/Backend/src/flycatch_api/api/admin_industries.py[86-86]
- apps/Backend/src/flycatch_api/services/industry_service.py[103-119]
- apps/Backend/src/flycatch_api/api/admin_technologies.py[89-89]
- apps/Backend/src/flycatch_api/services/technology_service.py[120-137]
- apps/Backend/src/flycatch_api/services/bulk_service.py[55-62]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

4. Public search parameter ignored 🐞 Bug ≡ Correctness
Description
All four new list_published implementations accept q but never apply it to their queries.
Consequently /public/contacts, /public/downloads, /public/flycatch-saudi-arabia, and
/public/subscriptions return the same unfiltered results for every search term.
Code

apps/Backend/src/flycatch_api/services/catalog_service.py[R1395-1398]

+    def list_published(self, db: Session, q: str | None, page: int, per_page: int) -> PublicContactList:
+        query = db.query(ContactRow).filter(ContactRow.status == ContentStatus.publish)
+        page, per_page, rows, total = _paginate(query.order_by(ContactRow.created_at.desc()), page, per_page)
+        return PublicContactList(items=[self._public(row) for row in rows], page=page, per_page=per_page, total=total)
Evidence
The API forwards q into list_published, and existing application public listing applies an
ilike filter, but each newly added implementation immediately paginates a status-only query.

apps/Backend/src/flycatch_api/api/catalog.py[120-127]
apps/Backend/src/flycatch_api/services/catalog_service.py[270-277]
apps/Backend/src/flycatch_api/services/catalog_service.py[1497-1500]
apps/Backend/src/flycatch_api/services/catalog_service.py[1593-1600]
apps/Backend/src/flycatch_api/services/catalog_service.py[1706-1711]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The four new public list services ignore the `q` value forwarded by the API. Apply entity-appropriate case-insensitive filters before pagination, consistent with existing catalog services, or remove `q` from the routes and contracts if search is unsupported.

## Issue Context
The shared public endpoint exposes `q` and passes it to each service, while existing catalog services filter their queries when it is non-empty.

## Fix Focus Areas
- apps/Backend/src/flycatch_api/services/catalog_service.py[1395-1398]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1497-1500]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1593-1600]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1706-1711]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. Email uniqueness allows case variants 🐞 Bug ☼ Reliability
Description
SubscriptionService treats email uniqueness case-insensitively, but the database uses a normal
case-sensitive PostgreSQL unique constraint. Concurrent or non-service writes can therefore store
addresses such as User@example.com and user@example.com, violating the service's uniqueness
rule.
Code

apps/Backend/alembic/versions/026_contacts_downloads_saudi_subscriptions.py[R66-68]

+        sa.UniqueConstraint("email"),
+    )
+    op.create_index("ix_subscriptions_email", "subscriptions", ["email"])
Evidence
The service queries lower(email) to reject case variants, proving case-insensitive semantics,
whereas the migration and ORM define an ordinary string uniqueness constraint that does not enforce
those semantics at the database boundary.

apps/Backend/alembic/versions/026_contacts_downloads_saudi_subscriptions.py[60-68]
apps/Backend/src/flycatch_api/models/catalog.py[357-368]
apps/Backend/src/flycatch_api/services/catalog_service.py[1354-1363]
apps/Backend/src/flycatch_api/services/catalog_service.py[1725-1738]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The database constraint does not enforce the case-insensitive subscription email uniqueness implemented by the service. Add a unique expression index over `lower(email)` or use an equivalent case-insensitive database type, and align the ORM declaration.

## Issue Context
An application-level pre-check cannot protect concurrent requests or other database writers. Ensure integrity errors from duplicate concurrent writes are also converted to the documented validation response.

## Fix Focus Areas
- apps/Backend/alembic/versions/026_contacts_downloads_saudi_subscriptions.py[60-68]
- apps/Backend/src/flycatch_api/models/catalog.py[357-368]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1354-1363]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1725-1738]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
Review mode: 🧠 Deep: This is a bug-dense cross-cutting change spanning frontend, backend APIs/services, database migration, contracts, and bulk destructive operations across 279 hunks, creating many independent paths where a second review pass can catch subtle defects.

Grey Divider

Tip of the day
💡 Did you know, you can describe a rule in plain language on the Rules page and Qodo drafts it for you

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment on lines +397 to +400
public_contacts = public_uuid(
prefix="/public/contacts",
tags="public-contacts",
list_model=public.PublicContactList,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

1. Public contacts expose pii 🐞 Bug ⛨ Security

The unauthenticated public contacts endpoints enumerate published records containing names, email
addresses, phone numbers, companies, subjects, and message details. Publishing a contact therefore
exposes private inquiry data to arbitrary callers.
Agent Prompt
## Issue description
The public contact list and detail routes expose inquiry PII without authentication. Remove these routes or require appropriate administrative authorization, and remove the corresponding public contract/schema if contacts are not genuinely public content.

## Issue Context
`public_uuid` has no authentication dependency, while `PublicContact` includes identifying and message data.

## Fix Focus Areas
- apps/Backend/src/flycatch_api/api/catalog.py[397-404]
- apps/Backend/src/flycatch_api/main.py[165-165]
- apps/Backend/src/flycatch_api/schemas/public_catalog.py[246-268]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1395-1410]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1466-1478]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +421 to +424
public_subscriptions = public_uuid(
prefix="/public/subscriptions",
tags="public-subscriptions",
list_model=public.PublicSubscriptionList,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

2. Public subscriptions expose emails 🐞 Bug ⛨ Security

The unauthenticated public subscriptions endpoints enumerate subscriber email addresses, activity
state, and creation timestamps. Publishing a subscription therefore discloses the mailing list to
arbitrary callers.
Agent Prompt
## Issue description
The public subscription list and detail routes disclose subscriber email addresses without authentication. Remove these routes or require suitable administrative authorization, and remove the corresponding public contract/schema if subscription records are not public content.

## Issue Context
`public_uuid` has no authentication dependency, and `PublicSubscription` directly includes each subscriber's email address.

## Fix Focus Areas
- apps/Backend/src/flycatch_api/api/catalog.py[421-428]
- apps/Backend/src/flycatch_api/main.py[168-168]
- apps/Backend/src/flycatch_api/schemas/public_catalog.py[319-334]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1706-1723]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1765-1766]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +1395 to +1398
def list_published(self, db: Session, q: str | None, page: int, per_page: int) -> PublicContactList:
query = db.query(ContactRow).filter(ContactRow.status == ContentStatus.publish)
page, per_page, rows, total = _paginate(query.order_by(ContactRow.created_at.desc()), page, per_page)
return PublicContactList(items=[self._public(row) for row in rows], page=page, per_page=per_page, total=total)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

3. Public search parameter ignored 🐞 Bug ≡ Correctness

All four new list_published implementations accept q but never apply it to their queries.
Consequently /public/contacts, /public/downloads, /public/flycatch-saudi-arabia, and
/public/subscriptions return the same unfiltered results for every search term.
Agent Prompt
## Issue description
The four new public list services ignore the `q` value forwarded by the API. Apply entity-appropriate case-insensitive filters before pagination, consistent with existing catalog services, or remove `q` from the routes and contracts if search is unsupported.

## Issue Context
The shared public endpoint exposes `q` and passes it to each service, while existing catalog services filter their queries when it is non-empty.

## Fix Focus Areas
- apps/Backend/src/flycatch_api/services/catalog_service.py[1395-1398]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1497-1500]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1593-1600]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1706-1711]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +66 to +68
sa.UniqueConstraint("email"),
)
op.create_index("ix_subscriptions_email", "subscriptions", ["email"])

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Remediation recommended

4. Email uniqueness allows case variants 🐞 Bug ☼ Reliability

SubscriptionService treats email uniqueness case-insensitively, but the database uses a normal
case-sensitive PostgreSQL unique constraint. Concurrent or non-service writes can therefore store
addresses such as User@example.com and user@example.com, violating the service's uniqueness
rule.
Agent Prompt
## Issue description
The database constraint does not enforce the case-insensitive subscription email uniqueness implemented by the service. Add a unique expression index over `lower(email)` or use an equivalent case-insensitive database type, and align the ORM declaration.

## Issue Context
An application-level pre-check cannot protect concurrent requests or other database writers. Ensure integrity errors from duplicate concurrent writes are also converted to the documented validation response.

## Fix Focus Areas
- apps/Backend/alembic/versions/026_contacts_downloads_saudi_subscriptions.py[60-68]
- apps/Backend/src/flycatch_api/models/catalog.py[357-368]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1354-1363]
- apps/Backend/src/flycatch_api/services/catalog_service.py[1725-1738]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

_raise(error)
return Response(status_code=status.HTTP_204_NO_CONTENT)

attach_bulk_routes(router, resource=RESOURCE, model=BulkModel, not_found_key='admin.case_study_categories.not_found')

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

5. Referenced categories cause bulk failure 🐞 Bug ≡ Correctness

Bulk deletion of case-study categories, industries, and technologies bypasses their existing in-use
checks and attempts direct deletion. Because their case-study link foreign keys do not cascade,
deleting referenced records fails at commit with an unhandled integrity error instead of the
established 409 response from the individual deletion endpoints.
Agent Prompt
## Issue description
Bulk deletion must enforce the same reference guards as single-record deletion for case-study categories, industries, and technologies so referenced records produce the established 409 response instead of an unhandled integrity error.

## Issue Context
`attach_bulk_routes` uses the generic direct ORM deletion path unless a `validate_delete` callback is supplied. The category, industry, and technology bulk routes supply no validator, bypassing the linked-case-study checks in their individual services; their non-cascading link foreign keys then cause deletion of referenced records to fail at commit.

## Fix Focus Areas
- apps/Backend/src/flycatch_api/api/admin_case_study_categories.py[95-95]
- apps/Backend/src/flycatch_api/services/case_study_category_service.py[117-135]
- apps/Backend/src/flycatch_api/api/admin_industries.py[86-86]
- apps/Backend/src/flycatch_api/services/industry_service.py[103-119]
- apps/Backend/src/flycatch_api/api/admin_technologies.py[89-89]
- apps/Backend/src/flycatch_api/services/technology_service.py[120-137]
- apps/Backend/src/flycatch_api/services/bulk_service.py[55-62]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants