Cleanup types
This commit is contained in:
2
AGENT.md
2
AGENT.md
@@ -59,7 +59,7 @@ bloop/
|
|||||||
|
|
||||||
ts-rs allows you to derive TypeScript types from Rust structs/enums. By annotating your Rust types with #[derive(TS)] and related macros, ts-rs will generate .ts declaration files for those types.
|
ts-rs allows you to derive TypeScript types from Rust structs/enums. By annotating your Rust types with #[derive(TS)] and related macros, ts-rs will generate .ts declaration files for those types.
|
||||||
When making changes to the types, you can regenerate them using `npm run generate-types`
|
When making changes to the types, you can regenerate them using `npm run generate-types`
|
||||||
Do not manually edit shared/types.ts
|
Do not manually edit shared/types.ts, instead edit backend/src/bin/generate_types.rs
|
||||||
|
|
||||||
# Working on the frontend AND the backend
|
# Working on the frontend AND the backend
|
||||||
|
|
||||||
|
|||||||
@@ -31,39 +31,39 @@ fn main() {
|
|||||||
r#"// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
r#"// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
||||||
// Auto-generated from Rust backend types using ts-rs
|
// Auto-generated from Rust backend types using ts-rs
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
|
|
||||||
{}
|
export {}
|
||||||
"#,
|
"#,
|
||||||
bloop_backend::models::ApiResponse::<()>::decl(),
|
bloop_backend::models::ApiResponse::<()>::decl(),
|
||||||
bloop_backend::models::project::CreateProject::decl(),
|
bloop_backend::models::project::CreateProject::decl(),
|
||||||
bloop_backend::models::project::Project::decl(),
|
bloop_backend::models::project::Project::decl(),
|
||||||
bloop_backend::models::project::UpdateProject::decl(),
|
bloop_backend::models::project::UpdateProject::decl(),
|
||||||
bloop_backend::models::task::CreateTask::decl(),
|
bloop_backend::models::task::CreateTask::decl(),
|
||||||
bloop_backend::models::task::Task::decl(),
|
|
||||||
bloop_backend::models::task::TaskStatus::decl(),
|
bloop_backend::models::task::TaskStatus::decl(),
|
||||||
|
bloop_backend::models::task::Task::decl(),
|
||||||
bloop_backend::models::task::UpdateTask::decl(),
|
bloop_backend::models::task::UpdateTask::decl(),
|
||||||
bloop_backend::models::user::CreateUser::decl(),
|
bloop_backend::models::user::CreateUser::decl(),
|
||||||
bloop_backend::models::user::LoginRequest::decl(),
|
bloop_backend::models::user::LoginRequest::decl(),
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { Input } from '@/components/ui/input'
|
|||||||
import { Label } from '@/components/ui/label'
|
import { Label } from '@/components/ui/label'
|
||||||
import { Alert, AlertDescription } from '@/components/ui/alert'
|
import { Alert, AlertDescription } from '@/components/ui/alert'
|
||||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
||||||
import { LoginRequest, LoginResponse, ApiResponse } from '@/types'
|
import { LoginRequest, LoginResponse, ApiResponse } from 'shared/types'
|
||||||
import { useAuth } from '@/contexts/auth-context'
|
import { useAuth } from '@/contexts/auth-context'
|
||||||
import { LogIn, AlertCircle } from 'lucide-react'
|
import { LogIn, AlertCircle } from 'lucide-react'
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { Button } from '@/components/ui/button'
|
|||||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
||||||
import { Badge } from '@/components/ui/badge'
|
import { Badge } from '@/components/ui/badge'
|
||||||
import { Alert, AlertDescription } from '@/components/ui/alert'
|
import { Alert, AlertDescription } from '@/components/ui/alert'
|
||||||
import { Project, ApiResponse } from '@/types'
|
import { Project, ApiResponse } from 'shared/types'
|
||||||
import { ProjectForm } from './project-form'
|
import { ProjectForm } from './project-form'
|
||||||
import { makeAuthenticatedRequest } from '@/lib/auth'
|
import { makeAuthenticatedRequest } from '@/lib/auth'
|
||||||
import { ArrowLeft, Edit, Trash2, Calendar, Clock, User, AlertCircle, Loader2, CheckSquare } from 'lucide-react'
|
import { ArrowLeft, Edit, Trash2, Calendar, Clock, User, AlertCircle, Loader2, CheckSquare } from 'lucide-react'
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { Input } from '@/components/ui/input'
|
|||||||
import { Label } from '@/components/ui/label'
|
import { Label } from '@/components/ui/label'
|
||||||
import { Alert, AlertDescription } from '@/components/ui/alert'
|
import { Alert, AlertDescription } from '@/components/ui/alert'
|
||||||
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'
|
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'
|
||||||
import { Project, CreateProject, UpdateProject } from '@/types'
|
import { Project, CreateProject, UpdateProject } from 'shared/types'
|
||||||
import { AlertCircle } from 'lucide-react'
|
import { AlertCircle } from 'lucide-react'
|
||||||
import { makeAuthenticatedRequest } from '@/lib/auth'
|
import { makeAuthenticatedRequest } from '@/lib/auth'
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { Button } from '@/components/ui/button'
|
|||||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
||||||
import { Badge } from '@/components/ui/badge'
|
import { Badge } from '@/components/ui/badge'
|
||||||
import { Alert, AlertDescription } from '@/components/ui/alert'
|
import { Alert, AlertDescription } from '@/components/ui/alert'
|
||||||
import { Project, ApiResponse } from '@/types'
|
import { Project, ApiResponse } from 'shared/types'
|
||||||
import { ProjectForm } from './project-form'
|
import { ProjectForm } from './project-form'
|
||||||
import { makeAuthenticatedRequest } from '@/lib/auth'
|
import { makeAuthenticatedRequest } from '@/lib/auth'
|
||||||
import { Plus, Edit, Trash2, Calendar, AlertCircle, Loader2, CheckSquare } from 'lucide-react'
|
import { Plus, Edit, Trash2, Calendar, AlertCircle, Loader2, CheckSquare } from 'lucide-react'
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { Input } from '@/components/ui/input'
|
|||||||
import { Label } from '@/components/ui/label'
|
import { Label } from '@/components/ui/label'
|
||||||
import { Alert, AlertDescription } from '@/components/ui/alert'
|
import { Alert, AlertDescription } from '@/components/ui/alert'
|
||||||
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'
|
import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'
|
||||||
import { User, CreateUser, UpdateUser } from '@/types'
|
import { User, CreateUser, UpdateUser } from 'shared/types'
|
||||||
import { makeAuthenticatedRequest, authStorage } from '@/lib/auth'
|
import { makeAuthenticatedRequest, authStorage } from '@/lib/auth'
|
||||||
import { AlertCircle } from 'lucide-react'
|
import { AlertCircle } from 'lucide-react'
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Button } from '@/components/ui/button'
|
|||||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
||||||
import { Badge } from '@/components/ui/badge'
|
import { Badge } from '@/components/ui/badge'
|
||||||
import { Alert, AlertDescription } from '@/components/ui/alert'
|
import { Alert, AlertDescription } from '@/components/ui/alert'
|
||||||
import { User, ApiResponse } from '@/types'
|
import { User, ApiResponse } from 'shared/types'
|
||||||
import { UserForm } from './user-form'
|
import { UserForm } from './user-form'
|
||||||
import { makeAuthenticatedRequest, authStorage } from '@/lib/auth'
|
import { makeAuthenticatedRequest, authStorage } from '@/lib/auth'
|
||||||
import { Plus, Edit, Trash2, Calendar, AlertCircle, Loader2, Shield, User as UserIcon } from 'lucide-react'
|
import { Plus, Edit, Trash2, Calendar, AlertCircle, Loader2, Shield, User as UserIcon } from 'lucide-react'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { createContext, useContext, useState, useEffect, ReactNode } from 'react'
|
import { createContext, useContext, useState, useEffect, ReactNode } from 'react'
|
||||||
import { isAuthenticated, authStorage, makeAuthenticatedRequest } from '@/lib/auth'
|
import { isAuthenticated, authStorage, makeAuthenticatedRequest } from '@/lib/auth'
|
||||||
import { User } from '@/types'
|
import { User } from 'shared/types'
|
||||||
|
|
||||||
interface AuthContextType {
|
interface AuthContextType {
|
||||||
user: User | null
|
user: User | null
|
||||||
@@ -39,7 +39,9 @@ export function AuthProvider({ children }: AuthProviderProps) {
|
|||||||
const userData: User = {
|
const userData: User = {
|
||||||
id: data.data.user_id,
|
id: data.data.user_id,
|
||||||
email: data.data.email,
|
email: data.data.email,
|
||||||
is_admin: data.data.is_admin || false
|
is_admin: data.data.is_admin || false,
|
||||||
|
created_at: new Date(),
|
||||||
|
updated_at: new Date()
|
||||||
}
|
}
|
||||||
authStorage.setUser(userData)
|
authStorage.setUser(userData)
|
||||||
setUser(userData)
|
setUser(userData)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { User } from '@/types'
|
import { User } from 'shared/types'
|
||||||
|
|
||||||
const TOKEN_KEY = 'auth_token'
|
const TOKEN_KEY = 'auth_token'
|
||||||
const USER_KEY = 'auth_user'
|
const USER_KEY = 'auth_user'
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import {
|
|||||||
} from "@/components/ui/card";
|
} from "@/components/ui/card";
|
||||||
import { Alert, AlertDescription } from "@/components/ui/alert";
|
import { Alert, AlertDescription } from "@/components/ui/alert";
|
||||||
import { Badge } from "@/components/ui/badge";
|
import { Badge } from "@/components/ui/badge";
|
||||||
import { ApiResponse } from "@/types";
|
import { ApiResponse } from "shared/types";
|
||||||
import { authStorage, makeAuthenticatedRequest } from "@/lib/auth";
|
import { authStorage, makeAuthenticatedRequest } from "@/lib/auth";
|
||||||
import {
|
import {
|
||||||
Heart,
|
Heart,
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ import {
|
|||||||
KanbanCard,
|
KanbanCard,
|
||||||
type DragEndEvent
|
type DragEndEvent
|
||||||
} from '@/components/ui/shadcn-io/kanban'
|
} from '@/components/ui/shadcn-io/kanban'
|
||||||
import type { TaskStatus } from '@/types'
|
import type { TaskStatus } from 'shared/types'
|
||||||
|
|
||||||
interface Task {
|
interface Task {
|
||||||
id: string
|
id: string
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Button } from '@/components/ui/button'
|
|||||||
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
|
||||||
import { Badge } from '@/components/ui/badge'
|
import { Badge } from '@/components/ui/badge'
|
||||||
import { Alert, AlertDescription } from '@/components/ui/alert'
|
import { Alert, AlertDescription } from '@/components/ui/alert'
|
||||||
import { User, ApiResponse } from '@/types'
|
import { User, ApiResponse } from 'shared/types'
|
||||||
import { UserForm } from '@/components/users/user-form'
|
import { UserForm } from '@/components/users/user-form'
|
||||||
import { makeAuthenticatedRequest, authStorage } from '@/lib/auth'
|
import { makeAuthenticatedRequest, authStorage } from '@/lib/auth'
|
||||||
import { Plus, Edit, Trash2, Calendar, AlertCircle, Loader2, Shield, User as UserIcon } from 'lucide-react'
|
import { Plus, Edit, Trash2, Calendar, AlertCircle, Loader2, Shield, User as UserIcon } from 'lucide-react'
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
// Shared types for the frontend application
|
|
||||||
export interface User {
|
|
||||||
id: string
|
|
||||||
email: string
|
|
||||||
is_admin: boolean
|
|
||||||
created_at?: Date
|
|
||||||
updated_at?: Date
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ApiResponse<T> {
|
|
||||||
success: boolean
|
|
||||||
data: T | null
|
|
||||||
message: string | null
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface LoginRequest {
|
|
||||||
email: string
|
|
||||||
password: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface LoginResponse {
|
|
||||||
user: User
|
|
||||||
token: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Project {
|
|
||||||
id: string
|
|
||||||
name: string
|
|
||||||
owner_id: string
|
|
||||||
created_at: Date
|
|
||||||
updated_at: Date
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CreateProject {
|
|
||||||
name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UpdateProject {
|
|
||||||
name: string | null
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Task {
|
|
||||||
id: string
|
|
||||||
project_id: string
|
|
||||||
title: string
|
|
||||||
description: string | null
|
|
||||||
status: TaskStatus
|
|
||||||
created_at: string
|
|
||||||
updated_at: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export type TaskStatus = "todo" | "inprogress" | "inreview" | "done" | "cancelled"
|
|
||||||
|
|
||||||
export interface CreateTask {
|
|
||||||
project_id: string
|
|
||||||
title: string
|
|
||||||
description: string | null
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UpdateTask {
|
|
||||||
title: string | null
|
|
||||||
description: string | null
|
|
||||||
status: TaskStatus | null
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CreateUser {
|
|
||||||
email: string
|
|
||||||
password: string
|
|
||||||
is_admin: boolean | null
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UpdateUser {
|
|
||||||
email: string | null
|
|
||||||
password: string | null
|
|
||||||
is_admin: boolean | null
|
|
||||||
}
|
|
||||||
@@ -1,28 +1,28 @@
|
|||||||
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
||||||
// Auto-generated from Rust backend types using ts-rs
|
// Auto-generated from Rust backend types using ts-rs
|
||||||
|
|
||||||
type ApiResponse<T> = { success: boolean, data: T | null, message: string | null, };
|
export type ApiResponse<T> = { success: boolean, data: T | null, message: string | null, };
|
||||||
|
|
||||||
type CreateProject = { name: string, };
|
export type CreateProject = { name: string, };
|
||||||
|
|
||||||
type Project = { id: string, name: string, owner_id: string, created_at: Date, updated_at: Date, };
|
export type Project = { id: string, name: string, owner_id: string, created_at: Date, updated_at: Date, };
|
||||||
|
|
||||||
type UpdateProject = { name: string | null, };
|
export type UpdateProject = { name: string | null, };
|
||||||
|
|
||||||
type CreateTask = { project_id: string, title: string, description: string | null, };
|
export type CreateTask = { project_id: string, title: string, description: string | null, };
|
||||||
|
|
||||||
type Task = { id: string, project_id: string, title: string, description: string | null, status: TaskStatus, created_at: string, updated_at: string, };
|
export type TaskStatus = "todo" | "inprogress" | "inreview" | "done" | "cancelled";
|
||||||
|
|
||||||
type TaskStatus = "todo" | "inprogress" | "inreview" | "done" | "cancelled";
|
export type Task = { id: string, project_id: string, title: string, description: string | null, status: TaskStatus, created_at: string, updated_at: string, };
|
||||||
|
|
||||||
type UpdateTask = { title: string | null, description: string | null, status: TaskStatus | null, };
|
export type UpdateTask = { title: string | null, description: string | null, status: TaskStatus | null, };
|
||||||
|
|
||||||
type CreateUser = { email: string, password: string, is_admin: boolean | null, };
|
export type CreateUser = { email: string, password: string, is_admin: boolean | null, };
|
||||||
|
|
||||||
type LoginRequest = { email: string, password: string, };
|
export type LoginRequest = { email: string, password: string, };
|
||||||
|
|
||||||
type LoginResponse = { user: User, token: string, };
|
export type LoginResponse = { user: User, token: string, };
|
||||||
|
|
||||||
type UpdateUser = { email: string | null, password: string | null, is_admin: boolean | null, };
|
export type UpdateUser = { email: string | null, password: string | null, is_admin: boolean | null, };
|
||||||
|
|
||||||
type User = { id: string, email: string, is_admin: boolean, created_at: Date, updated_at: Date, };
|
export type User = { id: string, email: string, is_admin: boolean, created_at: Date, updated_at: Date, };
|
||||||
|
|||||||
Reference in New Issue
Block a user