chore: Unify backend express project into ESM (#281)

This commit is contained in:
kimatata
2025-09-15 22:46:46 +09:00
committed by GitHub
parent 72fd3af24f
commit 761869736e
83 changed files with 2129 additions and 2328 deletions

View File

@@ -61,11 +61,11 @@ COPY backend/package.json backend/package-lock.json* ./
RUN npm ci
WORKDIR /app
# Copy custom combined_server.js that combines frontend and backend
COPY combined_server.js ./
# Copy custom entrypoint.js that combines frontend and backend
COPY entrypoint.js ./
# Expose the port
EXPOSE 8000
# Run database migrations and start the combined server
CMD ["node", "combined_server.js"]
CMD ["node", "entrypoint.js"]

View File

@@ -1,7 +1,12 @@
const path = require('path');
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const databasePath = path.resolve(__dirname, '../database/database.sqlite');
module.exports = {
export default {
development: {
dialect: 'sqlite',
storage: databasePath,

View File

@@ -1,5 +1,4 @@
const server = require('./server');
import server from './server.js';
const PORT = process.env.PORT || 8001;
server.listen(PORT, () => {

View File

@@ -1,9 +1,9 @@
const jwt = require('jsonwebtoken');
const { DataTypes } = require('sequelize');
const { roles, defaultDangerKey } = require('../routes/users/authSettings');
const defineUser = require('../models/users');
import jwt from 'jsonwebtoken';
import { DataTypes } from 'sequelize';
import { roles, defaultDangerKey } from '../routes/users/authSettings.js';
import defineUser from '../models/users.js';
function authMiddleware(sequelize) {
export default function authMiddleware(sequelize) {
/**
* Verify user sined in
*
@@ -53,5 +53,3 @@ function authMiddleware(sequelize) {
verifyAdmin,
};
}
module.exports = authMiddleware;

View File

@@ -1,12 +1,12 @@
const { DataTypes } = require('sequelize');
const { memberRoles } = require('../routes/users/authSettings');
const defineMember = require('../models/members');
const defineProject = require('../models/projects');
const defineFolder = require('../models/folders');
const defineCase = require('../models/cases');
const defineRun = require('../models/runs');
import { DataTypes } from 'sequelize';
import { memberRoles } from '../routes/users/authSettings.js';
import defineMember from '../models/members.js';
import defineProject from '../models/projects.js';
import defineFolder from '../models/folders.js';
import defineCase from '../models/cases.js';
import defineRun from '../models/runs.js';
function verifyEditableMiddleware(sequelize) {
export default function verifyEditableMiddleware(sequelize) {
/**
* Verify user has project
* (have to be called after verifySignedIn() middleware)
@@ -291,5 +291,3 @@ function verifyEditableMiddleware(sequelize) {
verifyProjectReporterFromRunId,
};
}
module.exports = verifyEditableMiddleware;

View File

@@ -1,11 +1,11 @@
const { DataTypes } = require('sequelize');
const defineMember = require('../models/members');
const defineProject = require('../models/projects');
const defineFolder = require('../models/folders');
const defineCase = require('../models/cases');
const defineRun = require('../models/runs');
import { DataTypes } from 'sequelize';
import defineMember from '../models/members.js';
import defineProject from '../models/projects.js';
import defineFolder from '../models/folders.js';
import defineCase from '../models/cases.js';
import defineRun from '../models/runs.js';
function verifyVisibleMiddleware(sequelize) {
export default function verifyVisibleMiddleware(sequelize) {
/**
* Verify user can read project by projectId
* (have to be called after verifySignedIn() middleware)
@@ -160,5 +160,3 @@ function verifyVisibleMiddleware(sequelize) {
verifyProjectVisibleFromRunId,
};
}
module.exports = verifyVisibleMiddleware;

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface, Sequelize) => {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('users', {
id: {
type: Sequelize.INTEGER,
@@ -38,9 +34,8 @@ module.exports = {
allowNull: false,
},
});
},
}
down: async (queryInterface) => {
export async function down(queryInterface) {
await queryInterface.dropTable('users');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface, Sequelize) => {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('projects', {
id: {
type: Sequelize.INTEGER,
@@ -40,9 +36,8 @@ module.exports = {
allowNull: false,
},
});
},
}
down: async (queryInterface) => {
export async function down(queryInterface) {
await queryInterface.dropTable('projects');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface, Sequelize) => {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('folders', {
id: {
type: Sequelize.INTEGER,
@@ -40,9 +36,8 @@ module.exports = {
allowNull: false,
},
});
},
}
async down(queryInterface) {
export async function down(queryInterface) {
await queryInterface.dropTable('folders');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('runs', {
id: {
type: Sequelize.INTEGER,
@@ -44,9 +40,8 @@ module.exports = {
type: Sequelize.DATE,
},
});
},
}
async down(queryInterface) {
export async function down(queryInterface) {
await queryInterface.dropTable('runs');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('cases', {
id: {
type: Sequelize.INTEGER,
@@ -64,9 +60,8 @@ module.exports = {
type: Sequelize.DATE,
},
});
},
}
async down(queryInterface) {
export async function down(queryInterface) {
await queryInterface.dropTable('cases');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface, Sequelize) => {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('steps', {
id: {
type: Sequelize.INTEGER,
@@ -26,9 +22,8 @@ module.exports = {
allowNull: false,
},
});
},
}
down: async (queryInterface) => {
export async function down(queryInterface) {
await queryInterface.dropTable('steps');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface, Sequelize) => {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('caseSteps', {
id: {
type: Sequelize.INTEGER,
@@ -44,9 +40,8 @@ module.exports = {
await queryInterface.addIndex('caseSteps', ['caseId', 'stepId'], {
unique: true,
});
},
}
down: async (queryInterface) => {
export async function down(queryInterface) {
await queryInterface.dropTable('caseSteps');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('attachments', {
id: {
type: Sequelize.INTEGER,
@@ -30,9 +26,8 @@ module.exports = {
type: Sequelize.DATE,
},
});
},
}
async down(queryInterface) {
export async function down(queryInterface) {
await queryInterface.dropTable('attachments');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface, Sequelize) => {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('caseAttachments', {
id: {
type: Sequelize.INTEGER,
@@ -40,9 +36,8 @@ module.exports = {
await queryInterface.addIndex('caseAttachments', ['caseId', 'attachmentId'], {
unique: true,
});
},
}
down: async (queryInterface) => {
export async function down(queryInterface) {
await queryInterface.dropTable('caseAttachments');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface, Sequelize) => {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('runCases', {
id: {
type: Sequelize.INTEGER,
@@ -44,9 +40,8 @@ module.exports = {
await queryInterface.addIndex('runCases', ['runId', 'caseId'], {
unique: true,
});
},
}
down: async (queryInterface) => {
export async function down(queryInterface) {
await queryInterface.dropTable('runCases');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
up: async (queryInterface, Sequelize) => {
export async function up(queryInterface, Sequelize) {
await queryInterface.createTable('members', {
id: {
type: Sequelize.INTEGER,
@@ -44,9 +40,8 @@ module.exports = {
await queryInterface.addIndex('members', ['userId', 'projectId'], {
unique: true,
});
},
}
down: async (queryInterface) => {
export async function down(queryInterface) {
await queryInterface.dropTable('members');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface) {
export async function up(queryInterface) {
/**
* Add altering commands here.
*
@@ -13,14 +9,13 @@ module.exports = {
await queryInterface.renameColumn('users', 'createdAt', 'created_at');
await queryInterface.renameColumn('users', 'updatedAt', 'updated_at');
await queryInterface.renameColumn('users', 'avatarPath', 'avatar_path');
},
}
async down() {
export async function down() {
/**
* Add reverting commands here.
*
* Example:
* await queryInterface.dropTable('users');
*/
},
};
}

View File

@@ -1,13 +1,9 @@
'use strict';
module.exports = {
up: async (queryInterface) => {
export async function up(queryInterface) {
// Rename column 'path' to 'filename' in 'Attachments' table
await queryInterface.renameColumn('Attachments', 'path', 'filename');
},
}
down: async (queryInterface) => {
export async function down(queryInterface) {
// Revert column name from 'filename' back to 'path'
await queryInterface.renameColumn('Attachments', 'filename', 'path');
},
};
}

View File

@@ -1,8 +1,4 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface) {
export async function up(queryInterface) {
await queryInterface.addConstraint('folders', {
fields: ['parentFolderId'],
type: 'foreign key',
@@ -14,9 +10,8 @@ module.exports = {
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
});
},
}
async down(queryInterface) {
export async function down(queryInterface) {
await queryInterface.removeConstraint('folders', 'fk_folders_parentFolderId');
},
};
}

View File

@@ -23,4 +23,4 @@ function defineAttachment(sequelize, DataTypes) {
return Attachment;
}
module.exports = defineAttachment;
export default defineAttachment;

View File

@@ -24,4 +24,4 @@ function defineCaseAttachment(sequelize, DataTypes) {
return CaseAttachment;
}
module.exports = defineCaseAttachment;
export default defineCaseAttachment;

View File

@@ -28,4 +28,4 @@ function defineCaseStep(sequelize, DataTypes) {
return CaseStep;
}
module.exports = defineCaseStep;
export default defineCaseStep;

View File

@@ -60,4 +60,4 @@ function defineCase(sequelize, DataTypes) {
return Case;
}
module.exports = defineCase;
export default defineCase;

View File

@@ -37,4 +37,4 @@ function defineFolder(sequelize, DataTypes) {
return Folder;
}
module.exports = defineFolder;
export default defineFolder;

View File

@@ -1,12 +1,13 @@
'use strict';
const fs = require('fs');
const path = require('path');
const process = require('process');
const Sequelize = require('sequelize');
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import process from 'process';
import Sequelize from 'sequelize';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
import configDefault from '../config/config';
const config = configDefault[process.env.NODE_ENV || 'development'];
const db = {};
let sequelize;
@@ -16,15 +17,16 @@ if (config.use_env_variable) {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs.readdirSync(__dirname)
.filter((file) => {
const modelFiles = fs.readdirSync(__dirname).filter((file) => {
return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js' && file.indexOf('.test.js') === -1;
})
.forEach((file) => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
db[model.name] = model;
});
for (const file of modelFiles) {
const module = await import(path.join(__dirname, file));
const model = module.default(sequelize, Sequelize.DataTypes);
db[model.name] = model;
}
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db);
@@ -34,4 +36,4 @@ Object.keys(db).forEach((modelName) => {
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
export default db;

View File

@@ -28,4 +28,4 @@ function defineMember(sequelize, DataTypes) {
return Member;
}
module.exports = defineMember;
export default defineMember;

View File

@@ -32,4 +32,4 @@ function defineProject(sequelize, DataTypes) {
return Project;
}
module.exports = defineProject;
export default defineProject;

View File

@@ -28,4 +28,4 @@ function defineRunCase(sequelize, DataTypes) {
return RunCase;
}
module.exports = defineRunCase;
export default defineRunCase;

View File

@@ -34,4 +34,4 @@ function defineRun(sequelize, DataTypes) {
return Run;
}
module.exports = defineRun;
export default defineRun;

View File

@@ -19,4 +19,4 @@ function defineStep(sequelize, DataTypes) {
return Step;
}
module.exports = defineStep;
export default defineStep;

View File

@@ -1,9 +1,3 @@
/**
*
* @param {import('sequelize').Sequelize} sequelize
* @param {*} DataTypes
* @returns
*/
function defineUser(sequelize, DataTypes) {
const User = sequelize.define(
'User',
@@ -39,4 +33,4 @@ function defineUser(sequelize, DataTypes) {
return User;
}
module.exports = defineUser;
export default defineUser;

File diff suppressed because it is too large Load Diff

View File

@@ -2,6 +2,7 @@
"name": "unittcms-backend",
"version": "1.0.0",
"private": true,
"type": "module",
"scripts": {
"start": "node --env-file=.env index",
"dev": "node index",
@@ -19,8 +20,8 @@
"jsonwebtoken": "^9.0.2",
"multer": "^1.4.5-lts.1",
"papaparse": "^5.5.2",
"sequelize": "^6.37.5",
"sequelize-cli": "^6.6.2",
"sequelize": "^6.37.7",
"sequelize-cli": "^6.6.3",
"sqlite3": "^5.1.7",
"xmlbuilder2": "^3.1.1"
}

View File

@@ -1,13 +1,17 @@
const fs = require('fs');
const path = require('path');
const express = require('express');
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineAttachment = require('../../models/attachments');
import { DataTypes } from 'sequelize';
import defineAttachment from '../../models/attachments.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
module.exports = function (sequelize) {
export default function (sequelize) {
const Attachment = defineAttachment(sequelize, DataTypes);
// TODO middleware to verify user permission to delete attachment
router.delete('/:attachmentId', async (req, res) => {
const attachmentId = req.params.attachmentId;
const t = await sequelize.transaction();
@@ -41,4 +45,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,12 +1,17 @@
const fs = require('fs');
const path = require('path');
const express = require('express');
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineAttachment = require('../../models/attachments');
import { DataTypes } from 'sequelize';
import defineAttachment from '../../models/attachments.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
module.exports = function (sequelize) {
export default function (sequelize) {
const Attachment = defineAttachment(sequelize, DataTypes);
// TODO middleware to verify user permission to get attachment
router.get('/download/:attachmentId', async (req, res) => {
const attachmentId = req.params.attachmentId;
@@ -30,4 +35,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,13 +1,16 @@
const fs = require('fs');
const path = require('path');
const express = require('express');
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import multer from 'multer';
import express from 'express';
const router = express.Router();
const multer = require('multer');
const { DataTypes } = require('sequelize');
const defineAttachment = require('../../models/attachments');
const defineCaseAttachment = require('../../models/caseAttachments');
import { DataTypes } from 'sequelize';
import defineAttachment from '../../models/attachments.js';
import defineCaseAttachment from '../../models/caseAttachments.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
module.exports = function (sequelize) {
export default function (sequelize) {
const Attachment = defineAttachment(sequelize, DataTypes);
const CaseAttachment = defineCaseAttachment(sequelize, DataTypes);
@@ -46,6 +49,7 @@ module.exports = function (sequelize) {
const upload = multer({ storage });
// TODO middleware to verify user permission to upload files
router.post('/', upload.array('files', 10), async (req, res) => {
const t = await sequelize.transaction();
try {
@@ -79,4 +83,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineCase = require('../../models/cases');
import { DataTypes } from 'sequelize';
import defineCase from '../../models/cases.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectDeveloperFromProjectId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectDeveloperFromProjectId } = editableMiddleware(sequelize);
const Case = defineCase(sequelize, DataTypes);
router.post('/bulkdelete', verifySignedIn, verifyProjectDeveloperFromProjectId, async (req, res) => {
@@ -24,4 +26,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,13 +1,15 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const Papa = require('papaparse');
const defineCase = require('../../models/cases');
import { DataTypes } from 'sequelize';
import Papa from 'papaparse';
import defineCase from '../../models/cases.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
module.exports = function (sequelize) {
export default function (sequelize) {
const Case = defineCase(sequelize, DataTypes);
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromFolderId } = require('../../middleware/verifyVisible')(sequelize);
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromFolderId } = visibilityMiddleware(sequelize);
router.get('/download', verifySignedIn, verifyProjectVisibleFromFolderId, async (req, res) => {
const { folderId, type } = req.query;
@@ -51,4 +53,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineCase = require('../../models/cases');
import { DataTypes } from 'sequelize';
import defineCase from '../../models/cases.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectDeveloperFromCaseId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectDeveloperFromCaseId } = editableMiddleware(sequelize);
const Case = defineCase(sequelize, DataTypes);
router.put('/:caseId', verifySignedIn, verifyProjectDeveloperFromCaseId, async (req, res) => {
@@ -30,4 +32,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,14 +1,14 @@
import express from 'express';
const router = express.Router();
import { DataTypes, Op } from 'sequelize';
import defineCase from '../../models/cases';
import defineCase from '../../models/cases.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const Case = defineCase(sequelize, DataTypes);
const { verifyProjectVisibleFromFolderId } = visibilityMiddleware(sequelize);
const Case = defineCase(sequelize, DataTypes);
router.get('/', verifySignedIn, verifyProjectVisibleFromFolderId, async (req, res) => {
const { folderId, priority, type, q } = req.query;

View File

@@ -5,7 +5,7 @@ import { Sequelize, Op } from 'sequelize';
import casesIndexRoute from './index';
// mock of authentication middleware
vi.mock('../../middleware/auth', () => ({
vi.mock('../../middleware/auth.js', () => ({
default: () => ({
verifySignedIn: vi.fn((req, res, next) => {
req.userId = 1;
@@ -13,7 +13,7 @@ vi.mock('../../middleware/auth', () => ({
}),
}),
}));
vi.mock('../../middleware/verifyVisible', () => ({
vi.mock('../../middleware/verifyVisible.js', () => ({
default: () => ({
verifyProjectVisibleFromFolderId: vi.fn((req, res, next) => {
next();
@@ -25,7 +25,7 @@ vi.mock('../../middleware/verifyVisible', () => ({
const mockCase = {
findAll: vi.fn(),
};
vi.mock('../../models/cases', () => ({
vi.mock('../../models/cases.js', () => ({
default: () => mockCase,
}));

View File

@@ -1,12 +1,14 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineProject = require('../../models/projects');
const defineFolder = require('../../models/folders');
const defineCase = require('../../models/cases');
const defineRunCase = require('../../models/runCases');
import { DataTypes } from 'sequelize';
import defineProject from '../../models/projects.js';
import defineFolder from '../../models/folders.js';
import defineCase from '../../models/cases.js';
import defineRunCase from '../../models/runCases.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
module.exports = function (sequelize) {
export default function (sequelize) {
const Project = defineProject(sequelize, DataTypes);
const Folder = defineFolder(sequelize, DataTypes);
const Case = defineCase(sequelize, DataTypes);
@@ -17,8 +19,8 @@ module.exports = function (sequelize) {
Case.belongsTo(Folder, { foreignKey: 'folderId' });
Case.hasMany(RunCase, { foreignKey: 'caseId' });
RunCase.belongsTo(Case, { foreignKey: 'caseId' });
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromProjectId } = require('../../middleware/verifyVisible')(sequelize);
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromProjectId } = visibilityMiddleware(sequelize);
router.get('/byproject', verifySignedIn, verifyProjectVisibleFromProjectId, async (req, res) => {
const { projectId } = req.query;
@@ -51,4 +53,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,7 +1,9 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineCase = require('../../models/cases');
import { DataTypes } from 'sequelize';
import defineCase from '../../models/cases.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
const requiredFields = ['title', 'state', 'priority', 'type', 'automationStatus', 'template'];
@@ -13,9 +15,9 @@ function isEmpty(value) {
}
}
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectDeveloperFromFolderId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectDeveloperFromFolderId } = editableMiddleware(sequelize);
const Case = defineCase(sequelize, DataTypes);
router.post('/', verifySignedIn, verifyProjectDeveloperFromFolderId, async (req, res) => {
@@ -56,4 +58,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineCase = require('../../models/cases');
const defineStep = require('../../models/steps');
const defineAttachment = require('../../models/attachments');
import { DataTypes } from 'sequelize';
import defineCase from '../../models/cases.js';
import defineStep from '../../models/steps.js';
import defineAttachment from '../../models/attachments.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
module.exports = function (sequelize) {
export default function (sequelize) {
const Case = defineCase(sequelize, DataTypes);
const Step = defineStep(sequelize, DataTypes);
const Attachment = defineAttachment(sequelize, DataTypes);
@@ -13,8 +15,8 @@ module.exports = function (sequelize) {
Step.belongsToMany(Case, { through: 'caseSteps' });
Case.belongsToMany(Attachment, { through: 'caseAttachments' });
Attachment.belongsToMany(Case, { through: 'caseAttachments' });
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromCaseId } = require('../../middleware/verifyVisible')(sequelize);
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromCaseId } = visibilityMiddleware(sequelize);
router.get('/:caseId', verifySignedIn, verifyProjectVisibleFromCaseId, async (req, res) => {
const caseId = req.params.caseId;
@@ -43,4 +45,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineFolder = require('../../models/folders');
import { DataTypes } from 'sequelize';
import defineFolder from '../../models/folders.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectDeveloperFromFolderId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectDeveloperFromFolderId } = editableMiddleware(sequelize);
const Folder = defineFolder(sequelize, DataTypes);
router.delete('/:folderId', verifySignedIn, verifyProjectDeveloperFromFolderId, async (req, res) => {
@@ -24,4 +26,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineFolder = require('../../models/folders');
import { DataTypes } from 'sequelize';
import defineFolder from '../../models/folders.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectDeveloperFromFolderId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectDeveloperFromFolderId } = editableMiddleware(sequelize);
const Folder = defineFolder(sequelize, DataTypes);
router.put('/:folderId', verifySignedIn, verifyProjectDeveloperFromFolderId, async (req, res) => {
@@ -30,4 +32,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineFolder = require('../../models/folders');
import { DataTypes } from 'sequelize';
import defineFolder from '../../models/folders.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromProjectId } = require('../../middleware/verifyVisible')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromProjectId } = visibilityMiddleware(sequelize);
const Folder = defineFolder(sequelize, DataTypes);
router.get('/', verifySignedIn, verifyProjectVisibleFromProjectId, async (req, res) => {
@@ -29,4 +31,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineFolder = require('../../models/folders');
import { DataTypes } from 'sequelize';
import defineFolder from '../../models/folders.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectDeveloperFromProjectId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectDeveloperFromProjectId } = editableMiddleware(sequelize);
const Folder = defineFolder(sequelize, DataTypes);
router.post('/', verifySignedIn, verifyProjectDeveloperFromProjectId, async (req, res) => {
@@ -31,4 +33,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,10 +1,10 @@
const express = require('express');
import express from 'express';
const router = express.Router();
module.exports = function () {
export default function () {
router.get('/', async (req, res) => {
res.json({ status: 'ok' });
});
return router;
};
}

View File

@@ -1,15 +1,17 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineProject = require('../../models/projects');
const defineFolder = require('../../models/folders');
const defineCase = require('../../models/cases');
const defineRun = require('../../models/runs');
const defineRunCase = require('../../models/runCases');
import { DataTypes } from 'sequelize';
import defineProject from '../../models/projects.js';
import defineFolder from '../../models/folders.js';
import defineCase from '../../models/cases.js';
import defineRun from '../../models/runs.js';
import defineRunCase from '../../models/runCases.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromProjectId } = require('../../middleware/verifyVisible')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromProjectId } = visibilityMiddleware(sequelize);
const Project = defineProject(sequelize, DataTypes);
const Folder = defineFolder(sequelize, DataTypes);
@@ -49,4 +51,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,9 +1,10 @@
const express = require('express');
import express from 'express';
const router = express.Router();
// "/" GET
export default function () {
router.get('/', (req, res) => {
res.send('This is UnitTCMS API server');
});
module.exports = router;
return router;
}

View File

@@ -1,11 +1,12 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineMember = require('../../models/members');
const defineProject = require('../../models/projects');
import { DataTypes } from 'sequelize';
import defineMember from '../../models/members.js';
import defineProject from '../../models/projects.js';
import authMiddleware from '../../middleware/auth.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const Member = defineMember(sequelize, DataTypes);
const Project = defineProject(sequelize, DataTypes);
@@ -45,4 +46,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineMember = require('../../models/members');
import { DataTypes } from 'sequelize';
import defineMember from '../../models/members.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectManagerFromProjectId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectManagerFromProjectId } = editableMiddleware(sequelize);
const Member = defineMember(sequelize, DataTypes);
router.delete('/', verifySignedIn, verifyProjectManagerFromProjectId, async (req, res) => {
@@ -34,4 +36,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineMember = require('../../models/members');
import { DataTypes } from 'sequelize';
import defineMember from '../../models/members.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectManagerFromProjectId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectManagerFromProjectId } = editableMiddleware(sequelize);
const Member = defineMember(sequelize, DataTypes);
router.put('/', verifySignedIn, verifyProjectManagerFromProjectId, async (req, res) => {
@@ -38,4 +40,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,12 +1,14 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineUser = require('../../models/users');
const defineMember = require('../../models/members');
import { DataTypes } from 'sequelize';
import defineUser from '../../models/users.js';
import defineMember from '../../models/members.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromProjectId } = require('../../middleware/verifyVisible')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromProjectId } = visibilityMiddleware(sequelize);
const User = defineUser(sequelize, DataTypes);
const Member = defineMember(sequelize, DataTypes);
Member.belongsTo(User, { foreignKey: 'userId' });
@@ -37,4 +39,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,12 +1,14 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineMember = require('../../models/members');
const { memberRoles } = require('../../routes/users/authSettings');
import { DataTypes } from 'sequelize';
import defineMember from '../../models/members.js';
import { memberRoles } from '../../routes/users/authSettings.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectManagerFromProjectId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectManagerFromProjectId } = editableMiddleware(sequelize);
const Member = defineMember(sequelize, DataTypes);
router.post('/', verifySignedIn, verifyProjectManagerFromProjectId, async (req, res) => {
@@ -41,4 +43,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,13 +1,15 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineProject = require('../../models/projects');
const defineFolder = require('../../models/folders');
const defineRun = require('../../models/runs');
import { DataTypes } from 'sequelize';
import defineProject from '../../models/projects.js';
import defineFolder from '../../models/folders.js';
import defineRun from '../../models/runs.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectOwner } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectOwner } = editableMiddleware(sequelize);
const Project = defineProject(sequelize, DataTypes);
const Folder = defineFolder(sequelize, DataTypes);
const Run = defineRun(sequelize, DataTypes);
@@ -38,4 +40,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineProject = require('../../models/projects');
import { DataTypes } from 'sequelize';
import defineProject from '../../models/projects.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectOwner } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectOwner } = editableMiddleware(sequelize);
const Project = defineProject(sequelize, DataTypes);
router.put('/:projectId', verifySignedIn, verifyProjectOwner, async (req, res) => {
@@ -29,4 +31,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,12 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes, Op } = require('sequelize');
const defineProject = require('../../models/projects');
const defineMember = require('../../models/members');
import { DataTypes, Op } from 'sequelize';
import defineProject from '../../models/projects.js';
import defineMember from '../../models/members.js';
import authMiddleware from '../../middleware/auth.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const Project = defineProject(sequelize, DataTypes);
const Member = defineMember(sequelize, DataTypes);
Project.hasMany(Member, { foreignKey: 'projectId' });
@@ -49,4 +50,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,10 +1,11 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineProject = require('../../models/projects');
import { DataTypes } from 'sequelize';
import defineProject from '../../models/projects.js';
import authMiddleware from '../../middleware/auth.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const Project = defineProject(sequelize, DataTypes);
router.post('/', verifySignedIn, async (req, res) => {
@@ -24,4 +25,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,12 +1,14 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineProject = require('../../models/projects');
const defineFolder = require('../../models/folders');
import { DataTypes } from 'sequelize';
import defineProject from '../../models/projects.js';
import defineFolder from '../../models/folders.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromProjectId } = require('../../middleware/verifyVisible')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromProjectId } = visibilityMiddleware(sequelize);
const Project = defineProject(sequelize, DataTypes);
const Folder = defineFolder(sequelize, DataTypes);
Project.hasMany(Folder, { foreignKey: 'projectId' });
@@ -36,4 +38,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineRunCase = require('../../models/runCases');
import { DataTypes } from 'sequelize';
import defineRunCase from '../../models/runCases.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectReporterFromRunId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectReporterFromRunId } = editableMiddleware(sequelize);
const RunCase = defineRunCase(sequelize, DataTypes);
router.post('/update', verifySignedIn, verifyProjectReporterFromRunId, async (req, res) => {
@@ -71,4 +73,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineRunCase = require('../../models/runCases');
import { DataTypes } from 'sequelize';
import defineRunCase from '../../models/runCases.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromRunId } = require('../../middleware/verifyVisible')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromRunId } = visibilityMiddleware(sequelize);
const RunCase = defineRunCase(sequelize, DataTypes);
router.get('/', verifySignedIn, verifyProjectVisibleFromRunId, async (req, res) => {
@@ -29,4 +31,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineRun = require('../../models/runs');
import { DataTypes } from 'sequelize';
import defineRun from '../../models/runs.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectReporterFromRunId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectReporterFromRunId } = editableMiddleware(sequelize);
const Run = defineRun(sequelize, DataTypes);
router.delete('/:runId', verifySignedIn, verifyProjectReporterFromRunId, async (req, res) => {
@@ -24,4 +26,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,17 +1,18 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const Papa = require('papaparse');
const { create } = require('xmlbuilder2');
import { DataTypes } from 'sequelize';
import Papa from 'papaparse';
import { create } from 'xmlbuilder2';
import defineRun from '../../models/runs.js';
import defineRunCase from '../../models/runCases.js';
import defineCase from '../../models/cases.js';
import defineFolder from '../../models/folders.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
const defineRun = require('../../models/runs');
const defineRunCase = require('../../models/runCases');
const defineCase = require('../../models/cases');
const defineFolder = require('../../models/folders');
module.exports = function (sequelize) {
const { DataTypes } = require('sequelize');
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromRunId } = require('../../middleware/verifyVisible')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromRunId } = visibilityMiddleware(sequelize);
const Run = defineRun(sequelize, DataTypes);
const RunCase = defineRunCase(sequelize, DataTypes);
@@ -123,4 +124,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,12 +1,14 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineRun = require('../../models/runs');
import { DataTypes } from 'sequelize';
import defineRun from '../../models/runs.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
export default function (sequelize) {
const Run = defineRun(sequelize, DataTypes);
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectReporterFromRunId } = require('../../middleware/verifyEditable')(sequelize);
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectReporterFromRunId } = editableMiddleware(sequelize);
router.put('/:runId', verifySignedIn, verifyProjectReporterFromRunId, async (req, res) => {
const runId = req.params.runId;
@@ -27,4 +29,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineRun = require('../../models/runs');
import { DataTypes } from 'sequelize';
import defineRun from '../../models/runs.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromProjectId } = require('../../middleware/verifyVisible')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromProjectId } = visibilityMiddleware(sequelize);
const Run = defineRun(sequelize, DataTypes);
router.get('/', verifySignedIn, verifyProjectVisibleFromProjectId, async (req, res) => {
@@ -29,4 +31,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,13 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineRun = require('../../models/runs');
import { DataTypes } from 'sequelize';
import defineRun from '../../models/runs.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectReporterFromProjectId } = require('../../middleware/verifyEditable')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectReporterFromProjectId } = editableMiddleware(sequelize);
const Run = defineRun(sequelize, DataTypes);
router.post('/', verifySignedIn, verifyProjectReporterFromProjectId, async (req, res) => {
@@ -32,4 +34,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,12 +1,14 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes, literal } = require('sequelize');
const defineRun = require('../../models/runs');
const defineRunCase = require('../../models/runCases');
import { DataTypes, literal } from 'sequelize';
import defineRun from '../../models/runs.js';
import defineRunCase from '../../models/runCases.js';
import authMiddleware from '../../middleware/auth.js';
import visibilityMiddleware from '../../middleware/verifyVisible.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectVisibleFromRunId } = require('../../middleware/verifyVisible')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectVisibleFromRunId } = visibilityMiddleware(sequelize);
const Run = defineRun(sequelize, DataTypes);
const RunCase = defineRunCase(sequelize, DataTypes);
@@ -40,4 +42,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,14 +1,16 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineStep = require('../../models/steps');
const defineCaseStep = require('../../models/caseSteps');
import { DataTypes } from 'sequelize';
import defineStep from '../../models/steps.js';
import defineCaseStep from '../../models/caseSteps.js';
import authMiddleware from '../../middleware/auth.js';
import editableMiddleware from '../../middleware/verifyEditable.js';
module.exports = function (sequelize) {
export default function (sequelize) {
const Step = defineStep(sequelize, DataTypes);
const CaseStep = defineCaseStep(sequelize, DataTypes);
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
const { verifyProjectDeveloperFromCaseId } = require('../../middleware/verifyEditable')(sequelize);
const { verifySignedIn } = authMiddleware(sequelize);
const { verifyProjectDeveloperFromCaseId } = editableMiddleware(sequelize);
router.post('/update', verifySignedIn, verifyProjectDeveloperFromCaseId, async (req, res) => {
const caseId = req.query.caseId;
@@ -87,4 +89,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -2,4 +2,4 @@ const roles = [{ uid: 'administrator' }, { uid: 'user' }];
const memberRoles = [{ uid: 'manager' }, { uid: 'developer' }, { uid: 'reporter' }];
const defaultDangerKey = 'test-plat-default-key';
module.exports = { roles, memberRoles, defaultDangerKey };
export { roles, memberRoles, defaultDangerKey };

View File

@@ -1,10 +1,11 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineUser = require('../../models/users');
import { DataTypes } from 'sequelize';
import defineUser from '../../models/users.js';
import authMiddleware from '../../middleware/auth.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const User = defineUser(sequelize, DataTypes);
router.get('/find/:userId', verifySignedIn, async (req, res) => {
@@ -33,4 +34,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,10 +1,11 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const defineUser = require('../../models/users');
import { DataTypes } from 'sequelize';
import defineUser from '../../models/users.js';
import authMiddleware from '../../middleware/auth.js';
module.exports = function (sequelize) {
const { verifySignedIn, verifyAdmin } = require('../../middleware/auth')(sequelize);
export default function (sequelize) {
const { verifySignedIn, verifyAdmin } = authMiddleware(sequelize);
const User = defineUser(sequelize, DataTypes);
router.get('/', verifySignedIn, verifyAdmin, async (req, res) => {
@@ -20,4 +21,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,11 +1,12 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes, Op } = require('sequelize');
const defineUser = require('../../models/users');
const defineMember = require('../../models/members');
import { DataTypes, Op } from 'sequelize';
import defineUser from '../../models/users.js';
import defineMember from '../../models/members.js';
import authMiddleware from '../../middleware/auth.js';
module.exports = function (sequelize) {
const { verifySignedIn } = require('../../middleware/auth')(sequelize);
export default function (sequelize) {
const { verifySignedIn } = authMiddleware(sequelize);
const User = defineUser(sequelize, DataTypes);
const Member = defineMember(sequelize, DataTypes);
@@ -42,4 +43,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,12 +1,12 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const defineUser = require('../../models/users');
const { defaultDangerKey } = require('./authSettings');
import { DataTypes } from 'sequelize';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';
import defineUser from '../../models/users.js';
import { defaultDangerKey } from './authSettings.js';
module.exports = function (sequelize) {
export default function (sequelize) {
const User = defineUser(sequelize, DataTypes);
const secretKey = process.env.SECRET_KEY || defaultDangerKey;
@@ -39,4 +39,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -1,12 +1,12 @@
const express = require('express');
import express from 'express';
const router = express.Router();
const { DataTypes } = require('sequelize');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const defineUser = require('../../models/users');
const { roles, defaultDangerKey } = require('./authSettings');
import { DataTypes } from 'sequelize';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';
import defineUser from '../../models/users.js';
import { roles, defaultDangerKey } from './authSettings.js';
module.exports = function (sequelize) {
export default function (sequelize) {
const User = defineUser(sequelize, DataTypes);
const secretKey = process.env.SECRET_KEY || defaultDangerKey;
@@ -42,4 +42,4 @@ module.exports = function (sequelize) {
});
return router;
};
}

View File

@@ -3,13 +3,13 @@ import request from 'supertest';
import express from 'express';
import { Sequelize } from 'sequelize';
import updateRoute from './update';
import { roles } from './authSettings';
import { roles } from './authSettings.js';
const adminRoleIndex = roles.findIndex((entry) => entry.uid === 'administrator');
const userRoleIndex = roles.findIndex((entry) => entry.uid === 'user');
// mock of authentication middleware
vi.mock('../../middleware/auth', () => ({
vi.mock('../../middleware/auth.js', () => ({
default: () => ({
verifySignedIn: vi.fn((req, res, next) => {
req.userId = 1; // Mock user ID
@@ -27,7 +27,7 @@ const mockUser = {
count: vi.fn(),
update: vi.fn(),
};
vi.mock('../../models/users', () => ({
vi.mock('../../models/users.js', () => ({
default: () => mockUser,
}));

View File

@@ -1,9 +1,7 @@
'use strict';
const fs = require('fs');
const bcrypt = require('bcrypt');
import fs from 'fs';
import bcrypt from 'bcrypt';
module.exports = {
up: async (queryInterface) => {
export async function up(queryInterface) {
const hashedPassword = await bcrypt.hash('password', 10);
// Add projects table records
@@ -575,15 +573,11 @@ module.exports = {
if (!fs.existsSync(uploadsFolderPath)) {
fs.mkdirSync(uploadsFolderPath, { recursive: true });
}
fs.copyFile(
`${sampleFolderPath}/${SeleniumLogoFileName}`,
`${uploadsFolderPath}/${SeleniumLogoFileName}`,
(err) => {
fs.copyFile(`${sampleFolderPath}/${SeleniumLogoFileName}`, `${uploadsFolderPath}/${SeleniumLogoFileName}`, (err) => {
if (err) {
console.log(err);
}
}
);
});
fs.copyFile(`${sampleFolderPath}/${vitestLogoFileName}`, `${uploadsFolderPath}/${vitestLogoFileName}`, (err) => {
if (err) {
console.log(err);
@@ -694,9 +688,8 @@ module.exports = {
updatedAt: new Date(),
},
]);
},
}
down: async () => {
export async function down() {
// do nothing
},
};
}

View File

@@ -1,11 +1,12 @@
const path = require('path');
const express = require('express');
const RateLimit = require('express-rate-limit');
const { Sequelize } = require('sequelize');
import path from 'path';
import express from 'express';
import cors from 'cors';
import RateLimit from 'express-rate-limit';
import { Sequelize } from 'sequelize';
const __dirname = path.dirname(new URL(import.meta.url).pathname);
const app = express();
// enable frontend access
const cors = require('cors');
const frontendOrigin = process.env.FRONTEND_ORIGIN || 'http://localhost:8000';
const corsOptions = {
origin: frontendOrigin,
@@ -36,116 +37,113 @@ const sequelize = new Sequelize({
});
// "/"
const indexRoute = require('./routes/index');
app.use('/', indexRoute);
import indexRoute from './routes/index.js';
app.use('/', indexRoute());
// "/health"
const healthIndexRoute = require('./routes/health/index')();
app.use('/health', healthIndexRoute);
import healthIndexRoute from './routes/health/index.js';
app.use('/health', healthIndexRoute());
// "users"
const usersIndexRoute = require('./routes/users/index')(sequelize);
const usersFindRoute = require('./routes/users/find')(sequelize);
const usersSearchRoute = require('./routes/users/search')(sequelize);
const signUpRoute = require('./routes/users/signup')(sequelize);
const signInRoute = require('./routes/users/signin')(sequelize);
app.use('/users', usersIndexRoute);
app.use('/users', usersFindRoute);
app.use('/users', usersSearchRoute);
app.use('/users', signUpRoute);
app.use('/users', signInRoute);
// ESM import
(async () => {
const updateRoute = await import('./routes/users/update.mjs');
app.use('/users', updateRoute.default(sequelize));
})();
import usersIndexRoute from './routes/users/index.js';
import usersFindRoute from './routes/users/find.js';
import usersSearchRoute from './routes/users/search.js';
import usersUpdateRoute from './routes/users/update.js';
import signUpRoute from './routes/users/signup.js';
import signInRoute from './routes/users/signin.js';
app.use('/users', usersIndexRoute(sequelize));
app.use('/users', usersFindRoute(sequelize));
app.use('/users', usersSearchRoute(sequelize));
app.use('/users', usersUpdateRoute(sequelize));
app.use('/users', signUpRoute(sequelize));
app.use('/users', signInRoute(sequelize));
// "/projects"
const projectsIndexRoute = require('./routes/projects/index')(sequelize);
const projectsShowRoute = require('./routes/projects/show')(sequelize);
const projectsNewRoute = require('./routes/projects/new')(sequelize);
const projectsEditRoute = require('./routes/projects/edit')(sequelize);
const projectsDeleteRoute = require('./routes/projects/delete')(sequelize);
app.use('/projects', projectsIndexRoute);
app.use('/projects', projectsShowRoute);
app.use('/projects', projectsNewRoute);
app.use('/projects', projectsEditRoute);
app.use('/projects', projectsDeleteRoute);
import projectsIndexRoute from './routes/projects/index.js';
import projectsShowRoute from './routes/projects/show.js';
import projectsNewRoute from './routes/projects/new.js';
import projectsEditRoute from './routes/projects/edit.js';
import projectsDeleteRoute from './routes/projects/delete.js';
app.use('/projects', projectsIndexRoute(sequelize));
app.use('/projects', projectsShowRoute(sequelize));
app.use('/projects', projectsNewRoute(sequelize));
app.use('/projects', projectsEditRoute(sequelize));
app.use('/projects', projectsDeleteRoute(sequelize));
// "/folders"
const foldersIndexRoute = require('./routes/folders/index')(sequelize);
const foldersNewRoute = require('./routes/folders/new')(sequelize);
const foldersEditRoute = require('./routes/folders/edit')(sequelize);
const foldersDeleteRoute = require('./routes/folders/delete')(sequelize);
app.use('/folders', foldersIndexRoute);
app.use('/folders', foldersNewRoute);
app.use('/folders', foldersEditRoute);
app.use('/folders', foldersDeleteRoute);
import foldersIndexRoute from './routes/folders/index.js';
import foldersNewRoute from './routes/folders/new.js';
import foldersEditRoute from './routes/folders/edit.js';
import foldersDeleteRoute from './routes/folders/delete.js';
app.use('/folders', foldersIndexRoute(sequelize));
app.use('/folders', foldersNewRoute(sequelize));
app.use('/folders', foldersEditRoute(sequelize));
app.use('/folders', foldersDeleteRoute(sequelize));
// "/cases"
// "/cases"
const casesDownloadRoute = require('./routes/cases/download')(sequelize);
const casesIndexRoute = require('./routes/cases/index')(sequelize);
const casesIndexByProjectIdRoute = require('./routes/cases/indexByProjectId')(sequelize);
const casesShowRoute = require('./routes/cases/show')(sequelize);
const casesNewRoute = require('./routes/cases/new')(sequelize);
const casesEditRoute = require('./routes/cases/edit')(sequelize);
const casesDeleteRoute = require('./routes/cases/delete')(sequelize);
app.use('/cases', casesDownloadRoute);
app.use('/cases', casesIndexRoute);
app.use('/cases', casesIndexByProjectIdRoute);
app.use('/cases', casesShowRoute);
app.use('/cases', casesNewRoute);
app.use('/cases', casesEditRoute);
app.use('/cases', casesDeleteRoute);
import casesDownloadRoute from './routes/cases/download.js';
import casesIndexRoute from './routes/cases/index.js';
import casesIndexByProjectIdRoute from './routes/cases/indexByProjectId.js';
import casesShowRoute from './routes/cases/show.js';
import casesNewRoute from './routes/cases/new.js';
import casesEditRoute from './routes/cases/edit.js';
import casesDeleteRoute from './routes/cases/delete.js';
app.use('/cases', casesDownloadRoute(sequelize));
app.use('/cases', casesIndexRoute(sequelize));
app.use('/cases', casesIndexByProjectIdRoute(sequelize));
app.use('/cases', casesShowRoute(sequelize));
app.use('/cases', casesNewRoute(sequelize));
app.use('/cases', casesEditRoute(sequelize));
app.use('/cases', casesDeleteRoute(sequelize));
// "/steps"
const stepsEditRoute = require('./routes/steps/edit')(sequelize);
app.use('/steps', stepsEditRoute);
import stepsEditRoute from './routes/steps/edit.js';
app.use('/steps', stepsEditRoute(sequelize));
// "/attachments"
const attachmentsNewRoute = require('./routes/attachments/new')(sequelize);
const attachmentsDeleteRoute = require('./routes/attachments/delete')(sequelize);
const attachmentsDownloadRoute = require('./routes/attachments/download')(sequelize);
app.use('/attachments', attachmentsNewRoute);
app.use('/attachments', attachmentsDeleteRoute);
app.use('/attachments', attachmentsDownloadRoute);
import attachmentsNewRoute from './routes/attachments/new.js';
import attachmentsDeleteRoute from './routes/attachments/delete.js';
import attachmentsDownloadRoute from './routes/attachments/download.js';
app.use('/attachments', attachmentsNewRoute(sequelize));
app.use('/attachments', attachmentsDeleteRoute(sequelize));
app.use('/attachments', attachmentsDownloadRoute(sequelize));
// "/runs"
const runsDownloadRoute = require('./routes/runs/download')(sequelize);
const runsIndexRoute = require('./routes/runs/index')(sequelize);
const runsShowRoute = require('./routes/runs/show')(sequelize);
const runsNewRoute = require('./routes/runs/new')(sequelize);
const runsEditRoute = require('./routes/runs/edit')(sequelize);
const runDeleteRoute = require('./routes/runs/delete')(sequelize);
app.use('/runs', runsDownloadRoute);
app.use('/runs', runsIndexRoute);
app.use('/runs', runsShowRoute);
app.use('/runs', runsNewRoute);
app.use('/runs', runsEditRoute);
app.use('/runs', runDeleteRoute);
import runsDownloadRoute from './routes/runs/download.js';
import runsIndexRoute from './routes/runs/index.js';
import runsShowRoute from './routes/runs/show.js';
import runsNewRoute from './routes/runs/new.js';
import runsEditRoute from './routes/runs/edit.js';
import runDeleteRoute from './routes/runs/delete.js';
app.use('/runs', runsDownloadRoute(sequelize));
app.use('/runs', runsIndexRoute(sequelize));
app.use('/runs', runsShowRoute(sequelize));
app.use('/runs', runsNewRoute(sequelize));
app.use('/runs', runsEditRoute(sequelize));
app.use('/runs', runDeleteRoute(sequelize));
// "/runcases"
const runCaseIndexRoute = require('./routes/runcases/index')(sequelize);
const runCaseEditRoute = require('./routes/runcases/edit')(sequelize);
app.use('/runcases', runCaseIndexRoute);
app.use('/runcases', runCaseEditRoute);
import runCaseIndexRoute from './routes/runcases/index.js';
import runCaseEditRoute from './routes/runcases/edit.js';
app.use('/runcases', runCaseIndexRoute(sequelize));
app.use('/runcases', runCaseEditRoute(sequelize));
// "/members"
const membersIndexRoute = require('./routes/members/index')(sequelize);
const membersNewRoute = require('./routes/members/new')(sequelize);
const membersEditRoute = require('./routes/members/edit')(sequelize);
const membersDeleteRoute = require('./routes/members/delete')(sequelize);
const membersCheckRoute = require('./routes/members/check')(sequelize);
app.use('/members', membersIndexRoute);
app.use('/members', membersNewRoute);
app.use('/members', membersEditRoute);
app.use('/members', membersDeleteRoute);
app.use('/members', membersCheckRoute);
import membersIndexRoute from './routes/members/index.js';
import membersNewRoute from './routes/members/new.js';
import membersEditRoute from './routes/members/edit.js';
import membersDeleteRoute from './routes/members/delete.js';
import membersCheckRoute from './routes/members/check.js';
app.use('/members', membersIndexRoute(sequelize));
app.use('/members', membersNewRoute(sequelize));
app.use('/members', membersEditRoute(sequelize));
app.use('/members', membersDeleteRoute(sequelize));
app.use('/members', membersCheckRoute(sequelize));
// "/home"
const homeIndexRoute = require('./routes/home/index')(sequelize);
app.use('/home', homeIndexRoute);
import homeIndexRoute from './routes/home/index.js';
app.use('/home', homeIndexRoute(sequelize));
if (!process.env.SECRET_KEY) {
console.log(
@@ -154,4 +152,4 @@ if (!process.env.SECRET_KEY) {
}
// Export the app instead of starting the server
module.exports = app;
export default app;

View File

@@ -1,9 +1,15 @@
import { createServer as createHttpServer } from 'http';
import path from 'path';
import fs from 'fs';
import { execSync } from 'child_process';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Use express from backend node_modules
const { createServer: createHttpServer } = require('http');
const path = require('path');
const fs = require('fs');
const { execSync } = require('child_process');
const express = require('./backend/node_modules/express');
import expressModule from './backend/node_modules/express/index.js';
const express = expressModule.default || expressModule;
async function runMigrations() {
try {
@@ -13,9 +19,7 @@ async function runMigrations() {
cwd: path.join(__dirname, 'backend'),
stdio: 'inherit',
});
console.log('Database migrations completed successfully.');
if (process.env.IS_DEMO === 'true' || process.env.IS_DEMO === '1') {
console.log('Demo mode detected. Seeding the database...');
execSync('npx sequelize-cli db:seed:all', {
@@ -30,15 +34,14 @@ async function runMigrations() {
}
}
function startServer() {
async function startServer() {
try {
const server = express();
const httpServer = createHttpServer(server);
// Import the backend app
const backendApp = require('./backend/server');
// Use the backend app for /api routes
const backendAppModule = await import('./backend/server.js');
const backendApp = backendAppModule.default || backendAppModule;
server.use('/api', backendApp);
// For Next.js standalone build
@@ -46,21 +49,18 @@ function startServer() {
const nextServerPath = './node_modules/next/dist/server/next.js';
if (fs.existsSync(nextServerPath)) {
// Import Next.js
const next = require(nextServerPath);
const nextModule = await import(nextServerPath);
const next = nextModule.default || nextModule;
// Initialize Next.js app
const dev = process.env.NODE_ENV !== 'production';
const nextApp = next({ dev, dir: path.join(__dirname, '.') });
const handle = nextApp.getRequestHandler();
// Prepare Next.js
nextApp.prepare().then(() => {
await nextApp.prepare();
console.log('nextjs prepared');
// Use Next.js to handle all other routes
server.all('*', (req, res) => {
return handle(req, res);
});
});
server.all('*', (req, res) => handle(req, res));
} else {
console.error('Next.js module not found at:', nextServerPath);
server.all('*', (req, res) => {
@@ -79,9 +79,11 @@ function startServer() {
}
}
runMigrations().then(() => {
runMigrations()
.then(() => {
startServer();
}).catch(error => {
})
.catch((error) => {
console.error('Failed to start application:', error);
process.exit(1);
});

View File

@@ -2,6 +2,7 @@
"name": "unittcms",
"version": "1.0.0",
"private": true,
"type": "module",
"scripts": {
"format:check": "prettier --check frontend/**/*.{js,ts,jsx,tsx,json} backend/**/*.{js,ts,json}",
"format": "prettier --write frontend/**/*.{js,ts,jsx,tsx,json} backend/**/*.{js,ts,json}",