Skip to content
Merged
40 changes: 28 additions & 12 deletions backend/apps/mentorship/api/internal/mutations/program.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
import strawberry
from django.contrib.auth import get_user_model
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied, ValidationError
from django.db import transaction
from django.db import IntegrityError, transaction
from graphql import GraphQLError

from apps.github.models import User as GithubUser
from apps.mentorship.api.internal.nodes.enum import ProgramStatusEnum
Expand Down Expand Up @@ -49,6 +50,15 @@ def resolve_admins_from_logins(logins: list[str]) -> set:
return admins


def _handle_program_save_integrity_error(exc: IntegrityError) -> None:
"""Translate program save IntegrityError to GraphQLError for known constraints."""
msg = "A program with this name already exists."
raise GraphQLError(
msg,
extensions={"code": "VALIDATION_ERROR", "field": "name"},
Comment thread
mrkeshav-05 marked this conversation as resolved.
Outdated
) from exc
Comment thread
mrkeshav-05 marked this conversation as resolved.


@strawberry.type
class ProgramMutation:
"""GraphQL mutations related to program."""
Expand All @@ -69,16 +79,19 @@ def create_program(self, info: strawberry.Info, input_data: CreateProgramInput)
)
raise ValidationError(msg)

program = Program.objects.create(
name=input_data.name,
description=input_data.description,
mentees_limit=input_data.mentees_limit,
started_at=input_data.started_at,
ended_at=input_data.ended_at,
domains=input_data.domains,
tags=input_data.tags,
status=ProgramStatusEnum.DRAFT.value,
)
try:
program = Program.objects.create(
name=input_data.name,
description=input_data.description,
mentees_limit=input_data.mentees_limit,
started_at=input_data.started_at,
ended_at=input_data.ended_at,
domains=input_data.domains,
tags=input_data.tags,
status=ProgramStatusEnum.DRAFT.value,
)
except IntegrityError as e:
_handle_program_save_integrity_error(e)

admin, _ = Admin.objects.get_or_create(github_user=user.github_user)
if not admin.nest_user:
Expand Down Expand Up @@ -145,7 +158,10 @@ def update_program(self, info: strawberry.Info, input_data: UpdateProgramInput)
if input_data.status is not None:
program.status = input_data.status.value

program.save()
try:
program.save()
except IntegrityError as e:
_handle_program_save_integrity_error(e)

if input_data.admin_logins is not None:
program.admins.set(resolve_admins_from_logins(input_data.admin_logins))
Expand Down
Loading