internal/service/auth/auth.go (107 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ package auth import ( "context" "github.com/apache/answer/internal/entity" "github.com/apache/answer/pkg/token" "github.com/apache/answer/plugin" ) // AuthRepo auth repository type AuthRepo interface { GetUserCacheInfo(ctx context.Context, accessToken string) (userInfo *entity.UserCacheInfo, err error) SetUserCacheInfo(ctx context.Context, accessToken, visitToken string, userInfo *entity.UserCacheInfo) error GetUserVisitCacheInfo(ctx context.Context, visitToken string) (accessToken string, err error) RemoveUserCacheInfo(ctx context.Context, accessToken string) (err error) RemoveUserVisitCacheInfo(ctx context.Context, visitToken string) (err error) SetUserStatus(ctx context.Context, userID string, userInfo *entity.UserCacheInfo) (err error) GetUserStatus(ctx context.Context, userID string) (userInfo *entity.UserCacheInfo, err error) RemoveUserStatus(ctx context.Context, userID string) (err error) GetAdminUserCacheInfo(ctx context.Context, accessToken string) (userInfo *entity.UserCacheInfo, err error) SetAdminUserCacheInfo(ctx context.Context, accessToken string, userInfo *entity.UserCacheInfo) error RemoveAdminUserCacheInfo(ctx context.Context, accessToken string) (err error) AddUserTokenMapping(ctx context.Context, userID, accessToken string) (err error) RemoveUserTokens(ctx context.Context, userID string, remainToken string) } // AuthService kit service type AuthService struct { authRepo AuthRepo } // NewAuthService email service func NewAuthService(authRepo AuthRepo) *AuthService { return &AuthService{ authRepo: authRepo, } } func (as *AuthService) GetUserCacheInfo(ctx context.Context, accessToken string) (userInfo *entity.UserCacheInfo, err error) { userCacheInfo, err := as.authRepo.GetUserCacheInfo(ctx, accessToken) if err != nil { return nil, err } if userCacheInfo == nil { return nil, nil } cacheInfo, _ := as.authRepo.GetUserStatus(ctx, userCacheInfo.UserID) if cacheInfo != nil { userCacheInfo.UserStatus = cacheInfo.UserStatus userCacheInfo.EmailStatus = cacheInfo.EmailStatus userCacheInfo.RoleID = cacheInfo.RoleID // update current user cache info err := as.authRepo.SetUserCacheInfo(ctx, accessToken, userCacheInfo.VisitToken, userCacheInfo) if err != nil { return nil, err } } // try to get user status from user center uc, ok := plugin.GetUserCenter() if ok && len(userCacheInfo.ExternalID) > 0 { if userStatus := uc.UserStatus(userCacheInfo.ExternalID); userStatus != plugin.UserStatusAvailable { userCacheInfo.UserStatus = int(userStatus) } } return userCacheInfo, nil } func (as *AuthService) SetUserCacheInfo(ctx context.Context, userInfo *entity.UserCacheInfo) ( accessToken string, visitToken string, err error) { accessToken = token.GenerateToken() visitToken = token.GenerateToken() err = as.authRepo.SetUserCacheInfo(ctx, accessToken, visitToken, userInfo) if err != nil { return "", "", err } return accessToken, visitToken, err } func (as *AuthService) CheckUserVisitToken(ctx context.Context, visitToken string) bool { accessToken, err := as.authRepo.GetUserVisitCacheInfo(ctx, visitToken) if err != nil { return false } if len(accessToken) == 0 { return false } return true } func (as *AuthService) SetUserStatus(ctx context.Context, userInfo *entity.UserCacheInfo) (err error) { return as.authRepo.SetUserStatus(ctx, userInfo.UserID, userInfo) } func (as *AuthService) RemoveUserCacheInfo(ctx context.Context, accessToken string) (err error) { return as.authRepo.RemoveUserCacheInfo(ctx, accessToken) } func (as *AuthService) RemoveUserVisitCacheInfo(ctx context.Context, visitToken string) (err error) { if len(visitToken) > 0 { return as.authRepo.RemoveUserVisitCacheInfo(ctx, visitToken) } return nil } // AddUserTokenMapping add user token mapping func (as *AuthService) AddUserTokenMapping(ctx context.Context, userID, accessToken string) (err error) { return as.authRepo.AddUserTokenMapping(ctx, userID, accessToken) } // RemoveUserAllTokens Log out all users under this user id func (as *AuthService) RemoveUserAllTokens(ctx context.Context, userID string) { as.authRepo.RemoveUserTokens(ctx, userID, "") } // RemoveTokensExceptCurrentUser remove all tokens except the current user func (as *AuthService) RemoveTokensExceptCurrentUser(ctx context.Context, userID string, accessToken string) { as.authRepo.RemoveUserTokens(ctx, userID, accessToken) } //Admin func (as *AuthService) GetAdminUserCacheInfo(ctx context.Context, accessToken string) (userInfo *entity.UserCacheInfo, err error) { return as.authRepo.GetAdminUserCacheInfo(ctx, accessToken) } func (as *AuthService) SetAdminUserCacheInfo(ctx context.Context, accessToken string, userInfo *entity.UserCacheInfo) (err error) { err = as.authRepo.SetAdminUserCacheInfo(ctx, accessToken, userInfo) return err } func (as *AuthService) RemoveAdminUserCacheInfo(ctx context.Context, accessToken string) (err error) { return as.authRepo.RemoveAdminUserCacheInfo(ctx, accessToken) }