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 }