| @@ -74,6 +74,7 @@ vendor/bundle/ | |||||
| /log | /log | ||||
| /public/admin | /public/admin | ||||
| /mysql_data | /mysql_data | ||||
| /public/repo/ | |||||
| .generators | .generators | ||||
| @@ -48,6 +48,6 @@ class CompareController < ApplicationController | |||||
| end | end | ||||
| def gitea_compare(base, head) | 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 | ||||
| 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: | includes: | ||||
| - licenses | - licenses | ||||
| - gitignores | - gitignores | ||||
| - public_keys | |||||
| - users | - users | ||||
| - projects | - projects | ||||
| - repositories | - 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 | end | ||||
| def download_type(str) | 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) | default_type.include?(str&.downcase) | ||||
| end | end | ||||
| @@ -82,7 +82,9 @@ module RepositoriesHelper | |||||
| readme_render_decode64_content(content, path) | readme_render_decode64_content(content, path) | ||||
| else | else | ||||
| file_type = entry['name'].to_s.split(".").last | 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']) | render_decode64_content(entry['content']) | ||||
| end | end | ||||
| end | end | ||||
| @@ -94,15 +96,16 @@ module RepositoriesHelper | |||||
| end | end | ||||
| def render_download_image_url(dir_path, file_path, content) | 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}" | puts "##### render_download_image_url file_path: #{file_path}" | ||||
| base64_to_image(file_path, content) | 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) | File.join(base_url, file_path) | ||||
| end | 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 | |||||
| @@ -170,6 +170,7 @@ class User < Owner | |||||
| accepts_nested_attributes_for :is_pinned_projects | accepts_nested_attributes_for :is_pinned_projects | ||||
| has_many :issues, dependent: :destroy, foreign_key: :author_id | has_many :issues, dependent: :destroy, foreign_key: :author_id | ||||
| has_many :pull_requests, dependent: :destroy | 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 | # Groups and active users | ||||
| scope :active, lambda { where(status: [STATUS_ACTIVE, STATUS_EDIT_INFO]) } | scope :active, lambda { where(status: [STATUS_ACTIVE, STATUS_EDIT_INFO]) } | ||||
| @@ -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 | ||||
| end | end | ||||
| resources :public_keys, only: [:index, :create, :destroy] | |||||
| resources :statistic, only: [:index] do | resources :statistic, only: [:index] do | ||||
| collection do | collection do | ||||
| get :platform_profile | get :platform_profile | ||||
| @@ -325,6 +325,20 @@ | |||||
| </li> | </li> | ||||
| </ul> | </ul> | ||||
| </li> | </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> | <li> | ||||
| <a href="#users" class="toc-h1 toc-link" data-title="Users">Users</a> | <a href="#users" class="toc-h1 toc-link" data-title="Users">Users</a> | ||||
| <ul class="toc-list-h2"> | <ul class="toc-list-h2"> | ||||
| @@ -626,6 +640,251 @@ http://localhost:3000/api/ignores.json | |||||
| <aside class="success"> | <aside class="success"> | ||||
| Success — a happy kitten is an authenticated kitten! | Success — a happy kitten is an authenticated kitten! | ||||
| </aside> | </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 | * @Date: 2021-03-01 10:35:21 | ||||
| * @LastEditors: viletyy | * @LastEditors: viletyy | ||||