UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.

84 lines 2.94 kB
import { ulid } from 'ulidx'; import { CRUDStore } from '../../db/crud/crud-store.js'; const TABLE = 'milestone_strategies'; const fromRow = (row) => { return { id: row.id, milestoneId: row.milestone_id, sortOrder: row.sort_order, title: row.title, strategyName: row.strategy_name, parameters: row.parameters, constraints: JSON.parse(row.constraints), variants: JSON.parse(row.variants), segments: [], }; }; const toRow = (item) => { return { id: ulid(), milestone_id: item.milestoneId, sort_order: item.sortOrder, title: item.title, strategy_name: item.strategyName, parameters: item.parameters ?? {}, constraints: JSON.stringify(item.constraints ?? []), variants: JSON.stringify(item.variants ?? []), }; }; const toUpdateRow = (item) => { return { milestone_id: item.milestoneId, sort_order: item.sortOrder, title: item.title, strategy_name: item.strategyName, parameters: item.parameters ?? {}, constraints: JSON.stringify(item.constraints ?? []), variants: JSON.stringify(item.variants ?? []), }; }; export class ReleasePlanMilestoneStrategyStore extends CRUDStore { constructor(db, config) { super(TABLE, db, config); } async insert({ segments, ...strategy }) { const row = toRow(strategy); await this.db(TABLE).insert(row); segments?.forEach(async (segmentId) => { const segmentRow = { milestone_strategy_id: row.id, segment_id: segmentId, }; await this.db('milestone_strategy_segments').insert(segmentRow); }); return fromRow(row); } async updateStrategy(strategyId, { segments, ...strategy }) { const rows = await this.db(this.tableName) .where({ id: strategyId }) .update(toUpdateRow(strategy)) .returning('*'); return this.fromRow(rows[0]); } async upsert(strategyId, { segments, ...strategy }) { const releasePlanMilestoneStrategy = await this.updateStrategy(strategyId, strategy); // now delete await this.db('milestone_strategy_segments') .where('milestone_strategy_id', strategyId) .delete(); for (const segmentId of segments ?? []) { const segmentRow = { milestone_strategy_id: strategyId, segment_id: segmentId, }; await this.db('milestone_strategy_segments').insert(segmentRow); } return releasePlanMilestoneStrategy; } async deleteStrategiesForMilestone(milestoneId) { await this.db('milestone_strategies') .where('milestone_id', milestoneId) .delete(); } } //# sourceMappingURL=release-plan-milestone-strategy-store.js.map