mirror of
https://github.com/rjNemo/meal_planner
synced 2026-06-06 02:26:49 +00:00
add headers and middleware
This commit is contained in:
parent
ae63d45fe6
commit
767471f2bb
6 changed files with 46 additions and 6 deletions
4
composables/useGreeting.ts
Normal file
4
composables/useGreeting.ts
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
export default function useGreeting(text: string) {
|
||||
const { $client } = useNuxtApp();
|
||||
return $client.hello.useQuery({ text });
|
||||
}
|
||||
|
|
@ -1,7 +1,5 @@
|
|||
<script setup lang="ts">
|
||||
const { $client } = useNuxtApp();
|
||||
|
||||
const { data } = await $client.hello.useQuery({ text: "chef" });
|
||||
const { data } = useGreeting("chef");
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import { createTRPCNuxtClient, httpBatchLink } from "trpc-nuxt/client";
|
|||
import type { AppRouter } from "~/server/trpc/routers";
|
||||
|
||||
export default defineNuxtPlugin(() => {
|
||||
const headers = useRequestHeaders();
|
||||
/**
|
||||
* createTRPCNuxtClient adds a `useQuery` composable
|
||||
* built on top of `useAsyncData`.
|
||||
|
|
@ -10,6 +11,13 @@ export default defineNuxtPlugin(() => {
|
|||
links: [
|
||||
httpBatchLink({
|
||||
url: "/api/trpc",
|
||||
headers() {
|
||||
// add custom headers here
|
||||
return {
|
||||
Authorization: "Bearer token",
|
||||
...headers,
|
||||
};
|
||||
},
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
|
|
|||
|
|
@ -4,6 +4,19 @@ import type { inferAsyncReturnType } from "@trpc/server";
|
|||
* Creates context for an incoming request
|
||||
* @link https://trpc.io/docs/context
|
||||
*/
|
||||
export const createContext = () => ({});
|
||||
export async function createContext(event: H3Event) {
|
||||
const authorization = getRequestHeader(event, "authorization");
|
||||
async function getUserFromHeader() {
|
||||
if (authorization) {
|
||||
console.log("authorization:", authorization);
|
||||
return { isAdmin: true };
|
||||
}
|
||||
return null;
|
||||
}
|
||||
const user = await getUserFromHeader();
|
||||
return {
|
||||
user,
|
||||
};
|
||||
}
|
||||
|
||||
export type Context = inferAsyncReturnType<typeof createContext>;
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
import type { inferRouterOutputs } from "@trpc/server";
|
||||
import { z } from "zod";
|
||||
import { publicProcedure, router } from "../trpc";
|
||||
import { publicProcedure, privateProcedure, router } from "../trpc";
|
||||
|
||||
export const appRouter = router({
|
||||
hello: publicProcedure
|
||||
// hello: publicProcedure
|
||||
hello: privateProcedure
|
||||
.input(
|
||||
z.object({
|
||||
text: z.string().nullish(),
|
||||
|
|
@ -17,3 +19,4 @@ export const appRouter = router({
|
|||
|
||||
// export type definition of API
|
||||
export type AppRouter = typeof appRouter;
|
||||
export type RouterOutput = inferRouterOutputs<AppRouter>;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
import { initTRPC } from "@trpc/server";
|
||||
import type { Context } from "~/server/trpc/context";
|
||||
import { TRPCError } from "@trpc/server";
|
||||
// import { authMiddleware } from "~/server/trpc/middleware";
|
||||
|
||||
const t = initTRPC.context<Context>().create();
|
||||
|
||||
|
|
@ -9,3 +11,15 @@ const t = initTRPC.context<Context>().create();
|
|||
export const publicProcedure = t.procedure;
|
||||
export const router = t.router;
|
||||
export const middleware = t.middleware;
|
||||
|
||||
export const authMiddleware = middleware(({ next, ctx }) => {
|
||||
if (!ctx.user?.isAdmin) {
|
||||
throw new TRPCError({ code: "UNAUTHORIZED" });
|
||||
}
|
||||
return next({
|
||||
ctx: {
|
||||
user: ctx.user,
|
||||
},
|
||||
});
|
||||
});
|
||||
export const privateProcedure = t.procedure.use(authMiddleware);
|
||||
|
|
|
|||
Loading…
Reference in a new issue