Skip to content

Commit

Permalink
fix: ts lint not showing all error
Browse files Browse the repository at this point in the history
  • Loading branch information
nnh53 committed Nov 24, 2023
1 parent 75708b8 commit 153ddfa
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 128 deletions.
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
"dev": "npx nodemon --development",
"build": "rimraf ./dist && tsc && tsc-alias",
"start": "node dist/index.js --production",
"lint": "eslint .",
"check-types": "tsc --noemit",
"eslint": "eslint",
"lint": "npm run eslint && npm run check-types",
"lint:fix": "eslint . --fix",
"prettier": "prettier --check .",
"prettier:fix": "prettier --write ."
Expand Down
10 changes: 6 additions & 4 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@ import tweetsRouter from './routes/tweet.routes'
import cors from 'cors'
config()

const PORT = process.env.PORT_DEVELOPMENT
const PORT_BACKEND = process.env.PORT_DEVELOPMENT_BACKEND

const PORT_FRONTEND = process.env.PORT_DEVELOPMENT_FRONTEND

const app = express()
initFolder()

const corsOptions = {
origin: 'http://localhost:3000',
origin: `http://localhost:${PORT_FRONTEND}`,
credentials: true,
allowedHeaders: 'Content-Type,Authorization',
optionsSuccessStatus: 200
Expand Down Expand Up @@ -58,6 +60,6 @@ app.use('/tweets', tweetsRouter)
// Error handler tổng
app.use(defaultErrorHandler)

app.listen(PORT, () => {
console.log(`Project twitter này đang chạy trên port ${PORT}`)
app.listen(PORT_BACKEND, () => {
console.log(`Project twitter này đang chạy trên port ${PORT_BACKEND}`)
})
5 changes: 5 additions & 0 deletions src/middlewares/common.middlewares.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ import { pick } from 'lodash'
//FilterKeys là mảng các key của object T nào đó

type FilterKeys<T> = Array<keyof T>
/**
* Hàm này đã bị không dùng
* @param filterKey
* @returns
*/
// prettier-ignore
export const filterMiddleware = <T>(filterKey: FilterKeys<T>) => (req: Request, res: Response, next: NextFunction) => {
req.body = pick(req.body, filterKey)
Expand Down
220 changes: 109 additions & 111 deletions src/middlewares/tweets.middlewares.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { checkSchema } from 'express-validator'
import { Schema, checkSchema } from 'express-validator'
import { isEmpty } from 'lodash'
import { ObjectId } from 'mongodb'
import { MediaType, TweetAudience, TweetType } from '~/constants/enums'
Expand All @@ -8,125 +8,123 @@ import { validate } from '~/utils/validation'
const tweetTypes = numberEnumToArray(TweetType) //kq có dạng [0, 1, 2, 3]
const tweetAudiences = numberEnumToArray(TweetAudience) //kq có dạng [0, 1]
const mediaTypes = numberEnumToArray(MediaType) //kq có dạng [0, 1]
export const createTweetValidator = validate(
checkSchema(
{
type: {
notEmpty: {
errorMessage: TWEETS_MESSAGES.TYPE_MUST_BE_NOT_EMPTY
},
isIn: {
options: [tweetTypes], //doc bảo là phải truyền [[0,1,2,3]]
errorMessage: TWEETS_MESSAGES.INVALID_TYPE
}
},
audience: {
notEmpty: {
errorMessage: TWEETS_MESSAGES.AUDIENCE_MUST_BE_NOT_EMPTY
},
isIn: {
options: [tweetAudiences],
errorMessage: TWEETS_MESSAGES.INVALID_AUDIENCE
}
},
parent_id: {
custom: {
options: (parentId, { req }) => {
const type = req.body.type as TweetType

// nếu `type` là `tweet` thì `parent_id` phải là `null` - mình là người đăng bài thì ko đc có parent_id
if (type == TweetType.Tweet && parentId != null) {
throw new Error(TWEETS_MESSAGES.PARENT_ID_MUST_BE_NULL)
}

// nếu `type` là `retweet` , `comment` , `quotetweet` thì `parent_id` phải là `tweet_id` của tweet cha
if (type != TweetType.Tweet && !ObjectId.isValid(parentId)) {
throw new Error(TWEETS_MESSAGES.PARENT_ID_MUST_BE_A_VALID_TWEET_ID)
}
const createTweetValidatorSchema: Schema = {
type: {
notEmpty: {
errorMessage: TWEETS_MESSAGES.TYPE_MUST_BE_NOT_EMPTY
},
isIn: {
options: [tweetTypes], //doc bảo là phải truyền [[0,1,2,3]]
errorMessage: TWEETS_MESSAGES.INVALID_TYPE
}
},
audience: {
notEmpty: {
errorMessage: TWEETS_MESSAGES.AUDIENCE_MUST_BE_NOT_EMPTY
},
isIn: {
options: [tweetAudiences],
errorMessage: TWEETS_MESSAGES.INVALID_AUDIENCE
}
},
parent_id: {
custom: {
options: (parentId, { req }) => {
const type = req.body.type as TweetType

//oke thì trả về true
return true
}
// nếu `type` là `tweet` thì `parent_id` phải là `null` - mình là người đăng bài thì ko đc có parent_id
if (type == TweetType.Tweet && parentId != null) {
throw new Error(TWEETS_MESSAGES.PARENT_ID_MUST_BE_NULL)
}
},
content: {
isString: true,
custom: {
options: (value, { req }) => {
const type = req.body.type as TweetType
const mentions = req.body as string[] //không dùng destructuring vì không định nghĩa kiểu dữ liệu được
const hashtags = req.body as string[]

// nếu type KHÔNG PHẢI Retweet (tweet, quoteTweet) thì `content` hay hashtags hay mentions phải không đc rỗng
if (type != TweetType.Retweet && isEmpty(hashtags) && isEmpty(mentions) && value == '') {
throw new Error(TWEETS_MESSAGES.CONTENT_MUST_BE_A_NON_EMPTY_STRING)
}
// nếu `type` là `retweet` , `comment` , `quotetweet` thì `parent_id` phải là `tweet_id` của tweet cha
if (type != TweetType.Tweet && !ObjectId.isValid(parentId)) {
throw new Error(TWEETS_MESSAGES.PARENT_ID_MUST_BE_A_VALID_TWEET_ID)
}

// nếu `type` là `retweet` thì `content` phải là `''`
if (type == TweetType.Retweet && value != '') {
throw new Error(TWEETS_MESSAGES.CONTENT_MUST_BE_EMPTY_STRING)
}
//oke thì trả về true
return true
}
}
},
content: {
isString: true,
custom: {
options: (value, { req }) => {
const type = req.body.type as TweetType
const mentions = req.body as string[] //không dùng destructuring vì không định nghĩa kiểu dữ liệu được
const hashtags = req.body as string[]

// //nếu `type` là `retweet` , `comment` , `quotetweet` và không có mention hay hashtag thì `content` phải là string và không được rỗng
// if (
// [TweetType.Tweet, TweetType.Comment, TweetType.QuoteTweet].includes(type) &&
// isEmpty(mentions) &&
// isEmpty(hashtags) &&
// value.trim() == ''
// ) {
// //isEmpty() của lodash
// throw new Error(TWEETS_MESSAGES.CONTENT_MUST_BE_A_NON_EMPTY_STRING)
// }
// nếu type KHÔNG PHẢI Retweet (tweet, quoteTweet) thì `content` hay hashtags hay mentions phải không đc rỗng
if (type != TweetType.Retweet && isEmpty(hashtags) && isEmpty(mentions) && value == '') {
throw new Error(TWEETS_MESSAGES.CONTENT_MUST_BE_A_NON_EMPTY_STRING)
}

//oke thì trả về true
return true
}
// nếu `type` là `retweet` thì `content` phải là `''`
if (type == TweetType.Retweet && value != '') {
throw new Error(TWEETS_MESSAGES.CONTENT_MUST_BE_EMPTY_STRING)
}
},
hashtags: {
isArray: true,
custom: {
options: (value, { req }) => {
//yêu cầu mỗi phần tử trong array phải là string
if (value.some((item: any) => typeof item !== 'string')) {
throw new Error(TWEETS_MESSAGES.HASHTAGS_MUST_BE_AN_ARRAY_OF_STRING)
}
//oke thì trả về true
return true
}

// //nếu `type` là `retweet` , `comment` , `quotetweet` và không có mention hay hashtag thì `content` phải là string và không được rỗng
// if (
// [TweetType.Tweet, TweetType.Comment, TweetType.QuoteTweet].includes(type) &&
// isEmpty(mentions) &&
// isEmpty(hashtags) &&
// value.trim() == ''
// ) {
// //isEmpty() của lodash
// throw new Error(TWEETS_MESSAGES.CONTENT_MUST_BE_A_NON_EMPTY_STRING)
// }

//oke thì trả về true
return true
}
}
},
hashtags: {
isArray: true,
custom: {
options: (value, { req }) => {
//yêu cầu mỗi phần tử trong array phải là string
if (value.some((item: any) => typeof item !== 'string')) {
throw new Error(TWEETS_MESSAGES.HASHTAGS_MUST_BE_AN_ARRAY_OF_STRING)
}
},
mentions: {
isArray: true,
custom: {
options: (value, { req }) => {
//yêu cầu mỗi phần tử trong array phải là user_id
if (value.some((item: any) => !ObjectId.isValid(item))) {
throw new Error(TWEETS_MESSAGES.MENTIONS_MUST_BE_AN_ARRAY_OF_user_id)
}
//oke thì trả về true
return true
}
//oke thì trả về true
return true
}
}
},
mentions: {
isArray: true,
custom: {
options: (value, { req }) => {
//yêu cầu mỗi phần tử trong array phải là user_id
if (value.some((item: any) => !ObjectId.isValid(item))) {
throw new Error(TWEETS_MESSAGES.MENTIONS_MUST_BE_AN_ARRAY_OF_user_id)
}
},
medias: {
isArray: true,
custom: {
options: (value, { req }) => {
//yêu cầu mỗi phần tử trong array phải là Media Object
if (
value.some((item: any) => {
return typeof item.url !== 'string' || !mediaTypes.includes(item.type)
})
) {
throw new Error(TWEETS_MESSAGES.MEDIAS_MUST_BE_AN_ARRAY_OF_MEDIA_OBJECT)
}
//oke thì trả về true
return true
}
//oke thì trả về true
return true
}
}
},
medias: {
isArray: true,
custom: {
options: (value, { req }) => {
//yêu cầu mỗi phần tử trong array phải là Media Object
if (
value.some((item: any) => {
return typeof item.url !== 'string' || !mediaTypes.includes(item.type)
})
) {
throw new Error(TWEETS_MESSAGES.MEDIAS_MUST_BE_AN_ARRAY_OF_MEDIA_OBJECT)
}
//oke thì trả về true
return true
}
},
['body']
)
)
}
}
}

export const createTweetValidator = validate(createTweetValidatorSchema, ['body'])
10 changes: 0 additions & 10 deletions src/routes/users.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,16 +160,6 @@ usersRouter.patch(
'/me',
accessTokenValidator,
verifiedUserValidator,
filterMiddleware<IUpdateMeReqBody>([
'name',
'date_of_birth',
'bio',
'location',
'website',
'avatar',
'username',
'cover_photo'
]),
updateMeValidator,
wrapAsync(updateMeController)
)
Expand Down
4 changes: 2 additions & 2 deletions src/services/medias.services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class MediasService {
return {
url: isProduction
? `${process.env.HOST}/static/image/${newFilename}`
: `http://localhost:${process.env.PORT_DEVELOPMENT}/static/image/${newFilename}`,
: `http://localhost:${process.env.PORT_DEVELOPMENT_BACKEND}/static/image/${newFilename}`,
type: MediaType.Image
}
})
Expand All @@ -47,7 +47,7 @@ class MediasService {
return {
url: isProduction
? `${process.env.HOST}/static/video/${newFilename}`
: `http://localhost:${process.env.PORT_DEVELOPMENT}/static/video-stream/${newFilename}`,
: `http://localhost:${process.env.PORT_DEVELOPMENT_BACKEND}/static/video-stream/${newFilename}`,
type: MediaType.Video
}
})
Expand Down

0 comments on commit 153ddfa

Please sign in to comment.