mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-11 00:05:36 +02:00
## Description - [x] Adds support for AWS SSO, which makes us (the team) able to use SST and update the components independently - [x] Splits the webpage into the landing page (Qwik), and Astro (the console) in charge of playing. This allows us to pass in Environment Variables to the console - ~Migrates the docs from Nuxt to Nextjs, and connects them to SST. This allows us to use Fumadocs _citation needed_ that's much more beautiful, and supports OpenApi~ - Cloudflare pages with github integration is not working on our new CF account. So we will have to push the pages deployment manually with Github actions - [x] Moves the current set up from my personal CF and AWS accounts to dedicated Nestri accounts - ## Related Issues <!-- List any related issues (e.g., "Closes #123", "Fixes #456") --> ## Type of Change - [ ] Bug fix (non-breaking change) - [x] New feature (non-breaking change) - [ ] Breaking change (fix or feature that changes existing functionality) - [x] Documentation update - [ ] Other (please describe): ## Checklist - [x] I have updated relevant documentation - [x] My code follows the project's coding style - [x] My changes generate no new warnings/errors ## Notes for Reviewers <!-- Point out areas you'd like reviewers to focus on, questions you have, or decisions that need discussion --> Please approve my PR 🥹 ## Screenshots/Demo <!-- If applicable, add screenshots or a GIF demo of your changes (especially for UI changes) --> ## Additional Context <!-- Add any other context about the pull request here -->
86 lines
1.9 KiB
TypeScript
86 lines
1.9 KiB
TypeScript
import { createContext } from "../src/context";
|
|
import { VisibleError } from "./error";
|
|
|
|
export interface UserActor {
|
|
type: "user";
|
|
properties: {
|
|
accessToken: string;
|
|
userID: string;
|
|
auth?:
|
|
| {
|
|
type: "personal";
|
|
token: string;
|
|
}
|
|
| {
|
|
type: "oauth";
|
|
clientID: string;
|
|
};
|
|
};
|
|
}
|
|
|
|
export interface DeviceActor {
|
|
type: "device";
|
|
properties: {
|
|
teamSlug: string;
|
|
hostname: string;
|
|
auth?:
|
|
| {
|
|
type: "personal";
|
|
token: string;
|
|
}
|
|
| {
|
|
type: "oauth";
|
|
clientID: string;
|
|
};
|
|
};
|
|
}
|
|
|
|
export interface PublicActor {
|
|
type: "public";
|
|
properties: {};
|
|
}
|
|
|
|
type Actor = UserActor | PublicActor | DeviceActor;
|
|
export const ActorContext = createContext<Actor>();
|
|
|
|
export function useCurrentUser() {
|
|
const actor = ActorContext.use();
|
|
if (actor.type === "user") return {
|
|
id:actor.properties.userID,
|
|
token: actor.properties.accessToken,
|
|
};
|
|
|
|
throw new VisibleError(
|
|
"auth",
|
|
"unauthorized",
|
|
`You don't have permission to access this resource`,
|
|
);
|
|
}
|
|
|
|
export function useCurrentDevice() {
|
|
const actor = ActorContext.use();
|
|
if (actor.type === "device") return {
|
|
hostname:actor.properties.hostname,
|
|
teamSlug: actor.properties.teamSlug
|
|
};
|
|
throw new VisibleError(
|
|
"auth",
|
|
"unauthorized",
|
|
`You don't have permission to access this resource`,
|
|
);
|
|
}
|
|
|
|
export function useActor() {
|
|
try {
|
|
return ActorContext.use();
|
|
} catch {
|
|
return { type: "public", properties: {} } as PublicActor;
|
|
}
|
|
}
|
|
|
|
export function assertActor<T extends Actor["type"]>(type: T) {
|
|
const actor = useActor();
|
|
if (actor.type !== type)
|
|
throw new VisibleError("auth", "actor.invalid", `Actor is not "${type}"`);
|
|
return actor as Extract<Actor, { type: T }>;
|
|
} |