package io.kaif.model.account; import java.util.Collection; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; public enum Authority { //DO NOT break order, or change name, the ordinal are used to calculate many other things /** * 這個值不會 assign 給用戶,只用來設定任何人都不能執行的權限上 */ FORBIDDEN, /** * (觀光客) * 可登入 * 修改 password * 可以重發啟用信 */ TOURIST, /** * (公民) * 可以做文章 CREATE UPDATE, upvote, downvote * 修改 avatar */ CITIZEN, /** * 投票權的人 (參政權), * 他可以進行 iVoting 等進階的投票 zone * (也有一些 zone 不用 Suffrage 就能投) * <p> * 原則上應該是透過強力的認證手段確定是真人即可 (手機簡訊認證或是臉書帳號長達五年... etc) */ SUFFRAGE, /** * sysop (站務) * 可以停權人 (未來可以獨立出去變成 `司法人員`) * 可以變更帳號的權限 * 後台管理 */ SYSOP; public static Set<Authority> fromBits(long bits) { return Stream.of(values()).filter(auth -> bitsContains(bits, auth)).collect(Collectors.toSet()); } public static boolean bitsContains(long bits, Authority authority) { return (authority.bit() & bits) == authority.bit(); } public static long toBits(Collection<Authority> authorities) { return authorities.stream().mapToLong(Authority::bit).reduce(0L, (p, n) -> p | n); } private long bit() { return 1L << ordinal(); } }