mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-12 08:45:38 +02:00
## Description <!-- Briefly describe the purpose and scope of your changes --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Added support for managing multiple Steam profiles per user, including a new profiles page with avatar selection and profile management. - Introduced a streamlined Steam authentication flow using a popup window, replacing the previous QR code and team-based login. - Added utilities for Steam image handling and metadata, including avatar preloading and static Steam metadata mappings. - Enhanced OpenID verification for Steam login. - Added new image-related events and expanded event handling for Steam account updates and image processing. - **Improvements** - Refactored the account structure from teams to profiles, updating related UI, context, and storage. - Updated API headers and authentication logic to use Steam IDs instead of team IDs. - Expanded game metadata with new fields for categories, franchises, and social links. - Improved library and category schemas for richer game and profile data. - Simplified and improved Steam API client methods for fetching user info, friends, and game libraries using Steam Web API. - Updated queue processing to handle individual game updates and publish image events. - Adjusted permissions and queue configurations for better message handling and dead-letter queue support. - Improved slug creation and rating estimation utilities. - **Bug Fixes** - Fixed avatar image loading to display higher quality images after initial load. - **Removals** - Removed all team, member, and credential management functionality and related database schemas. - Eliminated the QR code-based login and related UI components. - Deleted legacy team and member database tables and related code. - Removed encryption utilities and deprecated secret keys in favor of new secret management. - **Chores** - Updated dependencies and internal configuration for new features and schema changes. - Cleaned up unused code and updated database migrations for new data structures. - Adjusted import orders and removed unused imports across multiple modules. - Added new resource declarations and updated service link configurations. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
130 lines
3.1 KiB
TypeScript
130 lines
3.1 KiB
TypeScript
import { Log } from "./utils";
|
|
import { createContext } from "./context";
|
|
import { ErrorCodes, VisibleError } from "./error";
|
|
|
|
export namespace Actor {
|
|
|
|
export interface User {
|
|
type: "user";
|
|
properties: {
|
|
userID: string;
|
|
email: string;
|
|
};
|
|
}
|
|
|
|
export interface Steam {
|
|
type: "steam";
|
|
properties: {
|
|
steamID: string;
|
|
};
|
|
}
|
|
|
|
export interface Machine {
|
|
type: "machine";
|
|
properties: {
|
|
machineID: string;
|
|
fingerprint: string;
|
|
};
|
|
}
|
|
|
|
export interface Token {
|
|
type: "member";
|
|
properties: {
|
|
userID: string;
|
|
steamID: string;
|
|
};
|
|
}
|
|
|
|
export interface Public {
|
|
type: "public";
|
|
properties: {};
|
|
}
|
|
|
|
export type Info = User | Public | Token | Machine | Steam;
|
|
|
|
export const Context = createContext<Info>();
|
|
|
|
export function userID() {
|
|
const actor = Context.use();
|
|
if ("userID" in actor.properties) return actor.properties.userID;
|
|
throw new VisibleError(
|
|
"authentication",
|
|
ErrorCodes.Authentication.UNAUTHORIZED,
|
|
`You don't have permission to access this resource.`,
|
|
);
|
|
}
|
|
|
|
export function steamID() {
|
|
const actor = Context.use();
|
|
if ("steamID" in actor.properties) return actor.properties.steamID;
|
|
throw new VisibleError(
|
|
"authentication",
|
|
ErrorCodes.Authentication.UNAUTHORIZED,
|
|
`You don't have permission to access this resource.`,
|
|
);
|
|
}
|
|
|
|
export function user() {
|
|
const actor = Context.use();
|
|
if (actor.type == "user") return actor.properties;
|
|
throw new VisibleError(
|
|
"authentication",
|
|
ErrorCodes.Authentication.UNAUTHORIZED,
|
|
`You don't have permission to access this resource.`,
|
|
);
|
|
}
|
|
|
|
export function teamID() {
|
|
const actor = Context.use();
|
|
if ("teamID" in actor.properties) return actor.properties.teamID;
|
|
throw new VisibleError(
|
|
"authentication",
|
|
ErrorCodes.Authentication.UNAUTHORIZED,
|
|
`You don't have permission to access this resource.`,
|
|
);
|
|
}
|
|
|
|
export function fingerprint() {
|
|
const actor = Context.use();
|
|
if ("fingerprint" in actor.properties) return actor.properties.fingerprint;
|
|
throw new VisibleError(
|
|
"authentication",
|
|
ErrorCodes.Authentication.UNAUTHORIZED,
|
|
`You don't have permission to access this resource.`,
|
|
);
|
|
}
|
|
|
|
export function use() {
|
|
try {
|
|
return Context.use();
|
|
} catch {
|
|
return { type: "public", properties: {} } as Public;
|
|
}
|
|
}
|
|
|
|
export function assert<T extends Info["type"]>(type: T) {
|
|
const actor = use();
|
|
if (actor.type !== type)
|
|
throw new VisibleError(
|
|
"authentication",
|
|
ErrorCodes.Authentication.UNAUTHORIZED,
|
|
`Actor is not "${type}"`,
|
|
);
|
|
return actor as Extract<Info, { type: T }>;
|
|
}
|
|
|
|
export function provide<
|
|
T extends Info["type"],
|
|
Next extends (...args: any) => any,
|
|
>(type: T, properties: Extract<Info, { type: T }>["properties"], fn: Next) {
|
|
return Context.provide({ type, properties } as any, () =>
|
|
Log.provide(
|
|
{
|
|
actor: type,
|
|
...properties,
|
|
},
|
|
fn,
|
|
),
|
|
);
|
|
}
|
|
} |