feat: Add CI/CD pipeline and code quality improvements

- Add GitHub Actions workflow for automated CI/CD
- Configure Node.js 18.x and 20.x matrix testing
- Add TypeScript type checking step
- Add ESLint code quality checks with enhanced rules
- Add Prettier formatting verification
- Add production build validation
- Upload build artifacts for deployment
- Set up automated testing on push/PR
- Replace console.log with environment-aware logger
- Add pre-commit hooks for code quality
- Exclude archive folder from linting

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
hansoo
2025-07-12 15:27:54 +09:00
parent 6a208d6b06
commit 9851627ff1
411 changed files with 14458 additions and 8680 deletions

View File

@@ -1,53 +1,58 @@
import { supabase } from '@/archive/lib/supabase';
import { showAuthToast } from '@/utils/auth';
import { supabase } from "@/archive/lib/supabase";
import { authLogger } from "@/utils/logger";
import { showAuthToast } from "@/utils/auth";
/**
* 로그인 기능 - Supabase Cloud 환경에 최적화
*/
export const signInWithDirectApi = async (email: string, password: string) => {
console.log('Supabase Cloud 로그인 시도');
authLogger.info("Supabase Cloud 로그인 시도");
try {
// Supabase Cloud를 통한 로그인 요청
const { data, error } = await supabase.auth.signInWithPassword({
email,
password
password,
});
// 오류 응답 처리
if (error) {
console.error('로그인 오류:', error);
authLogger.error("로그인 오류:", error);
// 오류 메시지 포맷팅
let errorMessage = error.message;
if (error.message.includes('Invalid login credentials')) {
errorMessage = '이메일 또는 비밀번호가 올바르지 않습니다.';
} else if (error.message.includes('Email not confirmed')) {
errorMessage = '이메일 인증이 완료되지 않았습니다. 이메일을 확인해주세요.';
if (error.message.includes("Invalid login credentials")) {
errorMessage = "이메일 또는 비밀번호가 올바르지 않습니다.";
} else if (error.message.includes("Email not confirmed")) {
errorMessage =
"이메일 인증이 완료되지 않았습니다. 이메일을 확인해주세요.";
}
showAuthToast('로그인 실패', errorMessage, 'destructive');
showAuthToast("로그인 실패", errorMessage, "destructive");
return { error: { message: errorMessage }, user: null };
}
// 로그인 성공 처리
if (data && data.user) {
console.log('로그인 성공:', data.user);
showAuthToast('로그인 성공', '환영합니다!');
authLogger.info("로그인 성공:", data.user);
showAuthToast("로그인 성공", "환영합니다!");
return { error: null, user: data.user };
} else {
// 사용자 정보가 없는 경우 (드문 경우)
console.warn('로그인 성공했지만 사용자 정보가 없습니다');
showAuthToast('로그인 부분 성공', '로그인은 성공했지만 사용자 정보를 가져오지 못했습니다.', 'default');
return { error: { message: '사용자 정보 조회 실패' }, user: null };
authLogger.warn("로그인 성공했지만 사용자 정보가 없습니다");
showAuthToast(
"로그인 부분 성공",
"로그인은 성공했지만 사용자 정보를 가져오지 못했습니다.",
"default"
);
return { error: { message: "사용자 정보 조회 실패" }, user: null };
}
} catch (error: any) {
console.error('로그인 요청 중 예외:', error);
const errorMessage = error.message || '로그인 중 오류가 발생했습니다.';
showAuthToast('로그인 요청 실패', errorMessage, 'destructive');
authLogger.error("로그인 요청 중 예외:", error);
const errorMessage = error.message || "로그인 중 오류가 발생했습니다.";
showAuthToast("로그인 요청 실패", errorMessage, "destructive");
return { error: { message: errorMessage }, user: null };
}
};