| @@ -74,6 +74,7 @@ vendor/bundle/ | |||
| /log | |||
| /public/admin | |||
| /mysql_data | |||
| /public/repo/ | |||
| .generators | |||
| @@ -48,6 +48,6 @@ class CompareController < ApplicationController | |||
| end | |||
| def gitea_compare(base, head) | |||
| Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head) | |||
| Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, base, head, current_user.gitea_token) | |||
| end | |||
| end | |||
| @@ -0,0 +1,62 @@ | |||
| class PublicKeysController < ApplicationController | |||
| before_action :require_login | |||
| before_action :find_public_key, only: [:destroy] | |||
| def index | |||
| @public_keys = current_user.public_keys | |||
| @public_keys = kaminari_paginate(@public_keys) | |||
| rescue Exception => e | |||
| uid_logger_error(e.message) | |||
| tip_exception(e.message) | |||
| end | |||
| def create | |||
| return render_error("请输入密钥") if public_key_params[:key].blank? | |||
| return render_error("请输入标题") if public_key_params[:title].blank? | |||
| @gitea_response = Gitea::User::Keys::CreateService.call(current_user.gitea_token, public_key_params) | |||
| if @gitea_response[0] == 201 | |||
| @public_key = @gitea_response[2] | |||
| puts @public_key | |||
| else | |||
| return render_error if @gitea_response[2]["message"].nil? | |||
| return render_error("密钥格式不正确") if @gitea_response[2]["message"].starts_with?("Invalid key content") | |||
| return render_error("密钥已存在,请勿重复添加") if @gitea_response[2]["message"].starts_with?("Key content has been used as non-deploy key") | |||
| puts @gitea_response[2] | |||
| @public_key = nil | |||
| end | |||
| rescue Exception => e | |||
| uid_logger_error(e.message) | |||
| tip_exception(e.message) | |||
| end | |||
| def destroy | |||
| return render_not_found unless @public_key.present? | |||
| if @public_key.destroy | |||
| render_ok | |||
| else | |||
| render_error | |||
| end | |||
| rescue Exception => e | |||
| uid_logger_error(e.message) | |||
| tip_exception(e.message) | |||
| end | |||
| private | |||
| def page | |||
| params[:page].to_i.zero? ? 1 : params[:page].to_i | |||
| end | |||
| def limit | |||
| limit = params[:limit] || params[:per_page] | |||
| limit = (limit.to_i.zero? || limit.to_i > 15) ? 15 : limit.to_i | |||
| end | |||
| def public_key_params | |||
| params.require(:public_key).permit(:key, :title) | |||
| end | |||
| def find_public_key | |||
| @public_key = current_user.public_keys.find_by_id(params[:id]) | |||
| end | |||
| end | |||
| @@ -12,6 +12,7 @@ toc_footers: | |||
| includes: | |||
| - licenses | |||
| - gitignores | |||
| - public_keys | |||
| - users | |||
| - projects | |||
| - repositories | |||
| @@ -0,0 +1,158 @@ | |||
| <!-- | |||
| * @Date: 2021-07-14 15:10:29 | |||
| * @LastEditors: viletyy | |||
| * @LastEditTime: 2021-07-14 15:37:23 | |||
| * @FilePath: /forgeplus/app/docs/slate/source/includes/_public_keys.md | |||
| --> | |||
| # PublicKeys | |||
| ## public_keys列表 | |||
| 获取public_keys列表,支持分页 | |||
| > 示例: | |||
| ```shell | |||
| curl -X GET \ | |||
| http://localhost:3000/api/public_keys.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('GET /api/public_keys.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `GET api/public_keys.json` | |||
| ### 请求参数 | |||
| 参数 | 必选 | 默认 | 类型 | 字段说明 | |||
| --------- | ------- | ------- | -------- | ---------- | |||
| page |否| 1 | int | 页码 | | |||
| limit |否| 15 | int | 每页数量 | | |||
| ### 返回字段说明 | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| total_count |int |总数 | | |||
| public_keys.id |int |ID| | |||
| public_keys.name |string|密钥标题| | |||
| public_keys.content |string|密钥内容| | |||
| public_keys.fingerprint |string|密钥标识| | |||
| public_keys.created_time |string|密钥创建时间| | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "total_count": 1, | |||
| "public_keys": [ | |||
| { | |||
| "id": 16, | |||
| "name": "xxx", | |||
| "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com", | |||
| "fingerprint": "SHA256:cU8AK/+roqUUyiaYXIdS2Nj4+Rb2p6rqWSeRDc+aqKM", | |||
| "created_unix": 1626246596, | |||
| "created_time": "2021/07/14 15:09" | |||
| } | |||
| ] | |||
| } | |||
| ``` | |||
| <aside class="success"> | |||
| Success — a happy kitten is an authenticated kitten! | |||
| </aside> | |||
| ## 创建public_key | |||
| 创建public_key | |||
| > 示例: | |||
| ```shell | |||
| curl -X POST \ | |||
| http://localhost:3000/api/public_keys.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('POST /api/public_keys.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `POST api/public_keys.json` | |||
| ### 请求参数 | |||
| 参数 | 必选 | 默认 | 类型 | 字段说明 | |||
| --------- | ------- | ------- | -------- | ---------- | |||
| key |是 | 否 | string | 密钥 | | |||
| title |是 | 否 | string | 密钥标题 | | |||
| > 请求的JSON示例: | |||
| ```json | |||
| { | |||
| "public_key": { | |||
| "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com", | |||
| "title": "xxx" | |||
| } | |||
| } | |||
| ``` | |||
| ### 返回字段说明 | |||
| 参数 | 类型 | 字段说明 | |||
| --------- | ----------- | ----------- | |||
| total_count |int |总数 | | |||
| id |int |ID| | |||
| name |string|密钥标题| | |||
| content |string|密钥内容| | |||
| fingerprint |string|密钥标识| | |||
| created_time |string|密钥创建时间| | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "id": 17, | |||
| "name": "xxx", | |||
| "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com", | |||
| "fingerprint": "SHA256:cU8AK/+roqUUyiaYXIdS2Nj4+Rb2p6rqWSeRDc+aqKM", | |||
| "created_time": "2021/07/14 15:26" | |||
| } | |||
| ``` | |||
| <aside class="success"> | |||
| Success — a happy kitten is an authenticated kitten! | |||
| </aside> | |||
| ## 删除public_key | |||
| 删除public_key | |||
| > 示例: | |||
| ```shell | |||
| curl -X DELETE \ | |||
| http://localhost:3000/api/public_keys/:id.json | |||
| ``` | |||
| ```javascript | |||
| await octokit.request('DELETE /api/public_keys/:id.json') | |||
| ``` | |||
| ### HTTP 请求 | |||
| `DELETE api/public_keys/:id.json` | |||
| ### 请求参数 | |||
| 参数 | 必选 | 默认 | 类型 | 字段说明 | |||
| --------- | ------- | ------- | -------- | ---------- | |||
| id |是 | 否 | int | 密钥ID | | |||
| > 返回的JSON示例: | |||
| ```json | |||
| { | |||
| "status": 0, | |||
| "message": "success" | |||
| } | |||
| ``` | |||
| <aside class="success"> | |||
| Success — a happy kitten is an authenticated kitten! | |||
| </aside> | |||
| @@ -10,7 +10,7 @@ module RepositoriesHelper | |||
| end | |||
| def download_type(str) | |||
| default_type = %w(xlsx xls ppt pptx pdf zip 7z rar exe pdb obj idb png jpg gif tif psd svg RData rdata doc docx mpp vsdx dot) | |||
| default_type = %w(xlsx xls ppt pptx pdf zip 7z rar exe pdb obj idb png jpg gif tif psd svg RData rdata doc docx mpp vsdx dot otf eot ttf woff woff2) | |||
| default_type.include?(str&.downcase) | |||
| end | |||
| @@ -82,7 +82,9 @@ module RepositoriesHelper | |||
| readme_render_decode64_content(content, path) | |||
| else | |||
| file_type = entry['name'].to_s.split(".").last | |||
| return entry['content'] if download_type(file_type) | |||
| if download_type(file_type) | |||
| return entry['content'].nil? ? Gitea::Repository::Entries::GetService.call(owner, repo.identifier, entry['path'], ref: ref)['content'] : entry['content'] | |||
| end | |||
| render_decode64_content(entry['content']) | |||
| end | |||
| end | |||
| @@ -94,15 +96,16 @@ module RepositoriesHelper | |||
| end | |||
| def render_download_image_url(dir_path, file_path, content) | |||
| full_path = file_path.starts_with?("/") ? [dir_path, file_path].join("") : [dir_path, file_path].join("/") | |||
| file_name = full_path.split("/")[-1] | |||
| # 用户名/项目标识/文件路径 | |||
| dir_path = generate_dir_path(dir_path) | |||
| dir_path = generate_dir_path(full_path.split("/"+file_name)[0]) | |||
| file_path = [dir_path, file_path].join('/') | |||
| file_path = [dir_path, file_name].join('/') | |||
| puts "##### render_download_image_url file_path: #{file_path}" | |||
| base64_to_image(file_path, content) | |||
| file_path = file_path.split('public')[1] | |||
| file_path = file_path[6..-1] | |||
| File.join(base_url, file_path) | |||
| end | |||
| @@ -0,0 +1,9 @@ | |||
| class Gitea::PublicKey < Gitea::Base | |||
| self.inheritance_column = nil # FIX The single-table inheritance mechanism failed | |||
| # establish_connection :gitea_db | |||
| self.table_name = "public_key" | |||
| belongs_to :user, class_name: '::User', foreign_key: :gitea_uid, primary_key: :owner_id, optional: true | |||
| end | |||
| @@ -169,6 +169,7 @@ class User < Owner | |||
| accepts_nested_attributes_for :is_pinned_projects | |||
| has_many :issues, dependent: :destroy, foreign_key: :author_id | |||
| has_many :pull_requests, dependent: :destroy | |||
| has_many :public_keys, class_name: "Gitea::PublicKey",primary_key: :gitea_uid, foreign_key: :owner_id, dependent: :destroy | |||
| # Groups and active users | |||
| scope :active, lambda { where(status: STATUS_ACTIVE) } | |||
| @@ -0,0 +1,21 @@ | |||
| class Gitea::User::Keys::CreateService < Gitea::ClientService | |||
| attr_reader :token, :params | |||
| def initialize(token, params) | |||
| @token = token | |||
| @params = params | |||
| end | |||
| def call | |||
| response = post(url, request_params) | |||
| render_response(response) | |||
| end | |||
| private | |||
| def request_params | |||
| Hash.new.merge({token: token, data: params}) | |||
| end | |||
| def url | |||
| '/user/keys'.freeze | |||
| end | |||
| end | |||
| @@ -0,0 +1,22 @@ | |||
| class Gitea::User::Keys::DeleteService < Gitea::ClientService | |||
| attr_reader :token, :key_id | |||
| def initialize(token, key_id) | |||
| @token = token | |||
| @key_id = key_id | |||
| end | |||
| def call | |||
| delete(url, params) | |||
| end | |||
| private | |||
| def params | |||
| Hash.new.merge(token: token) | |||
| end | |||
| def url | |||
| "/user/keys/#{key_id}".freeze | |||
| end | |||
| end | |||
| @@ -0,0 +1,22 @@ | |||
| class Gitea::User::Keys::GetService < Gitea::ClientService | |||
| attr_reader :token, :key_id | |||
| def initialize(token, key_id) | |||
| @token = token | |||
| @key_id = key_id | |||
| end | |||
| def call | |||
| response = get(url, params) | |||
| render_response(response) | |||
| end | |||
| private | |||
| def params | |||
| Hash.new.merge({token: token}) | |||
| end | |||
| def url | |||
| "/user/keys/#{key_id}".freeze | |||
| end | |||
| end | |||
| @@ -0,0 +1,26 @@ | |||
| class Gitea::User::Keys::ListService < Gitea::ClientService | |||
| attr_reader :token, :page, :limit, :fingerprint | |||
| def initialize(token, page, limit, fingerprint="") | |||
| @token = token | |||
| @page = page | |||
| @limit = limit | |||
| @fingerprint = fingerprint | |||
| end | |||
| def call | |||
| response = get(url, params) | |||
| render_response(response) | |||
| end | |||
| private | |||
| def params | |||
| Hash.new.merge({token: token, fingerprint: fingerprint, page: page, limit: limit}) | |||
| end | |||
| def url | |||
| '/user/keys'.freeze | |||
| end | |||
| end | |||
| @@ -0,0 +1,5 @@ | |||
| json.id @public_key["id"] | |||
| json.name @public_key["title"] | |||
| json.content @public_key["key"] | |||
| json.fingerprint @public_key["fingerprint"] | |||
| json.created_time @public_key["created_at"].to_time.strftime("%Y/%m/%d %H:%M") | |||
| @@ -0,0 +1,5 @@ | |||
| json.total_count @public_keys.total_count | |||
| json.public_keys @public_keys do |public_key| | |||
| json.(public_key, :id, :name, :content, :fingerprint, :created_unix) | |||
| json.created_time Time.at(public_key.created_unix).strftime("%Y/%m/%d %H:%M") | |||
| end | |||
| @@ -71,6 +71,8 @@ Rails.application.routes.draw do | |||
| # end | |||
| end | |||
| resources :public_keys, only: [:index, :create, :destroy] | |||
| resources :statistic, only: [:index] do | |||
| collection do | |||
| get :platform_profile | |||
| @@ -325,6 +325,20 @@ | |||
| </li> | |||
| </ul> | |||
| </li> | |||
| <li> | |||
| <a href="#publickeys" class="toc-h1 toc-link" data-title="PublicKeys">PublicKeys</a> | |||
| <ul class="toc-list-h2"> | |||
| <li> | |||
| <a href="#public_keys" class="toc-h2 toc-link" data-title="public_keys列表">public_keys列表</a> | |||
| </li> | |||
| <li> | |||
| <a href="#public_key" class="toc-h2 toc-link" data-title="创建public_key">创建public_key</a> | |||
| </li> | |||
| <li> | |||
| <a href="#public_key-2" class="toc-h2 toc-link" data-title="删除public_key">删除public_key</a> | |||
| </li> | |||
| </ul> | |||
| </li> | |||
| <li> | |||
| <a href="#users" class="toc-h1 toc-link" data-title="Users">Users</a> | |||
| <ul class="toc-list-h2"> | |||
| @@ -626,6 +640,251 @@ http://localhost:3000/api/ignores.json | |||
| <aside class="success"> | |||
| Success — a happy kitten is an authenticated kitten! | |||
| </aside> | |||
| <!-- | |||
| * @Date: 2021-07-14 15:10:29 | |||
| * @LastEditors: viletyy | |||
| * @LastEditTime: 2021-07-14 15:37:23 | |||
| * @FilePath: /forgeplus/app/docs/slate/source/includes/_public_keys.md | |||
| --> | |||
| <h1 id='publickeys'>PublicKeys</h1><h2 id='public_keys'>public_keys列表</h2> | |||
| <p>获取public_keys列表,支持分页</p> | |||
| <blockquote> | |||
| <p>示例:</p> | |||
| </blockquote> | |||
| <div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> GET <span class="se">\</span> | |||
| http://localhost:3000/api/public_keys.json | |||
| </code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET /api/public_keys.json</span><span class="dl">'</span><span class="p">)</span> | |||
| </code></pre></div><h3 id='http'>HTTP 请求</h3> | |||
| <p><code>GET api/public_keys.json</code></p> | |||
| <h3 id='1f9ac54b15'>请求参数</h3> | |||
| <table><thead> | |||
| <tr> | |||
| <th>参数</th> | |||
| <th>必选</th> | |||
| <th>默认</th> | |||
| <th>类型</th> | |||
| <th>字段说明</th> | |||
| </tr> | |||
| </thead><tbody> | |||
| <tr> | |||
| <td>page</td> | |||
| <td>否</td> | |||
| <td>1</td> | |||
| <td>int</td> | |||
| <td>页码</td> | |||
| </tr> | |||
| <tr> | |||
| <td>limit</td> | |||
| <td>否</td> | |||
| <td>15</td> | |||
| <td>int</td> | |||
| <td>每页数量</td> | |||
| </tr> | |||
| </tbody></table> | |||
| <h3 id='b302a98fa6'>返回字段说明</h3> | |||
| <table><thead> | |||
| <tr> | |||
| <th>参数</th> | |||
| <th>类型</th> | |||
| <th>字段说明</th> | |||
| </tr> | |||
| </thead><tbody> | |||
| <tr> | |||
| <td>total_count</td> | |||
| <td>int</td> | |||
| <td>总数</td> | |||
| </tr> | |||
| <tr> | |||
| <td>public_keys.id</td> | |||
| <td>int</td> | |||
| <td>ID</td> | |||
| </tr> | |||
| <tr> | |||
| <td>public_keys.name</td> | |||
| <td>string</td> | |||
| <td>密钥标题</td> | |||
| </tr> | |||
| <tr> | |||
| <td>public_keys.content</td> | |||
| <td>string</td> | |||
| <td>密钥内容</td> | |||
| </tr> | |||
| <tr> | |||
| <td>public_keys.fingerprint</td> | |||
| <td>string</td> | |||
| <td>密钥标识</td> | |||
| </tr> | |||
| <tr> | |||
| <td>public_keys.created_time</td> | |||
| <td>string</td> | |||
| <td>密钥创建时间</td> | |||
| </tr> | |||
| </tbody></table> | |||
| <blockquote> | |||
| <p>返回的JSON示例:</p> | |||
| </blockquote> | |||
| <div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w"> | |||
| </span><span class="nl">"total_count"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"public_keys"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> | |||
| </span><span class="p">{</span><span class="w"> | |||
| </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">16</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"xxx"</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com"</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"fingerprint"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SHA256:cU8AK/+roqUUyiaYXIdS2Nj4+Rb2p6rqWSeRDc+aqKM"</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"created_unix"</span><span class="p">:</span><span class="w"> </span><span class="mi">1626246596</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"created_time"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2021/07/14 15:09"</span><span class="w"> | |||
| </span><span class="p">}</span><span class="w"> | |||
| </span><span class="p">]</span><span class="w"> | |||
| </span><span class="p">}</span><span class="w"> | |||
| </span></code></pre></div> | |||
| <aside class="success"> | |||
| Success — a happy kitten is an authenticated kitten! | |||
| </aside> | |||
| <h2 id='public_key'>创建public_key</h2> | |||
| <p>创建public_key</p> | |||
| <blockquote> | |||
| <p>示例:</p> | |||
| </blockquote> | |||
| <div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> POST <span class="se">\</span> | |||
| http://localhost:3000/api/public_keys.json | |||
| </code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/public_keys.json</span><span class="dl">'</span><span class="p">)</span> | |||
| </code></pre></div><h3 id='http-2'>HTTP 请求</h3> | |||
| <p><code>POST api/public_keys.json</code></p> | |||
| <h3 id='1f9ac54b15-2'>请求参数</h3> | |||
| <table><thead> | |||
| <tr> | |||
| <th>参数</th> | |||
| <th>必选</th> | |||
| <th>默认</th> | |||
| <th>类型</th> | |||
| <th>字段说明</th> | |||
| </tr> | |||
| </thead><tbody> | |||
| <tr> | |||
| <td>key</td> | |||
| <td>是</td> | |||
| <td>否</td> | |||
| <td>string</td> | |||
| <td>密钥</td> | |||
| </tr> | |||
| <tr> | |||
| <td>title</td> | |||
| <td>是</td> | |||
| <td>否</td> | |||
| <td>string</td> | |||
| <td>密钥标题</td> | |||
| </tr> | |||
| </tbody></table> | |||
| <blockquote> | |||
| <p>请求的JSON示例: | |||
| <code>json | |||
| { | |||
| "public_key": { | |||
| "key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com", | |||
| "title": "xxx" | |||
| } | |||
| } | |||
| </code></p> | |||
| </blockquote> | |||
| <h3 id='b302a98fa6-2'>返回字段说明</h3> | |||
| <table><thead> | |||
| <tr> | |||
| <th>参数</th> | |||
| <th>类型</th> | |||
| <th>字段说明</th> | |||
| </tr> | |||
| </thead><tbody> | |||
| <tr> | |||
| <td>total_count</td> | |||
| <td>int</td> | |||
| <td>总数</td> | |||
| </tr> | |||
| <tr> | |||
| <td>id</td> | |||
| <td>int</td> | |||
| <td>ID</td> | |||
| </tr> | |||
| <tr> | |||
| <td>name</td> | |||
| <td>string</td> | |||
| <td>密钥标题</td> | |||
| </tr> | |||
| <tr> | |||
| <td>content</td> | |||
| <td>string</td> | |||
| <td>密钥内容</td> | |||
| </tr> | |||
| <tr> | |||
| <td>fingerprint</td> | |||
| <td>string</td> | |||
| <td>密钥标识</td> | |||
| </tr> | |||
| <tr> | |||
| <td>created_time</td> | |||
| <td>string</td> | |||
| <td>密钥创建时间</td> | |||
| </tr> | |||
| </tbody></table> | |||
| <blockquote> | |||
| <p>返回的JSON示例:</p> | |||
| </blockquote> | |||
| <div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w"> | |||
| </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">17</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"xxx"</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"content"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDe5ETOTB5PcmcYJkIhfF7+mxmJQDCLg7/LnMoKHpKoo/jYUnFU9OjfsxVo3FTNUvh2475WXMAur5KsFoNKjK9+JHxvoXyJKmyVPWgXU/NRxQyaWPnPLPK8qPRF5ksJE6feBOqtsdxsvBiHs2r1NX/U26Ecnpr6avudD0cmyrEfbYMWbupLrhsd39dswPT73f3W5jc7B9Y47Ioiv8UOju3ABt1+kpuAjaaVC6VtUQoEFiZb1y33yBnyePya7dvFyApyD4ILyyIG2rtZWK7l53YFnwZDuFsTWjEEEQD0U4FBSFdH5wtwx0WQLMSNyTtaFBSG0kJ+uiQQIrxlvikcm63df7zbC3/rWLPsKgW122Zt966dcpFqiCiJNDKZPPw3qpg8TBL6X+qIZ+FxVEk/16/zScpyEfoxQp0GvgxI7hPLErmfkC5tMsib8MAXYBNyvJXna0vg/wOaNNIaI4SAH9Ksh3f/TtalYVjp6WxIwVBfnbq51WnmlnEXePtX6XjAGL+GbF2VQ1nv/IzrY09tNbTV6wQsrSIP3VDzYQxdJ1rdsVNMoJB0H2Pu0NdcSz53Wx45N+myD0QnE05ss+zDp5StY90OYsx2aCo6qAA8Qn2jUjdta7MQWwkPfKrta4tTQ0XbWMjx4/E1+l3J5liwZkl2XOGOwhfXdRsBjaEziZ18kQ== yystopf@163.com"</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"fingerprint"</span><span class="p">:</span><span class="w"> </span><span class="s2">"SHA256:cU8AK/+roqUUyiaYXIdS2Nj4+Rb2p6rqWSeRDc+aqKM"</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"created_time"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2021/07/14 15:26"</span><span class="w"> | |||
| </span><span class="p">}</span><span class="w"> | |||
| </span></code></pre></div> | |||
| <aside class="success"> | |||
| Success — a happy kitten is an authenticated kitten! | |||
| </aside> | |||
| <h2 id='public_key-2'>删除public_key</h2> | |||
| <p>删除public_key</p> | |||
| <blockquote> | |||
| <p>示例:</p> | |||
| </blockquote> | |||
| <div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> DELETE <span class="se">\</span> | |||
| http://localhost:3000/api/public_keys/:id.json | |||
| </code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">DELETE /api/public_keys/:id.json</span><span class="dl">'</span><span class="p">)</span> | |||
| </code></pre></div><h3 id='http-3'>HTTP 请求</h3> | |||
| <p><code>DELETE api/public_keys/:id.json</code></p> | |||
| <h3 id='1f9ac54b15-3'>请求参数</h3> | |||
| <table><thead> | |||
| <tr> | |||
| <th>参数</th> | |||
| <th>必选</th> | |||
| <th>默认</th> | |||
| <th>类型</th> | |||
| <th>字段说明</th> | |||
| </tr> | |||
| </thead><tbody> | |||
| <tr> | |||
| <td>id</td> | |||
| <td>是</td> | |||
| <td>否</td> | |||
| <td>int</td> | |||
| <td>密钥ID</td> | |||
| </tr> | |||
| </tbody></table> | |||
| <blockquote> | |||
| <p>返回的JSON示例:</p> | |||
| </blockquote> | |||
| <div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w"> | |||
| </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> | |||
| </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"> | |||
| </span><span class="p">}</span><span class="w"> | |||
| </span></code></pre></div> | |||
| <aside class="success"> | |||
| Success — a happy kitten is an authenticated kitten! | |||
| </aside> | |||
| <!-- | |||
| * @Date: 2021-03-01 10:35:21 | |||
| * @LastEditors: viletyy | |||