Skip to content

Commit 5c33848

Browse files
authored
Merge pull request #399 from ut-code/feat/#397/logging-in-supabase
feat: Enable to save api logs in database
2 parents de0a9aa + 3d1c0bd commit 5c33848

File tree

2 files changed

+84
-4
lines changed

2 files changed

+84
-4
lines changed

backend/prisma/schema.prisma

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,13 @@ model RecipeSubmissions {
8989
9090
@@unique([userId, recipeId])
9191
}
92+
93+
model Logs {
94+
id Int @id @default(autoincrement())
95+
requestedAt DateTime
96+
method String
97+
url String
98+
status Int
99+
logType String
100+
message String
101+
}

backend/src/app.ts

Lines changed: 74 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import UserController from "./controllers/UserController"
77
import SearchController from "./controllers/SearchController"
88
import RecipeController from "./controllers/RecipeController"
99
import { elasticSearchClient } from "./elasticSearchClient"
10+
import { client } from "./db.server"
1011
import type { paths } from "../../types/openapi-types"
1112

1213
const app = express()
@@ -31,7 +32,7 @@ function logBodyGen(prependStr: string, getBodyFunc: (req: any, res: any) => str
3132
const status = res.statusCode
3233
const body = getBodyFunc(req, res)
3334
const timeStamp = new Date().toISOString()
34-
return `[${timeStamp}] ${method} ${url} ${status} ${prependStr}: ${JSON.stringify(body)}`
35+
return `[${timeStamp}] ${method} ${url} ${status} ${prependStr} ${JSON.stringify(body)}`
3536
})
3637
return bodyFormatName
3738
}
@@ -45,9 +46,78 @@ appResponsePrototype.send = function sendOverWrite(body: any) {
4546
this[morganBodyResponseSymbol] = body
4647
}
4748

48-
app.use(morgan("[:date[iso]] :method :url :status ResponseTime :response-time ms"))
49-
app.use(morgan(logBodyGen("RequestBody", (req) => req.body)))
50-
app.use(morgan(logBodyGen("ResponseBody", (_req, res) => res[morganBodyResponseSymbol])))
49+
app.use(
50+
morgan("[:date[iso]] :method :url :status ResponseTime(ms) :response-time", {
51+
stream: {
52+
write: async (message) => {
53+
console.log(message.split(" "))
54+
const [requestedAt, method, url, status, logType, logMessage] = message.split(" ")
55+
await client.logs.create({
56+
data: {
57+
requestedAt: new Date(requestedAt.replace(/\[|\]/g, "")),
58+
method,
59+
url,
60+
status: parseInt(status),
61+
logType,
62+
message: logMessage,
63+
},
64+
})
65+
},
66+
},
67+
})
68+
)
69+
app.use(
70+
morgan(
71+
logBodyGen("RequestBody", (req) => req.body),
72+
{
73+
stream: {
74+
write: async (message) => {
75+
console.log(message)
76+
const [requestedAt, method, url, status, logType, logMessage] = message.split(" ")
77+
if (url !== "/api/recipes/search") {
78+
return
79+
}
80+
await client.logs.create({
81+
data: {
82+
requestedAt: new Date(requestedAt.replace(/\[|\]/g, "")),
83+
method,
84+
url,
85+
status: parseInt(status),
86+
logType,
87+
message: logMessage,
88+
},
89+
})
90+
},
91+
},
92+
}
93+
)
94+
)
95+
app.use(
96+
morgan(
97+
logBodyGen("ResponseBody", (_req, res) => res[morganBodyResponseSymbol]),
98+
{
99+
stream: {
100+
write: async (message) => {
101+
console.log(message)
102+
const [requestedAt, method, url, status, logType, logMessage] = message.split(" ")
103+
if (url !== "/api/recipes/search") {
104+
return
105+
}
106+
await client.logs.create({
107+
data: {
108+
requestedAt: new Date(requestedAt.replace(/\[|\]/g, "")),
109+
method,
110+
url,
111+
status: parseInt(status),
112+
logType,
113+
message: logMessage,
114+
},
115+
})
116+
},
117+
},
118+
}
119+
)
120+
)
51121

52122
app.get("/", (_req, res) => {
53123
res.status(200).send("Hello, world!")

0 commit comments

Comments
 (0)