feat: create user if not exist
This commit is contained in:
@@ -1,4 +1,7 @@
|
|||||||
use ipc_types::{blob::IBlobParameters, document::IDocumentParameters, workspace::IWorkspaceParameters};
|
use ipc_types::{
|
||||||
|
blob::IBlobParameters, document::IDocumentParameters, user::IUserParameters,
|
||||||
|
workspace::IWorkspaceParameters,
|
||||||
|
};
|
||||||
/**
|
/**
|
||||||
* convert serde to jsonschema: https://imfeld.dev/writing/generating_typescript_types_from_rust
|
* convert serde to jsonschema: https://imfeld.dev/writing/generating_typescript_types_from_rust
|
||||||
* with way to optimize
|
* with way to optimize
|
||||||
@@ -30,4 +33,5 @@ fn main() {
|
|||||||
generate::<IDocumentParameters>(Path::join(&data_center_ipc_type_folder, "document.json"));
|
generate::<IDocumentParameters>(Path::join(&data_center_ipc_type_folder, "document.json"));
|
||||||
generate::<IWorkspaceParameters>(Path::join(&data_center_ipc_type_folder, "workspace.json"));
|
generate::<IWorkspaceParameters>(Path::join(&data_center_ipc_type_folder, "workspace.json"));
|
||||||
generate::<IBlobParameters>(Path::join(&data_center_ipc_type_folder, "blob.json"));
|
generate::<IBlobParameters>(Path::join(&data_center_ipc_type_folder, "blob.json"));
|
||||||
|
generate::<IUserParameters>(Path::join(&data_center_ipc_type_folder, "user.json"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
pub mod blob;
|
pub mod blob;
|
||||||
pub mod workspace;
|
pub mod workspace;
|
||||||
pub mod document;
|
pub mod document;
|
||||||
|
pub mod user;
|
||||||
|
|
||||||
use blob::*;
|
use blob::*;
|
||||||
use workspace::*;
|
use workspace::*;
|
||||||
use document::*;
|
use document::*;
|
||||||
|
use user::*;
|
||||||
|
|
||||||
pub fn invoke_handler() -> impl Fn(tauri::Invoke) + Send + Sync + 'static {
|
pub fn invoke_handler() -> impl Fn(tauri::Invoke) + Send + Sync + 'static {
|
||||||
tauri::generate_handler![
|
tauri::generate_handler![
|
||||||
@@ -13,6 +15,7 @@ pub fn invoke_handler() -> impl Fn(tauri::Invoke) + Send + Sync + 'static {
|
|||||||
update_workspace,
|
update_workspace,
|
||||||
get_workspaces,
|
get_workspaces,
|
||||||
get_workspace,
|
get_workspace,
|
||||||
|
create_user,
|
||||||
get_doc,
|
get_doc,
|
||||||
put_blob,
|
put_blob,
|
||||||
get_blob
|
get_blob
|
||||||
|
|||||||
25
client-app/src-tauri/src/commands/user.rs
Normal file
25
client-app/src-tauri/src/commands/user.rs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
use jwst_storage::{CreateUser, User};
|
||||||
|
|
||||||
|
use crate::state::AppState;
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
/// create yDoc for a workspace
|
||||||
|
pub async fn create_user<'s>(
|
||||||
|
state: tauri::State<'s, AppState>,
|
||||||
|
parameters: CreateUser,
|
||||||
|
) -> Result<User, String> {
|
||||||
|
match &state
|
||||||
|
.0
|
||||||
|
.lock()
|
||||||
|
.await
|
||||||
|
.metadata_db
|
||||||
|
.create_user(parameters.clone())
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Ok(new_user_option) => match new_user_option {
|
||||||
|
Some(new_user) => Ok(new_user.clone()),
|
||||||
|
None => Err("User creation failed".to_string()),
|
||||||
|
},
|
||||||
|
Err(error_message) => Err(error_message.to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,3 +6,4 @@ extern crate jwst_storage;
|
|||||||
pub mod blob;
|
pub mod blob;
|
||||||
pub mod document;
|
pub mod document;
|
||||||
pub mod workspace;
|
pub mod workspace;
|
||||||
|
pub mod user;
|
||||||
|
|||||||
9
client-app/src-tauri/types/src/user.rs
Normal file
9
client-app/src-tauri/types/src/user.rs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
use jwst_storage::{CreateUser, User};
|
||||||
|
use schemars::JsonSchema;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
|
pub enum IUserParameters {
|
||||||
|
CreateUser(CreateUser),
|
||||||
|
User(User),
|
||||||
|
}
|
||||||
@@ -47,8 +47,9 @@ export class DataCenter {
|
|||||||
) {
|
) {
|
||||||
const { TauriIPCProvider } = await import('./provider/tauri-ipc');
|
const { TauriIPCProvider } = await import('./provider/tauri-ipc');
|
||||||
dc.registerProvider(new TauriIPCProvider(getInitParams()));
|
dc.registerProvider(new TauriIPCProvider(getInitParams()));
|
||||||
}
|
} else {
|
||||||
dc.registerProvider(new LocalProvider(getInitParams()));
|
dc.registerProvider(new LocalProvider(getInitParams()));
|
||||||
|
}
|
||||||
dc.registerProvider(new AffineProvider(getInitParams()));
|
dc.registerProvider(new AffineProvider(getInitParams()));
|
||||||
|
|
||||||
return dc;
|
return dc;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import { WorkspaceMeta, WorkspaceInfo } from '../../types';
|
|||||||
import { IPCBlobProvider } from './blocksuite-provider/blob.js';
|
import { IPCBlobProvider } from './blocksuite-provider/blob.js';
|
||||||
import { WorkspaceDetail } from '../affine/apis/workspace.js';
|
import { WorkspaceDetail } from '../affine/apis/workspace.js';
|
||||||
import { setDefaultAvatar } from '../utils.js';
|
import { setDefaultAvatar } from '../utils.js';
|
||||||
|
import { User } from './ipc/types/user.js';
|
||||||
|
|
||||||
export class TauriIPCProvider extends LocalProvider {
|
export class TauriIPCProvider extends LocalProvider {
|
||||||
static id = 'tauri-ipc';
|
static id = 'tauri-ipc';
|
||||||
@@ -18,6 +19,7 @@ export class TauriIPCProvider extends LocalProvider {
|
|||||||
constructor(params: ProviderConstructorParams) {
|
constructor(params: ProviderConstructorParams) {
|
||||||
super(params);
|
super(params);
|
||||||
// TODO: let blocksuite's blob provider get blob receive workspace id. Currently, all blobs are placed together
|
// TODO: let blocksuite's blob provider get blob receive workspace id. Currently, all blobs are placed together
|
||||||
|
this.loadWorkspaces();
|
||||||
}
|
}
|
||||||
|
|
||||||
async init() {
|
async init() {
|
||||||
@@ -111,7 +113,7 @@ export class TauriIPCProvider extends LocalProvider {
|
|||||||
owner: undefined,
|
owner: undefined,
|
||||||
isLocal: true,
|
isLocal: true,
|
||||||
memberCount: 1,
|
memberCount: 1,
|
||||||
provider: 'affine',
|
provider: this.id,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!blocksuiteWorkspace.meta.avatar) {
|
if (!blocksuiteWorkspace.meta.avatar) {
|
||||||
@@ -124,15 +126,29 @@ export class TauriIPCProvider extends LocalProvider {
|
|||||||
|
|
||||||
override async loadWorkspaces() {
|
override async loadWorkspaces() {
|
||||||
// TODO: get user id here
|
// TODO: get user id here
|
||||||
|
// try create a default user, otherwise getWorkspaces will failed due to user not exists
|
||||||
|
let createdUserID = 0;
|
||||||
|
try {
|
||||||
|
const user = await ipcMethods.createUser({
|
||||||
|
email: 'xxx@xx.xx',
|
||||||
|
name: 'xxx',
|
||||||
|
password: 'xxx',
|
||||||
|
avatar_url: '',
|
||||||
|
});
|
||||||
|
createdUserID = user.id;
|
||||||
|
} catch (error) {
|
||||||
|
// maybe user existed, which can be omited
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
const { workspaces: workspacesList } = await ipcMethods.getWorkspaces({
|
const { workspaces: workspacesList } = await ipcMethods.getWorkspaces({
|
||||||
user_id: 0,
|
user_id: createdUserID,
|
||||||
});
|
});
|
||||||
const workspaces: WorkspaceInfo[] = workspacesList.map(w => {
|
const workspaces: WorkspaceInfo[] = workspacesList.map(w => {
|
||||||
return {
|
return {
|
||||||
...w,
|
...w,
|
||||||
memberCount: 0,
|
memberCount: 0,
|
||||||
name: '',
|
name: '',
|
||||||
provider: 'affine',
|
provider: this.id,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
const workspaceInstances = workspaces.map(({ id }) => {
|
const workspaceInstances = workspaces.map(({ id }) => {
|
||||||
|
|||||||
@@ -11,8 +11,10 @@ import {
|
|||||||
GetWorkspaceResult,
|
GetWorkspaceResult,
|
||||||
GetWorkspaces,
|
GetWorkspaces,
|
||||||
GetWorkspacesResult,
|
GetWorkspacesResult,
|
||||||
|
User,
|
||||||
} from './types/workspace';
|
} from './types/workspace';
|
||||||
import { GetBlob, PutBlob } from './types/blob';
|
import { GetBlob, PutBlob } from './types/blob';
|
||||||
|
import { CreateUser } from './types/user';
|
||||||
|
|
||||||
export const updateYDocument = async (parameters: YDocumentUpdate) =>
|
export const updateYDocument = async (parameters: YDocumentUpdate) =>
|
||||||
await invoke<boolean>('update_y_document', {
|
await invoke<boolean>('update_y_document', {
|
||||||
@@ -48,3 +50,8 @@ export const getBlob = async (parameters: GetBlob) =>
|
|||||||
await invoke<number[]>('get_blob', {
|
await invoke<number[]>('get_blob', {
|
||||||
parameters,
|
parameters,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const createUser = async (parameters: CreateUser) =>
|
||||||
|
await invoke<User>('create_user', {
|
||||||
|
parameters,
|
||||||
|
});
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "IUserParameters",
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": ["CreateUser"],
|
||||||
|
"properties": {
|
||||||
|
"CreateUser": {
|
||||||
|
"$ref": "#/definitions/CreateUser"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": ["User"],
|
||||||
|
"properties": {
|
||||||
|
"User": {
|
||||||
|
"$ref": "#/definitions/User"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"definitions": {
|
||||||
|
"CreateUser": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["email", "name", "password"],
|
||||||
|
"properties": {
|
||||||
|
"avatar_url": {
|
||||||
|
"type": ["string", "null"]
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"User": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["created_at", "email", "id", "name"],
|
||||||
|
"properties": {
|
||||||
|
"avatar_url": {
|
||||||
|
"type": ["string", "null"]
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int64"
|
||||||
|
},
|
||||||
|
"email": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"type": "integer",
|
||||||
|
"format": "int32"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
/* tslint:disable */
|
||||||
|
/**
|
||||||
|
* This file was automatically generated by json-schema-to-typescript.
|
||||||
|
* DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
|
||||||
|
* and run json-schema-to-typescript to regenerate this file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export type IUserParameters =
|
||||||
|
| {
|
||||||
|
CreateUser: CreateUser;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
User: User;
|
||||||
|
};
|
||||||
|
|
||||||
|
export interface CreateUser {
|
||||||
|
avatar_url?: string | null;
|
||||||
|
email: string;
|
||||||
|
name: string;
|
||||||
|
password: string;
|
||||||
|
[k: string]: unknown;
|
||||||
|
}
|
||||||
|
export interface User {
|
||||||
|
avatar_url?: string | null;
|
||||||
|
created_at: number;
|
||||||
|
email: string;
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
[k: string]: unknown;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user