package main import ( "context" "net/http" "tangled.org/bnewbold.net/scrumble/api/socialscrumble" "github.com/bluesky-social/indigo/atproto/identity" "github.com/bluesky-social/indigo/atproto/syntax" "github.com/labstack/echo/v4" ) type SessionInfo struct { DID syntax.DID Handle syntax.Handle Ident identity.Identity SessionID string } type SceneInfo struct { DID syntax.DID Handle syntax.Handle Ident identity.Identity Declaration *socialscrumble.BetaSceneDeclaration } type ItemInfo struct { Ident identity.Identity SceneDID syntax.DID RKey syntax.RecordKey Record *socialscrumble.BetaCollectionItem } // returns the session for the current request, or nil func (srv *Server) GetCurrentSession(r *http.Request) *SessionInfo { sess, _ := srv.cookieStore.Get(r, "scrumble") accountDID, ok := sess.Values["account_did"].(string) if !ok || accountDID == "" { return nil } did, err := syntax.ParseDID(accountDID) if err != nil { return nil } sessionID, ok := sess.Values["session_id"].(string) if !ok || sessionID == "" { return nil } ident, err := srv.dir.LookupDID(r.Context(), did) if err != nil { srv.logger.Warn("failed to resolve session account", "did", did, "err", err) return nil } return &SessionInfo{ DID: did, Handle: ident.Handle, Ident: *ident, SessionID: sessionID, } } func (srv *Server) GetSceneInfo(ctx context.Context, param string) (*SceneInfo, error) { sceneDID, err := syntax.ParseDID(param) if err != nil { return nil, echo.NewHTTPError(http.StatusBadRequest, "Broken URL: Invalid Scene Name") } decl, err := srv.store.GetSceneDeclaration(ctx, sceneDID) if err != nil { return nil, echo.NewHTTPError(http.StatusNotFound, "Unknown Scene (Declaration)") } ident, err := srv.dir.LookupDID(ctx, sceneDID) if err != nil { return nil, echo.NewHTTPError(http.StatusNotFound, "Unknown Scene (Identity)") } return &SceneInfo{ DID: sceneDID, Handle: ident.Handle, Ident: *ident, Declaration: decl, }, nil }