updates and fixes

* seo friendly urls
* custom client serve-static module
* database fixes
* fix recent pages
* other fixes
This commit is contained in:
Philipinho
2024-05-18 03:19:42 +01:00
parent eefe63d1cd
commit 9c7c2f1163
102 changed files with 921 additions and 536 deletions

View File

@ -52,7 +52,12 @@ export class CommentController {
throw new ForbiddenException();
}
return this.commentService.create(user.id, workspace.id, createCommentDto);
return this.commentService.create(
user.id,
page.id,
workspace.id,
createCommentDto,
);
}
@HttpCode(HttpStatus.OK)
@ -73,7 +78,7 @@ export class CommentController {
if (ability.cannot(SpaceCaslAction.Read, SpaceCaslSubject.Page)) {
throw new ForbiddenException();
}
return this.commentService.findByPageId(input.pageId, pagination);
return this.commentService.findByPageId(page.id, pagination);
}
@HttpCode(HttpStatus.OK)
@ -84,7 +89,6 @@ export class CommentController {
throw new NotFoundException('Comment not found');
}
// TODO: add spaceId to comment entity.
const page = await this.pageRepo.findById(comment.pageId);
if (!page) {
throw new NotFoundException('Page not found');
@ -104,6 +108,7 @@ export class CommentController {
return this.commentService.update(
updateCommentDto.commentId,
updateCommentDto,
user,
);
}
@ -111,6 +116,6 @@ export class CommentController {
@Post('delete')
remove(@Body() input: CommentIdDto, @AuthUser() user: User) {
// TODO: only comment creators and admins can delete their comments
return this.commentService.remove(input.commentId);
return this.commentService.remove(input.commentId, user);
}
}

View File

@ -1,12 +1,13 @@
import {
BadRequestException,
ForbiddenException,
Injectable,
NotFoundException,
} from '@nestjs/common';
import { CreateCommentDto } from './dto/create-comment.dto';
import { UpdateCommentDto } from './dto/update-comment.dto';
import { CommentRepo } from '@docmost/db/repos/comment/comment.repo';
import { Comment } from '@docmost/db/types/entity.types';
import { Comment, User } from '@docmost/db/types/entity.types';
import { PaginationOptions } from '@docmost/db/pagination/pagination-options';
import { PaginationResult } from '@docmost/db/pagination/pagination';
import { PageRepo } from '@docmost/db/repos/page/page.repo';
@ -30,24 +31,18 @@ export class CommentService {
async create(
userId: string,
pageId: string,
workspaceId: string,
createCommentDto: CreateCommentDto,
) {
const commentContent = JSON.parse(createCommentDto.content);
const page = await this.pageRepo.findById(createCommentDto.pageId);
// const spaceId = null; // todo, get from page
if (!page) {
throw new BadRequestException('Page not found');
}
if (createCommentDto.parentCommentId) {
const parentComment = await this.commentRepo.findById(
createCommentDto.parentCommentId,
);
if (!parentComment) {
if (!parentComment || parentComment.pageId !== pageId) {
throw new BadRequestException('Parent comment not found');
}
@ -57,10 +52,10 @@ export class CommentService {
}
const createdComment = await this.commentRepo.insertComment({
pageId: createCommentDto.pageId,
pageId: pageId,
content: commentContent,
selection: createCommentDto?.selection?.substring(0, 250),
type: 'inline', // for now
type: 'inline',
parentCommentId: createCommentDto?.parentCommentId,
creatorId: userId,
workspaceId: workspaceId,
@ -90,6 +85,7 @@ export class CommentService {
async update(
commentId: string,
updateCommentDto: UpdateCommentDto,
authUser: User,
): Promise<Comment> {
const commentContent = JSON.parse(updateCommentDto.content);
@ -98,6 +94,10 @@ export class CommentService {
throw new NotFoundException('Comment not found');
}
if (comment.creatorId !== authUser.id) {
throw new ForbiddenException('You can only edit your own comments');
}
const editedAt = new Date();
await this.commentRepo.updateComment(
@ -113,12 +113,17 @@ export class CommentService {
return comment;
}
async remove(commentId: string): Promise<void> {
async remove(commentId: string, authUser: User): Promise<void> {
const comment = await this.commentRepo.findById(commentId);
if (!comment) {
throw new NotFoundException('Comment not found');
}
if (comment.creatorId !== authUser.id) {
throw new ForbiddenException('You can only delete your own comments');
}
await this.commentRepo.deleteComment(commentId);
}
}

View File

@ -1,7 +1,7 @@
import { IsUUID } from 'class-validator';
import { IsString, IsUUID } from 'class-validator';
export class PageIdDto {
@IsUUID()
@IsString()
pageId: string;
}

View File

@ -1,7 +1,7 @@
import { IsJSON, IsOptional, IsString, IsUUID } from 'class-validator';
export class CreateCommentDto {
@IsUUID()
@IsString()
pageId: string;
@IsJSON()