Skip to content

Commit

Permalink
feat: specify columns for api responses
Browse files Browse the repository at this point in the history
  • Loading branch information
mkeen committed Jan 7, 2022
1 parent 5913078 commit 3fd8268
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 39 deletions.
58 changes: 24 additions & 34 deletions src/controllers/project.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
} from '../models';

import { optionallyPaginatedResponse, paginationParams } from './helpers';
import ModelTypes from './../models/projects/projects.modeltypes.cjs';

export const create = async (req, res) => {
// When creating new projects assign a uuid to is so
Expand All @@ -32,68 +33,57 @@ export const create = async (req, res) => {
};

export const findAll = async (req, res) => {
const { page, limit, search, orgUid, onlyEssentialColumns, useMock } =
const { page, limit, search, orgUid, columns, useMock } =
req.query;

if (useMock) {
res.json(ProjectMock.findAll({ ...paginationParams(page, limit) }));
return;
}

const defaultColumns = Object.keys(ModelTypes);

let columnsList = [];
if (columns) {
columnsList = columns.split(',');
// Check to ensure passed in columns are valid
if (columnsList.filter(col => defaultColumns.includes(col)).length !== columnsList.length) {
console.error('Invalid column specified');
res.status(400).send('Invalid column specified');
return;
}

} else {
columnsList = defaultColumns;
}

const dialect = sequelize.getDialect();

let results;

if (search) {
const supportedSearchFields = columnsList.filter(col => !['createdAt', 'updatedAt'].includes(col))

if (dialect === 'sqlite') {
results = await Project.findAllSqliteFts(
search,
orgUid,
paginationParams(page, limit),
supportedSearchFields,
);
} else if (dialect === 'mysql') {
results = await Project.findAllMySQLFts(
search,
orgUid,
paginationParams(page, limit),
supportedSearchFields,
);
}
return res.json(optionallyPaginatedResponse(results, page, limit));
}

if (onlyEssentialColumns) {
const query = {
attributes: [
'orgUid',
'warehouseProjectId',
'currentRegistry',
'registryOfOrigin',
'projectLink',
'projectStatus',
'projectTag',
],
};

if (orgUid) {
query.where = {
orgUid,
};
}

return res.json(
optionallyPaginatedResponse(
await Project.findAndCountAll({
distinct: true,
...query,
...paginationParams(page, limit),
}),
page,
limit,
),
);
}


const query = {
attributes: columnsList,
include: [
ProjectLocation,
Qualification,
Expand Down
21 changes: 16 additions & 5 deletions src/models/projects/projects.model.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,16 @@ class Project extends Model {
return destroyResult;
}

static async findAllMySQLFts(searchStr, orgUid, pagination) {
static async findAllMySQLFts(searchStr, orgUid, pagination, columns = []) {
const { offset, limit } = pagination;

let fields = '*';
if (columns.length) {
fields = columns.join(', ');
}

let sql = `
SELECT * FROM projects WHERE MATCH (
SELECT ${fields} FROM projects WHERE MATCH (
warehouseProjectId,
currentRegistry,
registryOfOrigin,
Expand Down Expand Up @@ -103,12 +109,17 @@ class Project extends Model {
};
}

static async findAllSqliteFts(searchStr, orgUid, pagination) {
static async findAllSqliteFts(searchStr, orgUid, pagination, columns = []) {
const { offset, limit } = pagination;


let fields = '*';
if (columns.length) {
fields = columns.join(', ');
}

searchStr = searchStr = searchStr.replaceAll('-', '+');

let sql = `SELECT * FROM projects_fts WHERE projects_fts MATCH :search`;
let sql = `SELECT ${fields} FROM projects_fts WHERE projects_fts MATCH :search`;

if (orgUid) {
sql = `${sql} AND orgUid = :orgUid`;
Expand Down
1 change: 1 addition & 0 deletions src/routes/v1/resources/projects.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const querySchema = Joi.object()
page: Joi.number(),
limit: Joi.number(),
search: Joi.string(),
columns: Joi.string(),
})
.with('page', 'limit');

Expand Down

0 comments on commit 3fd8268

Please sign in to comment.