6
6
7
7
module Share.Web.Share.Impl where
8
8
9
- import Control.Lens
9
+ import Data.Text qualified as Text
10
10
import Servant
11
+ import Control.Lens
11
12
import Share.Codebase qualified as Codebase
12
13
import Share.Codebase.Types qualified as Codebase
13
- import Share.IDs (TourId , UserHandle )
14
+ import Share.IDs (TourId , UserHandle ( .. ) )
14
15
import Share.IDs qualified as IDs
15
16
import Share.JWT qualified as JWT
16
17
import Share.OAuth.Session
@@ -27,6 +28,7 @@ import Share.Prelude
27
28
import Share.Project (Project (.. ))
28
29
import Share.Release (Release (.. ))
29
30
import Share.User (User (.. ))
31
+ import Share.User qualified as User
30
32
import Share.UserProfile (UserProfile (.. ))
31
33
import Share.Utils.API
32
34
import Share.Utils.Caching
@@ -340,13 +342,23 @@ getUserReadmeEndpoint (AuthN.MaybeAuthedUserID callerUserId) userHandle = do
340
342
-- all private users in the PG query itself.
341
343
searchEndpoint :: Maybe Session -> Query -> Maybe Limit -> WebApp [SearchResult ]
342
344
searchEndpoint _caller (Query " " ) _limit = pure []
343
- searchEndpoint (MaybeAuthedUserID callerUserId) query (fromMaybe (Limit 20 ) -> limit) = do
345
+ searchEndpoint (MaybeAuthedUserID callerUserId) (Query query) (fromMaybe (Limit 20 ) -> limit) = do
346
+ (userQuery :: Query , (projectUserFilter :: Maybe UserId , projectQuery :: Query )) <-
347
+ fromMaybe query (Text. stripPrefix " @" query)
348
+ & Text. splitOn " /"
349
+ & \ case
350
+ (userQuery : projectQueryText : _rest) -> do
351
+ mayUserId <- PG. runTransaction $ fmap User. user_id <$> Q. userByHandle (UserHandle userQuery)
352
+ pure (Query query, (mayUserId, Query projectQueryText))
353
+ [projectOrUserQuery] -> pure (Query projectOrUserQuery, (Nothing , Query projectOrUserQuery))
354
+ -- This is impossible
355
+ [] -> pure (Query query, (Nothing , Query query))
344
356
-- We don't have a great way to order users and projects together, so we just limit to a max
345
357
-- of 5 users (who match the query as a prefix), then return the rest of the results from
346
358
-- projects.
347
359
(users, projects) <- PG. runTransaction $ do
348
- users <- Q. searchUsersByNameOrHandlePrefix query (Limit 5 )
349
- projects <- Q. searchProjectsByUserQuery callerUserId query limit
360
+ users <- Q. searchUsersByNameOrHandlePrefix userQuery (Limit 5 )
361
+ projects <- Q. searchProjects callerUserId projectUserFilter projectQuery limit
350
362
pure (users, projects)
351
363
let userResults =
352
364
users
0 commit comments