Class: Api::ProjectsController

Inherits:
ApplicationController show all
Includes:
Affiliation, Customfields, ExternalLinks, Follow, Hooks, Media, Members, Recommendations, Relations, Upload, Utils
Defined in:
app/controllers/api/projects_controller.rb

Instance Method Summary collapse

Methods included from Utils

#get_id_from_short_title, #is_admin, #is_member, #is_reviewer, #nickname_exist, #short_title_exist

Methods included from Upload

#remove_avatar, #remove_banner, #remove_document, #upload_avatar, #upload_banner, #upload_document

Methods included from Relations

#clap, #clappers, #follow, #review, #reviewed_object, #save, #saved_objects

Methods included from Recommendations

#recommended, #similar

Methods included from Members

#get_current_role, #get_roles_list, #has_membership, #invite, #invite_as_admin, #join, #leave, #members_list, #remove_member, #update_member

Methods included from Media

#media_create, #media_destroy, #media_index, #media_show, #media_update, #media_upload

Methods included from Hooks

#create_external_hook, #delete_external_hook, #get_external_hooks, #hook_new_member, #hook_new_need, #hook_new_post, #hook_new_project, #hook_new_project_challenge, #update_external_hook

Methods included from Follow

#followers, #following

Methods included from ExternalLinks

#create_link, #destroy_link, #index_link, #update_link

Methods included from Customfields

#create_custom_data, #create_custom_field, #delete_custom_field, #get_custom_data, #get_custom_fields, #get_my_custom_datas, #update_custom_data, #update_custom_field, #validate_data, #validate_fields

Methods included from Affiliation

#affiliation_create, #affiliation_destroy, #affiliation_index, #affiliation_show, #affiliation_update

Methods included from Response

#json_response

Instance Method Details

#createObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'app/controllers/api/projects_controller.rb', line 54

def create
  current_user.active_at! unless current_user.nil?

  if Project.where(short_title: params[:project][:short_title]).empty?
    @project = Project.new(project_params)
    @project.status = 'draft'
    @project.creator_id = current_user.id
    if @project.save
      @project.update_skills(params[:project][:skills]) unless params[:project][:skills].nil?
      @project.update_interests(params[:project][:interests]) unless params[:project][:interests].nil?
      current_user.add_role :owner, @project
      current_user.add_role :admin, @project
      current_user.add_role :member, @project
      current_user.add_edge(@project, 'is_author_of')
      current_user.add_edge(@project, 'is_member_of')
      current_user.add_edge(@project, 'is_admin_of')
      current_user.add_edge(@project, 'is_owner_of')

      render json: { id: @project.id, data: 'Success' }, status: :created
    else
      render json: { data: 'Something went wrong :(' }, status: :unprocessable_entity
    end
  else
    render json: { data: 'ShortTitle is already taken' }, status: :unprocessable_entity
  end
end

#destroyObject



108
109
110
111
112
113
114
115
116
117
# File 'app/controllers/api/projects_controller.rb', line 108

def destroy
  # NOTE: a project with 1 user is considered a test project, and can be destroyed
  if @project.users.count == 1 && current_user.has_role?(:owner, @project)
    @project.destroy
    render json: { data: "Project id:#{params[:id]} destroyed" }, status: :ok
  else
    @project.archived!
    render json: { data: "Project id:#{@project.id} archived" }, status: :ok
  end
end

#indexObject

Before action for the relations Api::Relations



32
33
34
35
36
37
# File 'app/controllers/api/projects_controller.rb', line 32

def index
  param = params[:order] == 'desc' ? 'id DESC' : 'id ASC'
  @pagy, @projects = pagy(Project.where.not(status: 1).order(param).all)

  render json: @projects
end

#index_needsObject



39
40
41
42
43
# File 'app/controllers/api/projects_controller.rb', line 39

def index_needs
  @pagy, @needs = pagy(@project.needs)

  render json: @needs, each_serializer: Api::NeedSerializer
end

#my_projectsObject



45
46
47
48
49
50
51
52
# File 'app/controllers/api/projects_controller.rb', line 45

def my_projects
  @projects = Project.with_role(:owner, current_user)
  @projects += Project.with_role(:admin, current_user)
  @projects += Project.with_role(:member, current_user)
  @pagy, @projects = pagy_array(@projects.uniq)

  render json: @projects
end

#showObject



81
82
83
# File 'app/controllers/api/projects_controller.rb', line 81

def show
  render json: @project, includes: %i[challenges], show_objects: true
end

#updateObject



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/controllers/api/projects_controller.rb', line 85

def update
  if params[:project][:creator_id].present?
    if current_user.has_role? :owner, @project
      @project.roles.find_by(resource_type: @project.class.name, resource_id: @project.id, name: 'owner').delete
      @new_owner = User.find_by(id: params[:project][:creator_id])
      if @new_owner.nil?
        render json: { data: "New owner id:#{params[:project][:creator_id]} does not exist" }, status: :not_found
      else
        @new_owner.add_role :owner, @project
      end
    else
      render json: { data: 'You cannot change the creator_id' }, status: :forbidden
    end
  end
  if @project.update(project_params)
    @project.update_skills(params[:project][:skills]) unless params[:project][:skills].nil?
    @project.update_interests(params[:project][:interests]) unless params[:project][:interests].nil?
    render json: @project, status: :ok
  else
    render json: { data: 'Something went wrong :(' }, status: :unprocessable_entity
  end
end