/*
* SonarQube
* Copyright (C) 2009-2017 SonarSource SA
* mailto:info AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.db.organization;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.sonar.api.utils.System2;
import org.sonar.db.Dao;
import org.sonar.db.DbSession;
import org.sonar.db.Pagination;
import org.sonar.db.user.GroupDto;
import static java.util.Objects.requireNonNull;
import static org.sonar.db.DatabaseUtils.executeLargeInputs;
public class OrganizationDao implements Dao {
private final System2 system2;
public OrganizationDao(System2 system2) {
this.system2 = system2;
}
public void insert(DbSession dbSession, OrganizationDto organization, boolean newProjectPrivate) {
checkDto(organization);
long now = system2.now();
organization.setCreatedAt(now);
organization.setUpdatedAt(now);
getMapper(dbSession).insert(organization, newProjectPrivate);
}
public int countByQuery(DbSession dbSession, OrganizationQuery organizationQuery) {
requireNonNull(organizationQuery, "organizationQuery can't be null");
return getMapper(dbSession).countByQuery(organizationQuery);
}
public List<OrganizationDto> selectByQuery(DbSession dbSession, OrganizationQuery organizationQuery, Pagination pagination) {
requireNonNull(organizationQuery, "organizationQuery can't be null");
return getMapper(dbSession).selectByQuery(organizationQuery, pagination);
}
public Optional<OrganizationDto> selectByUuid(DbSession dbSession, String uuid) {
checkUuid(uuid);
return Optional.ofNullable(getMapper(dbSession).selectByUuid(uuid));
}
public Optional<OrganizationDto> selectByKey(DbSession dbSession, String key) {
requireNonNull(key, "key can't be null");
return Optional.ofNullable(getMapper(dbSession).selectByKey(key));
}
public List<OrganizationDto> selectByUuids(DbSession dbSession, Set<String> organizationUuids) {
return executeLargeInputs(organizationUuids, getMapper(dbSession)::selectByUuids);
}
public List<OrganizationDto> selectByPermission(DbSession dbSession, Integer userId, String permission) {
return getMapper(dbSession).selectByPermission(userId, permission);
}
public List<OrganizationDto> selectOrganizationsWithoutLoadedTemplate(DbSession dbSession, String loadedTemplateType, Pagination pagination) {
return getMapper(dbSession).selectOrganizationsWithoutLoadedTemplate(loadedTemplateType, pagination);
}
/**
* Retrieve the default template of the specified organization if:
* <ol>
* <li>the specified organization exists</li>
* <li>the project default permission template is defined</li>
* </ol>
*/
public Optional<DefaultTemplates> getDefaultTemplates(DbSession dbSession, String organizationUuid) {
checkUuid(organizationUuid);
return Optional.ofNullable(getMapper(dbSession).selectDefaultTemplatesByUuid(organizationUuid));
}
public void setDefaultTemplates(DbSession dbSession, String uuid, DefaultTemplates defaultTemplates) {
checkUuid(uuid);
checkDefaultTemplates(defaultTemplates);
long now = system2.now();
getMapper(dbSession).updateDefaultTemplates(uuid, defaultTemplates, now);
}
public Optional<Integer> getDefaultGroupId(DbSession dbSession, String organizationUuid) {
checkUuid(organizationUuid);
return Optional.ofNullable(getMapper(dbSession).selectDefaultGroupIdByUuid(organizationUuid));
}
public void setDefaultGroupId(DbSession dbSession, String uuid, GroupDto defaultGroup) {
checkUuid(uuid);
Integer defaultGroupId = requireNonNull(defaultGroup, "Default group cannot be null").getId();
getMapper(dbSession).updateDefaultGroupId(uuid, requireNonNull(defaultGroupId, "Default group id cannot be null"), system2.now());
}
public boolean getNewProjectPrivate(DbSession dbSession, OrganizationDto organization) {
return getMapper(dbSession).selectNewProjectPrivateByUuid(organization.getUuid());
}
public void setNewProjectPrivate(DbSession dbSession, OrganizationDto organization, boolean newProjectPrivate) {
getMapper(dbSession).updateNewProjectPrivate(organization.getUuid(), newProjectPrivate, system2.now());
}
public int update(DbSession dbSession, OrganizationDto organization) {
checkDto(organization);
organization.setUpdatedAt(system2.now());
return getMapper(dbSession).update(organization);
}
public int deleteByUuid(DbSession dbSession, String uuid) {
return getMapper(dbSession).deleteByUuid(uuid);
}
private static void checkDto(OrganizationDto organization) {
requireNonNull(organization, "OrganizationDto can't be null");
}
private static OrganizationMapper getMapper(DbSession dbSession) {
return dbSession.getMapper(OrganizationMapper.class);
}
private static void checkUuid(String uuid) {
requireNonNull(uuid, "uuid can't be null");
}
private static void checkDefaultTemplates(DefaultTemplates defaultTemplates) {
requireNonNull(defaultTemplates, "defaultTemplates can't be null");
requireNonNull(defaultTemplates.getProjectUuid());
}
}