Add push notif support
This commit is contained in:
		@@ -12,7 +12,7 @@
 | 
			
		||||
    "dev": "next dev",
 | 
			
		||||
    "lint": "next lint",
 | 
			
		||||
    "start": "next start",
 | 
			
		||||
    "go": "git pull && next build && next start"
 | 
			
		||||
    "go": "next build && next start"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@t3-oss/env-nextjs": "^0.10.1",
 | 
			
		||||
 
 | 
			
		||||
@@ -20,4 +20,4 @@ export const POST = async (request: NextRequest) => {
 | 
			
		||||
    return NextResponse.json({ message: "Error" }, { status: 500 });
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
// localhost:3000/api/setCountdown?apiKey=I_Love_Madeline&countdown=2023-01-01T00:00:00.000Z
 | 
			
		||||
// localhost:3000/api/setCountdown?apiKey=I_Love_Madeline&countdown=2024-09-20T12:00:00.000Z
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								src/app/api/updatePushToken/route.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/app/api/updatePushToken/route.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
			
		||||
import { NextResponse } from 'next/server';
 | 
			
		||||
import { updateUserPushToken } from '~/server/functions';
 | 
			
		||||
 | 
			
		||||
type Data = {
 | 
			
		||||
  apiKey: string;
 | 
			
		||||
  userId: string;
 | 
			
		||||
  pushToken: string;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const POST = async (request: Request) => {
 | 
			
		||||
  try {
 | 
			
		||||
    const { apiKey, userId, pushToken } = await request.json() as Data;
 | 
			
		||||
 | 
			
		||||
    // Validate API key (optional, but since you do it, let's continue)
 | 
			
		||||
    if (apiKey !== process.env.API_KEY) {
 | 
			
		||||
      return NextResponse.json({ message: "Invalid API Key" }, { status: 401 });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Update push token in the database
 | 
			
		||||
    await updateUserPushToken(parseInt(userId), pushToken);
 | 
			
		||||
 | 
			
		||||
    return NextResponse.json({ message: "Push token updated successfully" });
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    console.error(error);
 | 
			
		||||
    return NextResponse.json({ message: "Error updating push token" }, { status: 500 });
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
@@ -14,6 +14,7 @@ export const users = createTable(
 | 
			
		||||
    id: serial("id").primaryKey(),
 | 
			
		||||
    name: varchar("name", { length: 256 }),
 | 
			
		||||
    message: varchar("message", { length: 256 }),
 | 
			
		||||
    pushToken: varchar("push_token", { length: 256 }),
 | 
			
		||||
    createdAt: timestamp("created_at", { withTimezone: true })
 | 
			
		||||
      .default(sql`CURRENT_TIMESTAMP`)
 | 
			
		||||
      .notNull(),
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,22 @@ export const getUsers = async () => {
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getUser = async (userId: number) => {
 | 
			
		||||
  try {
 | 
			
		||||
    const result = await db.select({
 | 
			
		||||
      id: schema.users.id,
 | 
			
		||||
      name: schema.users.name,
 | 
			
		||||
      message: schema.users.message,
 | 
			
		||||
      pushToken: schema.users.pushToken,
 | 
			
		||||
    }).from(schema.users)
 | 
			
		||||
    .where(eq(schema.users.id, userId));
 | 
			
		||||
    return result;
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    console.error("Error fetching user", error);
 | 
			
		||||
    throw new Error("Failed to fetch user");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getMessage = async (userId: number) => {
 | 
			
		||||
  try {
 | 
			
		||||
    let message = 1;
 | 
			
		||||
@@ -38,6 +54,14 @@ export const setMessage = async (userId: number, message: string) => {
 | 
			
		||||
    await db.update(schema.users)
 | 
			
		||||
      .set({ message: message })
 | 
			
		||||
      .where(eq(schema.users.id, userId));
 | 
			
		||||
    const otherUserId = userId === 1 ? 2 : 1;
 | 
			
		||||
    const otherUser = await getUser(otherUserId);
 | 
			
		||||
 | 
			
		||||
    if (otherUser?.[0]?.pushToken) {
 | 
			
		||||
      await sendPushNotification(otherUser[0].pushToken, message);
 | 
			
		||||
    } else {
 | 
			
		||||
      console.log(`Other user with id ${otherUserId} does not have a push token`);
 | 
			
		||||
    }
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    console.error("Error setting message", error);
 | 
			
		||||
    throw new Error("Failed to set message");
 | 
			
		||||
@@ -67,3 +91,40 @@ export const setCountdown = async (date: Date) => {
 | 
			
		||||
    throw new Error("Failed to set countdown");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const updateUserPushToken = async (userId: number, pushToken: string) => {
 | 
			
		||||
  try {
 | 
			
		||||
    await db.update(schema.users)
 | 
			
		||||
      .set({ pushToken: pushToken })
 | 
			
		||||
      .where(eq(schema.users.id, userId));
 | 
			
		||||
      console.log(`Push token updated for userId ${userId}`);
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    console.error("Error updating push token", error);
 | 
			
		||||
    throw new Error("Failed to update push token");
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const sendPushNotification = async (expoPushToken: string, message: string) => {
 | 
			
		||||
  const notificationMessage = {
 | 
			
		||||
    to: expoPushToken,
 | 
			
		||||
    sound: 'default',
 | 
			
		||||
    title: 'New message!',
 | 
			
		||||
    body: message,
 | 
			
		||||
    data: { message }, // Extra data you might want to send
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  try {
 | 
			
		||||
    await fetch('https://exp.host/--/api/v2/push/send', {
 | 
			
		||||
      method: 'POST',
 | 
			
		||||
      headers: {
 | 
			
		||||
        Accept: 'application/json',
 | 
			
		||||
        'Accept-Encoding': 'gzip, deflate',
 | 
			
		||||
        'Content-Type': 'application/json',
 | 
			
		||||
      },
 | 
			
		||||
      body: JSON.stringify(notificationMessage),
 | 
			
		||||
    });
 | 
			
		||||
    console.log('Push notification sent successfully');
 | 
			
		||||
  } catch (error) {
 | 
			
		||||
    console.error('Error sending push notification', error);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user