Bu, bir kullanıcı hesabının Cassandra veritabanı ile nasıl yönetilebileceğini gösteren çok basit bir örnektir. Ayrıca bazı genel ve özel (kimliği doğrulanmış) özellikleri benimsemenize yardımcı olur. Cassandra veri modelleme ile ilgili kodu ve bu mükemmel video eğitimine göz atın.


Veritabanı


CREATE KEYSPACE IF NOT EXISTS blog
WITH REPLICATION = {
'class': 'NetworkTopologyStrategy',
'datacenter1': 1
};


DROP TABLE IF EXISTS blog.user_accounts;
CREATE TABLE IF NOT EXISTS blog.user_accounts (
id uuid,
name text,
email text,
created_at timestamp,
deleted_at timestamp,
PRIMARY KEY (id)
);


DROP TABLE IF EXISTS blog.user_credentials;
CREATE TABLE IF NOT EXISTS blog.user_credentials (
email text,
password text,
user_account_id uuid,
deleted_at timestamp,
PRIMARY KEY (email)
);


DROP TABLE IF EXISTS password_recovery_tokens;
CREATE TABLE IF NOT EXISTS password_reset_tokens (
"token" text,
email text,
user_account_id uuid,
PRIMARY KEY ("token")
) WITH default_time_to_live = 3600;

Tasarım


Bazen bir şeyi başarmak için birden fazla sorgunun çalıştırılması kaçınılmazdır. Ancak, tasarım nedeniyle, koşullara sahip toplu işlemler birden fazla tabloya yayılamaz, bu nedenle manuel geri alma işlemini yapmanız gerekir.


Yeni bir kullanıcı yaratma (genel)


Yeni bir kullanıcı oluşturmak, email benzersizliğini zorunlu kıldığı için user_credentials öğesinden başlar. Bundan sonra, user_credentials'tan gelen aynı email ve id kullanılarak user_accounts oluşturulur. id'nin benzersizliği user_accounts tarafından zorlanır, bu nedenle bir çakışma durumunda user_credentials geri alınmalıdır. id, bir kullanıcının genel tanımlayıcısıdır ve asla değişmez. Bu değer, kullanıcı ilişkisini temsil etmek için diğer tablolarda kullanılabilir.


// Creates `user_credentials` unless `email` value is taken.
INSERT INTO user_credentials (email, password, user_account_id)
VALUES (?, ?, ?) IF NOT EXISTS;

// Creates `user_accounts` unless `id` value is taken.
INSERT INTO user_accounts (id, name, created_at, email)
VALUES (?, ?, ?, ?) IF NOT EXISTS;

Şifre unutma (genel)


Tek bilmeniz gereken, bir şifre kurtarma linki göndermek için e-posta adresidir. Token değerini nasıl oluşturacağınız size kalmış. Yalnızca bir karma veya kodlanmış token olabilir. Tokenlerin süresi, tablo düzeyinde default_time_to_live ile tanımlandığı şekilde varsayılan olarak 1 saat içinde sona erer.


// Select current data.
SELECT * FROM user_credentials WHERE email = 'current email';

// Insert new password reset token record.
INSERT INTO password_reset_tokens (token, email, user_account_id)
VALUES (?, ?, ?) IF NOT EXISTS;

Şifreyi yenileme (genel)


Link'e eklenmiş tokeniniz zaten var. Token, kullanıcı verilerini içeren kodlanmış bir değerse, veritabanından gelen verilerin kodunu çözebilir ve doğrulayabilirsiniz.


// Select current token.
SELECT * FROM password_reset_tokens WHERE token = ?;

// Update password.
UPDATE user_credentials SET password = ? WHERE email = 'current email' IF EXISTS;

// Delete current token.
DELETE FROM password_reset_tokens WHERE token = ?;

Kullanıcı login (genel)


// Select user and verify password.
SELECT * FROM user_credentials WHERE email = ?;

E-posta adresini değiştirme (özel)


Login olduğunuz için email adresini biliyorsunuz.


// Select current data.
SELECT * FROM user_credentials WHERE email = 'current email';

// Create a new record using new and current data.
INSERT INTO user_credentials (email, password, user_account_id)
VALUES ('new email', 'current password', current uuid) IF NOT EXISTS;

// Update current email with new one.
UPDATE user_accounts SET email = 'new email' WHERE id = current uuid IF EXISTS;

// Delete redundant record.
DELETE FROM user_credentials WHERE email = 'current email' IF EXISTS;

Şifre değiştirme (özel)


Login olduğunuz için email adresini biliyorsunuz. Bu tür işlemler genellikle önceden şifre onayı gerektirir.


// Update current password with new one.
UPDATE user_credentials SET password = ? WHERE email = ? IF EXISTS;

Hesap silme (özel)


Login olduğunuz için email adresini biliyorsunuz. Bu tür işlemler genellikle önceden şifre onayı gerektirir. Sabit silme genellikle bir seçenek değildir. Kayıtları bir zaman damgasıyla "silindi" olarak işaretleyerek bunun yerine geçici silmeyi kullanın.


// Select current data.
SELECT * FROM user_credentials WHERE email = 'current email';

// Soft delete.
UPDATE user_credentials SET deleted_at = ? WHERE email = 'current email' IF EXISTS;
UPDATE user_accounts SET deleted_at = ? WHERE id = current uuid IF EXISTS;