diff --git a/api/Gemfile b/api/Gemfile index d73114a5..77c5ee7e 100644 --- a/api/Gemfile +++ b/api/Gemfile @@ -6,11 +6,14 @@ gem "rails", "~> 7.2.0" gem "aws-sdk-s3" gem "base62-rb" +gem "bcrypt_pbkdf" gem "bootsnap", require: false +gem "ed25519" gem "faraday" gem "faraday-multipart" gem "jb" gem "metabobank_tools", github: "ddbj/metabobank_tools" +gem "net-ssh" gem "noodles_gff", path: "../noodles_gff-rb" gem "openid_connect" gem "pagy" diff --git a/api/Gemfile.lock b/api/Gemfile.lock index 78e4edae..79e73891 100644 --- a/api/Gemfile.lock +++ b/api/Gemfile.lock @@ -120,6 +120,8 @@ GEM aws-eventstream (~> 1, >= 1.0.2) base62-rb (0.3.1) base64 (0.2.0) + bcrypt_pbkdf (1.1.1) + bcrypt_pbkdf (1.1.1-arm64-darwin) bigdecimal (3.1.8) bindata (2.5.0) bootsnap (1.18.4) @@ -141,6 +143,7 @@ GEM reline (>= 0.3.8) diff-lcs (1.5.1) drb (2.2.1) + ed25519 (1.3.0) email_validator (2.2.4) activemodel erubi (1.13.0) @@ -214,6 +217,7 @@ GEM timeout net-smtp (0.5.0) net-protocol + net-ssh (7.2.3) nio4r (2.7.3) nokogiri (1.16.7-aarch64-linux) racc (~> 1.4) @@ -424,15 +428,18 @@ PLATFORMS DEPENDENCIES aws-sdk-s3 base62-rb + bcrypt_pbkdf bootsnap brakeman climate_control debug + ed25519 factory_bot_rails faraday faraday-multipart jb metabobank_tools! + net-ssh noodles_gff! openid_connect pagy diff --git a/api/app/models/database/dra.rb b/api/app/models/database/dra.rb index 41fe1641..a992da1a 100644 --- a/api/app/models/database/dra.rb +++ b/api/app/models/database/dra.rb @@ -56,7 +56,51 @@ def validate(validation) class Submitter def submit(submission) - # do nothing + submitter_id = submission.validation.user.uid + user_id = Dray.submitterdb[:login].where(submitter_id:).get(:usr_id) + + Dway.drmdb.transaction isolation: :serializable do + serial = (Dway.drmdb[:submission].where(submitter_id:).max(:serial) || 0) + 1 + + sub_id = Dway.drmdb[:submission].insert( + usr_id: user_id, + submitter_id:, + serial:, + create_date: Date.current + ) + + submission_id = "#{submitter_id}-#{serial.to_s.rjust(4, '0')}" + + Dway.drmdb[:status_history].insert( + sub_id:, + status: 100 # SubmissionStatus.NEW + ) + + Dway.drmdb[:operation_history].insert( + type: 3, # LogLevel.INFO + summary: "Status update to new", + usr_id: user_id, + serial:, + submitter_id: + ) + + ext_id = Dway.drmdb[:ext_entity].insert( + acc_type: "DRA", + ref_name: submission_id, + status: 0 # ExtStatus.INPUTTING + ) + + Dway.drmdb[:ext_permit].insert( + ext_id:, + submitter_id: + ) + + host, user, key_data = ENV.values_at("DRA_SSH_HOST", "DRA_SSH_USER", "DRA_SSH_KEY_DATA") + + Net::SSH.start host, user, key_data: [ key_data ] do |ssh| + ssh.exec! "sudo /usr/local/sbin/chroot-createdir.sh #{submitter_id} #{submission_id}" + end + end end end end diff --git a/api/spec/models/database/dra/submitter_spec.rb b/api/spec/models/database/dra/submitter_spec.rb new file mode 100644 index 00000000..7b291559 --- /dev/null +++ b/api/spec/models/database/dra/submitter_spec.rb @@ -0,0 +1,45 @@ +require 'rails_helper' + +RSpec.describe Database::DRA::Submitter, type: :model do + example do + submission = create(:submission, { + validation: build(:validation, :valid, { + user: build(:user, uid: 'alice') + }) + }) + + user_id = Dway.submitterdb[:login].insert( + submitter_id: 'alice', + password: 'password', + ) + + expect(Net::SSH).to receive(:start) + + Database::DRA::Submitter.new.submit submission + + expect(Dway.drmdb[:submission].count).to eq(1) + + dway_submission = Dway.drmdb[:submission].first + expect(dway_submission).to include(usr_id: user_id, submitter_id: 'alice', serial: 1) + + expect(Dway.drmdb[:status_history].count).to eq(1) + + status_history = Dway.drmdb[:status_history].first + expect(status_history).to include(sub_id: dway_submission[:sub_id], status: 100) + + expect(Dway.drmdb[:operation_history].count).to eq(1) + + operation_history = Dway.drmdb[:operation_history].first + expect(operation_history).to include(type: 3, summary: 'Status update to new', usr_id: user_id, serial: 1, submitter_id: 'alice') + + expect(Dway.drmdb[:ext_entity].count).to eq(1) + + ext_entity = Dway.drmdb[:ext_entity].first + expect(ext_entity).to include(acc_type: 'DRA', ref_name: 'alice-0001', status: 0) + + expect(Dway.drmdb[:ext_permit].count).to eq(1) + + ext_permit = Dway.drmdb[:ext_permit].first + expect(ext_permit).to include(ext_id: ext_entity[:ext_id], submitter_id: 'alice') + end +end