fix: decouple meeting note upload binding
This commit is contained in:
+2
-21
@@ -257,7 +257,7 @@ func largeFileReceiveHTTP(wrt http.ResponseWriter, req *http.Request) {
|
|||||||
writeHttpResponse(ErrAuthRequired(msgID, "", now, now), nil)
|
writeHttpResponse(ErrAuthRequired(msgID, "", now, now), nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
meetingID, meetingNoteIdempotencyKey, err := meetingNoteUploadParams(req, principal)
|
meetingID, _, err := meetingNoteUploadParams(req, principal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
writeHttpResponse(decodeStoreError(err, msgID, now, nil), err)
|
writeHttpResponse(decodeStoreError(err, msgID, now, nil), err)
|
||||||
return
|
return
|
||||||
@@ -375,16 +375,8 @@ func largeFileReceiveHTTP(wrt http.ResponseWriter, req *http.Request) {
|
|||||||
params["expires"] = now.Add(globals.mediaGcPeriod).Format(types.TimeFormatRFC3339)
|
params["expires"] = now.Add(globals.mediaGcPeriod).Format(types.TimeFormatRFC3339)
|
||||||
}
|
}
|
||||||
if meetingID != "" {
|
if meetingID != "" {
|
||||||
noteFile, err := createMeetingNoteFromUpload(principal, meetingID, meetingNoteIdempotencyKey, fdef)
|
|
||||||
if err != nil {
|
|
||||||
writeHttpResponse(decodeStoreError(err, msgID, now, nil), err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
params["purpose"] = fileUploadPurposeMeetingNote
|
params["purpose"] = fileUploadPurposeMeetingNote
|
||||||
params["meeting_id"] = noteFile.MeetingID
|
params["meeting_id"] = meetingID
|
||||||
params["note_file_id"] = noteFile.NoteFileID
|
|
||||||
params["note_file_status"] = noteFile.Status
|
|
||||||
params["version"] = noteFile.Version
|
|
||||||
}
|
}
|
||||||
|
|
||||||
writeHttpResponse(NoErrParams(msgID, "", now, params), nil)
|
writeHttpResponse(NoErrParams(msgID, "", now, params), nil)
|
||||||
@@ -398,9 +390,6 @@ func meetingNoteUploadParams(req *http.Request, principal RequestPrincipal) (str
|
|||||||
if principal.UID.IsZero() {
|
if principal.UID.IsZero() {
|
||||||
return "", "", types.ErrPermissionDenied
|
return "", "", types.ErrPermissionDenied
|
||||||
}
|
}
|
||||||
if store.MeetingNotes == nil {
|
|
||||||
return "", "", types.ErrUnsupported
|
|
||||||
}
|
|
||||||
meetingID := strings.TrimSpace(req.FormValue("meeting_id"))
|
meetingID := strings.TrimSpace(req.FormValue("meeting_id"))
|
||||||
if meetingID == "" {
|
if meetingID == "" {
|
||||||
return "", "", types.ErrMalformed
|
return "", "", types.ErrMalformed
|
||||||
@@ -415,14 +404,6 @@ func meetingNoteUploadParams(req *http.Request, principal RequestPrincipal) (str
|
|||||||
return meetingID, idempotencyKey, nil
|
return meetingID, idempotencyKey, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createMeetingNoteFromUpload(principal RequestPrincipal, meetingID, idempotencyKey string, fdef *types.FileDef) (*types.MeetingNoteFile, error) {
|
|
||||||
if fdef == nil || fdef.Uid().IsZero() {
|
|
||||||
return nil, types.ErrMalformed
|
|
||||||
}
|
|
||||||
noteFileID := "mnote_" + store.Store.GetUidString()
|
|
||||||
return store.MeetingNotes.CreateFile(principal.TenantID, principal.UID, meetingID, noteFileID, fdef.Uid().String(), idempotencyKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
// LargeFileServe is the gRPC equivalent of largeFileServeHTTP.
|
// LargeFileServe is the gRPC equivalent of largeFileServeHTTP.
|
||||||
func (*grpcNodeServer) LargeFileServe(req *pbx.FileDownReq, stream pbx.Node_LargeFileServeServer) error {
|
func (*grpcNodeServer) LargeFileServe(req *pbx.FileDownReq, stream pbx.Node_LargeFileServeServer) error {
|
||||||
now := types.TimeNow()
|
now := types.TimeNow()
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ func TestLargeFileGarbageCollectTenantsScopesDeletes(t *testing.T) {
|
|||||||
largeFileGarbageCollectTenants([]types.TenantID{7, 8}, olderThan, 25)
|
largeFileGarbageCollectTenants([]types.TenantID{7, 8}, olderThan, 25)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLargeFileReceiveMeetingNoteUploadCreatesNoteFile(t *testing.T) {
|
func TestLargeFileReceiveMeetingNoteUploadReturnsFileID(t *testing.T) {
|
||||||
ctrl := gomock.NewController(t)
|
ctrl := gomock.NewController(t)
|
||||||
defer ctrl.Finish()
|
defer ctrl.Finish()
|
||||||
|
|
||||||
@@ -229,17 +229,15 @@ func TestLargeFileReceiveMeetingNoteUploadCreatesNoteFile(t *testing.T) {
|
|||||||
mockStore := mock_store.NewMockPersistentStorageInterface(ctrl)
|
mockStore := mock_store.NewMockPersistentStorageInterface(ctrl)
|
||||||
tokenAuth := mock_auth.NewMockAuthHandler(ctrl)
|
tokenAuth := mock_auth.NewMockAuthHandler(ctrl)
|
||||||
files := mock_store.NewMockFilePersistenceInterface(ctrl)
|
files := mock_store.NewMockFilePersistenceInterface(ctrl)
|
||||||
notes := &testMeetingNotesStore{}
|
|
||||||
store.Store = mockStore
|
store.Store = mockStore
|
||||||
store.Files = files
|
store.Files = files
|
||||||
store.MeetingNotes = notes
|
store.MeetingNotes = nil
|
||||||
kafkaBus = nil
|
kafkaBus = nil
|
||||||
|
|
||||||
fileID := types.Uid(101)
|
fileID := types.Uid(101)
|
||||||
mockStore.EXPECT().GetMediaHandler().Return(handler).AnyTimes()
|
mockStore.EXPECT().GetMediaHandler().Return(handler).AnyTimes()
|
||||||
mockStore.EXPECT().GetLogicalAuthHandler("token").Return(tokenAuth)
|
mockStore.EXPECT().GetLogicalAuthHandler("token").Return(tokenAuth)
|
||||||
mockStore.EXPECT().GetUidString().Return(fileID.String())
|
mockStore.EXPECT().GetUidString().Return(fileID.String())
|
||||||
mockStore.EXPECT().GetUidString().Return("note-1")
|
|
||||||
tokenAuth.EXPECT().Authenticate(auth.AuthContext{RemoteAddr: "192.0.2.1:12345"}, []byte("token-1")).
|
tokenAuth.EXPECT().Authenticate(auth.AuthContext{RemoteAddr: "192.0.2.1:12345"}, []byte("token-1")).
|
||||||
Return(&auth.Rec{TenantID: 7, Uid: 42, AuthLevel: auth.LevelAuth}, nil, nil)
|
Return(&auth.Rec{TenantID: 7, Uid: 42, AuthLevel: auth.LevelAuth}, nil, nil)
|
||||||
files.EXPECT().FinishUpload(types.TenantID(7), gomock.Any(), true, int64(11)).DoAndReturn(
|
files.EXPECT().FinishUpload(types.TenantID(7), gomock.Any(), true, int64(11)).DoAndReturn(
|
||||||
@@ -289,10 +287,13 @@ func TestLargeFileReceiveMeetingNoteUploadCreatesNoteFile(t *testing.T) {
|
|||||||
}
|
}
|
||||||
params := resp.Ctrl.Params.(map[string]any)
|
params := resp.Ctrl.Params.(map[string]any)
|
||||||
if params["file_id"] != fileID.String() || params["purpose"] != fileUploadPurposeMeetingNote ||
|
if params["file_id"] != fileID.String() || params["purpose"] != fileUploadPurposeMeetingNote ||
|
||||||
params["meeting_id"] != "mtg_test" || params["note_file_id"] != "mnote_note-1" {
|
params["meeting_id"] != "mtg_test" {
|
||||||
t.Fatalf("unexpected upload params: %#v", params)
|
t.Fatalf("unexpected upload params: %#v", params)
|
||||||
}
|
}
|
||||||
if handler.data != "hello notes" || handler.def.OriginalName != "notes.txt" || notes.createdFileID != fileID.String() || notes.createdMeetingID != "mtg_test" || notes.createdIdempotencyKey != "upload-meeting-note-1" {
|
if _, ok := params["note_file_id"]; ok {
|
||||||
t.Fatalf("unexpected side effects: handler=%#v notes=%#v", handler, notes)
|
t.Fatalf("upload should not bind meeting note file: %#v", params)
|
||||||
|
}
|
||||||
|
if handler.data != "hello notes" || handler.def.OriginalName != "notes.txt" {
|
||||||
|
t.Fatalf("unexpected side effects: handler=%#v", handler)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user