Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
d55e983
Merge pull request #1 from MicroPyramid/dev
ashwin31 Apr 10, 2025
5c1c6b7
Merge pull request #2 from MicroPyramid/dev
ashwin31 Apr 15, 2025
c2b2d1b
feat: implement lead conversion functionality with related contact, a…
ashwin31 Apr 15, 2025
7a01d44
feat: Add account management pages and delete functionality
ashwin31 Apr 15, 2025
ad96fd0
feat: Implement account closure and reopening functionality with user…
ashwin31 Apr 15, 2025
ff80106
Merge pull request #3 from MicroPyramid/dev
ashwin31 Apr 15, 2025
5c78a5e
Add banner image, enhance layout and sidebar, and improve lead manage…
ashwin31 Apr 16, 2025
e616221
feat: Enhance lead creation and listing pages with improved validatio…
ashwin31 Apr 17, 2025
94bcbc1
feat: Remove title field from User model and update related lead hand…
ashwin31 Apr 17, 2025
0e34763
feat: Refactor lead detail page layout for improved responsiveness an…
ashwin31 Apr 17, 2025
28115ee
feat: Remove GitHub prompts directory from .gitignore
ashwin31 Apr 17, 2025
5751bec
feat: Add .github directory to .gitignore to prevent tracking of GitH…
ashwin31 Apr 17, 2025
32e2ee5
Enhance lead detail page UI with improved styling and layout
ashwin31 Apr 17, 2025
465c309
feat: Remove Quick Actions section from lead detail page for cleaner UI
ashwin31 Apr 17, 2025
6e4b852
feat(tasks): add endpoints for task management, comments, due dates, …
ashwin31 Apr 17, 2025
4a1226e
feat(TaskModal): enhance loading state and improve UI layout for task…
ashwin31 Apr 17, 2025
5811e97
feat(Board): implement add card functionality and enhance column menu…
ashwin31 Apr 17, 2025
ed25770
feat: enhance accounts management with dropdowns, status filtering, a…
ashwin31 Apr 17, 2025
9826dd8
Merge pull request #4 from MicroPyramid/dev
ashwin31 Apr 17, 2025
fedfc50
feat: update flowbite-svelte-blocks to version 2.0.0, enhance comment…
ashwin31 Apr 17, 2025
32e3155
feat(Contacts): implement add contact functionality with form validat…
ashwin31 Apr 17, 2025
ac058f6
feat(Opportunities): implement add, edit, and delete functionality wi…
ashwin31 Apr 18, 2025
8a0879e
feat(Contacts): implement contact details view and edit functionality…
ashwin31 Apr 18, 2025
86a1e03
feat(Cases): implement CRUD functionality for cases, including filter…
ashwin31 Apr 18, 2025
3b79296
feat(Tasks): add task management functionality with modal for adding …
ashwin31 Apr 18, 2025
688808e
refactor(Sidebar): remove unused menu and links data structures
ashwin31 Apr 18, 2025
589ba9f
Merge pull request #5 from MicroPyramid/dev
ashwin31 Apr 18, 2025
abe7b3d
chore: update .gitignore and add ENV.md for environment variables
ashwin31 Apr 18, 2025
573839c
Add admin blog management features
ashwin31 Apr 18, 2025
d8dcc29
feat(Sitemap): add sitemap.xml generation with manual URLs and blog p…
ashwin31 Apr 18, 2025
e4db56b
Merge pull request #6 from MicroPyramid/dev
ashwin31 Apr 18, 2025
8db4495
feat: add CONTRIBUTING.md and LICENSE files for project guidelines an…
ashwin31 Apr 18, 2025
a1c5445
Merge pull request #7 from MicroPyramid/dev
ashwin31 Apr 18, 2025
f6dfc5c
feat: enhance README and add Open Source section with GitHub links
ashwin31 Apr 18, 2025
086f721
feat: add build and deploy workflow for automated deployment to server
ashwin31 Apr 18, 2025
eeab25f
Merge pull request #8 from MicroPyramid/dev
ashwin31 Apr 18, 2025
a0f3758
feat: add pnpm installation step in build and deploy workflow
ashwin31 Apr 18, 2025
1a00007
Merge pull request #9 from MicroPyramid/dev
ashwin31 Apr 18, 2025
80ad6d8
feat: refactor build and deploy workflow for improved structure and c…
ashwin31 Apr 18, 2025
9874edd
Merge pull request #10 from MicroPyramid/dev
ashwin31 Apr 18, 2025
21d7ce2
feat: update build and deploy workflow to use Docker for containerize…
ashwin31 Apr 18, 2025
2858b73
feat: add invoice management pages including list, create, edit, and …
ashwin31 Apr 18, 2025
003daa8
feat: enhance invoice pages with improved styling and layout for bett…
ashwin31 Apr 18, 2025
e79aa5b
feat: enhance invoice list page with search, status filter, date rang…
ashwin31 Apr 18, 2025
c2c8f24
Remove obsolete migration files and clean up database schema
ashwin31 Apr 24, 2025
12cc1a7
feat: update logout redirection and enhance organization creation for…
ashwin31 Apr 24, 2025
e103e00
feat: enhance sidebar item styling and improve logout session cleanup
ashwin31 Apr 27, 2025
4302b74
fix: adjust sidebar padding and remove global body styles for improve…
ashwin31 Apr 27, 2025
d6d6b73
feat: enhance organization handling by adding org_name to locals and …
ashwin31 Apr 30, 2025
420a938
feat: update organization role handling and remove isPrimary field fr…
ashwin31 Apr 30, 2025
7b76782
feat: add logout functionality and enhance user management interface
ashwin31 Apr 30, 2025
57dcf9b
Merge pull request #11 from MicroPyramid/dev
ashwin31 Apr 30, 2025
e12891a
feat: implement task management UI with modal for creating and editin…
ashwin31 Apr 30, 2025
65d55be
Merge pull request #12 from MicroPyramid/dev
ashwin31 May 22, 2025
21c7a83
Refactor user roles in Prisma schema, update Navbar and Sidebar compo…
ashwin31 May 22, 2025
e9d8983
feat: Allow users to add new users to their organization
google-labs-jules[bot] May 24, 2025
31e6f20
Merge pull request #13 from MicroPyramid/dev
ashwin31 May 24, 2025
f1e277a
Merge pull request #14 from MicroPyramid/feat/add-user-to-org
ashwin31 May 24, 2025
ff81cfa
Refactor user management pages: consolidate user addition and organiz…
ashwin31 May 24, 2025
c59b466
Merge pull request #15 from MicroPyramid/dev
ashwin31 May 24, 2025
bbd70b5
Refactor lead detail page layout and enhance form handling
ashwin31 May 24, 2025
f6747c4
feat: Add support page with information and contact details; update s…
ashwin31 May 24, 2025
f8ac873
refactor: Remove user authorization checks from board and user actions
ashwin31 May 24, 2025
f367392
Refactor task management routes and components
ashwin31 May 24, 2025
9475923
feat: Enhance organization-based access control across account, case,…
ashwin31 May 24, 2025
da787c7
Merge pull request #16 from MicroPyramid/dev
ashwin31 May 24, 2025
b7c1275
Refactor blog post loading and management
ashwin31 May 25, 2025
46bd418
refactor: Remove console.log statements from various server files and…
ashwin31 May 25, 2025
047e23b
feat: Implement admin route access control for micropyramid.com domai…
ashwin31 May 25, 2025
b1d147a
Merge pull request #17 from MicroPyramid/dev
ashwin31 May 25, 2025
ae22c07
Refactor event handlers to use 'onclick' instead of 'on:click' in var…
ashwin31 May 25, 2025
987b58c
Merge pull request #18 from MicroPyramid/dev
ashwin31 May 25, 2025
e92852b
Add Privacy Policy and Terms of Service pages with comprehensive lega…
ashwin31 May 27, 2025
2b222cc
feat: Implement newsletter management and analytics dashboard
ashwin31 May 27, 2025
aa87dbc
feat: Revamp login page with enhanced UI and Google login integration
ashwin31 May 27, 2025
3b2d8bb
feat: Update layout and sidebar components for improved navigation an…
ashwin31 May 27, 2025
63f9327
feat: Enhance layout and sidebar components for improved navigation a…
ashwin31 May 27, 2025
7ad445a
feat: Revamp organization selection and creation pages with improved …
ashwin31 May 27, 2025
e03bd95
Refactor task creation page and user management page with improved UI…
ashwin31 May 27, 2025
1c9979e
feat: Enhance task calendar UI with improved styling and layout
ashwin31 May 27, 2025
21ab8d1
feat: Revamp task calendar layout and enhance task display with impro…
ashwin31 May 27, 2025
4801762
Enhance support and task detail pages with improved layout and UI com…
ashwin31 May 27, 2025
0cfe8e4
feat: Enhance layout and UI components for sidebar and mobile menu; r…
ashwin31 May 27, 2025
4282948
Enhance dark mode support across task creation and user management pages
ashwin31 May 27, 2025
619cae4
Merge pull request #21 from MicroPyramid/dev
ashwin31 May 27, 2025
28a7293
Enhance dark mode support for Open Leads page
ashwin31 May 27, 2025
9af5c4c
feat: Remove unused account-related pages and add server load functio…
ashwin31 May 27, 2025
87bb933
feat(opportunities): enhance opportunity edit and create forms
ashwin31 May 28, 2025
6256676
feat(tasks): enhance task creation with account validation and improv…
ashwin31 May 28, 2025
cdfcddd
Remove account deletion page and associated logic
ashwin31 May 28, 2025
f4dd660
Merge pull request #22 from MicroPyramid/dev
ashwin31 May 28, 2025
f667e1d
feat(contact): add ContactSubmission model and migration
ashwin31 May 28, 2025
8f0e8e0
feat(contact): implement contact submission handling with server-side…
ashwin31 May 28, 2025
4c9afe4
Merge pull request #27 from MicroPyramid/dev
ashwin31 May 28, 2025
a5330ec
Update contact management and migration pages for clarity and accuracy
ashwin31 May 28, 2025
705491e
Merge pull request #28 from MicroPyramid/dev
ashwin31 May 28, 2025
fc37787
Enhance SEO and structured data across site pages
ashwin31 May 28, 2025
e4c268d
refactor: remove unused Flowbite dependencies and clean up CSS
ashwin31 May 28, 2025
dd65206
refactor: remove FontAwesome icons and dependencies, update blog page…
ashwin31 May 28, 2025
873c7a3
Merge pull request #29 from MicroPyramid/dev
ashwin31 May 28, 2025
f52dc96
feat: add Google Analytics tracking script to app.html
ashwin31 Jun 1, 2025
d5d4dcc
refactor: update Prisma client import and adjust organization ID hand…
ashwin31 Jun 3, 2025
8a9441b
Merge pull request #31 from MicroPyramid/dev
ashwin31 Jun 3, 2025
dda018a
refactor login token params
ashwin31 Jun 4, 2025
a52dd58
Merge pull request #32 from MicroPyramid/codex/refactor-login-page-pa…
ashwin31 Jun 4, 2025
dd6c445
feat: enhance accessibility by adding labels to input fields across v…
ashwin31 Jun 7, 2025
18c3aff
Merge pull request #35 from MicroPyramid/dev
ashwin31 Jun 7, 2025
5ab2248
Implement code changes to enhance functionality and improve performance
ashwin31 Jun 10, 2025
1631328
Merge pull request #48 from MicroPyramid/dev
ashwin31 Jun 10, 2025
e591341
feat: replace label elements with span for lead details to improve se…
ashwin31 Jun 10, 2025
aab9098
fix: ensure proper formatting by adding newline at the end of +layout…
ashwin31 Jun 10, 2025
5b1075e
Merge pull request #49 from MicroPyramid/dev
ashwin31 Jun 10, 2025
591fa06
Refactor data structure and form handling for account and lead creation
ashwin31 Jun 18, 2025
de1c733
feat: implement user dropdown functionality with click outside detection
ashwin31 Jun 18, 2025
34cc6ec
feat: enhance accessibility for dropdown menu with keyboard navigatio…
ashwin31 Jun 18, 2025
ec471ae
Merge pull request #51 from MicroPyramid/dev
ashwin31 Jun 18, 2025
c2a5032
feat: improve form styling and accessibility for organization and use…
ashwin31 Jun 18, 2025
da0cf64
feat: remove department field from User model and update profile hand…
ashwin31 Jun 18, 2025
875648c
feat: add phone number validation and formatting
ashwin31 Jun 18, 2025
9d3f8ba
feat: enhance task creation form with loading state and improved acco…
ashwin31 Jun 18, 2025
68bb50e
feat: implement opportunity deletion functionality with confirmation …
ashwin31 Jun 18, 2025
30fc027
Refactor event handlers from 'on:click' to 'onclick' for consistency …
ashwin31 Jun 18, 2025
f832a10
feat: update project context and enhance lead conversion process with…
ashwin31 Jun 18, 2025
f9f5192
feat: add confirmation modal for lead conversion with handling functions
ashwin31 Jun 18, 2025
c518b49
feat: refactor status and priority icon rendering for improved consis…
ashwin31 Jun 18, 2025
bd7b143
feat: remove 'Add Task' button for cleaner UI in contact details
ashwin31 Jun 18, 2025
f9f42fd
feat: enhance lead editing with validation for required fields and ow…
ashwin31 Jun 18, 2025
41f3425
Merge pull request #52 from MicroPyramid/dev
ashwin31 Jun 18, 2025
ac1a802
Add funding configuration for BottleCRM including entity details, fun…
ashwin31 Jul 30, 2025
f49c6d9
feat: update README and add CLAUDE.md for comprehensive project docum…
ashwin31 Jul 30, 2025
aa38ad1
feat: initialize server with Express, add middleware and routes, and …
ashwin31 Jul 30, 2025
e483736
feat: add dashboard API with metrics and recent activity endpoints
ashwin31 Jul 31, 2025
3814777
Merge pull request #64 from MicroPyramid/dev
ashwin31 Jul 31, 2025
2262034
feat: add JWT secret configuration to README and update server port v…
ashwin31 Aug 1, 2025
9f5d5ee
feat: add organizations API with CRUD operations and filtering capabi…
ashwin31 Aug 1, 2025
d81a422
Merge pull request #65 from MicroPyramid/dev
ashwin31 Aug 1, 2025
eb62993
feat: update favicon and add new logo assets; enhance mobile CRM sect…
ashwin31 Aug 1, 2025
3654d6f
feat: enhance documentation with coding standards and JSDoc type safe…
ashwin31 Aug 1, 2025
86dbaac
feat: update copilot instructions to include Svelte 5+ coding standards
ashwin31 Aug 1, 2025
599d66a
feat: enhance type safety and improve form handling across multiple c…
ashwin31 Aug 1, 2025
a5ba51d
feat: enhance type safety in OAuth parameters and organization select…
ashwin31 Aug 1, 2025
1542d77
feat: Add type annotations and improve data handling across various c…
ashwin31 Aug 1, 2025
9d47e04
Merge pull request #66 from MicroPyramid/dev
ashwin31 Aug 1, 2025
0307ef8
feat: enhance type safety and improve error handling in account-relat…
ashwin31 Aug 1, 2025
0e3805a
feat: enhance type safety and error handling across various component…
ashwin31 Aug 1, 2025
830c24b
feat: enhance type safety with JSDoc annotations and improve form han…
ashwin31 Aug 1, 2025
b9323ae
feat: Implement invoice management features including view, edit, and…
ashwin31 Aug 1, 2025
06dc1a6
feat: Improve accessibility by adding 'for' attributes to labels and …
ashwin31 Aug 1, 2025
463cbc1
feat: Enhance type safety with JSDoc annotations and improve error ha…
ashwin31 Aug 1, 2025
64c9b8c
Merge pull request #67 from MicroPyramid/dev
ashwin31 Aug 1, 2025
d70fc32
Migrate to Svelte 5: Update runes, state management, and modern syntax
seb-lewis Aug 2, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
GOOGLE_CLIENT_ID="your-google-client-id-here"
GOOGLE_CLIENT_SECRET="your-google-client-secret-here"
GOOGLE_LOGIN_DOMAIN="http://localhost:5173"
DATABASE_URL="postgresql://username:password@localhost:5432/bottlecrm?schema=public"

# API Configuration
API_PORT=3001
JWT_SECRET=your-super-secure-jwt-secret-key-change-this-in-production
JWT_EXPIRES_IN=24h
FRONTEND_URL=http://localhost:5173

# Logging Configuration
ENABLE_REQUEST_LOGGING=true
LOG_REQUEST_BODY=false
LOG_RESPONSE_BODY=false

# Environment
NODE_ENV=development
27 changes: 27 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
Dear Copilot,

## Project Overview

BottleCRM is a dynamic, SaaS CRM platform designed to streamline the entire CRM needs of startups and enterprises. Built with modern web technologies, it offers a seamless experience for users through robust role-based access control (RBAC). Each user role is equipped with tailored functionalities to enhance efficiency, engagement, and management, ensuring a streamlined and secure business process.

user types we have

- Org
- user(s)
- Admin
- super admin - anyone with @micropyramid.com email to manage whole platform

## Project Context

BottleCRM is a modern CRM application built with:
- **Framework**: SvelteKit 2.21.x, Svelte 5.1, Prisma
- **Styling**: tailwind 4.1.x css
- **Database**: postgresql
- **Icons**: lucide icons
- **Form Validation**: zod

## Important Notes
- We need to ensure access control is strictly enforced based on user roles.
- No record should be accessible unless the user or the org has the appropriate permissions.
- When implementing forms in sveltekit A form label must be associated with a control
- svelte 5+ style coding standards should be followed
56 changes: 56 additions & 0 deletions .github/workflows/build-deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Build and Deploy (Docker)

on:
push:
branches:
- main

jobs:
build-and-deploy:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
push: true
tags: ghcr.io/${{ github.repository }}:latest

- name: Setup SSH
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

- name: Add host key to known_hosts
run: |
mkdir -p ~/.ssh
ssh-keyscan -H ${{ secrets.SERVER_IP }} >> ~/.ssh/known_hosts

- name: Deploy on server (pull and restart container)
run: |
ssh ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_IP }} "docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} && \
docker pull ghcr.io/${{ github.repository }}:latest && \
docker stop svelte-crm || true && docker rm svelte-crm || true && \
docker run -d --name svelte-crm --restart always -p 3000:3000 \
-e NODE_ENV=production \
-e DATABASE_URL=\"${{ secrets.DATABASE_URL }}\" \
--env-file ${{ secrets.ENV_FILE_PATH:-/home/${{ secrets.SERVER_USER }}/.env }} \
ghcr.io/${{ github.repository }}:latest"
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@ vite.config.ts.timestamp-*

generated/*
src/generated/*
.github/prompts/*
23 changes: 23 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"editor.tabSize": 2,
"editor.insertSpaces": true,
"[javascript]": {
"editor.tabSize": 2,
"editor.insertSpaces": true
},
"[svelte]": {
"editor.tabSize": 2,
"editor.insertSpaces": true
},
"github.copilot.chat.codeGeneration.instructions": [
{
"file": "prisma/schema.prisma",
},
{
"file": "src/hooks.server.js",
},
{
"file": "src/lib/prisma.js",
},
]
}
135 changes: 135 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project Overview

BottleCRM is a SaaS CRM platform built with SvelteKit, designed for startups and enterprises with role-based access control (RBAC). The application features multi-tenancy through organizations, with strict data isolation enforced at the database level.

## Technology Stack

- **Frontend**: SvelteKit 2.x with Svelte 5.x
- **Styling**: TailwindCSS 4.x
- **Database**: PostgreSQL with Prisma ORM
- **Icons**: Lucide Svelte
- **Validation**: Zod
- **Package Manager**: pnpm
- **Type Checking**: JSDoc style type annotations (no TypeScript)

## Development Commands

```bash
# Development server
pnpm run dev

# Build for production
pnpm run build

# Preview production build
pnpm run preview

# Type checking
pnpm run check

# Type checking with watch mode
pnpm run check:watch

# Linting and formatting (both required to pass)
pnpm run lint

# Format code
pnpm run format

# Database operations
npx prisma migrate dev
npx prisma generate
npx prisma studio
```

## Architecture Overview

### Multi-Tenant Structure
- **Organizations**: Top-level tenant containers with strict data isolation
- **Users**: Can belong to multiple organizations with different roles (ADMIN/USER)
- **Super Admin**: Users with @micropyramid.com email domain have platform-wide access

### Core CRM Entities
- **Leads**: Initial prospects that can be converted to Accounts/Contacts/Opportunities
- **Accounts**: Company/organization records
- **Contacts**: Individual people associated with accounts
- **Opportunities**: Sales deals with pipeline stages
- **Tasks/Events**: Activity management
- **Cases**: Customer support tickets
- **Products/Quotes**: Sales catalog and quotation system

### Authentication & Authorization
- Session-based authentication using cookies (`session`, `org`, `org_name`)
- Organization selection required after login via `/org` route
- Route protection in `src/hooks.server.js`:
- `/app/*` routes require authentication and organization membership
- `/admin/*` routes restricted to @micropyramid.com domain users
- `/org` route for organization selection

### Data Access Control
- All database queries must include organization filtering
- User can only access data from organizations they belong to
- Prisma schema enforces relationships with `organizationId` foreign keys

### Route Structure
- `(site)`: Public marketing pages
- `(no-layout)`: Auth pages (login, org selection)
- `(app)`: Main CRM application (requires auth + org membership)
- `(admin)`: Platform administration (requires @micropyramid.com email)

### Key Files
- `src/hooks.server.js`: Authentication, org membership validation, route protection
- `src/lib/prisma.js`: Database client configuration
- `src/lib/stores/auth.js`: Authentication state management
- `prisma/schema.prisma`: Complete database schema with RBAC models

## Form Development
- All form labels must be properly associated with form controls for accessibility
- Use Zod for form validation
- Follow existing patterns in `/contacts`, `/leads`, `/accounts` for consistency

## Coding Standards

### Type Safety
- **NO TypeScript**: This project uses JavaScript with JSDoc style type annotations only
- **JSDoc Comments**: Use JSDoc syntax for type information and documentation
- **Type Checking**: Use `pnpm run check` to validate types via JSDoc annotations
- **Function Parameters**: Document parameter types using JSDoc `@param` tags
- **Return Types**: Document return types using JSDoc `@returns` tags

### JSDoc Examples
```javascript
/**
* Updates a contact in the database
* @param {string} contactId - The contact identifier
* @param {Object} updateData - The data to update
* @param {string} updateData.name - Contact name
* @param {string} updateData.email - Contact email
* @param {string} organizationId - Organization ID for data isolation
* @returns {Promise<Object>} The updated contact object
*/
async function updateContact(contactId, updateData, organizationId) {
// Implementation
}

/**
* @typedef {Object} User
* @property {string} id - User ID
* @property {string} email - User email
* @property {string} name - User name
* @property {string[]} organizationIds - Array of organization IDs
*/

/** @type {User|null} */
let currentUser = null;
```

## Security Requirements
- Never expose cross-organization data
- Always filter queries by user's organization membership
- Validate user permissions before any data operations
- Use parameterized queries via Prisma to prevent SQL injection
Loading