mirror of
https://github.com/hknsh/project-knedita.git
synced 2024-11-28 17:41:15 +00:00
Created new tests, added SWC for faster compiling.
This commit is contained in:
parent
4b301eb985
commit
b21a832c13
20 changed files with 9848 additions and 996 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -6,3 +6,4 @@ prisma/*.db
|
||||||
prisma/migrations/dev
|
prisma/migrations/dev
|
||||||
client
|
client
|
||||||
dist
|
dist
|
||||||
|
pnpm-lock.yaml
|
21
.swcrc
Normal file
21
.swcrc
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"jsc": {
|
||||||
|
"parser": {
|
||||||
|
"syntax": "typescript",
|
||||||
|
"tsx": false,
|
||||||
|
"decorators": true,
|
||||||
|
"dynamicImport": true
|
||||||
|
},
|
||||||
|
"target": "es2020",
|
||||||
|
"baseUrl": "./"
|
||||||
|
},
|
||||||
|
"exclude": [
|
||||||
|
"tests/",
|
||||||
|
"@types/",
|
||||||
|
"interfaces/"
|
||||||
|
],
|
||||||
|
"module": {
|
||||||
|
"type": "commonjs"
|
||||||
|
},
|
||||||
|
"minify": true
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
FROM node:16 as builder
|
FROM node:18 as builder
|
||||||
|
|
||||||
# Create app dir
|
# Create app dir
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
@ -6,7 +6,7 @@ WORKDIR /app
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
COPY prisma ./prisma/
|
COPY prisma ./prisma/
|
||||||
|
|
||||||
RUN npm install pm2 -g
|
RUN npm install -D @swc/cli @swc/core
|
||||||
RUN npm install
|
RUN npm install
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
@ -14,10 +14,12 @@ COPY . .
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
# Stage 2
|
# Stage 2
|
||||||
FROM node:16
|
FROM node:18
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN npm i pm2 -g
|
||||||
|
|
||||||
COPY --from=builder /app/package*.json ./
|
COPY --from=builder /app/package*.json ./
|
||||||
COPY --from=builder /app/prisma ./prisma/
|
COPY --from=builder /app/prisma ./prisma/
|
||||||
COPY --from=builder /app/dist ./dist/
|
COPY --from=builder /app/dist ./dist/
|
||||||
|
|
18
README.md
18
README.md
|
@ -1 +1,19 @@
|
||||||
|
|
||||||
# Social Media - Unnamed
|
# Social Media - Unnamed
|
||||||
|
|
||||||
|
A simple social media created with React Native and Express.
|
||||||
|
|
||||||
|
## To-do - Backend
|
||||||
|
- Create/update/delete Posts
|
||||||
|
- Password recuperation
|
||||||
|
- Two step verification
|
||||||
|
- Able to choose a profile picture
|
||||||
|
- Following/unfollowing features
|
||||||
|
- Like posts
|
||||||
|
- Probably pinned posts
|
||||||
|
- Authentication ✅
|
||||||
|
- Add more verification (like, if the password is too short)
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](https://choosealicense.com/licenses/mit/)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
/** @type {import('ts-jest').JestConfigWithTsJest} */
|
/** @type {import('ts-jest').JestConfigWithTsJest} */
|
||||||
module.exports = {
|
module.exports = {
|
||||||
preset: 'ts-jest',
|
preset: 'ts-jest',
|
||||||
testEnvironment: 'node'
|
testEnvironment: 'node',
|
||||||
|
transform: {
|
||||||
|
'^.+\\.(t|j)sx?$': '@swc/jest'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
10599
package-lock.json
generated
10599
package-lock.json
generated
File diff suppressed because it is too large
Load diff
11
package.json
11
package.json
|
@ -3,7 +3,7 @@
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"description": "A social media",
|
"description": "A social media",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc --build",
|
"build": "swc src -d dist",
|
||||||
"dev:start": "ts-node-dev --transpile-only --respawn src/server.ts",
|
"dev:start": "ts-node-dev --transpile-only --respawn src/server.ts",
|
||||||
"docker": "docker compose up -d",
|
"docker": "docker compose up -d",
|
||||||
"docker:build": "docker build -t api . && docker compose up -d",
|
"docker:build": "docker build -t api . && docker compose up -d",
|
||||||
|
@ -15,13 +15,9 @@
|
||||||
"prisma:generate": "npx prisma generate",
|
"prisma:generate": "npx prisma generate",
|
||||||
"prisma:seed": "prisma db seed",
|
"prisma:seed": "prisma db seed",
|
||||||
"prisma:studio": "npx prisma studio",
|
"prisma:studio": "npx prisma studio",
|
||||||
"prod:start": "nodemon dist/src/server.js",
|
"prod:start": "pm2-runtime start dist/server.js",
|
||||||
"test": "jest"
|
"test": "jest"
|
||||||
},
|
},
|
||||||
"aliases": {
|
|
||||||
"@services": "./src/services",
|
|
||||||
"@db": "./prisma"
|
|
||||||
},
|
|
||||||
"ts-standard": {
|
"ts-standard": {
|
||||||
"project": "tsconfig.json",
|
"project": "tsconfig.json",
|
||||||
"ignore": [
|
"ignore": [
|
||||||
|
@ -32,6 +28,9 @@
|
||||||
"author": "Cookie",
|
"author": "Cookie",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@swc/cli": "^0.1.62",
|
||||||
|
"@swc/core": "^1.3.66",
|
||||||
|
"@swc/jest": "^0.2.26",
|
||||||
"@types/bcrypt": "^5.0.0",
|
"@types/bcrypt": "^5.0.0",
|
||||||
"@types/compression": "^1.7.2",
|
"@types/compression": "^1.7.2",
|
||||||
"@types/dotenv": "^8.2.0",
|
"@types/dotenv": "^8.2.0",
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
FROM node:14
|
|
||||||
RUN openssl version -v
|
|
||||||
RUN uname -a
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
RUN npm install -g prisma --unsafe-perm
|
|
||||||
|
|
||||||
ADD . ./prisma/
|
|
||||||
|
|
||||||
CMD ["prisma", "migrate", "up"]
|
|
|
@ -1,28 +0,0 @@
|
||||||
import { PrismaClient } from '@prisma/client'
|
|
||||||
|
|
||||||
const prisma = new PrismaClient()
|
|
||||||
|
|
||||||
async function main () {
|
|
||||||
await prisma.user.deleteMany({
|
|
||||||
where: {
|
|
||||||
username: 'cookie_'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
console.log('Seeding database...')
|
|
||||||
|
|
||||||
await prisma.user.create({
|
|
||||||
data: {
|
|
||||||
displayName: 'Cookie_',
|
|
||||||
username: 'cookie_',
|
|
||||||
email: 'cookie@cookie.com',
|
|
||||||
password: '$2a$10$vBx5LkpZNMC3j1bHopUcp.ZcsMt5xfWlUJJGYIb4511aNccnHmMqi' // cookie
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
main()
|
|
||||||
.catch((e) => console.error(e))
|
|
||||||
.finally(async () => {
|
|
||||||
await prisma.$disconnect()
|
|
||||||
})
|
|
|
@ -1,7 +1,5 @@
|
||||||
import { PrismaClient } from '@prisma/client'
|
import { PrismaClient } from '@prisma/client'
|
||||||
|
|
||||||
// Cria uma instância do cliente Prisma
|
|
||||||
const prisma = new PrismaClient()
|
const prisma = new PrismaClient()
|
||||||
|
|
||||||
// Exporta o cliente Prisma para ser usado em outros módulos
|
|
||||||
export default prisma
|
export default prisma
|
|
@ -1,5 +1,5 @@
|
||||||
import { verify } from 'jsonwebtoken'
|
import { verify } from 'jsonwebtoken'
|
||||||
import prisma from '../../prisma/client'
|
import prisma from '../db'
|
||||||
import { Response, Request, NextFunction } from 'express'
|
import { Response, Request, NextFunction } from 'express'
|
||||||
import jwtPayload from '../interfaces/jwt'
|
import jwtPayload from '../interfaces/jwt'
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import prisma from '../../../prisma/client'
|
import prisma from '../../db'
|
||||||
|
|
||||||
async function createPostService (content: string, authorId: string) {
|
async function createPostService (content: string, authorId: string): Promise<Object | Error> {
|
||||||
const user = await prisma.user.findFirst({ where: { id: authorId } })
|
const user = await prisma.user.findFirst({ where: { id: authorId } })
|
||||||
|
|
||||||
if (user == null) {
|
if (user === null) {
|
||||||
return new Error('This user doesn\'t exists')
|
return new Error('This user doesn\'t exists')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import * as bcrypt from 'bcrypt'
|
import * as bcrypt from 'bcrypt'
|
||||||
import jsonwebtoken from 'jsonwebtoken'
|
import jsonwebtoken from 'jsonwebtoken'
|
||||||
import prisma from '../../../prisma/client'
|
import prisma from '../../db'
|
||||||
|
|
||||||
async function userAuthService (email: string, password: string): Promise<Object | Error> {
|
async function userAuthService (email: string, password: string): Promise<Object | Error> {
|
||||||
const user = await prisma.user.findFirst({
|
const user = await prisma.user.findFirst({
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import prisma from '../../../prisma/client'
|
import prisma from '../../db'
|
||||||
|
|
||||||
async function userInfoService (id: string): Promise<Object> {
|
async function userInfoService (id: string): Promise<Object> {
|
||||||
const user = await prisma.user.findFirst({
|
const user = await prisma.user.findFirst({
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import * as bcrypt from 'bcrypt'
|
import * as bcrypt from 'bcrypt'
|
||||||
import validator from 'validator'
|
import validator from 'validator'
|
||||||
import prisma from '../../../prisma/client'
|
import prisma from '../../db'
|
||||||
|
|
||||||
async function userSignupService (username: string, email: string, password: string): Promise<Object | Error> {
|
async function userSignupService (username: string, email: string, password: string): Promise<Object | Error> {
|
||||||
if (username === undefined || email === undefined || password === undefined) {
|
if (username === undefined || email === undefined || password === undefined) {
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
import prisma from '../../db'
|
||||||
|
import app from '../../app'
|
||||||
|
import request from 'supertest'
|
||||||
|
|
||||||
|
let token = ''
|
||||||
|
|
||||||
|
describe('POST /post/create', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
await request(app).post('/user/create').send({
|
||||||
|
username: 'dummmyuser7',
|
||||||
|
email: 'random1@email.com',
|
||||||
|
password: 'pass'
|
||||||
|
})
|
||||||
|
|
||||||
|
const response = await request(app).post('/user/auth').send({
|
||||||
|
email: 'random1@email.com',
|
||||||
|
password: 'pass'
|
||||||
|
}).expect(200)
|
||||||
|
|
||||||
|
token = response.body.token
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await prisma.post.deleteMany({
|
||||||
|
where: {
|
||||||
|
content: '4764ba063310b6f8bab31e8348b2188a'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
await prisma.user.deleteMany({
|
||||||
|
where: {
|
||||||
|
username: 'dummmyuser7'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
await prisma.$disconnect()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should respond with 200 status code if the user send the token and the content', async () => {
|
||||||
|
const response = await request(app).post('/post/create').send({
|
||||||
|
content: '4764ba063310b6f8bab31e8348b2188a'
|
||||||
|
}).set('Authorization', `Bearer ${token}`).expect(200)
|
||||||
|
|
||||||
|
expect(response.body).toHaveProperty('id')
|
||||||
|
expect(response.body).toHaveProperty('content')
|
||||||
|
expect(response.body).toHaveProperty('authorId')
|
||||||
|
expect(response.body).toHaveProperty('createdAt')
|
||||||
|
expect(response.body).toHaveProperty('updatedAt')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should respond with 400 status code if the user send no token', async () => {
|
||||||
|
const response = await request(app).post('/post/create').expect(401)
|
||||||
|
|
||||||
|
expect(response.body).toHaveProperty('error')
|
||||||
|
})
|
||||||
|
})
|
|
@ -1,12 +1,12 @@
|
||||||
import request from 'supertest'
|
import request from 'supertest'
|
||||||
import prisma from '../../../prisma/client'
|
import prisma from '../../db'
|
||||||
import app from '../../app'
|
import app from '../../app'
|
||||||
|
|
||||||
describe('POST /user/auth', () => {
|
describe('POST /user/auth', () => {
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await prisma.user.create({
|
await prisma.user.create({
|
||||||
data: {
|
data: {
|
||||||
username: 'test',
|
username: 'dummmyuser6',
|
||||||
email: 'test@test.com',
|
email: 'test@test.com',
|
||||||
password: 'pass'
|
password: 'pass'
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ describe('POST /user/auth', () => {
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
await prisma.user.deleteMany({
|
await prisma.user.deleteMany({
|
||||||
where: {
|
where: {
|
||||||
username: 'test'
|
username: 'dummmyuser6'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
await prisma.$disconnect()
|
await prisma.$disconnect()
|
||||||
|
|
|
@ -1,7 +1,46 @@
|
||||||
|
import prisma from '../../db'
|
||||||
|
import app from '../../app'
|
||||||
import request from 'supertest'
|
import request from 'supertest'
|
||||||
|
|
||||||
describe('POST /user/info', () => {
|
let token = ''
|
||||||
it('TODO', async () => {
|
|
||||||
|
|
||||||
|
describe('POST /user/info', () => {
|
||||||
|
beforeAll(async () => {
|
||||||
|
await request(app).post('/user/create').send({
|
||||||
|
username: 'dummmyuser5',
|
||||||
|
email: 'random3@email.com',
|
||||||
|
password: 'pass'
|
||||||
|
})
|
||||||
|
|
||||||
|
const response = await request(app).post('/user/auth').send({
|
||||||
|
email: 'random3@email.com',
|
||||||
|
password: 'pass'
|
||||||
|
}).expect(200)
|
||||||
|
|
||||||
|
token = response.body.token
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await prisma.user.deleteMany({
|
||||||
|
where: {
|
||||||
|
username: 'dummmyuser5'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
await prisma.$disconnect()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should respond with 200 status code and return the user data', async () => {
|
||||||
|
const response = await request(app).get('/user/info').set('Authorization', `Bearer ${token}`).expect(200)
|
||||||
|
|
||||||
|
expect(response.body).toHaveProperty('id')
|
||||||
|
expect(response.body).toHaveProperty('displayName')
|
||||||
|
expect(response.body).toHaveProperty('username')
|
||||||
|
expect(response.body).toHaveProperty('createdAt')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should respond with 400 status code if the user send no token', async () => {
|
||||||
|
const response = await request(app).get('/user/info').expect(401)
|
||||||
|
|
||||||
|
expect(response.body).toHaveProperty('error')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import request from 'supertest'
|
import request from 'supertest'
|
||||||
import prisma from '../../../prisma/client'
|
import prisma from '../../db'
|
||||||
import app from '../../app'
|
import app from '../../app'
|
||||||
|
|
||||||
const mockUser = {
|
const mockUser = {
|
||||||
username: 'username11',
|
username: 'dummmyuser1',
|
||||||
email: 'random@email.com',
|
email: 'random@email.com',
|
||||||
password: 'totallysafepass'
|
password: 'totallysafepass'
|
||||||
}
|
}
|
||||||
|
@ -28,14 +28,14 @@ describe('POST /user/create', () => {
|
||||||
it('should respond with a 400 status code for an existing username', async () => {
|
it('should respond with a 400 status code for an existing username', async () => {
|
||||||
await prisma.user.create({
|
await prisma.user.create({
|
||||||
data: {
|
data: {
|
||||||
username: 'username12',
|
username: 'dummmyuser2',
|
||||||
email: 'user@email.com',
|
email: 'user@email.com',
|
||||||
password: 'reallystrongpass'
|
password: 'reallystrongpass'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const response = await request(app).post('/user/create').send({
|
const response = await request(app).post('/user/create').send({
|
||||||
username: 'username12',
|
username: 'dummmyuser2',
|
||||||
email: 'user1@email.com',
|
email: 'user1@email.com',
|
||||||
password: 'reallystrongpass'
|
password: 'reallystrongpass'
|
||||||
}).expect(400)
|
}).expect(400)
|
||||||
|
@ -46,14 +46,14 @@ describe('POST /user/create', () => {
|
||||||
it('should respond with a 400 status code for an existing email', async () => {
|
it('should respond with a 400 status code for an existing email', async () => {
|
||||||
await prisma.user.create({
|
await prisma.user.create({
|
||||||
data: {
|
data: {
|
||||||
username: 'username13',
|
username: 'dummmyuser3',
|
||||||
email: 'user13@email.com',
|
email: 'user13@email.com',
|
||||||
password: '1234'
|
password: '1234'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const response = await request(app).post('/user/create').send({
|
const response = await request(app).post('/user/create').send({
|
||||||
username: 'heythatscool',
|
username: 'dummmyuser4',
|
||||||
email: 'user13@email.com',
|
email: 'user13@email.com',
|
||||||
password: '12345'
|
password: '12345'
|
||||||
}).expect(400)
|
}).expect(400)
|
||||||
|
@ -69,7 +69,7 @@ describe('POST /user/create', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
const usersToDelete = ['username11', 'username12', 'username13']
|
const usersToDelete = ['dummmyuser1', 'dummmyuser2', 'dummmyuser3', 'dummmyuser4']
|
||||||
|
|
||||||
await prisma.user.deleteMany({
|
await prisma.user.deleteMany({
|
||||||
where: {
|
where: {
|
||||||
|
|
|
@ -106,6 +106,6 @@
|
||||||
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
||||||
/* Completeness */
|
/* Completeness */
|
||||||
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||||
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
"skipLibCheck": true, /* Skip type checking all .d.ts files. */
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue