Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/Share/Postgres/Users/Queries.hs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{-# LANGUAGE DisambiguateRecordFields #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE TypeOperators #-}

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

searchUsersByNameOrHandlePrefix :: Query -> Limit -> PG.Transaction e [User]
searchUsersByNameOrHandlePrefix :: Query -> Limit -> PG.Transaction e [(User, Maybe OrgId)]
searchUsersByNameOrHandlePrefix (Query prefix) (Limit limit) = do
let q = likeEscape prefix <> "%"
PG.queryListRows
PG.queryListRows @(User PG.:. (PG.Only (Maybe OrgId)))
[PG.sql|
SELECT u.id, u.name, u.primary_email, u.avatar_url, u.handle, u.private
SELECT u.id, u.name, u.primary_email, u.avatar_url, u.handle, u.private, org.id
FROM users u
LEFT JOIN orgs org ON org.user_id = u.id
WHERE (u.handle ILIKE #{q}
OR u.name ILIKE #{q}
) AND NOT u.private
LIMIT #{limit}
|]
<&> fmap \(user PG.:. PG.Only mayOrgId) -> (user, mayOrgId)

data UserCreationError
= UserHandleTaken UserHandle
Expand Down
8 changes: 5 additions & 3 deletions src/Share/Web/Share/Impl.hs
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ import Share.Web.Share.Branches.Impl qualified as Branches
import Share.Web.Share.CodeBrowsing.API (CodeBrowseAPI)
import Share.Web.Share.Contributions.Impl qualified as Contributions
import Share.Web.Share.DefinitionSearch qualified as DefinitionSearch
import Share.Web.Share.DisplayInfo (UserDisplayInfo (..))
import Share.Web.Share.DisplayInfo (OrgDisplayInfo (..), UserDisplayInfo (..))
import Share.Web.Share.Orgs.Queries qualified as OrgQ
import Share.Web.Share.Orgs.Types (Org (..))
import Share.Web.Share.Projects.Impl qualified as Projects
Expand Down Expand Up @@ -368,8 +368,10 @@ searchEndpoint (MaybeAuthedUserID callerUserId) (Query query) (fromMaybe (Limit
pure (users, projects)
let userResults =
users
<&> \User {user_name = name, avatar_url = avatarUrl, handle, user_id = userId} ->
SearchResultUser (UserDisplayInfo {handle, name, avatarUrl = unpackURI <$> avatarUrl, userId})
<&> \(User {user_name = name, avatar_url = avatarUrl, handle, user_id = userId}, mayOrgId) ->
case mayOrgId of
Just orgId -> SearchResultOrg (OrgDisplayInfo {user = UserDisplayInfo {handle, name, avatarUrl = unpackURI <$> avatarUrl, userId}, orgId})
Nothing -> SearchResultUser (UserDisplayInfo {handle, name, avatarUrl = unpackURI <$> avatarUrl, userId})
let projectResults =
projects
<&> \(Project {slug, summary, visibility}, ownerHandle) ->
Expand Down
12 changes: 11 additions & 1 deletion src/Share/Web/Share/Types.hs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import Share.Project (ProjectVisibility)
import Share.Utils.API (NullableUpdate, parseNullableUpdate)
import Share.Utils.URI
import Share.Web.Authorization.Types (RolePermission)
import Share.Web.Share.DisplayInfo (UserDisplayInfo (..))
import Share.Web.Share.DisplayInfo (OrgDisplayInfo (..), UserDisplayInfo (..))
import Unison.Name (Name)
import Unison.Server.Doc (Doc)
import Unison.Server.Share.DefinitionSummary.Types (TermSummary (..), TypeSummary (..))
Expand Down Expand Up @@ -105,6 +105,7 @@ data SearchResult
= SearchResultUser UserDisplayInfo
| -- | shorthand summary visibility
SearchResultProject ProjectShortHand (Maybe Text) ProjectVisibility
| SearchResultOrg OrgDisplayInfo
deriving (Show)

instance ToJSON SearchResult where
Expand All @@ -117,6 +118,15 @@ instance ToJSON SearchResult where
"userId" .= userId,
"tag" .= ("User" :: Text)
]
SearchResultOrg (OrgDisplayInfo {user = UserDisplayInfo {handle, name, avatarUrl, userId}, orgId}) ->
Aeson.object
[ "handle" .= fromId @UserHandle @Text handle,
"name" .= name,
"avatarUrl" .= avatarUrl,
"userId" .= userId,
"orgId" .= orgId,
"tag" .= ("Org" :: Text)
]
SearchResultProject shorthand summary visibility ->
Aeson.object
[ "projectRef" .= shorthand,
Expand Down
23 changes: 23 additions & 0 deletions transcripts/share-apis/search/omni-search-orgs.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"body": [
{
"avatarUrl": "https://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d50?f=y&d=retro",
"handle": "unison",
"name": "Unison Org",
"orgId": "ORG-<UUID>",
"tag": "Org",
"userId": "U-<UUID>"
},
{
"projectRef": "@unison/privateorgproject",
"summary": "Private Unison Project",
"tag": "Project",
"visibility": "private"
}
],
"status": [
{
"status_code": 200
}
]
}
22 changes: 22 additions & 0 deletions transcripts/share-apis/search/omni-search-users.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"body": [
{
"avatarUrl": null,
"handle": "test",
"name": null,
"tag": "User",
"userId": "U-<UUID>"
},
{
"projectRef": "@test/publictestproject",
"summary": "test project summary",
"tag": "Project",
"visibility": "public"
}
],
"status": [
{
"status_code": 200
}
]
}
6 changes: 6 additions & 0 deletions transcripts/share-apis/search/run.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,9 @@ fetch "$transcript_user" GET 'defn-search-project-filter-sad' '/search-definitio
# Release filter
fetch "$transcript_user" GET 'defn-search-release-filter-happy' '/search-definitions?query=map&project-filter=@transcripts%2Fsearch&release-filter=1.2.3'
fetch "$transcript_user" GET 'defn-search-release-filter-sad' '/search-definitions?query=map&project-filter=@test%2Fpublictestproject&release-filter=1.0.0'

# Omni search should find org users
fetch "$transcript_user" GET 'omni-search-orgs' '/search?query=%40uni'

# Omni search should find regular users
fetch "$transcript_user" GET 'omni-search-users' '/search?query=%40tes'