Skip to content
Merged
Show file tree
Hide file tree
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
1 change: 1 addition & 0 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,4 @@
- 2026-10-01 scripts/demi-repush.js:62: `--since` misses projects changed by PUT.
- 2026-10-01 api/materialized_views/reports/documentTaggingProgressByProject.js:156: report views still read the root `$name` (also projectStatsFull.js:19, projectsWithCompletelyTaggedDocs.js:12 and 150, whoPublishedUnpublishedAllUsers.js:112).
- 2026-09-25: no test covers the `pushClient.logUnsent()` call in `app.js` `shutdown()`. Needs an `app.js` change first: `exports.shutdown` at `app.js:246` is unreachable because `module.exports = app` replaces the exports object.
- 2026-10-13 eagle-api: remove the jobs feature: Agenda queue (api/helpers/jobQueue.js, startJobQueue app.js:194), GET /jobs routes, project-doc-export handler, job.js CSV code. Nothing queues a job since #945; the queue polls Mongo every 5 s per pod. Delete wiki Async-Jobs.md too
140 changes: 0 additions & 140 deletions api/controllers/cac.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,60 +8,6 @@ exports.protectedOptions = function (args, res) {
res.status(200).send();
};

exports.protectedPublishCAC = async function (args, res) {
var projId = args.swagger.params.projId.value;
defaultLog.info('protectedPublishCAC for project:', projId);
if (!mongoose.Types.ObjectId.isValid(projId)) {
return Actions.sendResponse(res, 400, {});
}
var Project = mongoose.model('Project');
try {
var project = await Project.findOne({ _id: projId });
if (project) {
var published = await Project.updateOne(
{ _id: new mongoose.Types.ObjectId(projId) },
{ $set: { 'projectCACPublished': true } }
);
Utils.recordAction('Publish', 'CAC', args.swagger.params.auth_payload.preferred_username, projId);
defaultLog.info('Published CAC for project:', projId);
return Actions.sendResponse(res, 200, published);
} else {
defaultLog.info('Project not found:', projId);
return Actions.sendResponse(res, 404, {});
}
} catch (e) {
defaultLog.error(`Error publishing CAC for project: ${projId}: ${e.message}`);
return Actions.sendResponse(res, 400, e);
}
};

exports.protectedUnPublishCAC = async function (args, res) {
var projId = args.swagger.params.projId.value;
defaultLog.info('protectedUnPublishCAC for project:', projId);
if (!mongoose.Types.ObjectId.isValid(projId)) {
return Actions.sendResponse(res, 400, {});
}
var Project = mongoose.model('Project');
try {
var project = await Project.findOne({ _id: projId });
if (project) {
var updated = await Project.updateOne(
{ _id: new mongoose.Types.ObjectId(projId) },
{ $set: { 'projectCACPublished': false } }
);
Utils.recordAction('Unpublish', 'CAC', args.swagger.params.auth_payload.preferred_username, projId);
defaultLog.info('Unpublished CAC for project:', projId);
return Actions.sendResponse(res, 200, updated);
} else {
defaultLog.info('Project not found:', projId);
return Actions.sendResponse(res, 404, {});
}
} catch (e) {
defaultLog.error(`Error unpublishing CAC for project: ${projId}: ${e.message}`);
return Actions.sendResponse(res, 400, e);
}
};

exports.publicCACSignUp = async function (args, res) {
const CACUser = mongoose.model('CACUser');
const Project = mongoose.model('Project');
Expand Down Expand Up @@ -150,89 +96,3 @@ exports.publicCACRemoveMember = async function (args, res) {
return Actions.sendResponse(res, 400, e);
}
};

exports.protectedCACRemoveMember = async function (args, res) {
const projId = args.swagger.params.projId.value;
defaultLog.info('protectedCACRemoveMember for project:', projId);
if (!mongoose.Types.ObjectId.isValid(projId)) {
return Actions.sendResponse(res, 400, {});
}
const member = args.swagger.params.member.value;

const Project = mongoose.model('Project');
const CACUser = mongoose.model('CACUser');
try {
var projectData = await Project.updateOne(
{ _id: new mongoose.Types.ObjectId(projId) },
{ $pull: { cacMembers: { $in: [new mongoose.Types.ObjectId(member._id)] } } }
);
await CACUser.deleteOne({ _id: new mongoose.Types.ObjectId(member._id) });

Utils.recordAction('Delete', 'CACMemberFromProject', args.swagger.params.auth_payload.preferred_username, member._id);
defaultLog.info('Removed CAC member:', member._id, 'from project:', projId);
return Actions.sendResponse(res, 200, projectData);
} catch (e) {
defaultLog.error(`Error removing CAC member: ${member._id} from project: ${projId}: ${e.message}`);
return Actions.sendResponse(res, 400, e);
}
};

exports.protectedCreateCAC = async function (args, res) {
const projId = args.swagger.params.projId.value;
defaultLog.info('protectedCreateCAC for project:', projId);
if (!mongoose.Types.ObjectId.isValid(projId)) {
return Actions.sendResponse(res, 400, {});
}
const cacData = args.swagger.params.data.value;
const Project = mongoose.model('Project');

try {
let data = await Project.updateOne(
{ _id: new mongoose.Types.ObjectId(projId) },
{ projectCAC: true, cacEmail: cacData.cacEmail, projectCACPublished: false }
);
if (data.modifiedCount === 0) {
defaultLog.info('No project found to update for CAC creation:', projId);
return Actions.sendResponse(res, 400, {});
}
Utils.recordAction('Post', 'Add Project CAC', args.swagger.params.auth_payload.preferred_username, projId);
defaultLog.info('Created CAC for project:', projId);
return Actions.sendResponse(res, 201, data);
} catch (e) {
defaultLog.error(`Error creating CAC for project: ${projId}: ${e.message}`);
return Actions.sendResponse(res, 400, e);
}
};

exports.protectedCACDelete = async function (args, res) {
const projId = args.swagger.params.projId.value;
defaultLog.info('protectedCACDelete for project:', projId);
if (!mongoose.Types.ObjectId.isValid(projId)) {
return Actions.sendResponse(res, 400, {});
}
const Project = mongoose.model('Project');
const CACUser = mongoose.model('CACUser');
try {
const proj = await Project.findOne({ _id: new mongoose.Types.ObjectId(projId) });
if (!proj) {
defaultLog.info('Project not found for CAC delete:', projId);
return Actions.sendResponse(res, 404, {});
}
await CACUser.deleteMany({ _id: { $in: proj.cacMembers } });

const data = await Project.updateOne(
{ _id: new mongoose.Types.ObjectId(projId) },
{ projectCAC: false, cacMembers: [] }
);
if (data.modifiedCount === 0) {
defaultLog.info('No project found to update for CAC delete:', projId);
return Actions.sendResponse(res, 400, {});
}
Utils.recordAction('Post', 'Remove Project CAC', args.swagger.params.auth_payload.preferred_username, projId);
defaultLog.info('Deleted CAC for project:', projId);
return Actions.sendResponse(res, 200, data);
} catch (e) {
defaultLog.error(`Error deleting CAC for project: ${projId}: ${e.message}`);
return Actions.sendResponse(res, 400, e);
}
};
Loading
Loading