Frontend first draft

This commit is contained in:
Arseni
2025-11-13 15:06:15 +03:00
parent e47f343afb
commit ddb54ddfdc
504 changed files with 25498 additions and 1 deletions

View File

@@ -0,0 +1,13 @@
import 'package:pshared/models/permissions/data/permissions.dart';
import 'package:pshared/models/permissions/descriptions/permissions.dart';
class UserAccess {
final PermissionsDescription descriptions;
final PermissionsData permissions;
const UserAccess({
required this.descriptions,
required this.permissions,
});
}

View File

@@ -0,0 +1,15 @@
enum Action {
create,
read,
update,
delete,
}
extension ActionExtension on Action {
String toShortString() => toString().split('.').last;
static Action fromString(String value) => Action.values.firstWhere(
(e) => e.toShortString() == value,
orElse: () => throw ArgumentError('Invalid action: $value'),
);
}

View File

@@ -0,0 +1,13 @@
import 'package:pshared/models/permissions/action.dart';
import 'package:pshared/models/permissions/effect.dart';
class ActionEffect {
final Action action; // The action allowed or denied
final Effect effect; // The effect of the policy ("allow" or "deny")
const ActionEffect({
required this.action,
required this.effect,
});
}

View File

@@ -0,0 +1,12 @@
import 'package:pshared/models/permissions/data/policy.dart';
class Permission {
final Policy policy;
final String accountRef;
const Permission({
required this.policy,
required this.accountRef,
});
}

View File

@@ -0,0 +1,16 @@
import 'package:pshared/models/permissions/data/permission.dart';
import 'package:pshared/models/permissions/data/policy.dart';
import 'package:pshared/models/permissions/data/role.dart';
class PermissionsData {
final List<Role> roles;
final List<Policy> policies;
final List<Permission> permissions;
const PermissionsData({
required this.roles,
required this.policies,
required this.permissions,
});
}

View File

@@ -0,0 +1,18 @@
import 'package:pshared/models/permissions/action_effect.dart';
class Policy {
final String roleDescriptionRef;
final String organizationRef;
final String descriptionRef;
final String? objectRef;
final ActionEffect effect;
const Policy({
required this.roleDescriptionRef,
required this.organizationRef,
required this.descriptionRef,
required this.objectRef,
required this.effect,
});
}

View File

@@ -0,0 +1,11 @@
class Role {
final String accountRef;
final String organizationRef;
final String descriptionRef;
const Role({
required this.accountRef,
required this.descriptionRef,
required this.organizationRef,
});
}

View File

@@ -0,0 +1,13 @@
import 'package:pshared/models/permissions/descriptions/policy.dart';
import 'package:pshared/models/permissions/descriptions/role.dart';
class PermissionsDescription {
final List<RoleDescription> roles;
final List<PolicyDescription> policies;
const PermissionsDescription({
required this.roles,
required this.policies,
});
}

View File

@@ -0,0 +1,22 @@
import 'package:pshared/models/resources.dart';
import 'package:pshared/models/storable.dart';
class PolicyDescription implements Storable {
final Storable storable;
final List<ResourceType>? resourceTypes;
final String? organizationRef;
@override
String get id => storable.id;
@override
DateTime get createdAt => storable.createdAt;
@override
DateTime get updatedAt => storable.updatedAt;
const PolicyDescription({
required this.storable,
required this.resourceTypes,
required this.organizationRef,
});
}

View File

@@ -0,0 +1,27 @@
import 'package:pshared/models/storable.dart';
class RoleDescription implements Storable {
final Storable storable;
@override
String get id => storable.id;
@override
DateTime get createdAt => storable.createdAt;
@override
DateTime get updatedAt => storable.updatedAt;
final String organizationRef;
const RoleDescription({
required this.storable,
required this.organizationRef,
});
factory RoleDescription.build({
required String organizationRef,
}) => RoleDescription(
storable: newStorable(),
organizationRef: organizationRef
);
}

View File

@@ -0,0 +1,13 @@
enum Effect {
allow,
deny,
}
extension EffectExtension on Effect {
String toShortString() => toString().split('.').last;
static Effect fromString(String value) => Effect.values.firstWhere(
(e) => e.toShortString() == value,
orElse: () => throw ArgumentError('Invalid effect: $value'),
);
}