|
package main |
|
|
|
import ( |
|
myAws "auth-api/aws" |
|
"auth-api/model" |
|
"auth-api/util" |
|
"context" |
|
"flag" |
|
"fmt" |
|
"log" |
|
"strings" |
|
|
|
"github.com/aws/aws-sdk-go-v2/aws" |
|
"github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue" |
|
"github.com/aws/aws-sdk-go-v2/service/dynamodb" |
|
|
|
idp "github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider" |
|
dynamodbTypes "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" |
|
) |
|
|
|
func main() { |
|
sub := flag.String("sub", "e.g.) google:1232131231", "sns sub") |
|
flag.Parse() |
|
|
|
if sub == nil || *sub == "" { |
|
log.Fatal("client id is required") |
|
} |
|
|
|
ctx := context.Background() |
|
|
|
uid, err := getUID(ctx, *sub) |
|
if err != nil { |
|
log.Fatal(err) |
|
} |
|
|
|
if uid != "" { |
|
auths, err := deleteUserAuthTable(ctx, uid) |
|
if err != nil { |
|
log.Fatal(err) |
|
} |
|
if err = deleteUserAttributeTable(ctx, uid); err != nil { |
|
log.Fatal(err) |
|
} |
|
|
|
for _, auth := range auths { |
|
if err = deleteUniqueKeyTable(ctx, auth.SID); err != nil { |
|
log.Fatal(err) |
|
} |
|
} |
|
if err = deleteCognitoUser(ctx, uid); err != nil { |
|
log.Fatal(err) |
|
} |
|
} |
|
|
|
} |
|
|
|
func getUID(ctx context.Context, sub string) (string, error) { |
|
client := myAws.GetDynamodbClient() |
|
res, err := client.ExecuteStatement(ctx, &dynamodb.ExecuteStatementInput{ |
|
Statement: aws.String(fmt.Sprintf(`SELECT * FROM "%s" WHERE "sid" = ?`, myAws.GetDynamodbUserAuthTable())), |
|
Parameters: []dynamodbTypes.AttributeValue{ |
|
&dynamodbTypes.AttributeValueMemberS{Value: sub}, |
|
}, |
|
}) |
|
if err != nil { |
|
return "", err |
|
} |
|
|
|
if len(res.Items) <= 0 { |
|
return "", fmt.Errorf("not found user auth table: sub = %s", sub) |
|
} |
|
|
|
var itemMap map[string]any |
|
err = attributevalue.UnmarshalMap(res.Items[0], &itemMap) |
|
if err != nil { |
|
return "", err |
|
} |
|
|
|
var r model.UserAuth |
|
err = util.MapToStruct(itemMap, &r) |
|
if err != nil { |
|
return "", err |
|
} |
|
|
|
return r.UID, nil |
|
} |
|
|
|
func deleteUserAuthTable(ctx context.Context, uid string) ([]model.UserAuth, error) { |
|
client := myAws.GetDynamodbClient() |
|
res, err := client.ExecuteStatement(ctx, &dynamodb.ExecuteStatementInput{ |
|
Statement: aws.String(fmt.Sprintf(`SELECT * FROM "%s" WHERE "uid" = ?`, myAws.GetDynamodbUserAuthTable())), |
|
Parameters: []dynamodbTypes.AttributeValue{ |
|
&dynamodbTypes.AttributeValueMemberS{Value: uid}, |
|
}, |
|
}) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
var result = make([]model.UserAuth, 0, 2) |
|
for _, item := range res.Items { |
|
var itemMap map[string]any |
|
err = attributevalue.UnmarshalMap(item, &itemMap) |
|
if err != nil { |
|
return nil, err |
|
} |
|
fmt.Printf("delete itemMap: %+v\n", itemMap) |
|
|
|
var r model.UserAuth |
|
err := util.MapToStruct(itemMap, &r) |
|
if err != nil { |
|
return nil, err |
|
} |
|
result = append(result, r) |
|
|
|
_, err = client.ExecuteStatement(ctx, &dynamodb.ExecuteStatementInput{ |
|
Statement: aws.String(fmt.Sprintf(`DELETE FROM "%s" WHERE "uid" = ? AND "sid" = ?`, myAws.GetDynamodbUserAuthTable())), |
|
Parameters: []dynamodbTypes.AttributeValue{ |
|
&dynamodbTypes.AttributeValueMemberS{Value: r.UID}, |
|
&dynamodbTypes.AttributeValueMemberS{Value: r.SID}, |
|
}, |
|
}) |
|
if err != nil { |
|
log.Printf("failed to delete user auth table: %w", err) |
|
} |
|
} |
|
|
|
return result, nil |
|
} |
|
|
|
func deleteUserAttributeTable(ctx context.Context, uid string) error { |
|
fmt.Println("delete user attribute uid: ", uid) |
|
client := myAws.GetDynamodbClient() |
|
_, err := client.ExecuteStatement(ctx, &dynamodb.ExecuteStatementInput{ |
|
Statement: aws.String(fmt.Sprintf(`DELETE FROM "%s" WHERE "uid" = ?`, myAws.GetDynamodbUserAttributeTable())), |
|
Parameters: []dynamodbTypes.AttributeValue{ |
|
&dynamodbTypes.AttributeValueMemberS{Value: uid}, |
|
}, |
|
}) |
|
if err != nil { |
|
log.Printf("failed to delete user attribute table: %w", err) |
|
} |
|
|
|
return nil |
|
} |
|
|
|
func deleteUniqueKeyTable(ctx context.Context, key string) error { |
|
fmt.Println("key: ", key) |
|
client := myAws.GetDynamodbClient() |
|
if strings.HasPrefix(key, "google:") { |
|
delKey := fmt.Sprintf(`user_auth_dev:{"sid":"%s"}`, key) |
|
fmt.Println("delete user unique googl: ", delKey) |
|
_, err := client.ExecuteStatement(ctx, &dynamodb.ExecuteStatementInput{ |
|
Statement: aws.String(fmt.Sprintf(`DELETE FROM "%s" WHERE "key" = ?`, myAws.GetDynamodbUniqueKeyTable())), |
|
Parameters: []dynamodbTypes.AttributeValue{ |
|
&dynamodbTypes.AttributeValueMemberS{Value: delKey}, |
|
}, |
|
}) |
|
if err != nil { |
|
log.Printf("failed to delete unique key table: %w", err) |
|
} |
|
|
|
return nil |
|
} else if strings.HasPrefix(key, "email:") { |
|
trimKey := strings.TrimPrefix(key, "email:") |
|
keys := []string{ |
|
fmt.Sprintf(`user_auth_dev:{"sid":"%s"}`, key), |
|
fmt.Sprintf(`user_attribute_dev:{"email":"%s"}`, trimKey), |
|
fmt.Sprintf(`user_attribute_dev:{"email_not_verified":"%s"}`, trimKey), |
|
} |
|
for _, v := range keys { |
|
fmt.Println("delete user unique email: ", v) |
|
_, err := client.ExecuteStatement(ctx, &dynamodb.ExecuteStatementInput{ |
|
Statement: aws.String(fmt.Sprintf(`DELETE FROM "%s" WHERE "key" = ?`, myAws.GetDynamodbUniqueKeyTable())), |
|
Parameters: []dynamodbTypes.AttributeValue{ |
|
&dynamodbTypes.AttributeValueMemberS{Value: v}, |
|
}, |
|
}) |
|
if err != nil { |
|
log.Printf("failed to delete unique key table: %w", err) |
|
} |
|
} |
|
|
|
return nil |
|
} else if strings.HasPrefix(key, "hc:") { |
|
trimKey := strings.TrimPrefix(key, "hc:") |
|
keys := []string{ |
|
fmt.Sprintf(`user_auth_dev:{"sid":"%s"}`, key), |
|
fmt.Sprintf(`user_attribute_dev:{"hc_id":"%s"}`, trimKey), |
|
} |
|
for _, key := range keys { |
|
fmt.Println("delete user uniques healthcare id: ", key) |
|
_, err := client.ExecuteStatement(ctx, &dynamodb.ExecuteStatementInput{ |
|
Statement: aws.String(fmt.Sprintf(`DELETE FROM "%s" WHERE "key" = ? `, myAws.GetDynamodbUniqueKeyTable())), |
|
Parameters: []dynamodbTypes.AttributeValue{ |
|
&dynamodbTypes.AttributeValueMemberS{Value: key}, |
|
}, |
|
}) |
|
if err != nil { |
|
log.Printf("failed to delete unique key table: %w", err) |
|
} |
|
} |
|
return nil |
|
} |
|
keys := []string{ |
|
fmt.Sprintf(`user_auth_dev:{"sid":"%s"}`, key), |
|
} |
|
for _, key := range keys { |
|
fmt.Println("delete user uniques id: ", key) |
|
_, err := client.ExecuteStatement(ctx, &dynamodb.ExecuteStatementInput{ |
|
Statement: aws.String(fmt.Sprintf(`DELETE FROM "%s" WHERE "key" = ? `, myAws.GetDynamodbUniqueKeyTable())), |
|
Parameters: []dynamodbTypes.AttributeValue{ |
|
&dynamodbTypes.AttributeValueMemberS{Value: key}, |
|
}, |
|
}) |
|
if err != nil { |
|
log.Printf("failed to delete unique key table: %w", err) |
|
} |
|
} |
|
return nil |
|
} |
|
|
|
func deleteCognitoUser(ctx context.Context, uid string) error { |
|
idpClient := myAws.GetIdpClient() |
|
input := &idp.AdminDeleteUserInput{ |
|
UserPoolId: aws.String(myAws.GetUserPoolID()), |
|
Username: aws.String(uid), |
|
} |
|
if _, err := idpClient.AdminDeleteUser(ctx, input); err != nil { |
|
return err |
|
} |
|
return nil |
|
} |