Skip to content

Commit

Permalink
feat(GET /vr-video, resource)" Add endpoint by Id for VR viewer.
Browse files Browse the repository at this point in the history
  • Loading branch information
woog2roid committed May 12, 2024
1 parent cb0c300 commit 38cd869
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 72 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ export class VrResourceDto extends PickType(VrResource, [
}
}

export class GetVrResourceByIdResponseDto extends VrResourceDto {}

export class GetVrResourcesResponseDto {
@ApiProperty({
description: 'VR 자원(아바타, 배경) 목록',
Expand Down
6 changes: 6 additions & 0 deletions src/domain/vr-resource/repository/vr-resource.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,10 @@ export class VrResourceRepository extends Repository<VrResource> {
async findById(id: string): Promise<VrResource> {
return this.repository.findOne({ where: { id }, relations: ['group'] });
}

async findByIdAndGroupId(id: string, groupId: string): Promise<VrResource> {
return this.repository.findOne({
where: { id, group: { id: groupId } },
});
}
}
24 changes: 23 additions & 1 deletion src/domain/vr-resource/service/vr-resource.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import { Injectable } from '@nestjs/common';
import {
ForbiddenException,
Injectable,
NotFoundException,
} from '@nestjs/common';
import { GroupService } from 'src/domain/group/service/group.service';
import { VrResourceRepository } from '../repository/vr-resource.repository';
import { User } from 'src/domain/user/entity/user.entity';
Expand Down Expand Up @@ -36,6 +40,24 @@ export class VrResourceService {
return vrResourceDtos;
}

async getVrResourceById(id: string, user: User): Promise<VrResourceDto> {
// 1. Get VR resource by id
const vrResource = await this.vrResourceRepository.findById(id);
if (!vrResource) {
throw new NotFoundException('Not found');
}
// 2. Check if the user has access to the resource
const isOwner =
vrResource?.group?.id !== (await this.groupService.getMyGroup(user)).id;
if (!(isOwner || vrResource.isSample)) {
throw new ForbiddenException('Forbidden');
}

// 3. make as dto
const vrResourceDto = await this.makeVrResourceDto([vrResource]);
return vrResourceDto[0];
}

/* -------------------------------------------------------------------------- */
private makeVrResourceDto(
vrResources: VrResource[],
Expand Down
20 changes: 19 additions & 1 deletion src/domain/vr-resource/vr-resource.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
UploadedFile,
Get,
UploadedFiles,
Param,
} from '@nestjs/common';
import {
ApiBearerAuth,
Expand All @@ -29,7 +30,10 @@ import { InitEnrollGuard } from 'src/common/auth/guard/init-enroll.guard';
import { CareGiverGuard } from 'src/common/auth/guard/role.guard';
import { GetAiTaskQueueResponseDto } from './dto/response/get-ai-task-queue.response.dto';
import { VrResourceService } from './service/vr-resource.service';
import { GetVrResourcesResponseDto } from './dto/response/get-vr-resources.response.dto';
import {
GetVrResourceByIdResponseDto,
GetVrResourcesResponseDto,
} from './dto/response/get-vr-resources.response.dto';
import { GenerateAvatarRequestDto } from './dto/request/generate-avatar.request.dto';

@ApiTags('VR-resource')
Expand Down Expand Up @@ -87,6 +91,20 @@ export class VrResourceController {
);
}

@ApiOperation({
summary: 'ID로 특정 VR 자원 불러오기 (샘플 포함)',
})
@ApiBearerAuth()
@ApiResponse({ type: GetVrResourcesResponseDto })
@UseGuards(JwtAuthGuard, InitEnrollGuard)
@Get('/:id')
async getVrResourceById(
@Param('id') resourceId: string,
@AuthUser() user: User,
): Promise<GetVrResourceByIdResponseDto> {
return await this.vrResourceService.getVrResourceById(resourceId, user);
}

@ApiOperation({
summary: '완성된 VR 자원 불러오기 (샘플 포함)',
})
Expand Down
2 changes: 1 addition & 1 deletion src/domain/vr-video/repository/vr-video.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export class VrVideoRepository extends Repository<VrVideo> {
async findById(videoId: string): Promise<VrVideo> {
return this.repository.findOne({
where: { id: videoId },
relations: ['scene', 'avatars'],
relations: ['scene', 'avatars', 'group'],
});
}

Expand Down
83 changes: 28 additions & 55 deletions src/domain/vr-video/service/vr-video.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,34 @@ export class VrVideoService {
return await this.makeVrVideoDto(sampleVrVideos);
}

// /* ---------------------------- GET /vr-video/:id --------------------------- */
/**
* videoID를 통해 특정 video만 가져옴
* @param user UserID
* @param videoId videoID
*/
async getVrVideo(
user: User,
videoId: string,
): Promise<GetVrVideosResponseDto> {
const vrVideo = await this.vrVideoRepository.findById(videoId);
// 1. validation logic
if (!vrVideo) {
throw new NotFoundException('VrVideo not found');
}
const isUserInGroup = await this.groupRepository.isUserInGroup(
user.id,
vrVideo.group.id,
);
const isSample = vrVideo.isSample;
if (!(isUserInGroup || isSample)) {
throw new NotFoundException('User is not in the group');
}

// 2. return DTO from DB.
return (await this.makeVrVideoDto([vrVideo]))[0];
}

/* ----------------------------- POST /vr-video ----------------------------- */

/**
Expand Down Expand Up @@ -267,58 +295,3 @@ export class VrVideoService {
);
}
}

// // deprecated
// // /* ---------------------------- GET /vr-video/:id --------------------------- */

// // /**
// // * videoID를 통해 특정 video만 가져옴
// // * @param user UserID
// // * @param videoId videoID
// // */
// // async getVrVideo(
// // user: User,
// // videoId: string,
// // ): Promise<GetVrVideosResponseDto> {
// // const vrVideo = await this.vrVideoRepository.findById(videoId);
// // // 1. validation logic
// // if (!vrVideo) {
// // throw new NotFoundException('VrVideo not found');
// // }
// // const isUserInGroup = await this.groupRepository.isUserInGroup(
// // user.id,
// // vrVideo.group.id,
// // );
// // if (!isUserInGroup) {
// // throw new NotFoundException('User is not in the group');
// // }

// // // 2. return DTO from DB.
// // const sceneDto = VrResourceDtoForVideo.of(
// // vrVideo.scene,
// // await this.vrResourceStorageRepository.generateSignedUrlList(
// // vrVideo.scene.filePath,
// // ),
// // await this.getResourcePositionFileURL(
// // vrVideo.id,
// // vrVideo.scene.id,
// // 'scene',
// // ),
// // );
// // const avatarDtos = await Promise.all(
// // vrVideo.avatars.map(async (avatar) => {
// // return VrResourceDtoForVideo.of(
// // avatar,
// // await this.vrResourceStorageRepository.generateSignedUrlList(
// // avatar.filePath,
// // ),
// // await this.getResourcePositionFileURL(
// // vrVideo.id,
// // avatar.id,
// // 'avatar',
// // ),
// // );
// // }),
// // );
// // return new GetVrVideosResponseDto(vrVideo, sceneDto, avatarDtos);
// // }
26 changes: 12 additions & 14 deletions src/domain/vr-video/vr-video.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ export class VrVideoController {
return await this.vrVideoService.generateVrVideo(user, requestDto, true);
}

@ApiOperation({ summary: '특정 VR 비디오 정보 불러오기 (샘플 포함)' })
@ApiBearerAuth()
@ApiResponse({ type: GetVrVideosResponseDto })
@UseGuards(JwtAuthGuard, InitEnrollGuard)
@Get('/:id')
async getVrVideo(
@AuthUser() user: User,
@Param('id') videoId: string,
): Promise<GetVrVideosResponseDto> {
return await this.vrVideoService.getVrVideo(user, videoId);
}

@ApiOperation({ summary: 'VR 비디오 정보 불러오기' })
@ApiBearerAuth()
@ApiResponse({ type: [GetVrVideosResponseDto] })
Expand All @@ -44,17 +56,3 @@ export class VrVideoController {
return await this.vrVideoService.getVrVideos(user);
}
}

// deprecated
// // 특정 VR 비디오 id를 통해서 특정한 VR비디오 정보를 불러오는 API를 작성할것.
// @ApiOperation({ summary: 'VR 비디오 정보 불러오기' })
// @ApiBearerAuth()
// @ApiResponse({ type: GetVrVideosResponseDto })
// @UseGuards(JwtAuthGuard, InitEnrollGuard)
// @Get('/:id')
// async getVrVideo(
// @AuthUser() user: User,
// @Param('id') videoId: string,
// ): Promise<GetVrVideosResponseDto> {
// return await this.vrVideoService.getVrVideo(user, videoId);
// }

0 comments on commit 38cd869

Please sign in to comment.