Skip to content

Commit 3acc0ec

Browse files
mirarifhasananwarulislamjamesgeorge007
authored
feat: mock server (hoppscotch#5482)
Co-authored-by: Anwarul Islam <[email protected]> Co-authored-by: jamesgeorge007 <[email protected]>
1 parent dd8744f commit 3acc0ec

File tree

59 files changed

+6249
-69
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+6249
-69
lines changed

aio-multiport-setup.Caddyfile

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,16 @@
1616
}
1717

1818
:3170 {
19-
reverse_proxy localhost:8080
19+
@mock {
20+
header_regexp host Host ^[^.]+\.mock\..*$
21+
}
22+
23+
handle @mock {
24+
rewrite * /mock{uri}
25+
reverse_proxy localhost:8080
26+
}
27+
28+
handle {
29+
reverse_proxy localhost:8080
30+
}
2031
}

aio-subpath-access.Caddyfile

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,18 @@
1818

1919
# Handle requests under `/backend*` path
2020
handle_path /backend* {
21-
reverse_proxy localhost:8080
21+
@mock {
22+
header_regexp host Host ^[^.]+\.mock\..*$
23+
}
24+
25+
handle @mock {
26+
rewrite * /mock{uri}
27+
reverse_proxy localhost:8080
28+
}
29+
30+
handle {
31+
reverse_proxy localhost:8080
32+
}
2233
}
2334

2435
# Handle requests under `/desktop-app-server*` path

packages/hoppscotch-backend/backend.Caddyfile

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,16 @@
44
}
55

66
:80 :3170 {
7-
reverse_proxy localhost:8080
7+
@mock {
8+
header_regexp host Host ^[^.]+\.mock\..*$
9+
}
10+
11+
handle @mock {
12+
rewrite * /mock{uri}
13+
reverse_proxy localhost:8080
14+
}
15+
16+
handle {
17+
reverse_proxy localhost:8080
18+
}
819
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
-- CreateEnum
2+
CREATE TYPE "WorkspaceType" AS ENUM ('USER', 'TEAM');
3+
4+
-- CreateEnum
5+
CREATE TYPE "MockServerAction" AS ENUM ('CREATED', 'DELETED', 'ACTIVATED', 'DEACTIVATED');
6+
7+
-- CreateTable
8+
CREATE TABLE "MockServer" (
9+
"id" TEXT NOT NULL,
10+
"name" TEXT NOT NULL,
11+
"subdomain" TEXT NOT NULL,
12+
"creatorUid" TEXT,
13+
"collectionID" TEXT NOT NULL,
14+
"workspaceType" "WorkspaceType" NOT NULL,
15+
"workspaceID" TEXT NOT NULL,
16+
"delayInMs" INTEGER NOT NULL DEFAULT 0,
17+
"isPublic" BOOLEAN NOT NULL DEFAULT true,
18+
"isActive" BOOLEAN NOT NULL DEFAULT true,
19+
"hitCount" INTEGER NOT NULL DEFAULT 0,
20+
"lastHitAt" TIMESTAMPTZ(3),
21+
"createdOn" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
22+
"updatedOn" TIMESTAMPTZ(3) NOT NULL,
23+
"deletedAt" TIMESTAMPTZ(3),
24+
25+
CONSTRAINT "MockServer_pkey" PRIMARY KEY ("id")
26+
);
27+
28+
-- CreateTable
29+
CREATE TABLE "MockServerLog" (
30+
"id" TEXT NOT NULL,
31+
"mockServerID" TEXT NOT NULL,
32+
"requestMethod" TEXT NOT NULL,
33+
"requestPath" TEXT NOT NULL,
34+
"requestHeaders" JSONB NOT NULL,
35+
"requestBody" JSONB,
36+
"requestQuery" JSONB,
37+
"responseStatus" INTEGER NOT NULL,
38+
"responseHeaders" JSONB NOT NULL,
39+
"responseBody" JSONB,
40+
"responseTime" INTEGER NOT NULL,
41+
"ipAddress" TEXT,
42+
"userAgent" TEXT,
43+
"executedAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
44+
45+
CONSTRAINT "MockServerLog_pkey" PRIMARY KEY ("id")
46+
);
47+
48+
-- CreateTable
49+
CREATE TABLE "MockServerActivity" (
50+
"id" TEXT NOT NULL,
51+
"mockServerID" TEXT NOT NULL,
52+
"action" "MockServerAction" NOT NULL,
53+
"performedBy" TEXT,
54+
"performedAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
55+
56+
CONSTRAINT "MockServerActivity_pkey" PRIMARY KEY ("id")
57+
);
58+
59+
-- CreateIndex
60+
CREATE UNIQUE INDEX "MockServer_subdomain_key" ON "MockServer"("subdomain");
61+
62+
-- CreateIndex
63+
CREATE INDEX "MockServerLog_mockServerID_idx" ON "MockServerLog"("mockServerID");
64+
65+
-- CreateIndex
66+
CREATE INDEX "MockServerLog_mockServerID_executedAt_idx" ON "MockServerLog"("mockServerID", "executedAt");
67+
68+
-- CreateIndex
69+
CREATE INDEX "MockServerActivity_mockServerID_idx" ON "MockServerActivity"("mockServerID");
70+
71+
-- AddForeignKey
72+
ALTER TABLE "MockServer" ADD CONSTRAINT "MockServer_creatorUid_fkey" FOREIGN KEY ("creatorUid") REFERENCES "User"("uid") ON DELETE SET NULL ON UPDATE CASCADE;
73+
74+
-- AddForeignKey
75+
ALTER TABLE "MockServerLog" ADD CONSTRAINT "MockServerLog_mockServerID_fkey" FOREIGN KEY ("mockServerID") REFERENCES "MockServer"("id") ON DELETE CASCADE ON UPDATE CASCADE;
76+
77+
-- AddForeignKey
78+
ALTER TABLE "MockServerActivity" ADD CONSTRAINT "MockServerActivity_mockServerID_fkey" FOREIGN KEY ("mockServerID") REFERENCES "MockServer"("id") ON DELETE CASCADE ON UPDATE CASCADE;
79+
80+
81+
82+
-- Add mockExamples column to UserRequest
83+
ALTER TABLE "UserRequest"
84+
ADD COLUMN "mockExamples" JSONB;
85+
86+
-- Add mockExamples column to TeamRequest
87+
ALTER TABLE "TeamRequest"
88+
ADD COLUMN "mockExamples" JSONB;
89+
90+
-- Create function to sync mock examples
91+
CREATE OR REPLACE FUNCTION sync_mock_examples()
92+
RETURNS TRIGGER AS $$
93+
BEGIN
94+
NEW."mockExamples" := jsonb_build_object(
95+
'examples',
96+
COALESCE(
97+
(
98+
SELECT jsonb_agg(
99+
jsonb_build_object(
100+
'key', key,
101+
'name', value->>'name',
102+
'endpoint', value->'originalRequest'->>'endpoint',
103+
'method', value->'originalRequest'->>'method',
104+
'headers', COALESCE(value->'originalRequest'->'headers', '[]'::jsonb),
105+
'statusCode', (value->>'code')::int,
106+
'statusText', value->>'status',
107+
'responseBody', value->>'body',
108+
'responseHeaders', COALESCE(value->'headers', '[]'::jsonb)
109+
)
110+
)
111+
FROM jsonb_each(NEW.request->'responses') AS responses(key, value)
112+
WHERE jsonb_typeof(NEW.request->'responses') = 'object'
113+
),
114+
'[]'::jsonb
115+
)
116+
);
117+
118+
RETURN NEW;
119+
END;
120+
$$ LANGUAGE plpgsql;
121+
122+
-- Create trigger for UserRequest
123+
CREATE TRIGGER trigger_sync_mock_examples_user_request
124+
BEFORE INSERT OR UPDATE OF request ON "UserRequest"
125+
FOR EACH ROW
126+
EXECUTE FUNCTION sync_mock_examples();
127+
128+
-- Create trigger for TeamRequest
129+
CREATE TRIGGER trigger_sync_mock_examples_team_request
130+
BEFORE INSERT OR UPDATE OF request ON "TeamRequest"
131+
FOR EACH ROW
132+
EXECUTE FUNCTION sync_mock_examples();
133+
134+
-- Backfill existing data for UserRequest
135+
UPDATE "UserRequest" SET request = request WHERE request IS NOT NULL;
136+
137+
-- Backfill existing data for TeamRequest
138+
UPDATE "TeamRequest" SET request = request WHERE request IS NOT NULL;
139+
140+
-- Add GIN indexes
141+
CREATE INDEX "idx_mock_examples_user_requests_gin" ON "UserRequest" USING GIN ("mockExamples");
142+
CREATE INDEX "idx_mock_examples_team_requests_gin" ON "TeamRequest" USING GIN ("mockExamples");

0 commit comments

Comments
 (0)