/** * This file is part of lavagna. * * lavagna is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * lavagna 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with lavagna. If not, see <http://www.gnu.org/licenses/>. */ package io.lavagna.query; import ch.digitalfondue.npjt.Bind; import ch.digitalfondue.npjt.Query; import ch.digitalfondue.npjt.QueryRepository; import ch.digitalfondue.npjt.QueryType; import io.lavagna.model.CalendarInfo; import io.lavagna.model.User; import io.lavagna.model.UserWithPassword; import java.util.Collection; import java.util.Date; import java.util.List; @QueryRepository public interface UserQuery { @Query("INSERT INTO LA_USER(USER_PROVIDER, USER_NAME, USER_PASSWORD, USER_EMAIL, USER_DISPLAY_NAME, USER_ENABLED) VALUES (:provider, :userName, :password, :email, :displayName, :enabled)") int createUser(@Bind("provider") String provider, @Bind("userName") String username, @Bind("password") String password, @Bind("email") String email, @Bind("displayName") String displayName, @Bind("enabled") boolean enabled); @Query(type = QueryType.TEMPLATE, value = "INSERT INTO LA_USER(USER_PROVIDER, USER_NAME, USER_EMAIL, USER_DISPLAY_NAME, USER_ENABLED, USER_EMAIL_NOTIFICATION, USER_MEMBER_SINCE, USER_SKIP_OWN_NOTIFICATIONS, USER_METADATA) VALUES " + " (:provider, :userName, :email, :displayName, :enabled, :emailNotification, :memberSince, :skipOwnNotifications, :metadata)") String createUserFull(); @Query("SELECT * FROM LA_USER WHERE USER_NAME = :userName AND USER_PROVIDER = :provider") User findUserByName(@Bind("provider") String provider, @Bind("userName") String userName); @Query("SELECT * FROM LA_USER WHERE USER_ID = :userId") User findUserById(@Bind("userId") int userId); @Query("SELECT * FROM LA_USER WHERE USER_ID IN (:userIds)") List<User> findByIds(@Bind("userIds") Collection<Integer> userIds); @Query("SELECT COUNT(*) FROM LA_USER WHERE USER_NAME = :userName AND USER_PROVIDER = :provider AND (USER_ENABLED IS NULL OR USER_ENABLED = :enabled) ") Integer userExistsAndEnabled(@Bind("provider") String provider, @Bind("userName") String userName, @Bind("enabled") boolean enabled); @Query("SELECT COUNT(*) FROM LA_USER WHERE USER_NAME = :userName AND USER_PROVIDER = :provider") Integer userExistsAndEnabled(@Bind("provider") String provider, @Bind("userName") String userName); String FIND_USER_COMMON_WHERE = " WHERE LOWER(USER_PROVIDER) <> 'system' AND " + "(LOWER(USER_PROVIDER) LIKE CONCAT('%', LOWER(:criteria),'%') OR LOWER(USER_NAME) LIKE CONCAT('%', LOWER(:criteria),'%') OR LOWER(USER_EMAIL) LIKE CONCAT('%', LOWER(:criteria),'%') " + " OR LOWER(USER_DISPLAY_NAME) LIKE CONCAT('%', LOWER(:criteria),'%') ) ORDER BY USER_PROVIDER, USER_NAME LIMIT 10"; @Query("SELECT * FROM LA_USER " + FIND_USER_COMMON_WHERE) List<User> findUsers(@Bind("criteria") String criteria); @Query("SELECT * FROM LA_USER "// + "inner join "// + "(select USER_ID_FK from LA_PROJECT_ROLE_PERMISSION "// + "inner join LA_PROJECT_ROLE on LA_PROJECT_ROLE_PERMISSION.project_role_id_fk = project_role_id "// + "inner join LA_PROJECT_USER_ROLE on LA_PROJECT_USER_ROLE.project_role_id_fk = project_role_id "// + "WHERE PERMISSION = :permission AND LA_PROJECT_ROLE.PROJECT_ID_FK = :projectId "// + "union "// + "select USER_ID_FK from LA_ROLE_PERMISSION "// + "inner join LA_ROLE on LA_ROLE_PERMISSION.role_id_fk = role_id "// + "inner join LA_USER_ROLE on LA_USER_ROLE .role_id_fk = role_id "// + "WHERE PERMISSION = :permission) as filtered_users on user_id = user_id_fk "// + FIND_USER_COMMON_WHERE) List<User> findUsers(@Bind("criteria") String criteria, @Bind("projectId") int projectId, @Bind("permission") String permission); @Query("UPDATE LA_USER SET USER_EMAIL = :email, USER_DISPLAY_NAME = :displayName, USER_EMAIL_NOTIFICATION = :emailNotification, USER_SKIP_OWN_NOTIFICATIONS = :skipOwnNotifications WHERE USER_ID = :userId") int updateProfile(@Bind("email") String email, @Bind("displayName") String displayName, @Bind("emailNotification") boolean emailNotification, @Bind("skipOwnNotifications") boolean skipOwnNotifications, @Bind("userId") int userId); @Query("UPDATE LA_USER SET USER_METADATA = :metadata WHERE USER_ID = :userId") int updateMetadata(@Bind("metadata") String metadata, @Bind("userId") int userId); @Query("SELECT * FROM LA_USER ORDER BY USER_PROVIDER, USER_NAME") List<User> findAll(); @Query("UPDATE LA_USER SET USER_ENABLED = :enabled WHERE USER_ID = :userId") int toggle(@Bind("enabled") boolean enabled, @Bind("userId") int userId); @Query(type = QueryType.TEMPLATE, value = "SELECT CONCAT(CONCAT(USER_PROVIDER, ':'), USER_NAME) AS PROVIDER_USER, USER_ID FROM LA_USER WHERE (USER_PROVIDER, USER_NAME) IN (:users)") String findUsersId(); @Query("INSERT INTO LA_USER_REMEMBER(USER_REMEMBER_HASHED_TOKEN, USER_REMEMBER_ID_FK, USER_REMEMBER_LAST_USE) VALUES (:hashedToken, :userId, :lastUse)") int registerRememberMeToken(@Bind("hashedToken") String hashedToken, @Bind("userId") int userId, @Bind("lastUse") Date lastUse); @Query("DELETE FROM LA_USER_REMEMBER WHERE USER_REMEMBER_HASHED_TOKEN = :hashedToken AND USER_REMEMBER_ID_FK = :userId") int deleteToken(@Bind("hashedToken") String hashedToken, @Bind("userId") int userId); @Query("SELECT COUNT(*) FROM LA_USER_REMEMBER WHERE USER_REMEMBER_HASHED_TOKEN = :hashedToken AND USER_REMEMBER_ID_FK = :userId") Integer tokenExists(@Bind("hashedToken") String hashedToken, @Bind("userId") int userId); @Query("DELETE FROM LA_USER_REMEMBER WHERE USER_REMEMBER_ID_FK = :userId") int deleteAllTokensForUserId(@Bind("userId") int id); @Query("SELECT USER_CALENDAR_TOKEN, USER_CALENDAR_DISABLE_FEED FROM LA_USER_CALENDAR WHERE USER_CALENDAR_ID_FK = :userId") CalendarInfo findCalendarInfoFromUserId(@Bind("userId") int userId); @Query("SELECT USER_ID FROM LA_USER AS USR " + "INNER JOIN LA_USER_CALENDAR AS UC ON UC.USER_CALENDAR_ID_FK = USR.USER_ID " + "WHERE USER_CALENDAR_TOKEN = :token") Integer findUserIdFromCalendarToken(@Bind("token") String token); @Query("INSERT INTO LA_USER_CALENDAR(USER_CALENDAR_ID_FK, USER_CALENDAR_TOKEN) VALUES (:userId, :token)") int registerCalendarToken(@Bind("userId") int userId,@Bind("token") String token); @Query("DELETE FROM LA_USER_CALENDAR WHERE USER_CALENDAR_ID_FK = :userId") int deleteCalendarToken(@Bind("userId") int userId); @Query("UPDATE LA_USER_CALENDAR SET USER_CALENDAR_DISABLE_FEED = :disabled WHERE USER_CALENDAR_ID_FK = :userId") int setCalendarFeedDisabled(@Bind("userId") int userId, @Bind("disabled") boolean isDisabled); @Query("SELECT USER_CALENDAR_DISABLE_FEED FROM LA_USER_CALENDAR WHERE USER_CALENDAR_ID_FK = :userId") boolean isCalendarFeedDisabled(@Bind("userId") int userId); @Query("SELECT USER_PASSWORD FROM LA_USER WHERE USER_NAME = :userName AND USER_PROVIDER = :provider") String getHashedPassword(@Bind("provider") String provider, @Bind("userName") String userName); @Query("UPDATE LA_USER SET USER_PASSWORD = :password WHERE USER_ID = :userId") int setPassword(@Bind("userId") int userId, @Bind("password") String password); @Query("select USER_NAME, USER_PASSWORD from LA_USER where USER_PROVIDER = 'password'") List<UserWithPassword> findUsersWithPasswords(); }