@@ -133,7 +133,7 @@ async def verify_certificate(file_bytes: bytes) -> dict:
133133 "debug_text" : watermark_text
134134 }
135135
136- # ์๋ฃ์ฆ ๋ฒํธ ์ถ์ถ (PSEUDOLAB_CERT-XXXX ํฌ๋งท ๊ธฐ๋)
136+ # ์๋ฃ์ฆ ๋ฒํธ ์ถ์ถ (CERT-2026XX ํฌ๋งท ๊ธฐ๋)
137137 cert_number = ""
138138 if "_" in watermark_text :
139139 cert_number = watermark_text .split ("_" )[1 ]
@@ -155,28 +155,7 @@ async def verify_certificate(file_bytes: bytes) -> dict:
155155 "valid" : False ,
156156 "message" : f"์๋ฃ์ฆ ๋ฒํธ({ cert_number } )์ ํด๋นํ๋ ๋ฐ๊ธ ๊ธฐ๋ก์ ์ฐพ์ ์ ์์ต๋๋ค."
157157 }
158-
159- # Notion ๊ฒฐ๊ณผ ํ์ฑ
160- props = cert_page .get ("properties" , {})
161-
162- name = props .get ("Name" , {}).get ("title" , [{}])[0 ].get ("plain_text" , "์ ์ ์์" )
163- course = props .get ("Course Name" , {}).get ("rich_text" , [{}])[0 ].get ("plain_text" , "์ ์ ์์" )
164- season = props .get ("Season" , {}).get ("select" , {}).get ("name" , "์ ์ ์์" )
165- issue_date = props .get ("Issue Date" , {}).get ("date" , {}).get ("start" , "์ ์ ์์" )
166- status = props .get ("Certificate Status" , {}).get ("status" , {}).get ("name" , "์ ์ ์์" )
167-
168- return {
169- "valid" : True ,
170- "message" : "์๋ฃ์ฆ ์ง์ ํ์ธ์ ์ฑ๊ณตํ์ต๋๋ค." ,
171- "data" : {
172- "name" : name ,
173- "course" : course ,
174- "season" : season ,
175- "issue_date" : issue_date ,
176- "certificate_number" : cert_number ,
177- "status" : status
178- }
179- }
158+ return CertificateService ._build_verification_result (cert_page , cert_number )
180159
181160 except Exception as e :
182161 if "์ํฐ๋งํฌ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค" in str (e ):
@@ -187,6 +166,49 @@ async def verify_certificate(file_bytes: bytes) -> dict:
187166 "valid" : False ,
188167 "message" : "์๋ฃ์ฆ ๊ฒ์ฆ ์ฒ๋ฆฌ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค."
189168 }
169+
170+ @staticmethod
171+ async def verify_certificate_by_number (certificate_number : str ) -> dict :
172+ """์๋ฃ์ฆ ๋ฒํธ๋ก ์๋ฃ ์ฌ๋ถ ํ์ธ"""
173+ try :
174+ notion_client = NotionClient ()
175+ cert_page = await notion_client .get_certificate_by_number (certificate_number )
176+
177+ if not cert_page :
178+ return {
179+ "valid" : False ,
180+ "message" : f"์๋ฃ์ฆ ๋ฒํธ({ certificate_number } )์ ํด๋นํ๋ ๋ฐ๊ธ ๊ธฐ๋ก์ ์ฐพ์ ์ ์์ต๋๋ค."
181+ }
182+
183+ return CertificateService ._build_verification_result (cert_page , certificate_number )
184+ except Exception :
185+ logger .exception ("์๋ฃ์ฆ ๋ฒํธ ํ์ธ ์ค ์ค๋ฅ" )
186+ return {
187+ "valid" : False ,
188+ "message" : "์๋ฃ์ฆ ๋ฒํธ ํ์ธ ์ฒ๋ฆฌ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค."
189+ }
190+
191+ @staticmethod
192+ def _build_verification_result (cert_page : dict , certificate_number : str ) -> dict :
193+ """Notion ์๋ฃ์ฆ ํ์ด์ง ์๋ต ํฌ๋งทํ
"""
194+ props = cert_page .get ("properties" , {})
195+
196+ name = props .get ("Name" , {}).get ("title" , [{}])[0 ].get ("plain_text" , "์ ์ ์์" )
197+ course = props .get ("Course Name" , {}).get ("rich_text" , [{}])[0 ].get ("plain_text" , "์ ์ ์์" )
198+ season = props .get ("Season" , {}).get ("select" , {}).get ("name" , "์ ์ ์์" )
199+ issue_date = props .get ("Issue Date" , {}).get ("date" , {}).get ("start" , "์ ์ ์์" )
200+ status = props .get ("Certificate Status" , {}).get ("status" , {}).get ("name" , "์ ์ ์์" )
201+
202+ return {
203+ "valid" : True ,
204+ "message" : "์๋ฃ์ฆ ํ์ธ์ ์ฑ๊ณตํ์ต๋๋ค." ,
205+ "data" : {
206+ "name" : name ,
207+ "course" : course ,
208+ "season" : season ,
209+ "issue_date" : issue_date
210+ }
211+ }
190212
191213 @staticmethod
192214 async def _reissue_certificate (
0 commit comments