feat: define interfaces to enable file-based federation mechanisms
DESCRIPTION <BASE_DIR>/forge.example.com/: This directory contains all data related to a particular forge instance running at forge.example.com <BASE_DIR>/forge.example.com/forgeinfo: This file contains metadata pertaining to a forge. The file format and file name is left to the discretion of the implementer. <BASE_DIR>/forge.example.com/john/: This directory contains all data related to a user named "john" on forge instance at forge.example.com. <BASE_DIR>/forge.example.com/john/userinfo: This file contains all metadata related to a user named "john" on forge instance at forge.example.com. The file format and file name is left to the discretion of the implementer. <BASE_DIR>/forge.example.com/john/repo-foo/: This directory contains all data related to a repository named "repo-foo" owned by user "john" on forge instance at forge.example.com. <BASE_DIR>/forge.example.com/john/repo-foo/repo-info: This file contains all metadata related to a repository named "repo-foo" owned by user "john" on forge instance at forge.example.com. The file format and file name is left to the discretion of the implementer.
This commit is contained in:
parent
65176bbdea
commit
95ca4fb1d3
4 changed files with 158 additions and 0 deletions
24
federate/federate-core/Cargo.toml
Normal file
24
federate/federate-core/Cargo.toml
Normal file
|
@ -0,0 +1,24 @@
|
|||
[package]
|
||||
name = "federate-core"
|
||||
version = "0.1.0"
|
||||
authors = ["realaravinth <realaravinth@batsense.net>"]
|
||||
description = "ForgeFlux StarChart - Federated forge spider"
|
||||
documentation = "https://forgeflux.org/"
|
||||
edition = "2021"
|
||||
license = "AGPLv3 or later version"
|
||||
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
async-trait = "0.1.51"
|
||||
thiserror = "1.0.30"
|
||||
serde = { version = "1", features = ["derive"]}
|
||||
url = { version = "2.2.2", features = ["serde"] }
|
||||
|
||||
[dependencies.db-core]
|
||||
path = "../../db/db-core"
|
||||
|
||||
[features]
|
||||
default = []
|
||||
test = []
|
17
federate/federate-core/src/errors.rs
Normal file
17
federate/federate-core/src/errors.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
/*
|
||||
* ForgeFlux StarChart - A federated software forge spider
|
||||
* Copyright (C) 2022 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
68
federate/federate-core/src/lib.rs
Normal file
68
federate/federate-core/src/lib.rs
Normal file
|
@ -0,0 +1,68 @@
|
|||
/*
|
||||
* ForgeFlux StarChart - A federated software forge spider
|
||||
* Copyright (C) 2022 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
use std::path::Path;
|
||||
use std::result::Result;
|
||||
|
||||
use async_trait::async_trait;
|
||||
use serde::Serialize;
|
||||
|
||||
use db_core::prelude::*;
|
||||
|
||||
#[cfg(feature = "test")]
|
||||
pub mod tests;
|
||||
|
||||
#[async_trait]
|
||||
pub trait Federate: Sync + Send + Clone {
|
||||
type Error: std::error::Error + std::fmt::Debug;
|
||||
|
||||
/// utility method to create dir if not exists
|
||||
async fn create_dir_if_not_exists(&self, path: &Path) -> Result<(), Self::Error>;
|
||||
|
||||
/// utility method to write data
|
||||
async fn write_util<S: Serialize + Send + Sync>(
|
||||
&self,
|
||||
data: &S,
|
||||
path: &Path,
|
||||
) -> Result<(), Self::Error>;
|
||||
|
||||
/// utility method to remove file/dir
|
||||
async fn rm_util(&self, path: &Path) -> Result<(), Self::Error>;
|
||||
|
||||
/// create forge isntance
|
||||
async fn create_forge_isntance(&self, f: &CreateForge<'_>) -> Result<(), Self::Error>;
|
||||
|
||||
/// delete forge isntance
|
||||
async fn delete_forge_instance(&self, hostname: &str) -> Result<(), Self::Error>;
|
||||
|
||||
/// create user isntance
|
||||
async fn create_user(&self, f: &AddUser<'_>) -> Result<(), Self::Error>;
|
||||
|
||||
/// add repository isntance
|
||||
async fn create_repository(&self, f: &AddRepository<'_>) -> Result<(), Self::Error>;
|
||||
|
||||
/// delete user
|
||||
async fn delete_user(&self, username: &str, hostname: &str) -> Result<(), Self::Error>;
|
||||
|
||||
/// delete repository
|
||||
async fn delete_repository(
|
||||
&self,
|
||||
owner: &str,
|
||||
name: &str,
|
||||
hostname: &str,
|
||||
) -> Result<(), Self::Error>;
|
||||
}
|
49
federate/federate-core/src/tests.rs
Normal file
49
federate/federate-core/src/tests.rs
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* ForgeFlux StarChart - A federated software forge spider
|
||||
* Copyright (C) 2022 Aravinth Manivannan <realaravinth@batsense.net>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
//! Test utilities
|
||||
use crate::*;
|
||||
|
||||
/// adding forge works
|
||||
pub async fn adding_forge_works<'a, T: Federate>(
|
||||
ff: &T,
|
||||
create_forge_msg: CreateForge<'a>,
|
||||
create_user_msg: AddUser<'a>,
|
||||
add_repo_msg: AddRepository<'a>,
|
||||
) {
|
||||
let _ = ff.delete_forge_instance(create_forge_msg.hostname).await;
|
||||
ff.create_forge_isntance(&create_forge_msg).await.unwrap();
|
||||
// add user
|
||||
ff.create_user(&create_user_msg).await.unwrap();
|
||||
|
||||
// add repository
|
||||
ff.create_repository(&add_repo_msg).await.unwrap();
|
||||
// delete repository
|
||||
ff.delete_repository(add_repo_msg.owner, add_repo_msg.name, add_repo_msg.hostname)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
// delete user
|
||||
ff.delete_user(create_user_msg.username, create_user_msg.hostname)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
// delete user
|
||||
ff.delete_forge_instance(create_forge_msg.hostname)
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
Loading…
Reference in a new issue