diff --git a/app/models/dependency.rb b/app/models/dependency.rb new file mode 100644 index 0000000..445dc36 --- /dev/null +++ b/app/models/dependency.rb @@ -0,0 +1,2 @@ +class Dependency < ApplicationRecord +end diff --git a/app/models/project.rb b/app/models/project.rb index 0f704e0..815197c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1272,23 +1272,47 @@ def self.sync_dependencies dependencies.each do |(ecosystem, package_name), count| puts "Checking #{ecosystem} #{package_name}" - if existing_packages.any?{|p| p['ecosystem'] == ecosystem && p['name'] == package_name } + + dependency = Dependency.find_or_create_by(ecosystem: ecosystem, name: package_name) + + dependency.update(count: count) + + next if dependency.package.present? + + existing_package = existing_packages.find{|p| p['ecosystem'] == ecosystem && p['name'] == package_name } + + if existing_package.present? puts " Already exists" - next - end - purl = "https://packages.ecosyste.ms/api/v1/packages/lookup?ecosystem=#{ecosystem}&package_name=#{package_name}" - conn = Faraday.new(url: purl) do |faraday| - faraday.response :follow_redirects - faraday.adapter Faraday.default_adapter - end - response = conn.get - puts " Response: #{response.status}" - next unless response.success? - package = JSON.parse(response.body) - puts " #{package['repository_url']}" - project = Project.create(url: package['repository_url']) - project.sync_async + project = Project.find_by(url: existing_package['repository_url']) + + dependency.update(package: existing_package, repository_url: existing_package['repository_url'], project_id: project.try(:id), average_ranking: existing_package['rankings']['average']) + else + # TODO + # load it from the packages API + # purl = "https://packages.ecosyste.ms/api/v1/packages/lookup?ecosystem=#{ecosystem}&name=#{package_name}" + + # puts " Fetching #{purl}" + + # conn = Faraday.new(url: purl) do |faraday| + # faraday.response :follow_redirects + # faraday.adapter Faraday.default_adapter + # end + + # response = conn.get + # puts " Response: #{response.status}" + # next unless response.success? + # packages = JSON.parse(response.body) + # package = packages.first + # next unless package.present? + # puts " #{package['repository_url']}" + # project = Project.create(url: package['repository_url']) + # project.sync_async + + # dependency.update(package: package, repository_url: package['repository_url'], project_id: project.id, average_ranking: package['rankings']['average']) + + end + end end end diff --git a/db/migrate/20240626125315_create_dependencies.rb b/db/migrate/20240626125315_create_dependencies.rb new file mode 100644 index 0000000..391da6a --- /dev/null +++ b/db/migrate/20240626125315_create_dependencies.rb @@ -0,0 +1,15 @@ +class CreateDependencies < ActiveRecord::Migration[7.1] + def change + create_table :dependencies do |t| + t.string :ecosystem + t.string :name + t.integer :count + t.json :package, default: {} + t.string :repository_url + t.integer :project_id + t.float :average_ranking + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index aa42687..8940cef 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_06_12_161900) do +ActiveRecord::Schema[7.1].define(version: 2024_06_26_125315) do # These are extensions that must be enabled in order to support this database enable_extension "citext" enable_extension "plpgsql" @@ -39,6 +39,18 @@ t.json "profile", default: {} end + create_table "dependencies", force: :cascade do |t| + t.string "ecosystem" + t.string "name" + t.integer "count" + t.json "package", default: {} + t.string "repository_url" + t.integer "project_id" + t.float "average_ranking" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "issues", force: :cascade do |t| t.integer "project_id" t.string "uuid" diff --git a/test/models/dependency_test.rb b/test/models/dependency_test.rb new file mode 100644 index 0000000..ac155bf --- /dev/null +++ b/test/models/dependency_test.rb @@ -0,0 +1,7 @@ +require "test_helper" + +class DependencyTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end