Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions etna/lib/etna/clients/janus/models.rb
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,8 @@ def permissions
@raw[:permissions] || []
end

def resource
!!@raw[:resource]
end

def requires_agreement
!!@raw[:requires_agreement]
def project_type
@raw[:project_type]
end
end

Expand Down
4 changes: 2 additions & 2 deletions etna/lib/etna/janus_utils.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ def projects(token)

def resource_projects(token)
projects(token).select do |project|
!!project.resource && !project.requires_agreement
project.project_type == 'resource'
end
end

def community_projects(token)
projects(token).select do |project|
!!project.resource && !!project.requires_agreement
project_type == 'community'
end
end

Expand Down
52 changes: 52 additions & 0 deletions janus/db/migrations/015_add_project_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
Sequel.migration do
up do
alter_table(:projects) do
add_column :project_type, String
end

db = Janus.instance.db

db[:projects].where(requires_agreement: true, resource: true).update(
project_type: "community"
)
db[:projects].where(requires_agreement: false, resource: true).update(
project_type: "resource"
)
db[:projects].where(resource: false).update(
project_type: "team"
)

alter_table(:projects) do
drop_column :requires_agreement
drop_column :resource
set_column_not_null :project_type
set_column_default :project_type, 'team'
end
end

down do
alter_table(:projects) do
add_column :resource, TrueClass, default: false
add_column :requires_agreement, TrueClass, default: false
end

db = Janus.instance.db

db[:projects].where(project_type: 'community').update(
resource: true,
requires_agreement: true
)
db[:projects].where(project_type: 'resource').update(
resource: true,
requires_agreement: false
)
db[:projects].where(project_type: 'team').update(
resource: false,
requires_agreement: false
)

alter_table(:projects) do
drop_column :project_type
end
end
end
13 changes: 7 additions & 6 deletions janus/lib/client/jsx/project-view.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -246,12 +246,9 @@ const ProjectView = ({project_name}) => {

const updateProject = () => {
postUpdateProject(project_name, {
requires_agreement: projectType == 'community',
resource: projectType == 'community' || projectType == 'resource',
project_type: projectType,
...(projectCoc != project.cc_text && {cc_text: projectCoc}),
...(projectContact != project.contact_email && {
contact_email: projectContact
}),
...(projectContact != project.contact_email && { contact_email: projectContact }),
...(projectType != 'community' && {cc_text: '', contact_email: ''})
})
.then((project) => {
Expand Down Expand Up @@ -287,6 +284,10 @@ const ProjectView = ({project_name}) => {
setError(
"WARNING! Setting this project to 'resource' will allow any library user to view the project data."
);
else if (type == 'template')
setError(
"WARNING! Setting this project to 'template' will allow any library user to view the project template and prohibits adding records to the project."
);
else setError(null);
setProjectType(type);
};
Expand Down Expand Up @@ -331,7 +332,7 @@ const ProjectView = ({project_name}) => {
value={projectType}
onChange={(e) => updateProjectType(e.target.value)}
>
{['team', 'community', 'resource'].map((r) => (
{['team', 'community', 'resource', 'template'].map((r) => (
<MenuItem key={r} value={r}>
{r}
</MenuItem>
Expand Down
27 changes: 25 additions & 2 deletions janus/lib/models/project.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,36 @@ def self.valid_name?(project_name)
project_name =~ /\A#{PROJECT_NAME_MATCH.source}\Z/
end

PROJECT_TYPES={
'team' => {
public: false
},
'resource' => {
public: true
},
'community' => {
public: true,
requires_agreement: true
},
'template' => {
public: true
}
}

PUBLIC_PROJECT_TYPES=PROJECT_TYPES.select do |type, props|
props[:public]
end.keys

def requires_agreement?
!!Project::PROJECT_TYPES[project_type][:requires_agreement]
end

def to_hash
{
project_name: project_name,
project_name_full: project_name_full,
project_type: project_type,
permissions: permissions.map(&:to_hash),
resource: resource,
requires_agreement: requires_agreement,
cc_text: cc_text,
contact_email: contact_email
}
Expand Down
23 changes: 11 additions & 12 deletions janus/lib/server/controllers/admin_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def projects
{
project_name: project.project_name,
project_name_full: project.project_name_full,
resource: project.resource
project_type: project.project_type
}
end

Expand Down Expand Up @@ -150,8 +150,15 @@ def update_project

raise Etna::BadRequest, "invalid project" if @project.nil?
raise Etna::BadRequest, "invalid contact email" if @params[:contact_email] && !valid_contact?
raise Etna::BadRequest, "invalid project_type" if @params[:project_type] && !Project::PROJECT_TYPES.keys.include?(@params[:project_type])

@project.update(**update_payload)
update = {
project_type: @params[:project_type],
cc_text: @params[:cc_text],
contact_email: @params[:contact_email]&.strip
}.compact

@project.update(**update)

@project.refresh

Expand Down Expand Up @@ -185,10 +192,11 @@ def update_cc_agreement
return failure(404, "Project #{project_name} does not exist.")
end

if !project.requires_agreement
if !project.requires_agreement?
return failure(403, "Project #{project_name} does not require a code of conduct agreement.")
end


agreement = CcAgreement.create(
user_email: @user.email,
project_name: project_name,
Expand All @@ -214,15 +222,6 @@ def update_cc_agreement

private

def update_payload
{}.tap do |result|
result[:resource] = !!@params[:resource] unless @params[:resource].nil?
result[:requires_agreement] = !!@params[:requires_agreement] unless @params[:requires_agreement].nil?
result[:cc_text] = @params[:cc_text] unless @params[:cc_text].nil?
result[:contact_email] = @params[:contact_email].strip if valid_contact?
end
end

def valid_contact?
@params[:contact_email]&.empty? || @params[:contact_email]&.strip&.rpartition('@')&.last == Janus.instance.config(:token_domain)
end
Expand Down
13 changes: 4 additions & 9 deletions janus/lib/server/controllers/user_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,26 +32,21 @@ def projects
@janus_user = User[email: @user.email]

raise Etna::Forbidden, 'User not found' unless @janus_user

projects = @janus_user.permissions.map do |perm|
# Don't use proj.to_hash because we don't necessarily want to send back
# all the information.
{
project_name: perm.project.project_name,
project_name_full: perm.project.project_name_full,
project_type: perm.project.project_type,
role: perm.role,
privileged: perm.privileged?,
resource: perm.project.resource,
requires_agreement: perm.project.requires_agreement,
cc_text: perm.project.cc_text,
privileged: perm.privileged?
}
end.concat(Project.where(resource: true).all.map do |proj|
end.concat(Project.where(project_type: Project::PUBLIC_PROJECT_TYPES).all.map do |proj|
{
project_name: proj.project_name,
project_name_full: proj.project_name_full,
resource: proj.resource,
requires_agreement: proj.requires_agreement,
cc_text: proj.cc_text,
project_type: proj.project_type
}
end).uniq do |proj|
proj[:project_name]
Expand Down
5 changes: 5 additions & 0 deletions janus/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading