diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..33716a1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +name: CI +on: + push: + branches: [ main ] + pull_request: +jobs: + flutter: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: subosito/flutter-action@v2 + with: + channel: stable + - run: flutter --version + - run: flutter pub get + working-directory: android-client + - run: flutter test + working-directory: android-client + go: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v5 + with: + go-version: '1.22' + - run: go test ./... + working-directory: wallet-plugin-go diff --git a/README.md b/README.md index 080a26b..73be36c 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,4 @@ -# opencongopay +# Decentralized Payments -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +Ce monorepo regroupe l'application Flutter et le backend wallet en Go. +Le plugin `walletd` expose des APIs REST pour crediter un compte via les SMS Mobile Money. diff --git a/.metadata b/android-client/.metadata similarity index 100% rename from .metadata rename to android-client/.metadata diff --git a/.vscode/launch.json b/android-client/.vscode/launch.json similarity index 100% rename from .vscode/launch.json rename to android-client/.vscode/launch.json diff --git a/android-client/README.md b/android-client/README.md new file mode 100644 index 0000000..080a26b --- /dev/null +++ b/android-client/README.md @@ -0,0 +1,16 @@ +# opencongopay + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/analysis_options.yaml b/android-client/analysis_options.yaml similarity index 100% rename from analysis_options.yaml rename to android-client/analysis_options.yaml diff --git a/android/.gitignore b/android-client/android/.gitignore similarity index 100% rename from android/.gitignore rename to android-client/android/.gitignore diff --git a/android/app/build.gradle b/android-client/android/app/build.gradle similarity index 100% rename from android/app/build.gradle rename to android-client/android/app/build.gradle diff --git a/android/app/src/debug/AndroidManifest.xml b/android-client/android/app/src/debug/AndroidManifest.xml similarity index 100% rename from android/app/src/debug/AndroidManifest.xml rename to android-client/android/app/src/debug/AndroidManifest.xml diff --git a/android/app/src/main/AndroidManifest.xml b/android-client/android/app/src/main/AndroidManifest.xml similarity index 100% rename from android/app/src/main/AndroidManifest.xml rename to android-client/android/app/src/main/AndroidManifest.xml diff --git a/android/app/src/main/kotlin/com/example/opencongopay/MainActivity.kt b/android-client/android/app/src/main/kotlin/com/example/opencongopay/MainActivity.kt similarity index 100% rename from android/app/src/main/kotlin/com/example/opencongopay/MainActivity.kt rename to android-client/android/app/src/main/kotlin/com/example/opencongopay/MainActivity.kt diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android-client/android/app/src/main/res/drawable-v21/launch_background.xml similarity index 100% rename from android/app/src/main/res/drawable-v21/launch_background.xml rename to android-client/android/app/src/main/res/drawable-v21/launch_background.xml diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android-client/android/app/src/main/res/drawable/launch_background.xml similarity index 100% rename from android/app/src/main/res/drawable/launch_background.xml rename to android-client/android/app/src/main/res/drawable/launch_background.xml diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android-client/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to android-client/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android-client/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to android-client/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android-client/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to android-client/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android-client/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to android-client/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android-client/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to android-client/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/android/app/src/main/res/values-night/styles.xml b/android-client/android/app/src/main/res/values-night/styles.xml similarity index 100% rename from android/app/src/main/res/values-night/styles.xml rename to android-client/android/app/src/main/res/values-night/styles.xml diff --git a/android/app/src/main/res/values/styles.xml b/android-client/android/app/src/main/res/values/styles.xml similarity index 100% rename from android/app/src/main/res/values/styles.xml rename to android-client/android/app/src/main/res/values/styles.xml diff --git a/android/app/src/profile/AndroidManifest.xml b/android-client/android/app/src/profile/AndroidManifest.xml similarity index 100% rename from android/app/src/profile/AndroidManifest.xml rename to android-client/android/app/src/profile/AndroidManifest.xml diff --git a/android/build.gradle b/android-client/android/build.gradle similarity index 100% rename from android/build.gradle rename to android-client/android/build.gradle diff --git a/android/gradle.properties b/android-client/android/gradle.properties similarity index 100% rename from android/gradle.properties rename to android-client/android/gradle.properties diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android-client/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from android/gradle/wrapper/gradle-wrapper.properties rename to android-client/android/gradle/wrapper/gradle-wrapper.properties diff --git a/android/settings.gradle b/android-client/android/settings.gradle similarity index 100% rename from android/settings.gradle rename to android-client/android/settings.gradle diff --git a/ios/.gitignore b/android-client/ios/.gitignore similarity index 100% rename from ios/.gitignore rename to android-client/ios/.gitignore diff --git a/ios/Flutter/AppFrameworkInfo.plist b/android-client/ios/Flutter/AppFrameworkInfo.plist similarity index 100% rename from ios/Flutter/AppFrameworkInfo.plist rename to android-client/ios/Flutter/AppFrameworkInfo.plist diff --git a/ios/Flutter/Debug.xcconfig b/android-client/ios/Flutter/Debug.xcconfig similarity index 100% rename from ios/Flutter/Debug.xcconfig rename to android-client/ios/Flutter/Debug.xcconfig diff --git a/ios/Flutter/Release.xcconfig b/android-client/ios/Flutter/Release.xcconfig similarity index 100% rename from ios/Flutter/Release.xcconfig rename to android-client/ios/Flutter/Release.xcconfig diff --git a/ios/Runner.xcodeproj/project.pbxproj b/android-client/ios/Runner.xcodeproj/project.pbxproj similarity index 100% rename from ios/Runner.xcodeproj/project.pbxproj rename to android-client/ios/Runner.xcodeproj/project.pbxproj diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/android-client/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to android-client/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/android-client/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to android-client/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/android-client/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to android-client/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/android-client/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to android-client/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/android-client/ios/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from ios/Runner.xcworkspace/contents.xcworkspacedata rename to android-client/ios/Runner.xcworkspace/contents.xcworkspacedata diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/android-client/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to android-client/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/android-client/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings similarity index 100% rename from ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to android-client/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/ios/Runner/AppDelegate.swift b/android-client/ios/Runner/AppDelegate.swift similarity index 100% rename from ios/Runner/AppDelegate.swift rename to android-client/ios/Runner/AppDelegate.swift diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to android-client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/android-client/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json similarity index 100% rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json rename to android-client/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/android-client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png similarity index 100% rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png rename to android-client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/android-client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png similarity index 100% rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png rename to android-client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/android-client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png similarity index 100% rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png rename to android-client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/android-client/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md similarity index 100% rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md rename to android-client/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/android-client/ios/Runner/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from ios/Runner/Base.lproj/LaunchScreen.storyboard rename to android-client/ios/Runner/Base.lproj/LaunchScreen.storyboard diff --git a/ios/Runner/Base.lproj/Main.storyboard b/android-client/ios/Runner/Base.lproj/Main.storyboard similarity index 100% rename from ios/Runner/Base.lproj/Main.storyboard rename to android-client/ios/Runner/Base.lproj/Main.storyboard diff --git a/ios/Runner/Info.plist b/android-client/ios/Runner/Info.plist similarity index 100% rename from ios/Runner/Info.plist rename to android-client/ios/Runner/Info.plist diff --git a/ios/Runner/Runner-Bridging-Header.h b/android-client/ios/Runner/Runner-Bridging-Header.h similarity index 100% rename from ios/Runner/Runner-Bridging-Header.h rename to android-client/ios/Runner/Runner-Bridging-Header.h diff --git a/lib/components/.gitkeep b/android-client/lib/components/.gitkeep similarity index 100% rename from lib/components/.gitkeep rename to android-client/lib/components/.gitkeep diff --git a/lib/main.dart b/android-client/lib/main.dart similarity index 100% rename from lib/main.dart rename to android-client/lib/main.dart diff --git a/lib/models/.gitkeep b/android-client/lib/models/.gitkeep similarity index 100% rename from lib/models/.gitkeep rename to android-client/lib/models/.gitkeep diff --git a/lib/models/paymentdetail.dart b/android-client/lib/models/paymentdetail.dart similarity index 100% rename from lib/models/paymentdetail.dart rename to android-client/lib/models/paymentdetail.dart diff --git a/lib/services/.gitkeep b/android-client/lib/services/.gitkeep similarity index 100% rename from lib/services/.gitkeep rename to android-client/lib/services/.gitkeep diff --git a/lib/services/BusinessLayer/balanceupdater.dart b/android-client/lib/services/BusinessLayer/balanceupdater.dart similarity index 100% rename from lib/services/BusinessLayer/balanceupdater.dart rename to android-client/lib/services/BusinessLayer/balanceupdater.dart diff --git a/lib/services/BusinessLayer/retrymanager.dart b/android-client/lib/services/BusinessLayer/retrymanager.dart similarity index 100% rename from lib/services/BusinessLayer/retrymanager.dart rename to android-client/lib/services/BusinessLayer/retrymanager.dart diff --git a/lib/services/BusinessLayer/uistore.dart b/android-client/lib/services/BusinessLayer/uistore.dart similarity index 100% rename from lib/services/BusinessLayer/uistore.dart rename to android-client/lib/services/BusinessLayer/uistore.dart diff --git a/lib/services/DataAccess/dataaccess.dart b/android-client/lib/services/DataAccess/dataaccess.dart similarity index 100% rename from lib/services/DataAccess/dataaccess.dart rename to android-client/lib/services/DataAccess/dataaccess.dart diff --git a/lib/services/DataAccess/dataencrypter.dart b/android-client/lib/services/DataAccess/dataencrypter.dart similarity index 100% rename from lib/services/DataAccess/dataencrypter.dart rename to android-client/lib/services/DataAccess/dataencrypter.dart diff --git a/lib/services/Network/apiclient.dart b/android-client/lib/services/Network/apiclient.dart similarity index 100% rename from lib/services/Network/apiclient.dart rename to android-client/lib/services/Network/apiclient.dart diff --git a/lib/services/SmsListener/smsparser.dart b/android-client/lib/services/SmsListener/smsparser.dart similarity index 100% rename from lib/services/SmsListener/smsparser.dart rename to android-client/lib/services/SmsListener/smsparser.dart diff --git a/lib/widgets/.gitkeep b/android-client/lib/widgets/.gitkeep similarity index 100% rename from lib/widgets/.gitkeep rename to android-client/lib/widgets/.gitkeep diff --git a/lib/widgets/opencongopayapp.dart b/android-client/lib/widgets/opencongopayapp.dart similarity index 100% rename from lib/widgets/opencongopayapp.dart rename to android-client/lib/widgets/opencongopayapp.dart diff --git a/linux/.gitignore b/android-client/linux/.gitignore similarity index 100% rename from linux/.gitignore rename to android-client/linux/.gitignore diff --git a/linux/CMakeLists.txt b/android-client/linux/CMakeLists.txt similarity index 100% rename from linux/CMakeLists.txt rename to android-client/linux/CMakeLists.txt diff --git a/linux/flutter/CMakeLists.txt b/android-client/linux/flutter/CMakeLists.txt similarity index 100% rename from linux/flutter/CMakeLists.txt rename to android-client/linux/flutter/CMakeLists.txt diff --git a/linux/flutter/generated_plugin_registrant.cc b/android-client/linux/flutter/generated_plugin_registrant.cc similarity index 100% rename from linux/flutter/generated_plugin_registrant.cc rename to android-client/linux/flutter/generated_plugin_registrant.cc diff --git a/linux/flutter/generated_plugin_registrant.h b/android-client/linux/flutter/generated_plugin_registrant.h similarity index 100% rename from linux/flutter/generated_plugin_registrant.h rename to android-client/linux/flutter/generated_plugin_registrant.h diff --git a/linux/flutter/generated_plugins.cmake b/android-client/linux/flutter/generated_plugins.cmake similarity index 100% rename from linux/flutter/generated_plugins.cmake rename to android-client/linux/flutter/generated_plugins.cmake diff --git a/linux/main.cc b/android-client/linux/main.cc similarity index 100% rename from linux/main.cc rename to android-client/linux/main.cc diff --git a/linux/my_application.cc b/android-client/linux/my_application.cc similarity index 100% rename from linux/my_application.cc rename to android-client/linux/my_application.cc diff --git a/linux/my_application.h b/android-client/linux/my_application.h similarity index 100% rename from linux/my_application.h rename to android-client/linux/my_application.h diff --git a/macos/.gitignore b/android-client/macos/.gitignore similarity index 100% rename from macos/.gitignore rename to android-client/macos/.gitignore diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/android-client/macos/Flutter/Flutter-Debug.xcconfig similarity index 100% rename from macos/Flutter/Flutter-Debug.xcconfig rename to android-client/macos/Flutter/Flutter-Debug.xcconfig diff --git a/macos/Flutter/Flutter-Release.xcconfig b/android-client/macos/Flutter/Flutter-Release.xcconfig similarity index 100% rename from macos/Flutter/Flutter-Release.xcconfig rename to android-client/macos/Flutter/Flutter-Release.xcconfig diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/android-client/macos/Flutter/GeneratedPluginRegistrant.swift similarity index 100% rename from macos/Flutter/GeneratedPluginRegistrant.swift rename to android-client/macos/Flutter/GeneratedPluginRegistrant.swift diff --git a/macos/Runner.xcodeproj/project.pbxproj b/android-client/macos/Runner.xcodeproj/project.pbxproj similarity index 100% rename from macos/Runner.xcodeproj/project.pbxproj rename to android-client/macos/Runner.xcodeproj/project.pbxproj diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/android-client/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to android-client/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/android-client/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme similarity index 100% rename from macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to android-client/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/android-client/macos/Runner.xcworkspace/contents.xcworkspacedata similarity index 100% rename from macos/Runner.xcworkspace/contents.xcworkspacedata rename to android-client/macos/Runner.xcworkspace/contents.xcworkspacedata diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/android-client/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to android-client/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/macos/Runner/AppDelegate.swift b/android-client/macos/Runner/AppDelegate.swift similarity index 100% rename from macos/Runner/AppDelegate.swift rename to android-client/macos/Runner/AppDelegate.swift diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json rename to android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png rename to android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png rename to android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png rename to android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png rename to android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png rename to android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png rename to android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png similarity index 100% rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png rename to android-client/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/android-client/macos/Runner/Base.lproj/MainMenu.xib similarity index 100% rename from macos/Runner/Base.lproj/MainMenu.xib rename to android-client/macos/Runner/Base.lproj/MainMenu.xib diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/android-client/macos/Runner/Configs/AppInfo.xcconfig similarity index 100% rename from macos/Runner/Configs/AppInfo.xcconfig rename to android-client/macos/Runner/Configs/AppInfo.xcconfig diff --git a/macos/Runner/Configs/Debug.xcconfig b/android-client/macos/Runner/Configs/Debug.xcconfig similarity index 100% rename from macos/Runner/Configs/Debug.xcconfig rename to android-client/macos/Runner/Configs/Debug.xcconfig diff --git a/macos/Runner/Configs/Release.xcconfig b/android-client/macos/Runner/Configs/Release.xcconfig similarity index 100% rename from macos/Runner/Configs/Release.xcconfig rename to android-client/macos/Runner/Configs/Release.xcconfig diff --git a/macos/Runner/Configs/Warnings.xcconfig b/android-client/macos/Runner/Configs/Warnings.xcconfig similarity index 100% rename from macos/Runner/Configs/Warnings.xcconfig rename to android-client/macos/Runner/Configs/Warnings.xcconfig diff --git a/macos/Runner/DebugProfile.entitlements b/android-client/macos/Runner/DebugProfile.entitlements similarity index 100% rename from macos/Runner/DebugProfile.entitlements rename to android-client/macos/Runner/DebugProfile.entitlements diff --git a/macos/Runner/Info.plist b/android-client/macos/Runner/Info.plist similarity index 100% rename from macos/Runner/Info.plist rename to android-client/macos/Runner/Info.plist diff --git a/macos/Runner/MainFlutterWindow.swift b/android-client/macos/Runner/MainFlutterWindow.swift similarity index 100% rename from macos/Runner/MainFlutterWindow.swift rename to android-client/macos/Runner/MainFlutterWindow.swift diff --git a/macos/Runner/Release.entitlements b/android-client/macos/Runner/Release.entitlements similarity index 100% rename from macos/Runner/Release.entitlements rename to android-client/macos/Runner/Release.entitlements diff --git a/pubspec.lock b/android-client/pubspec.lock similarity index 100% rename from pubspec.lock rename to android-client/pubspec.lock diff --git a/pubspec.yaml b/android-client/pubspec.yaml similarity index 100% rename from pubspec.yaml rename to android-client/pubspec.yaml diff --git a/test/services/smslistener_test.dart b/android-client/test/services/smslistener_test.dart similarity index 100% rename from test/services/smslistener_test.dart rename to android-client/test/services/smslistener_test.dart diff --git a/test/widget_test.dart b/android-client/test/widget_test.dart similarity index 100% rename from test/widget_test.dart rename to android-client/test/widget_test.dart diff --git a/web/favicon.png b/android-client/web/favicon.png similarity index 100% rename from web/favicon.png rename to android-client/web/favicon.png diff --git a/web/icons/Icon-192.png b/android-client/web/icons/Icon-192.png similarity index 100% rename from web/icons/Icon-192.png rename to android-client/web/icons/Icon-192.png diff --git a/web/icons/Icon-512.png b/android-client/web/icons/Icon-512.png similarity index 100% rename from web/icons/Icon-512.png rename to android-client/web/icons/Icon-512.png diff --git a/web/icons/Icon-maskable-192.png b/android-client/web/icons/Icon-maskable-192.png similarity index 100% rename from web/icons/Icon-maskable-192.png rename to android-client/web/icons/Icon-maskable-192.png diff --git a/web/icons/Icon-maskable-512.png b/android-client/web/icons/Icon-maskable-512.png similarity index 100% rename from web/icons/Icon-maskable-512.png rename to android-client/web/icons/Icon-maskable-512.png diff --git a/web/index.html b/android-client/web/index.html similarity index 100% rename from web/index.html rename to android-client/web/index.html diff --git a/web/manifest.json b/android-client/web/manifest.json similarity index 100% rename from web/manifest.json rename to android-client/web/manifest.json diff --git a/windows/.gitignore b/android-client/windows/.gitignore similarity index 100% rename from windows/.gitignore rename to android-client/windows/.gitignore diff --git a/windows/CMakeLists.txt b/android-client/windows/CMakeLists.txt similarity index 100% rename from windows/CMakeLists.txt rename to android-client/windows/CMakeLists.txt diff --git a/windows/flutter/CMakeLists.txt b/android-client/windows/flutter/CMakeLists.txt similarity index 100% rename from windows/flutter/CMakeLists.txt rename to android-client/windows/flutter/CMakeLists.txt diff --git a/windows/flutter/generated_plugin_registrant.cc b/android-client/windows/flutter/generated_plugin_registrant.cc similarity index 100% rename from windows/flutter/generated_plugin_registrant.cc rename to android-client/windows/flutter/generated_plugin_registrant.cc diff --git a/windows/flutter/generated_plugin_registrant.h b/android-client/windows/flutter/generated_plugin_registrant.h similarity index 100% rename from windows/flutter/generated_plugin_registrant.h rename to android-client/windows/flutter/generated_plugin_registrant.h diff --git a/windows/flutter/generated_plugins.cmake b/android-client/windows/flutter/generated_plugins.cmake similarity index 100% rename from windows/flutter/generated_plugins.cmake rename to android-client/windows/flutter/generated_plugins.cmake diff --git a/windows/runner/CMakeLists.txt b/android-client/windows/runner/CMakeLists.txt similarity index 100% rename from windows/runner/CMakeLists.txt rename to android-client/windows/runner/CMakeLists.txt diff --git a/windows/runner/Runner.rc b/android-client/windows/runner/Runner.rc similarity index 100% rename from windows/runner/Runner.rc rename to android-client/windows/runner/Runner.rc diff --git a/windows/runner/flutter_window.cpp b/android-client/windows/runner/flutter_window.cpp similarity index 100% rename from windows/runner/flutter_window.cpp rename to android-client/windows/runner/flutter_window.cpp diff --git a/windows/runner/flutter_window.h b/android-client/windows/runner/flutter_window.h similarity index 100% rename from windows/runner/flutter_window.h rename to android-client/windows/runner/flutter_window.h diff --git a/windows/runner/main.cpp b/android-client/windows/runner/main.cpp similarity index 100% rename from windows/runner/main.cpp rename to android-client/windows/runner/main.cpp diff --git a/windows/runner/resource.h b/android-client/windows/runner/resource.h similarity index 100% rename from windows/runner/resource.h rename to android-client/windows/runner/resource.h diff --git a/windows/runner/resources/app_icon.ico b/android-client/windows/runner/resources/app_icon.ico similarity index 100% rename from windows/runner/resources/app_icon.ico rename to android-client/windows/runner/resources/app_icon.ico diff --git a/windows/runner/runner.exe.manifest b/android-client/windows/runner/runner.exe.manifest similarity index 100% rename from windows/runner/runner.exe.manifest rename to android-client/windows/runner/runner.exe.manifest diff --git a/windows/runner/utils.cpp b/android-client/windows/runner/utils.cpp similarity index 100% rename from windows/runner/utils.cpp rename to android-client/windows/runner/utils.cpp diff --git a/windows/runner/utils.h b/android-client/windows/runner/utils.h similarity index 100% rename from windows/runner/utils.h rename to android-client/windows/runner/utils.h diff --git a/windows/runner/win32_window.cpp b/android-client/windows/runner/win32_window.cpp similarity index 100% rename from windows/runner/win32_window.cpp rename to android-client/windows/runner/win32_window.cpp diff --git a/windows/runner/win32_window.h b/android-client/windows/runner/win32_window.h similarity index 100% rename from windows/runner/win32_window.h rename to android-client/windows/runner/win32_window.h diff --git a/docs/en/README.md b/docs/en/README.md new file mode 100644 index 0000000..aa3645a --- /dev/null +++ b/docs/en/README.md @@ -0,0 +1 @@ +English docs coming soon diff --git a/docs/architecture.md b/docs/fr/architecture.md similarity index 100% rename from docs/architecture.md rename to docs/fr/architecture.md diff --git a/docs/fr/contrat-api.yaml b/docs/fr/contrat-api.yaml new file mode 100644 index 0000000..1c15c90 --- /dev/null +++ b/docs/fr/contrat-api.yaml @@ -0,0 +1,58 @@ +openapi: 3.1.0 +info: + title: API Wallet + version: "1.0" +paths: + /api/credits: + post: + summary: Crediter un numero + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + phone: + type: string + amount: + type: integer + timestamp: + type: string + raw_sms: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + id: + type: integer + /wallet/{phone}: + get: + summary: Obtenir le solde + parameters: + - in: path + name: phone + required: true + schema: + type: string + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + balance: + type: integer + /healthz: + get: + summary: Sante du service + responses: + '200': + description: OK diff --git a/docs/fr/installation-android.md b/docs/fr/installation-android.md new file mode 100644 index 0000000..e836d0f --- /dev/null +++ b/docs/fr/installation-android.md @@ -0,0 +1,3 @@ +# Installation Android + +Decrivez comment installer l'application Flutter. diff --git a/docs/fr/installation-server.md b/docs/fr/installation-server.md new file mode 100644 index 0000000..b58f237 --- /dev/null +++ b/docs/fr/installation-server.md @@ -0,0 +1,3 @@ +# Installation du serveur + +Guide pour deployer walletd via Docker. diff --git a/docs/fr/parsers.md b/docs/fr/parsers.md new file mode 100644 index 0000000..030793e --- /dev/null +++ b/docs/fr/parsers.md @@ -0,0 +1,3 @@ +# Formats SMS Operateurs + +Liste des regex pour parser les SMS. diff --git a/wallet-plugin-go/cmd/server/main.go b/wallet-plugin-go/cmd/server/main.go new file mode 100644 index 0000000..c4ff36d --- /dev/null +++ b/wallet-plugin-go/cmd/server/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "encoding/json" + "log" + "net/http" + "time" + + "github.com/go-chi/chi/v5" + _ "github.com/mattn/go-sqlite3" + + "github.com/example/wallet-plugin-go/internal/wallet" +) + +func main() { + store, err := wallet.NewStore("wallet.db") + if err != nil { + log.Fatal(err) + } + + r := chi.NewRouter() + r.Post("/api/credits", func(w http.ResponseWriter, r *http.Request) { + var body struct { + Phone string `json:"phone"` + Amount int64 `json:"amount"` + Timestamp time.Time `json:"timestamp"` + RawSMS string `json:"raw_sms"` + } + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + w.WriteHeader(http.StatusBadRequest) + return + } + id, err := store.AddCredit(wallet.Transaction{ + Phone: body.Phone, + Amount: body.Amount, + RawSMS: body.RawSMS, + Timestamp: body.Timestamp, + }) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + return + } + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]any{"id": id}) + }) + r.Get("/wallet/{phone}", func(w http.ResponseWriter, r *http.Request) { + phone := chi.URLParam(r, "phone") + bal, err := store.Balance(phone) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(map[string]any{"balance": bal}) + }) + r.Get("/healthz", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + }) + + log.Println("listening on :8080") + http.ListenAndServe(":8080", r) +} diff --git a/wallet-plugin-go/go.mod b/wallet-plugin-go/go.mod new file mode 100644 index 0000000..fa16e22 --- /dev/null +++ b/wallet-plugin-go/go.mod @@ -0,0 +1,8 @@ +module github.com/example/wallet-plugin-go + +go 1.22 + +require ( + github.com/go-chi/chi/v5 v5.0.8 + github.com/mattn/go-sqlite3 v1.14.18 +) diff --git a/wallet-plugin-go/go.sum b/wallet-plugin-go/go.sum new file mode 100644 index 0000000..a35edd0 --- /dev/null +++ b/wallet-plugin-go/go.sum @@ -0,0 +1,4 @@ +github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= +github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= diff --git a/wallet-plugin-go/internal/wallet/store.go b/wallet-plugin-go/internal/wallet/store.go new file mode 100644 index 0000000..fa2b8be --- /dev/null +++ b/wallet-plugin-go/internal/wallet/store.go @@ -0,0 +1,96 @@ +package wallet + +import ( + "database/sql" + "errors" + "regexp" + "strconv" + "strings" + "time" + + _ "github.com/mattn/go-sqlite3" +) + +type Store struct { + db *sql.DB +} + +type Transaction struct { + ID int64 + Phone string + Amount int64 + RawSMS string + Timestamp time.Time +} + +var amountRx = regexp.MustCompile(`([0-9]+)`) + +func NewStore(path string) (*Store, error) { + db, err := sql.Open("sqlite3", path) + if err != nil { + return nil, err + } + if _, err := db.Exec(`CREATE TABLE IF NOT EXISTS transactions( + id INTEGER PRIMARY KEY AUTOINCREMENT, + phone TEXT NOT NULL, + amount INTEGER NOT NULL, + raw_sms TEXT NOT NULL, + ts DATETIME NOT NULL + )`); err != nil { + return nil, err + } + return &Store{db: db}, nil +} + +func parseAmount(raw string) (int64, error) { + match := amountRx.FindString(raw) + if match == "" { + return 0, errors.New("amount not found") + } + return strconv.ParseInt(match, 10, 64) +} + +func (s *Store) AddCredit(txn Transaction) (int64, error) { + if txn.Phone == "" || txn.Amount <= 0 || txn.RawSMS == "" { + return 0, errors.New("invalid transaction") + } + + parsed, err := parseAmount(strings.ReplaceAll(txn.RawSMS, " ", "")) + if err != nil { + return 0, err + } + if parsed != txn.Amount { + return 0, errors.New("amount mismatch") + } + + res, err := s.db.Exec(`INSERT INTO transactions(phone,amount,raw_sms,ts) VALUES(?,?,?,?)`, + txn.Phone, txn.Amount, txn.RawSMS, txn.Timestamp) + if err != nil { + return 0, err + } + return res.LastInsertId() +} + +func (s *Store) Balance(phone string) (int64, error) { + var bal sql.NullInt64 + err := s.db.QueryRow(`SELECT COALESCE(SUM(amount),0) FROM transactions WHERE phone=?`, phone).Scan(&bal) + if err != nil { + return 0, err + } + if !bal.Valid { + return 0, nil + } + return bal.Int64, nil +} + +func (s *Store) LastTransaction(phone string) (*Transaction, error) { + row := s.db.QueryRow(`SELECT id, phone, amount, raw_sms, ts FROM transactions WHERE phone=? ORDER BY id DESC LIMIT 1`, phone) + var t Transaction + if err := row.Scan(&t.ID, &t.Phone, &t.Amount, &t.RawSMS, &t.Timestamp); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return nil, err + } + return &t, nil +} diff --git a/wallet-plugin-go/internal/wallet/store_test.go b/wallet-plugin-go/internal/wallet/store_test.go new file mode 100644 index 0000000..0d72675 --- /dev/null +++ b/wallet-plugin-go/internal/wallet/store_test.go @@ -0,0 +1,50 @@ +package wallet + +import ( + "path/filepath" + "testing" + "time" +) + +func TestAddCreditAndBalance(t *testing.T) { + dir := t.TempDir() + store, err := NewStore(filepath.Join(dir, "test.db")) + if err != nil { + t.Fatal(err) + } + + sms := "Transfert de 2000 CDF" + txn := Transaction{Phone: "+243810000111", Amount: 2000, RawSMS: sms, Timestamp: time.Now()} + if _, err := store.AddCredit(txn); err != nil { + t.Fatalf("add credit: %v", err) + } + + bal, err := store.Balance(txn.Phone) + if err != nil { + t.Fatalf("balance: %v", err) + } + if bal != 2000 { + t.Fatalf("got balance %d", bal) + } + + last, err := store.LastTransaction(txn.Phone) + if err != nil { + t.Fatalf("last tx: %v", err) + } + if last == nil || last.Amount != 2000 { + t.Fatalf("unexpected last tx: %#v", last) + } +} + +func TestAmountMismatch(t *testing.T) { + dir := t.TempDir() + store, err := NewStore(filepath.Join(dir, "test.db")) + if err != nil { + t.Fatal(err) + } + sms := "Transfert de 1000 CDF" + txn := Transaction{Phone: "123", Amount: 2000, RawSMS: sms, Timestamp: time.Now()} + if _, err := store.AddCredit(txn); err == nil { + t.Fatal("expected error on mismatch") + } +}