- Move React/Vite frontend to apps/web/ (@budgetwise/web)
- Add apps/appwrite/ (@budgetwise/appwrite) to source-control the
Appwrite backend: declarative schema in appwrite.json (5 collections),
CLI-based deploy.sh for containerized use, functions/ dir for future
Appwrite Functions
- Add turbo.json for task orchestration (build, deploy, dev)
- Replace .gitlab-ci.yml with Woodpecker CI pipelines in .woodpecker/:
web-production.yml — push to main → build + rsync to prod
web-staging.yml — push to staging → build + rsync to staging
web-preview.yml — PR open → deploy to {pr}.{domain}; PR close → cleanup
appwrite.yml — schema changes in apps/appwrite/ → CLI deploy
- All secrets injected via Woodpecker CI (no committed .env files)
170 lines
7.6 KiB
JSON
170 lines
7.6 KiB
JSON
{
|
|
"$schema": "https://appwrite.io/sdk/schemas/appwrite.json",
|
|
"projectId": "",
|
|
"projectName": "BudgetWise",
|
|
"databases": [
|
|
{
|
|
"databaseId": "budget_db",
|
|
"name": "BudgetWise",
|
|
"enabled": true,
|
|
"collections": [
|
|
{
|
|
"databaseId": "budget_db",
|
|
"collectionId": "balance_sheets",
|
|
"name": "Balance Sheets",
|
|
"enabled": true,
|
|
"documentSecurity": false,
|
|
"permissions": [
|
|
"read(\"users\")",
|
|
"create(\"users\")",
|
|
"update(\"users\")",
|
|
"delete(\"users\")"
|
|
],
|
|
"attributes": [
|
|
{ "key": "month", "type": "integer", "required": true, "array": false },
|
|
{ "key": "year", "type": "integer", "required": true, "array": false },
|
|
{ "key": "buffer_type", "type": "string", "size": 20, "required": true, "array": false },
|
|
{ "key": "buffer_value", "type": "float", "required": true, "default": 0, "array": false },
|
|
{ "key": "user_id", "type": "string", "size": 64, "required": true, "array": false }
|
|
],
|
|
"indexes": [
|
|
{
|
|
"key": "user_month_year",
|
|
"type": "key",
|
|
"attributes": ["user_id", "month", "year"],
|
|
"orders": ["ASC", "DESC", "DESC"]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"databaseId": "budget_db",
|
|
"collectionId": "incomes",
|
|
"name": "Incomes",
|
|
"enabled": true,
|
|
"documentSecurity": false,
|
|
"permissions": [
|
|
"read(\"users\")",
|
|
"create(\"users\")",
|
|
"update(\"users\")",
|
|
"delete(\"users\")"
|
|
],
|
|
"attributes": [
|
|
{ "key": "balance_sheet_id", "type": "string", "size": 64, "required": true, "array": false },
|
|
{ "key": "name", "type": "string", "size": 128,"required": true, "array": false },
|
|
{ "key": "amount", "type": "float", "required": true, "array": false },
|
|
{ "key": "frequency", "type": "string", "size": 20, "required": true, "array": false },
|
|
{ "key": "user_id", "type": "string", "size": 64, "required": true, "array": false }
|
|
],
|
|
"indexes": [
|
|
{
|
|
"key": "user_sheet",
|
|
"type": "key",
|
|
"attributes": ["user_id", "balance_sheet_id"],
|
|
"orders": []
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"databaseId": "budget_db",
|
|
"collectionId": "buckets",
|
|
"name": "Buckets",
|
|
"enabled": true,
|
|
"documentSecurity": false,
|
|
"permissions": [
|
|
"read(\"users\")",
|
|
"create(\"users\")",
|
|
"update(\"users\")",
|
|
"delete(\"users\")"
|
|
],
|
|
"attributes": [
|
|
{ "key": "name", "type": "string", "size": 128, "required": true, "array": false },
|
|
{ "key": "description", "type": "string", "size": 512, "required": false, "default": "", "array": false },
|
|
{ "key": "type", "type": "string", "size": 32, "required": true, "array": false },
|
|
{ "key": "current_balance", "type": "float", "required": true, "default": 0, "array": false },
|
|
{ "key": "goal_amount", "type": "float", "required": false, "default": 0, "array": false },
|
|
{ "key": "goal_type", "type": "string", "size": 20, "required": false, "default": "amount", "array": false },
|
|
{ "key": "goal_frequency", "type": "string", "size": 20, "required": false, "default": "monthly", "array": false },
|
|
{ "key": "return_percent", "type": "float", "required": false, "default": 0, "array": false },
|
|
{ "key": "return_frequency", "type": "string", "size": 20, "required": false, "default": "yearly", "array": false },
|
|
{ "key": "color", "type": "string", "size": 16, "required": true, "array": false },
|
|
{ "key": "sort_order", "type": "integer", "required": false, "default": 0, "array": false },
|
|
{ "key": "user_id", "type": "string", "size": 64, "required": true, "array": false }
|
|
],
|
|
"indexes": [
|
|
{
|
|
"key": "user_order",
|
|
"type": "key",
|
|
"attributes": ["user_id", "sort_order"],
|
|
"orders": ["ASC", "ASC"]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"databaseId": "budget_db",
|
|
"collectionId": "debts",
|
|
"name": "Debts",
|
|
"enabled": true,
|
|
"documentSecurity": false,
|
|
"permissions": [
|
|
"read(\"users\")",
|
|
"create(\"users\")",
|
|
"update(\"users\")",
|
|
"delete(\"users\")"
|
|
],
|
|
"attributes": [
|
|
{ "key": "name", "type": "string", "size": 128, "required": true, "array": false },
|
|
{ "key": "principal", "type": "float", "required": true, "array": false },
|
|
{ "key": "remaining_balance", "type": "float", "required": true, "array": false },
|
|
{ "key": "interest_rate", "type": "float", "required": true, "array": false },
|
|
{ "key": "interest_frequency", "type": "string", "size": 20, "required": true, "array": false },
|
|
{ "key": "term_months", "type": "integer", "required": true, "array": false },
|
|
{ "key": "monthly_payment", "type": "float", "required": true, "array": false },
|
|
{ "key": "is_auto_calculated", "type": "boolean", "required": true, "default": false, "array": false },
|
|
{ "key": "start_date", "type": "string", "size": 24, "required": true, "array": false },
|
|
{ "key": "user_id", "type": "string", "size": 64, "required": true, "array": false }
|
|
],
|
|
"indexes": [
|
|
{
|
|
"key": "user_id_idx",
|
|
"type": "key",
|
|
"attributes": ["user_id"],
|
|
"orders": []
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"databaseId": "budget_db",
|
|
"collectionId": "transactions",
|
|
"name": "Transactions",
|
|
"enabled": true,
|
|
"documentSecurity": false,
|
|
"permissions": [
|
|
"read(\"users\")",
|
|
"create(\"users\")",
|
|
"update(\"users\")",
|
|
"delete(\"users\")"
|
|
],
|
|
"attributes": [
|
|
{ "key": "bucket_id", "type": "string", "size": 64, "required": true, "array": false },
|
|
{ "key": "type", "type": "string", "size": 20, "required": true, "array": false },
|
|
{ "key": "amount", "type": "float", "required": true, "array": false },
|
|
{ "key": "date", "type": "string", "size": 24, "required": true, "array": false },
|
|
{ "key": "notes", "type": "string", "size": 512, "required": false, "default": "", "array": false },
|
|
{ "key": "balance_after","type": "float", "required": true, "array": false },
|
|
{ "key": "user_id", "type": "string", "size": 64, "required": true, "array": false }
|
|
],
|
|
"indexes": [
|
|
{
|
|
"key": "user_bucket_date",
|
|
"type": "key",
|
|
"attributes": ["user_id", "bucket_id", "date"],
|
|
"orders": ["ASC", "ASC", "DESC"]
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"functions": []
|
|
}
|