Skip to content
This repository has been archived by the owner on Jan 23, 2025. It is now read-only.

Commit

Permalink
EM-13: temp
Browse files Browse the repository at this point in the history
  • Loading branch information
Hieu Bui committed Dec 13, 2024
1 parent 2ab7e36 commit 0ba6cb2
Show file tree
Hide file tree
Showing 16 changed files with 929 additions and 249 deletions.
24 changes: 24 additions & 0 deletions lib/config/app_routes.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'dart:async';
import 'package:ecoparking_management/config/app_paths.dart';
import 'package:ecoparking_management/data/models/user_profile.dart';
import 'package:ecoparking_management/di/global/get_it_initializer.dart';
import 'package:ecoparking_management/domain/services/profile_service.dart';
import 'package:ecoparking_management/pages/employee_management/employee_management.dart';
Expand Down Expand Up @@ -76,6 +77,29 @@ class AppRoutes {
const EmployeeManagement(),
name: AppPaths.employee.name,
),
redirect: (context, state) {
if (!_profileService.isAuthenticated) {
return AppPaths.login.path;
}

final profile = _profileService.userProfile;

if (profile == null) {
return AppPaths.login.path;
}

if (profile.accountType == AccountType.parkingOwner &&
_profileService.parkingOwner == null) {
return AppPaths.login.path;
}

if (profile.accountType == AccountType.employee &&
_profileService.parkingEmployee == null) {
return AppPaths.login.path;
}

return null;
},
),
GoRoute(
path: AppPaths.profile.path,
Expand Down
5 changes: 5 additions & 0 deletions lib/data/datasource/employee_datasource.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
abstract class EmployeeDataSource {
Future<List<Map<String, dynamic>>> getAllEmployees({
required String parkingId,
});
}
22 changes: 22 additions & 0 deletions lib/data/datasource_impl/employee_datasource_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import 'package:ecoparking_management/data/datasource/employee_datasource.dart';
import 'package:ecoparking_management/data/supabase_data/tables/parking_employee_table.dart';
import 'package:ecoparking_management/data/supabase_data/tables/profile_table.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

class EmployeeDataSourceImpl extends EmployeeDataSource {
@override
Future<List<Map<String, dynamic>>> getAllEmployees({
required String parkingId,
}) async {
const table = ParkingEmployeeTable();
const profileTable = ProfileTable();

final queryString =
'*, profile(${profileTable.fullName}, ${profileTable.email}, ${profileTable.phone})';

return Supabase.instance.client
.from(table.tableName)
.select(queryString)
.eq(table.parkingId, parkingId);
}
}
94 changes: 94 additions & 0 deletions lib/data/models/employee_nested_info.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:json_annotation/json_annotation.dart';

part 'employee_nested_info.g.dart';

@JsonSerializable()
class EmployeeNestedInfo with EquatableMixin {
final String id;
@JsonKey(name: 'parking_id')
final String parkingId;
@JsonKey(name: 'profile_id')
final String profileId;
@JsonKey(name: 'currency_locale')
final String currencyLocale;
@JsonKey(
name: 'working_start_time',
fromJson: _timeOfDayFromString,
toJson: _timeOfDayToString,
)
final TimeOfDay? workingStartTime;
@JsonKey(
name: 'working_end_time',
fromJson: _timeOfDayFromString,
toJson: _timeOfDayToString,
)
final TimeOfDay? workingEndTime;
final EmployeeNestedProfileInfo profile;

const EmployeeNestedInfo({
required this.id,
required this.parkingId,
required this.profileId,
required this.currencyLocale,
required this.profile,
required this.workingStartTime,
required this.workingEndTime,
});

factory EmployeeNestedInfo.fromJson(Map<String, dynamic> json) =>
_$EmployeeNestedInfoFromJson(json);

Map<String, dynamic> toJson() => _$EmployeeNestedInfoToJson(this);

@override
List<Object?> get props => [
id,
parkingId,
profileId,
currencyLocale,
profile,
workingStartTime,
workingEndTime,
];
}

TimeOfDay? _timeOfDayFromString(String? time) {
if (time == null) return null;

final parts = time.split(':');
final hour = int.parse(parts[0]);
final minute = int.parse(parts[1]);
return TimeOfDay(hour: hour, minute: minute);
}

String? _timeOfDayToString(TimeOfDay? time) {
if (time == null) return null;

final hour = time.hour.toString().padLeft(2, '0');
final minute = time.minute.toString().padLeft(2, '0');
return '$hour:$minute';
}

@JsonSerializable()
class EmployeeNestedProfileInfo with EquatableMixin {
@JsonKey(name: 'full_name')
final String name;
final String email;
final String? phone;

const EmployeeNestedProfileInfo({
required this.name,
required this.email,
this.phone,
});

factory EmployeeNestedProfileInfo.fromJson(Map<String, dynamic> json) =>
_$EmployeeNestedProfileInfoFromJson(json);

Map<String, dynamic> toJson() => _$EmployeeNestedProfileInfoToJson(this);

@override
List<Object?> get props => [name, email, phone];
}
14 changes: 14 additions & 0 deletions lib/data/repository/employee_repository_impl.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import 'package:ecoparking_management/data/datasource/employee_datasource.dart';
import 'package:ecoparking_management/di/global/get_it_initializer.dart';
import 'package:ecoparking_management/domain/repository/employee_repository.dart';

class EmployeeRepositoryImpl implements EmployeeRepository {
final EmployeeDataSource _dataSource = getIt.get<EmployeeDataSource>();

@override
Future<List<Map<String, dynamic>>> getAllEmployees({
required String parkingId,
}) {
return _dataSource.getAllEmployees(parkingId: parkingId);
}
}
14 changes: 0 additions & 14 deletions lib/data/supabase_data/tables/parking_human_resource_table.dart

This file was deleted.

17 changes: 17 additions & 0 deletions lib/di/global/get_it_initializer.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import 'package:ecoparking_management/data/datasource/account_datasource.dart';
import 'package:ecoparking_management/data/datasource/employee_datasource.dart';
import 'package:ecoparking_management/data/datasource_impl/account_datasource_impl.dart';
import 'package:ecoparking_management/data/datasource_impl/employee_datasource_impl.dart';
import 'package:ecoparking_management/data/repository/account_repository_impl.dart';
import 'package:ecoparking_management/data/repository/employee_repository_impl.dart';
import 'package:ecoparking_management/domain/repository/account_repository.dart';
import 'package:ecoparking_management/domain/repository/employee_repository.dart';
import 'package:ecoparking_management/domain/services/profile_service.dart';
import 'package:ecoparking_management/domain/usecase/account/get_employee_info_interactor.dart';
import 'package:ecoparking_management/domain/usecase/account/get_owner_info_interactor.dart';
Expand All @@ -11,6 +15,7 @@ import 'package:ecoparking_management/domain/usecase/account/sign_out_interactor
import 'package:ecoparking_management/domain/usecase/account/update_employee_currency_locale_interactor.dart';
import 'package:ecoparking_management/domain/usecase/account/update_owner_currency_locale_interactor.dart';
import 'package:ecoparking_management/domain/usecase/account/update_user_profile_interactor.dart';
import 'package:ecoparking_management/domain/usecase/employee/get_all_employee_interactor.dart';
import 'package:ecoparking_management/utils/mixins/custom_logger.dart';
import 'package:ecoparking_management/utils/responsive.dart';
import 'package:get_it/get_it.dart';
Expand Down Expand Up @@ -51,20 +56,29 @@ class GetItInitializer with GetItLoggy {
getIt.registerFactory<AccountDataSource>(
() => AccountDataSourceImpl(),
);
getIt.registerFactory<EmployeeDataSource>(
() => EmployeeDataSourceImpl(),
);
loggy.info('_bindingDataSource(): Setup successfully');
}

void _bindingDataSourceImpl() {
getIt.registerFactory<AccountDataSourceImpl>(
() => AccountDataSourceImpl(),
);
getIt.registerFactory<EmployeeDataSourceImpl>(
() => EmployeeDataSourceImpl(),
);
loggy.info('_bindingDataSourceImpl(): Setup successfully');
}

void _bindingRepository() {
getIt.registerLazySingleton<AccountRepository>(
() => AccountRepositoryImpl(),
);
getIt.registerLazySingleton<EmployeeRepository>(
() => EmployeeRepositoryImpl(),
);
loggy.info('_bindingRepository(): Setup successfully');
}

Expand Down Expand Up @@ -93,6 +107,9 @@ class GetItInitializer with GetItLoggy {
getIt.registerLazySingleton<UpdateOwnerCurrencyLocaleInteractor>(
() => UpdateOwnerCurrencyLocaleInteractor(),
);
getIt.registerLazySingleton<GetAllEmployeeInteractor>(
() => GetAllEmployeeInteractor(),
);
loggy.info('_bindingInteractor(): Setup successfully');
}

Expand Down
5 changes: 5 additions & 0 deletions lib/domain/repository/employee_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
abstract class EmployeeRepository {
Future<List<Map<String, dynamic>>> getAllEmployees({
required String parkingId,
});
}
51 changes: 51 additions & 0 deletions lib/domain/state/employee/get_all_employee_state.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import 'package:ecoparking_management/data/models/employee_nested_info.dart';
import 'package:ecoparking_management/domain/state/app_state/failure.dart';
import 'package:ecoparking_management/domain/state/app_state/initial.dart';
import 'package:ecoparking_management/domain/state/app_state/success.dart';
import 'package:equatable/equatable.dart';

abstract class GetAllEmployeeState with EquatableMixin {
const GetAllEmployeeState();

@override
List<Object?> get props => [];
}

class GetAllEmployeeInitial extends Initial implements GetAllEmployeeState {
const GetAllEmployeeInitial() : super();

@override
List<Object?> get props => [];
}

class GetAllEmployeeLoading extends Initial implements GetAllEmployeeState {
const GetAllEmployeeLoading() : super();

@override
List<Object?> get props => [];
}

class GetAllEmployeeSuccess extends Success implements GetAllEmployeeState {
final List<EmployeeNestedInfo> listEmployeeInfo;

const GetAllEmployeeSuccess({required this.listEmployeeInfo});

@override
List<Object?> get props => [listEmployeeInfo];
}

class GetAllEmployeeFailure extends Failure implements GetAllEmployeeState {
final dynamic exception;

const GetAllEmployeeFailure({required this.exception});

@override
List<Object?> get props => [exception];
}

class GetAllEmployeeEmpty extends Failure implements GetAllEmployeeState {
const GetAllEmployeeEmpty();

@override
List<Object?> get props => [];
}
36 changes: 36 additions & 0 deletions lib/domain/usecase/employee/get_all_employee_interactor.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:dartz/dartz.dart';
import 'package:ecoparking_management/data/models/employee_nested_info.dart';
import 'package:ecoparking_management/di/global/get_it_initializer.dart';
import 'package:ecoparking_management/domain/repository/employee_repository.dart';
import 'package:ecoparking_management/domain/state/app_state/failure.dart';
import 'package:ecoparking_management/domain/state/app_state/success.dart';
import 'package:ecoparking_management/domain/state/employee/get_all_employee_state.dart';
import 'package:ecoparking_management/utils/mixins/custom_logger.dart';

class GetAllEmployeeInteractor with InteractorLoggy {
final EmployeeRepository _employeeRepository =
getIt.get<EmployeeRepository>();

Stream<Either<Failure, Success>> execute({
required String parkingId,
}) async* {
try {
yield const Right(GetAllEmployeeLoading());

final result =
await _employeeRepository.getAllEmployees(parkingId: parkingId);

if (result.isEmpty) {
yield const Left(GetAllEmployeeEmpty());
}

final listEmployeeInfo =
result.map((e) => EmployeeNestedInfo.fromJson(e)).toList();

yield Right(GetAllEmployeeSuccess(listEmployeeInfo: listEmployeeInfo));
} catch (e) {
loggy.error('Error: $e');
yield Left(GetAllEmployeeFailure(exception: e));
}
}
}
Loading

0 comments on commit 0ba6cb2

Please sign in to comment.