2895: remove users.event_stream api
[arvados.git] / services / api / app / controllers / arvados / v1 / users_controller.rb
1 class Arvados::V1::UsersController < ApplicationController
2   skip_before_filter :find_object_by_uuid, only:
3     [:activate, :current, :system, :setup]
4   skip_before_filter :render_404_if_no_object, only:
5     [:activate, :current, :system, :setup]
6   before_filter :admin_required, only: [:setup, :unsetup]
7
8   def current
9     @object = current_user
10     show
11   end
12   def system
13     @object = system_user
14     show
15   end
16
17   def activate
18     if current_user.andand.is_admin && params[:uuid]
19       @object = User.find params[:uuid]
20     else
21       @object = current_user
22     end
23     if not @object.is_active
24       if not (current_user.is_admin or @object.is_invited)
25         logger.warn "User #{@object.uuid} called users.activate " +
26           "but is not invited"
27         raise ArgumentError.new "Cannot activate without being invited."
28       end
29       act_as_system_user do
30         required_uuids = Link.where("owner_uuid = ? and link_class = ? and name = ? and tail_uuid = ? and head_uuid like ?",
31                                     system_user_uuid,
32                                     'signature',
33                                     'require',
34                                     system_user_uuid,
35                                     Collection.uuid_like_pattern).
36           collect(&:head_uuid)
37         signed_uuids = Link.where(owner_uuid: system_user_uuid,
38                                   link_class: 'signature',
39                                   name: 'click',
40                                   tail_uuid: @object.uuid,
41                                   head_uuid: required_uuids).
42           collect(&:head_uuid)
43         todo_uuids = required_uuids - signed_uuids
44         if todo_uuids.empty?
45           @object.update_attributes is_active: true
46           logger.info "User #{@object.uuid} activated"
47         else
48           logger.warn "User #{@object.uuid} called users.activate " +
49             "before signing agreements #{todo_uuids.inspect}"
50           raise ArvadosModel::PermissionDeniedError.new \
51           "Cannot activate without user agreements #{todo_uuids.inspect}."
52         end
53       end
54     end
55     show
56   end
57
58   # create user object and all the needed links
59   def setup
60     @object = nil
61     if params[:uuid]
62       @object = User.find_by_uuid params[:uuid]
63       if !@object
64         return render_404_if_no_object
65       end
66       object_found = true
67     else
68       if !params[:user]
69         raise ArgumentError.new "Required uuid or user"
70       else
71         if params[:user]['uuid']
72           @object = User.find_by_uuid params[:user]['uuid']
73           if @object
74             object_found = true
75           end
76         end
77
78         if !@object
79           if !params[:user]['email']
80             raise ArgumentError.new "Require user email"
81           end
82
83           if !params[:openid_prefix]
84             raise ArgumentError.new "Required openid_prefix parameter is missing."
85           end
86
87           @object = model_class.create! resource_attrs
88         end
89       end
90     end
91
92     if object_found
93       @response = @object.setup_repo_vm_links params[:repo_name],
94                     params[:vm_uuid], params[:openid_prefix]
95     else
96       @response = User.setup @object, params[:openid_prefix],
97                     params[:repo_name], params[:vm_uuid]
98     end
99
100     # setup succeeded. send email to user
101     if params[:send_notification_email] == true || params[:send_notification_email] == 'true'
102       UserNotifier.account_is_setup(@object).deliver
103     end
104
105     render json: { kind: "arvados#HashList", items: @response.as_api_response(nil) }
106   end
107
108   # delete user agreements, vm, repository, login links; set state to inactive
109   def unsetup
110     reload_object_before_update
111     @object.unsetup
112     show
113   end
114
115   protected
116
117   def self._setup_requires_parameters
118     {
119       send_notification_email: { type: 'boolean', required: true },
120     }
121   end
122
123 end