11package  com .box .l10n .mojito .rest .textunit ;
22
3+ import  com .box .l10n .mojito .entity .AiReviewProto ;
4+ import  com .box .l10n .mojito .entity .PollableTask ;
5+ import  com .box .l10n .mojito .json .ObjectMapper ;
36import  com .box .l10n .mojito .service .oaireview .AiReviewService ;
7+ import  com .box .l10n .mojito .service .pollableTask .PollableFuture ;
8+ import  com .box .l10n .mojito .service .tm .AiReviewProtoRepository ;
49import  com .box .l10n .mojito .service .tm .search .TextUnitDTO ;
510import  com .box .l10n .mojito .service .tm .search .TextUnitSearcher ;
611import  com .box .l10n .mojito .service .tm .search .TextUnitSearcherParameters ;
7- 
812import  java .util .List ;
913import  org .slf4j .Logger ;
1014import  org .slf4j .LoggerFactory ;
11- import  org .springframework .beans .factory .annotation .Autowired ;
15+ import  org .springframework .beans .factory .annotation .Qualifier ;
1216import  org .springframework .http .HttpStatus ;
17+ import  org .springframework .web .bind .annotation .RequestBody ;
1318import  org .springframework .web .bind .annotation .RequestMapping ;
1419import  org .springframework .web .bind .annotation .RequestMethod ;
1520import  org .springframework .web .bind .annotation .ResponseStatus ;
@@ -21,24 +26,62 @@ public class AiReviewWS {
2126  /** logger */ 
2227  static  Logger  logger  = LoggerFactory .getLogger (AiReviewWS .class );
2328
29+   private  final  AiReviewProtoRepository  aiReviewProtoRepository ;
30+   private  final  ObjectMapper  objectMapper ;
31+ 
2432  TextUnitSearcher  textUnitSearcher ;
2533
26-   @ Autowired 
2734  AiReviewService  aiReviewService ;
2835
36+   AiReviewProtoRepository  AiReviewProtoRepository ;
37+ 
2938  public  AiReviewWS (
3039      TextUnitSearcher  textUnitSearcher ,
31-       AiReviewService  aiReviewService ) {
40+       AiReviewService  aiReviewService ,
41+       AiReviewProtoRepository  AiReviewProtoRepository ,
42+       AiReviewProtoRepository  aiReviewProtoRepository ,
43+       @ Qualifier ("AiTranslate" ) ObjectMapper  objectMapper ) {
3244    this .textUnitSearcher  = textUnitSearcher ;
3345    this .aiReviewService  = aiReviewService ;
46+     this .AiReviewProtoRepository  = AiReviewProtoRepository ;
47+     this .aiReviewProtoRepository  = aiReviewProtoRepository ;
48+     this .objectMapper  = objectMapper ;
49+   }
50+ 
51+   @ RequestMapping (method  = RequestMethod .POST , value  = "/api/proto-ai-review" )
52+   @ ResponseStatus (HttpStatus .OK )
53+   public  ProtoAiReviewResponse  aiReview (@ RequestBody  ProtoAiReviewRequest  protoAiReviewRequest ) {
54+ 
55+     PollableFuture <Void > pollableFuture  =
56+         aiReviewService .aiReviewAsync (
57+             new  AiReviewService .AiReviewInput (
58+                 protoAiReviewRequest .repositoryName (),
59+                 protoAiReviewRequest .targetBcp47tags (),
60+                 protoAiReviewRequest .sourceTextMaxCountPerLocale (),
61+                 protoAiReviewRequest .tmTextUnitIds (),
62+                 protoAiReviewRequest .useBatch ()));
63+ 
64+     return  new  ProtoAiReviewResponse (pollableFuture .getPollableTask ());
3465  }
3566
36-   @ RequestMapping (method  = RequestMethod .GET , value  = "/api/proto-ai-review" )
67+   public  record  ProtoAiReviewRequest (
68+       String  repositoryName ,
69+       List <String > targetBcp47tags ,
70+       int  sourceTextMaxCountPerLocale ,
71+       boolean  useBatch ,
72+       List <Long > tmTextUnitIds ,
73+       boolean  allLocales ) {}
74+ 
75+   public  record  ProtoAiReviewResponse (PollableTask  pollableTask ) {}
76+ 
77+   @ RequestMapping (method  = RequestMethod .GET , value  = "/api/proto-ai-review-single-text-unit" )
3778  @ ResponseStatus (HttpStatus .OK )
38-   public  ProtoAiReviewResponse  getTextUnitsWithGet (ProtoAiReviewRequest  protoAiReviewRequest ) {
79+   public  ProtoAiReviewSingleTextUnitResponse  getTextUnitsWithGet (
80+       ProtoAiReviewSingleTextUnitRequest  protoAiReviewSingleTextUnitRequest ) {
3981
4082    TextUnitSearcherParameters  textUnitSearcherParameters  = new  TextUnitSearcherParameters ();
41-     textUnitSearcherParameters .setTmTextUnitVariantId (protoAiReviewRequest .tmTextUnitVariantId );
83+     textUnitSearcherParameters .setTmTextUnitVariantId (
84+         protoAiReviewSingleTextUnitRequest .tmTextUnitVariantId );
4285
4386    List <TextUnitDTO > search  = textUnitSearcher .search (textUnitSearcherParameters );
4487    if  (search .isEmpty ()) {
@@ -47,20 +90,43 @@ public ProtoAiReviewResponse getTextUnitsWithGet(ProtoAiReviewRequest protoAiRev
4790
4891    TextUnitDTO  textUnit  = search .getFirst ();
4992
50-     AiReviewService .AiReviewSingleTextUnitInput  input  =
51-         new  AiReviewService .AiReviewSingleTextUnitInput (
52-             textUnit .getTargetLocale (),
53-             textUnit .getSource (),
54-             textUnit .getComment (),
55-             new  AiReviewService .AiReviewSingleTextUnitInput .ExistingTarget (
56-                 textUnit .getTarget (), !textUnit .isIncludedInLocalizedFile ()));
93+     logger .info ("Check for pre-computed review" );
5794
58-     AiReviewService .AiReviewSingleTextUnitOutput  aiReviewSingleTextUnitOutput  = aiReviewService .getAiReviewSingleTextUnit (input , textUnit );
95+     AiReviewProto  alreadyReviewed  =
96+         aiReviewProtoRepository .findByTmTextUnitVariantId (
97+             protoAiReviewSingleTextUnitRequest .tmTextUnitVariantId ());
98+ 
99+     AiReviewService .AiReviewSingleTextUnitOutput  aiReviewSingleTextUnitOutput  = null ;
100+ 
101+     if  (alreadyReviewed  != null ) {
102+       try  {
103+         aiReviewSingleTextUnitOutput  =
104+             objectMapper .readValueUnchecked (
105+                 alreadyReviewed .getJsonReview (),
106+                 AiReviewService .AiReviewSingleTextUnitOutput .class );
107+       } catch  (RuntimeException  e ) {
108+         logger .warn ("Can't deserialize the existing review, we will recompute" );
109+       }
110+     }
111+ 
112+     if  (aiReviewSingleTextUnitOutput  == null ) {
113+ 
114+       AiReviewService .AiReviewSingleTextUnitInput  input  =
115+           new  AiReviewService .AiReviewSingleTextUnitInput (
116+               textUnit .getTargetLocale (),
117+               textUnit .getSource (),
118+               textUnit .getComment (),
119+               new  AiReviewService .AiReviewSingleTextUnitInput .ExistingTarget (
120+                   textUnit .getTarget (), !textUnit .isIncludedInLocalizedFile ()));
121+ 
122+       aiReviewSingleTextUnitOutput  = aiReviewService .getAiReviewSingleTextUnit (input );
123+     }
59124
60-     return  new  ProtoAiReviewResponse (textUnit , aiReviewSingleTextUnitOutput );
125+     return  new  ProtoAiReviewSingleTextUnitResponse (textUnit , aiReviewSingleTextUnitOutput );
61126  }
62127
63-   public  record  ProtoAiReviewRequest (long  tmTextUnitVariantId ) {}
128+   public  record  ProtoAiReviewSingleTextUnitRequest (long  tmTextUnitVariantId ) {}
64129
65-   public  record  ProtoAiReviewResponse (TextUnitDTO  textUnitDTO , AiReviewService .AiReviewSingleTextUnitOutput  aiReviewOutput ) {}
130+   public  record  ProtoAiReviewSingleTextUnitResponse (
131+       TextUnitDTO  textUnitDTO , AiReviewService .AiReviewSingleTextUnitOutput  aiReviewOutput ) {}
66132}
0 commit comments