Skip to content

Commit 72922c0

Browse files
committed
feat: description gen
1 parent 90d0d7d commit 72922c0

File tree

26 files changed

+265
-2
lines changed

26 files changed

+265
-2
lines changed

.github/workflows/Deploy.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,4 @@ jobs:
4343
CLOUDINARY_API_KEY: ${{ secrets.CLOUDINARY_API_KEY }}
4444
CLOUDINARY_API_SECRET: ${{ secrets.CLOUDINARY_API_SECRET }}
4545
SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }}
46-
46+
OPEN_ROUTER_API_KEY: ${{ secrets.OPEN_ROUTER_API_KEY }}

.github/workflows/Production.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,4 @@ jobs:
4848
CLOUDINARY_API_KEY: ${{ secrets.CLOUDINARY_API_KEY }}
4949
CLOUDINARY_API_SECRET: ${{ secrets.CLOUDINARY_API_SECRET }}
5050
SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }}
51+
OPEN_ROUTER_API_KEY: ${{ secrets.OPEN_ROUTER_API_KEY }}

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ yarn-error.log*
3939
*.pem
4040

4141
.idea
42+
.claude

apps/graphql-api/.env.sample

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ CLOUDINARY_CLOUD_NAME=
99
CLOUDINARY_API_KEY=
1010
CLOUDINARY_API_SECRET=
1111
SENTRY_AUTH_TOKEN=
12+
OPEN_ROUTER_API_KEY=

apps/graphql-api/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"@darun/backend": "workspace:*",
1919
"@darun/provider-database": "workspace:*",
2020
"@darun/utils-apollo-server": "workspace:*",
21+
"@darun/utils-llm": "workspace:*",
2122
"@darun/utils-sentry": "workspace:*",
2223
"@kang-heewon/esbuild-plugin-typescript-decorators": "0.1.0",
2324
"@sentry/aws-serverless": "10.8.0",

apps/graphql-api/serverless.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,5 @@ functions:
6464
CLOUDINARY_CLOUD_NAME: ${env:CLOUDINARY_CLOUD_NAME}
6565
CLOUDINARY_API_KEY: ${env:CLOUDINARY_API_KEY}
6666
CLOUDINARY_API_SECRET: ${env:CLOUDINARY_API_SECRET}
67+
OPEN_ROUTER_API_KEY: ${env:OPEN_ROUTER_API_KEY}
6768

apps/graphql-api/src/app/graphql/product/Product.mutation.resolver.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
UpvoteProduct,
1414
GetCompany,
1515
RegisterProductCompany,
16+
GenerateProductDescription,
1617
} from '@darun/backend';
1718
import { AuthRole } from '@darun/utils-apollo-server';
1819
import { Arg, Authorized, Mutation, Resolver } from 'type-graphql';
@@ -21,6 +22,10 @@ import { AddProductLinkInput, AddProductLinkPayload } from './graphs/AddProductL
2122
import { AddProductScreenshotInput, AddProductScreenshotPayload } from './graphs/AddProductScreenshot';
2223
import { CreateProductInput, CreateProductPayload } from './graphs/CreateProduct';
2324
import { EditProductInput, EditProductPayload } from './graphs/EditProduct';
25+
import {
26+
GenerateProductDescriptionInput,
27+
GenerateProductDescriptionPayload,
28+
} from './graphs/GenerateProductDescription';
2429
import { IndexProductInput, IndexProductPayload } from './graphs/IndexProduct';
2530
import { Product } from './graphs/Product';
2631
import { PublishProductInput, PublishProductPayload } from './graphs/PublishProduct';
@@ -47,7 +52,8 @@ export class ProductMutationResolver {
4752
private readonly updateProductLinkUseCase: UpdateProductLink,
4853
private readonly updateAlternativeProductUseCase: UpdateAlternativeProduct,
4954
private readonly upvoteProductUseCase: UpvoteProduct,
50-
private readonly registerProductCompanyUseCase: RegisterProductCompany
55+
private readonly registerProductCompanyUseCase: RegisterProductCompany,
56+
private readonly generateProductDescriptionUseCase: GenerateProductDescription
5157
) {}
5258

5359
@Authorized([AuthRole.Admin])
@@ -270,4 +276,24 @@ export class ProductMutationResolver {
270276
product: await this.getProductUseCase.execute({ slug }),
271277
};
272278
}
279+
280+
@Authorized([AuthRole.Admin])
281+
@Mutation(() => GenerateProductDescriptionPayload)
282+
async generateProductDescription(
283+
@Arg('input') input: GenerateProductDescriptionInput
284+
): Promise<GenerateProductDescriptionPayload> {
285+
const product = await this.getProductUseCase.execute({ slug: input.slug });
286+
287+
if (!product) {
288+
throw new Error('Product not found');
289+
}
290+
291+
const updatedProduct = await this.generateProductDescriptionUseCase.execute({
292+
productId: product.id,
293+
});
294+
295+
return {
296+
product: updatedProduct,
297+
};
298+
}
273299
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Field, InputType, ObjectType } from 'type-graphql';
2+
import { Product } from './Product';
3+
4+
@InputType()
5+
export class GenerateProductDescriptionInput {
6+
@Field(() => String)
7+
slug: string;
8+
}
9+
10+
@ObjectType()
11+
export class GenerateProductDescriptionPayload {
12+
@Field(() => Product)
13+
product: Product;
14+
}

apps/graphql-api/src/config/environment.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ assert(process.env['MONGODB_URI'], 'MONGODB_URI not provided');
1010
assert(process.env['CLOUDINARY_CLOUD_NAME'], 'CLOUDINARY_CLOUD_NAME not provided');
1111
assert(process.env['CLOUDINARY_API_KEY'], 'CLOUDINARY_API_KEY not provided');
1212
assert(process.env['CLOUDINARY_API_SECRET'], 'CLOUDINARY_API_SECRET not provided');
13+
assert(process.env['OPENAI_API_KEY'], 'OPENAI_API_KEY not provided');
1314

1415
export const IS_LOCAL = process.env['INFRA_ENV'] === 'local';
1516
export const RUNNING_ENV = process.env['RUNNING_ENV'] as 'development' | 'production';
@@ -21,3 +22,4 @@ export const MONGODB_URI = process.env['MONGODB_URI'];
2122
export const CLOUDINARY_CLOUD_NAME = process.env['CLOUDINARY_CLOUD_NAME'];
2223
export const CLOUDINARY_API_KEY = process.env['CLOUDINARY_API_KEY'];
2324
export const CLOUDINARY_API_SECRET = process.env['CLOUDINARY_API_SECRET'];
25+
export const OPENAI_API_KEY = process.env['OPENAI_API_KEY'];

apps/graphql-api/src/config/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import './firebase';
55
import './storage';
66
import '@darun/backend/graphql-api';
77
import { CloudinaryImageRepositoryConfig } from '@darun/backend';
8+
import { LlmClient } from '@darun/utils-llm/src/libs/LlmClient';
89
import { Container } from 'typedi';
910
import { RUNNING_ENV } from './environment';
1011

1112
Container.set(CloudinaryImageRepositoryConfig, new CloudinaryImageRepositoryConfig(RUNNING_ENV));
13+
14+
// LLM 서비스 등록
15+
Container.set(LlmClient, new LlmClient());

0 commit comments

Comments
 (0)