This commit is contained in:
Djkáťo 2024-04-17 17:30:51 +02:00
commit efe3ef6b59
17 changed files with 837 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

15
.gitmodules vendored Normal file
View file

@ -0,0 +1,15 @@
[submodule "all_apps/apps"]
path = all_apps/apps
url = https://github.com/saleor/apps
[submodule "all_apps/saleor-app-payment-authorize.net"]
path = all_apps/saleor-app-payment-authorize.net
url = https://github.com/saleor/saleor-app-payment-authorize.net
[submodule "all_apps/saleor-app-payment-stripe"]
path = all_apps/saleor-app-payment-stripe
url = https://github.com/saleor/saleor-app-payment-stripe
[submodule "all_apps/saleor-app-payment-klarna"]
path = all_apps/saleor-app-payment-klarna
url = https://github.com/saleor/saleor-app-payment-klarna
[submodule "all_apps/saleor-app-abandoned-checkouts"]
path = all_apps/saleor-app-abandoned-checkouts
url = https://github.com/saleor/saleor-app-abandoned-checkouts

230
Cargo.lock generated Normal file
View file

@ -0,0 +1,230 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "heck"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "itoa"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
[[package]]
name = "lazy_static"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "maplit"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
[[package]]
name = "proc-macro2"
version = "1.0.80"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a56dea16b0a29e94408b9aa5e2940a4eedbd128a1ba20e8f7ae60fd3d465af0e"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rustversion"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47"
[[package]]
name = "ryu"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
[[package]]
name = "saleor-dockerize-all-apps"
version = "0.1.0"
dependencies = [
"serde",
"serde_json",
"spinners",
"thiserror",
"walkdir",
]
[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
dependencies = [
"winapi-util",
]
[[package]]
name = "serde"
version = "1.0.198"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.198"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.59",
]
[[package]]
name = "serde_json"
version = "1.0.116"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
dependencies = [
"itoa",
"ryu",
"serde",
]
[[package]]
name = "spinners"
version = "4.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a0ef947f358b9c238923f764c72a4a9d42f2d637c46e059dbd319d6e7cfb4f82"
dependencies = [
"lazy_static",
"maplit",
"strum",
]
[[package]]
name = "strum"
version = "0.24.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f"
dependencies = [
"strum_macros",
]
[[package]]
name = "strum_macros"
version = "0.24.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59"
dependencies = [
"heck",
"proc-macro2",
"quote",
"rustversion",
"syn 1.0.109",
]
[[package]]
name = "syn"
version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "syn"
version = "2.0.59"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "thiserror"
version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
version = "1.0.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.59",
]
[[package]]
name = "unicode-ident"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
[[package]]
name = "walkdir"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
dependencies = [
"same-file",
"winapi-util",
]
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
dependencies = [
"winapi",
]
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

12
Cargo.toml Normal file
View file

@ -0,0 +1,12 @@
[package]
name = "saleor-dockerize-all-apps"
version = "0.1.0"
edition = "2021"
[dependencies]
# owo-colors = "4.0.0"
serde = { version = "1.0.198", features = ["derive"] }
serde_json = "1.0.116"
spinners = "4.1.1"
thiserror = "1.0.58"
walkdir = "2.5.0"

1
all_apps/apps Submodule

@ -0,0 +1 @@
Subproject commit b1f272a9df378b35a456e71f883d6c3223332664

@ -0,0 +1 @@
Subproject commit 3fddb86fe003f7552d413d12a37fd1998c02f84c

@ -0,0 +1 @@
Subproject commit c3c3d5ba8dc871ff3435f7b1852b8bee2af2da88

@ -0,0 +1 @@
Subproject commit 8740c3b0090a22cad3f80108ec3f91f12acde57c

@ -0,0 +1 @@
Subproject commit 70151abb52786687293b173471f574444b5331a6

59
changes.sh Executable file
View file

@ -0,0 +1,59 @@
#!/bin/bash
REDIS_APL_PATH="./changes/snippets/redis_apl.ts"
CURR_PWD="$(pwd)"
app_paths=(
"apps/apps/cms-v2"
"apps/apps/avatax"
"apps/apps/crm"
"apps/apps/data-importer"
"apps/apps/emails-and-messages"
"apps/apps/invoices"
"apps/apps/klaviyo"
"apps/apps/products-feed"
"apps/apps/search"
"apps/apps/segment"
"apps/apps/slack"
"apps/apps/taxjar"
"saleor-app-abandoned-checkouts"
"saleor-app-payment-authorize.net"
"saleor-app-payment-klarna"
"saleor-app-payment-stripe"
)
redis_apl_target_paths=(
"apps/apps/cms-v2/src"
"apps/apps/avatax"
"apps/apps/crm/src"
"apps/apps/data-importer"
"apps/apps/emails-and-messages/src"
"apps/apps/invoices/src"
"apps/apps/klaviyo"
"apps/apps/products-feed/src"
"apps/apps/search"
"apps/apps/segment/src"
"apps/apps/slack/src/lib"
"apps/apps/taxjar"
"saleor-app-abandoned-checkouts"
"saleor-app-payment-authorize.net/src"
"saleor-app-payment-klarna/src"
"saleor-app-payment-stripe/src"
)
echo "copying redis_apls..."
for i in ${redis_apl_target_paths[*]}; do
echo "copying redis_apl.ts to ./all_apps/$i"
cp -f "$REDIS_APL_PATH" "./all_apps/$i"
# always copies next to saleor-app.ts, so let's add some files to that file too
rg -l "switch \(process.env.APL\)" -t ts
done
for i in ${app_paths[*]}; do
cd "./all_apps/$i"
echo $(pwd)
pnpm i
pnpm i ioredis
cd "$CURR_PWD"
done

92
changes/actions.json Normal file
View file

@ -0,0 +1,92 @@
[
{
"name": "default_patch",
"actions": [
{
"target": "redis_apl.ts",
"action_type": "Create",
"snippets": [
{
"snippet": "redis_apl.ts"
}
]
},
{
"target": "saleor-app.ts",
"action_type": "Insert",
"snippets": [
{
"after": "switch (aplType)",
"snippet": "case_redisapl.ts"
},
{
"after": "import",
"snippet": "import_redisapl.ts"
}
]
}
]
},
{
"name": "turbo_patch",
"actions": [
{
"target": "turbo.json",
"action_type": "Insert",
"snippets": [
{
"after": "APP_API_BASE_URL",
"snippet": "turbo_env.ts"
}
]
}
]
},
{
"name": "default_but_process_switch",
"actions": [
{
"target": "redis_apl.ts",
"action_type": "Create",
"snippets": [
{
"snippet": "redis_apl.ts"
}
]
},
{
"target": "saleor-app.ts",
"action_type": "Insert",
"snippets": [
{
"after": "switch (process.env.APL)",
"snippet": "case_redisapl.ts"
},
{
"after": "import",
"snippet": "import_redisapl.ts"
}
]
}
]
},
{
"name": "default_but_env_switch",
"actions": [
{
"target": "saleor-app.ts",
"action_type": "Insert",
"snippets": [
{
"after": "import",
"snippet": "import_redisapl.ts"
},
{
"after": "switch (env.APL)",
"snippet": "case_redisapl.ts"
}
]
}
]
}
]

186
changes/changes.json Normal file
View file

@ -0,0 +1,186 @@
[
{
"folder": "apps",
"sub": [
{
"folder": "apps",
"sub": [
{
"folder": "avatax",
"actions_by_ref": [
"default_but_process_switch",
"turbo_patch"
]
},
{
"folder": "cms-v2",
"actions_by_ref": [
"turbo_patch"
],
"sub": [
{
"folder": "src",
"actions_by_ref": [
"default_patch"
]
}
]
},
{
"folder": "crm",
"sub": [
{
"folder": "src",
"actions_by_ref": [
"default_patch"
]
}
]
},
{
"folder": "data-importer",
"actions_by_ref": [
"default_but_process_switch",
"turbo_patch"
]
},
{
"folder": "emails-and-messages",
"actions_by_ref": [
"turbo_patch"
],
"sub": [
{
"folder": "src",
"actions_by_ref": [
"default_patch"
]
}
]
},
{
"folder": "invoices",
"actions_by_ref": [
"turbo_patch"
],
"sub": [
{
"folder": "src",
"actions_by_ref": [
"default_patch"
]
}
]
},
{
"folder": "klaviyo",
"actions_by_ref": [
"default_patch",
"turbo_patch"
]
},
{
"folder": "products-feed",
"actions_by_ref": [
"turbo_patch"
],
"sub": [
{
"folder": "src",
"actions_by_ref": [
"default_patch"
]
}
]
},
{
"folder": "search",
"actions_by_ref": [
"turbo_patch",
"default_patch"
]
},
{
"folder": "segment",
"actions_by_ref": [
"turbo_patch"
],
"sub": [
{
"folder": "src",
"actions_by_ref": [
"default_patch"
]
}
]
},
{
"folder": "slack",
"actions_by_ref": [
"turbo_patch"
],
"sub": [
{
"folder": "src",
"sub": [
{
"folder": "lib",
"actions_by_ref": [
"default_but_process_switch"
]
}
]
}
]
},
{
"folder": "taxjar",
"actions_by_ref": [
"turbo_patch",
"default_but_process_switch"
]
}
]
},
{
"folder": "saleor-app-abandoned-checkouts",
"actions_by_ref": [
"default_but_process_switch"
]
},
{
"folder": "saleor-app-payment-authorize.net",
"sub": [
{
"folder": "src",
"actions_by_ref": [
"default_but_env_switch"
]
}
]
},
{
"folder": "saleor-app-payment-klarna",
"sub": [
{
"folder": "src",
"actions_by_ref": [
"default_but_env_switch"
]
}
]
},
{
"folder": "saleor-app-payment-stripe",
"sub": [
{
"folder": "src",
"actions_by_ref": [
"default_but_env_switch"
]
}
]
}
]
}
]

View file

@ -0,0 +1,8 @@
case "redis": {
if (!process.env.REDIS_URL) throw new Error("Missing redis url");
if (!process.env.APP_API_BASE_URL)
throw new Error("Redis relies on APP_API_BASE_URL to store keys, please set env variable");
apl = new RedisAPL({ redisUrl: process.env.REDIS_URL, appApiBaseUrl: process.env.APP_API_BASE_URL });
console.log(apl)
break;
}

View file

@ -0,0 +1 @@
import { RedisAPL } from "./redis_apl"

View file

@ -0,0 +1,93 @@
import Redis from "ioredis";
import {
APL,
AplConfiguredResult,
AplReadyResult,
AuthData,
} from "@saleor/app-sdk/APL";
export type RedisAPLClientArgs = {
client: Redis;
appApiBaseUrl: string;
};
export type RedisAPLUrlArgs = {
redisUrl: string;
appApiBaseUrl: string;
};
/**
* Redis APL
* @param redisUrl - in format redis[s]://[[username][:password]@][host][:port][/db-number],
* so for example redis://alice:foobared@awesome.redis.server:6380
* For saleor-platform, thats: `redis://redis:6379/2`
*/
export class RedisAPL implements APL {
private client;
private appApiBaseUrl;
constructor(args: RedisAPLClientArgs | RedisAPLUrlArgs) {
if (!args.appApiBaseUrl)
throw new Error(
"The RedisAPL requires to know the app api url beforehand",
);
this.appApiBaseUrl = args.appApiBaseUrl;
if ("client" in args && args.client) {
this.client = args.client;
} else if ("redisUrl" in args && args.redisUrl) {
this.client = new Redis(args.redisUrl, { lazyConnect: true });
} else {
throw new Error("RedisAPL: No redis url or client defined");
}
this.isConfigured().then((v) => console.log("REDIS: CONFIGURED TEST: ", v));
}
private prepareKey(saleorApiUrl: string) {
return `${this.appApiBaseUrl}:${saleorApiUrl}`;
}
async get(saleorApiUrl: string): Promise<AuthData | undefined> {
const res = await this.client.get(this.prepareKey(saleorApiUrl));
console.log(
`REDIS: GET FOR ${this.prepareKey(saleorApiUrl)} (is ${res ? "truthy" : "falsy"}):`,
);
if (res) {
const data = JSON.parse(res) as AuthData;
console.dir(data, { depth: null });
return data;
}
}
async set(authData: AuthData): Promise<void> {
const res = await this.client.set(
this.prepareKey(authData.saleorApiUrl),
JSON.stringify(authData),
);
console.log(
`REDIS: SET FOR ${this.prepareKey(authData.saleorApiUrl)}: `,
res,
);
}
async delete(saleorApiUrl: string): Promise<void> {
const val = await this.client.getdel(this.prepareKey(saleorApiUrl));
console.log("REDIS: DEL: ", val);
}
async getAll(): Promise<AuthData[]> {
throw new Error("redisAPL does not support getAll method");
}
async isReady(): Promise<AplReadyResult> {
const ready = !!(await this.client.info());
console.log("REDIS: ISREADY: ", ready);
return { ready: ready } as AplReadyResult;
}
async isConfigured(): Promise<AplConfiguredResult> {
const ready = !!(await this.client.info());
console.log("REDIS: ISCONF: ", ready);
return { configured: ready } as AplConfiguredResult;
}
}

View file

@ -0,0 +1 @@
"REDIS_URL"

134
src/main.rs Normal file
View file

@ -0,0 +1,134 @@
use std::{
io,
path::{Path, PathBuf},
process::Command,
str::FromStr,
};
use serde::{Deserialize, Serialize};
use walkdir::WalkDir;
fn main() -> Result<(), io::Error> {
let snippets = get_snippets().unwrap();
let actions = get_actions().unwrap();
let changes = get_changes()
.unwrap()
.into_iter()
.map(|c| Box::new(c))
.collect::<Vec<_>>();
for change in changes {
let mut current_cumulative_path = std::env::current_dir()?;
current_cumulative_path.push("all_apps");
current_cumulative_path.push(&change.folder);
process_change(&change, &current_cumulative_path);
if let Some(sub) = change.sub {
iter_sub(sub)
}
}
Ok(())
}
pub fn process_change(
change: &Box<Change>,
current_cumulative_path: &PathBuf,
) -> Result<(), io::Error> {
if let Some(actions) = &change.actions {
for action in actions {
let mut current_file = current_cumulative_path.clone();
current_file.push(&action.target);
let command;
match action.action_type {
ActionType::Create => Command::new("ln").args(["-s", current_file]),
ActionType::Insert => {}
}
}
}
Ok(())
}
pub fn iter_sub(sub: Vec<Box<Change>>) {
for change in sub {
process_change(&change);
if let Some(further_sub) = change.sub {
iter_sub(further_sub)
}
}
}
pub fn get_changes() -> Result<Vec<Change>, std::io::Error> {
Ok(serde_json::from_str(&std::fs::read_to_string(
"./changes/changes.json",
)?)?)
}
pub fn get_snippets() -> Result<Vec<Snippet>, std::io::Error> {
let mut snippets = vec![];
for entry in WalkDir::new("./changes/snippets").into_iter().flatten() {
if entry.path().is_file() {
if let Some(name) = entry.path().file_stem() {
if let Some(name) = name.to_str() {
snippets.push(Snippet {
id: SnippetId(name.to_owned()),
value: std::fs::read_to_string(entry.path())?,
})
}
};
}
}
Ok(snippets)
}
pub fn get_actions() -> Result<Vec<NamedActions>, std::io::Error> {
Ok(serde_json::from_str(&std::fs::read_to_string(
"./changes/actions.json",
)?)?)
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Change {
pub folder: String,
pub sub: Option<Vec<Box<Self>>>,
pub actions_by_ref: Option<Vec<ActionsId>>,
pub actions: Option<Vec<Action>>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct NamedActions {
pub name: ActionsId,
pub actions: Vec<Action>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Action {
pub target: String,
pub action_type: ActionType,
pub snippets: Vec<ActionStep>,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct ActionStep {
pub after: Option<String>,
pub snippet: SnippetId,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Snippet {
id: SnippetId,
value: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub enum ActionType {
Insert,
Create,
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
#[serde(transparent)]
pub struct SnippetId(pub String);
#[derive(Serialize, Deserialize, Debug, PartialEq)]
#[serde(transparent)]
pub struct ActionsId(pub String);