Files
ubicloud/routes/project.rb
Jeremy Evans 939f5d656b Use handle_validation_failure earlier in project create route
Consolidate error handling between web and api routes. This changes
the behavior to display the create project page instead of the
projects page, but I think that's acceptable. If not, it's easy
to fix by calling handle_validation_failure in both places, with
different values.
2025-08-08 01:52:14 +09:00

103 lines
2.7 KiB
Ruby

# frozen_string_literal: true
class Clover
hash_branch("project") do |r|
r.is do
r.get do
no_authorization_needed
dataset = current_account.projects_dataset.where(visible: true)
if api?
paginated_result(dataset, Serializers::Project)
else
@projects = Serializers::Project.serialize(dataset.all, {include_path: true, web: true})
view "project/index"
end
end
r.post do
no_authorization_needed
handle_validation_failure("project/create")
if current_account.projects_dataset.count >= 10
fail CloverError.new(400, "InvalidRequest", "Project limit exceeded. You can create up to 10 projects. Contact support@ubicloud.com if you need more.")
end
DB.transaction do
@project = current_account.create_project_with_default_policy(typecast_params.nonempty_str!("name"))
audit_log(@project, "create")
end
if api?
Serializers::Project.serialize(@project)
else
flash["notice"] = "Project created"
r.redirect @project.path
end
end
end
r.get(web?, "create") do
no_authorization_needed
view "project/create"
end
r.on :ubid_uuid do |project_id|
@project = Clover.authorized_project(current_account, project_id)
check_found_object(@project)
@project_data = Serializers::Project.serialize(@project, {include_path: true, web: true})
@project_permissions = all_permissions(@project.id) if web?
r.is do
r.get do
authorize("Project:view", @project.id)
if api?
Serializers::Project.serialize(@project)
else
view "project/show"
end
end
r.delete do
authorize("Project:delete", @project.id)
if @project.has_resources?
fail DependencyError.new("'#{@project.name}' project has some resources. Delete all related resources first.")
end
DB.transaction do
@project.soft_delete
audit_log(@project, "destroy")
end
204
end
r.post web? do
authorize("Project:edit", @project.id)
handle_validation_failure("project/show")
DB.transaction do
@project.update(name: typecast_params.nonempty_str!("name"))
audit_log(@project, "update")
end
flash["notice"] = "The project name is updated to '#{@project.name}'."
r.redirect @project.path
end
end
r.get(web?, "dashboard") do
no_authorization_needed
view("project/dashboard")
end
r.hash_branches(:project_prefix)
end
end
end