chenhunghan commited on
Commit
dd125ca
·
unverified ·
1 Parent(s): 62cf129

chore: refactor into getScimBaseUrl

Browse files

Signed-off-by: Hung-Han (Henry) Chen <chenhungh@gmail.com>

src/resources/(groups)/[groupId]/index.ts CHANGED
@@ -2,6 +2,7 @@ import { type InferSchema, type ResourceMetadata } from "xmcp";
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../../../utils/getSCIMApiKey";
 
5
 
6
  export const schema = {
7
  groupId: z.string().describe("The ID of the group"),
@@ -32,7 +33,7 @@ export default async function handler({
32
  }: InferSchema<typeof schema>) {
33
  const requestHeaders = headers();
34
  const apiToken = getScimToken(requestHeaders);
35
- const baseUrl = requestHeaders["x-scim-base-url"];
36
 
37
  if (!apiToken) {
38
  throw new Error("Missing required headers: x-scim-api-key");
 
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../../../utils/getSCIMApiKey";
5
+ import { getScimBaseUrl } from "../../../utils/getSCIMBaseUrl";
6
 
7
  export const schema = {
8
  groupId: z.string().describe("The ID of the group"),
 
33
  }: InferSchema<typeof schema>) {
34
  const requestHeaders = headers();
35
  const apiToken = getScimToken(requestHeaders);
36
+ const baseUrl = getScimBaseUrl(requestHeaders);
37
 
38
  if (!apiToken) {
39
  throw new Error("Missing required headers: x-scim-api-key");
src/resources/(groups)/index.ts CHANGED
@@ -2,6 +2,7 @@ import { type InferSchema, type ResourceMetadata } from "xmcp";
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../../utils/getSCIMApiKey";
 
5
 
6
  export const schema = {
7
  filter: z
@@ -37,7 +38,7 @@ export default async function handler({
37
  }: InferSchema<typeof schema>) {
38
  const requestHeaders = headers();
39
  const apiToken = getScimToken(requestHeaders);
40
- const baseUrl = requestHeaders["x-scim-base-url"];
41
 
42
  if (!apiToken) {
43
  throw new Error("Missing required headers: x-scim-api-key");
 
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../../utils/getSCIMApiKey";
5
+ import { getScimBaseUrl } from "../../utils/getSCIMBaseUrl";
6
 
7
  export const schema = {
8
  filter: z
 
38
  }: InferSchema<typeof schema>) {
39
  const requestHeaders = headers();
40
  const apiToken = getScimToken(requestHeaders);
41
+ const baseUrl = getScimBaseUrl(requestHeaders);
42
 
43
  if (!apiToken) {
44
  throw new Error("Missing required headers: x-scim-api-key");
src/resources/(users)/[userId]/index.ts CHANGED
@@ -2,6 +2,7 @@ import { type InferSchema, type ResourceMetadata } from "xmcp";
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../../../utils/getSCIMApiKey";
 
5
 
6
  export const schema = {
7
  userId: z.string().describe("The ID of the user"),
@@ -32,7 +33,7 @@ export default async function handler({
32
  }: InferSchema<typeof schema>) {
33
  const requestHeaders = headers();
34
  const apiToken = getScimToken(requestHeaders);
35
- const baseUrl = requestHeaders["x-scim-base-url"];
36
 
37
  if (!apiToken) {
38
  throw new Error("Missing required headers: x-scim-api-key");
 
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../../../utils/getSCIMApiKey";
5
+ import { getScimBaseUrl } from "../../../utils/getSCIMBaseUrl";
6
 
7
  export const schema = {
8
  userId: z.string().describe("The ID of the user"),
 
33
  }: InferSchema<typeof schema>) {
34
  const requestHeaders = headers();
35
  const apiToken = getScimToken(requestHeaders);
36
+ const baseUrl = getScimBaseUrl(requestHeaders);
37
 
38
  if (!apiToken) {
39
  throw new Error("Missing required headers: x-scim-api-key");
src/resources/(users)/index.ts CHANGED
@@ -2,6 +2,7 @@ import { type InferSchema, type ResourceMetadata } from "xmcp";
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../../utils/getSCIMApiKey";
 
5
 
6
  export const schema = {
7
  filter: z
@@ -37,7 +38,7 @@ export default async function handler({
37
  }: InferSchema<typeof schema>) {
38
  const requestHeaders = headers();
39
  const apiToken = getScimToken(requestHeaders);
40
- const baseUrl = requestHeaders["x-scim-base-url"];
41
 
42
  if (!apiToken) {
43
  throw new Error("Missing required headers: x-scim-api-key");
 
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../../utils/getSCIMApiKey";
5
+ import { getScimBaseUrl } from "../../utils/getSCIMBaseUrl";
6
 
7
  export const schema = {
8
  filter: z
 
38
  }: InferSchema<typeof schema>) {
39
  const requestHeaders = headers();
40
  const apiToken = getScimToken(requestHeaders);
41
+ const baseUrl = getScimBaseUrl(requestHeaders);
42
 
43
  if (!apiToken) {
44
  throw new Error("Missing required headers: x-scim-api-key");
src/tools/addUserToGroup.ts CHANGED
@@ -2,6 +2,7 @@ import { type InferSchema, type ToolMetadata } from "xmcp";
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../utils/getSCIMApiKey";
 
5
  import { readJsonBody } from "../utils/responseBody";
6
 
7
  export const metadata: ToolMetadata = {
@@ -26,7 +27,7 @@ export default async function addUserToGroup(
26
  ) {
27
  const requestHeaders = headers();
28
  const apiToken = getScimToken(requestHeaders);
29
- const baseUrl = requestHeaders["x-scim-base-url"];
30
 
31
  if (!apiToken) {
32
  throw new Error("Missing required headers: x-scim-api-key");
 
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../utils/getSCIMApiKey";
5
+ import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
6
  import { readJsonBody } from "../utils/responseBody";
7
 
8
  export const metadata: ToolMetadata = {
 
27
  ) {
28
  const requestHeaders = headers();
29
  const apiToken = getScimToken(requestHeaders);
30
+ const baseUrl = getScimBaseUrl(requestHeaders);
31
 
32
  if (!apiToken) {
33
  throw new Error("Missing required headers: x-scim-api-key");
src/tools/createGroup.ts CHANGED
@@ -3,6 +3,7 @@ import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { groupResourceSchema } from "../schemas/groupResourceSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
 
6
  import { readJsonBody } from "../utils/responseBody";
7
 
8
  export const metadata: ToolMetadata = {
@@ -32,7 +33,7 @@ export default async function createGroup(
32
  const { groupResource } = params;
33
  const requestHeaders = headers();
34
  const apiToken = getScimToken(requestHeaders);
35
- const baseUrl = requestHeaders["x-scim-base-url"];
36
 
37
  if (!apiToken) {
38
  throw new Error("Missing required headers: x-scim-api-key");
 
3
  import { z } from "zod";
4
  import { groupResourceSchema } from "../schemas/groupResourceSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
6
+ import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
7
  import { readJsonBody } from "../utils/responseBody";
8
 
9
  export const metadata: ToolMetadata = {
 
33
  const { groupResource } = params;
34
  const requestHeaders = headers();
35
  const apiToken = getScimToken(requestHeaders);
36
+ const baseUrl = getScimBaseUrl(requestHeaders);
37
 
38
  if (!apiToken) {
39
  throw new Error("Missing required headers: x-scim-api-key");
src/tools/createUser.ts CHANGED
@@ -3,6 +3,7 @@ import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { userResourceSchema } from "../schemas/userResourceSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
 
6
  import { readJsonBody } from "../utils/responseBody";
7
 
8
  export const metadata: ToolMetadata = {
@@ -32,7 +33,7 @@ export default async function createUser(
32
  const { userResource } = params;
33
  const requestHeaders = headers();
34
  const apiToken = getScimToken(requestHeaders);
35
- const baseUrl = requestHeaders["x-scim-base-url"];
36
 
37
  if (!apiToken) {
38
  throw new Error("Missing required headers: x-scim-api-key");
 
3
  import { z } from "zod";
4
  import { userResourceSchema } from "../schemas/userResourceSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
6
+ import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
7
  import { readJsonBody } from "../utils/responseBody";
8
 
9
  export const metadata: ToolMetadata = {
 
33
  const { userResource } = params;
34
  const requestHeaders = headers();
35
  const apiToken = getScimToken(requestHeaders);
36
+ const baseUrl = getScimBaseUrl(requestHeaders);
37
 
38
  if (!apiToken) {
39
  throw new Error("Missing required headers: x-scim-api-key");
src/tools/deleteGroup.ts CHANGED
@@ -2,6 +2,7 @@ import { type InferSchema, type ToolMetadata } from "xmcp";
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../utils/getSCIMApiKey";
 
5
 
6
  export const metadata: ToolMetadata = {
7
  name: "delete-group",
@@ -24,7 +25,7 @@ export default async function deleteGroup(
24
  ) {
25
  const requestHeaders = headers();
26
  const apiToken = getScimToken(requestHeaders);
27
- const baseUrl = requestHeaders["x-scim-base-url"];
28
 
29
  if (!apiToken) {
30
  throw new Error("Missing required headers: x-scim-api-key");
 
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../utils/getSCIMApiKey";
5
+ import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
6
 
7
  export const metadata: ToolMetadata = {
8
  name: "delete-group",
 
25
  ) {
26
  const requestHeaders = headers();
27
  const apiToken = getScimToken(requestHeaders);
28
+ const baseUrl = getScimBaseUrl(requestHeaders);
29
 
30
  if (!apiToken) {
31
  throw new Error("Missing required headers: x-scim-api-key");
src/tools/deleteUser.ts CHANGED
@@ -2,6 +2,7 @@ import { type InferSchema, type ToolMetadata } from "xmcp";
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../utils/getSCIMApiKey";
 
5
 
6
  export const metadata: ToolMetadata = {
7
  name: "delete-user",
@@ -24,7 +25,7 @@ export default async function deleteUser(
24
  ) {
25
  const requestHeaders = headers();
26
  const apiToken = getScimToken(requestHeaders);
27
- const baseUrl = requestHeaders["x-scim-base-url"];
28
 
29
  if (!apiToken) {
30
  throw new Error("Missing required headers: x-scim-api-key");
 
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../utils/getSCIMApiKey";
5
+ import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
6
 
7
  export const metadata: ToolMetadata = {
8
  name: "delete-user",
 
25
  ) {
26
  const requestHeaders = headers();
27
  const apiToken = getScimToken(requestHeaders);
28
+ const baseUrl = getScimBaseUrl(requestHeaders);
29
 
30
  if (!apiToken) {
31
  throw new Error("Missing required headers: x-scim-api-key");
src/tools/patchGroup.ts CHANGED
@@ -3,6 +3,7 @@ import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { patchOperationSchema } from "../schemas/patchOperationSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
 
6
  import { readJsonBody } from "../utils/responseBody";
7
 
8
  export const metadata: ToolMetadata = {
@@ -27,7 +28,7 @@ export default async function patchGroup(
27
  ) {
28
  const requestHeaders = headers();
29
  const apiToken = getScimToken(requestHeaders);
30
- const baseUrl = requestHeaders["x-scim-base-url"];
31
 
32
  if (!apiToken) {
33
  throw new Error("Missing required headers: x-scim-api-key");
 
3
  import { z } from "zod";
4
  import { patchOperationSchema } from "../schemas/patchOperationSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
6
+ import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
7
  import { readJsonBody } from "../utils/responseBody";
8
 
9
  export const metadata: ToolMetadata = {
 
28
  ) {
29
  const requestHeaders = headers();
30
  const apiToken = getScimToken(requestHeaders);
31
+ const baseUrl = getScimBaseUrl(requestHeaders);
32
 
33
  if (!apiToken) {
34
  throw new Error("Missing required headers: x-scim-api-key");
src/tools/patchUser.ts CHANGED
@@ -3,6 +3,7 @@ import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { patchOperationSchema } from "../schemas/patchOperationSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
 
6
  import { readJsonBody } from "../utils/responseBody";
7
 
8
  export const metadata: ToolMetadata = {
@@ -27,7 +28,7 @@ export default async function patchUser(
27
  ) {
28
  const requestHeaders = headers();
29
  const apiToken = getScimToken(requestHeaders);
30
- const baseUrl = requestHeaders["x-scim-base-url"];
31
 
32
  if (!apiToken) {
33
  throw new Error("Missing required headers: x-scim-api-key");
 
3
  import { z } from "zod";
4
  import { patchOperationSchema } from "../schemas/patchOperationSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
6
+ import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
7
  import { readJsonBody } from "../utils/responseBody";
8
 
9
  export const metadata: ToolMetadata = {
 
28
  ) {
29
  const requestHeaders = headers();
30
  const apiToken = getScimToken(requestHeaders);
31
+ const baseUrl = getScimBaseUrl(requestHeaders);
32
 
33
  if (!apiToken) {
34
  throw new Error("Missing required headers: x-scim-api-key");
src/tools/removeUserFromGroup.ts CHANGED
@@ -2,6 +2,7 @@ import { type InferSchema, type ToolMetadata } from "xmcp";
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../utils/getSCIMApiKey";
 
5
  import { readJsonBody } from "../utils/responseBody";
6
 
7
  export const metadata: ToolMetadata = {
@@ -26,7 +27,7 @@ export default async function removeUserFromGroup(
26
  ) {
27
  const requestHeaders = headers();
28
  const apiToken = getScimToken(requestHeaders);
29
- const baseUrl = requestHeaders["x-scim-base-url"];
30
 
31
  if (!apiToken) {
32
  throw new Error("Missing required headers: x-scim-api-key");
 
2
  import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { getScimToken } from "../utils/getSCIMApiKey";
5
+ import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
6
  import { readJsonBody } from "../utils/responseBody";
7
 
8
  export const metadata: ToolMetadata = {
 
27
  ) {
28
  const requestHeaders = headers();
29
  const apiToken = getScimToken(requestHeaders);
30
+ const baseUrl = getScimBaseUrl(requestHeaders);
31
 
32
  if (!apiToken) {
33
  throw new Error("Missing required headers: x-scim-api-key");
src/tools/replaceGroup.ts CHANGED
@@ -3,6 +3,7 @@ import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { groupResourceSchema } from "../schemas/groupResourceSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
 
6
  import { readJsonBody } from "../utils/responseBody";
7
 
8
  export const metadata: ToolMetadata = {
@@ -27,7 +28,7 @@ export default async function replaceGroup(
27
  ) {
28
  const requestHeaders = headers();
29
  const apiToken = getScimToken(requestHeaders);
30
- const baseUrl = requestHeaders["x-scim-base-url"];
31
 
32
  if (!apiToken) {
33
  throw new Error("Missing required headers: x-scim-api-key");
 
3
  import { z } from "zod";
4
  import { groupResourceSchema } from "../schemas/groupResourceSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
6
+ import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
7
  import { readJsonBody } from "../utils/responseBody";
8
 
9
  export const metadata: ToolMetadata = {
 
28
  ) {
29
  const requestHeaders = headers();
30
  const apiToken = getScimToken(requestHeaders);
31
+ const baseUrl = getScimBaseUrl(requestHeaders);
32
 
33
  if (!apiToken) {
34
  throw new Error("Missing required headers: x-scim-api-key");
src/tools/replaceUser.ts CHANGED
@@ -3,6 +3,7 @@ import { headers } from "xmcp/headers";
3
  import { z } from "zod";
4
  import { userResourceSchema } from "../schemas/userResourceSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
 
6
  import { readJsonBody } from "../utils/responseBody";
7
 
8
  export const metadata: ToolMetadata = {
@@ -27,7 +28,7 @@ export default async function replaceUser(
27
  ) {
28
  const requestHeaders = headers();
29
  const apiToken = getScimToken(requestHeaders);
30
- const baseUrl = requestHeaders["x-scim-base-url"];
31
 
32
  if (!apiToken) {
33
  throw new Error("Missing required headers: x-scim-api-key");
 
3
  import { z } from "zod";
4
  import { userResourceSchema } from "../schemas/userResourceSchema";
5
  import { getScimToken } from "../utils/getSCIMApiKey";
6
+ import { getScimBaseUrl } from "../utils/getSCIMBaseUrl";
7
  import { readJsonBody } from "../utils/responseBody";
8
 
9
  export const metadata: ToolMetadata = {
 
28
  ) {
29
  const requestHeaders = headers();
30
  const apiToken = getScimToken(requestHeaders);
31
+ const baseUrl = getScimBaseUrl(requestHeaders);
32
 
33
  if (!apiToken) {
34
  throw new Error("Missing required headers: x-scim-api-key");
src/utils/getSCIMBaseUrl.ts ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ type Headers = import("http").IncomingHttpHeaders;
2
+
3
+ export function getScimBaseUrl(headers: Headers): string {
4
+ let baseUrl = "";
5
+
6
+ if (process.env.SCIM_API_BASE_URL) {
7
+ baseUrl = process.env.SCIM_API_BASE_URL;
8
+ }
9
+ const baseUrlFromHeader = headers["x-scim-base-url"] || headers["X-SCIM-BASE-URL"];
10
+ if (typeof baseUrlFromHeader === "string") {
11
+ baseUrl = baseUrlFromHeader.trim();
12
+ }
13
+
14
+ return baseUrl;
15
+ }