
Bohdan
16.12.2017
22:10:51
ну и контроллер напиши универсальный какой то работающий над подобным сервисом

Alexander
16.12.2017
22:59:05

Bohdan
16.12.2017
22:59:52

Alexander
16.12.2017
23:00:25

Google

Alexander
16.12.2017
23:01:04
всм пакет можно написать и применять везде... а сервис это же вроде уже готовый продукт...
или тут про паттерн?

Bohdan
16.12.2017
23:01:29
или тут про паттерн?
а хер знает
просто сущность вводил дополнительную
все функции по работе с БД велись через наследуемый абстрактный сервис, который работал с репозитарием с дженериком модели
ну и контроллер работал над этим сервисом

Alexander
16.12.2017
23:03:27
понял о чем речь
)))

Андрей
16.12.2017
23:06:13
Вопросик, а go in action у кого-то есть перевод?
или Go in Practice

Alexander
16.12.2017
23:08:03
я для себя летом фреймворк написал на go, хотел что типа symfony (php) на go + чтобы было еще и на gin похоже... все еще пилю потихоньку... если есть желание у кого-то поковырять и покритиковать (документации почти нет, еще не начинал... но кто с gin работал - поймет) Хотелось бы именно по коду получить рекомендации
https://github.com/itrabbit/just
за опечатки в тексте и комментах - сорян)))

Bohdan
16.12.2017
23:10:42
понял о чем речь
а, еще добавлю
в наследник контроллера инжектим сервис над нужной моделью
в наследник сервиса с нужной моделью инжектив репозитарий над орм моделью

Google

Bohdan
16.12.2017
23:11:27
ну и над всей этой хренью можно споконо написать автогенератор рест апи согласно модели

Nick
16.12.2017
23:13:45
вот обьясните мне, зачем вообще юзать гоу, если везде вы пишите автогенераторы?

Alexander
16.12.2017
23:16:22

Nick
16.12.2017
23:16:44

KrivdaTheTriewe
16.12.2017
23:16:46

Alexander
16.12.2017
23:17:14

Nick
16.12.2017
23:18:56

Alexander
16.12.2017
23:20:14
садомазо тож любишь?)
нет, на go нет садомазо))) все локанично и просто на пределе возможностей языка))) да и по скорости работы и потреблению ресурсов вполне устраивает...

Nick
16.12.2017
23:20:54

Alexander
16.12.2017
23:23:25

Nick
16.12.2017
23:24:05
asm тоже простой, да и скорость работы хорошая))) только вот лаконичности нет
примерно такой ж довод)

Alexander
16.12.2017
23:24:22
asm не простой)))
синтаксис да

Nick
16.12.2017
23:24:37
как язык простой

Alexander
16.12.2017
23:24:37
но не все остальное
написать на асме веб микросервис за вечер из коробки нереально

Roman
17.12.2017
00:48:10
web service на ASM? шта?!

Леша
17.12.2017
02:36:11
+

Google

Anatoliy
17.12.2017
07:50:05

Bohdan
17.12.2017
08:24:23


Anatoliy
17.12.2017
08:26:38
Дык, а зачем такое разделение делать то?
потому что видимо я что-то не понимаю.
вот смотри, у меня Rest, я получаю POST запрос на создание пользователя, при попытке его пихнуть в базу получаю ошибку что такой логин уже есть, т.е. произошла ошибка, мне надо свернуть дальнейшие действия и выдать эту ошибку клиенту. как это сделать правильно?
я это вижу как return nil, errors, 500
если же все успешно создано - то return result, nil, 200
но так не выйдет т..к. к следующему хендлеру дойдет очередь толкьо если ретурнов не будет, т.е. мне надо просто дергать метод, но методу для отправки ответа нужен контекст, причем - всегда. но каждый раз добавлять что-то вроде Write(ctx, ...) желания нет, хотя то что придется писать что-то вроде
Write(res, errors, port)
return
я уже смирился( но чем-то этот вариант мне не нравится. может я реально где-то затупил?


Bohdan
17.12.2017
08:28:53
потому что видимо я что-то не понимаю.
вот смотри, у меня Rest, я получаю POST запрос на создание пользователя, при попытке его пихнуть в базу получаю ошибку что такой логин уже есть, т.е. произошла ошибка, мне надо свернуть дальнейшие действия и выдать эту ошибку клиенту. как это сделать правильно?
я это вижу как return nil, errors, 500
если же все успешно создано - то return result, nil, 200
Так это бизнес логика, зачем ее отдельно куда то пихать


Anatoliy
17.12.2017
08:32:08
Так это бизнес логика, зачем ее отдельно куда то пихать
Т.е. каждый раз писать что-то типа такого это нормально?:
func (h *TokenHandler) CreateUser(c *macaron.Context, errs binding.Errors, user model.User) {
var lastInsertId int
var createdAt time.Time
err := h.DBConn.QueryRow("INSERT INTO auth.users(username, password, email) VALUES($1, $2, $3) RETURNING user_id, created_at", user.Username, user.Password, user.Email).Scan(&lastInsertId, &createdAt)
if err != nil {
errs.Add([]string{}, "users", "Не удалось создать нового пользователя")
//.. тут еще ошибки
// вот типа такого??
result := Result{
Result: nil,
Errors: errs,
}
c.JSON(500, result)
return
}
user.UserID = lastInsertId
user.CreatedAt = createdAt
res := map[string]interface{}{
"user": user,
}
Write(c, res, nil, 200)
return
//c.JSON(200, res)
}

Bohdan
17.12.2017
08:33:37
Так то да. Только это приведет к дублированию кода, если понадобится еще где то этот код

Леша
17.12.2017
08:37:23
я не особо вник, но если нужно что-то в любом случае отправлять, почему не использовать defer?

Anatoliy
17.12.2017
08:37:38

Bohdan
17.12.2017
08:41:13

Anatoliy
17.12.2017
08:41:37
так именно это я хочу сделать, не понимаю как

Bohdan
17.12.2017
08:41:55

Anatoliy
17.12.2017
08:42:30
как из контроллера передать данные в эту отдельную сущность которая их будет отправлять
ну и не очень понятно как эта сущность вообще выглядеть должна. по идее там один метод - сама отправка, всё, или нет?

Игорь
17.12.2017
08:44:16

Ilia
17.12.2017
08:45:49

Bohdan
17.12.2017
08:46:11
Давай смотреть через призму построения рест апи.
Есть сущность /users. Над ним есть CRUD операции. Создание, чтение, обновление и удаление. Чтение двух видов может быть. /users и /users/:user_id
Вот и строй сервис и контроллер согласно такого соглашения

Игорь
17.12.2017
08:46:40
А ничё? Просто хочу узнать мнение.

Alexander
17.12.2017
08:48:12

Google

Ilia
17.12.2017
08:48:37
Накой мне Раст без сообщества, без кучи либ, с ломающейся совместимостью и без успешных примеров в продакшене?

Bohdan
17.12.2017
08:49:47
Get /users?offset=&limit=
Get /users/:user_id
Post /users
Put /users/:user_id
Delete /users/:user_id
К примеру, от такого рест апи оттолкнись

Anatoliy
17.12.2017
08:50:00

Ilia
17.12.2017
08:50:08
Вечно растровые тролли в Go чатиках ищут чё поесть)

Alexander
17.12.2017
08:50:26

Anatoliy
17.12.2017
08:50:39

Леша
17.12.2017
08:50:46

Anatoliy
17.12.2017
08:50:53

Alexander
17.12.2017
08:51:30

Леша
17.12.2017
08:52:19

Admin
ERROR: S client not available

Леша
17.12.2017
08:52:26
а, все
понял

Bohdan
17.12.2017
08:53:16

Anatoliy
17.12.2017
08:54:20

Alexander
17.12.2017
08:55:12

Anatoliy
17.12.2017
08:55:34
на фреймворке - macaron

Bohdan
17.12.2017
08:56:41

Anatoliy
17.12.2017
09:00:50

Bohdan
17.12.2017
09:02:54

Google

Anatoliy
17.12.2017
09:14:39

Bohdan
17.12.2017
09:17:48

Anatoliy
17.12.2017
09:18:03
а в каком месте тогда логика? те самые сервисы?

Bohdan
17.12.2017
09:18:06
но не в контроллер бы я точно пихал бизнес логику)))

Anatoliy
17.12.2017
09:20:02
да, сервисы
т.е. проект выглядит как-то так?:
/src/
- db
- model
- controller
- service
main.go ?

Bohdan
17.12.2017
09:21:35
примерно
еще utils могут быть
я бы db в папку models засунул
ну а там всякие дополнительные структуры можно засунуть в папку structs в папке models

Anatoliy
17.12.2017
09:22:36

Alexander
17.12.2017
09:24:02

Bohdan
17.12.2017
09:25:18
не зависит, кстати, от фрейма

Anatoliy
17.12.2017
09:26:14
в общем подобный подход позволяет быстро и просто перейти от REST к чему другому например как я понял

Alexander
17.12.2017
09:26:53
переиспользование контроллера? скиньте мне паттерн который это описывает)

Anatoliy
17.12.2017
09:27:10

Alexander
17.12.2017
09:27:12
просто стало интересно)

Anatoliy
17.12.2017
09:27:34
переиспользуемость именно кода для логики имелась в виду судя повсему

Alexander
17.12.2017
09:27:59

Anatoliy
17.12.2017
09:28:05
т.е. ты если нужно можешь использовать один и тот же код как для API, так и для фронтенда например, отдавая в одном случае данные на сайте, а в другом через json
по крайне мере как я понимаю это дело

Bohdan
17.12.2017
09:28:52

Alexander
17.12.2017
09:29:12

Bohdan
17.12.2017
09:29:19

Anatoliy
17.12.2017
09:29:50