pages_domains.rb 4,1 КБ
Newer Older
Travis Miller's avatar
Travis Miller включено в состав коммита
1
2
3
4
module API
  class PagesDomains < Grape::API
    include PaginationParams

Travis Miller's avatar
Travis Miller включено в состав коммита
5
6
    PAGES_DOMAINS_ENDPOINT_REQUIREMENTS = API::PROJECT_ENDPOINT_REQUIREMENTS.merge(domain: API::NO_SLASH_URL_PART_REGEX)

Travis Miller's avatar
Travis Miller включено в состав коммита
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    before do
      authenticate!
    end

    after_validation do
      normalize_params_file_to_string
    end

    helpers do
      def find_pages_domain!
        user_project.pages_domains.find_by(domain: params[:domain]) || not_found!('PagesDomain')
      end

      def pages_domain
        @pages_domain ||= find_pages_domain!
      end

      def normalize_params_file_to_string
        params.each do |k, v|
          if v.is_a?(Hash) && v.key?(:tempfile)
            params[k] = v[:tempfile].to_a.join('')
          end
        end
      end
    end

Travis Miller's avatar
Travis Miller включено в состав коммита
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    resource :pages do
      before do
        require_pages_config_enabled!
        authenticated_with_full_private_access!
      end

      desc "Get all pages domains" do
        success Entities::PagesDomainBasic
      end
      params do
        use :pagination
      end
      get "domains" do
        present paginate(PagesDomain.all), with: Entities::PagesDomainBasic
      end
    end

Travis Miller's avatar
Travis Miller включено в состав коммита
50
51
52
    params do
      requires :id, type: String, desc: 'The ID of a project'
    end
Travis Miller's avatar
Travis Miller включено в состав коммита
53
    resource :projects, requirements: API::PROJECT_ENDPOINT_REQUIREMENTS do
Travis Miller's avatar
Travis Miller включено в состав коммита
54
55
56
57
      before do
        require_pages_enabled!
      end

Travis Miller's avatar
Travis Miller включено в состав коммита
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
      desc 'Get all pages domains' do
        success Entities::PagesDomain
      end
      params do
        use :pagination
      end
      get ":id/pages/domains" do
        authorize! :read_pages, user_project

        present paginate(user_project.pages_domains.order(:domain)), with: Entities::PagesDomain
      end

      desc 'Get a single pages domain' do
        success Entities::PagesDomain
      end
      params do
        requires :domain, type: String, desc: 'The domain'
      end
Travis Miller's avatar
Travis Miller включено в состав коммита
76
      get ":id/pages/domains/:domain", requirements: PAGES_DOMAINS_ENDPOINT_REQUIREMENTS do
Travis Miller's avatar
Travis Miller включено в состав коммита
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
        authorize! :read_pages, user_project

        present pages_domain, with: Entities::PagesDomain
      end

      desc 'Create a new pages domain' do
        success Entities::PagesDomain
      end
      params do
        requires :domain, type: String, desc: 'The domain'
        optional :certificate, allow_blank: false, types: [File, String], desc: 'The certificate'
        optional :key, allow_blank: false, types: [File, String], desc: 'The key'
        all_or_none_of :certificate, :key
      end
      post ":id/pages/domains" do
        authorize! :update_pages, user_project

        pages_domain_params = declared(params, include_parent_namespaces: false)
        pages_domain = user_project.pages_domains.create(pages_domain_params)

        if pages_domain.persisted?
          present pages_domain, with: Entities::PagesDomain
        else
          render_validation_error!(pages_domain)
        end
      end

      desc 'Updates a pages domain'
      params do
        requires :domain, type: String, desc: 'The domain'
        optional :certificate, allow_blank: false, types: [File, String], desc: 'The certificate'
        optional :key, allow_blank: false, types: [File, String], desc: 'The key'
      end
Travis Miller's avatar
Travis Miller включено в состав коммита
110
      put ":id/pages/domains/:domain", requirements: PAGES_DOMAINS_ENDPOINT_REQUIREMENTS do
Travis Miller's avatar
Travis Miller включено в состав коммита
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
        authorize! :update_pages, user_project

        pages_domain_params = declared(params, include_parent_namespaces: false)

        # Remove empty private key if certificate is not empty.
        if pages_domain_params[:certificate] && !pages_domain_params[:key]
          pages_domain_params.delete(:key)
        end

        if pages_domain.update(pages_domain_params)
          present pages_domain, with: Entities::PagesDomain
        else
          render_validation_error!(pages_domain)
        end
      end

      desc 'Delete a pages domain'
      params do
        requires :domain, type: String, desc: 'The domain'
      end
Travis Miller's avatar
Travis Miller включено в состав коммита
131
      delete ":id/pages/domains/:domain", requirements: PAGES_DOMAINS_ENDPOINT_REQUIREMENTS do
Travis Miller's avatar
Travis Miller включено в состав коммита
132
133
134
135
136
137
138
139
        authorize! :update_pages, user_project

        status 204
        pages_domain.destroy
      end
    end
  end
end