Skip to content

Commit

Permalink
Merge pull request #8 from weak-kajuma/development
Browse files Browse the repository at this point in the history
Development
  • Loading branch information
weak-kajuma authored Sep 13, 2023
2 parents f26ef62 + 69e11ed commit 89ce4dd
Show file tree
Hide file tree
Showing 12 changed files with 1,955 additions and 64 deletions.
Binary file modified .DS_Store
Binary file not shown.
407 changes: 407 additions & 0 deletions api/kra/KRAClient.ts

Large diffs are not rendered by default.

53 changes: 53 additions & 0 deletions api/kra/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
export const combination = (
nums: number[],
k: number
): Array<Array<number>> => {
let ans = [];
if (nums.length < k) {
return [];
}
if (k === 1) {
for (let i = 0; i < nums.length; i++) {
ans[i] = [nums[i]];
}
} else {
for (let i = 0; i < nums.length - k + 1; i++) {
let row = combination(nums.slice(i + 1), k - 1);
for (let j = 0; j < row.length; j++) {
ans.push([nums[i]].concat(row[j]));
}
}
}
return ans;
};

export const permutation = (
nums: number[],
k: number
): Array<Array<number>> => {
let ans = [];
if (nums.length < k) {
return [];
}
if (k === 1) {
for (let i = 0; i < nums.length; i++) {
ans[i] = [nums[i]];
}
} else {
for (let i = 0; i < nums.length; i++) {
let parts = nums.slice(0);
parts.splice(i, 1)[0];
let row = permutation(parts, k - 1);
for (let j = 0; j < row.length; j++) {
ans.push([nums[i]].concat(row[j]));
}
}
}
return ans;
};

export const range = (begin: number, end: number) =>
[...Array(end - begin + 1)].map((_, i) => begin + i);

export const noDupeRange = (begin: number, end: number, dup: number[]) =>
range(begin, end).filter((e) => !dup.includes(e));
78 changes: 56 additions & 22 deletions api/router/race.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,59 @@
import express, { Request, Response } from "express"
import { RowDataPacket } from "mysql2"
import mysql_connect from "./../utils/mysqlConnect"
import { Ticket } from "../types/Ticket"
import express, { Request, Response } from "express";
import { RowDataPacket } from "mysql2";
import mysql_connect from "./../utils/mysqlConnect";
import { KRATicket, RacingResult } from "../kra/KRAClient";
import { Races } from "../utils/constant";
import loginAndGetToken from "../utils/loginAndgetToken";
import axios from "axios";

const router = express.Router()
const con = mysql_connect()
const router = express.Router();
const con = mysql_connect();

router.put("/payout/:race_id", async (req: Request, res: Response<Ticket[]>) => {
const [tickets] = await con.query<RowDataPacket[]>("SELECT * FROM ticket WHERE race = ?", [req.params.race_id])
res.status(200).json(tickets.map(ticket => {
return {
ticket_id: ticket.ticket_id,
user_id: ticket.user_id,
horse: ticket.hourse,
type: ticket.type,
option: ticket.option,
optNum: ticket.optNum,
bet: ticket.bet,
race: ticket.race
}
}))
})
router.put(
"/payout/:race_id",
async (req: Request, res: Response<KRATicket[]>) => {
const [tickets] = await con.query<RowDataPacket[]>(
"SELECT * FROM ticket WHERE race = ?",
[req.params.race_id]
);
const idToken = await loginAndGetToken()
if (!idToken) throw new Error('Cannot Login');
const kraTickets: KRATicket[] = tickets.map(
(t) =>
new KRATicket(
t.type,
t.bet,
t.horse,
t.option,
t.optNum,
t.user_id
)
);
const id = parseInt(req.params.race_id) - 1;
const f = parseInt(req.body.f);
const s = parseInt(req.body.s);
const t = parseInt(req.body.t);
const race = Races[id].setResult(new RacingResult([f, s, t]));
//Transaction作成 user_id={kraTicket.user} dealer_id="1c34" hide_detail="none" detail={kraTicket.type} amount={payout}
//Money-Manager APIで
await Promise.all(kraTickets.map((kraTicket) => {
const payout: number = race.totalPayout(kraTicket); //払い戻し
if (payout > 0) {
return axios.post(`${process.env.ENDPOINT}/transactions`, {
headers: {Authorization: `Bearer ${idToken}`},
body: {
user_id: kraTicket.user,
dealer_id: process.env.DEALERID,
amount: payout,
type: "payout",
detail: kraTicket.type.toString(),
hide_detail: ""
}
}).catch(e => console.log(e))
}
}));
return res.status(200).json(kraTickets);
}
);

export default router
export default router;
97 changes: 66 additions & 31 deletions api/router/ticket.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,36 @@
import express, { Request, Response } from "express"
import { ResultSetHeader, RowDataPacket } from "mysql2"
import mysql_connect from "./../utils/mysqlConnect"
import { Ticket } from "../types/Ticket"
import express, { Request, Response } from "express";
import { ResultSetHeader, RowDataPacket } from "mysql2";
import mysql_connect from "./../utils/mysqlConnect";
import { Ticket } from "../types/Ticket";
import axios from "axios";
import loginAndGetToken from "../utils/loginAndgetToken";

const router = express.Router()
const con = mysql_connect()
const router = express.Router();
const con = mysql_connect();

router.get("/", async (req: Request, res: Response<Ticket[]>) => {
const [tickets] = await con.query<RowDataPacket[]>("SELECT * FROM ticket")
res.status(200).json(tickets.map(ticket => {
return {
ticket_id: ticket.ticket_id,
user_id: ticket.user_id,
horse: ticket.hourse,
type: ticket.type,
option: ticket.option,
optNum: ticket.optNum,
bet: ticket.bet,
race: ticket.race
}
}))
})
const [tickets] = await con.query<RowDataPacket[]>("SELECT * FROM ticket");
res.status(200).json(
tickets.map((ticket) => {
return {
ticket_id: ticket.ticket_id,
user_id: ticket.user_id,
horse: ticket.hourse,
type: ticket.type,
option: ticket.option,
optNum: ticket.optNum,
bet: ticket.bet,
race: ticket.race,
};
})
);
});

router.get("/get/:ticket_id", async (req: Request, res: Response<Ticket>) => {
const [[ticket]] = await con.query<RowDataPacket[]>("SELECT * FROM ticket WHERE ticket_id = ?", [req.params.ticket_id])
const [[ticket]] = await con.query<RowDataPacket[]>(
"SELECT * FROM ticket WHERE ticket_id = ?",
[req.params.ticket_id]
);
res.status(200).json({
ticket_id: ticket.ticket_id,
user_id: ticket.user_id,
Expand All @@ -32,14 +39,42 @@ router.get("/get/:ticket_id", async (req: Request, res: Response<Ticket>) => {
option: ticket.option,
optNum: ticket.optNum,
bet: ticket.bet,
race: ticket.race
})
})
race: ticket.race,
});
});

router.post("/add", async (req: Request<Ticket>, res: Response<Ticket>) => {
const body = req.body
const [rows] = await con.query<ResultSetHeader>("INSERT INTO ticket (user_id, horse, type, option, optNum, bet, race) VALUES (?, JSON_ARRAY(?), ?, ?, ?, ?, ?)", [body.id, body.horse, body.type, body.option, body.optNum, body.bet, body.race])
const [[ticket]] = await con.query<RowDataPacket[]>("SELECT * FROM ticket WHERE ticket_id = ?", [rows.insertId])
const idToken = await loginAndGetToken()
if (!idToken) throw new Error('Cannot Login');
const body = req.body;
const [rows] = await con.query<ResultSetHeader>(
"INSERT INTO ticket (user_id, horse, type, option, optNum, bet, race) VALUES (?, JSON_ARRAY(?), ?, ?, ?, ?, ?)",
[
body.id,
body.horse,
body.type,
body.option,
body.optNum,
body.bet,
body.race,
]
);
const [[ticket]] = await con.query<RowDataPacket[]>(
"SELECT * FROM ticket WHERE ticket_id = ?",
[rows.insertId]
);
//Transaction作成 user_id={ticket.user_id} dealer_id="1c34" hide_detail="none" detail={ticket.type} amount={ticket.bet}
await axios.post(`${process.env.ENDPOINT}/transactions`, {
headers: {Authorization: `Bearer ${idToken}`},
body: {
user_id: ticket.user,
dealer_id: process.env.DEALERID,
amount: ticket.bet,
type: "bet",
detail: ticket.type.toString(),
hide_detail: ""
}
})
res.status(200).json({
ticket_id: ticket.ticket_id,
user_id: ticket.user_id,
Expand All @@ -48,8 +83,8 @@ router.post("/add", async (req: Request<Ticket>, res: Response<Ticket>) => {
option: ticket.option,
optNum: ticket.optNum,
bet: ticket.bet,
race: ticket.race
})
})
race: ticket.race,
});
});

export default router
export default router;
9 changes: 9 additions & 0 deletions api/types/Kra.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
export interface RacingType {
id: number;
size: number;
odds_1: number[];
odds_2: number[];
odds_3: number[];
two: number[];
place: number[];
}
9 changes: 9 additions & 0 deletions api/utils/constant.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import fs from "fs";
import { RacingType } from "../types/Kra";
import { RacingData } from "../kra/KRAClient";

export const Races = (
JSON.parse(fs.readFileSync("odds.json", "utf-8")) as RacingType[]
).map(
(h) => new RacingData(h.size, h.odds_1, h.odds_2, h.odds_3, h.two, h.place)
);
22 changes: 22 additions & 0 deletions api/utils/loginAndgetToken.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { initializeApp } from "firebase/app"
import { getAuth, signInWithEmailAndPassword } from "firebase/auth"

const firebaseConfig = {
apiKey: process.env.NEXT_PUBLIC_APIKEY,
authDomain: process.env.AUTHDOMAIN,
projectId: process.env.PROJECTID,
storageBucket: process.env.STORAGEBUCKET,
messagingSenderId: process.env.MESSAGINGSENDERID,
appId: process.env.APPID
}

const app = initializeApp(firebaseConfig)

const auth = getAuth(app)

const loginAndGetToken = async () => {
const usercred = await signInWithEmailAndPassword(auth, process.env.EMAIL!, process.env.PASSWORD!)
return await auth.currentUser?.getIdToken()
}

export default loginAndGetToken
12 changes: 7 additions & 5 deletions api/utils/mysqlConnect.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { createPool } from "mysql2/promise"
import { createPool } from "mysql2/promise";

const mysql_connect = () => {
if (!process.env.DATABASE_URL) throw Error("DATABASE_URL is not defined")
return createPool(process.env.DATABASE_URL)
}
if (!process.env.DATABASE_URL) throw Error("DATABASE_URL is not defined");
return createPool(process.env.DATABASE_URL);
};

export default mysql_connect
export const token =
"eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MGFkMTE4YTk0MGFkYzlmMmY1Mzc2YjM1MjkyZmVkZThjMmQwZWUiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vbW9uZXktbWFuYWdlci0yZTE1MiIsImF1ZCI6Im1vbmV5LW1hbmFnZXItMmUxNTIiLCJhdXRoX3RpbWUiOjE2OTQzNTEwMDksInVzZXJfaWQiOiJUTlFRcnljTUlkY1VRR1hlQXNma1EzVGh1TnMyIiwic3ViIjoiVE5RUXJ5Y01JZGNVUUdYZUFzZmtRM1RodU5zMiIsImlhdCI6MTY5NDM1MTAwOSwiZXhwIjoxNjk0MzU0NjA5LCJlbWFpbCI6IjIwMjEwMTczQHRhay5lZC5qcCIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiZmlyZWJhc2UiOnsiaWRlbnRpdGllcyI6eyJlbWFpbCI6WyIyMDIxMDE3M0B0YWsuZWQuanAiXX0sInNpZ25faW5fcHJvdmlkZXIiOiJwYXNzd29yZCJ9fQ.gRmjP6tAPYXB3cII8_h602BeTCyl3T-bXUG0lYH5Hi8MZXixPMtpbqw0WadYo_lULJSnE9fCBsUSDN4C2jCOUsqGktKnb22-hsb4E-RUYhcYEttLdxGxV75P2x0oCcgxX8owkU-rewdT-6km_tLlvcX0ci2ujVI2YZa7wbgZHRBZwHfISoNlVwro5NNXZCq4sD75jJkpQq30HHjQimEtF5grkacKjdBV96_StCWF8HieXSCeYPLxvLhO22F8iVkTClSVjwN8I-3x7v3248B9ncF1ta82bRfTkVbnBxe9Is9RV6G32eQ6e4VoLou2Fn8PUv8IbDAyc_EzFD6Cy7WEOQ";
export default mysql_connect;
Loading

0 comments on commit 89ce4dd

Please sign in to comment.