feat : role And permission

This commit is contained in:
2025-09-06 14:50:02 +03:30
parent bdf5344451
commit 34609d22a1
34 changed files with 657 additions and 306 deletions

View File

@@ -1,77 +0,0 @@
import 'package:rasadyar_app/presentation/routes/app_pages.dart';
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/presentation/routes/routes.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_core/data/model/local/target_page/target_page.dart';
import 'package:rasadyar_inspection/injection/inspection_di.dart';
import 'package:rasadyar_inspection/inspection.dart';
import 'package:rasadyar_livestock/injection/live_stock_di.dart';
import 'package:rasadyar_livestock/presentation/routes/app_pages.dart';
class LocalStorageService extends GetxService {
static const String _targetPageBox = 'targetPageBox';
final HiveLocalStorage _localStorage = diCore.get<HiveLocalStorage>();
Future<void> init() async {
await _localStorage.openBox<TargetPage>(_targetPageBox);
seedTargetPage();
}
Future<void> seedTargetPage() async {
var existing = getTargetPage(null);
if (existing == null) {
_localStorage.addAll<TargetPage>(
boxName: _targetPageBox,
values: <TargetPage>[
TargetPage(
route: InspectionRoutes.init,
module: Module.inspection,
functions: ["setupInspectionDI"],
),
TargetPage(
route: LiveStockRoutes.init,
module: Module.liveStocks,
functions: ["setupLiveStockDI"],
),
TargetPage(
route: ChickenRoutes.initSteward,
module: Module.chicken,
functions: ["setupChickenDI"],
),
TargetPage(route: AppPaths.moduleList),
],
);
}
}
TargetPage? getTargetPage(Module? module) {
var res = _localStorage
.readBox<TargetPage>(boxName: _targetPageBox)
?.firstWhereOrNull((element) => element.module == module);
return res;
}
Future<void> saveTargetPage(TargetPage targetPage) async {
await _localStorage.add(boxName: _targetPageBox, value: targetPage);
}
Iterable<Future>? getFunctionsList(List<String>? functions) {
return functions?.map((e) async => getFunctionByName(e));
}
Future? getFunctionByName(String? name) {
switch (name) {
case "setupInspectionDI":
return setupInspectionDI();
case "setupLiveStockDI":
return setupLiveStockDI();
case "setupChickenDI":
return setupChickenDI();
default:
return null;
}
}
}

View File

@@ -0,0 +1,51 @@
import 'package:rasadyar_app/presentation/routes/app_pages.dart';
import 'package:rasadyar_chicken/data/di/chicken_di.dart';
import 'package:rasadyar_chicken/presentation/routes/routes.dart';
import 'package:rasadyar_core/core.dart';
import 'package:rasadyar_inspection/injection/inspection_di.dart';
import 'package:rasadyar_inspection/inspection.dart';
import 'package:rasadyar_livestock/injection/live_stock_di.dart';
import 'package:rasadyar_livestock/presentation/routes/app_pages.dart';
Future<void> seedTargetPage() async {
var box = Hive.box<AppModel>("appBox");
AppModel appModel = AppModel(
targetPages: [
TargetPage(
route: InspectionRoutes.init,
module: Module.inspection,
functions: ["setupInspectionDI"],
),
TargetPage(
route: LiveStockRoutes.init,
module: Module.liveStocks,
functions: ["setupLiveStockDI"],
),
TargetPage(
route: ChickenRoutes.initSteward,
module: Module.chicken,
functions: ["setupChickenDI"],
),
TargetPage(route: AppPaths.moduleList),
],
);
box.add(appModel);
}
Iterable<Future>? getFunctionsList(List<String>? functions) {
return functions?.map((e) async => getFunctionByName(e));
}
Future? getFunctionByName(String? name) {
switch (name) {
case "setupInspectionDI":
return setupInspectionDI();
case "setupLiveStockDI":
return setupLiveStockDI();
case "setupChickenDI":
return setupChickenDI();
default:
return null;
}
}

View File

@@ -1,20 +1,25 @@
import 'package:flutter/material.dart';
import 'package:rasadyar_app/infrastructure/service/app_navigation_observer.dart';
import 'package:rasadyar_app/infrastructure/utils/local_storage_utils.dart';
import 'package:rasadyar_app/presentation/routes/app_pages.dart';
import 'package:rasadyar_core/core.dart';
import 'infrastructure/di/di.dart';
import 'infrastructure/service/local_storage_service.dart';
import 'presentation/routes/auth_route_resolver_impl.dart';
import 'infrastructure/di/di.dart';
import 'presentation/routes/auth_route_resolver_impl.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
await setupPreInjection();
Get.put(GService());
var gService = Get.find<GService>();
await gService.init();
if (gService.isFirstTime()) {
await seedTargetPage();
await gService.setIsNotFirstTime();
}
Get.put(TokenStorageService());
await Get.find<TokenStorageService>().init();
Get.put(LocalStorageService());
await Get.find<LocalStorageService>().init();
Get.put<AuthRouteResolver>(AppAuthRouteResolver());
Get.put(AuthMiddleware());

View File

@@ -3,7 +3,7 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:rasadyar_app/data/model/app_info_model.dart';
import 'package:rasadyar_app/infrastructure/service/local_storage_service.dart';
import 'package:rasadyar_app/infrastructure/utils/local_storage_utils.dart';
import 'package:rasadyar_core/core.dart';
class SplashLogic extends GetxController with GetTickerProviderStateMixin {
@@ -17,8 +17,9 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
final RxnString _updateFilePath = RxnString();
final platform = MethodChannel('apk_installer');
final Dio _dio = Dio();
var gService = Get.find<GService>();
var tokenService = Get.find<TokenStorageService>();
var localService = Get.find<LocalStorageService>();
AppInfoModel? appInfoModel;
@override
@@ -153,18 +154,20 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
try {
final isUpdateNeeded = await checkVersion();
if (isUpdateNeeded) return;
tokenService.getModule();
final module = tokenService.appModule.value;
final target = localService.getTargetPage(module);
final module = gService.getSelectedModule();
final target = gService.getTargetPage(module);
if (module != null) {
tokenService.setGlobalTokenAndRefToken(module);
}
if (target != null) {
var funs = localService.getFunctionsList(target.functions);
await Future.wait(funs ?? []);
var mFuns = getFunctionsList(target.functions);
await Future.wait(mFuns ?? []);
Get.offAndToNamed(target.route!);
}
} catch (e, st) {
debugPrint("onReady error: $e\n$st");
eLog("onReady error: $e\n$st");
}
});
}
@@ -239,11 +242,9 @@ class SplashLogic extends GetxController with GetTickerProviderStateMixin {
Future<void> installApk() async {
try {
eLog(_updateFilePath.value);
final dir = await getApplicationDocumentsDirectory();
await platform.invokeMethod('apk_installer', {'appPath': _updateFilePath.value});
} catch (e) {
print("خطا در نصب: $e");
eLog(e);
}
}
}