182 lines
3.9 KiB
Go
182 lines
3.9 KiB
Go
package plugin
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
kvProjectsKey = "ru.loop.plugin.sentry:projects"
|
|
kvProjectPrefix = "ru.loop.plugin.sentry:project:"
|
|
)
|
|
|
|
// getProject получает проект по ID из хранилища
|
|
func (p *Plugin) getProject(projectID string) (*LinkedProject, error) {
|
|
key := kvProjectPrefix + projectID
|
|
|
|
data, appErr := p.API.KVGet(key)
|
|
if appErr != nil || data == nil {
|
|
return nil, appErr
|
|
}
|
|
|
|
var project LinkedProject
|
|
if err := json.Unmarshal(data, &project); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &project, nil
|
|
}
|
|
|
|
// getProjectBySlug получает проект по slug из хранилища
|
|
func (p *Plugin) getProjectBySlug(slug string) (*LinkedProject, error) {
|
|
keys, appErr := p.API.KVList(0, 1000)
|
|
if appErr != nil {
|
|
return nil, appErr
|
|
}
|
|
|
|
for _, key := range keys {
|
|
if !strings.HasPrefix(key, kvProjectPrefix) {
|
|
continue
|
|
}
|
|
|
|
data, appErr := p.API.KVGet(key)
|
|
if appErr != nil || data == nil {
|
|
continue
|
|
}
|
|
|
|
var project LinkedProject
|
|
if err := json.Unmarshal(data, &project); err != nil {
|
|
continue
|
|
}
|
|
|
|
if project.Slug == slug {
|
|
return &project, nil
|
|
}
|
|
}
|
|
|
|
return nil, errors.New("project not found")
|
|
}
|
|
|
|
// getProjectByChannel получает проект, привязанный к каналу
|
|
func (p *Plugin) getProjectByChannel(channelID string) (*LinkedProject, error) {
|
|
data, _ := p.API.KVGet(kvProjectsKey)
|
|
if data == nil {
|
|
return nil, errors.New("no projects linked")
|
|
}
|
|
|
|
var ids []string
|
|
_ = json.Unmarshal(data, &ids)
|
|
|
|
for _, id := range ids {
|
|
raw, _ := p.API.KVGet(kvProjectPrefix + id)
|
|
if raw == nil {
|
|
continue
|
|
}
|
|
|
|
var project LinkedProject
|
|
_ = json.Unmarshal(raw, &project)
|
|
|
|
if project.ChannelID == channelID {
|
|
return &project, nil
|
|
}
|
|
}
|
|
|
|
return nil, errors.New("no Sentry project linked to this channel")
|
|
}
|
|
|
|
// getChannelForProject получает ID канала для проекта
|
|
func (p *Plugin) getChannelForProject(projectID string) (string, error) {
|
|
project, err := p.getProject(projectID)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return project.ChannelID, nil
|
|
}
|
|
|
|
// getAllProjects получает все связанные проекты
|
|
func (p *Plugin) getAllProjects() ([]*LinkedProject, error) {
|
|
data, _ := p.API.KVGet(kvProjectsKey)
|
|
if data == nil {
|
|
return []*LinkedProject{}, nil
|
|
}
|
|
|
|
var ids []string
|
|
_ = json.Unmarshal(data, &ids)
|
|
|
|
var projects []*LinkedProject
|
|
for _, id := range ids {
|
|
project, err := p.getProject(id)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
projects = append(projects, project)
|
|
}
|
|
|
|
return projects, nil
|
|
}
|
|
|
|
// saveProject сохраняет проект в хранилище
|
|
func (p *Plugin) saveProject(project *LinkedProject) error {
|
|
bytes, err := json.Marshal(project)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
key := kvProjectPrefix + project.ID
|
|
if err := p.API.KVSet(key, bytes); err != nil {
|
|
return errors.New("failed to save project")
|
|
}
|
|
|
|
// Добавляем ID в список проектов
|
|
data, _ := p.API.KVGet(kvProjectsKey)
|
|
var projects []string
|
|
if data != nil {
|
|
_ = json.Unmarshal(data, &projects)
|
|
}
|
|
|
|
exists := false
|
|
for _, id := range projects {
|
|
if id == project.ID {
|
|
exists = true
|
|
break
|
|
}
|
|
}
|
|
if !exists {
|
|
projects = append(projects, project.ID)
|
|
updated, _ := json.Marshal(projects)
|
|
_ = p.API.KVSet(kvProjectsKey, updated)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// deleteProject удаляет проект из хранилища
|
|
func (p *Plugin) deleteProject(projectID string) error {
|
|
key := kvProjectPrefix + projectID
|
|
if err := p.API.KVDelete(key); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Удаляем ID из списка проектов
|
|
data, _ := p.API.KVGet(kvProjectsKey)
|
|
if data == nil {
|
|
return nil
|
|
}
|
|
|
|
var projects []string
|
|
_ = json.Unmarshal(data, &projects)
|
|
|
|
var newProjects []string
|
|
for _, id := range projects {
|
|
if id != projectID {
|
|
newProjects = append(newProjects, id)
|
|
}
|
|
}
|
|
|
|
bytes, _ := json.Marshal(newProjects)
|
|
_ = p.API.KVSet(kvProjectsKey, bytes)
|
|
|
|
return nil
|
|
}
|