diff --git a/README.md b/README.md index ff5c274..d5196d5 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Just because something is implemented doesn't mean it is finisehd. Tons of these #### 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 diff --git a/server/handle_server_check_account_status.go b/server/handle_server_check_account_status.go new file mode 100644 index 0000000..6b815bf --- /dev/null +++ b/server/handle_server_check_account_status.go @@ -0,0 +1,65 @@ +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) +} diff --git a/server/server.go b/server/server.go index 381e16f..4e7b623 100644 --- a/server/server.go +++ b/server/server.go @@ -712,6 +712,7 @@ func (s *Server) addRoutes() { 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)