diff --git a/migrations/20250216175313_create_adresar_table.sql b/migrations/20250216175313_create_adresar_table.sql index 9dbf7b2..1613c51 100644 --- a/migrations/20250216175313_create_adresar_table.sql +++ b/migrations/20250216175313_create_adresar_table.sql @@ -1,6 +1,7 @@ -- Add migration script here CREATE TABLE adresar ( id BIGSERIAL PRIMARY KEY, + deleted BOOLEAN NOT NULL DEFAULT FALSE, firma TEXT NOT NULL, kz TEXT, drc TEXT, @@ -16,5 +17,6 @@ CREATE TABLE adresar ( telefon TEXT, skladu TEXT, fax TEXT, - created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP + created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP ); diff --git a/src/adresar/handlers/delete_adresar.rs b/src/adresar/handlers/delete_adresar.rs index 1700f6d..fa06f40 100644 --- a/src/adresar/handlers/delete_adresar.rs +++ b/src/adresar/handlers/delete_adresar.rs @@ -9,7 +9,8 @@ pub async fn delete_adresar( ) -> Result { let rows_affected = sqlx::query!( r#" - DELETE FROM adresar + UPDATE adresar + SET deleted = true WHERE id = $1 "#, request.id @@ -23,3 +24,4 @@ pub async fn delete_adresar( success: rows_affected > 0, }) } + diff --git a/src/adresar/handlers/get_adresar.rs b/src/adresar/handlers/get_adresar.rs index 7e7bd4e..b20b1f9 100644 --- a/src/adresar/handlers/get_adresar.rs +++ b/src/adresar/handlers/get_adresar.rs @@ -11,7 +11,24 @@ pub async fn get_adresar( let adresar = sqlx::query_as!( Adresar, r#" - SELECT id, firma, kz, drc, ulica, psc, mesto, stat, banka, ucet, skladm, ico, kontakt, telefon, skladu, fax + SELECT + id, + deleted, + firma, + kz, + drc, + ulica, + psc, + mesto, + stat, + banka, + ucet, + skladm, + ico, + kontakt, + telefon, + skladu, + fax FROM adresar WHERE id = $1 "#, @@ -40,3 +57,4 @@ pub async fn get_adresar( fax: adresar.fax.unwrap_or_default(), }) } + diff --git a/src/adresar/handlers/get_adresar_by_position.rs b/src/adresar/handlers/get_adresar_by_position.rs index 17b73b5..9470bc9 100644 --- a/src/adresar/handlers/get_adresar_by_position.rs +++ b/src/adresar/handlers/get_adresar_by_position.rs @@ -1,4 +1,4 @@ -// src/adresar/handlers/get_by_position.rs +// src/adresar/handlers/get_adresar_by_position.rs use tonic::{Status}; use sqlx::PgPool; use crate::proto::multieko2::{PositionRequest, AdresarResponse, GetAdresarRequest}; @@ -11,16 +11,24 @@ pub async fn get_adresar_by_position( if request.position < 1 { return Err(Status::invalid_argument("Position must be at least 1")); } - let offset = request.position - 1; - + + // Find the ID of the Nth non-deleted record let id: i64 = sqlx::query_scalar!( - "SELECT id FROM adresar ORDER BY id ASC OFFSET $1 LIMIT 1", - offset + r#" + SELECT id + FROM adresar + WHERE deleted = FALSE + ORDER BY id ASC + OFFSET $1 + LIMIT 1 + "#, + request.position - 1 ) .fetch_optional(db_pool) .await .map_err(|e| Status::internal(e.to_string()))? .ok_or_else(|| Status::not_found("Position out of bounds"))?; - + + // Now fetch the complete record using the existing get_adresar function get_adresar(db_pool, GetAdresarRequest { id }).await } diff --git a/src/adresar/handlers/get_adresar_count.rs b/src/adresar/handlers/get_adresar_count.rs index ac5c943..dc93c7c 100644 --- a/src/adresar/handlers/get_adresar_count.rs +++ b/src/adresar/handlers/get_adresar_count.rs @@ -1,5 +1,5 @@ // src/adresar/handlers/get_adresar_count.rs -use tonic::{Status}; +use tonic::Status; use sqlx::PgPool; use crate::proto::multieko2::{CountResponse, Empty}; @@ -8,12 +8,16 @@ pub async fn get_adresar_count( _request: Empty, ) -> Result { let count: i64 = sqlx::query_scalar!( - "SELECT COUNT(*) as count FROM adresar" + r#" + SELECT COUNT(*) AS count + FROM adresar + WHERE deleted = FALSE + "# ) .fetch_one(db_pool) .await .map_err(|e| Status::internal(e.to_string()))? - .unwrap_or(0); // Handle the case where the count is None + .unwrap_or(0); Ok(CountResponse { count }) } diff --git a/src/adresar/handlers/post_adresar.rs b/src/adresar/handlers/post_adresar.rs index 3c405b5..f47c608 100644 --- a/src/adresar/handlers/post_adresar.rs +++ b/src/adresar/handlers/post_adresar.rs @@ -12,9 +12,16 @@ pub async fn post_adresar( Adresar, r#" INSERT INTO adresar ( - firma, kz, drc, ulica, psc, mesto, stat, banka, ucet, skladm, ico, kontakt, telefon, skladu, fax - ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15) - RETURNING id, firma, kz, drc, ulica, psc, mesto, stat, banka, ucet, skladm, ico, kontakt, telefon, skladu, fax + firma, kz, drc, ulica, psc, mesto, stat, banka, ucet, + skladm, ico, kontakt, telefon, skladu, fax, deleted + ) + VALUES ( + $1, $2, $3, $4, $5, $6, $7, $8, $9, + $10, $11, $12, $13, $14, $15, $16 + ) + RETURNING + id, deleted, firma, kz, drc, ulica, psc, mesto, stat, + banka, ucet, skladm, ico, kontakt, telefon, skladu, fax "#, request.firma, request.kz, @@ -30,7 +37,8 @@ pub async fn post_adresar( request.kontakt, request.telefon, request.skladu, - request.fax + request.fax, + false // Set deleted to false by default ) .fetch_one(db_pool) .await @@ -38,6 +46,8 @@ pub async fn post_adresar( Ok(AdresarResponse { id: adresar.id, + // Do not include `deleted` in the response since it's not + // defined in the proto message. firma: adresar.firma, kz: adresar.kz.unwrap_or_default(), drc: adresar.drc.unwrap_or_default(), @@ -55,3 +65,4 @@ pub async fn post_adresar( fax: adresar.fax.unwrap_or_default(), }) } + diff --git a/src/adresar/handlers/put_adresar.rs b/src/adresar/handlers/put_adresar.rs index da8d9cb..51ca751 100644 --- a/src/adresar/handlers/put_adresar.rs +++ b/src/adresar/handlers/put_adresar.rs @@ -28,8 +28,25 @@ pub async fn put_adresar( telefon = $14, skladu = $15, fax = $16 - WHERE id = $1 - RETURNING id, firma, kz, drc, ulica, psc, mesto, stat, banka, ucet, skladm, ico, kontakt, telefon, skladu, fax + WHERE id = $1 AND deleted = FALSE + RETURNING + id, + deleted, + firma, + kz, + drc, + ulica, + psc, + mesto, + stat, + banka, + ucet, + skladm, + ico, + kontakt, + telefon, + skladu, + fax "#, request.id, request.firma, @@ -71,3 +88,4 @@ pub async fn put_adresar( fax: adresar.fax.unwrap_or_default(), }) } + diff --git a/src/adresar/models.rs b/src/adresar/models.rs index e1131be..cc303aa 100644 --- a/src/adresar/models.rs +++ b/src/adresar/models.rs @@ -4,6 +4,7 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] pub struct Adresar { pub id: i64, + pub deleted: bool, pub firma: String, pub kz: Option, pub drc: Option,