Compare commits

...

22 Commits

Author SHA1 Message Date
0970d3e83b 1.3.3 2023-11-06 21:51:13 +03:00
4e77185a33 cors on toggle 2023-11-06 21:51:02 +03:00
0ef9958ebd 1.3.2 2023-11-03 15:44:06 +03:00
a8f111995f fix likes 2023-11-03 15:15:47 +03:00
38064eff2b likes api 2023-11-03 15:07:54 +03:00
25b3320665 cors header on likes 2023-10-31 18:24:51 +03:00
db4d1980a8 fix 2023-10-30 23:24:30 +03:00
05c9474921 likes likes 2023-10-30 22:46:10 +03:00
9f9b652ced 1.3.1 2023-03-09 21:34:50 +03:00
9279f827d2 out 2 v2 2023-03-09 21:34:44 +03:00
7c5f677d97 fix scripts + mailer 2022-06-26 20:45:52 +03:00
76544d6251 1.3.0 2022-05-29 21:57:44 +03:00
715ddddb3d createDrafts 2022-05-29 21:57:35 +03:00
593c43d00d mongo@4.4.13 2022-04-23 22:14:26 +03:00
977370e662 latest mongo version 2022-04-23 22:12:39 +03:00
c5a1f90816 1.2.3 2022-04-23 21:06:09 +03:00
3ec9ef0c91 add role on register 2022-04-23 21:05:58 +03:00
9f8feb5e40 add role on register 2022-04-23 21:05:51 +03:00
d1a366e88b 1.2.2 2022-04-23 20:51:16 +03:00
ab36c3c2a5 fix build script 2022-04-23 20:51:05 +03:00
bb5832a751 1.2.1 2022-04-23 20:28:29 +03:00
4ce1ec2f2b Исправил название проекта в email 2022-04-23 20:28:20 +03:00
15 changed files with 7736 additions and 11 deletions

2
.npmrc
View File

@ -1 +1 @@
package-lock=false
package-lock=true

View File

@ -1,6 +1,6 @@
#!/bin/sh
docker stop $(docker ps -q)
docker volume remove multy_stub_volume
docker volume create multy_stub_volume
docker run --rm -v multy_stub_volume:/data/db -p 27017:27017 -d mongo
docker volume remove red_coder_volume
docker volume create red_coder_volume
docker run --rm -v red_coder_volume:/data/db -p 27017:27017 -d mongo:4.4.13

View File

@ -5,7 +5,7 @@ volumes:
services:
mongoDb:
image: mongo:5.0.7
image: mongo:4.4.13
volumes:
- red-coder_volume:/data/db
restart: always

7571
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
{
"name": "red-coder-bh",
"version": "1.2.0",
"version": "1.3.3",
"description": "",
"main": "src/main.ts",
"scripts": {
"start": "nodemon",
"start": "cross-env MODE=\"dev\" nodemon",
"build": "tsc",
"up:prod": "node dist/main",
"up:prod": "node dist/src/main",
"deploy:d:stop": "docker-compose down",
"deploy:d:build": "docker-compose build",
"deploy:d:up": "docker-compose up -d",
@ -31,6 +31,7 @@
"@types/cookie-session": "^2.0.44",
"axios": "^0.26.1",
"cookie-session": "^2.0.0",
"cors": "^2.8.5",
"cross-env": "^7.0.3",
"dotenv": "^16.0.0",
"express": "^4.17.3",

View File

@ -1,2 +1,5 @@
export const usersCollection = 'USERS_COLLECTIONS'
export const draftsCollection = 'DRAFTS_CLLECTION'
export const tasksCollection = 'TASKS_CLLECTION'
export const numberCollection = 'NUMBER_COLLECTION'

View File

@ -13,6 +13,6 @@ init({
})
if (process.env.MAIL_TO_1 && process.env.MODE !== 'dev') {
addToQueue(new AdminNotificationRequest(`Деплой админки v${pkg.version} прошёл успешно`))
addToQueue(new AdminNotificationRequest(`Деплой RED-CODER-BH v${pkg.version} прошёл успешно`))
}

View File

@ -1,9 +1,11 @@
import express from 'express'
import cookieSession from 'cookie-session'
import cors from 'cors'
import './config'
import { errorHandle } from './utils/error-handling'
import { router } from './routes'
import './mailer'
const app = express()
@ -12,6 +14,7 @@ const port = process.env.RED_CODER_BH_PORT
app.use(express.json())
app.use(cookieSession({ secret: process.env.COOKIE_SESSION }))
app.use(cors('*'))
app.use(router)
app.use(errorHandle)

View File

@ -1,9 +1,56 @@
import { Router } from 'express'
import expressjwt from 'express-jwt'
import { authRouter } from './v1/auth'
import { bannerRouter } from './v1/banner'
import tasksRouter from './v1/tasks'
import draftsRouter from './v1/drafts'
export const router = Router()
const jwtMiddlevare = expressjwt({
secret: process.env.JWT_SECRET_STRING,
algorithms: ['HS256']
})
router.use(bannerRouter)
router.use('/v1/auth', authRouter)
router.use(['/v1/tasks', '/v1/task'], jwtMiddlevare, tasksRouter)
router.use('/v1/drafts', jwtMiddlevare, draftsRouter)
const charLikes = {}
router.get('/likes', (req, res) => {
res.set({
'Access-Control-Allow-Origin': 'http://admin.inno-js.ru',
})
res.send({
likes: charLikes,
})
})
router.post('/toggle-like', (req, res) => {
const { id, charId } = req.body
if (charLikes[charId]) {
const currentLikes = new Set(charLikes[charId].likes)
if (currentLikes.has(id)) {
currentLikes.delete(id)
} else {
currentLikes.add(id)
}
charLikes[charId].likes = [...currentLikes]
} else {
charLikes[charId] = { likes: [id] }
}
res.set({
'Access-Control-Allow-Origin': 'http://admin.inno-js.ru',
})
res.send({
likes: charLikes,
})
})

View File

@ -3,6 +3,7 @@ import { Db } from 'mongodb'
import { mainDb } from '../../utils/mongo'
import { cleanId } from '../../utils/common'
import { usersCollection } from '../../__data__/constants'
import { Roles } from '../../model/roles'
export const registerUser = async ({ username, regtime, role, email, id, ...rest }) => {
const db: Db = await mainDb
@ -11,6 +12,7 @@ export const registerUser = async ({ username, regtime, role, email, id, ...rest
const [registred] = await usersCl.find({ ijlId: id }).toArray()
const user = {
role: Roles.User,
...(registred || {}),
ijlId: id,
ijlUser: {

15
src/routes/v1/drafts.ts Normal file
View File

@ -0,0 +1,15 @@
import { Router } from 'express'
import { getAnswer } from '../../utils/common'
import { requiredFields } from '../../utils/required'
import { getDrafts } from './tasks.controller'
const router = Router()
router.get('/', async (req, res) => {
const drafts = await getDrafts((req as any)?.user?.id)
res.send(getAnswer(null, drafts))
})
export default router

View File

@ -0,0 +1,62 @@
import { Db, ObjectId } from 'mongodb'
import { mainDb } from '../../utils/mongo'
import { cleanId } from '../../utils/common'
import { draftsCollection, tasksCollection, numberCollection } from '../../__data__/constants'
export const createTask = async ({ userId }) => {
const db: Db = await mainDb
const col = db.collection(draftsCollection)
const ncol = db.collection(numberCollection)
const numberObject = await ncol.findOne({})
if (!numberObject) {
await ncol.insertOne({ number: 1 })
}
ncol.updateOne({}, {
$set: {
number: (numberObject?.number || 1) + 1
}
})
const draftTask = {
cratedBy: new ObjectId(userId),
createdDt: Date.now(),
lastModufy: Date.now(),
names: {
'ru': 'Полиндром'
},
'draft': true,
'number': (numberObject?.number || 1) + 1,
'markdown': '# Напишите функцию проверки текста на полиндром\\n## Напишите функцию проверки текста на полиндром\\n### Напишите функцию проверки текста на полиндром\\n#### Напишите функцию проверки текста на полиндром\\n##### Напишите функцию проверки текста на полиндром\\n###### Напишите функцию проверки текста на полиндром\\n\\nБлок текста с описанием задачи.\\n[Ссылка](https://reactjs.org/) на документацию реакта\\n\\nНе забудьте [зарегистрироваться](/auth) и [поискать](/main) задачки\\n\\n![react logo](https://tproger.ru/s3/uploads/2016/10/reactmini.png)\\n\\n![line](https://www.clipartmax.com/png/small/44-446497_lines-clipart-vertical-line-blue-vertical-line-png.png)\\n\\n> цитата\\n> цитата\\n> цитата\\n\\n```javascript\\nimport { useCallback, useRef, useEffect } from \'react\';\\nimport { editor as mEditor } from \'monaco-editor\';\\n\\nexport const useMonako = (inputData, remountFlag, language: string, onChange = (value: string) => null) => {\\n const editorRef = useRef<mEditor.IStandaloneCodeEditor>();\\n const nodeRef = useRef(null);\\n const remount = useCallback(() => {\\n editorRef.current?.dispose();\\n editorRef.current = mEditor.create(nodeRef.current, {\\n value: inputData,\\n theme: \'light\' === \'light\' ? \'vs\' : \'vs-dark\',\\n language,\\n });\\n\\n const model = editorRef.current.getModel();\\n model.onDidChangeContent(() => {\\n const value = model.getValue();\\n onChange(value)\\n });\\n } ,[inputData, nodeRef]);\\n\\n useEffect(() => {\\n try {\\n setTimeout(() => {\\n if (nodeRef.current) {\\n remount();\\n\\n () => {\\n editorRef.current.dispose();\\n editorRef.current = null;\\n };\\n }\\n }, 2);\\n } catch (error) {\\n console.error(error);\\n }\\n }, [nodeRef, remountFlag]);\\n\\n return {\\n nodeRef,\\n getValue: () => editorRef?.current?.getValue(),\\n };\\n}\\n\\n```'
}
await col.insertOne(draftTask)
return cleanId(draftTask)
}
export const getTaskData = async (taskId) => {
const db: Db = await mainDb
const col = db.collection(draftsCollection)
const task = await col.findOne({
_id: new ObjectId(taskId),
}).catch(console.log)
return cleanId(task)
}
export const getDrafts = async (userId) => {
const db: Db = await mainDb
const col = db.collection(draftsCollection)
const tasks = await col.find({
cratedBy: new ObjectId(userId),
}).toArray()
return cleanId(tasks)
}

21
src/routes/v1/tasks.ts Normal file
View File

@ -0,0 +1,21 @@
import { Router } from 'express'
import { requiredFields } from '../../utils/required'
import { createTask, getTaskData } from './tasks.controller'
const router = Router()
router.post('/create', async (req, res) => {
const draft = await createTask({ userId: (req as any)?.user?.id })
res.send(draft)
})
router.post('/data', requiredFields(['id']), async (req, res) => {
const { id } = req.body
const task = await getTaskData(id)
res.send(task)
})
export default router

View File

@ -1,7 +1,7 @@
import baseAxios from 'axios'
export const adminAxios = baseAxios.create({
baseURL: `http://${process.env.ADMIN_SERVER_BASE_NAME}/api/out`,
baseURL: `http://${process.env.ADMIN_SERVER_BASE_NAME}/api/out/v2`,
method: 'POST',
})

View File

@ -2,7 +2,7 @@ const getAnswer = (errors, data, success = true) => {
if (errors) {
return { success: false, errors }
} else {
return { success, body: data }
return { success, data }
}
}