Compare commits
4 Commits
wmill-scri
...
rf/orderBy
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
461306ab04 | ||
|
|
062e904141 | ||
|
|
b0ba8350f7 | ||
|
|
2adafcd265 |
@@ -1,16 +0,0 @@
|
|||||||
{
|
|
||||||
"db_name": "PostgreSQL",
|
|
||||||
"query": "UPDATE script SET ws_error_handler_muted = $3 WHERE workspace_id = $2 AND path = $1 AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND workspace_id = $2)",
|
|
||||||
"describe": {
|
|
||||||
"columns": [],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Text",
|
|
||||||
"Text",
|
|
||||||
"Bool"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nullable": []
|
|
||||||
},
|
|
||||||
"hash": "1182fe055306d7ea435d76b74d781e066915c8397e6bbc9e408ff3dda9fec27f"
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"db_name": "PostgreSQL",
|
"db_name": "PostgreSQL",
|
||||||
"query": "SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 AND\n created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND workspace_id = $2))",
|
"query": "SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1)",
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
@@ -19,5 +19,5 @@
|
|||||||
null
|
null
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"hash": "ea2b88dc050aec038641ea37399d68d4385c5bdc721d1351609f27ca45e4dbdc"
|
"hash": "2a49e5b5486b650d96f3e9038cba8a5f2e75d3b12ee4718452e82c7318b1bcf4"
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"db_name": "PostgreSQL",
|
"db_name": "PostgreSQL",
|
||||||
"query": "SELECT s.hash as hash, dm.deployment_msg as deployment_msg \n FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash\n WHERE s.workspace_id = $1 AND s.path = $2\n ORDER by created_at DESC",
|
"query": "SELECT s.hash as hash, dm.deployment_msg as deployment_msg \n FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash\n WHERE s.workspace_id = $1 AND s.path = $2\n ORDER by s.created_at DESC",
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
@@ -25,5 +25,5 @@
|
|||||||
true
|
true
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"hash": "362419eb262c83d6a98a0200b116e831ada60399fe5f55a56d930cc69aff2675"
|
"hash": "726e956cfcd3ac7c07abeecdf92cf0996efe7fa7b671ac2b3b000ead0ea307de"
|
||||||
}
|
}
|
||||||
16
backend/.sqlx/query-848c8371eeb17ebd4b36a33f7d8a61eb8f07c54d291bb857ddd41a549cbc88dd.json
generated
Normal file
16
backend/.sqlx/query-848c8371eeb17ebd4b36a33f7d8a61eb8f07c54d291bb857ddd41a549cbc88dd.json
generated
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"db_name": "PostgreSQL",
|
||||||
|
"query": "UPDATE script \n SET ws_error_handler_muted = $3 \n WHERE ctid = (\n SELECT ctid FROM script\n WHERE path = $1 AND workspace_id = $2\n ORDER BY created_at DESC\n LIMIT 1\n )\n",
|
||||||
|
"describe": {
|
||||||
|
"columns": [],
|
||||||
|
"parameters": {
|
||||||
|
"Left": [
|
||||||
|
"Text",
|
||||||
|
"Text",
|
||||||
|
"Bool"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"nullable": []
|
||||||
|
},
|
||||||
|
"hash": "848c8371eeb17ebd4b36a33f7d8a61eb8f07c54d291bb857ddd41a549cbc88dd"
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"db_name": "PostgreSQL",
|
"db_name": "PostgreSQL",
|
||||||
"query": "SELECT content FROM script WHERE path = $1 AND workspace_id = $2 AND\n created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND archived = false AND workspace_id = $2)",
|
"query": "SELECT content FROM script WHERE path = $1 AND workspace_id = $2 AND archived = false ORDER BY created_at DESC LIMIT 1",
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
{
|
{
|
||||||
@@ -19,5 +19,5 @@
|
|||||||
false
|
false
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"hash": "a17260a1f1ee02e786690994d98c84ddf81e2eeb883f895c9cfc47e144d422cb"
|
"hash": "b5860f6a7672a368d740dcd367a8d5ab98fa93e0382a57a698564695db6c40ac"
|
||||||
}
|
}
|
||||||
29
backend/.sqlx/query-cf2a6ad6471a40b6298775cda9300aeecdd75503bed59d80cd62091d1642d1ec.json
generated
Normal file
29
backend/.sqlx/query-cf2a6ad6471a40b6298775cda9300aeecdd75503bed59d80cd62091d1642d1ec.json
generated
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"db_name": "PostgreSQL",
|
||||||
|
"query": "SELECT s.hash as hash, dm.deployment_msg as deployment_msg \n FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash\n WHERE s.workspace_id = $1 AND s.path = $2\n ORDER by s.created_at DESC LIMIT 1",
|
||||||
|
"describe": {
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"ordinal": 0,
|
||||||
|
"name": "hash",
|
||||||
|
"type_info": "Int8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ordinal": 1,
|
||||||
|
"name": "deployment_msg",
|
||||||
|
"type_info": "Text"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"parameters": {
|
||||||
|
"Left": [
|
||||||
|
"Text",
|
||||||
|
"Text"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"nullable": [
|
||||||
|
false,
|
||||||
|
true
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hash": "cf2a6ad6471a40b6298775cda9300aeecdd75503bed59d80cd62091d1642d1ec"
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
-- Add down migration script here
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
-- Add up migration script here
|
||||||
|
DROP INDEX IF EXISTS index_script_on_path_created_at;
|
||||||
|
CREATE INDEX IF NOT EXISTS index_script_on_path_created_at ON script (workspace_id, path, created_at DESC);
|
||||||
@@ -265,9 +265,12 @@ async fn list_scripts(
|
|||||||
|
|
||||||
if lq.show_archived.unwrap_or(false) {
|
if lq.show_archived.unwrap_or(false) {
|
||||||
sqlb.and_where_eq(
|
sqlb.and_where_eq(
|
||||||
"o.created_at",
|
"o.ctid",
|
||||||
"(select max(created_at) from script where o.path = path
|
"(SELECT ctid FROM script
|
||||||
AND workspace_id = ?)"
|
WHERE path = o.path
|
||||||
|
AND workspace_id = ?
|
||||||
|
ORDER BY created_at DESC
|
||||||
|
LIMIT 1)"
|
||||||
.bind(&w_id),
|
.bind(&w_id),
|
||||||
);
|
);
|
||||||
sqlb.and_where_eq("archived", true);
|
sqlb.and_where_eq("archived", true);
|
||||||
@@ -989,7 +992,7 @@ async fn get_script_by_path(
|
|||||||
AND favorite.usr = $3
|
AND favorite.usr = $3
|
||||||
WHERE s.path = $1
|
WHERE s.path = $1
|
||||||
AND s.workspace_id = $2
|
AND s.workspace_id = $2
|
||||||
AND s.created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND workspace_id = $2)",
|
ORDER BY s.created_at DESC LIMIT 1",
|
||||||
)
|
)
|
||||||
.bind(path)
|
.bind(path)
|
||||||
.bind(w_id)
|
.bind(w_id)
|
||||||
@@ -998,9 +1001,7 @@ async fn get_script_by_path(
|
|||||||
.await?
|
.await?
|
||||||
} else {
|
} else {
|
||||||
sqlx::query_as::<_, ScriptWithStarred>(
|
sqlx::query_as::<_, ScriptWithStarred>(
|
||||||
"SELECT *, NULL as starred FROM script WHERE path = $1 AND workspace_id = $2 \
|
"SELECT *, NULL as starred FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1",
|
||||||
AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND \
|
|
||||||
workspace_id = $2)",
|
|
||||||
)
|
)
|
||||||
.bind(path)
|
.bind(path)
|
||||||
.bind(w_id)
|
.bind(w_id)
|
||||||
@@ -1040,9 +1041,8 @@ async fn get_script_by_path_w_draft(
|
|||||||
let script_o = sqlx::query_as::<_, ScriptWDraft>(
|
let script_o = sqlx::query_as::<_, ScriptWDraft>(
|
||||||
"SELECT hash, script.path, summary, description, content, language, kind, tag, schema, draft_only, envs, concurrent_limit, concurrency_time_window_s, cache_ttl, ws_error_handler_muted, draft.value as draft, dedicated_worker, priority, restart_unless_cancelled, delete_after_use, timeout, concurrency_key, visible_to_runner_only, no_main_func, has_preprocessor, on_behalf_of_email FROM script LEFT JOIN draft ON
|
"SELECT hash, script.path, summary, description, content, language, kind, tag, schema, draft_only, envs, concurrent_limit, concurrency_time_window_s, cache_ttl, ws_error_handler_muted, draft.value as draft, dedicated_worker, priority, restart_unless_cancelled, delete_after_use, timeout, concurrency_key, visible_to_runner_only, no_main_func, has_preprocessor, on_behalf_of_email FROM script LEFT JOIN draft ON
|
||||||
script.path = draft.path AND script.workspace_id = draft.workspace_id AND draft.typ = 'script'
|
script.path = draft.path AND script.workspace_id = draft.workspace_id AND draft.typ = 'script'
|
||||||
WHERE script.path = $1 AND script.workspace_id = $2 \
|
WHERE script.path = $1 AND script.workspace_id = $2
|
||||||
AND script.created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND \
|
ORDER BY script.created_at DESC LIMIT 1",
|
||||||
workspace_id = $2)",
|
|
||||||
)
|
)
|
||||||
.bind(path)
|
.bind(path)
|
||||||
.bind(w_id)
|
.bind(w_id)
|
||||||
@@ -1064,7 +1064,7 @@ async fn get_script_history(
|
|||||||
"SELECT s.hash as hash, dm.deployment_msg as deployment_msg
|
"SELECT s.hash as hash, dm.deployment_msg as deployment_msg
|
||||||
FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash
|
FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash
|
||||||
WHERE s.workspace_id = $1 AND s.path = $2
|
WHERE s.workspace_id = $1 AND s.path = $2
|
||||||
ORDER by created_at DESC",
|
ORDER by s.created_at DESC",
|
||||||
w_id,
|
w_id,
|
||||||
path.to_path(),
|
path.to_path(),
|
||||||
)
|
)
|
||||||
@@ -1092,7 +1092,7 @@ async fn get_latest_version(
|
|||||||
"SELECT s.hash as hash, dm.deployment_msg as deployment_msg
|
"SELECT s.hash as hash, dm.deployment_msg as deployment_msg
|
||||||
FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash
|
FROM script s LEFT JOIN deployment_metadata dm ON s.hash = dm.script_hash
|
||||||
WHERE s.workspace_id = $1 AND s.path = $2
|
WHERE s.workspace_id = $1 AND s.path = $2
|
||||||
ORDER by created_at DESC",
|
ORDER by s.created_at DESC LIMIT 1",
|
||||||
w_id,
|
w_id,
|
||||||
path.to_path(),
|
path.to_path(),
|
||||||
)
|
)
|
||||||
@@ -1188,7 +1188,15 @@ async fn toggle_workspace_error_handler(
|
|||||||
match error_handler_maybe {
|
match error_handler_maybe {
|
||||||
Some(_) => {
|
Some(_) => {
|
||||||
sqlx::query_scalar!(
|
sqlx::query_scalar!(
|
||||||
"UPDATE script SET ws_error_handler_muted = $3 WHERE workspace_id = $2 AND path = $1 AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND workspace_id = $2)",
|
"UPDATE script
|
||||||
|
SET ws_error_handler_muted = $3
|
||||||
|
WHERE ctid = (
|
||||||
|
SELECT ctid FROM script
|
||||||
|
WHERE path = $1 AND workspace_id = $2
|
||||||
|
ORDER BY created_at DESC
|
||||||
|
LIMIT 1
|
||||||
|
)
|
||||||
|
",
|
||||||
path.to_path(),
|
path.to_path(),
|
||||||
w_id,
|
w_id,
|
||||||
req.muted,
|
req.muted,
|
||||||
@@ -1209,6 +1217,7 @@ async fn toggle_workspace_error_handler(
|
|||||||
|
|
||||||
async fn get_tokened_raw_script_by_path(
|
async fn get_tokened_raw_script_by_path(
|
||||||
Extension(user_db): Extension<UserDB>,
|
Extension(user_db): Extension<UserDB>,
|
||||||
|
Extension(db): Extension<DB>,
|
||||||
Path((w_id, token, path)): Path<(String, String, StripPath)>,
|
Path((w_id, token, path)): Path<(String, String, StripPath)>,
|
||||||
Extension(cache): Extension<Arc<AuthCache>>,
|
Extension(cache): Extension<Arc<AuthCache>>,
|
||||||
) -> Result<String> {
|
) -> Result<String> {
|
||||||
@@ -1216,7 +1225,13 @@ async fn get_tokened_raw_script_by_path(
|
|||||||
.get_authed(Some(w_id.clone()), &token)
|
.get_authed(Some(w_id.clone()), &token)
|
||||||
.await
|
.await
|
||||||
.ok_or_else(|| Error::NotAuthorized("Invalid token".to_string()))?;
|
.ok_or_else(|| Error::NotAuthorized("Invalid token".to_string()))?;
|
||||||
return raw_script_by_path(authed, Extension(user_db), Path((w_id, path))).await;
|
return raw_script_by_path(
|
||||||
|
authed,
|
||||||
|
Extension(user_db),
|
||||||
|
Extension(db),
|
||||||
|
Path((w_id, path)),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_empty_ts_script_by_path() -> String {
|
async fn get_empty_ts_script_by_path() -> String {
|
||||||
@@ -1226,22 +1241,25 @@ async fn get_empty_ts_script_by_path() -> String {
|
|||||||
async fn raw_script_by_path(
|
async fn raw_script_by_path(
|
||||||
authed: ApiAuthed,
|
authed: ApiAuthed,
|
||||||
Extension(user_db): Extension<UserDB>,
|
Extension(user_db): Extension<UserDB>,
|
||||||
|
Extension(db): Extension<DB>,
|
||||||
Path((w_id, path)): Path<(String, StripPath)>,
|
Path((w_id, path)): Path<(String, StripPath)>,
|
||||||
) -> Result<String> {
|
) -> Result<String> {
|
||||||
raw_script_by_path_internal(path, user_db, authed, w_id, false).await
|
raw_script_by_path_internal(path, user_db, db, authed, w_id, false).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn raw_script_by_path_unpinned(
|
async fn raw_script_by_path_unpinned(
|
||||||
authed: ApiAuthed,
|
authed: ApiAuthed,
|
||||||
Extension(user_db): Extension<UserDB>,
|
Extension(user_db): Extension<UserDB>,
|
||||||
|
Extension(db): Extension<DB>,
|
||||||
Path((w_id, path)): Path<(String, StripPath)>,
|
Path((w_id, path)): Path<(String, StripPath)>,
|
||||||
) -> Result<String> {
|
) -> Result<String> {
|
||||||
raw_script_by_path_internal(path, user_db, authed, w_id, true).await
|
raw_script_by_path_internal(path, user_db, db, authed, w_id, true).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn raw_script_by_path_internal(
|
async fn raw_script_by_path_internal(
|
||||||
path: StripPath,
|
path: StripPath,
|
||||||
user_db: UserDB,
|
user_db: UserDB,
|
||||||
|
db: DB,
|
||||||
authed: ApiAuthed,
|
authed: ApiAuthed,
|
||||||
w_id: String,
|
w_id: String,
|
||||||
unpin: bool,
|
unpin: bool,
|
||||||
@@ -1267,10 +1285,7 @@ async fn raw_script_by_path_internal(
|
|||||||
let mut tx = user_db.begin(&authed).await?;
|
let mut tx = user_db.begin(&authed).await?;
|
||||||
|
|
||||||
let content_o = sqlx::query_scalar!(
|
let content_o = sqlx::query_scalar!(
|
||||||
"SELECT content FROM script WHERE path = $1 AND workspace_id = $2 \
|
"SELECT content FROM script WHERE path = $1 AND workspace_id = $2 AND archived = false ORDER BY created_at DESC LIMIT 1",
|
||||||
AND
|
|
||||||
created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND archived = false AND \
|
|
||||||
workspace_id = $2)",
|
|
||||||
path,
|
path,
|
||||||
w_id
|
w_id
|
||||||
)
|
)
|
||||||
@@ -1278,6 +1293,22 @@ async fn raw_script_by_path_internal(
|
|||||||
.await?;
|
.await?;
|
||||||
tx.commit().await?;
|
tx.commit().await?;
|
||||||
|
|
||||||
|
if content_o.is_none() {
|
||||||
|
let exists = sqlx::query_scalar!(
|
||||||
|
"SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1)",
|
||||||
|
path,
|
||||||
|
w_id
|
||||||
|
)
|
||||||
|
.fetch_one(&db)
|
||||||
|
.await?;
|
||||||
|
if exists.unwrap_or(false) {
|
||||||
|
return Err(Error::NotFound(format!(
|
||||||
|
"Script {path} not visible to {} but exists",
|
||||||
|
authed.username
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let content = not_found_if_none(content_o, "Script", path)?;
|
let content = not_found_if_none(content_o, "Script", path)?;
|
||||||
|
|
||||||
if unpin {
|
if unpin {
|
||||||
@@ -1294,8 +1325,7 @@ async fn exists_script_by_path(
|
|||||||
let path = path.to_path();
|
let path = path.to_path();
|
||||||
|
|
||||||
let exists = sqlx::query_scalar!(
|
let exists = sqlx::query_scalar!(
|
||||||
"SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 AND
|
"SELECT EXISTS(SELECT 1 FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1)",
|
||||||
created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND workspace_id = $2))",
|
|
||||||
path,
|
path,
|
||||||
w_id
|
w_id
|
||||||
)
|
)
|
||||||
@@ -1412,9 +1442,7 @@ pub async fn require_is_writer(authed: &ApiAuthed, path: &str, w_id: &str, db: D
|
|||||||
path,
|
path,
|
||||||
w_id,
|
w_id,
|
||||||
db,
|
db,
|
||||||
"SELECT extra_perms FROM script WHERE path = $1 AND workspace_id = $2 \
|
"SELECT extra_perms FROM script WHERE path = $1 AND workspace_id = $2 ORDER BY created_at DESC LIMIT 1",
|
||||||
AND created_at = (SELECT max(created_at) FROM script WHERE path = $1 AND \
|
|
||||||
workspace_id = $2)",
|
|
||||||
"script",
|
"script",
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|||||||
Reference in New Issue
Block a user