diff --git a/package.json b/package.json index 6cb644d..8599a54 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ ], "license": "MIT", "dependencies": { - "axios": "^1.6.8", + "axios": "^1.7.2", "bcryptjs": "^2.4.3", "cors": "^2.8.5", "express": "^4.19.2", @@ -49,10 +49,10 @@ "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", "moment": "^2.30.1", - "mongodb": "^6.6.2", + "mongodb": "^6.7.0", "mongoose": "^8.4.0", "pino": "^9.1.0", - "pino-pretty": "^11.0.0", + "pino-pretty": "^11.1.0", "swagger-ui-express": "^5.0.0", "switcher-client": "^4.1.0", "validator": "^13.12.0" @@ -63,7 +63,7 @@ "jest": "^29.7.0", "jest-sonar-reporter": "^2.0.0", "node-notifier": "^10.0.1", - "nodemon": "^3.1.0", + "nodemon": "^3.1.2", "sinon": "^18.0.0", "supertest": "^7.0.0" }, diff --git a/src/api-docs/schemas/slack.js b/src/api-docs/schemas/slack.js index c5d8eac..ad19481 100644 --- a/src/api-docs/schemas/slack.js +++ b/src/api-docs/schemas/slack.js @@ -1,8 +1,10 @@ -import { TicketStatusType } from '../../models/slack_ticket.js'; - const ticket = { type: 'object', properties: { + slack: { + type: 'string', + description: 'The Slack ID' + }, environment: { type: 'string', description: 'The environment' @@ -23,11 +25,6 @@ const ticket = { type: 'string', description: 'The ticket observations' }, - ticket_status: { - type: 'string', - enum: Object.values(TicketStatusType), - default: TicketStatusType.OPENED - }, date_closed: { type: 'string', description: 'The date closed' @@ -187,10 +184,6 @@ const slack = { } } }, - tickets: { - type: 'array', - items: ticket - }, createdAt: { type: 'string', description: 'The date and time the Slack was created', diff --git a/src/models/slack.js b/src/models/slack.js index a0d6d3e..caaf698 100644 --- a/src/models/slack.js +++ b/src/models/slack.js @@ -1,6 +1,6 @@ import mongoose from 'mongoose'; import moment from 'moment'; -import { SlackTicket } from './slack_ticket'; +import { SlackTicket } from './slack_ticket.js'; const slackSchema = new mongoose.Schema({ user_id: { diff --git a/src/models/slack_ticket.js b/src/models/slack_ticket.js index c728c0f..81ae70e 100644 --- a/src/models/slack_ticket.js +++ b/src/models/slack_ticket.js @@ -2,11 +2,6 @@ import mongoose from 'mongoose'; import moment from 'moment'; export const SLACK_SUB = 'Switcher Slack App'; -export const TicketStatusType = Object.freeze({ - OPENED: 'OPENED', - APPROVED: 'APPROVED', - DENIED: 'DENIED' -}); export const TicketValidationType = Object.freeze({ VALIDATED: 'VALIDATED', @@ -38,12 +33,6 @@ const slackTicketSchema = new mongoose.Schema({ observations: { type: String }, - ticket_status: { - type: String, - enum: Object.values(TicketStatusType), - default: TicketStatusType.OPENED, - required: true - }, date_closed: { type: Date } diff --git a/src/routers/slack.js b/src/routers/slack.js index c6c0efd..e695426 100644 --- a/src/routers/slack.js +++ b/src/routers/slack.js @@ -3,7 +3,6 @@ import { check, query } from 'express-validator'; import { NotFoundError, responseException } from '../exceptions/index.js'; import { auth, slackAuth } from '../middleware/auth.js'; import { validate } from '../middleware/validators.js'; -import { TicketStatusType } from '../models/slack_ticket.js'; import { SwitcherKeys } from '../external/switcher-api-facade.js'; import { getDomainById } from '../services/domain.js'; import * as Services from '../services/slack.js'; @@ -177,9 +176,6 @@ router.get('/slack/v1/installation/:domain', auth, [ const { slack_ticket, installation_payload, settings } = await Services.getSlackOrError({ id: domain.integrations.slack }); - const openedTickets = slack_ticket.filter(t => t.ticket_status === TicketStatusType.OPENED).length; - const approvedTickets = slack_ticket.filter(t => t.ticket_status === TicketStatusType.APPROVED).length; - res.send({ team_id: installation_payload.team_id, team_name: installation_payload.team_name, @@ -187,9 +183,7 @@ router.get('/slack/v1/installation/:domain', auth, [ channel: installation_payload.incoming_webhook_channel, is_enterprise: installation_payload.is_enterprise_install, installed_at: installation_payload.installed_at, - tickets_opened: openedTickets, - tickets_approved: approvedTickets, - tickets_denied: (slack_ticket.length - openedTickets - approvedTickets), + tickets_opened: slack_ticket.length, settings }); } catch (e) { diff --git a/src/services/slack.js b/src/services/slack.js index 7835baa..11c06ce 100644 --- a/src/services/slack.js +++ b/src/services/slack.js @@ -1,5 +1,5 @@ import Slack from '../models/slack.js'; -import { TicketStatusType, SLACK_SUB, TicketValidationType, SlackTicket } from '../models/slack_ticket.js'; +import { SLACK_SUB, TicketValidationType, SlackTicket } from '../models/slack_ticket.js'; import { BadRequestError, NotFoundError, PermissionError } from '../exceptions/index.js'; import { checkSlackIntegration } from '../external/switcher-api-facade.js'; import { getConfig } from './config.js'; @@ -14,8 +14,7 @@ import { isQueryValid } from './common.js'; * Otherwise, validates if ticket content is valid */ async function canCreateTicket(slack, ticket_content) { - const slackTickets = await hasSlackTicket( - slack._id, ticket_content, TicketStatusType.OPENED); + const slackTickets = await hasSlackTicket(slack._id, ticket_content); if (slackTickets.length) { return slackTickets[0]; @@ -59,11 +58,10 @@ async function deleteSlackTicketsBySlackId(slackId) { return SlackTicket.deleteMany({ slack: slackId }); } -async function hasSlackTicket(slackId, ticket_content, status) { +async function hasSlackTicket(slackId, ticket_content) { const tickets = await SlackTicket.find({ slack: slackId, - ...ticket_content, - ticket_status: status + ...ticket_content }); return tickets; @@ -211,31 +209,30 @@ export async function createTicket(ticket_content, enterprise_id, team_id) { export async function processTicket(enterprise_id, team_id, ticket_id, approved) { const slack = await getSlackOrError({ enterprise_id, team_id }); await getDomainById(slack.domain); - const ticket = slack.slack_ticket.filter( - t => String(t.id) === String(ticket_id) && - t.ticket_status === TicketStatusType.OPENED); + const ticket = slack.slack_ticket.filter(t => String(t.id) === String(ticket_id)); if (!ticket.length) { throw new NotFoundError('Ticket not found'); } if (approved) { - ticket[0].ticket_status = TicketStatusType.APPROVED; await closeTicket(slack.domain, ticket[0]); } else { - ticket[0].ticket_status = TicketStatusType.DENIED; await closeTicket(null, ticket[0]); } - await slack.save(); return ticket[0]; } async function closeTicket(domain, ticket) { ticket.date_closed = Date.now(); - if (ticket.ticket_status === TicketStatusType.APPROVED) { + + // Approved when domain is provided + if (domain) { await approveChange(domain, ticket); } + + await SlackTicket.deleteOne({ _id: ticket._id }); } async function approveChange(domain, ticket) { diff --git a/tests/slack.test.js b/tests/slack.test.js index e20cefd..1a1e591 100644 --- a/tests/slack.test.js +++ b/tests/slack.test.js @@ -809,6 +809,10 @@ describe('Slack Route - Process Ticket', () => { //given const { ticket } = await createTicket(); + //verify that + let ticketDb = await SlackTicket.findById(ticket._id).exec(); + expect(ticketDb).not.toBe(null); + //test const response = await request(app) .post('/slack/v1/ticket/process') @@ -820,6 +824,10 @@ describe('Slack Route - Process Ticket', () => { }).expect(200); expect(response.body.message).toBe(`Ticket ${ticket._id} processed`); + + //check DB + ticketDb = await SlackTicket.findById(ticket._id).exec(); + expect(ticketDb).toBe(null); }); test('SLACK_SUITE - Should approve a ticket - Group Change Request', async () => { @@ -865,6 +873,10 @@ describe('Slack Route - Process Ticket', () => { //given const { ticket } = await createTicket(); + //verify that + let ticketDb = await SlackTicket.findById(ticket._id).exec(); + expect(ticketDb).not.toBe(null); + //test const response = await request(app) .post('/slack/v1/ticket/process') @@ -876,6 +888,10 @@ describe('Slack Route - Process Ticket', () => { }).expect(200); expect(response.body.message).toBe(`Ticket ${ticket._id} processed`); + + //check DB + ticketDb = await SlackTicket.findById(ticket._id).exec(); + expect(ticketDb).toBe(null); }); test('SLACK_SUITE - Should reset installation tickets', async () => {