RequestOut<TEditLabReplyData> LabService::editLab(const RequestIn<TEditLabRequestData> &in)
{
    typedef RequestOut<TEditLabReplyData> Out;
    Translator t(in.locale());
    QString error;
    if (!commonCheck(t, in.data(), &error))
        return Out(error);
    bool ok = false;
    const TEditLabRequestData &requestData = in.data();
    Lab entity = LabRepo->findOne(requestData.id(), &ok);
    if (!ok)
        return Out(t.translate("LabService", "Failed to get lab (internal)", "error"));
    if (!entity.isValid())
        return Out(t.translate("LabService", "No such lab", "error"));
    entity.convertToCreatedByUser();
    entity.setAuthors(requestData.authors());
    entity.setDeletedExtraFiles(requestData.deletedExtraFiles());
    entity.setDescription(requestData.description());
    entity.setExtraFiles(requestData.newExtraFiles());
    entity.setGroups(requestData.groups());
    entity.setSaveData(requestData.editData());
    if (requestData.editData()) {
        entity.setDataList(requestData.dataList());
        entity.setType(requestData.dataList().first().type());
    }
    entity.setTags(requestData.tags());
    entity.setTitle(requestData.title());
    TransactionHolder holder(Source);
    LabRepo->edit(entity, &ok);
    if (!ok)
        return Out(t.translate("LabService", "Failed to edit lab (internal)", "error"));
    entity = LabRepo->findOne(entity.id(), &ok);
    if (!ok || !entity.isValid())
        return Out(t.translate("LabService", "Failed to get lab (internal)", "error"));
    TEditLabReplyData replyData;
    TLabInfo info = labToLabInfo(entity, &ok);
    if (!ok)
        return Out(t.translate("LabService", "Failed to create lab info (internal)", "error"));
    if (!commit(t, holder, &error))
        return Out(error);
    replyData.setLabInfo(info);
    return Out(replyData, entity.lastModificationDateTime());
}
RequestOut<TAddLabReplyData> LabService::addLab(const RequestIn<TAddLabRequestData> &in, quint64 userId)
{
    typedef RequestOut<TAddLabReplyData> Out;
    Translator t(in.locale());
    QString error;
    const TAddLabRequestData &requestData = in.data();
    if (!commonCheck(t, requestData, &error))
        return Out(error);
    if (!checkUserId(t, userId, &error))
        return Out(error);
    bool ok = false;
    Lab entity;
    entity.setAuthors(requestData.authors());
    entity.setDataList(requestData.dataList());
    entity.setDescription(requestData.description());
    entity.setExtraFiles(requestData.extraFiles());
    entity.setGroups(requestData.groups());
    entity.setSenderId(userId);
    entity.setTags(requestData.tags());
    entity.setTitle(requestData.title());
    entity.setType(requestData.dataList().first().type());
    TransactionHolder holder(Source);
    quint64 id = LabRepo->add(entity, &ok);
    if (!ok || !id)
        return Out(t.translate("LabService", "Failed to add lab (internal)", "error"));
    entity = LabRepo->findOne(id, &ok);
    if (!ok || !entity.isValid())
        return Out(t.translate("LabService", "Failed to get lab (internal)", "error"));
    TLabInfo info = labToLabInfo(entity, &ok);
    if (!ok)
        return Out(t.translate("LabService", "Failed to create lab info (internal)", "error"));
    if (!commit(t, holder, &error))
        return Out(error);
    TAddLabReplyData replyData;
    replyData.setLabInfo(info);
    return Out(replyData, info.creationDateTime());
}