Skip to content

Commit ffb4179

Browse files
committed
RocketChat#764 [NEW] Форма подачи документов
1 parent 0bf427e commit ffb4179

38 files changed

+2129
-10
lines changed

app/api/server/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,6 @@ import './v1/working-groups';
4444
import './v1/working-group-meetings';
4545
import './v1/upload-files';
4646
import './v1/protocols';
47+
import './v1/working-groups-requests';
4748

4849
export { API, APIClass, defaultRateLimiterOptions } from './api';

app/api/server/lib/protocols.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { Protocols } from '../../../models/server/raw';
22

3-
export async function findProtocols({ query = {}, pagination: { offset, count, sort } }) {
3+
export async function findProtocols({ query = {}, fields = {}, pagination: { offset, count, sort } }) {
44
const cursor = await Protocols.find(query, {
55
sort: sort || { time: 1 },
66
skip: offset,
77
limit: count,
8+
fields,
89
});
910

1011
const total = await cursor.count();
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { WorkingGroupsRequests } from '../../../models/server/raw';
2+
3+
export async function findWorkingGroupsRequests({ query = {}, pagination: { offset, count, sort } }) {
4+
const cursor = await WorkingGroupsRequests.find(query, {
5+
sort: sort || { time: 1 },
6+
skip: offset,
7+
limit: count,
8+
});
9+
10+
const total = await cursor.count();
11+
12+
const requests = await cursor.toArray();
13+
14+
return {
15+
requests,
16+
count: requests.length,
17+
offset,
18+
total,
19+
};
20+
}
21+
22+
export async function findOneWorkingGroupRequestByInviteLink(inviteLink) {
23+
const cursor = await WorkingGroupsRequests.findWorkingGroupRequestByInviteLink({ inviteLink }, {});
24+
return cursor;
25+
}
26+
export async function findWorkingGroupRequest(_id) {
27+
const cursor = await WorkingGroupsRequests.findOne({ _id });
28+
return cursor;
29+
}

app/api/server/v1/protocols.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,26 @@ API.v1.addRoute('protocols.list', { authRequired: true }, {
2323
},
2424
});
2525

26+
API.v1.addRoute('protocols.list.requestAnswer', { authRequired: false }, {
27+
get() {
28+
const { offset, count } = this.getPaginationItems();
29+
const { sort, query } = this.parseJsonQuery();
30+
31+
return API.v1.success(Promise.await(findProtocols({
32+
query,
33+
fields: {
34+
sections: 1,
35+
num: 1,
36+
},
37+
pagination: {
38+
offset,
39+
count,
40+
sort,
41+
},
42+
})));
43+
},
44+
});
45+
2646
API.v1.addRoute('protocols.findOne', { authRequired: true }, {
2747
get() {
2848
const { query } = this.parseJsonQuery();
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
import Busboy from 'busboy';
2+
import { Meteor } from 'meteor/meteor';
3+
4+
import { API } from '../api';
5+
import { FileUpload } from '../../../file-upload';
6+
import { findWorkingGroupsRequests, findOneWorkingGroupRequestByInviteLink, findWorkingGroupRequest } from '../lib/working-groups-requests';
7+
8+
API.v1.addRoute('working-groups-requests.list', { authRequired: true }, {
9+
get() {
10+
const { offset, count } = this.getPaginationItems();
11+
const { sort, query } = this.parseJsonQuery();
12+
13+
return API.v1.success(Promise.await(findWorkingGroupsRequests({
14+
query,
15+
pagination: {
16+
offset,
17+
count,
18+
sort,
19+
},
20+
})));
21+
},
22+
});
23+
24+
API.v1.addRoute('working-groups-requests.findOne', { authRequired: true }, {
25+
get() {
26+
const { query } = this.parseJsonQuery();
27+
return API.v1.success(Promise.await(findWorkingGroupRequest(query._id)));
28+
},
29+
});
30+
31+
API.v1.addRoute('working-groups-requests.getOneByInviteLink', { authRequired: false }, {
32+
get() {
33+
const { query } = this.parseJsonQuery();
34+
return API.v1.success(Promise.await(findOneWorkingGroupRequestByInviteLink(query.inviteLink)));
35+
},
36+
});
37+
38+
const getFiles = Meteor.wrapAsync(({ request }, callback) => {
39+
const busboy = new Busboy({ headers: request.headers });
40+
const files = [];
41+
42+
const fields = {};
43+
44+
45+
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
46+
if (fieldname !== 'file') {
47+
return callback(new Meteor.Error('invalid-field'));
48+
}
49+
50+
const fileDate = [];
51+
file.on('data', (data) => fileDate.push(data));
52+
53+
file.on('end', () => {
54+
files.push({ fieldname, file, filename, encoding, mimetype, fileBuffer: Buffer.concat(fileDate) });
55+
});
56+
});
57+
58+
busboy.on('field', (fieldname, value) => { fields[fieldname] = value; });
59+
60+
busboy.on('finish', Meteor.bindEnvironment(() => callback(null, { files, fields })));
61+
62+
request.pipe(busboy);
63+
});
64+
65+
API.v1.addRoute('working-groups-requests.upload/:id/:mailId/:answerId', { authRequired: false }, {
66+
post() {
67+
const { files, fields } = getFiles({
68+
request: this.request,
69+
});
70+
71+
if (files.length === 0) {
72+
console.log('api.v1.route file required');
73+
return API.v1.failure('File required');
74+
}
75+
76+
if (files.length > 1) {
77+
console.log('api.v1.route just 3 file is allowed');
78+
return API.v1.failure('Just 3 file is allowed');
79+
}
80+
81+
const file = files[0];
82+
83+
const details = {
84+
name: file.filename,
85+
size: file.fileBuffer.length,
86+
type: file.mimetype,
87+
workingGroupRequestId: this.urlParams.id,
88+
workingGroupRequestMailId: this.urlParams.mailId,
89+
workingGroupRequestAnswerId: this.urlParams.answerId,
90+
};
91+
92+
// TODO: Requires user ID to upload file
93+
const fileData = Meteor.runAsUser('rocket.cat', () => {
94+
const fileStore = FileUpload.getStore('Uploads');
95+
const uploadedFile = fileStore.insertSync(details, file.fileBuffer);
96+
97+
uploadedFile.description = fields.description;
98+
return uploadedFile;
99+
});
100+
return API.v1.success({ _id: fileData._id });
101+
},
102+
});

app/councils/client/views/AddCouncil.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ export function AddCouncilPage() {
4949
const data = useEndpointData('users.list', query) || { users: [] };
5050

5151
useEffect(() => {
52-
setUsers(data.users);
52+
if (data.users) {
53+
setUsers(data.users);
54+
}
5355
}, [data]);
5456

5557
const onChange = useCallback(() => {
@@ -71,6 +73,7 @@ function AddCouncilWithNewData({ users, setUsers, onChange }) {
7173
const [description, setDescription] = useState('');
7274
const [invitedUsersIds, setInvitedUsersIds] = useState([]);
7375

76+
// TODO: maybe
7477
const invitedUsers = useMemo(() => users.filter((user) => invitedUsersIds.findIndex((iUser) => iUser === user._id) > -1), [invitedUsersIds, users]);
7578

7679
const insertOrUpdateCouncil = useMethod('insertOrUpdateCouncil');

app/file-upload/server/lib/FileUpload.js

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,44 @@ export const FileUpload = {
9797
return true;
9898
},
9999

100-
validateFileUpload(file) {
100+
validateFileUploadToWorkingGroupRequestAnswer(file) {
101+
console.log('validateFileUploadToWorkingGroupRequestAnswer');
102+
if (!Match.test(file.workingGroupRequestId, String)) {
103+
console.log('validateFileUploadToWorkingGroupRequestAnswer !match test');
104+
return false;
105+
}
106+
const fileUploadAllowed = settings.get('FileUpload_Enabled');
107+
// const workingGroupMeeting = WorkingGroupMeetings.findOneById(file.workingGroupMeetingId);
108+
//
109+
// if (!workingGroupMeeting) {
110+
// console.log('!workingGroupMeeting');
111+
// return false;
112+
// }
113+
const language = 'ru';
114+
if (!fileUploadAllowed) {
115+
console.log('!fileUploadAllowed');
116+
const reason = TAPi18n.__('FileUpload_Disabled', language);
117+
throw new Meteor.Error('error-file-upload-disabled', reason);
118+
}
119+
// -1 maxFileSize means there is no limit
120+
if (maxFileSize > -1 && file.size > maxFileSize) {
121+
console.log('maxFileSize > -1 && file.size > maxFileSize');
122+
const reason = TAPi18n.__('File_exceeds_allowed_size_of_bytes', {
123+
size: filesize(maxFileSize),
124+
}, language);
125+
throw new Meteor.Error('error-file-too-large', reason);
126+
}
127+
128+
if (!fileUploadIsValidContentType(file.type)) {
129+
console.log('fileUploadIsValidContentType');
130+
const reason = TAPi18n.__('File_type_is_not_accepted', language);
131+
throw new Meteor.Error('error-invalid-file-type', reason);
132+
}
133+
134+
return true;
135+
},
136+
137+
validateFileUploadToMessage(file) {
101138
if (!Match.test(file.rid, String)) {
102139
return false;
103140
}
@@ -167,7 +204,7 @@ export const FileUpload = {
167204
return {
168205
collection: Uploads.model,
169206
filter: new UploadFS.Filter({
170-
onCheck: FileUpload.validateFileUpload,
207+
onCheck: FileUpload.validateFileUploadToMessage,
171208
}),
172209
getPath(file) {
173210
return `${ settings.get('uniqueID') }/uploads/${ file.rid }/${ file.userId }/${ file._id }`;
@@ -576,7 +613,6 @@ export class FileUploadClass {
576613
return store.delete(file._id);
577614
}
578615

579-
580616
deleteByRoomId(rid) {
581617
const file = this.model.findOneByRoomId(rid);
582618

@@ -621,15 +657,16 @@ export class FileUploadClass {
621657

622658
insert(fileData, streamOrBuffer, cb) {
623659
fileData.size = parseInt(fileData.size) || 0;
624-
625660
// Check if the fileData matches store filter
626661
const filter = this.store.getFilter();
627662
if (filter && filter.check) {
628663
if (fileData.rid) {
629664
filter.check(fileData);
630-
} else {
631-
FileUpload.validateFileUploadToWorkingGroup(fileData);
632665
}
666+
// else if (!FileUpload.validateFileUploadToWorkingGroupRequestAnswer(fileData)) {
667+
// return;
668+
// //FileUpload.validateFileUploadToWorkingGroup(fileData);
669+
// }
633670
}
634671

635672
return this._doInsert(fileData, streamOrBuffer, cb);

app/models/server/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import Councils from './models/Councils';
4444
import WorkingGroups from './models/WorkingGroups';
4545
import WorkingGroupMeetings from './models/WorkingGroupMeetings';
4646
import Protocols from './models/Protocols';
47+
import WorkingGroupsRequests from './models/WorkingGroupsRequests';
4748

4849
export { AppsLogsModel } from './models/apps-logs-model';
4950
export { AppsPersistenceModel } from './models/apps-persistence-model';
@@ -100,4 +101,5 @@ export {
100101
WorkingGroups,
101102
WorkingGroupMeetings,
102103
Protocols,
104+
WorkingGroupsRequests,
103105
};

0 commit comments

Comments
 (0)