Compare commits
2 Commits
5684e19582
...
3e1a2f6b5b
| Author | SHA1 | Date |
|---|---|---|
|
|
3e1a2f6b5b | |
|
|
f01baf4c2e |
|
|
@ -10,17 +10,25 @@ const Avatar = ({ user }: any) => {
|
||||||
const [firstLoad, setFirstLoad] = useState(true);
|
const [firstLoad, setFirstLoad] = useState(true);
|
||||||
|
|
||||||
if (firstLoad) {
|
if (firstLoad) {
|
||||||
fetch(gravatarUrl).then((response) => {
|
fetch(gravatarUrl)
|
||||||
if (response.status === 200) {
|
.then((response) => {
|
||||||
setAvatar(gravatarUrl);
|
if (response.ok) {
|
||||||
}
|
setAvatar(gravatarUrl);
|
||||||
setFirstLoad(false);
|
}
|
||||||
});
|
setFirstLoad(false);
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
setFirstLoad(false);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="avatar shrink-0">
|
<div className="avatar shrink-0">
|
||||||
<Image src={avatar} alt="avatar" className="rounded-full w-12 h-12 md:w-16 md:h-16 transition-all cursor-pointer" />
|
<Image
|
||||||
|
src={avatar}
|
||||||
|
alt="avatar"
|
||||||
|
className="rounded-full w-12 h-12 md:w-16 md:h-16 transition-all cursor-pointer"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -40,14 +40,17 @@ const Message = ({ message }: any) => {
|
||||||
</div>
|
</div>
|
||||||
<Text text={message.content} />
|
<Text text={message.content} />
|
||||||
{message.image && <Image src={message.image} alt="image" className="w-fit rounded-lg cursor-pointer" />}
|
{message.image && <Image src={message.image} alt="image" className="w-fit rounded-lg cursor-pointer" />}
|
||||||
<div className="text-grey-light date">
|
<div className="flex justify-between">
|
||||||
{new Date(message.createdAt).toLocaleDateString(undefined, {
|
<div className="text-grey-light date">
|
||||||
year: 'numeric',
|
{new Date(message.createdAt).toLocaleDateString(undefined, {
|
||||||
month: 'long',
|
year: 'numeric',
|
||||||
day: 'numeric',
|
month: 'long',
|
||||||
hour: 'numeric',
|
day: 'numeric',
|
||||||
minute: 'numeric',
|
hour: 'numeric',
|
||||||
})}
|
minute: 'numeric',
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
{message.edited && <div className="text-grey-light italic">Modifié</div>}
|
||||||
</div>
|
</div>
|
||||||
{me.data?.id === message.author.id ? null : (
|
{me.data?.id === message.author.id ? null : (
|
||||||
<Like
|
<Like
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ model Post {
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
likes Int @default(0)
|
likes Int @default(0)
|
||||||
likedBy Like[]
|
likedBy Like[]
|
||||||
|
edited Boolean @default(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
model Like {
|
model Like {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import multer from 'multer';
|
import multer from 'multer';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
import {v4 as uuidv4} from 'uuid';
|
import {v4 as uuidv4} from 'uuid';
|
||||||
|
import fs from 'fs';
|
||||||
|
|
||||||
const storage = multer.diskStorage({
|
const storage = multer.diskStorage({
|
||||||
destination: path.join(__dirname, '../../public/uploads'),
|
destination: path.join(__dirname, '../../public/uploads'),
|
||||||
|
|
@ -10,3 +11,12 @@ const storage = multer.diskStorage({
|
||||||
});
|
});
|
||||||
|
|
||||||
export const upload = multer({ storage });
|
export const upload = multer({ storage });
|
||||||
|
|
||||||
|
export const deleteFile = (filename: string) => {
|
||||||
|
const filePath = path.join(__dirname, '../../public/uploads', filename);
|
||||||
|
fs.unlink(filePath, (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.log(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,7 @@ import { PrismaClient, Post as PrismaPost, Like } from '@prisma/client';
|
||||||
import { Post } from '@/models/PostModel';
|
import { Post } from '@/models/PostModel';
|
||||||
import { exclude } from '@/lib/utils';
|
import { exclude } from '@/lib/utils';
|
||||||
import { getUserById } from './UserController';
|
import { getUserById } from './UserController';
|
||||||
|
import { deleteFile } from './FileController';
|
||||||
|
|
||||||
const prisma = new PrismaClient();
|
const prisma = new PrismaClient();
|
||||||
|
|
||||||
|
|
@ -66,6 +67,7 @@ const editPost = async (post: Post): Promise<PrismaPost | null | Error> => {
|
||||||
data: {
|
data: {
|
||||||
content: post.content,
|
content: post.content,
|
||||||
image: post.image,
|
image: post.image,
|
||||||
|
edited: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -94,6 +96,9 @@ const deletePost = async (id: number, userId: number): Promise<PrismaPost | Erro
|
||||||
if (post.authorId !== userId && user.role === 'USER') {
|
if (post.authorId !== userId && user.role === 'USER') {
|
||||||
return new Error('User is not the author of this post');
|
return new Error('User is not the author of this post');
|
||||||
}
|
}
|
||||||
|
if (post.image) {
|
||||||
|
deleteFile(post.image);
|
||||||
|
}
|
||||||
return prisma.post.delete({
|
return prisma.post.delete({
|
||||||
where: {
|
where: {
|
||||||
id,
|
id,
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ interface Post {
|
||||||
authorId: number;
|
authorId: number;
|
||||||
likes?: number | undefined;
|
likes?: number | undefined;
|
||||||
likedBy?: Like[] | undefined;
|
likedBy?: Like[] | undefined;
|
||||||
|
edited?: boolean | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Post: z.ZodType<Post> = z.object({
|
const Post: z.ZodType<Post> = z.object({
|
||||||
|
|
@ -17,6 +18,7 @@ const Post: z.ZodType<Post> = z.object({
|
||||||
authorId: z.number(),
|
authorId: z.number(),
|
||||||
likes: z.number().optional(),
|
likes: z.number().optional(),
|
||||||
likedBy: z.array(Like).optional(),
|
likedBy: z.array(Like).optional(),
|
||||||
|
edited: z.boolean().optional(),
|
||||||
});
|
});
|
||||||
|
|
||||||
export { Post };
|
export { Post };
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue