diff --git a/.github/workflows/backend-worker-deploy.yml b/.github/workflows/backend-worker-deploy.yml index c2d4d9b..2d8e024 100644 --- a/.github/workflows/backend-worker-deploy.yml +++ b/.github/workflows/backend-worker-deploy.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - develop # Add develop branch paths: - 'backend/**' # Trigger only on changes in the backend directory @@ -23,8 +24,15 @@ jobs: run: npm install working-directory: ./backend - - name: Deploy Worker - run: npx wrangler deploy + - name: Determine environment and deploy + run: | + if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then + npm run deploy:prod + elif [[ "${{ github.ref }}" == "refs/heads/develop" ]]; then + npm run deploy:dev + else + echo "Not deploying from main or develop branch." + fi working-directory: ./backend env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} diff --git a/.github/workflows/frontend-pages-deploy.yml b/.github/workflows/frontend-pages-deploy.yml index 6985e1b..87185f1 100644 --- a/.github/workflows/frontend-pages-deploy.yml +++ b/.github/workflows/frontend-pages-deploy.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - develop # Add develop branch paths: - 'frontend/**' # Trigger only on changes in the frontend directory @@ -24,7 +25,14 @@ jobs: working-directory: ./frontend - name: Build Flutter web app - run: flutter build web --release + run: | + if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then + flutter build web --release --target=lib/main.dart + elif [[ "${{ github.ref }}" == "refs/heads/develop" ]]; then + flutter build web --release --target=lib/main_dev.dart + else + flutter build web --release # Default for other branches, can be adjusted + fi working-directory: ./frontend - name: Deploy to Cloudflare Pages @@ -32,7 +40,7 @@ jobs: with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - projectName: 'better-way-frontend' # Replace with your Cloudflare Pages project name + projectName: 'better-way' # Replace with your Cloudflare Pages project name directory: 'frontend/build/web' # Output directory of Flutter web build - # Optional: If you have a custom build command in Cloudflare Pages, you might not need to specify this here. - # command: 'flutter build web --release' + # For preview deployments on develop branch + branch: ${{ github.ref == 'refs/heads/develop' && 'develop' || '' }} diff --git a/backend/package.json b/backend/package.json index 33ea971..a12a376 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,6 +4,8 @@ "private": true, "scripts": { "deploy": "wrangler deploy", + "deploy:prod": "wrangler deploy --env production", + "deploy:dev": "wrangler deploy --env development", "dev": "wrangler dev", "start": "wrangler dev", "test": "vitest", diff --git a/backend/wrangler.jsonc b/backend/wrangler.jsonc index 812bdca..d12ed54 100644 --- a/backend/wrangler.jsonc +++ b/backend/wrangler.jsonc @@ -18,34 +18,33 @@ "binding": "DB", "database_name": "better-way", "database_id": "6d28c3bc-8d02-4b49-ba94-bef717c79fd8" + }, + { + "binding": "DB_BETTER_WAY_DEV", + "database_name": "better-way-dev", + "database_id": "2149f868-57ae-438a-bf98-372380047600" + } + ], + "env": { + "production": { + "name": "better-way-worker-prod", + "d1_databases": [ + { + "binding": "DB", + "database_name": "better-way", + "database_id": "6d28c3bc-8d02-4b49-ba94-bef717c79fd8" + } + ] + }, + "development": { + "name": "better-way-worker-dev", + "d1_databases": [ + { + "binding": "DB", + "database_name": "better-way-dev", + "database_id": "2149f868-57ae-438a-bf98-372380047600" + } + ] } - ] - /** - * Smart Placement - * https://developers.cloudflare.com/workers/configuration/smart-placement/#smart-placement - */ - // "placement": { "mode": "smart" } - /** - * Bindings - * Bindings allow your Worker to interact with resources on the Cloudflare Developer Platform, including - * databases, object storage, AI inference, real-time communication and more. - * https://developers.cloudflare.com/workers/runtime-apis/bindings/ - */ - /** - * Environment Variables - * https://developers.cloudflare.com/workers/wrangler/configuration/#environment-variables - * Note: Use secrets to store sensitive data. - * https://developers.cloudflare.com/workers/configuration/secrets/ - */ - // "vars": { "MY_VARIABLE": "production_value" } - /** - * Static Assets - * https://developers.cloudflare.com/workers/static-assets/binding/ - */ - // "assets": { "directory": "./public/", "binding": "ASSETS" } - /** - * Service Bindings (communicate between multiple Workers) - * https://developers.cloudflare.com/workers/wrangler/configuration/#service-bindings - */ - // "services": [ { "binding": "MY_SERVICE", "service": "my-service" } ] + } } \ No newline at end of file diff --git a/frontend/lib/app.dart b/frontend/lib/app.dart index 1205b84..0f53719 100644 --- a/frontend/lib/app.dart +++ b/frontend/lib/app.dart @@ -1,3 +1,4 @@ +import 'package:better_way/core/config/app_config.dart'; import 'package:better_way/resources/resources.dart'; import 'package:better_way/router/app_router.dart'; import 'package:flutter/material.dart'; @@ -8,7 +9,10 @@ class App extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp.router( - title: 'Better Way', + title: switch (appConfig.flavor) { + .dev => 'Better Way Dev', + .prod => 'Better Way', + }, debugShowCheckedModeBanner: false, routerConfig: appRouter, theme: AppTheme.lightTheme, diff --git a/frontend/lib/core/config/app_config.dart b/frontend/lib/core/config/app_config.dart new file mode 100644 index 0000000..8bd0a76 --- /dev/null +++ b/frontend/lib/core/config/app_config.dart @@ -0,0 +1,12 @@ +AppConfig appConfig = AppConfig.prod(); + +enum Flavor { dev, prod } + +class AppConfig { + final String baseUrl; + final Flavor flavor; + + AppConfig.dev() : flavor = .dev, baseUrl = 'https://api-dev-betterway.leeeeeoy.xyz'; + + AppConfig.prod() : flavor = .prod, baseUrl = 'https://api-betterway.leeeeeoy.xyz'; +} diff --git a/frontend/lib/core/network/api_service.dart b/frontend/lib/core/network/api_service.dart index dfa9cd5..c241062 100644 --- a/frontend/lib/core/network/api_service.dart +++ b/frontend/lib/core/network/api_service.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:better_way/core/config/app_config.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:http/http.dart' as http; @@ -37,7 +38,7 @@ class ApiService { } final apiServiceProvider = Provider((ref) { - const workerBaseUrl = 'https://api-betterway.leeeeeoy.xyz'; + final workerBaseUrl = appConfig.baseUrl; return ApiService(workerBaseUrl); }); diff --git a/frontend/lib/main_dev.dart b/frontend/lib/main_dev.dart new file mode 100644 index 0000000..d5b2940 --- /dev/null +++ b/frontend/lib/main_dev.dart @@ -0,0 +1,15 @@ +import 'package:better_way/app.dart'; +import 'package:better_way/core/config/app_config.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_web_plugins/url_strategy.dart'; + +void main() { + usePathUrlStrategy(); + + WidgetsFlutterBinding.ensureInitialized(); + + appConfig = AppConfig.dev(); + + runApp(ProviderScope(child: App())); +}