async create()

in libs/newsletters-data-client/src/lib/newsletter-storage/s3-newsletter-storage.ts [36:104]


	async create(
		draft: DraftNewsletterDataWithMeta,
		user: UserProfile,
	): Promise<
		| SuccessfulStorageResponse<NewsletterDataWithoutMeta>
		| UnsuccessfulStorageResponse
	> {
		const draftReady = isNewsletterDataWithMeta(draft);

		if (!draftReady) {
			const error: UnsuccessfulStorageResponse = {
				ok: false,
				message: `draft was not ready to be live`,
				reason: StorageRequestFailureReason.InvalidDataInput,
			};
			return Promise.resolve(error);
		}

		if (!draft.identityName) {
			return {
				ok: false,
				message: `identityName is undefined`,
				reason: StorageRequestFailureReason.InvalidDataInput,
			};
		}

		const nextId = await getNextId(this);
		const newIdentifier = `${draft.identityName}:${nextId}.json`;

		try {
			const newsletterWithSameKeyExists = await this.objectExists(
				newIdentifier,
			);
			if (newsletterWithSameKeyExists) {
				return {
					ok: false,
					message: `Newsletter with name ${newIdentifier} already exists`,
					reason: StorageRequestFailureReason.DataInStoreNotValid,
				};
			}
		} catch (err) {
			return {
				ok: false,
				message: `failed to check if newsletter with name ${newIdentifier} exists`,
				reason: StorageRequestFailureReason.S3Failure,
			};
		}

		const newNewsletter: NewsletterDataWithMeta = {
			...draft,
			listId: nextId,
			meta: this.updateMetaForLaunch(draft.meta, user),
		};

		try {
			await this.putObject(newNewsletter, newIdentifier);
		} catch (err) {
			return {
				ok: false,
				message: `failed create newsletter ${draft.identityName}.`,
				reason: StorageRequestFailureReason.S3Failure,
			};
		}

		return {
			ok: true,
			data: this.stripMeta(newNewsletter),
		};
	}