import * as notifications from "@distilled.cloud/aws/notifications";
import * as Effect from "effect/Effect";
import { createInternalTags, diffTags } from "../../Tags.ts";
import { Region } from "../Region.ts";
/**
* AWS User Notifications is managed from a single control-plane region.
* Every management API call must target `us-east-1` regardless of the
* ambient stack region (other regions reject with "API ...Activity cannot
* be called in us-west-2. Use us-east-1 instead"), so we pin the region on
* every distilled operation.
*/
const US_EAST_1 = "us-east-1";
export const pinNotificationsRegion = (
effect: Effect.Effect,
) => effect.pipe(Effect.provideService(Region, Effect.succeed(US_EAST_1)));
/**
* Read the observed tags on a User Notifications resource, tolerating a
* not-yet-visible resource (returns `{}`).
*/
export const readNotificationsTags = Effect.fn(function* (arn: string) {
return yield* pinNotificationsRegion(
notifications.listTagsForResource({ arn }).pipe(
Effect.map((r) => (r.tags ?? {}) as Record),
Effect.catchTag(
["ResourceNotFoundException", "ValidationException"],
() => Effect.succeed({} as Record),
),
),
);
});
/**
* Converge the tags on a User Notifications resource to the desired user
* tags merged with the internal Alchemy ownership tags, diffing against
* OBSERVED cloud tags so adoption converges.
*/
export const syncNotificationsTags = Effect.fn(function* (
arn: string,
id: string,
userTags: Record | undefined,
) {
const internalTags = yield* createInternalTags(id);
const desired = { ...userTags, ...internalTags };
const observed = yield* readNotificationsTags(arn);
const { upsert, removed } = diffTags(observed, desired);
if (upsert.length > 0) {
yield* pinNotificationsRegion(
notifications.tagResource({
arn,
tags: Object.fromEntries(upsert.map((t) => [t.Key, t.Value])),
}),
);
}
if (removed.length > 0) {
yield* pinNotificationsRegion(
notifications.untagResource({ arn, tagKeys: removed }),
);
}
});