From c2b5e87d2f901432430a017a735b8dfc97c5d17b Mon Sep 17 00:00:00 2001 From: Pavel Date: Wed, 12 Jun 2024 16:26:49 +0300 Subject: [PATCH] update amo queries --- dal/db_query/queries.sql | 135 ++++++++++++++-------------------- dal/schema/000014_init.up.sql | 5 +- model/amo.go | 51 ++++++------- 3 files changed, 82 insertions(+), 109 deletions(-) diff --git a/dal/db_query/queries.sql b/dal/db_query/queries.sql index 47181e4..c79806f 100644 --- a/dal/db_query/queries.sql +++ b/dal/db_query/queries.sql @@ -686,8 +686,8 @@ RETURNING quiz_id; -- amo methods: -- name: CreateAmoAccount :exec -INSERT INTO users (AccountID, AmoID, Name, Email, Role, "Group", Deleted, CreatedAt, Subdomain, AmoUserID, Country,DriveURL) -VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12); +INSERT INTO accountsAmo (AccountID, AmoID,Name, Subdomain, Country,DriveURL) +VALUES ($1, $2, $3, $4, $5, $6); -- name: CreateWebHook :exec INSERT INTO tokens (AccountID, RefreshToken, AccessToken, AuthCode, Expiration, CreatedAt) @@ -704,57 +704,73 @@ SELECT * FROM tokens; SELECT * FROM tokens WHERE Expiration <= TO_TIMESTAMP(EXTRACT(EPOCH FROM NOW()) + (10 * 60)); -- name: WebhookDelete :exec -WITH userd AS ( - UPDATE users SET Deleted = true WHERE AmoUserID = $1 RETURNING AccountID +WITH companyDel AS ( + UPDATE accountsAmo SET Deleted = true WHERE AmoID = $1 RETURNING AccountID +), +userDel AS ( +UPDATE usersAmo SET Deleted = true WHERE AmoID = $1 ) -DELETE FROM tokens WHERE AccountID IN (SELECT AccountID FROM userd); +DELETE FROM tokens WHERE AccountID IN (SELECT AccountID FROM companyDel); -- name: SoftDeleteAccount :exec -WITH userd AS ( - SELECT AmoUserID FROM users WHERE users.AccountID = $1 -), - tokend AS ( - UPDATE users SET Deleted = true WHERE AmoUserID IN (SELECT AmoUserID FROM userd) - ) +WITH amoCompany AS ( + SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $1 +),usersDel AS ( + UPDATE usersAmo SET Deleted = true WHERE AmoID = (SELECT AmoID FROM amoCompany) + ), + companyDel AS ( UPDATE accountsAmo SET Deleted = true WHERE AmoID = (SELECT AmoID FROM amoCompany) + ) DELETE FROM tokens WHERE tokens.AccountID = $1; --- name: GetCurrentAccount :one -SELECT * FROM users WHERE AccountID = $1 AND Deleted = false; +-- name: GetCurrentCompany :one +SELECT * FROM accountsAmo WHERE AccountID = $1 AND Deleted = false; --- name: CheckMainUser :exec -UPDATE users SET Name = $1, "Group" = $2, Email = $3, Role = $4 WHERE AmoID = $5; +-- name: GetAllCompanyUsers :many +SELECT * FROM usersamo WHERE amoid = $2 AND deleted = false; -- name: GetUsersWithPagination :many WITH user_data AS ( - SELECT AmoID FROM users WHERE users.AccountID = $1 AND Deleted = false + SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $1 AND accountsAmo.Deleted = false ) -SELECT u.*, COUNT(*) OVER() as total_count -FROM users u -JOIN user_data a ON u.AmoUserID = a.AmoID +SELECT u.*, COUNT(*) OVER() as total_count +FROM usersAmo u + JOIN user_data a ON u.AmoID = a.AmoID WHERE u.Deleted = false ORDER BY u.ID OFFSET ($2 - 1) * $3 LIMIT $3; -- name: GetTagsWithPagination :many +WITH user_data AS ( + SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $1 AND accountsAmo.Deleted = false +) SELECT t.*, COUNT(*) OVER() as total_count -FROM tags t JOIN (SELECT AmoID FROM users WHERE users.AccountID = $1 AND Deleted = false) u ON t.AccountID = u.AmoID +FROM tags t JOIN user_data u ON t.AccountID = u.AmoID WHERE t.Deleted = false ORDER BY t.ID OFFSET ($2 - 1) * $3 LIMIT $3; -- name: GetStepsWithPagination :many +WITH user_data AS ( + SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $1 AND accountsAmo.Deleted = false +) SELECT s.*, COUNT(*) OVER() as total_count -FROM steps s JOIN (SELECT AmoID FROM users WHERE users.AccountID = $1 AND Deleted = false) u ON s.AccountID = u.AmoID +FROM steps s JOIN user_data u ON s.AccountID = u.AmoID WHERE s.Deleted = false AND PipelineID = $4 ORDER BY s.ID OFFSET ($2 - 1) * $3 LIMIT $3; -- name: GetPipelinesWithPagination :many +WITH user_data AS ( + SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $1 AND accountsAmo.Deleted = false +) SELECT p.*, COUNT(*) OVER() as total_count -FROM pipelines p JOIN (SELECT AmoID FROM users WHERE users.AccountID = $1 AND Deleted = false) u ON p.AccountID = u.AmoID +FROM pipelines p JOIN user_data u ON p.AccountID = u.AmoID WHERE p.Deleted = false ORDER BY p.ID OFFSET ($2 - 1) * $3 LIMIT $3; -- name: GetFieldsWithPagination :many +WITH user_data AS ( + SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $1 AND accountsAmo.Deleted = false +) SELECT f.*, COUNT(*) OVER() as total_count -FROM fields f JOIN (SELECT AmoID FROM users WHERE users.AccountID = $1 AND Deleted = false) u ON f.AccountID = u.AmoID +FROM fields f JOIN user_data u ON f.AccountID = u.AmoID WHERE f.Deleted = false ORDER BY f.ID OFFSET ($2 - 1) * $3 LIMIT $3; @@ -796,9 +812,7 @@ WHERE f.amoID = (update_data ->> 'AmoID')::INT -- name: CheckTags :many WITH user_data AS ( - SELECT AmoID - FROM users - WHERE users.AccountID = $1 + SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $1 AND accountsAmo.Deleted = false ), new_tags AS ( SELECT (tag->>'AmoID')::INT AS amoID, (tag->>'Entity')::entitytype AS Entity, @@ -857,9 +871,7 @@ WHERE NOT EXISTS ( -- name: CheckFields :many WITH user_data AS ( - SELECT AmoID - FROM users - WHERE users.AccountID = $1 + SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $1 AND accountsAmo.Deleted = false ), new_fields AS ( SELECT (field->>'AmoID')::INT AS amoID, COALESCE(field->>'Code', '')::varchar(255) AS code, @@ -930,13 +942,13 @@ SELECT * FROM rules WHERE QuizID = $1 AND Deleted = false; -- name: SetQuizSettings :one INSERT INTO rules (AccountID, QuizID, PerformerID, PipelineID, StepID, FieldsRule,TagsToAdd) SELECT u.AmoID AS AccountID,$1 AS QuizID,$2 AS PerformerID,$3 AS PipelineID, - $4 AS StepID,$5 AS FieldsRule,$6 AS TagsToAdd FROM users u WHERE u.AccountID = $7 AND u.Deleted = false + $4 AS StepID,$5 AS FieldsRule,$6 AS TagsToAdd FROM accountsamo u WHERE u.AccountID = $7 AND u.Deleted = false RETURNING id; -- name: ChangeQuizSettings :one UPDATE rules SET PerformerID = $1,PipelineID = $2,StepID = $3,FieldsRule = $4, TagsToAdd=$5 -WHERE AccountID = (SELECT AmoID FROM users WHERE users.AccountID = $6 AND users.Deleted = false) AND QuizID = $7 AND Deleted = false +WHERE AccountID = (SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $6 AND accountsAmo.Deleted = false) AND QuizID = $7 AND Deleted = false RETURNING id; -- name: GetQuestionListByIDs :many @@ -944,48 +956,15 @@ SELECT * FROM question WHERE id = ANY($1::int[]) AND deleted = FALSE; -- name: UpdateFieldRules :exec UPDATE rules SET FieldsRule = $1 -WHERE AccountID = (SELECT AmoID FROM users WHERE users.AccountID = $2 AND users.Deleted = false) AND QuizID = $3 AND Deleted = false; +WHERE AccountID = (SELECT AmoID FROM accountsAmo WHERE accountsAmo.AccountID = $2 AND accountsAmo.Deleted = false) AND QuizID = $3 AND Deleted = false; --- name: UpdateUsers :exec -UPDATE users AS u -SET Name = (update_data ->> 'Name')::varchar(512), - Email = (update_data ->> 'Email')::varchar(50), - Role = (update_data ->> 'Role')::INT, - "Group" = (update_data ->> 'Group')::INT, - AmoUserID= (update_data ->> 'AmoUserID')::INT -FROM json_array_elements($1::json) AS update_data -WHERE u.AmoID = (update_data ->> 'AmocrmID')::INT; +-- name: UpdateAmoAccountUser :exec +UPDATE usersAmo SET Name = $3, Email = $4, Role = $5, "Group" = $6 +WHERE AmoID = $1 AND AmoUserID = $2 AND deleted = false; --- name: CheckUsers :many -WITH new_users AS ( - SELECT (u->>'AmocrmID')::INT AS AmoID, - (u->>'Name')::VARCHAR(512) AS Name, - (u->>'Group')::INT AS "Group", - (u->>'Role')::INT AS Role, - (u->>'Email')::VARCHAR(50) AS Email, - (u->>'AmoUserID')::INT AS AmoUserID, - CURRENT_TIMESTAMP AS createdAt - FROM json_array_elements($1::json) AS u -), inserted_users AS ( - INSERT INTO users (AmoID, Name, "Group", Role, Email, AmoUserID,createdAt) - SELECT nu.AmoID, - nu.Name, - nu."Group", - nu.Role, - nu.Email, - nu.AmoUserID, - nu.createdAt - FROM new_users nu - ON CONFLICT (amoID) DO NOTHING - RETURNING * -) -SELECT nu.* -FROM new_users nu -WHERE NOT EXISTS ( - SELECT * - FROM inserted_users ins - WHERE ins.amoID = nu.amoID -); +-- name: AddAmoAccountUser :exec +INSERT INTO usersAmo (AmoID, AmoUserID, Name, Email, Role, "Group", Deleted, CreatedAt) +VALUES ($1, $2, $3, $4, $5, $6, $7, $8); -- name: GettingAmoUsersTrueResults :many SELECT a.quiz_id,a.id,a.result,a.question_id,a.content,a.session, @@ -993,13 +972,13 @@ SELECT a.quiz_id,a.id,a.result,a.question_id,a.content,a.session, FROM answer a2 WHERE a2.start = true AND a2.session = a.session LIMIT 1) AS utm -,t.accesstoken,r.accountid,r.fieldsrule,r.tagstoadd,r.performerid,r.stepid,r.pipelineid,(SELECT u.name FROM users u WHERE u.amoid = r.performerid) AS performer_name,u.subdomain,u.accountid,u.driveurl +,t.accesstoken,r.accountid,r.fieldsrule,r.tagstoadd,r.performerid,r.stepid,r.pipelineid,(SELECT u.name FROM usersAmo u WHERE u.AmoUserID = r.performerid) AS performer_name,u.subdomain,u.accountid,u.driveurl FROM answer a INNER JOIN quiz q ON a.quiz_id = q.id LEFT JOIN amoCRMStatuses s ON a.id = s.AnswerID INNER JOIN rules r ON q.id = r.QuizID INNER JOIN tokens t ON q.accountid = t.AccountID - INNER JOIN users u ON q.accountid = u.accountid AND u.amoid = r.accountid + INNER JOIN accountsAmo u ON q.accountid = u.accountid AND u.amoid = r.accountid WHERE a.result = true AND s.id IS NULL AND a.deleted = false @@ -1011,12 +990,12 @@ WHERE a.result = true INSERT INTO amoCRMStatuses (AccountID, DealID, AnswerID, Status) SELECT u.AmoID, $1, $2, $3 FROM tokens AS t - JOIN users AS u ON t.AccountID = u.AccountID + JOIN accountsAmo AS u ON t.AccountID = u.AccountID WHERE t.AccessToken = $4 AND u.Deleted = false; -- name: UpdatingDealAmoStatus :exec UPDATE amoCRMStatuses SET Status = $1 -WHERE DealID = $2 AND AccountID = (SELECT u.AmoID FROM tokens AS t JOIN users AS u ON t.AccountID = u.AccountID WHERE t.AccessToken = $3 AND u.Deleted = false); +WHERE DealID = $2 AND AccountID = (SELECT u.AmoID FROM tokens AS t JOIN accountsAmo AS u ON t.AccountID = u.AccountID WHERE t.AccessToken = $3 AND u.Deleted = false); -- name: DeleteFields :exec UPDATE fields SET Deleted = true WHERE ID = ANY($1::bigint[]); @@ -1031,7 +1010,7 @@ UPDATE steps SET Deleted = true WHERE ID = ANY($1::bigint[]); UPDATE pipelines SET Deleted = true WHERE ID = ANY($1::bigint[]); -- name: DeleteUsers :exec -UPDATE users SET Deleted = true WHERE ID = ANY($1::bigint[]); +UPDATE usersAmo SET Deleted = true WHERE ID = ANY($1::bigint[]); -- name: GetUserTagsByID :many SELECT ID,AmoID,AccountID,Name,Entity,Color @@ -1049,9 +1028,7 @@ FROM pipelines WHERE AccountID = $1 AND Deleted = false; -- name: GetUserUsersByID :many -SELECT ID,AccountID,AmoID,Name,Email,Role,"Group",Subdomain,AmoUserID,Country -FROM users -WHERE AmoUserID = $1 AND Deleted = false; +SELECT * FROM usersAmo WHERE amoid = $1 AND Deleted = false; -- name: GetFieldByAmoID :one SELECT * FROM fields WHERE AmoID = $1 AND Deleted = false; diff --git a/dal/schema/000014_init.up.sql b/dal/schema/000014_init.up.sql index 9cce9b1..b0ba982 100644 --- a/dal/schema/000014_init.up.sql +++ b/dal/schema/000014_init.up.sql @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS accountsAmo ( AmoID INT NOT NULL, -- ID "компании" в амо Name VARCHAR(512) NOT NULL DEFAULT '', Deleted BOOLEAN NOT NULL DEFAULT FALSE, - CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, Subdomain VARCHAR(50) NOT NULL DEFAULT '', -- поддомен - пример https://penadigitaltech.amocrm.ru Country VARCHAR(50) NOT NULL DEFAULT '', DriveURL VARCHAR(255) DEFAULT '' -- URL объктного хранилища @@ -24,6 +24,5 @@ CREATE TABLE IF NOT EXISTS usersAmo ( Role INT NOT NULL DEFAULT 0, "Group" INT NOT NULL DEFAULT 0, Deleted BOOLEAN NOT NULL DEFAULT FALSE, - CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (AmoID) REFERENCES accountsAmo(AmoID) + CreatedAt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); \ No newline at end of file diff --git a/model/amo.go b/model/amo.go index b5bf0ea..2c9287e 100644 --- a/model/amo.go +++ b/model/amo.go @@ -1,32 +1,29 @@ package model -type User struct { - /* - айдишник в нашей системе Primary Key*/ - ID int64 `json:"ID"` - /* - id пользователя из токена в нашей системе*/ - Accountid string `json:"AccountID"` - /* - айдишник пользователя в амо*/ - AmoID int32 `json:"AmocrmID"` - /* - имя аккаунта в амо*/ - Name string `json:"Name"` - /* - почта пользователя из амо*/ - Email string `json:"Email"` - /* - роль пользователя в амо*/ - Role int32 `json:"Role"` - /* - группы пользователя в амо*/ - Group int32 `json:"Group"` - /* - флаг мягкого удаления*/ - Deleted bool `json:"Deleted"` - /* - таймштамп создания аккаунта*/ - Createdat int64 `json:"CreatedAt"` - /* - поддомен организации в амо*/ - Subdomain string `json:"Subdomain"` - /* - айдишник пользвателя, который подключал интеграцию*/ - Amouserid int32 `json:"AmoUserID"` - /* - страна указанная в настройках амо*/ - Country string `json:"Country"` - // урл объектного хранилища пользователя в амо - DriveURL string `json:"DriveURL"` +import "time" + +type AmoAccountUser struct { + ID int64 `json:"id"` // ID пользователя + AmoID int32 `json:"amoID"` // ID компании в амо, к которой пользователь принадлежит + AmoUserID int32 `json:"amoUserID"` // ID пользователя в амо + Name string `json:"name"` // Имя + Email string `json:"email"` // Email + Role int32 `json:"role"` // Роль + Group int32 `json:"group"` // Группа + Deleted bool `json:"deleted"` + CreatedAt time.Time `json:"createdAt"` +} + +type AmoAccount struct { + ID int64 `json:"id"` // ID компании + AccountID string `json:"accountID"` // ID аккаунта нас + AmoID int32 `json:"amoID"` // ID компании в амо + Name string `json:"name"` // Название + Deleted bool `json:"deleted"` + CreatedAt time.Time `json:"createdAt"` + Subdomain string `json:"subdomain"` // поддомен + Country string `json:"country"` // Страна + DriveURL string `json:"driveURL"` // URL объктного хранилища } type UserGroups struct {