1
0
mirror of https://github.com/uetchy/namae.git synced 2025-03-18 04:50:32 +09:00
namae/api/services/nta/[query].ts

99 lines
2.7 KiB
TypeScript
Raw Normal View History

2020-06-19 16:15:53 +09:00
import {send, sendError, fetch} from '../../../util/http';
import {NowRequest, NowResponse} from '@vercel/node';
2019-09-01 00:00:24 +09:00
2019-09-17 14:30:26 +09:00
const APPLICATION_ID = process.env.NTA_APPLICATION_ID;
2019-09-01 00:00:24 +09:00
export default async function handler(
2020-06-19 16:15:53 +09:00
req: NowRequest,
2019-09-17 14:30:26 +09:00
res: NowResponse,
2019-12-24 01:57:07 +09:00
): Promise<void> {
2019-09-17 14:30:26 +09:00
const {query} = req.query;
2019-09-01 00:00:24 +09:00
2020-06-19 16:15:53 +09:00
if (!query || typeof query !== 'string') {
2019-12-10 18:33:39 +09:00
return sendError(res, new Error('No query given'));
2019-09-01 00:00:24 +09:00
}
const encodedQuery = encodeURIComponent(
query.replace(/[A-Za-z0-9]/g, (str) =>
2019-09-17 14:30:26 +09:00
String.fromCharCode(str.charCodeAt(0) + 0xfee0),
),
);
2019-09-01 00:00:24 +09:00
try {
const response = await fetch(
`https://api.houjin-bangou.nta.go.jp/4/name?id=${APPLICATION_ID}&name=${encodedQuery}&mode=1&target=1&type=02`,
2019-09-17 14:30:26 +09:00
'GET',
);
const body: string[] = (await response.text()).split('\n').slice(0, -1);
2019-12-24 01:57:07 +09:00
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
2019-09-17 14:30:26 +09:00
const header = body.shift()!.split(',');
2019-09-01 00:00:24 +09:00
const result = body.map((csv) => {
const entry = csv.split(',').map((item) =>
item
.replace(/(^"|"$)/g, '')
.replace(/[A-Za-z0-9]/g, (str) =>
2019-09-17 14:30:26 +09:00
String.fromCharCode(str.charCodeAt(0) - 0xfee0),
2019-09-01 00:00:24 +09:00
)
2019-12-24 01:57:07 +09:00
// eslint-disable-next-line no-irregular-whitespace
2019-09-17 14:30:26 +09:00
.replace(/ /g, ' '),
);
2019-09-01 00:00:24 +09:00
return {
index: entry[0],
orgID: entry[1],
name: entry[6],
englishName: entry[24],
phoneticName: entry[28],
type: entry[8],
created: entry[22],
lastUpdate: entry[4],
lastModified: entry[5],
imageID: entry[7],
location: {
pref: entry[9],
city: entry[10],
address: entry[11],
imageID: entry[12],
prefCode: entry[13],
cityCode: entry[14],
postalCode: entry[15],
englishPref: entry[25],
englishAddress: entry[26],
},
foreignLocation: {
address: entry[16],
imageID: entry[17],
englishForeignLocation: entry[27],
},
historyCount: entry[23],
closedAt: entry[18],
closedReason: entry[19],
successorOrgID: entry[20],
memo: entry[21],
excluded: entry[29],
processSection: entry[2],
modifiedSection: entry[3],
2019-09-17 14:30:26 +09:00
};
});
2019-09-01 00:00:24 +09:00
send(res, {
meta: {
lastUpdate: header[0],
count: parseInt(header[1]),
cursor: parseInt(header[2]),
pages: parseInt(header[3]),
},
result:
2019-09-01 01:31:16 +09:00
result
.map((entry) => ({
name: entry.name,
phoneticName: entry.phoneticName,
englishName: entry.englishName,
}))
.slice(10) || [],
2019-09-17 14:30:26 +09:00
});
2019-09-01 00:00:24 +09:00
} catch (err) {
2019-09-17 14:30:26 +09:00
sendError(res, err);
2019-09-01 00:00:24 +09:00
}
}