using System; using System.Management.Automation; using PSMinIO.Core.Models; namespace PSMinIO.Cmdlets { /// /// Creates a new MinIO bucket /// [Cmdlet(VerbsCommon.New, "MinIOBucket", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.Medium)] [OutputType(typeof(MinIOBucketInfo))] public class NewMinIOBucketCmdlet : MinIOBaseCmdlet { /// /// Name of the bucket to create /// [Parameter(Position = 0, Mandatory = true, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)] [ValidateNotNullOrEmpty] [Alias("Bucket")] public string BucketName { get; set; } = string.Empty; /// /// Region where the bucket should be created (default: us-east-1) /// [Parameter] [ValidateNotNullOrEmpty] public string Region { get; set; } = "us-east-1"; /// /// Force creation even if bucket already exists /// [Parameter] public SwitchParameter Force { get; set; } /// /// Return the created bucket information /// [Parameter] public SwitchParameter PassThru { get; set; } /// /// Processes the cmdlet /// protected override void ProcessRecord() { ValidateBucketName(BucketName); if (ShouldProcess(BucketName, "Create MinIO bucket")) { ExecuteOperation("CreateBucket", () => { WriteVerboseMessage("Creating bucket '{0}' in region '{1}'", BucketName, Region); // Check if bucket already exists bool bucketExists = false; try { bucketExists = S3Client.BucketExists(BucketName); WriteVerboseMessage("Bucket existence check: {0}", bucketExists ? "exists" : "does not exist"); } catch (Exception ex) { WriteVerboseMessage("Could not check bucket existence: {0}", ex.Message); } if (bucketExists) { if (Force.IsPresent) { WriteVerboseMessage("Bucket '{0}' already exists, but Force parameter specified", BucketName); } else { var errorMessage = $"Bucket '{BucketName}' already exists. Use -Force to suppress this error."; var errorRecord = new ErrorRecord( new InvalidOperationException(errorMessage), "BucketAlreadyExists", ErrorCategory.ResourceExists, BucketName); ThrowTerminatingError(errorRecord); } } else { // Create the bucket try { S3Client.CreateBucket(BucketName, Region); WriteVerboseMessage("Successfully created bucket '{0}'", BucketName); } catch (Exception ex) { WriteVerboseMessage("Failed to create bucket '{0}': {1}", BucketName, ex.Message); throw; } } // Return bucket information if requested if (PassThru.IsPresent) { WriteVerboseMessage("Retrieving information for created bucket '{0}'", BucketName); try { // Get updated bucket list to find our bucket var buckets = S3Client.ListBuckets(); var createdBucket = buckets.Find(b => string.Equals(b.Name, BucketName, StringComparison.OrdinalIgnoreCase)); if (createdBucket != null) { createdBucket.Region = Region; WriteObject(createdBucket); } else { // Create a basic bucket info object if we can't find it in the list var bucketInfo = new MinIOBucketInfo(BucketName, DateTime.UtcNow, Region); WriteObject(bucketInfo); } } catch (Exception ex) { WriteWarningMessage("Bucket created successfully but could not retrieve bucket information: {0}", ex.Message); // Create a basic bucket info object var bucketInfo = new MinIOBucketInfo(BucketName, DateTime.UtcNow, Region); WriteObject(bucketInfo); } } else { WriteVerboseMessage("Bucket '{0}' created successfully", BucketName); } }, $"Bucket: {BucketName}, Region: {Region}"); } } } }