An atproto PDS written in Go

feat: add checkAccountStatus (#19)

* feat: add checkAccountStatus

* chore: update readme

* fix: scan error

+1 -1
README.md
···
#### Server
- [ ] com.atproto.server.activateAccount
-
- [ ] com.atproto.server.checkAccountStatus
+
- [x] com.atproto.server.checkAccountStatus
- [x] com.atproto.server.confirmEmail
- [x] com.atproto.server.createAccount
- [x] com.atproto.server.createInviteCode
+65
server/handle_server_check_account_status.go
···
+
package server
+
+
import (
+
"github.com/haileyok/cocoon/internal/helpers"
+
"github.com/haileyok/cocoon/models"
+
"github.com/ipfs/go-cid"
+
"github.com/labstack/echo/v4"
+
)
+
+
type ComAtprotoServerCheckAccountStatusResponse struct {
+
Activated bool `json:"activated"`
+
ValidDid bool `json:"validDid"`
+
RepoCommit string `json:"repoCommit"`
+
RepoRev string `json:"repoRev"`
+
RepoBlocks int64 `json:"repoBlocks"`
+
IndexedRecords int64 `json:"indexedRecords"`
+
PrivateStateValues int64 `json:"privateStateValues"`
+
ExpectedBlobs int64 `json:"expectedBlobs"`
+
ImportedBlobs int64 `json:"importedBlobs"`
+
}
+
+
func (s *Server) handleServerCheckAccountStatus(e echo.Context) error {
+
urepo := e.Get("repo").(*models.RepoActor)
+
+
resp := ComAtprotoServerCheckAccountStatusResponse{
+
Activated: true, // TODO: should allow for deactivation etc.
+
ValidDid: true, // TODO: should probably verify?
+
RepoRev: urepo.Rev,
+
ImportedBlobs: 0, // TODO: ???
+
}
+
+
rootcid, err := cid.Cast(urepo.Root)
+
if err != nil {
+
s.logger.Error("error casting cid", "error", err)
+
return helpers.ServerError(e, nil)
+
}
+
resp.RepoCommit = rootcid.String()
+
+
type CountResp struct {
+
Ct int64
+
}
+
+
var blockCtResp CountResp
+
if err := s.db.Raw("SELECT COUNT(*) AS ct FROM blocks WHERE did = ?", nil, urepo.Repo.Did).Scan(&blockCtResp).Error; err != nil {
+
s.logger.Error("error getting block count", "error", err)
+
return helpers.ServerError(e, nil)
+
}
+
resp.RepoBlocks = blockCtResp.Ct
+
+
var recCtResp CountResp
+
if err := s.db.Raw("SELECT COUNT(*) AS ct FROM records WHERE did = ?", nil, urepo.Repo.Did).Scan(&recCtResp).Error; err != nil {
+
s.logger.Error("error getting record count", "error", err)
+
return helpers.ServerError(e, nil)
+
}
+
resp.IndexedRecords = recCtResp.Ct
+
+
var blobCtResp CountResp
+
if err := s.db.Raw("SELECT COUNT(*) AS ct FROM blobs WHERE did = ?", nil, urepo.Repo.Did).Scan(&blobCtResp).Error; err != nil {
+
s.logger.Error("error getting record count", "error", err)
+
return helpers.ServerError(e, nil)
+
}
+
resp.ExpectedBlobs = blobCtResp.Ct
+
+
return e.JSON(200, resp)
+
}
+1
server/server.go
···
s.echo.POST("/xrpc/com.atproto.server.resetPassword", s.handleServerResetPassword, s.handleLegacySessionMiddleware, s.handleOauthSessionMiddleware)
s.echo.POST("/xrpc/com.atproto.server.updateEmail", s.handleServerUpdateEmail, s.handleLegacySessionMiddleware, s.handleOauthSessionMiddleware)
s.echo.GET("/xrpc/com.atproto.server.getServiceAuth", s.handleServerGetServiceAuth, s.handleLegacySessionMiddleware, s.handleOauthSessionMiddleware)
+
s.echo.GET("/xrpc/com.atproto.server.checkAccountStatus", s.handleServerCheckAccountStatus, s.handleLegacySessionMiddleware, s.handleOauthSessionMiddleware)
// repo
s.echo.POST("/xrpc/com.atproto.repo.createRecord", s.handleCreateRecord, s.handleLegacySessionMiddleware, s.handleOauthSessionMiddleware)