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.1",
dedupe: "greatest",
type: "source",
props: {
gitlab,
db: "$.service.db",
timer: {
type: "$.interface.timer",
default: {
intervalSeconds: DEFAULT_POLLING_SOURCE_TIMER_INTERVAL,
},
},
projectId: {
propDefinition: [
gitlab,
"projectId",
],
},
},
hooks: {
async activate() {
const milestones = await this.gitlab.listMilestones(this.projectId, {
max: 1,
});
if (milestones.length > 0) {
const lastProcessedMilestoneId = milestones[0].id;
this.db.set("lastProcessedMilestoneId", lastProcessedMilestoneId);
console.log(`Polling GitLab milestones created after ID ${lastProcessedMilestoneId}`);
}
},
},
methods: {
_getLastProcessedMilestoneId() {
return this.db.get("lastProcessedMilestoneId");
},
_setLastProcessedMilestoneId(lastProcessedMilestoneId) {
this.db.set("lastProcessedMilestoneId", lastProcessedMilestoneId);
},
generateMeta(data) {
const {
id,
created_at: createdAt,
title,
} = data;
return {
id,
summary: `New milestone: ${title}`,
ts: +new Date(createdAt),
};
},
},
async run() {
let lastProcessedMilestoneId = this._getLastProcessedMilestoneId();
const milestones = await this.gitlab.getUnprocessedMilestones(
this.projectId,
lastProcessedMilestoneId,
);
if (milestones.length === 0) {
console.log("No new GitLab milestones detected");
return;
}
console.log(`Detected ${milestones.length} new milestones`);
lastProcessedMilestoneId = milestones[0].id;
this._setLastProcessedMilestoneId(lastProcessedMilestoneId);
milestones.reverse().forEach((milestone) => {
const meta = this.generateMeta(milestone);
this.$emit(milestone, meta);
});
},
};