143 lines
3.6 KiB
Go
143 lines
3.6 KiB
Go
|
package wctools
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"errors"
|
||
|
"github.com/golang/protobuf/proto"
|
||
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
|
||
|
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model/tariff"
|
||
|
"strings"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
var DaysOfWeek = map[string]string{
|
||
|
"Monday": "понедельник",
|
||
|
"Tuesday": "вторник",
|
||
|
"Wednesday": "среда",
|
||
|
"Thursday": "четверг",
|
||
|
"Friday": "пятница",
|
||
|
"Saturday": "суббота",
|
||
|
"Sunday": "воскресенье",
|
||
|
}
|
||
|
|
||
|
var MonthsOfYear = map[string]string{
|
||
|
"January": "января",
|
||
|
"February": "февраля",
|
||
|
"March": "марта",
|
||
|
"April": "апреля",
|
||
|
"May": "мая",
|
||
|
"June": "июня",
|
||
|
"July": "июля",
|
||
|
"August": "августа",
|
||
|
"September": "сентября",
|
||
|
"October": "октября",
|
||
|
"November": "ноября",
|
||
|
"December": "декабря",
|
||
|
}
|
||
|
|
||
|
func IsValidMessage(message []byte, expectedServiceKey string) ([]model.PrivilegeMessage, string, error) {
|
||
|
var decodedMessage tariff.TariffMessage
|
||
|
err := proto.Unmarshal(message, &decodedMessage)
|
||
|
if err != nil {
|
||
|
return nil, "", err
|
||
|
}
|
||
|
|
||
|
if decodedMessage.UserID == "" || len(decodedMessage.Privileges) == 0 {
|
||
|
return nil, "", errors.New("Invalid message structure")
|
||
|
}
|
||
|
|
||
|
privileges := decodedMessage.Privileges
|
||
|
userID := decodedMessage.UserID
|
||
|
|
||
|
var validPrivileges []model.PrivilegeMessage
|
||
|
for _, privilege := range privileges {
|
||
|
if IsServiceKeyValid(privilege.ServiceKey, expectedServiceKey) {
|
||
|
validPrivileges = append(validPrivileges, model.PrivilegeMessage{
|
||
|
PrivilegeID: privilege.PrivilegeID,
|
||
|
ServiceKey: privilege.ServiceKey,
|
||
|
Type: model.PrivilegeType(privilege.Type),
|
||
|
Value: privilege.Value,
|
||
|
Amount: privilege.Amount,
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if len(validPrivileges) == 0 {
|
||
|
return nil, "", errors.New("No valid privileges found")
|
||
|
}
|
||
|
|
||
|
return validPrivileges, userID, nil
|
||
|
}
|
||
|
|
||
|
func IsServiceKeyValid(actualServiceKey, expectedServiceKey string) bool {
|
||
|
return actualServiceKey == expectedServiceKey
|
||
|
}
|
||
|
|
||
|
func FindPrivilegeName(privilegeID string) string {
|
||
|
for _, p := range model.Privileges {
|
||
|
if p.PrivilegeID == privilegeID {
|
||
|
return p.Name
|
||
|
}
|
||
|
}
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
func ProcessAnswer(answer string) (model.ResultContent, error) {
|
||
|
content := model.ResultContent{}
|
||
|
err := json.Unmarshal([]byte(answer), &content)
|
||
|
if err != nil {
|
||
|
return model.ResultContent{}, err
|
||
|
}
|
||
|
return content, nil
|
||
|
}
|
||
|
|
||
|
func ProcessQuiz(quiz string) (model.QuizConfig, error) {
|
||
|
quizConfig := model.QuizConfig{}
|
||
|
err := json.Unmarshal([]byte(quiz), &quizConfig)
|
||
|
if err != nil {
|
||
|
return model.QuizConfig{}, err
|
||
|
}
|
||
|
return quizConfig, nil
|
||
|
}
|
||
|
|
||
|
func HasUnlimitedPrivilege(privileges []model.ShortPrivilege) bool {
|
||
|
for _, privilege := range privileges {
|
||
|
if privilege.PrivilegeID == "quizUnlimTime" {
|
||
|
return IsPrivilegeExpired(privilege)
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func IsPrivilegeExpired(privilege model.ShortPrivilege) bool {
|
||
|
expirationTime := privilege.CreatedAt.Add(time.Duration(privilege.Amount) * 24 * time.Hour)
|
||
|
|
||
|
currentTime := time.Now()
|
||
|
return currentTime.Before(expirationTime)
|
||
|
}
|
||
|
|
||
|
func ExtractEmail(key string) string {
|
||
|
parts := strings.Split(key, ":")
|
||
|
if len(parts) != 2 {
|
||
|
return ""
|
||
|
}
|
||
|
return parts[1]
|
||
|
}
|
||
|
|
||
|
func HasQuizCntPrivilege(privileges []model.ShortPrivilege) *model.ShortPrivilege {
|
||
|
for _, privilege := range privileges {
|
||
|
if privilege.PrivilegeID == "quizCnt" && privilege.Amount > 0 {
|
||
|
return &privilege
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func ToJSON(data interface{}) (string, error) {
|
||
|
result, err := json.Marshal(data)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
return string(result), nil
|
||
|
}
|