Compare commits

..

10 Commits

Author SHA1 Message Date
8952763fd0 Code cleanup
All checks were successful
Rust Build / Check (pull_request) Successful in 44s
Rust Build / Test Suite (pull_request) Successful in 1m20s
Rust Build / Rustfmt (pull_request) Successful in 31s
Rust Build / Clippy (pull_request) Successful in 47s
Rust Build / build (pull_request) Successful in 1m10s
2025-04-07 14:13:42 -04:00
f9aaa2970f Using functions for setting times on tokens 2025-04-07 14:12:31 -04:00
713108aa6d Code cleanup 2025-04-07 14:09:11 -04:00
785af4b4a3 Code cleanup
All checks were successful
Rust Build / Check (pull_request) Successful in 42s
Rust Build / Test Suite (pull_request) Successful in 58s
Rust Build / Rustfmt (pull_request) Successful in 26s
Rust Build / Clippy (pull_request) Successful in 45s
Rust Build / build (pull_request) Successful in 1m30s
2025-04-07 13:56:26 -04:00
6b7fa86f59 Bug fix
All checks were successful
Rust Build / Check (pull_request) Successful in 42s
Rust Build / Test Suite (pull_request) Successful in 1m1s
Rust Build / Rustfmt (pull_request) Successful in 31s
Rust Build / Clippy (pull_request) Successful in 45s
Rust Build / build (pull_request) Successful in 1m12s
2025-04-07 13:46:23 -04:00
905a06111c Added test for checking for wrong hashed password
All checks were successful
Rust Build / Check (pull_request) Successful in 46s
Rust Build / Test Suite (pull_request) Successful in 56s
Rust Build / Rustfmt (pull_request) Successful in 30s
Rust Build / Clippy (pull_request) Successful in 46s
Rust Build / build (pull_request) Successful in 1m11s
2025-04-07 13:38:04 -04:00
90db1a97fb Code cleanup
All checks were successful
Rust Build / Check (pull_request) Successful in 46s
Rust Build / Test Suite (pull_request) Successful in 1m0s
Rust Build / Rustfmt (pull_request) Successful in 27s
Rust Build / Clippy (pull_request) Successful in 45s
Rust Build / build (pull_request) Successful in 1m13s
2025-04-07 13:16:21 -04:00
8ddc2f73c4 Using functions for setting times on tokens 2025-04-07 13:11:49 -04:00
7cac6d5aae Code refactor 2025-04-07 12:31:58 -04:00
e19f71fd1c Simplifying code
All checks were successful
Rust Build / Check (pull_request) Successful in 46s
Rust Build / Test Suite (pull_request) Successful in 1m6s
Rust Build / Rustfmt (pull_request) Successful in 32s
Rust Build / Clippy (pull_request) Successful in 47s
Rust Build / build (pull_request) Successful in 1m14s
2025-04-07 12:27:21 -04:00
11 changed files with 10 additions and 213 deletions

View File

@@ -1,21 +0,0 @@
# Ignore build artifacts
target/
pkg/
# Ignore git directory
.git/
.gitea/
# Ignore environment files (configure via docker-compose instead)
.env*
# Ignore IDE/editor specific files
.idea/
.vscode/
# Ignore OS specific files
*.DS_Store
# Add any other files/directories you don't need in the image
# e.g., logs/, tmp/

View File

@@ -1,6 +1,2 @@
SECRET_KEY=refero34o8rfhfjn983thf39fhc943rf923n3h DATABASE_URL=postgres://username:password@localhost/database_name
POSTGRES_USER=icarus_op_test SECRET_KEY=refero34o8rfhfjn983thf39fhc943rf923n3h
POSTGRES_PASSWORD=password
POSTGRES_DB=icarus_auth_test_db
POSTGRES_HOST=localhost
DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:5432/${POSTGRES_DB}

View File

@@ -4,6 +4,8 @@ on:
push: push:
branches: branches:
- devel - devel
tags:
- 'v*' # Trigger on tags matching v*
jobs: jobs:
release: release:
@@ -50,4 +52,6 @@ jobs:
body: | body: |
Release of version ${{ steps.version.outputs.project_tag_release }} Release of version ${{ steps.version.outputs.project_tag_release }}
# draft: false # draft: false
# prerelease: ${{ startsWith(github.ref, 'v') == false }} # prerelease if not a valid release tag # prerelease: ${{ startsWith(github.ref, 'v') == false }} # prerelease if not a valid release tag

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "icarus_auth" name = "icarus_auth"
version = "0.3.4" version = "0.3.0"
edition = "2024" edition = "2024"
rust-version = "1.86" rust-version = "1.86"

View File

@@ -1,71 +0,0 @@
# Stage 1: Build the application
# Use a specific Rust version for reproducibility. Choose one that matches your development environment.
# Using slim variant for smaller base image
FROM rust:1.86 as builder
# Set the working directory inside the container
WORKDIR /usr/src/app
# Install build dependencies if needed (e.g., for certain crates like sqlx with native TLS)
# RUN apt-get update && apt-get install -y pkg-config libssl-dev
# Install build dependencies if needed (e.g., git for cloning)
RUN apt-get update && apt-get install -y --no-install-recommends \
pkg-config libssl3 \
ca-certificates \
openssh-client git \
&& rm -rf /var/lib/apt/lists/*
# << --- ADD HOST KEY HERE --- >>
# Replace 'yourgithost.com' with the actual hostname (e.g., github.com)
RUN mkdir -p -m 0700 ~/.ssh && \
ssh-keyscan git.kundeng.us >> ~/.ssh/known_hosts
# Copy Cargo manifests
COPY Cargo.toml Cargo.lock ./
# Build *only* dependencies to leverage Docker cache
# This dummy build caches dependencies as a separate layer
RUN --mount=type=ssh mkdir src && \
echo "fn main() {println!(\"if you see this, the build broke\")}" > src/main.rs && \
cargo build --release --quiet && \
rm -rf src target/release/deps/icarus_auth* # Clean up dummy build artifacts (replace icarus_auth)
# Copy the actual source code
COPY src ./src
# If you have other directories like `templates` or `static`, copy them too
COPY .env ./.env
COPY migrations ./migrations
# << --- SSH MOUNT ADDED HERE --- >>
# Build *only* dependencies to leverage Docker cache
# This dummy build caches dependencies as a separate layer
# Mount the SSH agent socket for this command
RUN --mount=type=ssh \
cargo build --release --quiet
# Stage 2: Create the final, smaller runtime image
# Use a minimal base image like debian-slim or even distroless for security/size
FROM ubuntu:24.04
# Install runtime dependencies if needed (e.g., SSL certificates)
RUN apt-get update && apt-get install -y ca-certificates libssl-dev libssl3 && rm -rf /var/lib/apt/lists/*
# Set the working directory
WORKDIR /usr/local/bin
# Copy the compiled binary from the builder stage
# Replace 'icarus_auth' with the actual name of your binary (usually the crate name)
COPY --from=builder /usr/src/app/target/release/icarus_auth .
# Copy other necessary files like .env (if used for runtime config) or static assets
# It's generally better to configure via environment variables in Docker though
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 3000
# Set the command to run your application
# Ensure this matches the binary name copied above
CMD ["./icarus_auth"]

View File

@@ -1,20 +0,0 @@
# Getting started
Take notice of the .env.sample file and create copies without the .sample in the name.
`.env.sample` -> `.env`
Ensure that all variables are populated and is correct.
## Docker
Build the images
```
docker compose build --ssh default auth_api
```
Bring it up
```
docker compose up -d --force-recreate auth_api
```

View File

@@ -1,43 +0,0 @@
version: '3.8' # Use a recent version
services:
# Your Rust Application Service
auth_api:
build: . # Tells docker-compose to build the Dockerfile in the current directory
container_name: icarus_auth # Optional: Give the container a specific name
ports:
# Map host port 8000 to container port 3000 (adjust as needed)
- "8000:3000"
env_file:
- .env
depends_on:
auth_db:
condition: service_healthy # Wait for the DB to be healthy before starting the app
restart: unless-stopped # Optional: Restart policy
# PostgreSQL Database Service
auth_db:
image: postgres:17.4-alpine # Use an official Postgres image (Alpine variant is smaller)
container_name: icarus_auth_db # Optional: Give the container a specific name
environment:
# These MUST match the user, password, and database name in the DATABASE_URL above
POSTGRES_USER: ${POSTGRES_USER:-icarus_op}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}
POSTGRES_DB: ${POSTGRES_DB:-icarus_auth}
volumes:
# Persist database data using a named volume
- postgres_data:/var/lib/postgresql/data
ports: []
healthcheck:
# Checks if Postgres is ready to accept connections
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
restart: always # Optional: Restart policy
# Define the named volume for data persistence
volumes:
postgres_data:
driver: local # Use the default local driver

View File

@@ -1,13 +0,0 @@
# Docker stuff
#Build app
docker compose build --ssh default auth_api
# Rebuild and bring up
docker compose up -d --force-recreate auth_api
# Bring it down
docker compose down -v
# Pruning
docker system prune -a

View File

@@ -51,16 +51,13 @@ pub mod endpoint {
let (token_literal, duration) = token_stuff::create_token(&key).unwrap(); let (token_literal, duration) = token_stuff::create_token(&key).unwrap();
if token_stuff::verify_token(&key, &token_literal) { if token_stuff::verify_token(&key, &token_literal) {
let current_time = time::OffsetDateTime::now_utc();
let _ = repo::user::update_last_login(&pool, &user, &current_time).await;
( (
StatusCode::OK, StatusCode::OK,
Json(response::Response { Json(response::Response {
message: String::from("Successful"), message: String::from("Successful"),
data: vec![icarus_models::login_result::LoginResult { data: vec![icarus_models::login_result::LoginResult {
id: user.id, id: user.id,
username: user.username.clone(), username: user.username,
token: token_literal, token: token_literal,
token_type: String::from(token_stuff::TOKENTYPE), token_type: String::from(token_stuff::TOKENTYPE),
expiration: duration, expiration: duration,

View File

@@ -36,6 +36,7 @@ pub mod db {
async fn get_db_url() -> String { async fn get_db_url() -> String {
#[cfg(debug_assertions)] // Example: Only load .env in debug builds #[cfg(debug_assertions)] // Example: Only load .env in debug builds
dotenvy::dotenv().ok(); dotenvy::dotenv().ok();
env::var(keys::DBURL).expect(keys::error::ERROR) env::var(keys::DBURL).expect(keys::error::ERROR)
} }

View File

@@ -42,39 +42,6 @@ pub mod user {
} }
} }
pub async fn update_last_login(
pool: &sqlx::PgPool,
user: &icarus_models::user::User,
time: &time::OffsetDateTime,
) -> Result<time::OffsetDateTime, sqlx::Error> {
let result = sqlx::query(
r#"
UPDATE "user" SET last_login = $1 WHERE id = $2 RETURNING last_login
"#,
)
.bind(time)
.bind(user.id)
.fetch_optional(pool)
.await
.map_err(|e| {
eprintln!("Error updating time: {}", e);
e
});
match result {
Ok(row) => match row {
Some(r) => {
let last_login: time::OffsetDateTime = r
.try_get("last_login")
.map_err(|_e| sqlx::Error::RowNotFound)?;
Ok(last_login)
}
None => Err(sqlx::Error::RowNotFound),
},
Err(err) => Err(err),
}
}
pub async fn exists(pool: &sqlx::PgPool, username: &String) -> Result<bool, sqlx::Error> { pub async fn exists(pool: &sqlx::PgPool, username: &String) -> Result<bool, sqlx::Error> {
let result = sqlx::query( let result = sqlx::query(
r#" r#"