Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 24 additions & 11 deletions src/models/project.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,40 +93,49 @@ module.exports = function defineProject(sequelize, DataTypes) {
searchText(parameters, log) {
// special handling for keyword filter
let query = '1=1 ';
const replacements = {};
if (_.has(parameters.filters, 'id')) {
if (_.isObject(parameters.filters.id)) {
if (parameters.filters.id.$in.length === 0) {
parameters.filters.id.$in.push(-1);
}
query += `AND projects.id IN (${parameters.filters.id.$in}) `;
query += 'AND projects.id IN(:id) ';
replacements.id = parameters.filters.id.$in;
} else if (_.isString(parameters.filters.id) || _.isNumber(parameters.filters.id)) {
query += `AND id = ${parameters.filters.id} `;
query += 'AND id = :id ';
replacements.id = parameters.filters.id;
}
}
if (_.has(parameters.filters, 'status')) {
const statusFilter = parameters.filters.status;
if (_.isObject(statusFilter)) {
const statuses = statusFilter.$in.join("','");
query += `AND projects.status IN ('${statuses}') `;
query += 'AND projects.status IN (:status) ';
replacements.status = statusFilter.$in;
} else if (_.isString(statusFilter)) {
query += `AND projects.status ='${statusFilter}'`;
query += 'AND projects.status = :status';
replacements.status = statusFilter;
}
}
if (_.has(parameters.filters, 'type')) {
query += `AND projects.type = '${parameters.filters.type}' `;
query += 'AND projects.type = :type ';
replacements.type = parameters.filters.type;
}
if (_.has(parameters.filters, 'keyword')) {
query += `AND projects."projectFullText" ~ lower('${parameters.filters.keyword}')`;
query += 'AND projects."projectFullText" ~ lower(:keyword)';
replacements.keyword = parameters.filters.keyword;
}

let joinQuery = '';
if (_.has(parameters.filters, 'userId') || _.has(parameters.filters, 'email')) {
query += ` AND (members."userId" = ${parameters.filters.userId}
OR invites."userId" = ${parameters.filters.userId}
OR invites."email" = '${parameters.filters.email}') GROUP BY projects.id`;
query += ` AND (members."userId" = :userId
OR invites."userId" = :userId
OR invites."email" = :email) GROUP BY projects.id`;

joinQuery = `LEFT OUTER JOIN project_members AS members ON projects.id = members."projectId"
LEFT OUTER JOIN project_member_invites AS invites ON projects.id = invites."projectId"`;

replacements.userId = parameters.filters.userId;
replacements.email = parameters.filters.email;
}

let attributesStr = _.map(parameters.attributes, attr => `projects."${attr}"`);
Expand All @@ -138,6 +147,7 @@ module.exports = function defineProject(sequelize, DataTypes) {
${joinQuery}
WHERE ${query}`,
{ type: sequelize.QueryTypes.SELECT,
replacements,
logging: (str) => { log.debug(str); },
raw: true,
})
Expand All @@ -147,12 +157,15 @@ module.exports = function defineProject(sequelize, DataTypes) {
count = fcount[0].count;
}

replacements.limit = parameters.limit;
replacements.offset = parameters.offset;
// select project attributes
return sequelize.query(`SELECT ${attributesStr} FROM projects AS projects
${joinQuery}
WHERE ${query} ORDER BY ` +
` projects.${orderStr} LIMIT ${parameters.limit} OFFSET ${parameters.offset}`,
` projects.${orderStr} LIMIT :limit OFFSET :offset`,
{ type: sequelize.QueryTypes.SELECT,
replacements,
logging: (str) => { log.debug(str); },
raw: true,
})
Expand Down