sources/new-milestone/new-milestone.mjs
import gitlab from "../../gitlab.app.mjs"; import { DEFAULT_POLLING_SOURCE_TIMER_INTERVAL } from "@pipedream/platform"; export default { key: "gitlab-new-milestone", name: "New Milestone", description: "Emit new event when a milestone is created in a project", version: "0.1.3", dedupe: "greatest", type: "source", props: { gitlab, db: "$.service.db", timer: { type: "$.interface.timer", default: { intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL, }, }, projectId: { propDefinition: [ gitlab, "projectId", ], }, }, methods: { _getLastProcessedMilestoneTime() { return this.db.get("lastProcessedMilestoneTime"); }, _setLastProcessedMilestoneTime(lastProcessedMilestoneTime) { this.db.set("lastProcessedMilestoneTime", lastProcessedMilestoneTime); }, generateMeta(data) { const { id, created_at: createdAt, title, } = data; return { id, summary: `New milestone: ${title}`, ts: +new Date(createdAt), }; }, }, async run() { const isoDateNow = new Date().toISOString() .slice(0, -5) + "Z"; let lastProcessedMilestoneTime = this._getLastProcessedMilestoneTime() ?? isoDateNow; const newOrUpdatedMilestones = await this.gitlab.listMilestones(this.projectId, { params: { updated_after: lastProcessedMilestoneTime, }, }); const milestones = newOrUpdatedMilestones.filter( ({ created_at }) => Date.parse(created_at) > Date.parse(lastProcessedMilestoneTime), ); if (milestones.length === 0) { console.log("No new GitLab milestones detected"); if (!this._getLastProcessedMilestoneTime()) { this._setLastProcessedMilestoneTime(lastProcessedMilestoneTime); } return; } console.log(`Detected ${milestones.length} new milestones`); lastProcessedMilestoneTime = milestones[0].created_at; this._setLastProcessedMilestoneTime(lastProcessedMilestoneTime); milestones.reverse().forEach((milestone) => { const meta = this.generateMeta(milestone); this.$emit(milestone, meta); }); }, };