@@ -2,9 +2,13 @@ import {
22 createMatrixUserLinkAction ,
33 decryptMatrixToken ,
44 determineEnvironment ,
5+ Environment ,
56 getDecoratedPrivyId ,
67 getLinkByPrivyUserId ,
78 MatrixSharedSecret ,
9+ MatrixUserLink ,
10+ updateEncryptedAccessTokenAction ,
11+ updateMatrixUserLink ,
812} from '@hypha-platform/core/server' ;
913import { PrivyClient } from '@privy-io/server-auth' ;
1014import { NextRequest , NextResponse } from 'next/server' ;
@@ -14,6 +18,7 @@ const PRIVY_APP_SECRET = process.env.PRIVY_APP_SECRET ?? '';
1418const MATRIX_HOMESERVER_URL =
1519 process . env . NEXT_PUBLIC_MATRIX_HOMESERVER_URL ?? '' ;
1620const DEFAULT_ROOM_ID = process . env . DEFAULT_ROOM_ID ?? '' ;
21+ const ADMIN_SUFFIX = 'hypha_admin' ;
1722
1823export async function GET ( request : NextRequest ) {
1924 const authHeader = request . headers . get ( 'Authorization' ) ;
@@ -31,6 +36,35 @@ export async function GET(request: NextRequest) {
3136 const privy = new PrivyClient ( PRIVY_APP_ID , PRIVY_APP_SECRET ) ;
3237 const matrixAuthClient = new MatrixSharedSecret ( ) ;
3338
39+ const getAdminRecord = async (
40+ adminUsername : string ,
41+ environment : Environment ,
42+ authToken : string ,
43+ ) => {
44+ const record = await getLinkByPrivyUserId ( {
45+ privyUserId : adminUsername ,
46+ environment,
47+ } ) ;
48+ if ( record ) {
49+ return record ;
50+ }
51+ const {
52+ accessToken : encryptedAccessToken ,
53+ deviceId,
54+ userId : matrixUserId ,
55+ } = await matrixAuthClient . registerUser ( adminUsername , true ) ;
56+ return ( await createMatrixUserLinkAction (
57+ {
58+ environment,
59+ encryptedAccessToken,
60+ deviceId,
61+ matrixUserId,
62+ privyUserId : adminUsername ,
63+ } ,
64+ { authToken } ,
65+ ) ) as MatrixUserLink ;
66+ } ;
67+
3468 try {
3569 const authToken = authHeader . replace ( 'Bearer ' , '' ) ;
3670 const { userId : privyUserId } = await privy . verifyAuthToken ( authToken ) ;
@@ -51,7 +85,63 @@ export async function GET(request: NextRequest) {
5185 } ,
5286 } ) ;
5387 } else {
54- //TODO: update access token
88+ const adminMatrixUsername = getDecoratedPrivyId (
89+ ADMIN_SUFFIX ,
90+ environment ,
91+ ) ;
92+ const admin = await getAdminRecord (
93+ adminMatrixUsername ,
94+ environment ,
95+ authToken ,
96+ ) ;
97+ if ( admin ) {
98+ const adminAccessToken = decryptMatrixToken (
99+ admin . encryptedAccessToken ,
100+ ) ;
101+ const { ok, password } = await matrixAuthClient . resetPassword (
102+ existing . matrixUserId ,
103+ adminAccessToken ,
104+ ) ;
105+ if ( ok ) {
106+ const {
107+ accessToken : encryptedAccessToken ,
108+ deviceId,
109+ userId : matrixUserId ,
110+ } = await matrixAuthClient . loginUser (
111+ existing . matrixUserId ,
112+ password ,
113+ ) ;
114+
115+ await updateEncryptedAccessTokenAction (
116+ {
117+ privyUserId,
118+ environment,
119+ encryptedAccessToken,
120+ } ,
121+ { authToken } ,
122+ ) ;
123+
124+ return NextResponse . json ( {
125+ accessToken : decryptMatrixToken ( encryptedAccessToken ) ,
126+ userId : matrixUserId ,
127+ homeserverUrl : MATRIX_HOMESERVER_URL ,
128+ deviceId,
129+ elementConfig : {
130+ // defaultRoomId: DEFAULT_ROOM_ID,
131+ theme : 'dark' ,
132+ } ,
133+ } ) ;
134+ }
135+
136+ return NextResponse . json (
137+ {
138+ error : 'Token generation failed' ,
139+ } ,
140+ {
141+ status : 500 ,
142+ } ,
143+ ) ;
144+ }
55145 }
56146 }
57147
@@ -62,6 +152,58 @@ export async function GET(request: NextRequest) {
62152 userId : matrixUserId ,
63153 } = await matrixAuthClient . registerUser ( matrixUsername ) ;
64154
155+ if ( ! encryptedAccessToken ) {
156+ const adminMatrixUsername = getDecoratedPrivyId (
157+ ADMIN_SUFFIX ,
158+ environment ,
159+ ) ;
160+ const admin = await getAdminRecord (
161+ adminMatrixUsername ,
162+ environment ,
163+ authToken ,
164+ ) ;
165+ const adminAccessToken = decryptMatrixToken ( admin . encryptedAccessToken ) ;
166+ const { ok, password } = await matrixAuthClient . resetPassword (
167+ matrixUserId ,
168+ adminAccessToken ,
169+ ) ;
170+ if ( ok ) {
171+ const {
172+ accessToken : encryptedAccessToken ,
173+ deviceId,
174+ userId,
175+ } = await matrixAuthClient . loginUser ( matrixUserId , password ) ;
176+
177+ await updateEncryptedAccessTokenAction (
178+ {
179+ privyUserId,
180+ environment,
181+ encryptedAccessToken,
182+ } ,
183+ { authToken } ,
184+ ) ;
185+
186+ return NextResponse . json ( {
187+ accessToken : decryptMatrixToken ( encryptedAccessToken ) ,
188+ userId,
189+ homeserverUrl : MATRIX_HOMESERVER_URL ,
190+ deviceId,
191+ elementConfig : {
192+ // defaultRoomId: DEFAULT_ROOM_ID,
193+ theme : 'dark' ,
194+ } ,
195+ } ) ;
196+ }
197+ return NextResponse . json (
198+ {
199+ error : 'Token generation failed' ,
200+ } ,
201+ {
202+ status : 500 ,
203+ } ,
204+ ) ;
205+ }
206+
65207 await createMatrixUserLinkAction (
66208 {
67209 environment,
0 commit comments