Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
16617a8
requried token to create joke
KegenGuyll Apr 11, 2021
11564da
required token to delete joke
KegenGuyll Apr 11, 2021
3d8d5cc
created like joke controller
KegenGuyll Apr 11, 2021
9baccfc
updated to user sessionToken util
KegenGuyll Apr 11, 2021
db1d0d8
added type models
KegenGuyll Apr 11, 2021
c0fa4da
added missing id param from delete route
KegenGuyll Apr 11, 2021
bf0d30b
added get and post like routes
KegenGuyll Apr 11, 2021
690def9
added new fields to joke
KegenGuyll Apr 11, 2021
f4eb496
deletes joke from user list
KegenGuyll Apr 11, 2021
7b604aa
updated type
KegenGuyll Apr 11, 2021
3a3f524
only returns approved jokes
KegenGuyll Apr 11, 2021
037d1f3
created authUser service
KegenGuyll Apr 11, 2021
b7837b1
Created like joke service
KegenGuyll Apr 11, 2021
562e026
created session token util
KegenGuyll Apr 11, 2021
72669a6
created oID util
KegenGuyll Apr 11, 2021
cde1ae6
upatded client uri
KegenGuyll Apr 13, 2021
07465ac
created page pagination for jokes
KegenGuyll Apr 13, 2021
bb799be
added bio
KegenGuyll Apr 13, 2021
b98e08d
added new routes
KegenGuyll Apr 13, 2021
6800866
created publicUser
KegenGuyll Apr 13, 2021
d5610eb
updated createJoke to include likes
KegenGuyll Apr 13, 2021
3abae1c
added type endpoint
KegenGuyll May 7, 2021
fc3ce6a
added error handling
KegenGuyll May 7, 2021
82421c7
created createType endpoint
KegenGuyll May 7, 2021
3458314
created countType endpoint
KegenGuyll May 7, 2021
0d7113f
created GetType endpoint
KegenGuyll May 7, 2021
b305ee8
created UpdateType endpoint
KegenGuyll May 7, 2021
3003fb8
created GetUserLikes endpoint
KegenGuyll May 7, 2021
4af7e55
created getUserPost endpoint
KegenGuyll May 7, 2021
36a27d6
created unlikeJoke endpoint
KegenGuyll May 7, 2021
9d30ffe
created updateUser endpoint
KegenGuyll May 7, 2021
a7a091b
added update type count
KegenGuyll May 7, 2021
2c80bad
created type model
KegenGuyll May 7, 2021
bc4bfc8
added new routes
KegenGuyll May 7, 2021
88aa4b2
added remove type count
KegenGuyll May 7, 2021
15db373
created DeleteType service
KegenGuyll May 7, 2021
691f043
updated createUser requirments
KegenGuyll May 7, 2021
1ffd0f6
updated LikeJoke service
KegenGuyll May 7, 2021
2eeafd3
added imagekit
KegenGuyll May 7, 2021
a04d357
imageKit initialization
KegenGuyll May 7, 2021
b4afde3
added sharp
KegenGuyll May 8, 2021
2b66394
added file size limit
KegenGuyll May 8, 2021
2557b30
changed back dotenv
KegenGuyll May 8, 2021
337f849
created createUserProfileImage
KegenGuyll May 8, 2021
5e4f90b
added new image route
KegenGuyll May 8, 2021
ef8af3c
updated user account
KegenGuyll May 8, 2021
2634ad2
created imageupload service
KegenGuyll May 8, 2021
4db5886
updated return
KegenGuyll May 8, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,29 @@
"body-parser": "^1.19.0",
"cors": "^2.8.5",
"coveralls": "^3.1.0",
"data-uri-to-buffer": "^3.0.1",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-fileupload": "^1.2.1",
"graphql": "^15.4.0",
"helmet": "^4.1.1",
"husky": "^4.3.0",
"imagekit": "^3.1.2",
"jest": "^26.5.2",
"jsonwebtoken": "^8.5.1",
"mongodb": "^3.6.2",
"morgan": "^1.10.0",
"prettier": "^2.1.2",
"sharp": "^0.28.1",
"ts-jest": "^26.4.1",
"tslint": "^6.1.3",
"tslint-config-airbnb": "^5.11.2"
},
"devDependencies": {
"@types/express-fileupload": "^1.1.6",
"@types/imagekit": "^3.1.1",
"@types/node": "^14.14.19",
"@types/sharp": "^0.28.0",
"nodemon": "^2.0.6",
"ts-node": "^9.1.1",
"typescript": "^4.1.3"
Expand Down
14 changes: 12 additions & 2 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import { userRouter } from './routes/user';
import { ApolloServer } from 'apollo-server-express';
import { typeDefs } from './typeDefs';
import { resolvers } from './resolvers';
import { typeRouter } from './routes/type';
import fileUpload from 'express-fileupload';

class App {
server = new ApolloServer({ typeDefs, resolvers });
Expand All @@ -22,9 +24,16 @@ class App {

private config(): void {
this.app.use(bodyParser.urlencoded({ extended: false }));
this.app.use(bodyParser.json());
this.app.use(bodyParser.json({ limit: '150mb', type: 'application/json' }));
this.app.use(cors());
this.app.use(helmet({ contentSecurityPolicy: process.env.NODE_ENV === 'production' ? undefined : false }));
this.app.use(
helmet({ contentSecurityPolicy: process.env.NODE_ENV === 'production' ? undefined : false }),
);
this.app.use(
fileUpload({
createParentPath: true,
}),
);
this.app.use(morgan('combined'));
const app = this.app;
this.server.applyMiddleware({ app });
Expand All @@ -40,6 +49,7 @@ class App {
this.app.use('/api/joke', jokeRouter);
this.app.use('/api/jokes', jokeRouter);
this.app.use('/api/user', userRouter);
this.app.use('/api/type', typeRouter);
}
}

Expand Down
10 changes: 8 additions & 2 deletions src/controllers/joke/CreateJoke.controller.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
import { Request, Response } from 'express';
import { createJokeService } from '../../services/joke/CreateJoke.service';
import sessionToken from '../../util/getSessionToken';

export const createJokeController = async (req: Request, res: Response) => {
try {
const createdJoke = await createJokeService(req.body);
res.send(createdJoke);
const createdJoke = await createJokeService(sessionToken(req), req.body);

if (createdJoke.success) {
res.send(createdJoke);
} else {
res.status(400).send(createdJoke);
}
} catch (err) {
res.status(500).send(err);
}
Expand Down
3 changes: 2 additions & 1 deletion src/controllers/joke/DeleteJoke.controller.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { Request, Response } from 'express';
import { deleteJokeService } from '../../services/joke/DeleteJoke.service';
import sessionToken from '../../util/getSessionToken';

export const deleteJokeController = async (req: Request, res: Response) => {
try {
const removedJoke = await deleteJokeService(req.params.id);
const removedJoke = await deleteJokeService(sessionToken(req), req.params.id);
res.send(removedJoke);
} catch (err) {
res.status(500).send(err);
Expand Down
18 changes: 18 additions & 0 deletions src/controllers/joke/JokePagination.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Request, Response } from 'express';
import { jokePaginationService } from '../../services/joke/JokePagination.service';

export const JokePaginationController = async (req: Request, res: Response) => {
const skip = req.query.skip as string;
const limit = req.query.limit as string;

if (isNaN(Number(skip)) && isNaN(Number(limit))) throw new Error('non vaild numbers');

try {
const jokes = await jokePaginationService(Number(skip), Number(limit));

res.send(jokes);
} catch (err) {
console.error(err);
res.status(500).send(err);
}
};
13 changes: 13 additions & 0 deletions src/controllers/type/CountType.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Request, Response } from 'express';
import { countTypeService } from '../../services/type/CountType.service';

export const countTypeController = async (req: Request, res: Response) => {
const type = req.params.type;
try {
const typeCount = await countTypeService(type);
res.send(typeCount);
} catch (err) {
console.log(err);
res.status(500).send(err);
}
};
18 changes: 18 additions & 0 deletions src/controllers/type/CreateType.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Request, Response } from 'express';
import { createTypeService } from '../../services/type/CreateType.service';
import sessionToken from '../../util/getSessionToken';

export const createTypeController = async (req: Request, res: Response) => {
try {
const postedType = await createTypeService(sessionToken(req), req.body);

if (postedType.success) {
res.send(postedType);
} else {
res.status(400).send(postedType);
}
} catch (err) {
console.log(err);
res.status(500).send(err);
}
};
12 changes: 12 additions & 0 deletions src/controllers/type/GetType.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { Request, Response } from 'express';
import { getTypeService } from '../../services/type/GetType.serivce';

export const getTypeController = async (req: Request, res: Response) => {
try {
const types = await getTypeService();
res.send(types);
} catch (err) {
console.log(err);
res.status(500).send(err);
}
};
14 changes: 14 additions & 0 deletions src/controllers/type/UpdateType.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Request, Response } from 'express';
import { updateTypeService } from '../../services/type/UpdateType.service';

export const updateTypeController = async (req: Request, res: Response) => {
const id = req.params.id;
const num = req.body.countNumber;
try {
const updatedType = await updateTypeService(id, num);
res.send(updatedType);
} catch (err) {
console.log(err);
res.status(500).send(err);
}
};
21 changes: 21 additions & 0 deletions src/controllers/user/CreateUserProfileImage.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { Request, Response } from 'express';
import { CreateUserProfileImageService } from '../../services/user/CreateUserProfileImage.service';
import sessionToken from '../../util/getSessionToken';

export const createUserProfileImageController = async (req: Request, res: Response) => {
try {
if (!req.body.file) {
throw new Error('No file uploaded');
}

const file = req.body.file;
const fileName = req.params.fileName;

const profileImage = await CreateUserProfileImageService(sessionToken(req), file, fileName);

res.send(profileImage);
} catch (err) {
console.log(err);
res.status(500).send(err.message || err);
}
};
17 changes: 17 additions & 0 deletions src/controllers/user/GetUserLikes.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Request, Response } from 'express';
import { getUserLikesService } from '../../services/user/GetUserLikes.service';

export const getUserLikesController = async (req: Request, res: Response) => {
const userId = req.params.userId;
try {
const userLikes = await getUserLikesService(userId);

if (!userLikes.success) {
res.status(500).send(userLikes);
}

res.send(userLikes);
} catch (err) {
res.status(500).send(err);
}
};
17 changes: 17 additions & 0 deletions src/controllers/user/GetUserPosts.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Request, Response } from 'express';
import { getUserPostService } from '../../services/user/GetUserPosts.service';

export const getUserPostController = async (req: Request, res: Response) => {
const userId = req.params.userId;
try {
const userPosts = await getUserPostService(userId);

if (!userPosts.success) {
res.status(500).send(userPosts);
}

res.send(userPosts);
} catch (err) {
res.status(500).send(err);
}
};
32 changes: 32 additions & 0 deletions src/controllers/user/LikeJoke.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { Request, Response } from 'express';
import { authUser } from '../../services/user/authUser.service';
import { LikeJokeService } from '../../services/user/LikeJoke.service';
import sessionToken from '../../util/getSessionToken';

export const CreateLikeJokeController = async (req: Request, res: Response) => {
try {
const jokeId = req.params.jokeId as string;

const likeJokeResult = await LikeJokeService(sessionToken(req), jokeId);

if (likeJokeResult?.success === false) {
return res.status(500).send(likeJokeResult);
}

res.send(likeJokeResult);
} catch (err) {
res.status(500).send(err);
}
};

export const ListLikeJokeController = async (req: Request, res: Response) => {
try {
const likeJokeResult = await authUser(sessionToken(req));

if (likeJokeResult instanceof Error) throw likeJokeResult;

res.send(likeJokeResult.likes);
} catch (err) {
res.status(500).send(err);
}
};
5 changes: 2 additions & 3 deletions src/controllers/user/ProfileUser.controller.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import { Request, Response } from 'express';
import { profileUserService } from '../../services/user/ProfileUser.service';
import sessionToken from '../../util/getSessionToken';

export const profileUserController = async (req: Request, res: Response) => {
try {
const sessionToken = req.headers.authorization?.split(' ')[1];

const userProfile = await profileUserService(sessionToken);
const userProfile = await profileUserService(sessionToken(req));
res.send(userProfile);
} catch (err) {
res.status(500).send(err);
Expand Down
11 changes: 11 additions & 0 deletions src/controllers/user/PublicUser.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Request, Response } from 'express';
import { publicUserService } from '../../services/user/PublicUser.service';

export const publicUserController = async (req: Request, res: Response) => {
try {
const userProfile = await publicUserService(req.params.id);
res.send(userProfile);
} catch (err) {
res.status(500).send(err);
}
};
19 changes: 19 additions & 0 deletions src/controllers/user/UnlikeJoke.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Request, Response } from 'express';
import { UnlikeJokeService } from '../../services/user/UnlikeJoke.service';
import sessionToken from '../../util/getSessionToken';

export const UnlikeJokeController = async (req: Request, res: Response) => {
try {
const jokeId = req.params.jokeId as string;

const unlikeJokeResult = await UnlikeJokeService(sessionToken(req), jokeId);

if (unlikeJokeResult?.success === false) {
return res.status(500).send(unlikeJokeResult);
}

res.send(unlikeJokeResult);
} catch (err) {
res.status(500).send(err);
}
};
18 changes: 18 additions & 0 deletions src/controllers/user/UpdateUser.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Request, Response } from 'express';
import { UpdateUserService } from '../../services/user/UpdateUser.service';
import sessionToken from '../../util/getSessionToken';

export const updateUserController = async (req: Request, res: Response) => {
const updates = req.body;
try {
const updatedUser = await UpdateUserService(sessionToken(req), updates);

if (!updatedUser.success) {
res.status(500).send(updatedUser);
}

res.send(updatedUser);
} catch (err) {
res.status(500).send(err);
}
};
20 changes: 18 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,34 @@
require('dotenv').config();
import mongodb from 'mongodb';
import ImageKit from 'imagekit';

const port = process.env.PORT || 8080;
const user = process.env.DB_USER;
const password = process.env.DB_PASS;
const host = process.env.DB_HOST;

const publicKey = process.env.IMAGEKIT_PUBLIC_KEY as string;
const privateKey = process.env.IMAGEKIT_PRIVATE_KEY as string;
const urlEndpoint = process.env.IMAGEKIT_URLENDPOINT as string;

const MongoClient = mongodb.MongoClient;
const uri = `mongodb+srv://${user}:${password}@${host}`;
export const mongoService = new MongoClient(uri, { useNewUrlParser: true });
//const uri = `mongodb://localhost:27017`;

export const imagekit = new ImageKit({
publicKey,
privateKey,
urlEndpoint,
});

export const mongoService = new MongoClient(uri, {
useNewUrlParser: true,
useUnifiedTopology: true,
});

const retryConnection = () => {
mongoService.connect().catch((e) => {
console.error(e);
retryConnection();
});
};

Expand Down
23 changes: 23 additions & 0 deletions src/models/joke.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { ObjectID } from 'mongodb';
import { UserLikeInformation } from './user';

type Joke = {
_id: string;
type: string;
punchLine: string;
likes: Array<UserLikeInformation>;
author: {
name: string;
id: ObjectID;
};
date: string;
approved: boolean;
};

type CreateJokeBody = {
type: string;
setup: string;
punchline: string;
};

export { Joke, CreateJokeBody };
Loading