From 0e26706176184a8c908e61d5cece0f95bf940067 Mon Sep 17 00:00:00 2001 From: appflowy Date: Wed, 14 Jul 2021 08:07:25 +0800 Subject: [PATCH] add create workspace test --- .idea/appflowy_client.iml | 1 + .../protobuf/flowy-workspace/event.pb.dart | 11 + .../flowy-workspace/event.pbenum.dart | 24 ++ .../flowy-workspace/event.pbjson.dart | 20 ++ .../flowy-workspace/event.pbserver.dart | 9 + .../protobuf/flowy-workspace/protobuf.dart | 1 + .../flowy-workspace/workspace_create.pb.dart | 75 +++++ .../workspace_create.pbjson.dart | 12 + rust-lib/flowy-database/src/lib.rs | 2 +- .../src/derive_cache/derive_cache.rs | 4 +- rust-lib/flowy-infra/src/kv/kv.rs | 5 +- rust-lib/flowy-infra/src/lib.rs | 3 - rust-lib/flowy-sdk/src/module.rs | 8 +- .../flowy-user/src/sql_tables/user_table.rs | 10 +- rust-lib/flowy-workspace/Cargo.toml | 5 +- .../entities/workspace/workspace_create.rs | 16 +- rust-lib/flowy-workspace/src/event.rs | 10 + .../src/handlers/workspace_handler.rs | 15 + rust-lib/flowy-workspace/src/module.rs | 11 + .../src/protobuf/model/event.rs | 92 ++++++ .../flowy-workspace/src/protobuf/model/mod.rs | 3 + .../src/protobuf/model/workspace_create.rs | 271 +++++++++++++++++- .../src/protobuf/proto/event.proto | 5 + .../src/protobuf/proto/workspace_create.proto | 5 + .../src/services/workspace_controller.rs | 9 +- .../src/sql_tables/workspace/workspace.rs | 12 +- rust-lib/flowy-workspace/tests/event/main.rs | 1 + .../tests/event/workspace_test.rs | 20 ++ 28 files changed, 625 insertions(+), 35 deletions(-) create mode 100644 app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pb.dart create mode 100644 app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbenum.dart create mode 100644 app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbjson.dart create mode 100644 app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbserver.dart create mode 100644 rust-lib/flowy-workspace/src/protobuf/model/event.rs create mode 100644 rust-lib/flowy-workspace/src/protobuf/proto/event.proto create mode 100644 rust-lib/flowy-workspace/tests/event/main.rs create mode 100644 rust-lib/flowy-workspace/tests/event/workspace_test.rs diff --git a/.idea/appflowy_client.iml b/.idea/appflowy_client.iml index 5379054293..f33c861988 100644 --- a/.idea/appflowy_client.iml +++ b/.idea/appflowy_client.iml @@ -20,6 +20,7 @@ + diff --git a/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pb.dart b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pb.dart new file mode 100644 index 0000000000..e8db14dba5 --- /dev/null +++ b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pb.dart @@ -0,0 +1,11 @@ +/// +// Generated code. Do not modify. +// source: event.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +import 'dart:core' as $core; + +export 'event.pbenum.dart'; + diff --git a/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbenum.dart b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbenum.dart new file mode 100644 index 0000000000..343c57dc50 --- /dev/null +++ b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbenum.dart @@ -0,0 +1,24 @@ +/// +// Generated code. Do not modify. +// source: event.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields + +// ignore_for_file: UNDEFINED_SHOWN_NAME +import 'dart:core' as $core; +import 'package:protobuf/protobuf.dart' as $pb; + +class WorkspaceEvent extends $pb.ProtobufEnum { + static const WorkspaceEvent CreateWorkspace = WorkspaceEvent._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CreateWorkspace'); + + static const $core.List values = [ + CreateWorkspace, + ]; + + static final $core.Map<$core.int, WorkspaceEvent> _byValue = $pb.ProtobufEnum.initByValue(values); + static WorkspaceEvent? valueOf($core.int value) => _byValue[value]; + + const WorkspaceEvent._($core.int v, $core.String n) : super(v, n); +} + diff --git a/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbjson.dart b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbjson.dart new file mode 100644 index 0000000000..5f2eac2e84 --- /dev/null +++ b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbjson.dart @@ -0,0 +1,20 @@ +/// +// Generated code. Do not modify. +// source: event.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +import 'dart:core' as $core; +import 'dart:convert' as $convert; +import 'dart:typed_data' as $typed_data; +@$core.Deprecated('Use workspaceEventDescriptor instead') +const WorkspaceEvent$json = const { + '1': 'WorkspaceEvent', + '2': const [ + const {'1': 'CreateWorkspace', '2': 0}, + ], +}; + +/// Descriptor for `WorkspaceEvent`. Decode as a `google.protobuf.EnumDescriptorProto`. +final $typed_data.Uint8List workspaceEventDescriptor = $convert.base64Decode('Cg5Xb3Jrc3BhY2VFdmVudBITCg9DcmVhdGVXb3Jrc3BhY2UQAA=='); diff --git a/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbserver.dart b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbserver.dart new file mode 100644 index 0000000000..534f858805 --- /dev/null +++ b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/event.pbserver.dart @@ -0,0 +1,9 @@ +/// +// Generated code. Do not modify. +// source: event.proto +// +// @dart = 2.12 +// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package + +export 'event.pb.dart'; + diff --git a/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/protobuf.dart b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/protobuf.dart index 33990fca22..c2b727a826 100644 --- a/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/protobuf.dart +++ b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/protobuf.dart @@ -2,5 +2,6 @@ export './errors.pb.dart'; export './workspace_update.pb.dart'; export './app_create.pb.dart'; +export './event.pb.dart'; export './workspace_create.pb.dart'; export './app_update.pb.dart'; diff --git a/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/workspace_create.pb.dart b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/workspace_create.pb.dart index e075050fc3..7b2f9bf8d7 100644 --- a/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/workspace_create.pb.dart +++ b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/workspace_create.pb.dart @@ -70,3 +70,78 @@ class CreateWorkspaceRequest extends $pb.GeneratedMessage { void clearDesc() => clearField(2); } +class WorkspaceDetail extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'WorkspaceDetail', createEmptyInstance: create) + ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') + ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name') + ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc') + ..hasRequiredFields = false + ; + + WorkspaceDetail._() : super(); + factory WorkspaceDetail({ + $core.String? id, + $core.String? name, + $core.String? desc, + }) { + final _result = create(); + if (id != null) { + _result.id = id; + } + if (name != null) { + _result.name = name; + } + if (desc != null) { + _result.desc = desc; + } + return _result; + } + factory WorkspaceDetail.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory WorkspaceDetail.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + WorkspaceDetail clone() => WorkspaceDetail()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + WorkspaceDetail copyWith(void Function(WorkspaceDetail) updates) => super.copyWith((message) => updates(message as WorkspaceDetail)) as WorkspaceDetail; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static WorkspaceDetail create() => WorkspaceDetail._(); + WorkspaceDetail createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static WorkspaceDetail getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static WorkspaceDetail? _defaultInstance; + + @$pb.TagNumber(1) + $core.String get id => $_getSZ(0); + @$pb.TagNumber(1) + set id($core.String v) { $_setString(0, v); } + @$pb.TagNumber(1) + $core.bool hasId() => $_has(0); + @$pb.TagNumber(1) + void clearId() => clearField(1); + + @$pb.TagNumber(2) + $core.String get name => $_getSZ(1); + @$pb.TagNumber(2) + set name($core.String v) { $_setString(1, v); } + @$pb.TagNumber(2) + $core.bool hasName() => $_has(1); + @$pb.TagNumber(2) + void clearName() => clearField(2); + + @$pb.TagNumber(3) + $core.String get desc => $_getSZ(2); + @$pb.TagNumber(3) + set desc($core.String v) { $_setString(2, v); } + @$pb.TagNumber(3) + $core.bool hasDesc() => $_has(2); + @$pb.TagNumber(3) + void clearDesc() => clearField(3); +} + diff --git a/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/workspace_create.pbjson.dart b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/workspace_create.pbjson.dart index 69df155025..fcdf6d0c55 100644 --- a/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/workspace_create.pbjson.dart +++ b/app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace/workspace_create.pbjson.dart @@ -19,3 +19,15 @@ const CreateWorkspaceRequest$json = const { /// Descriptor for `CreateWorkspaceRequest`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List createWorkspaceRequestDescriptor = $convert.base64Decode('ChZDcmVhdGVXb3Jrc3BhY2VSZXF1ZXN0EhIKBG5hbWUYASABKAlSBG5hbWUSEgoEZGVzYxgCIAEoCVIEZGVzYw=='); +@$core.Deprecated('Use workspaceDetailDescriptor instead') +const WorkspaceDetail$json = const { + '1': 'WorkspaceDetail', + '2': const [ + const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, + const {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'}, + const {'1': 'desc', '3': 3, '4': 1, '5': 9, '10': 'desc'}, + ], +}; + +/// Descriptor for `WorkspaceDetail`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List workspaceDetailDescriptor = $convert.base64Decode('Cg9Xb3Jrc3BhY2VEZXRhaWwSDgoCaWQYASABKAlSAmlkEhIKBG5hbWUYAiABKAlSBG5hbWUSEgoEZGVzYxgDIAEoCVIEZGVzYw=='); diff --git a/rust-lib/flowy-database/src/lib.rs b/rust-lib/flowy-database/src/lib.rs index 9e6ed8b496..c35fc10563 100644 --- a/rust-lib/flowy-database/src/lib.rs +++ b/rust-lib/flowy-database/src/lib.rs @@ -39,6 +39,6 @@ where io::Error::new(io::ErrorKind::NotConnected, msg) } -pub trait UserDatabaseConnection { +pub trait UserDatabaseConnection: Send + Sync { fn get_connection(&self) -> Result; } diff --git a/rust-lib/flowy-derive/src/derive_cache/derive_cache.rs b/rust-lib/flowy-derive/src/derive_cache/derive_cache.rs index 739316bcb8..b79e27c164 100644 --- a/rust-lib/flowy-derive/src/derive_cache/derive_cache.rs +++ b/rust-lib/flowy-derive/src/derive_cache/derive_cache.rs @@ -21,6 +21,7 @@ pub fn category_from_str(type_str: &str) -> TypeCategory { | "UpdateAppRequest" | "UpdateWorkspaceRequest" | "CreateWorkspaceRequest" + | "WorkspaceDetail" | "WorkspaceError" | "FFIRequest" | "FFIResponse" @@ -32,7 +33,8 @@ pub fn category_from_str(type_str: &str) -> TypeCategory { | "SignInParams" | "UserError" => TypeCategory::Protobuf, - "WorkspaceErrorCode" + "WorkspaceEvent" + | "WorkspaceErrorCode" | "FFIStatusCode" | "UserStatus" | "UserEvent" diff --git a/rust-lib/flowy-infra/src/kv/kv.rs b/rust-lib/flowy-infra/src/kv/kv.rs index 08ff254545..cadc0032b8 100644 --- a/rust-lib/flowy-infra/src/kv/kv.rs +++ b/rust-lib/flowy-infra/src/kv/kv.rs @@ -4,10 +4,7 @@ use diesel::{Connection, SqliteConnection}; use flowy_derive::ProtoBuf; use flowy_sqlite::{DBConnection, Database, PoolConfig}; use lazy_static::lazy_static; -use std::{ - path::Path, - sync::{RwLock, RwLockWriteGuard}, -}; +use std::{path::Path, sync::RwLock}; const DB_NAME: &str = "kv.db"; lazy_static! { diff --git a/rust-lib/flowy-infra/src/lib.rs b/rust-lib/flowy-infra/src/lib.rs index 03efbcfac5..f34f10a55d 100644 --- a/rust-lib/flowy-infra/src/lib.rs +++ b/rust-lib/flowy-infra/src/lib.rs @@ -4,9 +4,6 @@ extern crate diesel; #[macro_use] extern crate diesel_derives; -#[macro_use] -extern crate diesel_migrations; - pub mod kv; mod protobuf; diff --git a/rust-lib/flowy-sdk/src/module.rs b/rust-lib/flowy-sdk/src/module.rs index b190baa5f5..2c45741c6f 100644 --- a/rust-lib/flowy-sdk/src/module.rs +++ b/rust-lib/flowy-sdk/src/module.rs @@ -10,8 +10,10 @@ pub struct ModuleConfig { pub fn build_modules(config: ModuleConfig) -> Vec { let user_session = Arc::new(UserSessionBuilder::new().root_dir(&config.root).build()); + let controller = Arc::new(WorkspaceController::new(user_session.clone())); - let workspace_controller = WorkspaceController::new(user_session.clone()); - - vec![flowy_user::module::create(user_session)] + vec![ + flowy_user::module::create(user_session), + flowy_workspace::module::create(controller), + ] } diff --git a/rust-lib/flowy-user/src/sql_tables/user_table.rs b/rust-lib/flowy-user/src/sql_tables/user_table.rs index 7b17a5c98a..dee641ae7b 100644 --- a/rust-lib/flowy-user/src/sql_tables/user_table.rs +++ b/rust-lib/flowy-user/src/sql_tables/user_table.rs @@ -1,19 +1,11 @@ use flowy_database::schema::user_table; -use flowy_derive::ProtoBuf; -#[derive(ProtoBuf, Clone, Default, Queryable, Identifiable, Insertable)] +#[derive(Clone, Default, Queryable, Identifiable, Insertable)] #[table_name = "user_table"] pub struct User { - #[pb(index = 1)] pub(crate) id: String, - - #[pb(index = 2)] pub(crate) name: String, - - #[pb(index = 3)] password: String, - - #[pb(index = 4)] pub(crate) email: String, } diff --git a/rust-lib/flowy-workspace/Cargo.toml b/rust-lib/flowy-workspace/Cargo.toml index 652f396d6c..aa576907a0 100644 --- a/rust-lib/flowy-workspace/Cargo.toml +++ b/rust-lib/flowy-workspace/Cargo.toml @@ -20,4 +20,7 @@ diesel_derives = {version = "1.4.1", features = ["sqlite"]} lazy_static = "1.4.0" serde = { version = "1.0", features = ["derive"] } derive_more = {version = "0.99", features = ["display"]} -bincode = { version = "1.3"} \ No newline at end of file +bincode = { version = "1.3"} + +[dev-dependencies] +flowy-test = { path = "../flowy-test" } \ No newline at end of file diff --git a/rust-lib/flowy-workspace/src/entities/workspace/workspace_create.rs b/rust-lib/flowy-workspace/src/entities/workspace/workspace_create.rs index 33dd0ec37d..b4f972297f 100644 --- a/rust-lib/flowy-workspace/src/entities/workspace/workspace_create.rs +++ b/rust-lib/flowy-workspace/src/entities/workspace/workspace_create.rs @@ -5,10 +5,10 @@ use std::convert::TryInto; #[derive(ProtoBuf, Default)] pub struct CreateWorkspaceRequest { #[pb(index = 1)] - name: String, + pub name: String, #[pb(index = 2)] - desc: String, + pub desc: String, } pub struct CreateWorkspaceParams { @@ -32,3 +32,15 @@ impl TryInto for CreateWorkspaceRequest { }) } } + +#[derive(ProtoBuf, Default, Debug)] +pub struct WorkspaceDetail { + #[pb(index = 1)] + pub id: String, + + #[pb(index = 2)] + pub name: String, + + #[pb(index = 3)] + pub desc: String, +} diff --git a/rust-lib/flowy-workspace/src/event.rs b/rust-lib/flowy-workspace/src/event.rs index e69de29bb2..f19ab12980 100644 --- a/rust-lib/flowy-workspace/src/event.rs +++ b/rust-lib/flowy-workspace/src/event.rs @@ -0,0 +1,10 @@ +use derive_more::Display; +use flowy_derive::{Flowy_Event, ProtoBuf_Enum}; + +#[derive(Clone, Copy, PartialEq, Eq, Debug, Display, Hash, ProtoBuf_Enum, Flowy_Event)] +#[event_err = "WorkspaceError"] +pub enum WorkspaceEvent { + #[display(fmt = "Create workspace")] + #[event(input = "CreateSpaceRequest", output = "WorkspaceDetail")] + CreateWorkspace = 0, +} diff --git a/rust-lib/flowy-workspace/src/handlers/workspace_handler.rs b/rust-lib/flowy-workspace/src/handlers/workspace_handler.rs index 8b13789179..4faf654c21 100644 --- a/rust-lib/flowy-workspace/src/handlers/workspace_handler.rs +++ b/rust-lib/flowy-workspace/src/handlers/workspace_handler.rs @@ -1 +1,16 @@ +use crate::{ + entities::workspace::{CreateWorkspaceParams, CreateWorkspaceRequest, WorkspaceDetail}, + errors::WorkspaceError, + services::WorkspaceController, +}; +use flowy_dispatch::prelude::{response_ok, Data, ModuleData, ResponseResult}; +use std::{convert::TryInto, sync::Arc}; +pub async fn create_workspace( + data: Data, + controller: ModuleData>, +) -> ResponseResult { + let params: CreateWorkspaceParams = data.into_inner().try_into()?; + let detail = controller.save_workspace(params)?; + response_ok(detail) +} diff --git a/rust-lib/flowy-workspace/src/module.rs b/rust-lib/flowy-workspace/src/module.rs index e69de29bb2..61dedbcf8e 100644 --- a/rust-lib/flowy-workspace/src/module.rs +++ b/rust-lib/flowy-workspace/src/module.rs @@ -0,0 +1,11 @@ +use flowy_dispatch::prelude::*; + +use crate::{event::WorkspaceEvent, handlers::create_workspace, services::WorkspaceController}; +use std::sync::Arc; + +pub fn create(controller: Arc) -> Module { + Module::new() + .name("Flowy-Workspace") + .data(controller) + .event(WorkspaceEvent::CreateWorkspace, create_workspace) +} diff --git a/rust-lib/flowy-workspace/src/protobuf/model/event.rs b/rust-lib/flowy-workspace/src/protobuf/model/event.rs new file mode 100644 index 0000000000..07e5844a3c --- /dev/null +++ b/rust-lib/flowy-workspace/src/protobuf/model/event.rs @@ -0,0 +1,92 @@ +// This file is generated by rust-protobuf 2.22.1. Do not edit +// @generated + +// https://github.com/rust-lang/rust-clippy/issues/702 +#![allow(unknown_lints)] +#![allow(clippy::all)] + +#![allow(unused_attributes)] +#![cfg_attr(rustfmt, rustfmt::skip)] + +#![allow(box_pointers)] +#![allow(dead_code)] +#![allow(missing_docs)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] +#![allow(non_upper_case_globals)] +#![allow(trivial_casts)] +#![allow(unused_imports)] +#![allow(unused_results)] +//! Generated file from `event.proto` + +/// Generated files are compatible only with the same version +/// of protobuf runtime. +// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_22_1; + +#[derive(Clone,PartialEq,Eq,Debug,Hash)] +pub enum WorkspaceEvent { + CreateWorkspace = 0, +} + +impl ::protobuf::ProtobufEnum for WorkspaceEvent { + fn value(&self) -> i32 { + *self as i32 + } + + fn from_i32(value: i32) -> ::std::option::Option { + match value { + 0 => ::std::option::Option::Some(WorkspaceEvent::CreateWorkspace), + _ => ::std::option::Option::None + } + } + + fn values() -> &'static [Self] { + static values: &'static [WorkspaceEvent] = &[ + WorkspaceEvent::CreateWorkspace, + ]; + values + } + + fn enum_descriptor_static() -> &'static ::protobuf::reflect::EnumDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::EnumDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + ::protobuf::reflect::EnumDescriptor::new_pb_name::("WorkspaceEvent", file_descriptor_proto()) + }) + } +} + +impl ::std::marker::Copy for WorkspaceEvent { +} + +impl ::std::default::Default for WorkspaceEvent { + fn default() -> Self { + WorkspaceEvent::CreateWorkspace + } +} + +impl ::protobuf::reflect::ProtobufValue for WorkspaceEvent { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Enum(::protobuf::ProtobufEnum::descriptor(self)) + } +} + +static file_descriptor_proto_data: &'static [u8] = b"\ + \n\x0bevent.proto*%\n\x0eWorkspaceEvent\x12\x13\n\x0fCreateWorkspace\x10\ + \0JS\n\x06\x12\x04\0\0\x04\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\n\n\x02\ + \x05\0\x12\x04\x02\0\x04\x01\n\n\n\x03\x05\0\x01\x12\x03\x02\x05\x13\n\ + \x0b\n\x04\x05\0\x02\0\x12\x03\x03\x04\x18\n\x0c\n\x05\x05\0\x02\0\x01\ + \x12\x03\x03\x04\x13\n\x0c\n\x05\x05\0\x02\0\x02\x12\x03\x03\x16\x17b\ + \x06proto3\ +"; + +static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; + +fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto { + ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap() +} + +pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto { + file_descriptor_proto_lazy.get(|| { + parse_descriptor_proto() + }) +} diff --git a/rust-lib/flowy-workspace/src/protobuf/model/mod.rs b/rust-lib/flowy-workspace/src/protobuf/model/mod.rs index 03761ae045..ed856a9b17 100644 --- a/rust-lib/flowy-workspace/src/protobuf/model/mod.rs +++ b/rust-lib/flowy-workspace/src/protobuf/model/mod.rs @@ -9,6 +9,9 @@ pub use workspace_update::*; mod app_create; pub use app_create::*; +mod event; +pub use event::*; + mod workspace_create; pub use workspace_create::*; diff --git a/rust-lib/flowy-workspace/src/protobuf/model/workspace_create.rs b/rust-lib/flowy-workspace/src/protobuf/model/workspace_create.rs index 1ea4968719..dd34c7851c 100644 --- a/rust-lib/flowy-workspace/src/protobuf/model/workspace_create.rs +++ b/rust-lib/flowy-workspace/src/protobuf/model/workspace_create.rs @@ -224,17 +224,272 @@ impl ::protobuf::reflect::ProtobufValue for CreateWorkspaceRequest { } } +#[derive(PartialEq,Clone,Default)] +pub struct WorkspaceDetail { + // message fields + pub id: ::std::string::String, + pub name: ::std::string::String, + pub desc: ::std::string::String, + // special fields + pub unknown_fields: ::protobuf::UnknownFields, + pub cached_size: ::protobuf::CachedSize, +} + +impl<'a> ::std::default::Default for &'a WorkspaceDetail { + fn default() -> &'a WorkspaceDetail { + ::default_instance() + } +} + +impl WorkspaceDetail { + pub fn new() -> WorkspaceDetail { + ::std::default::Default::default() + } + + // string id = 1; + + + pub fn get_id(&self) -> &str { + &self.id + } + pub fn clear_id(&mut self) { + self.id.clear(); + } + + // Param is passed by value, moved + pub fn set_id(&mut self, v: ::std::string::String) { + self.id = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_id(&mut self) -> &mut ::std::string::String { + &mut self.id + } + + // Take field + pub fn take_id(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.id, ::std::string::String::new()) + } + + // string name = 2; + + + pub fn get_name(&self) -> &str { + &self.name + } + pub fn clear_name(&mut self) { + self.name.clear(); + } + + // Param is passed by value, moved + pub fn set_name(&mut self, v: ::std::string::String) { + self.name = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_name(&mut self) -> &mut ::std::string::String { + &mut self.name + } + + // Take field + pub fn take_name(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.name, ::std::string::String::new()) + } + + // string desc = 3; + + + pub fn get_desc(&self) -> &str { + &self.desc + } + pub fn clear_desc(&mut self) { + self.desc.clear(); + } + + // Param is passed by value, moved + pub fn set_desc(&mut self, v: ::std::string::String) { + self.desc = v; + } + + // Mutable pointer to the field. + // If field is not initialized, it is initialized with default value first. + pub fn mut_desc(&mut self) -> &mut ::std::string::String { + &mut self.desc + } + + // Take field + pub fn take_desc(&mut self) -> ::std::string::String { + ::std::mem::replace(&mut self.desc, ::std::string::String::new()) + } +} + +impl ::protobuf::Message for WorkspaceDetail { + fn is_initialized(&self) -> bool { + true + } + + fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> { + while !is.eof()? { + let (field_number, wire_type) = is.read_tag_unpack()?; + match field_number { + 1 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.id)?; + }, + 2 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.name)?; + }, + 3 => { + ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.desc)?; + }, + _ => { + ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?; + }, + }; + } + ::std::result::Result::Ok(()) + } + + // Compute sizes of nested messages + #[allow(unused_variables)] + fn compute_size(&self) -> u32 { + let mut my_size = 0; + if !self.id.is_empty() { + my_size += ::protobuf::rt::string_size(1, &self.id); + } + if !self.name.is_empty() { + my_size += ::protobuf::rt::string_size(2, &self.name); + } + if !self.desc.is_empty() { + my_size += ::protobuf::rt::string_size(3, &self.desc); + } + my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields()); + self.cached_size.set(my_size); + my_size + } + + fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> { + if !self.id.is_empty() { + os.write_string(1, &self.id)?; + } + if !self.name.is_empty() { + os.write_string(2, &self.name)?; + } + if !self.desc.is_empty() { + os.write_string(3, &self.desc)?; + } + os.write_unknown_fields(self.get_unknown_fields())?; + ::std::result::Result::Ok(()) + } + + fn get_cached_size(&self) -> u32 { + self.cached_size.get() + } + + fn get_unknown_fields(&self) -> &::protobuf::UnknownFields { + &self.unknown_fields + } + + fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields { + &mut self.unknown_fields + } + + fn as_any(&self) -> &dyn (::std::any::Any) { + self as &dyn (::std::any::Any) + } + fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) { + self as &mut dyn (::std::any::Any) + } + fn into_any(self: ::std::boxed::Box) -> ::std::boxed::Box { + self + } + + fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor { + Self::descriptor_static() + } + + fn new() -> WorkspaceDetail { + WorkspaceDetail::new() + } + + fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor { + static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT; + descriptor.get(|| { + let mut fields = ::std::vec::Vec::new(); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "id", + |m: &WorkspaceDetail| { &m.id }, + |m: &mut WorkspaceDetail| { &mut m.id }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "name", + |m: &WorkspaceDetail| { &m.name }, + |m: &mut WorkspaceDetail| { &mut m.name }, + )); + fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>( + "desc", + |m: &WorkspaceDetail| { &m.desc }, + |m: &mut WorkspaceDetail| { &mut m.desc }, + )); + ::protobuf::reflect::MessageDescriptor::new_pb_name::( + "WorkspaceDetail", + fields, + file_descriptor_proto() + ) + }) + } + + fn default_instance() -> &'static WorkspaceDetail { + static instance: ::protobuf::rt::LazyV2 = ::protobuf::rt::LazyV2::INIT; + instance.get(WorkspaceDetail::new) + } +} + +impl ::protobuf::Clear for WorkspaceDetail { + fn clear(&mut self) { + self.id.clear(); + self.name.clear(); + self.desc.clear(); + self.unknown_fields.clear(); + } +} + +impl ::std::fmt::Debug for WorkspaceDetail { + fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + ::protobuf::text_format::fmt(self, f) + } +} + +impl ::protobuf::reflect::ProtobufValue for WorkspaceDetail { + fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef { + ::protobuf::reflect::ReflectValueRef::Message(self) + } +} + static file_descriptor_proto_data: &'static [u8] = b"\ \n\x16workspace_create.proto\"@\n\x16CreateWorkspaceRequest\x12\x12\n\ \x04name\x18\x01\x20\x01(\tR\x04name\x12\x12\n\x04desc\x18\x02\x20\x01(\ - \tR\x04descJ\x98\x01\n\x06\x12\x04\0\0\x05\x01\n\x08\n\x01\x0c\x12\x03\0\ - \0\x12\n\n\n\x02\x04\0\x12\x04\x02\0\x05\x01\n\n\n\x03\x04\0\x01\x12\x03\ - \x02\x08\x1e\n\x0b\n\x04\x04\0\x02\0\x12\x03\x03\x04\x14\n\x0c\n\x05\x04\ - \0\x02\0\x05\x12\x03\x03\x04\n\n\x0c\n\x05\x04\0\x02\0\x01\x12\x03\x03\ - \x0b\x0f\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x03\x12\x13\n\x0b\n\x04\x04\ - \0\x02\x01\x12\x03\x04\x04\x14\n\x0c\n\x05\x04\0\x02\x01\x05\x12\x03\x04\ - \x04\n\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03\x04\x0b\x0f\n\x0c\n\x05\x04\ - \0\x02\x01\x03\x12\x03\x04\x12\x13b\x06proto3\ + \tR\x04desc\"I\n\x0fWorkspaceDetail\x12\x0e\n\x02id\x18\x01\x20\x01(\tR\ + \x02id\x12\x12\n\x04name\x18\x02\x20\x01(\tR\x04name\x12\x12\n\x04desc\ + \x18\x03\x20\x01(\tR\x04descJ\xd5\x02\n\x06\x12\x04\0\0\n\x01\n\x08\n\ + \x01\x0c\x12\x03\0\0\x12\n\n\n\x02\x04\0\x12\x04\x02\0\x05\x01\n\n\n\x03\ + \x04\0\x01\x12\x03\x02\x08\x1e\n\x0b\n\x04\x04\0\x02\0\x12\x03\x03\x04\ + \x14\n\x0c\n\x05\x04\0\x02\0\x05\x12\x03\x03\x04\n\n\x0c\n\x05\x04\0\x02\ + \0\x01\x12\x03\x03\x0b\x0f\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x03\x12\ + \x13\n\x0b\n\x04\x04\0\x02\x01\x12\x03\x04\x04\x14\n\x0c\n\x05\x04\0\x02\ + \x01\x05\x12\x03\x04\x04\n\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03\x04\x0b\ + \x0f\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\x04\x12\x13\n\n\n\x02\x04\x01\ + \x12\x04\x06\0\n\x01\n\n\n\x03\x04\x01\x01\x12\x03\x06\x08\x17\n\x0b\n\ + \x04\x04\x01\x02\0\x12\x03\x07\x04\x12\n\x0c\n\x05\x04\x01\x02\0\x05\x12\ + \x03\x07\x04\n\n\x0c\n\x05\x04\x01\x02\0\x01\x12\x03\x07\x0b\r\n\x0c\n\ + \x05\x04\x01\x02\0\x03\x12\x03\x07\x10\x11\n\x0b\n\x04\x04\x01\x02\x01\ + \x12\x03\x08\x04\x14\n\x0c\n\x05\x04\x01\x02\x01\x05\x12\x03\x08\x04\n\n\ + \x0c\n\x05\x04\x01\x02\x01\x01\x12\x03\x08\x0b\x0f\n\x0c\n\x05\x04\x01\ + \x02\x01\x03\x12\x03\x08\x12\x13\n\x0b\n\x04\x04\x01\x02\x02\x12\x03\t\ + \x04\x14\n\x0c\n\x05\x04\x01\x02\x02\x05\x12\x03\t\x04\n\n\x0c\n\x05\x04\ + \x01\x02\x02\x01\x12\x03\t\x0b\x0f\n\x0c\n\x05\x04\x01\x02\x02\x03\x12\ + \x03\t\x12\x13b\x06proto3\ "; static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT; diff --git a/rust-lib/flowy-workspace/src/protobuf/proto/event.proto b/rust-lib/flowy-workspace/src/protobuf/proto/event.proto new file mode 100644 index 0000000000..1b4bcac07f --- /dev/null +++ b/rust-lib/flowy-workspace/src/protobuf/proto/event.proto @@ -0,0 +1,5 @@ +syntax = "proto3"; + +enum WorkspaceEvent { + CreateWorkspace = 0; +} diff --git a/rust-lib/flowy-workspace/src/protobuf/proto/workspace_create.proto b/rust-lib/flowy-workspace/src/protobuf/proto/workspace_create.proto index 798e4a2b5b..24a35cc49f 100644 --- a/rust-lib/flowy-workspace/src/protobuf/proto/workspace_create.proto +++ b/rust-lib/flowy-workspace/src/protobuf/proto/workspace_create.proto @@ -4,3 +4,8 @@ message CreateWorkspaceRequest { string name = 1; string desc = 2; } +message WorkspaceDetail { + string id = 1; + string name = 2; + string desc = 3; +} diff --git a/rust-lib/flowy-workspace/src/services/workspace_controller.rs b/rust-lib/flowy-workspace/src/services/workspace_controller.rs index 14ecc22ef7..40baf07baa 100644 --- a/rust-lib/flowy-workspace/src/services/workspace_controller.rs +++ b/rust-lib/flowy-workspace/src/services/workspace_controller.rs @@ -35,14 +35,19 @@ pub struct WorkspaceController { impl WorkspaceController { pub fn new(db: Arc) -> Self { Self { db } } - pub fn save_workspace(&self, params: CreateWorkspaceParams) -> Result<(), WorkspaceError> { + pub fn save_workspace( + &self, + params: CreateWorkspaceParams, + ) -> Result { let workspace = Workspace::new(params); let conn = self.get_connection()?; + let detail: WorkspaceDetail = workspace.clone().into(); + let _ = diesel::insert_into(workspace_table::table) .values(workspace) .execute(&*conn)?; - Ok(()) + Ok(detail) } pub fn update_workspace(&self, params: UpdateWorkspaceParams) -> Result<(), WorkspaceError> { diff --git a/rust-lib/flowy-workspace/src/sql_tables/workspace/workspace.rs b/rust-lib/flowy-workspace/src/sql_tables/workspace/workspace.rs index 9851655297..a208fd6dd3 100644 --- a/rust-lib/flowy-workspace/src/sql_tables/workspace/workspace.rs +++ b/rust-lib/flowy-workspace/src/sql_tables/workspace/workspace.rs @@ -1,5 +1,5 @@ use crate::{ - entities::workspace::{CreateWorkspaceParams, UpdateWorkspaceParams}, + entities::workspace::{CreateWorkspaceParams, UpdateWorkspaceParams, WorkspaceDetail}, sql_tables::app::App, }; use flowy_database::schema::{workspace_table, workspace_table::dsl}; @@ -61,3 +61,13 @@ impl WorkspaceChangeset { } } } + +impl std::convert::Into for Workspace { + fn into(self) -> WorkspaceDetail { + WorkspaceDetail { + id: self.id, + name: self.name, + desc: self.desc, + } + } +} diff --git a/rust-lib/flowy-workspace/tests/event/main.rs b/rust-lib/flowy-workspace/tests/event/main.rs new file mode 100644 index 0000000000..15f76da505 --- /dev/null +++ b/rust-lib/flowy-workspace/tests/event/main.rs @@ -0,0 +1 @@ +mod workspace_test; diff --git a/rust-lib/flowy-workspace/tests/event/workspace_test.rs b/rust-lib/flowy-workspace/tests/event/workspace_test.rs new file mode 100644 index 0000000000..8ba648d074 --- /dev/null +++ b/rust-lib/flowy-workspace/tests/event/workspace_test.rs @@ -0,0 +1,20 @@ +use flowy_test::EventTester; +use flowy_workspace::{ + entities::workspace::{CreateWorkspaceRequest, WorkspaceDetail}, + event::WorkspaceEvent::*, + prelude::*, +}; + +#[test] +fn workspace_create_test() { + let request = CreateWorkspaceRequest { + name: "123workspace".to_owned(), + desc: "".to_owned(), + }; + + let response = EventTester::new(CreateWorkspace) + .request(request) + .sync_send() + .parse::(); + dbg!(&response); +}