Files
gerbeur/api/services/user-service.ts/index.html
2026-11-08 21:22:53 +00:00

366 lines
33 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>api&#x2F;services&#x2F;user-service.ts - gerbeur documentation</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="doc-current-file" content="">
<link rel="stylesheet" href="..&#x2F;..&#x2F;..&#x2F;styles.css">
<link rel="stylesheet" href="..&#x2F;..&#x2F;..&#x2F;page.css">
<link id="ddocResetStylesheet" rel="stylesheet" href="..&#x2F;..&#x2F;..&#x2F;reset.css"><link href="../../../comrak.css" rel="stylesheet" /><link href="../../../prism.css" rel="stylesheet" /><script src="../../../prism.js"></script><script src="..&#x2F;..&#x2F;..&#x2F;script.js" defer></script>
<script src="..&#x2F;..&#x2F;..&#x2F;darkmode_toggle.js"></script><script src="..&#x2F;..&#x2F;..&#x2F;search_index.js" defer></script>
<script src="..&#x2F;..&#x2F;..&#x2F;fuse.js" defer></script>
<script src="..&#x2F;..&#x2F;..&#x2F;search.js" defer></script></head>
<body>
<div class="ddoc">
<div><nav id="topnav">
<div class="h-full">
<div class="flex items-center"><ul class="breadcrumbs">
<li>
<a href="..&#x2F;..&#x2F;..&#x2F;" class="contextLink">gerbeur</a>
</li><span class="text-black dark:text-white"><svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M5.76748 11.8159C5.5378 11.577 5.54525 11.1972 5.78411 10.9675L8.93431 8L5.78411 5.0325C5.54525 4.80282 5.5378 4.423 5.76748 4.18413C5.99715 3.94527 6.37698 3.93782 6.61584 4.1675L10.2158 7.5675C10.3335 7.68062 10.4 7.83679 10.4 8C10.4 8.16321 10.3335 8.31938 10.2158 8.4325L6.61584 11.8325C6.37698 12.0622 5.99715 12.0547 5.76748 11.8159Z"
fill="currentColor"
/>
</svg>
</span>api&#x2F;services&#x2F;user-service.ts</ul>
</div>
<div class="flex items-center gap-2">
<button id="theme-toggle" type="button" aria-label="Toggle dark mode" style="display: none;"><svg
xmlns="http://www.w3.org/2000/svg"
width="14"
height="14"
viewBox="0 0 24 24"
fill="currentColor"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path
d="M12 1.992a10 10 0 1 0 9.236 13.838c.341 -.82 -.476 -1.644 -1.298 -1.31a6.5 6.5 0 0 1 -6.864 -10.787l.077 -.08c.551 -.63 .113 -1.653 -.758 -1.653h-.266l-.068 -.006l-.06 -.002z"
/>
</svg>
<svg
xmlns="http://www.w3.org/2000/svg"
width="14"
height="14"
viewBox="0 0 24 24"
fill="currentColor"
class="hidden"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path
d="M12 19a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z"
/>
<path
d="M18.313 16.91l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.218 -1.567l.102 .07z"
/>
<path
d="M7.007 16.993a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z"
/>
<path
d="M4 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z"
/>
<path
d="M21 11a1 1 0 0 1 .117 1.993l-.117 .007h-1a1 1 0 0 1 -.117 -1.993l.117 -.007h1z"
/>
<path
d="M6.213 4.81l.094 .083l.7 .7a1 1 0 0 1 -1.32 1.497l-.094 -.083l-.7 -.7a1 1 0 0 1 1.217 -1.567l.102 .07z"
/>
<path
d="M19.107 4.893a1 1 0 0 1 .083 1.32l-.083 .094l-.7 .7a1 1 0 0 1 -1.497 -1.32l.083 -.094l.7 -.7a1 1 0 0 1 1.414 0z"
/>
<path
d="M12 2a1 1 0 0 1 .993 .883l.007 .117v1a1 1 0 0 1 -1.993 .117l-.007 -.117v-1a1 1 0 0 1 1 -1z"
/>
<path
d="M12 7a5 5 0 1 1 -4.995 5.217l-.005 -.217l.005 -.217a5 5 0 0 1 4.995 -4.783z"
/>
</svg>
</button>
<input
type="text"
id="searchbar"
style="display: none;"
class="py-2 px-2.5 mx-1 rounded text-sm border border-gray-300 bg-transparent dark:bg-gray-800 dark:border-gray-700"
/>
</div>
</div>
</nav>
<div id="searchResults"></div><div id="content">
<main><section>
<div class="space-y-2 flex-1"><div class="space-y-7" id="module_doc"><div class="markdown"><p>Reads and writes the <code>users</code> table. Its <code>User</code>s carry the password hash and
email, so a route strips them with <code>toPublicUser</code> or <code>toSelfUser</code> before
answering. <code>routes/users.ts</code> is its main caller; <code>lib/auth.ts</code> checks every
token against <a href="../../.././api/services/user-service.ts/~/getSessionState.html">getSessionState</a>.</p>
</div><section class="section" id="api&#x2F;services&#x2F;user-service_ts_functions"><div>
<h2 class="anchorable mb-1"><a href="#api&#x2F;services&#x2F;user-service_ts_functions" class="anchor" aria-label="Anchor" tabIndex="-1"><svg
width="16"
height="16"
viewBox="0 0 14 14"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<g clip-path="url(#clip0_1081_1237)">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M6.80328 2.8656C6.68736 2.99 6.62425 3.15454 6.62725 3.32456C6.63025 3.49457 6.69913 3.65678 6.81936 3.77702C6.9396 3.89725 7.10181 3.96613 7.27182 3.96913C7.44184 3.97213 7.60638 3.90902 7.73078 3.7931L8.82453 2.69935C8.98712 2.53676 9.18015 2.40778 9.39259 2.31978C9.60503 2.23179 9.83272 2.1865 10.0627 2.1865C10.2926 2.1865 10.5203 2.23179 10.7327 2.31978C10.9452 2.40778 11.1382 2.53676 11.3008 2.69935C11.4634 2.86194 11.5923 3.05497 11.6803 3.2674C11.7683 3.47984 11.8136 3.70753 11.8136 3.93747C11.8136 4.16741 11.7683 4.3951 11.6803 4.60754C11.5923 4.81998 11.4634 5.013 11.3008 5.1756L9.11328 7.3631C8.95075 7.52581 8.75775 7.65488 8.5453 7.74295C8.33285 7.83102 8.10513 7.87635 7.87516 7.87635C7.64518 7.87635 7.41746 7.83102 7.20501 7.74295C6.99256 7.65488 6.79956 7.52581 6.63703 7.3631C6.51263 7.24718 6.34809 7.18407 6.17807 7.18707C6.00806 7.19007 5.84585 7.25894 5.72561 7.37918C5.60538 7.49942 5.5365 7.66163 5.5335 7.83164C5.5305 8.00165 5.59361 8.1662 5.70953 8.2906C5.99391 8.57501 6.33154 8.80062 6.70312 8.95455C7.0747 9.10847 7.47296 9.18769 7.87516 9.18769C8.27736 9.18769 8.67562 9.10847 9.0472 8.95455C9.41878 8.80062 9.7564 8.57501 10.0408 8.2906L12.2283 6.1031C12.8026 5.52874 13.1253 4.74974 13.1253 3.93747C13.1253 3.12521 12.8026 2.34621 12.2283 1.77185C11.6539 1.19749 10.8749 0.874817 10.0627 0.874817C9.25039 0.874817 8.47139 1.19749 7.89703 1.77185L6.80328 2.8656ZM2.69953 11.3006C2.53682 11.1381 2.40774 10.9451 2.31968 10.7326C2.23161 10.5202 2.18628 10.2924 2.18628 10.0625C2.18628 9.8325 2.23161 9.60477 2.31968 9.39233C2.40774 9.17988 2.53682 8.98688 2.69953 8.82435L4.88703 6.63685C5.04956 6.47414 5.24256 6.34506 5.45501 6.25699C5.66746 6.16893 5.89518 6.1236 6.12516 6.1236C6.35513 6.1236 6.58285 6.16893 6.7953 6.25699C7.00775 6.34506 7.20075 6.47414 7.36328 6.63685C7.48768 6.75277 7.65223 6.81588 7.82224 6.81288C7.99225 6.80988 8.15446 6.741 8.2747 6.62077C8.39494 6.50053 8.46381 6.33832 8.46681 6.1683C8.46981 5.99829 8.4067 5.83375 8.29078 5.70935C8.0064 5.42494 7.66878 5.19933 7.2972 5.0454C6.92562 4.89148 6.52736 4.81225 6.12516 4.81225C5.72296 4.81225 5.3247 4.89148 4.95312 5.0454C4.58154 5.19933 4.24391 5.42494 3.95953 5.70935L1.77203 7.89685C1.19767 8.47121 0.875 9.25021 0.875 10.0625C0.875 10.8747 1.19767 11.6537 1.77203 12.2281C2.34639 12.8025 3.12539 13.1251 3.93766 13.1251C4.74992 13.1251 5.52892 12.8025 6.10328 12.2281L7.19703 11.1343C7.31295 11.0099 7.37606 10.8454 7.37306 10.6754C7.37006 10.5054 7.30119 10.3432 7.18095 10.2229C7.06071 10.1027 6.8985 10.0338 6.72849 10.0308C6.55848 10.0278 6.39393 10.0909 6.26953 10.2068L5.17578 11.3006C5.01325 11.4633 4.82025 11.5924 4.6078 11.6805C4.39535 11.7685 4.16763 11.8138 3.93766 11.8138C3.70768 11.8138 3.47996 11.7685 3.26751 11.6805C3.05506 11.5924 2.86206 11.4633 2.69953 11.3006Z"
fill="currentColor"
/>
</g>
<defs>
<clipPath id="clip0_1081_1237">
<rect width="14" height="14" fill="white" />
</clipPath>
</defs>
</svg>
</a>
Functions</h2></div><div class="namespaceSection"><div id="namespace_assertlocaluser" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;assertLocalUser.html" title="assertLocalUser">
<span>assertLocalUser</span><span>(<span><span>user<span>: <span class="td-ref">User</span></span></span></span>)<span>: <span class="td-kw">void</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Throws a 400 when <code>user</code>'s account lives on another instance
(<a href="../../.././api/model/user.ts/~/isRemoteUser.html">isRemoteUser</a>), whose password, email, avatar and name are that
instance's to change. The routes that change them call it first.</p>
</div></div></div>
</div><div id="namespace_createremoteuser" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;createRemoteUser.html" title="createRemoteUser">
<span>createRemoteUser</span><span>(<div class="ml-4"><div><span>request<span>: { username<span>: <span class="td-kw">string</span></span>; email<span>: <span class="td-kw">string</span></span>; }</span></span>,</div><div><span>inviterId<span>: <span><span class="td-kw">string</span><span class="td-op"> | </span><span class="td-kw">null</span></span></span></span></div></div>)<span>: <span class="td-ref">User</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Creates the account of a user from another instance, named <code>username</code>
(their handle here, <code>name@host</code>), with no password, for
<code>federation-service.ts</code>, which links it to their identity there in the same
transaction. <code>inviterId</code> is whoever invited them, or null when their
instance is trusted.</p>
</div></div></div>
</div><div id="namespace_createuser" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;createUser.html" title="createUser">
<span>createUser</span><span>(<div class="ml-4"><div><span>request<span>: <span class="td-ref">RegisterUserRequest</span></span></span>,</div><div><span>inviterId<span>: <span><span class="td-kw">string</span><span class="td-op"> | </span><span class="td-kw">null</span></span></span></span></div></div>)<span>: <span class="td-ref">Promise</span>&lt;<span class="td-ref">User</span>&gt;</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Creates a user with the <code>user</code> role, invited by <code>inviterId</code>, for
<code>POST /api/users</code>. The caller has validated <code>request</code> and claimed the
invite.</p>
</div></div></div>
</div><div id="namespace_getinvitetree" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;getInviteTree.html" title="getInviteTree">
<span>getInviteTree</span><span>(<span><span>userId<span>: <span class="td-kw">string</span></span></span></span>)<span>: <span class="td-ref">Invitee</span>[]</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Returns everyone <code>userId</code> invited, and everyone they invited in turn, eleven
levels deep at most, in sign-up order, for the profile page's invite tree
(<code>GET /api/users/:key/invitees</code>).</p>
</div></div></div>
</div><div id="namespace_getsessionstate" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;getSessionState.html" title="getSessionState">
<span>getSessionState</span><span>(<span><span>userId<span>: <span class="td-kw">string</span></span></span></span>)<span>: <div class="ml-indent"><span>{ role<span>: <span class="td-ref">Role</span></span>; tokensValidAfter<span>: <span><span class="td-kw">string</span><span class="td-op"> | </span><span class="td-kw">null</span></span></span>; }</span><br /><span><span class="td-op"> | </span><span class="td-kw">undefined</span></span></div></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Returns the user's live role and their last password change, before which
their tokens don't count, or undefined when the user is gone, or comes from
another instance while an admin blocks it or the deployment turns sign-ins
from other instances off (<code>FEDERATION.incoming</code>). <code>lib/auth.ts</code> checks
every session and media token against it.</p>
</div></div></div>
</div><div id="namespace_getuserbyemail" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;getUserByEmail.html" title="getUserByEmail">
<span>getUserByEmail</span><span>(<span><span>email<span>: <span class="td-kw">string</span></span></span></span>)<span>: <span><span class="td-ref">User</span><span class="td-op"> | </span><span class="td-kw">null</span></span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Returns the local user whose email is <code>email</code>, in any case, or null, for
<code>requestPasswordReset</code>. An account from another instance has no password
here to reset.</p>
</div></div></div>
</div><div id="namespace_getuserbyid" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;getUserById.html" title="getUserById">
<span>getUserById</span><span>(<span><span>userId<span>: <span class="td-kw">string</span></span></span></span>)<span>: <span class="td-ref">User</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Returns user <code>userId</code>, with their hash and email.</p>
</div></div></div>
</div><div id="namespace_getuserbyusername" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;getUserByUsername.html" title="getUserByUsername">
<span>getUserByUsername</span><span>(<span><span>username<span>: <span class="td-kw">string</span></span></span></span>)<span>: <span class="td-ref">User</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Returns the user named <code>username</code> now, in any case, with their hash and
email. Signing in takes it: a former name doesn't sign in.</p>
</div></div></div>
</div><div id="namespace_listnewusers" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;listNewUsers.html" title="listNewUsers">
<span>listNewUsers</span><span>(<div class="ml-4"><div><span>from<span>: <span class="td-ref">Date</span></span></span>,</div><div><span>to<span>: <span class="td-ref">Date</span></span></span></div></div>)<span>: <span class="td-ref">PublicUser</span>[]</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Returns the users who joined from <code>from</code> to <code>to</code>, in sign-up order, each
with the name of whoever invited them. The community service gathers them
for the <code>/community</code> page and the digests.</p>
</div></div></div>
</div><div id="namespace_renameuser" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;renameUser.html" title="renameUser">
<span>renameUser</span><span>(<div class="ml-4"><div><span>userId<span>: <span class="td-kw">string</span></span></span>,</div><div><span>username<span>: <span class="td-kw">string</span></span></span></div></div>)<span>: <span class="td-ref">User</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Renames user <code>userId</code> to <code>username</code>, for <code>PATCH /api/users/:key/username</code>,
which only <code>user:manage</code> may call: users can't rename themselves. Returns
them renamed. The old name becomes an alias of theirs for good, so
<code>/@old/…</code> still reaches them and nobody else may take it; a change of case
alone leaves none, since names are looked up in any case. Taking back a
former name of their own is allowed. Their dumps' and playlists' slugs
belong to their id, so their paths follow the new name.</p>
</div></div></div>
</div><div id="namespace_resolveuserkey" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;resolveUserKey.html" title="resolveUserKey">
<span>resolveUserKey</span><span>(<span><span>key<span>: <span class="td-kw">string</span></span></span></span>)<span>: <span class="td-ref">User</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Returns the user an API path's key names: <code>@name</code> by their name, current or
former (<a href="../../.././api/services/user-service.ts/~/resolveUsername.html">resolveUsername</a>), anything else by their id. Every route
under <code>/api/users/:key</code> resolves its key with it.</p>
</div></div></div>
</div><div id="namespace_resolveusername" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;resolveUsername.html" title="resolveUsername">
<span>resolveUsername</span><span>(<span><span>username<span>: <span class="td-kw">string</span></span></span></span>)<span>: <span class="td-ref">User</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Returns the user who is or was named <code>username</code>, in any case, or by the
handle another instance gives them (<code>localHandle</code>): a page or an API path
naming a user so reaches them, and the caller sends the client on to their
current name.</p>
</div></div></div>
</div><div id="namespace_revokesessions" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;revokeSessions.html" title="revokeSessions">
<span>revokeSessions</span><span>(<div class="ml-4"><div><span>userId<span>: <span class="td-kw">string</span></span></span>,</div><div><span>at<span>: <span class="td-ref">Date</span></span></span>,</div><div><span>reason<span>: <span class="td-kw">string</span></span></span></div></div>)<span>: <span class="td-kw">void</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Ends every session of user <code>userId</code> opened before <code>at</code>, closing their
sockets with <code>reason</code>: their tokens stop counting
(<code>users.tokens_valid_after</code>, which <code>getSessionState</code> reads). A password
change calls it, and so does the sign-out of a user from another instance,
when that instance says so or an admin blocks it.</p>
</div></div></div>
</div><div id="namespace_searchusers" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;searchUsers.html" title="searchUsers">
<span>searchUsers</span><span>(<div class="ml-4"><div><span>query<span>: <span class="td-kw">string</span></span></span>,</div><div><span>limit<span>: <span class="td-kw">number</span></span></span></div></div>)<span>: <span class="td-ref">UserSuggestion</span>[]</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Returns up to <code>limit</code> users whose name starts with <code>query</code>, for the editor's</p>
</div></div></div>
</div><div id="namespace_searchusersglobal" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;searchUsersGlobal.html" title="searchUsersGlobal">
<span>searchUsersGlobal</span><span>(<div class="ml-4"><div><span>query<span>: <span class="td-kw">string</span></span></span>,</div><div><span>limit<span>: <span class="td-kw">number</span></span></span></div></div>)<span>: <span class="td-ref">PublicUser</span>[]</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Returns up to <code>limit</code> users whose name or description contains <code>query</code>, for
the <code>/search</code> page (<code>GET /api/search</code>). They are already public profiles.</p>
</div></div></div>
</div><div id="namespace_sendwelcomeemail" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;sendWelcomeEmail.html" title="sendWelcomeEmail">
<span>sendWelcomeEmail</span><span>(<span><span>user<span>: <span class="td-ref">User</span></span></span></span>)<span>: <span class="td-kw">void</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Emails <code>user</code> the welcome message, if email is configured. The register
route calls it once the account exists, and doesn't wait: a slow or failing
SMTP server mustn't hold up the sign-up, so a failure is only logged.</p>
</div></div></div>
</div><div id="namespace_setuseravatar" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;setUserAvatar.html" title="setUserAvatar">
<span>setUserAvatar</span><span>(<div class="ml-4"><div><span>userId<span>: <span class="td-kw">string</span></span></span>,</div><div><span>data<span>: <span class="td-ref">Uint8Array</span></span></span></div></div>)<span>: <span class="td-ref">Promise</span>&lt;<span class="td-ref">User</span>&gt;</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Makes the image <code>data</code> user <code>userId</code>'s avatar and returns them, for an
upload (<code>PUT /api/me/avatar</code>) and for the avatar a user from another
instance has there (<code>federation-service.ts</code>). Presence alone would update
only the online list, so it also sends <code>user_updated</code>, which reaches every
avatar on screen, its bumped <code>updatedAt</code> busting their cache.</p>
</div></div></div>
</div><div id="namespace_setusername" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;setUsername.html" title="setUsername">
<span>setUsername</span><span>(<div class="ml-4"><div><span>userId<span>: <span class="td-kw">string</span></span></span>,</div><div><span>username<span>: <span class="td-kw">string</span></span></span></div></div>)<span>: <span class="td-ref">User</span></span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Names user <code>userId</code> <code>username</code>, keeping the old name as their alias as
<a href="../../.././api/services/user-service.ts/~/renameUser.html">renameUser</a> describes, and returns them. The caller has checked the
name: <a href="../../.././api/services/user-service.ts/~/renameUser.html">renameUser</a> checks a local one, and <code>federation-service.ts</code>
the handle of a user renamed on their home instance.</p>
</div></div></div>
</div><div id="namespace_updateuser" class="namespaceItem" ><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<div class="namespaceItemContent">
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;services&#x2F;user-service.ts&#x2F;~&#x2F;updateUser.html" title="updateUser">
<span>updateUser</span><span>(<div class="ml-4"><div><span>userId<span>: <span class="td-kw">string</span></span></span>,</div><div><span>request<span>: <span class="td-ref">UpdateUserRequest</span></span></span></div></div>)<span>: <span class="td-ref">Promise</span>&lt;<span class="td-ref">User</span>&gt;</span></span></a><div class="namespaceItemContentDoc"><div class="markdown_summary"><p>Applies <code>request</code> to user <code>userId</code> and returns the updated user. It trusts
<code>request</code>: the routes pick the fields a caller may change. The username
changes through <a href="../../.././api/services/user-service.ts/~/renameUser.html">renameUser</a> alone, which keeps the old one as an
alias. A new password also ends every session opened before it and closes
the user's sockets, so the caller must issue fresh tokens if the user is to
stay signed in. A <code>description</code> of null keeps the current one.</p>
</div></div></div>
</div></div>
</section>
</div>
</div>
</section>
</main><div class="toc">
<div><div class="usageContent">
<h3>Usage</h3><div class="markdown"><pre class="highlight"><code class="language-typescript">import * as mod from &quot;api/services/user-service.ts&quot;;
</code><button class="copyButton" data-copy="import * as mod from &quot;api/services/user-service.ts&quot;;
"><svg
class="copy"
width="15"
height="15"
viewBox="0 0 15 15"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<rect x="2" y="2" width="7" height="7" fill="none" />
<rect x="6" y="6" width="7" height="7" fill="none" />
<path
d="M1.55566 2.7C1.55566 2.03726 2.09292 1.5 2.75566 1.5H8.75566C9.41841 1.5 9.95566 2.03726 9.95566 2.7V5.1H12.3557C13.0184 5.1 13.5557 5.63726 13.5557 6.3V12.3C13.5557 12.9627 13.0184 13.5 12.3557 13.5H6.35566C5.69292 13.5 5.15566 12.9627 5.15566 12.3V9.9H2.75566C2.09292 9.9 1.55566 9.36274 1.55566 8.7V2.7ZM6.35566 9.9V12.3H12.3557V6.3H9.95566V8.7C9.95566 9.36274 9.41841 9.9 8.75566 9.9H6.35566ZM8.75566 8.7V2.7H2.75566V8.7H8.75566Z"
fill="currentColor"
/>
</svg>
<svg
class="check"
width="15"
height="15"
viewBox="0 0 24 24"
stroke-width="2"
stroke="currentColor"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
xmlns="http://www.w3.org/2000/svg"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M5 12l5 5l10 -10" />
</svg>
</button><code></code></pre>
</div></div><nav class="topSymbols">
<h3>Symbols</h3>
<ul><li>
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;middleware&#x2F;auth.ts&#x2F;~&#x2F;AuthState.html" title="AuthState"><div class="docNodeKindIcon"><div class="text-Interface bg-Interface/15 dark:text-InterfaceDark dark:bg-InterfaceDark/15" title="Interface">I</div></div>
<span class="hover:bg-Interface/15 hover:bg-InterfaceDark/15">
AuthState
</span>
</a>
</li><li>
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;middleware&#x2F;auth.ts&#x2F;~&#x2F;AuthContext.html" title="AuthContext"><div class="docNodeKindIcon"><div class="text-TypeAlias bg-TypeAlias/15 dark:text-TypeAliasDark dark:bg-TypeAliasDark/15" title="Type Alias">T</div></div>
<span class="hover:bg-TypeAlias/15 hover:bg-TypeAliasDark/15">
AuthContext
</span>
</a>
</li><li>
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;middleware&#x2F;auth.ts&#x2F;~&#x2F;authMiddleware.html" title="authMiddleware"><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<span class="hover:bg-Function/15 hover:bg-FunctionDark/15">
authMiddleware
</span>
</a>
</li><li>
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;middleware&#x2F;auth.ts&#x2F;~&#x2F;requirePermission.html" title="requirePermission"><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<span class="hover:bg-Function/15 hover:bg-FunctionDark/15">
requirePermission
</span>
</a>
</li><li>
<a href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;api&#x2F;middleware&#x2F;error.ts&#x2F;~&#x2F;errorMiddleware.html" title="errorMiddleware"><div class="docNodeKindIcon"><div class="text-Function bg-Function/15 dark:text-FunctionDark dark:bg-FunctionDark/15" title="Function">f</div></div>
<span class="hover:bg-Function/15 hover:bg-FunctionDark/15">
errorMiddleware
</span>
</a>
</li></ul><a class="flex items-center gap-0.5" href="..&#x2F;..&#x2F;..&#x2F;.&#x2F;all_symbols.html">
<span class="leading-none">view all 1307 symbols</span><svg
width="16"
height="16"
viewBox="0 0 16 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M5.76748 11.8159C5.5378 11.577 5.54525 11.1972 5.78411 10.9675L8.93431 8L5.78411 5.0325C5.54525 4.80282 5.5378 4.423 5.76748 4.18413C5.99715 3.94527 6.37698 3.93782 6.61584 4.1675L10.2158 7.5675C10.3335 7.68062 10.4 7.83679 10.4 8C10.4 8.16321 10.3335 8.31938 10.2158 8.4325L6.61584 11.8325C6.37698 12.0622 5.99715 12.0547 5.76748 11.8159Z"
fill="currentColor"
/>
</svg>
</a></nav><nav class="documentNavigation">
<h3>Document Navigation</h3><ul><li><a href="#api/services/user-service_ts_functions" title="Functions">Functions</a></li><li><ul><li><a href="#namespace_assertlocaluser" title="assertLocalUser">assertLocalUser</a></li><li><a href="#namespace_createremoteuser" title="createRemoteUser">createRemoteUser</a></li><li><a href="#namespace_createuser" title="createUser">createUser</a></li><li><a href="#namespace_getinvitetree" title="getInviteTree">getInviteTree</a></li><li><a href="#namespace_getsessionstate" title="getSessionState">getSessionState</a></li><li><a href="#namespace_getuserbyemail" title="getUserByEmail">getUserByEmail</a></li><li><a href="#namespace_getuserbyid" title="getUserById">getUserById</a></li><li><a href="#namespace_getuserbyusername" title="getUserByUsername">getUserByUsername</a></li><li><a href="#namespace_listnewusers" title="listNewUsers">listNewUsers</a></li><li><a href="#namespace_renameuser" title="renameUser">renameUser</a></li><li><a href="#namespace_resolveuserkey" title="resolveUserKey">resolveUserKey</a></li><li><a href="#namespace_resolveusername" title="resolveUsername">resolveUsername</a></li><li><a href="#namespace_revokesessions" title="revokeSessions">revokeSessions</a></li><li><a href="#namespace_searchusers" title="searchUsers">searchUsers</a></li><li><a href="#namespace_searchusersglobal" title="searchUsersGlobal">searchUsersGlobal</a></li><li><a href="#namespace_sendwelcomeemail" title="sendWelcomeEmail">sendWelcomeEmail</a></li><li><a href="#namespace_setuseravatar" title="setUserAvatar">setUserAvatar</a></li><li><a href="#namespace_setusername" title="setUsername">setUsername</a></li><li><a href="#namespace_updateuser" title="updateUser">updateUser</a></li></ul></li></ul></nav></div>
</div></div>
</div>
</div>
</body>
</html>