Changes:
- Добавлен group - Все эндпоинты связанные с генерацией перенесены в generator - Другие правки
This commit is contained in:
parent
3d93651f1d
commit
6c3e496dea
@ -1 +0,0 @@
|
|||||||
D-pQFb0jbC3C5gdjuyP3YFabZW-uf9P5CTuGBZcSXgk.R60lE_tZjdCU5kHqzb9jqcJRgM710MzR1I3Gbc654EQ
|
|
@ -1 +0,0 @@
|
|||||||
OxqCK9E4XVUNSU9BhiagctEC43n5aluXb3h14ODYwDo.R60lE_tZjdCU5kHqzb9jqcJRgM710MzR1I3Gbc654EQ
|
|
@ -0,0 +1 @@
|
|||||||
|
UsuZw8fFY2WlbsVOf_8toqgs_KkNkKttA7Z3LjU10YA.R60lE_tZjdCU5kHqzb9jqcJRgM710MzR1I3Gbc654EQ
|
@ -0,0 +1 @@
|
|||||||
|
eZnJdCKTZLB8b9M4buK_b-kNgyhFoJm9EakfR247UZQ.R60lE_tZjdCU5kHqzb9jqcJRgM710MzR1I3Gbc654EQ
|
@ -2,7 +2,6 @@ FROM alpine
|
|||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
ADD amocrm_templategen_back /
|
ADD amocrm_templategen_back /
|
||||||
ADD static static
|
ADD static static
|
||||||
ADD assets assets
|
|
||||||
ADD .well-known .well-known
|
ADD .well-known .well-known
|
||||||
ADD tmp tmp
|
ADD tmp tmp
|
||||||
ENV DOMAIN=tempgen.pena.digital
|
ENV DOMAIN=tempgen.pena.digital
|
||||||
|
5051
assets/css/bootstrap-grid.css
vendored
5051
assets/css/bootstrap-grid.css
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7
assets/css/bootstrap-grid.min.css
vendored
7
assets/css/bootstrap-grid.min.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
5050
assets/css/bootstrap-grid.rtl.css
vendored
5050
assets/css/bootstrap-grid.rtl.css
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7
assets/css/bootstrap-grid.rtl.min.css
vendored
7
assets/css/bootstrap-grid.rtl.min.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
485
assets/css/bootstrap-reboot.css
vendored
485
assets/css/bootstrap-reboot.css
vendored
@ -1,485 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Bootstrap Reboot v5.1.3 (https://getbootstrap.com/)
|
|
||||||
* Copyright 2011-2021 The Bootstrap Authors
|
|
||||||
* Copyright 2011-2021 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
||||||
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
|
|
||||||
*/
|
|
||||||
:root {
|
|
||||||
--bs-blue: #0d6efd;
|
|
||||||
--bs-indigo: #6610f2;
|
|
||||||
--bs-purple: #6f42c1;
|
|
||||||
--bs-pink: #d63384;
|
|
||||||
--bs-red: #dc3545;
|
|
||||||
--bs-orange: #fd7e14;
|
|
||||||
--bs-yellow: #ffc107;
|
|
||||||
--bs-green: #198754;
|
|
||||||
--bs-teal: #20c997;
|
|
||||||
--bs-cyan: #0dcaf0;
|
|
||||||
--bs-white: #fff;
|
|
||||||
--bs-gray: #6c757d;
|
|
||||||
--bs-gray-dark: #343a40;
|
|
||||||
--bs-gray-100: #f8f9fa;
|
|
||||||
--bs-gray-200: #e9ecef;
|
|
||||||
--bs-gray-300: #dee2e6;
|
|
||||||
--bs-gray-400: #ced4da;
|
|
||||||
--bs-gray-500: #adb5bd;
|
|
||||||
--bs-gray-600: #6c757d;
|
|
||||||
--bs-gray-700: #495057;
|
|
||||||
--bs-gray-800: #343a40;
|
|
||||||
--bs-gray-900: #212529;
|
|
||||||
--bs-primary: #0d6efd;
|
|
||||||
--bs-secondary: #6c757d;
|
|
||||||
--bs-success: #198754;
|
|
||||||
--bs-info: #0dcaf0;
|
|
||||||
--bs-warning: #ffc107;
|
|
||||||
--bs-danger: #dc3545;
|
|
||||||
--bs-light: #f8f9fa;
|
|
||||||
--bs-dark: #212529;
|
|
||||||
--bs-primary-rgb: 13, 110, 253;
|
|
||||||
--bs-secondary-rgb: 108, 117, 125;
|
|
||||||
--bs-success-rgb: 25, 135, 84;
|
|
||||||
--bs-info-rgb: 13, 202, 240;
|
|
||||||
--bs-warning-rgb: 255, 193, 7;
|
|
||||||
--bs-danger-rgb: 220, 53, 69;
|
|
||||||
--bs-light-rgb: 248, 249, 250;
|
|
||||||
--bs-dark-rgb: 33, 37, 41;
|
|
||||||
--bs-white-rgb: 255, 255, 255;
|
|
||||||
--bs-black-rgb: 0, 0, 0;
|
|
||||||
--bs-body-color-rgb: 33, 37, 41;
|
|
||||||
--bs-body-bg-rgb: 255, 255, 255;
|
|
||||||
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
|
||||||
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
||||||
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
|
|
||||||
--bs-body-font-family: var(--bs-font-sans-serif);
|
|
||||||
--bs-body-font-size: 1rem;
|
|
||||||
--bs-body-font-weight: 400;
|
|
||||||
--bs-body-line-height: 1.5;
|
|
||||||
--bs-body-color: #212529;
|
|
||||||
--bs-body-bg: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
*,
|
|
||||||
*::before,
|
|
||||||
*::after {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-reduced-motion: no-preference) {
|
|
||||||
:root {
|
|
||||||
scroll-behavior: smooth;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
font-family: var(--bs-body-font-family);
|
|
||||||
font-size: var(--bs-body-font-size);
|
|
||||||
font-weight: var(--bs-body-font-weight);
|
|
||||||
line-height: var(--bs-body-line-height);
|
|
||||||
color: var(--bs-body-color);
|
|
||||||
text-align: var(--bs-body-text-align);
|
|
||||||
background-color: var(--bs-body-bg);
|
|
||||||
-webkit-text-size-adjust: 100%;
|
|
||||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
|
||||||
margin: 1rem 0;
|
|
||||||
color: inherit;
|
|
||||||
background-color: currentColor;
|
|
||||||
border: 0;
|
|
||||||
opacity: 0.25;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr:not([size]) {
|
|
||||||
height: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h6, h5, h4, h3, h2, h1 {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
font-weight: 500;
|
|
||||||
line-height: 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: calc(1.375rem + 1.5vw);
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
h1 {
|
|
||||||
font-size: 2.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-size: calc(1.325rem + 0.9vw);
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
h2 {
|
|
||||||
font-size: 2rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
font-size: calc(1.3rem + 0.6vw);
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
h3 {
|
|
||||||
font-size: 1.75rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-size: calc(1.275rem + 0.3vw);
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
h4 {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h5 {
|
|
||||||
font-size: 1.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h6 {
|
|
||||||
font-size: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
abbr[title],
|
|
||||||
abbr[data-bs-original-title] {
|
|
||||||
-webkit-text-decoration: underline dotted;
|
|
||||||
text-decoration: underline dotted;
|
|
||||||
cursor: help;
|
|
||||||
-webkit-text-decoration-skip-ink: none;
|
|
||||||
text-decoration-skip-ink: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
address {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
font-style: normal;
|
|
||||||
line-height: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol,
|
|
||||||
ul {
|
|
||||||
padding-left: 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol,
|
|
||||||
ul,
|
|
||||||
dl {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol ol,
|
|
||||||
ul ul,
|
|
||||||
ol ul,
|
|
||||||
ul ol {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
dt {
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
dd {
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
blockquote {
|
|
||||||
margin: 0 0 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
b,
|
|
||||||
strong {
|
|
||||||
font-weight: bolder;
|
|
||||||
}
|
|
||||||
|
|
||||||
small {
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
mark {
|
|
||||||
padding: 0.2em;
|
|
||||||
background-color: #fcf8e3;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub,
|
|
||||||
sup {
|
|
||||||
position: relative;
|
|
||||||
font-size: 0.75em;
|
|
||||||
line-height: 0;
|
|
||||||
vertical-align: baseline;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub {
|
|
||||||
bottom: -0.25em;
|
|
||||||
}
|
|
||||||
|
|
||||||
sup {
|
|
||||||
top: -0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: #0d6efd;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
a:hover {
|
|
||||||
color: #0a58ca;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:not([href]):not([class]), a:not([href]):not([class]):hover {
|
|
||||||
color: inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre,
|
|
||||||
code,
|
|
||||||
kbd,
|
|
||||||
samp {
|
|
||||||
font-family: var(--bs-font-monospace);
|
|
||||||
font-size: 1em;
|
|
||||||
direction: ltr /* rtl:ignore */;
|
|
||||||
unicode-bidi: bidi-override;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
display: block;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
overflow: auto;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
font-size: inherit;
|
|
||||||
color: inherit;
|
|
||||||
word-break: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
font-size: 0.875em;
|
|
||||||
color: #d63384;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
a > code {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
kbd {
|
|
||||||
padding: 0.2rem 0.4rem;
|
|
||||||
font-size: 0.875em;
|
|
||||||
color: #fff;
|
|
||||||
background-color: #212529;
|
|
||||||
border-radius: 0.2rem;
|
|
||||||
}
|
|
||||||
kbd kbd {
|
|
||||||
padding: 0;
|
|
||||||
font-size: 1em;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
figure {
|
|
||||||
margin: 0 0 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
img,
|
|
||||||
svg {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
caption-side: bottom;
|
|
||||||
border-collapse: collapse;
|
|
||||||
}
|
|
||||||
|
|
||||||
caption {
|
|
||||||
padding-top: 0.5rem;
|
|
||||||
padding-bottom: 0.5rem;
|
|
||||||
color: #6c757d;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
th {
|
|
||||||
text-align: inherit;
|
|
||||||
text-align: -webkit-match-parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
thead,
|
|
||||||
tbody,
|
|
||||||
tfoot,
|
|
||||||
tr,
|
|
||||||
td,
|
|
||||||
th {
|
|
||||||
border-color: inherit;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
button:focus:not(:focus-visible) {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
input,
|
|
||||||
button,
|
|
||||||
select,
|
|
||||||
optgroup,
|
|
||||||
textarea {
|
|
||||||
margin: 0;
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
line-height: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
|
||||||
select {
|
|
||||||
text-transform: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
[role=button] {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
word-wrap: normal;
|
|
||||||
}
|
|
||||||
select:disabled {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
[list]::-webkit-calendar-picker-indicator {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
|
||||||
[type=button],
|
|
||||||
[type=reset],
|
|
||||||
[type=submit] {
|
|
||||||
-webkit-appearance: button;
|
|
||||||
}
|
|
||||||
button:not(:disabled),
|
|
||||||
[type=button]:not(:disabled),
|
|
||||||
[type=reset]:not(:disabled),
|
|
||||||
[type=submit]:not(:disabled) {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-moz-focus-inner {
|
|
||||||
padding: 0;
|
|
||||||
border-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
textarea {
|
|
||||||
resize: vertical;
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldset {
|
|
||||||
min-width: 0;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
legend {
|
|
||||||
float: left;
|
|
||||||
width: 100%;
|
|
||||||
padding: 0;
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
font-size: calc(1.275rem + 0.3vw);
|
|
||||||
line-height: inherit;
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
legend {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
legend + * {
|
|
||||||
clear: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-datetime-edit-fields-wrapper,
|
|
||||||
::-webkit-datetime-edit-text,
|
|
||||||
::-webkit-datetime-edit-minute,
|
|
||||||
::-webkit-datetime-edit-hour-field,
|
|
||||||
::-webkit-datetime-edit-day-field,
|
|
||||||
::-webkit-datetime-edit-month-field,
|
|
||||||
::-webkit-datetime-edit-year-field {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-inner-spin-button {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
[type=search] {
|
|
||||||
outline-offset: -2px;
|
|
||||||
-webkit-appearance: textfield;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* rtl:raw:
|
|
||||||
[type="tel"],
|
|
||||||
[type="url"],
|
|
||||||
[type="email"],
|
|
||||||
[type="number"] {
|
|
||||||
direction: ltr;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
::-webkit-search-decoration {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-color-swatch-wrapper {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-file-upload-button {
|
|
||||||
font: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
::file-selector-button {
|
|
||||||
font: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-file-upload-button {
|
|
||||||
font: inherit;
|
|
||||||
-webkit-appearance: button;
|
|
||||||
}
|
|
||||||
|
|
||||||
output {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
iframe {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
summary {
|
|
||||||
display: list-item;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
progress {
|
|
||||||
vertical-align: baseline;
|
|
||||||
}
|
|
||||||
|
|
||||||
[hidden] {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*# sourceMappingURL=bootstrap-reboot.css.map */
|
|
File diff suppressed because one or more lines are too long
8
assets/css/bootstrap-reboot.min.css
vendored
8
assets/css/bootstrap-reboot.min.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
482
assets/css/bootstrap-reboot.rtl.css
vendored
482
assets/css/bootstrap-reboot.rtl.css
vendored
@ -1,482 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Bootstrap Reboot v5.1.3 (https://getbootstrap.com/)
|
|
||||||
* Copyright 2011-2021 The Bootstrap Authors
|
|
||||||
* Copyright 2011-2021 Twitter, Inc.
|
|
||||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
||||||
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
|
|
||||||
*/
|
|
||||||
:root {
|
|
||||||
--bs-blue: #0d6efd;
|
|
||||||
--bs-indigo: #6610f2;
|
|
||||||
--bs-purple: #6f42c1;
|
|
||||||
--bs-pink: #d63384;
|
|
||||||
--bs-red: #dc3545;
|
|
||||||
--bs-orange: #fd7e14;
|
|
||||||
--bs-yellow: #ffc107;
|
|
||||||
--bs-green: #198754;
|
|
||||||
--bs-teal: #20c997;
|
|
||||||
--bs-cyan: #0dcaf0;
|
|
||||||
--bs-white: #fff;
|
|
||||||
--bs-gray: #6c757d;
|
|
||||||
--bs-gray-dark: #343a40;
|
|
||||||
--bs-gray-100: #f8f9fa;
|
|
||||||
--bs-gray-200: #e9ecef;
|
|
||||||
--bs-gray-300: #dee2e6;
|
|
||||||
--bs-gray-400: #ced4da;
|
|
||||||
--bs-gray-500: #adb5bd;
|
|
||||||
--bs-gray-600: #6c757d;
|
|
||||||
--bs-gray-700: #495057;
|
|
||||||
--bs-gray-800: #343a40;
|
|
||||||
--bs-gray-900: #212529;
|
|
||||||
--bs-primary: #0d6efd;
|
|
||||||
--bs-secondary: #6c757d;
|
|
||||||
--bs-success: #198754;
|
|
||||||
--bs-info: #0dcaf0;
|
|
||||||
--bs-warning: #ffc107;
|
|
||||||
--bs-danger: #dc3545;
|
|
||||||
--bs-light: #f8f9fa;
|
|
||||||
--bs-dark: #212529;
|
|
||||||
--bs-primary-rgb: 13, 110, 253;
|
|
||||||
--bs-secondary-rgb: 108, 117, 125;
|
|
||||||
--bs-success-rgb: 25, 135, 84;
|
|
||||||
--bs-info-rgb: 13, 202, 240;
|
|
||||||
--bs-warning-rgb: 255, 193, 7;
|
|
||||||
--bs-danger-rgb: 220, 53, 69;
|
|
||||||
--bs-light-rgb: 248, 249, 250;
|
|
||||||
--bs-dark-rgb: 33, 37, 41;
|
|
||||||
--bs-white-rgb: 255, 255, 255;
|
|
||||||
--bs-black-rgb: 0, 0, 0;
|
|
||||||
--bs-body-color-rgb: 33, 37, 41;
|
|
||||||
--bs-body-bg-rgb: 255, 255, 255;
|
|
||||||
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
|
||||||
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
||||||
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
|
|
||||||
--bs-body-font-family: var(--bs-font-sans-serif);
|
|
||||||
--bs-body-font-size: 1rem;
|
|
||||||
--bs-body-font-weight: 400;
|
|
||||||
--bs-body-line-height: 1.5;
|
|
||||||
--bs-body-color: #212529;
|
|
||||||
--bs-body-bg: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
*,
|
|
||||||
*::before,
|
|
||||||
*::after {
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (prefers-reduced-motion: no-preference) {
|
|
||||||
:root {
|
|
||||||
scroll-behavior: smooth;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
font-family: var(--bs-body-font-family);
|
|
||||||
font-size: var(--bs-body-font-size);
|
|
||||||
font-weight: var(--bs-body-font-weight);
|
|
||||||
line-height: var(--bs-body-line-height);
|
|
||||||
color: var(--bs-body-color);
|
|
||||||
text-align: var(--bs-body-text-align);
|
|
||||||
background-color: var(--bs-body-bg);
|
|
||||||
-webkit-text-size-adjust: 100%;
|
|
||||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
|
||||||
margin: 1rem 0;
|
|
||||||
color: inherit;
|
|
||||||
background-color: currentColor;
|
|
||||||
border: 0;
|
|
||||||
opacity: 0.25;
|
|
||||||
}
|
|
||||||
|
|
||||||
hr:not([size]) {
|
|
||||||
height: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h6, h5, h4, h3, h2, h1 {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
font-weight: 500;
|
|
||||||
line-height: 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: calc(1.375rem + 1.5vw);
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
h1 {
|
|
||||||
font-size: 2.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
font-size: calc(1.325rem + 0.9vw);
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
h2 {
|
|
||||||
font-size: 2rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
font-size: calc(1.3rem + 0.6vw);
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
h3 {
|
|
||||||
font-size: 1.75rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h4 {
|
|
||||||
font-size: calc(1.275rem + 0.3vw);
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
h4 {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h5 {
|
|
||||||
font-size: 1.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
h6 {
|
|
||||||
font-size: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
p {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
abbr[title],
|
|
||||||
abbr[data-bs-original-title] {
|
|
||||||
-webkit-text-decoration: underline dotted;
|
|
||||||
text-decoration: underline dotted;
|
|
||||||
cursor: help;
|
|
||||||
-webkit-text-decoration-skip-ink: none;
|
|
||||||
text-decoration-skip-ink: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
address {
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
font-style: normal;
|
|
||||||
line-height: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol,
|
|
||||||
ul {
|
|
||||||
padding-right: 2rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol,
|
|
||||||
ul,
|
|
||||||
dl {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol ol,
|
|
||||||
ul ul,
|
|
||||||
ol ul,
|
|
||||||
ul ol {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
dt {
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
dd {
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
margin-right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
blockquote {
|
|
||||||
margin: 0 0 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
b,
|
|
||||||
strong {
|
|
||||||
font-weight: bolder;
|
|
||||||
}
|
|
||||||
|
|
||||||
small {
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
|
|
||||||
mark {
|
|
||||||
padding: 0.2em;
|
|
||||||
background-color: #fcf8e3;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub,
|
|
||||||
sup {
|
|
||||||
position: relative;
|
|
||||||
font-size: 0.75em;
|
|
||||||
line-height: 0;
|
|
||||||
vertical-align: baseline;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub {
|
|
||||||
bottom: -0.25em;
|
|
||||||
}
|
|
||||||
|
|
||||||
sup {
|
|
||||||
top: -0.5em;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: #0d6efd;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
a:hover {
|
|
||||||
color: #0a58ca;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:not([href]):not([class]), a:not([href]):not([class]):hover {
|
|
||||||
color: inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre,
|
|
||||||
code,
|
|
||||||
kbd,
|
|
||||||
samp {
|
|
||||||
font-family: var(--bs-font-monospace);
|
|
||||||
font-size: 1em;
|
|
||||||
direction: ltr ;
|
|
||||||
unicode-bidi: bidi-override;
|
|
||||||
}
|
|
||||||
|
|
||||||
pre {
|
|
||||||
display: block;
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
overflow: auto;
|
|
||||||
font-size: 0.875em;
|
|
||||||
}
|
|
||||||
pre code {
|
|
||||||
font-size: inherit;
|
|
||||||
color: inherit;
|
|
||||||
word-break: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
code {
|
|
||||||
font-size: 0.875em;
|
|
||||||
color: #d63384;
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
a > code {
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
kbd {
|
|
||||||
padding: 0.2rem 0.4rem;
|
|
||||||
font-size: 0.875em;
|
|
||||||
color: #fff;
|
|
||||||
background-color: #212529;
|
|
||||||
border-radius: 0.2rem;
|
|
||||||
}
|
|
||||||
kbd kbd {
|
|
||||||
padding: 0;
|
|
||||||
font-size: 1em;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
figure {
|
|
||||||
margin: 0 0 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
img,
|
|
||||||
svg {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
caption-side: bottom;
|
|
||||||
border-collapse: collapse;
|
|
||||||
}
|
|
||||||
|
|
||||||
caption {
|
|
||||||
padding-top: 0.5rem;
|
|
||||||
padding-bottom: 0.5rem;
|
|
||||||
color: #6c757d;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
th {
|
|
||||||
text-align: inherit;
|
|
||||||
text-align: -webkit-match-parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
thead,
|
|
||||||
tbody,
|
|
||||||
tfoot,
|
|
||||||
tr,
|
|
||||||
td,
|
|
||||||
th {
|
|
||||||
border-color: inherit;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
button:focus:not(:focus-visible) {
|
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
input,
|
|
||||||
button,
|
|
||||||
select,
|
|
||||||
optgroup,
|
|
||||||
textarea {
|
|
||||||
margin: 0;
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: inherit;
|
|
||||||
line-height: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
|
||||||
select {
|
|
||||||
text-transform: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
[role=button] {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
select {
|
|
||||||
word-wrap: normal;
|
|
||||||
}
|
|
||||||
select:disabled {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
[list]::-webkit-calendar-picker-indicator {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
button,
|
|
||||||
[type=button],
|
|
||||||
[type=reset],
|
|
||||||
[type=submit] {
|
|
||||||
-webkit-appearance: button;
|
|
||||||
}
|
|
||||||
button:not(:disabled),
|
|
||||||
[type=button]:not(:disabled),
|
|
||||||
[type=reset]:not(:disabled),
|
|
||||||
[type=submit]:not(:disabled) {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-moz-focus-inner {
|
|
||||||
padding: 0;
|
|
||||||
border-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
textarea {
|
|
||||||
resize: vertical;
|
|
||||||
}
|
|
||||||
|
|
||||||
fieldset {
|
|
||||||
min-width: 0;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
legend {
|
|
||||||
float: right;
|
|
||||||
width: 100%;
|
|
||||||
padding: 0;
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
font-size: calc(1.275rem + 0.3vw);
|
|
||||||
line-height: inherit;
|
|
||||||
}
|
|
||||||
@media (min-width: 1200px) {
|
|
||||||
legend {
|
|
||||||
font-size: 1.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
legend + * {
|
|
||||||
clear: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-datetime-edit-fields-wrapper,
|
|
||||||
::-webkit-datetime-edit-text,
|
|
||||||
::-webkit-datetime-edit-minute,
|
|
||||||
::-webkit-datetime-edit-hour-field,
|
|
||||||
::-webkit-datetime-edit-day-field,
|
|
||||||
::-webkit-datetime-edit-month-field,
|
|
||||||
::-webkit-datetime-edit-year-field {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-inner-spin-button {
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
[type=search] {
|
|
||||||
outline-offset: -2px;
|
|
||||||
-webkit-appearance: textfield;
|
|
||||||
}
|
|
||||||
|
|
||||||
[type="tel"],
|
|
||||||
[type="url"],
|
|
||||||
[type="email"],
|
|
||||||
[type="number"] {
|
|
||||||
direction: ltr;
|
|
||||||
}
|
|
||||||
::-webkit-search-decoration {
|
|
||||||
-webkit-appearance: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-color-swatch-wrapper {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-file-upload-button {
|
|
||||||
font: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
::file-selector-button {
|
|
||||||
font: inherit;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-file-upload-button {
|
|
||||||
font: inherit;
|
|
||||||
-webkit-appearance: button;
|
|
||||||
}
|
|
||||||
|
|
||||||
output {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
iframe {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
summary {
|
|
||||||
display: list-item;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
progress {
|
|
||||||
vertical-align: baseline;
|
|
||||||
}
|
|
||||||
|
|
||||||
[hidden] {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */
|
|
File diff suppressed because one or more lines are too long
8
assets/css/bootstrap-reboot.rtl.min.css
vendored
8
assets/css/bootstrap-reboot.rtl.min.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4866
assets/css/bootstrap-utilities.css
vendored
4866
assets/css/bootstrap-utilities.css
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7
assets/css/bootstrap-utilities.min.css
vendored
7
assets/css/bootstrap-utilities.min.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4857
assets/css/bootstrap-utilities.rtl.css
vendored
4857
assets/css/bootstrap-utilities.rtl.css
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7
assets/css/bootstrap-utilities.rtl.min.css
vendored
7
assets/css/bootstrap-utilities.rtl.min.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
11266
assets/css/bootstrap.css
vendored
11266
assets/css/bootstrap.css
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7
assets/css/bootstrap.min.css
vendored
7
assets/css/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
11242
assets/css/bootstrap.rtl.css
vendored
11242
assets/css/bootstrap.rtl.css
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7
assets/css/bootstrap.rtl.min.css
vendored
7
assets/css/bootstrap.rtl.min.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
6812
assets/js/bootstrap.bundle.js
vendored
6812
assets/js/bootstrap.bundle.js
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7
assets/js/bootstrap.bundle.min.js
vendored
7
assets/js/bootstrap.bundle.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
4999
assets/js/bootstrap.esm.js
vendored
4999
assets/js/bootstrap.esm.js
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7
assets/js/bootstrap.esm.min.js
vendored
7
assets/js/bootstrap.esm.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
5046
assets/js/bootstrap.js
vendored
5046
assets/js/bootstrap.js
vendored
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7
assets/js/bootstrap.min.js
vendored
7
assets/js/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
assets/js/jquery-3.6.0.min.js
vendored
2
assets/js/jquery-3.6.0.min.js
vendored
File diff suppressed because one or more lines are too long
@ -1,338 +0,0 @@
|
|||||||
/*!
|
|
||||||
SerializeJSON jQuery plugin.
|
|
||||||
https://github.com/marioizquierdo/jquery.serializeJSON
|
|
||||||
version 3.2.1 (Feb, 2021)
|
|
||||||
|
|
||||||
Copyright (c) 2012-2021 Mario Izquierdo
|
|
||||||
Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
|
||||||
and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
|
|
||||||
*/
|
|
||||||
(function (factory) {
|
|
||||||
/* global define, require, module */
|
|
||||||
if (typeof define === "function" && define.amd) { // AMD. Register as an anonymous module.
|
|
||||||
define(["jquery"], factory);
|
|
||||||
} else if (typeof exports === "object") { // Node/CommonJS
|
|
||||||
var jQuery = require("jquery");
|
|
||||||
module.exports = factory(jQuery);
|
|
||||||
} else { // Browser globals (zepto supported)
|
|
||||||
factory(window.jQuery || window.Zepto || window.$); // Zepto supported on browsers as well
|
|
||||||
}
|
|
||||||
|
|
||||||
}(function ($) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var rCRLF = /\r?\n/g;
|
|
||||||
var rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i;
|
|
||||||
var rsubmittable = /^(?:input|select|textarea|keygen)/i;
|
|
||||||
var rcheckableType = /^(?:checkbox|radio)$/i;
|
|
||||||
|
|
||||||
$.fn.serializeJSON = function (options) {
|
|
||||||
var f = $.serializeJSON;
|
|
||||||
var $form = this; // NOTE: the set of matched elements is most likely a form, but it could also be a group of inputs
|
|
||||||
var opts = f.setupOpts(options); // validate options and apply defaults
|
|
||||||
var typeFunctions = $.extend({}, opts.defaultTypes, opts.customTypes);
|
|
||||||
|
|
||||||
// Make a list with {name, value, el} for each input element
|
|
||||||
var serializedArray = f.serializeArray($form, opts);
|
|
||||||
|
|
||||||
// Convert the serializedArray into a serializedObject with nested keys
|
|
||||||
var serializedObject = {};
|
|
||||||
$.each(serializedArray, function (_i, obj) {
|
|
||||||
|
|
||||||
var nameSansType = obj.name;
|
|
||||||
var type = $(obj.el).attr("data-value-type");
|
|
||||||
|
|
||||||
if (!type && !opts.disableColonTypes) { // try getting the type from the input name
|
|
||||||
var p = f.splitType(obj.name); // "foo:string" => ["foo", "string"]
|
|
||||||
nameSansType = p[0];
|
|
||||||
type = p[1];
|
|
||||||
}
|
|
||||||
if (type === "skip") {
|
|
||||||
return; // ignore fields with type skip
|
|
||||||
}
|
|
||||||
if (!type) {
|
|
||||||
type = opts.defaultType; // "string" by default
|
|
||||||
}
|
|
||||||
|
|
||||||
var typedValue = f.applyTypeFunc(obj.name, obj.value, type, obj.el, typeFunctions); // Parse type as string, number, etc.
|
|
||||||
|
|
||||||
if (!typedValue && f.shouldSkipFalsy(obj.name, nameSansType, type, obj.el, opts)) {
|
|
||||||
return; // ignore falsy inputs if specified in the options
|
|
||||||
}
|
|
||||||
|
|
||||||
var keys = f.splitInputNameIntoKeysArray(nameSansType);
|
|
||||||
f.deepSet(serializedObject, keys, typedValue, opts);
|
|
||||||
});
|
|
||||||
return serializedObject;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Use $.serializeJSON as namespace for the auxiliar functions
|
|
||||||
// and to define defaults
|
|
||||||
$.serializeJSON = {
|
|
||||||
defaultOptions: {}, // reassign to override option defaults for all serializeJSON calls
|
|
||||||
|
|
||||||
defaultBaseOptions: { // do not modify, use defaultOptions instead
|
|
||||||
checkboxUncheckedValue: undefined, // to include that value for unchecked checkboxes (instead of ignoring them)
|
|
||||||
useIntKeysAsArrayIndex: false, // name="foo[2]" value="v" => {foo: [null, null, "v"]}, instead of {foo: ["2": "v"]}
|
|
||||||
|
|
||||||
skipFalsyValuesForTypes: [], // skip serialization of falsy values for listed value types
|
|
||||||
skipFalsyValuesForFields: [], // skip serialization of falsy values for listed field names
|
|
||||||
|
|
||||||
disableColonTypes: false, // do not interpret ":type" suffix as a type
|
|
||||||
customTypes: {}, // extends defaultTypes
|
|
||||||
defaultTypes: {
|
|
||||||
"string": function(str) { return String(str); },
|
|
||||||
"number": function(str) { return Number(str); },
|
|
||||||
"boolean": function(str) { var falses = ["false", "null", "undefined", "", "0"]; return falses.indexOf(str) === -1; },
|
|
||||||
"null": function(str) { var falses = ["false", "null", "undefined", "", "0"]; return falses.indexOf(str) === -1 ? str : null; },
|
|
||||||
"array": function(str) { return JSON.parse(str); },
|
|
||||||
"object": function(str) { return JSON.parse(str); },
|
|
||||||
"skip": null // skip is a special type used to ignore fields
|
|
||||||
},
|
|
||||||
defaultType: "string",
|
|
||||||
},
|
|
||||||
|
|
||||||
// Validate and set defaults
|
|
||||||
setupOpts: function(options) {
|
|
||||||
if (options == null) options = {};
|
|
||||||
var f = $.serializeJSON;
|
|
||||||
|
|
||||||
// Validate
|
|
||||||
var validOpts = [
|
|
||||||
"checkboxUncheckedValue",
|
|
||||||
"useIntKeysAsArrayIndex",
|
|
||||||
|
|
||||||
"skipFalsyValuesForTypes",
|
|
||||||
"skipFalsyValuesForFields",
|
|
||||||
|
|
||||||
"disableColonTypes",
|
|
||||||
"customTypes",
|
|
||||||
"defaultTypes",
|
|
||||||
"defaultType"
|
|
||||||
];
|
|
||||||
for (var opt in options) {
|
|
||||||
if (validOpts.indexOf(opt) === -1) {
|
|
||||||
throw new Error("serializeJSON ERROR: invalid option '" + opt + "'. Please use one of " + validOpts.join(", "));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Helper to get options or defaults
|
|
||||||
return $.extend({}, f.defaultBaseOptions, f.defaultOptions, options);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Just like jQuery's serializeArray method, returns an array of objects with name and value.
|
|
||||||
// but also includes the dom element (el) and is handles unchecked checkboxes if the option or data attribute are provided.
|
|
||||||
serializeArray: function($form, opts) {
|
|
||||||
if (opts == null) { opts = {}; }
|
|
||||||
var f = $.serializeJSON;
|
|
||||||
|
|
||||||
return $form.map(function() {
|
|
||||||
var elements = $.prop(this, "elements"); // handle propHook "elements" to filter or add form elements
|
|
||||||
return elements ? $.makeArray(elements) : this;
|
|
||||||
|
|
||||||
}).filter(function() {
|
|
||||||
var $el = $(this);
|
|
||||||
var type = this.type;
|
|
||||||
|
|
||||||
// Filter with the standard W3C rules for successful controls: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2
|
|
||||||
return this.name && // must contain a name attribute
|
|
||||||
!$el.is(":disabled") && // must not be disable (use .is(":disabled") so that fieldset[disabled] works)
|
|
||||||
rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && // only serialize submittable fields (and not buttons)
|
|
||||||
(this.checked || !rcheckableType.test(type) || f.getCheckboxUncheckedValue($el, opts) != null); // skip unchecked checkboxes (unless using opts)
|
|
||||||
|
|
||||||
}).map(function(_i, el) {
|
|
||||||
var $el = $(this);
|
|
||||||
var val = $el.val();
|
|
||||||
var type = this.type; // "input", "select", "textarea", "checkbox", etc.
|
|
||||||
|
|
||||||
if (val == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rcheckableType.test(type) && !this.checked) {
|
|
||||||
val = f.getCheckboxUncheckedValue($el, opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isArray(val)) {
|
|
||||||
return $.map(val, function(val) {
|
|
||||||
return { name: el.name, value: val.replace(rCRLF, "\r\n"), el: el };
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
return { name: el.name, value: val.replace(rCRLF, "\r\n"), el: el };
|
|
||||||
|
|
||||||
}).get();
|
|
||||||
},
|
|
||||||
|
|
||||||
getCheckboxUncheckedValue: function($el, opts) {
|
|
||||||
var val = $el.attr("data-unchecked-value");
|
|
||||||
if (val == null) {
|
|
||||||
val = opts.checkboxUncheckedValue;
|
|
||||||
}
|
|
||||||
return val;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Parse value with type function
|
|
||||||
applyTypeFunc: function(name, strVal, type, el, typeFunctions) {
|
|
||||||
var typeFunc = typeFunctions[type];
|
|
||||||
if (!typeFunc) { // quick feedback to user if there is a typo or missconfiguration
|
|
||||||
throw new Error("serializeJSON ERROR: Invalid type " + type + " found in input name '" + name + "', please use one of " + objectKeys(typeFunctions).join(", "));
|
|
||||||
}
|
|
||||||
return typeFunc(strVal, el);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Splits a field name into the name and the type. Examples:
|
|
||||||
// "foo" => ["foo", ""]
|
|
||||||
// "foo:boolean" => ["foo", "boolean"]
|
|
||||||
// "foo[bar]:null" => ["foo[bar]", "null"]
|
|
||||||
splitType : function(name) {
|
|
||||||
var parts = name.split(":");
|
|
||||||
if (parts.length > 1) {
|
|
||||||
var t = parts.pop();
|
|
||||||
return [parts.join(":"), t];
|
|
||||||
} else {
|
|
||||||
return [name, ""];
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Check if this input should be skipped when it has a falsy value,
|
|
||||||
// depending on the options to skip values by name or type, and the data-skip-falsy attribute.
|
|
||||||
shouldSkipFalsy: function(name, nameSansType, type, el, opts) {
|
|
||||||
var skipFromDataAttr = $(el).attr("data-skip-falsy");
|
|
||||||
if (skipFromDataAttr != null) {
|
|
||||||
return skipFromDataAttr !== "false"; // any value is true, except the string "false"
|
|
||||||
}
|
|
||||||
|
|
||||||
var optForFields = opts.skipFalsyValuesForFields;
|
|
||||||
if (optForFields && (optForFields.indexOf(nameSansType) !== -1 || optForFields.indexOf(name) !== -1)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var optForTypes = opts.skipFalsyValuesForTypes;
|
|
||||||
if (optForTypes && optForTypes.indexOf(type) !== -1) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Split the input name in programatically readable keys.
|
|
||||||
// Examples:
|
|
||||||
// "foo" => ["foo"]
|
|
||||||
// "[foo]" => ["foo"]
|
|
||||||
// "foo[inn][bar]" => ["foo", "inn", "bar"]
|
|
||||||
// "foo[inn[bar]]" => ["foo", "inn", "bar"]
|
|
||||||
// "foo[inn][arr][0]" => ["foo", "inn", "arr", "0"]
|
|
||||||
// "arr[][val]" => ["arr", "", "val"]
|
|
||||||
splitInputNameIntoKeysArray: function(nameWithNoType) {
|
|
||||||
var keys = nameWithNoType.split("["); // split string into array
|
|
||||||
keys = $.map(keys, function (key) { return key.replace(/\]/g, ""); }); // remove closing brackets
|
|
||||||
if (keys[0] === "") { keys.shift(); } // ensure no opening bracket ("[foo][inn]" should be same as "foo[inn]")
|
|
||||||
return keys;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Set a value in an object or array, using multiple keys to set in a nested object or array.
|
|
||||||
// This is the main function of the script, that allows serializeJSON to use nested keys.
|
|
||||||
// Examples:
|
|
||||||
//
|
|
||||||
// deepSet(obj, ["foo"], v) // obj["foo"] = v
|
|
||||||
// deepSet(obj, ["foo", "inn"], v) // obj["foo"]["inn"] = v // Create the inner obj["foo"] object, if needed
|
|
||||||
// deepSet(obj, ["foo", "inn", "123"], v) // obj["foo"]["arr"]["123"] = v //
|
|
||||||
//
|
|
||||||
// deepSet(obj, ["0"], v) // obj["0"] = v
|
|
||||||
// deepSet(arr, ["0"], v, {useIntKeysAsArrayIndex: true}) // arr[0] = v
|
|
||||||
// deepSet(arr, [""], v) // arr.push(v)
|
|
||||||
// deepSet(obj, ["arr", ""], v) // obj["arr"].push(v)
|
|
||||||
//
|
|
||||||
// arr = [];
|
|
||||||
// deepSet(arr, ["", v] // arr => [v]
|
|
||||||
// deepSet(arr, ["", "foo"], v) // arr => [v, {foo: v}]
|
|
||||||
// deepSet(arr, ["", "bar"], v) // arr => [v, {foo: v, bar: v}]
|
|
||||||
// deepSet(arr, ["", "bar"], v) // arr => [v, {foo: v, bar: v}, {bar: v}]
|
|
||||||
//
|
|
||||||
deepSet: function (o, keys, value, opts) {
|
|
||||||
if (opts == null) { opts = {}; }
|
|
||||||
var f = $.serializeJSON;
|
|
||||||
if (isUndefined(o)) { throw new Error("ArgumentError: param 'o' expected to be an object or array, found undefined"); }
|
|
||||||
if (!keys || keys.length === 0) { throw new Error("ArgumentError: param 'keys' expected to be an array with least one element"); }
|
|
||||||
|
|
||||||
var key = keys[0];
|
|
||||||
|
|
||||||
// Only one key, then it's not a deepSet, just assign the value in the object or add it to the array.
|
|
||||||
if (keys.length === 1) {
|
|
||||||
if (key === "") { // push values into an array (o must be an array)
|
|
||||||
o.push(value);
|
|
||||||
} else {
|
|
||||||
o[key] = value; // keys can be object keys (strings) or array indexes (numbers)
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var nextKey = keys[1]; // nested key
|
|
||||||
var tailKeys = keys.slice(1); // list of all other nested keys (nextKey is first)
|
|
||||||
|
|
||||||
if (key === "") { // push nested objects into an array (o must be an array)
|
|
||||||
var lastIdx = o.length - 1;
|
|
||||||
var lastVal = o[lastIdx];
|
|
||||||
|
|
||||||
// if the last value is an object or array, and the new key is not set yet
|
|
||||||
if (isObject(lastVal) && isUndefined(f.deepGet(lastVal, tailKeys))) {
|
|
||||||
key = lastIdx; // then set the new value as a new attribute of the same object
|
|
||||||
} else {
|
|
||||||
key = lastIdx + 1; // otherwise, add a new element in the array
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nextKey === "") { // "" is used to push values into the nested array "array[]"
|
|
||||||
if (isUndefined(o[key]) || !isArray(o[key])) {
|
|
||||||
o[key] = []; // define (or override) as array to push values
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (opts.useIntKeysAsArrayIndex && isValidArrayIndex(nextKey)) { // if 1, 2, 3 ... then use an array, where nextKey is the index
|
|
||||||
if (isUndefined(o[key]) || !isArray(o[key])) {
|
|
||||||
o[key] = []; // define (or override) as array, to insert values using int keys as array indexes
|
|
||||||
}
|
|
||||||
} else { // nextKey is going to be the nested object's attribute
|
|
||||||
if (isUndefined(o[key]) || !isObject(o[key])) {
|
|
||||||
o[key] = {}; // define (or override) as object, to set nested properties
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Recursively set the inner object
|
|
||||||
f.deepSet(o[key], tailKeys, value, opts);
|
|
||||||
},
|
|
||||||
|
|
||||||
deepGet: function (o, keys) {
|
|
||||||
var f = $.serializeJSON;
|
|
||||||
if (isUndefined(o) || isUndefined(keys) || keys.length === 0 || (!isObject(o) && !isArray(o))) {
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
var key = keys[0];
|
|
||||||
if (key === "") { // "" means next array index (used by deepSet)
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
if (keys.length === 1) {
|
|
||||||
return o[key];
|
|
||||||
}
|
|
||||||
var tailKeys = keys.slice(1);
|
|
||||||
return f.deepGet(o[key], tailKeys);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// polyfill Object.keys to get option keys in IE<9
|
|
||||||
var objectKeys = function(obj) {
|
|
||||||
if (Object.keys) {
|
|
||||||
return Object.keys(obj);
|
|
||||||
} else {
|
|
||||||
var key, keys = [];
|
|
||||||
for (key in obj) { keys.push(key); }
|
|
||||||
return keys;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var isObject = function(obj) { return obj === Object(obj); }; // true for Objects and Arrays
|
|
||||||
var isUndefined = function(obj) { return obj === void 0; }; // safe check for undefined values
|
|
||||||
var isValidArrayIndex = function(val) { return /^[0-9]+$/.test(String(val)); }; // 1,2,3,4 ... are valid array indexes
|
|
||||||
var isArray = Array.isArray || function(obj) { return Object.prototype.toString.call(obj) === "[object Array]"; };
|
|
||||||
}));
|
|
30
dal/dal.go
30
dal/dal.go
@ -48,13 +48,14 @@ func (dal *PostgresDAL) Disconnect() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type MongoDAL struct {
|
type MongoDAL struct {
|
||||||
conn *mongo.Client
|
conn *mongo.Client
|
||||||
logger *zap.Logger
|
logger *zap.Logger
|
||||||
User *mongos.User
|
User *mongos.User
|
||||||
YaDisk *mongos.YaDisk
|
YaDisk *mongos.YaDisk
|
||||||
GDisk *mongos.GDisk
|
GDisk *mongos.GDisk
|
||||||
Amo *mongos.Amo
|
Amo *mongos.Amo
|
||||||
Template *mongos.Template
|
Template *mongos.Template
|
||||||
|
TemplateGroup *mongos.TemplateGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitMongoDAL(ctx context.Context, dbURL, dbTable string, logger *zap.Logger) (*MongoDAL, error) {
|
func InitMongoDAL(ctx context.Context, dbURL, dbTable string, logger *zap.Logger) (*MongoDAL, error) {
|
||||||
@ -74,13 +75,14 @@ func InitMongoDAL(ctx context.Context, dbURL, dbTable string, logger *zap.Logger
|
|||||||
}
|
}
|
||||||
|
|
||||||
dal := &MongoDAL{
|
dal := &MongoDAL{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
User: mongos.InitUser(conn.Database(dbTable), logger),
|
User: mongos.InitUser(conn.Database(dbTable), logger),
|
||||||
YaDisk: mongos.InitYaDisk(conn.Database(dbTable), logger),
|
YaDisk: mongos.InitYaDisk(conn.Database(dbTable), logger),
|
||||||
GDisk: mongos.InitGDisk(conn.Database(dbTable), logger),
|
GDisk: mongos.InitGDisk(conn.Database(dbTable), logger),
|
||||||
Amo: mongos.InitAmo(conn.Database(dbTable), logger),
|
Amo: mongos.InitAmo(conn.Database(dbTable), logger),
|
||||||
Template: mongos.InitTemplate(conn.Database(dbTable), logger),
|
Template: mongos.InitTemplate(conn.Database(dbTable), logger),
|
||||||
|
TemplateGroup: mongos.InitTemplateGroup(conn.Database(dbTable), logger),
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = dal.Ping(ctx)
|
_, err = dal.Ping(ctx)
|
||||||
|
@ -8,11 +8,11 @@ type Template struct {
|
|||||||
ID string `bson:"_id,omitempty" json:"id"`
|
ID string `bson:"_id,omitempty" json:"id"`
|
||||||
UserID string `bson:"user_id" json:"user_id"`
|
UserID string `bson:"user_id" json:"user_id"`
|
||||||
LeadId string `bson:"lead_id" json:"lead_id"` // AMO lead
|
LeadId string `bson:"lead_id" json:"lead_id"` // AMO lead
|
||||||
Name string `bson:"name" json:"name"` // Название сделки, к которому привязан файл-шаблон
|
Name string `bson:"name" json:"name"` // Имя файла на диске
|
||||||
Filename string `bson:"filename" json:"filename"` // Имя файла-шаблона for Yandex Disk
|
File string `bson:"file" json:"file"` // Имя файла-шаблона for Yandex Disk OR File id for Google Drive
|
||||||
StorageID string `bson:"storage_id" json:"storage_id"` // ID of GDisk or YaDisk
|
StorageID string `bson:"storage_id" json:"storage_id"` // ID of GDisk or YaDisk
|
||||||
StorageType string `bson:"storage_type" json:"storage_type"`
|
StorageType string `bson:"storage_type" json:"storage_type"`
|
||||||
FileID string `bson:"file_id" json:"file_id"` // File id for Google Drive
|
GroupIDs []string `bson:"group_ids" json:"group_ids"`
|
||||||
IsDeleted bool `bson:"is_deleted" json:"is_deleted"`
|
IsDeleted bool `bson:"is_deleted" json:"is_deleted"`
|
||||||
CreatedAt time.Time `bson:"created_at" json:"created_at"`
|
CreatedAt time.Time `bson:"created_at" json:"created_at"`
|
||||||
UpdatedAt time.Time `bson:"updated_at" json:"updated_at"`
|
UpdatedAt time.Time `bson:"updated_at" json:"updated_at"`
|
||||||
|
13
dal/model/templateGroup.go
Normal file
13
dal/model/templateGroup.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TemplateGroup struct {
|
||||||
|
ID string `bson:"_id,omitempty" json:"id"`
|
||||||
|
UserID string `bson:"user_id" json:"user_id"`
|
||||||
|
Name string `bson:"name" json:"name"`
|
||||||
|
CreatedAt time.Time `bson:"created_at" json:"created_at"`
|
||||||
|
UpdatedAt time.Time `bson:"updated_at" json:"updated_at"`
|
||||||
|
}
|
@ -122,8 +122,6 @@ func (d *Template) GetByNameAndUserID(ctx context.Context, name, userID string)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("RESUKLT", result)
|
|
||||||
|
|
||||||
d.logger.Info("InfoGetTemplate", zap.String("id", result.ID))
|
d.logger.Info("InfoGetTemplate", zap.String("id", result.ID))
|
||||||
|
|
||||||
return &result, nil
|
return &result, nil
|
||||||
@ -209,6 +207,129 @@ func (d *Template) GetListByUserIDAndStorageType(ctx context.Context, userID, st
|
|||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Template) GetListByGroupID(ctx context.Context, groupID, userID string) ([]model.Template, error) {
|
||||||
|
if groupID == "" {
|
||||||
|
err := errors.New("group_id required")
|
||||||
|
d.logger.Error("ErrorGetTemplateList", zap.Error(err))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
filter := bson.M{"group_ids": groupID, "user_id": userID}
|
||||||
|
|
||||||
|
cur, err := d.coll.Find(ctx, filter)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorGetTemplateList", zap.Error(err))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var result []model.Template
|
||||||
|
|
||||||
|
err = cur.All(ctx, &result)
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorGetTemplateList", zap.Error(err))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Template) PushGroup(ctx context.Context, id, groupID, userID string) error {
|
||||||
|
objID, err := primitive.ObjectIDFromHex(id)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorPushTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if groupID == "" {
|
||||||
|
err = errors.New("group_id required")
|
||||||
|
d.logger.Error("ErrorPushTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
filter := bson.M{"_id": objID}
|
||||||
|
|
||||||
|
if userID != "" {
|
||||||
|
filter["user_id"] = userID
|
||||||
|
}
|
||||||
|
|
||||||
|
update := bson.M{
|
||||||
|
"$addToSet": bson.M{"group_ids": groupID},
|
||||||
|
"$set": bson.M{"updated_at": time.Now()},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = d.coll.UpdateOne(ctx, filter, update)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorPushTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
d.logger.Info("InfoPushTemplateGroup")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Template) PullGroup(ctx context.Context, id, groupID, userID string) error {
|
||||||
|
objID, err := primitive.ObjectIDFromHex(id)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorPullTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if groupID == "" {
|
||||||
|
err = errors.New("group_id required")
|
||||||
|
d.logger.Error("ErrorPullTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
filter := bson.M{"_id": objID}
|
||||||
|
|
||||||
|
if userID != "" {
|
||||||
|
filter["user_id"] = userID
|
||||||
|
}
|
||||||
|
|
||||||
|
update := bson.M{
|
||||||
|
"$pull": bson.M{"group_ids": groupID},
|
||||||
|
"$set": bson.M{"updated_at": time.Now()},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = d.coll.UpdateOne(ctx, filter, update)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorPullTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Template) DeleteGroupFromAll(ctx context.Context, groupID string) error {
|
||||||
|
if groupID == "" {
|
||||||
|
err := errors.New("group_id required")
|
||||||
|
d.logger.Error("ErrorRemoveTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
filter := bson.M{"group_ids": groupID}
|
||||||
|
|
||||||
|
update := bson.M{
|
||||||
|
"$pull": bson.M{"group_ids": groupID},
|
||||||
|
"$set": bson.M{"updated_at": time.Now()},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := d.coll.UpdateMany(ctx, filter, update)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorRemoveTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Template) UpdateByID(ctx context.Context, record *model.Template) error {
|
func (d *Template) UpdateByID(ctx context.Context, record *model.Template) error {
|
||||||
if record.ID == "" {
|
if record.ID == "" {
|
||||||
err := errors.New("got empty id")
|
err := errors.New("got empty id")
|
||||||
@ -231,8 +352,8 @@ func (d *Template) UpdateByID(ctx context.Context, record *model.Template) error
|
|||||||
update["name"] = record.Name
|
update["name"] = record.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
if record.Filename != "" {
|
if record.File != "" {
|
||||||
update["filename"] = record.Filename
|
update["file"] = record.File
|
||||||
}
|
}
|
||||||
|
|
||||||
if record.LeadId != "" {
|
if record.LeadId != "" {
|
||||||
@ -247,10 +368,6 @@ func (d *Template) UpdateByID(ctx context.Context, record *model.Template) error
|
|||||||
update["storage_type"] = record.StorageType
|
update["storage_type"] = record.StorageType
|
||||||
}
|
}
|
||||||
|
|
||||||
if record.FileID != "" {
|
|
||||||
update["file_id"] = record.FileID
|
|
||||||
}
|
|
||||||
|
|
||||||
res, err := d.coll.UpdateOne(ctx, filter, bson.D{{"$set", update}})
|
res, err := d.coll.UpdateOne(ctx, filter, bson.D{{"$set", update}})
|
||||||
|
|
||||||
fmt.Println(update)
|
fmt.Println(update)
|
||||||
@ -279,8 +396,8 @@ func (d *Template) UpdateByLeadID(ctx context.Context, record *model.Template) e
|
|||||||
update["name"] = record.Name
|
update["name"] = record.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
if record.Filename != "" {
|
if record.File != "" {
|
||||||
update["filename"] = record.Filename
|
update["file"] = record.File
|
||||||
}
|
}
|
||||||
|
|
||||||
if record.LeadId != "" {
|
if record.LeadId != "" {
|
||||||
@ -295,10 +412,6 @@ func (d *Template) UpdateByLeadID(ctx context.Context, record *model.Template) e
|
|||||||
update["storage_type"] = record.StorageType
|
update["storage_type"] = record.StorageType
|
||||||
}
|
}
|
||||||
|
|
||||||
if record.FileID != "" {
|
|
||||||
update["file_id"] = record.FileID
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := d.coll.UpdateOne(ctx, filter, bson.D{{"$set", update}})
|
_, err := d.coll.UpdateOne(ctx, filter, bson.D{{"$set", update}})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -309,31 +422,6 @@ func (d *Template) UpdateByLeadID(ctx context.Context, record *model.Template) e
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Template) UpdateByNameAndUserID(ctx context.Context, record *model.Template) error {
|
|
||||||
if record.Name == "" || record.UserID == "" {
|
|
||||||
err := errors.New("got empty user id or name")
|
|
||||||
d.logger.Error("ErrorUpdateTemplate", zap.Error(err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
filter := bson.M{"name": record.Name, "user_id": record.UserID, "is_deleted": false}
|
|
||||||
|
|
||||||
update := bson.M{"updated_at": time.Now()}
|
|
||||||
|
|
||||||
if record.Filename != "" {
|
|
||||||
update["filename"] = record.Filename
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := d.coll.UpdateOne(ctx, filter, update)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
d.logger.Error("ErrorUpdateTemplate", zap.Error(err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *Template) DeleteByID(ctx context.Context, id string) error {
|
func (d *Template) DeleteByID(ctx context.Context, id string) error {
|
||||||
if id == "" {
|
if id == "" {
|
||||||
err := errors.New("got empty id")
|
err := errors.New("got empty id")
|
||||||
@ -360,23 +448,3 @@ func (d *Template) DeleteByID(ctx context.Context, id string) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Template) DeleteByNameAndUserID(ctx context.Context, name, userID string) error {
|
|
||||||
if name == "" || userID == "" {
|
|
||||||
err := errors.New("got empty user id or name")
|
|
||||||
d.logger.Error("ErrorUpdateTemplate", zap.Error(err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
filter := bson.M{"name": name, "user_id": userID, "is_deleted": false}
|
|
||||||
|
|
||||||
update := bson.M{"updated_at": time.Now(), "is_deleted": true}
|
|
||||||
|
|
||||||
_, err := d.coll.UpdateOne(ctx, filter, bson.D{{"$set", update}})
|
|
||||||
if err != nil {
|
|
||||||
d.logger.Error("ErrorDeleteTemplate", zap.Error(err))
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
183
dal/mongos/templateGroup.go
Normal file
183
dal/mongos/templateGroup.go
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
package mongos
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
|
||||||
|
"go.mongodb.org/mongo-driver/bson"
|
||||||
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TemplateGroup struct {
|
||||||
|
coll *mongo.Collection
|
||||||
|
logger *zap.Logger
|
||||||
|
}
|
||||||
|
|
||||||
|
func InitTemplateGroup(db *mongo.Database, logger *zap.Logger) *TemplateGroup {
|
||||||
|
return &TemplateGroup{coll: db.Collection("template_group"), logger: logger}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *TemplateGroup) Insert(ctx context.Context, record *model.TemplateGroup) (string, error) {
|
||||||
|
now := time.Now()
|
||||||
|
record.CreatedAt = now
|
||||||
|
record.UpdatedAt = now
|
||||||
|
|
||||||
|
if record.UserID == "" {
|
||||||
|
err := errors.New("user_id required")
|
||||||
|
d.logger.Error("ErrorInsertTemplateGroup", zap.Error(err))
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if record.Name == "" {
|
||||||
|
err := errors.New("name required")
|
||||||
|
d.logger.Error("ErrorInsertTemplateGroup", zap.Error(err))
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := d.coll.InsertOne(ctx, record)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorInsertTemplateGroup", zap.Error(err))
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
id := result.InsertedID.(primitive.ObjectID).Hex()
|
||||||
|
|
||||||
|
d.logger.Info("InfoInsertTemplateGroup", zap.String("_id", id))
|
||||||
|
|
||||||
|
return id, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *TemplateGroup) GetByID(ctx context.Context, id string) (*model.TemplateGroup, error) {
|
||||||
|
objID, err := primitive.ObjectIDFromHex(id)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorGetTemplateGroup", zap.Error(err))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
filter := bson.M{"_id": objID}
|
||||||
|
|
||||||
|
var result model.TemplateGroup
|
||||||
|
err = d.coll.FindOne(ctx, filter).Decode(&result)
|
||||||
|
|
||||||
|
if err == mongo.ErrNoDocuments {
|
||||||
|
return nil, nil
|
||||||
|
} else {
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorGetTemplateGroup", zap.Error(err))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
d.logger.Info("ErrorGetTemplateGroup", zap.String("id", result.ID))
|
||||||
|
|
||||||
|
return &result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *TemplateGroup) GetListByUserID(ctx context.Context, userID string) ([]model.TemplateGroup, error) {
|
||||||
|
if userID == "" {
|
||||||
|
err := errors.New("user_id required")
|
||||||
|
d.logger.Error("ErrorGetListTemplateGroup")
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
filter := bson.M{"user_id": userID}
|
||||||
|
|
||||||
|
var result []model.TemplateGroup
|
||||||
|
|
||||||
|
cur, err := d.coll.Find(ctx, filter)
|
||||||
|
|
||||||
|
if err == mongo.ErrNoDocuments {
|
||||||
|
return nil, nil
|
||||||
|
} else {
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorGetTemplateGroup", zap.Error(err))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = cur.All(ctx, &result)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorGetListTemplateGroup", zap.Error(err))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
d.logger.Info("InfoGetListTemplateGroup")
|
||||||
|
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *TemplateGroup) Update(ctx context.Context, record *model.TemplateGroup) error {
|
||||||
|
objID, err := primitive.ObjectIDFromHex(record.ID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorUpdateTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
filter := bson.M{"_id": objID}
|
||||||
|
|
||||||
|
if record.UserID != "" {
|
||||||
|
filter["user_id"] = record.UserID
|
||||||
|
}
|
||||||
|
|
||||||
|
update := bson.M{"updated_at": time.Now()}
|
||||||
|
|
||||||
|
if record.Name != "" {
|
||||||
|
update["name"] = record.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = d.coll.UpdateOne(ctx, filter, bson.D{{"$set", update}})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorUpdateTemplateGroup")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
d.logger.Info("InfoUpdateTemplateGroup", zap.String("_id", record.ID))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *TemplateGroup) Delete(ctx context.Context, id string) error {
|
||||||
|
objID, err := primitive.ObjectIDFromHex(id)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorDeleteTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
filter := bson.M{"_id": objID}
|
||||||
|
_, err = d.coll.DeleteOne(ctx, filter)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorDeleteTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *TemplateGroup) DeleteByUserID(ctx context.Context, userID string) error {
|
||||||
|
if userID == "" {
|
||||||
|
err := errors.New("user_id required")
|
||||||
|
d.logger.Error("ErrorDeleteTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
filter := bson.M{"user_id": userID}
|
||||||
|
|
||||||
|
_, err := d.coll.DeleteMany(ctx, filter)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
d.logger.Error("ErrorDeleteTemplateGroup", zap.Error(err))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
@ -59,7 +59,7 @@ func (ca *ClientApp) GenerateOAuthUrl(userId, redirectUrl string) (string, error
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return ca.Config.AuthCodeURL(state, oauth2.AccessTypeOffline), nil
|
return ca.Config.AuthCodeURL(state, oauth2.AccessTypeOffline, oauth2.ApprovalForce), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ca *ClientApp) RefreshToken(ctx context.Context, oldToken *oauth2.Token) (*oauth2.Token, error) {
|
func (ca *ClientApp) RefreshToken(ctx context.Context, oldToken *oauth2.Token) (*oauth2.Token, error) {
|
||||||
@ -308,7 +308,7 @@ func (c *Client) MakeDefaultDirs(defaultId, defaultName, templateId, templateNam
|
|||||||
defaultDir = fl.Files[0]
|
defaultDir = fl.Files[0]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
defaultDir, err = c.Service.Files.Get(templateId).Do()
|
defaultDir, err = c.Service.Files.Get(defaultId).Do()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(err.Error(), "404") {
|
if strings.Contains(err.Error(), "404") {
|
||||||
defaultDir, err = c.PutResources(defaultName, "")
|
defaultDir, err = c.PutResources(defaultName, "")
|
||||||
|
421
handlers/amo.go
421
handlers/amo.go
@ -2,16 +2,11 @@ package handlers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"github.com/Pena-Co-Ltd/amocrm_templategen_back/amo"
|
|
||||||
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
|
||||||
"github.com/Pena-Co-Ltd/amocrm_templategen_back/templategen"
|
|
||||||
"github.com/Pena-Co-Ltd/amocrm_templategen_back/tools"
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/tools"
|
||||||
"github.com/gorilla/schema"
|
"github.com/gorilla/schema"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
"io"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -39,7 +34,7 @@ func (h *Handlers) AmoSaveToken(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
err = schema.NewDecoder().Decode(&req, r.Form)
|
err = schema.NewDecoder().Decode(&req, r.Form)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, 500)
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,138 +102,6 @@ func (h *Handlers) AmoSaveToken(w http.ResponseWriter, r *http.Request) {
|
|||||||
http.Redirect(w, r, state.RedirectUrl, http.StatusPermanentRedirect)
|
http.Redirect(w, r, state.RedirectUrl, http.StatusPermanentRedirect)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handlers) AmoWebhook(w http.ResponseWriter, r *http.Request) {
|
|
||||||
reqBody, err := io.ReadAll(r.Body)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, 200)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
p, err := url.ParseQuery(string(reqBody))
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, 200)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
leadId := p.Get("leads[status][0][id]")
|
|
||||||
subdomain := p.Get("account[subdomain]")
|
|
||||||
accId := p.Get("account[id]")
|
|
||||||
|
|
||||||
// Запрашиваем данные по аккаунту
|
|
||||||
amoData, err := h.dal.Amo.GetByAccountID(r.Context(), accId)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, 200)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
amoClient, err := h.Amo.NewClient(r.Context(), subdomain, amoData.Token(), "")
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusForbidden)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
lead, err := amoClient.GetLeadById(leadId)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, 200)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if lead != nil {
|
|
||||||
// fmt.Printf("Lead RESP:%+v\r\n", lead)
|
|
||||||
} else {
|
|
||||||
fmt.Println("Lead empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
dataTemplate := map[string]interface{}{}
|
|
||||||
|
|
||||||
// Добавляем Инфо Лида
|
|
||||||
for k, v := range templategen.AmoLeadFieldsToRuMap(lead) {
|
|
||||||
dataTemplate[k] = v
|
|
||||||
}
|
|
||||||
|
|
||||||
//filename := fmt.Sprintf("%v", dataTemplate["Filename"])
|
|
||||||
|
|
||||||
// Добавялем инфо контактов
|
|
||||||
contacts := []amo.Contact{}
|
|
||||||
for _, data := range lead.Embedded.Contacts {
|
|
||||||
contact, err := amoClient.GetContactById(strconv.Itoa(data.Id))
|
|
||||||
if err == nil {
|
|
||||||
contacts = append(contacts, *contact)
|
|
||||||
} else {
|
|
||||||
fmt.Println("Something Wrong1:", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dataTemplate["Контакты"] = templategen.AmoContactsFieldsToRuMap(contacts)
|
|
||||||
|
|
||||||
// Добавляем инфо компаний
|
|
||||||
companies := []amo.Company{}
|
|
||||||
for _, data := range lead.Embedded.Companies {
|
|
||||||
company, err := amoClient.GetCompanyById(strconv.Itoa(data.Id))
|
|
||||||
if err == nil {
|
|
||||||
companies = append(companies, *company)
|
|
||||||
} else {
|
|
||||||
fmt.Println("Something Wrong2:", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dataTemplate["Компании"] = templategen.AmoCompaniesFieldsToRuMap(companies)
|
|
||||||
|
|
||||||
template, err := h.dal.Template.GetByLeadId(r.Context(), leadId)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if template == nil {
|
|
||||||
h.reportError(w, err, http.StatusNotFound)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch template.StorageType {
|
|
||||||
case "gdisk":
|
|
||||||
gdiskData, err := h.dal.GDisk.GetByID(r.Context(), template.StorageID)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if gdiskData == nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
client, err := h.GDisk.NewClient(r.Context(), gdiskData.Token())
|
|
||||||
|
|
||||||
err = templategen.GDiskGenerateDoc(template, gdiskData.SaveFolderID, client, dataTemplate)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
case "yadisk":
|
|
||||||
yaDiskData, err := h.dal.YaDisk.GetByID(r.Context(), template.StorageID)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
client, err := h.YaDisk.NewClient(r.Context(), yaDiskData.Token(), "")
|
|
||||||
|
|
||||||
err = templategen.YaDiskGenerateDoc(template, yaDiskData.SaveFolder, client, dataTemplate)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
h.reportError(w, errors.New("got unknown storage"), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
sendResponse(w, 200, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
type RespAmoState struct {
|
type RespAmoState struct {
|
||||||
GenCount int `json:"gen_count"`
|
GenCount int `json:"gen_count"`
|
||||||
AuthYandexUrl string `json:"auth_yandex_url"`
|
AuthYandexUrl string `json:"auth_yandex_url"`
|
||||||
@ -249,11 +112,14 @@ type RespAmoState struct {
|
|||||||
Delete []int64 `json:"delete"`
|
Delete []int64 `json:"delete"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AmoState - получить актуальное состояние аккаунта пользователя в Amo
|
||||||
func (h *Handlers) AmoState(w http.ResponseWriter, r *http.Request, redirectUrn string) {
|
func (h *Handlers) AmoState(w http.ResponseWriter, r *http.Request, redirectUrn string) {
|
||||||
|
// TODO: get pena jwt
|
||||||
|
|
||||||
amoData := getAmoByJwt(r)
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
if amoData == nil {
|
if amoData == nil {
|
||||||
h.reportError(w, errors.New("amo account not found"), http.StatusUnauthorized)
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,7 +140,7 @@ func (h *Handlers) AmoState(w http.ResponseWriter, r *http.Request, redirectUrn
|
|||||||
"gdisk": gStorages,
|
"gdisk": gStorages,
|
||||||
}
|
}
|
||||||
|
|
||||||
redirectUri := fmt.Sprintf("https://%v/%v", amoData.Referer, redirectUrn)
|
redirectUri := "https://" + amoData.Referer + redirectUrn
|
||||||
authYandexUrl, err := h.YaDisk.GenerateOAuthUrl(amoData.UserID, redirectUri)
|
authYandexUrl, err := h.YaDisk.GenerateOAuthUrl(amoData.UserID, redirectUri)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
@ -300,291 +166,20 @@ func (h *Handlers) AmoState(w http.ResponseWriter, r *http.Request, redirectUrn
|
|||||||
sendResponse(w, 200, resp)
|
sendResponse(w, 200, resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReqAmoGetTemplate struct {
|
|
||||||
LeadId int64 `json:"lead_id"`
|
|
||||||
TemplateId string `json:"template_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// AmoGetTemplate - получить шаблон по LeadID или template.ID
|
|
||||||
func (h *Handlers) AmoGetTemplate(w http.ResponseWriter, r *http.Request) {
|
|
||||||
var req ReqAmoGetTemplate
|
|
||||||
|
|
||||||
amoData := getAmoByJwt(r)
|
|
||||||
|
|
||||||
if amoData == nil {
|
|
||||||
h.reportError(w, errors.New("amo account not found"), http.StatusUnauthorized)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err := decodePost(&req, r)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if req.TemplateId == "" && strconv.FormatInt(req.LeadId, 10) == "" {
|
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var template *model.Template
|
|
||||||
|
|
||||||
if req.TemplateId != "" {
|
|
||||||
template, err = h.dal.Template.GetByID(r.Context(), req.TemplateId)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if strconv.FormatInt(req.LeadId, 10) != "" {
|
|
||||||
template, err = h.dal.Template.GetByLeadId(r.Context(), strconv.FormatInt(req.LeadId, 10))
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if template == nil {
|
|
||||||
templateId, err := h.dal.Template.Insert(r.Context(), &model.Template{
|
|
||||||
UserID: amoData.UserID,
|
|
||||||
LeadId: strconv.FormatInt(req.LeadId, 10),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
template = &model.Template{ID: templateId}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sendResponse(w, 200, template)
|
|
||||||
}
|
|
||||||
|
|
||||||
type ReqAmoSetTemplate struct {
|
|
||||||
LeadId int64 `json:"lead_id"` // Required for insert/update
|
|
||||||
TemplateId string `json:"template_id"` // Required for update - может потом удалить ?
|
|
||||||
Filename string `json:"filename"` // Required for Yandex Disk
|
|
||||||
FileID string `json:"file_id"` // Required for Google Drive
|
|
||||||
StorageID string `json:"storage_id"` // Required. id gdisk or yadisk
|
|
||||||
Storage string `json:"storage"` // Required. yadisk, gdisk - Может удалить потом?
|
|
||||||
}
|
|
||||||
|
|
||||||
type RespAmoSetTemplate struct {
|
|
||||||
TemplateId string `json:"template_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// AmoSetTemplate - устанавливает/обновляет шаблон для сделки
|
|
||||||
func (h *Handlers) AmoSetTemplate(w http.ResponseWriter, r *http.Request) {
|
|
||||||
var req ReqAmoSetTemplate
|
|
||||||
|
|
||||||
amoData := getAmoByJwt(r)
|
|
||||||
|
|
||||||
if amoData == nil {
|
|
||||||
h.reportError(w, errors.New("amo account not found"), http.StatusUnauthorized)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err := decodePost(&req, r)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if strconv.FormatInt(req.LeadId, 10) == "" || req.Storage == "" || req.StorageID == "" {
|
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if req.Filename == "" && req.FileID == "" {
|
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Search/update template
|
|
||||||
|
|
||||||
var template *model.Template
|
|
||||||
|
|
||||||
update := &model.Template{
|
|
||||||
ID: req.TemplateId,
|
|
||||||
UserID: amoData.UserID,
|
|
||||||
LeadId: strconv.FormatInt(req.LeadId, 10),
|
|
||||||
Name: "Sample",
|
|
||||||
Filename: req.Filename,
|
|
||||||
StorageID: req.StorageID,
|
|
||||||
FileID: req.FileID,
|
|
||||||
IsDeleted: false,
|
|
||||||
}
|
|
||||||
|
|
||||||
templateId := ""
|
|
||||||
if req.TemplateId == "" {
|
|
||||||
template, err = h.dal.Template.GetByLeadId(r.Context(), strconv.FormatInt(req.LeadId, 10))
|
|
||||||
fmt.Println(0, template)
|
|
||||||
|
|
||||||
if template != nil {
|
|
||||||
err = h.dal.Template.UpdateByLeadID(r.Context(), update)
|
|
||||||
} else {
|
|
||||||
templateId, err = h.dal.Template.Insert(r.Context(), update)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = h.dal.Template.UpdateByID(r.Context(), update)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
sendResponse(w, 200, RespAmoSetTemplate{templateId})
|
|
||||||
}
|
|
||||||
|
|
||||||
type ReqAmoGenerateDoc struct {
|
|
||||||
LeadId int64 `json:"lead_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *Handlers) AmoGenerateDoc(w http.ResponseWriter, r *http.Request) {
|
|
||||||
var req ReqAmoGenerateDoc
|
|
||||||
|
|
||||||
amoData := getAmoByJwt(r)
|
|
||||||
|
|
||||||
if amoData == nil {
|
|
||||||
h.reportError(w, errors.New("amo account not found"), http.StatusUnauthorized)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err := decodePost(&req, r)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
leadId := strconv.FormatInt(req.LeadId, 10)
|
|
||||||
|
|
||||||
if leadId == "" {
|
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
template, err := h.dal.Template.GetByLeadId(r.Context(), leadId)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if template == nil {
|
|
||||||
h.reportError(w, err, http.StatusNotFound)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Получить данные по лиду
|
|
||||||
amoClient, err := h.Amo.NewClient(r.Context(), amoData.Referer, amoData.Token(), "")
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusForbidden)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
lead, err := amoClient.GetLeadById(leadId)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, 200)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if lead.Id == 0 {
|
|
||||||
fmt.Println("Lead empty")
|
|
||||||
}
|
|
||||||
|
|
||||||
dataTemplate := map[string]interface{}{}
|
|
||||||
|
|
||||||
// Добавляем Инфо Лида
|
|
||||||
for k, v := range templategen.AmoLeadFieldsToRuMap(lead) {
|
|
||||||
dataTemplate[k] = v
|
|
||||||
}
|
|
||||||
|
|
||||||
//filename := fmt.Sprintf("%v_%v_%v.docx", req.Filename, amoData.UserID, time.Now().Unix())
|
|
||||||
|
|
||||||
// Добавялем инфо контактов
|
|
||||||
contacts := []amo.Contact{}
|
|
||||||
for _, data := range lead.Embedded.Contacts {
|
|
||||||
contact, err := amoClient.GetContactById(strconv.Itoa(data.Id))
|
|
||||||
if err == nil {
|
|
||||||
contacts = append(contacts, *contact)
|
|
||||||
} else {
|
|
||||||
fmt.Println("Something Wrong1:", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dataTemplate["Контакты"] = templategen.AmoContactsFieldsToRuMap(contacts)
|
|
||||||
|
|
||||||
// Добавляем инфо компаний
|
|
||||||
companies := []amo.Company{}
|
|
||||||
for _, data := range lead.Embedded.Companies {
|
|
||||||
company, err := amoClient.GetCompanyById(strconv.Itoa(data.Id))
|
|
||||||
if err == nil {
|
|
||||||
companies = append(companies, *company)
|
|
||||||
} else {
|
|
||||||
fmt.Println("Something Wrong2:", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dataTemplate["Компании"] = templategen.AmoCompaniesFieldsToRuMap(companies)
|
|
||||||
|
|
||||||
switch template.StorageType {
|
|
||||||
case "gdisk":
|
|
||||||
gdiskData, err := h.dal.GDisk.GetByID(r.Context(), template.StorageID)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if gdiskData == nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
client, err := h.GDisk.NewClient(r.Context(), gdiskData.Token())
|
|
||||||
|
|
||||||
err = templategen.GDiskGenerateDoc(template, gdiskData.SaveFolderID, client, dataTemplate)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
case "yadisk":
|
|
||||||
yaDiskData, err := h.dal.YaDisk.GetByID(r.Context(), template.StorageID)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
client, err := h.YaDisk.NewClient(r.Context(), yaDiskData.Token(), "")
|
|
||||||
|
|
||||||
err = templategen.YaDiskGenerateDoc(template, yaDiskData.SaveFolder, client, dataTemplate)
|
|
||||||
if err != nil {
|
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
h.reportError(w, errors.New("got unknown storage"), http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
sendResponse(w, http.StatusOK, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
type ReqAmoAccessRules struct {
|
type ReqAmoAccessRules struct {
|
||||||
Visibility []int64 `json:"visibility"`
|
Visibility []int64 `json:"visibility"`
|
||||||
Creation []int64 `json:"creation"`
|
Creation []int64 `json:"creation"`
|
||||||
Delete []int64 `json:"delete"`
|
Delete []int64 `json:"delete"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AmoAccessRules - задать правила для пользователя
|
||||||
func (h *Handlers) AmoAccessRules(w http.ResponseWriter, r *http.Request) {
|
func (h *Handlers) AmoAccessRules(w http.ResponseWriter, r *http.Request) {
|
||||||
var req ReqAmoAccessRules
|
var req ReqAmoAccessRules
|
||||||
|
|
||||||
amoData := getAmoByJwt(r)
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
if amoData == nil {
|
if amoData == nil {
|
||||||
h.reportError(w, errors.New("amo account not found"), http.StatusUnauthorized)
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,62 +2,95 @@ package handlers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
type RespTemplateNew struct {
|
type ReqTemplateSet struct {
|
||||||
Name string `json:"name"`
|
LeadId int64 `json:"lead_id"` // Required for insert/update
|
||||||
Filename string `json:"filename"`
|
TemplateId string `json:"template_id"` // Required for update - может потом удалить ?
|
||||||
Storage string `json:"storage"`
|
File string `json:"file"` // Required.
|
||||||
|
StorageID string `json:"storage_id"` // Required. id gdisk or yadisk
|
||||||
|
Storage string `json:"storage"` // Required. yadisk, gdisk - Может удалить потом?
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handlers) TemplateNew(w http.ResponseWriter, r *http.Request) {
|
type RespTemplateSet struct {
|
||||||
var resp RespTemplateNew
|
TemplateId string `json:"template_id"`
|
||||||
|
}
|
||||||
|
|
||||||
user := getJwtUser(r)
|
// TemplateSet - устанавливает/обновляет шаблон для сделки
|
||||||
|
func (h *Handlers) TemplateSet(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req ReqTemplateSet
|
||||||
|
|
||||||
if user == nil {
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
|
if amoData == nil {
|
||||||
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err := decodePost(&resp, r)
|
err := decodePost(&req, r)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.Name == "" || resp.Filename == "" {
|
if req.LeadId <= 0 || req.Storage == "" || req.StorageID == "" {
|
||||||
err = errors.New("got empty name or filename")
|
h.reportError(w, errors.New("bad request"), http.StatusBadRequest)
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = h.dal.Template.Insert(r.Context(), &model.Template{
|
if req.File == "" {
|
||||||
UserID: user.UserID,
|
h.reportError(w, errors.New("file required"), http.StatusBadRequest)
|
||||||
Name: resp.Name,
|
return
|
||||||
Filename: resp.Filename,
|
}
|
||||||
StorageID: resp.Storage,
|
|
||||||
|
// Search/update template
|
||||||
|
|
||||||
|
var template *model.Template
|
||||||
|
|
||||||
|
update := &model.Template{
|
||||||
|
ID: req.TemplateId,
|
||||||
|
UserID: amoData.UserID,
|
||||||
|
LeadId: strconv.FormatInt(req.LeadId, 10),
|
||||||
|
Name: "Sample",
|
||||||
|
File: req.File,
|
||||||
|
StorageID: req.StorageID,
|
||||||
IsDeleted: false,
|
IsDeleted: false,
|
||||||
})
|
}
|
||||||
|
|
||||||
|
templateId := ""
|
||||||
|
if req.TemplateId == "" {
|
||||||
|
template, err = h.dal.Template.GetByLeadId(r.Context(), strconv.FormatInt(req.LeadId, 10))
|
||||||
|
fmt.Println(0, template)
|
||||||
|
|
||||||
|
if template != nil {
|
||||||
|
err = h.dal.Template.UpdateByLeadID(r.Context(), update)
|
||||||
|
} else {
|
||||||
|
templateId, err = h.dal.Template.Insert(r.Context(), update)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = h.dal.Template.UpdateByID(r.Context(), update)
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sendResponse(w, 200, RespTemplateSet{templateId})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handlers) TemplateGetListByUser(w http.ResponseWriter, r *http.Request) {
|
func (h *Handlers) TemplateGetListByUser(w http.ResponseWriter, r *http.Request) {
|
||||||
user := getJwtUser(r)
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
if user == nil {
|
if amoData == nil {
|
||||||
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
result, err := h.dal.Template.GetListByUserID(r.Context(), amoData.UserID)
|
||||||
result, err := h.dal.Template.GetListByUserID(r.Context(), user.UserID)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
@ -66,82 +99,138 @@ func (h *Handlers) TemplateGetListByUser(w http.ResponseWriter, r *http.Request)
|
|||||||
sendResponse(w, 200, result)
|
sendResponse(w, 200, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
type RespTemplateGetByID struct {
|
type ReqTemplateGetListByGroup struct {
|
||||||
ID string `json:"id"`
|
GroupID string `json:"group_id"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handlers) TemplateGetByID(w http.ResponseWriter, r *http.Request) {
|
func (h *Handlers) TemplateGetListByGroup(w http.ResponseWriter, r *http.Request) {
|
||||||
var resp RespTemplateGetByID
|
var req ReqTemplateGetListByGroup
|
||||||
|
|
||||||
user := getJwtUser(r)
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
if user == nil {
|
if amoData == nil {
|
||||||
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err := decodePost(&resp, r)
|
err := decodePost(&req, r)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.ID == "" {
|
if req.GroupID == "" {
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
h.reportError(w, errors.New("group_id required"), http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := h.dal.Template.GetByID(r.Context(), resp.ID)
|
resp, err := h.dal.Template.GetListByGroupID(r.Context(), req.GroupID, amoData.UserID)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
sendResponse(w, 200, result)
|
sendResponse(w, http.StatusOK, resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
type RespTemplateUpdate struct {
|
type ReqTemplateGet struct {
|
||||||
ID string `json:"id"`
|
LeadId int64 `json:"lead_id"`
|
||||||
Name string `json:"name"`
|
TemplateId string `json:"template_id"`
|
||||||
TemplateFilename string `json:"template_filename"`
|
}
|
||||||
|
|
||||||
|
func (h *Handlers) TemplateGet(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req ReqTemplateGet
|
||||||
|
|
||||||
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
|
if amoData == nil {
|
||||||
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := decodePost(&req, r)
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.TemplateId == "" && strconv.FormatInt(req.LeadId, 10) == "" {
|
||||||
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var template *model.Template
|
||||||
|
|
||||||
|
if req.TemplateId != "" {
|
||||||
|
template, err = h.dal.Template.GetByID(r.Context(), req.TemplateId)
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if strconv.FormatInt(req.LeadId, 10) != "" {
|
||||||
|
template, err = h.dal.Template.GetByLeadId(r.Context(), strconv.FormatInt(req.LeadId, 10))
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if template == nil {
|
||||||
|
templateId, err := h.dal.Template.Insert(r.Context(), &model.Template{
|
||||||
|
UserID: amoData.UserID,
|
||||||
|
LeadId: strconv.FormatInt(req.LeadId, 10),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
template = &model.Template{ID: templateId}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sendResponse(w, 200, template)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReqTemplateUpdate struct {
|
||||||
|
ID string `json:"id"` // Template ID
|
||||||
|
Name string `json:"name"` // Имя сделки
|
||||||
|
File string `json:"file"` //
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handlers) TemplateUpdate(w http.ResponseWriter, r *http.Request) {
|
func (h *Handlers) TemplateUpdate(w http.ResponseWriter, r *http.Request) {
|
||||||
var resp RespTemplateUpdate
|
var req ReqTemplateUpdate
|
||||||
|
|
||||||
user := getJwtUser(r)
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
if user == nil {
|
if amoData == nil {
|
||||||
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
err := decodePost(&req, r)
|
||||||
err := decodePost(&resp, r)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.Name == "" && resp.TemplateFilename == "" {
|
if req.ID == "" {
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
h.reportError(w, errors.New("id required"), http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
record := &model.Template{
|
record := &model.Template{
|
||||||
ID: resp.ID,
|
ID: req.ID,
|
||||||
UserID: user.UserID,
|
UserID: amoData.UserID,
|
||||||
Name: resp.Name,
|
Name: req.Name,
|
||||||
Filename: resp.TemplateFilename,
|
File: req.File,
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.ID != "" {
|
err = h.dal.Template.UpdateByID(r.Context(), record)
|
||||||
err = h.dal.Template.UpdateByID(r.Context(), record)
|
|
||||||
} else {
|
|
||||||
err = h.dal.Template.UpdateByNameAndUserID(r.Context(), record)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
@ -151,38 +240,32 @@ func (h *Handlers) TemplateUpdate(w http.ResponseWriter, r *http.Request) {
|
|||||||
sendResponse(w, 200, nil)
|
sendResponse(w, 200, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
type RespTemplateDelete struct {
|
type ReqTemplateDelete struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
Name string `json:"name"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handlers) TemplateDelete(w http.ResponseWriter, r *http.Request) {
|
func (h *Handlers) TemplateDelete(w http.ResponseWriter, r *http.Request) {
|
||||||
var resp RespTemplateDelete
|
var req ReqTemplateDelete
|
||||||
|
|
||||||
user := getJwtUser(r)
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
if user == nil {
|
if amoData == nil {
|
||||||
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
err := decodePost(&req, r)
|
||||||
err := decodePost(&resp, r)
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.ID == "" && resp.Name == "" {
|
if req.ID == "" {
|
||||||
h.reportError(w, err, http.StatusBadRequest)
|
h.reportError(w, errors.New("id required"), http.StatusBadRequest)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if resp.ID != "" {
|
err = h.dal.Template.DeleteByID(r.Context(), req.ID)
|
||||||
err = h.dal.Template.DeleteByID(r.Context(), resp.ID)
|
|
||||||
} else {
|
|
||||||
err = h.dal.Template.DeleteByNameAndUserID(r.Context(), resp.Name, user.UserID)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.reportError(w, err, http.StatusInternalServerError)
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
@ -192,13 +275,13 @@ func (h *Handlers) TemplateDelete(w http.ResponseWriter, r *http.Request) {
|
|||||||
sendResponse(w, 200, nil)
|
sendResponse(w, 200, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
type RespTemplateInit struct {
|
type ReqTemplateInit struct {
|
||||||
EventName string `json:"event_name"`
|
EventName string `json:"event_name"`
|
||||||
Data map[string]interface{} `json:"data"`
|
Data map[string]interface{} `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handlers) TemplateInit(w http.ResponseWriter, r *http.Request) {
|
func (h *Handlers) TemplateInit(w http.ResponseWriter, r *http.Request) {
|
||||||
//var resp RespTemplateInit
|
//var req ReqTemplateInit
|
||||||
//
|
//
|
||||||
//user := getJwtUser(r)
|
//user := getJwtUser(r)
|
||||||
//
|
//
|
||||||
@ -215,7 +298,7 @@ func (h *Handlers) TemplateInit(w http.ResponseWriter, r *http.Request) {
|
|||||||
//}
|
//}
|
||||||
//
|
//
|
||||||
//// Ищем ивент
|
//// Ищем ивент
|
||||||
//t, err := h.dal.Template.GetByNameAndUserID(r.Context(), resp.EventName, user.UserID)
|
//t, err := h.dal.Template.GetByNameAndUserID(r.Context(), resp.EventName, amoData.UserID)
|
||||||
//
|
//
|
||||||
//if err != nil {
|
//if err != nil {
|
||||||
// h.reportError(w, err, http.StatusInternalServerError)
|
// h.reportError(w, err, http.StatusInternalServerError)
|
||||||
@ -227,7 +310,7 @@ func (h *Handlers) TemplateInit(w http.ResponseWriter, r *http.Request) {
|
|||||||
// return
|
// return
|
||||||
//}
|
//}
|
||||||
//
|
//
|
||||||
//YaDiskData, err := h.dal.YaDisk.GetByUserID(r.Context(), user.UserID)
|
//YaDiskData, err := h.dal.YaDisk.GetListByUserID(r.Context(), amoData.UserID)
|
||||||
//if err != nil {
|
//if err != nil {
|
||||||
// h.reportError(w, err, http.StatusInternalServerError)
|
// h.reportError(w, err, http.StatusInternalServerError)
|
||||||
// return
|
// return
|
||||||
|
251
handlers/templateGroup.go
Normal file
251
handlers/templateGroup.go
Normal file
@ -0,0 +1,251 @@
|
|||||||
|
package handlers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ReqTemplateGroupCreate struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type RespTemplateGroupCreate struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handlers) TemplateGroupCreate(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req ReqTemplateGroupCreate
|
||||||
|
|
||||||
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
|
if amoData == nil {
|
||||||
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := decodePost(&req, r)
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.Name == "" {
|
||||||
|
h.reportError(w, errors.New("name required"), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
groupID, err := h.dal.TemplateGroup.Insert(r.Context(), &model.TemplateGroup{
|
||||||
|
UserID: amoData.UserID,
|
||||||
|
Name: req.Name,
|
||||||
|
})
|
||||||
|
|
||||||
|
sendResponse(w, http.StatusOK, &RespTemplateGroupCreate{ID: groupID})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handlers) TemplateGroupGet(w http.ResponseWriter, r *http.Request) {
|
||||||
|
id := mux.Vars(r)["id"]
|
||||||
|
|
||||||
|
if id == "" {
|
||||||
|
h.reportError(w, errors.New("id required"), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := h.dal.TemplateGroup.GetByID(r.Context(), id)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sendResponse(w, http.StatusOK, &resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handlers) TemplateGroupGetList(w http.ResponseWriter, r *http.Request) {
|
||||||
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
|
if amoData == nil {
|
||||||
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := h.dal.TemplateGroup.GetListByUserID(r.Context(), amoData.UserID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sendResponse(w, http.StatusOK, &resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReqTemplateGroupEdit struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handlers) TemplateGroupEdit(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req ReqTemplateGroupEdit
|
||||||
|
|
||||||
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
|
if amoData == nil {
|
||||||
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := decodePost(&req, r)
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.ID == "" {
|
||||||
|
h.reportError(w, errors.New("id required"), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.Name == "" {
|
||||||
|
h.reportError(w, errors.New("name required"), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = h.dal.TemplateGroup.Update(r.Context(), &model.TemplateGroup{
|
||||||
|
ID: req.ID,
|
||||||
|
UserID: amoData.UserID,
|
||||||
|
Name: req.Name,
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReqTemplateGroupDelete struct {
|
||||||
|
ID string `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handlers) TemplateGroupDelete(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req ReqTemplateGroupDelete
|
||||||
|
|
||||||
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
|
if amoData == nil {
|
||||||
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := decodePost(&req, r)
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.ID == "" {
|
||||||
|
h.reportError(w, errors.New("group_id required"), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: Крайне желательно переписать на транзакции!
|
||||||
|
err = h.dal.Template.DeleteGroupFromAll(r.Context(), req.ID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = h.dal.TemplateGroup.Delete(r.Context(), req.ID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReqTemplateGroupPut struct {
|
||||||
|
GroupID string `json:"group_id"`
|
||||||
|
TemplateID string `json:"template_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handlers) TemplateGroupPut(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req ReqTemplateGroupPut
|
||||||
|
|
||||||
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
|
if amoData == nil {
|
||||||
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := decodePost(&req, r)
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.TemplateID == "" {
|
||||||
|
h.reportError(w, errors.New("template_id required"), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.GroupID == "" {
|
||||||
|
h.reportError(w, errors.New("group_id required"), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = h.dal.Template.PushGroup(r.Context(), req.TemplateID, req.GroupID, amoData.UserID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReqTemplateGroupRemove struct {
|
||||||
|
GroupID string `json:"group_id"`
|
||||||
|
TemplateID string `json:"template_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Handlers) TemplateGroupRemove(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req ReqTemplateGroupRemove
|
||||||
|
|
||||||
|
amoData := getAmoByJwt(r)
|
||||||
|
|
||||||
|
if amoData == nil {
|
||||||
|
h.reportError(w, ErrorUnauthorized, http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err := decodePost(&req, r)
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.TemplateID == "" {
|
||||||
|
h.reportError(w, errors.New("template_id required"), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.GroupID == "" {
|
||||||
|
h.reportError(w, errors.New("group_id required"), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = h.dal.Template.PullGroup(r.Context(), req.TemplateID, req.GroupID, amoData.UserID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
h.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
}
|
28
main.go
28
main.go
@ -97,11 +97,8 @@ func main() {
|
|||||||
r.HandleFunc("/amo/state", func(w http.ResponseWriter, r *http.Request) {
|
r.HandleFunc("/amo/state", func(w http.ResponseWriter, r *http.Request) {
|
||||||
h.AmoState(w, r, opts.AmoRedirectUrn)
|
h.AmoState(w, r, opts.AmoRedirectUrn)
|
||||||
})
|
})
|
||||||
r.HandleFunc("/amo/webhook", h.AmoWebhook)
|
r.HandleFunc("/amo/webhook", h.GeneratorByAmoWebhook)
|
||||||
r.HandleFunc("/amo/gdisk/getTemplateDir", h.GDiskGetDirTemplate)
|
r.HandleFunc("/amo/generateDoc", h.GeneratorByAmoLead)
|
||||||
r.HandleFunc("/amo/getTemplate", h.AmoGetTemplate)
|
|
||||||
r.HandleFunc("/amo/setTemplate", h.AmoSetTemplate)
|
|
||||||
r.HandleFunc("/amo/generateDoc", h.AmoGenerateDoc)
|
|
||||||
r.HandleFunc("/amo/access_rules", h.AmoAccessRules)
|
r.HandleFunc("/amo/access_rules", h.AmoAccessRules)
|
||||||
|
|
||||||
// Set rules for Amo end-points
|
// Set rules for Amo end-points
|
||||||
@ -118,6 +115,7 @@ func main() {
|
|||||||
r.HandleFunc("/yadisk/resources/put", h.YaDiskPutResources)
|
r.HandleFunc("/yadisk/resources/put", h.YaDiskPutResources)
|
||||||
r.HandleFunc("/yadisk/resources/delete", h.YaDiskDeleteResources)
|
r.HandleFunc("/yadisk/resources/delete", h.YaDiskDeleteResources)
|
||||||
|
|
||||||
|
r.HandleFunc("/gdisk/getTemplateDir", h.GDiskGetDirTemplate) // устарело?
|
||||||
r.HandleFunc("/gdisk", h.GDiskSaveToken)
|
r.HandleFunc("/gdisk", h.GDiskSaveToken)
|
||||||
r.HandleFunc("/gdisk/setSettings", h.GDiskSetSettings)
|
r.HandleFunc("/gdisk/setSettings", h.GDiskSetSettings)
|
||||||
r.HandleFunc("/gdisk/getList", h.GDiskGetList)
|
r.HandleFunc("/gdisk/getList", h.GDiskGetList)
|
||||||
@ -126,13 +124,27 @@ func main() {
|
|||||||
r.HandleFunc("/gdisk/resources/put", h.GDiskPutResources)
|
r.HandleFunc("/gdisk/resources/put", h.GDiskPutResources)
|
||||||
r.HandleFunc("/gdisk/resources/delete", h.GDiskDeleteResources)
|
r.HandleFunc("/gdisk/resources/delete", h.GDiskDeleteResources)
|
||||||
|
|
||||||
r.HandleFunc("/template/new", h.TemplateNew)
|
r.HandleFunc("/template/set", h.TemplateSet)
|
||||||
r.HandleFunc("/template/getById", h.TemplateGetByID)
|
r.HandleFunc("/template/get", h.TemplateGet)
|
||||||
r.HandleFunc("/template/getListByUser", h.TemplateGetListByUser)
|
r.HandleFunc("/template/getListByUser", h.TemplateGetListByUser)
|
||||||
|
r.HandleFunc("/template/getListByGroup", h.TemplateGetListByGroup)
|
||||||
r.HandleFunc("/template/update", h.TemplateUpdate)
|
r.HandleFunc("/template/update", h.TemplateUpdate)
|
||||||
r.HandleFunc("/template/delete", h.TemplateDelete)
|
r.HandleFunc("/template/delete", h.TemplateDelete)
|
||||||
r.HandleFunc("/template/init", h.TemplateInit)
|
r.HandleFunc("/template/init", h.TemplateInit)
|
||||||
|
|
||||||
|
r.HandleFunc("/group/create", h.TemplateGroupCreate)
|
||||||
|
r.HandleFunc("/group/getList", h.TemplateGroupGetList)
|
||||||
|
r.HandleFunc("/group/edit", h.TemplateGroupEdit)
|
||||||
|
r.HandleFunc("/group/put", h.TemplateGroupPut)
|
||||||
|
r.HandleFunc("/group/remove", h.TemplateGroupRemove)
|
||||||
|
r.HandleFunc("/group/delete", h.TemplateGroupDelete)
|
||||||
|
r.HandleFunc("/group/{id}", h.TemplateGroupGet)
|
||||||
|
|
||||||
|
r.HandleFunc("/generator/byAmoLead", h.GeneratorByAmoLead)
|
||||||
|
r.HandleFunc("/generator/byData", h.GeneratorByData)
|
||||||
|
r.HandleFunc("/generator/byTemplate", h.GeneratorByData)
|
||||||
|
r.HandleFunc("/generator/byAmoWebhook", h.GeneratorByAmoWebhook)
|
||||||
|
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
// Middlewares
|
// Middlewares
|
||||||
@ -143,7 +155,7 @@ func main() {
|
|||||||
mw.MiddlewareCors,
|
mw.MiddlewareCors,
|
||||||
// mw.MiddlewareJwt, TODO: Переделать под Пеновский сервис авторизации
|
// mw.MiddlewareJwt, TODO: Переделать под Пеновский сервис авторизации
|
||||||
mw.MiddlewareAmoJwt,
|
mw.MiddlewareAmoJwt,
|
||||||
//mw.MiddlewareAmoPlug,
|
mw.MiddlewareAmoPlug,
|
||||||
mw.Logger,
|
mw.Logger,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -263,19 +263,29 @@ func (mw *Middleware) MiddlewareAmoJwt(next http.Handler) http.Handler {
|
|||||||
|
|
||||||
func (mw *Middleware) MiddlewareAmoPlug(next http.Handler) http.Handler {
|
func (mw *Middleware) MiddlewareAmoPlug(next http.Handler) http.Handler {
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
data, err := mw.dal.Amo.GetByID(r.Context(), "63226edec2259da3375fe2a4")
|
if strings.Contains(r.URL.String(), "/assets/") {
|
||||||
|
next.ServeHTTP(w, r)
|
||||||
if err != nil {
|
|
||||||
mw.reportError(w, err, http.StatusInternalServerError)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if data == nil {
|
ctx := r.Context()
|
||||||
mw.reportError(w, errors.New("amo account not found"), http.StatusUnauthorized)
|
|
||||||
return
|
if r.Header.Get("TestAuth") == "75bc853ae763ffc36cad97069682fed1" {
|
||||||
|
data, err := mw.dal.Amo.GetByID(r.Context(), "63226edec2259da3375fe2a4")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
mw.reportError(w, err, http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if data == nil {
|
||||||
|
mw.reportError(w, errors.New("amo account not found"), http.StatusUnauthorized)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = context.WithValue(ctx, "amoData", data)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context.WithValue(r.Context(), "amoData", data)
|
|
||||||
next.ServeHTTP(w, r.WithContext(ctx))
|
next.ServeHTTP(w, r.WithContext(ctx))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -1,32 +1,32 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
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
|
||||||
LiASDdNrOPfTm8Zu86YRPQ==
|
Xpf0e6rBigJ5FrkAlPU8rg==
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
|
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
|
||||||
|
@ -1,28 +1,28 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
-----BEGIN PRIVATE KEY-----
|
||||||
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
|
||||||
CzVV6EzOmItREJw+VHxmrNXR1Q==
|
6kat3P/xhuX2aBJ25n+DEmwt
|
||||||
-----END PRIVATE KEY-----
|
-----END PRIVATE KEY-----
|
||||||
|
@ -1,32 +1,32 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIFLDCCBBSgAwIBAgISBNp2pcVawV6gitDwFsPBq07LMA0GCSqGSIb3DQEBCwUA
|
MIIFLzCCBBegAwIBAgISBIKRgwCxoXxJBRbBPlm6eCkqMA0GCSqGSIb3DQEBCwUA
|
||||||
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
|
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
|
||||||
EwJSMzAeFw0yMjA4MTIwOTA0MDRaFw0yMjExMTAwOTA0MDNaMB8xHTAbBgNVBAMT
|
EwJSMzAeFw0yMjExMTAxNTQ2MDFaFw0yMzAyMDgxNTQ2MDBaMB8xHTAbBgNVBAMT
|
||||||
FHRlbXBnZW4ucGVuYS5kaWdpdGFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
FHRlbXBnZW4ucGVuYS5kaWdpdGFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
||||||
CgKCAQEAwjx66/bRTsxhwZJu3XP/+Y2GO7c1mMLU2aX1ecIwd2T09rm5dadAmy2t
|
CgKCAQEA40kviFwOnMG7cWAPSGrHG2qZYOt4xtsrFJ9WQjfBmRuBPueM6gKzfrEt
|
||||||
vNWa9fPl9I0aAu62gmmfw4ZsA95QmwhRkXPwLxUdWcAAk1PkPw/v9XhPIIvou8Ql
|
rcBpjt/sMVD2LG373rUzqrphjFfGa/ECRlyJauJd405ZgC0UaQgvzMh49wCsN9HX
|
||||||
pYmrMLvywbW5S0i+uDviEfkVIXcPb8FBXuxuY/rjg2gBioNXMv2bPO2Py0gMVoom
|
a3MMlLUKjrkpD3xI3rSb/WT67ehl8yCG+PPA67vftUykVtATV/muw5IIgxLeM9Vq
|
||||||
uvpKPIqEqydf4XbRZmjTmTMQIHAoy6IaAAVqpvXVHZCZYW+CzNMidr8Q5wYfaPhE
|
Ae2xkKSHs26weViThf9fc2Mqcggy27DjAVIdNW3C54UM9rJqMy4ns5Wms23GUPFx
|
||||||
djjimsMqhURASd0xh0eUgJCeSOEfggubOnJRukvDphM6rAl7MgAIO/sXFbUlGTzq
|
QZLDrzEAm1adh5xeejw67Wz46wO+uqDXdBLUfni+cac3c7tS1eI4U1YbSlDiGNh3
|
||||||
0Ecu3BkoFCoW1+nHnSN+RrEpXaMMIwIDAQABo4ICTTCCAkkwDgYDVR0PAQH/BAQD
|
MHjBY++4zInJ7Fthy7+FYvKNO7x0cwIDAQABo4ICUDCCAkwwDgYDVR0PAQH/BAQD
|
||||||
AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAA
|
AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAA
|
||||||
MB0GA1UdDgQWBBTCU7iSTiMfwFfgGJzMHwLuR71kRjAfBgNVHSMEGDAWgBQULrMX
|
MB0GA1UdDgQWBBQ/RmfsuKHMgHNMwC+PZpT4EdpqTzAfBgNVHSMEGDAWgBQULrMX
|
||||||
t1hWy65QCUDmH6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUHMAGGFWh0
|
t1hWy65QCUDmH6+dixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUHMAGGFWh0
|
||||||
dHA6Ly9yMy5vLmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3IzLmkubGVu
|
dHA6Ly9yMy5vLmxlbmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3IzLmkubGVu
|
||||||
Y3Iub3JnLzAfBgNVHREEGDAWghR0ZW1wZ2VuLnBlbmEuZGlnaXRhbDBMBgNVHSAE
|
Y3Iub3JnLzAfBgNVHREEGDAWghR0ZW1wZ2VuLnBlbmEuZGlnaXRhbDBMBgNVHSAE
|
||||||
RTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpodHRw
|
RTBDMAgGBmeBDAECATA3BgsrBgEEAYLfEwEBATAoMCYGCCsGAQUFBwIBFhpodHRw
|
||||||
Oi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQIGCisGAQQB1nkCBAIEgfMEgfAA7gB1
|
Oi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCCAQUGCisGAQQB1nkCBAIEgfYEgfMA8QB2
|
||||||
AEHIyrHfIkZKEMahOglCh15OMYsbA+vrS8do8JBilgb2AAABgpGCy70AAAQDAEYw
|
AHoyjFTYty22IOo44FIe6YQWcDIThU070ivBOlejUutSAAABhGJvJJ4AAAQDAEcw
|
||||||
RAIgGjvo2jRWbHyYzD9wlkoo9mb18Nk9WE5v1CTaeRL1sLQCIHlxq+JeV5yVIaZy
|
RQIhAJzFvPteZXrvvLma6wEYaQ5W3zZqLHfAJMlld8WIftaJAiAdUNPz8J5Xulh5
|
||||||
9ar5bVbcq2+YwQAFi7ib4f5+FnW0AHUARqVV63X6kSAwtaKJafTzfREsQXS+/Um4
|
B+UcFx2Jfeju91wVI8A9iGg/W8BxjwB3ALc++yTfnE26dfI5xbpY9Gxd/ELPep81
|
||||||
havy/HD+bUcAAAGCkYLL0wAABAMARjBEAiBiWxTVErSwR+JTbnn1M7QppVF2CbhT
|
xJ4dCYEl7bSZAAABhGJvJm8AAAQDAEgwRgIhAIRsIB/wJJYSm1On8JpT9diopWjC
|
||||||
7pfmT2FufBJs4AIgXlpcBRHlX29gSVRImcwj2cH9f7n7RZ+5ZtBmHftEZv8wDQYJ
|
HoRRPPi7QSPQ8M6mAiEApSN8uNUkm6Jwd6k7hva7T/4k+q4W7PvfCzAYJ3PDAREw
|
||||||
KoZIhvcNAQELBQADggEBAJaiZaBddcttGaG8jyOur+QFgMOtyO8nD6Ne4NIzV9YX
|
DQYJKoZIhvcNAQELBQADggEBAGwPKlx89nmfocc8gG9j8/KGbPysHETqGd2pBV88
|
||||||
183xXMhKz1TIGiZTTTxq/aP5LSyIz+jf7tSY5JDz+7bbw8t2wMs1AH8KYwZGMpdX
|
11TjtLNyMjdDf9RGb7OjdzuHyKGsDh0Ba3A9tzV06Dd1BFTfjDJOJ13f2aW99CUR
|
||||||
JTXPzI32Byk85xW9vAQ9xRSqyRbf9D5/2jBBFHiUe/EG9ZExrvZ0lJFJJwhRl4QV
|
M04iGRdkd9ijAD8RWOxAs9KiQZnSYiV3k3C4Iuv6/Mit/OlUoaH4TS3tYK5rHiav
|
||||||
t+7/GiqAREslYenXWjlZ1CI+Ub2UOdpcuBPNs8Hf+yFjo/lyaG9ianQUqN/yK8iu
|
WjOQLSqtRoMo2ZecAjfBFvc1gzUaSg3gV3QIfipC0HhOFdKbU6uCbz1NsblDFsEM
|
||||||
VeMyKQbShVsWB2DosBeRjslIrrBmyzWdmRu+xx5ZHWl4d2K6J/6JqqMyZdf5Nmvk
|
o4vMrOgvfBWs0gudjxLYYM7y5kdHVdgyqNzpL8oMV2qdQMYilfLhGpU1WXJu5RWk
|
||||||
4fAgEuI3Gf8zis3+LfQCf3eF4G1Ql9uGUbnZlkFg/u8=
|
5cl3oqy7zFFl3TSP5Iq4RxO6PvN0UAFjIFgnaXrai2zRzP4=
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
|
MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw
|
||||||
|
@ -1,28 +1,28 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
-----BEGIN PRIVATE KEY-----
|
||||||
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
|
||||||
RT6t39pnS2hkQxnHtwr0iog=
|
POpKTvY6wV23WwXZid44TBQ=
|
||||||
-----END PRIVATE KEY-----
|
-----END PRIVATE KEY-----
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
package templategen
|
package templategen
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
|
|
||||||
"github.com/Pena-Co-Ltd/amocrm_templategen_back/gdisk"
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/gdisk"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GDiskGenerateDoc(template *model.Template, saveFolderID string, client *GDisk.Client, data interface{}) error {
|
func GDiskGenerateDoc(file, name, userID, saveFolderID string, client *GDisk.Client, data interface{}) error {
|
||||||
filename := GenerateDocName(template.Name, template.UserID)
|
filename := GenerateDocName(name)
|
||||||
|
|
||||||
// Download file
|
// Download file
|
||||||
downloaded := TempDownloaded + "/" + filename
|
downloaded := TempDownloaded + "/" + filename
|
||||||
err := client.DownloadFile(downloaded, template.FileID)
|
err := client.DownloadFile(downloaded, file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
package templategen
|
package templategen
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/Pena-Co-Ltd/amocrm_templategen_back/dal/model"
|
|
||||||
"github.com/Pena-Co-Ltd/amocrm_templategen_back/yadisk"
|
"github.com/Pena-Co-Ltd/amocrm_templategen_back/yadisk"
|
||||||
)
|
)
|
||||||
|
|
||||||
func YaDiskGenerateDoc(template *model.Template, saveFolder string, client *YaDisk.Client, data interface{}) error {
|
func YaDiskGenerateDoc(file, name, userID, saveFolder string, client *YaDisk.Client, data interface{}) error {
|
||||||
filename := GenerateDocName(template.Name, template.UserID)
|
filename := GenerateDocName(name)
|
||||||
|
|
||||||
// Download file
|
// Download file
|
||||||
downloaded := TempDownloaded + "/" + filename
|
downloaded := TempDownloaded + "/" + filename
|
||||||
err := client.DownloadResource(template.Filename, downloaded)
|
err := client.DownloadResource(file, downloaded)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user