package Ġru . so kom ish al ov . meme ory . db . mongo . impl Ċ Ċ import Ġorg . springframework . context . annotation . Primary Ċ import Ġorg . springframework . data . domain . Page Request Ċ import Ġorg . springframework . data . domain . Sort Ċ import Ġorg . springframework . data . domain . Sort . Direction . DESC Ċ import Ġorg . springframework . data . domain . Sort . Null Handling . NULL S _ LAST Ċ import Ġorg . springframework . data . domain . Sort . Order Ċ import Ġorg . springframework . data . mongodb . core . Reactive Mongo Template Ċ import Ġorg . springframework . data . mongodb . core . index . Index Ċ import Ġorg . springframework . data . mongodb . core . index Ops Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġru . so kom ish al ov . commons . core . reactor . await Ċ import Ġru . so kom ish al ov . commons . core . reactor . await Strict Ċ import Ġru . so kom ish al ov . commons . core . reactor . await Unit Ċ import Ġru . so kom ish al ov . commons . core . string . isNotNull Or Blank Ċ import Ġru . so kom ish al ov . meme ory . core . dto . Me me DTO Ċ import Ġru . so kom ish al ov . meme ory . core . dto . Me mes Page Request DTO Ċ import Ġru . so kom ish al ov . meme ory . db . Channel Service Ċ import Ġru . so kom ish al ov . meme ory . db . Me me Service Ċ import Ġru . so kom ish al ov . meme ory . db . mongo . entity . Me me Ċ import Ġru . so kom ish al ov . meme ory . db . mongo . mapper . Me me Mapper Ċ import Ġru . so kom ish al ov . meme ory . db . mongo . repository . Me me Repository Ċ import Ġjava . time . Duration Ċ Ċ @ Service Ċ @ Primary Ċ class ĠMongo Me me Service ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrepository : ĠMe me Repository , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġchannel Service : ĠChannel Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtemplate : ĠReactive Mongo Template , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġme me Mapper : ĠMe me Mapper Ċ ) Ġ: ĠMe me Service Ġ{ ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġsave ( batch : ĠList < Me me DTO >, Ġttl : ĠDuration ): ĠList < Me me DTO > Ġ{ ĊĠĠĠĠĠĠĠ Ġensure Indexes ( ttl ) ĊĠĠĠĠĠĠĠ Ġval Ġme mes To Insert Ġ= Ġbatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ( repository . exists ById ( it . id )). await Strict (). not () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġme me Mapper . to Entity ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsaved Me mes Ġ= Ġrepository . save All ( me mes To Insert ). await () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġme me Mapper . to Dto List ( saved Me mes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget Page ( request : ĠMe mes Page Request DTO ): ĠList < Me me DTO > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage Request Ġ= ĠPage Request . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . pageNumber Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . pageSize Ġ?: ĠInt . MAX _ VALUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSort . by ( Order ( DESC , Ġ" published At ", ĠNULL S _ LAST )) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfound Me mes Ġ= Ġwhen Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpag inated Ġme mes Ġby Ġspecific Ġprovider ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . provider Id Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ids Ġ= Ġchannel Service ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findBy Provider ( request . provider Id !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . findAll By Channel Id In ( channel Ids , Ġpage Request ). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpag inated Ġme mes Ġby Ġspecific Ġtopic ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . topic Id . isNotNull Or Blank () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ids Ġ= Ġchannel Service ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. findBy Topics ( request . topic Id !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . findAll By Channel Id In ( channel Ids , Ġpage Request ). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpag inated Ġme mes Ġby Ġspecific Ġchannel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . channelId . isNotNull Or Blank () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ids Ġ= ĠlistOf ( request . channelId !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . findAll By Channel Id In ( channel Ids , Ġpage Request ). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpag inated Ġme mes Ġfrom Ġall Ġsources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġrepository . findAll Me mes By ( page Request ). await () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġme me Mapper . to Dto List ( found Me mes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfind ById ( id : ĠString ): ĠMe me DTO ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrepository . findById ( id ). await ()?. let Ġ{ Ġme me Mapper . to Dto ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġensure Indexes ( ttl : ĠDuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindexes Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIndex (). on (" createdAt ", ĠDESC ). expire ( ttl ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIndex (). on (" published At ", ĠDESC ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġindexes . forEach Ġ{ Ġtemplate . index Ops < Me me >(). ensure Index ( it ). await Unit () Ġ} ĊĠĠĠ Ġ} Ċ }