Skip to content

Commit d7c2a6e

Browse files
authored
Merge pull request #55 from unisoncomputing/cp/tag-orgs-in-search
Add Org Tags in User Search
2 parents da1cfdc + d42129f commit d7c2a6e

6 files changed

Lines changed: 73 additions & 7 deletions

File tree

src/Share/Postgres/Users/Queries.hs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{-# LANGUAGE DisambiguateRecordFields #-}
22
{-# LANGUAGE DuplicateRecordFields #-}
3+
{-# LANGUAGE TypeOperators #-}
34

45
-- | Common queries for users.
56
module Share.Postgres.Users.Queries
@@ -266,18 +267,20 @@ findOrCreateGithubUser authZReceipt ghu@(GithubUser _login githubUserId _avatarU
266267
Nothing -> do
267268
New <$> createFromGithubUser authZReceipt ghu primaryEmail
268269

269-
searchUsersByNameOrHandlePrefix :: Query -> Limit -> PG.Transaction e [User]
270+
searchUsersByNameOrHandlePrefix :: Query -> Limit -> PG.Transaction e [(User, Maybe OrgId)]
270271
searchUsersByNameOrHandlePrefix (Query prefix) (Limit limit) = do
271272
let q = likeEscape prefix <> "%"
272-
PG.queryListRows
273+
PG.queryListRows @(User PG.:. (PG.Only (Maybe OrgId)))
273274
[PG.sql|
274-
SELECT u.id, u.name, u.primary_email, u.avatar_url, u.handle, u.private
275+
SELECT u.id, u.name, u.primary_email, u.avatar_url, u.handle, u.private, org.id
275276
FROM users u
277+
LEFT JOIN orgs org ON org.user_id = u.id
276278
WHERE (u.handle ILIKE #{q}
277279
OR u.name ILIKE #{q}
278280
) AND NOT u.private
279281
LIMIT #{limit}
280282
|]
283+
<&> fmap \(user PG.:. PG.Only mayOrgId) -> (user, mayOrgId)
281284

282285
data UserCreationError
283286
= UserHandleTaken UserHandle

src/Share/Web/Share/Impl.hs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import Share.Web.Share.Branches.Impl qualified as Branches
4747
import Share.Web.Share.CodeBrowsing.API (CodeBrowseAPI)
4848
import Share.Web.Share.Contributions.Impl qualified as Contributions
4949
import Share.Web.Share.DefinitionSearch qualified as DefinitionSearch
50-
import Share.Web.Share.DisplayInfo (UserDisplayInfo (..))
50+
import Share.Web.Share.DisplayInfo (OrgDisplayInfo (..), UserDisplayInfo (..))
5151
import Share.Web.Share.Orgs.Queries qualified as OrgQ
5252
import Share.Web.Share.Orgs.Types (Org (..))
5353
import Share.Web.Share.Projects.Impl qualified as Projects
@@ -368,8 +368,10 @@ searchEndpoint (MaybeAuthedUserID callerUserId) (Query query) (fromMaybe (Limit
368368
pure (users, projects)
369369
let userResults =
370370
users
371-
<&> \User {user_name = name, avatar_url = avatarUrl, handle, user_id = userId} ->
372-
SearchResultUser (UserDisplayInfo {handle, name, avatarUrl = unpackURI <$> avatarUrl, userId})
371+
<&> \(User {user_name = name, avatar_url = avatarUrl, handle, user_id = userId}, mayOrgId) ->
372+
case mayOrgId of
373+
Just orgId -> SearchResultOrg (OrgDisplayInfo {user = UserDisplayInfo {handle, name, avatarUrl = unpackURI <$> avatarUrl, userId}, orgId})
374+
Nothing -> SearchResultUser (UserDisplayInfo {handle, name, avatarUrl = unpackURI <$> avatarUrl, userId})
373375
let projectResults =
374376
projects
375377
<&> \(Project {slug, summary, visibility}, ownerHandle) ->

src/Share/Web/Share/Types.hs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import Share.Project (ProjectVisibility)
1414
import Share.Utils.API (NullableUpdate, parseNullableUpdate)
1515
import Share.Utils.URI
1616
import Share.Web.Authorization.Types (RolePermission)
17-
import Share.Web.Share.DisplayInfo (UserDisplayInfo (..))
17+
import Share.Web.Share.DisplayInfo (OrgDisplayInfo (..), UserDisplayInfo (..))
1818
import Unison.Name (Name)
1919
import Unison.Server.Doc (Doc)
2020
import Unison.Server.Share.DefinitionSummary.Types (TermSummary (..), TypeSummary (..))
@@ -105,6 +105,7 @@ data SearchResult
105105
= SearchResultUser UserDisplayInfo
106106
| -- | shorthand summary visibility
107107
SearchResultProject ProjectShortHand (Maybe Text) ProjectVisibility
108+
| SearchResultOrg OrgDisplayInfo
108109
deriving (Show)
109110

110111
instance ToJSON SearchResult where
@@ -117,6 +118,15 @@ instance ToJSON SearchResult where
117118
"userId" .= userId,
118119
"tag" .= ("User" :: Text)
119120
]
121+
SearchResultOrg (OrgDisplayInfo {user = UserDisplayInfo {handle, name, avatarUrl, userId}, orgId}) ->
122+
Aeson.object
123+
[ "handle" .= fromId @UserHandle @Text handle,
124+
"name" .= name,
125+
"avatarUrl" .= avatarUrl,
126+
"userId" .= userId,
127+
"orgId" .= orgId,
128+
"tag" .= ("Org" :: Text)
129+
]
120130
SearchResultProject shorthand summary visibility ->
121131
Aeson.object
122132
[ "projectRef" .= shorthand,
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"body": [
3+
{
4+
"avatarUrl": "https://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d50?f=y&d=retro",
5+
"handle": "unison",
6+
"name": "Unison Org",
7+
"orgId": "ORG-<UUID>",
8+
"tag": "Org",
9+
"userId": "U-<UUID>"
10+
},
11+
{
12+
"projectRef": "@unison/privateorgproject",
13+
"summary": "Private Unison Project",
14+
"tag": "Project",
15+
"visibility": "private"
16+
}
17+
],
18+
"status": [
19+
{
20+
"status_code": 200
21+
}
22+
]
23+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"body": [
3+
{
4+
"avatarUrl": null,
5+
"handle": "test",
6+
"name": null,
7+
"tag": "User",
8+
"userId": "U-<UUID>"
9+
},
10+
{
11+
"projectRef": "@test/publictestproject",
12+
"summary": "test project summary",
13+
"tag": "Project",
14+
"visibility": "public"
15+
}
16+
],
17+
"status": [
18+
{
19+
"status_code": 200
20+
}
21+
]
22+
}

transcripts/share-apis/search/run.zsh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,9 @@ fetch "$transcript_user" GET 'defn-search-project-filter-sad' '/search-definitio
8787
# Release filter
8888
fetch "$transcript_user" GET 'defn-search-release-filter-happy' '/search-definitions?query=map&project-filter=@transcripts%2Fsearch&release-filter=1.2.3'
8989
fetch "$transcript_user" GET 'defn-search-release-filter-sad' '/search-definitions?query=map&project-filter=@test%2Fpublictestproject&release-filter=1.0.0'
90+
91+
# Omni search should find org users
92+
fetch "$transcript_user" GET 'omni-search-orgs' '/search?query=%40uni'
93+
94+
# Omni search should find regular users
95+
fetch "$transcript_user" GET 'omni-search-users' '/search?query=%40tes'

0 commit comments

Comments
 (0)