-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwebd.go
256 lines (216 loc) · 12 KB
/
webd.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
package main
import (
"fmt"
"os"
"strings"
// web-framework
"github.com/go-macaron/session"
"gopkg.in/ini.v1"
"gopkg.in/macaron.v1"
// база данных на SQL
"github.com/jmoiron/sqlx"
_ "github.com/kshvakov/clickhouse"
// база данных на Redis
"github.com/go-redis/redis"
ms "github.com/ValidatorCenter/minter-go-sdk"
//s "github.com/ValidatorCenter/prs3r/strc"
)
// Глобально установленные объекты
var (
CoinMinter string // Основная монета Minter
srvAuth string // сервер авторизации
TaskLogPath string
sdk ms.SDK
dbSQL *sqlx.DB
dbSys *redis.Client
)
// СТРАНИЦА: Лендиг приветствия
func myHello(ctx *macaron.Context, sess session.Store) {
var alertMsg, alertType, alertAct string
var auth bool = false
var usrName, idUsr string
//SESSION
if sess.Get("login") != nil {
auth = true
idUsr = sess.Get("login").(string)
if len(idUsr) > 0 {
usrName = fmt.Sprintf("%s...%s", idUsr[:6], idUsr[len(idUsr)-4:len(idUsr)])
}
}
//GET
alertType = ctx.QueryEscape("alert")
alertAct = ctx.QueryEscape("act")
alertMsg = ctx.QueryEscape("msg")
// Заголовк страницы:
ctx.Data["Title"] = "Hello"
// Инф.сообщения от системы:
ctx.Data["AlertAct"] = alertAct
ctx.Data["AlertMsg"] = alertMsg
ctx.Data["AlertType"] = alertType
// Пользователь:
ctx.Data["UsrAuth"] = auth
ctx.Data["UsrName"] = usrName
ctx.Data["UsrAddress"] = idUsr
// Вывод страницы:
ctx.HTML(200, "hello")
}
// СТРАНИЦА: Нет такой страницы - 404
func page404(ctx *macaron.Context) {
// Последний синхронизированный блок
ResultNetwork, _ := sdk.GetStatus()
// получаем системуную коллекцию из Redis
statusMDB := srchSysSql(dbSys)
// Инф. о синхронизации БД с БлокЧейном:
ctx.Data["LastSync"] = statusMDB.LatestBlockSave
ctx.Data["Current"] = ResultNetwork.LatestBlockHeight
if sdk.ChainMainnet {
ctx.Data["ChainNet"] = "mainnet"
} else {
ctx.Data["ChainNet"] = "testnet"
}
//ctx.Error(404, "Нет такой страницы!")
ctx.Data["Title"] = "404"
ctx.HTML(200, "_404")
}
// Главая функция! Вход в программу
func main() {
var err error
ConfFileName := "webd.ini"
srvAuth = "http://localhost:3999" // default
if len(os.Args) == 2 {
ConfFileName = os.Args[1]
}
//////////////////////////////////////////////////////
// INI
cfg, err := ini.LoadSources(ini.LoadOptions{IgnoreInlineComment: true}, ConfFileName)
if err != nil {
log("ERR", fmt.Sprintf("Загрузка INI '%s' - %s", ConfFileName, err.Error()), "")
log("INF", "webd /path/file_config.ini", "")
log("INF", "ИЛИ берётся webd.ini в директории программы", "")
return
} else {
log("OK", fmt.Sprintf("Данные с INI '%s' файла - загружены!", ConfFileName), "")
}
secMN := cfg.Section("masternode")
sdk.MnAddress = secMN.Key("ADDRESS").String()
_strChain := secMN.Key("CHAIN").String()
if strings.ToLower(_strChain) == "main" {
sdk.ChainMainnet = true
} else {
sdk.ChainMainnet = false
}
CoinMinter = ms.GetBaseCoin()
secSite := cfg.Section("site")
SiteTemplatesDir := secSite.Key("TemplateDir").String()
if SiteTemplatesDir == "" {
// берем по умолчанию если нет в конфиге
SiteTemplatesDir = "templates"
}
SitePublicDir := secSite.Key("PublicDir").String()
if SitePublicDir == "" {
SitePublicDir = "public"
}
TaskLogPath = secSite.Key("TASKLOG_PATH").String()
secAuth := cfg.Section("auth")
srvAuth = secAuth.Key("ADDRESS").String()
secDB := cfg.Section("database")
//////////////////////////////////////////////////////
// DB:: Redis
r_db, err := secDB.Key("REDIS_DB").Int()
if err != nil {
r_db = 0
}
dbSys = redis.NewClient(&redis.Options{
Addr: secDB.Key("REDIS_ADDRESS").String(),
Password: secDB.Key("REDIS_PSWRD").String(), // no password set
DB: r_db, // use default DB
})
defer dbSys.Close()
log("OK", "Подключились к БД - Redis", "")
//////////////////////////////////////////////////////
// DB:: ClickHouse
dbSQL, err = sqlx.Open("clickhouse", secDB.Key("CLICKHOUSE_ADDRESS").String())
if err != nil {
log("ERR", fmt.Sprint("Подключение к БД - ClickHouse ", err), "")
}
defer dbSQL.Close()
log("OK", "Подключились к БД - ClickHouse", "")
//////////////////////////////////////////////////////
// MACARON web-framework
m := macaron.Classic()
m.Use(macaron.Renderer(macaron.RenderOptions{
Directory: SiteTemplatesDir,
Extensions: []string{".html"},
}))
m.Use(macaron.Static(SitePublicDir))
m.Use(session.Sessioner(session.Options{
Provider: "memory", // FIXME: переделать на Redis!
// Cookie name to save session ID. Default is "MacaronSession".
CookieName: "MVCSession",
}))
m.Get("/", myHello) // Лендинг страница
m.Get("/404", page404) // ТЕСТ: нет такой страницы
// API v1
m.Get("/api/v1/newMnemonic", hndAPINewMnemonic) // новая seed-фраза, регистрация нового аккаунта в сети Minter
m.Get("/api/v1/autoDeleg/:number", hndAPIAutoDelegAddress) // получить JSON конфигурацию автоделегирования
m.Get("/api/v1/autoTaskOut/:tokenauth/:pubkey", hndAPIAutoTodo) // получить JSON задачи на исполнение
m.Get("/api/v1.1/autoTaskOut/:tokenauth/:pubkey", hndAPIAutoTodo1_1) // получить JSON задачи на исполнение v.1.1
m.Get("/api/v1/autoTaskIn/:tokenauth/:returndataJSON", hndAPIAutoTodoReturn) // результат выполнения автоделегатор
m.Get("/api/v1.1/autoTaskIn/:tokenauth/:hashid/:hashtrx", hndAPIAutoTodoReturn1_1) // результат выполнения автоделегатор v.1.1
// о сессиях тут -> https://go-macaron.com/docs/middlewares/session
//m.Route("/auth", "GET,POST", hndAuth)
m.Post("/auth", hndAuthUser) // регистрация и авторизация
m.Get("/logout", hndLogoutUser) // выход с сеанса
// Эксплорер::Блоки
m.Get("/blocks", hndBlocksInfo) // лист блоков
m.Get("/blocks/:pgn", hndBlocksInfo) // лист блоков
m.Get("/block/:number", hndBlockOneInfo) // 1 блок
m.Get("/api/v1/block/:number", hndAPIBlockOneInfo) // API v1: 1 блок JSON
//TODO: получить лист блоков по API в виде JSON [замена эндпоинта /blocks и /blocks/:pgn]
// Эксплорер::Транизакции
m.Get("/transactions", hndTransactionsInfo) // Страница транзакций
m.Get("/transactions/:pgn", hndTransactionsInfo) // Страница транзакций
m.Get("/transaction/:number", hndTransactionOneInfo) // 1 транзакция
m.Get("/api/v1/transaction/:number", hndAPITransactionOneInfo) // API v1: 1 транзакция JSON
//TODO: получить список транзакций по API в виде JSON [замена эндпоинта /transactions и /transactions/:pgn]
// Валидаторы/Ноды
m.Get("/nodes", hndValidatorsInfo) // Страница валидаторов
m.Get("/nodes/:pgn", hndValidatorsInfo) // Страница валидаторов
m.Route("/node/:number", "GET,POST", hndValidatorOneInfo) // 1 валидатор
m.Get("/api/v1/node/:number", hndAPIValidatorOneInfo) // API v1: 1 валидатор JSON
//TODO: получить список нод/валидаторов по API в виде JSON [замена эндпоинта /nodes и /nodes/:pgn]
//TODO: изменить данные ноды/валидатора по API в виде JSON [замена POST для эндпоинта /node/:number] с ответом результата ok/err
// Адрес кошелька
m.Get("/address/:number", hndAddressOneInfo) // 1 адрес
m.Get("/address/:number/:pgn", hndAddressOneInfo) // 1 адрес
//TODO: получить данные адреса по API в виде JSON [замена эндпоинта /address/:number и /address/:number/:pgn]
// Монеты
m.Get("/coins", hndCoins) // Страница монет
m.Route("/coin/:ticker", "GET,POST", hndCoinInfo) // 1 монета
m.Route("/coin/:ticker/:ticker2", "GET,POST", hndCoinInfo) // 1 пара монет
//TODO: получить лист Монет по API в виде JSON [замена эндпоинта /coins]
//TODO: получить данные монеты по API в виде JSON [замена эндпоинта /coin/:ticker и /coin/:ticker/:ticker2]
//TODO: изменить данные монеты по API в виде JSON [замена POST для эндпоинта /coin/:ticker и /coin/:ticker/:ticker2] с ответом результата ok/err
// ЛК::Кошелёк
m.Route("/sendcoin", "GET,POST", hndWalletTxSend) // TX: Отправить монету
m.Route("/delegation", "GET,POST", hndWalletTxDelegation) // TX: Делегирование монет
m.Route("/masternode", "GET,POST", hndWalletTxMasternode) // TX: Управление нодой
m.Route("/coiner", "GET,POST", hndWalletTxCoiner) // TX: Создание монет
m.Route("/checks", "GET,POST", hndWalletTxChecks) // TX: Управление чеками
m.Get("/tasklist", hndWalletListTask) // Страница листа задач
m.Get("/tasklist/:number", hndWalletListTaskAddrs) // Страница листа задач по адресу
//TODO: Выполнение транзакции отправки монет SEND по API в виде JSON [замена POST для эндпоинта /sendcoin] с ответом результата trx+ok/err
//TODO: Выполнение транзакции делегирование монет DELEG по API в виде JSON [замена POST для эндпоинта /delegation] с ответом результата trx+ok/err
//TODO: Выполнение транзакций управления мастернодой DECLARE/START/STOP-NODE по API в виде JSON [замена POST для эндпоинта /masternode] с ответом результата trx+ok/err
//TODO: Выполнение транзакции cоздания монеты COINER по API в виде JSON [замена POST для эндпоинта /coiner] с ответом результата trx+ok/err
//TODO: Выполнение транзакций управления чеками CREATE/ACT-CHECK по API в виде JSON [замена POST для эндпоинта /checks] с ответом результата trx+ok/err
//TODO: получить список задач Task по API в виде JSON [замена эндпоинта /tasklist (частично уже реализовано, но для /tasklist/:number в /api/v1/autoTaskOut/:tokenauth/:pubkey)]
//TODO: получить баланс кошелька для авторизованного пользователя по API в виде JSON [замена эндпоинта ... во все эндпоинты данная информация поступала]
//[+] convert конвертация - Обмен на другие монеты (coins - уже есть)
//[?] checks чеки - Создание и обналичивание
//[+] delegation делегирование - Делегирование и отзыв
//[+] masternode мастернода - Декларирование, включение и отключение
//[+] coiner создание монет - Создание монет)
//[-] профиль, - адрес, seed фраза и приваткей
m.Run()
}