2016-08-24 22:46:29 +00:00
|
|
|
-- Users ---------------------------------------------------------------------------
|
|
|
|
|
2017-01-15 20:26:33 +00:00
|
|
|
-- :name create-user! :<! :1
|
2016-08-20 21:36:09 +00:00
|
|
|
-- :doc creates a new user record
|
|
|
|
INSERT INTO users
|
2017-02-12 20:25:32 +00:00
|
|
|
(id, login, name, email, avatar_url, token, address, created)
|
2017-01-15 20:26:33 +00:00
|
|
|
SELECT
|
|
|
|
:id,
|
|
|
|
:login,
|
|
|
|
:name,
|
|
|
|
:email,
|
2017-02-12 20:25:32 +00:00
|
|
|
:avatar_url,
|
2017-01-15 20:26:33 +00:00
|
|
|
:token,
|
|
|
|
:address,
|
|
|
|
:created
|
|
|
|
WHERE NOT exists(SELECT 1
|
|
|
|
FROM users
|
|
|
|
WHERE id = :id)
|
2017-02-12 20:25:32 +00:00
|
|
|
RETURNING id, login, name, email, avatar_url, token, address, created;
|
2016-08-20 21:36:09 +00:00
|
|
|
|
|
|
|
-- :name update-user! :! :n
|
2016-08-24 22:46:29 +00:00
|
|
|
-- :doc updates an existing user record
|
2016-08-20 21:36:09 +00:00
|
|
|
UPDATE users
|
2016-08-22 00:22:39 +00:00
|
|
|
SET login = :login, name = :name, email = :email, token = :token, address = :address
|
|
|
|
WHERE id = :id;
|
|
|
|
|
2016-08-24 22:46:29 +00:00
|
|
|
-- :name update-user-token! :<! :1
|
|
|
|
-- :doc updates user token and returns updated user
|
|
|
|
UPDATE users
|
|
|
|
SET token = :token
|
2016-08-28 20:16:45 +00:00
|
|
|
WHERE id = :id
|
2016-08-24 22:46:29 +00:00
|
|
|
RETURNING id, login, name, email, token, address, created;
|
|
|
|
|
2016-08-22 00:22:39 +00:00
|
|
|
-- :name update-user-address! :! :n
|
|
|
|
UPDATE users
|
|
|
|
SET address = :address
|
2016-08-28 20:16:45 +00:00
|
|
|
WHERE id = :id;
|
2016-08-20 21:36:09 +00:00
|
|
|
|
|
|
|
-- :name get-user :? :1
|
2016-08-22 00:22:39 +00:00
|
|
|
-- :doc retrieve a user given the login.
|
|
|
|
SELECT *
|
|
|
|
FROM users
|
2016-08-28 20:16:45 +00:00
|
|
|
WHERE id = :id;
|
2016-08-20 21:36:09 +00:00
|
|
|
|
2016-09-09 00:35:28 +00:00
|
|
|
-- :name get-repo-owner :? :1
|
|
|
|
SELECT *
|
|
|
|
FROM users u
|
|
|
|
INNER JOIN repositories r ON r.user_id = u.id
|
|
|
|
WHERE r.repo_id = :repo_id;
|
|
|
|
|
2016-08-24 22:46:29 +00:00
|
|
|
-- Repositories --------------------------------------------------------------------
|
|
|
|
|
2017-02-18 09:07:51 +00:00
|
|
|
-- :name set-repo-state! :<! :1
|
|
|
|
-- :doc sets repository to given state
|
2016-08-24 22:46:29 +00:00
|
|
|
UPDATE repositories
|
2017-02-18 09:07:51 +00:00
|
|
|
SET state = :state
|
2016-08-24 22:46:29 +00:00
|
|
|
WHERE repo_id = :repo_id
|
2017-02-18 09:07:51 +00:00
|
|
|
RETURNING repo_id, login, repo, state, hook_id;
|
|
|
|
|
|
|
|
|
|
|
|
-- :name get-repo :? :1
|
|
|
|
-- :doc retrieve a repository given login and repo-name
|
|
|
|
SELECT *
|
|
|
|
FROM repositories
|
|
|
|
WHERE login = :login
|
|
|
|
AND repo = :repo;
|
|
|
|
|
2016-08-24 22:46:29 +00:00
|
|
|
|
|
|
|
-- :name create-repository! :<! :1
|
|
|
|
-- :doc creates repository if not exists
|
2017-02-18 09:07:51 +00:00
|
|
|
INSERT INTO repositories (repo_id, user_id, login, repo, state)
|
2016-08-24 22:46:29 +00:00
|
|
|
SELECT
|
|
|
|
:repo_id,
|
2016-08-29 22:03:09 +00:00
|
|
|
:user_id,
|
2016-08-24 22:46:29 +00:00
|
|
|
:login,
|
|
|
|
:repo,
|
2017-02-18 09:07:51 +00:00
|
|
|
:state
|
2016-08-24 22:46:29 +00:00
|
|
|
WHERE NOT exists(SELECT 1
|
|
|
|
FROM repositories
|
|
|
|
WHERE repo_id = :repo_id)
|
2017-02-18 09:07:51 +00:00
|
|
|
RETURNING repo_id, user_id, login, repo, state;
|
2016-08-24 22:46:29 +00:00
|
|
|
|
|
|
|
-- :name get-enabled-repositories :? :*
|
|
|
|
-- :doc returns enabled repositories for a given login
|
|
|
|
SELECT repo_id
|
|
|
|
FROM repositories
|
2017-02-18 09:07:51 +00:00
|
|
|
WHERE user_id = :user_id
|
|
|
|
AND state = 2;
|
|
|
|
|
2016-08-26 01:10:05 +00:00
|
|
|
|
2017-02-18 09:07:51 +00:00
|
|
|
-- :name update-repo-generic :! :n
|
|
|
|
/* :require [clojure.string :as string]
|
|
|
|
[hugsql.parameters :refer [identifier-param-quote]] */
|
2016-08-26 01:10:05 +00:00
|
|
|
UPDATE repositories
|
2017-02-18 09:07:51 +00:00
|
|
|
SET
|
|
|
|
/*~
|
|
|
|
(string/join ","
|
|
|
|
(for [[field _] (:updates params)]
|
|
|
|
(str (identifier-param-quote (name field) options)
|
|
|
|
" = :v:updates." (name field))))
|
|
|
|
~*/
|
|
|
|
where repo_id = :repo_id;
|
|
|
|
|
|
|
|
|
2016-08-28 20:16:45 +00:00
|
|
|
|
|
|
|
-- Issues --------------------------------------------------------------------------
|
|
|
|
|
|
|
|
-- :name create-issue! :! :n
|
|
|
|
-- :doc creates issue
|
2016-09-06 00:18:33 +00:00
|
|
|
INSERT INTO issues (repo_id, issue_id, issue_number, title)
|
2016-08-28 20:16:45 +00:00
|
|
|
SELECT
|
|
|
|
:repo_id,
|
|
|
|
:issue_id,
|
|
|
|
:issue_number,
|
2016-09-06 00:18:33 +00:00
|
|
|
:title
|
2016-08-28 20:16:45 +00:00
|
|
|
WHERE NOT exists(SELECT 1
|
|
|
|
FROM issues
|
|
|
|
WHERE repo_id = :repo_id AND issue_id = :issue_id);
|
|
|
|
|
|
|
|
-- :name close-issue! :<! :1
|
|
|
|
-- :doc updates issue with commit id
|
|
|
|
UPDATE issues
|
|
|
|
SET commit_id = :commit_id
|
|
|
|
WHERE issue_id = :issue_id
|
2016-09-06 00:18:33 +00:00
|
|
|
RETURNING repo_id, issue_id, issue_number, title, commit_id, contract_address;
|
|
|
|
|
|
|
|
-- :name update-transaction-hash :! :n
|
|
|
|
-- :doc updates transaction-hash for a given issue
|
|
|
|
UPDATE issues
|
|
|
|
SET transaction_hash = :transaction_hash
|
|
|
|
WHERE issue_id = :issue_id;
|
|
|
|
|
2016-09-07 00:20:17 +00:00
|
|
|
-- :name update-contract-address :<! :1
|
2016-09-06 00:18:33 +00:00
|
|
|
-- :doc updates contract-address for a given issue
|
2016-09-07 00:20:17 +00:00
|
|
|
WITH t AS (
|
|
|
|
SELECT
|
|
|
|
i.issue_id AS issue_id,
|
|
|
|
i.issue_number AS issue_number,
|
|
|
|
i.title AS title,
|
|
|
|
i.transaction_hash AS transaction_hash,
|
|
|
|
i.contract_address AS contract_address,
|
2016-09-09 00:35:28 +00:00
|
|
|
i.repo_id AS repo_id,
|
2016-09-07 00:20:17 +00:00
|
|
|
r.login AS login,
|
|
|
|
r.repo AS repo
|
|
|
|
FROM issues i
|
|
|
|
INNER JOIN repositories r ON r.repo_id = i.repo_id
|
|
|
|
WHERE i.issue_id = :issue_id
|
|
|
|
)
|
|
|
|
UPDATE issues i
|
2016-09-06 00:18:33 +00:00
|
|
|
SET contract_address = :contract_address
|
2016-09-07 00:20:17 +00:00
|
|
|
FROM t
|
2016-09-19 21:43:32 +00:00
|
|
|
WHERE i.issue_id = :issue_id
|
|
|
|
RETURNING t.issue_id, t.issue_number, t.title, t.transaction_hash, i.contract_address, t.login, t.repo, t.repo_id;
|
2016-09-06 00:18:33 +00:00
|
|
|
|
2016-09-12 16:50:32 +00:00
|
|
|
-- :name update-comment-id :! :n
|
2016-09-12 16:44:29 +00:00
|
|
|
-- :doc updates comment-id for a given issue
|
|
|
|
UPDATE issues
|
|
|
|
SET comment_id = :comment_id
|
|
|
|
WHERE issue_id = :issue_id;
|
|
|
|
|
2016-09-06 00:18:33 +00:00
|
|
|
-- :name list-pending-deployments :? :*
|
|
|
|
-- :doc retrieves pending transaction ids
|
|
|
|
SELECT
|
|
|
|
issue_id,
|
|
|
|
transaction_hash
|
|
|
|
FROM issues
|
2016-09-18 20:43:38 +00:00
|
|
|
WHERE contract_address IS NULL
|
|
|
|
AND issues.transaction_hash IS NOT NULL;
|
2016-08-28 20:16:45 +00:00
|
|
|
|
|
|
|
-- Pull Requests -------------------------------------------------------------------
|
|
|
|
|
|
|
|
-- :name create-pull-request! :! :n
|
|
|
|
-- :doc creates pull request
|
2016-08-31 23:24:00 +00:00
|
|
|
INSERT INTO pull_requests (repo_id, pr_id, pr_number, issue_number, commit_id, user_id)
|
2016-08-28 20:16:45 +00:00
|
|
|
SELECT
|
|
|
|
:repo_id,
|
|
|
|
:pr_id,
|
2016-08-28 22:16:08 +00:00
|
|
|
:pr_number,
|
2016-08-31 23:24:00 +00:00
|
|
|
:issue_number,
|
2016-08-31 01:49:26 +00:00
|
|
|
:commit_id,
|
2016-08-30 21:45:25 +00:00
|
|
|
:user_id
|
2016-08-28 20:16:45 +00:00
|
|
|
WHERE NOT exists(SELECT 1
|
|
|
|
FROM pull_requests
|
|
|
|
WHERE repo_id = :repo_id AND pr_id = :pr_id);
|
|
|
|
|
|
|
|
-- Bounties ------------------------------------------------------------------------
|
|
|
|
|
2016-09-09 23:06:56 +00:00
|
|
|
-- :name pending-bounties-list :? :*
|
|
|
|
-- :doc lists all recently closed issues awaiting to be signed
|
|
|
|
SELECT
|
|
|
|
i.contract_address AS contract_address,
|
|
|
|
i.issue_id AS issue_id,
|
|
|
|
u.address AS payout_address
|
|
|
|
FROM issues i
|
|
|
|
INNER JOIN pull_requests p
|
|
|
|
ON (p.commit_id = i.commit_id OR coalesce(p.issue_number, -1) = i.issue_number)
|
|
|
|
AND p.repo_id = i.repo_id
|
|
|
|
INNER JOIN users u
|
|
|
|
ON u.id = p.user_id
|
2016-10-01 12:29:18 +00:00
|
|
|
WHERE i.execute_hash IS NULL;
|
|
|
|
|
|
|
|
-- :name pending-payouts-list :? :*
|
|
|
|
-- :doc lists all recently closed issues awaiting to be confirmed
|
|
|
|
SELECT
|
|
|
|
i.contract_address AS contract_address,
|
|
|
|
i.issue_id AS issue_id,
|
|
|
|
i.execute_hash AS execute_hash
|
|
|
|
FROM issues i
|
|
|
|
INNER JOIN pull_requests p
|
|
|
|
ON (p.commit_id = i.commit_id OR coalesce(p.issue_number, -1) = i.issue_number)
|
|
|
|
AND p.repo_id = i.repo_id
|
|
|
|
INNER JOIN users u
|
|
|
|
ON u.id = p.user_id
|
|
|
|
WHERE i.confirm_hash IS NULL
|
|
|
|
AND i.execute_hash IS NOT NULL;
|
2016-09-09 23:06:56 +00:00
|
|
|
|
2016-10-04 00:13:43 +00:00
|
|
|
-- :name confirmed-payouts-list :? :*
|
|
|
|
-- :doc lists all recently confirmed bounty payouts
|
|
|
|
SELECT
|
|
|
|
i.contract_address AS contract_address,
|
|
|
|
i.issue_id AS issue_id,
|
|
|
|
i.payout_hash AS payout_hash
|
|
|
|
FROM issues i
|
|
|
|
INNER JOIN pull_requests p
|
|
|
|
ON (p.commit_id = i.commit_id OR coalesce(p.issue_number, -1) = i.issue_number)
|
|
|
|
AND p.repo_id = i.repo_id
|
|
|
|
INNER JOIN users u
|
|
|
|
ON u.id = p.user_id
|
|
|
|
WHERE i.payout_receipt IS NULL
|
|
|
|
AND i.payout_hash IS NOT NULL;
|
|
|
|
|
2016-09-09 23:06:56 +00:00
|
|
|
-- :name update-confirm-hash :! :n
|
2016-10-01 12:29:18 +00:00
|
|
|
-- :doc updates issue with confirmation hash
|
2016-09-09 23:06:56 +00:00
|
|
|
UPDATE issues
|
|
|
|
SET confirm_hash = :confirm_hash
|
|
|
|
WHERE issue_id = :issue_id;
|
|
|
|
|
2016-10-01 12:29:18 +00:00
|
|
|
-- :name update-execute-hash :! :n
|
|
|
|
-- :doc updates issue with execute transaction hash
|
|
|
|
UPDATE issues
|
|
|
|
SET execute_hash = :execute_hash
|
|
|
|
WHERE issue_id = :issue_id;
|
|
|
|
|
2016-10-04 00:13:43 +00:00
|
|
|
-- :name update-payout-hash :! :n
|
|
|
|
-- :doc updates issue with payout transaction hash
|
|
|
|
UPDATE issues
|
|
|
|
SET payout_hash = :payout_hash
|
|
|
|
WHERE issue_id = :issue_id;
|
|
|
|
|
|
|
|
-- :name update-payout-receipt :! :n
|
|
|
|
-- :doc updates issue with payout transaction receipt
|
|
|
|
UPDATE issues
|
|
|
|
SET payout_receipt = :payout_receipt
|
|
|
|
WHERE issue_id = :issue_id;
|
|
|
|
|
2016-09-19 20:26:57 +00:00
|
|
|
-- :name all-bounties-list :? :*
|
|
|
|
-- :doc lists all issues labeled as 'bounty'
|
|
|
|
SELECT
|
|
|
|
i.contract_address AS contract_address,
|
|
|
|
i.issue_id AS issue_id,
|
|
|
|
i.issue_number AS issue_number,
|
|
|
|
i.title AS issue_title,
|
|
|
|
i.repo_id AS repo_id,
|
|
|
|
i.balance AS issue_balance,
|
|
|
|
r.login AS owner_name,
|
|
|
|
r.repo AS repo_name
|
|
|
|
FROM issues i
|
|
|
|
INNER JOIN repositories r
|
2016-09-29 21:44:51 +00:00
|
|
|
ON r.repo_id = i.repo_id
|
|
|
|
WHERE i.commit_id IS NULL
|
|
|
|
AND NOT EXISTS(SELECT 1
|
|
|
|
FROM pull_requests
|
|
|
|
WHERE issue_number = i.issue_number);
|
2016-09-19 20:26:57 +00:00
|
|
|
|
|
|
|
-- :name owner-bounties-list :? :*
|
2016-08-28 20:16:45 +00:00
|
|
|
-- :doc lists fixed issues
|
|
|
|
SELECT
|
2016-09-06 00:18:33 +00:00
|
|
|
i.contract_address AS contract_address,
|
|
|
|
i.issue_id AS issue_id,
|
|
|
|
i.issue_number AS issue_number,
|
|
|
|
i.title AS issue_title,
|
|
|
|
i.repo_id AS repo_id,
|
2016-09-19 20:26:57 +00:00
|
|
|
i.balance AS balance,
|
2016-09-22 00:44:45 +00:00
|
|
|
i.confirm_hash AS confirm_hash,
|
2016-10-04 00:13:43 +00:00
|
|
|
i.payout_hash AS payout_hash,
|
|
|
|
i.payout_receipt AS payout_receipt,
|
2016-09-06 00:18:33 +00:00
|
|
|
p.pr_id AS pr_id,
|
|
|
|
p.user_id AS user_id,
|
|
|
|
p.pr_number AS pr_number,
|
|
|
|
u.address AS payout_address,
|
|
|
|
u.login AS user_login,
|
|
|
|
u.name AS user_name,
|
|
|
|
r.login AS owner_name,
|
2016-09-22 00:44:45 +00:00
|
|
|
r.repo AS repo_name,
|
|
|
|
o.address AS owner_address
|
2016-08-28 20:16:45 +00:00
|
|
|
FROM issues i
|
|
|
|
INNER JOIN pull_requests p
|
2016-08-30 21:45:25 +00:00
|
|
|
ON (p.commit_id = i.commit_id OR coalesce(p.issue_number, -1) = i.issue_number)
|
2016-08-28 20:16:45 +00:00
|
|
|
AND p.repo_id = i.repo_id
|
|
|
|
INNER JOIN users u
|
|
|
|
ON u.id = p.user_id
|
|
|
|
INNER JOIN repositories r
|
|
|
|
ON r.repo_id = i.repo_id
|
2016-09-22 00:44:45 +00:00
|
|
|
INNER JOIN users o
|
|
|
|
ON r.user_id = o.id
|
2016-09-25 11:49:18 +00:00
|
|
|
WHERE r.user_id = :owner_id
|
|
|
|
AND i.confirm_hash IS NOT NULL;
|
2016-08-28 22:16:08 +00:00
|
|
|
|
2016-09-12 16:44:29 +00:00
|
|
|
-- :name owner-issues-list :? :*
|
|
|
|
-- :doc lists all not yet fixed issues in a given owner's repository
|
2016-08-28 22:16:08 +00:00
|
|
|
SELECT
|
2016-09-06 00:18:33 +00:00
|
|
|
i.contract_address AS contract_address,
|
|
|
|
i.issue_id AS issue_id,
|
|
|
|
i.issue_number AS issue_number,
|
|
|
|
i.title AS issue_title,
|
|
|
|
i.repo_id AS repo_id,
|
|
|
|
r.login AS owner_name,
|
|
|
|
r.repo AS repo_name
|
2016-08-28 22:16:08 +00:00
|
|
|
FROM issues i
|
|
|
|
INNER JOIN repositories r
|
|
|
|
ON r.repo_id = i.repo_id
|
|
|
|
WHERE r.user_id = :owner_id
|
2016-09-12 16:44:29 +00:00
|
|
|
AND i.commit_id IS NULL
|
|
|
|
AND NOT exists(SELECT 1
|
|
|
|
FROM pull_requests
|
|
|
|
WHERE issue_number = i.issue_number);
|
|
|
|
|
2017-02-21 08:49:25 +00:00
|
|
|
-- TODO: misleading name. this is used when updating bounty balances. maybe we should exclude at least bounties that have been paid?
|
|
|
|
|
2016-09-12 16:44:29 +00:00
|
|
|
-- :name wallets-list :? :*
|
|
|
|
-- :doc lists all contract ids
|
|
|
|
SELECT
|
|
|
|
i.contract_address AS contract_address,
|
|
|
|
r.login AS login,
|
|
|
|
r.repo AS repo,
|
|
|
|
i.comment_id AS comment_id,
|
2017-02-21 08:49:25 +00:00
|
|
|
i.issue_number AS issue_number,
|
|
|
|
i.issue_id AS issue_id,
|
|
|
|
i.balance AS balance
|
2016-09-12 16:44:29 +00:00
|
|
|
FROM issues i
|
|
|
|
INNER JOIN repositories r ON r.repo_id = i.repo_id
|
|
|
|
WHERE contract_address IS NOT NULL;
|
2016-09-10 06:50:13 +00:00
|
|
|
|
2017-02-21 08:49:25 +00:00
|
|
|
-- :name get-bounty :? :1
|
2016-09-11 23:15:59 +00:00
|
|
|
SELECT
|
|
|
|
i.contract_address AS contract_address,
|
2017-02-21 08:49:25 +00:00
|
|
|
i.issue_id AS issue_id,
|
2016-09-11 23:15:59 +00:00
|
|
|
i.issue_number AS issue_number,
|
2017-02-21 08:49:25 +00:00
|
|
|
i.balance AS balance,
|
2016-09-11 23:15:59 +00:00
|
|
|
r.login AS login,
|
|
|
|
r.repo AS repo
|
2016-09-10 06:50:13 +00:00
|
|
|
FROM issues i
|
|
|
|
INNER JOIN repositories r ON r.repo_id = i.repo_id
|
|
|
|
WHERE i.issue_number = :issue_number
|
|
|
|
AND r.login = :login AND r.repo = :repo;
|
2016-09-13 16:50:04 +00:00
|
|
|
|
|
|
|
-- :name get-balance :? :1
|
|
|
|
-- :doc gets current balance of a wallet attached to a given issue
|
|
|
|
SELECT balance
|
|
|
|
FROM issues
|
|
|
|
WHERE contract_address = :contract_address;
|
|
|
|
|
2016-09-13 23:29:39 +00:00
|
|
|
-- :name update-balance :! :n
|
2016-09-13 16:50:04 +00:00
|
|
|
-- :doc updates balance of a wallet attached to a given issue
|
|
|
|
UPDATE issues
|
|
|
|
SET balance = :balance
|
|
|
|
WHERE contract_address = :contract_address;
|
2017-02-21 08:49:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- :name save-issue-comment-image! :<! :1
|
|
|
|
INSERT INTO issue_comment (issue_id, png_data)
|
|
|
|
VALUES (:issue_id, :png_data)
|
|
|
|
ON CONFLICT (issue_id) DO UPDATE
|
|
|
|
SET png_data = :png_data
|
|
|
|
RETURNING id;
|
|
|
|
|
|
|
|
|
|
|
|
-- :name get-issue-comment-image :? :1
|
|
|
|
SELECT png_data
|
|
|
|
FROM issue_comment
|
|
|
|
WHERE issue_id = :issue_id;
|