Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
cebc46ad
Commit
cebc46ad
authored
Apr 13, 2024
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: tweak store definition
parent
6ee3b0f7
Changes
25
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
298 additions
and
895 deletions
+298
-895
README.md
proto/gen/store/README.md
+4
-97
common.pb.go
proto/gen/store/common.pb.go
+0
-141
reaction.pb.go
proto/gen/store/reaction.pb.go
+71
-180
webhook.pb.go
proto/gen/store/webhook.pb.go
+0
-214
common.proto
proto/store/common.proto
+0
-13
reaction.proto
proto/store/reaction.proto
+14
-27
webhook.proto
proto/store/webhook.proto
+0
-23
README.md
server/route/api/v1/README.md
+1
-0
acl.go
server/route/api/v2/acl.go
+2
-3
apidocs.swagger.yaml
server/route/api/v2/apidocs.swagger.yaml
+73
-73
auth.go
server/route/api/v2/auth.go
+1
-1
auth_service.go
server/route/api/v2/auth_service.go
+5
-6
user_service.go
server/route/api/v2/user_service.go
+3
-4
webhook_service.go
server/route/api/v2/webhook_service.go
+7
-8
reaction.go
store/db/mysql/reaction.go
+10
-10
webhook.go
store/db/mysql/webhook.go
+12
-13
reaction.go
store/db/postgres/reaction.go
+10
-10
webhook.go
store/db/postgres/webhook.go
+15
-16
reaction.go
store/db/sqlite/reaction.go
+10
-10
webhook.go
store/db/sqlite/webhook.go
+15
-16
driver.go
store/driver.go
+5
-7
reaction.go
store/reaction.go
+12
-2
webhook.go
store/webhook.go
+15
-7
reaction_test.go
test/store/reaction_test.go
+6
-6
webhook_test.go
test/store/webhook_test.go
+7
-8
No files found.
proto/gen/store/README.md
View file @
cebc46ad
...
...
@@ -8,9 +8,6 @@
-
[
ActivityPayload
](
#memos-store-ActivityPayload
)
-
[
ActivityVersionUpdatePayload
](
#memos-store-ActivityVersionUpdatePayload
)
-
[
store/common.proto
](
#store_common-proto
)
-
[
RowStatus
](
#memos-store-RowStatus
)
-
[
store/idp.proto
](
#store_idp-proto
)
-
[
FieldMapping
](
#memos-store-FieldMapping
)
-
[
IdentityProvider
](
#memos-store-IdentityProvider
)
...
...
@@ -25,9 +22,7 @@
-
[
InboxMessage.Type
](
#memos-store-InboxMessage-Type
)
-
[
store/reaction.proto
](
#store_reaction-proto
)
-
[
Reaction
](
#memos-store-Reaction
)
-
[
Reaction.Type
](
#memos-store-Reaction-Type
)
-
[
ReactionType
](
#memos-store-ReactionType
)
-
[
store/storage.proto
](
#store_storage-proto
)
-
[
S3Config
](
#memos-store-S3Config
)
...
...
@@ -43,9 +38,6 @@
-
[
UserSettingKey
](
#memos-store-UserSettingKey
)
-
[
store/webhook.proto
](
#store_webhook-proto
)
-
[
Webhook
](
#memos-store-Webhook
)
-
[
store/workspace_setting.proto
](
#store_workspace_setting-proto
)
-
[
WorkspaceBasicSetting
](
#memos-store-WorkspaceBasicSetting
)
-
[
WorkspaceCustomProfile
](
#memos-store-WorkspaceCustomProfile
)
...
...
@@ -125,35 +117,6 @@
<a
name=
"store_common-proto"
></a>
<p
align=
"right"
><a
href=
"#top"
>
Top
</a></p>
## store/common.proto
<a
name=
"memos-store-RowStatus"
></a>
### RowStatus
| Name | Number | Description |
| ---- | ------ | ----------- |
| ROW_STATUS_UNSPECIFIED | 0 | |
| NORMAL | 1 | |
| ARCHIVED | 2 | |
<a
name=
"store_idp-proto"
></a>
<p
align=
"right"
><a
href=
"#top"
>
Top
</a></p>
...
...
@@ -305,36 +268,17 @@
## store/reaction.proto
<a
name=
"memos-store-Reaction"
></a>
### Reaction
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id |
[
int32
](
#int32
)
| | |
| created_ts |
[
int64
](
#int64
)
| | |
| creator_id |
[
int32
](
#int32
)
| | |
| content_id |
[
string
](
#string
)
| | content_id is the id of the content that the reaction is for. This can be a memo. e.g. memos/101 |
| reaction_type |
[
Reaction.Type
](
#memos-store-Reaction-Type
)
| | |
<a
name=
"memos-store-Reaction
-
Type"
></a>
<a
name=
"memos-store-ReactionType"
></a>
### Reaction
.
Type
### ReactionType
| Name | Number | Description |
| ---- | ------ | ----------- |
| TYPE_UNSPECIFIED | 0 | |
|
REACTION_
TYPE_UNSPECIFIED | 0 | |
| THUMBS_UP | 1 | |
| THUMBS_DOWN | 2 | |
| HEART | 3 | |
...
...
@@ -525,43 +469,6 @@
<a
name=
"store_webhook-proto"
></a>
<p
align=
"right"
><a
href=
"#top"
>
Top
</a></p>
## store/webhook.proto
<a
name=
"memos-store-Webhook"
></a>
### Webhook
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id |
[
int32
](
#int32
)
| | |
| created_ts |
[
int64
](
#int64
)
| | |
| updated_ts |
[
int64
](
#int64
)
| | |
| creator_id |
[
int32
](
#int32
)
| | |
| row_status |
[
RowStatus
](
#memos-store-RowStatus
)
| | |
| name |
[
string
](
#string
)
| | |
| url |
[
string
](
#string
)
| | |
<a
name=
"store_workspace_setting-proto"
></a>
<p
align=
"right"
><a
href=
"#top"
>
Top
</a></p>
...
...
proto/gen/store/common.pb.go
deleted
100644 → 0
View file @
6ee3b0f7
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.31.0
// protoc (unknown)
// source: store/common.proto
package
store
import
(
protoreflect
"google.golang.org/protobuf/reflect/protoreflect"
protoimpl
"google.golang.org/protobuf/runtime/protoimpl"
reflect
"reflect"
sync
"sync"
)
const
(
// Verify that this generated code is sufficiently up-to-date.
_
=
protoimpl
.
EnforceVersion
(
20
-
protoimpl
.
MinVersion
)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_
=
protoimpl
.
EnforceVersion
(
protoimpl
.
MaxVersion
-
20
)
)
type
RowStatus
int32
const
(
RowStatus_ROW_STATUS_UNSPECIFIED
RowStatus
=
0
RowStatus_NORMAL
RowStatus
=
1
RowStatus_ARCHIVED
RowStatus
=
2
)
// Enum value maps for RowStatus.
var
(
RowStatus_name
=
map
[
int32
]
string
{
0
:
"ROW_STATUS_UNSPECIFIED"
,
1
:
"NORMAL"
,
2
:
"ARCHIVED"
,
}
RowStatus_value
=
map
[
string
]
int32
{
"ROW_STATUS_UNSPECIFIED"
:
0
,
"NORMAL"
:
1
,
"ARCHIVED"
:
2
,
}
)
func
(
x
RowStatus
)
Enum
()
*
RowStatus
{
p
:=
new
(
RowStatus
)
*
p
=
x
return
p
}
func
(
x
RowStatus
)
String
()
string
{
return
protoimpl
.
X
.
EnumStringOf
(
x
.
Descriptor
(),
protoreflect
.
EnumNumber
(
x
))
}
func
(
RowStatus
)
Descriptor
()
protoreflect
.
EnumDescriptor
{
return
file_store_common_proto_enumTypes
[
0
]
.
Descriptor
()
}
func
(
RowStatus
)
Type
()
protoreflect
.
EnumType
{
return
&
file_store_common_proto_enumTypes
[
0
]
}
func
(
x
RowStatus
)
Number
()
protoreflect
.
EnumNumber
{
return
protoreflect
.
EnumNumber
(
x
)
}
// Deprecated: Use RowStatus.Descriptor instead.
func
(
RowStatus
)
EnumDescriptor
()
([]
byte
,
[]
int
)
{
return
file_store_common_proto_rawDescGZIP
(),
[]
int
{
0
}
}
var
File_store_common_proto
protoreflect
.
FileDescriptor
var
file_store_common_proto_rawDesc
=
[]
byte
{
0x0a
,
0x12
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x2f
,
0x63
,
0x6f
,
0x6d
,
0x6d
,
0x6f
,
0x6e
,
0x2e
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x12
,
0x0b
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x2a
,
0x41
,
0x0a
,
0x09
,
0x52
,
0x6f
,
0x77
,
0x53
,
0x74
,
0x61
,
0x74
,
0x75
,
0x73
,
0x12
,
0x1a
,
0x0a
,
0x16
,
0x52
,
0x4f
,
0x57
,
0x5f
,
0x53
,
0x54
,
0x41
,
0x54
,
0x55
,
0x53
,
0x5f
,
0x55
,
0x4e
,
0x53
,
0x50
,
0x45
,
0x43
,
0x49
,
0x46
,
0x49
,
0x45
,
0x44
,
0x10
,
0x00
,
0x12
,
0x0a
,
0x0a
,
0x06
,
0x4e
,
0x4f
,
0x52
,
0x4d
,
0x41
,
0x4c
,
0x10
,
0x01
,
0x12
,
0x0c
,
0x0a
,
0x08
,
0x41
,
0x52
,
0x43
,
0x48
,
0x49
,
0x56
,
0x45
,
0x44
,
0x10
,
0x02
,
0x42
,
0x96
,
0x01
,
0x0a
,
0x0f
,
0x63
,
0x6f
,
0x6d
,
0x2e
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x42
,
0x0b
,
0x43
,
0x6f
,
0x6d
,
0x6d
,
0x6f
,
0x6e
,
0x50
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x50
,
0x01
,
0x5a
,
0x29
,
0x67
,
0x69
,
0x74
,
0x68
,
0x75
,
0x62
,
0x2e
,
0x63
,
0x6f
,
0x6d
,
0x2f
,
0x75
,
0x73
,
0x65
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2f
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x2f
,
0x67
,
0x65
,
0x6e
,
0x2f
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x65
,
0xa2
,
0x02
,
0x03
,
0x4d
,
0x53
,
0x58
,
0xaa
,
0x02
,
0x0b
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x53
,
0x74
,
0x6f
,
0x72
,
0x65
,
0xca
,
0x02
,
0x0b
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x5c
,
0x53
,
0x74
,
0x6f
,
0x72
,
0x65
,
0xe2
,
0x02
,
0x17
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x5c
,
0x53
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x5c
,
0x47
,
0x50
,
0x42
,
0x4d
,
0x65
,
0x74
,
0x61
,
0x64
,
0x61
,
0x74
,
0x61
,
0xea
,
0x02
,
0x0c
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x3a
,
0x3a
,
0x53
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x62
,
0x06
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x33
,
}
var
(
file_store_common_proto_rawDescOnce
sync
.
Once
file_store_common_proto_rawDescData
=
file_store_common_proto_rawDesc
)
func
file_store_common_proto_rawDescGZIP
()
[]
byte
{
file_store_common_proto_rawDescOnce
.
Do
(
func
()
{
file_store_common_proto_rawDescData
=
protoimpl
.
X
.
CompressGZIP
(
file_store_common_proto_rawDescData
)
})
return
file_store_common_proto_rawDescData
}
var
file_store_common_proto_enumTypes
=
make
([]
protoimpl
.
EnumInfo
,
1
)
var
file_store_common_proto_goTypes
=
[]
interface
{}{
(
RowStatus
)(
0
),
// 0: memos.store.RowStatus
}
var
file_store_common_proto_depIdxs
=
[]
int32
{
0
,
// [0:0] is the sub-list for method output_type
0
,
// [0:0] is the sub-list for method input_type
0
,
// [0:0] is the sub-list for extension type_name
0
,
// [0:0] is the sub-list for extension extendee
0
,
// [0:0] is the sub-list for field type_name
}
func
init
()
{
file_store_common_proto_init
()
}
func
file_store_common_proto_init
()
{
if
File_store_common_proto
!=
nil
{
return
}
type
x
struct
{}
out
:=
protoimpl
.
TypeBuilder
{
File
:
protoimpl
.
DescBuilder
{
GoPackagePath
:
reflect
.
TypeOf
(
x
{})
.
PkgPath
(),
RawDescriptor
:
file_store_common_proto_rawDesc
,
NumEnums
:
1
,
NumMessages
:
0
,
NumExtensions
:
0
,
NumServices
:
0
,
},
GoTypes
:
file_store_common_proto_goTypes
,
DependencyIndexes
:
file_store_common_proto_depIdxs
,
EnumInfos
:
file_store_common_proto_enumTypes
,
}
.
Build
()
File_store_common_proto
=
out
.
File
file_store_common_proto_rawDesc
=
nil
file_store_common_proto_goTypes
=
nil
file_store_common_proto_depIdxs
=
nil
}
proto/gen/store/reaction.pb.go
View file @
cebc46ad
This diff is collapsed.
Click to expand it.
proto/gen/store/webhook.pb.go
deleted
100644 → 0
View file @
6ee3b0f7
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.31.0
// protoc (unknown)
// source: store/webhook.proto
package
store
import
(
protoreflect
"google.golang.org/protobuf/reflect/protoreflect"
protoimpl
"google.golang.org/protobuf/runtime/protoimpl"
reflect
"reflect"
sync
"sync"
)
const
(
// Verify that this generated code is sufficiently up-to-date.
_
=
protoimpl
.
EnforceVersion
(
20
-
protoimpl
.
MinVersion
)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_
=
protoimpl
.
EnforceVersion
(
protoimpl
.
MaxVersion
-
20
)
)
type
Webhook
struct
{
state
protoimpl
.
MessageState
sizeCache
protoimpl
.
SizeCache
unknownFields
protoimpl
.
UnknownFields
Id
int32
`protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
CreatedTs
int64
`protobuf:"varint,2,opt,name=created_ts,json=createdTs,proto3" json:"created_ts,omitempty"`
UpdatedTs
int64
`protobuf:"varint,3,opt,name=updated_ts,json=updatedTs,proto3" json:"updated_ts,omitempty"`
CreatorId
int32
`protobuf:"varint,4,opt,name=creator_id,json=creatorId,proto3" json:"creator_id,omitempty"`
RowStatus
RowStatus
`protobuf:"varint,5,opt,name=row_status,json=rowStatus,proto3,enum=memos.store.RowStatus" json:"row_status,omitempty"`
Name
string
`protobuf:"bytes,6,opt,name=name,proto3" json:"name,omitempty"`
Url
string
`protobuf:"bytes,7,opt,name=url,proto3" json:"url,omitempty"`
}
func
(
x
*
Webhook
)
Reset
()
{
*
x
=
Webhook
{}
if
protoimpl
.
UnsafeEnabled
{
mi
:=
&
file_store_webhook_proto_msgTypes
[
0
]
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
.
StoreMessageInfo
(
mi
)
}
}
func
(
x
*
Webhook
)
String
()
string
{
return
protoimpl
.
X
.
MessageStringOf
(
x
)
}
func
(
*
Webhook
)
ProtoMessage
()
{}
func
(
x
*
Webhook
)
ProtoReflect
()
protoreflect
.
Message
{
mi
:=
&
file_store_webhook_proto_msgTypes
[
0
]
if
protoimpl
.
UnsafeEnabled
&&
x
!=
nil
{
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
if
ms
.
LoadMessageInfo
()
==
nil
{
ms
.
StoreMessageInfo
(
mi
)
}
return
ms
}
return
mi
.
MessageOf
(
x
)
}
// Deprecated: Use Webhook.ProtoReflect.Descriptor instead.
func
(
*
Webhook
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
file_store_webhook_proto_rawDescGZIP
(),
[]
int
{
0
}
}
func
(
x
*
Webhook
)
GetId
()
int32
{
if
x
!=
nil
{
return
x
.
Id
}
return
0
}
func
(
x
*
Webhook
)
GetCreatedTs
()
int64
{
if
x
!=
nil
{
return
x
.
CreatedTs
}
return
0
}
func
(
x
*
Webhook
)
GetUpdatedTs
()
int64
{
if
x
!=
nil
{
return
x
.
UpdatedTs
}
return
0
}
func
(
x
*
Webhook
)
GetCreatorId
()
int32
{
if
x
!=
nil
{
return
x
.
CreatorId
}
return
0
}
func
(
x
*
Webhook
)
GetRowStatus
()
RowStatus
{
if
x
!=
nil
{
return
x
.
RowStatus
}
return
RowStatus_ROW_STATUS_UNSPECIFIED
}
func
(
x
*
Webhook
)
GetName
()
string
{
if
x
!=
nil
{
return
x
.
Name
}
return
""
}
func
(
x
*
Webhook
)
GetUrl
()
string
{
if
x
!=
nil
{
return
x
.
Url
}
return
""
}
var
File_store_webhook_proto
protoreflect
.
FileDescriptor
var
file_store_webhook_proto_rawDesc
=
[]
byte
{
0x0a
,
0x13
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x2f
,
0x77
,
0x65
,
0x62
,
0x68
,
0x6f
,
0x6f
,
0x6b
,
0x2e
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x12
,
0x0b
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x1a
,
0x12
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x2f
,
0x63
,
0x6f
,
0x6d
,
0x6d
,
0x6f
,
0x6e
,
0x2e
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x22
,
0xd3
,
0x01
,
0x0a
,
0x07
,
0x57
,
0x65
,
0x62
,
0x68
,
0x6f
,
0x6f
,
0x6b
,
0x12
,
0x0e
,
0x0a
,
0x02
,
0x69
,
0x64
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x02
,
0x69
,
0x64
,
0x12
,
0x1d
,
0x0a
,
0x0a
,
0x63
,
0x72
,
0x65
,
0x61
,
0x74
,
0x65
,
0x64
,
0x5f
,
0x74
,
0x73
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x09
,
0x63
,
0x72
,
0x65
,
0x61
,
0x74
,
0x65
,
0x64
,
0x54
,
0x73
,
0x12
,
0x1d
,
0x0a
,
0x0a
,
0x75
,
0x70
,
0x64
,
0x61
,
0x74
,
0x65
,
0x64
,
0x5f
,
0x74
,
0x73
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x09
,
0x75
,
0x70
,
0x64
,
0x61
,
0x74
,
0x65
,
0x64
,
0x54
,
0x73
,
0x12
,
0x1d
,
0x0a
,
0x0a
,
0x63
,
0x72
,
0x65
,
0x61
,
0x74
,
0x6f
,
0x72
,
0x5f
,
0x69
,
0x64
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x09
,
0x63
,
0x72
,
0x65
,
0x61
,
0x74
,
0x6f
,
0x72
,
0x49
,
0x64
,
0x12
,
0x35
,
0x0a
,
0x0a
,
0x72
,
0x6f
,
0x77
,
0x5f
,
0x73
,
0x74
,
0x61
,
0x74
,
0x75
,
0x73
,
0x18
,
0x05
,
0x20
,
0x01
,
0x28
,
0x0e
,
0x32
,
0x16
,
0x2e
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x2e
,
0x52
,
0x6f
,
0x77
,
0x53
,
0x74
,
0x61
,
0x74
,
0x75
,
0x73
,
0x52
,
0x09
,
0x72
,
0x6f
,
0x77
,
0x53
,
0x74
,
0x61
,
0x74
,
0x75
,
0x73
,
0x12
,
0x12
,
0x0a
,
0x04
,
0x6e
,
0x61
,
0x6d
,
0x65
,
0x18
,
0x06
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x04
,
0x6e
,
0x61
,
0x6d
,
0x65
,
0x12
,
0x10
,
0x0a
,
0x03
,
0x75
,
0x72
,
0x6c
,
0x18
,
0x07
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x03
,
0x75
,
0x72
,
0x6c
,
0x42
,
0x97
,
0x01
,
0x0a
,
0x0f
,
0x63
,
0x6f
,
0x6d
,
0x2e
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x42
,
0x0c
,
0x57
,
0x65
,
0x62
,
0x68
,
0x6f
,
0x6f
,
0x6b
,
0x50
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x50
,
0x01
,
0x5a
,
0x29
,
0x67
,
0x69
,
0x74
,
0x68
,
0x75
,
0x62
,
0x2e
,
0x63
,
0x6f
,
0x6d
,
0x2f
,
0x75
,
0x73
,
0x65
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2f
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x2f
,
0x67
,
0x65
,
0x6e
,
0x2f
,
0x73
,
0x74
,
0x6f
,
0x72
,
0x65
,
0xa2
,
0x02
,
0x03
,
0x4d
,
0x53
,
0x58
,
0xaa
,
0x02
,
0x0b
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x53
,
0x74
,
0x6f
,
0x72
,
0x65
,
0xca
,
0x02
,
0x0b
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x5c
,
0x53
,
0x74
,
0x6f
,
0x72
,
0x65
,
0xe2
,
0x02
,
0x17
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x5c
,
0x53
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x5c
,
0x47
,
0x50
,
0x42
,
0x4d
,
0x65
,
0x74
,
0x61
,
0x64
,
0x61
,
0x74
,
0x61
,
0xea
,
0x02
,
0x0c
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x3a
,
0x3a
,
0x53
,
0x74
,
0x6f
,
0x72
,
0x65
,
0x62
,
0x06
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x33
,
}
var
(
file_store_webhook_proto_rawDescOnce
sync
.
Once
file_store_webhook_proto_rawDescData
=
file_store_webhook_proto_rawDesc
)
func
file_store_webhook_proto_rawDescGZIP
()
[]
byte
{
file_store_webhook_proto_rawDescOnce
.
Do
(
func
()
{
file_store_webhook_proto_rawDescData
=
protoimpl
.
X
.
CompressGZIP
(
file_store_webhook_proto_rawDescData
)
})
return
file_store_webhook_proto_rawDescData
}
var
file_store_webhook_proto_msgTypes
=
make
([]
protoimpl
.
MessageInfo
,
1
)
var
file_store_webhook_proto_goTypes
=
[]
interface
{}{
(
*
Webhook
)(
nil
),
// 0: memos.store.Webhook
(
RowStatus
)(
0
),
// 1: memos.store.RowStatus
}
var
file_store_webhook_proto_depIdxs
=
[]
int32
{
1
,
// 0: memos.store.Webhook.row_status:type_name -> memos.store.RowStatus
1
,
// [1:1] is the sub-list for method output_type
1
,
// [1:1] is the sub-list for method input_type
1
,
// [1:1] is the sub-list for extension type_name
1
,
// [1:1] is the sub-list for extension extendee
0
,
// [0:1] is the sub-list for field type_name
}
func
init
()
{
file_store_webhook_proto_init
()
}
func
file_store_webhook_proto_init
()
{
if
File_store_webhook_proto
!=
nil
{
return
}
file_store_common_proto_init
()
if
!
protoimpl
.
UnsafeEnabled
{
file_store_webhook_proto_msgTypes
[
0
]
.
Exporter
=
func
(
v
interface
{},
i
int
)
interface
{}
{
switch
v
:=
v
.
(
*
Webhook
);
i
{
case
0
:
return
&
v
.
state
case
1
:
return
&
v
.
sizeCache
case
2
:
return
&
v
.
unknownFields
default
:
return
nil
}
}
}
type
x
struct
{}
out
:=
protoimpl
.
TypeBuilder
{
File
:
protoimpl
.
DescBuilder
{
GoPackagePath
:
reflect
.
TypeOf
(
x
{})
.
PkgPath
(),
RawDescriptor
:
file_store_webhook_proto_rawDesc
,
NumEnums
:
0
,
NumMessages
:
1
,
NumExtensions
:
0
,
NumServices
:
0
,
},
GoTypes
:
file_store_webhook_proto_goTypes
,
DependencyIndexes
:
file_store_webhook_proto_depIdxs
,
MessageInfos
:
file_store_webhook_proto_msgTypes
,
}
.
Build
()
File_store_webhook_proto
=
out
.
File
file_store_webhook_proto_rawDesc
=
nil
file_store_webhook_proto_goTypes
=
nil
file_store_webhook_proto_depIdxs
=
nil
}
proto/store/common.proto
deleted
100644 → 0
View file @
6ee3b0f7
syntax
=
"proto3"
;
package
memos
.
store
;
option
go_package
=
"gen/store"
;
enum
RowStatus
{
ROW_STATUS_UNSPECIFIED
=
0
;
NORMAL
=
1
;
ARCHIVED
=
2
;
}
proto/store/reaction.proto
View file @
cebc46ad
...
...
@@ -4,31 +4,18 @@ package memos.store;
option
go_package
=
"gen/store"
;
message
Reaction
{
int32
id
=
1
;
int64
created_ts
=
2
;
int32
creator_id
=
3
;
// content_id is the id of the content that the reaction is for.
// This can be a memo. e.g. memos/101
string
content_id
=
4
;
enum
Type
{
TYPE_UNSPECIFIED
=
0
;
THUMBS_UP
=
1
;
THUMBS_DOWN
=
2
;
HEART
=
3
;
FIRE
=
4
;
CLAPPING_HANDS
=
5
;
LAUGH
=
6
;
OK_HAND
=
7
;
ROCKET
=
8
;
EYES
=
9
;
THINKING_FACE
=
10
;
CLOWN_FACE
=
11
;
QUESTION_MARK
=
12
;
}
Type
reaction_type
=
5
;
enum
ReactionType
{
REACTION_TYPE_UNSPECIFIED
=
0
;
THUMBS_UP
=
1
;
THUMBS_DOWN
=
2
;
HEART
=
3
;
FIRE
=
4
;
CLAPPING_HANDS
=
5
;
LAUGH
=
6
;
OK_HAND
=
7
;
ROCKET
=
8
;
EYES
=
9
;
THINKING_FACE
=
10
;
CLOWN_FACE
=
11
;
QUESTION_MARK
=
12
;
}
proto/store/webhook.proto
deleted
100644 → 0
View file @
6ee3b0f7
syntax
=
"proto3"
;
package
memos
.
store
;
import
"store/common.proto"
;
option
go_package
=
"gen/store"
;
message
Webhook
{
int32
id
=
1
;
int64
created_ts
=
2
;
int64
updated_ts
=
3
;
int32
creator_id
=
4
;
RowStatus
row_status
=
5
;
string
name
=
6
;
string
url
=
7
;
}
server/route/api/v1/README.md
0 → 100644
View file @
cebc46ad
The legacy API is deprecated and has be removed. Please use the v2 API instead.
server/route/api/v2/acl.go
View file @
cebc46ad
...
...
@@ -14,7 +14,6 @@ import (
"github.com/usememos/memos/internal/util"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/server/route/api/auth"
"github.com/usememos/memos/store"
)
...
...
@@ -84,7 +83,7 @@ func (in *GRPCAuthInterceptor) authenticate(ctx context.Context, accessToken str
if
accessToken
==
""
{
return
""
,
status
.
Errorf
(
codes
.
Unauthenticated
,
"access token not found"
)
}
claims
:=
&
auth
.
ClaimsMessage
{}
claims
:=
&
ClaimsMessage
{}
_
,
err
:=
jwt
.
ParseWithClaims
(
accessToken
,
claims
,
func
(
t
*
jwt
.
Token
)
(
any
,
error
)
{
if
t
.
Method
.
Alg
()
!=
jwt
.
SigningMethodHS256
.
Name
{
return
nil
,
status
.
Errorf
(
codes
.
Unauthenticated
,
"unexpected access token signing method=%v, expect %v"
,
t
.
Header
[
"alg"
],
jwt
.
SigningMethodHS256
)
...
...
@@ -145,7 +144,7 @@ func getTokenFromMetadata(md metadata.MD) (string, error) {
header
:=
http
.
Header
{}
header
.
Add
(
"Cookie"
,
t
)
request
:=
http
.
Request
{
Header
:
header
}
if
v
,
_
:=
request
.
Cookie
(
auth
.
AccessTokenCookieName
);
v
!=
nil
{
if
v
,
_
:=
request
.
Cookie
(
AccessTokenCookieName
);
v
!=
nil
{
accessToken
=
v
.
Value
}
}
...
...
server/route/api/v2/apidocs.swagger.yaml
View file @
cebc46ad
...
...
@@ -939,7 +939,7 @@ paths:
type
:
string
format
:
date-time
rowStatus
:
$ref
:
'
#/definitions/
api
v2RowStatus'
$ref
:
'
#/definitions/v2RowStatus'
name
:
type
:
string
url
:
...
...
@@ -1159,7 +1159,7 @@ paths:
type
:
string
description
:
The user defined id of the memo.
rowStatus
:
$ref
:
'
#/definitions/
api
v2RowStatus'
$ref
:
'
#/definitions/v2RowStatus'
creator
:
type
:
string
title
:
|-
...
...
@@ -1200,7 +1200,7 @@ paths:
type
:
array
items
:
type
:
object
$ref
:
'
#/definitions/
api
v2Reaction'
$ref
:
'
#/definitions/v2Reaction'
readOnly
:
true
tags
:
-
MemoService
...
...
@@ -1913,7 +1913,7 @@ paths:
password
:
type
:
string
rowStatus
:
$ref
:
'
#/definitions/
api
v2RowStatus'
$ref
:
'
#/definitions/v2RowStatus'
createTime
:
type
:
string
format
:
date-time
...
...
@@ -2052,45 +2052,6 @@ definitions:
type
:
string
fieldMapping
:
$ref
:
'
#/definitions/apiv2FieldMapping'
apiv2Reaction
:
type
:
object
properties
:
id
:
type
:
integer
format
:
int32
creator
:
type
:
string
title
:
|-
The name of the creator.
Format: users/{id}
contentId
:
type
:
string
reactionType
:
$ref
:
'
#/definitions/apiv2ReactionType'
apiv2ReactionType
:
type
:
string
enum
:
-
TYPE_UNSPECIFIED
-
THUMBS_UP
-
THUMBS_DOWN
-
HEART
-
FIRE
-
CLAPPING_HANDS
-
LAUGH
-
OK_HAND
-
ROCKET
-
EYES
-
THINKING_FACE
-
CLOWN_FACE
-
QUESTION_MARK
default
:
TYPE_UNSPECIFIED
apiv2RowStatus
:
type
:
string
enum
:
-
ROW_STATUS_UNSPECIFIED
-
ACTIVE
-
ARCHIVED
default
:
ROW_STATUS_UNSPECIFIED
apiv2S3Config
:
type
:
object
properties
:
...
...
@@ -2155,27 +2116,6 @@ definitions:
telegramUserId
:
type
:
string
description
:
The telegram user id of the user.
apiv2Webhook
:
type
:
object
properties
:
id
:
type
:
integer
format
:
int32
creatorId
:
type
:
integer
format
:
int32
createdTime
:
type
:
string
format
:
date-time
updatedTime
:
type
:
string
format
:
date-time
rowStatus
:
$ref
:
'
#/definitions/apiv2RowStatus'
name
:
type
:
string
url
:
type
:
string
apiv2WorkspaceCustomProfile
:
type
:
object
properties
:
...
...
@@ -2370,7 +2310,7 @@ definitions:
type
:
object
properties
:
webhook
:
$ref
:
'
#/definitions/
api
v2Webhook'
$ref
:
'
#/definitions/v2Webhook'
v2DeleteIdentityProviderResponse
:
type
:
object
v2DeleteInboxResponse
:
...
...
@@ -2465,7 +2405,7 @@ definitions:
type
:
object
properties
:
webhook
:
$ref
:
'
#/definitions/
api
v2Webhook'
$ref
:
'
#/definitions/v2Webhook'
v2GetWorkspaceProfileResponse
:
type
:
object
properties
:
...
...
@@ -2554,7 +2494,7 @@ definitions:
type
:
array
items
:
type
:
object
$ref
:
'
#/definitions/
api
v2Reaction'
$ref
:
'
#/definitions/v2Reaction'
v2ListMemoRelationsResponse
:
type
:
object
properties
:
...
...
@@ -2631,7 +2571,7 @@ definitions:
type
:
array
items
:
type
:
object
$ref
:
'
#/definitions/
api
v2Webhook'
$ref
:
'
#/definitions/v2Webhook'
v2ListWorkspaceSettingsResponse
:
type
:
object
properties
:
...
...
@@ -2653,7 +2593,7 @@ definitions:
type
:
string
description
:
The user defined id of the memo.
rowStatus
:
$ref
:
'
#/definitions/
api
v2RowStatus'
$ref
:
'
#/definitions/v2RowStatus'
creator
:
type
:
string
title
:
|-
...
...
@@ -2694,7 +2634,7 @@ definitions:
type
:
array
items
:
type
:
object
$ref
:
'
#/definitions/
api
v2Reaction'
$ref
:
'
#/definitions/v2Reaction'
readOnly
:
true
v2MemoRelation
:
type
:
object
...
...
@@ -2718,6 +2658,38 @@ definitions:
-
REFERENCE
-
COMMENT
default
:
TYPE_UNSPECIFIED
v2Reaction
:
type
:
object
properties
:
id
:
type
:
integer
format
:
int32
creator
:
type
:
string
title
:
|-
The name of the creator.
Format: users/{id}
contentId
:
type
:
string
reactionType
:
$ref
:
'
#/definitions/v2ReactionType'
v2ReactionType
:
type
:
string
enum
:
-
TYPE_UNSPECIFIED
-
THUMBS_UP
-
THUMBS_DOWN
-
HEART
-
FIRE
-
CLAPPING_HANDS
-
LAUGH
-
OK_HAND
-
ROCKET
-
EYES
-
THINKING_FACE
-
CLOWN_FACE
-
QUESTION_MARK
default
:
TYPE_UNSPECIFIED
v2RenameTagResponse
:
type
:
object
properties
:
...
...
@@ -2756,6 +2728,13 @@ definitions:
title
:
|-
The related memo.
Format: memos/{id}
v2RowStatus
:
type
:
string
enum
:
-
ROW_STATUS_UNSPECIFIED
-
ACTIVE
-
ARCHIVED
default
:
ROW_STATUS_UNSPECIFIED
v2SearchMemosResponse
:
type
:
object
properties
:
...
...
@@ -2856,12 +2835,12 @@ definitions:
type
:
object
properties
:
webhook
:
$ref
:
'
#/definitions/
api
v2Webhook'
$ref
:
'
#/definitions/v2Webhook'
v2UpsertMemoReactionResponse
:
type
:
object
properties
:
reaction
:
$ref
:
'
#/definitions/
api
v2Reaction'
$ref
:
'
#/definitions/v2Reaction'
v2UpsertTagRequest
:
type
:
object
properties
:
...
...
@@ -2899,7 +2878,7 @@ definitions:
password
:
type
:
string
rowStatus
:
$ref
:
'
#/definitions/
api
v2RowStatus'
$ref
:
'
#/definitions/v2RowStatus'
createTime
:
type
:
string
format
:
date-time
...
...
@@ -2927,6 +2906,27 @@ definitions:
-
PROTECTED
-
PUBLIC
default
:
VISIBILITY_UNSPECIFIED
v2Webhook
:
type
:
object
properties
:
id
:
type
:
integer
format
:
int32
creatorId
:
type
:
integer
format
:
int32
createdTime
:
type
:
string
format
:
date-time
updatedTime
:
type
:
string
format
:
date-time
rowStatus
:
$ref
:
'
#/definitions/v2RowStatus'
name
:
type
:
string
url
:
type
:
string
v2WorkspaceProfile
:
type
:
object
properties
:
...
...
server/route/api/
auth
/auth.go
→
server/route/api/
v2
/auth.go
View file @
cebc46ad
package
auth
package
v2
import
(
"fmt"
...
...
server/route/api/v2/auth_service.go
View file @
cebc46ad
...
...
@@ -19,7 +19,6 @@ import (
"github.com/usememos/memos/plugin/idp/oauth2"
apiv2pb
"github.com/usememos/memos/proto/gen/api/v2"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/server/route/api/auth"
"github.com/usememos/memos/store"
)
...
...
@@ -58,7 +57,7 @@ func (s *APIV2Service) SignIn(ctx context.Context, request *apiv2pb.SignInReques
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"unmatched email and password"
)
}
expireTime
:=
time
.
Now
()
.
Add
(
auth
.
AccessTokenDuration
)
expireTime
:=
time
.
Now
()
.
Add
(
AccessTokenDuration
)
if
request
.
NeverExpire
{
// Set the expire time to 100 years.
expireTime
=
time
.
Now
()
.
Add
(
100
*
365
*
24
*
time
.
Hour
)
...
...
@@ -141,7 +140,7 @@ func (s *APIV2Service) SignInWithSSO(ctx context.Context, request *apiv2pb.SignI
return
nil
,
status
.
Errorf
(
codes
.
PermissionDenied
,
fmt
.
Sprintf
(
"user has been archived with username %s"
,
userInfo
.
Identifier
))
}
if
err
:=
s
.
doSignIn
(
ctx
,
user
,
time
.
Now
()
.
Add
(
auth
.
AccessTokenDuration
));
err
!=
nil
{
if
err
:=
s
.
doSignIn
(
ctx
,
user
,
time
.
Now
()
.
Add
(
AccessTokenDuration
));
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
fmt
.
Sprintf
(
"failed to sign in, err: %s"
,
err
))
}
return
&
apiv2pb
.
SignInWithSSOResponse
{
...
...
@@ -150,7 +149,7 @@ func (s *APIV2Service) SignInWithSSO(ctx context.Context, request *apiv2pb.SignI
}
func
(
s
*
APIV2Service
)
doSignIn
(
ctx
context
.
Context
,
user
*
store
.
User
,
expireTime
time
.
Time
)
error
{
accessToken
,
err
:=
auth
.
GenerateAccessToken
(
user
.
Email
,
user
.
ID
,
expireTime
,
[]
byte
(
s
.
Secret
))
accessToken
,
err
:=
GenerateAccessToken
(
user
.
Email
,
user
.
ID
,
expireTime
,
[]
byte
(
s
.
Secret
))
if
err
!=
nil
{
return
status
.
Errorf
(
codes
.
Internal
,
fmt
.
Sprintf
(
"failed to generate tokens, err: %s"
,
err
))
}
...
...
@@ -213,7 +212,7 @@ func (s *APIV2Service) SignUp(ctx context.Context, request *apiv2pb.SignUpReques
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
fmt
.
Sprintf
(
"failed to create user, err: %s"
,
err
))
}
if
err
:=
s
.
doSignIn
(
ctx
,
user
,
time
.
Now
()
.
Add
(
auth
.
AccessTokenDuration
));
err
!=
nil
{
if
err
:=
s
.
doSignIn
(
ctx
,
user
,
time
.
Now
()
.
Add
(
AccessTokenDuration
));
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
fmt
.
Sprintf
(
"failed to sign in, err: %s"
,
err
))
}
return
&
apiv2pb
.
SignUpResponse
{
...
...
@@ -243,7 +242,7 @@ func (s *APIV2Service) clearAccessTokenCookie(ctx context.Context) error {
func
(
*
APIV2Service
)
buildAccessTokenCookie
(
ctx
context
.
Context
,
accessToken
string
,
expireTime
time
.
Time
)
(
string
,
error
)
{
attrs
:=
[]
string
{
fmt
.
Sprintf
(
"%s=%s"
,
auth
.
AccessTokenCookieName
,
accessToken
),
fmt
.
Sprintf
(
"%s=%s"
,
AccessTokenCookieName
,
accessToken
),
"Path=/"
,
"HttpOnly"
,
}
...
...
server/route/api/v2/user_service.go
View file @
cebc46ad
...
...
@@ -21,7 +21,6 @@ import (
"github.com/usememos/memos/internal/util"
apiv2pb
"github.com/usememos/memos/proto/gen/api/v2"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/server/route/api/auth"
"github.com/usememos/memos/store"
)
...
...
@@ -356,7 +355,7 @@ func (s *APIV2Service) ListUserAccessTokens(ctx context.Context, _ *apiv2pb.List
accessTokens
:=
[]
*
apiv2pb
.
UserAccessToken
{}
for
_
,
userAccessToken
:=
range
userAccessTokens
{
claims
:=
&
auth
.
ClaimsMessage
{}
claims
:=
&
ClaimsMessage
{}
_
,
err
:=
jwt
.
ParseWithClaims
(
userAccessToken
.
AccessToken
,
claims
,
func
(
t
*
jwt
.
Token
)
(
any
,
error
)
{
if
t
.
Method
.
Alg
()
!=
jwt
.
SigningMethodHS256
.
Name
{
return
nil
,
errors
.
Errorf
(
"unexpected access token signing method=%v, expect %v"
,
t
.
Header
[
"alg"
],
jwt
.
SigningMethodHS256
)
...
...
@@ -405,12 +404,12 @@ func (s *APIV2Service) CreateUserAccessToken(ctx context.Context, request *apiv2
expiresAt
=
request
.
ExpiresAt
.
AsTime
()
}
accessToken
,
err
:=
auth
.
GenerateAccessToken
(
user
.
Username
,
user
.
ID
,
expiresAt
,
[]
byte
(
s
.
Secret
))
accessToken
,
err
:=
GenerateAccessToken
(
user
.
Username
,
user
.
ID
,
expiresAt
,
[]
byte
(
s
.
Secret
))
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to generate access token: %v"
,
err
)
}
claims
:=
&
auth
.
ClaimsMessage
{}
claims
:=
&
ClaimsMessage
{}
_
,
err
=
jwt
.
ParseWithClaims
(
accessToken
,
claims
,
func
(
t
*
jwt
.
Token
)
(
any
,
error
)
{
if
t
.
Method
.
Alg
()
!=
jwt
.
SigningMethodHS256
.
Name
{
return
nil
,
errors
.
Errorf
(
"unexpected access token signing method=%v, expect %v"
,
t
.
Header
[
"alg"
],
jwt
.
SigningMethodHS256
)
...
...
server/route/api/v2/webhook_service.go
View file @
cebc46ad
...
...
@@ -9,7 +9,6 @@ import (
"google.golang.org/protobuf/types/known/timestamppb"
apiv2pb
"github.com/usememos/memos/proto/gen/api/v2"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
)
...
...
@@ -19,8 +18,8 @@ func (s *APIV2Service) CreateWebhook(ctx context.Context, request *apiv2pb.Creat
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to get user: %v"
,
err
)
}
webhook
,
err
:=
s
.
Store
.
CreateWebhook
(
ctx
,
&
store
pb
.
Webhook
{
CreatorI
d
:
currentUser
.
ID
,
webhook
,
err
:=
s
.
Store
.
CreateWebhook
(
ctx
,
&
store
.
Webhook
{
CreatorI
D
:
currentUser
.
ID
,
Name
:
request
.
Name
,
Url
:
request
.
Url
,
})
...
...
@@ -79,7 +78,7 @@ func (s *APIV2Service) UpdateWebhook(ctx context.Context, request *apiv2pb.Updat
for
_
,
field
:=
range
request
.
UpdateMask
.
Paths
{
switch
field
{
case
"row_status"
:
rowStatus
:=
store
pb
.
RowStatus
(
storepb
.
RowStatus_value
[
request
.
Webhook
.
RowStatus
.
String
()]
)
rowStatus
:=
store
.
RowStatus
(
request
.
Webhook
.
RowStatus
.
String
()
)
update
.
RowStatus
=
&
rowStatus
case
"name"
:
update
.
Name
=
&
request
.
Webhook
.
Name
...
...
@@ -107,13 +106,13 @@ func (s *APIV2Service) DeleteWebhook(ctx context.Context, request *apiv2pb.Delet
return
&
apiv2pb
.
DeleteWebhookResponse
{},
nil
}
func
convertWebhookFromStore
(
webhook
*
store
pb
.
Webhook
)
*
apiv2pb
.
Webhook
{
func
convertWebhookFromStore
(
webhook
*
store
.
Webhook
)
*
apiv2pb
.
Webhook
{
return
&
apiv2pb
.
Webhook
{
Id
:
webhook
.
I
d
,
Id
:
webhook
.
I
D
,
CreatedTime
:
timestamppb
.
New
(
time
.
Unix
(
webhook
.
CreatedTs
,
0
)),
UpdatedTime
:
timestamppb
.
New
(
time
.
Unix
(
webhook
.
UpdatedTs
,
0
)),
RowStatus
:
apiv2pb
.
RowStatus
(
webhook
.
RowStatus
),
CreatorId
:
webhook
.
CreatorI
d
,
RowStatus
:
convertRowStatusFromStore
(
webhook
.
RowStatus
),
CreatorId
:
webhook
.
CreatorI
D
,
Name
:
webhook
.
Name
,
Url
:
webhook
.
Url
,
}
...
...
store/db/mysql/reaction.go
View file @
cebc46ad
...
...
@@ -10,10 +10,10 @@ import (
"github.com/usememos/memos/store"
)
func
(
d
*
DB
)
UpsertReaction
(
ctx
context
.
Context
,
upsert
*
store
pb
.
Reaction
)
(
*
storepb
.
Reaction
,
error
)
{
func
(
d
*
DB
)
UpsertReaction
(
ctx
context
.
Context
,
upsert
*
store
.
Reaction
)
(
*
store
.
Reaction
,
error
)
{
fields
:=
[]
string
{
"`creator_id`"
,
"`content_id`"
,
"`reaction_type`"
}
placeholder
:=
[]
string
{
"?"
,
"?"
,
"?"
}
args
:=
[]
interface
{}{
upsert
.
CreatorI
d
,
upsert
.
ContentId
,
upsert
.
ReactionType
.
String
()}
args
:=
[]
interface
{}{
upsert
.
CreatorI
D
,
upsert
.
ContentID
,
upsert
.
ReactionType
.
String
()}
stmt
:=
"INSERT INTO `reaction` ("
+
strings
.
Join
(
fields
,
", "
)
+
") VALUES ("
+
strings
.
Join
(
placeholder
,
", "
)
+
")"
result
,
err
:=
d
.
db
.
ExecContext
(
ctx
,
stmt
,
args
...
)
if
err
!=
nil
{
...
...
@@ -35,7 +35,7 @@ func (d *DB) UpsertReaction(ctx context.Context, upsert *storepb.Reaction) (*sto
return
reaction
,
nil
}
func
(
d
*
DB
)
ListReactions
(
ctx
context
.
Context
,
find
*
store
.
FindReaction
)
([]
*
store
pb
.
Reaction
,
error
)
{
func
(
d
*
DB
)
ListReactions
(
ctx
context
.
Context
,
find
*
store
.
FindReaction
)
([]
*
store
.
Reaction
,
error
)
{
where
,
args
:=
[]
string
{
"1 = 1"
},
[]
interface
{}{}
if
find
.
ID
!=
nil
{
where
,
args
=
append
(
where
,
"`id` = ?"
),
append
(
args
,
*
find
.
ID
)
...
...
@@ -64,20 +64,20 @@ func (d *DB) ListReactions(ctx context.Context, find *store.FindReaction) ([]*st
}
defer
rows
.
Close
()
list
:=
[]
*
store
pb
.
Reaction
{}
list
:=
[]
*
store
.
Reaction
{}
for
rows
.
Next
()
{
reaction
:=
&
store
pb
.
Reaction
{}
reaction
:=
&
store
.
Reaction
{}
var
reactionType
string
if
err
:=
rows
.
Scan
(
&
reaction
.
I
d
,
&
reaction
.
I
D
,
&
reaction
.
CreatedTs
,
&
reaction
.
CreatorI
d
,
&
reaction
.
ContentI
d
,
&
reaction
.
CreatorI
D
,
&
reaction
.
ContentI
D
,
&
reactionType
,
);
err
!=
nil
{
return
nil
,
err
}
reaction
.
ReactionType
=
storepb
.
Reaction
_Type
(
storepb
.
Reaction_
Type_value
[
reactionType
])
reaction
.
ReactionType
=
storepb
.
Reaction
Type
(
storepb
.
Reaction
Type_value
[
reactionType
])
list
=
append
(
list
,
reaction
)
}
...
...
@@ -88,7 +88,7 @@ func (d *DB) ListReactions(ctx context.Context, find *store.FindReaction) ([]*st
return
list
,
nil
}
func
(
d
*
DB
)
GetReaction
(
ctx
context
.
Context
,
find
*
store
.
FindReaction
)
(
*
store
pb
.
Reaction
,
error
)
{
func
(
d
*
DB
)
GetReaction
(
ctx
context
.
Context
,
find
*
store
.
FindReaction
)
(
*
store
.
Reaction
,
error
)
{
list
,
err
:=
d
.
ListReactions
(
ctx
,
find
)
if
err
!=
nil
{
return
nil
,
err
...
...
store/db/mysql/webhook.go
View file @
cebc46ad
...
...
@@ -4,14 +4,13 @@ import (
"context"
"strings"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
)
func
(
d
*
DB
)
CreateWebhook
(
ctx
context
.
Context
,
create
*
store
pb
.
Webhook
)
(
*
storepb
.
Webhook
,
error
)
{
func
(
d
*
DB
)
CreateWebhook
(
ctx
context
.
Context
,
create
*
store
.
Webhook
)
(
*
store
.
Webhook
,
error
)
{
fields
:=
[]
string
{
"`name`"
,
"`url`"
,
"`creator_id`"
}
placeholder
:=
[]
string
{
"?"
,
"?"
,
"?"
}
args
:=
[]
any
{
create
.
Name
,
create
.
Url
,
create
.
CreatorI
d
}
args
:=
[]
any
{
create
.
Name
,
create
.
Url
,
create
.
CreatorI
D
}
stmt
:=
"INSERT INTO `webhook` ("
+
strings
.
Join
(
fields
,
", "
)
+
") VALUES ("
+
strings
.
Join
(
placeholder
,
", "
)
+
")"
result
,
err
:=
d
.
db
.
ExecContext
(
ctx
,
stmt
,
args
...
)
...
...
@@ -24,11 +23,11 @@ func (d *DB) CreateWebhook(ctx context.Context, create *storepb.Webhook) (*store
return
nil
,
err
}
create
.
I
d
=
int32
(
id
)
return
d
.
GetWebhook
(
ctx
,
&
store
.
FindWebhook
{
ID
:
&
create
.
I
d
})
create
.
I
D
=
int32
(
id
)
return
d
.
GetWebhook
(
ctx
,
&
store
.
FindWebhook
{
ID
:
&
create
.
I
D
})
}
func
(
d
*
DB
)
ListWebhooks
(
ctx
context
.
Context
,
find
*
store
.
FindWebhook
)
([]
*
store
pb
.
Webhook
,
error
)
{
func
(
d
*
DB
)
ListWebhooks
(
ctx
context
.
Context
,
find
*
store
.
FindWebhook
)
([]
*
store
.
Webhook
,
error
)
{
where
,
args
:=
[]
string
{
"1 = 1"
},
[]
any
{}
if
find
.
ID
!=
nil
{
where
,
args
=
append
(
where
,
"`id` = ?"
),
append
(
args
,
*
find
.
ID
)
...
...
@@ -45,22 +44,22 @@ func (d *DB) ListWebhooks(ctx context.Context, find *store.FindWebhook) ([]*stor
}
defer
rows
.
Close
()
list
:=
[]
*
store
pb
.
Webhook
{}
list
:=
[]
*
store
.
Webhook
{}
for
rows
.
Next
()
{
webhook
:=
&
store
pb
.
Webhook
{}
webhook
:=
&
store
.
Webhook
{}
var
rowStatus
string
if
err
:=
rows
.
Scan
(
&
webhook
.
I
d
,
&
webhook
.
I
D
,
&
webhook
.
CreatedTs
,
&
webhook
.
UpdatedTs
,
&
rowStatus
,
&
webhook
.
CreatorI
d
,
&
webhook
.
CreatorI
D
,
&
webhook
.
Name
,
&
webhook
.
Url
,
);
err
!=
nil
{
return
nil
,
err
}
webhook
.
RowStatus
=
store
pb
.
RowStatus
(
storepb
.
RowStatus_value
[
rowStatus
]
)
webhook
.
RowStatus
=
store
.
RowStatus
(
rowStatus
)
list
=
append
(
list
,
webhook
)
}
...
...
@@ -71,7 +70,7 @@ func (d *DB) ListWebhooks(ctx context.Context, find *store.FindWebhook) ([]*stor
return
list
,
nil
}
func
(
d
*
DB
)
GetWebhook
(
ctx
context
.
Context
,
find
*
store
.
FindWebhook
)
(
*
store
pb
.
Webhook
,
error
)
{
func
(
d
*
DB
)
GetWebhook
(
ctx
context
.
Context
,
find
*
store
.
FindWebhook
)
(
*
store
.
Webhook
,
error
)
{
list
,
err
:=
d
.
ListWebhooks
(
ctx
,
find
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -82,7 +81,7 @@ func (d *DB) GetWebhook(ctx context.Context, find *store.FindWebhook) (*storepb.
return
list
[
0
],
nil
}
func
(
d
*
DB
)
UpdateWebhook
(
ctx
context
.
Context
,
update
*
store
.
UpdateWebhook
)
(
*
store
pb
.
Webhook
,
error
)
{
func
(
d
*
DB
)
UpdateWebhook
(
ctx
context
.
Context
,
update
*
store
.
UpdateWebhook
)
(
*
store
.
Webhook
,
error
)
{
set
,
args
:=
[]
string
{},
[]
any
{}
if
update
.
RowStatus
!=
nil
{
set
,
args
=
append
(
set
,
"`row_status` = ?"
),
append
(
args
,
update
.
RowStatus
.
String
())
...
...
store/db/postgres/reaction.go
View file @
cebc46ad
...
...
@@ -8,12 +8,12 @@ import (
"github.com/usememos/memos/store"
)
func
(
d
*
DB
)
UpsertReaction
(
ctx
context
.
Context
,
upsert
*
store
pb
.
Reaction
)
(
*
storepb
.
Reaction
,
error
)
{
func
(
d
*
DB
)
UpsertReaction
(
ctx
context
.
Context
,
upsert
*
store
.
Reaction
)
(
*
store
.
Reaction
,
error
)
{
fields
:=
[]
string
{
"creator_id"
,
"content_id"
,
"reaction_type"
}
args
:=
[]
interface
{}{
upsert
.
CreatorI
d
,
upsert
.
ContentId
,
upsert
.
ReactionType
.
String
()}
args
:=
[]
interface
{}{
upsert
.
CreatorI
D
,
upsert
.
ContentID
,
upsert
.
ReactionType
.
String
()}
stmt
:=
"INSERT INTO reaction ("
+
strings
.
Join
(
fields
,
", "
)
+
") VALUES ("
+
placeholders
(
len
(
args
))
+
") RETURNING id, created_ts"
if
err
:=
d
.
db
.
QueryRowContext
(
ctx
,
stmt
,
args
...
)
.
Scan
(
&
upsert
.
I
d
,
&
upsert
.
I
D
,
&
upsert
.
CreatedTs
,
);
err
!=
nil
{
return
nil
,
err
...
...
@@ -23,7 +23,7 @@ func (d *DB) UpsertReaction(ctx context.Context, upsert *storepb.Reaction) (*sto
return
reaction
,
nil
}
func
(
d
*
DB
)
ListReactions
(
ctx
context
.
Context
,
find
*
store
.
FindReaction
)
([]
*
store
pb
.
Reaction
,
error
)
{
func
(
d
*
DB
)
ListReactions
(
ctx
context
.
Context
,
find
*
store
.
FindReaction
)
([]
*
store
.
Reaction
,
error
)
{
where
,
args
:=
[]
string
{
"1 = 1"
},
[]
interface
{}{}
if
find
.
ID
!=
nil
{
where
,
args
=
append
(
where
,
"id = "
+
placeholder
(
len
(
args
)
+
1
)),
append
(
args
,
*
find
.
ID
)
...
...
@@ -52,20 +52,20 @@ func (d *DB) ListReactions(ctx context.Context, find *store.FindReaction) ([]*st
}
defer
rows
.
Close
()
list
:=
[]
*
store
pb
.
Reaction
{}
list
:=
[]
*
store
.
Reaction
{}
for
rows
.
Next
()
{
reaction
:=
&
store
pb
.
Reaction
{}
reaction
:=
&
store
.
Reaction
{}
var
reactionType
string
if
err
:=
rows
.
Scan
(
&
reaction
.
I
d
,
&
reaction
.
I
D
,
&
reaction
.
CreatedTs
,
&
reaction
.
CreatorI
d
,
&
reaction
.
ContentI
d
,
&
reaction
.
CreatorI
D
,
&
reaction
.
ContentI
D
,
&
reactionType
,
);
err
!=
nil
{
return
nil
,
err
}
reaction
.
ReactionType
=
storepb
.
Reaction
_Type
(
storepb
.
Reaction_
Type_value
[
reactionType
])
reaction
.
ReactionType
=
storepb
.
Reaction
Type
(
storepb
.
Reaction
Type_value
[
reactionType
])
list
=
append
(
list
,
reaction
)
}
...
...
store/db/postgres/webhook.go
View file @
cebc46ad
...
...
@@ -4,17 +4,16 @@ import (
"context"
"strings"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
)
func
(
d
*
DB
)
CreateWebhook
(
ctx
context
.
Context
,
create
*
store
pb
.
Webhook
)
(
*
storepb
.
Webhook
,
error
)
{
func
(
d
*
DB
)
CreateWebhook
(
ctx
context
.
Context
,
create
*
store
.
Webhook
)
(
*
store
.
Webhook
,
error
)
{
fields
:=
[]
string
{
"name"
,
"url"
,
"creator_id"
}
args
:=
[]
any
{
create
.
Name
,
create
.
Url
,
create
.
CreatorI
d
}
args
:=
[]
any
{
create
.
Name
,
create
.
Url
,
create
.
CreatorI
D
}
stmt
:=
"INSERT INTO webhook ("
+
strings
.
Join
(
fields
,
", "
)
+
") VALUES ("
+
placeholders
(
len
(
args
))
+
") RETURNING id, created_ts, updated_ts, row_status"
var
rowStatus
string
if
err
:=
d
.
db
.
QueryRowContext
(
ctx
,
stmt
,
args
...
)
.
Scan
(
&
create
.
I
d
,
&
create
.
I
D
,
&
create
.
CreatedTs
,
&
create
.
UpdatedTs
,
&
rowStatus
,
...
...
@@ -22,12 +21,12 @@ func (d *DB) CreateWebhook(ctx context.Context, create *storepb.Webhook) (*store
return
nil
,
err
}
create
.
RowStatus
=
store
pb
.
RowStatus
(
storepb
.
RowStatus_value
[
rowStatus
]
)
create
.
RowStatus
=
store
.
RowStatus
(
rowStatus
)
webhook
:=
create
return
webhook
,
nil
}
func
(
d
*
DB
)
ListWebhooks
(
ctx
context
.
Context
,
find
*
store
.
FindWebhook
)
([]
*
store
pb
.
Webhook
,
error
)
{
func
(
d
*
DB
)
ListWebhooks
(
ctx
context
.
Context
,
find
*
store
.
FindWebhook
)
([]
*
store
.
Webhook
,
error
)
{
where
,
args
:=
[]
string
{
"1 = 1"
},
[]
any
{}
if
find
.
ID
!=
nil
{
where
,
args
=
append
(
where
,
"id = "
+
placeholder
(
len
(
args
)
+
1
)),
append
(
args
,
*
find
.
ID
)
...
...
@@ -55,22 +54,22 @@ func (d *DB) ListWebhooks(ctx context.Context, find *store.FindWebhook) ([]*stor
}
defer
rows
.
Close
()
list
:=
[]
*
store
pb
.
Webhook
{}
list
:=
[]
*
store
.
Webhook
{}
for
rows
.
Next
()
{
webhook
:=
&
store
pb
.
Webhook
{}
webhook
:=
&
store
.
Webhook
{}
var
rowStatus
string
if
err
:=
rows
.
Scan
(
&
webhook
.
I
d
,
&
webhook
.
I
D
,
&
webhook
.
CreatedTs
,
&
webhook
.
UpdatedTs
,
&
rowStatus
,
&
webhook
.
CreatorI
d
,
&
webhook
.
CreatorI
D
,
&
webhook
.
Name
,
&
webhook
.
Url
,
);
err
!=
nil
{
return
nil
,
err
}
webhook
.
RowStatus
=
store
pb
.
RowStatus
(
storepb
.
RowStatus_value
[
rowStatus
]
)
webhook
.
RowStatus
=
store
.
RowStatus
(
rowStatus
)
list
=
append
(
list
,
webhook
)
}
...
...
@@ -81,7 +80,7 @@ func (d *DB) ListWebhooks(ctx context.Context, find *store.FindWebhook) ([]*stor
return
list
,
nil
}
func
(
d
*
DB
)
UpdateWebhook
(
ctx
context
.
Context
,
update
*
store
.
UpdateWebhook
)
(
*
store
pb
.
Webhook
,
error
)
{
func
(
d
*
DB
)
UpdateWebhook
(
ctx
context
.
Context
,
update
*
store
.
UpdateWebhook
)
(
*
store
.
Webhook
,
error
)
{
set
,
args
:=
[]
string
{},
[]
any
{}
if
update
.
RowStatus
!=
nil
{
set
,
args
=
append
(
set
,
"row_status = "
+
placeholder
(
len
(
args
)
+
1
)),
append
(
args
,
update
.
RowStatus
.
String
())
...
...
@@ -95,20 +94,20 @@ func (d *DB) UpdateWebhook(ctx context.Context, update *store.UpdateWebhook) (*s
stmt
:=
"UPDATE webhook SET "
+
strings
.
Join
(
set
,
", "
)
+
" WHERE id = "
+
placeholder
(
len
(
args
)
+
1
)
+
" RETURNING id, created_ts, updated_ts, row_status, creator_id, name, url"
args
=
append
(
args
,
update
.
ID
)
webhook
:=
&
store
pb
.
Webhook
{}
webhook
:=
&
store
.
Webhook
{}
var
rowStatus
string
if
err
:=
d
.
db
.
QueryRowContext
(
ctx
,
stmt
,
args
...
)
.
Scan
(
&
webhook
.
I
d
,
&
webhook
.
I
D
,
&
webhook
.
CreatedTs
,
&
webhook
.
UpdatedTs
,
&
rowStatus
,
&
webhook
.
CreatorI
d
,
&
webhook
.
CreatorI
D
,
&
webhook
.
Name
,
&
webhook
.
Url
,
);
err
!=
nil
{
return
nil
,
err
}
webhook
.
RowStatus
=
store
pb
.
RowStatus
(
storepb
.
RowStatus_value
[
rowStatus
]
)
webhook
.
RowStatus
=
store
.
RowStatus
(
rowStatus
)
return
webhook
,
nil
}
...
...
store/db/sqlite/reaction.go
View file @
cebc46ad
...
...
@@ -8,13 +8,13 @@ import (
"github.com/usememos/memos/store"
)
func
(
d
*
DB
)
UpsertReaction
(
ctx
context
.
Context
,
upsert
*
store
pb
.
Reaction
)
(
*
storepb
.
Reaction
,
error
)
{
func
(
d
*
DB
)
UpsertReaction
(
ctx
context
.
Context
,
upsert
*
store
.
Reaction
)
(
*
store
.
Reaction
,
error
)
{
fields
:=
[]
string
{
"`creator_id`"
,
"`content_id`"
,
"`reaction_type`"
}
placeholder
:=
[]
string
{
"?"
,
"?"
,
"?"
}
args
:=
[]
interface
{}{
upsert
.
CreatorI
d
,
upsert
.
ContentId
,
upsert
.
ReactionType
.
String
()}
args
:=
[]
interface
{}{
upsert
.
CreatorI
D
,
upsert
.
ContentID
,
upsert
.
ReactionType
.
String
()}
stmt
:=
"INSERT INTO `reaction` ("
+
strings
.
Join
(
fields
,
", "
)
+
") VALUES ("
+
strings
.
Join
(
placeholder
,
", "
)
+
") RETURNING `id`, `created_ts`"
if
err
:=
d
.
db
.
QueryRowContext
(
ctx
,
stmt
,
args
...
)
.
Scan
(
&
upsert
.
I
d
,
&
upsert
.
I
D
,
&
upsert
.
CreatedTs
,
);
err
!=
nil
{
return
nil
,
err
...
...
@@ -24,7 +24,7 @@ func (d *DB) UpsertReaction(ctx context.Context, upsert *storepb.Reaction) (*sto
return
reaction
,
nil
}
func
(
d
*
DB
)
ListReactions
(
ctx
context
.
Context
,
find
*
store
.
FindReaction
)
([]
*
store
pb
.
Reaction
,
error
)
{
func
(
d
*
DB
)
ListReactions
(
ctx
context
.
Context
,
find
*
store
.
FindReaction
)
([]
*
store
.
Reaction
,
error
)
{
where
,
args
:=
[]
string
{
"1 = 1"
},
[]
interface
{}{}
if
find
.
ID
!=
nil
{
where
,
args
=
append
(
where
,
"id = ?"
),
append
(
args
,
*
find
.
ID
)
...
...
@@ -53,20 +53,20 @@ func (d *DB) ListReactions(ctx context.Context, find *store.FindReaction) ([]*st
}
defer
rows
.
Close
()
list
:=
[]
*
store
pb
.
Reaction
{}
list
:=
[]
*
store
.
Reaction
{}
for
rows
.
Next
()
{
reaction
:=
&
store
pb
.
Reaction
{}
reaction
:=
&
store
.
Reaction
{}
var
reactionType
string
if
err
:=
rows
.
Scan
(
&
reaction
.
I
d
,
&
reaction
.
I
D
,
&
reaction
.
CreatedTs
,
&
reaction
.
CreatorI
d
,
&
reaction
.
ContentI
d
,
&
reaction
.
CreatorI
D
,
&
reaction
.
ContentI
D
,
&
reactionType
,
);
err
!=
nil
{
return
nil
,
err
}
reaction
.
ReactionType
=
storepb
.
Reaction
_Type
(
storepb
.
Reaction_
Type_value
[
reactionType
])
reaction
.
ReactionType
=
storepb
.
Reaction
Type
(
storepb
.
Reaction
Type_value
[
reactionType
])
list
=
append
(
list
,
reaction
)
}
...
...
store/db/sqlite/webhook.go
View file @
cebc46ad
...
...
@@ -4,18 +4,17 @@ import (
"context"
"strings"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
)
func
(
d
*
DB
)
CreateWebhook
(
ctx
context
.
Context
,
create
*
store
pb
.
Webhook
)
(
*
storepb
.
Webhook
,
error
)
{
func
(
d
*
DB
)
CreateWebhook
(
ctx
context
.
Context
,
create
*
store
.
Webhook
)
(
*
store
.
Webhook
,
error
)
{
fields
:=
[]
string
{
"`name`"
,
"`url`"
,
"`creator_id`"
}
placeholder
:=
[]
string
{
"?"
,
"?"
,
"?"
}
args
:=
[]
any
{
create
.
Name
,
create
.
Url
,
create
.
CreatorI
d
}
args
:=
[]
any
{
create
.
Name
,
create
.
Url
,
create
.
CreatorI
D
}
stmt
:=
"INSERT INTO `webhook` ("
+
strings
.
Join
(
fields
,
", "
)
+
") VALUES ("
+
strings
.
Join
(
placeholder
,
", "
)
+
") RETURNING `id`, `created_ts`, `updated_ts`, `row_status`"
var
rowStatus
string
if
err
:=
d
.
db
.
QueryRowContext
(
ctx
,
stmt
,
args
...
)
.
Scan
(
&
create
.
I
d
,
&
create
.
I
D
,
&
create
.
CreatedTs
,
&
create
.
UpdatedTs
,
&
rowStatus
,
...
...
@@ -23,12 +22,12 @@ func (d *DB) CreateWebhook(ctx context.Context, create *storepb.Webhook) (*store
return
nil
,
err
}
create
.
RowStatus
=
store
pb
.
RowStatus
(
storepb
.
RowStatus_value
[
rowStatus
]
)
create
.
RowStatus
=
store
.
RowStatus
(
rowStatus
)
webhook
:=
create
return
webhook
,
nil
}
func
(
d
*
DB
)
ListWebhooks
(
ctx
context
.
Context
,
find
*
store
.
FindWebhook
)
([]
*
store
pb
.
Webhook
,
error
)
{
func
(
d
*
DB
)
ListWebhooks
(
ctx
context
.
Context
,
find
*
store
.
FindWebhook
)
([]
*
store
.
Webhook
,
error
)
{
where
,
args
:=
[]
string
{
"1 = 1"
},
[]
any
{}
if
find
.
ID
!=
nil
{
where
,
args
=
append
(
where
,
"`id` = ?"
),
append
(
args
,
*
find
.
ID
)
...
...
@@ -56,22 +55,22 @@ func (d *DB) ListWebhooks(ctx context.Context, find *store.FindWebhook) ([]*stor
}
defer
rows
.
Close
()
list
:=
[]
*
store
pb
.
Webhook
{}
list
:=
[]
*
store
.
Webhook
{}
for
rows
.
Next
()
{
webhook
:=
&
store
pb
.
Webhook
{}
webhook
:=
&
store
.
Webhook
{}
var
rowStatus
string
if
err
:=
rows
.
Scan
(
&
webhook
.
I
d
,
&
webhook
.
I
D
,
&
webhook
.
CreatedTs
,
&
webhook
.
UpdatedTs
,
&
rowStatus
,
&
webhook
.
CreatorI
d
,
&
webhook
.
CreatorI
D
,
&
webhook
.
Name
,
&
webhook
.
Url
,
);
err
!=
nil
{
return
nil
,
err
}
webhook
.
RowStatus
=
store
pb
.
RowStatus
(
storepb
.
RowStatus_value
[
rowStatus
]
)
webhook
.
RowStatus
=
store
.
RowStatus
(
rowStatus
)
list
=
append
(
list
,
webhook
)
}
...
...
@@ -82,7 +81,7 @@ func (d *DB) ListWebhooks(ctx context.Context, find *store.FindWebhook) ([]*stor
return
list
,
nil
}
func
(
d
*
DB
)
UpdateWebhook
(
ctx
context
.
Context
,
update
*
store
.
UpdateWebhook
)
(
*
store
pb
.
Webhook
,
error
)
{
func
(
d
*
DB
)
UpdateWebhook
(
ctx
context
.
Context
,
update
*
store
.
UpdateWebhook
)
(
*
store
.
Webhook
,
error
)
{
set
,
args
:=
[]
string
{},
[]
any
{}
if
update
.
RowStatus
!=
nil
{
set
,
args
=
append
(
set
,
"row_status = ?"
),
append
(
args
,
update
.
RowStatus
.
String
())
...
...
@@ -96,20 +95,20 @@ func (d *DB) UpdateWebhook(ctx context.Context, update *store.UpdateWebhook) (*s
args
=
append
(
args
,
update
.
ID
)
stmt
:=
"UPDATE `webhook` SET "
+
strings
.
Join
(
set
,
", "
)
+
" WHERE `id` = ? RETURNING `id`, `created_ts`, `updated_ts`, `row_status`, `creator_id`, `name`, `url`"
webhook
:=
&
store
pb
.
Webhook
{}
webhook
:=
&
store
.
Webhook
{}
var
rowStatus
string
if
err
:=
d
.
db
.
QueryRowContext
(
ctx
,
stmt
,
args
...
)
.
Scan
(
&
webhook
.
I
d
,
&
webhook
.
I
D
,
&
webhook
.
CreatedTs
,
&
webhook
.
UpdatedTs
,
&
rowStatus
,
&
webhook
.
CreatorI
d
,
&
webhook
.
CreatorI
D
,
&
webhook
.
Name
,
&
webhook
.
Url
,
);
err
!=
nil
{
return
nil
,
err
}
webhook
.
RowStatus
=
store
pb
.
RowStatus
(
storepb
.
RowStatus_value
[
rowStatus
]
)
webhook
.
RowStatus
=
store
.
RowStatus
(
rowStatus
)
return
webhook
,
nil
}
...
...
store/driver.go
View file @
cebc46ad
...
...
@@ -3,8 +3,6 @@ package store
import
(
"context"
"database/sql"
storepb
"github.com/usememos/memos/proto/gen/store"
)
// Driver is an interface for store driver.
...
...
@@ -88,13 +86,13 @@ type Driver interface {
DeleteInbox
(
ctx
context
.
Context
,
delete
*
DeleteInbox
)
error
// Webhook model related methods.
CreateWebhook
(
ctx
context
.
Context
,
create
*
storepb
.
Webhook
)
(
*
storepb
.
Webhook
,
error
)
ListWebhooks
(
ctx
context
.
Context
,
find
*
FindWebhook
)
([]
*
storepb
.
Webhook
,
error
)
UpdateWebhook
(
ctx
context
.
Context
,
update
*
UpdateWebhook
)
(
*
storepb
.
Webhook
,
error
)
CreateWebhook
(
ctx
context
.
Context
,
create
*
Webhook
)
(
*
Webhook
,
error
)
ListWebhooks
(
ctx
context
.
Context
,
find
*
FindWebhook
)
([]
*
Webhook
,
error
)
UpdateWebhook
(
ctx
context
.
Context
,
update
*
UpdateWebhook
)
(
*
Webhook
,
error
)
DeleteWebhook
(
ctx
context
.
Context
,
delete
*
DeleteWebhook
)
error
// Reaction model related methods.
UpsertReaction
(
ctx
context
.
Context
,
create
*
storepb
.
Reaction
)
(
*
storepb
.
Reaction
,
error
)
ListReactions
(
ctx
context
.
Context
,
find
*
FindReaction
)
([]
*
storepb
.
Reaction
,
error
)
UpsertReaction
(
ctx
context
.
Context
,
create
*
Reaction
)
(
*
Reaction
,
error
)
ListReactions
(
ctx
context
.
Context
,
find
*
FindReaction
)
([]
*
Reaction
,
error
)
DeleteReaction
(
ctx
context
.
Context
,
delete
*
DeleteReaction
)
error
}
store/reaction.go
View file @
cebc46ad
...
...
@@ -6,6 +6,16 @@ import (
storepb
"github.com/usememos/memos/proto/gen/store"
)
type
Reaction
struct
{
ID
int32
CreatedTs
int64
CreatorID
int32
// ContentID is the id of the content that the reaction is for.
// This can be a memo. e.g. memos/101
ContentID
string
ReactionType
storepb
.
ReactionType
}
type
FindReaction
struct
{
ID
*
int32
CreatorID
*
int32
...
...
@@ -16,11 +26,11 @@ type DeleteReaction struct {
ID
int32
}
func
(
s
*
Store
)
UpsertReaction
(
ctx
context
.
Context
,
upsert
*
storepb
.
Reaction
)
(
*
storepb
.
Reaction
,
error
)
{
func
(
s
*
Store
)
UpsertReaction
(
ctx
context
.
Context
,
upsert
*
Reaction
)
(
*
Reaction
,
error
)
{
return
s
.
driver
.
UpsertReaction
(
ctx
,
upsert
)
}
func
(
s
*
Store
)
ListReactions
(
ctx
context
.
Context
,
find
*
FindReaction
)
([]
*
storepb
.
Reaction
,
error
)
{
func
(
s
*
Store
)
ListReactions
(
ctx
context
.
Context
,
find
*
FindReaction
)
([]
*
Reaction
,
error
)
{
return
s
.
driver
.
ListReactions
(
ctx
,
find
)
}
...
...
store/webhook.go
View file @
cebc46ad
...
...
@@ -2,10 +2,18 @@ package store
import
(
"context"
storepb
"github.com/usememos/memos/proto/gen/store"
)
type
Webhook
struct
{
ID
int32
CreatedTs
int64
UpdatedTs
int64
CreatorID
int32
RowStatus
RowStatus
Name
string
Url
string
}
type
FindWebhook
struct
{
ID
*
int32
CreatorID
*
int32
...
...
@@ -13,7 +21,7 @@ type FindWebhook struct {
type
UpdateWebhook
struct
{
ID
int32
RowStatus
*
storepb
.
RowStatus
RowStatus
*
RowStatus
Name
*
string
URL
*
string
}
...
...
@@ -22,15 +30,15 @@ type DeleteWebhook struct {
ID
int32
}
func
(
s
*
Store
)
CreateWebhook
(
ctx
context
.
Context
,
create
*
storepb
.
Webhook
)
(
*
storepb
.
Webhook
,
error
)
{
func
(
s
*
Store
)
CreateWebhook
(
ctx
context
.
Context
,
create
*
Webhook
)
(
*
Webhook
,
error
)
{
return
s
.
driver
.
CreateWebhook
(
ctx
,
create
)
}
func
(
s
*
Store
)
ListWebhooks
(
ctx
context
.
Context
,
find
*
FindWebhook
)
([]
*
storepb
.
Webhook
,
error
)
{
func
(
s
*
Store
)
ListWebhooks
(
ctx
context
.
Context
,
find
*
FindWebhook
)
([]
*
Webhook
,
error
)
{
return
s
.
driver
.
ListWebhooks
(
ctx
,
find
)
}
func
(
s
*
Store
)
GetWebhook
(
ctx
context
.
Context
,
find
*
FindWebhook
)
(
*
storepb
.
Webhook
,
error
)
{
func
(
s
*
Store
)
GetWebhook
(
ctx
context
.
Context
,
find
*
FindWebhook
)
(
*
Webhook
,
error
)
{
list
,
err
:=
s
.
ListWebhooks
(
ctx
,
find
)
if
err
!=
nil
{
return
nil
,
err
...
...
@@ -41,7 +49,7 @@ func (s *Store) GetWebhook(ctx context.Context, find *FindWebhook) (*storepb.Web
return
list
[
0
],
nil
}
func
(
s
*
Store
)
UpdateWebhook
(
ctx
context
.
Context
,
update
*
UpdateWebhook
)
(
*
storepb
.
Webhook
,
error
)
{
func
(
s
*
Store
)
UpdateWebhook
(
ctx
context
.
Context
,
update
*
UpdateWebhook
)
(
*
Webhook
,
error
)
{
return
s
.
driver
.
UpdateWebhook
(
ctx
,
update
)
}
...
...
test/store/reaction_test.go
View file @
cebc46ad
...
...
@@ -18,14 +18,14 @@ func TestReactionStore(t *testing.T) {
require
.
NoError
(
t
,
err
)
contentID
:=
"test_content_id"
reaction
,
err
:=
ts
.
UpsertReaction
(
ctx
,
&
store
pb
.
Reaction
{
CreatorI
d
:
user
.
ID
,
ContentI
d
:
contentID
,
ReactionType
:
storepb
.
Reaction_HEART
,
reaction
,
err
:=
ts
.
UpsertReaction
(
ctx
,
&
store
.
Reaction
{
CreatorI
D
:
user
.
ID
,
ContentI
D
:
contentID
,
ReactionType
:
storepb
.
Reaction
Type
_HEART
,
})
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
reaction
)
require
.
NotEmpty
(
t
,
reaction
.
I
d
)
require
.
NotEmpty
(
t
,
reaction
.
I
D
)
reactions
,
err
:=
ts
.
ListReactions
(
ctx
,
&
store
.
FindReaction
{
ContentID
:
&
contentID
,
...
...
@@ -35,7 +35,7 @@ func TestReactionStore(t *testing.T) {
require
.
Equal
(
t
,
reaction
,
reactions
[
0
])
err
=
ts
.
DeleteReaction
(
ctx
,
&
store
.
DeleteReaction
{
ID
:
reaction
.
I
d
,
ID
:
reaction
.
I
D
,
})
require
.
NoError
(
t
,
err
)
...
...
test/store/webhook_test.go
View file @
cebc46ad
...
...
@@ -6,7 +6,6 @@ import (
"github.com/stretchr/testify/require"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
)
...
...
@@ -15,15 +14,15 @@ func TestWebhookStore(t *testing.T) {
ts
:=
NewTestingStore
(
ctx
,
t
)
user
,
err
:=
createTestingHostUser
(
ctx
,
ts
)
require
.
NoError
(
t
,
err
)
webhook
,
err
:=
ts
.
CreateWebhook
(
ctx
,
&
store
pb
.
Webhook
{
CreatorI
d
:
user
.
ID
,
webhook
,
err
:=
ts
.
CreateWebhook
(
ctx
,
&
store
.
Webhook
{
CreatorI
D
:
user
.
ID
,
Name
:
"test_webhook"
,
Url
:
"https://example.com"
,
RowStatus
:
store
pb
.
RowStatus_NORMAL
,
RowStatus
:
store
.
Normal
,
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
"test_webhook"
,
webhook
.
Name
)
require
.
Equal
(
t
,
user
.
ID
,
webhook
.
CreatorI
d
)
require
.
Equal
(
t
,
user
.
ID
,
webhook
.
CreatorI
D
)
webhooks
,
err
:=
ts
.
ListWebhooks
(
ctx
,
&
store
.
FindWebhook
{
CreatorID
:
&
user
.
ID
,
})
...
...
@@ -32,14 +31,14 @@ func TestWebhookStore(t *testing.T) {
require
.
Equal
(
t
,
webhook
,
webhooks
[
0
])
newName
:=
"test_webhook_new"
updatedWebhook
,
err
:=
ts
.
UpdateWebhook
(
ctx
,
&
store
.
UpdateWebhook
{
ID
:
webhook
.
I
d
,
ID
:
webhook
.
I
D
,
Name
:
&
newName
,
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
newName
,
updatedWebhook
.
Name
)
require
.
Equal
(
t
,
webhook
.
CreatorI
d
,
updatedWebhook
.
CreatorId
)
require
.
Equal
(
t
,
webhook
.
CreatorI
D
,
updatedWebhook
.
CreatorID
)
err
=
ts
.
DeleteWebhook
(
ctx
,
&
store
.
DeleteWebhook
{
ID
:
webhook
.
I
d
,
ID
:
webhook
.
I
D
,
})
require
.
NoError
(
t
,
err
)
webhooks
,
err
=
ts
.
ListWebhooks
(
ctx
,
&
store
.
FindWebhook
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment