diff --git a/src/captchaserver.js b/src/captchaserver.js index 70af1cb..1143078 100644 --- a/src/captchaserver.js +++ b/src/captchaserver.js @@ -11,7 +11,7 @@ import http from 'http'; import url from 'url'; import ppfunCaptcha from 'ppfun-captcha'; -import { connect as connectRedis } from './data/redis'; +import { connect as connectRedis } from './data/redis/client'; import { getIPFromRequest } from './utils/ip'; import { setCaptchaSolution } from './utils/captcha'; import { getRandomString } from './core/utils'; diff --git a/src/core/CanvasCleaner.js b/src/core/CanvasCleaner.js index 2b41e7e..3eee4ba 100644 --- a/src/core/CanvasCleaner.js +++ b/src/core/CanvasCleaner.js @@ -8,8 +8,8 @@ import { getData, setStatus, getStatus, -} from '../data/models/CanvasCleaner'; -import RedisCanvas from '../data/models/RedisCanvas'; +} from '../data/redis/CanvasCleaner'; +import RedisCanvas from '../data/redis/RedisCanvas'; import { getChunkOfPixel, getCornerOfChunk, diff --git a/src/core/ChatMessageBuffer.js b/src/core/ChatMessageBuffer.js index 19317aa..dd5e78d 100644 --- a/src/core/ChatMessageBuffer.js +++ b/src/core/ChatMessageBuffer.js @@ -7,7 +7,7 @@ import Sequelize from 'sequelize'; import logger from './logger'; -import { Message, Channel } from '../data/models'; +import { Message, Channel } from '../data/sql'; const MAX_BUFFER_TIME = 120000; diff --git a/src/core/ChatProvider.js b/src/core/ChatProvider.js index c9f67b2..d593d6c 100644 --- a/src/core/ChatProvider.js +++ b/src/core/ChatProvider.js @@ -3,12 +3,12 @@ */ import { Op } from 'sequelize'; import logger from './logger'; -import redis from '../data/redis'; +import redis from '../data/redis/client'; import User from '../data/User'; import RateLimiter from '../utils/RateLimiter'; import { Channel, RegUser, UserChannel, Message, -} from '../data/models'; +} from '../data/sql'; import ChatMessageBuffer from './ChatMessageBuffer'; import socketEvents from '../socket/SocketEvents'; import { cheapDetector } from './isProxy'; diff --git a/src/core/Image.js b/src/core/Image.js index 8d4eef9..9899e40 100644 --- a/src/core/Image.js +++ b/src/core/Image.js @@ -7,7 +7,7 @@ // Tile creation is allowed to be slow /* eslint-disable no-await-in-loop */ -import RedisCanvas from '../data/models/RedisCanvas'; +import RedisCanvas from '../data/redis/RedisCanvas'; import logger from './logger'; import { getChunkOfPixel } from './utils'; import { TILE_SIZE } from './constants'; diff --git a/src/core/RpgEvent.js b/src/core/RpgEvent.js index f639a57..e55fe1e 100644 --- a/src/core/RpgEvent.js +++ b/src/core/RpgEvent.js @@ -14,7 +14,7 @@ import { getEventArea, clearOldEvent, CANVAS_ID, -} from '../data/models/Event'; +} from '../data/redis/Event'; import { setCoolDownFactor } from './draw'; import Void from './Void'; import { protectCanvasArea } from './Image'; diff --git a/src/core/Tile.js b/src/core/Tile.js index 2a83650..a0c9034 100644 --- a/src/core/Tile.js +++ b/src/core/Tile.js @@ -12,7 +12,7 @@ import sharp from 'sharp'; import fs from 'fs'; -import RedisCanvas from '../data/models/RedisCanvas'; +import RedisCanvas from '../data/redis/RedisCanvas'; import Palette from './Palette'; import { getMaxTiledZoom } from './utils'; import { TILE_SIZE, TILE_ZOOM_LEVEL } from './constants'; diff --git a/src/core/Void.js b/src/core/Void.js index 37aab99..1528407 100644 --- a/src/core/Void.js +++ b/src/core/Void.js @@ -9,7 +9,7 @@ import socketEvents from '../socket/SocketEvents'; import PixelUpdate from '../socket/packets/PixelUpdateServer'; import { setPixelByOffset } from './setPixel'; import { TILE_SIZE } from './constants'; -import { CANVAS_ID } from '../data/models/Event'; +import { CANVAS_ID } from '../data/redis/Event'; // eslint-disable-next-line import/no-unresolved import canvases from './canvases.json'; diff --git a/src/core/adminfunctions.js b/src/core/adminfunctions.js index 6b7a0a4..8137cb2 100644 --- a/src/core/adminfunctions.js +++ b/src/core/adminfunctions.js @@ -7,12 +7,12 @@ import sharp from 'sharp'; import Sequelize from 'sequelize'; -import redis from '../data/redis'; +import redis from '../data/redis/client'; import { getIPv6Subnet } from '../utils/ip'; import { validateCoorRange } from '../utils/validation'; import CanvasCleaner from './CanvasCleaner'; -import { Blacklist, Whitelist, RegUser } from '../data/models'; +import { Blacklist, Whitelist, RegUser } from '../data/sql'; // eslint-disable-next-line import/no-unresolved import canvases from './canvases.json'; import { diff --git a/src/core/draw.js b/src/core/draw.js index f058bc8..0dc1fde 100644 --- a/src/core/draw.js +++ b/src/core/draw.js @@ -6,7 +6,7 @@ import { getPixelFromChunkOffset, } from './utils'; import logger, { pixelLogger } from './logger'; -import RedisCanvas from '../data/models/RedisCanvas'; +import RedisCanvas from '../data/redis/RedisCanvas'; import { setPixelByOffset, setPixelByCoords, diff --git a/src/core/isProxy.js b/src/core/isProxy.js index f5a74f0..e5124b2 100644 --- a/src/core/isProxy.js +++ b/src/core/isProxy.js @@ -4,9 +4,9 @@ import fetch from '../utils/proxiedFetch'; -import redis from '../data/redis'; +import redis from '../data/redis/client'; import { getIPv6Subnet } from '../utils/ip'; -import { Blacklist, Whitelist } from '../data/models'; +import { Blacklist, Whitelist } from '../data/sql'; import { proxyLogger as logger } from './logger'; import { USE_PROXYCHECK } from './config'; diff --git a/src/core/mail.js b/src/core/mail.js index b9ae091..978227d 100644 --- a/src/core/mail.js +++ b/src/core/mail.js @@ -12,7 +12,7 @@ import { DailyCron, HourlyCron } from '../utils/cron'; import { getTTag } from './ttag'; import { GMAIL_USER, GMAIL_PW } from './config'; -import RegUser from '../data/models/RegUser'; +import { RegUser } from '../data/sql'; /* diff --git a/src/core/passport.js b/src/core/passport.js index ba61e91..9300375 100644 --- a/src/core/passport.js +++ b/src/core/passport.js @@ -15,7 +15,7 @@ import { OAuth2Strategy as GoogleStrategy } from 'passport-google-oauth'; import logger from './logger'; import { sanitizeName } from '../utils/validation'; -import { RegUser } from '../data/models'; +import { RegUser } from '../data/sql'; import User, { regUserQueryInclude as include } from '../data/User'; import { auth } from './config'; import { compareToHash } from '../utils/hash'; diff --git a/src/core/ranking.js b/src/core/ranking.js index 50fecc7..3e8cc47 100644 --- a/src/core/ranking.js +++ b/src/core/ranking.js @@ -4,9 +4,9 @@ */ import Sequelize from 'sequelize'; -import Model from '../data/sequelize'; -import RegUser from '../data/models/RegUser'; -import { saveDailyTop, loadDailyTop } from '../data/models/prevDayTop'; +import sequelize from '../data/sql/sequelize'; +import RegUser from '../data/sql/RegUser'; +import { saveDailyTop, loadDailyTop } from '../data/redis/PrevDayTop'; import logger from './logger'; import { MINUTE } from './constants'; @@ -34,11 +34,11 @@ class Ranks { async updateRanking() { logger.info('Update pixel rankings'); // recalculate ranking column - await Model.query( + await sequelize.query( // eslint-disable-next-line max-len 'SET @r=0; UPDATE Users SET ranking= @r:= (@r + 1) ORDER BY totalPixels DESC;', ); - await Model.query( + await sequelize.query( // eslint-disable-next-line max-len 'SET @r=0; UPDATE Users SET dailyRanking= @r:= (@r + 1) ORDER BY dailyTotalPixels DESC;', ); diff --git a/src/core/rollback.js b/src/core/rollback.js index a27d27a..6666e1d 100644 --- a/src/core/rollback.js +++ b/src/core/rollback.js @@ -11,7 +11,7 @@ import fs from 'fs'; import path from 'path'; import sharp from 'sharp'; -import RedisCanvas from '../data/models/RedisCanvas'; +import RedisCanvas from '../data/redis/RedisCanvas'; import logger from './logger'; import { getChunkOfPixel } from './utils'; import Palette from './Palette'; diff --git a/src/core/session.js b/src/core/session.js index 7b97976..33813b2 100644 --- a/src/core/session.js +++ b/src/core/session.js @@ -4,12 +4,12 @@ import expressSession from 'express-session'; import RedisStore from '../utils/connectRedis'; -import redis from '../data/redis'; +import client from '../data/redis/client'; import { HOUR, COOKIE_SESSION_NAME } from './constants'; import { SESSION_SECRET } from './config'; -export const store = new RedisStore({ client: redis }); +export const store = new RedisStore({ client }); const session = expressSession({ name: COOKIE_SESSION_NAME, diff --git a/src/core/setPixel.js b/src/core/setPixel.js index 02b465a..d5d1815 100644 --- a/src/core/setPixel.js +++ b/src/core/setPixel.js @@ -2,7 +2,7 @@ * Set pixels on canvas. * Pixels get collected in a cache for 5ms and sent to players at once. * */ -import RedisCanvas from '../data/models/RedisCanvas'; +import RedisCanvas from '../data/redis/RedisCanvas'; import { getChunkOfPixel, getOffsetOfPixel, diff --git a/src/core/tileserver.js b/src/core/tileserver.js index 8b1fceb..5e451c8 100644 --- a/src/core/tileserver.js +++ b/src/core/tileserver.js @@ -9,7 +9,7 @@ import { Worker } from 'worker_threads'; import logger from './logger'; // eslint-disable-next-line import/no-unresolved import canvases from './canvases.json'; -import RedisCanvas from '../data/models/RedisCanvas'; +import RedisCanvas from '../data/redis/RedisCanvas'; import { TILE_FOLDER } from './config'; import { diff --git a/src/data/User.js b/src/data/User.js index 8aa2481..ae49df7 100644 --- a/src/data/User.js +++ b/src/data/User.js @@ -8,11 +8,11 @@ * */ import Sequelize from 'sequelize'; -import redis from './redis'; +import redis from './redis/client'; import logger from '../core/logger'; -import Model from './sequelize'; -import { RegUser, Channel, UserBlock } from './models'; +import sequelize from './sql/sequelize'; +import { RegUser, Channel, UserBlock } from './sql'; import { getIPv6Subnet } from '../utils/ip'; import { ADMIN_IDS } from '../core/config'; @@ -95,13 +95,15 @@ class User { static async name2Id(name: string) { try { - const userq = await Model.query('SELECT id FROM Users WHERE name = $1', + const userq = await sequelize.query( + 'SELECT id FROM Users WHERE name = $1', { bind: [name], type: Sequelize.QueryTypes.SELECT, raw: true, plain: true, - }); + }, + ); return userq.id; } catch { return null; @@ -202,9 +204,9 @@ class User { } async getWait(canvasId: number): Promise { - let ttl: number = await redis.pTTL(`cd:${canvasId}:ip:${this.ipSub}`); + let ttl = await redis.pTTL(`cd:${canvasId}:ip:${this.ipSub}`); if (this.id != null) { - const ttlid: number = await redis.pTTL( + const ttlid = await redis.pTTL( `cd:${canvasId}:id:${this.id}`, ); ttl = Math.max(ttl, ttlid); @@ -238,7 +240,7 @@ class User { return this.regUser.totalPixels; } try { - const userq = await Model.query( + const userq = await sequelize.query( 'SELECT totalPixels FROM Users WHERE id = $1', { bind: [id], diff --git a/src/data/models/CanvasCleaner.js b/src/data/redis/CanvasCleaner.js similarity index 93% rename from src/data/models/CanvasCleaner.js rename to src/data/redis/CanvasCleaner.js index 504e491..b06139c 100644 --- a/src/data/models/CanvasCleaner.js +++ b/src/data/redis/CanvasCleaner.js @@ -2,7 +2,7 @@ * storing Event data */ -import redis from '../redis'; +import client from './client'; import logger from '../../core/logger'; const DATA_KEY = 'clr:dat'; @@ -14,7 +14,7 @@ const STAT_KEY = 'clr:sta'; * (check core/CanvasCleaner for the meaning) */ export async function getData() { - const data = await redis.get(DATA_KEY); + const data = await client.get(DATA_KEY); if (data) { const parsedData = data.toString().split(':'); for (let i = 0; i < parsedData.length - 1; i += 1) { @@ -56,7 +56,7 @@ export async function setData(canvasId, x, y, u, v, methodName) { ); return null; } - return redis.set(DATA_KEY, dataStr); + return client.set(DATA_KEY, dataStr); } /* @@ -66,7 +66,7 @@ export async function setData(canvasId, x, y, u, v, methodName) { * running: boolean if filter is running */ export async function getStatus() { - const stat = await redis.get(STAT_KEY); + const stat = await client.get(STAT_KEY); if (stat) { const parsedStat = stat.toString().split(':'); if (parsedStat.length !== 2) { @@ -103,5 +103,5 @@ export async function setStatus(cIter, running) { ); return null; } - return redis.set(STAT_KEY, statString); + return client.set(STAT_KEY, statString); } diff --git a/src/data/models/Event.js b/src/data/redis/Event.js similarity index 86% rename from src/data/models/Event.js rename to src/data/redis/Event.js index e96b098..221cbd4 100644 --- a/src/data/models/Event.js +++ b/src/data/redis/Event.js @@ -8,7 +8,7 @@ import { commandOptions } from 'redis'; // its ok if its slow /* eslint-disable no-await-in-loop */ -import redis from '../redis'; +import client from './client'; import logger from '../../core/logger'; import RedisCanvas from './RedisCanvas'; @@ -27,10 +27,10 @@ export const CANVAS_ID = '0'; * 2 = lost */ export function setSuccess(success) { - return redis.set(EVENT_SUCCESS_KEY, success); + return client.set(EVENT_SUCCESS_KEY, success); } export async function getSuccess() { - const success = await redis.get(EVENT_SUCCESS_KEY); + const success = await client.get(EVENT_SUCCESS_KEY); return (success) ? parseInt(success, 10) : 0; } @@ -38,7 +38,7 @@ export async function getSuccess() { * @return time till next event in seconds */ export async function nextEvent() { - const timestamp = await redis.get(EVENT_TIMESTAMP_KEY); + const timestamp = await client.get(EVENT_TIMESTAMP_KEY); if (timestamp) { return Number(timestamp.toString()); } @@ -49,7 +49,7 @@ export async function nextEvent() { * @return cell of chunk coordinates of event */ export async function getEventArea() { - const pos = await redis.get(EVENT_POSITION_KEY); + const pos = await client.get(EVENT_POSITION_KEY); if (pos) { return pos.toString().split(':').map((z) => Number(z)); } @@ -69,7 +69,7 @@ export async function clearOldEvent() { for (let ic = i - 1; ic <= i + 1; ic += 1) { try { const chunkKey = `${EVENT_BACKUP_PREFIX}:${ic}:${jc}`; - const chunk = await redis.get( + const chunk = await client.get( commandOptions({ returnBuffers: true }), chunkKey, ); @@ -92,7 +92,7 @@ export async function clearOldEvent() { ); await RedisCanvas.setChunk(ic, jc, chunk, CANVAS_ID); } - await redis.del(chunkKey); + await client.del(chunkKey); } catch (error) { logger.error( // eslint-disable-next-line max-len @@ -101,7 +101,7 @@ export async function clearOldEvent() { } } } - await redis.del(EVENT_POSITION_KEY); + await client.del(EVENT_POSITION_KEY); } } @@ -128,10 +128,10 @@ export async function setNextEvent(minutes, i, j) { chunk = Buffer.allocUnsafe(1); } const chunkKey = `${EVENT_BACKUP_PREFIX}:${ic}:${jc}`; - await redis.set(chunkKey, chunk); + await client.set(chunkKey, chunk); } } - await redis.set(EVENT_POSITION_KEY, `${i}:${j}`); + await client.set(EVENT_POSITION_KEY, `${i}:${j}`); const timestamp = Date.now() + minutes * 60 * 1000; - await redis.set(EVENT_TIMESTAMP_KEY, timestamp); + await client.set(EVENT_TIMESTAMP_KEY, timestamp); } diff --git a/src/data/models/prevDayTop.js b/src/data/redis/PrevDayTop.js similarity index 84% rename from src/data/models/prevDayTop.js rename to src/data/redis/PrevDayTop.js index 03ad413..d766ee4 100644 --- a/src/data/models/prevDayTop.js +++ b/src/data/redis/PrevDayTop.js @@ -2,7 +2,7 @@ * saving and loading the top 10 of the previous day */ -import redis from '../redis'; +import client from './client'; import logger from '../../core/logger'; const PREV_DAILY_TOP_KEY = 'prevtop'; @@ -15,7 +15,7 @@ export async function saveDailyTop(dailyRanking) { const top10 = dailyRanking.slice(0, 10).map((user) => user.id); const jsonTop = JSON.stringify(top10); logger.info(`Saving current daily top 10 into redis: ${jsonTop}`); - await redis.set(PREV_DAILY_TOP_KEY, jsonTop); + await client.set(PREV_DAILY_TOP_KEY, jsonTop); return top10; } @@ -24,7 +24,7 @@ export async function saveDailyTop(dailyRanking) { * @return Promis Array of user IDs of the top 10 */ export async function loadDailyTop() { - const jsonTop = await redis.get(PREV_DAILY_TOP_KEY); + const jsonTop = await client.get(PREV_DAILY_TOP_KEY); logger.info(`Loaded current daily top 10 into redis: ${jsonTop}`); return (jsonTop) ? JSON.parse(jsonTop) : []; } diff --git a/src/data/models/RedisCanvas.js b/src/data/redis/RedisCanvas.js similarity index 93% rename from src/data/models/RedisCanvas.js rename to src/data/redis/RedisCanvas.js index fcf66f8..95c0b5c 100644 --- a/src/data/models/RedisCanvas.js +++ b/src/data/redis/RedisCanvas.js @@ -4,7 +4,7 @@ import { commandOptions } from 'redis'; import { getChunkOfPixel, getOffsetOfPixel } from '../../core/utils'; -import redis from '../redis'; +import client from './client'; const UINT_SIZE = 'u8'; @@ -38,7 +38,7 @@ class RedisCanvas { // this key is also hardcoded into // core/tilesBackup.js const key = `ch:${canvasId}:${i}:${j}`; - let chunk = await redis.get( + let chunk = await client.get( commandOptions({ returnBuffers: true }), key, ); @@ -51,14 +51,14 @@ class RedisCanvas { static async setChunk(i, j, chunk, canvasId) { const key = `ch:${canvasId}:${i}:${j}`; - await redis.set(key, Buffer.from(chunk.buffer)); + await client.set(key, Buffer.from(chunk.buffer)); RedisCanvas.execChunkChangeCallback(canvasId, [i, j]); return true; } static async delChunk(i, j, canvasId) { const key = `ch:${canvasId}:${i}:${j}`; - await redis.del(key); + await client.del(key); RedisCanvas.execChunkChangeCallback(canvasId, [i, j]); return true; } @@ -76,7 +76,7 @@ class RedisCanvas { * TODO what if chunk does not exist? */ if (!RedisCanvas.multi) { - RedisCanvas.multi = redis.multi(); + RedisCanvas.multi = client.multi(); setTimeout(RedisCanvas.flushPixels, 100); } RedisCanvas.multi.addCommand( @@ -124,7 +124,7 @@ class RedisCanvas { UINT_SIZE, `#${offset}`, ]; - const result = await redis.sendCommand(args); + const result = await client.sendCommand(args); if (!result) return null; const color = result[0]; return color; diff --git a/src/data/redis.js b/src/data/redis/client.js similarity index 68% rename from src/data/redis.js rename to src/data/redis/client.js index 9cdbf65..13a7452 100644 --- a/src/data/redis.js +++ b/src/data/redis/client.js @@ -5,9 +5,9 @@ import { createClient } from 'redis'; -import { REDIS_URL } from '../core/config'; +import { REDIS_URL } from '../../core/config'; -const redis = createClient(REDIS_URL.startsWith('redis://') +const client = createClient(REDIS_URL.startsWith('redis://') ? { url: REDIS_URL, } @@ -21,7 +21,7 @@ const redis = createClient(REDIS_URL.startsWith('redis://') export const connect = async () => { // eslint-disable-next-line no-console console.log(`Connecting to redis server at ${REDIS_URL}`); - await redis.connect(); + await client.connect(); }; -export default redis; +export default client; diff --git a/src/data/models/Blacklist.js b/src/data/sql/Blacklist.js similarity index 54% rename from src/data/models/Blacklist.js rename to src/data/sql/Blacklist.js index 22f834a..6dba1df 100644 --- a/src/data/models/Blacklist.js +++ b/src/data/sql/Blacklist.js @@ -2,17 +2,16 @@ * * https://github.com/sequelize/sequelize/issues/1485#issuecomment-243822779 * - * @flow */ -import DataType from 'sequelize'; -import Model from '../sequelize'; +import { DataTypes } from 'sequelize'; +import sequelize from './sequelize'; -const Blacklist = Model.define('Blacklist', { +const Blacklist = sequelize.define('Blacklist', { ip: { - type: DataType.CHAR(39), + type: DataTypes.CHAR(39), allowNull: false, primaryKey: true, }, diff --git a/src/data/models/Channel.js b/src/data/sql/Channel.js similarity index 74% rename from src/data/models/Channel.js rename to src/data/sql/Channel.js index 39803b5..c9d668a 100644 --- a/src/data/models/Channel.js +++ b/src/data/sql/Channel.js @@ -2,25 +2,23 @@ * * Database layout for Chat Channels * - * @flow - * */ -import DataType from 'sequelize'; +import { DataTypes, Utils } from 'sequelize'; -import Model from '../sequelize'; +import sequelize from './sequelize'; import RegUser from './RegUser'; -const Channel = Model.define('Channel', { +const Channel = sequelize.define('Channel', { // Channel ID id: { - type: DataType.INTEGER.UNSIGNED, + type: DataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true, }, name: { - type: `${DataType.CHAR(32)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, + type: `${DataTypes.CHAR(32)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, allowNull: true, }, @@ -31,14 +29,14 @@ const Channel = Model.define('Channel', { * 3: faction (not implemented) */ type: { - type: DataType.TINYINT, + type: DataTypes.TINYINT, allowNull: false, defaultValue: 0, }, lastMessage: { - type: DataType.DATE, - defaultValue: DataType.literal('CURRENT_TIMESTAMP'), + type: DataTypes.DATE, + defaultValue: new Utils.Literal('CURRENT_TIMESTAMP'), allowNull: false, }, }, { diff --git a/src/data/models/Message.js b/src/data/sql/Message.js similarity index 65% rename from src/data/models/Message.js rename to src/data/sql/Message.js index 4dc23d4..df13bd4 100644 --- a/src/data/models/Message.js +++ b/src/data/sql/Message.js @@ -4,33 +4,33 @@ * */ -import DataType from 'sequelize'; -import Model from '../sequelize'; +import { DataTypes } from 'sequelize'; +import sequelize from './sequelize'; import Channel from './Channel'; import RegUser from './RegUser'; -const Message = Model.define('Message', { +const Message = sequelize.define('Message', { // Message ID id: { - type: DataType.INTEGER.UNSIGNED, + type: DataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true, }, name: { - type: `${DataType.CHAR(32)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, + type: `${DataTypes.CHAR(32)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, defaultValue: 'mx', allowNull: false, }, flag: { - type: DataType.CHAR(2), + type: DataTypes.CHAR(2), defaultValue: 'xx', allowNull: false, }, message: { - type: `${DataType.CHAR(200)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, + type: `${DataTypes.CHAR(200)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, allowNull: false, }, }, { diff --git a/src/data/models/RegUser.js b/src/data/sql/RegUser.js similarity index 75% rename from src/data/models/RegUser.js rename to src/data/sql/RegUser.js index 0f06d6d..81a006b 100644 --- a/src/data/models/RegUser.js +++ b/src/data/sql/RegUser.js @@ -3,107 +3,106 @@ * * This is the database of the data for registered Users * - * @flow */ -import DataType from 'sequelize'; -import Model from '../sequelize'; +import { DataTypes } from 'sequelize'; +import sequelize from './sequelize'; import { generateHash } from '../../utils/hash'; -const RegUser = Model.define('User', { +const RegUser = sequelize.define('User', { id: { - type: DataType.INTEGER.UNSIGNED, + type: DataTypes.INTEGER.UNSIGNED, autoIncrement: true, primaryKey: true, }, email: { - type: DataType.CHAR(40), + type: DataTypes.CHAR(40), allowNull: true, }, name: { - type: `${DataType.CHAR(32)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, + type: `${DataTypes.CHAR(32)} CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci`, allowNull: false, }, // currently just moderator roles: { - type: DataType.TINYINT, + type: DataTypes.TINYINT, allowNull: false, defaultValue: 0, }, // null if external oauth authentification password: { - type: DataType.CHAR(60), + type: DataTypes.CHAR(60), allowNull: true, }, totalPixels: { - type: DataType.INTEGER.UNSIGNED, + type: DataTypes.INTEGER.UNSIGNED, allowNull: false, defaultValue: 0, }, dailyTotalPixels: { - type: DataType.INTEGER.UNSIGNED, + type: DataTypes.INTEGER.UNSIGNED, allowNull: false, defaultValue: 0, }, ranking: { - type: DataType.INTEGER.UNSIGNED, + type: DataTypes.INTEGER.UNSIGNED, allowNull: true, }, dailyRanking: { - type: DataType.INTEGER.UNSIGNED, + type: DataTypes.INTEGER.UNSIGNED, allowNull: true, }, // mail and Minecraft verified verified: { - type: DataType.TINYINT, + type: DataTypes.TINYINT, allowNull: false, defaultValue: false, }, // currently just blockDm blocks: { - type: DataType.TINYINT, + type: DataTypes.TINYINT, allowNull: false, defaultValue: 0, }, discordid: { - type: DataType.CHAR(18), + type: DataTypes.CHAR(18), allowNull: true, }, redditid: { - type: DataType.CHAR(10), + type: DataTypes.CHAR(10), allowNull: true, }, // when mail verification got requested, // used for purging unverified accounts verificationReqAt: { - type: DataType.DATE, + type: DataTypes.DATE, allowNull: true, }, // flag == country code flag: { - type: DataType.CHAR(2), + type: DataTypes.CHAR(2), defaultValue: 'xx', allowNull: false, }, lastLogIn: { - type: DataType.DATE, + type: DataTypes.DATE, allowNull: true, }, }, { diff --git a/src/data/models/UserBlock.js b/src/data/sql/UserBlock.js similarity index 80% rename from src/data/models/UserBlock.js rename to src/data/sql/UserBlock.js index fe02bf7..5e3c036 100644 --- a/src/data/models/UserBlock.js +++ b/src/data/sql/UserBlock.js @@ -3,13 +3,11 @@ * Junction table for User -> Blocked User * Relations defined in ./index.js * - * @flow - * */ -import Model from '../sequelize'; +import sequelize from './sequelize'; -const UserBlock = Model.define('UserBlock', { +const UserBlock = sequelize.define('UserBlock', { }, { timestamps: false, }); diff --git a/src/data/models/UserChannel.js b/src/data/sql/UserChannel.js similarity index 57% rename from src/data/models/UserChannel.js rename to src/data/sql/UserChannel.js index b1797ee..e9ff21c 100644 --- a/src/data/models/UserChannel.js +++ b/src/data/sql/UserChannel.js @@ -4,16 +4,14 @@ * A channel can be anything, * Group, Public Chat, DM, etc. * - * @flow - * */ -import DataType from 'sequelize'; -import Model from '../sequelize'; +import { DataTypes } from 'sequelize'; +import sequelize from './sequelize'; -const UserChannel = Model.define('UserChannel', { +const UserChannel = sequelize.define('UserChannel', { lastRead: { - type: DataType.DATE, + type: DataTypes.DATE, allowNull: true, }, }, { diff --git a/src/data/models/Whitelist.js b/src/data/sql/Whitelist.js similarity index 55% rename from src/data/models/Whitelist.js rename to src/data/sql/Whitelist.js index 597dbf3..dc5a727 100644 --- a/src/data/models/Whitelist.js +++ b/src/data/sql/Whitelist.js @@ -2,18 +2,16 @@ * Created by HF * * https://github.com/sequelize/sequelize/issues/1485#issuecomment-243822779 - * - * @flow */ -import DataType from 'sequelize'; -import Model from '../sequelize'; +import { DataTypes } from 'sequelize'; +import sequelize from './sequelize'; -const Whitelist = Model.define('Whitelist', { +const Whitelist = sequelize.define('Whitelist', { ip: { - type: DataType.CHAR(39), + type: DataTypes.CHAR(39), allowNull: false, primaryKey: true, }, diff --git a/src/data/models/index.js b/src/data/sql/index.js similarity index 86% rename from src/data/models/index.js rename to src/data/sql/index.js index 9ee67d1..b9cbabe 100644 --- a/src/data/models/index.js +++ b/src/data/sql/index.js @@ -1,4 +1,3 @@ -import sequelize from '../sequelize'; import Blacklist from './Blacklist'; import Whitelist from './Whitelist'; import RegUser from './RegUser'; @@ -36,11 +35,6 @@ RegUser.belongsToMany(RegUser, { foreignKey: 'buid', }); -function sync(...args) { - return sequelize.sync(...args); -} - -export default { sync }; export { Whitelist, Blacklist, diff --git a/src/data/sequelize.js b/src/data/sql/sequelize.js similarity index 87% rename from src/data/sequelize.js rename to src/data/sql/sequelize.js index 0510805..b8a8431 100644 --- a/src/data/sequelize.js +++ b/src/data/sql/sequelize.js @@ -1,14 +1,13 @@ /** * - * @flow */ import Sequelize from 'sequelize'; -import logger from '../core/logger'; +import logger from '../../core/logger'; import { MYSQL_HOST, MYSQL_DATABASE, MYSQL_USER, MYSQL_PW, LOG_MYSQL, -} from '../core/config'; +} from '../../core/config'; const sequelize = new Sequelize(MYSQL_DATABASE, MYSQL_USER, MYSQL_PW, { host: MYSQL_HOST, diff --git a/src/routes/adminapi.js b/src/routes/adminapi.js index 8693bf2..90c6243 100644 --- a/src/routes/adminapi.js +++ b/src/routes/adminapi.js @@ -1,7 +1,7 @@ import express from 'express'; import logger from '../core/logger'; -import RegUser from '../data/models/RegUser'; +import { RegUser } from '../data/sql'; import { getIPFromRequest } from '../utils/ip'; import { compareToHash } from '../utils/hash'; import { APISOCKET_KEY } from '../core/config'; diff --git a/src/routes/api/auth/change_name.js b/src/routes/api/auth/change_name.js index 7db6f81..3661e9f 100644 --- a/src/routes/api/auth/change_name.js +++ b/src/routes/api/auth/change_name.js @@ -7,7 +7,7 @@ import type { Request, Response } from 'express'; import socketEvents from '../../../socket/SocketEvents'; -import { RegUser } from '../../../data/models'; +import { RegUser } from '../../../data/sql'; import { validateName } from '../../../utils/validation'; async function validate(oldname, name) { diff --git a/src/routes/api/auth/delete_account.js b/src/routes/api/auth/delete_account.js index 433837e..cbe7dcb 100644 --- a/src/routes/api/auth/delete_account.js +++ b/src/routes/api/auth/delete_account.js @@ -6,7 +6,7 @@ import type { Request, Response } from 'express'; -import { RegUser } from '../../../data/models'; +import { RegUser } from '../../../data/sql'; import { validatePassword } from '../../../utils/validation'; import { compareToHash } from '../../../utils/hash'; diff --git a/src/routes/api/auth/register.js b/src/routes/api/auth/register.js index a31d1ea..430acbf 100644 --- a/src/routes/api/auth/register.js +++ b/src/routes/api/auth/register.js @@ -8,7 +8,7 @@ import type { Request, Response } from 'express'; import Sequelize from 'sequelize'; import logger from '../../../core/logger'; -import { RegUser } from '../../../data/models'; +import { RegUser } from '../../../data/sql'; import mailProvider from '../../../core/mail'; import getMe from '../../../core/me'; import { getIPFromRequest, getHostFromRequest } from '../../../utils/ip'; diff --git a/src/routes/api/block.js b/src/routes/api/block.js index e8ac252..4479117 100644 --- a/src/routes/api/block.js +++ b/src/routes/api/block.js @@ -9,7 +9,7 @@ import type { Request, Response } from 'express'; import logger from '../../core/logger'; import socketEvents from '../../socket/SocketEvents'; -import { RegUser, UserBlock, Channel } from '../../data/models'; +import { RegUser, UserBlock, Channel } from '../../data/sql'; async function block(req: Request, res: Response) { let userId = parseInt(req.body.userId, 10); diff --git a/src/routes/api/startdm.js b/src/routes/api/startdm.js index eb3c09f..09a3634 100644 --- a/src/routes/api/startdm.js +++ b/src/routes/api/startdm.js @@ -9,8 +9,8 @@ import type { Request, Response } from 'express'; import logger from '../../core/logger'; import { ChatProvider } from '../../core/ChatProvider'; -import { Channel, RegUser } from '../../data/models'; -import { isUserBlockedBy } from '../../data/models/UserBlock'; +import { Channel, RegUser } from '../../data/sql'; +import { isUserBlockedBy } from '../../data/sql/UserBlock'; async function startDm(req: Request, res: Response) { let userId = parseInt(req.body.userId, 10); diff --git a/src/routes/chunks.js b/src/routes/chunks.js index ad1d02e..a667aa6 100644 --- a/src/routes/chunks.js +++ b/src/routes/chunks.js @@ -5,7 +5,7 @@ */ import etag from 'etag'; -import RedisCanvas from '../data/models/RedisCanvas'; +import RedisCanvas from '../data/redis/RedisCanvas'; import logger from '../core/logger'; const chunkEtags = new Map(); diff --git a/src/routes/reset_password.js b/src/routes/reset_password.js index 94d2905..a63e51d 100644 --- a/src/routes/reset_password.js +++ b/src/routes/reset_password.js @@ -12,7 +12,7 @@ import logger from '../core/logger'; import getPasswordResetHtml from '../ssr-components/PasswordReset'; import mailProvider from '../core/mail'; -import { RegUser } from '../data/models'; +import { RegUser } from '../data/sql'; const router = express.Router(); diff --git a/src/server.js b/src/server.js index 59d59d7..e743870 100644 --- a/src/server.js +++ b/src/server.js @@ -11,8 +11,8 @@ import http from 'http'; import forceGC from './core/forceGC'; import logger from './core/logger'; import rankings from './core/ranking'; -import models from './data/models'; -import { connect as connectRedis } from './data/redis'; +import sequelize from './data/sql/sequelize'; +import { connect as connectRedis } from './data/redis/client'; import routes from './routes'; import chatProvider from './core/ChatProvider'; import RpgEvent from './core/RpgEvent'; @@ -85,9 +85,9 @@ const rpgEvent = new RpgEvent(); // ip config // ----------------------------------------------------------------------------- // sync sql models -models.sync({ alter: { drop: false } }) +sequelize.sync({ alter: { drop: false } }) // connect to redis - .then(() => connectRedis()) + .then(connectRedis) .then(() => { rankings.initialize(); chatProvider.initialize(); diff --git a/src/socket/APISocketServer.js b/src/socket/APISocketServer.js index dee0a56..08691ca 100644 --- a/src/socket/APISocketServer.js +++ b/src/socket/APISocketServer.js @@ -12,7 +12,7 @@ import WebSocket from 'ws'; import socketEvents from './SocketEvents'; import chatProvider from '../core/ChatProvider'; -import RegUser from '../data/models/RegUser'; +import { RegUser } from '../data/sql'; import { getIPFromRequest } from '../utils/ip'; import { setPixelByCoords } from '../core/setPixel'; import logger from '../core/logger'; diff --git a/src/utils/captcha.js b/src/utils/captcha.js index fc6c665..9c4ea7d 100644 --- a/src/utils/captcha.js +++ b/src/utils/captcha.js @@ -4,7 +4,7 @@ */ import logger from '../core/logger'; -import redis from '../data/redis'; +import redis from '../data/redis/client'; import { getIPv6Subnet } from './ip'; import { CAPTCHA_URL, diff --git a/src/workers/tilewriter.js b/src/workers/tilewriter.js index 5b5b7bb..c71a239 100644 --- a/src/workers/tilewriter.js +++ b/src/workers/tilewriter.js @@ -6,7 +6,7 @@ import { isMainThread, parentPort } from 'worker_threads'; -import { connect as connectRedis } from '../data/redis'; +import { connect as connectRedis } from '../data/redis/client'; import { createZoomTileFromChunk, createZoomedTile,