diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 672477790..627decb9c 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -1,2 +1,22 @@ class ProjectsController < ApplicationController -end \ No newline at end of file + before_action :require_login + + def index + end + + def create + ActiveRecord::Base.transaction do + Projects::CreateForm.new(project_params).validate! + @project = Projects::CreateService.new(current_user, project_params).call + end + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + end + + private + def project_params + params.permit(:user_id, :name, :description, :repository_name, + :project_category_id, :project_language_id, :license_id, :ignore_id) + end +end diff --git a/app/forms/base_form.rb b/app/forms/base_form.rb new file mode 100644 index 000000000..40c7c51e3 --- /dev/null +++ b/app/forms/base_form.rb @@ -0,0 +1,3 @@ +class BaseForm + include ActiveModel::Model +end diff --git a/app/forms/projects/create_form.rb b/app/forms/projects/create_form.rb new file mode 100644 index 000000000..a9e803261 --- /dev/null +++ b/app/forms/projects/create_form.rb @@ -0,0 +1,10 @@ +class Projects::CreateForm < BaseForm + REPOSITORY_NAME_REGEX = /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]+$/ #只含有数字、字母、下划线不能以下划线开头和结尾 + attr_accessor :user_id, :name, :description, :repository_name, :project_category_id, + :project_language_id, :ignore_id, :license_id, :private + + validates :user_id, :name, :description,:repository_name, + :project_category_id, :project_language_id, presence: true + validates_format_of :repository_name, with: REPOSITORY_NAME_REGEX, multiline: true + +end diff --git a/app/interactors/gitea/repository_interactor.rb b/app/interactors/gitea/repository_interactor.rb index 5985f0492..0cd1c8e6b 100644 --- a/app/interactors/gitea/repository_interactor.rb +++ b/app/interactors/gitea/repository_interactor.rb @@ -1,5 +1,5 @@ class Gitea::RepositoryInteractor - attr_reader :token, :repository + attr_reader :error # params: token and repository def self.call(token, repository) @@ -27,7 +27,7 @@ class Gitea::RepositoryInteractor private - attr_reader :error + attr_reader :token, :repository def fail!(error) @error = error diff --git a/app/models/project.rb b/app/models/project.rb index 480015f90..9f803b684 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,4 +1,6 @@ class Project < ApplicationRecord + belongs_to :ignore, optional: true + belongs_to :license, optional: true belongs_to :owner, class_name: 'User', foreign_key: :user_id belongs_to :project_category , :counter_cache => true belongs_to :project_language , :counter_cache => true @@ -6,6 +8,7 @@ class Project < ApplicationRecord has_many :members has_many :manager_members, -> { joins(:roles).where(roles: { name: 'Manager' }) }, class_name: 'Member' has_one :project_score, dependent: :destroy + has_one :repository, dependent: :destroy has_many :issues has_many :user_grades, dependent: :destroy diff --git a/app/models/repository.rb b/app/models/repository.rb new file mode 100644 index 000000000..aac23fd80 --- /dev/null +++ b/app/models/repository.rb @@ -0,0 +1,6 @@ +class Repository < ApplicationRecord + self.inheritance_column = nil # FIX The single-table inheritance mechanism failed + belongs_to :project + + validates :identifier, presence: true, uniqueness: true +end diff --git a/app/services/gitea/repository/create_service.rb b/app/services/gitea/repository/create_service.rb index 9c52d7862..ac3dd29e1 100644 --- a/app/services/gitea/repository/create_service.rb +++ b/app/services/gitea/repository/create_service.rb @@ -8,7 +8,7 @@ class Gitea::Repository::CreateService < Gitea::ClientService # "gitignores": "string", # "issue_labels": "string", # "license": "string", - # "name": "string", + # "name": "string", * # "private": true, # "readme": "string" # } diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb new file mode 100644 index 000000000..e46591d96 --- /dev/null +++ b/app/services/projects/create_service.rb @@ -0,0 +1,49 @@ +class Projects::CreateService < ApplicationService + attr_reader :user, :params + + def initialize(user, params) + @user = user + @params = params + end + + def call + @project = Project.new(project_params) + ActiveRecord::Base.transaction do + if @project.save! + Repositories::CreateService.new(user, @project, repository_params).call + else + # + end + end + @project + rescue => e + puts "create project service error: #{e.message}" + raise Error, e.message + end + + private + + def project_params + { + name: params[:name], + user_id: params[:user_id], + description: params[:description], + project_category_id: params[:project_category_id], + project_language_id: params[:project_language_id], + is_public: get_is_public, + ignore_id: params[:ignore_id], + license_id: params[:license_id] + } + end + + def repository_params + { + hidden: get_is_public, + identifier: params[:repository_name] + } + end + + def get_is_public + params[:private] || true + end +end diff --git a/app/services/repositories/create_service.rb b/app/services/repositories/create_service.rb new file mode 100644 index 000000000..d602b8ae0 --- /dev/null +++ b/app/services/repositories/create_service.rb @@ -0,0 +1,51 @@ +class Repositories::CreateService < ApplicationService + attr_reader :user, :project, :params + + def initialize(user, project, params) + @project = project + @user = user + @params = params + end + + def call + @repository = Repository.new(repository_params) + ActiveRecord::Base.transaction do + if @repository.save! + gitea_repository = Gitea::Repository::CreateService.new(user.gitea_token, gitea_repository_params).call + project.update_attributes(gpid: gitea_repository["id"]) if gitea_repository + end + @repository + end + rescue => e + puts "create repository service error: #{e.message}" + raise Error, e.message + end + + private + + def repository_params + params.merge(project_id: project.id) + end + + def gitea_repository_params + hash = { + name: params[:identifier], + private: !params[:hidden] + # "auto_init": true, + # "description": "string", + # "gitignores": "string", + # "issue_labels": "string", + # "license": "string", + # "name": "string", + # "private": true, + # "readme": "string" + } + + ignore = project.ignore + license = project.license + hash.merge(license: license.content) if license + hash.merge(gitignores: ignore.content) if ignore + puts "[gitea] create repository params: #{hash}" + hash + end +end diff --git a/app/views/projects/create.json.jbuilder b/app/views/projects/create.json.jbuilder new file mode 100644 index 000000000..818eb0180 --- /dev/null +++ b/app/views/projects/create.json.jbuilder @@ -0,0 +1 @@ +json.extract! @project, :id, :name diff --git a/app/views/projects/index.json.jbuilder b/app/views/projects/index.json.jbuilder new file mode 100644 index 000000000..f4f2b0b91 --- /dev/null +++ b/app/views/projects/index.json.jbuilder @@ -0,0 +1 @@ +json.projects [] diff --git a/config/routes.rb b/config/routes.rb index ed5a2e719..18d06139f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -27,6 +27,8 @@ Rails.application.routes.draw do resources :ignores, only: [:index, :show] resources :licenses, only: [:index, :show] + resources :projects, only: [:index, :create] + # resources :memos do # member do # post :sticky_or_cancel