Skip to content
Snippets Groups Projects
Verified Commit f3a1f44c authored by Andrej Ramašeuski's avatar Andrej Ramašeuski
Browse files

Events CRUD

parent a31b97fd
No related branches found
No related tags found
No related merge requests found
Pipeline #4134 passed
...@@ -2,7 +2,7 @@ image: docker:19.03.12 ...@@ -2,7 +2,7 @@ image: docker:19.03.12
variables: variables:
DOCKER_TLS_CERTDIR: "/certs" DOCKER_TLS_CERTDIR: "/certs"
IMAGE_VER: 2.1.1 IMAGE_VER: 2.2.0
services: services:
- docker:19.03.12-dind - docker:19.03.12-dind
......
...@@ -30,10 +30,7 @@ sub create ($c) { ...@@ -30,10 +30,7 @@ sub create ($c) {
sub get ($c) { sub get ($c) {
$c->openapi->valid_input or return; $c->openapi->valid_input or return;
my $event = $c->schema->resultset('Event')->find({ my $event = $c->_get() || return;
id => $c->stash->{id},
});
return $c->error(404, 'Event not found') if ! $event || $event->deleted;
my $formatted = $event->format(); my $formatted = $event->format();
$formatted->{acl} = []; $formatted->{acl} = [];
...@@ -96,14 +93,9 @@ sub update ($c) { ...@@ -96,14 +93,9 @@ sub update ($c) {
my $args = $c->req->json; my $args = $c->req->json;
my $event = $c->schema->resultset('Event')->find($c->stash->{id}); my $event = $c->_get('chairman');
return $c->error(404, 'Event not found') if ! $event;
my $update = $c->prepare_update_data( $event, $c->req->json ); my $update = $c->prepare_update_data( $event, $c->req->json );
my $guard = $c->schema->txn_scope_guard;
$event->update({ %{ $update }, }); $event->update({ %{ $update }, });
$guard->commit;
$c->render(status => 204, text => ''); $c->render(status => 204, text => '');
} }
...@@ -111,14 +103,26 @@ sub update ($c) { ...@@ -111,14 +103,26 @@ sub update ($c) {
sub delete ($c) { sub delete ($c) {
$c->openapi->valid_input or return; $c->openapi->valid_input or return;
my $event = $c->schema->resultset('Event')->find($c->stash->{id}); my $event = $c->_get('chairman') || return;
return $c->error(404, 'Event not found') if ! $event;
my $guard = $c->schema->txn_scope_guard;
$event->update({ deleted => \'now()', }); $event->update({ deleted => \'now()', });
$guard->commit;
$c->render(status => 204, text => ''); $c->render(status => 204, text => '');
} }
sub _get ($c, $role='') {
my $event = $c->schema->resultset('Event')->find({
$c->stash->{id}
});
return $c->error(404, 'Event not found') if ! $event || $event->deleted;
if ( $role ) {
my $roles = $event->user_roles( $c->user );
return $c->error(403, 'Access denied') if ! exists $roles->{$role};
}
return $event;
}
1; 1;
...@@ -23,6 +23,7 @@ __PACKAGE__->add_columns( ...@@ -23,6 +23,7 @@ __PACKAGE__->add_columns(
type type
state state
owner_id owner_id
is_opened
is_published is_published
start start
finish finish
...@@ -54,6 +55,7 @@ sub format ($self) { ...@@ -54,6 +55,7 @@ sub format ($self) {
id => $self->id, id => $self->id,
type => $self->type, type => $self->type,
state => $self->state, state => $self->state,
is_opened => $self->is_opened ? \1 : \0,
is_published => $self->is_published ? \1 : \0, is_published => $self->is_published ? \1 : \0,
start => $self->start, start => $self->start,
finish => $self->finish, finish => $self->finish,
......
...@@ -91,6 +91,8 @@ components: ...@@ -91,6 +91,8 @@ components:
state: state:
type: integer type: integer
enum: [0, 1, 2] enum: [0, 1, 2]
is_opened:
type: boolean
is_published: is_published:
type: boolean type: boolean
start: start:
...@@ -343,6 +345,9 @@ paths: ...@@ -343,6 +345,9 @@ paths:
type: integer type: integer
enum: [1, 2, 3] enum: [1, 2, 3]
example: 1 example: 1
is_opened:
type: boolean
example: true
start: start:
type: string type: string
maxLength: 20 maxLength: 20
...@@ -467,7 +472,7 @@ paths: ...@@ -467,7 +472,7 @@ paths:
in: path in: path
required: true required: true
example: 100345 example: 100345
description: "ID" description: "Event ID"
schema: schema:
type: integer type: integer
requestBody: requestBody:
...@@ -479,6 +484,9 @@ paths: ...@@ -479,6 +484,9 @@ paths:
type: type:
type: integer type: integer
enum: [1, 2, 3] enum: [1, 2, 3]
is_opened:
type: boolean
example: true
state: state:
type: integer type: integer
enum: [0, 1, 2] enum: [0, 1, 2]
...@@ -513,7 +521,7 @@ paths: ...@@ -513,7 +521,7 @@ paths:
security: security:
- Bearer: ['organizer'] - Bearer: ['organizer']
tags: tags:
- event - events
summary: "Smazat udalost" summary: "Smazat udalost"
operationId: deleteEvent operationId: deleteEvent
parameters: parameters:
...@@ -527,6 +535,110 @@ paths: ...@@ -527,6 +535,110 @@ paths:
204: 204:
description: Event deleted description: Event deleted
/events/{id}/roles:
post:
x-mojo-to: events#role_add
security:
- Bearer: ['*']
tags:
- events
summary: "Priradit roli pro udalost"
operationId: addEventRole
parameters:
- name: id
in: path
required: true
example: 100345
description: "Event ID"
schema:
type: integer
requestBody:
content:
application/json:
schema:
type: object
properties:
subject_class:
type: string
enum: ['user', 'group']
example: 'user'
subject:
type: string
example: 'cen:f'
role:
type: string
enum: ['chairman', 'member', 'guest', 'jitsi']
example: 'member'
required:
- subject_class
- subject
- role
responses:
201:
description: Role set
content:
application/json:
schema:
type: object
properties:
id:
type: integer
description: ACL record id
delete:
x-mojo-to: events#role_delete
security:
- Bearer: ['*']
tags:
- events
summary: "Odebrat roli pro udalost"
operationId: deleteEventRole
parameters:
- name: id
in: path
required: true
example: 100345
description: "Event ID"
schema:
type: integer
- name: role_id
in: query
required: true
example: 200345
description: "Identifikator ACL zaznamu"
schema:
type: integer
responses:
204:
description: Role deleted
/events/{id}/banner:
post:
x-mojo-to: events#banner
security:
- Bearer: ['*']
tags:
- events
summary: "Uploadovat banner"
operationId: addEventBanner
parameters:
- name: id
in: path
required: true
example: 100345
description: "Event ID"
schema:
type: integer
requestBody:
content:
application/octet-stream:
schema:
# a binary file of any type
type: string
format: binary
responses:
201:
description: Banner uploaded
/sso/subjects: /sso/subjects:
get: get:
x-mojo-to: SSO#subjects x-mojo-to: SSO#subjects
......
...@@ -4,6 +4,7 @@ create table "events" ( ...@@ -4,6 +4,7 @@ create table "events" (
"type" smallint not null default 1, --1 "type" smallint not null default 1, --1
"state" integer not null default 0, "state" integer not null default 0,
"owner_id" integer not null, "owner_id" integer not null,
"is_opened" bool not null default true,
"is_published" bool not null default false, "is_published" bool not null default false,
"start" timestamp(0), "start" timestamp(0),
"finish" timestamp(0), "finish" timestamp(0),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment