ability to get sample users with middleware stuff in dev

This commit is contained in:
lingdocs 2022-01-09 18:59:20 +04:00
parent 26e4b80f9f
commit ddd25e9650
3 changed files with 111 additions and 14 deletions

View File

@ -0,0 +1,87 @@
import * as AT from "../../../website/src/types/account-types";
const basic: AT.LingdocsUser = {
"_id":"5e8dd381-950f-4641-922d-c63c6bf0f8e9",
"_rev":"1713-1a299e0d66da62fe4c8d059f0f068cb7",
"userId":"5e8dd381-950f-4641-922d-c63c6bf0f8e9" as AT.UUID,
"email":"bob@example.com",
"emailVerified":true,
"name":"Bob Smith",
"password":"12345" as AT.Hash,
"level":"basic",
"tests":[],
"lastLogin":1629893763810 as AT.TimeStamp,
"lastActive":1630414108552 as AT.TimeStamp,
"userTextOptionsRecord":{
"lastModified":1629983812750 as AT.TimeStamp,
"userTextOptions":{"spelling":"Afghan","diacritics":false,"dialect":"standard","phonetics":"lingdocs"}
},
};
const student: AT.LingdocsUser = {
"_id":"5e8dd381-950f-4641-922d-c63c6bf0f8e8",
"_rev":"1713-1a299e0d66da62fe4c8d059f0f068cb6",
"userId":"5e8dd381-950f-4641-922d-c63c6bf0f8e9" as AT.UUID,
"email":"jim@example.com",
"emailVerified":true,
"name":"Jim Weston",
"password":"12345" as AT.Hash,
"level":"student",
"tests":[],
"lastLogin":1629893763810 as AT.TimeStamp,
"lastActive":1630414108552 as AT.TimeStamp,
"couchDbPassword": "12345" as AT.UserDbPassword,
"wordlistDbName": "jim-db" as AT.WordlistDbName,
"userTextOptionsRecord":{
"lastModified":1629983812750 as AT.TimeStamp,
"userTextOptions":{"spelling":"Afghan","diacritics":false,"dialect":"standard","phonetics":"lingdocs"}
},
};
const admin: AT.LingdocsUser = {
"_id":"5e8dd381-950f-4641-922d-c63c6bf0f8e8",
"_rev":"1713-1a299e0d66da62fe4c8d059f0f068cb6",
"userId":"5e8dd381-950f-4641-922d-c63c6bf0f8e9" as AT.UUID,
"email":"jim@example.com",
"emailVerified":true,
"name":"Frank Weston",
"password":"12345" as AT.Hash,
"level":"editor",
"admin":true,
"tests":[],
"lastLogin":1629893763810 as AT.TimeStamp,
"lastActive":1630414108552 as AT.TimeStamp,
"couchDbPassword": "12345" as AT.UserDbPassword,
"wordlistDbName": "jim-db" as AT.WordlistDbName,
"userTextOptionsRecord":{
"lastModified":1629983812750 as AT.TimeStamp,
"userTextOptions":{"spelling":"Afghan","diacritics":false,"dialect":"standard","phonetics":"lingdocs"}
},
};
const editor: AT.LingdocsUser = {
"_id":"5e8dd381-950f-4641-922d-c63c6bf0f8e8",
"_rev":"1713-1a299e0d66da62fe4c8d059f0f068cb6",
"userId":"5e8dd381-950f-4641-922d-c63c6bf0f8e9" as AT.UUID,
"email":"jim@example.com",
"emailVerified":true,
"name":"Frank Weston",
"password":"12345" as AT.Hash,
"level":"editor",
"tests":[],
"lastLogin":1629893763810 as AT.TimeStamp,
"lastActive":1630414108552 as AT.TimeStamp,
"couchDbPassword": "12345" as AT.UserDbPassword,
"wordlistDbName": "jim-db" as AT.WordlistDbName,
"userTextOptionsRecord":{
"lastModified":1629983812750 as AT.TimeStamp,
"userTextOptions":{"spelling":"Afghan","diacritics":false,"dialect":"standard","phonetics":"lingdocs"}
},
};
export default {
basic,
student,
editor,
admin,
};

View File

@ -5,7 +5,7 @@ import type {
GetServerSidePropsContext, GetServerSidePropsContext,
GetServerSidePropsResult, GetServerSidePropsResult,
} from "next"; } from "next";
import sampleUsers from "./sample-users";
declare module "http" { declare module "http" {
interface IncomingMessage { interface IncomingMessage {
@ -38,14 +38,18 @@ async function fetchUser(cookies: any): Promise<AT.LingdocsUser | undefined> {
* *
* @returns * @returns
*/ */
export async function lingdocsUserExpressMiddleware(req: Request, res: Response, next: NextFunction) { export function lingdocsUserExpressMiddleware(devSampleUser?: "basic" | "student" | "admin" | "editor" | "none"): (req: Request, res: Response, next: NextFunction) => Promise<void> {
const user = await fetchUser(req.headers.cookie); return async function expressMiddleware(req, res, next) {
Object.defineProperty( const user = devSampleUser
req, ? (devSampleUser === "none" ? undefined : sampleUsers[devSampleUser])
"user", : await fetchUser(req.headers.cookie);
{ value: user, writable: false, enumerable: true }, Object.defineProperty(
); req,
next(); "user",
{ value: user, writable: false, enumerable: true },
);
next();
}
} }
/** /**
@ -62,9 +66,11 @@ export async function lingdocsUserExpressMiddleware(req: Request, res: Response,
* @param handler * @param handler
* @returns * @returns
*/ */
export function withLingdocsUserApiRoute(handler: NextApiHandler): NextApiHandler { export function withLingdocsUserApiRoute(handler: NextApiHandler, devSampleUser?: "basic" | "student" | "admin" | "editor" | "none"): NextApiHandler {
return async function nextApiHandlerWrappedWithLingdocsUser(req, res) { return async function nextApiHandlerWrappedWithLingdocsUser(req, res) {
const user = await fetchUser(req.cookies); const user = devSampleUser
? (devSampleUser === "none" ? undefined : sampleUsers[devSampleUser])
: await fetchUser(req.headers.cookies);
Object.defineProperty( Object.defineProperty(
req, req,
"user", "user",
@ -91,11 +97,15 @@ export function withLingdocsUserSsr<
>( >(
handler: ( handler: (
context: GetServerSidePropsContext, context: GetServerSidePropsContext,
) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>) { ) => GetServerSidePropsResult<P> | Promise<GetServerSidePropsResult<P>>,
devSampleUser?: "basic" | "student" | "admin" | "editor" | "none",
) {
return async function nextGetServerSidePropsHandlerWrappedWithLingdocsUser( return async function nextGetServerSidePropsHandlerWrappedWithLingdocsUser(
context: GetServerSidePropsContext, context: GetServerSidePropsContext,
) { ) {
const user = await fetchUser(context.req.cookies); const user = devSampleUser
? (devSampleUser === "none" ? undefined : sampleUsers[devSampleUser])
: await fetchUser(context.req.cookies);
Object.defineProperty( Object.defineProperty(
context.req, context.req,
"user", "user",

View File

@ -1,6 +1,6 @@
{ {
"name": "@lingdocs/lingdocs-main", "name": "@lingdocs/lingdocs-main",
"version": "0.2.2", "version": "0.2.3",
"description": "types and functions for lingdocs stuff", "description": "types and functions for lingdocs stuff",
"main": "dist/library.js", "main": "dist/library.js",
"module": "dist/library.js", "module": "dist/library.js",