MOBILE-2354 workshop: Workshop and offline providers
parent
daeb78489f
commit
f90e699ac3
|
@ -0,0 +1,790 @@
|
||||||
|
// (C) Copyright 2015 Martin Dougiamas
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { CoreFileProvider } from '@providers/file';
|
||||||
|
import { CoreSitesProvider } from '@providers/sites';
|
||||||
|
import { CoreTextUtilsProvider } from '@providers/utils/text';
|
||||||
|
import { CoreTimeUtilsProvider } from '@providers/utils/time';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service to handle offline workshop.
|
||||||
|
*/
|
||||||
|
@Injectable()
|
||||||
|
export class AddonModWorkshopOfflineProvider {
|
||||||
|
|
||||||
|
// Variables for database.
|
||||||
|
protected SUBMISSIONS_TABLE = 'addon_mod_workshop_submissions';
|
||||||
|
protected ASSESSMENTS_TABLE = 'addon_mod_workshop_assessments';
|
||||||
|
protected EVALUATE_SUBMISSIONS_TABLE = 'addon_mod_workshop_evaluate_submissions';
|
||||||
|
protected EVALUATE_ASSESSMENTS_TABLE = 'addon_mod_workshop_evaluate_assessments';
|
||||||
|
|
||||||
|
protected tablesSchema = [
|
||||||
|
{
|
||||||
|
name: this.SUBMISSIONS_TABLE,
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
name: 'workshopid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'submissionid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'action',
|
||||||
|
type: 'TEXT',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'courseid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'title',
|
||||||
|
type: 'TEXT',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'content',
|
||||||
|
type: 'TEXT',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'attachmentsid',
|
||||||
|
type: 'TEXT',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'timemodified',
|
||||||
|
type: 'INTEGER',
|
||||||
|
}
|
||||||
|
],
|
||||||
|
primaryKeys: ['workshopid', 'submissionid', 'action']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: this.ASSESSMENTS_TABLE,
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
name: 'workshopid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'assessmentid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'courseid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'inputdata',
|
||||||
|
type: 'TEXT',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'timemodified',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
primaryKeys: ['workshopid', 'assessmentid']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: this.EVALUATE_SUBMISSIONS_TABLE,
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
name: 'workshopid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'submissionid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'courseid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'timemodified',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'feedbacktext',
|
||||||
|
type: 'TEXT',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'published',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'gradeover',
|
||||||
|
type: 'TEXT',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
primaryKeys: ['workshopid', 'submissionid']
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: this.EVALUATE_ASSESSMENTS_TABLE,
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
name: 'workshopid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'assessmentid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'courseid',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'timemodified',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'feedbacktext',
|
||||||
|
type: 'TEXT',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'weight',
|
||||||
|
type: 'INTEGER',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'gradinggradeover',
|
||||||
|
type: 'TEXT',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
primaryKeys: ['workshopid', 'assessmentid']
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
constructor(private fileProvider: CoreFileProvider,
|
||||||
|
private sitesProvider: CoreSitesProvider,
|
||||||
|
private textUtils: CoreTextUtilsProvider,
|
||||||
|
private timeUtils: CoreTimeUtilsProvider) {
|
||||||
|
this.sitesProvider.createTablesFromSchema(this.tablesSchema);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all the workshops ids that have something to be synced.
|
||||||
|
*
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<number[]>} Promise resolved with workshops id that have something to be synced.
|
||||||
|
*/
|
||||||
|
getAllWorkshops(siteId?: string): Promise<number[]> {
|
||||||
|
const promises = [
|
||||||
|
this.getAllSubmissions(siteId),
|
||||||
|
this.getAllAssessments(siteId),
|
||||||
|
this.getAllEvaluateSubmissions(siteId),
|
||||||
|
this.getAllEvaluateAssessments(siteId)
|
||||||
|
];
|
||||||
|
|
||||||
|
return Promise.all(promises).then((promiseResults) => {
|
||||||
|
const workshopIds = {};
|
||||||
|
|
||||||
|
// Get workshops from any offline object all should have workshopid.
|
||||||
|
promiseResults.forEach((offlineObjects) => {
|
||||||
|
offlineObjects.forEach((offlineObject) => {
|
||||||
|
workshopIds[offlineObject.workshopid] = true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return Object.keys(workshopIds).map((workshopId) => parseInt(workshopId, 10));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if there is an offline data to be synced.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID to remove.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<boolean>} Promise resolved with boolean: true if has offline data, false otherwise.
|
||||||
|
*/
|
||||||
|
hasWorkshopOfflineData(workshopId: number, siteId?: string): Promise<boolean> {
|
||||||
|
const promises = [
|
||||||
|
this.getSubmissions(workshopId, siteId),
|
||||||
|
this.getAssessments(workshopId, siteId),
|
||||||
|
this.getEvaluateSubmissions(workshopId, siteId),
|
||||||
|
this.getEvaluateAssessments(workshopId, siteId)
|
||||||
|
];
|
||||||
|
|
||||||
|
return Promise.all(promises).then((results) => {
|
||||||
|
return results.some((result) => result && result.length);
|
||||||
|
}).catch(() => {
|
||||||
|
// No offline data found.
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete workshop submission action.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} submissionId Submission ID.
|
||||||
|
* @param {string} action Action to be done.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved if stored, rejected if failure.
|
||||||
|
*/
|
||||||
|
deleteSubmissionAction(workshopId: number, submissionId: number, action: string, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
submissionid: submissionId,
|
||||||
|
action: action
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().deleteRecords(this.SUBMISSIONS_TABLE, conditions);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete all workshop submission actions.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} submissionId Submission ID.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved if stored, rejected if failure.
|
||||||
|
*/
|
||||||
|
deleteAllSubmissionActions(workshopId: number, submissionId: number, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
submissionid: submissionId,
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().deleteRecords(this.SUBMISSIONS_TABLE, conditions);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the all the submissions to be synced.
|
||||||
|
*
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any[]>} Promise resolved with the objects to be synced.
|
||||||
|
*/
|
||||||
|
getAllSubmissions(siteId?: string): Promise<any[]> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
return site.getDb().getRecords(this.SUBMISSIONS_TABLE).then((records) => {
|
||||||
|
records.forEach(this.parseSubmissionRecord.bind(this));
|
||||||
|
|
||||||
|
return records;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the submissions of a workshop to be synced.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId ID of the workshop.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved with the object to be synced.
|
||||||
|
*/
|
||||||
|
getSubmissions(workshopId: number, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().getRecords(this.SUBMISSIONS_TABLE, conditions).then((records) => {
|
||||||
|
records.forEach(this.parseSubmissionRecord.bind(this));
|
||||||
|
|
||||||
|
return records;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all actions of a submission of a workshop to be synced.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId ID of the workshop.
|
||||||
|
* @param {number} submissionId ID of the submission.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any[]>} Promise resolved with the object to be synced.
|
||||||
|
*/
|
||||||
|
getSubmissionActions(workshopId: number, submissionId: number, siteId?: string): Promise<any[]> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
submissionid: submissionId
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().getRecords(this.SUBMISSIONS_TABLE, conditions).then((records) => {
|
||||||
|
records.forEach(this.parseSubmissionRecord.bind(this));
|
||||||
|
|
||||||
|
return records;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an specific action of a submission of a workshop to be synced.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId ID of the workshop.
|
||||||
|
* @param {number} submissionId ID of the submission.
|
||||||
|
* @param {string} action Action to be done.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved with the object to be synced.
|
||||||
|
*/
|
||||||
|
getSubmissionAction(workshopId: number, submissionId: number, action: string, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
submissionid: submissionId,
|
||||||
|
action: action
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().getRecord(this.SUBMISSIONS_TABLE, conditions).then((record) => {
|
||||||
|
this.parseSubmissionRecord(record);
|
||||||
|
|
||||||
|
return record;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Offline version for adding a submission action to a workshop.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} courseId Course ID the workshop belongs to.
|
||||||
|
* @param {string} title The submission title.
|
||||||
|
* @param {string} content The submission text content.
|
||||||
|
* @param {any} attachmentsId Stored attachments.
|
||||||
|
* @param {number} submissionId Submission Id, if action is add, the time the submission was created.
|
||||||
|
* If set to 0, current time is used.
|
||||||
|
* @param {string} action Action to be done. ['add', 'update', 'delete']
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when submission action is successfully saved.
|
||||||
|
*/
|
||||||
|
saveSubmission(workshopId: number, courseId: number, title: string, content: string, attachmentsId: any,
|
||||||
|
submissionId: number, action: string, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const timemodified = this.timeUtils.timestamp();
|
||||||
|
const assessment = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
courseid: courseId,
|
||||||
|
title: title,
|
||||||
|
content: content,
|
||||||
|
attachmentsid: JSON.stringify(attachmentsId),
|
||||||
|
action: action,
|
||||||
|
submissionid: submissionId ? submissionId : -timemodified,
|
||||||
|
timemodified: timemodified
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().insertRecord(this.SUBMISSIONS_TABLE, assessment);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse "attachments" column of a submission record.
|
||||||
|
*
|
||||||
|
* @param {any} record Submission record, modified in place.
|
||||||
|
*/
|
||||||
|
protected parseSubmissionRecord(record: any): void {
|
||||||
|
record.attachmentsid = this.textUtils.parseJSON(record.attachmentsid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete workshop assessment.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} assessmentId Assessment ID.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved if stored, rejected if failure.
|
||||||
|
*/
|
||||||
|
deleteAssessment(workshopId: number, assessmentId: number, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
assessmentid: assessmentId
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().deleteRecords(this.ASSESSMENTS_TABLE, conditions);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the all the assessments to be synced.
|
||||||
|
*
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any[]>} Promise resolved with the objects to be synced.
|
||||||
|
*/
|
||||||
|
getAllAssessments(siteId?: string): Promise<any[]> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
return site.getDb().getRecords(this.ASSESSMENTS_TABLE).then((records) => {
|
||||||
|
records.forEach(this.parseAssessnentRecord.bind(this));
|
||||||
|
|
||||||
|
return records;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the assessments of a workshop to be synced.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId ID of the workshop.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any[]>} Promise resolved with the object to be synced.
|
||||||
|
*/
|
||||||
|
getAssessments(workshopId: number, siteId?: string): Promise<any[]> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().getRecords(this.ASSESSMENTS_TABLE, conditions).then((records) => {
|
||||||
|
records.forEach(this.parseAssessnentRecord.bind(this));
|
||||||
|
|
||||||
|
return records;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an specific assessment of a workshop to be synced.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId ID of the workshop.
|
||||||
|
* @param {number} assessmentId Assessment ID.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved with the object to be synced.
|
||||||
|
*/
|
||||||
|
getAssessment(workshopId: number, assessmentId: number, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
assessmentid: assessmentId
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().getRecord(this.ASSESSMENTS_TABLE, conditions).then((record) => {
|
||||||
|
this.parseAssessnentRecord(record);
|
||||||
|
|
||||||
|
return record;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Offline version for adding an assessment to a workshop.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} assessmentId Assessment ID.
|
||||||
|
* @param {number} courseId Course ID the workshop belongs to.
|
||||||
|
* @param {any} inputData Assessment data.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when assessment is successfully saved.
|
||||||
|
*/
|
||||||
|
saveAssessment(workshopId: number, assessmentId: number, courseId: number, inputData: any, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const assessment = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
courseid: courseId,
|
||||||
|
inputdata: JSON.stringify(inputData),
|
||||||
|
assessmentid: assessmentId,
|
||||||
|
timemodified: this.timeUtils.timestamp()
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().insertRecord(this.ASSESSMENTS_TABLE, assessment);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse "inpudata" column of an assessment record.
|
||||||
|
*
|
||||||
|
* @param {any} record Assessnent record, modified in place.
|
||||||
|
*/
|
||||||
|
protected parseAssessnentRecord(record: any): void {
|
||||||
|
record.inputdata = this.textUtils.parseJSON(record.inputdata);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete workshop evaluate submission.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} submissionId Submission ID.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved if stored, rejected if failure.
|
||||||
|
*/
|
||||||
|
deleteEvaluateSubmission(workshopId: number, submissionId: number, siteId?: string): Promise<any> {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
submissionid: submissionId
|
||||||
|
};
|
||||||
|
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
return site.getDb().deleteRecords(this.EVALUATE_SUBMISSIONS_TABLE, conditions);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the all the evaluate submissions to be synced.
|
||||||
|
*
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any[]>} Promise resolved with the objects to be synced.
|
||||||
|
*/
|
||||||
|
getAllEvaluateSubmissions(siteId?: string): Promise<any[]> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
return site.getDb().getRecords(this.EVALUATE_SUBMISSIONS_TABLE).then((records) => {
|
||||||
|
records.forEach(this.parseEvaluateSubmissionRecord.bind(this));
|
||||||
|
|
||||||
|
return records;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the evaluate submissions of a workshop to be synced.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId ID of the workshop.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any[]>} Promise resolved with the object to be synced.
|
||||||
|
*/
|
||||||
|
getEvaluateSubmissions(workshopId: number, siteId?: string): Promise<any[]> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().getRecords(this.EVALUATE_SUBMISSIONS_TABLE, conditions).then((records) => {
|
||||||
|
records.forEach(this.parseEvaluateSubmissionRecord.bind(this));
|
||||||
|
|
||||||
|
return records;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an specific evaluate submission of a workshop to be synced.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId ID of the workshop.
|
||||||
|
* @param {number} submissionId Submission ID.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved with the object to be synced.
|
||||||
|
*/
|
||||||
|
getEvaluateSubmission(workshopId: number, submissionId: number, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
submissionid: submissionId
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().getRecord(this.EVALUATE_SUBMISSIONS_TABLE, conditions).then((record) => {
|
||||||
|
this.parseEvaluateSubmissionRecord(record);
|
||||||
|
|
||||||
|
return record;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Offline version for evaluation a submission to a workshop.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} submissionId Submission ID.
|
||||||
|
* @param {number} courseId Course ID the workshop belongs to.
|
||||||
|
* @param {string} feedbackText The feedback for the author.
|
||||||
|
* @param {boolean} published Whether to publish the submission for other users.
|
||||||
|
* @param {any} gradeOver The new submission grade (empty for no overriding the grade).
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when submission evaluation is successfully saved.
|
||||||
|
*/
|
||||||
|
saveEvaluateSubmission(workshopId: number, submissionId: number, courseId: number, feedbackText: string, published: boolean,
|
||||||
|
gradeOver: any, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const submission = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
courseid: courseId,
|
||||||
|
submissionid: submissionId,
|
||||||
|
timemodified: this.timeUtils.timestamp(),
|
||||||
|
feedbacktext: feedbackText,
|
||||||
|
published: Number(published),
|
||||||
|
gradeover: JSON.stringify(gradeOver)
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().insertRecord(this.EVALUATE_SUBMISSIONS_TABLE, submission);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse "published" and "gradeover" columns of an evaluate submission record.
|
||||||
|
*
|
||||||
|
* @param {any} record Evaluate submission record, modified in place.
|
||||||
|
*/
|
||||||
|
protected parseEvaluateSubmissionRecord(record: any): void {
|
||||||
|
record.published = Boolean(record.published);
|
||||||
|
record.gradeover = this.textUtils.parseJSON(record.gradeover);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete workshop evaluate assessment.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} assessmentId Assessment ID.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved if stored, rejected if failure.
|
||||||
|
*/
|
||||||
|
deleteEvaluateAssessment(workshopId: number, assessmentId: number, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
assessmentid: assessmentId
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().deleteRecords(this.EVALUATE_ASSESSMENTS_TABLE, conditions);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the all the evaluate assessments to be synced.
|
||||||
|
*
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any[]>} Promise resolved with the objects to be synced.
|
||||||
|
*/
|
||||||
|
getAllEvaluateAssessments(siteId?: string): Promise<any[]> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
return site.getDb().getRecords(this.EVALUATE_ASSESSMENTS_TABLE).then((records) => {
|
||||||
|
records.forEach(this.parseEvaluateAssessmentRecord.bind(this));
|
||||||
|
|
||||||
|
return records;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the evaluate assessments of a workshop to be synced.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId ID of the workshop.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any[]>} Promise resolved with the object to be synced.
|
||||||
|
*/
|
||||||
|
getEvaluateAssessments(workshopId: number, siteId?: string): Promise<any[]> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().getRecords(this.EVALUATE_ASSESSMENTS_TABLE, conditions).then((records) => {
|
||||||
|
records.forEach(this.parseEvaluateAssessmentRecord.bind(this));
|
||||||
|
|
||||||
|
return records;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an specific evaluate assessment of a workshop to be synced.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId ID of the workshop.
|
||||||
|
* @param {number} assessmentId Assessment ID.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved with the object to be synced.
|
||||||
|
*/
|
||||||
|
getEvaluateAssessment(workshopId: number, assessmentId: number, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const conditions = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
assessmentid: assessmentId
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().getRecord(this.EVALUATE_ASSESSMENTS_TABLE, conditions).then((record) => {
|
||||||
|
this.parseEvaluateAssessmentRecord(record);
|
||||||
|
|
||||||
|
return record;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Offline version for evaluating an assessment to a workshop.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} assessmentId Assessment ID.
|
||||||
|
* @param {number} courseId Course ID the workshop belongs to.
|
||||||
|
* @param {string} feedbackText The feedback for the reviewer.
|
||||||
|
* @param {number} weight The new weight for the assessment.
|
||||||
|
* @param {any} gradingGradeOver The new grading grade (empty for no overriding the grade).
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<any>} Promise resolved when assessment evaluation is successfully saved.
|
||||||
|
*/
|
||||||
|
saveEvaluateAssessment(workshopId: number, assessmentId: number, courseId: number, feedbackText: string, weight: number,
|
||||||
|
gradingGradeOver: any, siteId?: string): Promise<any> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
const assessment = {
|
||||||
|
workshopid: workshopId,
|
||||||
|
courseid: courseId,
|
||||||
|
assessmentid: assessmentId,
|
||||||
|
timemodified: this.timeUtils.timestamp(),
|
||||||
|
feedbacktext: feedbackText,
|
||||||
|
weight: weight,
|
||||||
|
gradinggradeover: JSON.stringify(gradingGradeOver)
|
||||||
|
};
|
||||||
|
|
||||||
|
return site.getDb().insertRecord(this.EVALUATE_ASSESSMENTS_TABLE, assessment);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse "gradinggradeover" column of an evaluate assessment record.
|
||||||
|
*
|
||||||
|
* @param {any} record Evaluate assessment record, modified in place.
|
||||||
|
*/
|
||||||
|
protected parseEvaluateAssessmentRecord(record: any): void {
|
||||||
|
record.gradinggradeover = this.textUtils.parseJSON(record.gradinggradeover);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path to the folder where to store files for offline attachments in a workshop.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<string>} Promise resolved with the path.
|
||||||
|
*/
|
||||||
|
getWorkshopFolder(workshopId: number, siteId?: string): Promise<string> {
|
||||||
|
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||||
|
|
||||||
|
const siteFolderPath = this.fileProvider.getSiteFolder(site.getId());
|
||||||
|
const workshopFolderPath = 'offlineworkshop/' + workshopId + '/';
|
||||||
|
|
||||||
|
return this.textUtils.concatenatePaths(siteFolderPath, workshopFolderPath);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path to the folder where to store files for offline submissions.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} submissionId If not editing, it will refer to timecreated.
|
||||||
|
* @param {boolean} editing If the submission is being edited or added otherwise.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<string>} Promise resolved with the path.
|
||||||
|
*/
|
||||||
|
getSubmissionFolder(workshopId: number, submissionId: number, editing: boolean, siteId?: string): Promise<string> {
|
||||||
|
return this.getWorkshopFolder(workshopId, siteId).then((folderPath) => {
|
||||||
|
folderPath += 'submission/';
|
||||||
|
const folder = editing ? 'update_' + submissionId : 'add';
|
||||||
|
|
||||||
|
return this.textUtils.concatenatePaths(folderPath, folder);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path to the folder where to store files for offline assessment.
|
||||||
|
*
|
||||||
|
* @param {number} workshopId Workshop ID.
|
||||||
|
* @param {number} assessmentId Assessment ID.
|
||||||
|
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||||
|
* @return {Promise<string>} Promise resolved with the path.
|
||||||
|
*/
|
||||||
|
getAssessmentFolder(workshopId: number, assessmentId: number, siteId?: string): Promise<string> {
|
||||||
|
return this.getWorkshopFolder(workshopId, siteId).then((folderPath) => {
|
||||||
|
folderPath += 'assessment/';
|
||||||
|
|
||||||
|
return this.textUtils.concatenatePaths(folderPath, String(assessmentId));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue