chnages has been made

This commit is contained in:
Daniah Ayad Al-sultani
2026-02-22 11:18:10 +03:00
parent 3a9e7ca8db
commit f616a2c104
26 changed files with 1130 additions and 201 deletions

View File

@@ -13,11 +13,13 @@ abstract class AttendanceRemoteDataSource {
Future<AttendanceResponseDto> login({
required String employeeId,
required File faceImage,
bool localAuth = false,
});
Future<AttendanceResponseDto> logout({
required String employeeId,
required File faceImage,
bool localAuth = false,
});
Future<List<AttendanceRecordDto>> getAttendanceRecords({
@@ -43,11 +45,13 @@ class AttendanceRemoteDataSourceImpl implements AttendanceRemoteDataSource {
Future<AttendanceResponseDto> login({
required String employeeId,
required File faceImage,
bool localAuth = false,
}) async {
try {
final formData = FormData.fromMap({
'EmployeeId': employeeId,
'FaceImage': await MultipartFile.fromFile(faceImage.path),
'IsAuth': localAuth.toString(),
});
final response = await apiClient.post(
@@ -107,11 +111,13 @@ class AttendanceRemoteDataSourceImpl implements AttendanceRemoteDataSource {
Future<AttendanceResponseDto> logout({
required String employeeId,
required File faceImage,
bool localAuth = false,
}) async {
try {
final formData = FormData.fromMap({
'EmployeeId': employeeId,
'FaceImage': await MultipartFile.fromFile(faceImage.path),
'IsAuth': localAuth.toString(),
});
final response = await apiClient.post(

View File

@@ -0,0 +1,49 @@
import 'package:flutter/foundation.dart';
import '../../core/error/exceptions.dart';
import '../../core/network/api_client.dart';
import '../dto/theme_response_dto.dart';
abstract class ThemeRemoteDataSource {
Future<ThemeDataDto> getTheme();
}
class ThemeRemoteDataSourceImpl implements ThemeRemoteDataSource {
final ApiClient apiClient;
ThemeRemoteDataSourceImpl({required this.apiClient});
@override
Future<ThemeDataDto> getTheme() async {
try {
debugPrint('[ThemeDataSource] Calling GET /Theme (with auth)...');
final res = await apiClient.get('/Theme'); // ✅ no custom headers
debugPrint('[ThemeDataSource] Status: ${res.statusCode}');
debugPrint('[ThemeDataSource] Data: ${res.data}');
if (res.statusCode == 200) {
final dto = ThemeResponseDto.fromJson(
Map<String, dynamic>.from(res.data),
);
if (dto.isSuccess && dto.data != null) {
debugPrint('[ThemeDataSource] ✅ logo = ${dto.data!.logo}');
return dto.data!;
}
throw ServerException(message: dto.message ?? 'Theme request failed');
}
throw ServerException(
message: 'Theme request failed (code ${res.statusCode})',
);
} on ServerException {
rethrow;
} catch (e, stack) {
debugPrint('[ThemeDataSource] ❌ Exception: $e');
debugPrint('[ThemeDataSource] ❌ Stack: $stack');
throw ServerException(message: e.toString());
}
}
}

View File

@@ -0,0 +1,36 @@
class ThemeResponseDto {
final int statusCode;
final bool isSuccess;
final String? message;
final ThemeDataDto? data;
ThemeResponseDto({
required this.statusCode,
required this.isSuccess,
required this.message,
required this.data,
});
factory ThemeResponseDto.fromJson(Map<String, dynamic> json) {
return ThemeResponseDto(
statusCode: json['statusCode'] ?? 0,
isSuccess: json['isSuccess'] ?? false,
message: json['message']?.toString(),
data: json['data'] == null ? null : ThemeDataDto.fromJson(json['data']),
);
}
}
class ThemeDataDto {
final String name;
final String logo;
ThemeDataDto({required this.name, required this.logo});
factory ThemeDataDto.fromJson(Map<String, dynamic> json) {
return ThemeDataDto(
name: (json['name'] ?? '').toString(),
logo: (json['logo'] ?? '').toString(),
);
}
}

View File

@@ -18,6 +18,7 @@ class AttendanceRepositoryImpl implements AttendanceRepository {
final dto = await remoteDataSource.login(
employeeId: request.employeeId,
faceImage: request.faceImage,
localAuth: request.localAuth,
);
return AttendanceResponseModel(
@@ -34,6 +35,7 @@ class AttendanceRepositoryImpl implements AttendanceRepository {
final dto = await remoteDataSource.logout(
employeeId: request.employeeId,
faceImage: request.faceImage,
localAuth: request.localAuth,
);
return AttendanceResponseModel(

View File

@@ -0,0 +1,24 @@
import 'package:dartz/dartz.dart';
import '../../core/error/failures.dart';
import '../../core/error/exceptions.dart';
import '../../domain/models/theme_model.dart';
import '../../domain/repositories/theme_repository.dart';
import '../datasources/theme_remote_data_source.dart';
class ThemeRepositoryImpl implements ThemeRepository {
final ThemeRemoteDataSource remote;
ThemeRepositoryImpl({required this.remote});
@override
Future<Either<Failure, ThemeModel>> getTheme() async {
try {
final dto = await remote.getTheme();
return Right(ThemeModel(name: dto.name, logo: dto.logo));
} on ServerException catch (e) {
return Left(ServerFailure(e.message));
} catch (e) {
return Left(ServerFailure(e.toString()));
}
}
}