Fix docker #3
@@ -5,5 +5,6 @@ DB_PASSWORD=password
|
||||
DB_HOST=auth_db
|
||||
DB_PORT=5432
|
||||
DB_SSLMODE=disable
|
||||
DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:5432/${DB_NAME}
|
||||
ENABLE_REGISTRATION=true
|
||||
ALLOWED_ORIGINS="http://textsender.com"
|
||||
|
||||
@@ -5,5 +5,6 @@ DB_PASSWORD=password
|
||||
DB_HOST=localhost
|
||||
DB_PORT=5432
|
||||
DB_SSLMODE=disable
|
||||
DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:5432/${DB_NAME}
|
||||
ENABLE_REGISTRATION=true
|
||||
ALLOWED_ORIGINS="http://textsender.com"
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
SECRET_KEY=NULqYIzgt28bTiyziCd7IOO7b6LnWDW!
|
||||
DB_NAME=textsender_auth_db
|
||||
DB_USER=textsender_auth
|
||||
DB_PASSWORD=yEDjWZCH2vdctjn!
|
||||
DB_HOST=localhost
|
||||
DB_PORT=5432
|
||||
DB_SSLMODE=disable
|
||||
ENABLE_REGISTRATION=true
|
||||
ALLOWED_ORIGINS="http://textsender.com"
|
||||
@@ -3,12 +3,10 @@ name: Rust Build
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- v0.2.0
|
||||
- v0.2.0
|
||||
- main
|
||||
pull_request:
|
||||
branches:
|
||||
- v0.2.0
|
||||
- v0.2.0
|
||||
- main
|
||||
|
||||
jobs:
|
||||
check:
|
||||
@@ -19,11 +17,12 @@ jobs:
|
||||
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
with:
|
||||
toolchain: 1.95
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
- run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key
|
||||
chmod 600 ~/.ssh/textsender-models_deploy_key
|
||||
ssh-keyscan ${{ secret.MYHOST }} >> ~/.ssh/known_hosts
|
||||
ssh-keyscan ${{ secrets.MY_HOST }} >> ~/.ssh/known_hosts
|
||||
|
||||
eval $(ssh-agent -s)
|
||||
ssh-add -v ~/.ssh/textsender-models_deploy_key
|
||||
@@ -54,6 +53,7 @@ jobs:
|
||||
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
with:
|
||||
toolchain: 1.95
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
# --- Add this step for explicit verification ---
|
||||
- name: Verify Docker Environment
|
||||
run: |
|
||||
@@ -81,7 +81,7 @@ jobs:
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key
|
||||
chmod 600 ~/.ssh/textsender-models_deploy_key
|
||||
ssh-keyscan ${{ secret.MYHOST }} >> ~/.ssh/known_hosts
|
||||
ssh-keyscan ${{ secrets.MY_HOST }} >> ~/.ssh/known_hosts
|
||||
|
||||
eval $(ssh-agent -s)
|
||||
ssh-add -v ~/.ssh/textsender-models_deploy_key
|
||||
@@ -96,12 +96,13 @@ jobs:
|
||||
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
with:
|
||||
toolchain: 1.95
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
- run: rustup component add rustfmt
|
||||
- run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key
|
||||
chmod 600 ~/.ssh/textsender-models_deploy_key
|
||||
ssh-keyscan ${{ secret.MYHOST }} >> ~/.ssh/known_hosts
|
||||
ssh-keyscan ${{ secrets.MY_HOST }} >> ~/.ssh/known_hosts
|
||||
|
||||
eval $(ssh-agent -s)
|
||||
ssh-add -v ~/.ssh/textsender-models_deploy_key
|
||||
@@ -115,12 +116,13 @@ jobs:
|
||||
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
with:
|
||||
toolchain: 1.95
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
- run: rustup component add clippy
|
||||
- run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key
|
||||
chmod 600 ~/.ssh/textsender-models_deploy_key
|
||||
ssh-keyscan ${{ secret.MYHOST }} >> ~/.ssh/known_hosts
|
||||
ssh-keyscan ${{ secrets.MY_HOST }} >> ~/.ssh/known_hosts
|
||||
|
||||
eval $(ssh-agent -s)
|
||||
ssh-add -v ~/.ssh/textsender-models_deploy_key
|
||||
@@ -134,11 +136,12 @@ jobs:
|
||||
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||
with:
|
||||
toolchain: 1.95
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
- run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/textsender-models_deploy_key
|
||||
chmod 600 ~/.ssh/textsender-models_deploy_key
|
||||
ssh-keyscan ${{ secret.MYHOST }} >> ~/.ssh/known_hosts
|
||||
ssh-keyscan ${{ secrets.MY_HOST }} >> ~/.ssh/known_hosts
|
||||
|
||||
eval $(ssh-agent -s)
|
||||
ssh-add -v ~/.ssh/textsender-models_deploy_key
|
||||
|
||||
Generated
+1
-2
@@ -2241,12 +2241,11 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "textsender_models"
|
||||
version = "0.3.0"
|
||||
source = "git+ssh://git@git.kundeng.us/phoenix/textsender-models.git?tag=v0.3.0-19-cf112a468d-111#cf112a468d4e653ec49c55bc890d59b730c85f79"
|
||||
source = "git+ssh://git@git.kundeng.us/phoenix/textsender-models.git?tag=v0.3.0#d504108745b7b97a02eac24e16763cdb5e731f2b"
|
||||
dependencies = [
|
||||
"const_format",
|
||||
"dotenvy",
|
||||
"josekit",
|
||||
"rand 0.10.1",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"time",
|
||||
|
||||
+1
-1
@@ -21,7 +21,7 @@ time = { version = "0.3.47", features = ["macros", "serde"] }
|
||||
josekit = { version = "0.10.3" }
|
||||
utoipa = { version = "5.5.0", features = ["axum_extras"] }
|
||||
utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] }
|
||||
textsender_models = { git = "ssh://git@git.kundeng.us/phoenix/textsender-models.git", tag = "v0.3.0-19-cf112a468d-111" }
|
||||
textsender_models = { git = "ssh://git@git.kundeng.us/phoenix/textsender-models.git", tag = "v0.3.0" }
|
||||
|
||||
[dev-dependencies]
|
||||
http-body-util = { version = "0.1.3" }
|
||||
|
||||
+1
-1
@@ -63,7 +63,7 @@ COPY --from=builder /usr/src/app/.env .
|
||||
COPY --from=builder /usr/src/app/migrations ./migrations
|
||||
|
||||
# Expose the port your Axum app listens on (e.g., 3000 or 8000)
|
||||
EXPOSE 8001
|
||||
EXPOSE 9080
|
||||
|
||||
# Set the command to run your application
|
||||
# Ensure this matches the binary name copied above
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
-- Add migration script here
|
||||
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
||||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "user" (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
firstname TEXT NOT NULL,
|
||||
lastname TEXT NOT NULL,
|
||||
phone_number TEXT NOT NULL,
|
||||
username TEXT NOT NULL,
|
||||
password TEXT NOT NULL,
|
||||
created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
last_login TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
salt_id UUID NOT NULL
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "salt" (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
salt TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "service_user" (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
username TEXT NOT NULL,
|
||||
passphrase TEXT NOT NULL,
|
||||
created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
last_login timestamptz NULL
|
||||
);
|
||||
+32
-29
@@ -1,29 +1,32 @@
|
||||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
|
||||
DROP TABLE IF EXISTS users CASCADE;
|
||||
DROP TABLE IF EXISTS service_users CASCADE;
|
||||
|
||||
CREATE TABLE users (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
first_name TEXT NULL,
|
||||
last_name TEXT NULL,
|
||||
phone_number TEXT NOT NULL,
|
||||
username TEXT NOT NULL,
|
||||
password TEXT NOT NULL,
|
||||
created timestamptz DEFAULT now(),
|
||||
last_login timestamptz NULL,
|
||||
salt_id UUID NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "salt" (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
salt TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE service_users (
|
||||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||
username TEXT NOT NULL,
|
||||
passphrase TEXT NOT NULL,
|
||||
created timestamptz DEFAULT now(),
|
||||
last_login timestamptz NULL
|
||||
);
|
||||
-- CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
||||
-- CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||
--
|
||||
-- DROP TABLE IF EXISTS "user" CASCADE;
|
||||
-- DROP TABLE IF EXISTS "salt" CASCADE;
|
||||
-- DROP TABLE IF EXISTS "service_user" CASCADE;
|
||||
--
|
||||
-- CREATE TABLE IF NOT EXISTS "user" (
|
||||
-- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
-- first_name TEXT NOT NULL,
|
||||
-- last_name TEXT NOT NULL,
|
||||
-- phone_number TEXT NOT NULL,
|
||||
-- username TEXT NOT NULL,
|
||||
-- password TEXT NOT NULL,
|
||||
-- created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
-- last_login TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
-- salt_id UUID NOT NULL
|
||||
-- );
|
||||
--
|
||||
--
|
||||
-- CREATE TABLE IF NOT EXISTS "salt" (
|
||||
-- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
-- salt TEXT NOT NULL
|
||||
-- );
|
||||
--
|
||||
-- CREATE TABLE IF NOT EXISTS "service_user" (
|
||||
-- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
-- username TEXT NOT NULL,
|
||||
-- passphrase TEXT NOT NULL,
|
||||
-- created TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
-- last_login timestamptz NULL
|
||||
-- );
|
||||
|
||||
+2
-2
@@ -3,6 +3,6 @@ pub mod register;
|
||||
|
||||
pub mod endpoints {
|
||||
pub const ROOT: &str = "/";
|
||||
pub const REGISTER: &str = "/api/v2/register";
|
||||
pub const DBTEST: &str = "/api/v2/test/db";
|
||||
pub const REGISTER: &str = "/api/v1/register";
|
||||
pub const DBTEST: &str = "/api/v1/test/db";
|
||||
}
|
||||
|
||||
+17
-13
@@ -8,18 +8,15 @@ pub mod request {
|
||||
|
||||
#[derive(Default, Deserialize, Serialize, utoipa::ToSchema)]
|
||||
pub struct Request {
|
||||
#[serde(skip_serializing_if = "String::is_empty")]
|
||||
pub username: String,
|
||||
#[serde(skip_serializing_if = "String::is_empty")]
|
||||
pub password: String,
|
||||
#[serde(skip_serializing_if = "String::is_empty")]
|
||||
pub email: String,
|
||||
#[serde(skip_serializing_if = "String::is_empty")]
|
||||
pub phone: String,
|
||||
#[serde(skip_serializing_if = "String::is_empty")]
|
||||
pub firstname: String,
|
||||
#[serde(skip_serializing_if = "String::is_empty")]
|
||||
pub lastname: String,
|
||||
pub phone_number: String,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub email: Option<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub firstname: Option<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub lastname: Option<String>,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,16 +68,19 @@ pub async fn register_user(
|
||||
username: payload.username.clone(),
|
||||
password: payload.password.clone(),
|
||||
// email: payload.email.clone(),
|
||||
phone_number: payload.phone.clone(),
|
||||
firstname: payload.firstname.clone(),
|
||||
lastname: payload.lastname.clone(),
|
||||
phone_number: payload.phone_number.clone(),
|
||||
// email_verified: true,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
user.firstname = payload.firstname.unwrap_or_default();
|
||||
user.lastname = payload.lastname.unwrap_or_default();
|
||||
|
||||
println!("Checking if user exists");
|
||||
match repo::user::exists(&pool, &user.username).await {
|
||||
Ok(res) => {
|
||||
if res {
|
||||
println!("Already exists");
|
||||
(
|
||||
StatusCode::BAD_REQUEST,
|
||||
Json(response::Response {
|
||||
@@ -89,16 +89,20 @@ pub async fn register_user(
|
||||
}),
|
||||
)
|
||||
} else {
|
||||
println!("Good to create");
|
||||
println!("Generate salt string");
|
||||
let salt_string = hashing::generate_salt().unwrap();
|
||||
let mut salt = textsender_models::user::Salt::default();
|
||||
let generated_salt = salt_string;
|
||||
salt.salt = generated_salt.to_string();
|
||||
println!("Creating salt");
|
||||
salt.id = repo::salt::insert(&pool, &salt).await.unwrap();
|
||||
user.salt_id = salt.id;
|
||||
let hashed_password =
|
||||
hashing::hash_password(&user.password, &generated_salt).unwrap();
|
||||
user.password = hashed_password;
|
||||
|
||||
println!("Creating user");
|
||||
match repo::user::insert(&pool, &user).await {
|
||||
Ok((id, date_created)) => {
|
||||
user.id = id;
|
||||
|
||||
+19
-6
@@ -15,7 +15,7 @@ pub mod user {
|
||||
) -> Result<textsender_models::user::User, sqlx::Error> {
|
||||
let result = sqlx::query(
|
||||
r#"
|
||||
SELECT * FROM "user" WHERE username = $1
|
||||
SELECT id, username, password, phone_number, salt_id, firstname, lastname, created, last_login FROM "user" WHERE username = $1
|
||||
"#,
|
||||
)
|
||||
.bind(username)
|
||||
@@ -85,8 +85,21 @@ pub mod user {
|
||||
.await;
|
||||
|
||||
match result {
|
||||
Ok(r) => Ok(r.is_some()),
|
||||
Err(e) => Err(e),
|
||||
Ok(r) => match r {
|
||||
Some(row) => {
|
||||
if row.is_empty() {
|
||||
Ok(false)
|
||||
} else {
|
||||
Ok(true)
|
||||
}
|
||||
}
|
||||
None => Ok(false),
|
||||
},
|
||||
Err(e) => {
|
||||
eprintln!("What??");
|
||||
eprintln!("Error: {e:?}");
|
||||
Err(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,7 +109,7 @@ pub mod user {
|
||||
) -> Result<(uuid::Uuid, std::option::Option<time::OffsetDateTime>), sqlx::Error> {
|
||||
let row = sqlx::query(
|
||||
r#"
|
||||
INSERT INTO "user" (username, password, phone, firstname, lastname, salt_id)
|
||||
INSERT INTO "user" (username, password, phone_number, firstname, lastname, salt_id)
|
||||
VALUES ($1, $2, $3, $4, $5, $6)
|
||||
RETURNING id, created;
|
||||
"#,
|
||||
@@ -117,7 +130,7 @@ pub mod user {
|
||||
let result = InsertedData {
|
||||
id: row.try_get("id").map_err(|_e| sqlx::Error::RowNotFound)?,
|
||||
date_created: row
|
||||
.try_get("date_created")
|
||||
.try_get("created")
|
||||
.map_err(|_e| sqlx::Error::RowNotFound)?,
|
||||
};
|
||||
|
||||
@@ -143,7 +156,7 @@ pub mod salt {
|
||||
) -> Result<textsender_models::user::Salt, sqlx::Error> {
|
||||
let result = sqlx::query(
|
||||
r#"
|
||||
SELECT * FROM "salt" WHERE id = $1
|
||||
SELECT id, salt FROM "salt" WHERE id = $1
|
||||
"#,
|
||||
)
|
||||
.bind(id)
|
||||
|
||||
Reference in New Issue
Block a user