blob: 243709da1b4cefa5e2169daae1027230b6afce12 [file] [log] [blame]
#
# Server side setup for whimsy/project
#
require 'whimsy/asf'
require 'whimsy/lockfile'
require 'wunderbar/sinatra'
require 'wunderbar/vue'
require 'wunderbar/bootstrap/theme'
require 'ruby2js/filter/functions'
require 'ruby2js/filter/require'
require 'json'
require 'mail'
ASF::Mail.configure
disable :logging # suppress log of requests to stderr/error.log
helpers do
def projectsForUser(userName)
user = ASF::Person.find(userName)
committees = user.committees.map(&:name)
project_owners = user.project_owners.map(&:name) # includes podlings and GUINEA_PIGS
# allData is a hash where the key is the name of the PMC/PPMC and
# the value is a hash of the data for the PMC/PPMC
pmcData = ASF::Committee.pmcs. # get PMCs
select {|pmc| committees.include?(pmc.name)}. # keep the ones relevant to the user
sort_by{|p| p.name}.
map{|p| [p.name, {pmc: true, display_name: p.display_name, mail_list: p.mail_list}]}.to_h # convert to hash of data items
ppmcData =
ASF::Podling.list.select {|podling| podling.status == 'current'}. # get the podlings
select {|p| committees.include?('incubator') || project_owners.include?(p.name)}. # keep the ones relevant to the user
sort_by{|p| p.name}.
map{|p| [p.name, {pmc: false, display_name: p.display_name, mail_list: p.mail_list}]}.to_h # convert to hash of data items
pmcData.merge(ppmcData)
end
def loadProgress(token)
if token
data = nil
# read the file corresponding to the token
# the file name is '/srv/<token>.json
filename = '/srv/icla/' + token + '.json'
begin
LockFile.lockfile(filename) do |f| # shared read
data = JSON.parse(File.read(f))
end
rescue SystemCallError => e
{
phase: 'error', errorMessage: e.message, errorCode: e.errno
}
rescue JSON::ParserError => e
{
phase: 'error', errorMessage: e.message, errorCode: 999
}
end
data
end
end
def getMember(userId)
mockId = params['mock']
if ASF::Person[mockId] != nil
# if mock is set, set member to mock value
return mockId
else
return userId
end
end
end
#
# Sinatra routes
#
get '/' do
@token = params['token']
@mock = params['mock']
@extra = @mock ? "&mock=" + @mock : ''
@progress = loadProgress(@token) if @token
@phase = @progress['phase'] if @progress
if @phase == 'discuss'
redirect to("/discuss?token=" + @token + @extra)
elsif @phase == 'vote'
redirect to("/vote?token=" + @token + @extra)
else
redirect to("/invite")
end
end
get '/invite' do
@view = 'invite'
# server data sent to client
@user = env.user
@member = getMember(@user)
# get a complete list of PMC and PPMC names and mail lists
@allData = projectsForUser(@member)
@cssmtime = File.mtime('public/css/icla.css').to_i
@appmtime = Wunderbar::Asset.convert("#{settings.views}/app.js.rb").mtime.to_i
# render the HTML for the application
_html :app
end
get '/discuss' do
@view = 'discuss'
# server data sent to client
@debug = params['debug']
@user = env.user
@member = getMember(@user)
@token = params['token']
@progress = loadProgress(@token) if @token
# not needed for this form but required for other forms
@allData = {}
@cssmtime = File.mtime('public/css/icla.css').to_i
@appmtime = Wunderbar::Asset.convert("#{settings.views}/app.js.rb").mtime.to_i
_html :app
end
get '/vote' do
@view = 'vote'
# server data sent to client
@debug = params['debug']
@user = env.user
@member = getMember(@user)
@token = params['token']
@progress = loadProgress(@token) if @token
# not needed for this form but required for other forms
@allData = {}
@cssmtime = File.mtime('public/css/icla.css').to_i
@appmtime = Wunderbar::Asset.convert("#{settings.views}/app.js.rb").mtime.to_i
_html :app
end
get '/form' do
@view = 'interview'
_html :app
end
# posted actions
post '/actions/:file' do
_json :"actions/#{params[:file]}"
end