162 lines
4.5 KiB
TypeScript
162 lines
4.5 KiB
TypeScript
import { Hono } from "hono";
|
|
import debug from "debug";
|
|
|
|
import type { Variables, WithAuth } from "./middlewares.ts";
|
|
|
|
const log = {
|
|
api: debug("api:sys"),
|
|
};
|
|
|
|
// 创建地图数据路由
|
|
export function createMapRoutes(withAuth: WithAuth) {
|
|
const mapRoutes = new Hono<{ Variables: Variables }>();
|
|
|
|
// 获取地图标记点数据
|
|
mapRoutes.get("/markers", withAuth, async (c) => {
|
|
try {
|
|
const apiClient = c.get('apiClient');
|
|
|
|
// 从登录历史表中查询有经纬度的登录记录
|
|
const locations = await apiClient.database
|
|
.table('login_history')
|
|
.select(
|
|
'id',
|
|
'user_id',
|
|
'location_name',
|
|
'longitude',
|
|
'latitude',
|
|
'login_time',
|
|
'ip_address'
|
|
)
|
|
.whereNotNull('longitude')
|
|
.whereNotNull('latitude')
|
|
.orderBy('login_time', 'desc')
|
|
.limit(100); // 限制返回最近100条记录
|
|
|
|
// 获取相关用户信息
|
|
const userIds = [...new Set(locations.map(loc => loc.user_id))];
|
|
const users = await apiClient.database
|
|
.table('users')
|
|
.select('id', 'username', 'nickname')
|
|
.whereIn('id', userIds);
|
|
|
|
// 构建用户信息映射
|
|
const userMap = new Map(users.map(user => [user.id, user]));
|
|
|
|
// 转换为地图标记点数据格式
|
|
const markers = locations.map(location => ({
|
|
id: location.id,
|
|
name: location.location_name || '未知地点',
|
|
longitude: location.longitude,
|
|
latitude: location.latitude,
|
|
loginTime: location.login_time,
|
|
ipAddress: location.ip_address,
|
|
user: userMap.get(location.user_id)
|
|
}));
|
|
|
|
return c.json({
|
|
message: "获取登录位置数据成功",
|
|
data: markers,
|
|
});
|
|
} catch (error) {
|
|
log.api("获取登录位置数据失败:", error);
|
|
return c.json({ error: "获取登录位置数据失败" }, 500);
|
|
}
|
|
});
|
|
|
|
// 获取登录位置详情数据
|
|
mapRoutes.get("/location/:id", withAuth, async (c) => {
|
|
try {
|
|
const id = Number(c.req.param("id"));
|
|
|
|
if (!id || isNaN(id)) {
|
|
return c.json({ error: "无效的登录记录ID" }, 400);
|
|
}
|
|
|
|
const apiClient = c.get('apiClient');
|
|
|
|
// 查询登录记录详情
|
|
const location = await apiClient.database
|
|
.table('login_history')
|
|
.where('id', id)
|
|
.first();
|
|
|
|
if (!location) {
|
|
return c.json({ error: "登录记录不存在" }, 404);
|
|
}
|
|
|
|
// 获取用户信息
|
|
const [user] = await apiClient.database
|
|
.table('users')
|
|
.select('id', 'username', 'nickname')
|
|
.where('id', location.user_id);
|
|
|
|
return c.json({
|
|
message: "获取登录位置详情成功",
|
|
data: {
|
|
...location,
|
|
user
|
|
},
|
|
});
|
|
} catch (error) {
|
|
log.api("获取登录位置详情失败:", error);
|
|
return c.json({ error: "获取登录位置详情失败" }, 500);
|
|
}
|
|
});
|
|
|
|
// 更新登录位置信息
|
|
mapRoutes.put("/location/:id", withAuth, async (c) => {
|
|
try {
|
|
const id = Number(c.req.param("id"));
|
|
|
|
if (!id || isNaN(id)) {
|
|
return c.json({ error: "无效的登录记录ID" }, 400);
|
|
}
|
|
|
|
const apiClient = c.get('apiClient');
|
|
const data = await c.req.json();
|
|
|
|
// 验证经纬度
|
|
if (!data.longitude || !data.latitude) {
|
|
return c.json({ error: "经度和纬度不能为空" }, 400);
|
|
}
|
|
|
|
// 检查登录记录是否存在
|
|
const location = await apiClient.database
|
|
.table('login_history')
|
|
.where('id', id)
|
|
.first();
|
|
|
|
if (!location) {
|
|
return c.json({ error: "登录记录不存在" }, 404);
|
|
}
|
|
|
|
// 更新位置信息
|
|
await apiClient.database
|
|
.table('login_history')
|
|
.where('id', id)
|
|
.update({
|
|
longitude: data.longitude,
|
|
latitude: data.latitude,
|
|
location_name: data.location_name
|
|
});
|
|
|
|
// 获取更新后的登录记录
|
|
const updatedLocation = await apiClient.database
|
|
.table('login_history')
|
|
.where('id', id)
|
|
.first();
|
|
|
|
return c.json({
|
|
message: "登录位置信息更新成功",
|
|
data: updatedLocation,
|
|
});
|
|
} catch (error) {
|
|
log.api("更新登录位置信息失败:", error);
|
|
return c.json({ error: "更新登录位置信息失败" }, 500);
|
|
}
|
|
});
|
|
|
|
return mapRoutes;
|
|
}
|