module API
  class Forks < Grape::API
    resource :forks do
      # Create a fork
      #
      # Parameters:
      #   project_id (required) - The ID of a project
      #   project_token (requires) - Project token
      #   private_token(required) - User private token
      #   data (required) - GitLab project data (name_with_namespace, web_url, default_branch, ssh_url_to_repo)
      #
      #
      # Example Request:
      #   POST /forks
      post do
        required_attributes! [:project_id, :data, :project_token, :private_token]
        project = Project.find_by!(gitlab_id: params[:project_id])
        authenticate_project_token!(project)

        user_session = UserSession.new
        user = user_session.authenticate(private_token: params[:private_token])

        fork = CreateProjectService.new.execute(
          user,
          params[:data],
          RoutesHelper.project_url(":project_id"),
          project
        )

        if fork
          present fork, with: Entities::Project
        else
          not_found!
        end
      end
    end
  end
end
