diff --git a/.github/workflows/android-release.yml b/.github/workflows/android-release.yml deleted file mode 100644 index f8444ecc..00000000 --- a/.github/workflows/android-release.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: Android Release (Main + Manual) - -on: - push: - branches: - - dev - workflow_dispatch: - inputs: - track: - description: 'Release track' - required: true - default: 'firebase' - type: choice - options: - - firebase - - playstore - -jobs: - build-and-release: - name: Android Release Pipeline - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Setup Java - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '17' - - - name: Setup Flutter - uses: subosito/flutter-action@v2 - with: - flutter-version: "3.38.9" - channel: 'stable' - cache: true - - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: '3.2' - bundler-cache: true - working-directory: android/fastlane - - - name: Install Fastlane gems - working-directory: android/fastlane - run: bundle install - - - name: Setup Service Accounts - env: - GOOGLE_SERVICES_ACCOUNT_BASE64: ${{ secrets.GOOGLE_SERVICES_ACCOUNT_BASE64 }} - CREDENTIAL_FILE_CONTENT: ${{ secrets.CREDENTIAL_FILE_CONTENT }} - run: | - printf '%s' "$GOOGLE_SERVICES_ACCOUNT_BASE64" | base64 --decode > google_service_account.json - printf '%s' "$CREDENTIAL_FILE_CONTENT" > service_credentials_content.json - - - name: Setup Android signing keystore - run: | - printf '%s' "${{ secrets.ANDROID_KEYSTORE_FILE_BASE64 }}" | base64 --decode > android/key.jks - - - name: Setup Android key.properties - run: | - cat < android/key.properties - storePassword=${{ secrets.ANDROID_KEYSTORE_PASSWORD }} - keyPassword=${{ secrets.ANDROID_KEYSTORE_PASSWORD }} - keyAlias=release - storeFile=../key.jks - EOF - - - name: Release to Firebase - if: ${{ github.event_name == 'push' || github.event.inputs.track == 'firebase' }} - working-directory: android/fastlane - run: bundle exec fastlane release_play_store_using_firebase - env: - APP_PACKAGE_NAME: ${{ vars.APP_PACKAGE_NAME }} - FIREBASE_APP_ID: ${{ secrets.FIREBASE_APP_ID }} - - - name: Release to Play Store - if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.track == 'playstore' }} - working-directory: android/fastlane - run: bundle exec fastlane release_play_store - env: - APP_PACKAGE_NAME: ${{ vars.APP_PACKAGE_NAME }} diff --git a/.github/workflows/ios-release.yml b/.github/workflows/ios-release.yml deleted file mode 100644 index 4306d746..00000000 --- a/.github/workflows/ios-release.yml +++ /dev/null @@ -1,119 +0,0 @@ -name: iOS Release (Main + Manual) - -on: - push: - branches: - - dev - workflow_dispatch: - inputs: - track: - description: 'Release track' - required: true - default: 'testflight-dev' - type: choice - options: - - testflight-staging - - testflight-prod - - firebase - -env: - FLUTTER_VERSION: "3.38.9" - FLUTTER_CHANNEL: "stable" - XCODE_VERSION: "26" - RUBY_VERSION: "3.2" - -jobs: - build-and-release: - name: iOS Release Pipeline - runs-on: macos-latest - steps: - - uses: actions/checkout@v4 - - - name: Setup Xcode - uses: maxim-lobanov/setup-xcode@v1 - with: - xcode-version: ${{ env.XCODE_VERSION }} - - - name: Restore DerivedData cache - uses: actions/cache/restore@v4 - id: cache-deriveddata - with: - path: DerivedData - key: deriveddata-${{ github.run_id }} - restore-keys: | - deriveddata- - - - name: Setup Flutter - uses: subosito/flutter-action@v2 - with: - flutter-version: ${{ env.FLUTTER_VERSION }} - channel: ${{ env.FLUTTER_CHANNEL }} - cache: true - - - name: Install Firebase CLI - run: npm install -g firebase-tools - - - name: Install FlutterFire CLI - run: dart pub global activate flutterfire_cli - - - name: Add pub cache to PATH - run: echo "$HOME/.pub-cache/bin" >> $GITHUB_PATH - - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: ${{ env.RUBY_VERSION }} - bundler-cache: true - working-directory: ios/fastlane - - - name: Install Fastlane gems - working-directory: ios/fastlane - run: bundle install - - - name: Setup SSH Key - uses: webfactory/ssh-agent@v0.9.0 - with: - ssh-private-key: ${{ secrets.MATCH_DEPLOY_KEY }} - - - name: Setup Service Accounts - env: - CREDENTIAL_FILE_CONTENT: ${{ secrets.CREDENTIAL_FILE_CONTENT }} - run: | - cat <<< "$CREDENTIAL_FILE_CONTENT" > service_credentials_content.json - - - name: Generate code - run: flutter pub run build_runner build --delete-conflicting-outputs - - - - name: Release to TestFlight (Staging) - if: ${{ github.event_name == 'push' || github.event.inputs.track == 'testflight-staging' }} - working-directory: ios/fastlane - run: bundle exec fastlane release_testflight_staging - env: - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - ASC_KEY_P8_BASE64: ${{ secrets.ASC_KEY_P8_BASE64 }} - - - name: Release to TestFlight (Prod) - if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.track == 'testflight-prod' }} - working-directory: ios/fastlane - run: bundle exec fastlane release_app_store - env: - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - ASC_KEY_P8_BASE64: ${{ secrets.ASC_KEY_P8_BASE64 }} - APP_BUNDLE_ID: ${{ vars.APP_BUNDLE_ID }} - - - name: Release to Firebase (iOS Dev) - if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.track == 'firebase' }} - working-directory: ios/fastlane - run: bundle exec fastlane release_firebase - env: - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - ASC_KEY_P8_BASE64: ${{ secrets.ASC_KEY_P8_BASE64 }} - FIREBASE_APP_ID: ${{ secrets.FIREBASE_APP_ID }} - FIREBASE_APP_ID_IOS_DEV: ${{ secrets.FIREBASE_APP_ID_IOS_DEV }} diff --git a/.github/workflows/staging-distribute.yml b/.github/workflows/staging-distribute.yml new file mode 100644 index 00000000..78cd83c8 --- /dev/null +++ b/.github/workflows/staging-distribute.yml @@ -0,0 +1,151 @@ +name: Staging Distribution (Android + iOS) + +on: + workflow_dispatch: + inputs: + platforms: + description: 'Platforms to distribute' + required: true + default: 'both' + type: choice + options: + - android + - ios + - both + release_notes: + description: 'Release notes' + required: false + type: string + +env: + FLUTTER_VERSION: "3.38.9" + FLUTTER_CHANNEL: "stable" + XCODE_VERSION: "26" + JAVA_VERSION: "17" + RUBY_VERSION: "3.2" + +jobs: + android: + name: Android (Staging → Firebase) + runs-on: ubuntu-latest + if: contains(github.event.inputs.platforms, 'android') || github.event.inputs.platforms == 'both' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: ${{ env.JAVA_VERSION }} + + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: ${{ env.FLUTTER_CHANNEL }} + cache: true + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ env.RUBY_VERSION }} + bundler-cache: true + working-directory: android/fastlane + + - name: Install Fastlane gems + working-directory: android/fastlane + run: bundle install + + - name: Setup Service Accounts + env: + GOOGLE_SERVICES_ACCOUNT_BASE64: ${{ secrets.GOOGLE_SERVICES_ACCOUNT_BASE64 }} + CREDENTIAL_FILE_CONTENT: ${{ secrets.CREDENTIAL_FILE_CONTENT }} + run: | + printf '%s' "$GOOGLE_SERVICES_ACCOUNT_BASE64" | base64 --decode > google_service_account.json + printf '%s' "$CREDENTIAL_FILE_CONTENT" > service_credentials_content.json + + - name: Setup Android signing keystore + run: | + printf '%s' "${{ secrets.ANDROID_KEYSTORE_FILE_BASE64 }}" | base64 --decode > android/key.jks + + - name: Setup Android key.properties + run: | + cat < android/key.properties + storePassword=${{ secrets.ANDROID_KEYSTORE_PASSWORD }} + keyPassword=${{ secrets.ANDROID_KEYSTORE_PASSWORD }} + keyAlias=release + storeFile=../key.jks + EOF + + - name: Distribute to Firebase App Distribution + working-directory: android/fastlane + run: bundle exec fastlane release_play_store_using_firebase release_notes:"${{ github.event.inputs.release_notes }}" + env: + APP_PACKAGE_NAME: ${{ vars.APP_PACKAGE_NAME }} + FIREBASE_APP_ID: ${{ secrets.FIREBASE_APP_ID }} + + ios: + name: iOS (Staging → TestFlight) + runs-on: macos-latest + if: contains(github.event.inputs.platforms, 'ios') || github.event.inputs.platforms == 'both' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Xcode + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: ${{ env.XCODE_VERSION }} + + - name: Restore DerivedData cache + uses: actions/cache/restore@v4 + id: cache-deriveddata + with: + path: DerivedData + key: deriveddata-${{ github.run_id }} + restore-keys: | + deriveddata- + + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: ${{ env.FLUTTER_VERSION }} + channel: ${{ env.FLUTTER_CHANNEL }} + cache: true + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ env.RUBY_VERSION }} + bundler-cache: true + working-directory: ios/fastlane + + - name: Install Fastlane gems + working-directory: ios/fastlane + run: bundle install + + - name: Setup SSH Key + uses: webfactory/ssh-agent@v0.9.0 + with: + ssh-private-key: ${{ secrets.MATCH_DEPLOY_KEY }} + + - name: Setup Service Accounts + env: + CREDENTIAL_FILE_CONTENT: ${{ secrets.CREDENTIAL_FILE_CONTENT }} + run: | + cat <<< "$CREDENTIAL_FILE_CONTENT" > service_credentials_content.json + + - name: Generate code + run: flutter pub run build_runner build --delete-conflicting-outputs + + - name: Distribute to TestFlight (Staging) + working-directory: ios/fastlane + run: bundle exec fastlane release_testflight_staging + env: + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} + ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} + ASC_KEY_P8_BASE64: ${{ secrets.ASC_KEY_P8_BASE64 }} diff --git a/lib/data/database/app_database.dart b/lib/data/database/app_database.dart index de71cd40..b47f03bb 100644 --- a/lib/data/database/app_database.dart +++ b/lib/data/database/app_database.dart @@ -77,9 +77,7 @@ class AppDatabase extends _$AppDatabase with SynchronizerDb { await m.createAll(); }, onUpgrade: (Migrator m, int from, int to) async { - if (from < 4) { - await _schemaUpgrade(m, from, 4); - } + await _schemaUpgrade(m, from, to); }, ); } diff --git a/pubspec.lock b/pubspec.lock index 43d0659f..93295228 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -181,10 +181,10 @@ packages: dependency: transitive description: name: characters - sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.0" charcode: dependency: transitive description: @@ -1276,10 +1276,10 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.11.1" meta: dependency: transitive description: @@ -2150,5 +2150,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.9.0-0 <4.0.0" + dart: ">=3.8.0 <4.0.0" flutter: ">=3.32.0"