c829f78984
- Opprettet Flutter-prosjekt med alle nødvendige avhengigheter - Implementert datamodeller (User, TimeRegistration, TariffProfile, Deviation, AuditLog) - Implementert tjenester (AuthService, TimeService) - Implementert Riverpod providers for state management - Opprettet autentiseringsskjermer (login, signup, reset password) - Opprettet hjemmeskjerm med timer-funksjonalitet - Opprettet placeholder-skjermer for historikk, rapporter og profil - Lagt til norsk dokumentasjon i README
116 lines
2.7 KiB
Dart
116 lines
2.7 KiB
Dart
import 'package:cloud_firestore/cloud_firestore.dart';
|
|
|
|
enum AuditAction {
|
|
create,
|
|
update,
|
|
delete,
|
|
}
|
|
|
|
enum EntityType {
|
|
timeRegistration,
|
|
user,
|
|
tariffProfile,
|
|
}
|
|
|
|
class AuditLog {
|
|
final String id;
|
|
final String userId;
|
|
final String organizationId;
|
|
final AuditAction action;
|
|
final EntityType entityType;
|
|
final String entityId;
|
|
final Map<String, dynamic>? before;
|
|
final Map<String, dynamic>? after;
|
|
final DateTime timestamp;
|
|
final String? ipAddress;
|
|
|
|
AuditLog({
|
|
required this.id,
|
|
required this.userId,
|
|
required this.organizationId,
|
|
required this.action,
|
|
required this.entityType,
|
|
required this.entityId,
|
|
this.before,
|
|
this.after,
|
|
required this.timestamp,
|
|
this.ipAddress,
|
|
});
|
|
|
|
factory AuditLog.fromFirestore(DocumentSnapshot doc) {
|
|
final data = doc.data() as Map<String, dynamic>;
|
|
return AuditLog(
|
|
id: doc.id,
|
|
userId: data['userId'] ?? '',
|
|
organizationId: data['organizationId'] ?? '',
|
|
action: _parseAction(data['action']),
|
|
entityType: _parseEntityType(data['entityType']),
|
|
entityId: data['entityId'] ?? '',
|
|
before: data['changes']?['before'],
|
|
after: data['changes']?['after'],
|
|
timestamp: (data['timestamp'] as Timestamp).toDate(),
|
|
ipAddress: data['ipAddress'],
|
|
);
|
|
}
|
|
|
|
Map<String, dynamic> toFirestore() {
|
|
return {
|
|
'userId': userId,
|
|
'organizationId': organizationId,
|
|
'action': action.name,
|
|
'entityType': entityType.name,
|
|
'entityId': entityId,
|
|
'changes': {
|
|
'before': before,
|
|
'after': after,
|
|
},
|
|
'timestamp': Timestamp.fromDate(timestamp),
|
|
'ipAddress': ipAddress,
|
|
};
|
|
}
|
|
|
|
static AuditAction _parseAction(String? actionString) {
|
|
switch (actionString) {
|
|
case 'update':
|
|
return AuditAction.update;
|
|
case 'delete':
|
|
return AuditAction.delete;
|
|
default:
|
|
return AuditAction.create;
|
|
}
|
|
}
|
|
|
|
static EntityType _parseEntityType(String? typeString) {
|
|
switch (typeString) {
|
|
case 'user':
|
|
return EntityType.user;
|
|
case 'tariffProfile':
|
|
return EntityType.tariffProfile;
|
|
default:
|
|
return EntityType.timeRegistration;
|
|
}
|
|
}
|
|
|
|
String get actionDisplayName {
|
|
switch (action) {
|
|
case AuditAction.create:
|
|
return 'Opprettet';
|
|
case AuditAction.update:
|
|
return 'Endret';
|
|
case AuditAction.delete:
|
|
return 'Slettet';
|
|
}
|
|
}
|
|
|
|
String get entityTypeDisplayName {
|
|
switch (entityType) {
|
|
case EntityType.timeRegistration:
|
|
return 'Timeregistrering';
|
|
case EntityType.user:
|
|
return 'Bruker';
|
|
case EntityType.tariffProfile:
|
|
return 'Tariffprofil';
|
|
}
|
|
}
|
|
}
|