Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 54 additions & 49 deletions backend/src/index.js → backend/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
const { Pool } = require("pg");
import { Pool } from "pg";

const pool = new Pool({
user: process.env.DB_USER,
host: process.env.DB_HOST,
Expand All @@ -7,57 +8,57 @@ const pool = new Pool({
port: parseInt(process.env.DB_PORT || '5432'),
ssl: { rejectUnauthorized: false }
});
async function initializeTable() {
try {
await pool.query(`
CREATE TABLE IF NOT EXISTS scores (
id SERIAL PRIMARY KEY,
player_name VARCHAR(100) NOT NULL,
time_taken INTEGER NOT NULL,
blocks INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
`);
console.log('Table initialized');
} catch (error) {
console.error('Table initialization error:', error);
}

async function initializeTable(): Promise<void> {
await pool.query(`
CREATE TABLE IF NOT EXISTS scores (
id SERIAL PRIMARY KEY,
player_name VARCHAR(100) NOT NULL,
time_taken INTEGER NOT NULL,
blocks INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
`);
}

exports.handler = async (event) => {
// console.log('Full event:', JSON.stringify(event, null, 2));
// console.log('httpMethod:', event.httpMethod);
// console.log('path:', event.path);
// console.log('body:', event.body);

await initializeTable();

const headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
'Access-Control-Allow-Methods': 'GET,POST,OPTIONS',
'Content-Type': 'application/json'
};

const method = event.httpMethod ? event.httpMethod.toUpperCase() : null;
const tableInitPromise = initializeTable().catch(error => {
console.error('Table initialization error:', error);
process.exit(1);
});

interface LambdaEvent {
httpMethod: string;
body: string | null;
}

interface LambdaResponse {
statusCode: number;
headers: Record<string, string>;
body: string;
}

const headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
'Access-Control-Allow-Methods': 'GET,POST,OPTIONS',
'Content-Type': 'application/json'
};

export const handler = async (event: LambdaEvent): Promise<LambdaResponse> => {
await tableInitPromise;

const method = event.httpMethod?.toUpperCase() ?? null;

if (method === 'OPTIONS') {
return {
statusCode: 200,
headers,
body: ''
};
return { statusCode: 200, headers, body: '' };
}

if (method === 'GET') {
try {
const result = await pool.query(
`SELECT player_name, time_taken, blocks, created_at FROM scores ORDER BY time_taken ASC LIMIT 10;`
);

return {
statusCode: 200,
headers,
body: JSON.stringify(result.rows)
};
return { statusCode: 200, headers, body: JSON.stringify(result.rows) };
} catch (error) {
console.error('DB Select Error:', error);
return {
Expand All @@ -67,24 +68,28 @@ exports.handler = async (event) => {
};
}
}
if (event.httpMethod === 'POST') {

if (method === 'POST') {
try {
if (!event.body) {
return { statusCode: 400, headers, body: JSON.stringify({ message: 'Invalid data' }) };
}
const body = JSON.parse(event.body);
const { player_name, time_taken, blocks } = body;

if (typeof time_taken !== 'number' || !player_name) {
return {
statusCode: 400,
headers,
body: JSON.stringify({ message: 'Invalid data' })
};
}

await pool.query(
`INSERT INTO scores(player_name, time_taken, blocks) VALUES($1, $2, $3);`,
[player_name, time_taken, blocks]
);

return {
statusCode: 201,
headers,
Expand All @@ -99,10 +104,10 @@ exports.handler = async (event) => {
};
}
}

return {
statusCode: 404,
headers,
body: JSON.stringify({ message: "DEBUG: Final Fallback 404." }) // メッセージを再変更
body: JSON.stringify({ message: 'Not Found' })
};
};

39 changes: 32 additions & 7 deletions backend/src/server.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,55 @@
import * as dotenv from "dotenv";
import express from 'express';
import { Pool} from "pg";
import { Pool } from "pg";
import cors from 'cors';
dotenv.config();
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
pool.connect().catch(err => console.error('DB connection error:', err));

pool.query(`
CREATE TABLE IF NOT EXISTS scores (
id SERIAL PRIMARY KEY,
player_name VARCHAR(100) NOT NULL,
time_taken INTEGER NOT NULL,
blocks INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
`).catch(error => {
console.error('Table initialization error:', error);
process.exit(1);
});

const app = express();
const corsOptions = {
origin: process.env.CORS_URL,
origin: process.env.CORS_URL,
optionsSuccessStatus: 200
};

app.use(cors(corsOptions));
app.use(express.json());
app.use(express.json());

app.get('/api/scores', async (req, res) => {
try {
const result = await pool.query(
`SELECT player_name, time_taken, blocks, created_at FROM scores ORDER BY time_taken ASC LIMIT 10;`
);
res.status(200).json(result.rows);
} catch (error) {
console.error('DB Select Error:', error);
res.status(500).send('Database error');
}
});

app.post('/api/score', async (req, res) => {
const { player_name, time_taken } = req.body;
const { player_name, time_taken, blocks } = req.body;
if (typeof time_taken !== 'number' || !player_name) {
return res.status(400).send('Invalid data');
}
try {
await pool.query(
`INSERT INTO users(player_name, time_taken) VALUES($1, $2);`,
[player_name, time_taken]
`INSERT INTO scores(player_name, time_taken, blocks) VALUES($1, $2, $3);`,
[player_name, time_taken, blocks]
);
res.status(201).send({ message: 'Score saved successfully' });
} catch (error) {
Expand Down
Loading