Initial commit: TimeReg Flutter app med Firebase backend
- 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
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
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';
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user