47 lines
1.0 KiB
V
47 lines
1.0 KiB
V
module database
|
|
|
|
import time
|
|
|
|
@[table: 'login_attempts']
|
|
pub struct Logins {
|
|
mut:
|
|
ip string @[primary]
|
|
attempts int @[nonnull]
|
|
attempt_time time.Time @[nonnull]
|
|
}
|
|
|
|
pub fn Logins.by_ip(ip string, mut database_ Database) ?Logins {
|
|
query := database_.get_query_builder[Logins]().where('ip = ?', ip) or { return none }
|
|
result := database_.query[Logins](query) or { return none }
|
|
|
|
return result.first()
|
|
}
|
|
|
|
pub fn Logins.create_or_update(ip string, mut database_ Database) ?Logins {
|
|
mut login := Logins{
|
|
ip: ip
|
|
attempts: 1
|
|
attempt_time: time.now()
|
|
}
|
|
|
|
if existing := Logins.by_ip(ip, mut database_) {
|
|
login.attempts = existing.attempts + 1
|
|
login.attempt_time = time.now()
|
|
|
|
db := database_.get_connection() or { panic(err) }
|
|
|
|
sql db {
|
|
update Logins set attempts = login.attempts, attempt_time = login.attempt_time
|
|
where ip == ip
|
|
} or { return none }
|
|
} else {
|
|
db := database_.get_connection() or { panic(err) }
|
|
|
|
sql db {
|
|
insert login into Logins
|
|
} or { return none }
|
|
}
|
|
|
|
return login
|
|
}
|