Skip to content

Commit cf4b43a

Browse files
Added create message endpoint
1 parent 54cc1f0 commit cf4b43a

6 files changed

Lines changed: 85 additions & 0 deletions

File tree

database.sql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,10 @@ CREATE TABLE IF NOT EXISTS "activities" (
106106
"status" TEXT DEFAULT NULL,
107107
"timestamp" double NOT NULL
108108
);
109+
DROP TABLE IF EXISTS "messages";
110+
CREATE TABLE IF NOT EXISTS "messages" (
111+
"id" varchar(255) NOT NULL,
112+
"user" varchar(255) NOT NULL,
113+
"message" TEXT DEFAULT NULL,
114+
"timestamp" double NOT NULL
115+
);
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export async function createMessage(database: D1Database, user: string, message: string): Promise<void> {
2+
const id = crypto.randomUUID();
3+
const timestamp = Date.now();
4+
5+
await database.prepare("INSERT INTO messages (id, user, message, timestamp) VALUES (?, ?, ?, ?)").bind(id, user, message, timestamp).run();
6+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { User } from "../../models/user";
2+
3+
export async function sendMessageEmail(user: User, message: string): Promise<any> {
4+
return await fetch("https://api.mailchannels.net/tx/v1/send", {
5+
"method": "POST",
6+
"headers": {
7+
"content-type": "application/json",
8+
},
9+
"body": JSON.stringify({
10+
"personalizations": [
11+
{
12+
"to": [
13+
{
14+
"email": "contact@ridetracker.app",
15+
"name": "Ride Tracker",
16+
}
17+
]
18+
}
19+
],
20+
"from": {
21+
"email": "noreply@ridetracker.app",
22+
"name": user.firstname + " " + user.lastname
23+
},
24+
"subject": "Message from the app",
25+
"content": [
26+
{
27+
"type": "text/plain",
28+
"value": `${message}\n\nThis was sent from ${user.firstname} ${user.lastname} from ${user.email}.`,
29+
}
30+
]
31+
})
32+
});
33+
};

src/domains/router.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { handleMapsGeocodeRequest, mapsGeocodeSchema } from "../routes/maps/geoc
3333
import { handleMapsRouteRequest, mapsRouteSchema } from "../routes/maps/route";
3434
import { handleStatusRequest, statusRequestSchema } from "../routes/status";
3535
import { Token } from "../models/token";
36+
import { createMessageRequestSchema, handleCreateMessageRequest } from "../routes/message";
3637

3738
export default function createRouter() {
3839
const router = ThrowableRouter();
@@ -75,6 +76,8 @@ export default function createRouter() {
7576
router.post("/api/profiles/:userId/bikes", withAuth, withParams, withContent, withSchema(profileBikesRequestSchema), handleProfileBikesRequest);
7677

7778
router.post("/api/user/avatar", withAuth, withContent, withSchema(uploadUserImageRequestSchema), handleUploadUserAvatarRequest);
79+
80+
router.post("/api/message", withAuth, withContent, withSchema(createMessageRequestSchema), handleCreateMessageRequest);
7881

7982
router.get("/api/ping", withContent, async (request: RequestWithKey, env: Env) => {
8083
return Response.json({

src/models/Message.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export type Message = {
2+
id: string;
3+
user: string;
4+
message: string;
5+
timestamp: number;
6+
};

src/routes/message.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { createMessage } from "../controllers/messages/createMessage";
2+
import { sendMessageEmail } from "../controllers/messages/sendMessageEmail";
3+
import { getUserById } from "../controllers/users/getUserById";
4+
import { VersionFeatureFlags } from "../models/FeatureFlags";
5+
6+
export const createMessageRequestSchema = {
7+
content: {
8+
message: {
9+
type: "string",
10+
required: true
11+
}
12+
}
13+
};
14+
15+
export async function handleCreateMessageRequest(request: RequestWithKey, env: Env, context: EventContext<Env, string, null>, featureFlags: VersionFeatureFlags) {
16+
const { message } = request.content;
17+
18+
if(!message?.length)
19+
return Response.json({ success: false, message: "You must enter a message." });
20+
21+
await createMessage(env.DATABASE, request.key.user, message);
22+
23+
const user = await getUserById(env.DATABASE, request.key.user);
24+
25+
context.waitUntil(sendMessageEmail(user, message));
26+
27+
return Response.json({
28+
success: true
29+
});
30+
};

0 commit comments

Comments
 (0)