006
This commit is contained in:
24
src/main.v
24
src/main.v
@@ -1,14 +1,19 @@
|
||||
module main
|
||||
|
||||
import veb
|
||||
import databases
|
||||
|
||||
pub struct Context {
|
||||
veb.Context
|
||||
}
|
||||
import db.sqlite
|
||||
import veb.auth
|
||||
|
||||
pub struct App {
|
||||
veb.StaticHandler
|
||||
pub mut:
|
||||
db sqlite.DB
|
||||
auth auth.Auth[sqlite.DB]
|
||||
}
|
||||
|
||||
pub struct Context {
|
||||
veb.Context
|
||||
user User
|
||||
}
|
||||
|
||||
pub fn (app &App) index(mut ctx Context) veb.Result {
|
||||
@@ -16,16 +21,17 @@ pub fn (app &App) index(mut ctx Context) veb.Result {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
mut db := databases.create_db_connection() or { panic(err) }
|
||||
mut app := &App{
|
||||
db: sqlite.connect('app.db')!
|
||||
}
|
||||
|
||||
sql db {
|
||||
sql app.db {
|
||||
create table User
|
||||
create table Plane
|
||||
create table Ticket
|
||||
} or { panic('error on create table: ${err}') }
|
||||
|
||||
db.close() or { panic(err) }
|
||||
mut app := &App{}
|
||||
app.auth = auth.new(app.db)
|
||||
|
||||
app.handle_static('static', false)!
|
||||
|
||||
|
@@ -133,6 +133,7 @@
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
<script src="https://unpkg.com/htmx.org@2.0.4"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
@@ -142,7 +143,12 @@
|
||||
</header>
|
||||
|
||||
<section class="registration-form">
|
||||
<form id="user-registration-form">
|
||||
<form
|
||||
id="user-registration-form"
|
||||
hx-trigger="submit"
|
||||
hx-post="/controller/user/create"
|
||||
hx-target="#user-registration-form"
|
||||
>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="first-name">First Name</label>
|
||||
|
132
src/templates/signup_form.html
Normal file
132
src/templates/signup_form.html
Normal file
@@ -0,0 +1,132 @@
|
||||
<form
|
||||
id="user-registration-form"
|
||||
hx-trigger="submit"
|
||||
hx-post="/controller/user/create"
|
||||
hx-target="#user-registration-form"
|
||||
>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="first-name">First Name</label>
|
||||
<input
|
||||
type="text"
|
||||
id="first-name"
|
||||
name="first_name"
|
||||
placeholder="Enter your first name"
|
||||
required
|
||||
/>
|
||||
<div class="error-message" id="first-name-error">
|
||||
Please enter a valid first name
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" hx-target="this" hx-swap="outerHTML">
|
||||
<label for="last-name">Last Name</label>
|
||||
<input
|
||||
type="text"
|
||||
id="last-name"
|
||||
name="last_name"
|
||||
placeholder="Enter your last name"
|
||||
required
|
||||
/>
|
||||
<div class="error-message" id="last-name-error">
|
||||
Please enter a valid last name
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="email">Email Address</label>
|
||||
<input
|
||||
type="email"
|
||||
id="email"
|
||||
name="email"
|
||||
placeholder="Enter your email"
|
||||
required
|
||||
/>
|
||||
<div class="error-message" id="email-error">
|
||||
Please enter a valid email address
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password">Password</label>
|
||||
<input
|
||||
type="password"
|
||||
id="password"
|
||||
name="password"
|
||||
placeholder="Create a strong password"
|
||||
required
|
||||
/>
|
||||
<div class="error-message" id="password-error">
|
||||
Password must be at least 8 characters long
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<!-- <div class="form-group">
|
||||
<label for="date-of-birth">Date of Birth</label>
|
||||
<input
|
||||
type="date"
|
||||
id="date-of-birth"
|
||||
name="date-of-birth"
|
||||
required
|
||||
/>
|
||||
<div class="error-message" id="dob-error">
|
||||
You must be at least 18 years old
|
||||
</div>
|
||||
</div> -->
|
||||
<div class="form-group">
|
||||
<label>Gender</label>
|
||||
<div class="gender-group">
|
||||
<div class="form-group">
|
||||
<input
|
||||
type="radio"
|
||||
id="male"
|
||||
name="gender"
|
||||
value="male"
|
||||
required
|
||||
/>
|
||||
<label for="male">Male</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input
|
||||
type="radio"
|
||||
id="female"
|
||||
name="gender"
|
||||
value="female"
|
||||
required
|
||||
/>
|
||||
<label for="female">Female</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input
|
||||
type="radio"
|
||||
id="other"
|
||||
name="gender"
|
||||
value="other"
|
||||
required
|
||||
/>
|
||||
<label for="other">Other</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div class="form-group">
|
||||
<label for="country">Country</label>
|
||||
<select id="country" name="country" required>
|
||||
<option value="">Select your country</option>
|
||||
<option value="us">United States</option>
|
||||
<option value="ca">Canada</option>
|
||||
<option value="uk">United Kingdom</option>
|
||||
<option value="au">Australia</option>
|
||||
<option value="other">Other</option>
|
||||
</select>
|
||||
<div class="error-message" id="country-error">
|
||||
Please select a country
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div class="form-group">
|
||||
<button type="submit" class="register-btn">Create Account</button>
|
||||
</div>
|
||||
</form>
|
@@ -1,8 +1,6 @@
|
||||
module main
|
||||
|
||||
import veb
|
||||
import encoding.base64
|
||||
import json
|
||||
|
||||
@['/controller/user/create'; post]
|
||||
pub fn (mut app App) controller_create_user(mut ctx Context) veb.Result {
|
||||
@@ -31,7 +29,7 @@ pub fn (mut app App) controller_create_user(mut ctx Context) veb.Result {
|
||||
|
||||
// If any fields are empty, return error message
|
||||
if empty_fields.len > 0 {
|
||||
return ctx.text('The following fields cannot be empty: ${empty_fields.join(", ")}')
|
||||
return ctx.text('The following fields cannot be empty: ${empty_fields.join(', ')}')
|
||||
}
|
||||
|
||||
app.service_add_user(first_name, last_name, email, password, gender) or {
|
||||
|
@@ -10,4 +10,5 @@ mut:
|
||||
password string @[sql_type: 'TEXT']
|
||||
gender string @[sql_type: 'TEXT']
|
||||
tickets []Ticket @[fkey: 'user_id']
|
||||
salt string
|
||||
}
|
||||
|
@@ -1,30 +1,21 @@
|
||||
module main
|
||||
|
||||
import crypto.bcrypt
|
||||
import databases
|
||||
import veb.auth
|
||||
|
||||
fn (app &App) service_add_user(first_name string, last_name string, email string, password string, gender string) ! {
|
||||
mut db := databases.create_db_connection()!
|
||||
|
||||
defer {
|
||||
db.close() or { panic(err) }
|
||||
}
|
||||
|
||||
hashed_password := bcrypt.generate_from_password(password.bytes(), bcrypt.min_cost) or {
|
||||
eprintln(err)
|
||||
return err
|
||||
}
|
||||
salt := auth.generate_salt()
|
||||
|
||||
user_model := User{
|
||||
first_name: first_name
|
||||
last_name: last_name
|
||||
email: email
|
||||
password: hashed_password
|
||||
password: auth.hash_password_with_salt(password, salt)
|
||||
gender: gender
|
||||
salt: salt
|
||||
}
|
||||
|
||||
mut insert_error := ''
|
||||
sql db {
|
||||
sql app.db {
|
||||
insert user_model into User
|
||||
} or { insert_error = err.msg() }
|
||||
if insert_error != '' {
|
||||
|
7
src/user_view.v
Normal file
7
src/user_view.v
Normal file
@@ -0,0 +1,7 @@
|
||||
module main
|
||||
|
||||
import veb
|
||||
|
||||
pub fn (app &App) signup(mut ctx Context) veb.Result {
|
||||
return $veb.html()
|
||||
}
|
Reference in New Issue
Block a user