feat: Implement repositories for permissions, profiles, resources, roles, and users

- Added PermissionsRepository for managing permissions, including fetching, creating, and deleting permissions.
- Added ProfileRepository for handling user profile data, including fetching, updating, and uploading avatars.
- Added ResourcesRepository for managing resources, including fetching, creating, updating, and deleting resources.
- Added RolesRepository for managing roles, including fetching all roles and role permissions.
- Added UserRepository for managing user data, including authentication checks, updating user metadata, and fetching user details.
- Created a bindings file for personalization features.
This commit is contained in:
vergiLgood1 2025-05-19 14:22:38 +07:00
parent 867efe0bc9
commit 19b4809611
126 changed files with 559 additions and 206 deletions

View File

@ -1,7 +1,7 @@
import 'package:animated_splash_screen/animated_splash_screen.dart';
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';
import 'package:sigap/src/features/onboarding/screens/onboarding/onboarding_screen.dart';
import 'package:sigap/src/features/onboarding/presentasion/pages/onboarding/onboarding_screen.dart';
import 'package:sigap/src/utils/constants/colors.dart';
import 'package:sigap/src/utils/constants/image_strings.dart';
import 'package:sigap/src/utils/helpers/helper_functions.dart';

View File

@ -1,6 +1,6 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/bindings/auth_bindings.dart';
import 'package:sigap/src/features/onboarding/bindings/onboarding_binding.dart';
import 'package:sigap/src/features/auth/presentasion/bindings/auth_bindings.dart';
import 'package:sigap/src/features/onboarding/presentasion/bindings/onboarding_binding.dart';
class ControllerBindings extends Bindings {
@override
@ -11,7 +11,7 @@ class ControllerBindings extends Bindings {
OnboardingBindings().dependencies();
// Auth Bindings
AuthBindings().dependencies();
AuthControllerBindings().dependencies();
}
}

View File

@ -8,7 +8,7 @@ class UtilityBindings extends Bindings {
@override
void dependencies() {
// Get.put(BackgroundService.instance, permanent: true);
Get.put(NetworkManager());
Get.put(NetworkManager(), permanent: true);
Get.put(logger, permanent: true);
}
}

View File

@ -1,22 +1,22 @@
import 'package:get/get.dart';
import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart';
import 'package:sigap/src/cores/repositories/daily-ops/officers_repository.dart';
import 'package:sigap/src/cores/repositories/daily-ops/units_repository.dart';
import 'package:sigap/src/cores/repositories/personalization/profile_repository.dart';
import 'package:sigap/src/cores/repositories/personalization/roles_repository.dart';
import 'package:sigap/src/cores/repositories/personalization/users_repository.dart';
import 'package:sigap/src/features/auth/data/bindings/authentication_bindings_repository.dart';
import 'package:sigap/src/features/daily-ops/data/bindings/daily_ops_repository_bindings.dart';
import 'package:sigap/src/features/map/data/bindings/map_repository_bindings.dart';
import 'package:sigap/src/features/panic-button/data/bindings/panic_button_repository_bindings.dart';
import 'package:sigap/src/features/personalization/data/bindings/personalization_repository_bindings.dart';
class RepositoryBindings extends Bindings {
@override
void dependencies() {
Get.lazyPut<AuthenticationRepository>(
() => AuthenticationRepository(),
fenix: true,
);
Get.lazyPut<UserRepository>(() => UserRepository(), fenix: true);
Get.lazyPut<OfficerRepository>(() => OfficerRepository(), fenix: true);
Get.lazyPut<UnitRepository>(() => UnitRepository(), fenix: true);
Get.lazyPut<ProfileRepository>(() => ProfileRepository(), fenix: true);
Get.lazyPut<RolesRepository>(() => RolesRepository(), fenix: true);
// Register all feature repositories
AuthRepositoryBindings().dependencies();
PersonalizationRepositoryBindings().dependencies();
PanicButtonRepositoryBindings().dependencies();
MapRepositoryBindings().dependencies();
DailyOpsRepositoryBindings().dependencies();
}
}

View File

@ -1,11 +1,11 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/screens/forgot-password/forgot_password.dart';
import 'package:sigap/src/features/auth/screens/signin/signin_screen.dart';
import 'package:sigap/src/features/auth/screens/signup/signup_screen.dart';
import 'package:sigap/src/features/auth/screens/step-form/step_form_screen.dart';
import 'package:sigap/src/features/onboarding/screens/onboarding/onboarding_screen.dart';
import 'package:sigap/src/features/onboarding/screens/role-selection/role_selection_screen.dart';
import 'package:sigap/src/features/onboarding/screens/welcome/welcome_screen.dart';
import 'package:sigap/src/features/auth/presentasion/pages/forgot-password/forgot_password.dart';
import 'package:sigap/src/features/auth/presentasion/pages/signin/signin_screen.dart';
import 'package:sigap/src/features/auth/presentasion/pages/signup/signup_screen.dart';
import 'package:sigap/src/features/auth/presentasion/pages/step-form/step_form_screen.dart';
import 'package:sigap/src/features/onboarding/presentasion/pages/onboarding/onboarding_screen.dart';
import 'package:sigap/src/features/onboarding/presentasion/pages/role-selection/role_selection_screen.dart';
import 'package:sigap/src/features/onboarding/presentasion/pages/welcome/welcome_screen.dart';
import 'package:sigap/src/utils/constants/app_routes.dart';
class AppPages {

View File

@ -3,7 +3,7 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:get/get.dart';
import 'package:local_auth/local_auth.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/auth/models/user_metadata_model.dart';
import 'package:sigap/src/features/auth/data/models/user_metadata_model.dart';
class BiometricService extends GetxService {
static BiometricService get instance => Get.find<BiometricService>();

View File

@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/models/user_metadata_model.dart';
import 'package:sigap/src/features/auth/data/models/user_metadata_model.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
class SupabaseService extends GetxService {

View File

@ -1,18 +0,0 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/controllers/email_verification_controller.dart';
import 'package:sigap/src/features/auth/controllers/forgot_password_controller.dart';
import 'package:sigap/src/features/auth/controllers/signin_controller.dart';
import 'package:sigap/src/features/auth/controllers/signup_controller.dart';
import 'package:sigap/src/features/auth/controllers/step_form_controller.dart';
class AuthBindings extends Bindings {
@override
void dependencies() {
// Register all feature auth controllers
Get.lazyPut(() => SignInController());
Get.lazyPut(() => SignUpController());
Get.lazyPut(() => StepFormController());
Get.lazyPut(() => EmailVerificationController());
Get.lazyPut(() => ForgotPasswordController());
}
}

View File

@ -0,0 +1,9 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/data/repositories/authentication_repository.dart';
class AuthRepositoryBindings extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => AuthenticationRepository(), fenix: true);
}
}

View File

@ -1,5 +1,5 @@
import 'package:sigap/src/features/daily-ops/models/models/officers_model.dart';
import 'package:sigap/src/features/personalization/models/models/profile_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/officers_model.dart';
import 'package:sigap/src/features/personalization/data/models/models/profile_model.dart';
class UserMetadataModel {
final bool isOfficer;

View File

@ -4,8 +4,8 @@ import 'package:get_storage/get_storage.dart';
import 'package:sigap/src/cores/services/biometric_service.dart';
import 'package:sigap/src/cores/services/location_service.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/auth/screens/signin/signin_screen.dart';
import 'package:sigap/src/features/onboarding/screens/onboarding/onboarding_screen.dart';
import 'package:sigap/src/features/auth/presentasion/pages/signin/signin_screen.dart';
import 'package:sigap/src/features/onboarding/presentasion/pages/onboarding/onboarding_screen.dart';
import 'package:sigap/src/utils/constants/app_routes.dart';
import 'package:sigap/src/utils/exceptions/exceptions.dart';
import 'package:sigap/src/utils/exceptions/format_exceptions.dart';

View File

@ -0,0 +1,18 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/presentasion/controllers/email_verification_controller.dart';
import 'package:sigap/src/features/auth/presentasion/controllers/forgot_password_controller.dart';
import 'package:sigap/src/features/auth/presentasion/controllers/signin_controller.dart';
import 'package:sigap/src/features/auth/presentasion/controllers/signup_controller.dart';
import 'package:sigap/src/features/auth/presentasion/controllers/step_form_controller.dart';
class AuthControllerBindings extends Bindings {
@override
void dependencies() {
// Register all feature auth controllers
Get.lazyPut(() => SignInController(), fenix: true);
Get.lazyPut(() => SignUpController(), fenix: true);
Get.lazyPut(() => FormRegistrationController(), fenix: true);
Get.lazyPut(() => EmailVerificationController(), fenix: true);
Get.lazyPut(() => ForgotPasswordController(), fenix: true);
}
}

View File

@ -2,7 +2,7 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart';
import 'package:sigap/src/features/auth/data/repositories/authentication_repository.dart';
import 'package:sigap/src/utils/constants/app_routes.dart';
import 'package:sigap/src/utils/popups/loaders.dart';

View File

@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart';
import 'package:sigap/src/features/auth/data/repositories/authentication_repository.dart';
import 'package:sigap/src/utils/popups/loaders.dart';
import 'package:sigap/src/utils/validators/validation.dart';

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart';
import 'package:sigap/src/features/auth/data/repositories/authentication_repository.dart';
import 'package:sigap/src/utils/constants/app_routes.dart';
import 'package:sigap/src/utils/helpers/network_manager.dart';
import 'package:sigap/src/utils/popups/loaders.dart';

View File

@ -2,8 +2,8 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:logger/logger.dart';
import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart';
import 'package:sigap/src/features/auth/models/user_metadata_model.dart';
import 'package:sigap/src/features/auth/data/repositories/authentication_repository.dart';
import 'package:sigap/src/features/auth/data/models/user_metadata_model.dart';
import 'package:sigap/src/utils/constants/app_routes.dart';
import 'package:sigap/src/utils/helpers/network_manager.dart';
import 'package:sigap/src/utils/popups/loaders.dart';

View File

@ -1,14 +1,14 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/models/user_metadata_model.dart';
import 'package:sigap/src/features/daily-ops/models/index.dart';
import 'package:sigap/src/features/personalization/models/index.dart';
import 'package:sigap/src/features/auth/data/models/user_metadata_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/index.dart';
import 'package:sigap/src/features/personalization/data/models/index.dart';
import 'package:sigap/src/utils/constants/app_routes.dart';
import 'package:sigap/src/utils/popups/loaders.dart';
import 'package:sigap/src/utils/validators/validation.dart';
class StepFormController extends GetxController {
static StepFormController get to => Get.find();
class FormRegistrationController extends GetxController {
static FormRegistrationController get to => Get.find();
// Role information
final Rx<RoleModel?> selectedRole = Rx<RoleModel?>(null);

View File

@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/controllers/email_verification_controller.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_button.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_header.dart';
import 'package:sigap/src/features/auth/screens/widgets/otp_input_field.dart';
import 'package:sigap/src/features/auth/presentasion/controllers/email_verification_controller.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_button.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_header.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/otp_input_field.dart';
import 'package:sigap/src/utils/constants/colors.dart';
class EmailVerificationScreen extends StatelessWidget {

View File

@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/controllers/forgot_password_controller.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_button.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_header.dart';
import 'package:sigap/src/features/auth/presentasion/controllers/forgot_password_controller.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_button.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_header.dart';
import 'package:sigap/src/shared/widgets/text/custom_text_field.dart';
import 'package:sigap/src/utils/constants/colors.dart';

View File

@ -1,12 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/controllers/signin_controller.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_button.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_divider.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_header.dart';
import 'package:sigap/src/features/auth/screens/widgets/password_field.dart';
import 'package:sigap/src/features/auth/screens/widgets/social_button.dart';
import 'package:sigap/src/features/auth/presentasion/controllers/signin_controller.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_button.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_divider.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_header.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/password_field.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/social_button.dart';
import 'package:sigap/src/shared/widgets/text/custom_text_field.dart';
import 'package:sigap/src/utils/constants/colors.dart';
import 'package:sigap/src/utils/validators/validation.dart';

View File

@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/controllers/signup_controller.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_button.dart';
import 'package:sigap/src/features/auth/screens/widgets/password_field.dart';
import 'package:sigap/src/features/auth/presentasion/controllers/signup_controller.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_button.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/password_field.dart';
import 'package:sigap/src/shared/widgets/text/custom_text_field.dart';
import 'package:sigap/src/utils/constants/colors.dart';

View File

@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/controllers/step_form_controller.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_button.dart';
import 'package:sigap/src/features/personalization/models/index.dart';
import 'package:sigap/src/features/auth/presentasion/controllers/step_form_controller.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_button.dart';
import 'package:sigap/src/features/personalization/data/models/index.dart';
import 'package:sigap/src/shared/widgets/dropdown/custom_dropdown.dart';
import 'package:sigap/src/shared/widgets/indicators/step_indicator.dart';
import 'package:sigap/src/shared/widgets/text/custom_text_field.dart';
@ -16,7 +16,7 @@ class FormRegistrationScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Get the controller
final controller = Get.find<StepFormController>();
final controller = Get.find<FormRegistrationController>();
// Set system overlay style
SystemChrome.setSystemUIOverlayStyle(
@ -139,7 +139,7 @@ class FormRegistrationScreen extends StatelessWidget {
}
}
Widget _buildStepContent(StepFormController controller) {
Widget _buildStepContent(FormRegistrationController controller) {
final isOfficer = controller.selectedRole.value?.isOfficer ?? false;
switch (controller.currentStep.value) {
@ -160,7 +160,7 @@ class FormRegistrationScreen extends StatelessWidget {
}
}
Widget _buildPersonalInfoStep(StepFormController controller) {
Widget _buildPersonalInfoStep(FormRegistrationController controller) {
return Form(
key: controller.stepFormKeys[0],
child: Column(
@ -241,7 +241,7 @@ class FormRegistrationScreen extends StatelessWidget {
);
}
Widget _buildEmergencyContactStep(StepFormController controller) {
Widget _buildEmergencyContactStep(FormRegistrationController controller) {
return Form(
key: controller.stepFormKeys[1],
child: Column(
@ -313,7 +313,7 @@ class FormRegistrationScreen extends StatelessWidget {
);
}
Widget _buildOfficerInfoStep(StepFormController controller) {
Widget _buildOfficerInfoStep(FormRegistrationController controller) {
return Form(
key: controller.stepFormKeys[1],
child: Column(
@ -360,7 +360,9 @@ class FormRegistrationScreen extends StatelessWidget {
);
}
Widget _buildOfficerAdditionalInfoStep(StepFormController controller) {
Widget _buildOfficerAdditionalInfoStep(
FormRegistrationController controller,
) {
return Form(
key: controller.stepFormKeys[2],
child: Column(

View File

@ -0,0 +1,20 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/daily-ops/data/repositories/patrol_units_repository.dart';
import 'package:sigap/src/features/daily-ops/data/repositories/unit_statistics_repository.dart';
import 'package:sigap/src/features/daily-ops/data/repositories/units_repository.dart';
class DailyOpsRepositoryBindings extends Bindings {
@override
void dependencies() {
// Register all feature daily ops controllers
Get.lazyPut<UnitRepository>(() => UnitRepository(), fenix: true);
Get.lazyPut<UnitStatisticsRepository>(
() => UnitStatisticsRepository(),
fenix: true,
);
Get.lazyPut<PatrolUnitRepository>(
() => PatrolUnitRepository(),
fenix: true,
);
}
}

View File

@ -1,4 +1,4 @@
import 'package:sigap/src/features/personalization/models/models/roles_model.dart';
import 'package:sigap/src/features/personalization/data/models/models/roles_model.dart';
class OfficerModel {
final String id;

View File

@ -1,6 +1,6 @@
import 'package:sigap/src/features/daily-ops/models/models/units_model.dart';
import 'package:sigap/src/features/map/models/models/locations_model.dart';
import 'package:sigap/src/features/daily-ops/models/models/officers_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/units_model.dart';
import 'package:sigap/src/features/map/data/models/models/locations_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/officers_model.dart';
class PatrolUnitModel {
final String id;

View File

@ -1,6 +1,6 @@
import 'package:sigap/src/features/daily-ops/models/models/patrol_units_model.dart';
import 'package:sigap/src/features/daily-ops/models/models/unit_statistics_model.dart';
import 'package:sigap/src/features/daily-ops/models/models/officers_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/patrol_units_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/unit_statistics_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/officers_model.dart';
enum UnitType { polda, polsek, polres, other }

View File

@ -1,6 +1,6 @@
import 'package:get/get.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/daily-ops/models/models/patrol_units_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/patrol_units_model.dart';
import 'package:sigap/src/utils/exceptions/exceptions.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

View File

@ -1,6 +1,6 @@
import 'package:get/get.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/daily-ops/models/models/unit_statistics_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/unit_statistics_model.dart';
import 'package:sigap/src/utils/exceptions/exceptions.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

View File

@ -1,6 +1,6 @@
import 'package:get/get.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/daily-ops/models/models/units_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/units_model.dart';
import 'package:sigap/src/utils/exceptions/exceptions.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

View File

@ -0,0 +1,29 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/map/data/repositories/cities_repository.dart';
import 'package:sigap/src/features/map/data/repositories/demographics_repository.dart';
import 'package:sigap/src/features/map/data/repositories/districts_repository.dart';
import 'package:sigap/src/features/map/data/repositories/geogrpaphics_repository.dart';
import 'package:sigap/src/features/map/data/repositories/location_logs_repository.dart';
import 'package:sigap/src/features/map/data/repositories/locations_repository.dart';
class MapRepositoryBindings extends Bindings {
@override
void dependencies() {
// Register all feature map controllers
Get.lazyPut<CitiesRepository>(() => CitiesRepository(), fenix: true);
Get.lazyPut<DistrictsRepository>(() => DistrictsRepository(), fenix: true);
Get.lazyPut<GeographicsRepository>(
() => GeographicsRepository(),
fenix: true,
);
Get.lazyPut<DemographicsRepository>(
() => DemographicsRepository(),
fenix: true,
);
Get.lazyPut<LocationsRepository>(() => LocationsRepository(), fenix: true);
Get.lazyPut<LocationLogsRepository>(
() => LocationLogsRepository(),
fenix: true,
);
}
}

View File

@ -1,5 +1,5 @@
import 'package:sigap/src/features/daily-ops/models/models/units_model.dart';
import 'package:sigap/src/features/map/models/models/districts_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/units_model.dart';
import 'package:sigap/src/features/map/data/models/models/districts_model.dart';
class CityModel {
final String id;

View File

@ -1,4 +1,4 @@
import 'package:sigap/src/features/map/models/models/districts_model.dart';
import 'package:sigap/src/features/map/data/models/models/districts_model.dart';
class DemographicModel {
final String id;

View File

@ -1,9 +1,9 @@
import 'package:sigap/src/features/daily-ops/models/models/units_model.dart';
import 'package:sigap/src/features/map/models/models/cities_model.dart';
import 'package:sigap/src/features/map/models/models/demographics_model.dart';
import 'package:sigap/src/features/map/models/models/geographics_model.dart';
import 'package:sigap/src/features/map/models/models/locations_model.dart';
import 'package:sigap/src/features/panic-button/models/models/crimes_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/units_model.dart';
import 'package:sigap/src/features/map/data/models/models/cities_model.dart';
import 'package:sigap/src/features/map/data/models/models/demographics_model.dart';
import 'package:sigap/src/features/map/data/models/models/geographics_model.dart';
import 'package:sigap/src/features/map/data/models/models/locations_model.dart';
import 'package:sigap/src/features/panic-button/data/models/models/crimes_model.dart';
class DistrictModel {
final String id;

View File

@ -1,4 +1,4 @@
import 'package:sigap/src/features/map/models/models/districts_model.dart';
import 'package:sigap/src/features/map/data/models/models/districts_model.dart';
class GeographicModel {
final String id;

View File

@ -1,4 +1,4 @@
import 'package:sigap/src/features/personalization/models/models/users_model.dart';
import 'package:sigap/src/features/personalization/data/models/models/users_model.dart';
class LocationLogModel {
final String id;

View File

@ -1,7 +1,7 @@
import 'package:sigap/src/features/daily-ops/models/models/patrol_units_model.dart';
import 'package:sigap/src/features/panic-button/models/models/crime_incidents_model.dart';
import 'package:sigap/src/features/panic-button/models/models/events_model.dart';
import 'package:sigap/src/features/panic-button/models/models/incident_logs_model.dart';
import 'package:sigap/src/features/daily-ops/data/models/models/patrol_units_model.dart';
import 'package:sigap/src/features/panic-button/data/models/models/crime_incidents_model.dart';
import 'package:sigap/src/features/panic-button/data/models/models/events_model.dart';
import 'package:sigap/src/features/panic-button/data/models/models/incident_logs_model.dart';
class LocationModel {
final String id;

View File

@ -1,7 +1,7 @@
import 'package:get/get.dart';
import 'package:logger/logger.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/map/models/models/cities_model.dart';
import 'package:sigap/src/features/map/data/models/models/cities_model.dart';
class CitiesRepository extends GetxController {
static CitiesRepository get instance => Get.find();

View File

@ -1,7 +1,7 @@
import 'package:get/get.dart';
import 'package:logger/Logger.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/map/models/models/demographics_model.dart';
import 'package:sigap/src/features/map/data/models/models/demographics_model.dart';
class DemographicsRepository extends GetxController {
static DemographicsRepository get instance => Get.find();

View File

@ -1,7 +1,7 @@
import 'package:get/get.dart';
import 'package:logger/logger.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/map/models/models/districts_model.dart';
import 'package:sigap/src/features/map/data/models/models/districts_model.dart';
class DistrictsRepository extends GetxController {
static DistrictsRepository get instance => Get.find();

View File

@ -1,7 +1,7 @@
import 'package:get/get.dart';
import 'package:logger/logger.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/map/models/models/geographics_model.dart';
import 'package:sigap/src/features/map/data/models/models/geographics_model.dart';
class GeographicsRepository extends GetxController {
static GeographicsRepository get instance => Get.find();

View File

@ -1,7 +1,7 @@
import 'package:get/get.dart';
import 'package:logger/logger.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/map/models/models/location_logs_model.dart';
import 'package:sigap/src/features/map/data/models/models/location_logs_model.dart';
class LocationLogsRepository extends GetxController {
static LocationLogsRepository get instance => Get.find();

View File

@ -1,7 +1,7 @@
import 'package:get/get.dart';
import 'package:logger/logger.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/features/map/models/models/locations_model.dart';
import 'package:sigap/src/features/map/data/models/models/locations_model.dart';
class LocationsRepository extends GetxController {
static LocationsRepository get instance => Get.find();

View File

@ -1,14 +0,0 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/onboarding/controllers/onboarding_controller.dart';
import 'package:sigap/src/features/onboarding/controllers/role_selection_controller.dart';
import 'package:sigap/src/features/onboarding/controllers/splash_controller.dart';
class OnboardingBindings extends Bindings {
@override
void dependencies() {
// Register all feature onboarding controllers
Get.lazyPut(() => OnboardingController());
Get.lazyPut(() => RoleSelectionController());
Get.lazyPut(() => SplashController());
}
}

View File

@ -1,4 +1,4 @@
import 'package:sigap/src/features/onboarding/models/onboarding_model.dart';
import 'package:sigap/src/features/onboarding/data/models/onboarding_model.dart';
final List<OnboardingContent> contents = [

View File

@ -0,0 +1,15 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/onboarding/presentasion/controllers/onboarding_controller.dart';
import 'package:sigap/src/features/onboarding/presentasion/controllers/role_selection_controller.dart';
import 'package:sigap/src/features/onboarding/presentasion/controllers/splash_controller.dart';
class OnboardingBindings extends Bindings {
@override
void dependencies() {
// Register all feature onboarding controllers
Get.lazyPut(() => OnboardingController(), fenix: true);
Get.lazyPut(() => RoleSelectionController(), fenix: true);
Get.lazyPut(() => SplashController(), fenix: true);
}
}

View File

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:sigap/src/cores/services/location_service.dart';
import 'package:sigap/src/features/onboarding/datas/onboarding_data.dart';
import 'package:sigap/src/features/onboarding/data/dummy/onboarding_dummy.dart';
import 'package:sigap/src/utils/constants/app_routes.dart';
class OnboardingController extends GetxController

View File

@ -1,7 +1,6 @@
import 'package:get/get.dart';
import 'package:logger/logger.dart';
import 'package:sigap/src/cores/repositories/personalization/roles_repository.dart';
import 'package:sigap/src/features/personalization/models/models/roles_model.dart';
import 'package:sigap/src/features/personalization/data/repositories/roles_repository.dart';
import 'package:sigap/src/features/personalization/data/models/models/roles_model.dart';
import 'package:sigap/src/utils/constants/app_routes.dart';
import 'package:sigap/src/utils/popups/loaders.dart';
@ -29,17 +28,7 @@ class RoleSelectionController extends GetxController {
super.onInit();
fetchRoles();
}
// Method to return placeholder roles
RoleModel getPlaceholderRole(int id) {
return RoleModel(
id: id.toString(),
name: "Loading...",
description: "Role information is loading",
createdAt: DateTime.now(),
updatedAt: DateTime.now(),
);
}
// Fetch available roles from repository
Future<void> fetchRoles() async {
@ -88,7 +77,7 @@ class RoleSelectionController extends GetxController {
try {
isLoading.value = true;
Logger().i('Selected role: ${selectedRole.value?.name}');
// Logger().i('Selected role: ${selectedRole.value?.name}');
// Check if the selected role is officer
if (selectedRole.value?.name.toLowerCase() == 'officer') {
@ -108,7 +97,7 @@ class RoleSelectionController extends GetxController {
message:
'An error occurred while selecting the role. Please try again.',
);
Logger().e('Error in continueWithRole: $e');
// Logger().e('Error in continueWithRole: $e');
} finally {
isLoading.value = false;
}

View File

@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:sigap/src/cores/repositories/authentication/authentication_repository.dart';
import 'package:sigap/src/features/auth/data/repositories/authentication_repository.dart';
class SplashController extends GetxController {
final authRepository = Get.find<AuthenticationRepository>();

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:get/get.dart';
import 'package:sigap/src/features/onboarding/datas/onboarding_data.dart';
import 'package:sigap/src/features/onboarding/data/dummy/onboarding_dummy.dart';
import 'package:sigap/src/utils/constants/sizes.dart';
import 'package:sigap/src/utils/helpers/helper_functions.dart';

View File

@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_button.dart';
import 'package:sigap/src/features/auth/screens/widgets/auth_header.dart';
import 'package:sigap/src/features/onboarding/controllers/role_selection_controller.dart';
import 'package:sigap/src/features/onboarding/screens/role-selection/widgets/role_card.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_button.dart';
import 'package:sigap/src/features/auth/presentasion/widgets/auth_header.dart';
import 'package:sigap/src/features/onboarding/presentasion/controllers/role_selection_controller.dart';
import 'package:sigap/src/features/onboarding/presentasion/pages/role-selection/widgets/role_card.dart';
import 'package:sigap/src/utils/constants/sizes.dart';
import 'package:sigap/src/utils/loaders/shimmer.dart';
@ -57,7 +57,7 @@ class RoleSelectionScreen extends StatelessWidget {
if (controller.isRolesLoading.value) {
// Show shimmer placeholder cards
return ListView.builder(
itemCount: controller.roles.length,
itemCount: 2,
itemBuilder:
(_, __) => Padding(
padding: const EdgeInsets.only(

View File

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:sigap/src/features/personalization/models/models/roles_model.dart';
import 'package:sigap/src/features/personalization/data/models/models/roles_model.dart';
import 'package:sigap/src/utils/constants/sizes.dart';
class RoleCard extends StatelessWidget {

View File

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:lottie/lottie.dart';
import 'package:sigap/src/features/onboarding/controllers/onboarding_controller.dart';
import 'package:sigap/src/features/onboarding/presentasion/controllers/onboarding_controller.dart';
import 'package:sigap/src/utils/constants/image_strings.dart';
import 'package:sigap/src/utils/constants/sizes.dart';
import 'package:sigap/src/utils/helpers/helper_functions.dart';

View File

@ -0,0 +1,38 @@
import 'package:get/get.dart';
import 'package:sigap/src/features/panic-button/data/repositories/crime_incidents_repository.dart';
import 'package:sigap/src/features/panic-button/data/repositories/crimes_repository.dart';
import 'package:sigap/src/features/panic-button/data/repositories/events_repository.dart';
import 'package:sigap/src/features/panic-button/data/repositories/evidences_repository.dart';
import 'package:sigap/src/features/panic-button/data/repositories/incident_logs_repository.dart';
import 'package:sigap/src/features/panic-button/data/repositories/panic_button_repository.dart';
import 'package:sigap/src/features/panic-button/data/repositories/sessions_repository.dart';
class PanicButtonRepositoryBindings implements Bindings {
@override
void dependencies() {
// Register the main panic button repository
Get.lazyPut<PanicButtonRepository>(
() => PanicButtonRepository(),
fenix: true,
);
// Register other related repositories
Get.lazyPut<IncidentLogsRepository>(
() => IncidentLogsRepository(),
fenix: true,
);
Get.lazyPut<EvidencesRepository>(() => EvidencesRepository(), fenix: true);
Get.lazyPut<EventsRepository>(() => EventsRepository(), fenix: true);
Get.lazyPut<CrimesRepository>(() => CrimesRepository(), fenix: true);
Get.lazyPut<CrimeIncidentsRepository>(
() => CrimeIncidentsRepository(),
fenix: true,
);
Get.lazyPut<SessionsRepository>(() => SessionsRepository(), fenix: true);
}
}

View File

@ -1,5 +1,5 @@
import 'package:sigap/src/features/map/models/models/districts_model.dart';
import 'package:sigap/src/features/panic-button/models/models/crime_incidents_model.dart';
import 'package:sigap/src/features/map/data/models/models/districts_model.dart';
import 'package:sigap/src/features/panic-button/data/models/models/crime_incidents_model.dart';
enum CrimeRates { low, medium, high, critical }

View File

@ -1,4 +1,4 @@
import 'package:sigap/src/features/map/models/models/locations_model.dart';
import 'package:sigap/src/features/map/data/models/models/locations_model.dart';
class EventModel {
final String id;

View File

@ -1,4 +1,4 @@
import 'package:sigap/src/features/panic-button/models/models/incident_logs_model.dart';
import 'package:sigap/src/features/panic-button/data/models/models/incident_logs_model.dart';
class EvidenceModel {
final String id;

View File

@ -1,4 +1,4 @@
import 'package:sigap/src/features/panic-button/models/models/evidences_model.dart';
import 'package:sigap/src/features/panic-button/data/models/models/evidences_model.dart';
class IncidentLogModel {
final String id;

View File

@ -1,4 +1,4 @@
import 'package:sigap/src/features/panic-button/models/models/events_model.dart';
import 'package:sigap/src/features/panic-button/data/models/models/events_model.dart';
enum SessionStatus { active, inactive }

View File

@ -0,0 +1,32 @@
import 'package:get/get.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/utils/exceptions/exceptions.dart';
class CrimeIncidentsRepository extends GetxController {
static CrimeIncidentsRepository get instance => Get.find();
final _supabase = SupabaseService.instance.client;
Future<List<Map<String, dynamic>>> getRecentIncidents() async {
try {
final response = await _supabase
.from('incident_logs')
.select('*, location_id(*), category_id(*)')
.order('time', ascending: false)
.limit(10);
return List<Map<String, dynamic>>.from(response);
} catch (e) {
throw TExceptions('Failed to fetch recent incidents: ${e.toString()}');
}
}
Future<Map<String, dynamic>> getIncidentStatistics() async {
try {
final response = await _supabase.rpc('get_incident_statistics');
return response as Map<String, dynamic>;
} catch (e) {
throw TExceptions('Failed to fetch incident statistics: ${e.toString()}');
}
}
}

View File

@ -0,0 +1,37 @@
import 'package:get/get.dart';
import 'package:sigap/src/cores/services/supabase_service.dart';
import 'package:sigap/src/utils/exceptions/exceptions.dart';
class CrimesRepository extends GetxController {
static CrimesRepository get instance => Get.find();
final _supabase = SupabaseService.instance.client;
Future<List<Map<String, dynamic>>> getCrimeCategories() async {
try {
final response = await _supabase
.from('crime_categories')
.select('*')
.order('name', ascending: true);
return List<Map<String, dynamic>>.from(response);
} catch (e) {
throw TExceptions('Failed to fetch crime categories: ${e.toString()}');
}
}
Future<Map<String, dynamic>> getCrimeCategoryById(String id) async {
try {
final response =
await _supabase
.from('crime_categories')
.select('*')
.eq('id', id)
.single();
return response;
} catch (e) {
throw TExceptions('Failed to fetch crime category: ${e.toString()}');
}
}
}

Some files were not shown because too many files have changed in this diff Show More