2424import org .springframework .transaction .annotation .Transactional ;
2525
2626import java .time .Instant ;
27+ import java .util .ArrayList ;
2728import java .util .List ;
2829import java .util .Optional ;
2930
@@ -71,23 +72,28 @@ public void scheduleForPost(Post post) {
7172 return ;
7273 }
7374
74- Composer composer = getComposerFromPost (post );
75- if (composer == null ) {
76- composer = detectComposerFromContent (post .getTitle () + " " + post .getContent ());
77- }
78- if (composer == null ) {
79- return ;
80- }
81-
82- Optional <ComposerPersona > persona = composerPersonaRepository .findByComposerId (composer .getId ());
83- if (persona .isEmpty () || !persona .get ().isActive ()) {
75+ List <Composer > composers = getComposersForPost (post );
76+ log .info ("AI ๋๊ธ ๋์ ์๊ณก๊ฐ ํ์ง - postId={}, composers={}" , post .getId (),
77+ composers .stream ().map (c -> c .getId () + "(" + c .getKoreanName () + ")" ).toList ());
78+ if (composers .isEmpty ()) {
8479 return ;
8580 }
8681
8782 Instant scheduledAt = Instant .now ().plusSeconds (initialDelayMinutes * 60L );
88- AiCommentJob job = AiCommentJob .of (post , composer , AiCommentJobTriggerType .POST_CREATED , null , scheduledAt );
89- aiCommentJobRepository .save (job );
90- log .info ("AI ๋๊ธ ์ก ๋ฑ๋ก - postId={}, composerId={}, scheduledAt={}" , post .getId (), composer .getId (), scheduledAt );
83+ for (Composer composer : composers ) {
84+ Optional <ComposerPersona > persona = composerPersonaRepository .findByComposerId (composer .getId ());
85+ if (persona .isEmpty ()) {
86+ log .info ("AI ๋๊ธ ์ก ์คํต - ํ๋ฅด์๋ ์์ composerId={}" , composer .getId ());
87+ continue ;
88+ }
89+ if (!persona .get ().isActive ()) {
90+ log .info ("AI ๋๊ธ ์ก ์คํต - ํ๋ฅด์๋ ๋นํ์ฑ composerId={}" , composer .getId ());
91+ continue ;
92+ }
93+ AiCommentJob job = AiCommentJob .of (post , composer , AiCommentJobTriggerType .POST_CREATED , null , scheduledAt );
94+ aiCommentJobRepository .save (job );
95+ log .info ("AI ๋๊ธ ์ก ๋ฑ๋ก - postId={}, composerId={}, scheduledAt={}" , post .getId (), composer .getId (), scheduledAt );
96+ }
9197 }
9298
9399 @ Transactional
@@ -144,6 +150,24 @@ public List<AiCommentJob> findPendingJobsDue() {
144150 return aiCommentJobRepository .findPendingJobsDue (AiCommentJobStatus .PENDING , Instant .now ());
145151 }
146152
153+ private List <Composer > getComposersForPost (Post post ) {
154+ List <Composer > composers = new ArrayList <>();
155+
156+ Composer primary = getComposerFromPost (post );
157+ if (primary != null ) {
158+ composers .add (primary );
159+ }
160+
161+ String text = post .getTitle () + " " + post .getContent ();
162+ for (Composer c : detectComposersFromContent (text )) {
163+ if (composers .stream ().noneMatch (existing -> existing .getId ().equals (c .getId ()))) {
164+ composers .add (c );
165+ }
166+ }
167+
168+ return composers ;
169+ }
170+
147171 private Composer getComposerFromPost (Post post ) {
148172 if (post instanceof StoryPost storyPost ) {
149173 return storyPost .getPrimaryComposer ();
@@ -154,15 +178,16 @@ private Composer getComposerFromPost(Post post) {
154178 return null ;
155179 }
156180
157- private Composer detectComposerFromContent (String text ) {
181+ private List < Composer > detectComposersFromContent (String text ) {
158182 List <ComposerPersona > activePersonas = composerPersonaRepository .findAllActiveWithComposer ();
183+ List <Composer > result = new ArrayList <>();
159184 for (ComposerPersona persona : activePersonas ) {
160185 Composer composer = persona .getComposer ();
161186 if (text .contains (composer .getKoreanName ()) || text .contains (composer .getEnglishName ())) {
162- return composer ;
187+ result . add ( composer ) ;
163188 }
164189 }
165- return null ;
190+ return result ;
166191 }
167192
168193 private String buildSystemInstruction (ComposerPersona persona ) {
0 commit comments