diff --git a/hasura/metadata/databases/punkga-pg/tables/public_contest.yaml b/hasura/metadata/databases/punkga-pg/tables/public_contest.yaml index 6f9c388..ef100b6 100644 --- a/hasura/metadata/databases/punkga-pg/tables/public_contest.yaml +++ b/hasura/metadata/databases/punkga-pg/tables/public_contest.yaml @@ -9,6 +9,13 @@ array_relationships: table: name: artworks schema: public + - name: contest_i18ns + using: + foreign_key_constraint_on: + column: contest_id + table: + name: i18n + schema: public - name: contest_mangas using: foreign_key_constraint_on: @@ -20,6 +27,7 @@ select_permissions: - role: anonymous permission: columns: + - isLive - id - slug - created_at @@ -31,6 +39,7 @@ select_permissions: - role: user permission: columns: + - isLive - id - slug - created_at diff --git a/hasura/metadata/databases/punkga-pg/tables/public_i18n.yaml b/hasura/metadata/databases/punkga-pg/tables/public_i18n.yaml index b4d39d0..bcb495c 100644 --- a/hasura/metadata/databases/punkga-pg/tables/public_i18n.yaml +++ b/hasura/metadata/databases/punkga-pg/tables/public_i18n.yaml @@ -9,9 +9,12 @@ select_permissions: - role: anonymous permission: columns: + - banner_id - campaign_id + - contest_id - id - language_id + - launchpad_id - quest_id - data - created_at @@ -20,9 +23,12 @@ select_permissions: - role: user permission: columns: + - banner_id - campaign_id + - contest_id - id - language_id + - launchpad_id - quest_id - data - created_at diff --git a/hasura/metadata/query_collections.yaml b/hasura/metadata/query_collections.yaml index 684fa51..28cbaed 100644 --- a/hasura/metadata/query_collections.yaml +++ b/hasura/metadata/query_collections.yaml @@ -1321,32 +1321,40 @@ } } } - - name: Public - Get contest by creator id + - name: Public - Get artwork by creator and contest query: | - query contest ($creator_id: Int!, $limit: Int = 10, $offset: Int = 0) { - contest(where: {_or:[{contest_artworks:{creator_id:{_eq:$creator_id}}},{contest_mangas:{manga_creators:{creator_id:{_eq:$creator_id}}}}]}, limit: $limit, offset: $offset) { + query artwork ($contest_id: Int!, $id: Int!, $limit: Int = 100, $offset: Int = 0) { + artworks(where: {contest_id:{_eq:$contest_id},creator_id:{_eq:$id}}, limit: $limit, offset: $offset) { id - start_date - end_date - slug + url + source_url created_at } - contest_aggregate(where: {_or:[{contest_artworks:{creator_id:{_eq:$creator_id}}},{contest_mangas:{manga_creators:{creator_id:{_eq:$creator_id}}}}]}, limit: $limit, offset: $offset) { + artworks_aggregate(where: {contest_id:{_eq:$contest_id},creator_id:{_eq:$id}}, limit: $limit, offset: $offset) { aggregate { count } } } - - name: Public - Get artwork by creator and contest + - name: Public - Get contest by creator id query: | - query artwork ($contest_id: Int!, $id: Int!, $limit: Int = 100, $offset: Int = 0) { - artworks(where: {contest_id:{_eq:$contest_id},creator_id:{_eq:$id}}, limit: $limit, offset: $offset) { + query contest ($creator_id: Int!, $limit: Int = 10, $offset: Int = 0) { + contest(where: {_or:[{contest_artworks:{creator_id:{_eq:$creator_id}}},{contest_mangas:{manga_creators:{creator_id:{_eq:$creator_id}}}}]}, limit: $limit, offset: $offset) { id - url - source_url + start_date + end_date + slug created_at + contest_i18ns { + data + i18n_language { + id + is_main + symbol + } + } } - artworks_aggregate(where: {contest_id:{_eq:$contest_id},creator_id:{_eq:$id}}, limit: $limit, offset: $offset) { + contest_aggregate(where: {_or:[{contest_artworks:{creator_id:{_eq:$creator_id}}},{contest_mangas:{manga_creators:{creator_id:{_eq:$creator_id}}}}]}, limit: $limit, offset: $offset) { aggregate { count } diff --git a/hasura/migrations/punkga-pg/1723000761110_alter_table_public_i18n_add_column_contest_id/down.sql b/hasura/migrations/punkga-pg/1723000761110_alter_table_public_i18n_add_column_contest_id/down.sql new file mode 100644 index 0000000..b18e81f --- /dev/null +++ b/hasura/migrations/punkga-pg/1723000761110_alter_table_public_i18n_add_column_contest_id/down.sql @@ -0,0 +1,4 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- alter table "public"."i18n" add column "contest_id" integer +-- null; diff --git a/hasura/migrations/punkga-pg/1723000761110_alter_table_public_i18n_add_column_contest_id/up.sql b/hasura/migrations/punkga-pg/1723000761110_alter_table_public_i18n_add_column_contest_id/up.sql new file mode 100644 index 0000000..62a2ddc --- /dev/null +++ b/hasura/migrations/punkga-pg/1723000761110_alter_table_public_i18n_add_column_contest_id/up.sql @@ -0,0 +1,2 @@ +alter table "public"."i18n" add column "contest_id" integer + null; diff --git a/hasura/migrations/punkga-pg/1723000779882_set_fk_public_i18n_contest_id/down.sql b/hasura/migrations/punkga-pg/1723000779882_set_fk_public_i18n_contest_id/down.sql new file mode 100644 index 0000000..61d3d42 --- /dev/null +++ b/hasura/migrations/punkga-pg/1723000779882_set_fk_public_i18n_contest_id/down.sql @@ -0,0 +1 @@ +alter table "public"."i18n" drop constraint "i18n_contest_id_fkey"; diff --git a/hasura/migrations/punkga-pg/1723000779882_set_fk_public_i18n_contest_id/up.sql b/hasura/migrations/punkga-pg/1723000779882_set_fk_public_i18n_contest_id/up.sql new file mode 100644 index 0000000..453df4c --- /dev/null +++ b/hasura/migrations/punkga-pg/1723000779882_set_fk_public_i18n_contest_id/up.sql @@ -0,0 +1,5 @@ +alter table "public"."i18n" + add constraint "i18n_contest_id_fkey" + foreign key ("contest_id") + references "public"."contest" + ("id") on update cascade on delete cascade; diff --git a/hasura/migrations/punkga-pg/1723000792267_alter_table_public_i18n_add_unique_language_id_contest_id/down.sql b/hasura/migrations/punkga-pg/1723000792267_alter_table_public_i18n_add_unique_language_id_contest_id/down.sql new file mode 100644 index 0000000..b162f1b --- /dev/null +++ b/hasura/migrations/punkga-pg/1723000792267_alter_table_public_i18n_add_unique_language_id_contest_id/down.sql @@ -0,0 +1 @@ +alter table "public"."i18n" drop constraint "i18n_language_id_contest_id_key"; diff --git a/hasura/migrations/punkga-pg/1723000792267_alter_table_public_i18n_add_unique_language_id_contest_id/up.sql b/hasura/migrations/punkga-pg/1723000792267_alter_table_public_i18n_add_unique_language_id_contest_id/up.sql new file mode 100644 index 0000000..18cb35b --- /dev/null +++ b/hasura/migrations/punkga-pg/1723000792267_alter_table_public_i18n_add_unique_language_id_contest_id/up.sql @@ -0,0 +1 @@ +alter table "public"."i18n" add constraint "i18n_language_id_contest_id_key" unique ("language_id", "contest_id"); diff --git a/hasura/migrations/punkga-pg/1723000872444_alter_table_public_contest_add_column_isLive/down.sql b/hasura/migrations/punkga-pg/1723000872444_alter_table_public_contest_add_column_isLive/down.sql new file mode 100644 index 0000000..246dd84 --- /dev/null +++ b/hasura/migrations/punkga-pg/1723000872444_alter_table_public_contest_add_column_isLive/down.sql @@ -0,0 +1,4 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- alter table "public"."contest" add column "isLive" boolean +-- null default 'false'; diff --git a/hasura/migrations/punkga-pg/1723000872444_alter_table_public_contest_add_column_isLive/up.sql b/hasura/migrations/punkga-pg/1723000872444_alter_table_public_contest_add_column_isLive/up.sql new file mode 100644 index 0000000..cd2188b --- /dev/null +++ b/hasura/migrations/punkga-pg/1723000872444_alter_table_public_contest_add_column_isLive/up.sql @@ -0,0 +1,2 @@ +alter table "public"."contest" add column "isLive" boolean + null default 'false'; diff --git a/src/modules/files/dto/upload.dto.ts b/src/modules/files/dto/upload.dto.ts new file mode 100644 index 0000000..bd8d988 --- /dev/null +++ b/src/modules/files/dto/upload.dto.ts @@ -0,0 +1,11 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString } from 'class-validator'; + +export class UploadImageS3Dto { + @ApiProperty() + @IsString() + key: string; + + @ApiProperty({ type: 'string', format: 'binary' }) + file: Express.Multer.File; +} diff --git a/src/modules/files/files.controller.ts b/src/modules/files/files.controller.ts new file mode 100644 index 0000000..8dda55e --- /dev/null +++ b/src/modules/files/files.controller.ts @@ -0,0 +1,36 @@ +import { + Body, + Controller, + Post, + UploadedFile, + UseGuards, + UseInterceptors, +} from '@nestjs/common'; +import { AuthGuard } from '../../auth/auth.guard'; +import { ApiBearerAuth, ApiConsumes, ApiTags } from '@nestjs/swagger'; +import { AuthUserInterceptor } from '../../interceptors/auth-user.interceptor'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { Roles } from '../../auth/roles.decorator'; +import { Role } from '../../auth/role.enum'; +import { RolesGuard } from '../../auth/role.guard'; +import { FilesService } from './files.service'; +import { UploadImageS3Dto } from './dto/upload.dto'; + +@Controller('files') +@ApiTags('files') +export class FileController { + constructor(private readonly fileSvc: FilesService) {} + + @UseGuards(AuthGuard, RolesGuard) + @ApiBearerAuth() + @Roles(Role.Admin) + @Post() + @ApiConsumes('multipart/form-data') + @UseInterceptors(AuthUserInterceptor, FileInterceptor('file')) + create( + @Body() data: UploadImageS3Dto, + @UploadedFile() file: Express.Multer.File + ) { + return this.fileSvc.uploadImageToS3(data.key, file); + } +} diff --git a/src/modules/files/files.module.ts b/src/modules/files/files.module.ts index d6383b7..8822b30 100644 --- a/src/modules/files/files.module.ts +++ b/src/modules/files/files.module.ts @@ -1,8 +1,12 @@ import { Module } from '@nestjs/common'; import { FilesService } from './files.service'; +import { FileController } from './files.controller'; +import { JwtModule } from '@nestjs/jwt'; @Module({ + imports: [JwtModule], providers: [FilesService], + controllers: [FileController], exports: [FilesService], }) export class FilesModule {}