fix: correct generate endpoint return type, migration server_default SQL, and auth loading propagation
This commit is contained in:
@@ -30,7 +30,7 @@ def upgrade() -> None:
|
|||||||
"configs",
|
"configs",
|
||||||
sa.Column("id", sa.Integer, primary_key=True),
|
sa.Column("id", sa.Integer, primary_key=True),
|
||||||
sa.Column("name", sa.String(128), nullable=False),
|
sa.Column("name", sa.String(128), nullable=False),
|
||||||
sa.Column("description", sa.Text, server_default=""),
|
sa.Column("description", sa.Text, server_default="''"),
|
||||||
sa.Column("is_active", sa.Boolean, server_default="true"),
|
sa.Column("is_active", sa.Boolean, server_default="true"),
|
||||||
sa.Column("created_at", sa.DateTime, server_default=sa.func.now()),
|
sa.Column("created_at", sa.DateTime, server_default=sa.func.now()),
|
||||||
sa.Column("updated_at", sa.DateTime, server_default=sa.func.now()),
|
sa.Column("updated_at", sa.DateTime, server_default=sa.func.now()),
|
||||||
@@ -42,7 +42,7 @@ def upgrade() -> None:
|
|||||||
sa.Column("config_id", sa.Integer, sa.ForeignKey("configs.id"), nullable=False),
|
sa.Column("config_id", sa.Integer, sa.ForeignKey("configs.id"), nullable=False),
|
||||||
sa.Column("name", sa.String(32), nullable=False),
|
sa.Column("name", sa.String(32), nullable=False),
|
||||||
sa.Column("type", sa.String(16), nullable=False),
|
sa.Column("type", sa.String(16), nullable=False),
|
||||||
sa.Column("options", sa.Text, server_default=""),
|
sa.Column("options", sa.Text, server_default="''"),
|
||||||
sa.UniqueConstraint("config_id", "name", name="uq_zone_name_per_config"),
|
sa.UniqueConstraint("config_id", "name", name="uq_zone_name_per_config"),
|
||||||
)
|
)
|
||||||
op.create_table(
|
op.create_table(
|
||||||
@@ -51,7 +51,7 @@ def upgrade() -> None:
|
|||||||
sa.Column("config_id", sa.Integer, sa.ForeignKey("configs.id"), nullable=False),
|
sa.Column("config_id", sa.Integer, sa.ForeignKey("configs.id"), nullable=False),
|
||||||
sa.Column("name", sa.String(32), nullable=False),
|
sa.Column("name", sa.String(32), nullable=False),
|
||||||
sa.Column("zone_id", sa.Integer, sa.ForeignKey("zones.id"), nullable=False),
|
sa.Column("zone_id", sa.Integer, sa.ForeignKey("zones.id"), nullable=False),
|
||||||
sa.Column("options", sa.Text, server_default=""),
|
sa.Column("options", sa.Text, server_default="''"),
|
||||||
)
|
)
|
||||||
op.create_table(
|
op.create_table(
|
||||||
"policies",
|
"policies",
|
||||||
@@ -60,8 +60,8 @@ def upgrade() -> None:
|
|||||||
sa.Column("src_zone_id", sa.Integer, sa.ForeignKey("zones.id"), nullable=False),
|
sa.Column("src_zone_id", sa.Integer, sa.ForeignKey("zones.id"), nullable=False),
|
||||||
sa.Column("dst_zone_id", sa.Integer, sa.ForeignKey("zones.id"), nullable=False),
|
sa.Column("dst_zone_id", sa.Integer, sa.ForeignKey("zones.id"), nullable=False),
|
||||||
sa.Column("policy", sa.String(16), nullable=False),
|
sa.Column("policy", sa.String(16), nullable=False),
|
||||||
sa.Column("log_level", sa.String(16), server_default=""),
|
sa.Column("log_level", sa.String(16), server_default="''"),
|
||||||
sa.Column("comment", sa.Text, server_default=""),
|
sa.Column("comment", sa.Text, server_default="''"),
|
||||||
sa.Column("position", sa.Integer, server_default="0"),
|
sa.Column("position", sa.Integer, server_default="0"),
|
||||||
)
|
)
|
||||||
op.create_table(
|
op.create_table(
|
||||||
@@ -71,12 +71,12 @@ def upgrade() -> None:
|
|||||||
sa.Column("action", sa.String(32), nullable=False),
|
sa.Column("action", sa.String(32), nullable=False),
|
||||||
sa.Column("src_zone_id", sa.Integer, sa.ForeignKey("zones.id"), nullable=True),
|
sa.Column("src_zone_id", sa.Integer, sa.ForeignKey("zones.id"), nullable=True),
|
||||||
sa.Column("dst_zone_id", sa.Integer, sa.ForeignKey("zones.id"), nullable=True),
|
sa.Column("dst_zone_id", sa.Integer, sa.ForeignKey("zones.id"), nullable=True),
|
||||||
sa.Column("src_ip", sa.String(64), server_default=""),
|
sa.Column("src_ip", sa.String(64), server_default="''"),
|
||||||
sa.Column("dst_ip", sa.String(64), server_default=""),
|
sa.Column("dst_ip", sa.String(64), server_default="''"),
|
||||||
sa.Column("proto", sa.String(16), server_default=""),
|
sa.Column("proto", sa.String(16), server_default="''"),
|
||||||
sa.Column("dport", sa.String(64), server_default=""),
|
sa.Column("dport", sa.String(64), server_default="''"),
|
||||||
sa.Column("sport", sa.String(64), server_default=""),
|
sa.Column("sport", sa.String(64), server_default="''"),
|
||||||
sa.Column("comment", sa.Text, server_default=""),
|
sa.Column("comment", sa.Text, server_default="''"),
|
||||||
sa.Column("position", sa.Integer, server_default="0"),
|
sa.Column("position", sa.Integer, server_default="0"),
|
||||||
)
|
)
|
||||||
op.create_table(
|
op.create_table(
|
||||||
@@ -85,8 +85,8 @@ def upgrade() -> None:
|
|||||||
sa.Column("config_id", sa.Integer, sa.ForeignKey("configs.id"), nullable=False),
|
sa.Column("config_id", sa.Integer, sa.ForeignKey("configs.id"), nullable=False),
|
||||||
sa.Column("source_network", sa.String(64), nullable=False),
|
sa.Column("source_network", sa.String(64), nullable=False),
|
||||||
sa.Column("out_interface", sa.String(32), nullable=False),
|
sa.Column("out_interface", sa.String(32), nullable=False),
|
||||||
sa.Column("to_address", sa.String(64), server_default=""),
|
sa.Column("to_address", sa.String(64), server_default="''"),
|
||||||
sa.Column("comment", sa.Text, server_default=""),
|
sa.Column("comment", sa.Text, server_default="''"),
|
||||||
)
|
)
|
||||||
|
|
||||||
# --- Seed data ---
|
# --- Seed data ---
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ def generate_config(
|
|||||||
format: str = "json",
|
format: str = "json",
|
||||||
db: Session = Depends(get_db),
|
db: Session = Depends(get_db),
|
||||||
current_user: models.User = Depends(get_current_user),
|
current_user: models.User = Depends(get_current_user),
|
||||||
) -> Response:
|
):
|
||||||
config = (
|
config = (
|
||||||
db.query(models.Config)
|
db.query(models.Config)
|
||||||
.options(
|
.options(
|
||||||
|
|||||||
@@ -10,20 +10,22 @@ export interface User {
|
|||||||
|
|
||||||
// Simple module-level state (no external lib needed)
|
// Simple module-level state (no external lib needed)
|
||||||
let currentUser: User | null = null
|
let currentUser: User | null = null
|
||||||
|
let isLoading = true
|
||||||
|
let fetchPromise: Promise<void> | null = null
|
||||||
const listeners = new Set<() => void>()
|
const listeners = new Set<() => void>()
|
||||||
|
|
||||||
export function useAuth() {
|
export function useAuth() {
|
||||||
const [user, setUser] = useState<User | null>(currentUser)
|
const [user, setUser] = useState<User | null>(currentUser)
|
||||||
const [loading, setLoading] = useState(currentUser === null)
|
const [loading, setLoading] = useState(isLoading)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const update = () => setUser(currentUser)
|
const update = () => { setUser(currentUser); setLoading(isLoading) }
|
||||||
listeners.add(update)
|
listeners.add(update)
|
||||||
if (currentUser === null) {
|
if (!fetchPromise) {
|
||||||
authApi.me()
|
fetchPromise = authApi.me()
|
||||||
.then((res) => { currentUser = res.data; listeners.forEach((l) => l()) })
|
.then((res) => { currentUser = res.data })
|
||||||
.catch(() => { currentUser = null; listeners.forEach((l) => l()) })
|
.catch(() => { currentUser = null })
|
||||||
.finally(() => setLoading(false))
|
.finally(() => { isLoading = false; listeners.forEach((l) => l()) })
|
||||||
}
|
}
|
||||||
return () => { listeners.delete(update) }
|
return () => { listeners.delete(update) }
|
||||||
}, [])
|
}, [])
|
||||||
|
|||||||
Reference in New Issue
Block a user