Migration and models for worlds/plugin_worlds
This commit is contained in:
parent
7eba0c6adc
commit
0e0fdfd59d
@ -0,0 +1,23 @@
|
|||||||
|
CREATE TABLE IF NOT EXISTS "worlds" (
|
||||||
|
"id" SERIAL PRIMARY KEY NOT NULL,
|
||||||
|
"form_id" INTEGER NOT NULL,
|
||||||
|
"master" VARCHAR(255) NOT NULL,
|
||||||
|
"created_at" timestamp(3) NOT NULL,
|
||||||
|
"updated_at" timestamp(3) NOT NULL
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX "worlds_unique_form_id_and_master" ON "worlds" ("form_id", "master");
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "plugin_worlds" (
|
||||||
|
"id" SERIAL PRIMARY KEY NOT NULL,
|
||||||
|
"plugin_id" INTEGER REFERENCES "plugins"(id) NOT NULL,
|
||||||
|
"world_id" INTEGER REFERENCES "worlds"(id) NOT NULL,
|
||||||
|
"editor_id" VARCHAR(255) NOT NULL,
|
||||||
|
"created_at" timestamp(3) NOT NULL,
|
||||||
|
"updated_at" timestamp(3) NOT NULL
|
||||||
|
);
|
||||||
|
CREATE UNIQUE INDEX "plugin_worlds_unique_plugin_id_and_world_id" ON "plugin_worlds" ("plugin_id", "world_id");
|
||||||
|
CREATE INDEX "plugin_worlds_world_id" ON "plugin_worlds" ("world_id");
|
||||||
|
|
||||||
|
ALTER TABLE "cells" ADD COLUMN "world_id" INTEGER REFERENCES "worlds"(id);
|
||||||
|
CREATE UNIQUE INDEX "cells_unique_form_id_and_world_id" ON "cells" ("form_id", "world_id");
|
||||||
|
DROP INDEX "cells_unique_form_id";
|
@ -75,6 +75,8 @@ where
|
|||||||
cell.form_id.try_into().unwrap(),
|
cell.form_id.try_into().unwrap(),
|
||||||
cell.x,
|
cell.x,
|
||||||
cell.y,
|
cell.y,
|
||||||
|
// TODO: fill in world_id here
|
||||||
|
None,
|
||||||
cell.is_persistent,
|
cell.is_persistent,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
@ -9,6 +9,8 @@ pub struct Cell {
|
|||||||
pub form_id: i32,
|
pub form_id: i32,
|
||||||
pub x: Option<i32>,
|
pub x: Option<i32>,
|
||||||
pub y: Option<i32>,
|
pub y: Option<i32>,
|
||||||
|
// TODO: make this not nullable
|
||||||
|
pub world_id: Option<i32>,
|
||||||
pub is_persistent: bool,
|
pub is_persistent: bool,
|
||||||
pub updated_at: NaiveDateTime,
|
pub updated_at: NaiveDateTime,
|
||||||
pub created_at: NaiveDateTime,
|
pub created_at: NaiveDateTime,
|
||||||
@ -20,20 +22,22 @@ pub async fn insert(
|
|||||||
form_id: i32,
|
form_id: i32,
|
||||||
x: Option<i32>,
|
x: Option<i32>,
|
||||||
y: Option<i32>,
|
y: Option<i32>,
|
||||||
|
world_id: Option<i32>,
|
||||||
is_persistent: bool,
|
is_persistent: bool,
|
||||||
) -> Result<Cell> {
|
) -> Result<Cell> {
|
||||||
sqlx::query_as!(
|
sqlx::query_as!(
|
||||||
Cell,
|
Cell,
|
||||||
"INSERT INTO cells
|
"INSERT INTO cells
|
||||||
(form_id, x, y, is_persistent, created_at, updated_at)
|
(form_id, x, y, world_id, is_persistent, created_at, updated_at)
|
||||||
VALUES ($1, $2, $3, $4, now(), now())
|
VALUES ($1, $2, $3, $4, $5, now(), now())
|
||||||
ON CONFLICT (form_id) DO UPDATE
|
ON CONFLICT (form_id, world_id) DO UPDATE
|
||||||
SET (x, y, is_persistent, updated_at) =
|
SET (x, y, is_persistent, updated_at) =
|
||||||
(EXCLUDED.x, EXCLUDED.y, EXCLUDED.is_persistent, now())
|
(EXCLUDED.x, EXCLUDED.y, EXCLUDED.is_persistent, now())
|
||||||
RETURNING *",
|
RETURNING *",
|
||||||
form_id,
|
form_id,
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
|
world_id,
|
||||||
is_persistent
|
is_persistent
|
||||||
)
|
)
|
||||||
.fetch_one(pool)
|
.fetch_one(pool)
|
||||||
|
@ -4,3 +4,5 @@ pub mod game;
|
|||||||
pub mod game_mod;
|
pub mod game_mod;
|
||||||
pub mod plugin;
|
pub mod plugin;
|
||||||
pub mod plugin_cell;
|
pub mod plugin_cell;
|
||||||
|
pub mod plugin_world;
|
||||||
|
pub mod world;
|
||||||
|
@ -2,6 +2,7 @@ use anyhow::{Context, Result};
|
|||||||
use chrono::NaiveDateTime;
|
use chrono::NaiveDateTime;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
pub struct PluginCell {
|
pub struct PluginCell {
|
||||||
pub id: i32,
|
pub id: i32,
|
||||||
@ -33,5 +34,5 @@ pub async fn insert(
|
|||||||
)
|
)
|
||||||
.fetch_one(pool)
|
.fetch_one(pool)
|
||||||
.await
|
.await
|
||||||
.context("Failed to insert cell")
|
.context("Failed to insert plugin_cell")
|
||||||
}
|
}
|
||||||
|
38
src/models/plugin_world.rs
Normal file
38
src/models/plugin_world.rs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
use anyhow::{Context, Result};
|
||||||
|
use chrono::NaiveDateTime;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use tracing::instrument;
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct PluginWorld {
|
||||||
|
pub id: i32,
|
||||||
|
pub plugin_id: i32,
|
||||||
|
pub world_id: i32,
|
||||||
|
pub editor_id: String,
|
||||||
|
pub updated_at: NaiveDateTime,
|
||||||
|
pub created_at: NaiveDateTime,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip(pool))]
|
||||||
|
pub async fn insert(
|
||||||
|
pool: &sqlx::Pool<sqlx::Postgres>,
|
||||||
|
plugin_id: i32,
|
||||||
|
world_id: i32,
|
||||||
|
editor_id: &str,
|
||||||
|
) -> Result<PluginWorld> {
|
||||||
|
sqlx::query_as!(
|
||||||
|
PluginWorld,
|
||||||
|
"INSERT INTO plugin_worlds
|
||||||
|
(plugin_id, world_id, editor_id, created_at, updated_at)
|
||||||
|
VALUES ($1, $2, $3, now(), now())
|
||||||
|
ON CONFLICT (plugin_id, world_id) DO UPDATE
|
||||||
|
SET (editor_id, updated_at) = (EXCLUDED.editor_id, now())
|
||||||
|
RETURNING *",
|
||||||
|
plugin_id,
|
||||||
|
world_id,
|
||||||
|
editor_id,
|
||||||
|
)
|
||||||
|
.fetch_one(pool)
|
||||||
|
.await
|
||||||
|
.context("Failed to insert plugin_world")
|
||||||
|
}
|
35
src/models/world.rs
Normal file
35
src/models/world.rs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
use anyhow::{Context, Result};
|
||||||
|
use chrono::NaiveDateTime;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use tracing::instrument;
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct World {
|
||||||
|
pub id: i32,
|
||||||
|
pub form_id: i32,
|
||||||
|
pub master: String,
|
||||||
|
pub updated_at: NaiveDateTime,
|
||||||
|
pub created_at: NaiveDateTime,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[instrument(level = "debug", skip(pool))]
|
||||||
|
pub async fn insert(
|
||||||
|
pool: &sqlx::Pool<sqlx::Postgres>,
|
||||||
|
form_id: i32,
|
||||||
|
master: &str,
|
||||||
|
) -> Result<World> {
|
||||||
|
sqlx::query_as!(
|
||||||
|
World,
|
||||||
|
"INSERT INTO worlds
|
||||||
|
(form_id, master, created_at, updated_at)
|
||||||
|
VALUES ($1, $2, now(), now())
|
||||||
|
ON CONFLICT (form_id, master) DO UPDATE
|
||||||
|
SET updated_at = now()
|
||||||
|
RETURNING *",
|
||||||
|
form_id,
|
||||||
|
master
|
||||||
|
)
|
||||||
|
.fetch_one(pool)
|
||||||
|
.await
|
||||||
|
.context("Failed to insert world")
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user