include author in posts and exclude password with typesafe function

This commit is contained in:
Guillaume Dorce 2022-08-25 15:06:33 +02:00
parent 5dd34edbe1
commit f66befd0c7
4 changed files with 27 additions and 9 deletions

View File

@ -1,10 +1,10 @@
import postsRoute from './posts'; import getPosts from './posts';
import createPost from './new'; import postPost from './new';
import { Router } from 'express'; import { Router } from 'express';
const posts = Router(); const posts = Router();
posts.get('/', postsRoute); posts.get('/', getPosts);
posts.post('/new', createPost); posts.post('/new', postPost);
export default posts; export default posts;

View File

@ -5,6 +5,7 @@ import { Request, Response } from 'express';
export default async (req: Request, res: Response) => { export default async (req: Request, res: Response) => {
try { try {
req.body.authorId = 1; // hardcoded for now, use userId from token
const post: Post = Post.parse(req.body); const post: Post = Post.parse(req.body);
const newPost: PrismaPost = await createPost(post); const newPost: PrismaPost = await createPost(post);

View File

@ -6,8 +6,8 @@ const posts = Router();
posts.get('/', async (req, res) => { posts.get('/', async (req, res) => {
try { try {
const postList: Post[] = await getAllPosts(); const postsList: Post[] = await getAllPosts();
return res.status(200).send(postList); return res.status(200).send(postsList);
} catch (error) { } catch (error) {
res.status(500).send(error); res.status(500).send(error);
} }

View File

@ -1,11 +1,28 @@
import { PrismaClient } from '@prisma/client'; import { PrismaClient, Post as PrismaPost } from '@prisma/client';
import { Post } from '@/models/PostModel'; import { Post } from '@/models/PostModel';
const prisma = new PrismaClient(); const prisma = new PrismaClient();
const getAllPosts = () => prisma.post.findMany(); function exclude<User, Key extends keyof User>(user: User, ...keys: Key[]): User {
for (let key of keys) {
delete user[key];
}
return user;
}
const createPost = async (post: Post) => { const getAllPosts = async (): Promise<PrismaPost[]> => {
const posts = prisma.post.findMany({
include: {
author: true,
},
});
return (await posts).map((post) => {
post.author = exclude(post.author, 'password');
return post;
});
};
const createPost = async (post: Post): Promise<PrismaPost> => {
const newPost = await prisma.post.create({ const newPost = await prisma.post.create({
data: { data: {
title: post.title, title: post.title,