@@ -672,20 +672,61 @@ func (s *RestServer) SearchDocuments(collection, subset string, categories []str
672672}
673673
674674func (s * RestServer ) getLatest (request * restful.Request , response * restful.Response ) {
675- n , err := ParseInt (request , "n" , s .Config .Server .DefaultN )
676- if err != nil {
677- BadRequest (response , errors .New ("invalid n parameter" ))
675+ var (
676+ offset int
677+ n int
678+ err error
679+ )
680+ ctx := request .Request .Context ()
681+ if offset , err = ParseInt (request , "offset" , 0 ); err != nil {
682+ BadRequest (response , errors .Errorf ("invalid offset parameter: %v" , err ))
683+ return
684+ }
685+ if n , err = ParseInt (request , "n" , s .Config .Server .DefaultN ); err != nil {
686+ BadRequest (response , errors .Errorf ("invalid n parameter: %v" , err ))
678687 return
679688 }
680-
681689 categories := ReadCategories (request , nil )
682- log .ResponseLogger (response ).Debug ("get category latest items in category" , zap .Strings ("categories" , categories ))
690+ userId := request .QueryParameter ("user-id" )
691+
692+ readItems := mapset .NewSet [string ]()
693+ if userId != "" {
694+ feedback , err := s .DataClient .GetUserFeedback (ctx , userId , s .Config .Now ())
695+ if err != nil {
696+ InternalServerError (response , err )
697+ return
698+ }
699+ for _ , f := range feedback {
700+ readItems .Add (f .ItemId )
701+ }
702+ }
703+
704+ limit := offset + n
705+ if readItems .Cardinality () > 0 {
706+ limit += readItems .Cardinality ()
707+ }
683708
684- items , err := s .DataClient .GetLatestItems (request . Request . Context (), n , categories )
709+ items , err := s .DataClient .GetLatestItems (ctx , limit , categories )
685710 if err != nil {
686711 InternalServerError (response , err )
687712 return
688713 }
714+
715+ if readItems .Cardinality () > 0 {
716+ filtered := make ([]data.Item , 0 , len (items ))
717+ for _ , item := range items {
718+ if ! readItems .Contains (item .ItemId ) {
719+ filtered = append (filtered , item )
720+ }
721+ }
722+ items = filtered
723+ }
724+
725+ items = items [min (offset , len (items )):]
726+ if n > 0 && len (items ) > n {
727+ items = items [:n ]
728+ }
729+
689730 Ok (response , lo .Map (items , func (item data.Item , _ int ) cache.Score {
690731 return cache.Score {
691732 Id : item .ItemId ,
0 commit comments