From 862473fc74ba2aa849bbcf8a6fd9f6a961bd02b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrej=20Rama=C5=A1euski?= <andrej@x2.cz> Date: Fri, 4 Feb 2022 23:28:25 +0100 Subject: [PATCH] Base events managenent --- lib/CF/Controller/Events.pm | 42 +++++++++++++++++++++++++++++++++++-- sql/9/up.sql | 33 +++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 sql/9/up.sql diff --git a/lib/CF/Controller/Events.pm b/lib/CF/Controller/Events.pm index 30a72a3..5306bb4 100644 --- a/lib/CF/Controller/Events.pm +++ b/lib/CF/Controller/Events.pm @@ -36,7 +36,7 @@ sub get ($c) { my $formatted = $event->format(); $formatted->{acl} = []; $formatted->{stream_url} = $event->stream_url - || '/hls/' . $event->uuid . '.m3u8'; + // '/hls/' . $event->uuid . '.m3u8'; my $roles = $event->user_roles( $c->user ); @@ -110,10 +110,48 @@ sub delete ($c) { $c->render(status => 204, text => ''); } +sub role_add ($c) { + $c->openapi->valid_input or return; + + my $args = $c->req->json; + + my $event = $c->_get('chairman') || return; + + my $subject = $c->schema->resultset('EventACLSubject')->find_or_new({ + class => $args->{subject_class}, + key => $args->{subject_value}, + name => $args->{subject_name} || $args->{subject_value}, + }, + { + key => 'class_key' + }); + + if ( $subject->in_storage ) { + if ( $args->{subject_name} && $args->{subject_name} ne $subject->name ) { + $subject->update({ + updated => \'now()', + name => $args->{subject_name}, + }); + } + } else { + $subject->insert; + } + + my $acl = $event->find_or_create_related('acls', { + subject_id => $subject->id, + role => $args->{role}, + }); + + $c->render( + status => 201, + openapi => { id => $acl->id }, + ); +} + sub _get ($c, $role='') { my $event = $c->schema->resultset('Event')->find({ - $c->stash->{id} + id => $c->stash->{id} }); return $c->error(404, 'Event not found') if ! $event || $event->deleted; diff --git a/sql/9/up.sql b/sql/9/up.sql new file mode 100644 index 0000000..ef4b1a5 --- /dev/null +++ b/sql/9/up.sql @@ -0,0 +1,33 @@ +create table "events_acl_subjects" ( + "id" integer not null default nextval('uid_seq'), + "updated" timestamp(0) not null default now(), + "class" varchar(8) not null, + "key" text not null, + "name" text, + primary key("id"), + unique("class", "key") +); + +create table "events_acl" ( + "id" integer not null default nextval('uid_seq'), + "event_id" integer not null, + "subject_id" integer not null, + "role" text, + primary key("id"), + unique("event_id", "subject_id", "role"), + foreign key ("event_id") references "events" ("id") on update cascade on delete cascade, + foreign key ("subject_id") references "events_acl_subjects" ("id") on update cascade on delete cascade +); + +create view "events_acl_view" as ( + select + "events_acl"."id", + "events_acl"."event_id", + "events_acl_subjects"."class" as "subject_class", + "events_acl_subjects"."key" as "subject_key", + "events_acl_subjects"."name" as "subject_name", + "events_acl"."role" + from "events_acl" + join "events_acl_subjects" on ("events_acl"."subject_id" = "events_acl_subjects"."id") +); + -- GitLab