diff --git a/apps/repositories/migrations/0002_repository_default_branch_repository_dirty_at_and_more.py b/apps/repositories/migrations/0002_repository_default_branch_repository_dirty_at_and_more.py new file mode 100644 index 0000000..8b1ada1 --- /dev/null +++ b/apps/repositories/migrations/0002_repository_default_branch_repository_dirty_at_and_more.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2.27 on 2025-12-17 11:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("repositories", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="repository", + name="default_branch", + field=models.CharField(default="main", max_length=100), + ), + migrations.AddField( + model_name="repository", + name="dirty_at", + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name="repository", + name="last_synced_hash", + field=models.CharField(blank=True, max_length=40, null=True), + ), + ] diff --git a/apps/repositories/serializers.py b/apps/repositories/serializers.py index 8934f2a..9616616 100644 --- a/apps/repositories/serializers.py +++ b/apps/repositories/serializers.py @@ -6,10 +6,28 @@ class RepositorySerializer(serializers.ModelSerializer): """ Serializer for the Repository model. Converts Repository instances to JSON, including all fields. + 역참조 관계(contributors, commits)는 제외하여 순환 참조를 방지합니다. """ class Meta: model = Repository - fields = '__all__' + fields = [ + 'id', + 'github_id', + 'name', + 'full_name', + 'description', + 'html_url', + 'stargazers_count', + 'language', + 'commit_count', + 'created_at', + 'updated_at', + 'last_synced_at', + 'owner', + 'default_branch', + 'last_synced_hash', + 'dirty_at', + ] class ContributorSerializer(serializers.ModelSerializer): """ diff --git a/apps/repositories/views.py b/apps/repositories/views.py index 34948d9..fce2f42 100644 --- a/apps/repositories/views.py +++ b/apps/repositories/views.py @@ -20,13 +20,23 @@ class RepositoryListView(APIView): responses={200: RepositorySerializer(many=True)}, ) def get(self, request): - user = request.user + try: + user = request.user - # user가 contributor 이고 commit_count > 0 인 repo만 조회 - contributed_repos = Repository.objects.filter( - contributors__user=user, - contributors__commit_count__gt=0 - ).distinct().order_by("-updated_at") + # user가 contributor 이고 commit_count > 0 인 repo만 조회 + contributed_repos = Repository.objects.filter( + contributors__user=user, + contributors__commit_count__gt=0 + ).distinct().order_by("-updated_at") - serializer = RepositorySerializer(contributed_repos, many=True) - return Response(serializer.data, status=200) + serializer = RepositorySerializer(contributed_repos, many=True) + return Response(serializer.data, status=200) + except Exception as e: + # 로깅은 Django의 기본 로깅 시스템을 사용 + import logging + logger = logging.getLogger(__name__) + logger.error(f"Error fetching repositories for user {request.user.id}: {str(e)}", exc_info=True) + return Response( + {"detail": "레포지토리 목록을 불러오는 중 오류가 발생했습니다."}, + status=500 + )