package store import ( "database/sql" "errors" "time" ) type PublishedDoc struct { ProjectID string `json:"projectId"` Name string `json:"name"` Token string `json:"token"` Content string `json:"-"` UpdatedAt int64 `json:"updatedAt"` } func (s *Store) PublishedDocs() ([]PublishedDoc, error) { rows, err := s.db.Query(`SELECT project_id,name,token,updated_at FROM published_docs ORDER BY name`) if err != nil { return nil, err } defer rows.Close() docs := []PublishedDoc{} for rows.Next() { var doc PublishedDoc if err := rows.Scan(&doc.ProjectID, &doc.Name, &doc.Token, &doc.UpdatedAt); err != nil { return nil, err } docs = append(docs, doc) } return docs, rows.Err() } func (s *Store) PublishDoc(projectID, name, content string) (PublishedDoc, error) { var token string err := s.db.QueryRow(`SELECT token FROM published_docs WHERE project_id=?`, projectID).Scan(&token) if errors.Is(err, sql.ErrNoRows) { token = newMockToken() } else if err != nil { return PublishedDoc{}, err } doc := PublishedDoc{ProjectID: projectID, Name: name, Token: token, UpdatedAt: time.Now().Unix()} _, err = s.db.Exec(`INSERT INTO published_docs(project_id,name,token,content,updated_at) VALUES(?,?,?,?,?) ON CONFLICT(project_id) DO UPDATE SET name=excluded.name,content=excluded.content,updated_at=excluded.updated_at`, projectID, name, token, content, doc.UpdatedAt) return doc, err } func (s *Store) PublishedDocByToken(token string) (PublishedDoc, error) { var doc PublishedDoc err := s.db.QueryRow(`SELECT project_id,name,token,content,updated_at FROM published_docs WHERE token=?`, token).Scan(&doc.ProjectID, &doc.Name, &doc.Token, &doc.Content, &doc.UpdatedAt) return doc, err } func (s *Store) RevokeDoc(projectID string) error { _, err := s.db.Exec(`DELETE FROM published_docs WHERE project_id=?`, projectID) return err }