68 lines
1.5 KiB
Ruby
68 lines
1.5 KiB
Ruby
|
|
# frozen_string_literal: true
|
||
|
|
|
||
|
|
require_relative 'base'
|
||
|
|
require_relative '../expectations'
|
||
|
|
|
||
|
|
module PluginConfig
|
||
|
|
module Operations
|
||
|
|
class Register < Base
|
||
|
|
def initialize(params)
|
||
|
|
super
|
||
|
|
@description = params[:description] || ''
|
||
|
|
end
|
||
|
|
|
||
|
|
def call
|
||
|
|
path = marketplace_file
|
||
|
|
|
||
|
|
# Validate marketplace schema if file exists
|
||
|
|
if path && File.exist?(path)
|
||
|
|
check_result = Expectations.check(path, %w[name plugins])
|
||
|
|
raise SchemaError, check_result unless check_result[:ok]
|
||
|
|
end
|
||
|
|
|
||
|
|
data = read_json(path)
|
||
|
|
|
||
|
|
unless data
|
||
|
|
return {
|
||
|
|
status: 'error',
|
||
|
|
error: "Marketplace file not found or invalid: #{path}"
|
||
|
|
}
|
||
|
|
end
|
||
|
|
|
||
|
|
data['plugins'] ||= []
|
||
|
|
|
||
|
|
existing = data['plugins'].find { |p| p['name'] == plugin }
|
||
|
|
if existing
|
||
|
|
return {
|
||
|
|
status: 'already_registered',
|
||
|
|
plugin: plugin,
|
||
|
|
path: path,
|
||
|
|
verified: true
|
||
|
|
}
|
||
|
|
end
|
||
|
|
|
||
|
|
data['plugins'] << {
|
||
|
|
'name' => plugin,
|
||
|
|
'source' => "./#{plugin}",
|
||
|
|
'description' => @description
|
||
|
|
}
|
||
|
|
|
||
|
|
data['plugins'].sort_by! { |p| p['name'] }
|
||
|
|
|
||
|
|
write_json(path, data)
|
||
|
|
|
||
|
|
verifier = FileVerifier.new(path)
|
||
|
|
readback = read_json(path)
|
||
|
|
found = readback && readback['plugins']&.any? { |p| p['name'] == plugin }
|
||
|
|
|
||
|
|
{
|
||
|
|
status: 'registered',
|
||
|
|
plugin: plugin,
|
||
|
|
path: path,
|
||
|
|
verified: found == true
|
||
|
|
}
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|