chore: glue code

This commit is contained in:
Aravinth Manivannan 2024-10-22 16:57:53 +05:30
parent b6de2c938a
commit 738245dc4d
Signed by: realaravinth
GPG key ID: F8F50389936984FF
30 changed files with 534 additions and 56 deletions

View file

@ -1,15 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO ap_objects \n (\n kind,\n object\n )\n VALUES\n (\n $1, \n $2\n );",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Text",
"Text"
]
},
"nullable": []
},
"hash": "18cd95c5c4ae2007101d36083cc6b6d3d6c60788a94babf1b2d5f2e2e858dcc3"
}

View file

@ -0,0 +1,22 @@
{
"db_name": "PostgreSQL",
"query": "SELECT activity_id\n FROM\n poll_person_checkpoints\n WHERE\n person_id = (SELECT ID FROM persons WHERE html_url = $1);",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "activity_id",
"type_info": "Int4"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false
]
},
"hash": "596f602fe978bf4391c8208b614a75a8fd85524bdf971441664475714e6c34ce"
}

View file

@ -0,0 +1,16 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO ap_repository_objects \n (\n readable,\n activity,\n repository_id\n )\n VALUES\n (\n $1, \n (SELECT ID FROM ap_objects WHERE UUID = $2),\n (SELECT ID FROM repositories WHERE html_url = $3)\n );",
"describe": {
"columns": [],
"parameters": {
"Left": [
"TextArray",
"Uuid",
"Text"
]
},
"nullable": []
},
"hash": "5d1e3c4666a37357515ae47e15c2f9ee5e0e7abb0d5ac1fbe2e996b2a6d2454e"
}

View file

@ -0,0 +1,16 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO ap_person_objects \n (\n readable,\n activity,\n person_id\n )\n VALUES\n (\n $1, \n (SELECT ID FROM ap_objects WHERE UUID = $2),\n (SELECT ID FROM persons WHERE html_url = $3)\n );",
"describe": {
"columns": [],
"parameters": {
"Left": [
"TextArray",
"Uuid",
"Text"
]
},
"nullable": []
},
"hash": "a2b66cdb40f1e0839ecd7568173483ff43e154be987efd7f22541cb506222772"
}

View file

@ -0,0 +1,70 @@
{
"db_name": "PostgreSQL",
"query": "SELECT \n object_id,\n context,\n attributed_to,\n created,\n committed,\n committed_by,\n hash,\n summary,\n description\n FROM\n commits\n WHERE\n object_id = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "object_id",
"type_info": "Text"
},
{
"ordinal": 1,
"name": "context",
"type_info": "Text"
},
{
"ordinal": 2,
"name": "attributed_to",
"type_info": "Text"
},
{
"ordinal": 3,
"name": "created",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "committed",
"type_info": "Timestamptz"
},
{
"ordinal": 5,
"name": "committed_by",
"type_info": "Text"
},
{
"ordinal": 6,
"name": "hash",
"type_info": "Text"
},
{
"ordinal": 7,
"name": "summary",
"type_info": "Text"
},
{
"ordinal": 8,
"name": "description",
"type_info": "Text"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
true
]
},
"hash": "a32f1c013b0f3142059e76cbf7424b5964c39894bf1dca5346f340b159af701d"
}

View file

@ -0,0 +1,16 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO ap_objects \n (\n kind,\n object,\n uuid\n )\n VALUES\n (\n $1, \n $2,\n $3\n );",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Text",
"Text",
"Uuid"
]
},
"nullable": []
},
"hash": "b81fe0328a6ba2c00723cd09d87ee8d7867ef30d2f3506367d9ed07d23555650"
}

View file

@ -0,0 +1,22 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO commits\n (\n object_id,\n context,\n attributed_to,\n created,\n committed,\n committed_by,\n hash,\n summary,\n description\n )\n VALUES\n (\n $1,\n $2,\n $3,\n $4,\n $5,\n $6,\n $7,\n $8,\n $9\n );",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Text",
"Text",
"Text",
"Timestamptz",
"Timestamptz",
"Text",
"Text",
"Text",
"Text"
]
},
"nullable": []
},
"hash": "bd3da921fe721463f998c668227208d985c2a658827ed6ff7322f2d6d07da2ae"
}

View file

@ -0,0 +1,25 @@
{
"db_name": "PostgreSQL",
"query": "\n SELECT\n ap_objects.object\n FROM\n ap_objects\n INNER JOIN\n ap_person_objects\n ON\n ap_objects.ID = ap_person_objects.activity\n WHERE\n ap_person_objects.person_id = (SELECT ID from persons WHERE html_url = $1)\n AND\n ap_person_objects.readable && $2\n OFFSET $3 LIMIT $4;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "object",
"type_info": "Text"
}
],
"parameters": {
"Left": [
"Text",
"TextArray",
"Int8",
"Int8"
]
},
"nullable": [
false
]
},
"hash": "be35aa82dc07d53e41e6fb5d4df60bcae236e90fa4df3bd7bdff846bc7078de8"
}

View file

@ -0,0 +1,15 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO poll_person_checkpoints\n (person_id, activity_id)\n VALUES\n (\n (SELECT ID FROM persons WHERE html_url = $1),\n $2\n )\n ON CONFLICT\n (person_id)\n DO UPDATE SET\n activity_id = $2;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Text",
"Int4"
]
},
"nullable": []
},
"hash": "f29efc709fe6f42a21b596cd40d1234e130b716dc9faee8fba69aa24d8e10eda"
}

View file

@ -0,0 +1,64 @@
{
"db_name": "PostgreSQL",
"query": "SELECT\n username, html_url, profile_photo, private_key, public_key, name, actor_id, preferred_username\n FROM\n persons\n WHERE\n name = $1 or username = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "username",
"type_info": "Text"
},
{
"ordinal": 1,
"name": "html_url",
"type_info": "Text"
},
{
"ordinal": 2,
"name": "profile_photo",
"type_info": "Text"
},
{
"ordinal": 3,
"name": "private_key",
"type_info": "Text"
},
{
"ordinal": 4,
"name": "public_key",
"type_info": "Text"
},
{
"ordinal": 5,
"name": "name",
"type_info": "Text"
},
{
"ordinal": 6,
"name": "actor_id",
"type_info": "Text"
},
{
"ordinal": 7,
"name": "preferred_username",
"type_info": "Text"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false,
false,
true,
false,
false,
false,
false,
false
]
},
"hash": "f6b62a5739be59c641999f5e441e163303bfe008326e80387a119461cb881590"
}

View file

@ -1,23 +0,0 @@
{
"db_name": "PostgreSQL",
"query": "SELECT uuid FROM ap_objects WHERE kind = $1 AND object = $2",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "uuid",
"type_info": "Uuid"
}
],
"parameters": {
"Left": [
"Text",
"Text"
]
},
"nullable": [
false
]
},
"hash": "fa0aca169d4beaca8dc56c2076eaca9affe743fa8a10727866611a6de7bdcde2"
}

View file

@ -0,0 +1,70 @@
{
"db_name": "PostgreSQL",
"query": "SELECT \n object_id,\n context,\n attributed_to,\n created,\n committed,\n committed_by,\n hash,\n summary,\n description\n FROM\n commits\n WHERE\n hash = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "object_id",
"type_info": "Text"
},
{
"ordinal": 1,
"name": "context",
"type_info": "Text"
},
{
"ordinal": 2,
"name": "attributed_to",
"type_info": "Text"
},
{
"ordinal": 3,
"name": "created",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "committed",
"type_info": "Timestamptz"
},
{
"ordinal": 5,
"name": "committed_by",
"type_info": "Text"
},
{
"ordinal": 6,
"name": "hash",
"type_info": "Text"
},
{
"ordinal": 7,
"name": "summary",
"type_info": "Text"
},
{
"ordinal": 8,
"name": "description",
"type_info": "Text"
}
],
"parameters": {
"Left": [
"Text"
]
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
true
]
},
"hash": "ff360ca9aea2e0b634feb6f6dac95b7749420692cb423ccc68f8467a25f45613"
}

7
Cargo.lock generated
View file

@ -1276,6 +1276,7 @@ dependencies = [
"tracing", "tracing",
"tracing-actix-web", "tracing-actix-web",
"url", "url",
"urlencoding",
"uuid", "uuid",
] ]
@ -4066,6 +4067,12 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "urlencoding"
version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
[[package]] [[package]]
name = "uuid" name = "uuid"
version = "1.10.0" version = "1.10.0"

View file

@ -45,6 +45,7 @@ reqwest-middleware = "0.2.5"
reqwest_old = {package ="reqwest", features = ["json"], version = "0.11" } reqwest_old = {package ="reqwest", features = ["json"], version = "0.11" }
##http = "1.1.0" ##http = "1.1.0"
task-local-extensions = "0.1.4" task-local-extensions = "0.1.4"
urlencoding = "2.1.3"
[dev-dependencies] [dev-dependencies]

View file

@ -1,8 +1,8 @@
CREATE TABLE IF NOT EXISTS persons ( CREATE TABLE IF NOT EXISTS persons (
username TEXT NOT NULL, username TEXT NOT NULL,
name TEXT NOT NULL, name TEXT NOT NULL,
html_url TEXT NOT NULL, html_url TEXT NOT NULL UNIQUE,
actor_id TEXT NOT NULL, actor_id TEXT NOT NULL UNIQUE,
private_key TEXT NOT NULL, private_key TEXT NOT NULL,
public_key TEXT NOT NULL, public_key TEXT NOT NULL,
profile_photo TEXT, profile_photo TEXT,
@ -10,3 +10,6 @@ CREATE TABLE IF NOT EXISTS persons (
preferred_username TEXT NOT NULL UNIQUE, preferred_username TEXT NOT NULL UNIQUE,
ID SERIAL PRIMARY KEY NOT NULL ID SERIAL PRIMARY KEY NOT NULL
); );
CREATE UNIQUE INDEX IF NOT EXISTS persons_html_url ON persons (html_url);
CREATE UNIQUE INDEX IF NOT EXISTS persons_actor_id ON persons (actor_id);

View file

@ -19,3 +19,7 @@ CREATE TABLE IF NOT EXISTS repositories (
ID SERIAL PRIMARY KEY NOT NULL ID SERIAL PRIMARY KEY NOT NULL
); );
CREATE UNIQUE INDEX IF NOT EXISTS repositories_html_url ON repositories (html_url);
CREATE UNIQUE INDEX IF NOT EXISTS repositories_actor_id ON repositories (actor_id);

View file

@ -5,7 +5,7 @@ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE IF NOT EXISTS ap_objects ( CREATE TABLE IF NOT EXISTS ap_objects (
kind TEXT NOT NULL, -- URL kind TEXT NOT NULL, -- URL
object TEXT NOT NULL, object TEXT NOT NULL,
uuid uuid NOT NULL DEFAULT uuid_generate_v4(), uuid uuid NOT NULL UNIQUE,
timestamp timestamp with time zone DEFAULT (CURRENT_TIMESTAMP), timestamp timestamp with time zone DEFAULT (CURRENT_TIMESTAMP),
ID SERIAL PRIMARY KEY NOT NULL ID SERIAL PRIMARY KEY NOT NULL
); );

View file

@ -0,0 +1,20 @@
-- Add migration script here
CREATE TABLE IF NOT EXISTS commits (
object_id TEXT NOT NULL UNIQUE,
context TEXT NOT NULL,
attributed_to TEXT NOT NULL,
created timestamp with time zone NOT NULL,
committed timestamp with time zone NOT NULL,
committed_by TEXT NOT NULL,
hash TEXT NOT NULL,
summary TEXT NOT NULL,
description TEXT,
UNIQUE(hash, context),
ID SERIAL PRIMARY KEY NOT NULL
);
CREATE UNIQUE INDEX IF NOT EXISTS commits_object_id ON commits (object_id);
CREATE UNIQUE INDEX IF NOT EXISTS commits_hash ON commits (hash);

View file

@ -0,0 +1,8 @@
--- Add migration script here
CREATE TABLE IF NOT EXISTS ap_person_objects (
readable TEXT[][] NOT NULL, -- public/specific-actor
activity INTEGER REFERENCES ap_objects (ID) NOT NULL,
person_id INTEGER REFERENCES persons (ID) NOT NULL,
ID SERIAL PRIMARY KEY NOT NULL
);

View file

@ -0,0 +1,6 @@
CREATE TABLE IF NOT EXISTS ap_repository_objects (
readable TEXT[][] NOT NULL, -- public/specific-actor
activity INTEGER REFERENCES ap_objects (ID) NOT NULL,
repository_id INTEGER REFERENCES repositories (ID) NOT NULL,
ID SERIAL PRIMARY KEY NOT NULL
);

View file

@ -0,0 +1,5 @@
CREATE TABLE IF NOT EXISTS poll_person_checkpoints (
activity_id INTEGER NOT NULL,
person_id INTEGER REFERENCES persons (ID) NOT NULL UNIQUE,
ID SERIAL PRIMARY KEY NOT NULL
);

View file

@ -16,6 +16,8 @@ pub mod types;
mod webfinger; mod webfinger;
pub use errors::WebJsonRepsonse; pub use errors::WebJsonRepsonse;
pub use routes::APObjectIDGenerator;
pub use routes::APObjectRoutes;
pub use routes::RoutesRepository; pub use routes::RoutesRepository;
pub fn load_ctx() -> impl FnOnce(&mut web::ServiceConfig) { pub fn load_ctx() -> impl FnOnce(&mut web::ServiceConfig) {

View file

@ -3,6 +3,9 @@
// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-License-Identifier: AGPL-3.0-or-later
use url::Url; use url::Url;
use uuid::Uuid;
use crate::federation::domain::GenerateObjectID;
use super::person::routes::PersonRoutes; use super::person::routes::PersonRoutes;
use super::repository::routes::RepositoryRoutes; use super::repository::routes::RepositoryRoutes;
@ -12,6 +15,7 @@ pub struct RoutesRepository {
webfinger: String, webfinger: String,
pub person: PersonRoutes, pub person: PersonRoutes,
pub repository: RepositoryRoutes, pub repository: RepositoryRoutes,
pub ap_object: APObjectRoutes,
} }
impl Default for RoutesRepository { impl Default for RoutesRepository {
@ -20,6 +24,7 @@ impl Default for RoutesRepository {
webfinger: "/.well-known/webfinger?resource={resource}".into(), webfinger: "/.well-known/webfinger?resource={resource}".into(),
person: PersonRoutes::default(), person: PersonRoutes::default(),
repository: RepositoryRoutes::default(), repository: RepositoryRoutes::default(),
ap_object: APObjectRoutes::default(),
} }
} }
} }
@ -29,3 +34,45 @@ impl RoutesRepository {
self.webfinger.replace("{resource}", resource_iri.as_ref()) self.webfinger.replace("{resource}", resource_iri.as_ref())
} }
} }
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct APObjectRoutes {
pub object: &'static str,
pub commit: &'static str,
}
impl Default for APObjectRoutes {
fn default() -> Self {
Self {
object: "/federation/obejct/{uuid}".into(),
commit: "/federation/obejct/commit/{hash}".into(),
}
}
}
impl APObjectRoutes {
pub fn object(&self, uuid: Uuid) -> String {
self.object.replace("{uuid}", &uuid.to_string())
}
pub fn commit(&self, commit_hash: &str) -> String {
self.object.replace("{hash}", &commit_hash)
}
}
pub struct APObjectIDGenerator {
s: crate::settings::Settings,
routes: APObjectRoutes,
}
impl APObjectIDGenerator {
pub fn new(s: crate::settings::Settings, routes: APObjectRoutes) -> Self {
Self { s, routes }
}
}
impl GenerateObjectID for APObjectIDGenerator {
fn generate(&self, uuid: Uuid) -> Result<Url, url::ParseError> {
let path = self.routes.object(uuid);
crate::utils::absolute_url::absolute_url(&self.s, &path)
}
}

View file

@ -7,6 +7,7 @@ use std::sync::Arc;
use actix_web::web::Data; use actix_web::web::Data;
use super::routes::APObjectIDGenerator;
use super::RoutesRepository; use super::RoutesRepository;
use crate::federation::adapter::out::forge::forge_factory::FederationForgeAdapterFactoryInterface; use crate::federation::adapter::out::forge::forge_factory::FederationForgeAdapterFactoryInterface;
use crate::federation::application::port::out::db::cache_activitypub_local_object::FederationOutDBCacheAPObjectObj; use crate::federation::application::port::out::db::cache_activitypub_local_object::FederationOutDBCacheAPObjectObj;
@ -15,13 +16,16 @@ use crate::federation::application::port::out::db::get_remote_actor::FederationO
use crate::federation::application::port::out::db::person_followers::FederationOutDBPersonFollowersObj; use crate::federation::application::port::out::db::person_followers::FederationOutDBPersonFollowersObj;
use crate::federation::application::port::out::db::repository_followers::FederationOutDBRepositoryFollowersObj; use crate::federation::application::port::out::db::repository_followers::FederationOutDBRepositoryFollowersObj;
use crate::federation::application::port::out::db::{ use crate::federation::application::port::out::db::{
get_person::*, get_repository::*, save_person::*, save_remote_actor::*, save_repository::*, commits::*, get_person::*, get_repository::*, poll_person_checkpoint::*, save_person::*,
save_remote_actor::*, save_repository::*,
}; };
use crate::federation::application::port::out::forge::follow_person::FederationOutForgeFollowPersonObj; use crate::federation::application::port::out::forge::follow_person::FederationOutForgeFollowPersonObj;
use crate::federation::application::port::out::forge::poll_person_activities::FederationOutForgePollPersonActivitiesObj;
use crate::federation::application::port::out::forge::{ use crate::federation::application::port::out::forge::{
parse_repository_from_url::FederationOutForgeParseRepositoryFromUrlObj, parse_repository_from_url::FederationOutForgeParseRepositoryFromUrlObj,
parse_username_from_url::FederationOutForgeParseUsernameFromUrlObj, parse_username_from_url::FederationOutForgeParseUsernameFromUrlObj,
}; };
use crate::federation::application::services::cache_ap_local_object_service::CacheAPLocalObjectServiceObj;
use crate::utils::data::Dependencies; use crate::utils::data::Dependencies;
pub(super) use crate::utils::forges::forge_repository::ForgeRepositoryInterface; pub(super) use crate::utils::forges::forge_repository::ForgeRepositoryInterface;
use activitypub_federation::config::FederationConfig; use activitypub_federation::config::FederationConfig;
@ -36,6 +40,9 @@ pub type WebFederationOutDBGetRemoteActorObj = Data<FederationOutDBGetRemoteActo
pub type WebFederationOutDBSaveRemoteActorObj = Data<FederationOutDBSaveRemoteActorObj>; pub type WebFederationOutDBSaveRemoteActorObj = Data<FederationOutDBSaveRemoteActorObj>;
pub type WebFederationOutDBDeleteRemoteActorObj = Data<FederationOutDBDeleteRemoteActorObj>; pub type WebFederationOutDBDeleteRemoteActorObj = Data<FederationOutDBDeleteRemoteActorObj>;
pub type WebFederationOutDBRepositoryFollowersObj = Data<FederationOutDBRepositoryFollowersObj>; pub type WebFederationOutDBRepositoryFollowersObj = Data<FederationOutDBRepositoryFollowersObj>;
pub type WebFederationOutDBPollPersonCheckpointObj = Data<FederationOutDBPollPersonCheckpointObj>;
pub type WebFederationOutDBCommitsObj = Data<FederationOutDBCommitsObj>;
//pub type WebFederationOutDBCacheAPObjectObj = Data<FederationOutDBCacheAPObjectObj>;
pub type WebFederationForgeRepositoryInterface = pub type WebFederationForgeRepositoryInterface =
Data<Arc<dyn ForgeRepositoryInterface<Arc<dyn FederationForgeAdapterFactoryInterface>>>>; Data<Arc<dyn ForgeRepositoryInterface<Arc<dyn FederationForgeAdapterFactoryInterface>>>>;
@ -44,9 +51,13 @@ pub type WebFederationOutForgeParseUsernameFromUrlObj =
pub type WebFederationOutForgeParseRepositoryFromUrlObj = pub type WebFederationOutForgeParseRepositoryFromUrlObj =
Data<FederationOutForgeParseRepositoryFromUrlObj>; Data<FederationOutForgeParseRepositoryFromUrlObj>;
pub type WebFederationOutForgeFollowPersonObj = Data<FederationOutForgeFollowPersonObj>; pub type WebFederationOutForgeFollowPersonObj = Data<FederationOutForgeFollowPersonObj>;
pub type WebFederationOutForgePollPersonActivitiesObj =
Data<FederationOutForgePollPersonActivitiesObj>;
pub type WebFederationRouteRepository = Data<Arc<RoutesRepository>>; pub type WebFederationRouteRepository = Data<Arc<RoutesRepository>>;
pub type WebFederationCacheAPLocalObjectService = Data<CacheAPLocalObjectServiceObj>;
#[derive(Default, Clone)] #[derive(Default, Clone)]
pub struct FData(pub Arc<Dependencies>); pub struct FData(pub Arc<Dependencies>);

View file

@ -21,6 +21,13 @@ use self::out::forge::forge_factory::*;
use self::out::forge::forgejo::ForgejoBuilder; use self::out::forge::forgejo::ForgejoBuilder;
use self::out::forge::github::GitHubBuilder; use self::out::forge::github::GitHubBuilder;
use super::{
application::services::cache_ap_local_object_service::{
CacheAPLocalObjectService, CacheAPLocalObjectServiceBuilder,
},
domain::*,
};
#[derive(Clone)] #[derive(Clone)]
struct Adapters { struct Adapters {
out_db_get_person_adapter: WebFederationOutDBGetPersonObj, out_db_get_person_adapter: WebFederationOutDBGetPersonObj,
@ -35,7 +42,13 @@ struct Adapters {
out_db_get_remote_actor_adapter: WebFederationOutDBGetRemoteActorObj, out_db_get_remote_actor_adapter: WebFederationOutDBGetRemoteActorObj,
out_db_delete_remote_actor_adapter: WebFederationOutDBDeleteRemoteActorObj, out_db_delete_remote_actor_adapter: WebFederationOutDBDeleteRemoteActorObj,
out_db_poll_person_checkpoint_adapter: WebFederationOutDBPollPersonCheckpointObj,
out_db_commit_adapter: WebFederationOutDBCommitsObj,
forge_repository_interface: WebFederationForgeRepositoryInterface, forge_repository_interface: WebFederationForgeRepositoryInterface,
cache_ap_local_obect_service: WebFederationCacheAPLocalObjectService,
} }
impl Adapters { impl Adapters {
@ -63,6 +76,13 @@ impl Adapters {
WebFederationOutDBGetRemoteActorObj::new(Arc::new(db.clone())); WebFederationOutDBGetRemoteActorObj::new(Arc::new(db.clone()));
let out_db_delete_remote_actor_adapter = let out_db_delete_remote_actor_adapter =
WebFederationOutDBDeleteRemoteActorObj::new(Arc::new(db.clone())); WebFederationOutDBDeleteRemoteActorObj::new(Arc::new(db.clone()));
let out_db_cache_ap_object_adapter =
WebFederationOutDBCacheAPObjectObj::new(Arc::new(db.clone()));
let out_db_commit_adapter = WebFederationOutDBCommitsObj::new(Arc::new(db.clone()));
let out_db_poll_person_checkpoint_adapter =
WebFederationOutDBPollPersonCheckpointObj::new(Arc::new(db.clone()));
let forgejo: Arc<dyn FederationForgeAdapterFactoryInterface> = let forgejo: Arc<dyn FederationForgeAdapterFactoryInterface> =
Arc::new(ForgejoAdapterFactory::new( Arc::new(ForgejoAdapterFactory::new(
@ -105,6 +125,23 @@ impl Adapters {
WebFederationForgeRepositoryInterface::new(f) WebFederationForgeRepositoryInterface::new(f)
}; };
let cache_ap_local_obect_service = {
let object_id_generator: FederationGenerateObjectID =
Arc::new(input::web::APObjectIDGenerator::new(
settings.clone(),
input::web::RoutesRepository::default().ap_object,
));
WebFederationCacheAPLocalObjectService::new(Arc::new(
CacheAPLocalObjectServiceBuilder::default()
.out_db_cache_ap_local_object_adapter(
out_db_cache_ap_object_adapter.as_ref().clone(),
)
.object_id_generator(object_id_generator)
.build()
.unwrap(),
))
};
Self { Self {
out_db_get_person_adapter, out_db_get_person_adapter,
out_db_save_person_adapter, out_db_save_person_adapter,
@ -116,13 +153,24 @@ impl Adapters {
out_db_save_remote_actor_adapter, out_db_save_remote_actor_adapter,
out_db_delete_remote_actor_adapter, out_db_delete_remote_actor_adapter,
out_db_repository_follower_adapter, out_db_repository_follower_adapter,
out_db_poll_person_checkpoint_adapter,
out_db_commit_adapter,
// out_db_cache_ap_object_adapter,
forge_repository_interface, forge_repository_interface,
cache_ap_local_obect_service,
} }
} }
} }
pub async fn federation_config(pool: PgPool, settings: &settings::Settings) -> WebFederationConfig { pub async fn federation_config(pool: PgPool, settings: &settings::Settings) -> WebFederationConfig {
let adapters = Adapters::new(pool, settings); let adapters = Adapters::new(pool, settings);
let object_id_generator: FederationGenerateObjectID =
Arc::new(input::web::APObjectIDGenerator::new(
settings.clone(),
input::web::RoutesRepository::default().ap_object,
));
// let object_id_generator: fn(uuid: Uuid) -> Result<Url, url::ParseError> = object_id_generator.generate;
let mut data = Dependencies::default(); let mut data = Dependencies::default();
data.insert(adapters.out_db_get_person_adapter.clone()); data.insert(adapters.out_db_get_person_adapter.clone());
@ -135,14 +183,20 @@ pub async fn federation_config(pool: PgPool, settings: &settings::Settings) -> W
data.insert(adapters.out_db_get_remote_actor_adapter.clone()); data.insert(adapters.out_db_get_remote_actor_adapter.clone());
data.insert(adapters.out_db_save_remote_actor_adapter.clone()); data.insert(adapters.out_db_save_remote_actor_adapter.clone());
data.insert(adapters.forge_repository_interface.clone()); data.insert(adapters.forge_repository_interface.clone());
data.insert(adapters.out_db_delete_remote_actor_adapter); data.insert(adapters.out_db_delete_remote_actor_adapter.clone());
data.insert(adapters.out_db_cache_ap_object_adapter.clone());
data.insert(adapters.out_db_poll_person_checkpoint_adapter.clone());
data.insert(adapters.out_db_commit_adapter.clone());
data.insert(settings.clone()); data.insert(settings.clone());
data.insert(WebSettings::new(settings.clone())); data.insert(WebSettings::new(settings.clone()));
data.insert(input::web::RoutesRepository::default()); data.insert(input::web::RoutesRepository::default());
data.insert(WebFederationRouteRepository::new(Arc::new( data.insert(WebFederationRouteRepository::new(Arc::new(
input::web::RoutesRepository::default(), input::web::RoutesRepository::default(),
))); )));
data.insert(adapters.cache_ap_local_obect_service.clone());
let data = FData(Arc::new(data)); let data = FData(Arc::new(data));
actix_web::web::Data::new( actix_web::web::Data::new(
@ -182,8 +236,12 @@ pub fn load_adapters(
cfg.app_data(adapters.out_db_save_remote_actor_adapter.clone()); cfg.app_data(adapters.out_db_save_remote_actor_adapter.clone());
cfg.app_data(adapters.out_db_delete_remote_actor_adapter.clone()); cfg.app_data(adapters.out_db_delete_remote_actor_adapter.clone());
cfg.app_data(adapters.out_db_repository_follower_adapter.clone()); cfg.app_data(adapters.out_db_repository_follower_adapter.clone());
cfg.app_data(adapters.out_db_poll_person_checkpoint_adapter.clone());
cfg.app_data(adapters.out_db_commit_adapter.clone());
cfg.app_data(adapters.forge_repository_interface); cfg.app_data(adapters.forge_repository_interface);
cfg.app_data(adapters.cache_ap_local_obect_service.clone());
}; };
Box::new(f) Box::new(f)

View file

@ -2,7 +2,7 @@
// //
// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-License-Identifier: AGPL-3.0-or-later
//use std::borrow::Cow; use std::borrow::Cow;
use sqlx::Error as SqlxError; use sqlx::Error as SqlxError;
@ -11,18 +11,19 @@ use crate::federation::application::port::out::db::errors::FederationOutDBPortEr
impl From<SqlxError> for FederationOutDBPortError { impl From<SqlxError> for FederationOutDBPortError {
fn from(e: SqlxError) -> Self { fn from(e: SqlxError) -> Self {
println!("[postgres] err: {}", e); println!("[postgres] err: {}", e);
// if let SqlxError::Database(err) = e { if let SqlxError::Database(err) = e {
// if err.code() == Some(Cow::from("23505")) { if err.code() == Some(Cow::from("23505")) {
// let msg = err.message(); let msg = err.message();
// if msg.contains("oauth_state_state_key") { if msg.contains("ap_objects_uuid_key") {
// return Self::DuplicateState; return Self::CacheAPObjectIDExists;
// } else if msg.contains("oauth_access_token_username_oauth_provider_key") { }
// return Self::DuplicateAccessToken; // } else if msg.contains("oauth_access_token_username_oauth_provider_key") {
// } else { // return Self::DuplicateAccessToken;
// println!("{msg}"); // } else {
// } // println!("{msg}");
// } // }
// } }
}
Self::InternalError Self::InternalError
} }
} }

View file

@ -12,9 +12,11 @@ mod save_person;
mod save_repository; mod save_repository;
// ActivityPub // ActivityPub
mod cache_activitypub_local_object; mod cache_activitypub_local_object;
mod commits;
mod delete_remote_actor; mod delete_remote_actor;
mod get_remote_actor; mod get_remote_actor;
mod person_followers; mod person_followers;
mod poll_person_checkpoint;
mod repository_followers; mod repository_followers;
mod save_remote_actor; mod save_remote_actor;

View file

@ -10,4 +10,5 @@ pub type FederationOutDBPortResult<V> = Result<V, FederationOutDBPortError>;
#[derive(Debug, Display, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] #[derive(Debug, Display, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub enum FederationOutDBPortError { pub enum FederationOutDBPortError {
InternalError, InternalError,
CacheAPObjectIDExists,
} }

View file

@ -3,12 +3,14 @@
// SPDX-License-Identifier: AGPL-3.0-or-later // SPDX-License-Identifier: AGPL-3.0-or-later
pub mod cache_activitypub_local_object; pub mod cache_activitypub_local_object;
pub mod commits;
pub mod delete_remote_actor; pub mod delete_remote_actor;
pub mod errors; pub mod errors;
pub mod get_person; pub mod get_person;
pub mod get_remote_actor; pub mod get_remote_actor;
pub mod get_repository; pub mod get_repository;
pub mod person_followers; pub mod person_followers;
pub mod poll_person_checkpoint;
pub mod repository_followers; pub mod repository_followers;
pub mod save_person; pub mod save_person;
pub mod save_remote_actor; pub mod save_remote_actor;

View file

@ -11,5 +11,7 @@ pub mod parse_username_from_url;
//pub mod generate_repo_url; //pub mod generate_repo_url;
pub mod follow_person; pub mod follow_person;
pub mod follow_repository; pub mod follow_repository;
pub mod poll_person_activities;
pub mod unfollow_person; pub mod unfollow_person;
pub mod unfollow_repository; pub mod unfollow_repository;
//pub mod get_person_feed;