···81818282func (rp *Issues) RepoSingleIssue(w http.ResponseWriter, r *http.Request) {
8383 l := rp.logger.With("handler", "RepoSingleIssue")
8484- user := rp.oauth.GetUser(r)
8484+ user := rp.oauth.GetMultiAccountUser(r)
8585 f, err := rp.repoResolver.Resolve(r)
8686 if err != nil {
8787 l.Error("failed to get repo and knot", "err", err)
···102102103103 userReactions := map[models.ReactionKind]bool{}
104104 if user != nil {
105105- userReactions = db.GetReactionStatusMap(rp.db, user.Did, issue.AtUri())
105105+ userReactions = db.GetReactionStatusMap(rp.db, user.Active.Did, issue.AtUri())
106106 }
107107108108 backlinks, err := db.GetBacklinks(rp.db, issue.AtUri())
···143143144144func (rp *Issues) EditIssue(w http.ResponseWriter, r *http.Request) {
145145 l := rp.logger.With("handler", "EditIssue")
146146- user := rp.oauth.GetUser(r)
146146+ user := rp.oauth.GetMultiAccountUser(r)
147147148148 issue, ok := r.Context().Value("issue").(*models.Issue)
149149 if !ok {
···182182 return
183183 }
184184185185- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueNSID, user.Did, newIssue.Rkey)
185185+ ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueNSID, user.Active.Did, newIssue.Rkey)
186186 if err != nil {
187187 l.Error("failed to get record", "err", err)
188188 rp.pages.Notice(w, noticeId, "Failed to edit issue, no record found on PDS.")
···191191192192 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
193193 Collection: tangled.RepoIssueNSID,
194194- Repo: user.Did,
194194+ Repo: user.Active.Did,
195195 Rkey: newIssue.Rkey,
196196 SwapRecord: ex.Cid,
197197 Record: &lexutil.LexiconTypeDecoder{
···292292293293func (rp *Issues) CloseIssue(w http.ResponseWriter, r *http.Request) {
294294 l := rp.logger.With("handler", "CloseIssue")
295295- user := rp.oauth.GetUser(r)
295295+ user := rp.oauth.GetMultiAccountUser(r)
296296 f, err := rp.repoResolver.Resolve(r)
297297 if err != nil {
298298 l.Error("failed to get repo and knot", "err", err)
···306306 return
307307 }
308308309309- roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
309309+ roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
310310 isRepoOwner := roles.IsOwner()
311311 isCollaborator := roles.IsCollaborator()
312312- isIssueOwner := user.Did == issue.Did
312312+ isIssueOwner := user.Active.Did == issue.Did
313313314314 // TODO: make this more granular
315315 if isIssueOwner || isRepoOwner || isCollaborator {
···326326 issue.Open = false
327327328328 // notify about the issue closure
329329- rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Did), issue)
329329+ rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Active.Did), issue)
330330331331 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f)
332332 rp.pages.HxLocation(w, fmt.Sprintf("/%s/issues/%d", ownerSlashRepo, issue.IssueId))
···340340341341func (rp *Issues) ReopenIssue(w http.ResponseWriter, r *http.Request) {
342342 l := rp.logger.With("handler", "ReopenIssue")
343343- user := rp.oauth.GetUser(r)
343343+ user := rp.oauth.GetMultiAccountUser(r)
344344 f, err := rp.repoResolver.Resolve(r)
345345 if err != nil {
346346 l.Error("failed to get repo and knot", "err", err)
···354354 return
355355 }
356356357357- roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
357357+ roles := repoinfo.RolesInRepo{Roles: rp.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
358358 isRepoOwner := roles.IsOwner()
359359 isCollaborator := roles.IsCollaborator()
360360- isIssueOwner := user.Did == issue.Did
360360+ isIssueOwner := user.Active.Did == issue.Did
361361362362 if isCollaborator || isRepoOwner || isIssueOwner {
363363 err := db.ReopenIssues(
···373373 issue.Open = true
374374375375 // notify about the issue reopen
376376- rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Did), issue)
376376+ rp.notifier.NewIssueState(r.Context(), syntax.DID(user.Active.Did), issue)
377377378378 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f)
379379 rp.pages.HxLocation(w, fmt.Sprintf("/%s/issues/%d", ownerSlashRepo, issue.IssueId))
···387387388388func (rp *Issues) NewIssueComment(w http.ResponseWriter, r *http.Request) {
389389 l := rp.logger.With("handler", "NewIssueComment")
390390- user := rp.oauth.GetUser(r)
390390+ user := rp.oauth.GetMultiAccountUser(r)
391391 f, err := rp.repoResolver.Resolve(r)
392392 if err != nil {
393393 l.Error("failed to get repo and knot", "err", err)
···416416 mentions, references := rp.mentionsResolver.Resolve(r.Context(), body)
417417418418 comment := models.IssueComment{
419419- Did: user.Did,
419419+ Did: user.Active.Did,
420420 Rkey: tid.TID(),
421421 IssueAt: issue.AtUri().String(),
422422 ReplyTo: replyTo,
···495495496496func (rp *Issues) IssueComment(w http.ResponseWriter, r *http.Request) {
497497 l := rp.logger.With("handler", "IssueComment")
498498- user := rp.oauth.GetUser(r)
498498+ user := rp.oauth.GetMultiAccountUser(r)
499499500500 issue, ok := r.Context().Value("issue").(*models.Issue)
501501 if !ok {
···531531532532func (rp *Issues) EditIssueComment(w http.ResponseWriter, r *http.Request) {
533533 l := rp.logger.With("handler", "EditIssueComment")
534534- user := rp.oauth.GetUser(r)
534534+ user := rp.oauth.GetMultiAccountUser(r)
535535536536 issue, ok := r.Context().Value("issue").(*models.Issue)
537537 if !ok {
···557557 }
558558 comment := comments[0]
559559560560- if comment.Did != user.Did {
561561- l.Error("unauthorized comment edit", "expectedDid", comment.Did, "gotDid", user.Did)
560560+ if comment.Did != user.Active.Did {
561561+ l.Error("unauthorized comment edit", "expectedDid", comment.Did, "gotDid", user.Active.Did)
562562 http.Error(w, "you are not the author of this comment", http.StatusUnauthorized)
563563 return
564564 }
···608608 // rkey is optional, it was introduced later
609609 if newComment.Rkey != "" {
610610 // update the record on pds
611611- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueCommentNSID, user.Did, comment.Rkey)
611611+ ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoIssueCommentNSID, user.Active.Did, comment.Rkey)
612612 if err != nil {
613613 l.Error("failed to get record", "err", err, "did", newComment.Did, "rkey", newComment.Rkey)
614614 rp.pages.Notice(w, fmt.Sprintf("comment-%s-status", commentId), "Failed to update description, no record found on PDS.")
···617617618618 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
619619 Collection: tangled.RepoIssueCommentNSID,
620620- Repo: user.Did,
620620+ Repo: user.Active.Did,
621621 Rkey: newComment.Rkey,
622622 SwapRecord: ex.Cid,
623623 Record: &lexutil.LexiconTypeDecoder{
···641641642642func (rp *Issues) ReplyIssueCommentPlaceholder(w http.ResponseWriter, r *http.Request) {
643643 l := rp.logger.With("handler", "ReplyIssueCommentPlaceholder")
644644- user := rp.oauth.GetUser(r)
644644+ user := rp.oauth.GetMultiAccountUser(r)
645645646646 issue, ok := r.Context().Value("issue").(*models.Issue)
647647 if !ok {
···677677678678func (rp *Issues) ReplyIssueComment(w http.ResponseWriter, r *http.Request) {
679679 l := rp.logger.With("handler", "ReplyIssueComment")
680680- user := rp.oauth.GetUser(r)
680680+ user := rp.oauth.GetMultiAccountUser(r)
681681682682 issue, ok := r.Context().Value("issue").(*models.Issue)
683683 if !ok {
···713713714714func (rp *Issues) DeleteIssueComment(w http.ResponseWriter, r *http.Request) {
715715 l := rp.logger.With("handler", "DeleteIssueComment")
716716- user := rp.oauth.GetUser(r)
716716+ user := rp.oauth.GetMultiAccountUser(r)
717717718718 issue, ok := r.Context().Value("issue").(*models.Issue)
719719 if !ok {
···739739 }
740740 comment := comments[0]
741741742742- if comment.Did != user.Did {
743743- l.Error("unauthorized action", "expectedDid", comment.Did, "gotDid", user.Did)
742742+ if comment.Did != user.Active.Did {
743743+ l.Error("unauthorized action", "expectedDid", comment.Did, "gotDid", user.Active.Did)
744744 http.Error(w, "you are not the author of this comment", http.StatusUnauthorized)
745745 return
746746 }
···769769 }
770770 _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{
771771 Collection: tangled.RepoIssueCommentNSID,
772772- Repo: user.Did,
772772+ Repo: user.Active.Did,
773773 Rkey: comment.Rkey,
774774 })
775775 if err != nil {
···807807808808 page := pagination.FromContext(r.Context())
809809810810- user := rp.oauth.GetUser(r)
810810+ user := rp.oauth.GetMultiAccountUser(r)
811811 f, err := rp.repoResolver.Resolve(r)
812812 if err != nil {
813813 l.Error("failed to get repo and knot", "err", err)
···884884 }
885885886886 rp.pages.RepoIssues(w, pages.RepoIssuesParams{
887887- LoggedInUser: rp.oauth.GetUser(r),
887887+ LoggedInUser: rp.oauth.GetMultiAccountUser(r),
888888 RepoInfo: rp.repoResolver.GetRepoInfo(r, user),
889889 Issues: issues,
890890 IssueCount: totalIssues,
···897897898898func (rp *Issues) NewIssue(w http.ResponseWriter, r *http.Request) {
899899 l := rp.logger.With("handler", "NewIssue")
900900- user := rp.oauth.GetUser(r)
900900+ user := rp.oauth.GetMultiAccountUser(r)
901901902902 f, err := rp.repoResolver.Resolve(r)
903903 if err != nil {
···921921 Title: r.FormValue("title"),
922922 Body: body,
923923 Open: true,
924924- Did: user.Did,
924924+ Did: user.Active.Did,
925925 Created: time.Now(),
926926 Mentions: mentions,
927927 References: references,
···945945 }
946946 resp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
947947 Collection: tangled.RepoIssueNSID,
948948- Repo: user.Did,
948948+ Repo: user.Active.Did,
949949 Rkey: issue.Rkey,
950950 Record: &lexutil.LexiconTypeDecoder{
951951 Val: &record,
+31-31
appview/knots/knots.go
···7070}
71717272func (k *Knots) knots(w http.ResponseWriter, r *http.Request) {
7373- user := k.OAuth.GetUser(r)
7373+ user := k.OAuth.GetMultiAccountUser(r)
7474 registrations, err := db.GetRegistrations(
7575 k.Db,
7676- orm.FilterEq("did", user.Did),
7676+ orm.FilterEq("did", user.Active.Did),
7777 )
7878 if err != nil {
7979 k.Logger.Error("failed to fetch knot registrations", "err", err)
···9292func (k *Knots) dashboard(w http.ResponseWriter, r *http.Request) {
9393 l := k.Logger.With("handler", "dashboard")
94949595- user := k.OAuth.GetUser(r)
9696- l = l.With("user", user.Did)
9595+ user := k.OAuth.GetMultiAccountUser(r)
9696+ l = l.With("user", user.Active.Did)
97979898 domain := chi.URLParam(r, "domain")
9999 if domain == "" {
···103103104104 registrations, err := db.GetRegistrations(
105105 k.Db,
106106- orm.FilterEq("did", user.Did),
106106+ orm.FilterEq("did", user.Active.Did),
107107 orm.FilterEq("domain", domain),
108108 )
109109 if err != nil {
···154154}
155155156156func (k *Knots) register(w http.ResponseWriter, r *http.Request) {
157157- user := k.OAuth.GetUser(r)
157157+ user := k.OAuth.GetMultiAccountUser(r)
158158 l := k.Logger.With("handler", "register")
159159160160 noticeId := "register-error"
···175175 return
176176 }
177177 l = l.With("domain", domain)
178178- l = l.With("user", user.Did)
178178+ l = l.With("user", user.Active.Did)
179179180180 tx, err := k.Db.Begin()
181181 if err != nil {
···188188 k.Enforcer.E.LoadPolicy()
189189 }()
190190191191- err = db.AddKnot(tx, domain, user.Did)
191191+ err = db.AddKnot(tx, domain, user.Active.Did)
192192 if err != nil {
193193 l.Error("failed to insert", "err", err)
194194 fail()
···210210 return
211211 }
212212213213- ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Did, domain)
213213+ ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Active.Did, domain)
214214 var exCid *string
215215 if ex != nil {
216216 exCid = ex.Cid
···219219 // re-announce by registering under same rkey
220220 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
221221 Collection: tangled.KnotNSID,
222222- Repo: user.Did,
222222+ Repo: user.Active.Did,
223223 Rkey: domain,
224224 Record: &lexutil.LexiconTypeDecoder{
225225 Val: &tangled.Knot{
···250250 }
251251252252 // begin verification
253253- err = serververify.RunVerification(r.Context(), domain, user.Did, k.Config.Core.Dev)
253253+ err = serververify.RunVerification(r.Context(), domain, user.Active.Did, k.Config.Core.Dev)
254254 if err != nil {
255255 l.Error("verification failed", "err", err)
256256 k.Pages.HxRefresh(w)
257257 return
258258 }
259259260260- err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Did)
260260+ err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Active.Did)
261261 if err != nil {
262262 l.Error("failed to mark verified", "err", err)
263263 k.Pages.HxRefresh(w)
···275275}
276276277277func (k *Knots) delete(w http.ResponseWriter, r *http.Request) {
278278- user := k.OAuth.GetUser(r)
278278+ user := k.OAuth.GetMultiAccountUser(r)
279279 l := k.Logger.With("handler", "delete")
280280281281 noticeId := "operation-error"
···294294 // get record from db first
295295 registrations, err := db.GetRegistrations(
296296 k.Db,
297297- orm.FilterEq("did", user.Did),
297297+ orm.FilterEq("did", user.Active.Did),
298298 orm.FilterEq("domain", domain),
299299 )
300300 if err != nil {
···322322323323 err = db.DeleteKnot(
324324 tx,
325325- orm.FilterEq("did", user.Did),
325325+ orm.FilterEq("did", user.Active.Did),
326326 orm.FilterEq("domain", domain),
327327 )
328328 if err != nil {
···350350351351 _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{
352352 Collection: tangled.KnotNSID,
353353- Repo: user.Did,
353353+ Repo: user.Active.Did,
354354 Rkey: domain,
355355 })
356356 if err != nil {
···382382}
383383384384func (k *Knots) retry(w http.ResponseWriter, r *http.Request) {
385385- user := k.OAuth.GetUser(r)
385385+ user := k.OAuth.GetMultiAccountUser(r)
386386 l := k.Logger.With("handler", "retry")
387387388388 noticeId := "operation-error"
···398398 return
399399 }
400400 l = l.With("domain", domain)
401401- l = l.With("user", user.Did)
401401+ l = l.With("user", user.Active.Did)
402402403403 // get record from db first
404404 registrations, err := db.GetRegistrations(
405405 k.Db,
406406- orm.FilterEq("did", user.Did),
406406+ orm.FilterEq("did", user.Active.Did),
407407 orm.FilterEq("domain", domain),
408408 )
409409 if err != nil {
···419419 registration := registrations[0]
420420421421 // begin verification
422422- err = serververify.RunVerification(r.Context(), domain, user.Did, k.Config.Core.Dev)
422422+ err = serververify.RunVerification(r.Context(), domain, user.Active.Did, k.Config.Core.Dev)
423423 if err != nil {
424424 l.Error("verification failed", "err", err)
425425···437437 return
438438 }
439439440440- err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Did)
440440+ err = serververify.MarkKnotVerified(k.Db, k.Enforcer, domain, user.Active.Did)
441441 if err != nil {
442442 l.Error("failed to mark verified", "err", err)
443443 k.Pages.Notice(w, noticeId, err.Error())
···456456 return
457457 }
458458459459- ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Did, domain)
459459+ ex, _ := comatproto.RepoGetRecord(r.Context(), client, "", tangled.KnotNSID, user.Active.Did, domain)
460460 var exCid *string
461461 if ex != nil {
462462 exCid = ex.Cid
···465465 // ignore the error here
466466 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
467467 Collection: tangled.KnotNSID,
468468- Repo: user.Did,
468468+ Repo: user.Active.Did,
469469 Rkey: domain,
470470 Record: &lexutil.LexiconTypeDecoder{
471471 Val: &tangled.Knot{
···494494 // Get updated registration to show
495495 registrations, err = db.GetRegistrations(
496496 k.Db,
497497- orm.FilterEq("did", user.Did),
497497+ orm.FilterEq("did", user.Active.Did),
498498 orm.FilterEq("domain", domain),
499499 )
500500 if err != nil {
···516516}
517517518518func (k *Knots) addMember(w http.ResponseWriter, r *http.Request) {
519519- user := k.OAuth.GetUser(r)
519519+ user := k.OAuth.GetMultiAccountUser(r)
520520 l := k.Logger.With("handler", "addMember")
521521522522 domain := chi.URLParam(r, "domain")
···526526 return
527527 }
528528 l = l.With("domain", domain)
529529- l = l.With("user", user.Did)
529529+ l = l.With("user", user.Active.Did)
530530531531 registrations, err := db.GetRegistrations(
532532 k.Db,
533533- orm.FilterEq("did", user.Did),
533533+ orm.FilterEq("did", user.Active.Did),
534534 orm.FilterEq("domain", domain),
535535 orm.FilterIsNot("registered", "null"),
536536 )
···583583584584 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
585585 Collection: tangled.KnotMemberNSID,
586586- Repo: user.Did,
586586+ Repo: user.Active.Did,
587587 Rkey: rkey,
588588 Record: &lexutil.LexiconTypeDecoder{
589589 Val: &tangled.KnotMember{
···618618}
619619620620func (k *Knots) removeMember(w http.ResponseWriter, r *http.Request) {
621621- user := k.OAuth.GetUser(r)
621621+ user := k.OAuth.GetMultiAccountUser(r)
622622 l := k.Logger.With("handler", "removeMember")
623623624624 noticeId := "operation-error"
···634634 return
635635 }
636636 l = l.With("domain", domain)
637637- l = l.With("user", user.Did)
637637+ l = l.With("user", user.Active.Did)
638638639639 registrations, err := db.GetRegistrations(
640640 k.Db,
641641- orm.FilterEq("did", user.Did),
641641+ orm.FilterEq("did", user.Active.Did),
642642 orm.FilterEq("domain", domain),
643643 orm.FilterIsNot("registered", "null"),
644644 )
+2-2
appview/labels/labels.go
···6868// - this handler should calculate the diff in order to create the labelop record
6969// - we need the diff in order to maintain a "history" of operations performed by users
7070func (l *Labels) PerformLabelOp(w http.ResponseWriter, r *http.Request) {
7171- user := l.oauth.GetUser(r)
7171+ user := l.oauth.GetMultiAccountUser(r)
72727373 noticeId := "add-label-error"
7474···8282 return
8383 }
84848585- did := user.Did
8585+ did := user.Active.Did
8686 rkey := tid.TID()
8787 performedAt := time.Now()
8888 indexedAt := time.Now()
+6-8
appview/middleware/middleware.go
···115115 return func(next http.Handler) http.Handler {
116116 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
117117 // requires auth also
118118- actor := mw.oauth.GetUser(r)
118118+ actor := mw.oauth.GetMultiAccountUser(r)
119119 if actor == nil {
120120 // we need a logged in user
121121 log.Printf("not logged in, redirecting")
···128128 return
129129 }
130130131131- ok, err := mw.enforcer.E.HasGroupingPolicy(actor.Did, group, domain)
131131+ ok, err := mw.enforcer.E.HasGroupingPolicy(actor.Active.Did, group, domain)
132132 if err != nil || !ok {
133133- // we need a logged in user
134134- log.Printf("%s does not have perms of a %s in domain %s", actor.Did, group, domain)
133133+ log.Printf("%s does not have perms of a %s in domain %s", actor.Active.Did, group, domain)
135134 http.Error(w, "Forbiden", http.StatusUnauthorized)
136135 return
137136 }
···149148 return func(next http.Handler) http.Handler {
150149 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
151150 // requires auth also
152152- actor := mw.oauth.GetUser(r)
151151+ actor := mw.oauth.GetMultiAccountUser(r)
153152 if actor == nil {
154153 // we need a logged in user
155154 log.Printf("not logged in, redirecting")
···162161 return
163162 }
164163165165- ok, err := mw.enforcer.E.Enforce(actor.Did, f.Knot, f.DidSlashRepo(), requiredPerm)
164164+ ok, err := mw.enforcer.E.Enforce(actor.Active.Did, f.Knot, f.DidSlashRepo(), requiredPerm)
166165 if err != nil || !ok {
167167- // we need a logged in user
168168- log.Printf("%s does not have perms of a %s in repo %s", actor.Did, requiredPerm, f.DidSlashRepo())
166166+ log.Printf("%s does not have perms of a %s in repo %s", actor.Active.Did, requiredPerm, f.DidSlashRepo())
169167 http.Error(w, "Forbiden", http.StatusUnauthorized)
170168 return
171169 }
+6-6
appview/notifications/notifications.go
···48484949func (n *Notifications) notificationsPage(w http.ResponseWriter, r *http.Request) {
5050 l := n.logger.With("handler", "notificationsPage")
5151- user := n.oauth.GetUser(r)
5151+ user := n.oauth.GetMultiAccountUser(r)
52525353 page := pagination.FromContext(r.Context())
54545555 total, err := db.CountNotifications(
5656 n.db,
5757- orm.FilterEq("recipient_did", user.Did),
5757+ orm.FilterEq("recipient_did", user.Active.Did),
5858 )
5959 if err != nil {
6060 l.Error("failed to get total notifications", "err", err)
···6565 notifications, err := db.GetNotificationsWithEntities(
6666 n.db,
6767 page,
6868- orm.FilterEq("recipient_did", user.Did),
6868+ orm.FilterEq("recipient_did", user.Active.Did),
6969 )
7070 if err != nil {
7171 l.Error("failed to get notifications", "err", err)
···7373 return
7474 }
75757676- err = db.MarkAllNotificationsRead(n.db, user.Did)
7676+ err = db.MarkAllNotificationsRead(n.db, user.Active.Did)
7777 if err != nil {
7878 l.Error("failed to mark notifications as read", "err", err)
7979 }
···9090}
91919292func (n *Notifications) getUnreadCount(w http.ResponseWriter, r *http.Request) {
9393- user := n.oauth.GetUser(r)
9393+ user := n.oauth.GetMultiAccountUser(r)
9494 if user == nil {
9595 http.Error(w, "Forbidden", http.StatusUnauthorized)
9696 return
···98989999 count, err := db.CountNotifications(
100100 n.db,
101101- orm.FilterEq("recipient_did", user.Did),
101101+ orm.FilterEq("recipient_did", user.Active.Did),
102102 orm.FilterEq("read", 0),
103103 )
104104 if err != nil {
+2-2
appview/pipelines/pipelines.go
···7777}
78787979func (p *Pipelines) Index(w http.ResponseWriter, r *http.Request) {
8080- user := p.oauth.GetUser(r)
8080+ user := p.oauth.GetMultiAccountUser(r)
8181 l := p.logger.With("handler", "Index")
82828383 f, err := p.repoResolver.Resolve(r)
···106106}
107107108108func (p *Pipelines) Workflow(w http.ResponseWriter, r *http.Request) {
109109- user := p.oauth.GetUser(r)
109109+ user := p.oauth.GetMultiAccountUser(r)
110110 l := p.logger.With("handler", "Workflow")
111111112112 f, err := p.repoResolver.Resolve(r)
+55-55
appview/pulls/pulls.go
···9797func (s *Pulls) PullActions(w http.ResponseWriter, r *http.Request) {
9898 switch r.Method {
9999 case http.MethodGet:
100100- user := s.oauth.GetUser(r)
100100+ user := s.oauth.GetMultiAccountUser(r)
101101 f, err := s.repoResolver.Resolve(r)
102102 if err != nil {
103103 log.Println("failed to get repo and knot", err)
···128128 mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
129129 branchDeleteStatus := s.branchDeleteStatus(r, f, pull)
130130 resubmitResult := pages.Unknown
131131- if user.Did == pull.OwnerDid {
131131+ if user.Active.Did == pull.OwnerDid {
132132 resubmitResult = s.resubmitCheck(r, f, pull, stack)
133133 }
134134···147147}
148148149149func (s *Pulls) RepoSinglePull(w http.ResponseWriter, r *http.Request) {
150150- user := s.oauth.GetUser(r)
150150+ user := s.oauth.GetMultiAccountUser(r)
151151 f, err := s.repoResolver.Resolve(r)
152152 if err != nil {
153153 log.Println("failed to get repo and knot", err)
···175175 mergeCheckResponse := s.mergeCheck(r, f, pull, stack)
176176 branchDeleteStatus := s.branchDeleteStatus(r, f, pull)
177177 resubmitResult := pages.Unknown
178178- if user != nil && user.Did == pull.OwnerDid {
178178+ if user != nil && user.Active != nil && user.Active.Did == pull.OwnerDid {
179179 resubmitResult = s.resubmitCheck(r, f, pull, stack)
180180 }
181181···217217218218 userReactions := map[models.ReactionKind]bool{}
219219 if user != nil {
220220- userReactions = db.GetReactionStatusMap(s.db, user.Did, pull.AtUri())
220220+ userReactions = db.GetReactionStatusMap(s.db, user.Active.Did, pull.AtUri())
221221 }
222222223223 labelDefs, err := db.GetLabelDefinitions(
···328328 return nil
329329 }
330330331331- user := s.oauth.GetUser(r)
331331+ user := s.oauth.GetMultiAccountUser(r)
332332 if user == nil {
333333 return nil
334334 }
···351351 }
352352353353 // user can only delete branch if they are a collaborator in the repo that the branch belongs to
354354- perms := s.enforcer.GetPermissionsInRepo(user.Did, repo.Knot, repo.DidSlashRepo())
354354+ perms := s.enforcer.GetPermissionsInRepo(user.Active.Did, repo.Knot, repo.DidSlashRepo())
355355 if !slices.Contains(perms, "repo:push") {
356356 return nil
357357 }
···438438}
439439440440func (s *Pulls) RepoPullPatch(w http.ResponseWriter, r *http.Request) {
441441- user := s.oauth.GetUser(r)
441441+ user := s.oauth.GetMultiAccountUser(r)
442442443443 var diffOpts types.DiffOpts
444444 if d := r.URL.Query().Get("diff"); d == "split" {
···479479}
480480481481func (s *Pulls) RepoPullInterdiff(w http.ResponseWriter, r *http.Request) {
482482- user := s.oauth.GetUser(r)
482482+ user := s.oauth.GetMultiAccountUser(r)
483483484484 var diffOpts types.DiffOpts
485485 if d := r.URL.Query().Get("diff"); d == "split" {
···524524 interdiff := patchutil.Interdiff(previousPatch, currentPatch)
525525526526 s.pages.RepoPullInterdiffPage(w, pages.RepoPullInterdiffParams{
527527- LoggedInUser: s.oauth.GetUser(r),
527527+ LoggedInUser: s.oauth.GetMultiAccountUser(r),
528528 RepoInfo: s.repoResolver.GetRepoInfo(r, user),
529529 Pull: pull,
530530 Round: roundIdInt,
···556556func (s *Pulls) RepoPulls(w http.ResponseWriter, r *http.Request) {
557557 l := s.logger.With("handler", "RepoPulls")
558558559559- user := s.oauth.GetUser(r)
559559+ user := s.oauth.GetMultiAccountUser(r)
560560 params := r.URL.Query()
561561562562 state := models.PullOpen
···701701 }
702702703703 s.pages.RepoPulls(w, pages.RepoPullsParams{
704704- LoggedInUser: s.oauth.GetUser(r),
704704+ LoggedInUser: s.oauth.GetMultiAccountUser(r),
705705 RepoInfo: s.repoResolver.GetRepoInfo(r, user),
706706 Pulls: pulls,
707707 LabelDefs: defs,
···715715}
716716717717func (s *Pulls) PullComment(w http.ResponseWriter, r *http.Request) {
718718- user := s.oauth.GetUser(r)
718718+ user := s.oauth.GetMultiAccountUser(r)
719719 f, err := s.repoResolver.Resolve(r)
720720 if err != nil {
721721 log.Println("failed to get repo and knot", err)
···774774 }
775775 atResp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
776776 Collection: tangled.RepoPullCommentNSID,
777777- Repo: user.Did,
777777+ Repo: user.Active.Did,
778778 Rkey: tid.TID(),
779779 Record: &lexutil.LexiconTypeDecoder{
780780 Val: &tangled.RepoPullComment{
···791791 }
792792793793 comment := &models.PullComment{
794794- OwnerDid: user.Did,
794794+ OwnerDid: user.Active.Did,
795795 RepoAt: f.RepoAt().String(),
796796 PullId: pull.PullId,
797797 Body: body,
···825825}
826826827827func (s *Pulls) NewPull(w http.ResponseWriter, r *http.Request) {
828828- user := s.oauth.GetUser(r)
828828+ user := s.oauth.GetMultiAccountUser(r)
829829 f, err := s.repoResolver.Resolve(r)
830830 if err != nil {
831831 log.Println("failed to get repo and knot", err)
···893893 }
894894895895 // Determine PR type based on input parameters
896896- roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
896896+ roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
897897 isPushAllowed := roles.IsPushAllowed()
898898 isBranchBased := isPushAllowed && sourceBranch != "" && fromFork == ""
899899 isForkBased := fromFork != "" && sourceBranch != ""
···993993 w http.ResponseWriter,
994994 r *http.Request,
995995 repo *models.Repo,
996996- user *oauth.User,
996996+ user *oauth.MultiAccountUser,
997997 title,
998998 body,
999999 targetBranch,
···10501050 s.createPullRequest(w, r, repo, user, title, body, targetBranch, patch, combined, sourceRev, pullSource, recordPullSource, isStacked)
10511051}
1052105210531053-func (s *Pulls) handlePatchBasedPull(w http.ResponseWriter, r *http.Request, repo *models.Repo, user *oauth.User, title, body, targetBranch, patch string, isStacked bool) {
10531053+func (s *Pulls) handlePatchBasedPull(w http.ResponseWriter, r *http.Request, repo *models.Repo, user *oauth.MultiAccountUser, title, body, targetBranch, patch string, isStacked bool) {
10541054 if err := s.validator.ValidatePatch(&patch); err != nil {
10551055 s.logger.Error("patch validation failed", "err", err)
10561056 s.pages.Notice(w, "pull", "Invalid patch format. Please provide a valid diff.")
···10601060 s.createPullRequest(w, r, repo, user, title, body, targetBranch, patch, "", "", nil, nil, isStacked)
10611061}
1062106210631063-func (s *Pulls) handleForkBasedPull(w http.ResponseWriter, r *http.Request, repo *models.Repo, user *oauth.User, forkRepo string, title, body, targetBranch, sourceBranch string, isStacked bool) {
10631063+func (s *Pulls) handleForkBasedPull(w http.ResponseWriter, r *http.Request, repo *models.Repo, user *oauth.MultiAccountUser, forkRepo string, title, body, targetBranch, sourceBranch string, isStacked bool) {
10641064 repoString := strings.SplitN(forkRepo, "/", 2)
10651065 forkOwnerDid := repoString[0]
10661066 repoName := repoString[1]
···11691169 w http.ResponseWriter,
11701170 r *http.Request,
11711171 repo *models.Repo,
11721172- user *oauth.User,
11721172+ user *oauth.MultiAccountUser,
11731173 title, body, targetBranch string,
11741174 patch string,
11751175 combined string,
···12411241 Title: title,
12421242 Body: body,
12431243 TargetBranch: targetBranch,
12441244- OwnerDid: user.Did,
12441244+ OwnerDid: user.Active.Did,
12451245 RepoAt: repo.RepoAt(),
12461246 Rkey: rkey,
12471247 Mentions: mentions,
···1273127312741274 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
12751275 Collection: tangled.RepoPullNSID,
12761276- Repo: user.Did,
12761276+ Repo: user.Active.Did,
12771277 Rkey: rkey,
12781278 Record: &lexutil.LexiconTypeDecoder{
12791279 Val: &tangled.RepoPull{
···13101310 w http.ResponseWriter,
13111311 r *http.Request,
13121312 repo *models.Repo,
13131313- user *oauth.User,
13131313+ user *oauth.MultiAccountUser,
13141314 targetBranch string,
13151315 patch string,
13161316 sourceRev string,
···13781378 })
13791379 }
13801380 _, err = comatproto.RepoApplyWrites(r.Context(), client, &comatproto.RepoApplyWrites_Input{
13811381- Repo: user.Did,
13811381+ Repo: user.Active.Did,
13821382 Writes: writes,
13831383 })
13841384 if err != nil {
···14501450}
1451145114521452func (s *Pulls) PatchUploadFragment(w http.ResponseWriter, r *http.Request) {
14531453- user := s.oauth.GetUser(r)
14531453+ user := s.oauth.GetMultiAccountUser(r)
1454145414551455 s.pages.PullPatchUploadFragment(w, pages.PullPatchUploadParams{
14561456 RepoInfo: s.repoResolver.GetRepoInfo(r, user),
···14581458}
1459145914601460func (s *Pulls) CompareBranchesFragment(w http.ResponseWriter, r *http.Request) {
14611461- user := s.oauth.GetUser(r)
14611461+ user := s.oauth.GetMultiAccountUser(r)
14621462 f, err := s.repoResolver.Resolve(r)
14631463 if err != nil {
14641464 log.Println("failed to get repo and knot", err)
···15131513}
1514151415151515func (s *Pulls) CompareForksFragment(w http.ResponseWriter, r *http.Request) {
15161516- user := s.oauth.GetUser(r)
15161516+ user := s.oauth.GetMultiAccountUser(r)
1517151715181518- forks, err := db.GetForksByDid(s.db, user.Did)
15181518+ forks, err := db.GetForksByDid(s.db, user.Active.Did)
15191519 if err != nil {
15201520 log.Println("failed to get forks", err)
15211521 return
···15291529}
1530153015311531func (s *Pulls) CompareForksBranchesFragment(w http.ResponseWriter, r *http.Request) {
15321532- user := s.oauth.GetUser(r)
15321532+ user := s.oauth.GetMultiAccountUser(r)
1533153315341534 f, err := s.repoResolver.Resolve(r)
15351535 if err != nil {
···16221622}
1623162316241624func (s *Pulls) ResubmitPull(w http.ResponseWriter, r *http.Request) {
16251625- user := s.oauth.GetUser(r)
16251625+ user := s.oauth.GetMultiAccountUser(r)
1626162616271627 pull, ok := r.Context().Value("pull").(*models.Pull)
16281628 if !ok {
···16531653}
1654165416551655func (s *Pulls) resubmitPatch(w http.ResponseWriter, r *http.Request) {
16561656- user := s.oauth.GetUser(r)
16561656+ user := s.oauth.GetMultiAccountUser(r)
1657165716581658 pull, ok := r.Context().Value("pull").(*models.Pull)
16591659 if !ok {
···16681668 return
16691669 }
1670167016711671- if user.Did != pull.OwnerDid {
16711671+ if user.Active.Did != pull.OwnerDid {
16721672 log.Println("unauthorized user")
16731673 w.WriteHeader(http.StatusUnauthorized)
16741674 return
···16801680}
1681168116821682func (s *Pulls) resubmitBranch(w http.ResponseWriter, r *http.Request) {
16831683- user := s.oauth.GetUser(r)
16831683+ user := s.oauth.GetMultiAccountUser(r)
1684168416851685 pull, ok := r.Context().Value("pull").(*models.Pull)
16861686 if !ok {
···16951695 return
16961696 }
1697169716981698- if user.Did != pull.OwnerDid {
16981698+ if user.Active.Did != pull.OwnerDid {
16991699 log.Println("unauthorized user")
17001700 w.WriteHeader(http.StatusUnauthorized)
17011701 return
17021702 }
1703170317041704- roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
17041704+ roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
17051705 if !roles.IsPushAllowed() {
17061706 log.Println("unauthorized user")
17071707 w.WriteHeader(http.StatusUnauthorized)
···17451745}
1746174617471747func (s *Pulls) resubmitFork(w http.ResponseWriter, r *http.Request) {
17481748- user := s.oauth.GetUser(r)
17481748+ user := s.oauth.GetMultiAccountUser(r)
1749174917501750 pull, ok := r.Context().Value("pull").(*models.Pull)
17511751 if !ok {
···17601760 return
17611761 }
1762176217631763- if user.Did != pull.OwnerDid {
17631763+ if user.Active.Did != pull.OwnerDid {
17641764 log.Println("unauthorized user")
17651765 w.WriteHeader(http.StatusUnauthorized)
17661766 return
···18451845 w http.ResponseWriter,
18461846 r *http.Request,
18471847 repo *models.Repo,
18481848- user *oauth.User,
18481848+ user *oauth.MultiAccountUser,
18491849 pull *models.Pull,
18501850 patch string,
18511851 combined string,
···19011901 return
19021902 }
1903190319041904- ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Did, pull.Rkey)
19041904+ ex, err := comatproto.RepoGetRecord(r.Context(), client, "", tangled.RepoPullNSID, user.Active.Did, pull.Rkey)
19051905 if err != nil {
19061906 // failed to get record
19071907 s.pages.Notice(w, "resubmit-error", "Failed to update pull, no record found on PDS.")
···1920192019211921 _, err = comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
19221922 Collection: tangled.RepoPullNSID,
19231923- Repo: user.Did,
19231923+ Repo: user.Active.Did,
19241924 Rkey: pull.Rkey,
19251925 SwapRecord: ex.Cid,
19261926 Record: &lexutil.LexiconTypeDecoder{
···19471947 w http.ResponseWriter,
19481948 r *http.Request,
19491949 repo *models.Repo,
19501950- user *oauth.User,
19501950+ user *oauth.MultiAccountUser,
19511951 pull *models.Pull,
19521952 patch string,
19531953 stackId string,
···21372137 }
2138213821392139 _, err = comatproto.RepoApplyWrites(r.Context(), client, &comatproto.RepoApplyWrites_Input{
21402140- Repo: user.Did,
21402140+ Repo: user.Active.Did,
21412141 Writes: writes,
21422142 })
21432143 if err != nil {
···21512151}
2152215221532153func (s *Pulls) MergePull(w http.ResponseWriter, r *http.Request) {
21542154- user := s.oauth.GetUser(r)
21542154+ user := s.oauth.GetMultiAccountUser(r)
21552155 f, err := s.repoResolver.Resolve(r)
21562156 if err != nil {
21572157 log.Println("failed to resolve repo:", err)
···2262226222632263 // notify about the pull merge
22642264 for _, p := range pullsToMerge {
22652265- s.notifier.NewPullState(r.Context(), syntax.DID(user.Did), p)
22652265+ s.notifier.NewPullState(r.Context(), syntax.DID(user.Active.Did), p)
22662266 }
2267226722682268 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f)
···22702270}
2271227122722272func (s *Pulls) ClosePull(w http.ResponseWriter, r *http.Request) {
22732273- user := s.oauth.GetUser(r)
22732273+ user := s.oauth.GetMultiAccountUser(r)
2274227422752275 f, err := s.repoResolver.Resolve(r)
22762276 if err != nil {
···22862286 }
2287228722882288 // auth filter: only owner or collaborators can close
22892289- roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
22892289+ roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
22902290 isOwner := roles.IsOwner()
22912291 isCollaborator := roles.IsCollaborator()
22922292- isPullAuthor := user.Did == pull.OwnerDid
22922292+ isPullAuthor := user.Active.Did == pull.OwnerDid
22932293 isCloseAllowed := isOwner || isCollaborator || isPullAuthor
22942294 if !isCloseAllowed {
22952295 log.Println("failed to close pull")
···23352335 }
2336233623372337 for _, p := range pullsToClose {
23382338- s.notifier.NewPullState(r.Context(), syntax.DID(user.Did), p)
23382338+ s.notifier.NewPullState(r.Context(), syntax.DID(user.Active.Did), p)
23392339 }
2340234023412341 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f)
···23432343}
2344234423452345func (s *Pulls) ReopenPull(w http.ResponseWriter, r *http.Request) {
23462346- user := s.oauth.GetUser(r)
23462346+ user := s.oauth.GetMultiAccountUser(r)
2347234723482348 f, err := s.repoResolver.Resolve(r)
23492349 if err != nil {
···23602360 }
2361236123622362 // auth filter: only owner or collaborators can close
23632363- roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Did, f.Knot, f.DidSlashRepo())}
23632363+ roles := repoinfo.RolesInRepo{Roles: s.enforcer.GetPermissionsInRepo(user.Active.Did, f.Knot, f.DidSlashRepo())}
23642364 isOwner := roles.IsOwner()
23652365 isCollaborator := roles.IsCollaborator()
23662366- isPullAuthor := user.Did == pull.OwnerDid
23662366+ isPullAuthor := user.Active.Did == pull.OwnerDid
23672367 isCloseAllowed := isOwner || isCollaborator || isPullAuthor
23682368 if !isCloseAllowed {
23692369 log.Println("failed to close pull")
···24092409 }
2410241024112411 for _, p := range pullsToReopen {
24122412- s.notifier.NewPullState(r.Context(), syntax.DID(user.Did), p)
24122412+ s.notifier.NewPullState(r.Context(), syntax.DID(user.Active.Did), p)
24132413 }
2414241424152415 ownerSlashRepo := reporesolver.GetBaseRepoPath(r, f)
24162416 s.pages.HxLocation(w, fmt.Sprintf("/%s/pulls/%d", ownerSlashRepo, pull.PullId))
24172417}
2418241824192419-func (s *Pulls) newStack(ctx context.Context, repo *models.Repo, user *oauth.User, targetBranch, patch string, pullSource *models.PullSource, stackId string) (models.Stack, error) {
24192419+func (s *Pulls) newStack(ctx context.Context, repo *models.Repo, user *oauth.MultiAccountUser, targetBranch, patch string, pullSource *models.PullSource, stackId string) (models.Stack, error) {
24202420 formatPatches, err := patchutil.ExtractPatches(patch)
24212421 if err != nil {
24222422 return nil, fmt.Errorf("Failed to extract patches: %v", err)
···24522452 Title: title,
24532453 Body: body,
24542454 TargetBranch: targetBranch,
24552455- OwnerDid: user.Did,
24552455+ OwnerDid: user.Active.Did,
24562456 RepoAt: repo.RepoAt(),
24572457 Rkey: rkey,
24582458 Mentions: mentions,
+6-6
appview/repo/artifact.go
···30303131// TODO: proper statuses here on early exit
3232func (rp *Repo) AttachArtifact(w http.ResponseWriter, r *http.Request) {
3333- user := rp.oauth.GetUser(r)
3333+ user := rp.oauth.GetMultiAccountUser(r)
3434 tagParam := chi.URLParam(r, "tag")
3535 f, err := rp.repoResolver.Resolve(r)
3636 if err != nil {
···75757676 putRecordResp, err := comatproto.RepoPutRecord(r.Context(), client, &comatproto.RepoPutRecord_Input{
7777 Collection: tangled.RepoArtifactNSID,
7878- Repo: user.Did,
7878+ Repo: user.Active.Did,
7979 Rkey: rkey,
8080 Record: &lexutil.LexiconTypeDecoder{
8181 Val: &tangled.RepoArtifact{
···104104 defer tx.Rollback()
105105106106 artifact := models.Artifact{
107107- Did: user.Did,
107107+ Did: user.Active.Did,
108108 Rkey: rkey,
109109 RepoAt: f.RepoAt(),
110110 Tag: tag.Tag.Hash,
···220220221221// TODO: proper statuses here on early exit
222222func (rp *Repo) DeleteArtifact(w http.ResponseWriter, r *http.Request) {
223223- user := rp.oauth.GetUser(r)
223223+ user := rp.oauth.GetMultiAccountUser(r)
224224 tagParam := chi.URLParam(r, "tag")
225225 filename := chi.URLParam(r, "file")
226226 f, err := rp.repoResolver.Resolve(r)
···251251252252 artifact := artifacts[0]
253253254254- if user.Did != artifact.Did {
254254+ if user.Active.Did != artifact.Did {
255255 log.Println("user not authorized to delete artifact", err)
256256 rp.pages.Notice(w, "remove", "Unauthorized deletion of artifact.")
257257 return
···259259260260 _, err = comatproto.RepoDeleteRecord(r.Context(), client, &comatproto.RepoDeleteRecord_Input{
261261 Collection: tangled.RepoArtifactNSID,
262262- Repo: user.Did,
262262+ Repo: user.Active.Did,
263263 Rkey: artifact.Rkey,
264264 })
265265 if err != nil {
+1-1
appview/repo/blob.go
···7676 // Create the blob view
7777 blobView := NewBlobView(resp, rp.config, f, ref, filePath, r.URL.Query())
78787979- user := rp.oauth.GetUser(r)
7979+ user := rp.oauth.GetMultiAccountUser(r)
80808181 rp.pages.RepoBlob(w, pages.RepoBlobParams{
8282 LoggedInUser: user,