feat(life): add community feed for user posts

Add life_posts schema and CRUD API endpoints
Implement LifeView with inline composer and feed display
This commit is contained in:
2026-05-01 21:03:09 +08:00
parent 49aae3bd7c
commit cd1891cc82
11 changed files with 680 additions and 2 deletions

View File

@@ -10,6 +10,7 @@ import {
createHabitat,
createItem,
createLanguage,
createLifePost,
createPokemon,
createRecipe,
deleteConfig,
@@ -17,6 +18,7 @@ import {
deleteHabitat,
deleteItem,
deleteLanguage,
deleteLifePost,
deletePokemon,
deleteRecipe,
getHabitat,
@@ -30,6 +32,7 @@ import {
listHabitats,
listItems,
listLanguages,
listLifePosts,
listPokemon,
listRecipes,
reorderConfig,
@@ -44,6 +47,7 @@ import {
updateHabitat,
updateItem,
updateLanguage,
updateLifePost,
updatePokemon,
updateRecipe
} from './queries.ts';
@@ -171,6 +175,33 @@ app.get('/api/options', async (request) => getOptions(requestLocale(request)));
app.get('/api/daily-checklist', async (request) => listDailyChecklistItems(requestLocale(request)));
app.get('/api/life-posts', async () => listLifePosts());
app.post('/api/life-posts', async (request, reply) => {
const user = await requireVerifiedUser(request, reply);
return user ? reply.code(201).send(await createLifePost(request.body as Record<string, unknown>, user.id)) : undefined;
});
app.put('/api/life-posts/:id', async (request, reply) => {
const user = await requireVerifiedUser(request, reply);
if (!user) {
return;
}
const { id } = request.params as { id: string };
const post = await updateLifePost(Number(id), request.body as Record<string, unknown>, user.id);
return post ? post : reply.code(404).send({ message: 'Not found' });
});
app.delete('/api/life-posts/:id', async (request, reply) => {
const user = await requireVerifiedUser(request, reply);
if (!user) {
return;
}
const { id } = request.params as { id: string };
const deleted = await deleteLifePost(Number(id), user.id);
return deleted ? reply.code(204).send() : reply.code(404).send({ message: 'Not found' });
});
app.get('/api/pokemon', async (request) =>
listPokemon(request.query as Record<string, string | string[] | undefined>, requestLocale(request))
);