@@ -57,3 +57,72 @@ FROM employees;
57
57
58
58
SELECT *
59
59
FROM raise_history;
60
+
61
+ -- user_login procedure
62
+ CREATE EXTENSION IF NOT EXISTS pgcrypto;
63
+
64
+ INSERT INTO " user" (username, password, last_login, created_at, updated_at)
65
+ VALUES (' Melissa' , crypt(' 123456' , gen_salt(' bf' )), NULL , NOW(), NOW());
66
+
67
+ CREATE OR REPLACE PROCEDURE user_login(user_name VARCHAR , user_password VARCHAR ) AS $$
68
+ DECLARE
69
+ was_found BOOLEAN ;
70
+ found_user_id INT ;
71
+ are_valid_credentials BOOLEAN ;
72
+ BEGIN
73
+ SELECT COUNT (* ) INTO was_found
74
+ FROM " user" WHERE username = user_name;
75
+
76
+ RAISE NOTICE ' was_found: %' , was_found;
77
+
78
+ IF (was_found = false) THEN
79
+ RAISE EXCEPTION ' User not found: %' , user_name;
80
+ END IF;
81
+
82
+ SELECT id INTO found_user_id
83
+ FROM " user" WHERE username = user_name;
84
+
85
+ SELECT COUNT (* ) INTO are_valid_credentials
86
+ FROM " user"
87
+ WHERE id = found_user_id
88
+ AND password = crypt(user_password, password);
89
+
90
+ IF (are_valid_credentials = false) THEN
91
+ INSERT INTO session_failed (user_id)
92
+ VALUES (found_user_id);
93
+
94
+ COMMIT ;
95
+
96
+ RAISE EXCEPTION ' Invalid credentials' ;
97
+ END IF;
98
+
99
+ UPDATE " user"
100
+ SET last_login = NOW()
101
+ WHERE username = user_name;
102
+
103
+ COMMIT ;
104
+
105
+ RAISE NOTICE ' User with valid credentials: %' , are_valid_credentials;
106
+ END;
107
+ $$ LANGUAGE plpgsql;
108
+
109
+ CALL user_login(' Stiven' , ' 12345' );
110
+
111
+ SELECT *
112
+ FROM " user" ;
113
+
114
+ SELECT *
115
+ FROM session_failed;
116
+
117
+ ALTER TABLE session_failed
118
+ ADD CONSTRAINT fk_user_id
119
+ FOREIGN KEY (user_id)
120
+ REFERENCES " user" (id);
121
+
122
+ SELECT *
123
+ FROM session;
124
+
125
+ ALTER TABLE session
126
+ ADD CONSTRAINT fk_user_id
127
+ FOREIGN KEY (user_id)
128
+ REFERENCES " user" (id);
0 commit comments