sync working as intended
This commit is contained in:
1 parent
9ca05f5ea1
commit
7378d37b36
10 files changed
+503
-57
No files matched your search
@@ -1,4 +1,4 @@
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
import { Injectable, Logger, Inject, forwardRef } from '@nestjs/common';
|
||||
import { ConfigService } from '@nestjs/config';
|
||||
import { HttpService } from '@nestjs/axios';
|
||||
import { lastValueFrom } from 'rxjs';
|
||||
@@ -13,6 +13,21 @@ import {
|
||||
VideoPosition,
|
||||
} from './entities';
|
||||
|
||||
interface StrapiImage {
|
||||
url: string;
|
||||
alternativeText?: string;
|
||||
caption?: string;
|
||||
width?: number;
|
||||
height?: number;
|
||||
formats?: Record<string, StrapiImageFormat>;
|
||||
}
|
||||
|
||||
interface StrapiImageFormat {
|
||||
url: string;
|
||||
width: number;
|
||||
height: number;
|
||||
}
|
||||
|
||||
interface StrapiArticle {
|
||||
id: number;
|
||||
documentId: string;
|
||||
@@ -23,8 +38,8 @@ interface StrapiArticle {
|
||||
publishedAt: string | null;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
img?: any;
|
||||
media?: any[];
|
||||
img?: StrapiImage;
|
||||
media?: StrapiImage[];
|
||||
imagePosition?: string;
|
||||
imageSize?: string;
|
||||
videoUrl?: string;
|
||||
@@ -42,8 +57,8 @@ interface StrapiLiveBlog {
|
||||
publishedAt: string | null;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
img?: any;
|
||||
media?: any[];
|
||||
img?: StrapiImage;
|
||||
media?: StrapiImage[];
|
||||
imagePosition?: string;
|
||||
imageSize?: string;
|
||||
videoUrl?: string;
|
||||
@@ -72,7 +87,9 @@ export class StrapiService {
|
||||
constructor(
|
||||
private readonly configService: ConfigService,
|
||||
private readonly httpService: HttpService,
|
||||
@Inject(forwardRef(() => ArticlesService))
|
||||
private readonly articlesService: ArticlesService,
|
||||
@Inject(forwardRef(() => LiveBlogService))
|
||||
private readonly liveBlogService: LiveBlogService,
|
||||
) {
|
||||
this.strapiUrl =
|
||||
@@ -262,9 +279,10 @@ export class StrapiService {
|
||||
this.logger.log(
|
||||
`Successfully synced article: ${strapiArticle.title} with status: ${status}`,
|
||||
);
|
||||
} catch (error: any) {
|
||||
} catch (error: unknown) {
|
||||
// If we get a 404 and it's an unpublish event, we can still mark it as draft
|
||||
if (event === 'entry.unpublish' && error.response?.status === 404) {
|
||||
const axiosError = error as { response?: { status: number } };
|
||||
if (event === 'entry.unpublish' && axiosError.response?.status === 404) {
|
||||
this.logger.log(
|
||||
`Article ${strapiId} not found in Strapi, marking as draft based on unpublish event`,
|
||||
);
|
||||
@@ -403,9 +421,10 @@ export class StrapiService {
|
||||
this.logger.log(
|
||||
`Successfully synced live blog: ${strapiLiveBlog.title} with status: ${status}`,
|
||||
);
|
||||
} catch (error: any) {
|
||||
} catch (error: unknown) {
|
||||
// If we get a 404 and it's an unpublish event, we can still mark it as draft
|
||||
if (event === 'entry.unpublish' && error.response?.status === 404) {
|
||||
const axiosError = error as { response?: { status: number } };
|
||||
if (event === 'entry.unpublish' && axiosError.response?.status === 404) {
|
||||
this.logger.log(
|
||||
`Live blog ${strapiId} not found in Strapi, marking as draft based on unpublish event`,
|
||||
);
|
||||
@@ -489,4 +508,162 @@ export class StrapiService {
|
||||
this.logger.warn(`Unknown model type in webhook: ${data.model}`);
|
||||
}
|
||||
}
|
||||
|
||||
async updateArticleStatusInStrapi(
|
||||
strapiId: string,
|
||||
status: ArticleStatus,
|
||||
): Promise<void> {
|
||||
try {
|
||||
this.logger.log(
|
||||
`Updating article ${strapiId} status in Strapi to: ${status}`,
|
||||
);
|
||||
|
||||
// Map our status to Strapi status
|
||||
let strapiStatus: string;
|
||||
switch (status) {
|
||||
case ArticleStatus.DRAFT:
|
||||
strapiStatus = 'draft';
|
||||
break;
|
||||
case ArticleStatus.PUBLISHED:
|
||||
strapiStatus = 'published';
|
||||
break;
|
||||
case ArticleStatus.ARCHIVED:
|
||||
strapiStatus = 'archived';
|
||||
break;
|
||||
default:
|
||||
strapiStatus = 'draft';
|
||||
}
|
||||
|
||||
// For archived status, we need to unpublish first if it's published
|
||||
if (status === ArticleStatus.ARCHIVED) {
|
||||
await lastValueFrom(
|
||||
this.httpService.patch(
|
||||
`${this.strapiUrl}/api/articles/${strapiId}/unpublish`,
|
||||
{},
|
||||
{ headers: this.getHeaders() },
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Update the status
|
||||
await lastValueFrom(
|
||||
this.httpService.patch(
|
||||
`${this.strapiUrl}/api/articles/${strapiId}`,
|
||||
{ data: { status: strapiStatus } },
|
||||
{ headers: this.getHeaders() },
|
||||
),
|
||||
);
|
||||
|
||||
this.logger.log(
|
||||
`Successfully updated article ${strapiId} status in Strapi to: ${status}`,
|
||||
);
|
||||
} catch (error) {
|
||||
this.logger.error(
|
||||
`Failed to update article ${strapiId} status in Strapi:`,
|
||||
error,
|
||||
);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async updateLiveBlogStatusInStrapi(
|
||||
strapiId: string,
|
||||
status: LiveBlogStatus,
|
||||
): Promise<void> {
|
||||
try {
|
||||
this.logger.log(
|
||||
`Updating live blog ${strapiId} status in Strapi to: ${status}`,
|
||||
);
|
||||
|
||||
// Map our status to Strapi status
|
||||
let strapiStatus: string;
|
||||
switch (status) {
|
||||
case LiveBlogStatus.DRAFT:
|
||||
strapiStatus = 'draft';
|
||||
break;
|
||||
case LiveBlogStatus.LIVE:
|
||||
strapiStatus = 'live';
|
||||
break;
|
||||
case LiveBlogStatus.ENDED:
|
||||
strapiStatus = 'ended';
|
||||
break;
|
||||
case LiveBlogStatus.ARCHIVED:
|
||||
strapiStatus = 'archived';
|
||||
break;
|
||||
default:
|
||||
strapiStatus = 'draft';
|
||||
}
|
||||
|
||||
// For archived status, we need to unpublish first if it's published
|
||||
if (status === LiveBlogStatus.ARCHIVED) {
|
||||
await lastValueFrom(
|
||||
this.httpService.patch(
|
||||
`${this.strapiUrl}/api/live-blogs/${strapiId}/unpublish`,
|
||||
{},
|
||||
{ headers: this.getHeaders() },
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Update the status
|
||||
await lastValueFrom(
|
||||
this.httpService.patch(
|
||||
`${this.strapiUrl}/api/live-blogs/${strapiId}`,
|
||||
{ data: { status: strapiStatus } },
|
||||
{ headers: this.getHeaders() },
|
||||
),
|
||||
);
|
||||
|
||||
this.logger.log(
|
||||
`Successfully updated live blog ${strapiId} status in Strapi to: ${status}`,
|
||||
);
|
||||
} catch (error) {
|
||||
this.logger.error(
|
||||
`Failed to update live blog ${strapiId} status in Strapi:`,
|
||||
error,
|
||||
);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async deleteArticleFromStrapi(strapiId: string): Promise<void> {
|
||||
try {
|
||||
this.logger.log(`Deleting article ${strapiId} from Strapi`);
|
||||
|
||||
await lastValueFrom(
|
||||
this.httpService.delete(`${this.strapiUrl}/api/articles/${strapiId}`, {
|
||||
headers: this.getHeaders(),
|
||||
}),
|
||||
);
|
||||
|
||||
this.logger.log(`Successfully deleted article ${strapiId} from Strapi`);
|
||||
} catch (error) {
|
||||
this.logger.error(
|
||||
`Failed to delete article ${strapiId} from Strapi:`,
|
||||
error,
|
||||
);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async deleteLiveBlogFromStrapi(strapiId: string): Promise<void> {
|
||||
try {
|
||||
this.logger.log(`Deleting live blog ${strapiId} from Strapi`);
|
||||
|
||||
await lastValueFrom(
|
||||
this.httpService.delete(
|
||||
`${this.strapiUrl}/api/live-blogs/${strapiId}`,
|
||||
{ headers: this.getHeaders() },
|
||||
),
|
||||
);
|
||||
|
||||
this.logger.log(`Successfully deleted live blog ${strapiId} from Strapi`);
|
||||
} catch (error) {
|
||||
this.logger.error(
|
||||
`Failed to delete live blog ${strapiId} from Strapi:`,
|
||||
error,
|
||||
);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user