Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Develop #148

Merged
merged 39 commits into from
Feb 22, 2025
Merged
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
9175697
プロフィールにいろいろ
natanata25 Feb 21, 2025
4bc4650
Merge branch 'develop' of https://github.com/kc3hack/2025_10 into Pro…
natanata25 Feb 21, 2025
084654a
Lottie動かない問題
RAIT-09 Feb 21, 2025
6903520
サイドメニューから設定削除
RAIT-09 Feb 21, 2025
a1b1c89
システムプロンプト修正 拗音(ゃゅょ)は1音として扱わない
yone-al Feb 21, 2025
5943272
ニュースを取得する関数
yone-al Feb 22, 2025
49fd775
Tankalizerロゴクリックでタイムライン遷移
RAIT-09 Feb 22, 2025
74e9a6f
詠ボタンをタイムライン以外にも表示
RAIT-09 Feb 22, 2025
67e2b51
getOnePost APIの追加
TARO-gh Feb 22, 2025
a24e975
Merge remote-tracking branch 'origin/taro/develop' into RAIT-09/featu…
RAIT-09 Feb 22, 2025
4777fb9
Merge remote-tracking branch 'origin/taro/develop' into RAIT-09/featu…
RAIT-09 Feb 22, 2025
be920fd
getOnePost APIの修正
TARO-gh Feb 22, 2025
9ea90e1
Merge remote-tracking branch 'origin/taro/develop' into RAIT-09/featu…
RAIT-09 Feb 22, 2025
9313232
NewsのAPI(仮)をdocsに追加
yone-al Feb 22, 2025
0cbc101
共有機能フロント
RAIT-09 Feb 22, 2025
a5bf07a
env example追加
ABfry Feb 22, 2025
c9e53f8
大きさ変更に対応
natanata25 Feb 22, 2025
97d3289
投稿取得中表示とハンバーガー戻し
RAIT-09 Feb 22, 2025
b46bbc2
Merge pull request #141 from kc3hack/RAIT-09/feature/postpage
RAIT-09 Feb 22, 2025
2b55c49
Merge branch 'develop' of https://github.com/kc3hack/2025_10 into Pro…
natanata25 Feb 22, 2025
a63ee3d
news投稿
ABfry Feb 22, 2025
957320a
Merge pull request #142 from kc3hack/Profilr_UI
natanata25 Feb 22, 2025
b5b862f
私たちのアカウントか判定
TARO-gh Feb 22, 2025
c84dec2
Merge pull request #143 from kc3hack/taro/develop
TARO-gh Feb 22, 2025
773ee73
動的ルーティングNotFound一旦対応
RAIT-09 Feb 22, 2025
4ca2589
投稿単独ページで投稿を削除した場合にタイムラインに遷移
RAIT-09 Feb 22, 2025
707a9cd
Merge branch 'develop' into RAIT-09/develop
RAIT-09 Feb 22, 2025
51f21b5
スキーマ例修正
yone-al Feb 22, 2025
17a8c36
Revert "スキーマ例修正"
yone-al Feb 22, 2025
276ab71
スキーマ例修正
yone-al Feb 22, 2025
b9afe3b
NEWS_USER_ICON環境変数
yone-al Feb 22, 2025
fd9a508
NEWS_USER_ICONー>NEWS_USER_ID
yone-al Feb 22, 2025
5fb7e7e
動的ルーティングページのNotFound改善
RAIT-09 Feb 22, 2025
8480708
Merge branch 'develop' into yone/develop
yone-al Feb 22, 2025
3b2af87
動的ルーティングページのNotFound改善
RAIT-09 Feb 22, 2025
a254154
帽子追加
natanata25 Feb 22, 2025
fe69cb0
Merge pull request #147 from kc3hack/Profilr_UI
ABfry Feb 22, 2025
4c94349
Merge pull request #146 from kc3hack/RAIT-09/develop
ABfry Feb 22, 2025
cfe3f21
Merge pull request #140 from kc3hack/yone/develop
ABfry Feb 22, 2025
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
4 changes: 4 additions & 0 deletions backend/.env.example
Original file line number Diff line number Diff line change
@@ -13,3 +13,7 @@ GEMINI_API_KEY=
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
S3_BUCKET_NAME=

CURRENTS_API_KEY=
NEWS_POST_API_KEY=
OUR_ID=
4 changes: 4 additions & 0 deletions backend/src/config/env.ts
Original file line number Diff line number Diff line change
@@ -8,6 +8,9 @@ const envSchema = z.object({
FRONTEND_URL: z.string().url(),
PORT: z.coerce.number().optional(),
GEMINI_API_KEY: z.string(),
CURRENTS_API_KEY: z.string(),
NEWS_POST_API_KEY: z.string(),
NEWS_USER_ID: z.string(),
RDB_HOST: z.string(),
RDB_USER: z.string(),
RDB_PASSWORD: z.string(),
@@ -18,6 +21,7 @@ const envSchema = z.object({
S3_ACCESS_KEY_ID: z.string(),
S3_SECRET_ACCESS_KEY: z.string(),
S3_BUCKET_NAME: z.string(),
OUR_ID: z.string(),
});

export const env = envSchema.parse(process.env);
2 changes: 1 addition & 1 deletion backend/src/controllers/Miyabi/createMiyabiHandler.ts
Original file line number Diff line number Diff line change
@@ -40,7 +40,7 @@ const createMiyabiHandler: RouteHandler<typeof createMiyabiRoute, {}> = async (c
200
);
} catch (err) {
console.log('雅に失敗しました.');
console.log('雅に失敗しました.' + err);
return c.json(
{
message: '雅に失敗しました.',
2 changes: 1 addition & 1 deletion backend/src/controllers/Miyabi/deleteMiyabiHandler.ts
Original file line number Diff line number Diff line change
@@ -40,7 +40,7 @@ const deleteMiyabiHandler: RouteHandler<typeof deleteMiyabiRoute, {}> = async (c
200
);
} catch (err) {
console.log('雅の削除に失敗しました.');
console.log('雅の削除に失敗しました.' + err);
return c.json(
{
message: '雅の削除に失敗しました.',
2 changes: 1 addition & 1 deletion backend/src/controllers/Miyabi/getMiyabiRankingHandler.ts
Original file line number Diff line number Diff line change
@@ -61,7 +61,7 @@ const getMiyabiRankingHandler: RouteHandler<typeof getMiyabiRankingRoute, {}> =
200
);
} catch (err) {
console.log('雅ランキングの取得に失敗しました.');
console.log('雅ランキングの取得に失敗しました.' + err);
return c.json(
{
message: '雅ランキングの取得に失敗しました.',
2 changes: 1 addition & 1 deletion backend/src/controllers/Post/deletePostHandler.ts
Original file line number Diff line number Diff line change
@@ -56,7 +56,7 @@ const deletePostHandler: RouteHandler<typeof deletePostRoute, {}> = async (c: Co
200
);
} catch (err) {
console.log('投稿の削除に失敗しました.');
console.log('投稿の削除に失敗しました.' + err);
return c.json(
{
message: '投稿の削除に失敗しました.',
94 changes: 94 additions & 0 deletions backend/src/controllers/Post/getOnePostHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import { z, type RouteHandler } from '@hono/zod-openapi';
import type { Context } from 'hono';
import db from '../db.js';
import { getOnePostSchema } from '../../schema/Post/getOnePostSchema.js';
import type { getOnePostRoute } from '../../routes/Post/getOnePostRoute.js';
import { env } from '../../config/env.js';

type getOnePostSchema = z.infer<typeof getOnePostSchema>;

const getOnePostHandler: RouteHandler<typeof getOnePostRoute, {}> = async (c: Context) => {
try {
// 受け取ったjsonを各変数に格納 (post_idが指定なしなら,最新の投稿idになる)
let { my_icon = null, post_id } = await c.req.json<getOnePostSchema>();

// 入力のpost_idがnullなら最新の投稿から取得,そうでなければその投稿よりも古いものを取得
// sql文中の比較条件切り替え

// 投稿が存在するかチェック
const checkSql = `SELECT * FROM ${env.POSTS_TABLE_NAME} WHERE id = :post_id;`;
const existingPosts = await db.query(checkSql, { post_id });
if (existingPosts.length == 0) {
console.log('投稿が見つかりません.');
return c.json(
{
message: '投稿が見つかりません.',
statusCode: 404,
error: 'Not Found',
},
404
);
}

let results;
// ここからDBのpostテーブルから情報取得
const sql = `
SELECT
post.id,
post.original,
post.tanka,
post.image_path,
post.created_at,
post.user_name,
post.user_icon,
(SELECT COUNT(*) FROM ${env.MIYABI_TABLE_NAME} WHERE post_id = post.id) as miyabi_count,
CASE WHEN miyabi.id IS NULL THEN false ELSE true END as is_miyabi
FROM ${env.POSTS_TABLE_NAME} post
LEFT JOIN ${env.MIYABI_TABLE_NAME} miyabi
ON post.id = miyabi.post_id AND miyabi.user_icon = :my_icon
WHERE post.id = :post_id;
`;

results = await db.query(sql, { my_icon, post_id });

// is_miyabiをtrue or falseで返すための処理
results = results.map((row: any) => ({
...row,
user_id: row.user_icon.match(/\/u\/(\d+)/)[1],
is_miyabi: row.is_miyabi ? true : false,
}));

//console.log(results);

// レスポンス
console.log('投稿を取得しました.');
return c.json(
{
message: '投稿を取得しました.',
id: results[0].id,
original: results[0].original,
tanka: results[0].tanka,
image_path: results[0].image_path,
created_at: results[0].created_at,
user_id: results[0].user_id,
user_name: results[0].user_name,
user_icon: results[0].user_icon,
miyabi_count: results[0].miyabi_count,
is_miyabi: results[0].is_miyabi,
},
200
);
} catch (err) {
console.log('投稿の取得に失敗しました.' + err);
return c.json(
{
message: '投稿の取得に失敗しました.',
statusCode: 500,
error: 'Internal Server Error',
},
500
);
}
};

export default getOnePostHandler;
2 changes: 1 addition & 1 deletion backend/src/controllers/Post/getPostHandler.ts
Original file line number Diff line number Diff line change
@@ -103,7 +103,7 @@ const getPostHandler: RouteHandler<typeof getPostRoute, {}> = async (c: Context)
200
);
} catch (err) {
console.log('投稿の取得に失敗しました.');
console.log('投稿の取得に失敗しました.' + err);
return c.json(
{
message: '投稿の取得に失敗しました.',
2 changes: 1 addition & 1 deletion backend/src/controllers/Profile/getProfileHandler.ts
Original file line number Diff line number Diff line change
@@ -54,7 +54,7 @@ const getProfileHandler: RouteHandler<typeof getProfileRoute, {}> = async (c: Co
200
);
} catch (err) {
console.log('プロフィールの取得に失敗しました.');
console.log('プロフィールの取得に失敗しました.' + err);
return c.json(
{
message: 'プロフィールの取得に失敗しました.',
23 changes: 23 additions & 0 deletions backend/src/controllers/Sample/sampleNewsTankaHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { z, type RouteHandler } from '@hono/zod-openapi';
import type { Context } from 'hono';
import { sampleNewsTankaSchema } from '../../schema/Sample/sampleNewsTankaSchema.js';
import type { sampleNewsTankaRoute } from '../../routes/Sample/sampleNewsTankaRoute.js';
import postNews from '../../lib/postNews.js';

type sampleNewsTankaSchema = z.infer<typeof sampleNewsTankaSchema>;

const sampleNewsTankaHandler: RouteHandler<typeof sampleNewsTankaRoute, {}> = async (
c: Context
) => {
const { apiKey } = await c.req.json<sampleNewsTankaSchema>();

/* --- 色々処理 --- */

const response = await postNews(apiKey);
console.log(response);

// レスポンス
return c.json(response, 200);
};

export default sampleNewsTankaHandler;
2 changes: 1 addition & 1 deletion backend/src/controllers/User/createUserHandler.ts
Original file line number Diff line number Diff line change
@@ -54,7 +54,7 @@ const createUserHandler: RouteHandler<typeof createUserRoute, {}> = async (c: Co
200
);
} catch (err) {
console.log('ユーザの追加に失敗しました.');
console.log('ユーザの追加に失敗しました.' + err);
return c.json(
{
message: 'ユーザの追加に失敗しました.',
69 changes: 69 additions & 0 deletions backend/src/controllers/isOurAccountHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { z, type RouteHandler } from '@hono/zod-openapi';
import type { Context } from 'hono';
import { isOurAccountSchema } from '../schema/isOurAccountSchema.js';
import type { isOurAccountRoute } from '../routes/isOurAccountRoute.js';
import { env } from '../config/env.js';

type isOurAccountSchema = z.infer<typeof isOurAccountSchema>;

const isOurAccountHandler: RouteHandler<typeof isOurAccountRoute, {}> = async (c: Context) => {
try {
// 受け取ったjsonを変数に格納
const { icon_url } = await c.req.json<isOurAccountSchema>();

// 数字列の抽出
const match = icon_url.match(/\/u\/(\d+)/);

// githubのicon_urlか判定
if (!match) {
console.log('エラー: GitHubのicon_urlを入力してください.');
return c.json(
{
message: 'エラー: GitHubのicon_urlを入力してください.',
statusCode: 500,
error: 'エラー: GitHubのicon_urlを入力してください.',
},
500
);
}

const id = match[1];
const our_id_str = env.OUR_ID;
const our_idArray = our_id_str.split(',').map((item) => String(item.trim()));

// envファイルのour_idに含まれる数字列かどうか判定
if (!our_idArray.includes(id)) {
// レスポンス
console.log('私たちのアカウントではありません.');
return c.json(
{
message: '私たちのアカウントではありません.',
isOurAccount: false,
},
200
);
}

// レスポンス
console.log('私たちのアカウントです.');
return c.json(
{
message: '私たちのアカウントです.',
isOurAccount: true,
},
200
);
} catch (err) {
console.log('アカウントの判定に失敗しました.' + err);
return c.json(
{
message: 'アカウントの判定に失敗しました.',
statusCode: 500,
error: 'アカウントの判定に失敗しました.',
},
500
);
}
};

export default isOurAccountHandler;
2 changes: 1 addition & 1 deletion backend/src/lib/gemini.ts
Original file line number Diff line number Diff line change
@@ -106,7 +106,7 @@ const generateTanka = async (originalText: string): Promise<any> => {
1. **五七五七七の形式厳守:** **読み(yomi0~yomi4)をカタカナに変換した上で**、五七五七七の音数になるように調整してください。字余りや字足らずは許されません。
* **特にアルファベットや記号は、カタカナ読みに変換した上で音数を数えてください。** 例:「AI」→「エーアイ」(4音)
* どうしても正確な音数に変換できない場合は、近い音に置き換える、または、前後の句で調整するなど、**短歌全体として五七五七七になるように工夫してください。**
* 長音(ー)、促音(っ)、拗音(ゃゅょ)は1音として扱う
* 長音(ー)、促音(っ)は1音として扱いますが、拗音(ゃゅょ)は1音として扱いません
2. **面白さとユニークさの追求:**
* **原投稿の要素を活かす:** 投稿内容のキーワード、感情、状況などを取り入れつつ、予想外の展開や表現につなげてください。
* **言葉遊び:** 同音異義語、掛詞、比喩などを積極的に活用し、言葉の面白さを引き出してください。
59 changes: 59 additions & 0 deletions backend/src/lib/getNews.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import type { Context } from 'hono';
import { env } from '../config/env.js';

const printLine = (): void => {
console.log('--------------------------------');
};

const getNews = async () => {
try {
const response = await fetch(
`https://api.currentsapi.services/v1/latest-news?language=ja&apiKey=${env.CURRENTS_API_KEY}`
);

// HTTPエラーが発生した場合
if (!response.ok) {
throw new Error(`HTTPエラー: ${response.status}`);
}

const data = await response.json();

console.log(data);

// ニュースの取得に失敗した場合
if (data.status !== 'ok') {
throw new Error('ニュースの取得に失敗しました。');
}

const newsArray = data.news;

let news;
for (let i = 0; i < newsArray.length; i++) {
const newsTemp = newsArray[i];
if (newsTemp.title !== '' && newsTemp.description !== '' && newsTemp.url !== '') {
news = newsTemp;
break;
}
}

if (!news) {
throw new Error('表示できるニュースがありません。');
}
return {
isSuccess: true,
news: {
title: news.title,
description: news.description,
url: news.url,
},
};
} catch (error: any) {
console.error(error);
return {
isSuccess: false,
message: error.message,
};
}
};

export default getNews;
Loading
Oops, something went wrong.