feat: Implement full certificate management with upload, upsert, delete, and new domain models for staff certificates and their statuses.
This commit is contained in:
@@ -524,4 +524,221 @@ class StaffConnectorRepositoryImpl implements StaffConnectorRepository {
|
||||
return dc.DocumentStatus.EXPIRING;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<domain.StaffCertificate>> getStaffCertificates() async {
|
||||
return _service.run(() async {
|
||||
final String staffId = await _service.getStaffId();
|
||||
final QueryResult<
|
||||
dc.ListCertificatesByStaffIdData,
|
||||
dc.ListCertificatesByStaffIdVariables
|
||||
>
|
||||
response = await _service.connector
|
||||
.listCertificatesByStaffId(staffId: staffId)
|
||||
.execute();
|
||||
|
||||
return response.data.certificates.map((
|
||||
dc.ListCertificatesByStaffIdCertificates cert,
|
||||
) {
|
||||
return domain.StaffCertificate(
|
||||
id: cert.id,
|
||||
staffId: cert.staffId,
|
||||
name: cert.name,
|
||||
description: cert.description,
|
||||
expiryDate: _service.toDateTime(cert.expiry),
|
||||
status: _mapToDomainCertificateStatus(cert.status),
|
||||
certificateUrl: cert.fileUrl,
|
||||
icon: cert.icon,
|
||||
certificationType: _mapToDomainComplianceType(cert.certificationType),
|
||||
issuer: cert.issuer,
|
||||
certificateNumber: cert.certificateNumber,
|
||||
validationStatus: _mapToDomainValidationStatus(cert.validationStatus),
|
||||
createdAt: _service.toDateTime(cert.createdAt),
|
||||
);
|
||||
}).toList();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> upsertStaffCertificate({
|
||||
required domain.ComplianceType certificationType,
|
||||
required String name,
|
||||
required domain.StaffCertificateStatus status,
|
||||
String? fileUrl,
|
||||
DateTime? expiry,
|
||||
String? issuer,
|
||||
String? certificateNumber,
|
||||
domain.StaffCertificateValidationStatus? validationStatus,
|
||||
}) async {
|
||||
await _service.run(() async {
|
||||
final String staffId = await _service.getStaffId();
|
||||
|
||||
await _service.connector
|
||||
.upsertStaffCertificate(
|
||||
staffId: staffId,
|
||||
certificationType: _mapToDCComplianceType(certificationType),
|
||||
name: name,
|
||||
status: _mapToDCCertificateStatus(status),
|
||||
)
|
||||
.fileUrl(fileUrl)
|
||||
.expiry(_service.tryToTimestamp(expiry))
|
||||
.issuer(issuer)
|
||||
.certificateNumber(certificateNumber)
|
||||
.validationStatus(_mapToDCValidationStatus(validationStatus))
|
||||
.execute();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> deleteStaffCertificate({
|
||||
required domain.ComplianceType certificationType,
|
||||
}) async {
|
||||
await _service.run(() async {
|
||||
final String staffId = await _service.getStaffId();
|
||||
|
||||
await _service.connector
|
||||
.deleteCertificate(
|
||||
staffId: staffId,
|
||||
certificationType: _mapToDCComplianceType(certificationType),
|
||||
)
|
||||
.execute();
|
||||
});
|
||||
}
|
||||
|
||||
domain.StaffCertificateStatus _mapToDomainCertificateStatus(
|
||||
dc.EnumValue<dc.CertificateStatus> status,
|
||||
) {
|
||||
if (status is dc.Unknown) return domain.StaffCertificateStatus.notStarted;
|
||||
final dc.CertificateStatus value =
|
||||
(status as dc.Known<dc.CertificateStatus>).value;
|
||||
switch (value) {
|
||||
case dc.CertificateStatus.CURRENT:
|
||||
return domain.StaffCertificateStatus.current;
|
||||
case dc.CertificateStatus.EXPIRING_SOON:
|
||||
return domain.StaffCertificateStatus.expiringSoon;
|
||||
case dc.CertificateStatus.COMPLETED:
|
||||
return domain.StaffCertificateStatus.completed;
|
||||
case dc.CertificateStatus.PENDING:
|
||||
return domain.StaffCertificateStatus.pending;
|
||||
case dc.CertificateStatus.EXPIRED:
|
||||
return domain.StaffCertificateStatus.expired;
|
||||
case dc.CertificateStatus.EXPIRING:
|
||||
return domain.StaffCertificateStatus.expiring;
|
||||
case dc.CertificateStatus.NOT_STARTED:
|
||||
return domain.StaffCertificateStatus.notStarted;
|
||||
}
|
||||
}
|
||||
|
||||
dc.CertificateStatus _mapToDCCertificateStatus(
|
||||
domain.StaffCertificateStatus status,
|
||||
) {
|
||||
switch (status) {
|
||||
case domain.StaffCertificateStatus.current:
|
||||
return dc.CertificateStatus.CURRENT;
|
||||
case domain.StaffCertificateStatus.expiringSoon:
|
||||
return dc.CertificateStatus.EXPIRING_SOON;
|
||||
case domain.StaffCertificateStatus.completed:
|
||||
return dc.CertificateStatus.COMPLETED;
|
||||
case domain.StaffCertificateStatus.pending:
|
||||
return dc.CertificateStatus.PENDING;
|
||||
case domain.StaffCertificateStatus.expired:
|
||||
return dc.CertificateStatus.EXPIRED;
|
||||
case domain.StaffCertificateStatus.expiring:
|
||||
return dc.CertificateStatus.EXPIRING;
|
||||
case domain.StaffCertificateStatus.notStarted:
|
||||
return dc.CertificateStatus.NOT_STARTED;
|
||||
}
|
||||
}
|
||||
|
||||
domain.ComplianceType _mapToDomainComplianceType(
|
||||
dc.EnumValue<dc.ComplianceType> type,
|
||||
) {
|
||||
if (type is dc.Unknown) return domain.ComplianceType.other;
|
||||
final dc.ComplianceType value = (type as dc.Known<dc.ComplianceType>).value;
|
||||
switch (value) {
|
||||
case dc.ComplianceType.BACKGROUND_CHECK:
|
||||
return domain.ComplianceType.backgroundCheck;
|
||||
case dc.ComplianceType.FOOD_HANDLER:
|
||||
return domain.ComplianceType.foodHandler;
|
||||
case dc.ComplianceType.RBS:
|
||||
return domain.ComplianceType.rbs;
|
||||
case dc.ComplianceType.LEGAL:
|
||||
return domain.ComplianceType.legal;
|
||||
case dc.ComplianceType.OPERATIONAL:
|
||||
return domain.ComplianceType.operational;
|
||||
case dc.ComplianceType.SAFETY:
|
||||
return domain.ComplianceType.safety;
|
||||
case dc.ComplianceType.TRAINING:
|
||||
return domain.ComplianceType.training;
|
||||
case dc.ComplianceType.LICENSE:
|
||||
return domain.ComplianceType.license;
|
||||
case dc.ComplianceType.OTHER:
|
||||
return domain.ComplianceType.other;
|
||||
}
|
||||
}
|
||||
|
||||
dc.ComplianceType _mapToDCComplianceType(domain.ComplianceType type) {
|
||||
switch (type) {
|
||||
case domain.ComplianceType.backgroundCheck:
|
||||
return dc.ComplianceType.BACKGROUND_CHECK;
|
||||
case domain.ComplianceType.foodHandler:
|
||||
return dc.ComplianceType.FOOD_HANDLER;
|
||||
case domain.ComplianceType.rbs:
|
||||
return dc.ComplianceType.RBS;
|
||||
case domain.ComplianceType.legal:
|
||||
return dc.ComplianceType.LEGAL;
|
||||
case domain.ComplianceType.operational:
|
||||
return dc.ComplianceType.OPERATIONAL;
|
||||
case domain.ComplianceType.safety:
|
||||
return dc.ComplianceType.SAFETY;
|
||||
case domain.ComplianceType.training:
|
||||
return dc.ComplianceType.TRAINING;
|
||||
case domain.ComplianceType.license:
|
||||
return dc.ComplianceType.LICENSE;
|
||||
case domain.ComplianceType.other:
|
||||
return dc.ComplianceType.OTHER;
|
||||
}
|
||||
}
|
||||
|
||||
domain.StaffCertificateValidationStatus? _mapToDomainValidationStatus(
|
||||
dc.EnumValue<dc.ValidationStatus>? status,
|
||||
) {
|
||||
if (status == null || status is dc.Unknown) return null;
|
||||
final dc.ValidationStatus value =
|
||||
(status as dc.Known<dc.ValidationStatus>).value;
|
||||
switch (value) {
|
||||
case dc.ValidationStatus.APPROVED:
|
||||
return domain.StaffCertificateValidationStatus.approved;
|
||||
case dc.ValidationStatus.PENDING_EXPERT_REVIEW:
|
||||
return domain.StaffCertificateValidationStatus.pendingExpertReview;
|
||||
case dc.ValidationStatus.REJECTED:
|
||||
return domain.StaffCertificateValidationStatus.rejected;
|
||||
case dc.ValidationStatus.AI_VERIFIED:
|
||||
return domain.StaffCertificateValidationStatus.aiVerified;
|
||||
case dc.ValidationStatus.AI_FLAGGED:
|
||||
return domain.StaffCertificateValidationStatus.aiFlagged;
|
||||
case dc.ValidationStatus.MANUAL_REVIEW_NEEDED:
|
||||
return domain.StaffCertificateValidationStatus.manualReviewNeeded;
|
||||
}
|
||||
}
|
||||
|
||||
dc.ValidationStatus? _mapToDCValidationStatus(
|
||||
domain.StaffCertificateValidationStatus? status,
|
||||
) {
|
||||
if (status == null) return null;
|
||||
switch (status) {
|
||||
case domain.StaffCertificateValidationStatus.approved:
|
||||
return dc.ValidationStatus.APPROVED;
|
||||
case domain.StaffCertificateValidationStatus.pendingExpertReview:
|
||||
return dc.ValidationStatus.PENDING_EXPERT_REVIEW;
|
||||
case domain.StaffCertificateValidationStatus.rejected:
|
||||
return dc.ValidationStatus.REJECTED;
|
||||
case domain.StaffCertificateValidationStatus.aiVerified:
|
||||
return dc.ValidationStatus.AI_VERIFIED;
|
||||
case domain.StaffCertificateValidationStatus.aiFlagged:
|
||||
return dc.ValidationStatus.AI_FLAGGED;
|
||||
case domain.StaffCertificateValidationStatus.manualReviewNeeded:
|
||||
return dc.ValidationStatus.MANUAL_REVIEW_NEEDED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,4 +83,24 @@ abstract interface class StaffConnectorRepository {
|
||||
DocumentStatus? status,
|
||||
String? verificationId,
|
||||
});
|
||||
|
||||
/// Fetches the staff certificates for the current authenticated user.
|
||||
Future<List<StaffCertificate>> getStaffCertificates();
|
||||
|
||||
/// Upserts staff certificate information.
|
||||
Future<void> upsertStaffCertificate({
|
||||
required ComplianceType certificationType,
|
||||
required String name,
|
||||
required StaffCertificateStatus status,
|
||||
String? fileUrl,
|
||||
DateTime? expiry,
|
||||
String? issuer,
|
||||
String? certificateNumber,
|
||||
StaffCertificateValidationStatus? validationStatus,
|
||||
});
|
||||
|
||||
/// Deletes a staff certificate.
|
||||
Future<void> deleteStaffCertificate({
|
||||
required ComplianceType certificationType,
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user