Most services done

This commit is contained in:
Franklin 2023-05-04 14:48:50 -04:00
parent 002f420df9
commit 96f018301e
12 changed files with 414 additions and 14 deletions

View File

@ -0,0 +1,19 @@
SELECT
id,
title,
description,
realtor_id,
media as "media: _",
project_condition as "project_condition: _",
project_type as "project_type: _",
project_state as "project_state: _",
country,
city,
district,
admin_tag,
floors,
finish_date,
order_index,
time_created,
last_updated
FROM project WHERE realtor_id = $1;

View File

@ -0,0 +1,18 @@
SELECT
id,
project_id,
realtor_id,
media as "media: _",
property_type as "property_type: _",
property_sale_type as "property_sale_type: _",
country,
city,
district,
price_usd,
rooms,
bathrooms,
area,
admin_tag,
time_created,
last_updated
FROM property WHERE realtor_id = $1;

View File

@ -116,6 +116,122 @@
}, },
"query": "SELECT \n id,\n title,\n description,\n realtor_id,\n media as \"media: _\",\n project_condition as \"project_condition: _\",\n project_type as \"project_type: _\",\n project_state as \"project_state: _\",\n country,\n city, \n district,\n admin_tag,\n floors,\n finish_date,\n order_index,\n time_created,\n last_updated\nFROM project WHERE id = $1;\n" "query": "SELECT \n id,\n title,\n description,\n realtor_id,\n media as \"media: _\",\n project_condition as \"project_condition: _\",\n project_type as \"project_type: _\",\n project_state as \"project_state: _\",\n country,\n city, \n district,\n admin_tag,\n floors,\n finish_date,\n order_index,\n time_created,\n last_updated\nFROM project WHERE id = $1;\n"
}, },
"066b243662a9077b8c5ce72277930c746558b1725a15faa7c235b63b00fde59c": {
"describe": {
"columns": [
{
"name": "id",
"ordinal": 0,
"type_info": "Uuid"
},
{
"name": "title",
"ordinal": 1,
"type_info": "Varchar"
},
{
"name": "description",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "realtor_id",
"ordinal": 3,
"type_info": "Uuid"
},
{
"name": "media: _",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "project_condition: _",
"ordinal": 5,
"type_info": "Varchar"
},
{
"name": "project_type: _",
"ordinal": 6,
"type_info": "Varchar"
},
{
"name": "project_state: _",
"ordinal": 7,
"type_info": "Varchar"
},
{
"name": "country",
"ordinal": 8,
"type_info": "Varchar"
},
{
"name": "city",
"ordinal": 9,
"type_info": "Varchar"
},
{
"name": "district",
"ordinal": 10,
"type_info": "Varchar"
},
{
"name": "admin_tag",
"ordinal": 11,
"type_info": "Varchar"
},
{
"name": "floors",
"ordinal": 12,
"type_info": "Int2"
},
{
"name": "finish_date",
"ordinal": 13,
"type_info": "Date"
},
{
"name": "order_index",
"ordinal": 14,
"type_info": "Int4"
},
{
"name": "time_created",
"ordinal": 15,
"type_info": "Timestamptz"
},
{
"name": "last_updated",
"ordinal": 16,
"type_info": "Timestamptz"
}
],
"nullable": [
false,
true,
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
false,
false,
false,
false,
false
],
"parameters": {
"Left": [
"Uuid"
]
}
},
"query": "SELECT \n id,\n title,\n description,\n realtor_id,\n media as \"media: _\",\n project_condition as \"project_condition: _\",\n project_type as \"project_type: _\",\n project_state as \"project_state: _\",\n country,\n city, \n district,\n admin_tag,\n floors,\n finish_date,\n order_index,\n time_created,\n last_updated\nFROM project WHERE realtor_id = $1;\n"
},
"1de871eb06903280d3be4e4ef8f67cde596807784e726ff62d03c2c9f6d6ba76": { "1de871eb06903280d3be4e4ef8f67cde596807784e726ff62d03c2c9f6d6ba76": {
"describe": { "describe": {
"columns": [ "columns": [
@ -761,6 +877,116 @@
}, },
"query": "INSERT INTO view (\n id, thing_id, thing_pk, trackable_id, time_created\n) VALUES (\n $1, $2, $3, $4, $5\n) RETURNING \nid, thing_id, thing_pk as \"thing_pk: _\", trackable_id, time_created" "query": "INSERT INTO view (\n id, thing_id, thing_pk, trackable_id, time_created\n) VALUES (\n $1, $2, $3, $4, $5\n) RETURNING \nid, thing_id, thing_pk as \"thing_pk: _\", trackable_id, time_created"
}, },
"9affd78ec46e47dc9b7239e41c6e88b3aa96f48bf95ffe8faae35fcee6f5af9f": {
"describe": {
"columns": [
{
"name": "id",
"ordinal": 0,
"type_info": "Uuid"
},
{
"name": "project_id",
"ordinal": 1,
"type_info": "Uuid"
},
{
"name": "realtor_id",
"ordinal": 2,
"type_info": "Uuid"
},
{
"name": "media: _",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "property_type: _",
"ordinal": 4,
"type_info": "Varchar"
},
{
"name": "property_sale_type: _",
"ordinal": 5,
"type_info": "Varchar"
},
{
"name": "country",
"ordinal": 6,
"type_info": "Varchar"
},
{
"name": "city",
"ordinal": 7,
"type_info": "Varchar"
},
{
"name": "district",
"ordinal": 8,
"type_info": "Varchar"
},
{
"name": "price_usd",
"ordinal": 9,
"type_info": "Float8"
},
{
"name": "rooms",
"ordinal": 10,
"type_info": "Int2"
},
{
"name": "bathrooms",
"ordinal": 11,
"type_info": "Float4"
},
{
"name": "area",
"ordinal": 12,
"type_info": "Float4"
},
{
"name": "admin_tag",
"ordinal": 13,
"type_info": "Varchar"
},
{
"name": "time_created",
"ordinal": 14,
"type_info": "Timestamptz"
},
{
"name": "last_updated",
"ordinal": 15,
"type_info": "Timestamptz"
}
],
"nullable": [
false,
true,
false,
false,
false,
false,
true,
true,
true,
false,
false,
false,
false,
true,
false,
false
],
"parameters": {
"Left": [
"Uuid"
]
}
},
"query": "SELECT \n id,\n project_id,\n realtor_id,\n media as \"media: _\",\n property_type as \"property_type: _\",\n property_sale_type as \"property_sale_type: _\",\n country,\n city,\n district,\n price_usd,\n rooms,\n bathrooms,\n area,\n admin_tag,\n time_created,\n last_updated\nFROM property WHERE realtor_id = $1;"
},
"a6525881c04a3ddf038d566b8a41dc2e4670a20c0c6e4a0687a927538661db56": { "a6525881c04a3ddf038d566b8a41dc2e4670a20c0c6e4a0687a927538661db56": {
"describe": { "describe": {
"columns": [ "columns": [

View File

@ -1,8 +1,8 @@
use realtor_lp_types::domain::project::Project; use realtor_lp_types::domain::project::Project;
use sqlx::PgPool; use sqlx::{PgPool, Transaction, Postgres};
use uuid::Uuid; use uuid::Uuid;
pub async fn insert_project(conn: &PgPool, project: Project) -> Result<Project, sqlx::Error> { pub async fn insert_project<'a>(transaction: &mut Transaction<'a, Postgres>, project: Project) -> Result<Project, sqlx::Error> {
sqlx::query_file_as!( sqlx::query_file_as!(
Project, Project,
"sql/project/insert.sql", "sql/project/insert.sql",
@ -23,7 +23,7 @@ pub async fn insert_project(conn: &PgPool, project: Project) -> Result<Project,
project.order_index, project.order_index,
project.time_created project.time_created
) )
.fetch_one(conn) .fetch_one(transaction)
.await .await
} }
@ -36,7 +36,16 @@ pub async fn get_project_with_id(
.await .await
} }
pub async fn update_project(conn: &PgPool, project: Project) -> Result<Project, sqlx::Error> { pub async fn fetch_with_realtor_id(
conn: &PgPool,
realtor_id: &Uuid,
) -> Result<Vec<Project>, sqlx::Error> {
sqlx::query_file_as!(Project, "sql/project/fetch_with_realtor_id.sql", realtor_id)
.fetch_all(conn)
.await
}
pub async fn update_project<'a>(transaction: &mut Transaction<'a, Postgres>, project: Project) -> Result<Project, sqlx::Error> {
sqlx::query_file_as!( sqlx::query_file_as!(
Project, Project,
"sql/project/update.sql", "sql/project/update.sql",
@ -57,6 +66,6 @@ pub async fn update_project(conn: &PgPool, project: Project) -> Result<Project,
project.order_index, project.order_index,
project.last_updated project.last_updated
) )
.fetch_one(conn) .fetch_one(transaction)
.await .await
} }

View File

@ -1,8 +1,8 @@
use realtor_lp_types::domain::property::Property; use realtor_lp_types::domain::property::Property;
use sqlx::PgPool; use sqlx::{PgPool, Transaction, Postgres};
use uuid::Uuid; use uuid::Uuid;
pub async fn insert_property(conn: &PgPool, property: Property) -> Result<Property, sqlx::Error> { pub async fn insert_property<'a>(transaction: &mut Transaction<'a, Postgres>, property: Property) -> Result<Property, sqlx::Error> {
sqlx::query_file_as!( sqlx::query_file_as!(
Property, Property,
"sql/property/insert.sql", "sql/property/insert.sql",
@ -22,7 +22,7 @@ pub async fn insert_property(conn: &PgPool, property: Property) -> Result<Proper
property.admin_tag, property.admin_tag,
property.time_created property.time_created
) )
.fetch_one(conn) .fetch_one(transaction)
.await .await
} }
@ -35,7 +35,16 @@ pub async fn get_property_with_id(
.await .await
} }
pub async fn update_property(conn: &PgPool, property: Property) -> Result<Property, sqlx::Error> { pub async fn fetch_with_realtor_id(
conn: &PgPool,
realtor_id: &Uuid,
) -> Result<Vec<Property>, sqlx::Error> {
sqlx::query_file_as!(Property, "sql/property/fetch_with_realtor_id.sql", realtor_id)
.fetch_all(conn)
.await
}
pub async fn update_property<'a>(transaction: &mut Transaction<'a, Postgres>, property: Property) -> Result<Property, sqlx::Error> {
sqlx::query_file_as!( sqlx::query_file_as!(
Property, Property,
"sql/property/update.sql", "sql/property/update.sql",
@ -55,6 +64,6 @@ pub async fn update_property(conn: &PgPool, property: Property) -> Result<Proper
property.admin_tag, property.admin_tag,
property.last_updated property.last_updated
) )
.fetch_one(conn) .fetch_one(transaction)
.await .await
} }

View File

@ -1,9 +1,9 @@
use realtor_lp_types::domain::trackable::Trackable; use realtor_lp_types::domain::trackable::Trackable;
use sqlx::PgPool; use sqlx::{Transaction, Postgres, PgPool};
use uuid::Uuid; use uuid::Uuid;
pub async fn insert_trackable( pub async fn insert_trackable<'a>(
conn: &PgPool, tx: &mut Transaction<'a, Postgres>,
trackable: Trackable, trackable: Trackable,
) -> Result<Trackable, sqlx::Error> { ) -> Result<Trackable, sqlx::Error> {
sqlx::query_file_as!( sqlx::query_file_as!(
@ -17,7 +17,7 @@ pub async fn insert_trackable(
trackable.user_agent, trackable.user_agent,
trackable.time_created trackable.time_created
) )
.fetch_one(conn) .fetch_one(tx)
.await .await
} }

View File

@ -1 +1,12 @@
use actix_web_utils::extensions::typed_response::TypedHttpResponse;
use realtor_lp_types::{domain::click::Click, dto::payloads::click::ClickForCreationPayload};
use sqlx::PgPool;
use crate::{success, handle_tx, handle_db_write_op, dao};
pub async fn new_click(conn: &PgPool, click: ClickForCreationPayload) -> TypedHttpResponse<()> {
let mut transaction = handle_tx!(conn.begin());
handle_db_write_op!(dao::click::insert_click(conn, click.into()), transaction);
success!(())
}

View File

@ -1,7 +1,14 @@
#[allow(unused)]
pub mod click; pub mod click;
#[allow(unused)]
pub mod main_router; pub mod main_router;
#[allow(unused)]
pub mod project; pub mod project;
#[allow(unused)]
pub mod property; pub mod property;
#[allow(unused)]
pub mod realtor; pub mod realtor;
#[allow(unused)]
pub mod trackable; pub mod trackable;
#[allow(unused)]
pub mod view; pub mod view;

View File

@ -1 +1,17 @@
use actix_web_utils::extensions::typed_response::TypedHttpResponse;
use realtor_lp_types::{domain::project::Project, dto::payloads::project::ProjectForCreationPayload};
use sqlx::PgPool;
use uuid::Uuid;
use crate::{success, handle_db_write_op, handle_tx, dao, handle_db_read_op, unwrap_or_not_found};
pub async fn create_project(conn: &PgPool, project: ProjectForCreationPayload) -> TypedHttpResponse<Project> {
unwrap_or_not_found!(handle_db_read_op!(dao::realtor::get_realtor_with_id(conn, &project.realtor_id)), "Realtor");
let mut transaction = handle_tx!(conn.begin());
success!(handle_db_write_op!(dao::project::insert_project(&mut transaction, project.into()), transaction));
}
pub async fn fetch_realtor_projects(conn: &PgPool, realtor_id: Uuid) -> TypedHttpResponse<Vec<Project>> {
success!(handle_db_read_op!(dao::project::fetch_with_realtor_id(conn, &realtor_id)))
}

View File

@ -1 +1,44 @@
use actix_web_utils::extensions::typed_response::TypedHttpResponse;
use err::MessageResource;
use realtor_lp_types::{dto::payloads::property::PropertyForCreationPayload, domain::property::Property};
use sqlx::PgPool;
use uuid::Uuid;
use crate::{handle_tx, handle_db_write_op, dao, success, unwrap_or_not_found, handle_db_read_op};
pub async fn create_property(conn: &PgPool, property: PropertyForCreationPayload) -> TypedHttpResponse<Property> {
let mut transaction = handle_tx!(conn.begin());
let realtor = unwrap_or_not_found!(handle_db_read_op!(dao::realtor::get_realtor_with_id(conn, &property.realtor_id)), "Realtor");
// Check for project existing
match property.project_id {
Some(project_id) => {
let project = unwrap_or_not_found!(handle_db_read_op!(dao::project::get_project_with_id(conn, &project_id)), "Project");
if project.realtor_id != realtor.id {
return TypedHttpResponse::return_standard_error(400, MessageResource::new_from_str("Realtor Id in project does not match realtor id in property."))
}
},
None => {},
};
success!(handle_db_write_op!(dao::property::insert_property(&mut transaction, property.into()), transaction))
}
pub async fn udpate_property(conn: &PgPool, property_id: Uuid, property: PropertyForCreationPayload) -> TypedHttpResponse<Property> {
let mut transaction = handle_tx!(conn.begin());
let realtor = unwrap_or_not_found!(handle_db_read_op!(dao::realtor::get_realtor_with_id(conn, &property.realtor_id)), "Realtor");
// Check for project existing
match property.project_id {
Some(project_id) => {
let project = unwrap_or_not_found!(handle_db_read_op!(dao::project::get_project_with_id(conn, &project_id)), "Project");
if project.realtor_id != realtor.id {
return TypedHttpResponse::return_standard_error(400, MessageResource::new_from_str("Realtor Id in project does not match realtor id in property."))
}
},
None => {},
};
let mut property_insertable: Property = property.into();
property_insertable.id = property_id;
success!(handle_db_write_op!(dao::property::update_property(&mut transaction, property_insertable), transaction))
}

View File

@ -1 +1,27 @@
use actix_web_utils::extensions::typed_response::TypedHttpResponse;
use realtor_lp_types::{domain::realtor::Realtor, dto::payloads::realtor::RealtorForCreationPayload};
use sqlx::PgPool;
use uuid::Uuid;
use crate::{success, handle_tx, dao, handle_db_write_op, handle_db_read_op, unwrap_or_not_found};
pub async fn new_realtor_profile(conn: &PgPool, realtor: RealtorForCreationPayload) -> TypedHttpResponse<Realtor> {
let mut transaction = handle_tx!(conn.begin());
success!(handle_db_write_op!(dao::realtor::insert_realtor(conn, realtor.into()), transaction));
}
pub async fn update_realtor_profile(conn: &PgPool, realtor_id: Uuid, realtor: RealtorForCreationPayload) -> TypedHttpResponse<Realtor> {
let mut transaction = handle_tx!(conn.begin());
let mut realtor_insertable: Realtor = realtor.into();
realtor_insertable.id = realtor_id;
success!(handle_db_write_op!(dao::realtor::update_realtor(conn, realtor_insertable), transaction));
}
pub async fn get_realtor_by_shortcode(conn: &PgPool, realtor_shortcode: String,) -> TypedHttpResponse<Realtor> {
success!(unwrap_or_not_found!(handle_db_read_op!(dao::realtor::get_realtor_with_shortcode(conn, &realtor_shortcode)), "Realtors"))
}
pub async fn get_realtor_with_id(conn: &PgPool, realtor_id: Uuid) -> TypedHttpResponse<Realtor> {
success!(unwrap_or_not_found!(handle_db_read_op!(dao::realtor::get_realtor_with_id(conn, &realtor_id)), "Realtors"))
}

View File

@ -1 +1,17 @@
use actix_web_utils::extensions::typed_response::TypedHttpResponse;
use realtor_lp_types::{domain::trackable::Trackable, dto::payloads::trackable::TrackableForCreationPayload};
use sqlx::PgPool;
use uuid::Uuid;
use crate::{dao, success, handle_tx, handle_db_write_op, handle_db_read_op, unwrap_or_not_found};
pub async fn create_trackable_profile(conn: &PgPool, trackable: TrackableForCreationPayload) -> TypedHttpResponse<Trackable> {
let mut transaction = handle_tx!(conn.begin());
let persisted_trackable = handle_db_write_op!(dao::trackable::insert_trackable(&mut transaction, trackable.into()), transaction);
success!(persisted_trackable)
}
pub async fn validate_trackable_id(conn: &PgPool, trackable_id: Uuid) -> TypedHttpResponse<Trackable> {
success!(unwrap_or_not_found!(handle_db_read_op!(dao::trackable::get_trackable_with_id(conn, &trackable_id)), "Trackables"))
}