diff --git a/internal/data/event_registrations.sql.go b/internal/data/event_registrations.sql.go index 5c396be..eaf1a77 100644 --- a/internal/data/event_registrations.sql.go +++ b/internal/data/event_registrations.sql.go @@ -20,17 +20,16 @@ SELECT tx_hash, created_at FROM event_identity_registration -WHERE eon = $1 AND identity_prefix = $2 AND sender = $3 +WHERE eon = $1 AND identity = $2 ` type GetEventIdentityRegistrationParams struct { - Eon int64 - IdentityPrefix []byte - Sender string + Eon int64 + Identity []byte } func (q *Queries) GetEventIdentityRegistration(ctx context.Context, arg GetEventIdentityRegistrationParams) (EventIdentityRegistration, error) { - row := q.db.QueryRow(ctx, getEventIdentityRegistration, arg.Eon, arg.IdentityPrefix, arg.Sender) + row := q.db.QueryRow(ctx, getEventIdentityRegistration, arg.Eon, arg.Identity) var i EventIdentityRegistration err := row.Scan( &i.Eon, @@ -47,17 +46,16 @@ func (q *Queries) GetEventIdentityRegistration(ctx context.Context, arg GetEvent const getEventTriggerExpirationBlockNumber = `-- name: GetEventTriggerExpirationBlockNumber :one SELECT COALESCE(expiration_block_number, 0) FROM event_identity_registration -WHERE eon = $1 AND identity_prefix = $2 AND sender = $3 +WHERE eon = $1 AND identity = $2 ` type GetEventTriggerExpirationBlockNumberParams struct { - Eon int64 - IdentityPrefix []byte - Sender string + Eon int64 + Identity []byte } func (q *Queries) GetEventTriggerExpirationBlockNumber(ctx context.Context, arg GetEventTriggerExpirationBlockNumberParams) (int64, error) { - row := q.db.QueryRow(ctx, getEventTriggerExpirationBlockNumber, arg.Eon, arg.IdentityPrefix, arg.Sender) + row := q.db.QueryRow(ctx, getEventTriggerExpirationBlockNumber, arg.Eon, arg.Identity) var expiration_block_number int64 err := row.Scan(&expiration_block_number) return expiration_block_number, err @@ -73,7 +71,7 @@ INSERT INTO event_identity_registration ( event_trigger_definition, tx_hash ) VALUES ($1, $2, $3, $4, $5, $6) -ON CONFLICT (eon, identity_prefix, sender) DO NOTHING +ON CONFLICT (eon, identity) DO NOTHING ` type InsertEventIdentityRegistrationParams struct { @@ -101,22 +99,16 @@ func (q *Queries) InsertEventIdentityRegistration(ctx context.Context, arg Inser const updateEventIdentityRegistrationExpirationBlockNumber = `-- name: UpdateEventIdentityRegistrationExpirationBlockNumber :exec UPDATE event_identity_registration SET expiration_block_number = $1 -WHERE eon = $2 AND identity_prefix = $3 AND sender = $4 +WHERE eon = $2 AND identity = $3 ` type UpdateEventIdentityRegistrationExpirationBlockNumberParams struct { ExpirationBlockNumber int64 Eon int64 - IdentityPrefix []byte - Sender string + Identity []byte } func (q *Queries) UpdateEventIdentityRegistrationExpirationBlockNumber(ctx context.Context, arg UpdateEventIdentityRegistrationExpirationBlockNumberParams) error { - _, err := q.db.Exec(ctx, updateEventIdentityRegistrationExpirationBlockNumber, - arg.ExpirationBlockNumber, - arg.Eon, - arg.IdentityPrefix, - arg.Sender, - ) + _, err := q.db.Exec(ctx, updateEventIdentityRegistrationExpirationBlockNumber, arg.ExpirationBlockNumber, arg.Eon, arg.Identity) return err } diff --git a/internal/data/sql/queries/event_registrations.sql b/internal/data/sql/queries/event_registrations.sql index 9607164..7a6f5cb 100644 --- a/internal/data/sql/queries/event_registrations.sql +++ b/internal/data/sql/queries/event_registrations.sql @@ -9,7 +9,7 @@ INSERT INTO event_identity_registration ( event_trigger_definition, tx_hash ) VALUES ($1, $2, $3, $4, $5, $6) -ON CONFLICT (eon, identity_prefix, sender) DO NOTHING; +ON CONFLICT (eon, identity) DO NOTHING; -- name: GetEventIdentityRegistration :one SELECT @@ -22,13 +22,13 @@ SELECT tx_hash, created_at FROM event_identity_registration -WHERE eon = $1 AND identity_prefix = $2 AND sender = $3; +WHERE eon = $1 AND identity = $2; -- name: GetEventTriggerExpirationBlockNumber :one SELECT COALESCE(expiration_block_number, 0) FROM event_identity_registration -WHERE eon = $1 AND identity_prefix = $2 AND sender = $3; +WHERE eon = $1 AND identity = $2; -- name: UpdateEventIdentityRegistrationExpirationBlockNumber :exec UPDATE event_identity_registration SET expiration_block_number = $1 -WHERE eon = $2 AND identity_prefix = $3 AND sender = $4; +WHERE eon = $2 AND identity = $3; diff --git a/internal/data/sql/schemas/event_registrations.sql b/internal/data/sql/schemas/event_registrations.sql index f422293..537f7ef 100644 --- a/internal/data/sql/schemas/event_registrations.sql +++ b/internal/data/sql/schemas/event_registrations.sql @@ -9,5 +9,5 @@ CREATE TABLE event_identity_registration ( expiration_block_number bigint, tx_hash bytea NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW(), - PRIMARY KEY (eon, identity_prefix, sender) + PRIMARY KEY (eon, identity) ); diff --git a/internal/data/sql/sqlc.yaml b/internal/data/sql/sqlc.yaml index fb9d296..30d39ce 100644 --- a/internal/data/sql/sqlc.yaml +++ b/internal/data/sql/sqlc.yaml @@ -9,4 +9,10 @@ sql: out: "../" sql_package: "pgx/v5" output_db_file_name: "db.sqlc.gen.go" - output_models_file_name: "models.sqlc.gen.go" \ No newline at end of file + output_models_file_name: "models.sqlc.gen.go" + overrides: + - column: "event_identity_registration.expiration_block_number" + go_type: "int64" + - column: "event_identity_registration.expiration_block_number" + go_type: "int64" + nullable: true \ No newline at end of file diff --git a/internal/service/crypto.go b/internal/service/crypto.go index 7afe453..3494b4c 100644 --- a/internal/service/crypto.go +++ b/internal/service/crypto.go @@ -393,7 +393,7 @@ func (svc *CryptoService) RegisterEventIdentity(ctx *gin.Context) { // @Tags Crypto // @Produce json // @Param eon query uint64 true "Eon number associated with the event identity registration." -// @Param identityPrefix query string true "Identity prefix associated with the event identity registration." +// @Param identity query string true "Identity associated with the event identity registration." // @Success 200 {object} usecase.GetEventTriggerExpirationBlockResponse "Success." // @Failure 400 {object} error.Http "Invalid Get event identity registration expiration block number request." // @Failure 404 {object} error.Http "Event identity registration not found." @@ -424,18 +424,18 @@ func (svc *CryptoService) GetEventTriggerExpirationBlock(ctx *gin.Context) { return } - identityPrefix, ok := ctx.GetQuery("identityPrefix") + identity, ok := ctx.GetQuery("identity") if !ok { err := sherror.NewHttpError( "query parameter not found", - "identityPrefix query parameter is required", + "identity query parameter is required", http.StatusBadRequest, ) ctx.Error(err) return } - data, httpErr := svc.CryptoUsecase.GetEventTriggerExpirationBlock(ctx, eon, identityPrefix) + data, httpErr := svc.CryptoUsecase.GetEventTriggerExpirationBlock(ctx, eon, identity) if httpErr != nil { ctx.Error(httpErr) return diff --git a/internal/usecase/eventtrigger.go b/internal/usecase/eventtrigger.go index 917f4f9..d34ce0d 100644 --- a/internal/usecase/eventtrigger.go +++ b/internal/usecase/eventtrigger.go @@ -374,9 +374,8 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger identity := common.ComputeEventIdentity(identityPrefix[:], newSigner.From, eventTriggerDefinition) _, err = uc.dbQuery.GetEventIdentityRegistration(ctx, data.GetEventIdentityRegistrationParams{ - Eon: int64(eon), - IdentityPrefix: identityPrefix[:], - Sender: newSigner.From.Hex(), + Eon: int64(eon), + Identity: identity, }) if err == nil { log.Warn().Msg("event identity already registered") @@ -435,7 +434,7 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger // The registration is on-chain even if DB insert fails } - go uc.updateEventIdentityExpirationBlockNumber(tx.Hash(), eon, identityPrefix[:], newSigner.From.Hex(), ttl) + go uc.updateEventIdentityExpirationBlockNumber(tx.Hash(), eon, identity, ttl) metrics.TotalSuccessfulIdentityRegistration.Inc() return &RegisterIdentityResponse{ @@ -447,7 +446,7 @@ func (uc *CryptoUsecase) RegisterEventIdentity(ctx context.Context, eventTrigger }, nil } -func (uc *CryptoUsecase) updateEventIdentityExpirationBlockNumber(txHash ecommon.Hash, eon uint64, identityPrefix []byte, sender string, ttl uint64) { +func (uc *CryptoUsecase) updateEventIdentityExpirationBlockNumber(txHash ecommon.Hash, eon uint64, identity []byte, ttl uint64) { ctx := context.Background() ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() @@ -461,11 +460,11 @@ func (uc *CryptoUsecase) updateEventIdentityExpirationBlockNumber(txHash ecommon } expirationBlockNumber := receipt.BlockNumber.Uint64() + ttl + err = uc.dbQuery.UpdateEventIdentityRegistrationExpirationBlockNumber(ctx, data.UpdateEventIdentityRegistrationExpirationBlockNumberParams{ ExpirationBlockNumber: int64(expirationBlockNumber), Eon: int64(eon), - IdentityPrefix: identityPrefix, - Sender: sender, + Identity: identity, }) if err != nil { log.Err(err).Str("tx_hash", txHash.Hex()).Msg("failed to update expiration block number") @@ -477,22 +476,22 @@ func (uc *CryptoUsecase) updateEventIdentityExpirationBlockNumber(txHash ecommon } } -func (uc *CryptoUsecase) GetEventTriggerExpirationBlock(ctx context.Context, eon uint64, identityPrefix string) (*GetEventTriggerExpirationBlockResponse, *httpError.Http) { - identityPrefixBytes, err := hex.DecodeString(strings.TrimPrefix(identityPrefix, "0x")) +func (uc *CryptoUsecase) GetEventTriggerExpirationBlock(ctx context.Context, eon uint64, identity string) (*GetEventTriggerExpirationBlockResponse, *httpError.Http) { + identityBytes, err := hex.DecodeString(strings.TrimPrefix(identity, "0x")) if err != nil { - log.Err(err).Msg("err encountered while decoding identity prefix") + log.Err(err).Msg("err encountered while decoding identity") err := httpError.NewHttpError( - "error encountered while decoding identity prefix", + "error encountered while decoding identity", "", http.StatusBadRequest, ) return nil, &err } - if len(identityPrefixBytes) != 32 { - log.Err(err).Msg("identity prefix should be of length 32") + if len(identityBytes) != 32 { + log.Err(err).Msg("identity should be of length 32") err := httpError.NewHttpError( - "identity prefix should be of length 32", + "identity should be of length 32", "", http.StatusBadRequest, ) @@ -503,13 +502,12 @@ func (uc *CryptoUsecase) GetEventTriggerExpirationBlock(ctx context.Context, eon sender := address.Hex() expirationBlockNumber, err := uc.dbQuery.GetEventTriggerExpirationBlockNumber(ctx, data.GetEventTriggerExpirationBlockNumberParams{ - Eon: int64(eon), - IdentityPrefix: identityPrefixBytes, - Sender: sender, + Eon: int64(eon), + Identity: identityBytes, }) if err != nil { if err == pgx.ErrNoRows { - log.Debug().Uint64("eon", eon).Str("identityPrefix", identityPrefix).Str("sender", sender).Msg("event identity registration not found") + log.Debug().Uint64("eon", eon).Str("identity", identity).Str("sender", sender).Msg("event identity registration not found") err := httpError.NewHttpError( "event identity registration not found", "", diff --git a/migrations/20260128212137_change_event_registrations_primary_key.sql b/migrations/20260128212137_change_event_registrations_primary_key.sql new file mode 100644 index 0000000..bca99ca --- /dev/null +++ b/migrations/20260128212137_change_event_registrations_primary_key.sql @@ -0,0 +1,18 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE event_identity_registration +DROP CONSTRAINT event_identity_registration_pkey; + +ALTER TABLE event_identity_registration +ADD PRIMARY KEY (eon, identity); +-- +goose StatementEnd + + +-- +goose Down +-- +goose StatementBegin +ALTER TABLE event_identity_registration +DROP CONSTRAINT event_identity_registration_pkey; + +ALTER TABLE event_identity_registration +ADD PRIMARY KEY (eon, identity_prefix, sender); +-- +goose StatementEnd diff --git a/tests/migrations/20260128212137_change_event_registrations_primary_key.sql b/tests/migrations/20260128212137_change_event_registrations_primary_key.sql new file mode 100644 index 0000000..bca99ca --- /dev/null +++ b/tests/migrations/20260128212137_change_event_registrations_primary_key.sql @@ -0,0 +1,18 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE event_identity_registration +DROP CONSTRAINT event_identity_registration_pkey; + +ALTER TABLE event_identity_registration +ADD PRIMARY KEY (eon, identity); +-- +goose StatementEnd + + +-- +goose Down +-- +goose StatementBegin +ALTER TABLE event_identity_registration +DROP CONSTRAINT event_identity_registration_pkey; + +ALTER TABLE event_identity_registration +ADD PRIMARY KEY (eon, identity_prefix, sender); +-- +goose StatementEnd diff --git a/tests/register_event_identity_test.go b/tests/register_event_identity_test.go index a2a43f5..b111254 100644 --- a/tests/register_event_identity_test.go +++ b/tests/register_event_identity_test.go @@ -89,16 +89,14 @@ func (s *TestShutterService) TestRegisterEventIdentity() { // Verify the registration was stored in the database dbRegistration, dbErr := s.dbQuery.GetEventIdentityRegistration(ctx, data.GetEventIdentityRegistrationParams{ - Eon: int64(eon), - IdentityPrefix: identityPrefix, - Sender: newSigner.From.Hex(), + Eon: int64(eon), + Identity: identity, }) for i := 0; i < 50 && (dbErr != nil || dbRegistration.ExpirationBlockNumber != expectedExpirationBlockNumber); i++ { time.Sleep(20 * time.Millisecond) dbRegistration, dbErr = s.dbQuery.GetEventIdentityRegistration(ctx, data.GetEventIdentityRegistrationParams{ - Eon: int64(eon), - IdentityPrefix: identityPrefix, - Sender: newSigner.From.Hex(), + Eon: int64(eon), + Identity: identity, }) } s.Require().NoError(dbErr) @@ -424,9 +422,8 @@ func (s *TestShutterService) TestRegisterEventIdentity_AlreadyRegistered() { // Verify the registration was stored in the database dbRegistration, dbErr := s.dbQuery.GetEventIdentityRegistration(ctx, data.GetEventIdentityRegistrationParams{ - Eon: int64(eon), - IdentityPrefix: identityPrefix, - Sender: newSigner.From.Hex(), + Eon: int64(eon), + Identity: identity, }) s.Require().NoError(dbErr) s.Require().Equal(int64(eon), dbRegistration.Eon)