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
}